Переглянути джерело

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

tsit14 5 роки тому
батько
коміт
51719c756c
80 змінених файлів з 3093 додано та 1060 видалено
  1. 24 7
      src/main/java/com/style24/front/biz/dao/TsfCustomerDao.java
  2. 2 2
      src/main/java/com/style24/front/biz/service/TsfCartService.java
  3. 94 23
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  4. 1 1
      src/main/java/com/style24/front/biz/service/TsfGoodsService.java
  5. 219 9
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  6. 8 3
      src/main/java/com/style24/front/biz/service/TsfReviewService.java
  7. 4 0
      src/main/java/com/style24/front/biz/thirdparty/SearchEngineDiquest.java
  8. 39 26
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  9. 17 0
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  10. 2 2
      src/main/java/com/style24/front/biz/web/TsfGoodsController.java
  11. 45 15
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  12. 2 1
      src/main/java/com/style24/front/biz/web/TsfOrderController.java
  13. 2 13
      src/main/java/com/style24/front/biz/web/TsfPgController.java
  14. 18 0
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  15. 13 11
      src/main/java/com/style24/persistence/domain/GoodsSafeNo.java
  16. 1 0
      src/main/java/com/style24/persistence/domain/Review.java
  17. 1 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml
  18. 13 10
      src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml
  19. 25 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml
  20. 4 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfDelivery.xml
  21. 22 16
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  22. 3 3
      src/main/java/com/style24/persistence/mybatis/shop/TsfPoint.xml
  23. 28 11
      src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml
  24. 6 5
      src/main/java/com/style24/persistence/mybatis/shop/TsfSocial.xml
  25. 1 0
      src/main/resources/config/application-locd.yml
  26. 16 3
      src/main/resources/config/application-style.yml
  27. 2 2
      src/main/webapp/WEB-INF/views/mob/callcenter/GoodsQnaFormMob.html
  28. 1 1
      src/main/webapp/WEB-INF/views/mob/callcenter/NoticeFormMob.html
  29. 1 1
      src/main/webapp/WEB-INF/views/mob/callcenter/OneToOneQnaFormMob.html
  30. 6 0
      src/main/webapp/WEB-INF/views/mob/cart/CartListAjaxFormMob.html
  31. 2 2
      src/main/webapp/WEB-INF/views/mob/cart/CartListFormMob.html
  32. 1 1
      src/main/webapp/WEB-INF/views/mob/goods/CardPrmtFormMob.html
  33. 38 12
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDealDescFormMob.html
  34. 94 16
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailFormMob.html
  35. 2 2
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailQnaFormMob.html
  36. 7 1
      src/main/webapp/WEB-INF/views/mob/mypage/MypageCancelFormMob.html
  37. 0 5
      src/main/webapp/WEB-INF/views/mob/mypage/MypageCreExchangeDetailFormMob.html
  38. 507 0
      src/main/webapp/WEB-INF/views/mob/mypage/MypageDeliveryInfoFormMob.html
  39. 49 62
      src/main/webapp/WEB-INF/views/mob/mypage/MypageOrderDetailFormMob.html
  40. 13 2
      src/main/webapp/WEB-INF/views/mob/mypage/MypageOrderListFormMob.html
  41. 21 8
      src/main/webapp/WEB-INF/views/mob/mypage/MypageOrderListInfoMob.html
  42. 670 0
      src/main/webapp/WEB-INF/views/mob/mypage/MypageReviewCreateFormMob.html
  43. 253 240
      src/main/webapp/WEB-INF/views/mob/mypage/MypageReviewFormMob.html
  44. 86 54
      src/main/webapp/WEB-INF/views/mob/mypage/MypageWishListFormMob.html
  45. 2 2
      src/main/webapp/WEB-INF/views/web/callcenter/GoodsQnaFormWeb.html
  46. 1 1
      src/main/webapp/WEB-INF/views/web/callcenter/NoticeFormWeb.html
  47. 1 1
      src/main/webapp/WEB-INF/views/web/callcenter/OneToOneQnaFormWeb.html
  48. 6 0
      src/main/webapp/WEB-INF/views/web/cart/CartListAjaxFormWeb.html
  49. 1 1
      src/main/webapp/WEB-INF/views/web/cart/CartListFormWeb.html
  50. 14 4
      src/main/webapp/WEB-INF/views/web/common/fragments/FooterWeb.html
  51. 5 5
      src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html
  52. 12 1
      src/main/webapp/WEB-INF/views/web/common/layout/MypageLayoutWeb.html
  53. 1 1
      src/main/webapp/WEB-INF/views/web/display/BrandMainFormWeb.html
  54. 4 4
      src/main/webapp/WEB-INF/views/web/display/CategoryGoodsListFormWeb.html
  55. 1 1
      src/main/webapp/WEB-INF/views/web/display/LookbookMainFormWeb.html
  56. 361 305
      src/main/webapp/WEB-INF/views/web/display/SearchLayerWeb.html
  57. 1 1
      src/main/webapp/WEB-INF/views/web/goods/CardPrmtFormWeb.html
  58. 31 10
      src/main/webapp/WEB-INF/views/web/goods/GoodsDealDescFormWeb.html
  59. 76 38
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html
  60. 2 2
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailQnaFormWeb.html
  61. 7 5
      src/main/webapp/WEB-INF/views/web/goods/GoodsReviewDetailFormWeb.html
  62. 1 6
      src/main/webapp/WEB-INF/views/web/mypage/MypageCreExchangeDetailFormWeb.html
  63. 1 6
      src/main/webapp/WEB-INF/views/web/mypage/MypageCreReturnDetailFormWeb.html
  64. 15 17
      src/main/webapp/WEB-INF/views/web/mypage/MypageDeliveryInfoFormWeb.html
  65. 7 3
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html
  66. 5 3
      src/main/webapp/WEB-INF/views/web/mypage/MypageReviewCreateFormWeb.html
  67. 16 7
      src/main/webapp/WEB-INF/views/web/mypage/MypageReviewDetailFormWeb.html
  68. 2 2
      src/main/webapp/WEB-INF/views/web/mypage/MypageReviewFormWeb.html
  69. 1 1
      src/main/webapp/WEB-INF/views/web/mypage/MypageWishListFormWeb.html
  70. 1 6
      src/main/webapp/WEB-INF/views/web/mypage/NoMemberCreExchangeDetailFormWeb.html
  71. 1 6
      src/main/webapp/WEB-INF/views/web/mypage/NoMemberCreReturnDetailFormWeb.html
  72. 12 17
      src/main/webapp/WEB-INF/views/web/planning/PlanningCustGradeBenefitFormWeb.html
  73. 1 13
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  74. 38 0
      src/main/webapp/WEB-INF/views/web/popup/TrackWithdrawPopupFormWeb.html
  75. 29 1
      src/main/webapp/biz/mypage.js
  76. 1 0
      src/main/webapp/ux/mo/css/common_m.css
  77. 22 9
      src/main/webapp/ux/mo/css/layout_m.css
  78. 3 8
      src/main/webapp/ux/mo/css/style24_m.css
  79. 21 0
      src/main/webapp/ux/plugins/gaga/gaga.common.js
  80. 27 0
      src/main/webapp/ux/style24_link.js

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

@@ -1,15 +1,15 @@
 package com.style24.front.biz.dao;
 
+import java.util.Collection;
+
+import org.springframework.stereotype.Repository;
+
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.CustGrade;
 import com.style24.persistence.domain.CustSnsInfo;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.WishList;
 
-import java.util.Collection;
-
-import org.springframework.stereotype.Repository;
-
 /**
  * 고객(회원) Dao
  * 
@@ -82,7 +82,7 @@ public interface TsfCustomerDao {
 	 * @since 2021. 03. 02
 	 */
 	String getCustomerMaxCustId(Customer customer);
-	
+
 	/**
 	 * 위시리스트 등록
 	 *
@@ -101,7 +101,7 @@ public interface TsfCustomerDao {
 	 * @since 2021. 03. 08
 	 */
 	void deleteWishList(WishList wishList);
-	
+
 	/**
 	 * 위시리스트 삭제 상품 조회
 	 *
@@ -109,7 +109,7 @@ public interface TsfCustomerDao {
 	 * @author eskim
 	 * @since 2021. 03. 11
 	 */
-	String  getDeleteGoodsWish(int custNo);
+	String getDeleteGoodsWish(int custNo);
 
 	/**
 	 * 본인인증 처리
@@ -179,5 +179,22 @@ public interface TsfCustomerDao {
 	 */
 	int saveBatchBirth(Customer customer);
 
+	/**
+	 * SMS수신거부 처리
+	 * @param custNo - 고객번호
+	 * @return 처리건수
+	 * @author gagamel
+	 * @since 2021. 5. 11
+	 */
+	int updateSmsReceptionRefuse(Integer custNo);
+
+	/**
+	 * 메일수신거부 처리
+	 * @param custNo - 고객번호
+	 * @return 처리건수
+	 * @author gagamel
+	 * @since 2021. 5. 11
+	 */
+	int updateEmailReceptionRefuse(Integer custNo);
 
 }

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

@@ -321,7 +321,7 @@ public class TsfCartService {
 
 			if (cartSqList != null && cartSqList.size() > 0) {		// 장바구니 기존재
 				if (cartSqList.size() > 1) {						// 장바구니 조회 결과 이상시 insert or select 수정 필요
-					throw new IllegalArgumentException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
+					throw new IllegalStateException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
 				} else {
 					cart.setCartSq(cartSqList.iterator().next().getCartSq());
 					cartSqs.add(cart.getCartSq());
@@ -405,7 +405,7 @@ public class TsfCartService {
 
 			if (cartSqList != null && cartSqList.size() > 0) {			// 장바구니 기존재
 				if (cartSqList.size() > 1) {							// 장바구니 조회 결과 이상시 insert or select 수정 필요
-					throw new IllegalArgumentException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
+					throw new IllegalStateException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
 				} else {
 					item.setCartSq(cartSqList.iterator().next());
 					cartSqs.add(item.getCartSq());

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

@@ -7,8 +7,6 @@ import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
-
-import com.style24.persistence.domain.CustGrade;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
@@ -17,8 +15,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.security.GagaPasswordEncoder;
 import com.style24.core.biz.service.TscCustomerService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.session.TscSession;
@@ -29,6 +25,7 @@ import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.CustAccount;
 import com.style24.persistence.domain.CustDeliveryAddr;
+import com.style24.persistence.domain.CustGrade;
 import com.style24.persistence.domain.CustSnsInfo;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.Login;
@@ -36,6 +33,9 @@ import com.style24.persistence.domain.WishList;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.security.GagaPasswordEncoder;
+
 /**
  * 고객(회원) Service
  *
@@ -76,7 +76,7 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 08
 	 */
 	public Customer getCustomerFindId(Customer customer) {
-		TsfSession.setAttribute("maskingYn","Y");
+		TsfSession.setAttribute("maskingYn", "Y");
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.encryptData(); // 데이터 암호하
 		return customerDao.getCusomterActiveAndDormant(customer);
@@ -116,7 +116,6 @@ public class TsfCustomerService {
 		return coreCustomerService.getCustomerInfo(customer);
 	}
 
-
 	/**
 	 * 임시비밀번호 조회
 	 * @param length - 비밀번호 자릿수
@@ -221,7 +220,7 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 15
 	 */
 	public Customer getCustomerFindByCi(String ci) {
-		TscSession.setAttribute("maskingYn","Y");
+		TscSession.setAttribute("maskingYn", "Y");
 		Customer customer = new Customer();
 		customer.setCi(ci);
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
@@ -238,7 +237,7 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 15
 	 */
 	public Customer getCustomerFindByCellPhnno(String cellPhnno) {
-		TscSession.setAttribute("maskingYn","Y");
+		TscSession.setAttribute("maskingYn", "Y");
 		Customer customer = new Customer();
 		customer.setCellPhnno(cellPhnno);
 		customer.setHypenCellPhone(); // 010-0000-0000
@@ -286,11 +285,11 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 19
 	 */
 	@Transactional("shopTxnManager")
-	public boolean saveJoinCustomerSns (Customer customer) {
+	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()+"_"+snsId);
+		customer.setCustId(customer.getSnsType() + "_" + snsId);
 		customer.encryptData();
 
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
@@ -300,7 +299,6 @@ public class TsfCustomerService {
 		customer.setCustGb(TscConstants.CustGb.NORMAL.value());
 		customer.setCustGrade(TscConstants.CustGrade.WELCOME.value());
 
-
 		int custCnt = customerDao.createCustomer(customer);
 		customerDao.createCustomerSns(customer);
 		customerDao.saveBatchBirth(customer);
@@ -334,7 +332,6 @@ public class TsfCustomerService {
 		couponService.saveJoinCoupon(coupon);
 	}
 
-
 	/**
 	 * Sns 정보에대한 상태 처리
 	 *
@@ -343,7 +340,7 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 19
 	 */
 	@Transactional("shopTxnManager")
-	public GagaMap customerSnsProcessing (CustSnsInfo custSnsInfo) {
+	public GagaMap customerSnsProcessing(CustSnsInfo custSnsInfo) {
 		GagaMap resultMap = new GagaMap();
 		Customer custInfo;
 
@@ -392,7 +389,7 @@ public class TsfCustomerService {
 				return resultMap;
 			}
 
-			boolean isFindByPhone = getCustomerFindByCellPhnnoCount(custSnsInfo.getCellPhnno().replace("-",""));
+			boolean isFindByPhone = getCustomerFindByCellPhnnoCount(custSnsInfo.getCellPhnno().replace("-", ""));
 			if (isFindByPhone) {
 				resultMap.setString("custStat", "DUP_PHONE_CUST"); // 휴대폰 중복
 				return resultMap;
@@ -447,7 +444,7 @@ public class TsfCustomerService {
 		loginService.createLoginHistory(loginInfo.getCustNo());
 
 		// 세션 생성
-		this.createSession(request,  loginDetails);
+		this.createSession(request, loginDetails);
 	}
 
 	/**
@@ -464,7 +461,6 @@ public class TsfCustomerService {
 		session.setAttribute("session", loginDetails);
 	}
 
-
 	/**
 	 * 일반고객 정보 유효성
 	 *
@@ -473,7 +469,7 @@ public class TsfCustomerService {
 	 * @author jsshin
 	 * @since 2021. 02. 18
 	 */
-	public GagaMap generalCustomerValidation (Customer customer) {
+	public GagaMap generalCustomerValidation(Customer customer) {
 		GagaMap resultMap = new GagaMap();
 		String maskingCustId;
 
@@ -529,7 +525,6 @@ public class TsfCustomerService {
 		return customerDao.getCusomterSnsFind(custSnsInfo);
 	}
 
-
 	/**
 	 * 가입된 아이디 가져오기
 	 * @param custId - 고객아이디
@@ -625,7 +620,7 @@ public class TsfCustomerService {
 			wishInfo.setRegNo(TsfSession.getInfo().getCustNo());
 			customerDao.createWishList(wishInfo);
 		}
-		
+
 		// 위시상품목록 50개만 남게 처리
 		String goodsCd = customerDao.getDeleteGoodsWish(TsfSession.getInfo().getCustNo());
 		WishList delWishInfo = new WishList();
@@ -634,7 +629,7 @@ public class TsfCustomerService {
 			delWishInfo.setArrGoodsCd(goodsCd.split("\\,"));
 			customerDao.deleteWishList(delWishInfo);
 		}
-		
+
 	}
 
 	/**
@@ -799,7 +794,6 @@ public class TsfCustomerService {
 		return result;
 	}
 
-
 	/**
 	 * 고객계좌 정보
 	 *
@@ -812,7 +806,6 @@ public class TsfCustomerService {
 		return coreCustomerService.getCustomerAccuontInfo(custNo);
 	}
 
-
 	/**
 	 * 고객정보 수정
 	 *
@@ -974,7 +967,6 @@ public class TsfCustomerService {
 		params.setCustNo(customer.getCustNo());
 		params.setSiteCd(customer.getSiteCd());
 		Collection<CustGrade> custGradePolicy = customerDao.getCustGradePolicy(params);
-		result.set("custGradePolicy", custGradePolicy);
 
 		CustGrade expctCustGrade;
 		for (CustGrade grade : custGradePolicy) {
@@ -999,4 +991,83 @@ public class TsfCustomerService {
 	public Collection<CustGrade> getCustGradePolicy(CustGrade custGrade) {
 		return customerDao.getCustGradePolicy(custGrade);
 	}
+
+	/**
+	 * SMS수신거부 처리
+	 * @param custNo - 고객번호
+	 * @author gagamel
+	 * @since 2021. 5. 11
+	 */
+	@Transactional("shopTxnManager")
+	public void updateSmsReceptionRefuse(Integer custNo) {
+		// 수신거부 처리
+		int result = customerDao.updateSmsReceptionRefuse(custNo);
+
+		if (result > 0) {
+			Customer customer = new Customer();
+			customer.setCustNo(custNo);
+			customer.setSmsAgreeYn("N");
+			customer.setRegNo(custNo);
+
+			// 마케팅수신동의이력 생성
+			coreCustomerService.createCustomerMarketHst(customer);
+
+			// 고객이력 생성
+			coreCustomerService.createCustomerHistory(customer);
+		}
+	}
+
+	/**
+	 * 메일수신거부 처리
+	 * @param custNo - 고객번호
+	 * @author gagamel
+	 * @since 2021. 5. 11
+	 */
+	@Transactional("shopTxnManager")
+	public void updateEmailReceptionRefuse(Integer custNo) {
+		// 수신거부 처리
+		int result = customerDao.updateEmailReceptionRefuse(custNo);
+
+		if (result > 0) {
+			Customer customer = new Customer();
+			customer.setCustNo(custNo);
+			customer.setEmailAgreeYn("N");
+			customer.setRegNo(custNo);
+
+			// 마케팅수신동의이력 생성
+			coreCustomerService.createCustomerMarketHst(customer);
+
+			// 고객이력 생성
+			coreCustomerService.createCustomerHistory(customer);
+		}
+	}
+
+
+
+	/*
+	 * 고객 예상등급 이후 정보
+	 *
+	 * @param  custGrade - 고객번호
+	 * @return CustGrade
+	 * @author jsshin
+	 * @since 2021. 05. 11
+	 */
+	public GagaMap getNextCustGradeInfo(CustGrade custGrade) {
+		GagaMap result = new GagaMap();
+		// 1.고객 예상등급 이후 정보
+		List<CustGrade> custGradePolicy = (List<CustGrade>) customerDao.getCustGradePolicy(custGrade);
+		CustGrade nextCustGradePolicy = custGradePolicy.get(0);
+		nextCustGradePolicy.setCustNo(custGrade.getCustNo());
+		// 2.고객 예상등급 이후 정보로 주문금액 확인
+		CustGrade nextCustGrade = customerDao.getExpectedCustGrde(nextCustGradePolicy);
+		if (nextCustGrade != null) {
+			nextCustGradePolicy.setOrdCnt(nextCustGrade.getOrdCnt());
+			nextCustGradePolicy.setSumRealOrdAmt(nextCustGrade.getSumRealOrdAmt());
+		} else {
+			nextCustGradePolicy.setOrdCnt(0);
+			nextCustGradePolicy.setSumRealOrdAmt(0);
+		}
+		result.set("nextCustGradePolicy", nextCustGradePolicy);
+		return result;
+	}
 }

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

@@ -702,7 +702,7 @@ public class TsfGoodsService {
 			// 이미지 정보
 			goodsExtend.setGoodsImgList(goodsDao.getGoodsImgList(tmpGoods));
 			// 상품 안전인증 정보
-			//goodsExtend.setGoodsSafeNo(goodsDao.getGoodsSafeNo(tmpGoods));
+			goodsExtend.setGoodsSafeNo(goodsDao.getGoodsSafeNo(tmpGoods));
 
 		}
 		return getGoodsSetComposeList;

+ 219 - 9
src/main/java/com/style24/front/biz/service/TsfOrderService.java

@@ -1,9 +1,14 @@
 package com.style24.front.biz.service;
 
+import java.io.*;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import javax.net.ssl.HttpsURLConnection;
+import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -991,23 +996,158 @@ public class TsfOrderService {
 		return "SUCCESS";
 	}
 	
-	public GagaMap nPayReq50(Order param) {
+	public GagaMap nPayReq50(Order param, HttpServletRequest request, HttpServletResponse response) {
 		GagaMap result = new GagaMap();
 
+		// 로그인 정보 조회
+		if(TsfSession.isLogin()) {
+			param.setCustNo(TsfSession.getInfo().getCustNo());
+		} else {
+			param.setCustNo(0);
+			param.setJsessionId(TsfSession.getSessionId());
+		}
+
 		try {
-			param.setFrontGb(TsfSession.getFrontGb());
 			param.setSiteCd(TscConstants.Site.STYLE24.value());
-			if(TsfSession.isLogin()) {
-				param.setCustNo(TsfSession.getInfo().getCustNo());
-			} else {
-				param.setCustNo(0);
-				param.setJsessionId(TsfSession.getSessionId());
-			}
+			param.setFrontGb(TsfSession.getFrontGb());	// 디바이스 정보
+			param.setPrePntDcAmtYn("N");				// 네이버페이 : 선포인트 사용하지 않음으로 강제 지정
+			param.setShotDelvYn("N");					// 네이버페이 : 총알배송 여부 설정 N
+			param.setInsuranceYn("N");					// 네이버페이 : 보증보험 신청 여부 N
 
-			// 장바구니 정보 조회
+			// 장바구니 등록된 주문 정보 조회
 			Collection<Order> cartList = coreOrderService.getCartGoodsList(param);
 
+			// 배송비 정보 조회
+			GagaMap delvMap = coreOrderService.getCartDelvGoodsCntList(cartList, param);
+			param.setDelvFeeCdList((Collection<Order>) delvMap.get("delvFeeCdList"));
+
+			// 주문 상세 정보 세팅
+			for(Order item : cartList) {
+				item.setSavePntAmt(0);
+				item.setOrdAmt((item.getCurrPrice() + item.getOptAddPrice()) * item.getGoodsQty());			// ordAmt = (즉시할인가 + 옵션가) * 수량
+				item.setRealOrdAmt(item.getOrdAmt());														// 네이버페이는 할인 없으므로 ordAmt와 동일
+				item.setShotDelvYn("N");
+				item.setGiftPackYn("N");
+				item.setRegNo(param.getCustNo());
+			}
+			param.setOrderDetailList(cartList);
+
+			// 주문 정보 등록
+			coreOrderService.createPreOrder(param);
+
+			// 네이버페이 기본정보
+			String shopId			= env.getProperty("naverPay.shop.id");				// shopId
+			String certificationKey	= env.getProperty("naverPay.certification.key");	// 네이버페이 인증키
+			String cpaInflowCode	= getCookieValue(request, "CPAValidator");
+			String naverInflowCode	= getCookieValue(request, "NA_CO");
+			String saClickId		= getCookieValue(request, "NVADID");
+			String domain 			= env.getProperty("domain.front");					// 도메인 주소
+			String staticUrl		= "/resources";
+			String goodsImgUrl		= env.getProperty("upload.goods.view");				// 상품 이미지 경로
+			int totPrice			= 0;												// 전체 주문 금액
+
+			log.info("CHECK PARAM ::::: {} / {}", param.getBackUrl(), param.getGoodsUrl());
+
+			// 네이버페이 송부용 xml 작성
+			StringBuffer sb = new StringBuffer();
+			sb.append("<order>");
+			sb.append("<merchantId>").append(shopId).append("</merchantId>");								//<!-- 상점ID -->
+			sb.append("<certiKey>").append("<![CDATA[" + certificationKey + "]]>").append("</certiKey>");	//<!-- 인증키 -->
+			sb.append("<backUrl>").append("<![CDATA[" + param.getBackUrl() + "]]>").append("</backUrl>");	//<!-- 이전페이지 -->
+			sb.append("<interface>");
+			sb.append("<merchantCustomCode1>").append(param.getOrdNo()).append("</merchantCustomCode1>");
+			sb.append("<cpaInflowCode>").append(cpaInflowCode).append("</cpaInflowCode>");
+			sb.append("<naverInflowCode>").append(naverInflowCode).append("</naverInflowCode>");
+			sb.append("<saClickId>").append(saClickId).append("</saClickId>");
+			sb.append("</interface>");
+
+			for(Order item : param.getOrderDetailList()) {
+				//<!-- 상품정보 -->
+				sb.append("<product>");
+				sb.append("<id>").append(item.getGoodsCd()).append("</id>");							//<!-- 상품코드 -->
+				sb.append("<ecMallProductId>").append(item.getGoodsCd()).append("</ecMallProductId>");	//<!-- 상품코드 -->
+				sb.append("<name>").append("<![CDATA[" + item.getGoodsNm() + "]]>").append("</name>");	//<!-- 상품명 -->
+				sb.append("<basePrice>").append(item.getCurrPrice() + item.getOptAddPrice()).append("</basePrice>");						//<!-- 상품금액 -->
+				sb.append("<infoUrl>").append("<![CDATA[http:" + param.getGoodsUrl() + item.getGoodsCd() + "]]>").append("</infoUrl>");		//<!-- 상품상세페이지 URL -->
+				sb.append("<imageUrl>").append("<![CDATA[http:" + goodsImgUrl + "/" + item.getSysImgNm() + "]]>").append("</imageUrl>");	//<!-- 상품원본이미지 URL -->
+
+				// 옵션 정보
+				sb.append("<option>");
+				sb.append("<quantity>").append(item.getGoodsQty()).append("</quantity>");							//<!-- 옵션수량-->
+				sb.append("<price>").append(item.getOptAddPrice()).append("</price>");								//<!-- 옵션금액 -->
+				sb.append("<manageCode>").append("<![CDATA[" + item.getOptCd() + "]]>").append("</manageCode>");	//<!-- 옵션관리코드 -->
+
+				// 칼라코드
+				sb.append("<selectedItem>");
+				sb.append("<type>SELECT</type>");//<!-- 옵션유형 -->
+				sb.append("<name>칼라</name>");//<!-- 옵션명 -->
+				sb.append("<value>");
+				sb.append("<id>").append("<![CDATA[" + item.getOptCd1() + "]]>").append("</id>");//<!-- 칼라코드 -->
+				sb.append("<text>").append("<![CDATA[" + item.getColorNm() + "]]>").append("</text>");//<!-- 칼라명 -->
+				sb.append("</value>");
+				sb.append("</selectedItem>");
+
+				// 사이즈코드
+				sb.append("<selectedItem>");
+				sb.append("<type>SELECT</type>");//<!-- 옵션유형 -->
+				sb.append("<name>사이즈</name>");//<!-- 옵션명 -->
+				sb.append("<value>");
+				sb.append("<id>").append("<![CDATA[" + item.getOptCd2() + "]]>").append("</id>");//<!-- 사이즈코드 -->
+				sb.append("<text>").append("<![CDATA[" + item.getOptCd2() + "]]>").append("</text>");//<!-- 사이즈명 -->
+				sb.append("</value>");
+				sb.append("</selectedItem>");
+				sb.append("</option>");
+
+				// 배송비 판단 후 배송비유형 선택 (추가 기본배송비, 무료배송비 기준 조회후 등록)
+				//<!-- 배송정보 -->
+				String delvFeeCrite = "CHARGE";
+				int delvFee = item.getDelvFee();
+				String feePayType = "PREPAYED";
+				// 배송비 조건
+				if(TscConstants.DelvFeeCrite.NORMAL.value().equals(item.getDelvFeeCrite())) {
+					delvFeeCrite = "CONDITIONAL_FREE";		// 조건부 무료(배송비 조건이 무료이거나 배송 방법이 착불일때만 배송비는 0원으로 변경)
+				} else if(TscConstants.DelvFeeCrite.FREE.value().equals(item.getDelvFeeCrite())) {
+					delvFeeCrite = "FREE";
+					feePayType = "FREE";
+					delvFee = 0;
+				}
+
+				sb.append("<shippingPolicy>");
+				sb.append("<groupId>").append(item.getDelvFeeCd()).append("</groupId>");		//<!-- 배송비묶음그룹ID -->
+				sb.append("<method>DELIVERY</method>");											//<!-- 배송방법 : 택배,소포,등기 -->
+				sb.append("<feeType>").append("CONDITIONAL_FREE").append("</feeType>");			//<!-- 배송비유형 : 유료 -->
+				sb.append("<feePayType>").append("PREPAYED").append("</feePayType>");			//<!-- 배송비결제방법 : 선불 -->
+				sb.append("<feePrice>").append(item.getDelvFee()).append("</feePrice>");		//<!-- 기본배송비 -->
+
+				// 조건부 무료일경우에만 송부
+				if(TscConstants.DelvFeeCrite.NORMAL.value().equals(item.getDelvFeeCrite())) {
+					sb.append("<conditionalFree>");
+					sb.append("<basePrice>").append(item.getMinOrdAmt()).append("</basePrice>");	//<!-- 무료배송비기준 -->
+					sb.append("</conditionalFree>");
+				}
+
+				sb.append("</shippingPolicy>");
+				sb.append("</product>");
+
+				totPrice = totPrice + ((item.getCurrPrice() + item.getOptAddPrice()) * item.getGoodsQty());
+			}
 
+			sb.append("</order>");
+
+			log.info("CHECK NAVER PAY SB ::::: \n{}", sb.toString());
+
+			result = sendOrderInfoToNC(sb);
+
+			// 네이버 페이 주문번호 저장
+			param.setNpayOrdNo(Integer.parseInt(result.get("orderKey").toString()));
+
+			log.info("CHECK NAVER PAY ORD NO ::::: {}", param.getNpayOrdNo());
+
+			// 3.주문정보 저장
+			coreOrderDao.updateNaverPayOrderNo(param);
+			result.put("npayOrderUrl", env.getProperty("naverPay.order.url"));
+			result.put("orderkey", result.get("orderKey").toString());
+			result.put("resultNo", result.get("resultNo").toString());
 
 			result.put("state", "sucess");
 		} catch(Exception e) {
@@ -1019,6 +1159,76 @@ public class TsfOrderService {
 
 		return result;
 	}
+
+	private GagaMap sendOrderInfoToNC(StringBuffer sb) throws IOException {
+		GagaMap resultMap = new GagaMap();
+
+		// 1.0, 2.0  일때 구분값 처리
+		URL _url = new URL(env.getProperty("naverPay.order.api.url"));
+		String ENCODING = "UTF-8";
+
+		HttpsURLConnection conn = (HttpsURLConnection)_url.openConnection();
+
+		log.info("CHECK URL ::::: {}", env.getProperty("naverPay.order.api.url"));
+
+		conn.setDoInput(true);
+		conn.setDoOutput(true);
+		conn.setUseCaches(false);
+		conn.setRequestMethod("POST");
+		conn.addRequestProperty("Content-Type", "application/xml; charset=UTF-8");
+
+		// 주문 등록 API 호출
+		Writer writer = new OutputStreamWriter(conn.getOutputStream(), ENCODING);
+		writer.write(sb.toString());
+
+		writer.flush();
+		writer.close();
+
+		int respCode = conn.getResponseCode();
+		log.info("CHECK RESP CODE ::::: {}", respCode);
+
+		if (respCode != 200) {
+			throw new RuntimeException(String.format("NC Response fail : %d %s", respCode, conn.getResponseMessage()));
+		}
+
+		BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
+
+		String[] arr = reader.readLine().toString().split(":");
+
+		log.info("CHECK RESULT ARR ::::: {} / {} / {}", arr[0], arr[1], arr[2]);
+		if ("SUCCESS".equals(arr[0])) {
+			resultMap.put("state", 		arr[0]);
+			resultMap.put("orderKey", 	arr[1]);
+			resultMap.put("resultNo", 	arr[2]);
+		} else {
+			throw new IllegalStateException(String.format("NC Response fail : %d %s", reader.readLine().toString()));
+		}
+
+		conn.disconnect();
+
+		return resultMap;
+	}
+
+	/*
+	 * 쿠키값 가져오기
+	 */
+	private String getCookieValue(HttpServletRequest request, String name) {
+		if (name == null || request == null) {
+			return "";
+		}
+
+		Cookie[] cookies = request.getCookies();
+
+		if (cookies != null) {
+			for (int i = 0; i < cookies.length; i++) {
+				if (name.equals(cookies[i].getName())) {
+					return cookies[i].getValue();
+				}
+			}
+		}
+
+		return "";
+	}
 	
 	/**
 	 * 장바구니정보 주문번호 이력 등록

+ 8 - 3
src/main/java/com/style24/front/biz/service/TsfReviewService.java

@@ -271,9 +271,7 @@ public class TsfReviewService {
 			}
 		}
 		
-		if (review.getConfirmYn()=="Y") {
-			reviewDao.updateMypageReviewConfimYn(review);
-		}
+		reviewDao.updateMypageReviewConfimYn(review);
 		
 	}
 		
@@ -288,11 +286,13 @@ public class TsfReviewService {
 	public void updateMypageReview(Review review) {
 		review.setRegNo(TsfSession.getInfo().getCustNo());
 		review.setUpdNo(TsfSession.getInfo().getCustNo());		
+		review.setConfirmYn("Y");
 		reviewDao.updateMypageReview(review);
 		reviewDao.reviewAttachDelete(review);
 		
 		//이미지등록
 		if(!StringUtils.isAllEmpty(review.getOrgFileNmArr())) {
+			review.setConfirmYn("Y");
 			ReviewAttach fileReview = new ReviewAttach();
 			fileReview.setRegNo(TsfSession.getInfo().getCustNo());
 			fileReview.setUpdNo(TsfSession.getInfo().getCustNo());
@@ -335,6 +335,7 @@ public class TsfReviewService {
 		}
 		
 		if(!StringUtils.isAllEmpty(review.getKufKeyArr())) {
+			review.setConfirmYn("N");
 			ReviewAttach fileReview = new ReviewAttach();
 			fileReview.setRegNo(TsfSession.getInfo().getCustNo());
 			fileReview.setUpdNo(TsfSession.getInfo().getCustNo());
@@ -342,11 +343,15 @@ public class TsfReviewService {
 			fileReview.setFileGb("M");
 			fileReview.setDelYn("N");
 			String[] fileItemVal1 = review.getKufKeyArr();
+			String[] fileItemVal2 = review.getKmcKeyArr();
 			for (int j = 0; j < fileItemVal1.length; j++) {
 				fileReview.setKufKey(fileItemVal1[j]);
+				fileReview.setKmcKey(fileItemVal2[j]);
 				reviewDao.saveReviewAttach(fileReview);
 			}
+			
 		}
+		reviewDao.updateMypageReviewConfimYn(review);
 	}
 	
 	/**

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

@@ -2,6 +2,7 @@ package com.style24.front.biz.thirdparty;
 
 import javax.annotation.PostConstruct;
 
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
@@ -10,6 +11,9 @@ import com.style24.persistence.domain.searchengine.SearchEngine;
 
 import lombok.extern.slf4j.Slf4j;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * 검색엔진 - NHN다이퀘스트
  *

+ 39 - 26
src/main/java/com/style24/front/biz/web/TsfCustomerController.java

@@ -3,12 +3,11 @@ 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.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;
@@ -22,13 +21,16 @@ import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.front.biz.service.TsfCustomerService;
 import com.style24.front.biz.service.TsfKakaoService;
 import com.style24.front.biz.thirdparty.NiceCertify;
+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 com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponse;
 
 /**
  * 고객(회원) Controller
@@ -67,8 +69,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 05
 	 */
 	@RequestMapping("/id/find/form")
-	public ModelAndView idFindForm(@RequestParam(value = "sEncData", required = false) String sEncData
-			, @RequestParam(value = "authMethod", required = false) String authMethod) {
+	public ModelAndView idFindForm(@RequestParam(value = "sEncData", required = false) String sEncData, @RequestParam(value = "authMethod", required = false) String authMethod) {
 
 		ModelAndView mav = new ModelAndView();
 
@@ -137,8 +138,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 05
 	 */
 	@RequestMapping("/password/find/form")
-	public ModelAndView pwdFindForm(@RequestParam(value = "sEncData", required = false) String sEncData
-			, @RequestParam(value = "authMethod", required = false) String authMethod) {
+	public ModelAndView pwdFindForm(@RequestParam(value = "sEncData", required = false) String sEncData, @RequestParam(value = "authMethod", required = false) String authMethod) {
 
 		ModelAndView mav = new ModelAndView();
 		mav.addObject("sEncData", sEncData);
@@ -338,9 +338,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 05
 	 */
 	@RequestMapping("/join/form")
-	public ModelAndView getJoinForm(@RequestParam(value = "sEncData", required = false) String sEncData
-			, @RequestParam(value = "authMethod", required = false) String authMethod
-			, @RequestParam(value = "custParams", required = false) String custParams) {
+	public ModelAndView getJoinForm(@RequestParam(value = "sEncData", required = false) String sEncData, @RequestParam(value = "authMethod", required = false) String authMethod, @RequestParam(value = "custParams", required = false) String custParams) {
 
 		ModelAndView mav = new ModelAndView();
 
@@ -362,8 +360,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 09
 	 */
 	@GetMapping("/nice/cellphone/form")
-	public ModelAndView niceCellphoneForm(@RequestParam(value = "redirectUrl", required = false) String redirectUrl
-										, @RequestParam(value = "custParams", required = false) String custParams) {
+	public ModelAndView niceCellphoneForm(@RequestParam(value = "redirectUrl", required = false) String redirectUrl, @RequestParam(value = "custParams", required = false) String custParams) {
 		ModelAndView mav = new ModelAndView();
 		GagaMap result = niceCertify.certifyCellPhone();
 
@@ -386,8 +383,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 09
 	 */
 	@GetMapping("/nice/ipin/form")
-	public ModelAndView getCertifyNiceIpin(@RequestParam(value = "redirectUrl", required = false) String redirectUrl
-										 , @RequestParam(value = "custParams", required = false) String custParams) {
+	public ModelAndView getCertifyNiceIpin(@RequestParam(value = "redirectUrl", required = false) String redirectUrl, @RequestParam(value = "custParams", required = false) String custParams) {
 		ModelAndView mav = new ModelAndView();
 		GagaMap result = niceCertify.certifyIpin();
 
@@ -411,10 +407,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 09
 	 */
 	@RequestMapping("/nice/certify/callback")
-	public ModelAndView niceCertifyCallback(@RequestParam(value = "EncodeData", required = false) String encodeData
-			, @RequestParam(value = "enc_data", required = false) String encData
-			, @RequestParam(value = "param_r1", required = false) String redirectUrl
-			, @RequestParam(value = "param_r2", required = false) String custParams) {
+	public ModelAndView niceCertifyCallback(@RequestParam(value = "EncodeData", required = false) String encodeData, @RequestParam(value = "enc_data", required = false) String encData, @RequestParam(value = "param_r1", required = false) String redirectUrl, @RequestParam(value = "param_r2", required = false) String custParams) {
 
 		ModelAndView mav = new ModelAndView();
 		String sEncData = "";
@@ -667,9 +660,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 03. 08
 	 */
 	@RequestMapping("/dormant/certify/form")
-	public ModelAndView getDormantCeirtyForm(@RequestParam(value = "sEncData", required = false) String sEncData
-										 	, @RequestParam(value = "authMethod", required = false) String authMethod
-											, @RequestParam(value = "custParams", required = false) String custParams) {
+	public ModelAndView getDormantCeirtyForm(@RequestParam(value = "sEncData", required = false) String sEncData, @RequestParam(value = "authMethod", required = false) String authMethod, @RequestParam(value = "custParams", required = false) String custParams) {
 
 		ModelAndView mav = new ModelAndView();
 
@@ -706,7 +697,7 @@ public class TsfCustomerController extends TsfBaseController {
 		}
 
 		GagaMap resultInfo;
-		if (TscConstants.AuthMethod.MOBILE.value().equals(customer.getAuthMethod())){
+		if (TscConstants.AuthMethod.MOBILE.value().equals(customer.getAuthMethod())) {
 			resultInfo = niceCertify.getCertifyCellPhoneResultInfo(customer);
 			customer.setCi(resultInfo.getString("sCi"));
 		} else {
@@ -743,9 +734,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 03. 10
 	 */
 	@RequestMapping("/certification/form")
-	public ModelAndView getCertificationForm(@RequestParam(value = "sEncData", required = false) String sEncData
-			, @RequestParam(value = "authMethod", required = false) String authMethod
-			, @RequestParam(value = "custParams", required = false) String custParams) {
+	public ModelAndView getCertificationForm(@RequestParam(value = "sEncData", required = false) String sEncData, @RequestParam(value = "authMethod", required = false) String authMethod, @RequestParam(value = "custParams", required = false) String custParams) {
 
 		ModelAndView mav = new ModelAndView();
 
@@ -761,7 +750,6 @@ public class TsfCustomerController extends TsfBaseController {
 		mav.addObject("sEncData", sEncData);
 		mav.addObject("authMethod", authMethod);
 
-
 		mav.setViewName(super.getDeviceViewName("customer/CertificationForm"));
 		return mav;
 	}
@@ -887,7 +875,7 @@ public class TsfCustomerController extends TsfBaseController {
 	@PostMapping("/peristalsis/yes24")
 	@ResponseBody
 	public GagaMap peristalsisYes24(HttpSession session, HttpServletRequest request) {
-		CustSnsInfo custSnsInfo = (CustSnsInfo) session.getAttribute("custSnsInfo");
+		CustSnsInfo custSnsInfo = (CustSnsInfo)session.getAttribute("custSnsInfo");
 		session.removeAttribute("custSnsInfo"); // YES24 세션 지움
 
 		// 1. SNS처리
@@ -964,5 +952,30 @@ public class TsfCustomerController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * SMS수신거부 처리
+	 * @param custNo - 고객번호
+	 * @author gagamel
+	 * @since 2020. 5. 11
+	 */
+	@GetMapping("/sms/refuse/{custNo}")
+	@ResponseBody
+	public GagaResponse updateSmsReceptionRefuse(@PathVariable Integer custNo) {
+		customerService.updateSmsReceptionRefuse(custNo);
+		return super.ok(message.getMessage("SUCC_0004"));
+	}
+
+	/**
+	 * 이메일수신거부 처리
+	 * @param custNo - 고객번호
+	 * @author gagamel
+	 * @since 2020. 5. 11
+	 */
+	@GetMapping("/email/refuse/{custNo}")
+	@ResponseBody
+	public GagaResponse updateEmailReceptionRefuse(@PathVariable Integer custNo) {
+		customerService.updateSmsReceptionRefuse(custNo);
+		return super.ok(message.getMessage("SUCC_0004"));
+	}
 
 }

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

@@ -921,4 +921,21 @@ public class TsfDisplayController extends TsfBaseController {
 		return diquest.getTrendKeywordList();
 	}
 
+	/**
+	 * 검색어 레이어
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 5. 11
+	 */
+	@PostMapping("/search/layer")
+	public ModelAndView searchLayerForm() {
+		ModelAndView mav = new ModelAndView();
+
+		//TODO : 이걸로 적용해야함
+//		mav.addObject("trendKeywordList",diquest.getTrendKeywordList());
+		mav.addObject("trendKeywordList",null);
+
+		mav.setViewName(super.getDeviceViewName("display/SearchLayer"));
+		return mav;
+	}
 }

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

@@ -237,7 +237,7 @@ public class TsfGoodsController extends TsfBaseController {
 //				// 상품 고시정보
 				mav.addObject("goodsNotiList", goodsService.getGoodsNotiList(goods));
 				// 상품 안전인증 정보
-				//mav.addObject("goodsSafeNo", goodsService.getGoodsSafeNo(goods));
+				mav.addObject("goodsSafeNo", goodsService.getGoodsSafeNo(goods));
 
 			} else if (TscConstants.GoodsType.SET.value().equals(goods.getGoodsType())) {		// 셋트상품
 				mav.addObject("goodsComposeList", goodsService.getGoodsSetComposeList(paramsGoods));
@@ -1334,7 +1334,7 @@ public class TsfGoodsController extends TsfBaseController {
 		// 상품 고시정보
 		mav.addObject("goodsNotiList", goodsService.getGoodsNotiList(goods));
 		// 상품 안전인증 정보
-		//mav.addObject("goodsSafeNo", goodsService.getGoodsSafeNo(goods)); 
+		mav.addObject("goodsSafeNo", goodsService.getGoodsSafeNo(goods)); 
 
 		// 상품 공통 베너
 		log.info("paramsGoods={}", paramsGoods);

+ 45 - 15
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -1384,6 +1384,30 @@ public class TsfMypageController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * 마이페이지 교환 옵션 변경 팝업
+	 *
+	 * @param Order
+	 * @return ModelAndView
+	 * @author card007
+	 * @since 2021. 03. 30
+	 */
+	@PostMapping("/track/withdraw/popup/form")
+	@ResponseBody
+	public ModelAndView trackWithdrawPopupForm(OrderChange orderChange) {
+		ModelAndView mav = new ModelAndView();
+
+		// 스윗트래커 정보 조회
+		SweetTracker sweetTracker = new SweetTracker();
+		sweetTracker.setShipCompCd(orderChange.getShipCompCd());
+		sweetTracker.setInvoiceNo(orderChange.getWdInvoiceNo());
+		mav.addObject("sweetTrackerInfoList", deliveryService.getSweetTrackerDeliveryInfo(sweetTracker));
+
+		mav.setViewName(super.getDeviceViewName("popup/TrackWithdrawPopupForm"));
+
+		return mav;
+	}
+
 	/**
 	 * 위시리스트 등록처리
 	 *
@@ -1556,6 +1580,8 @@ public class TsfMypageController extends TsfBaseController {
 			result.set("message", "쿠폰이 발급되었습니다.");
 		}
 		result.set("status", "200");
+		
+		result.set("couponList", couponService.getQuickCouponDownList(coupon));
 		return result;
 	}
 
@@ -1619,9 +1645,9 @@ public class TsfMypageController extends TsfBaseController {
 	@PostMapping("/complete/review/list")
 	@ResponseBody
 	public GagaMap getMypageCompleteReviewList(@RequestBody Review review) {
-
+		String frontGb = TsfSession.getFrontGb();
 		review.setSiteCd(TscConstants.Site.STYLE24.value());
-
+		review.setFrontGb(frontGb);
 		if (TsfSession.isLogin()) {
 			review.setCustNo(TsfSession.getInfo().getCustNo());
 		}
@@ -1629,11 +1655,14 @@ public class TsfMypageController extends TsfBaseController {
 		int reviewExpireDay = eventService.getGoodsReviewRegisterDays(TscConstants.Site.STYLE24.value());
 		review.setReviewExpireDay(reviewExpireDay);
 		result.set("completeReviewCount", reviewService.getCompleteReviewList(review).size());
-		TscPageRequest pageable = new TscPageRequest((review.getPageNo() > 0 ? review.getPageNo() - 1 : 0), review.getPageSize(), review.getPageUnit());
-		pageable.setTotalCount(reviewService.getCompleteReviewList(review).size());
-		review.setPageable(pageable);
 		
-		result.set("paging1", review);
+		if (frontGb == "P") {
+			TscPageRequest pageable = new TscPageRequest((review.getPageNo() > 0 ? review.getPageNo() - 1 : 0), review.getPageSize(), review.getPageUnit());
+			pageable.setTotalCount(reviewService.getCompleteReviewList(review).size());
+			review.setPageable(pageable);
+			
+			result.set("paging1", review);
+		}
 		
 		
 		result.set("dataList1", reviewService.getCompleteReviewList(review));
@@ -1651,9 +1680,9 @@ public class TsfMypageController extends TsfBaseController {
 	@PostMapping("/already/review/list")
 	@ResponseBody
 	public GagaMap getMypageAlreadyReviewList(@RequestBody Review review) {
-
+		String frontGb = TsfSession.getFrontGb();
 		review.setSiteCd(TscConstants.Site.STYLE24.value());
-
+		review.setFrontGb(frontGb);
 		GagaMap result = new GagaMap();
 		if (TsfSession.isLogin()) {
 			review.setCustNo(TsfSession.getInfo().getCustNo());
@@ -1661,11 +1690,12 @@ public class TsfMypageController extends TsfBaseController {
 		
 		review.setReviewExpireDay(eventService.getGoodsReviewPointExpireDays(TscConstants.Site.STYLE24.value()));
 		result.set("alreadyReviewCount", reviewService.getAlreadyReviewList(review).size());
-		
-		TscPageRequest pageable2 = new TscPageRequest((review.getPageNo2() > 0 ? review.getPageNo2() - 1 : 0), review.getPageSize2(), review.getPageUnit2());
-		pageable2.setTotalCount(reviewService.getAlreadyReviewList(review).size());
-		review.setPageable2(pageable2);
-		result.set("paging2", review);
+		if (frontGb == "P") {
+			TscPageRequest pageable2 = new TscPageRequest((review.getPageNo2() > 0 ? review.getPageNo2() - 1 : 0), review.getPageSize2(), review.getPageUnit2());
+			pageable2.setTotalCount(reviewService.getAlreadyReviewList(review).size());
+			review.setPageable2(pageable2);
+			result.set("paging2", review);
+		}
 		
 		result.set("dataList2", reviewService.getAlreadyReviewList(review));
 
@@ -1760,8 +1790,8 @@ public class TsfMypageController extends TsfBaseController {
 		review.setCustNo(TsfSession.getInfo().getCustNo());
 		review.setSiteCd(TscConstants.Site.STYLE24.value());
 		reviewService.reviewDelete(review);
-		result.set("alreadyReviewCount",reviewService.getAlreadyReviewCount(review));
-		result.set("completeReviewCount",reviewService.getCompleteReviewCount(review));
+		result.set("alreadyReviewCount",reviewService.getAlreadyReviewList(review).size());
+		result.set("completeReviewCount",reviewService.getCompleteReviewList(review).size());
 		result.set("status", "200");
 		return result;
 	}

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

@@ -779,7 +779,8 @@ public class TsfOrderController extends TsfBaseController {
 			param.setCustNo(0);
 			order.setCustNo(0);
 		}
-		
+
+		param.setRegNo(param.getCustNo());
 		param.setUpdNo(param.getCustNo());
 		
 		// 2. 결재정보등록(TB_PAYMENT)

+ 2 - 13
src/main/java/com/style24/front/biz/web/TsfPgController.java

@@ -181,18 +181,7 @@ public class TsfPgController extends TsfBaseController {
 	 */
 	@ResponseBody
 	@PostMapping("/nPayReq")
-	public GagaMap nPayReq(@RequestBody Order param) {
-		GagaMap map = new GagaMap();
-		//for(Order param : params) {
-		//	log.info("CHECK NPAY INPUT >>>> {} / {} / {}", param.getGoodsCd(), param.getOptCd(), param.getGoodsQty());
-		//}
-
-		for(int cartSq : param.getCartSqArr()) {
-			log.info("CHECK NPAY INPUT >>>> {}", param.getCartSqArr());
-		}
-
-		map = orderService.nPayReq50(param);
-
-		return map;
+	public GagaMap nPayReq(@RequestBody Order param, HttpServletRequest request, HttpServletResponse response) {
+		return orderService.nPayReq50(param, request, response);
 	}
 }

+ 18 - 0
src/main/java/com/style24/front/biz/web/TsfPlanningController.java

@@ -7,11 +7,13 @@ import java.util.Calendar;
 import java.util.Collection;
 import java.util.Date;
 
+import com.style24.persistence.domain.CustGrade;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.mobile.device.Device;
 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;
@@ -579,6 +581,22 @@ public class TsfPlanningController extends TsfBaseController {
 		return mav;
 	}
 
+
+
+	@GetMapping("/next/custgrade/info/{nextGradeCd}")
+	@ResponseBody
+	public GagaMap getNextCustGradeInfo(@PathVariable String nextGradeCd) {
+		boolean isLogin = TsfSession.isLogin();
+		if (!isLogin) {
+			throw new IllegalStateException("로그인 하시기 바랍니다.");
+		}
+		CustGrade custGrade = new CustGrade();
+		custGrade.setSiteCd(TscConstants.Site.STYLE24.value());
+		custGrade.setCustNo(TsfSession.getInfo().getCustNo());
+		custGrade.setGradeCd(nextGradeCd);
+		return customerService.getNextCustGradeInfo(custGrade);
+	}
+
 	/**
 	 * 회원등급 쿠폰 다운로드
 	 *

+ 13 - 11
src/main/java/com/style24/persistence/domain/GoodsSafeNo.java

@@ -14,21 +14,23 @@ import lombok.Data;
 @Data
 public class GoodsSafeNo extends TscBaseDomain {
 
+//	private String goodsCd;
+//	private String goodsNum;
+//	private String certNum;
+//	private String certState;
+//	private String certDiv;
+//	private String certOrganName;
+//	private String certDt;
+
 	private String goodsCd;
-	private String goodsNum;
+	private String certTargetGb;
+	private String certFormGb;
+	private String certFormNm;
+	private String certType;
 	private String certNum;
 	private String certState;
 	private String certDiv;
 	private String certOrganName;
 	private String certDt;
-
-//	public boolean getIsCertNum() {
-//		if (this.certNum.matches(".*[0-9].*")) {
-//			return true;
-//		} else {
-//			return false;
-//		}
-//
-//	}
-
+	
 }

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

@@ -106,6 +106,7 @@ public class Review extends TscBaseDomain {
 	private int nextReviewSq;
 	private int reviewExpireDay;
 	private String kmcKey;
+	private String kufKey;
 	
 	private Integer custPntSq;		// 고객포인트일련번호
 	private int gvPntAmt;			// 지급포인트금액

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

@@ -548,7 +548,7 @@
 		             , CASE WHEN GQDS.GOODS_CD IS NULL AND G.SELF_GOODS_YN = 'Y' THEN 'SHOT'
 		                    WHEN G.SELF_GOODS_YN = 'Y' THEN 'WMS'
 		                    ELSE DFP.DELV_FEE_CD END AS CART_DELV_FEE_CD
-		             , CASE WHEN STOCK.ORD_CAN_YN = 'Y' AND (SELECT  CASE WHEN MAX(Z.CNT1) IS NULL THEN 'Y' ELSE CASE WHEN CNT2 > 0 THEN 'Y'
+		             , CASE WHEN STOCK.ORD_CAN_YN = 'Y' AND (SELECT  CASE WHEN MAX(Z.CNT1) IS NULL THEN 'Y' ELSE CASE WHEN MAX(Z.CNT2) > 0 THEN 'Y'
 		                                                                                                              ELSE 'N' END END
 		                                                     FROM    (SELECT COUNT(1) AS CNT1
 		                                                                   , CASE WHEN GOG.CUST_GRADE = CT.CUST_GRADE THEN 1

+ 13 - 10
src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml

@@ -233,7 +233,8 @@
 		             , CP.CPN_NM                                              -- 쿠폰명
 		             , CP.DC_WAY                                              -- 할인방식
 		             , CP.DC_VAL                                              -- 할인값
-		             , CP.MAX_DC_AMT                                          -- 최대할인금액
+		             , (CASE WHEN CP.DC_WAY = 'G240_10' THEN CP.DC_VAL
+		                     ELSE CP.MAX_DC_AMT END) AS MAX_DC_AMT            -- 최대할인금액
 		             , CP.CURR_PRICE                                          -- 즉시쿠폰적용판매가
 		             , CP.CUST_PUB_LIMIT_QTY                                  -- 1인당 발급제한수량
 		             , CP.TOT_PUB_LIMIT_QTY                                   -- 총발행제한수량(0은 무제한)
@@ -250,7 +251,8 @@
 		             , CP.BUY_EDDT                                            -- 첫구매종료일시
 		             <![CDATA[
 		             , (CASE WHEN CP.DC_WAY = 'G240_10' THEN
-		                    (CASE WHEN IFNULL(CP.MAX_DC_AMT, 0) >0 AND CP.MAX_DC_AMT < CP.DC_VAL THEN CP.MAX_DC_AMT ELSE CP.DC_VAL END)
+		           --         (CASE WHEN IFNULL(CP.MAX_DC_AMT, 0) >0 AND CP.MAX_DC_AMT < CP.DC_VAL THEN CP.MAX_DC_AMT ELSE CP.DC_VAL END)
+		                       CP.DC_VAL
 		                ELSE
 		                     (CASE WHEN IFNULL(CP.MAX_DC_AMT, 0) >0 AND CP.MAX_DC_AMT < FLOOR((CP.CURR_PRICE * DC_VAL / 100) / #{pointUnit}) * #{pointUnit} THEN CP.MAX_DC_AMT ELSE FLOOR((CP.CURR_PRICE * CP.DC_VAL / 100) / #{pointUnit}) * #{pointUnit} END)
 		                END) AS DC_AMT
@@ -420,7 +422,7 @@
 		               ) CP
 		               WHERE 1 = 1
 		               <![CDATA[
-		               AND CP.BUY_LIMIT_AMT <= CP.CURR_PRICE  -- 최소주문금액
+		              -- AND CP.BUY_LIMIT_AMT <= CP.CURR_PRICE  -- 최소주문금액
 		               ]]>
 		       ) Y
 		) A
@@ -484,7 +486,8 @@
 		             , CP.CPN_NM                                              -- 쿠폰명
 		             , CP.DC_WAY                                              -- 할인방식
 		             , CP.DC_VAL                                              -- 할인값
-		             , CP.MAX_DC_AMT                                          -- 최대할인금액
+		             , (CASE WHEN CP.DC_WAY = 'G240_10' THEN CP.DC_VAL
+		                     ELSE CP.MAX_DC_AMT END) AS MAX_DC_AMT            -- 최대할인금액
 		             , CP.CURR_PRICE                                          -- 즉시쿠폰적용판매가
 		             , CP.CUST_PUB_LIMIT_QTY                                  -- 1인당 발급제한수량
 		             , CP.TOT_PUB_LIMIT_QTY                                   -- 총발행제한수량(0은 무제한)
@@ -501,7 +504,8 @@
 		             , CP.BUY_EDDT                                            -- 첫구매종료일시
 		             <![CDATA[
 		             , (CASE WHEN CP.DC_WAY = 'G240_10' THEN
-		                    (CASE WHEN IFNULL(CP.MAX_DC_AMT, 0) >0 AND CP.MAX_DC_AMT < CP.DC_VAL THEN CP.MAX_DC_AMT ELSE CP.DC_VAL END)
+		             --       (CASE WHEN IFNULL(CP.MAX_DC_AMT, 0) >0 AND CP.MAX_DC_AMT < CP.DC_VAL THEN CP.MAX_DC_AMT ELSE CP.DC_VAL END)
+		                     CP.DC_VAL
 		                ELSE
 		                     (CASE WHEN IFNULL(CP.MAX_DC_AMT, 0) >0 AND CP.MAX_DC_AMT < FLOOR((CP.CURR_PRICE * DC_VAL / 100) / #{pointUnit}) * #{pointUnit} THEN CP.MAX_DC_AMT ELSE FLOOR((CP.CURR_PRICE * CP.DC_VAL / 100) / #{pointUnit}) * #{pointUnit} END)
 		                END) AS DC_AMT
@@ -671,7 +675,7 @@
 		               ) CP
 		               WHERE 1 = 1
 		               <![CDATA[
-		               AND CP.BUY_LIMIT_AMT <= CP.CURR_PRICE  -- 최소주문금액
+		             --  AND CP.BUY_LIMIT_AMT <= CP.CURR_PRICE  -- 최소주문금액
 		               ]]>
 		       ) Y
 		) A
@@ -755,8 +759,7 @@
 		                             WHEN 'M' = #{frontGb} THEN CP.DC_MVAL
 		                             ELSE CP.DC_AVAL END) > 0                  -- PC, MOBILE,APP 별로 0 보다 큰 쿠폰
 		                AND   (
-		                        (CP.APPLY_SCOPE = 'A' ) 
-		                        OR  /* 적용대상:상품*/
+		                        /* 적용대상:상품*/
 		                        (CP.APPLY_SCOPE = 'I' AND (SELECT COUNT(1) FROM TB_COUPON_REFVAL
 		                                                   WHERE CPN_ID = CP.CPN_ID
 		                                                   AND CPN_TARGET = 'G260_10'
@@ -1289,6 +1292,7 @@
 		      ,C.CUST_PUB_LIMIT_QTY 
 		      ,C.TOT_PUB_LIMIT_QTY
 		      ,C.MAX_DC_AMT 
+		      , IFNULL((SELECT COUNT(1) FROM TB_CUST_COUPON WHERE CPN_ID = C.CPN_ID AND CUST_NO = #{custNo}),0) AS CUST_COUPON_CNT
 		      , CONCAT(CASE WHEN C.BUY_LIMIT_AMT = 0 THEN ''
 		                   ELSE CONCAT(FORMAT(C.BUY_LIMIT_AMT , 0),'원 이상 구매 시 ')
 		              END
@@ -1335,8 +1339,7 @@
 		     WHERE CPN_ID = C.CPN_ID
 		     AND USABLE_CUST_GRADE IN (#{custGrade})              -- 사용가능고객구분
 		     ) <![CDATA[>=]]> 1
-		ORDER BY  C.AVAIL_EDDT,
-		CASE WHEN DC_WAY LIKE '%' THEN DC_VAL END DESC LIMIT 10
+		ORDER BY  C.REG_DT DESC ,C.AVAIL_EDDT ASC LIMIT 10
 	</select>
 	
 </mapper>

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

@@ -603,7 +603,7 @@
 		/* TsfCustomer.getExpectedCustGrde */
 		SELECT B.ORD_NO_CNT
 		     , B.SUM_REAL_ORD_AMT
-		     , #{gradeCd}        AS GRADE_CD
+		     , #{gradeCd}                         AS GRADE_CD
 		     , FN_GET_CODE_NM('G110', #{gradeCd}) AS GRADE_CD_NM
 		     , SUBSTRING(#{gradeCd}, 6, 2)        AS GRADE_CD_NO
 		FROM  (
@@ -654,5 +654,29 @@
 		    ,  UPD_DT = NOW()
 		    ,  UPD_NO = #{updNo}
 	</insert>
+	
+	<!-- SMS수신거부 처리 -->
+	<update id="updateSmsReceptionRefuse" parameterType="Integer">
+		/* TsfCustomer.updateSmsReceptionRefuse */
+		UPDATE TB_CUSTOMER
+		SET    SMS_AGREE_YN = 'N'
+		     , SMS_AGREE_DT = NOW()
+		     , UPD_NO = #{custNo}
+		     , UPD_DT = NOW()
+		WHERE  CUST_NO = #{custNo}
+		AND    SMS_AGREE_YN = 'Y' /*현재수신동의인경우*/
+	</update>
+	
+	<!-- 메일수신거부 처리 -->
+	<update id="updateEmailReceptionRefuse" parameterType="Integer">
+		/* TsfCustomer.updateEmailReceptionRefuse */
+		UPDATE TB_CUSTOMER
+		SET    EMAIL_AGREE_YN = 'N'
+		     , EMAIL_AGREE_DT = NOW()
+		     , UPD_NO = #{custNo}
+		     , UPD_DT = NOW()
+		WHERE  CUST_NO = #{custNo}
+		AND    EMAIL_AGREE_YN = 'Y' /*현재수신동의인경우*/
+	</update>
 
 </mapper>

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

@@ -107,7 +107,10 @@
 		     , DETAILS
 		     , IFNULL(TELNO_MAN, TELNO_OFFICE) AS TELNO
 		  FROM TB_SWEET_TRACKER
-		 WHERE SHIP_COMP_CD = #{shipCompCd}
+		 WHERE SHIP_COMP_CD = (SELECT SWT_SHIP_COMP_CD
+		                         FROM TB_SHIP_COMPANY
+		                        WHERE SHIP_COMP_CD = #{shipCompCd}
+		                          AND USE_YN = 'Y')
 		   AND INVOICE_NO = #{invoiceNo}
 		 ORDER BY DELV_LEVEL DESC;
 	</select>

+ 22 - 16
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -548,7 +548,8 @@
 		           , A.LINK_URL 
 		           , A.NOTE 
 		           , B.CARD_PRMT_CDT_SQ 
-		           , (B.MIN_PAY_AMT / 10000) AS MIN_PAY_AMT  -- 만원단위 
+		           --  , (B.MIN_PAY_AMT / 10000) AS MIN_PAY_AMT  -- 만원단위
+		           , B.MIN_PAY_AMT 
 		           , B.MAX_DC_AMT
 		           , B.MAX_NO_ITRT 
 		           , B.MIN_NO_ITRT 
@@ -637,14 +638,19 @@
 	<!-- 상품  안전인증 정보  -->
 	<select id="getGoodsSafeNo"  parameterType="Goods" resultType="GoodsSafeNo">
 		/* TsfGoods.getGoodsSafeNo */
-		SELECT GOODS_CD
-		     , CERT_NUM
-		     , CERT_STATE
-		     , CERT_DIV
-		     , CERT_ORGAN_NAME
-		     , CERT_DT
-		FROM TB_GOODS_SAFE_NO A
+		SELECT  GOODS_CD
+		      , CERT_TARGET_GB
+		      , CERT_FORM_GB
+		      , FN_GET_CODE_NM('G084',CERT_FORM_GB) AS CERT_FORM_NM  
+		      , CERT_TYPE
+		      , CERT_NUM
+		      , CERT_STATE
+		      , CERT_DIV
+		      , CERT_ORGAN_NAME
+		      , CERT_DT
+		FROM TB_GOODS_SAFE_NO 
 		WHERE GOODS_CD = #{goodsCd}
+		AND CERT_TARGET_GB IN ('G083_1', 'G083_3')  -- 인증대상, 상세설명별도표기
 	</select>
 	
 	<!-- 상품  배송안내정보  -->
@@ -1008,7 +1014,7 @@
 		AND    G.MAIN_COLOR_CD = GI.COLOR_CD
 		AND    G.GOODS_STAT = 'G008_90' /*승인완료된상품만*/
 		AND    GI.DEFAULT_IMG_YN = 'Y' /*기본이미지만*/
-		GROUP  BY G.GOODS_CD, G.MAIN_COLOR_CD
+		GROUP  BY G.GOODS_CD, G.MAIN_COLOR_CD, GI.SYS_IMG_NM
 		ORDER  BY A.DISP_ORD DESC
 	</select>
 	
@@ -1159,7 +1165,7 @@
 		          -- , RANK() OVER (PARTITION BY F.FREEGIFT_SQ , F.FREEGIFT_SECTION_SQ ORDER BY  FG.FREEGIFT_VAL_SQ ) AS RNUM
 		    FROM TAB_FREEGOODS FG
 		     WHERE FG.ROWNUM = 1
-		    GROUP BY  FG.FREEGIFT_SQ , FG.FREEGIFT_SECTION_SQ , FG.ALL_YN , FG.SECTION_GB , FG.SECTION_VAL
+		    GROUP BY  FG.FREEGIFT_SQ , FG.FREEGIFT_SECTION_SQ , FG.ALL_YN , FG.SECTION_GB , FG.SECTION_VAL, FG.GOODS_NM, FG.ITEM_QTY
 		    ORDER BY FG.FREEGIFT_SQ, FG.FREEGIFT_SECTION_SQ
 		) Z
 		WHERE 1 = 1
@@ -2048,12 +2054,12 @@
 		               , G.GOODS_TNM                             /*상품타이틀명*/
 		               , G.MAIN_COLOR_CD                         /*대표색상코드*/
 		               , G.LIST_PRICE                            /*정상가(최초판매가)*/
-		               , CASE WHEN #{frontGb} = 'P' AND #{custGb} = 'G100_20' THEN GBP.STAFF_PC_CURR_PRICE
-		                      WHEN #{frontGb} = 'M' AND #{custGb} = 'G100_20' THEN GBP.STAFF_MO_CURR_PRICE
-		                      WHEN #{frontGb} = 'A' AND #{custGb} = 'G100_20' THEN GBP.STAFF_APP_CURR_PRICE
-		                      WHEN #{frontGb} = 'P' AND #{custGb} != 'G100_20' THEN GBP.PC_CURR_PRICE
-		                      WHEN #{frontGb} = 'M' AND #{custGb} != 'G100_20' THEN GBP.MO_CURR_PRICE
-		                      WHEN #{frontGb} = 'A' AND #{custGb} != 'G100_20' THEN GBP.APP_CURR_PRICE
+		               , CASE WHEN #{frontGb} = 'P' AND #{custGb} = 'G100_20' THEN  IFNULL(GBP.STAFF_PC_CURR_PRICE,G.CURR_PRICE)
+		                      WHEN #{frontGb} = 'M' AND #{custGb} = 'G100_20' THEN  IFNULL(GBP.STAFF_MO_CURR_PRICE,G.CURR_PRICE)
+		                      WHEN #{frontGb} = 'A' AND #{custGb} = 'G100_20' THEN  IFNULL(GBP.STAFF_APP_CURR_PRICE,G.CURR_PRICE)
+		                      WHEN #{frontGb} = 'P' AND #{custGb} != 'G100_20' THEN IFNULL(GBP.PC_CURR_PRICE,G.CURR_PRICE)
+		                      WHEN #{frontGb} = 'M' AND #{custGb} != 'G100_20' THEN IFNULL(GBP.MO_CURR_PRICE,G.CURR_PRICE)
+		                      WHEN #{frontGb} = 'A' AND #{custGb} != 'G100_20' THEN IFNULL(GBP.APP_CURR_PRICE,G.CURR_PRICE)
 		                      ELSE G.CURR_PRICE
 		                END                   AS CURR_PRICE     /*현재판매가*/
 		               , G.MIN_ORD_AMT                           /*최소주문금액*/

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

@@ -104,7 +104,7 @@
 		       AND CPH.OCCUR_GB NOT IN ('G069_12','G069_13')
 		       AND DATE_FORMAT(CPH.UPD_DT,'%Y%m') = #{searchDt}
 		       AND CPH.PNT_AMT <![CDATA[>]]> 0
-		UNION ALL
+		UNION
 		      SELECT  CASE CPH.OCCUR_GB
 		                  WHEN 'G069_12' THEN '상품 구매'
 		                  WHEN 'G069_13' THEN '구매 취소'
@@ -199,7 +199,7 @@
 		       AND CPH.OCCUR_GB NOT IN ('G069_12','G069_13')
 		       AND DATE_FORMAT(CPH.UPD_DT,'%Y%m') = #{searchDt}
 		       AND CPH.PNT_AMT <![CDATA[<]]> 0
-		UNION ALL
+		UNION
 		      SELECT  CASE CPH.OCCUR_GB
 		                  WHEN 'G069_12' THEN '상품 구매'
 		                  WHEN 'G069_13' THEN '구매 취소'
@@ -293,7 +293,7 @@
 		       WHERE CPH.CUST_NO = #{custNo}
 		       AND CPH.OCCUR_GB NOT IN ('G069_12','G069_13')
 		       AND DATE_FORMAT(CPH.UPD_DT,'%Y%m') = #{searchDt}
-		UNION ALL
+		UNION
 		      SELECT  CASE CPH.OCCUR_GB
 		                  WHEN 'G069_12' THEN '상품 구매'
 		                  WHEN 'G069_13' THEN '구매 취소'

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

@@ -171,7 +171,7 @@
 		                        )
 		                    )
 		        </if>
-		        ) AS PREV_REVIEW_SQ
+		        ) AS NEXT_REVIEW_SQ       -- DESC순 
 		     , (SELECT MIN(RN.REVIEW_SQ) 
 		        FROM TB_REVIEW RN
 		        WHERE RN.REVIEW_SQ > #{reviewSq}
@@ -191,7 +191,7 @@
 		                        )
 		                    )
 		        </if>
-		        ) AS NEXT_REVIEW_SQ
+		        ) AS PREV_REVIEW_SQ       -- DESC순
 		     , RANK() OVER(ORDER BY R.REVIEW_SQ DESC) AS RNUM
 		FROM TB_REVIEW R 
 		INNER JOIN TB_GOODS G ON R.GOODS_CD = G.GOODS_CD
@@ -270,6 +270,7 @@
 		     , A.FILE_GB
 		     , A.SYS_FILE_NM
 		     , A.KMC_KEY
+		     , A.KUF_KEY
 		     , A.DEL_YN 
 		     , RANK() OVER(ORDER BY a.FILE_GB DESC) AS NUMB
 		FROM  TB_REVIEW R
@@ -278,9 +279,9 @@
 		WHERE R.DISP_YN = 'Y'
 		AND R.DEL_YN = 'N'
 		AND R.REVIEW_SQ = #{reviewSq}
-		AND (A.FILE_GB  = 'I'
+		AND (FILE_GB  = 'I'
 		     OR
-		     A.FILE_GB = 'M' AND R.CONFIRM_YN = 'Y' AND  A.KMC_KEY IS NOT NULL
+		     FILE_GB = 'M' AND R.CONFIRM_YN = 'Y'  AND  NULLIF(KMC_KEY,'') IS NOT NULL
 		    )
 	</select>
 	
@@ -345,7 +346,9 @@
 	<!-- 마이페이지 작성가능한 리뷰 -->
 	<select id="getCompleteReviewList" parameterType="Review" resultType="Review">
 		/* TsfReivew.getCompleteReviewList */
+		<if test='frontGb == "P"'>
 		<include refid="selectForPagingHeader"/>
+		</if>
 		SELECT GROUP_CONCAT(Z.ITEM_NM ORDER BY Z.ORD_DTL_ITEM_SQ SEPARATOR '!@!') AS ITEM_NM
 		     -- , GROUP_CONCAT(Z.COLOR_NM ORDER BY Z.ORD_DTL_ITEM_SQ) AS COLOR_NM
 		     , GROUP_CONCAT(' ',CONCAT(OPT_CD1_NM,'/', OPT_CD2) ORDER BY Z.ORD_DTL_ITEM_SQ) AS COLOR_NM
@@ -465,7 +468,8 @@
 		                                   AND C.USE_YN = 'Y'
 				  WHERE 1=1
 				AND O.PAY_DT >  DATE_FORMAT(DATE_ADD(CURRENT_DATE(), INTERVAL #{reviewExpireDay} DAY), '%Y%M%D%H%I%S') 
-				AND O.ORD_NO NOT IN (SELECT R.ORD_NO FROM TB_REVIEW R WHERE R.DEL_YN = 'N' AND DISP_YN = 'Y')
+				-- AND O.ORD_NO NOT IN (SELECT R.ORD_NO FROM TB_REVIEW R WHERE R.DEL_YN = 'N' AND DISP_YN = 'Y')
+				AND OD.ORD_DTL_NO NOT IN (SELECT R.ORD_DTL_NO FROM TB_REVIEW R WHERE R.DEL_YN = 'N' AND DISP_YN = 'Y' AND R.ORD_NO = O.ORD_NO AND R.ORD_DTL_NO = OD.ORD_DTL_NO AND R.CUST_NO = #{custNo})
 				AND O.CUST_NO = #{custNo}
 				AND O.DISP_YN = 'Y'
 			 	AND O.SITE_CD = #{siteCd}
@@ -476,7 +480,9 @@
 				, Z.SUPPLY_COMP_CD, Z.DELV_FEE_CD, Z.SHOT_DELV_YN, Z.CHANGEABLE_YN, Z.SELF_GOODS_YN, Z.BRAND_NM, Z.BRAND_ENM, Z.ORD_DTL_STAT_NM
 				, Z.ORD_REQ_CHG_QTY, Z.ORD_CAN_CHG_QTY
 		ORDER BY Z.ORD_NO DESC, Z.ORD_DTL_STAT, Z.SELF_GOODS_YN DESC, Z.SHOT_DELV_YN DESC, Z.SUPPLY_COMP_CD
+		<if test='frontGb == "P"'>
 		<include refid="selectForPagingFooter"/>
+		</if>
 	</select>
 	
 	<!-- 마이페이지 리뷰작성 상품데이타 -->
@@ -832,7 +838,9 @@
 		   ,SCORE_WEIGHT   =  #{scoreWeight}     
 		   ,SCORE_BALL     =  #{scoreBall}  
 		   , DEL_YN        = 'N'     
-		   ,UPD_DT         =  now()     
+		   ,UPD_DT         =  now()  
+		   ,CONFIRM_YN     = 'Y'
+		   ,CONFIRM_DT     = NOW()   
 		WHERE REVIEW_SQ  = #{reviewSq}
 		AND   ORD_NO     = #{ordNo}
 		AND   ORD_DTL_NO = #{ordDtlNo}
@@ -843,14 +851,17 @@
 	<update id="updateMypageReviewConfimYn" parameterType="Review">
 		/* TsfReivew.updateMypageReviewConfimYn */
 		UPDATE TB_REVIEW
-		SET CONFIRM_YN = 'N'
-		   ,CONFIRM_DT = NOW()
+		<if test='confirmYn == "Y"'>
+		SET CONFIRM_DT = NOW()
+		   ,CONFIRM_YN = 'Y'
+		   </if>
+		   <if test='confirmYn == "N"'>
+		 SET CONFIRM_DT = NULL
+		    ,CONFIRM_YN = 'N'
+		   </if>
 		WHERE REVIEW_SQ  = #{reviewSq}
 	</update>
 	
-	
-	
-	
 	<select id="getAlreadyReviewCount" parameterType="Review" resultType="int">
 		/* TsfReivew.getAlreadyReviewCount */
 		SELECT  COUNT(*) AS CNT 
@@ -919,7 +930,9 @@
 	
 	<select id="getAlreadyReviewList" parameterType="Review" resultType="Review">
 		/* TsfReivew.getAlreadyReviewList */
+		<if test='frontGb == "P"'>
 		<include refid="selectForPagingHeader"/>
+		</if>
 		        SELECT GROUP_CONCAT(Z.ITEM_NM ORDER BY Z.ORD_DTL_ITEM_SQ SEPARATOR '!@!') AS ITEM_NM
 		          -- , GROUP_CONCAT(Z.COLOR_NM ORDER BY Z.ORD_DTL_ITEM_SQ) AS COLOR_NM
 		             , GROUP_CONCAT(' ',CONCAT(OPT_CD1_NM,'/', OPT_CD2) ORDER BY Z.ORD_DTL_ITEM_SQ) AS COLOR_NM
@@ -1122,6 +1135,7 @@
 		   AND O.CUST_NO =  #{custNo}
 		   AND O.DISP_YN = 'Y'
 		   AND R.CONFIRM_YN = 'Y'
+		   AND OD.ORD_DTL_NO IN (SELECT R.ORD_DTL_NO FROM TB_REVIEW R WHERE R.DEL_YN = 'N' AND DISP_YN = 'Y' AND R.ORD_NO = O.ORD_NO AND R.ORD_DTL_NO = OD.ORD_DTL_NO AND R.CUST_NO = #{custNo})
 		   AND O.SITE_CD =  #{siteCd}
 		   	) Z
 		 GROUP BY Z.ORD_NO, Z.ORD_DT, Z.DELV_EDDT, Z.ORD_DTL_NO, Z.ORD_EXCH_GB
@@ -1130,7 +1144,9 @@
 		        , Z.SUPPLY_COMP_CD, Z.DELV_FEE_CD, Z.SHOT_DELV_YN, Z.CHANGEABLE_YN, Z.SELF_GOODS_YN, Z.BRAND_NM, Z.BRAND_ENM, Z.ORD_DTL_STAT_NM
 		        , Z.ORD_REQ_CHG_QTY, Z.ORD_CAN_CHG_QTY
 		ORDER BY Z.ORD_NO DESC, Z.ORD_DTL_STAT, Z.SELF_GOODS_YN DESC, Z.SHOT_DELV_YN DESC, Z.SUPPLY_COMP_CD
+		<if test='frontGb == "P"'>
 		<include refid="selectForPagingFooter"/>
+		</if>
 		</select>
 	
 	<select id="getReviewAttach" parameterType="Review" resultType="Review">
@@ -1175,6 +1191,7 @@
 			 , RA.ORG_FILE_NM
 			 , RA.SYS_FILE_NM
 			 , RA.KMC_KEY
+			 , RA.KUF_KEY
 			 , RA.FILE_GB
 			 , RA.DEL_YN
 		FROM TB_REVIEW R LEFT JOIN TB_REVIEW_ATTACH RA ON R.REVIEW_SQ = RA.REVIEW_SQ 

+ 6 - 5
src/main/java/com/style24/persistence/mybatis/shop/TsfSocial.xml

@@ -87,8 +87,9 @@
 		     GROUP BY GOODS_CD
 		)
 		, TAB_STOCK AS (
-		    SELECT G.GOODS_CD
-		         , SUM(S.CURR_STOCK_QTY - S.BASE_STOCK_QTY) AS STOCK_QTY_SUM
+		     SELECT G.GOODS_CD
+		         , SUM(case WHEN S.SOLDOUT_YN = 'Y' THEN 0
+		                    ELSE S.CURR_STOCK_QTY - S.BASE_STOCK_QTY END ) AS STOCK_QTY_SUM
 		         , MIN(CASE WHEN S.SOLDOUT_YN = 'N' THEN S.OPT_CD ELSE 'XXX' END) AS OPT_CD 
 		    FROM   TAB_GOODS G
 		         , VW_STOCK S
@@ -98,15 +99,15 @@
 		    GROUP  BY G.GOODS_CD
 		    UNION ALL 
 		    SELECT G.GOODS_CD
-		         , SUM(S.CURR_STOCK_QTY - S.BASE_STOCK_QTY) AS STOCK_QTY_SUM
+		         , SUM(caSE WHEN S.SOLDOUT_YN = 'Y' THEN 0
+		                    ELSE S.CURR_STOCK_QTY - S.BASE_STOCK_QTY END ) AS STOCK_QTY_SUM
 		         , MIN(CASE WHEN S.SOLDOUT_YN = 'N' THEN S.OPT_CD ELSE 'XXX' END) AS OPT_CD 
 		    FROM   TAB_GOODS G
 		         , VW_STOCK_COMPOSE S
 		    WHERE  G.GOODS_CD = S.GOODS_CD
 		    AND    G.GOODS_TYPE != 'G056_N'
 		    AND    S.DISP_YN = 'Y' /*노출하는상품만*/
-		    GROUP  BY G.GOODS_CD
-		)
+		    GROUP  BY G.GOODS_CD		)
 		SELECT G.BRAND_GROUP_NM
 		     , G.GOODS_CD
 		     , FN_GET_GOODS_NM(G.GOODS_NM,G.GOODS_GB,G.FOREIGN_BUY_YN,G.PARALLEL_IMPORT_YN,G.ORDER_MADE_YN) AS GOODS_FULL_NM /*상품FULL명*/

+ 1 - 0
src/main/resources/config/application-locd.yml

@@ -88,6 +88,7 @@ naverPay:
     common.certification.key : s_3799db3bf4af-
     certification.key: 2BC5E173-2840-4B48-BC7D-FF770005DD76
     order.api.url: https://test-api.pay.naver.com/o/customer/api/order/v20/register
+    order.url: https://test-order.pay.naver.com/customer/buy
 
 # ERP (한세드림)
 erp:

+ 16 - 3
src/main/resources/config/application-style.yml

@@ -8,10 +8,23 @@ spring:
                 max-active: 10
                 max-idle: 10
                 min-idle: 2
-        host: 172.30.87.5
+#        host: 172.30.87.5
+#        port: 6379
+#        password: MdxpyGtipZSci6VhTpFdklXxb4Qv7zxEq3Jqg3ULekg=
+        host: 172.30.90.111
         port: 6379
-        password: MdxpyGtipZSci6VhTpFdklXxb4Qv7zxEq3Jqg3ULekg=
-
+        password:
+        cluster:
+            nodes:
+                172.30.90.111:6379
+                172.30.90.112:6379
+                172.30.90.113:6379
+                172.30.90.111:6380
+                172.30.90.112:6380
+                172.30.90.113:6380
+                172.30.90.111:6381
+                172.30.90.112:6381
+                172.30.90.113:6381
 # SSL Server
 has-ssl: false
 

+ 2 - 2
src/main/webapp/WEB-INF/views/mob/callcenter/GoodsQnaFormMob.html

@@ -101,7 +101,7 @@
 				tag += '						<span class="fold_state ' + (item.ansStat == "G060_10" ? "doing" : "done") + '"">' + item.ansStatNm + '</span>\n'; //답변완료 : done / 처리중 : doing
 				tag += '						<span class="prod">' + item.goodsNm + ' ' + item.relGoodsCd + '</span>\n';
 				tag += '					</div>\n';
-				tag += '					<div class="lap2"><span>' + item.questContent + '</span></div>\n';
+				tag += '					<div class="lap2"><span>' + item.questContent.escapeHtml() + '</span></div>\n';
 				tag += '				</div>\n';
 				tag += '				<span class="data">' + item.questDt + '</span>\n';
 				tag += '			</div>\n';
@@ -110,7 +110,7 @@
 				tag += '	<div class="fold_cont">\n';
 				tag += '		<div class="fold_detail">\n';
 				tag += '			<div>\n';
-				tag += '				<p>' + item.questContent + '</p>\n';
+				tag += '				<p>' + item.questContent.escapeHtml() + '</p>\n';
 				tag += '			</div>\n';
 				tag += '		</div>\n';
 				

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

@@ -95,7 +95,7 @@
 				tag += '	</div>\n';
 				tag += '	<div class="fold_cont">\n';
 				tag += '		<div class="fold_answer">\n';
-				tag += '			<div class="answer_body">' + item.noticeContent + '</div>\n';
+				tag += '			<div class="answer_body">' + item.noticeContent.escapeHtml() + '</div>\n';
 				tag += '		</div>\n';
 				tag += '	</div>\n';
 				tag += '</li>\n';

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

@@ -321,7 +321,7 @@
 				tag += '	</div>\n';
 				tag += '	<div class="fold_cont">\n';
 				tag += '		<div class="fold_detail">\n';
-				tag += '			<div><p>' + item.questContent + '</p></div>\n';
+				tag += '			<div><p>' + item.questContent.escapeHtml() + '</p></div>\n';
 				
 				if (!gagajf.isNull(item.sysFileNm1) || !gagajf.isNull(item.sysFileNm2)) {
 					tag += '		<p class="img_group">\n';

+ 6 - 0
src/main/webapp/WEB-INF/views/mob/cart/CartListAjaxFormMob.html

@@ -42,6 +42,12 @@
 											<em class="tag_stype2">총알배송</em>
 										</span>
 									</label>
+									<div class="tip_wrap tip1">
+										<div class="tip_tit">?</div>
+										<div class="tip_contents">
+											<p class="tip_txt"></p><ul><li>총알배송 가능 지역인 경우에만 적용됩니다.</li></ul><p></p>
+										</div>
+									</div>
 								</div>
 							</td>
 						</tr>

+ 2 - 2
src/main/webapp/WEB-INF/views/mob/cart/CartListFormMob.html

@@ -2,7 +2,7 @@
 <html lang="ko"
 	  xmlns:th="http://www.thymeleaf.org"
 	  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
-	  layout:decorator="mob/common/layout/SubLayoutMob">
+	  layout:decorator="mob/common/layout/GoodsLayoutMob">
 <!--
  *******************************************************************************
  * @source  : cartListFormMob
@@ -245,7 +245,7 @@
 
 		// 다다익선 정보
 		let qtyTmtbSq = $(obj).parent().parent().parent().parent().find("input[name=qtyTmtbSq]").val();
-		let amtTmtbSq = $(obj).parent().parent().parent().parent().find("input[name=qtyTmtbSq]").val();
+		let amtTmtbSq = $(obj).parent().parent().parent().parent().find("input[name=amtTmtbSq]").val();
 		let qtyTmtbYn = $(obj).parent().parent().parent().parent().find("input[name=applyQtySectionYn]").val();
 		let amtTmtbYn = $(obj).parent().parent().parent().parent().find("input[name=applyAmtSectionYn]").val();
 		let goodsCd = $(obj).parent().parent().parent().parent().find("input[name=goodsCd]").val();

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

@@ -41,7 +41,7 @@
 											</th:block>
 											<th:block th:unless="${cardInfo.dcGb == '3'}">
 											<p th:text="${#numbers.formatInteger(cardInfo.dcVal, 0,'COMMA')+ cardInfo.dcWayNm + ' ' + cardInfo.prmtGbNm}">5% 즉시할인</p>
-											<p th:text="${cardInfo.minPayAmt + '원 이상 구매 시 최대 ' + #numbers.formatInteger(cardInfo.maxDcAmt, 0,'COMMA') + '원 할인 '}">7만원 이상 구매 시 최대 5만원 할인</p>
+											<p th:text="${#numbers.formatInteger(cardInfo.minPayAmt, 0,'COMMA')  + '원 이상 구매 시 최대 ' + #numbers.formatInteger(cardInfo.maxDcAmt, 0,'COMMA') + '원 할인 '}">7만원 이상 구매 시 최대 5만원 할인</p>
 											</th:block>
 											<th:block th:if="${not #strings.isEmpty(cardInfo.linkUrl)}"><a th:href="${cardInfo.linkUrl}" target="_blank" class="link" >자세히보기</a></th:block>
 										</div>

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

@@ -185,27 +185,53 @@
 				</div>
 				</th:block>
 			</div>
-			<div class="area_kcl" th:if="${goodsSafeNo != null}">
+			
+			<th:block th:if="${goodsSafeNo != null}" >
+				<th:block th:if="${goodsSafeNo.certTargetGb == 'G083_3'}" >  <!-- 상세별도표시 -->
+			<div class="area_kcl no-mark">
 				<div>
-					<i class="ico ico_kcl"></i>
+					<p class="tit normal"><th:block th:if="${goodsSafeNo.certFormNm}" th:text="${goodsSafeNo.certFormNm + '/'}"></th:block> 제품 상세정보 내 별도 표기</p>
+					<p class="normal">제품 상세정보 내 표기되어 있습니다. 상품 정보를 확인해주세요.</p>
 				</div>
+			</div>	
+				</th:block>
+				<th:block th:unless="${goodsSafeNo.certTargetGb == 'G083_3'}" > <!-- 인증 -->
+					<th:block th:if="${goodsSafeNo.certType == 'G081_3'}" > <!-- 공급자적합성 -->
+			<div class="area_kcl">
+				<div><i class="ico ico_kcl"></i></div>
 				<div>
-					<p class="tit normal" th:utext="${goodsSafeNo.certDiv + '<br/>' + goodsSafeNo.certOrganName}"></p>
-					<p class="normal">
-						<th:block th:if="${#strings.contains(goodsSafeNo.certNum, '해당')}" >
-						<span>해당 없음</span>
-						</th:block>
-						<th:block th:unless="${#strings.contains(goodsSafeNo.certNum, '해당')}" >
+					<p class="tit normal"><th:block th:text="${goodsSafeNo.certFormNm}"></th:block> / 공급자적합성확인</p>
+					<p class="normal">공급자 적합성 확인 품목으로 국가통합인증을 필함</p>
+				</div>	
+			</div>
+					</th:block>
+					<th:block th:unless="${goodsSafeNo.certType == 'G081_3'}" > <!-- 공급자적합성 외 -->
+			<div class="area_kcl" >
+				<div><i class="ico ico_kcl"></i></div>
+				<div>
+					<th:block th:if="${goodsSafeNo.certFormGb != 'G084_4' and  goodsSafeNo.certFormGb != 'G084_5' }">
+					<p class="tit normal" th:text="${goodsSafeNo.certDiv + ' / ' + goodsSafeNo.certOrganName}">어린이제품 안전인증 / 한국건설생활시험연구원(KCL)</p>
+					</th:block>
+					<th:block th:unless="${goodsSafeNo.certFormGb != 'G084_4' and  goodsSafeNo.certFormGb != 'G084_5' }">
+					<p class="tit normal" th:text="${goodsSafeNo.certFormNm + ' 안전인증'}"></p>
+					</th:block>
+					<p class="normal" >
+						<th:block th:if="${goodsSafeNo.certFormGb != 'G084_4' and  goodsSafeNo.certFormGb != 'G084_5' }">
 						<span>인증번호:</span> <a class="num" th:href="@{http://www.safetykorea.kr/search/searchPop(certNum=${goodsSafeNo.certNum})}" target="_blank" th:text="${goodsSafeNo.certNum}">CB123A123-1234</a>
 						</th:block>
-						
+						<th:block th:uless="${goodsSafeNo.certFormGb != 'G084_4' and  goodsSafeNo.certFormGb != 'G084_5' }">
+						<span>인증번호:</span> <th:block th:text="${goodsSafeNo.certNum}">CB123A123-1234</th:block>
+						</th:block>
 					</p>
 				</div>
 			</div>
-			
-			<p class="t_info dot_info mt10"  th:if="${goodsSafeNo != null}">
+					</th:block>
+				</th:block>
+			<p class="t_info dot_info mt10">
 				해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.
-			</p>
+			</p>	
+			</th:block>
+			
 			<div class="area_infotbl">
 				<span class="title">상품기본정보</span>
 				<th:block th:if="${goodsInfo.goodsType == 'G056_N'} ">

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

@@ -223,7 +223,7 @@
 			</div>
 		</div>
 
-		<div class="inner">
+		<div class="inner wide">
 			<div class="content pd_descrp">
 				<div class="cont_head">
 				<h3 class="sr-only">상품상세정보</h3>
@@ -274,12 +274,14 @@
 					</th:block>
 					</th:block>
 					
-					<!-- 관리자 에디터입력 내용 노출  상단 html -->
+				</div>
+					
+				<div class="view_outfit_box" >
+				<!-- 관리자 에디터입력 내용 노출  상단 html -->
 					<th:block  th:if="${goodsInfo.goodsTopDesc != null  and !goodsInfo.goodsTopDesc.empty and goodsInfo.selfGoodsYn =='Y'}" th:utext="${#strings.unescapeJava(#strings.escapeJava(goodsInfo.goodsTopDesc))}"></th:block >
 					
 					<th:block th:if="${goodsInfo.goodsDesc != null  and !goodsInfo.goodsDesc.empty}" th:utext="${#strings.unescapeJava(#strings.escapeJava(goodsInfo.goodsDesc))}"></th:block>
-				</div>	
-					
+				</div>
 				<th:block th:if="${goodsInfo.tobeFormYn == 'Y'}">	
 				<!-- 착용컷 노출 -->
 				<div class="view_outfit_box" th:if="${#strings.contains(goodsImgList,'_M1') 
@@ -361,7 +363,7 @@
 				<!-- 브랜드 노출 -->
 				<div class="brand_box">
 					<p class="name" th:text="${goodsInfo.brandGroupNm}">TBJ 티비제이</p>
-					<a href="javascript:void(0);" class="btn btn_default" th:onclick="cfnGoToBrandMain([[${goodsInfo.brandGroupNo}]])" ><span>브랜드 홈 바로가기</span></a>
+					<a href="javascript:void(0);" class="brend_home" th:onclick="cfnGoToBrandMain([[${goodsInfo.brandGroupNo}]])" ><span>브랜드 홈 바로가기</span></a>
 				</div>
 				<!-- //브랜드 노출 -->	
 				
@@ -395,26 +397,102 @@
 						</div>
 						</th:block>
 					</div>
-					<div class="area_kcl" th:if="${goodsSafeNo != null}">
+					<th:block th:if="${goodsInfo.goodsType == 'G056_N' and goodsSafeNo != null}" >
+						<th:block th:if="${goodsSafeNo.certTargetGb == 'G083_3'}" >  <!-- 상세별도표시 -->
+					<div class="area_kcl no-mark">
 						<div>
-							<i class="ico ico_kcl"></i>
+							<p class="tit normal"><th:block th:if="${goodsSafeNo.certFormNm}" th:text="${goodsSafeNo.certFormNm + '/'}"></th:block> 제품 상세정보 내 별도 표기</p>
+							<p class="normal">제품 상세정보 내 표기되어 있습니다. 상품 정보를 확인해주세요.</p>
 						</div>
+					</div>	
+						</th:block>
+						<th:block th:unless="${goodsSafeNo.certTargetGb == 'G083_3'}" > <!-- 인증 -->
+							<th:block th:if="${goodsSafeNo.certType == 'G081_3'}" > <!-- 공급자적합성 -->
+					<div class="area_kcl">
+						<div><i class="ico ico_kcl"></i></div>
 						<div>
-							<p class="tit normal" th:utext="${goodsSafeNo.certDiv + '<br/>' + goodsSafeNo.certOrganName}"></p>
-							<p class="normal">
-								<th:block th:if="${#strings.contains(goodsSafeNo.certNum, '해당')}" >
-								<span>해당 없음</span>
-								</th:block>
-								<th:block th:unless="${#strings.contains(goodsSafeNo.certNum, '해당')}" >
+							<p class="tit normal"><th:block th:text="${goodsSafeNo.certFormNm}"></th:block> / 공급자적합성확인</p>
+							<p class="normal">공급자 적합성 확인 품목으로 국가통합인증을 필함</p>
+						</div>	
+					</div>
+							</th:block>
+							<th:block th:unless="${goodsSafeNo.certType == 'G081_3'}" > <!-- 공급자적합성 외 -->
+					<div class="area_kcl" >
+						<div><i class="ico ico_kcl"></i></div>
+						<div>
+							<th:block th:if="${goodsSafeNo.certFormGb != 'G084_4' and  goodsSafeNo.certFormGb != 'G084_5' }">
+							<p class="tit normal" th:text="${goodsSafeNo.certDiv + ' / ' + goodsSafeNo.certOrganName}">어린이제품 안전인증 / 한국건설생활시험연구원(KCL)</p>
+							</th:block>
+							<th:block th:unless="${goodsSafeNo.certFormGb != 'G084_4' and  goodsSafeNo.certFormGb != 'G084_5' }">
+							<p class="tit normal" th:text="${goodsSafeNo.certFormNm + ' 안전인증'}"></p>
+							</th:block>
+							<p class="normal" >
+								<th:block th:if="${goodsSafeNo.certFormGb != 'G084_4' and  goodsSafeNo.certFormGb != 'G084_5' }">
 								<span>인증번호:</span> <a class="num" th:href="@{http://www.safetykorea.kr/search/searchPop(certNum=${goodsSafeNo.certNum})}" target="_blank" th:text="${goodsSafeNo.certNum}">CB123A123-1234</a>
 								</th:block>
-								
+								<th:block th:uless="${goodsSafeNo.certFormGb != 'G084_4' and  goodsSafeNo.certFormGb != 'G084_5' }">
+								<span>인증번호:</span> <th:block th:text="${goodsSafeNo.certNum}">CB123A123-1234</th:block>
+								</th:block>
 							</p>
 						</div>
 					</div>
-					<p class="t_info dot_info mt10"  th:if="${goodsSafeNo != null}">
+							</th:block>
+						</th:block>
+					<p class="t_info dot_info mt10">
+						해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.
+					</p>	
+					</th:block>
+					
+					<th:block th:if="${goodsInfo.goodsType == 'G056_S'}">
+					<th:block th:each="goodsCompose, status : ${goodsComposeList}">
+						<th:block th:if="${goodsCompose.goodsSafeNo != null}">
+								<th:block th:if="${goodsCompose.goodsSafeNo.certTargetGb == 'G083_3'}" >  <!-- 상세별도표시 -->
+					<div class="area_kcl no-mark">
+						<div>
+							<p class="tit normal"><th:block th:if="${goodsCompose.goodsSafeNo.certFormNm}" th:text="${goodsCompose.goodsSafeNo.certFormNm + '/'}"></th:block> 제품 상세정보 내 별도 표기</p>
+							<p class="normal">제품 상세정보 내 표기되어 있습니다. 상품 정보를 확인해주세요.</p>
+						</div>
+					</div>	
+						</th:block>
+						<th:block th:unless="${goodsCompose.goodsSafeNo.certTargetGb == 'G083_3'}" > <!-- 인증 -->
+							<th:block th:if="${goodsCompose.goodsSafeNo.certType == 'G081_3'}" > <!-- 공급자적합성 -->
+					<div class="area_kcl">
+						<div><i class="ico ico_kcl"></i></div>
+						<div>
+							<p class="tit normal"><th:block th:text="${goodsCompose.goodsSafeNo.certFormNm}"></th:block> / 공급자적합성확인</p>
+							<p class="normal">공급자 적합성 확인 품목으로 국가통합인증을 필함</p>
+						</div>	
+					</div>
+							</th:block>
+							<th:block th:unless="${goodsCompose.goodsSafeNo.certType == 'G081_3'}" > <!-- 공급자적합성 외 -->
+					<div class="area_kcl" >
+						<div><i class="ico ico_kcl"></i></div>
+						<div>
+							<th:block th:if="${goodsCompose.goodsSafeNo.certFormGb != 'G084_4' and  goodsCompose.goodsSafeNo.certFormGb != 'G084_5' }">
+							<p class="tit normal" th:text="${goodsSafeNo.certDiv + ' / ' + goodsSafeNo.certOrganName}">어린이제품 안전인증 / 한국건설생활시험연구원(KCL)</p>
+							</th:block>
+							<th:block th:unless="${goodsCompose.goodsSafeNo.certFormGb != 'G084_4' and  goodsCompose.goodsSafeNo.certFormGb != 'G084_5' }">
+							<p class="tit normal" th:text="${goodsCompose.goodsSafeNo.certFormNm + ' 안전인증'}"></p>
+							</th:block>
+							<p class="normal" >
+								<th:block th:if="${goodsCompose.goodsSafeNo.certFormGb != 'G084_4' and  goodsCompose.goodsSafeNo.certFormGb != 'G084_5' }">
+								<span>인증번호:</span> <a class="num" th:href="@{http://www.safetykorea.kr/search/searchPop(certNum=${goodsCompose.goodsSafeNo.certNum})}" target="_blank" th:text="${goodsSafeNo.certNum}">CB123A123-1234</a>
+								</th:block>
+								<th:block th:uless="${goodsCompose.goodsSafeNo.certFormGb != 'G084_4' and  goodsCompose.goodsSafeNo.certFormGb != 'G084_5' }">
+								<span>인증번호:</span> <th:block th:text="${goodsCompose.goodsSafeNo.certNum}">CB123A123-1234</th:block>
+								</th:block>
+							</p>
+						</div>
+					</div>
+							</th:block>
+						</th:block>
+					<p class="t_info dot_info mt10" >
 						해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.
 					</p>
+						</th:block>
+					</th:block>
+					</th:block>
+					
 					<div class="area_infotbl">
 						<span class="title">상품기본정보</span>
 						<th:block th:if="${goodsInfo.goodsType == 'G056_N'} ">
@@ -500,7 +578,7 @@
 				</div>
 				<!-- //상품필수정보 노출 -->
 			</div>
-			<div class="btn_more_box covered">
+			<div class="btn_more_box">
 				<div class="btn_group_flex">
 					<div>
 						<button type="button" class="btn btn_default">

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

@@ -102,7 +102,7 @@
 			}
 			tag += '						</span>\n';
 			tag += '					</div>\n';
-			tag += '					<div class="lap2"><span>' + item.questContent + '</span></div>\n';
+			tag += '					<div class="lap2"><span>' + item.questContent.escapeHtml() + '</span></div>\n';
 			tag += '					<span class="id">'+ item.maskingCustId+'</span><span class="data">' + item.questDt + '</span>\n';
 			tag += '				</div>\n';
 			tag += '			</div>\n';
@@ -111,7 +111,7 @@
 			tag += '	<div class="fold_cont">\n';
 			tag += '		<div class="fold_detail">\n'; //문의 내용
 			tag += '			<div>\n';
-			tag += '				<p>' + item.questContent.replaceAll("\n", "</br>") + '</p>\n';
+			tag += '				<p>' + item.questContent.replaceAll("\n", "</br>").escapeHtml() + '</p>\n';
 			tag += '			</div>\n';
 			tag += '		</div>\n';
 			

+ 7 - 1
src/main/webapp/WEB-INF/views/mob/mypage/MypageCancelFormMob.html

@@ -187,7 +187,7 @@
 						</table>
 					</div>
 				</div>
-				<div class="required_group">
+				<div class="required_group" id="addDeliveryFee" style="display:none">
 					<p>배송비 <span class="c_primary" id="addPayCost">0원</span> 추가 결제가 필요합니다.</p>
 				</div>
 				<div class="btn_group btn_group_flex">
@@ -544,6 +544,12 @@ $('#btn_bank_return').click(function() {
 		mcxDialog.alert('계좌인증이 필요합니다.');
 	}
 });
+
+//팝업_닫기
+$('.popup_close').on("click",function(){
+	$('.popup_box').hide().removeClass('active');
+	$("body").css({"overflow":"visible"});
+});
 </script>
 
 <script>

+ 0 - 5
src/main/webapp/WEB-INF/views/mob/mypage/MypageCreExchangeDetailFormMob.html

@@ -314,11 +314,6 @@
 			}
 		});
 	}
-
-	var fnGoToWithdrawDelivery = function(param) {
-		// TODO
-		// 회수조회 페이지 이동
-	}
 /*]]>*/
 </script>
 

+ 507 - 0
src/main/webapp/WEB-INF/views/mob/mypage/MypageDeliveryInfoFormMob.html

@@ -0,0 +1,507 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorator="mob/common/layout/MypageLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : MypageDeliveryInfoFormMob.html
+ * @desc    : 마이페이지 > 배송조회 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.05.11   card007     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+<main role="" id="mypageDeliveryInfoForm" class="container my">
+	<section class="content my_order">
+		<div class="inner wide bg_beige">
+			<div class="order_number">
+				<dl class="clear">
+					<dt>주문번호</dt>
+					<dd  th:text="${ordNo}"></dd>
+				</dl>
+				<a href="javascript:void(0);" class="delete" onclick="fnDeleteOrder()">주문 내역 삭제</a>
+			</div>
+		</div>
+		<div class="inner">
+			<th:block th:if="${orderList}" th:each="order, status : ${orderList}">
+				<div class="part_goods">
+					<div class="goods_top">
+						<th:block th:unless="${order.giftPackYn == 'Y'}">
+							<div class="goods_date">주문일<span class="date" th:text="${order.ordDt}"></span></div>
+						</th:block>
+						<th:block th:if="${order.giftPackYn == 'Y'}">
+							<div class="goods_date">선물일<span class="date" th:text="${order.ordDt}"></span></div>
+						</th:block>
+					</div>
+					
+					<th:block th:if="${order.ordDtlList}" th:each="ordDtl, status : ${order.ordDtlList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
+						<div class="goods_section">
+							<div class="goods_status">
+								<!-- 선물주문 -->
+								<th:block th:if="${order.giftPackYn == 'Y'}">
+									<p class="dlvr_staus" th:if="${#strings.isEmpty(ordDtl.recipBaseAddr) and ordDtl.giftLimitDay >= 0}">주소 입력 대기중</p>
+									<p class="dlvr_staus" th:if="${!#strings.isEmpty(ordDtl.recipBaseAddr) and ordDtl.ordDtlStat != 'G013_98' and ordDtl.ordDtlStat != 'G013_99'}">선물 완료</p>
+									<p class="dlvr_staus" th:if="${ordDtl.ordDtlStat == 'G013_98' or ordDtl.ordDtlStat == 'G013_99'}">선물 취소</p>
+								</th:block>
+								<!-- //선물주문 -->
+								<!-- 일반주문 -->
+								<th:block th:unless="${order.giftPackYn == 'Y'}">
+									<p class="dlvr_staus" th:if="${ordDtl.ordDtlStat == 'G013_10'}">주문접수</p>
+									<p class="dlvr_staus" th:unless="${ordDtl.ordDtlStat == 'G013_10'}" th:text="${ordDtl.ordDtlStatNm}"></p>
+								</th:block>
+								<!-- //일반주문 -->
+							</div>
+							<div class="goods_detail">
+								<input type="hidden" name="ordDtlNoArr" th:value="${ordDtl.ordDtlNo}"/>
+								<input type="hidden" name="cnclRtnReqQtyArr" th:value="${ordDtl.ordQty - ordDtl.cnclRtnQty}"/>
+														
+								<a href="javascript:void(0);" onclick="fnGoToGoodsDetail(this)">
+									<div class="thumb_box">
+										<img th:src="${imageUrl + '/' + ordDtl.sysImgNm}" width="100%" alt="">
+									</div>
+									<div class="info_box">
+										<div class="od_name">
+											<div class="brand">
+												<span th:text="${ordDtl.brandNm}"></span>
+												<div class="badge_wrap">
+													<em class="order_badge order_bullet_badge" th:if="${ordDtl.shotDelvYn == 'Y'}">총알배송</em>
+													<em class="order_badge" th:if="${ordDtl.shotDelvYn == 'N' and ordDtl.selfGoodsYn == 'Y'}">STYLE24 일반배송</em>
+													<em class="order_badge" th:if="${ordDtl.selfGoodsYn == 'N'}">업체직배송</em>
+												</div>
+											</div>
+											<div class="name" th:text="${ordDtl.goodsNm}"></div>
+										</div>
+										<div class="od_opt">
+											<div class="option">
+												<!-- 세트상품 -->
+												<th:block th:if="${ordDtl.goodsType == 'G056_S'}">
+													<th:block th:each="option, status : ${ordDtl.colorNmArr}">
+														<em th:text="${option}"></em>
+														<em th:text="${ordDtl.optCd2Arr[status.index]}"></em>
+													</th:block>
+												</th:block>
+												<!-- //세트상품 -->
+												<!-- 일반상품 -->
+												<th:block th:unless="${ordDtl.goodsType == 'G056_S'}">
+													<th:block th:each="option, status : ${ordDtl.colorNmArr}">
+														<em th:text="${ordDtl.colorNm}"></em>
+														<em th:text="${ordDtl.optCd2}"></em>
+													</th:block>
+												</th:block>
+												<!-- //일반상품 -->
+											</div>
+										</div>
+										<div class="od_calc">
+											<p class="point"><span th:text="${#numbers.formatInteger(ordDtl.savePntAmt, 1, 'COMMA')}"></span>P 적립예정</p>
+											<p class="sale_price" th:if="${(ordDtl.ordAmt - ordDtl.cnclRtnAmt) > (ordDtl.realOrdAmt + ordDtl.pntDcAmt + ordDtl.gfcdUseAmt)}">
+												<del>
+													<em th:text="${#numbers.formatInteger(ordDtl.ordAmt - ordDtl.cnclRtnAmt, 1, 'COMMA')}"></em>원
+												</del>
+											</p>
+											<p class="price">
+												<span class="selling_price">
+													<em th:text="${#numbers.formatInteger(ordDtl.realOrdAmt + ordDtl.pntDcAmt + ordDtl.gfcdUseAmt, 1, 'COMMA')}"></em>원
+												</span>
+												<span class="count">
+													<em th:text="${ordDtl.ordQty - ordDtl.cnclRtnQty}"></em>개
+												</span>
+											</p>
+										</div>
+									</div>
+								</a>
+							</div>
+							
+							<!-- 주문상태별 버튼기능 정의 -->
+							<!-- 일반주문 -->
+							<th:block th:unless="${ordDtl.giftPackYn} == 'Y'">
+								<!-- 입금대기 (1:1문의, 쇼핑백 담기) -->
+								<th:block th:if="${ordDtl.ordDtlStat == 'G013_10'}">
+									<div class="goods_btn_wrap btn_group_flex">
+										<div><button type="button" class="btn btn_default btn_cncl_complete" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA_REG);"><span>1:1 문의</span></button></div>
+										<div><button type="button" class="btn btn_primary btn_cart_save" th:ordNo="${ordDtl.ordNo}" th:ordDtlNo="${ordDtl.ordDtlNo}" onclick="fnCreateCart(this);"><span>쇼핑백 담기</span></button></div>
+									</div>
+								</th:block>
+								<!-- //입금대기 (1:1문의, 쇼핑백 담기) -->
+
+								<!-- 결제완료, 상품준비중, 출고처지정 (주문취소) -->
+								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_20' or ${ordDtl.ordDtlStat} == 'G013_30' or ${ordDtl.ordDtlStat} == 'G013_35'">
+									<div class="goods_btn_wrap btn_group_flex">
+										<div><button type="button" class="btn btn_default btn_cncl_complete" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, delvFeeCd=${ordDtl.delvFeeCd}, ordCanChgQty=${ordDtl.ordCanChgQty}" onclick="fnCreateChange(this, 'cancel');"><span>주문 취소</span></button></div>
+									</div>
+								</th:block>
+								<!-- //결제완료, 상품준비중, 출고처지정 (주문취소) -->
+								
+								<!-- 배송준비중-->
+								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_40'">
+								</th:block>
+								<!-- //배송준비중-->
+								
+								<!-- 배송중 (교환가능, 반품가능) -->
+								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_50' or ${ordDtl.ordDtlStat} == 'G013_55'">
+									<!-- 교환가능, 반품가능 -->
+									<th:block th:if="${ordDtl.changeableYn} == 'Y' or ${ordDtl.returnableYn} == 'Y'">
+										<div class="goods_btn_wrap btn_group_flex">
+											<th:block th:if="${ordDtl.changeableYn} == 'Y'">
+												<div><button type="button" class="btn btn_default btn_exch_req" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, delvFeeCd=${ordDtl.delvFeeCd}" onclick="fnCreateChange(this, 'exchange');"><span>교환 신청</span></button></div>
+											</th:block>
+											<th:block th:if="${ordDtl.returnableYn} == 'Y'">
+												<div><button type="button" class="btn btn_default btn_rtn_req" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, delvFeeCd=${ordDtl.delvFeeCd}" onclick="fnCreateChange(this, 'return');"><span>반품 신청</span></button></div>
+											</th:block>
+										</div>
+									</th:block>
+									<!-- //교환가능, 반품가능 -->
+									
+									<!-- 리뷰사용가능, 리뷰등록전일때 -->
+									<div class="goods_btn_wrap btn_group_flex">
+										<div><button type="button" class="btn btn_default btn_delv_sch"><span>배송 조회</span></button></div>
+										<!-- 리뷰사용가능, 리뷰등록전일때 -->
+										<th:block th:if="${ordDtl.reviewableYn} == 'Y' and ${ordDtl.reviewSq} == null">
+											<div><button type="button" class="btn btn_primary btn_review_write" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, goodsCd=${ordDtl.goodsCd}" onclick="fnCreateReview(this);"><span>리뷰 쓰기</span></button></div>
+										</th:block>
+										<!-- //리뷰사용가능, 리뷰등록전일때 -->
+									</div>
+									<!-- //리뷰사용가능, 리뷰등록전일때 -->
+								</th:block>
+								<!-- //배송중 (교환가능, 반품가능) -->
+								
+								<!-- 배송완료 (교환가능, 반품가능) -->
+								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_60'">
+									<div class="goods_btn_wrap btn_group_flex">
+										<!-- 교환가능, 반품가능 -->
+										<th:block th:if="${ordDtl.changeableYn} == 'Y'">
+											<div><button type="button" class="btn btn_default btn_exch_req" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, delvFeeCd=${ordDtl.delvFeeCd}" onclick="fnCreateChange(this, 'exchange');"><span>교환 신청</span></button></div>
+										</th:block>
+										<th:block th:if="${ordDtl.returnableYn} == 'Y'">
+											<div><button type="button" class="btn btn_default btn_rtn_req" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, delvFeeCd=${ordDtl.delvFeeCd}" onclick="fnCreateChange(this, 'return');"><span>반품 신청</span></button></div>
+										</th:block>
+										<!-- //교환가능, 반품가능 -->
+										
+										<div><button type="button" id="btn_purchase_confirm btn_ord_confirm" class="btn btn_primary" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}" onclick="fnDecideOrder(this);"><span>구매 확정</span></button></div>
+									</div>
+									<div class="goods_btn_wrap btn_group_flex">
+										<!-- 교환불가, 반품불가 -->
+										<th:block th:if="${ordDtl.changeableYn} == 'N' or ${ordDtl.returnableYn} == 'N'">
+											<div><button type="button" class="btn btn_default btn_qna_write" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA_REG);"><span>1:1 문의</span></button></div>
+										</th:block>
+										<!-- //교환불가, 반품불가 -->
+										
+										<!-- 리뷰사용가능, 리뷰등록전일때 -->
+										<th:block th:if="${ordDtl.reviewableYn} == 'Y' and ${ordDtl.reviewSq} == null">
+											<div><button type="button" class="btn btn_primary btn_review_write" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, goodsCd=${ordDtl.goodsCd}" onclick="fnCreateReview(this);"><span>리뷰 쓰기</span></button></div>
+										</th:block>
+										<!-- //리뷰사용가능, 리뷰등록전일때 -->
+									</div>
+								</th:block>
+								<!-- //배송완료 (교환가능, 반품가능) -->
+								
+								<!-- 구매확정 -->
+								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_70'">
+									<div class="goods_btn_wrap btn_group_flex">
+										<!-- 리뷰사용불가능, 리뷰등록후일때 -->
+										<th:block th:unless="${ordDtl.reviewableYn} == 'Y' and ${ordDtl.reviewSq} == null">
+											<div><button type="button" class="btn btn_default btn_qna_write" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA_REG);"><span>1:1 문의</span></button></div>
+										</th:block>
+										<!-- //리뷰사용불가능, 리뷰등록후일때 -->
+
+										<div><button type="button" class="btn btn_primary btn_cart_save" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}" onclick="fnCreateCart(this);"><span>쇼핑백 담기</span></button></div>
+
+										<!-- 리뷰사용가능, 리뷰등록전일때 -->
+										<th:block th:if="${ordDtl.reviewableYn} == 'Y' and ${ordDtl.reviewSq} == null">
+											<div><button type="button" class="btn btn_primary btn_review_write" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, goodsCd=${ordDtl.goodsCd}" onclick="fnCreateReview(this);"><span>리뷰 쓰기</span></button></div>
+										</th:block>
+										<!-- //리뷰사용가능, 리뷰등록전일때 -->
+									</div>
+								</th:block>
+								<!-- //구매확정 -->
+							</th:block>
+							<!-- //일반주문 -->
+							<!-- 선물주문 -->
+							<th:block th:if="${ordDtl.giftPackYn} == 'Y'">
+								<!-- 배송지등록전 -->
+								<th:block th:if="${ordDtl.recipBaseAddr == ''} and ${ordDtl.giftLimitDay} >= 0">
+									<div><button type="button" class="btn btn_primary btn_sms_send" th:attr="ordNo=${ordDtl.ordNo}" onclick="fnReSendSms(this);"><span>SMS 재발송</span></button></div>
+								</th:block>
+								<!-- //배송지등록전 -->
+								
+								<!-- 배송지등록후 (입금대기, 결제완료, 상품준비중, 출고처지정, 배송준비중) -->
+								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_10' or ${ordDtl.ordDtlStat} == 'G013_20' or ${ordDtl.ordDtlStat} == 'G013_30' or ${ordDtl.ordDtlStat} == 'G013_35'">
+									<div><button type="button" class="btn btn_default btn_cncl_complete" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, delvFeeCd=${ordDtl.delvFeeCd}" onclick="fnCreateChange(this, 'cancel');"><span>주문 취소</span></button></div>
+								</th:block>
+								<!-- //배송지등록후 (입금대기, 결제완료, 상품준비중, 출고처지정, 배송준비중) -->
+								
+								<!-- 배송지등록완료, 결제전취소, 결제후취소 아닐경우 -->
+								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_50' or ${ordDtl.ordDtlStat} == 'G013_55' or ${ordDtl.ordDtlStat} == 'G013_60' or ${ordDtl.ordDtlStat} == 'G013_70'">
+									<th:block th:if="${ordDtl.recipBaseAddr != ''} and ${ordDtl.ordDtlStat} != 'G013_98' and ${ordDtl.ordDtlStat} != 'G013_99'">
+										<div><button type="button" class="btn btn_primary btn_cart_save" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}" onclick="fnCreateCart(this);"><span>쇼핑백 담기</span></button></div>
+										<!-- 리뷰사용가능, 리뷰등록전일때 -->
+										<th:block th:if="${ordDtl.reviewableYn} == 'Y' and ${ordDtl.reviewSq} == null and ${ordDtl.ordDtlStat} == 'G013_70'">
+											<div><button type="button" class="btn btn_primary btn_review_write" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, goodsCd=${ordDtl.goodsCd}" onclick="fnCreateReview(this);"><span>리뷰 쓰기</span></button></div>
+										</th:block>
+										<!-- //리뷰사용가능, 리뷰등록전일때 -->
+									</th:block>
+								</th:block>
+								<!-- //배송지등록완료, 결제전취소, 결제후취소 아닐경우 -->
+							</th:block>
+							<!-- //선물주문 -->
+							<!-- //주문상태별 버튼기능 정의 -->
+							
+							<!-- 주문상태별 문구정보 정의 -->
+							<th:block th:unless="${ordDtl.giftPackYn} == 'Y'">
+								<div class="goods_alert">
+									<!-- 배송중, 배송완료 상태 교환, 반품 가능 상태 체크 -->
+									<th:block th:if="${ordDtl.ordDtlStat} == 'G013_50' or ${ordDtl.ordDtlStat} == 'G013_55' or ${ordDtl.ordDtlStat} == 'G013_60'">
+										<!-- 교환불가능, 반품불가능 -->
+										<th:block th:if="${ordDtl.changeableYn} == 'N' and ${ordDtl.returnableYn} == 'N'">
+											<p class="cf_txt cf_desc">해당 상품은 교환/반품이 불가능한 상품입니다.<br>문의사항은 1:1 문의를 이용해 주세요.</p>
+										</th:block>
+										<!-- //교환불가능, 반품불가능 -->
+										
+										<!-- 교환불가능 -->
+										<th:block th:if="${ordDtl.changeableYn} == 'N'">
+											<p class="cf_txt cf_desc">해당 상품은 교환이 불가능한 상품입니다.<br>문의사항은 1:1 문의를 이용해 주세요.</p>
+										</th:block>
+										<!-- //교환불가능 -->
+										
+										<!-- 반품불가능 -->
+										<th:block th:if="${ordDtl.returnableYn} == 'N'">
+											<p class="cf_txt cf_desc">해당 상품은 교환이 불가능한 상품입니다.<br>문의사항은 1:1 문의를 이용해 주세요.</p>
+										</th:block>
+										<!-- //반품불가능 -->
+										
+									</th:block>
+									<!-- //배송중, 배송완료 상태 -->
+								</div>
+								
+								<!-- 주문접수 -->
+								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_10'">
+									<div class="goods_txt">
+										<p class="cf_txt cf_desc">주문 완료 / 결제를 기다리고 있습니다.</p>
+										<th:block th:if="${ordDtl.delvResDt} != null">
+											<p class="cf_txt cf_desc" th:text="|예약판매 상품으로 ${ordDtl.delvResDt} 출고 예정입니다.|"></p>
+										</th:block>
+									</div>
+								</th:block>
+								<!-- //주문접수 -->
+								
+								<!-- 결제완료, 예약배송상품 -->
+								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_10'">
+									<th:block th:if="${ordDtl.delvResDt} != null">
+										<div class="goods_txt">
+											<p class="cf_txt cf_desc" th:text="|예약판매 상품으로 ${ordDtl.delvResDt} 출고 예정입니다.|"></p>
+										</div>
+									</th:block>
+								</th:block>
+								<!-- //결제완료, 예약배송상품 -->
+								
+								<!-- 상품준비중 -->
+								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_30'">
+									<div class="goods_txt">
+										<p class="cf_txt cf_desc">배송할 상품을 준비 중입니다.</p>
+										<th:block th:if="${ordDtl.delvResDt} != null">
+											<p class="cf_txt cf_desc" th:text="|예약판매 상품으로 ${ordDtl.delvResDt} 출고 예정입니다.|"></p>
+										</th:block>
+									</div>
+								</th:block>
+								<!-- //상품준비중 -->
+								
+								<!-- 배송준비중 -->
+								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_40'">
+									<div class="goods_txt">
+										<p class="cf_txt cf_desc">상품 준비가 완료되어 곧 배송될 예정입니다.</p>
+										<th:block th:if="${ordDtl.delvResDt} != null">
+											<p class="cf_txt cf_desc" th:text="|예약판매 상품으로 ${ordDtl.delvResDt} 출고 예정입니다.|"></p>
+										</th:block>
+									</div>
+								</th:block>
+								<!-- //배송준비중 -->
+								
+								<!-- 배송완료 -->
+								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_60'">
+									<div class="goods_txt">
+										<p class="cf_txt cf_desc">15일 후 자동으로 구매확정됩니다.</p>
+									</div>
+								</th:block>
+								<!-- //배송완료 -->
+								
+								<!-- 구매확정 -->
+								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_70'">
+									<!-- 리뷰사용가능, 리뷰등록전일때 -->
+									<th:block th:if="${ordDtl.reviewableYn} == 'Y' and ${ordDtl.reviewSq} == null">
+										<div class="goods_txt">
+											<p class="cf_txt cf_desc">리뷰를 작성하면 다른 구매자에게 도움이 될 수 있습니다</p>
+										</div>
+									</th:block>
+									<!-- //리뷰사용가능, 리뷰등록전일때 -->
+								</th:block>
+								<!-- //구매확정 -->
+							</th:block>
+							
+							<!-- 선물배송일때 -->
+							<th:block th:if="${ordDtl.giftPackYn} == 'Y'">
+								<div class="goods_txt">
+									<!-- 배송지등록전 -->
+									<th:block th:if="${ordDtl.recipBaseAddr == ''} and ${ordDtl.giftLimitDay} >= 0">
+										<p class="cf_txt cf_desc"><span th:text="|‘${ordDtl.recipNm}’|"></span>님 주소를 입력하기 전입니다.</p>
+										<p class="period">입력기한 <span th:text="${ordDtl.giftLimitDt}"></span></p>
+									</th:block>
+									<!-- //배송지등록전 -->
+									
+									<!-- 배송지등록완료, 결제전취소, 결제후취소 아닐경우 -->
+									<th:block th:if="${ordDtl.ordDtlStat} == 'G013_50' or ${ordDtl.ordDtlStat} == 'G013_55' or ${ordDtl.ordDtlStat} == 'G013_60' or ${ordDtl.ordDtlStat} == 'G013_70'">
+										<th:block th:if="${ordDtl.recipBaseAddr != ''} and ${ordDtl.ordDtlStat} != 'G013_98' and ${ordDtl.ordDtlStat} != 'G013_99'">
+											<p class="cf_txt cf_desc"><span th:text="|‘${ordDtl.recipNm}’|"></span>님께 선물이 발송되었습니다.</p>
+										</th:block>
+									</th:block>
+									<!-- //배송지등록완료, 결제전취소, 결제후취소 아닐경우 -->
+									
+									<!-- 선물 취소 -->
+									<th:block th:if="${ordDtl.ordDtlStat} == 'G013_98' and ${ordDtl.ordDtlStat} == 'G013_99'">
+										<p class="cf_txt cf_desc">주소 입력 기한이 경과되어 선물이 취소 되었습니다.</p>
+									</th:block>
+									<!-- //선물 취소 -->
+								</div>
+							</th:block>
+							<!-- //선물배송일때 -->
+							<!-- //주문상태별 문구정보 정의 -->
+							
+							<!-- 사은품 영역 -->
+							<th:block th:if="${#lists.size(order.ordDtlList) == status.count}">
+								<th:block th:if="${order.freeGiftList != null and #lists.size(order.freeGiftList) > 0}">
+									<div class="goods_gift">
+										<div class="gift_wrap">
+											<div class="title">사은품</div>
+											<div class="li_gift">
+												<ul>
+													<th:block th:each="freeGift , j : ${order.freeGiftList}">
+														<li>
+															<span class="gift_name" th:text="${freeGift.goodsNm}"></span> 
+															<th:block th:if="${freeGift.usePoint} > 0">
+																<span class="deduct_p" th:text="|(-${#numbers.formatInteger(freeGift.usePoint, 1, 'COMMA')}P)|"></span>
+															</th:block>
+														</li>
+													</th:block>
+												</ul>
+											</div>
+										</div>
+									</div>
+								</th:block>
+							</th:block>
+							<!-- //사은품 영역 -->
+						</div>
+					</th:block>
+				</div>
+				<input type="hidden" name="accountNo" 	th:value="${order.oneData.accountNo}"/>
+				<input type="hidden" name="accountNm" 	th:value="${order.oneData.accountNm}"/>
+				<input type="hidden" name="bankCd" 		th:value="${order.oneData.bankCd}"/>
+				<input type="hidden" name="delvMemo" 	th:value="${deliveryAddrInfo.delvMemo}"/>
+			</th:block>
+		</div>
+		
+		<div class="inner">
+			<div class="tbl_wrap">
+				<div class="tbl_tit">
+					<h3>배송 정보</h3>
+				</div>
+				<div class="tbl type1">
+					<table>
+						<colgroup>
+							<col width="107">
+							<col width="*">
+						</colgroup>
+						<tbody><tr>
+							<th>보내는 사람</th>
+							<td>
+								<div>
+									<span th:text="${deliveryAddrInfo.recipNm}"></span> / <span th:text="${deliveryAddrInfo.recipPhnno}"></span>
+								</div>
+							</td>
+						</tr>
+						<tr>
+							<th>제품정보</th>
+							<td>
+								<div>
+									<span th:utext="|${oneData.brandNm}<br/>${oneData.goodsNm}|"></span>
+								</div>
+							</td>
+						</tr>
+						<tr>
+							<th>송장번호</th>
+							<td>
+								<div>
+									<span th:text="${oneData.invoiceNo}"></span>
+								</div>
+							</td>
+						</tr>
+						<tr>
+							<th>배송주소</th>
+							<td>
+								<div>
+									<span th:utext="|${deliveryAddrInfo.recipBaseAddr}<br/>${deliveryAddrInfo.recipDtlAddr}|"></span>
+								</div>
+							</td>
+						</tr>
+					</tbody></table>
+				</div>
+			</div>
+			<div class="goods_tbl">
+				<div class="tblWrap">
+					<table class="table">
+						<colgroup>
+							<col style="width: 34%;">
+							<col style="width: 33%;">
+							<col style="width: 33%;">
+						</colgroup>
+						<thead>
+							<tr>
+								<th scope="col">시간</th>
+								<th scope="col">장소</th>
+								<th scope="col">유형</th>
+							</tr>
+						</thead>
+						<tbody>
+							<tr th:if="${sweetTrackerInfoList}" th:each="sweetTrackerInfo, status : ${sweetTrackerInfoList}">
+								<td th:utext="|${#strings.substring(sweetTrackerInfo.timeTrans, 0, 10)}<br/>${#strings.substring(sweetTrackerInfo.timeTrans, 11, 19)}|"></td>
+								<td th:text="${sweetTrackerInfo.delvWhere}"></td>
+								<td th:text="${sweetTrackerInfo.details}"></td>
+							</tr>
+						</tbody>
+					</table>
+				</div>
+			</div>
+		</div>
+	</section>
+</main>
+
+<form id="exchangeForm" name="exchangeForm" th:action="@{'/mypage/exchange/form'}" th:method="post">
+	<input type="hidden" name="ordNo"/>
+	<input type="hidden" name="ordDtlNo"/>
+	<input type="hidden" name="delvFeeCd"/>
+</form>
+<form id="returnForm" name="returnForm" th:action="@{'/mypage/return/form'}" th:method="post">
+	<input type="hidden" name="ordNo"/>
+	<input type="hidden" name="ordDtlNo"/>
+	<input type="hidden" name="delvFeeCd"/>
+</form>
+<form id="cancelForm" name="cancelForm" th:action="@{'/mypage/cancel/form'}" th:method="post">
+	<input type="hidden" name="ordNo"/>
+	<input type="hidden" name="ordDtlNo"/>
+	<input type="hidden" name="delvFeeCd"/>
+</form>
+
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+	$(document).ready(function() {
+		// 타이틀명
+		$('#htopTitle').text('배송조회');
+	});
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 49 - 62
src/main/webapp/WEB-INF/views/mob/mypage/MypageOrderDetailFormMob.html

@@ -40,22 +40,26 @@
 						<th:block th:if="${order.allCanYn == 'Y' and order.ordReqChgQty == 0}">
 							<a href="javascript:void(0);" id="btn_all_delete" class="delete_btn" onclick="fnAllCancel();">주문 전체 취소</a> <!-- 210409_추가 : btn_all_delete id 추가 -->
 						</th:block>
+						<th:block th:if="${allDecideYn == 'Y' and order.ordReqChgQty == 0}">
+							<a href="javascript:void(0)" id="btn_all_confirm" class="purchase_btn" th:attr="ordNo=${ordNo}" onclick="fnAllDecideOrder(this);">전체구매확정</a></li>
+						</th:block>
 						<!--<a href="javascript:;" id="btn_all_confirm" class="purchase_btn">전체 구매 확정</a> 전체 구매확정 버튼. --> <!-- 210409_추가 : btn_all_confirm id 추가 -->
 					</div>
 					
 					<th:block th:if="${order.ordDtlList}" th:each="ordDtl, status : ${order.ordDtlList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
 						<div class="goods_section">
 							<div class="goods_status">
-								<!-- 선주문 -->
+								<!-- 선주문 -->
 								<th:block th:if="${order.giftPackYn == 'Y'}">
 									<p class="dlvr_staus" th:if="${#strings.isEmpty(ordDtl.recipBaseAddr) and ordDtl.giftLimitDay >= 0}">주소 입력 대기중</p>
 									<p class="dlvr_staus" th:if="${!#strings.isEmpty(ordDtl.recipBaseAddr) and ordDtl.ordDtlStat != 'G013_98' and ordDtl.ordDtlStat != 'G013_99'}">선물 완료</p>
 									<p class="dlvr_staus" th:if="${ordDtl.ordDtlStat == 'G013_98' or ordDtl.ordDtlStat == 'G013_99'}">선물 취소</p>
 								</th:block>
-								<!-- //선주문 -->
+								<!-- //선주문 -->
 								<!-- 일반주문 -->
 								<th:block th:unless="${order.giftPackYn == 'Y'}">
-									<p class="dlvr_staus" th:text="${ordDtl.ordDtlStatNm}"></p>
+									<p class="dlvr_staus" th:if="${ordDtl.ordDtlStat == 'G013_10'}">주문접수</p>
+									<p class="dlvr_staus" th:unless="${ordDtl.ordDtlStat == 'G013_10'}" th:text="${ordDtl.ordDtlStatNm}"></p>
 								</th:block>
 								<!-- //일반주문 -->
 							</div>
@@ -72,8 +76,7 @@
 											<div class="brand">
 												<span th:text="${ordDtl.brandNm}"></span>
 												<div class="badge_wrap">
-													<span class="brand" th:text="${ordDtl.brandNm}"></span>
-													<em class="order_badge" th:if="${ordDtl.shotDelvYn == 'Y'}">총알배송</em>
+													<em class="order_badge order_bullet_badge" th:if="${ordDtl.shotDelvYn == 'Y'}">총알배송</em>
 													<em class="order_badge" th:if="${ordDtl.shotDelvYn == 'N' and ordDtl.selfGoodsYn == 'Y'}">STYLE24 일반배송</em>
 													<em class="order_badge" th:if="${ordDtl.selfGoodsYn == 'N'}">업체직배송</em>
 												</div>
@@ -102,9 +105,9 @@
 										</div>
 										<div class="od_calc">
 											<p class="point"><span th:text="${#numbers.formatInteger(ordDtl.savePntAmt, 1, 'COMMA')}"></span>P 적립예정</p>
-											<p class="sale_price">
+											<p class="sale_price" th:if="${(ordDtl.ordAmt - ordDtl.cnclRtnAmt) > (ordDtl.realOrdAmt + ordDtl.pntDcAmt + ordDtl.gfcdUseAmt)}">
 												<del>
-													<em th:if="${(ordDtl.ordAmt - ordDtl.cnclRtnAmt) > (ordDtl.realOrdAmt + ordDtl.pntDcAmt + ordDtl.gfcdUseAmt)}"><em th:text="${#numbers.formatInteger(ordDtl.ordAmt - ordDtl.cnclRtnAmt - ordDtl.cpn1DcAmt, 1, 'COMMA')}">95,000</em>원
+													<em th:text="${#numbers.formatInteger(ordDtl.ordAmt - ordDtl.cnclRtnAmt, 1, 'COMMA')}"></em>원
 												</del>
 											</p>
 											<p class="price">
@@ -123,20 +126,22 @@
 							<!-- 주문상태별 버튼기능 정의 -->
 							<!-- 일반주문 -->
 							<th:block th:unless="${ordDtl.giftPackYn} == 'Y'">
-								<!-- 입금대기 1:1문의 버튼(입금대기, 배송준비중, 구매확정) -->
+								<!-- 입금대기 (1:1문의, 쇼핑백 담기) -->
 								<th:block th:if="${ordDtl.ordDtlStat == 'G013_10'}">
 									<div class="goods_btn_wrap btn_group_flex">
-										<div><button type="button" class="btn btn_default" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA_REG);"><span>1:1 문의</span></button></div>
+										<div><button type="button" class="btn btn_default btn_cncl_complete" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA_REG);"><span>1:1 문의</span></button></div>
+										<div><button type="button" class="btn btn_primary btn_cart_save" th:ordNo="${ordDtl.ordNo}" th:ordDtlNo="${ordDtl.ordDtlNo}" onclick="fnCreateCart(this);"><span>쇼핑백 담기</span></button></div>
 									</div>
 								</th:block>
-							
-								<!-- 입금대기, 결제완료, 상품준비중, 출고처지정 : 주문취소 -->
+								<!-- //입금대기 (1:1문의, 쇼핑백 담기) -->
+
+								<!-- 결제완료, 상품준비중, 출고처지정 (주문취소) -->
 								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_20' or ${ordDtl.ordDtlStat} == 'G013_30' or ${ordDtl.ordDtlStat} == 'G013_35'">
 									<div class="goods_btn_wrap btn_group_flex">
-										<div><button type="button" class="btn btn_default btn_cncl_complete" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, delvFeeCd=${ordDtl.delvFeeCd}" onclick="fnCreateChange(this, 'cancel');"><span>주문 취소</span></button></div>
+										<div><button type="button" class="btn btn_default btn_cncl_complete" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, delvFeeCd=${ordDtl.delvFeeCd}, ordCanChgQty=${ordDtl.ordCanChgQty}" onclick="fnCreateChange(this, 'cancel');"><span>주문 취소</span></button></div>
 									</div>
 								</th:block>
-								<!-- //입금대기, 결제완료, 상품준비중, 출고처지정 : 주문취소 -->
+								<!-- //결제완료, 상품준비중, 출고처지정 (주문취소) -->
 								
 								<!-- 배송준비중-->
 								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_40'">
@@ -204,9 +209,14 @@
 								<!-- 구매확정 -->
 								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_70'">
 									<div class="goods_btn_wrap btn_group_flex">
+										<!-- 리뷰사용불가능, 리뷰등록후일때 -->
+										<th:block th:unless="${ordDtl.reviewableYn} == 'Y' and ${ordDtl.reviewSq} == null">
+											<div><button type="button" class="btn btn_default btn_qna_write" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA_REG);"><span>1:1 문의</span></button></div>
+										</th:block>
+										<!-- //리뷰사용불가능, 리뷰등록후일때 -->
+
 										<div><button type="button" class="btn btn_primary btn_cart_save" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}" onclick="fnCreateCart(this);"><span>쇼핑백 담기</span></button></div>
-										<div><button type="button" class="btn btn_default btn_qna_write" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA_REG);"><span>1:1 문의</span></button></div>
-										
+
 										<!-- 리뷰사용가능, 리뷰등록전일때 -->
 										<th:block th:if="${ordDtl.reviewableYn} == 'Y' and ${ordDtl.reviewSq} == null">
 											<div><button type="button" class="btn btn_primary btn_review_write" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, goodsCd=${ordDtl.goodsCd}" onclick="fnCreateReview(this);"><span>리뷰 쓰기</span></button></div>
@@ -422,7 +432,7 @@
 							</tr>
 							<tr>
 								<th>입금기한</th>
-								<td><div><span th:text="${paymentInfo.vaDeadlineYmd}"></span><span th:text="${paymentInfo.vaDeadlineHms}"></span> 까지</div></td>
+								<td><div><span th:text="${paymentInfo.vaDeadlineYmd}"></span>&nbsp;<span th:text="${paymentInfo.vaDeadlineHms}"></span> 까지</div></td>
 							</tr>
 						</table>
 					</div>
@@ -518,43 +528,6 @@
 											<dt><span class="sr-only">휴대폰 번호</span></dt>
 											<dd th:text="${deliveryAddrInfo.recipPhnno}" id="recipPhnno"></dd>
 										</div>
-										<!--  배송메모정보변경가능
-										<th:block th:if="${allCanYn == 'Y'}">
-											<div class="ship_request ship_select">
-												<span>배송요청 사항</span>
-												<div class="ship_option">
-													<div class="form_field">
-														<div class="select_custom delivery_list">
-															<div class="combo">
-																<div class="select" th:text="${deliveryAddrInfo.delvMemo}">선택</div>
-																<ul class="list">
-																	<li>문 앞</li> 
-																	<li>직접 받고 부재 시 문 앞</li>
-																	<li>경비실</li> 
-																	<li>택배함</li>
-																	<li class="select_etc">기타사항</li>
-																</ul>
-															</div>
-														</div>
-													</div>
-												</div>
-											</div>
-											<div class="ship_etc">
-												<div class="form_text etc">
-													<input type="text" name="delvMemoText" placeholder="보관 장소만 입력 (필수)" maxlength="30" disabled>
-													<p class="desc_txt">보관 장소 외 다른 내용 입력시 통보 없이 삭제 될 수 있습니다.</p>
-												</div>
-											</div>
-										</th:block>
-										<!--  //배송메모정보변경가능 -->
-										<!--  배송메모정보변경불가 
-										<th:block th:unless="${allCanYn == 'Y'}">
-											<div class="ship_request">
-												<dt>배송요청 사항</dt>
-												<dd th:text="${deliveryAddrInfo.delvMemo}"></dd>
-											</div>
-										</th:block>
-										<!--  //배송메모정보변경불가 -->
 										<div class="ship_request">
 											<dt>배송요청 사항</dt>
 											<dd th:text="${deliveryAddrInfo.delvMemo}" id="delvMemo"></dd>
@@ -592,7 +565,8 @@
 			<div class="tbl_wrap pay_wrap">
 				<div class="tbl_tit"> 
 					<h3>결제 정보</h3>
-					<strong class="pay"><span th:text="${#numbers.formatInteger(orderAmtInfo.ordAmt - orderAmtInfo.cnclRtnAmt + orderAmtInfo.realDelvAmt, 1, 'COMMA')}"></span>원</strong>
+<!--					<strong class="pay"><span th:text="${#numbers.formatInteger(orderAmtInfo.ordAmt - orderAmtInfo.cnclRtnAmt + orderAmtInfo.realDelvAmt, 1, 'COMMA')}"></span>원</strong>-->
+					<strong class="pay"><span th:text="${#numbers.formatInteger(orderAmtInfo.payAmt - orderAmtInfo.npayPntAmt - orderAmtInfo.pgCpnAmt, 1, 'COMMA')}"></span>원</strong>
 				</div>
 				<div class="tbl type1">
 					<table>
@@ -605,7 +579,7 @@
 								<dl>
 									<div>
 										<dt>총주문금액(상품금액+배송비)</dt>
-										<dd><div><span th:text="${#numbers.formatInteger(orderAmtInfo.ordAmt - orderAmtInfo.cnclRtnAmt + orderAmtInfo.realDelvAmt, 1, 'COMMA')}"></span>원</div></dd>
+										<dd><div><span th:text="${#numbers.formatInteger((orderAmtInfo.ordAmt + orderAmtInfo.cpn1DcAmt) - orderAmtInfo.cnclRtnAmt + orderAmtInfo.realDelvAmt, 1, 'COMMA')}"></span>원</div></dd>
 									</div>
 									<th:block th:if="${orderAmtInfo.cpn1DcAmt} > 0">
 										<div>
@@ -681,6 +655,7 @@
 					</table>
 					<button type="button" class="btn btn_default btn_sm" th:if="${paymentInfo.pgGb == 'KCP' and paymentInfo.payMeans == 'G014_30'}" onclick="fnReceipt('card')"><span>신용카드 전표</span></button>
 					<button type="button" class="btn btn_default btn_sm" th:if="${paymentInfo.pgGb == 'KCP' and not #strings.isEmpty(paymentInfo.cashAuthNo) and (paymentInfo.payMeans == 'G014_10' or paymentInfo.payMeans == 'G014_20')}" onclick="fnReceipt('cash')"><span>현금 영수증</span></button>
+					<button type="button" class="btn btn_default btn_sm" th:if="${orderAmtInfo.gfcdUseAmt > 0 and (cashReceiptsInfo == null or #strings.isEmpty(cashReceiptsInfo.authNo))}" th:attr="ordNo=${ordNo}" onclick="fnRequestCashReceipt(this);"><span>상품권 현금 영수증 신청</span></button>
 					<!-- 
 					<button type="button" class="btn btn_default btn_sm" th:if="${orderAmtInfo.gfcdUseAmt > 0 and #strings.isEmpty(paymentInfo.cashAuthNo)}" th:attr="ordNo=${ordNo}" onclick="fnRequestCashReceipt(this);"><span>상품권 현금 영수증 신청</span></button>
 					 -->
@@ -690,7 +665,7 @@
 			</div>
 			<div class="btn_group btn_group_flex">
 				<div>
-					<button type="button" class="btn btn_dark"><span>확인</span></button>
+					<button type="button" class="btn btn_dark" onclick="cfnGoToPage(_PAGE_MYPAGE_ORDER_LIST);"><span>확인</span></button>
 				</div>
 			</div>
 		</div>
@@ -728,11 +703,8 @@
 	//let delvMemo			= [[${deliveryAddrInfo.delvMemo}]];
 
 	$(document).ready(function() {
-		// 마이페이지 LNB 설정
-		//fnSetMypageLnbList(1);
-		
-		// 마이페이지 location 설정
-		//fnSetMypageLocation('주문확인/배송조회', '_PAGE_MYPAGE_ORDER_LIST', '주문상세');
+		// 타이틀명
+		$('#htopTitle').text('주문확인/배송조회');
 		
 		// 선물메시지
 		if ($("#giftMsg").html() != null) {
@@ -933,9 +905,24 @@
 		$('#orderDetailForm input[name=accountNm]').val(result.accountNm);
 		$('#orderDetailForm input[name=bankCd]').val(result.bankCd);
 		
-		// 반품처리
+		// 전체취소 처리
 		fnAllCancel();
 	}
+
+	// 상품권 현금영수증 신청 처리
+	var fnRequestCashReceipt = function(param) {
+		let url = '/mypage/cash/receipts/request';
+		let ordNo = $(param).attr('ordNo');
+
+		let data = {};
+		data.ordNo = ordNo;
+
+		let jsonData = JSON.stringify(data);
+
+		gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+			cfnGoToPage(_PAGE_MYPAGE_ORDER_DETAIL + ordNo);
+		});
+	}
 </script>
 
 </th:block>

+ 13 - 2
src/main/webapp/WEB-INF/views/mob/mypage/MypageOrderListFormMob.html

@@ -214,7 +214,7 @@ $(document).ready(function() {
 	
 	// 인피니티스크롤 초기화
 	//fnGoodsReviewInfiniteScrollInit();
-	
+
 	// AJAX 로드를 위한 변수 설정
 	jsonObj = {
 		"pageNo" 			: 0
@@ -231,12 +231,18 @@ $(document).ready(function() {
 	
 	// 마이페이지 메인화면일때 초기 1개월 조회
 	if (mypageMainYn == 'Y') {
+		// 타이틀명
+		$('#htopTitle').text('마이페이지');
+
 		jsonObj.pageSize = 1;
 		jsonObj.pageUnit = 1;
 		fnSetSearchPeriod(1);
 	}
 	// 마이페이지 주문목록화면일때
 	else {
+		// 타이틀명
+		$('#htopTitle').text('주문확인/배송조회');
+
 		// 전체페이지 구하기
 		totalPage 	= parseInt(totalCnt / 10);
 		remainList 	= totalCnt % 10; 
@@ -313,7 +319,7 @@ var fnGetInfiniteScrollDataList = function(pageNo) {
 			if (result != null) {
 				$("#listBox").css("display", "block");
 				$("#listBox").append(result);
-				
+				console.log(result);
 				scrollTemp = true;
 				
 				// 인피니티 스크롤 기억기능
@@ -465,6 +471,11 @@ $(function() { gagaInfiniteScroll.getHistory(); });
 			$('#expiredSoonCouponCnt').text(result.expiredSoonCouponCnt);
 		});
 	}
+
+	// 등급혜택 보기 클릭 이벤트
+	var fnGoToCustomerBenefit = function() {
+		cfnGoToPage(_PAGE_CUSTOMER_GRADE_BENEFIT);
+	}
 </script>
 </th:block>
 </body>

+ 21 - 8
src/main/webapp/WEB-INF/views/mob/mypage/MypageOrderListInfoMob.html

@@ -46,7 +46,8 @@
 							
 							<!-- 일반배송일때 -->
 							<th:block th:if="${ordDtl.giftPackYn} == 'N'">
-								<p class="dlvr_staus" th:text="${ordDtl.ordDtlStatNm}"></p>
+								<p class="dlvr_staus" th:if="${ordDtl.ordDtlStat == 'G013_10'}">주문접수</p>
+								<p class="dlvr_staus" th:unless="${ordDtl.ordDtlStat == 'G013_10'}" th:text="${ordDtl.ordDtlStatNm}"></p>
 							</th:block>
 							<!-- //일반배송일때 -->
 						</div>
@@ -63,7 +64,7 @@
 												<th:block th:if="${ordDtl.shotDelvYn} == 'Y'">
 													<em class="order_badge order_bullet_badge">총알배송</em>
 												</th:block>
-												<th:block th:if="${ordDtl.selfGoodsYn} == 'Y'">
+												<th:block th:if="${ordDtl.shotDelvYn == 'N' and ordDtl.selfGoodsYn == 'Y'}">
 													<em class="order_badge">STYLE24 일반배송</em>
 												</th:block>
 												<th:block th:if="${ordDtl.shotDelvYn} != 'Y' and ${ordDtl.selfGoodsYn} != 'Y'">
@@ -104,11 +105,23 @@
 						<!-- 버튼기능정리 -->
 						<!-- 일반배송 -->
 						<th:block th:unless="${ordDtl.giftPackYn} == 'Y'">
-							<!-- 입금대기 1:1문의 버튼(입금대기, 배송준비중, 구매확정) -->
+							<!-- 입금대기 (1:1문의, 쇼핑백 담기) -->
 							<th:block th:if="${ordDtl.ordDtlStat == 'G013_10'}">
-								<p><button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA_REG);"><span>1:1 문의</span></button></p>
+								<div class="goods_btn_wrap btn_group_flex">
+									<div>
+										<button type="button" class="btn btn_default btn_cncl_complete" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA_REG);">
+											<span>1:1 문의</span>
+										</button>
+									</div>
+									<div>
+										<button type="button" class="btn btn_primary btn_cart_save" th:ordNo="${ordDtl.ordNo}" th:ordDtlNo="${ordDtl.ordDtlNo}" onclick="fnCreateCart(this);">
+											<span>쇼핑백 담기</span>
+										</button>
+									</div>
+								</div>
 							</th:block>
-														
+							<!-- //입금대기 (1:1문의, 쇼핑백 담기) -->
+
 							<!-- 결제완료, 상품준비중, 출고처지정 (주문취소) -->
 							<th:block th:if="${ordDtl.ordDtlStat} == 'G013_20' or ${ordDtl.ordDtlStat} == 'G013_30' or ${ordDtl.ordDtlStat} == 'G013_35'">
 								<div class="goods_btn_wrap btn_group_flex">
@@ -119,7 +132,7 @@
 									</div>
 								</div>
 							</th:block>
-							<!-- //입금대기, 결제완료, 상품준비중, 출고처지정 (주문취소) -->
+							<!-- //결제완료, 상품준비중, 출고처지정 (주문취소) -->
 							
 							<!-- 배송준비중-->
 							<th:block th:if="${ordDtl.ordDtlStat} == 'G013_40'">
@@ -151,10 +164,10 @@
 								
 								<!-- 리뷰사용가능, 리뷰등록전일때 -->
 								<div class="goods_btn_wrap btn_group_flex">
-									<div><button type="button" class="btn btn_default btn_delv_sch"><span>배송 조회</span></button></div>
+									<div><button type="button" class="btn btn_default btn_delv_sch" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, shipCompCd=${ordDtl.shipCompCd}, invoiceNo=${ordDtl.invoiceNo}" onclick="fnGoToDelivery(this);"><span>배송 조회</span></button></div>
 									<!-- 리뷰사용가능, 리뷰등록전일때 -->
 									<th:block th:if="${ordDtl.reviewableYn} == 'Y' and ${ordDtl.reviewSq} == null">
-										<div><button type="button" class="btn btn_primary btn_review_write"><span>리뷰 쓰기</span></button></div>
+										<div><button type="button" class="btn btn_primary btn_review_write" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, goodsCd=${ordDtl.goodsCd}" onclick="fnCreateReview(this);"><span>리뷰 쓰기</span></button></div>
 									</th:block>
 									<!-- //리뷰사용가능, 리뷰등록전일때 -->
 								</div>

+ 670 - 0
src/main/webapp/WEB-INF/views/mob/mypage/MypageReviewCreateFormMob.html

@@ -0,0 +1,670 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/MypageLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : MypageReviewCreateFormMob.html
+ * @desc    : 마이페이지 > 리뷰 작성Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.05.11   sowon     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+<main role="" id="" class="container my">
+			<section class="content review">
+				<form class="form_wrap" id="reviewForm"  th:action="@{'/mypage/review/save'}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
+				<input type="hidden" name="ordNo" th:value="${reviewInfo.ordNo}">
+						<input type="hidden" name="ordDtlNo" th:value="${reviewInfo.ordDtlNo}">
+						<input type="hidden" name="goodsCd" th:value="${reviewInfo.goodsCd}">
+						<input type="hidden" name="custNo" th:value="${reviewInfo.custNo}">
+						<input type="hidden" name="reviewStat" th:value="${reviewStat}">
+						<input type="hidden" name="reviewSq" th:if="${reviewStat == 'u'}" th:value="${reviewInfo.reviewSq}">
+					<div class="inner bg_gray">
+						<ul class="note">
+							<li>일반 리뷰 작성시 150P, 일반 리뷰 작성시 150P, 포토/영상 리뷰는 350P가 추가 적립됩니다.</li>
+							<li>월 최대 10,000P까지 적립 가능합니다.(합산 후 월 1회 지급)</li>
+							<li>베스트 리뷰로 선정되면 10,000P가 추가 적립됩니다.</li>
+							<li>리뷰 작성시 욕설, 비방, 선정적인 내용 등이 있을 경우 통보 없이관리자에 의해 삭제 될 수 있습니다.</li>
+						</ul>
+					</div>
+					<div class="inner">
+						<div class="part_goods">
+							<!-- 굿즈_리뷰 -->
+							<div class="goods_section">
+								<div class="goods_detail">
+									<a href="">
+										<div class="thumb_box">
+											<img th:src="${imageUrl + '/' + reviewInfo.sysImgNm}" alt="tmp_pdClickother1">
+										</div>
+										<div class="info_box">
+											<div class="od_name">
+												<div class="goods_date"><span class="date" th:text="${reviewInfo.payDt}"></span>구매</div>
+												<div class="brand">
+													<span th:text="${reviewInfo.brandEnm}"></span>
+												</div>
+												<div class="name" th:text="${reviewInfo.goodsNm}"></div>
+											</div>
+											<div class="od_opt">
+												<div class="option" id="optionDiv">
+													<!-- <em>Black</em><em>XXL</em> -->
+												</div>
+											</div>
+										</div>
+									</a>
+								</div>											
+							</div>
+							<!-- //굿즈_리뷰 -->
+						</div>
+					</div>
+					<div class="inner">
+						<div class="titWrap">
+							<div class="">별점을 선택해주세요</div>
+						</div>
+						<div class="review_score">
+							<div id="star_grade">
+								<input type="hidden" id="score" name="score">
+								<button type="button" id="starBtn"></button>
+								<button type="button" id="starBtn"></button>
+								<button type="button" id="starBtn"></button>
+								<button type="button" id="starBtn"></button>
+								<button type="button" id="starBtn"></button>
+							</div>
+						</div>
+					</div>
+					<div class="inner">
+						<div class="my_edit_section">
+							<div class="tbl_wrap">
+								<div class="tbl_tit"> 
+									<h3>키/몸무게</h3>
+								</div>
+								<div class="tbl">
+									<div class="tbl_row">
+										<table>
+											<colgroup>
+												<col width="*">
+											</colgroup>   
+											<tr>
+												<th>키</th>
+												<td>
+													<div class="form_field rev_height">
+														<input type="tel" class="form_control" oninput='handleOnInput(this, 3)' id="height" name="height" data-valid-type="numeric" placeholder="키를 숫자만 입력해주세요."><span>cm</span>
+													</div>
+												</td>
+											</tr>
+											<tr>
+												<th>몸무게</th>
+												<td>
+													<div class="form_field rev_height">
+														<input type="tel" class="form_control" oninput='handleOnInput(this, 3)' id="weight" name="weight" data-valid-type="numeric" placeholder="몸무게를 숫자만 입력해주세요."><span>kg</span>
+													</div>
+												</td>
+											</tr>
+										</table>
+									</div>
+								</div>
+							</div>
+							<th:block th:if="${reviewInfo.sizeGb == 'T' or reviewInfo.sizeGb == 'B' or reviewInfo.sizeGb == 'S'}">
+							<div class="tbl_wrap">
+								<div class="tbl_tit"> 
+									<h3>상품평가</h3>
+								</div>
+								<div class="tbl">
+									<div class="tbl_row">
+										<table data-name="rating">
+											<colgroup>
+												<col width="*">
+											</colgroup>
+											<th:block th:if="${reviewInfo.sizeGb == 'T' or reviewInfo.sizeGb == 'B' or reviewInfo.sizeGb == 'S'}">    
+											<tr>
+												<th>사이즈</th>
+												<td>
+													<div class="form_field review_radio">
+														<div class="radio_li">
+															<input id="chk-1" type="radio" name="scoreSize" value="1"><label for="chk-1"> <span>작음</span></label>
+														</div>
+														<div class="radio_li">
+															<input id="chk-2" type="radio" name="scoreSize" value="2"><label for="chk-2"> <span>딱맞음</span></label>
+														</div>
+														<div class="radio_li">
+															<input id="chk-3" type="radio" name="scoreSize" value="3"><label for="chk-3"> <span>큼</span></label>
+														</div>
+													</div>
+												</td>
+											</tr>
+											<tr>
+												<th>컬러</th>
+												<td>
+													<div class="form_field review_radio">
+														<div class="radio_li">
+															<input id="chk-4" type="radio" name="scoreColor" value="1"><label for="chk-4"> <span>밝음</span></label>
+														</div>
+														<div class="radio_li">
+															<input id="chk-5" type="radio" name="scoreColor" value="2"><label for="chk-5"> <span>똑같음</span></label>
+														</div>
+														<div class="radio_li">
+															<input id="chk-6" type="radio" name="scoreColor" value="3"><label for="chk-6"> <span>어두움</span></label>
+														</div>
+													</div>
+												</td>
+											</tr>
+											</th:block>
+											<th:block th:if="${reviewInfo.sizeGb == 'T' or reviewInfo.sizeGb == 'B'}"> 
+											<tr>
+												<th>핏</th>
+												<td>
+													<div class="form_field review_radio">
+														<div class="radio_li">
+															<input id="chk-7" type="radio" name="scoreFit" value="1"><label for="chk-7"> <span>슬림</span></label>
+														</div>
+														<div class="radio_li">
+															<input id="chk-8" type="radio" name="scoreFit" value="2"><label for="chk-8"> <span>레귤러</span></label>
+														</div>
+														<div class="radio_li">
+															<input id="chk-9" type="radio" name="scoreFit" value="3"><label for="chk-9"> <span>오버</span></label>
+														</div>
+													</div>
+												</td>
+											</tr>
+											<tr>
+												<th>두께감</th>
+												<td>
+													<div class="form_field review_radio">
+														<div class="radio_li">
+															<input id="chk-10" type="radio" name="scoreThick" value="1"><label for="chk-10"> <span>얇음</span></label>
+														</div>
+														<div class="radio_li">
+															<input id="chk-11" type="radio" name="scoreThick" value="2"><label for="chk-11"> <span>적당함</span></label>
+														</div>
+														<div class="radio_li">
+															<input id="chk-12" type="radio" name="scoreThick" value="3"><label for="chk-12"> <span>도톰함</span></label>
+														</div>
+													</div>
+												</td>
+											</tr>
+											</th:block>
+											<th:block th:if="${reviewInfo.sizeGb == 'S'}"> 
+											<tr>
+												<th>무게감</th>
+												<td>
+													<div class="form_field review_radio">
+														<div class="radio_li">
+															<input id="chk-13" type="radio" name="scoreWeight" value="1"><label for="chk-13"> <span>가벼움</span></label>
+														</div>
+														<div class="radio_li">
+															<input id="chk-14" type="radio" name="scoreWeight" value="2"><label for="chk-14"> <span>적당함</span></label>
+														</div>
+														<div class="radio_li">
+															<input id="chk-15" type="radio" name="scoreWeight" value="3"><label for="chk-15"> <span>무거움</span></label>
+														</div>
+													</div>
+												</td>
+											</tr>
+											<tr>
+												<th>볼너비</th>
+												<td>
+													<div class="form_field review_radio">
+														<div class="radio_li">
+															<input id="chk-16" type="radio" name="scoreBall" value="1"><label for="chk-16"> <span>작음</span></label>
+														</div>
+														<div class="radio_li">
+															<input id="chk-17" type="radio" name="scoreBall" value="2"><label for="chk-17"> <span>딱맞음</span></label>
+														</div>
+														<div class="radio_li">
+															<input id="chk-18" type="radio" name="scoreBall" value="3"><label for="chk-18"> <span>큼</span></label>
+														</div>
+													</div>
+												</td>
+											</tr>
+											</th:block>
+										</table>
+									</div>
+								</div>
+							</div>
+							</th:block>
+							<div class="tbl_wrap">
+								<div class="tbl">
+									<div class="tbl_row">
+										<table>
+											<colgroup>
+												<col width="*">
+											</colgroup>   
+											<tr>
+												<th>
+													<span class="tit">고객님의 리뷰가<br>다른 고객님께 도움이 될 수 있어요! </span>
+
+													<div class="tip_wrap tip2" >
+														<div class="tip_tit">?</div>
+														<div class="tip_contents">
+															<ul>
+																<li>리뷰 내용은 최소 10자 이상 입력해주세요.</li>
+																<li>상품과 무관하거나 스팸, 음란, 불법적인 내용의 리뷰는 통보없이 삭제되며, 지금된 포인트는 회수 될 수 있습니다.</li>
+															</ul>
+														</div>
+													</div>
+												</th>
+												<td>
+													<textarea class="doc_review" name="reviewContent" id="reviewContent" cols="30" rows="10"></textarea>
+													<p class="txt_cnt"><span id="review_cnt" class="c_primary">0</span>/500</p>
+												</td>
+											</tr>
+											<tr>
+												<th>
+													<span class="tit">포토/영상 첨부</span>
+												</th>
+												<td>
+													<div class="form_field">
+														<div class="imgUpload">
+															<label for="fileAdd" class="fileAdd" id="fileAdd_reply">업로드</label>
+															<input type="file" id="fileAdd" name="files" multiple="">
+															<!-- 첨부한 이미지가 반영될 곳, 실제 반영 시 해당 구역은 제거할 것 -->
+														</div>
+													</div>
+													<p class="review_desc">최대 10개까지 등록 가능</p>
+													<p class="review_desc">동영상 첨부 시 관리자 승인이 필요하여 바로 노출이 되지 않을 수 있습니다.</p>					
+												</td>
+											</tr>
+										</table>
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+					<div class="inner">
+						<div class="goods_btn_wrap btn_group_flex">
+							<div><button type="button" id="btn_review_cancle" class="btn btn_default" onclick="reviewCancel()"><span>취소</span></button></div> 
+							<div th:if="${reviewStat == 'c'}"><button type="button" id="btn_review_confirm" class="btn btn_dark"  onclick="reviewCreate()"><span>등록</span></button></div> 
+							<div th:if="${reviewStat == 'u'}"><button type="button" id="btn_review_confirm" class="btn btn_dark"  onclick="reviewUpdate()"><span>수정</span></button></div> 
+						</div>
+					</div>
+				</form>
+			</section>
+		</main>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.kollus.js"></script>
+<script th:inline="javascript">
+let reviewList = [[${reviewInfo}]];
+let reviewStat = [[${reviewStat}]];
+let reviewAttach = [[${alreadyReviewAttach}]];
+let reviewUrl =[[${@environment.getProperty('upload.image.view')}]];
+
+//별점 class="on"
+var $starEls = $('#star_grade button#starBtn');
+var rate = 0;
+
+$starEls.each(function (index, el) {
+    $(el).on('click', function () {
+        rating(index);
+        $("#score").attr("value",index+1);
+    });
+});
+
+
+function rating(score) {
+    $starEls.each(function (i, el) {
+        if (i <= score) {
+            $(el).addClass('on');
+        } else {
+            $(el).removeClass('on');
+        }
+    });
+
+    rate = score + 1;
+}
+
+// 리뷰  취소
+var reviewCancel = function() {
+	
+	mcxDialog.confirm('취소하시겠습니까"?', {
+        cancelBtnText: "취소",
+        sureBtnText: "확인",
+        sureBtnClick: function(){
+        	cfnGoToPage(_PAGE_MYPAGE_REVIEW);
+        }
+    });
+}
+
+
+//리뷰 등록
+var reviewCreate = function () {
+	if($("#score").val()=='' || $("#score").val()==null){
+		mcxDialog.alert('별점을 선택하세요.');
+		return;
+	}
+	
+	if($("#reviewForm input[name=height]").val() == '' || $("#reviewForm input[name=height]").val() == null){
+		mcxDialog.alert('키를 입력하세요.');
+		return;
+	}
+	
+	if($("#reviewForm input[name=weight]").val() == '' || $("#reviewForm input[name=weight]").val() == null){
+		mcxDialog.alert('몸무게를 입력하세요.');
+		return;
+	} 
+	
+	
+	if(reviewList.sizeGb == 'T' || reviewList.sizeGb == 'B' || reviewList.sizeGb == 'S'){
+		if($('#reviewForm input:radio[name=scoreSize]:checked').length == 0){
+			mcxDialog.alert('상품 사이즈를 평가해주세요.');
+			return false;
+		}
+		
+		if($('#reviewForm input:radio[name=scoreColor]:checked').length == 0){
+			mcxDialog.alert('상품 컬러를 평가해주세요.');
+			return false;
+		}
+	}
+	
+	if(reviewList.sizeGb == 'T' || reviewList.sizeGb == 'B'){
+		if($('#reviewForm input:radio[name=scoreFit]:checked').length == 0){
+			mcxDialog.alert('상품 핏을 평가해주세요.');
+			return false;
+		}
+		if($('#reviewForm input:radio[name=scoreThick]:checked').length == 0){
+			mcxDialog.alert('상품 두께감을 평가해주세요.');
+			return false;
+		}	
+	}
+	
+	if(reviewList.sizeGb == 'S' ){
+		if($('#reviewForm input:radio[name=scoreWeight]:checked').length == 0){
+			mcxDialog.alert('상품 무게감을 평가해주세요.');
+			return false;
+		}
+		
+		if($('#reviewForm input:radio[name=scoreBall]:checked').length == 0){
+			mcxDialog.alert('상품 볼넓이를 평가해주세요.');
+			return false;
+		}
+	}
+	
+	if($('#reviewContent').val().length<10){
+		mcxDialog.alert("리뷰 내용을 10자 이상 입력해주세요.");
+		return false;
+	}
+	
+	
+	mcxDialog.confirm('리뷰를 등록하시겠습니까?', {
+     cancelBtnText: "취소",
+     sureBtnText: "확인",
+     sureBtnClick: function(){
+     	gagajf.ajaxFormSubmit($('#reviewForm').prop('action'), '#reviewForm', fnSaveCallback);
+     }
+ });
+	
+	
+}
+
+
+//리뷰 수정
+var reviewUpdate = function() {
+	
+	if($("#reviewForm input[name=height]").val() == '' || $("#reviewForm input[name=height]").val() == null){
+		mcxDialog.alert('키를 입력하세요.');
+		return;
+	}
+	
+	if($("#reviewForm input[name=weight]").val() == '' || $("#reviewForm input[name=weight]").val() == null){
+		mcxDialog.alert('몸무게를 입력하세요.');
+		return;
+	}
+
+	if($('#reviewContent').val().length<10){
+		mcxDialog.alert("리뷰 내용을 10자 이상 입력해주세요.");
+		return;
+	}
+	
+	mcxDialog.confirm('리뷰를 수정하시겠습니까"?', {
+     cancelBtnText: "취소",
+     sureBtnText: "확인",
+     sureBtnClick: function(){
+     	gagajf.ajaxFormSubmit("/mypage/review/update", '#reviewForm', fnUpdateCallback);
+     }
+ });
+	
+}
+var fnSaveCallback = function (result) {
+	if(result.status == "200"){
+		if (document.getElementsByName("kufKeyArr").length>0 || document.getElementsByName("orgFileNmArr").length>0) {
+			mcxDialog.confirm("상품리뷰를 등록 하였습니다. 350P 적립 예정입니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() { 
+					cfnGoToPage(_PAGE_MYPAGE_REVIEW);
+				}
+			});
+		}else{
+			mcxDialog.confirm("상품리뷰를 등록 하였습니다. 150P 적립 예정입니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() { 
+					cfnGoToPage(_PAGE_MYPAGE_REVIEW);
+				}
+			});
+		}
+	}
+}
+
+var fnUpdateCallback = function (result) {
+	if(result.status == "200"){
+		mcxDialog.confirm("상품 리뷰를 수정하였습니다.", {
+			sureBtnText: "확인",
+			sureBtnClick: function() { 
+				cfnGoToPage(_PAGE_MYPAGE_REVIEW);
+			}
+		}); 
+		
+	}
+}
+
+//header scroll
+$(document).on('click', '.tabIndex li a', function() {
+	
+	
+	var $this = $(this),
+		$tabList = $this.parents('ul'),
+		_idx = $this.closest('li').index();
+	
+	$tabList.children().eq(_idx).addClass('active').siblings().removeClass('active');
+	$tabList.next().children().eq(_idx).addClass('active').siblings().removeClass('active');
+});
+		
+$(function(){
+	
+	$('#htopTitle').text('리뷰 쓰기');
+	if (reviewList.goodsType == 'G056_S') {
+		$.each(reviewList.colorNmArr, function(index, option) {
+			$("#optionDiv").append('<em>'+reviewList.itemNmArr[index] + ' / ' + option + ' / ' + reviewList.optCd2Arr[index]+'</em>');
+		});
+	}else{
+		$(".option").append('<em>'+reviewList.optCd1+'</em><em>'+reviewList.optCd2+'</em>');
+	}
+	
+	 if(reviewStat=='u'){
+		 var reviewScore = reviewList.score-1;
+		 $("#score").val(reviewScore);
+		 rating(reviewScore);
+		$("#reviewForm input[name=height]").val(reviewList.height);
+		$("#reviewForm input[name=weight]").val(reviewList.weight);
+		$("#reviewForm textarea[name=reviewContent]").val(reviewList.reviewContent.escapeHtml());
+		if(reviewList.scoreSize == "1"){
+			$('#reviewForm input:radio[name=scoreSize]:radio[value="1"]').prop('checked', true);
+		}else if(reviewList.scoreSize == "2"){
+			$('#reviewForm input:radio[name=scoreSize]:radio[value="2"]').prop('checked', true);
+		}else if(reviewList.scoreSize == "3"){
+			$('#reviewForm input:radio[name=scoreSize]:radio[value="3"]').prop('checked', true);
+		}
+		
+		if(reviewList.scoreColor == "1"){
+			$('#reviewForm input:radio[name=scoreColor]:radio[value="1"]').prop('checked', true);
+		}else if(reviewList.scoreColor == "2"){
+			$('#reviewForm input:radio[name=scoreColor]:radio[value="2"]').prop('checked', true);
+		}else if(reviewList.scoreColor == "3"){
+			$('#reviewForm input:radio[name=scoreColor]:radio[value="3"]').prop('checked', true);
+		}
+		
+		if(reviewList.scoreFit == "1"){
+			$('#reviewForm input:radio[name=scoreFit]:radio[value="1"]').prop('checked', true);
+		}else if(reviewList.scoreFit == "2"){
+			$('#reviewForm input:radio[name=scoreFit]:radio[value="2"]').prop('checked', true);
+		}else if(reviewList.scoreFit == "3"){
+			$('#reviewForm input:radio[name=scoreFit]:radio[value="3"]').prop('checked', true);
+		}
+		
+		if(reviewList.scoreThick == "1"){
+			$('#reviewForm input:radio[name=scoreThick]:radio[value="1"]').prop('checked', true);
+		}else if(reviewList.scoreThick == "2"){
+			$('#reviewForm input:radio[name=scoreThick]:radio[value="2"]').prop('checked', true);
+		}else if(reviewList.scoreThick == "3"){
+			$('#reviewForm input:radio[name=scoreThick]:radio[value="3"]').prop('checked', true);
+		}
+		
+		if(reviewList.scoreWeight == "1"){
+			$('#reviewForm input:radio[name=scoreWeight]:radio[value="1"]').prop('checked', true);
+		}else if(reviewList.scoreWeight == "2"){
+			$('#reviewForm input:radio[name=scoreWeight]:radio[value="2"]').prop('checked', true);
+		}else if(reviewList.scoreWeight == "3"){
+			$('#reviewForm input:radio[name=scoreWeight]:radio[value="3"]').prop('checked', true);
+		}
+		
+		if(reviewList.scoreBall == "1"){
+			$('#reviewForm input:radio[name=scoreBall]:radio[value="1"]').prop('checked', true);
+		}else if(reviewList.scoreBall == "2"){
+			$('#reviewForm input:radio[name=scoreBall]:radio[value="2"]').prop('checked', true);
+		}else if(reviewList.scoreBall == "3"){
+			$('#reviewForm input:radio[name=scoreBall]:radio[value="3"]').prop('checked', true);
+		}
+		
+		if(reviewAttach.length>0){
+			for (var i = 0; i < reviewAttach.length; i++) {
+				if(reviewAttach[i].reviewSq == reviewList.reviewSq){
+					if(reviewAttach[i].fileGb == "I"){
+						$("<span class=\"pics\">" +
+								"<img class=\"picsThumbs\" src=\"" + reviewUrl + '/' + reviewAttach[i].sysFileNm + "\" />" +
+								"<input type='hidden' name='orgFileNmArr' value='"+reviewAttach[i].orgFileNm+"'>" +
+								"<input type='hidden' name='sysFileNmArr' value='"+reviewAttach[i].sysFileNm+"'>" +
+								"<br/><span class=\"removes\">Removes image</span>" +
+								"</span>").insertAfter("#fileAdd");
+					}else{
+						$("<span class=\"pics\">" +
+								"<img class=\"picsThumbs\" />" +
+								"<input type='hidden' name='kmcKeyArr' value='" + reviewAttach[i].kmcKey + "'>" + 
+								"<input type='hidden' name='kufKeyArr' value='" + reviewAttach[i].kufKey + "'>" + 
+								"<br/><span class=\"removes\">Removes image</span>" +
+								"</span>").insertAfter("#fileAdd");
+					}
+				}
+				
+			}
+			$(".removes").click(function(){
+				$(this).parent(".pics").remove();
+			});
+			
+		}
+	} 
+	
+	$(window).scroll(function(){
+		var scroll = $(this).scrollTop();
+		var headerH = $(".header").height();
+		if ($(window).scrollTop() > headerH){
+			$(".header").addClass("minify");
+			return false;
+		}
+		else {
+			$(".header").removeClass("minify");
+			return false;
+		}
+	});
+
+	$('#star_grade button').click(function(){
+		$(this).parent().children("button").removeClass("on");  /* 별점의 on 클래스 전부 제거 */ 
+		$(this).addClass("on").prevAll("button").addClass("on"); /* 클릭한 별과, 그 앞 까지 별점에 on 클래스 추가 */
+		return false;
+	});
+
+	//리뷰 내용 글자 수 제한
+	$('.doc_review').keyup(function (e){
+		var content = $(this).val();
+		$('#review_cnt').html(content.length);
+		if (content.length > 500){
+			$(this).val(content.substring(0, 500));
+			$('#review_cnt').html("500");
+		}
+	});
+});
+
+$('#fileAdd').on('change', function() { fnChooseFile(this); });
+
+var fnChooseFile = function(obj) {
+	var picLength = $(".pics").length;
+	
+	// multiple 속성이 있으면 files에는 다수의 객체가 할당됨
+	var file = obj.files[0];
+	
+/* 	if (!gagajf.isNull(file.size) && Number(file.size) > (10 * 1000000)) {        
+		mcxDialog.alertC('이미지는 최대 10MB 이하 파일만 가능합니다.', {                          
+			sureBtnText: "확인",                                                    
+			sureBtnClick: function() {                                            
+				$(obj).parent('.imgUpload').find('.removes').trigger('click');    
+			}                                                                     
+		});                                                                       
+		return false;                                                             
+	}                 */                                                             
+
+	if (!gagajf.isNull(file.name)) {
+		var extension = "\.(jpg|jpeg|png)$";
+		if ((new RegExp(extension, "i")).test(file.name)) {
+			 gagajf.ajaxFileUpload('/common/file/upload?subDir=/review'
+						, file
+						, function(result) {
+							// 업로드한 파일명 설정
+							$(".pics").children().eq(0).append("<input type='hidden' name='orgFileNmArr' id='orgFileNm"+(picLength+1)+"' value='"+result.oldFileName+"'>");
+							$(".pics").children().eq(0).append("<input type='hidden' name='sysFileNmArr' id='sysFileNm"+(picLength+1)+"' value='"+result.newFileName+"'>");
+						}
+				); 
+		}else if((new RegExp("mp4", "i")).test(file.name)){
+			setTimeout(function(){
+				$(".pics").children().eq(0).append("<input type='hidden' name='kufKeyArr' id='kufKey"+(picLength+1)+"'>");
+				$(".pics").children().eq(0).append("<input type='hidden' name='kmcKeyArr' id='kmcKey"+(picLength+1)+"'>");
+				gagaKollus.upload('Review', file, $('#kufKey'+(picLength+1)));
+			}, 2000);
+		}else{
+			mcxDialog.alertC('첨부할 수 없는 파일 형식입니다.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$(obj).parent('.imgUpload').find('.removes').trigger('click');
+				}
+			});
+			return false;
+		}
+	}
+	// 이거 왜 안먹히지 
+
+	
+	// 파일 업로드
+/* 	 gagajf.ajaxFileUpload('/common/file/upload?subDir=/review'
+			, file
+			, function(result) {
+				// 업로드한 파일명 설정
+				$(".pics").children().eq(0).append("<input type='hidden' name='orgFileNmArr' id='orgFileNm"+(picLength+1)+"' value='"+result.oldFileName+"'>");
+				$(".pics").children().eq(0).append("<input type='hidden' name='sysFileNmArr' id='sysFileNm"+(picLength+1)+"' value='"+result.newFileName+"'>");
+			}
+	);   */
+}
+
+
+//210409_키, 몸무게 input 글자 수 제한
+function handleOnInput(el, maxlength) {
+		if(el.value.length > maxlength)  {
+			el.value = el.value.substr(0, maxlength);
+		}
+	}
+</script>
+</th:block>
+
+</body>
+</html>

+ 253 - 240
src/main/webapp/WEB-INF/views/mob/mypage/MypageReviewFormMob.html

@@ -60,26 +60,29 @@
 								</div>
 								<!-- tab_cont Start -->
 								<div class="inner" id="reviewList">
-									<div class="part_goods">
-										<!-- 굿즈_리뷰 -->
-										
-										<!-- //굿즈_리뷰 -->
-									</div>
+
 									<div class="nodata" id="nodata1" style="display: none;">
-									<div class="txt_box">
-										<p>
-											작성 가능한 리뷰가 없습니다.<br>
-										</p>
+										<div class="txt_box">
+											<p>
+												작성 가능한 리뷰가 없습니다.<br>
+											</p>
+										</div>
+									</div>
+									<div class="nodata" id="nodata2" style="display: none;">
+										<div class="txt_box">
+											<p>
+												작성한 리뷰가 없습니다.<br>
+											</p>
+										</div>
 									</div>
 								</div>
-							</div>
 								<!-- // tab_cont End -->
 							</div>
-							<div class="tab_cont ">
-								<!-- tab_cont Start -->
+<!-- 							<div class="tab_cont ">
+								tab_cont Start
 								<div class="inner">
 									<div class="part_goods">
-										<!-- 굿즈_리뷰 -->
+										굿즈_리뷰
 										<div class="goods_section">
 											<div class="goods_detail">
 												<a href="">
@@ -103,13 +106,13 @@
 												</a>
 											</div>											
 										</div>
-										<!-- //굿즈_리뷰 -->
+										//굿즈_리뷰
 									</div>
 									<div class="reviewMy">
 										<div class="info_box">
 											<div class="star_score">
 												<span class="star">
-													<em class="progbar" style="width:70%;"></em> <!-- 평점 style로 표기 -->
+													<em class="progbar" style="width:70%;"></em> 평점 style로 표기
 												</span>
 											</div>
 											<div class="writer">
@@ -136,7 +139,7 @@
 													<li>
 														<a href="">
 															<div class="pic">
-																<span class="thumb mov" style="background-image:url('/images/pc/thumb/tmp_pdLookbook3.jpg');"></span><!-- 동영상의 썸네일일 경우 mov 클래스 추가 -->
+																<span class="thumb mov" style="background-image:url('/images/pc/thumb/tmp_pdLookbook3.jpg');"></span>동영상의 썸네일일 경우 mov 클래스 추가
 															</div>
 														</a>
 													</li>
@@ -193,28 +196,18 @@
 												</div>
 											</div>
 										</div>
-										<!-- .reply_box가 노출될 경우, 삭제만 -->
+										.reply_box가 노출될 경우, 삭제만
 										<div class="goods_btn_wrap btn_group_flex">
 											<div><button type="button" class="btn btn_default"><span>리뷰 삭제</span></button></div>
 										</div>
 									</div>
 								</div>
-
-								<!-- // tab_cont End -->
-							</div>
+							</div> -->
 						</div>
 					</div>
 				</div>
 			</section>
 		</main>
-<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/jquery/jquery.history.min.js"></script>
 <script src="/ux/plugins/gaga/gaga.infinite.scrollLayer.js"></script>
 <script th:inline="javascript">
@@ -227,233 +220,253 @@
 		$("#alreadyReview").removeClass("active");
 		$("#completeReview").addClass("active");
 		$("#check_notice").hide();
+		$('#reviewList').html('');
+		var data = {};
+		var jsonData = JSON.stringify(data);
 		
-	})
-	
-	var fnGetInfiniteScrollCompleteDataList = function(pageNum) {
+		gagajf.ajaxJsonSubmit('/mypage/complete/review/list', jsonData,	function(result) {
+			if (result.dataList1 != null && result.dataList1.length > 0) {
+				
+				let html = '';
+				html += '	<div class="part_goods">';
+				$.each(result.dataList1, function(idx, item) {
+					html += '		<div class="goods_section">';
+					html += '			<div class="goods_detail">';
+					html += '				<a href="javascript:void(0)" onclick="cfnGoToGoodsDetail(\'' + item.goodsCd + '\')">';
+					html += '					<div class="thumb_box">';
+					html += '						<img src="' + imageUrl + '/' + item.sysImgNm + '" alt="tmp_pdClickother1">';
+					html += '					</div>';
+					html += '					<div class="info_box">';
+					html += '						<div class="od_name">';
+					html += '							<div class="goods_date"><span class="date">'+item.payDt+'</span> 구매</div>';
+					html += '							<div class="brand">';
+					html += '								<span>'+item.brandNm+'</span>';
+					html += '							</div>';
+					html += '							<div class="name">'+item.goodsNm+'</div>';
+					html += '						</div>';
+					html += '						<div class="od_opt">';
+					html += '							<div class="option">';
+					if (item.goodsType =='G056_S') {
+						$.each(item.colorNmArr, function (index2, option) {
+							html += '							<em>' + item.itemNmArr[index2] + ' / ' + option + '</em\n';
+						})
+					}else{
+						html += '							<em>'+item.colorNm+'</em>     ';
+					}
+					html += '							</div>';
+					html += '						</div>';
+					html += '					</div>';
+					html += '				</a>';
+					html += '			</div>';
+					html += '			<div class="goods_btn_wrap btn_group_flex">';
+					html += '				<div><button type="button" class="btn btn_default" onclick="fnReviewCreate('+item.ordNo+','+item.ordDtlNo+',\'' + item.goodsCd + '\')"><span>리뷰쓰기(</span><em>'+item.remainDt+'</em><span>일 남음)</span></button></div>';
+					html += '			</div>';
+					html += '		</div>';
+				});
+				html += '	</div>';
+				$('#reviewList').append(html);
+			}else{
+				$('#nodata1').show();
+			}
+		});
 	
-		$("#searchForm1 input[name=pageNo]").val(pageNum+1);
-		// 콜백함수인 gagaInfiniteScroll.jsonToHtml 에서는 fnDrawInfiniteScrollData 함수를 호출한다.
-		gagajf.ajaxFormSubmit("/mypage/complete/review/list", document.goodsReviewForm,  gagaInfiniteScroll.jsonToHtml);
-	}
+	})
 	
 	
 	$("#alreadyReview").click(function() {
 		$("#completeReview").removeClass("active");
 		$("#alreadyReview").addClass("active");
 		$("#check_notice").show();
-		
+		$('#reviewList').html('');
+		var data = {};
 		var jsonData = JSON.stringify(data);
 		gagajf.ajaxJsonSubmit('/mypage/already/review/list', jsonData,	function(result) {
-			if (result.dataList1 != null && result.dataList1.length > 0) {
-				$.each(result.dataList1, function(idx, item) {
-					let html = '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					html += '';
-					$('#reviewList').append(html);
-				})
+			if (result.dataList2 != null && result.dataList2.length > 0) {
+				let html = '';
+				$.each(result.dataList2, function(idx, item) {
+					html += '	<div class="part_goods">';
+					html += '		<div class="goods_section">';
+					html += '			<div class="goods_detail">';
+					html += '				<a href="javascript:void(0)" onclick="cfnGoToGoodsDetail(\'' + item.goodsCd + '\')" >';
+					html += '					<div class="thumb_box">';
+					html += '						<img src="' + imageUrl + '/' + item.sysImgNm + '?RS=405" alt="tmp_pdClickother1">';
+					html += '					</div>';
+					html += '					<div class="info_box">';
+					html += '						<div class="od_name">';
+					html += '							<div class="goods_date"><span class="date">'+item.payDt+'</span>구매</div>';
+					html += '							<div class="brand">';
+					html += '								<span>'+item.brandNm+'</span>';
+					html += '							</div>';
+					html += '							<div class="name">'+item.goodsNm+'</div>';
+					html += '						</div>';
+					html += '						<div class="od_opt">';
+					html += '							<div class="option">';
+					if (item.goodsType =='G056_S') {
+						$.each(item.colorNmArr, function (index2, option) {
+							html += '							<em>' + item.itemNmArr[index2] + ' / ' + option +'</em>\n';
+						})
+					}else{
+						html += '							<em>'+item.colorNm+'</em>     ';
+					}
+					html += '							</div>';
+					html += '						</div>';
+					html += '					</div>';
+					html += '				</a>';
+					html += '			</div>											';
+					html += '		</div>';
+					html += '	</div>';
+					html += '	<div class="reviewMy">';
+					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.colorNm+'</dd>';
+					html += '					</div>';
+					html += '					<div>';
+					html += '						<dt>키/몸무게</dt>';
+					html += '						<dd>'+item.height+'cm/'+item.weight+'kg</dd>';
+					html += '					</div>';
+					html += '				</dl>';
+					html += '			</div>';
+					html += '		</div>';
+					if (attachList != null && attachList.length >0) {
+						html += '		<div class="photo_box">';
+						html += '			<div class="photo_list">';
+						html += '				<ul>';
+						for (var i = 0; i < attachList.length; i++) {
+							html += '					<li>';
+							html += '						<a>';
+							html += '							<div class="pic">';
+							if (attachList[i].fileGb == 'M') {
+								html += '								<span class="thumb mov" onclick="cfMypageReviewDetail(\''+item.goodsCd+'\', \'Y\',\''+item.reviewSq+'\');"  style="background-image:url(' + _kollusMediaUrl + '/' + attachList[i].kmcKey + '?player_version=html5);"></span>';
+							}else{
+								html += '								<span class="thumb" onclick="cfMypageReviewDetail(\''+item.goodsCd+'\', \'Y\',\''+item.reviewSq+'\');" 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.escapeHtml()+'</p>';
+					html += '		</div>';
+					html += '		<div  class="response_box2">';
+					html += '			<div>';
+					html += '				<dl class="clear">';
+					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 (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.escapeHtml()+'</p>';
+						html += '				</div>';
+						html += '			</div>';
+						html += '		</div>';
+					}
+					html += '		<div class="goods_btn_wrap btn_group_flex">';
+					if (item.admRpl == null || item.admRpl == '') {
+						html += '			<div><button type="button" id="btn_review_delete" class="btn btn_default" onclick="fnReviewUpdate('+item.ordNo+','+item.ordDtlNo+',\''+item.goodsCd+'\','+item.reviewSq+')"><span>리뷰 수정</span></button></div> ';
+					}
+					html += '			<div><button type="button" id="btn_review_delete" class="btn btn_default" onclick="fnDeleteReview('+item.reviewSq+')"><span>리뷰 삭제</span></button></div> ';
+					html += '		</div>';
+					html += '	</div>';
+				});
+				
+				$('#reviewList').append(html);
 			}else{
 				$('#nodata2').show();
 			}
 		});
 	
-	})
+	});
+	// 리뷰 수정
+	var fnReviewUpdate = function(obj1,obj2,obj3) {
+		let ordNo = obj1;
+		let ordDtlNo = obj2;
+		let goodsCd = obj3;
+		let reviewStat = 'u';
+		
+		$('#createReview input[name=ordNo]').val(ordNo);
+		$('#createReview input[name=ordDtlNo]').val(ordDtlNo);
+		$('#createReview input[name=goodsCd]').val(goodsCd);
+		$('#createReview input[name=reviewStat]').val(reviewStat);
+		
+		document.createReview.submit();
+		// cfnGoToPage(_PAGE_MYPAGE_CREATE_REVIEW + ordNo +'/'+ordDtlNo+'/'+goodsCd+'/'+reviewStat);
+	}
+	
+	// 리뷰삭제
+	var fnDeleteReview = function(obj) {
+		var data = {reviewSq : obj};
+				
+		var jsonData = JSON.stringify(data);
+
+		mcxDialog.confirm("작성한 리뷰를 삭제하시겠습니까?", {
+			cancelBtnText : "취소",
+			sureBtnText : "확인",
+			sureBtnClick : function() {
+
+				gagajf.ajaxJsonSubmit('/mypage/review/delete', jsonData, function(e) {
+					mcxDialog.alert("삭제되었습니다.");
+					$("#alrReview").text("("+e.alreadyReviewCount+")");
+					$("#comReview").text("("+e.completeReviewCount+")");
+					$("#alreadyReview").trigger('click');	
+				});
+			}
+		});
+	}
+	
 /*]]>*/
  
  $(document).ready(function() {

+ 86 - 54
src/main/webapp/WEB-INF/views/mob/mypage/MypageWishListFormMob.html

@@ -32,14 +32,9 @@
 let month = [[${wishMonth}]];
 
 var wishlistDelete = function(obj) {
-	mcxDialog.confirm("위시리스트를 해제하시겠습니까?", {
-		cancelBtnText : "취소",
-		sureBtnText : "확인",
-		sureBtnClick : function() {
-			cfnPutWishList(obj);
-			ajaxWishList();
-		}
-	});
+	cfnPutWishList(obj);
+
+	ajaxWishList();
 }	
 //마이페이지 위시리스트 
 var ajaxWishList = function () {
@@ -47,56 +42,93 @@ var ajaxWishList = function () {
 		if (status == 'success') {
 			$('#wishList').html('');
 			html = '';
-			for (var i = 0; i < month.length; i++) {
-				html += '<div class="monthly_wish_wrap">\n';
-				html += '	<div class="date">\n';
-				html += '		<span>'+month[i].regDt+'</span>\n';
-				html += '	</div>\n';
-				html += '	<div class="itemsGrp">\n';
-				
-				$.each(result, function (idx, item) {
-					if (item.regDtMonth == month[i].regDt) {
-						html += '		<div class="item_prod">\n';
-						html += '			<div class="item_state">\n';
-						html += '				<button type="button" class="itemLike likeit" goodsCd="'+item.goodsCd+'" onclick="wishlistDelete(this)">관심상품 추가</button>\n';
-						html += '				<a href="javascript:void(0);" class="itemLink" onclick="cfnGoToGoodsDetail('+item.goodsCd+')">\n';
-						html += '					<div class="itemPic">\n';
-						html += '						<img class="vLHTC pd_img"  src="' + _uploadGoodsUrl + '/' + item.sysImgNm + '">\n';
-						html += '					</div>\n';
-						html += '					<p class="itemBrand">'+item.brandGroupNm+'</p>\n';
-						html += '					<div class="itemName">'+item.goodsNm+'</div>\n';
-						html += '					<p class="itemPrice">\n';
-						
-						if (item.currPrice != item.listPrice) {
-							html+='						<span class="itemPrice_original">'+item.listPrice.addComma()+'</span>\n';
-						}
-						html += item.currPrice.addComma();
-						if (item.dcRate>0) {
-							html+='						<span class=" itemPercent">'+item.dcRate+'%</span>\n';
+			if (result.length>0) {
+				for (var i = 0; i < month.length; i++) {
+					html += '<div class="monthly_wish_wrap">\n';
+					html += '	<div class="date">\n';
+					html += '		<span>'+month[i].regDt+'</span>\n';
+					html += '	</div>\n';
+					html += '	<div class="itemsGrp">\n';
+					
+					$.each(result, function (idx, item) {
+						if (item.regDtMonth == month[i].regDt) {
+							html += '		<div class="item_prod">\n';
+							html += '			<div class="item_state">\n';
+							html += '				<button type="button" class="itemLike active likeit" goodsCd=\''+item.goodsCd+'\' onclick="wishlistDelete(this)">관심상품 추가</button>\n';
+							html += '				<a href="javascript:void(0);" class="itemLink" onclick="cfnGoToGoodsDetail(\'' + item.goodsCd + '\')">\n';
+							html += '					<div class="itemPic">\n';
+							html += '						<img class="vLHTC pd_img"  src="' + _uploadGoodsUrl + '/' + item.sysImgNm + '">\n';
+							html += '					</div>\n';
+							html += '					<p class="itemBrand">'+item.brandGroupNm+'</p>\n';
+							html += '					<div class="itemName">'+item.goodsNm+'</div>\n';
+							html += '					<p class="itemPrice">\n';
+							
+							if (item.currPrice != item.listPrice) {
+								html+='						<span class="itemPrice_original">'+item.listPrice.addComma()+'</span>\n';
+							}
+							html += item.currPrice.addComma();
+							if (item.dcRate>0) {
+								html+='						<span class=" itemPercent">'+item.dcRate+'%</span>\n';
+							}
+							html += '					</p>\n';
+							html += '					<div class="itemcolorchip">\n';
+							if(!gagajf.isNull(item.colorChips)){
+								var colorArr = item.colorChips.split(",");
+								var colorCd = '';
+								var rgbColor = '';
+								for(let i=0; i<colorArr.length; i++){
+									var colorInfo = colorArr[i].split(":");
+									colorCd = colorInfo[0];
+									rgbColor = colorInfo[1];
+									if(rgbColor=='#FFFFFF'){
+										html += '	<span class="chip_color" style="background-color: '+rgbColor+';border:1px solid #aaa;" value="'+colorCd+'">'+colorCd+'</span>';
+									}else{
+										html += '	<span class="chip_color" style="background-color: '+rgbColor+'" value="'+colorCd+'">'+colorCd+'</span>';
+									}
+								}
+							}
+							html += '					</div>\n';
+							if(!gagajf.isNull(item.icon)){
+								var iconArr = item.icon.split(",");
+								var iconGb = '';
+								var iconNm = '';
+								html += '	<p class="itemBadge">';
+								for(let i=0; i<iconArr.length; i++){
+									var iconInfo = iconArr[i].split(":");
+									iconGb = iconInfo[0];
+									iconNm = iconInfo[1];
+									html += '	<span class="badge13" value="'+iconGb+'">'+iconNm+' </span>';
+								}
+								html += '	</p>';
+							}
+							if (item.goodsTnm != null && item.goodsTnm != '') {
+								html+='					<div class="itemComment">'+item.goodsTnm+'</div>\n';
+							}
+							html += '				</a>\n';
+							html += '			</div>\n';
+							html += '		</div>\n';
+							
 						}
-						html += '					</p>\n';
-						html += '					<div class="itemcolorchip">\n';
-						html += '						<span class="chip_color35" value="ABM">BEIGE</span>\n';
-						html += '						<span class="chip_color54" value="BDS">BLACK</span>\n';
-						html += '						<span class="chip_color40" value="YBR">WHITE</span>\n';
-						html += '					</div>\n';
-						html += '					<p class="itemBadge">\n';
-						html += '						<span class="badge13">베스트 </span>\n';
-						html += '					</p>\n';
-						if (item.goodsTnm != null && item.goodsTnm != '') {
-							html+='					<div class="itemComment">'+item.goodsTnm+'</div>\n';
-						}
-						html += '				</a>\n';
-						html += '			</div>\n';
-						html += '		</div>\n';
-						
-					}
-				});
+					});
+					
+					html += '	</div>\n';
+					html += '</div>\n';
+					$('#wishList').html(html);
+				}
+			}
+			else{
+				html += ' <div class="nodata">';
+				html += '	<div class="txt_box">';
+				html += '		<p>';
+				html += '			등록된 위시리스트가 없습니다.<br>';
+				html += '			';
+				html += '		</p>';
+				html += '	</div>';
+				html += '</div>';
 				
-				html += '	</div>\n';
-				html += '</div>\n';
 				$('#wishList').html(html);
 			}
+			
 		}
 	});
 }

+ 2 - 2
src/main/webapp/WEB-INF/views/web/callcenter/GoodsQnaFormWeb.html

@@ -120,7 +120,7 @@
 				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 class="prod">' + item.goodsNm + ' ' + item.relGoodsCd + '</span>\n';
-				tag += '					<span>' + item.questContent + '</span>\n';
+				tag += '					<span>' + item.questContent.escapeHtml() + '</span>\n';
 				tag += '				</div>\n';
 				tag += '				<span class="data">' + item.questDt + '</span>\n';
 				tag += '			</div>\n';
@@ -129,7 +129,7 @@
 				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 += '				<p>' + item.questContent.escapeHtml() + '</p>\n';
 				tag += '			</div>\n';
 				
 				if (item.ansStat == 'G060_20') { // 답변완료일 때

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

@@ -120,7 +120,7 @@
 				tag += '	</div>\n';
 				tag += '	<div class="fold_cont" style="display: none;">\n';
 				tag += '		<div class="fold_detail">\n';
-				tag += '			<div>' + item.noticeContent + '</div>\n';
+				tag += '			<div>' + item.noticeContent.escapeHtml() + '</div>\n';
 				tag += '		</div>\n';
 				tag += '	</div>\n';
 				tag += '</li>\n';

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

@@ -192,7 +192,7 @@
 				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 += '				<p>' + item.questContent.escapeHtml() + '</p>\n';
 				
 				if (!gagajf.isNull(item.sysFileNm1) || !gagajf.isNull(item.sysFileNm2)) {
 					tag += '				<p class="img_group">\n';

+ 6 - 0
src/main/webapp/WEB-INF/views/web/cart/CartListAjaxFormWeb.html

@@ -36,6 +36,12 @@
 									<div>
 										<input type="radio" name="shotDelvUseYn" id="blt_ship1" value="Y" th:checked="${order.shotDelvUseYn != null and order.shotDelvUseYn.equals('Y') and order.shotCartList.size() > 0}">
 										<label for="blt_ship1"><span><em class="tag primary_line">총알배송</em><span th:text="|${order.shotDelvDt}일 24:00 까지 도착|"></span></span></label>
+										<div class="tip_wrap tip1">
+											<div class="tip_tit">?</div>
+											<div class="tip_contents">
+												<p class="tip_txt"></p><ul><li>총알배송 가능 지역인 경우에만 적용됩니다.</li></ul><p></p>
+											</div>
+										</div>
 									</div>
 									<div>
 										<input type="radio" name="shotDelvUseYn" id="blt_ship2" value="N" th:checked="${order.shotDelvUseYn == null or !order.shotDelvUseYn.equals('Y') or order.shotCartList.size() < 1}">

+ 1 - 1
src/main/webapp/WEB-INF/views/web/cart/CartListFormWeb.html

@@ -310,7 +310,7 @@
 
 		// 다다익선 정보
 		let qtyTmtbSq = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=qtyTmtbSq]").val();
-		let amtTmtbSq = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=qtyTmtbSq]").val();
+		let amtTmtbSq = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=amtTmtbSq]").val();
 		let qtyTmtbYn = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=applyQtySectionYn]").val();
 		let amtTmtbYn = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=applyAmtSectionYn]").val();
 		let goodsCd = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=goodsCd]").val();

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

@@ -603,7 +603,7 @@
 								</li>
 							</ul> -->
 						</div>
-						<a href="javascript:void(0);" class="more_btn" onclick="cfnGoToPage(_PAGE_EVENT_MAIN);">더 보기</a>_
+						<a href="javascript:void(0);" class="more_btn" onclick="cfnGoToPage(_PAGE_EVENT_MAIN);">더 보기</a>
 					</div>
 					
 					<div id="coupon_type02" class="coupon_area">
@@ -1280,7 +1280,7 @@
 									
 									tag += '				</p>';
 									tag += '			</div>';
-									tag += '			<button type="button" class="btn btn_dark btn_block btn_coupon_down" onclick="fnQuickCouponDown('+item.cpnId+')"><span>쿠폰받기</span></button>';
+									tag += '			<button type="button" id="coupon_'+item.cpnId+'" class="btn btn_dark btn_block btn_coupon_down" onclick="fnQuickCouponDown('+item.cpnId+')"><span>쿠폰받기</span></button>';
 									tag += '		</div>';
 									tag += '	</li>';
 								});
@@ -1356,9 +1356,19 @@
 	// 쿠폰다운로드 콜백
 	var fnQuickCouponCallBack = function(result){
 		if (result.status == "200"){
-			//mcxDialog.alert(result.message);
+			let list = result.couonList;
+
+			list.forEach(function(coupon){
+				if (Number(coupon.custPubLimitQty) > 0){
+					if (Number(coupon.custPubLimitQty) <= Number(coupon.custCouponCnt)){
+						$('#coupon_'+ coupon.cpnId).html('<span>받기완료</span>');
+						$('#coupon_'+ coupon.cpnId).attr('disabled', true);
+					}
+				}
+			});
+			
 		}			
-		issueCouponBtn();
+		//issueCouponBtn();
 		
 	}
 

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

@@ -110,7 +110,7 @@
 				<!-- 프로모션 문구 노출 검색용-->
 				<div class="area">
 					<p class="promotion_search">모이몰론, 남들보다 빠르게! 신상 check</p>
-					<button type="button" class="btn_sch_promotion" id="btnGnbSearch"><i class="ico ico_search"><em>프로모션 검색 바로가기</em></i></button>
+					<button type="button" class="btn_sch_promotion" id="btnGnbSearch" onclick="cfSearchLayer();"><i class="ico ico_search"><em>프로모션 검색 바로가기</em></i></button>
 				</div>
 				<!-- //프로모션 문구 노출 검색용-->
 				<!-- 통합검색 -->
@@ -817,10 +817,10 @@
 		});
 	}
 
-	$('#btnGnbSearch').on('click', function() {
-		//검색창 호출
-		$(".common_search").addClass('active');
-	});
+	// $('#btnGnbSearch').on('click', function() {
+	// 	//검색창 호출
+	// 	$(".common_search").addClass('active');
+	// });
 
 	// 띠배너 닫기(쿠키설정)
 	let fnGnbTobBannerClose = function(unexpDays){

+ 12 - 1
src/main/webapp/WEB-INF/views/web/common/layout/MypageLayoutWeb.html

@@ -56,13 +56,24 @@
 <div class="modal fade exchange_pop" id="exchangePop" tabindex="-1" role="dialog" aria-labelledby="exchangeLabel" aria-hidden="true">
 	<div class="modal-dialog" role="document">
 		<div class="modal-content">
-			<!--교환상품 옵션변경 팝업 내용 -->
+			<!-- 교환상품 옵션변경 팝업 내용 -->
 		</div>
 	</div>
 	<a href="#close-modal" rel="modal:close" id="exchangePop_close" class="close-modal">Close</a>
 </div>
 <!-- //교환상품 옵션변경 팝업 -->
 
+<!-- 회수조회 팝업 -->
+<div class="modal fade reclaim_pop" id="reclaimPop" tabindex="-1" role="dialog" aria-labelledby="reclaimLabel" aria-hidden="true" style="display: none;">
+	<div class="modal-dialog" role="document">
+		<div class="modal-content">
+			<!-- 회수조회 팝업 내용 -->
+		</div>
+	</div>
+	<a href="#close-modal" rel="modal:close" id="reclaimPop_close" class="close-modal">Close</a>
+</div>
+<!-- //회수조회 팝업 -->
+
 <th:block th:replace="~{web/common/fragments/ScriptsWeb :: scripts}"></th:block>
 <script th:src="@{'/biz/mypage.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/mypage.js"></script>
 

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

@@ -127,7 +127,7 @@
 
 				<!-- 가로 긴 배너 슬라이드 -->
 				<!-- 브랜드 배너 -->
-				<th:block th:if="${contentsLoc=='006' || contentsLoc=='014'||contentsLoc=='015'||contentsLoc=='016}">
+				<th:block th:if="${contentsLoc=='006' || contentsLoc=='014'||contentsLoc=='015'||contentsLoc=='016'}">
 					<div class="content wide main_1stage">
 						<div class="cont_head dpnone">
 							<p class="t_c">배너 슬라이드</p>

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

@@ -79,7 +79,7 @@
 									<div>
 										<input id="unisex" type="checkbox" onclick="fnFilterOption(this,'on');"><label for="unisex"> <span>남여 공용만 보기</span> </label>
 									</div>
-									<div>
+									<div th:unless="${cateInfo.formalGb=='G009_20'}">
 										<input id="newGoods" type="checkbox" onclick="fnFilterOption(this,'off');" checked="checked"><label for="newGoods"> <span>신상품만 보기</span> </label>
 									</div>
 								</div>
@@ -293,7 +293,7 @@
 		<input type="hidden" name="cate3No" th:value="${cateInfo.cate3No}"/>
 		<input type="hidden" name="cate4No" th:value="${cateInfo.cate4No}"/>
 		<input type="hidden" name="sortingType" value="NEW"/>
-		<input type="hidden" name="newGoods" value="40"/>
+		<input type="hidden" name="newGoods" th:value="${cateInfo.formalGb=='G009_20'?'':'40'}" />
 	</form>
 
 	<script src="/ux/plugins/gaga/gaga.infinite.scrollSession.js"></script>
@@ -532,8 +532,8 @@
 								navNm += '<li class="bread_2depth" id="navNm">아울렛</li><li class="bread_2depth" id="navNm1">전체</li>';
 							}else{
 								$("#navNm").hide();
-								$('#ulAllCate').append('<li><a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\''+cateGb+'\');">전체</a></li>\n');
-								navNm += '<li class="bread_2depth" id="navNm1">전체</li>';
+								// $('#ulAllCate').append('<li><a href="javascript:void(0);" onclick="cfnGoToGoodsList(0,\''+cateGb+'\');">전체</a></li>\n');
+								// navNm += '<li class="bread_2depth" id="navNm1">전체</li>';
 							}
 						}
 

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

@@ -67,7 +67,7 @@
 									<li>
 										<p><img src="/images/pc/ico_content_none.png" alt="등록된 이벤트가 없습니다."></p>
 										<span>등록된 룩북이 없습니다.</span>
-										<a href="javascript:void(0);" th:unless="${lbInfo.lookbookGb=='BL'}" onclick="cfnGoToPage(_PAGE_MAIN);">메인으로 가기</a>
+										<a href="javascript:void(0);" th:unless="${lbInfo.lookbookGb=='BL'}" onclick="cfnGoToPage(_PAGE_MAIN);">으로 가기</a>
 										<a href="javascript:void(0);" th:if="${lbInfo.lookbookGb=='BL'}" th:onclick="cfnGoToBrandMain([[${lbInfo.brandCd}]]);" th:text="${brandGroupInfo.brandGroupNm+' 홈으로 가기'}"></a>
 									</li>
 								</ul>

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

@@ -1,356 +1,412 @@
 <!DOCTYPE html>
 <html lang="ko"
-	xmlns:th="http://www.thymeleaf.org"
-	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
-	layout:decorator="web/common/layout/DefaultLayoutWeb">
+	xmlns:th="http://www.thymeleaf.org">
 <!--
  *******************************************************************************
- * @source  : LookbookDetailFormWeb.html
- * @desc    : 룩북 상세 Page
+ * @source  : SearchLayerWeb.html
+ * @desc    : 검색 레이어 Page
  *============================================================================
  * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION
  * ===  ===========  ==========  =============================================
- * 1.0  2021.04.06   bin2107     최초 작성
+ * 1.0  2021.05.11   bin2107     최초 작성
  *******************************************************************************
  -->
-<body>
-
-<th:block layout:fragment="content">
-	<div id="container" class="container br">
-		<div class="breadcrumb">
-			<ul>
-				<li class="bread_home"><a href="index.html">홈</a></li>
-				<li class="bread_2depth" th:text="${lookbookInfo.brandNm}">TBJ</li>
-				<li class="bread_3depth">룩북</li>
-			</ul>
-		</div>
-		<div class="wrap">
-			<div class="content br_lookbook_view cont_visual" th:if="${lookbookDetailList != null}"> <!-- 페이지특정 클래스 = br_lookbook_view -->
-				<div class="cont_head">
-					<h3 class="displayH t_c" th:text="${lookbookInfo.title}">2020 F/W COLLECTION</h3>
+<h2 class="sr-only">통합검색</h2>
+<div class="cont_search">
+	<div class="area_input">
+		<form id="searchMainForm" name="searchMainForm">
+			<fieldset>
+				<legend>통합검색</legend>
+				<input type="text" id="search" name="search" value="" placeholder="검색어를 입력하세요sss." class="search_input" title="검색어 입력" maxlength="100">
+				<button type="button" class="sch_btn"><i class="ico ico_search"><em>검색</em></i></button>
+			</fieldset>
+		</form>
+	</div>
+	<div class="area_result">
+		<!-- 검색결과 입력 전 -->
+		<div class="default_box">
+			<div class="recent_blk">
+				<h3>최근 검색어</h3>
+				<!-- 최근검색어 있을 시 노출 -->
+				<div class="list_recent_keword" style="display: none;">
+					<ul>
+						<li>
+							<a href="">슬랙스</a>
+							<button type="button" class="btn_delete"><span>삭제</span></button>
+						</li>
+					</ul>
 				</div>
-				<div class="cont_body">
-					<div class="area_slider">
-						<div class="swiper-container">
-							<div class="swiper-wrapper">
-								<th:block th:each="item, stat : ${lookbookDetailList}">
-									<div class="swiper-slide">
-										<div class="bt_lb_item">
-											<img class="vLHTC lb_img" th:src="${@environment.getProperty('domain.image')+item.sysFileNm}" alt="BLUE-a" />
-											<th:block th:if="${item.lookbookGoodsList != null and !item.lookbookGoodsList.empty}" th:each="goodsItem, goodsStatus : ${item.lookbookGoodsList}">
-												<div class="item_picker" th:style="${'left:'+goodsItem.xlim+'%; top:'+goodsItem.ylim+'%;'}">
-													<button type="button" th:onclick="fnLookbookGoodsPopup([[${goodsItem.sysImgNm}]],[[${goodsItem.brandGroupNm}]],[[${goodsItem.goodsNm}]],[[${goodsItem.listPrice}]],[[${goodsItem.currPrice}]],[[${goodsItem.dcRate}]],[[${goodsItem.goodsCd}]])"><span class="ico ico_picker"></span></button>
-												</div>
-											</th:block>
-										</div>
-									</div>
-								</th:block>
-							</div>
-							<div class="swiper-button-prev"></div>
-							<div class="swiper-button-next"></div>
-						</div>
-					</div>
-					<!--<th:block th:each="item, stat : ${lookbookDetailList}">
-					<div class="text_cont" th:text="${item.imgDesc}">
-						국내 대표 패션기업 한세엠케이의 스타일리시 어반 캐주얼 브랜드 앤듀(ANDEW)가 중성적이고 시크한 감각을 극대화한 2020 F/W 시즌 룩북을 공개했다.<br>
-						앤듀는 올 하반기 정소현, 안재형, 고웅호 등 글로벌 런웨이 무대에서 활약중인 전문 패션 모델들과 함께 성별의 경계를 뛰어넘어 개개인의 개성을 드러내는 젠더뉴트럴 패션을 앤듀만의 감각으로 새롭게 전개한다. 중성적인 매력을 자아내는 3명의 모델들은 각자의 개성과 매력을 뽐내며 세련미를 더한 젠더리스 감성을 한층 더 완성도 있게 소화해 눈길을 끈다. 공개된 룩북에서는 따뜻하고 부드러운 파스텔톤, 차분한 모노크롬 컬러로 극명하게 상반된 분위기를  연출하며 각기 다른 유니섹스 스타일을 선보였다. 격식을 갖추되 포멀하진 않게 자연스럽게 떨어지는 핏과 힙한 디자인을 통해 앤듀만의 젠더뉴트럴 캐주얼룩을 연출한 것. 또한, 이번 시즌에도 패션업계에 불고 있는 ‘필(必)환경’  트렌드에 따라 그린슈머들을 사로잡을 다양한 친환경적인 제품들을 주력으로 출시하며 지속가능한 패션을 실천할 계획이다. 버려진 페트병이나 플라스틱을 활용해 친환경 재생 섬유인 리사이클 페트(PET)원사로 의상을 제작하고, 동물친화적 비건 소재를 활용해 가치소비가 가능할 수 있도록 구성했다.
-					</div>
-					</th:block>-->
-					<div class="text_cont">
-						국내 대표 패션기업 한세엠케이의 스타일리시 어반 캐주얼 브랜드 앤듀(ANDEW)가 중성적이고 시크한 감각을 극대화한 2020 F/W 시즌 룩북을 공개했다.<br>
-						앤듀는 올 하반기 정소현, 안재형, 고웅호 등 글로벌 런웨이 무대에서 활약중인 전문 패션 모델들과 함께 성별의 경계를 뛰어넘어 개개인의 개성을 드러내는 젠더뉴트럴 패션을 앤듀만의 감각으로 새롭게 전개한다. 중성적인 매력을 자아내는 3명의 모델들은 각자의 개성과 매력을 뽐내며 세련미를 더한 젠더리스 감성을 한층 더 완성도 있게 소화해 눈길을 끈다. 공개된 룩북에서는 따뜻하고 부드러운 파스텔톤, 차분한 모노크롬 컬러로 극명하게 상반된 분위기를  연출하며 각기 다른 유니섹스 스타일을 선보였다. 격식을 갖추되 포멀하진 않게 자연스럽게 떨어지는 핏과 힙한 디자인을 통해 앤듀만의 젠더뉴트럴 캐주얼룩을 연출한 것. 또한, 이번 시즌에도 패션업계에 불고 있는 ‘필(必)환경’  트렌드에 따라 그린슈머들을 사로잡을 다양한 친환경적인 제품들을 주력으로 출시하며 지속가능한 패션을 실천할 계획이다. 버려진 페트병이나 플라스틱을 활용해 친환경 재생 섬유인 리사이클 페트(PET)원사로 의상을 제작하고, 동물친화적 비건 소재를 활용해 가치소비가 가능할 수 있도록 구성했다.
-					</div>
+				<button type="button" class="btn_underline"  style="display: none;"><span>전체삭제</span></button>
+				<!-- //최근검색어 있을 시 노출 -->
+				<!-- 최근검색어 없을 시 노출 -->
+				<div class="empty_txt" style="display: block;">
+					최근 검색어가 없습니다.
 				</div>
+				<!-- //최근검색어 없을 시 노출 -->
 			</div>
-			<div class="content br_lookbook_view cont_items" th:if="${lookbookDetailList != null}">
-
-				<div class="cont_head">
-					<h3>룩북 속 상품<span class="number">(9,999)</span></h3>
-					<button class="btn btn_primary"><span>모두 쇼핑백 담기</span></button>
+			<div class="popular_blk">
+				<h3>STYLE24에서 검색되고 있어요</h3>
+				<div class="list_popular_keword">
+					<ul id="popularKeyArea">
+<!--						<li>-->
+<!--							<a href="">BUCKAROO</a>-->
+<!--						</li>-->
+<!--						<li>-->
+<!--							<a href="">기모청바지</a>-->
+<!--						</li>-->
+					</ul>
 				</div>
-				<div class="cont_body">
-					<div class="area_slider">
-						<div class="swiper-container">
-							<div class="swiper-wrapper">
-								<div class="swiper-slide">
-									<div class="item_prod">
-										<div class="item_state">
-											<a href="#none" class="itemLink">
-												<div class="itemPic">
-													<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
-												</div>
-												<p class="itemBrand">BRAND NAME1</p>
-												<div class="itemName">남성 로고 자카드 방풍 패딩</div>
-												<p class="itemPrice">80,100
-													<span class="itemPrice_original">89,000</span>
-													<span class="itemPercent">10%</span>
-												</p>
-											</a>
-										</div>
-									</div>
-								</div>
-								<div class="swiper-slide">
-									<div class="item_prod">
-										<div class="item_state">
-											<a href="#none" class="itemLink">
-												<div class="itemPic">
-													<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
-												</div>
-												<p class="itemBrand">BRAND NAME1</p>
-												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
-												<p class="itemPrice">80,100
-													<span class="itemPrice_original">89,000</span>
-													<span class="itemPercent">10%</span>
-												</p>
-											</a>
-										</div>
-									</div>
-								</div>
-								<div class="swiper-slide">
-									<div class="item_prod">
-										<div class="item_state">
-											<a href="#none" class="itemLink">
-												<div class="itemPic">
-													<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
-												</div>
-												<p class="itemBrand">BRAND NAME1</p>
-												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
-												<p class="itemPrice">80,100
-													<span class="itemPrice_original">89,000</span>
-													<span class="itemPercent">10%</span>
-												</p>
-											</a>
-										</div>
-									</div>
-								</div>
-								<div class="swiper-slide">
-									<div class="item_prod">
-										<div class="item_state">
-											<a href="#none" class="itemLink">
-												<div class="itemPic">
-													<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
-												</div>
-												<p class="itemBrand">BRAND NAME1</p>
-												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
-												<p class="itemPrice">80,100
-													<span class="itemPrice_original">89,000</span>
-													<span class="itemPercent">10%</span>
-												</p>
-											</a>
-										</div>
-									</div>
-								</div>
-								<div class="swiper-slide">
-									<div class="item_prod">
-										<div class="item_state">
-											<a href="#none" class="itemLink">
-												<div class="itemPic">
-													<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
-												</div>
-												<p class="itemBrand">BRAND NAME1</p>
-												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
-												<p class="itemPrice">80,100
-													<span class="itemPrice_original">89,000</span>
-													<span class="itemPercent">10%</span>
-												</p>
-											</a>
-										</div>
+			</div>
+			<div class="realtime_blk">
+				<h3>지금 고객님들이 많이 보고 있어요</h3>
+				<div class="modify_timer">
+					<button type="button"><span><em class="time">17:30</em> 기준</span></button>
+				</div>
+				<div class="realtime_wrap">
+					<div class="itemsGrp">
+						<div class="item_prod">
+							<div class="item_state">
+								<a href="#none" class="itemLink">
+									<div class="itemPic">
+										<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
 									</div>
-								</div>
-								<div class="swiper-slide">
-									<div class="item_prod">
-										<div class="item_state">
-											<a href="#none" class="itemLink">
-												<div class="itemPic">
-													<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
-												</div>
-												<p class="itemBrand">BRAND NAME1</p>
-												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
-												<p class="itemPrice">80,100
-													<span class="itemPrice_original">89,000</span>
-													<span class="itemPercent">10%</span>
-												</p>
-											</a>
-										</div>
+									<div class="itemName">남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩</div>
+									<div class="viewCount"><span>508</span>명 보는중</div>
+								</a>
+							</div>
+						</div>
+						<div class="item_prod">
+							<div class="item_state">
+								<a href="#none" class="itemLink">
+									<div class="itemPic">
+										<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
 									</div>
-								</div>
-								<div class="swiper-slide">
-									<div class="item_prod">
-										<div class="item_state">
-											<a href="#none" class="itemLink">
-												<div class="itemPic">
-													<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
-												</div>
-												<p class="itemBrand">BRAND NAME1</p>
-												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
-												<p class="itemPrice">80,100
-													<span class="itemPrice_original">89,000</span>
-													<span class="itemPercent">10%</span>
-												</p>
-											</a>
-										</div>
+									<div class="itemName">남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩</div>
+									<div class="viewCount"><span>508</span>명 보는중</div>
+								</a>
+							</div>
+						</div>
+						<div class="item_prod">
+							<div class="item_state">
+								<a href="#none" class="itemLink">
+									<div class="itemPic">
+										<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
 									</div>
-								</div>
-								<div class="swiper-slide">
-									<div class="item_prod">
-										<div class="item_state">
-											<a href="#none" class="itemLink">
-												<div class="itemPic">
-													<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
-												</div>
-												<p class="itemBrand">BRAND NAME1</p>
-												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
-												<p class="itemPrice">80,100
-													<span class="itemPrice_original">89,000</span>
-													<span class="itemPercent">10%</span>
-												</p>
-											</a>
-										</div>
+									<div class="itemName">남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩</div>
+									<div class="viewCount"><span>508</span>명 보는중</div>
+								</a>
+							</div>
+						</div>
+						<div class="item_prod">
+							<div class="item_state">
+								<a href="#none" class="itemLink">
+									<div class="itemPic">
+										<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
 									</div>
-								</div>
+									<div class="itemName">남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩</div>
+									<div class="viewCount"><span>508</span>명 보는중</div>
+								</a>
 							</div>
-							<!-- Add Scrollbar -->
-							<div class="swiper-scrollbar"></div>
 						</div>
-					</div>
-				</div>
-			</div>
-			<div class="content br_lookbook_view cont_others" th:if="${otherLookbookList}">
-				<div class="cont_head">
-					<h3 class="subH1 t_c mb40">다른 룩북 보기</h3>
-					<button onclick="cfnGoToLookbookList();"><span>전체보기</span></button>
-				</div>
-				<div class="cont_body">
-					<div class="area_slider">
-						<div class="swiper-container">
-							<div class="swiper-wrapper">
-								<th:block th:if="${otherLookbookList}" th:each="oneData, status : ${otherLookbookList}">
-									<div class="swiper-slide">
-										<a th:href="|javascript:cfnGoToLookbookDetail('${oneData.lookbookSq}','${oneData.brandCd}')|">
-											<div class="thumb">
-												<img th:src="${@environment.getProperty('domain.image')+oneData.sysFileNm}" alt="" style="height:307px;">
-											</div>
-											<div class="txt">
-												<p class="title" th:text="${oneData.title}">2020 F/W COLLECTION 2020</p>
-											</div>
-										</a>
+						<div class="item_prod">
+							<div class="item_state">
+								<a href="#none" class="itemLink">
+									<div class="itemPic">
+										<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg">
 									</div>
-								</th:block>
+									<div class="itemName">남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩 남성 로고 자카드 방풍 패딩</div>
+									<div class="viewCount"><span>508</span>명 보는중</div>
+								</a>
 							</div>
 						</div>
-						<!-- Add Arrows -->
-						<div class="swiper-button-next"></div>
-						<div class="swiper-button-prev"></div>
 					</div>
 				</div>
 			</div>
 		</div>
-	</div>
-
-	<!-- 상단_LOOKBOOK_picker_상품_팝업 -->
-	<div class="modal fade br_pop lookbook_item_pop" id="lookbookItemPop" tabindex="-1" role="dialog" aria-labelledby="lookbook_item_label" aria-hidden="true">
-		<div class="modal-dialog" role="document">
-			<div class="modal-content">
-				<div class="modal-header">
-					<h5 class="modal-title sr-only" id="lookbook_item_label">상품정보</h5>
+		<!-- //검색결과 입력 전 -->
+		<!-- 검색결과 입력 후 -->
+		<div class="searching_box" style="display:none;">
+			<div class="autokeyword_blk">
+				<ul>
+					<li><a href=""><em>가</em>을컬리수</a></li>
+					<li><a href=""><em>가</em>드상하</a></li>
+					<li><a href=""><em>가</em>죽자켓</a></li>
+					<li><a href=""><em>가</em>죽밸트</a></li>
+					<li><a href=""><em>가</em>운</a></li>
+					<li><a href=""><em>가</em>을</a></li>
+					<li><a href=""><em>가</em>디건</a></li>
+					<li><a href=""><em>가</em>디건형니트</a></li>
+					<li><a href=""><em>가</em>드밴드레깅스</a></li>
+					<li><a href=""><em>가</em>을잠옷</a></li>
+				</ul>
+			</div>
+			<div class="exfind_blk">
+				<!-- 검색어 매칭 브랜드 있을 시 노출  -->
+				<div class="find_brand">
+					<h3><a href="">나이키 주니어 샵 바로가기</a></h3>
+				</div>
+				<!-- //검색어 매칭 브랜드 있을 시 노출  -->
+				<!-- 검색어 매칭 카테고리 있을 시 노출  -->
+				<div class="find_category">
+					<ul>
+						<li>
+							<span class="category_txt">카테고리</span>
+							<a href="">
+								<span>여성</span>
+								<span><em>니트가디건/베스트</em></span> <!-- 210419_수정 : em태그 전체 텍스트 감싸는 형식. -->
+							</a>
+						</li>
+						<li>
+							<span class="category_txt">카테고리</span>
+							<a href="">
+								<span>남성</span>
+								<span><em>니트/가디건/베스트</em></span> <!-- 210419_수정 : em태그 전체 텍스트 감싸는 형식. -->
+								<span>가디건</span>
+								<span>롱가디건</span>
+							</a>
+						</li>
+					</ul>
 				</div>
-				<div class="modal-body">
+				<!-- //검색어 매칭 카테고리 있을 시 노출  -->
+			</div>
+
+			<div class="pd_list relate">
+				<h3>관련상품</h3>
+				<div class="realtime_wrap">
 					<div class="itemsGrp">
 						<div class="item_prod">
 							<div class="item_state">
-								<div class="itemLink">
+								<a href="#none" class="itemLink">
 									<div class="itemPic">
-										<img alt="BLACK-a" class=" vLHTC pd_img" src="/images/pc/thumb/ev_list_img05.jpg">
+										<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdLookbook_item1.jpg">
 									</div>
-									<p class="itemBrand">BRAND NAME</p>
-									<div class="itemName">[온라인 단독] 여성 니트 후드 경량 다운 점퍼 여성 니트 후드 경량 다운 점퍼 여성 니트 후드 경량 다운 점퍼</div>
-									<span class="itemPrice_original">89,000</span>
-									<p class="itemPrice">80,100
+									<p class="itemBrand">BRAND NAME1</p>
+									<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+									<!-- cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+									<p class="itemPrice cols">
+										<span class="itemPrice_original">89,000</span>
+										80,100
 										<span class="itemPercent">10%</span>
 									</p>
-									<button type="button" class="btn btn_default"><span>자세히 보기</span></button>
-								</div>
+									<!-- //cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+								</a>
 							</div>
 						</div>
+						<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_pdLookbook_item1.jpg">
+									</div>
+									<p class="itemBrand">BRAND NAME1</p>
+									<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+									<!-- cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+									<p class="itemPrice cols">
+										<span class="itemPrice_original">89,000</span>
+										80,100
+										<span class="itemPercent">10%</span>
+									</p>
+									<!-- //cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+								</a>
+							</div>
+						</div>
+						<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_pdLookbook_item1.jpg">
+									</div>
+									<p class="itemBrand">BRAND NAME1</p>
+									<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+									<!-- cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+									<p class="itemPrice cols">
+										<span class="itemPrice_original">89,000</span>
+										80,100
+										<span class="itemPercent">10%</span>
+									</p>
+									<!-- //cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+								</a>
+							</div>
+						</div>
+						<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_pdLookbook_item1.jpg">
+									</div>
+									<p class="itemBrand">BRAND NAME1</p>
+									<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+									<!-- cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+									<p class="itemPrice cols">
+										<span class="itemPrice_original">89,000</span>
+										80,100
+										<span class="itemPercent">10%</span>
+									</p>
+									<!-- //cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+								</a>
+							</div>
+						</div>
+						<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_pdLookbook_item1.jpg">
+									</div>
+									<p class="itemBrand">BRAND NAME1</p>
+									<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+									<!-- cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+									<p class="itemPrice cols">
+										<span class="itemPrice_original">89,000</span>
+										80,100
+										<span class="itemPercent">10%</span>
+									</p>
+									<!-- //cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+								</a>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<!-- //검색결과 입력 후 -->
+
+		<!-- 검색결과 없을때 노출 -->
+		<div class="empty_box">
+			<div class="nodata">
+				<p>
+					<span class="keyword">'티비제이 제기장 스웨터'</span>에 맞는 상품을 찾지 못했습니다.<br>
+					검색어를 변경해 보세요.
+				</p>
+			</div>
+			<div class="pd_list recommend">
+				<h3>이런 상품은 어떤가요?</h3>
+				<div class="itemsGrp">
+					<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_pdLookbook_item1.jpg">
+								</div>
+								<p class="itemBrand">BRAND NAME1</p>
+								<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+								<!-- cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+								<p class="itemPrice cols">
+									<span class="itemPrice_original">89,000</span>
+									80,100
+									<span class="itemPercent">10%</span>
+								</p>
+								<!-- //cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+							</a>
+						</div>
+					</div>
+					<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_pdLookbook_item1.jpg">
+								</div>
+								<p class="itemBrand">BRAND NAME1</p>
+								<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+								<!-- cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+								<p class="itemPrice cols">
+									<span class="itemPrice_original">89,000</span>
+									80,100
+									<span class="itemPercent">10%</span>
+								</p>
+								<!-- //cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+							</a>
+						</div>
+					</div>
+					<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_pdLookbook_item1.jpg">
+								</div>
+								<p class="itemBrand">BRAND NAME1</p>
+								<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+								<!-- cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+								<p class="itemPrice cols">
+									<span class="itemPrice_original">89,000</span>
+									80,100
+									<span class="itemPercent">10%</span>
+								</p>
+								<!-- //cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+							</a>
+						</div>
+					</div>
+					<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_pdLookbook_item1.jpg">
+								</div>
+								<p class="itemBrand">BRAND NAME1</p>
+								<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+								<!-- cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+								<p class="itemPrice cols">
+									<span class="itemPrice_original">89,000</span>
+									80,100
+									<span class="itemPercent">10%</span>
+								</p>
+								<!-- //cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+							</a>
+						</div>
+					</div>
+					<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_pdLookbook_item1.jpg">
+								</div>
+								<p class="itemBrand">BRAND NAME1</p>
+								<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+								<!-- cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+								<p class="itemPrice cols">
+									<span class="itemPrice_original">89,000</span>
+									80,100
+									<span class="itemPercent">10%</span>
+								</p>
+								<!-- //cols 클래스 추가 후 itemPrice_original태그 위로 올려주시면 됩니다. -->
+							</a>
+						</div>
 					</div>
 				</div>
 			</div>
 		</div>
+		<!-- //검색결과 없을때 노출 -->
 	</div>
-	<!-- //상단_LOOKBOOK_picker_상품_팝업 -->
+</div>
+<button type="button" class="btn_close_search" onclick="fnClose();"><span>닫기</span></button>
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	var trendKeywordList = [[${trendKeywordList.trendList}]];
 
-	<script th:inline="javascript">
-/*<![CDATA[*/
-	var fnTest = function (){
-		console.log('18');
+	var fnClose = function (){
+		$("#layer_search").removeClass('active');
 	}
-	var goodsImgUrl = [[${@environment.getProperty('upload.goods.view')}]];
-	var fnLookbookGoodsPopup = function(obj1,obj2,obj3,obj4,obj5,obj6,obj7){
-	$("#lookbookItemPop").modal("show");
-	$("#lookbookItemPop").find(".pd_img").attr('src',goodsImgUrl+'/'+obj1);
-	$("#lookbookItemPop").find(".itemBrand").text(obj2);
-	$("#lookbookItemPop").find(".itemName").text(obj3);
-	$("#lookbookItemPop").find(".itemPrice_original").text(obj4);
-	$("#lookbookItemPop").find(".itemPrice").text(obj5);
-	$("#lookbookItemPop").find(".itemPercent").text(obj6+'%');
-	$("#lookbookItemPop").find(".btn_default").attr('onclick','cfnGoToPage(_PAGE_GOODS_DETAIL+"'+obj7+'");');
-}
-	// 컨텐츠 호출
-	$(document).ready( function() {
-		/* 슬라이드 - 상단_LOOKBOOK */
-		var lookbook_visual_slide = new Swiper('.br_lookbook_view.cont_visual .swiper-container', {
-			loop: true,
-			slidesPerView: 'auto',
-			spaceBetween: 20,
-			speed : 800,
-			autoWidth: true,
-			autoHeight: true,
-			centeredSlides: true,
-			autoplay: false,
-			navigation: {
-				nextEl: '.br_lookbook_view.cont_visual .swiper-button-next',
-				prevEl: '.br_lookbook_view.cont_visual .swiper-button-prev',
-			},
-			pagination: {
-				el: '.br_lookbook_view.cont_visual .swiper-pagination',
-				clickable: true,
-			},
-		}, fnTest());
-
-		/* 슬라이드 - 룩북 속 상품 */
-		var togetherItemSwiper = new Swiper('.br_lookbook_view.cont_items .swiper-container', {
-			slidesPerView: 6,
-			spaceBetween: 20,
-			scrollbar: {
-				el: '.br_lookbook_view.cont_items .swiper-scrollbar',
-				hide: true,
-			},
-		});
 
+	$(document).ready( function() {
+		$("#layer_search").addClass('active');
 
-		var br_ohter_slide = new Swiper('.br_lookbook_view.cont_others .swiper-container', {
-			slidesPerView: 5,
-			spaceBetween: 20,
-			navigation: {
-				nextEl: '.br_lookbook_view.cont_others .swiper-button-next',
-				prevEl: '.br_lookbook_view.cont_others .swiper-button-prev',
-			},
-		});
+		if(trendKeywordList.length > 0){
+			$("#popularKeyArea").html('');
+			trendKeywordList.forEach(function (item, index){
+				var tag = '';
+				if(index<10){
+					tag += '<li>';
+					tag += '	<a href="">'+ item.keyword +'</a>';
+					tag += '</li>';
+				}
+				$("#popularKeyArea").append(tag);
+			});
+		}
 
-		// 슬라이드 - 상단_LOOKBOOK > picker - 룩북_피커_상품정보 팝업
-		$(document).on('click','#btn_picker_item01',function(e){
-			$("#lookbookItemPop").modal("show");
-			return false;
-		});
 	});
-
-/*]]>*/
+	/*]]>*/
 </script>
-
-</th:block>
-
-</body>
-</html>
+</html>

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

@@ -43,7 +43,7 @@
 											</th:block>
 											<th:block th:unless="${cardInfo.dcGb == '3'}">
 											<p th:text="${#numbers.formatInteger(cardInfo.dcVal, 0,'COMMA')+ cardInfo.dcWayNm + ' ' + cardInfo.prmtGbNm}">5% 즉시할인</p>
-											<p th:text="${cardInfo.minPayAmt + '원 이상 구매 시 최대 ' + #numbers.formatInteger(cardInfo.maxDcAmt, 0,'COMMA') + '원 할인 '}">7만원 이상 구매 시 최대 5만원 할인</p>
+											<p th:text="${#numbers.formatInteger(cardInfo.minPayAmt, 0,'COMMA') + '원 이상 구매 시 최대 ' + #numbers.formatInteger(cardInfo.maxDcAmt, 0,'COMMA') + '원 할인 '}">7만원 이상 구매 시 최대 5만원 할인</p>
 											</th:block>
 											
 										</div>

+ 31 - 10
src/main/webapp/WEB-INF/views/web/goods/GoodsDealDescFormWeb.html

@@ -179,19 +179,36 @@
 			</div>
 			</th:block>
 		</div>
-		<div class="area_kcl" th:if="${goodsSafeNo != null}">
+		
+		<th:block th:if="${goodsSafeNo != null}" >
+			<th:block th:if="${goodsSafeNo.certTargetGb == 'G083_3'}" >  <!-- 상세별도표시 -->
+		<div class="area_kcl no-mark">
+			<p class="tit normal"><th:block th:if="${goodsSafeNo.certFormNm}" th:text="${goodsSafeNo.certFormNm + '/'}"></th:block> 제품 상세정보 내 별도 표기</p>
+			<p class="normal">제품 상세정보 내 표기되어 있습니다. 상품 정보를 확인해주세요.</p>
+			<p class="t_info dot_info">해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.</p>
+		</div>	
+			</th:block>
+			<th:block th:unless="${goodsSafeNo.certTargetGb == 'G083_3'}" > <!-- 인증 -->
+				<th:block th:if="${goodsSafeNo.certType == 'G081_3'}" > <!-- 공급자적합성 -->
+		<div class="area_kcl">
 			<i class="ico ico_kcl"></i>
-			<th:block th:if="${not #strings.contains(goodsSafeNo.certNum, '해당')}" >
-			<p class="tit normal"  th:text="${goodsSafeNo.certDiv + ' / ' + goodsSafeNo.certOrganName}">
-				어린이제품 안전인증 / 한국건설생활시험연구원(KCL)
-			</p>
+			<p class="tit normal"><th:block th:text="${goodsSafeNo.certFormNm}"></th:block> / 공급자적합성확인</p>
+			<p class="normal">공급자 적합성 확인 품목으로 국가통합인증을 필함</p>
+			<p class="t_info dot_info">해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.</p>
+		</div>
+				</th:block>
+				<th:block th:unless="${goodsSafeNo.certType == 'G081_3'}" > <!-- 공급자적합성 외 -->
+		<div class="area_kcl" >
+			<i class="ico ico_kcl"></i>
+			<th:block th:if="${goodsSafeNo.certFormGb != 'G084_4' and  goodsSafeNo.certFormGb != 'G084_5' }">
+			<p class="tit normal" th:text="${goodsSafeNo.certDiv + ' / ' + goodsSafeNo.certOrganName}">어린이제품 안전인증 / 한국건설생활시험연구원(KCL)</p>
+			</th:block>
+			<th:block th:unless="${goodsSafeNo.certFormGb != 'G084_4' and  goodsSafeNo.certFormGb != 'G084_5' }">
+			<p class="tit normal" th:text="${goodsSafeNo.certFormNm + ' 안전인증'}"></p>
 			</th:block>
 			<p class="normal" >
-				<th:block th:if="${#strings.contains(goodsSafeNo.certNum, '해당')}" >
-				해당 없음 
-				</th:block>
-				<th:block th:unless="${#strings.contains(goodsSafeNo.certNum, '해당')}" >
-				인증번호: <th:block th:text="${goodsSafeNo.certNum}"></th:block>
+				<th:block th:if="${goodsSafeNo.certNum}" th:text="${'인증번호: ' + goodsSafeNo.certNum}"></th:block>
+				<th:block th:if="${goodsSafeNo.certFormGb != 'G084_4' and  goodsSafeNo.certFormGb != 'G084_5' }">
 				<a th:href="@{http://www.safetykorea.kr/search/searchPop(certNum=${goodsSafeNo.certNum})}" target="_blank" class="linktxt3">상세보기</a>
 				</th:block>
 			</p>
@@ -199,6 +216,10 @@
 				해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.
 			</p>
 		</div>
+				</th:block>
+			</th:block>
+		</th:block>
+		
 		<div class="area_infotbl">
 			<span class="title">상품기본정보</span>
 			<div class="tbl type1 mt30">

+ 76 - 38
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -453,30 +453,33 @@
 										}
 
 										function buy_nc_req(cartSqArr) {
-											alert(cartSqArr.length);
-											// buyList[0].backUrl = location.href;
+											let data = {  cartSqArr : cartSqArr
+														, backUrl : location.href
+														, goodsUrl : _PAGE_GOODS_DETAIL
+											};
+											let jsonData = JSON.stringify(data);
 
 											$.ajax( {
 												type		: "POST",
 												url 		: "/pg/nPayReq",
 												dataType 	: 'json',
-												data		: {cartSqArr : JSON.stringify(cartSqArr)},
+												data		: jsonData,
 												beforeSend : function(xhr, settings) {
 													xhr.setRequestHeader("AJAX"			, "true");
 													xhr.setRequestHeader('Accept'		, 'application/json');
 													xhr.setRequestHeader('Content-Type'	, 'application/json');
 												},
 												error: function(xhr, status, error) {
-													alert(status + '; ' + error);
+													mcxDialog.alert(status + '; ' + error);
 												},
 												success : function(result) {
 													if (result.state == "sucess") {
 														window.open('about:blank', 'popupView');
 														document.nPayForm.target = 'popupView';
-														document.nPayForm.action = "$!{NPAY_ORDER_URL}" + result.orderKey + "/" + result.resultNo;
+														document.nPayForm.action = result.npayOrderUrl + "/" + result.orderKey + "/" + result.resultNo;
 														document.nPayForm.submit();
 													} else {
-														alert(result.message);
+														mcxDialog.alert(result.message);
 													}
 												}
 											});
@@ -759,19 +762,35 @@
 						</div>
 						</th:block>
 					</div>
-					<div class="area_kcl" th:if="${goodsInfo.goodsType == 'G056_N' and goodsSafeNo != null}">
+					<th:block th:if="${goodsInfo.goodsType == 'G056_N' and goodsSafeNo != null}" >
+						<th:block th:if="${goodsSafeNo.certTargetGb == 'G083_3'}" >  <!-- 상세별도표시 -->
+					<div class="area_kcl no-mark">
+						<p class="tit normal"><th:block th:if="${goodsSafeNo.certFormNm}" th:text="${goodsSafeNo.certFormNm + '/'}"></th:block> 제품 상세정보 내 별도 표기</p>
+						<p class="normal">제품 상세정보 내 표기되어 있습니다. 상품 정보를 확인해주세요.</p>
+						<p class="t_info dot_info">해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.</p>
+					</div>	
+						</th:block>
+						<th:block th:unless="${goodsSafeNo.certTargetGb == 'G083_3'}" > <!-- 인증 -->
+							<th:block th:if="${goodsSafeNo.certType == 'G081_3'}" > <!-- 공급자적합성 -->
+					<div class="area_kcl">
 						<i class="ico ico_kcl"></i>
-						<th:block th:if="${not #strings.contains(goodsSafeNo.certNum, '해당')}" >
-						<p class="tit normal" th:text="${goodsSafeNo.certDiv + ' / ' + goodsSafeNo.certOrganName}">
-							어린이제품 안전인증 / 한국건설생활시험연구원(KCL)
-						</p>
+						<p class="tit normal"><th:block th:text="${goodsSafeNo.certFormNm}"></th:block> / 공급자적합성확인</p>
+						<p class="normal">공급자 적합성 확인 품목으로 국가통합인증을 필함</p>
+						<p class="t_info dot_info">해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.</p>
+					</div>
+							</th:block>
+							<th:block th:unless="${goodsSafeNo.certType == 'G081_3'}" > <!-- 공급자적합성 외 -->
+					<div class="area_kcl" >
+						<i class="ico ico_kcl"></i>
+						<th:block th:if="${goodsSafeNo.certFormGb != 'G084_4' and  goodsSafeNo.certFormGb != 'G084_5' }">
+						<p class="tit normal" th:text="${goodsSafeNo.certDiv + ' / ' + goodsSafeNo.certOrganName}">어린이제품 안전인증 / 한국건설생활시험연구원(KCL)</p>
+						</th:block>
+						<th:block th:unless="${goodsSafeNo.certFormGb != 'G084_4' and  goodsSafeNo.certFormGb != 'G084_5' }">
+						<p class="tit normal" th:text="${goodsSafeNo.certFormNm + ' 안전인증'}"></p>
 						</th:block>
 						<p class="normal" >
-							<th:block th:if="${#strings.contains(goodsSafeNo.certNum, '해당')}" >
-							해당 없음 
-							</th:block>
-							<th:block th:unless="${#strings.contains(goodsSafeNo.certNum, '해당')}" >
-							인증번호: <th:block th:text="${goodsSafeNo.certNum}"></th:block>
+							<th:block th:if="${goodsSafeNo.certNum}" th:text="${'인증번호: ' + goodsSafeNo.certNum}"></th:block>
+							<th:block th:if="${goodsSafeNo.certFormGb != 'G084_4' and  goodsSafeNo.certFormGb != 'G084_5' }">
 							<a th:href="@{http://www.safetykorea.kr/search/searchPop(certNum=${goodsSafeNo.certNum})}" target="_blank" class="linktxt3">상세보기</a>
 							</th:block>
 						</p>
@@ -779,30 +798,51 @@
 							해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.
 						</p>
 					</div>
+							</th:block>
+						</th:block>
+					</th:block>
+					
 					<th:block th:if="${goodsInfo.goodsType == 'G056_S'}">
 					<th:block th:each="goodsCompose, status : ${goodsComposeList}">
-					<th:block th:if="${goodsCompose.goodsSafeNo != null}">
+						<th:block th:if="${goodsCompose.goodsSafeNo != null}">
+							<th:block th:if="${goodsCompose.goodsSafeNo.certTargetGb == 'G083_3'}" >  <!-- 상세별도표시 -->
+						<div class="area_kcl no-mark">
+							<p class="tit normal"><th:block th:if="${goodsCompose.goodsSafeNo.certFormNm}" th:text="${goodsCompose.goodsSafeNo.certFormNm + '/'}"></th:block> 제품 상세정보 내 별도 표기</p>
+							<p class="normal">제품 상세정보 내 표기되어 있습니다. 상품 정보를 확인해주세요.</p>
+							<p class="t_info dot_info">해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.</p>
+						</div>	
+							</th:block>
+							<th:block th:unless="${goodsCompose.goodsSafeNo.certTargetGb == 'G083_3'}" > <!-- 인증 -->
+								<th:block th:if="${goodsCompose.goodsSafeNo.certType == 'G081_3'}" > <!-- 공급자적합성 -->
+						<div class="area_kcl">
+							<i class="ico ico_kcl"></i>
+							<p class="tit normal"><th:block th:text="${goodsCompose.goodsSafeNo.certFormNm}"></th:block> / 공급자적합성확인</p>
+							<p class="normal">공급자 적합성 확인 품목으로 국가통합인증을 필함</p>
+							<p class="t_info dot_info">해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.</p>
+						</div>
+								</th:block>
+								<th:block th:unless="${goodsCompose.goodsSafeNo.certType == 'G081_3'}" > <!-- 공급자적합성 외 -->
 						<div class="area_kcl" >
-						<i class="ico ico_kcl"></i>
-						<th:block th:if="${not #strings.contains(goodsCompose.goodsSafeNo.certNum, '해당')}" >
-						<p class="tit normal" th:text="${goodsCompose.goodsSafeNo.certDiv + ' / ' + goodsCompose.goodsSafeNo.certOrganName}">
-							어린이제품 안전인증 / 한국건설생활시험연구원(KCL)
-						</p>
-						</th:block>
-						<p class="normal" >
-							<th:block th:if="${#strings.contains(goodsCompose.goodsSafeNo.certNum, '해당')}" >
-							해당 없음 
+							<i class="ico ico_kcl"></i>
+							<th:block th:if="${goodsCompose.goodsSafeNo.certFormGb != 'G084_4' and  goodsCompose.goodsSafeNo.certFormGb != 'G084_5' }">
+							<p class="tit normal" th:text="${goodsCompose.goodsSafeNo.certDiv + ' / ' + goodsCompose.goodsSafeNo.certOrganName}">어린이제품 안전인증 / 한국건설생활시험연구원(KCL)</p>
 							</th:block>
-							<th:block th:unless="${#strings.contains(goodsCompose.goodsSafeNo.certNum, '해당')}" >
-							인증번호: <th:block th:text="${goodsCompose.goodsSafeNo.certNum}"></th:block>
-							<a th:href="@{http://www.safetykorea.kr/search/searchPop(certNum=${goodsCompose.goodsSafeNo.certNum})}" target="_blank" class="linktxt3">상세보기</a>
+							<th:block th:unless="${goodsCompose.goodsSafeNo.certFormGb != 'G084_4' and  goodsCompose.goodsSafeNo.certFormGb != 'G084_5' }">
+							<p class="tit normal" th:text="${goodsCompose.goodsSafeNo.certFormNm + ' 안전인증'}"></p>
 							</th:block>
-						</p>
-						<p class="t_info dot_info">
-							해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.
-						</p>
-					</div>
-					</th:block>
+							<p class="normal" >
+								<th:block th:if="${goodsCompose.goodsSafeNo.certNum}" th:text="${'인goodsCompose.증번호: ' + goodsSafeNo.certNum}"></th:block>
+								<th:block th:if="${goodsCompose.goodsSafeNo.certFormGb != 'G084_4' and  goodsCompose.goodsSafeNo.certFormGb != 'G084_5' }">
+								<a th:href="@{http://www.safetykorea.kr/search/searchPop(certNum=${goodsCompose.goodsSafeNo.certNum})}" target="_blank" class="linktxt3">상세보기</a>
+								</th:block>
+							</p>
+							<p class="t_info dot_info">
+								해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.
+							</p>
+						</div>
+								</th:block>
+							</th:block>
+						</th:block>
 					</th:block>
 					</th:block>
 					<div class="area_infotbl">
@@ -1617,8 +1657,6 @@
 		
 		$('.timer_box').css('display', 'none');
 		
-		
-		
 		//공유 버튼 토글 
 		$("button[data-name=openShare]").on("click", function(){
 			$(this).toggleClass("on").next(".shareWrap").toggleClass("on");
@@ -1962,7 +2000,7 @@
      window.onload = function(){
     	 $(".pd_descrp .cont_body").find('img').each(function() {
  			let tmpImgSrc = $(this).attr('src');
- 			if (tmpImgSrc.indexOf('Upload') == 1 ){  // /Upload
+ 			if (tmpImgSrc.indexOf('/Upload') == 0 ){  // /Upload
  				$(this).attr('src' , tmpImgSrc.replace('/Upload', _imgUrl+"/Local"));
  			}
  			

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

@@ -102,7 +102,7 @@
 				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';
+				tag += '					<span>' + item.questContent.escapeHtml() + '</span>\n';
 				if (item.selfGb == 1){
 				tag += '					<i class="ico ico_myqna"></i>\n';	//내가 쓴 글에 추가되는 아이콘
 				}
@@ -120,7 +120,7 @@
 				tag += '	<div class="fold_cont" style="display: none;">\n';
 				tag += '		<div class="fold_detail">\n'; //문의 내용
 				tag += '			<div>\n';
-				tag += '				<p>' + item.questContent.replaceAll("\n", "</br>") + '</p>\n';
+				tag += '				<p>' + item.questContent.replaceAll("\n", "</br>").escapeHtml() + '</p>\n';
 				tag += '			</div>\n';
 				tag += '		</div>\n';
 				

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

@@ -72,11 +72,9 @@
 					$.each(review.reviewAttachList, function(aIdx, reviewAttach){
 						fileGbClass = '';
 						if (reviewAttach.fileGb == "M") fileGbClass = "mov";
-				tag +='		<span class="thumb" class="'+fileGbClass+'">\n';<!-- 동영상의 썸네일일 경우 mov 클래스 추가-->
+				tag +='		<span class="thumb '+fileGbClass+'">\n';<!-- 동영상의 썸네일일 경우 mov 클래스 추가-->
 						if (reviewAttach.fileGb == "M") {
-				tag +='			<video poster="http://cdn.011st.com/11dims/resize/1999x1999/quality/75/11src/review/10201202/3121412332/2e66698576d64c5c9977a6fe6606008d.jpg" muted="muted" preload="metadata" controls="controls">\n';
-				tag +='				<source src="http://snsvideo.11st.co.kr/movie/item/www/675/67518524_06_1_C1.mp4" type="video/mp4">\n';
-				tag +='			</video>\n';
+				tag +='			<iframe width="100%" height="100%" src="'+_kollusMediaUrl +'/'+reviewAttach.kmcKey +'?player_version=html5" frameborder="0" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>\n';
 						}else{
 				tag +='			<img src="'+ _imgUrl + reviewAttach.sysFileNm +'" alt="">\n';	
 						}
@@ -197,7 +195,11 @@
 				tag +='			<li>\n';
 				tag +='				<div class="pic '+activeClass+'"> \n'; <!-- 활성화시 active 클래스 추가 -->
 				tag +='					<span class="thumb" class="'+fileGbClass+'" style="background-image:url('+ _imgUrl + reviewAttach.sysFileNm +');\" >\n';<!-- 동영상의 썸네일일 경우 mov 클래스 추가 -->
-				tag +='					<img src="'+ _imgUrl + reviewAttach.sysFileNm +'" alt="">\n';
+					if (reviewAttach.fileGb == "M") {
+				tag +='					<iframe width="100%" height="100%" src="'+_kollusMediaUrl +'/'+reviewAttach.kmcKey +'?player_version=html5" frameborder="0" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>\n';
+					}else{
+				tag +='					<img src="'+ _imgUrl + reviewAttach.sysFileNm +'" alt="">\n';	
+					}
 				tag +='					</span>\n';
 				tag +='				</div>\n';
 				tag +='			</li>\n';

+ 1 - 6
src/main/webapp/WEB-INF/views/web/mypage/MypageCreExchangeDetailFormWeb.html

@@ -218,7 +218,7 @@
 										<th>회수 정보</th>
 										<td>
 											<th:block th:text="|${oneData.shipCompNm} / ${oneData.wdInvoiceNo}|"></th:block>
-											<button type="button" class="btn btn_default btn_sm" onclick="fnGoToWithdrawDelivery()"><span>회수조회</span></button>
+											<button type="button" class="btn btn_default btn_sm" th:attr="shipCompCd=${oneData.shipCompCd}, wdInvoiceNo=${oneData.wdInvoiceNo}" onclick="fnGoToWithdrawDelivery()"><span>회수조회</span></button>
 										</td>
 									</tr>
 								</tbody>
@@ -410,11 +410,6 @@
 			}
 		});
 	}
-
-	var fnGoToWithdrawDelivery = function(param) {
-		// TODO
-		// 회수조회 페이지 이동
-	}
 /*]]>*/
 </script>
 

+ 1 - 6
src/main/webapp/WEB-INF/views/web/mypage/MypageCreReturnDetailFormWeb.html

@@ -175,7 +175,7 @@
 										<th>회수 정보</th>
 										<td>
 											<th:block th:text="|${oneData.shipCompNm} / ${oneData.wdInvoiceNo}|"></th:block>
-											<button type="button" class="btn btn_default btn_sm" onclick="fnGoToWithdrawDelivery()"><span>회수조회</span></button>
+											<button type="button" class="btn btn_default btn_sm" th:if="${not #strings.isEmpty(oneData.shipCompCd) and not #strings.isEmpty(oneData.wdInvoiceNo)}" th:attr="shipCompCd=${oneData.shipCompCd}, wdInvoiceNo=${oneData.wdInvoiceNo}" onclick="fnGoToWithdrawDelivery()"><span>회수조회</span></button>
 										</td>
 									</tr>
 								</tbody>
@@ -284,11 +284,6 @@
 		fnSetMypageLocation('취소/반품/교환 내역', '_PAGE_MYPAGE_CRE_LIST', '반품 상세');
 	});
 
-	var fnGoToWithdrawDelivery = function(param) {
-		// TODO
-		// 회수조회 페이지 이동
-	}
-
 	// 회수지 정보 설정
 	var delvAddrSet = function(delvObj) {
 		let ordChgSq = oneData.ordChgSq;

+ 15 - 17
src/main/webapp/WEB-INF/views/web/mypage/MypageDeliveryInfoFormWeb.html

@@ -265,8 +265,8 @@
 									<td>
 										<div class="single_line">
 											<ul>
-												<li><span th:text="${deliveryAddrInfo.recipNm}">홍길동</span></li>
-												<li><span th:text="${deliveryAddrInfo.recipPhnno}">010-3456-7890</span></li>
+												<li><span th:text="${deliveryAddrInfo.recipNm}"></span></li>
+												<li><span th:text="${deliveryAddrInfo.recipPhnno}"></span></li>
 											</ul>
 										</div>
 									</td>
@@ -281,9 +281,7 @@
 								</tr>
 								<tr>
 									<th>배송 주소</th>
-									<td th:text="|${deliveryAddrInfo.recipBaseAddr} ${deliveryAddrInfo.recipDtlAddr}|">
-										경기도 시흥시 서울대학2로, 1120동 2204호
-									</td>
+									<td th:text="|${deliveryAddrInfo.recipBaseAddr} ${deliveryAddrInfo.recipDtlAddr}|"></td>
 								</tr>
 							</tbody>
 						</table>
@@ -297,20 +295,20 @@
 								<col width="25%">
 							</colgroup>
 							<thead>
-							<tr>
-								<th scope="col">시간</th>
-								<th scope="col">장소</th>
-								<th scope="col">유형</th>
-								<th scope="col">전화번호</th>
-							</tr>
+								<tr>
+									<th scope="col">시간</th>
+									<th scope="col">장소</th>
+									<th scope="col">유형</th>
+									<th scope="col">전화번호</th>
+								</tr>
 							</thead>
 							<tbody>
-							<tr th:if="${sweetTrackerInfoList}" th:each="sweetTrackerInfo, status : ${sweetTrackerInfoList}">
-								<td th:text="${sweetTrackerInfo.timeTrans}"></td>
-								<td th:text="${sweetTrackerInfo.delvWhere}"></td>
-								<td th:text="${sweetTrackerInfo.details}"></td>
-								<td th:text="${sweetTrackerInfo.telno}"></td>
-							</tr>
+								<tr th:if="${sweetTrackerInfoList}" th:each="sweetTrackerInfo, status : ${sweetTrackerInfoList}">
+									<td th:text="${sweetTrackerInfo.timeTrans}"></td>
+									<td th:text="${sweetTrackerInfo.delvWhere}"></td>
+									<td th:text="${sweetTrackerInfo.details}"></td>
+									<td th:text="${sweetTrackerInfo.telno}"></td>
+								</tr>
 							</tbody>
 						</table>
 					</div>

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

@@ -333,9 +333,7 @@
 										<th>
 											선물 메세지
 										</th>
-										<!-- TODO -->
-										<!-- 선물 메세지 처리 -->
-										<td></td>
+										<td th:text="${orderInfo.giftMsg}" id="giftMsg"></td>
 									</tr>
 									<!-- 주문 -->
 									<tr th:unless="${oneData.giftPackYn == 'Y'}">
@@ -506,6 +504,7 @@
 	let orderAmtInfo = [[${orderAmtInfo}]];
 	let deliveryAddrInfo = [[${deliveryAddrInfo}]];
 	let kcpReceiptUrl = [[${@environment.getProperty('pg.kcp.receipt.url')}]];
+	let giftMsg = [[${orderInfo.giftMsg}]];
 	let jsonObj = {};
 
 	$(document).ready(function() {
@@ -514,6 +513,11 @@
 		
 		// 마이페이지 location 설정
 		fnSetMypageLocation('주문확인/배송조회', '_PAGE_MYPAGE_ORDER_LIST', '주문상세');
+
+		// 선물메시지
+		if ($("#giftMsg").html() != null) {
+			$("#giftMsg").html(giftMsg.replaceAll("\n", "</br>"));
+		}
 	});
 	
 	// 전체취소 버튼 클릭 이벤트

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

@@ -383,6 +383,7 @@ let reviewList = [[${reviewInfo}]];
 let reviewStat = [[${reviewStat}]];
 let reviewAttach = [[${alreadyReviewAttach}]];
 let reviewUrl =[[${@environment.getProperty('upload.image.view')}]];
+
 // 별점 class="on"
 var $starEls = $('#star button#starBtn');
 var rate = 0;
@@ -641,7 +642,7 @@ $(document).ready(function() {
 		 rating(reviewScore);
 		$("#reviewForm input[name=height]").val(reviewList.height);
 		$("#reviewForm input[name=weight]").val(reviewList.weight);
-		$("#reviewForm textarea[name=reviewContent]").val(reviewList.reviewContent);
+		$("#reviewForm textarea[name=reviewContent]").val(reviewList.reviewContent.escapeHtml());
 		if(reviewList.scoreSize == "1"){
 			$('#reviewForm input:radio[name=scoreSize]:radio[value="1"]').prop('checked', true);
 		}else if(reviewList.scoreSize == "2"){
@@ -702,8 +703,9 @@ $(document).ready(function() {
 								"</span>").insertAfter("#fileAdd");
 					}else{
 						$("<span class=\"pics\">" +
-								"<img class=\"picsThumbs\" src=\"" + _kollusMediaUrl + '/' + attachList[i].kmcKey + "\" />" +
-								"<input type='hidden' name='kufKeyArr' value='" + attachList[i].kmcKey + "'>" + 
+								"<img class=\"picsThumbs\" />" +
+								"<input type='hidden' name='kmcKeyArr' value='" + reviewAttach[i].kmcKey + "'>" + 
+								"<input type='hidden' name='kufKeyArr' value='" + reviewAttach[i].kufKey + "'>" + 
 								"<br/><span class=\"removes\">Removes image</span>" +
 								"</span>").insertAfter("#fileAdd");
 					}

+ 16 - 7
src/main/webapp/WEB-INF/views/web/mypage/MypageReviewDetailFormWeb.html

@@ -187,13 +187,22 @@
 						}
 						fileGbClass = '';
 						if (reviewAttach.fileGb == "M") fileGbClass = "mov";
-				tag +='			<li>\n';
-				tag +='				<div class="pic '+activeClass+'"> \n'; <!-- 활성화시 active 클래스 추가 -->
-				tag +='					<span class="thumb" class="'+fileGbClass+'" style="background-image:url('+ _imgUrl + reviewAttach.sysFileNm +');\" >\n';<!-- 동영상의 썸네일일 경우 mov 클래스 추가 -->
-				tag +='					<img src="'+ _imgUrl + reviewAttach.sysFileNm +'" alt="">\n';
-				tag +='					</span>\n';
-				tag +='				</div>\n';
-				tag +='			</li>\n';
+						if (reviewAttach.fileGb == "M") {
+							tag +='			<li>\n';
+							tag +='				<div class="pic '+activeClass+'"> \n'; <!-- 활성화시 active 클래스 추가 -->
+							tag +='							<span class="thumb '+ fileGbClass +'"><iframe width="100%" height="100%" src="'+_kollusMediaUrl +'/'+reviewAttach.kmcKey +'?player_version=html5" frameborder="0" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></span>\n';
+							tag +='				</div>\n';
+							tag +='			</li>\n';
+						}else{
+							tag +='			<li>\n';
+							tag +='				<div class="pic '+activeClass+'"> \n'; <!-- 활성화시 active 클래스 추가 -->
+							tag +='					<span class="thumb" class="'+fileGbClass+'" style="background-image:url('+ _imgUrl + reviewAttach.sysFileNm +');\" >\n';<!-- 동영상의 썸네일일 경우 mov 클래스 추가 -->
+							tag +='					<img src="'+ _imgUrl + reviewAttach.sysFileNm +'" alt="">\n';
+							tag +='					</span>\n';
+							tag +='				</div>\n';
+							tag +='			</li>\n';
+						}
+				
 					});
 				tag +='		</ul>\n';
 				tag +='	</div>\n';

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

@@ -334,7 +334,7 @@
 					
 				}
 				html+='						<div class="txt_review_box"  id="admin_'+item.reviewSq+'">';
-				html+='							<p>'+item.reviewContent+'</p>';
+				html+='							<p>'+item.reviewContent.escapeHtml()+'</p>';
 				html+='						</div>';
 				
 				if (item.admRpl != null && item.admRpl != '') {
@@ -345,7 +345,7 @@
 					html+='									<span class="wr_date">'+item.admRplDt+'</span>';
 					html+='								</div>';
 					html+='								<div class="reply_txt">';
-					html+='									<p>'+item.admRpl+'</p>';
+					html+='									<p>'+item.admRpl.escapeHtml()+'</p>';
 					html+='								</div>';
 					html+='							</div>';
 					html+='						</div>';

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

@@ -76,7 +76,7 @@ var ajaxWishList = function () {
 						if (item.regDtMonth == month[i].regDt) {
 							html+='		<div class="item_prod">';
 							html+='			<div class="item_state">';
-							html+='				<button type="button" class="itemLike active" goodsCd="'+item.goodsCd+'" onclick="wishlistDelete(this)">관심상품 추가</button>';
+							html+='				<button type="button" class="itemLike active" goodsCd=\''+item.goodsCd+'\' onclick="wishlistDelete(this)">관심상품 추가</button>';
 							html+='				<a href="javascript:void(0);" class="itemLink" onclick="cfnGoToGoodsDetail(\'' + item.goodsCd + '\')">';
 							html+='					<div class="itemPic">';
 							html+='						<img alt="" class=" vLHTC pd_img" src="' + _uploadGoodsUrl + '/' + item.sysImgNm + '">';

+ 1 - 6
src/main/webapp/WEB-INF/views/web/mypage/NoMemberCreExchangeDetailFormWeb.html

@@ -215,7 +215,7 @@
 										<th>회수 정보</th>
 										<td>
 											<th:block th:text="|${oneData.shipCompNm} / ${oneData.wdInvoiceNo}|"></th:block>
-											<button type="button" class="btn btn_default btn_sm" onclick="fnGoToWithdrawDelivery()"><span>회수조회</span></button>
+											<button type="button" class="btn btn_default btn_sm" th:if="${not #strings.isEmpty(oneData.shipCompCd) and not #strings.isEmpty(oneData.wdInvoiceNo)}" th:attr="shipCompCd=${oneData.shipCompCd}, wdInvoiceNo=${oneData.wdInvoiceNo}" onclick="fnGoToWithdrawDelivery()"><span>회수조회</span></button>
 										</td>
 									</tr>
 								</tbody>
@@ -407,11 +407,6 @@
 			}
 		});
 	}
-
-	var fnGoToWithdrawDelivery = function(param) {
-		// TODO
-		// 회수조회 페이지 이동
-	}
 /*]]>*/
 </script>
 

+ 1 - 6
src/main/webapp/WEB-INF/views/web/mypage/NoMemberCreReturnDetailFormWeb.html

@@ -173,7 +173,7 @@
 										<th>회수 정보</th>
 										<td>
 											<th:block th:text="|${oneData.shipCompNm} / ${oneData.wdInvoiceNo}|"></th:block>
-											<button type="button" class="btn btn_default btn_sm" onclick="fnGoToWithdrawDelivery()"><span>회수조회</span></button>
+											<button type="button" class="btn btn_default btn_sm" th:if="${not #strings.isEmpty(oneData.shipCompCd) and not #strings.isEmpty(oneData.wdInvoiceNo)}" th:attr="shipCompCd=${oneData.shipCompCd}, wdInvoiceNo=${oneData.wdInvoiceNo}" onclick="fnGoToWithdrawDelivery()"><span>회수조회</span></button>
 										</td>
 									</tr>
 								</tbody>
@@ -282,11 +282,6 @@
 		fnSetNoMemberLocation('취소/반품/교환 내역', '반품 상세');
 	});
 
-	var fnGoToWithdrawDelivery = function(param) {
-		// TODO
-		// 회수조회 페이지 이동
-	}
-
 	// 회수지 정보 설정
 	var delvAddrSet = function(delvObj) {
 		let ordChgSq = oneData.ordChgSq;

+ 12 - 17
src/main/webapp/WEB-INF/views/web/planning/PlanningCustGradeBenefitFormWeb.html

@@ -277,9 +277,8 @@
 
 		// 예정등급이 VIP가 아닌경우
 		if (Number(expctCustGrade.gradeCdNo) > 10) {
-			let nextGradeNo = Number(expctCustGrade.gradeCdNo)-10;				// 다음등급번호
-			let nextCustGradePolicy = fnGetNextGradePolicyInfo(nextGradeNo);	// 다음등급정책정보
-			fnNextGradeCondition(nextCustGradePolicy, expctCustGrade);			// 다음조건 알림
+			let nextGradeNo = 'G110_'+(Number(expctCustGrade.gradeCdNo)-10);				// 다음등급번호
+			fnGetNextGradePolicyInfo(nextGradeNo);	// 다음등급정책정보
 		} else {
 			fnDisplayVipText(expctCustGrade);
 		}
@@ -288,18 +287,14 @@
 
  	// 다음 등급정책
  	var fnGetNextGradePolicyInfo = function (nextGradeNo) {
-		let custGradePolicy = exptCustGradeMap.custGradePolicy;	// 등급별정책
-		let nextCustGradePolicy;
-		$(custGradePolicy).each(function(idx, item) {
-			if (Number(item.gradeCdNo) === nextGradeNo ) {
-				nextCustGradePolicy = item;
-			}
-		});
-		return nextCustGradePolicy;
+		$.get('/planning/next/custgrade/info/' + nextGradeNo
+			, function (data) {
+				fnNextGradeCondition(data.nextCustGradePolicy);			// 다음조건 알림
+			});
 	}
 
 	// 다음등급 조건 알림
-	var fnNextGradeCondition = function (nextCustGradePolicy, expctCustGrade) {
+	var fnNextGradeCondition = function (nextCustGradePolicy) {
 		let $etcGrade = $('#etcGrade');
 		let $sameVipGrade = $('#sameVipGrade');
 		let $vipGrade = $('#vipGrade');
@@ -310,13 +305,13 @@
 		let $nextGrde = $('#nextGrde');
 
 		let remnantBuyAmt = 0;
-		if (nextCustGradePolicy.minBuyAmt > expctCustGrade.sumRealOrdAmt) {
-			remnantBuyAmt = nextCustGradePolicy.minBuyAmt - expctCustGrade.sumRealOrdAmt;
+		if (nextCustGradePolicy.minBuyAmt > nextCustGradePolicy.sumRealOrdAmt) {
+			remnantBuyAmt = nextCustGradePolicy.minBuyAmt - nextCustGradePolicy.sumRealOrdAmt;
 		}
 
 		let remnantBuyCnt = 0;
-		if (nextCustGradePolicy.minBuyCnt > expctCustGrade.ordCnt) {
-			remnantBuyCnt = nextCustGradePolicy.minBuyCnt -  expctCustGrade.ordCnt;
+		if (nextCustGradePolicy.minBuyCnt > nextCustGradePolicy.ordCnt) {
+			remnantBuyCnt = nextCustGradePolicy.minBuyCnt -  nextCustGradePolicy.ordCnt;
 		}
 
 		$etcGrade.show();
@@ -361,7 +356,7 @@
 
 	$('#btnGradeCoupon').on('click', function () {
 		let params = JSON.stringify({});
-		gagajf.ajaxJsonSubmit('/planning/event/custgrade/coupon/down', params, fnDownloadCallback)
+		gagajf.ajaxJsonSubmit('/planning/event/custgrade/coupon/down', params, fnDownloadCallback);
 	});
 
  	var fnDownloadCallback = function (result) {

+ 1 - 13
src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html

@@ -826,7 +826,7 @@ var fnSearchCallback = function (result) {
 				 }
 				
 				 html += '			</div>';
-				 html += '			<p>'+escapeHtml(item.entryVal1)+'</p>';
+				 html += '			<p>'+item.entryVal1.escapeHtml()+'</p>';
 				 if (item.entryCustNo == result.custNo) {
 					 html += '			<button class="btn btn_default btn_del" value="'+item.planEntrySq+'" onclick="fnDelReply(this.value)"><span>삭제</span></button>';
 				 }
@@ -851,18 +851,6 @@ var fnSearchCallback = function (result) {
 	gagaPaging.createPagination(result.paging.pageable);
 }
 
-function escapeHtml(str) {
-	var map = {
-		'&': '&amp;',
-		'<': '&lt;',
-		'>': '&gt;',
-		'"': '&quot;',
-		"'": '&#039;'
-	};
-	return str.replace(/[&<>"']/g, function(m) { return map[m]; });
-}
-
-
 // 댓글 삭제
 var fnDelReply = function(obj) {
 	

+ 38 - 0
src/main/webapp/WEB-INF/views/web/popup/TrackWithdrawPopupFormWeb.html

@@ -0,0 +1,38 @@
+<form class="form_wrap form_full" name="trackWithdrawForm" id="trackWithdrawForm">
+	<div class="modal-header">
+		<h5 class="modal-title" id="reclaimLabel">
+			회수 조회
+		</h5>
+	</div>
+	<div class="modal-body">
+		<div class="pop_cont">
+			<!-- 210506_수정 : 테이블 변경 -->
+			<div class="tbl type5">
+				<table>
+					<colgroup>
+						<col width="25%">
+						<col width="25%">
+						<col width="25%">
+						<col width="25%">
+					</colgroup>
+					<thead>
+						<tr>
+							<th scope="col">시간</th>
+							<th scope="col">장소</th>
+							<th scope="col">유형</th>
+							<th scope="col">전화번호</th>
+						</tr>
+					</thead>
+					<tbody>
+						<tr>
+							<td>2020.10.05 09:10:22</td>
+							<td>시흥 대리점</td>
+							<td>집화 처리</td>
+							<td>010-1234-5678</td>
+						</tr>
+					</tbody>
+				</table>
+			</div>
+		</div>
+	</div>
+</form>

+ 29 - 1
src/main/webapp/biz/mypage.js

@@ -316,7 +316,7 @@ var fnReceipt = function(param) {
 		receiptWin += '&tno=' + paymentInfo.pgTid;
 		receiptWin += '&order_no=' + ordNo;
 		receiptWin += '&trade_mony=' + (orderAmtInfo.realOrdAmt + orderAmtInfo.realDelvAmt);
-		
+		console.log(receiptWin);
 		// 팝업 크기 설정
 		option = 'width=455, height=815';
 	} else if (param == 'cash') {
@@ -446,3 +446,31 @@ var fnCrePayAddCost = function(param) {
 	$('#addPaymentForm input[name=ordNo]').val(ordNo);
 	document.addPaymentForm.submit();
 }
+
+// 회수조회 버튼 클릭 이벤트
+var fnGoToWithdrawDelivery = function(param) {
+	let shipCompCd = $(param).attr('shipCompCd');
+	let wdInvoiceNo = $(param).attr('wdInvoiceNo');
+
+	let data = {}
+	data.shipCompCd = shipCompCd;
+	data.wdInvoiceNo = wdInvoiceNo;
+
+	let jsonData = JSON.stringify(data);
+
+	$.ajax( {
+		type		: "POST",
+		url 		: '/mypage/track/withdraw/popup/form',
+		data		: jsonData,
+		dataType 	: 'html',
+		beforeSend : function(xhr, settings) {
+			xhr.setRequestHeader("AJAX"			, "true");
+			xhr.setRequestHeader('Accept'		, 'application/json');
+			xhr.setRequestHeader('Content-Type'	, 'application/json');
+		},
+		success 	: function(result) {
+			$("#reclaimPop .modal-dialog .modal-content").html(result);
+			$("#reclaimPop").modal("show");
+		}
+	});
+}

+ 1 - 0
src/main/webapp/ux/mo/css/common_m.css

@@ -1304,6 +1304,7 @@ button.alertCls {-webkit-appearance: none;padding: 0;cursor: pointer;background:
 /*alert confirm*/
 .dialog-mobile {
 	padding: 0;
+	margin-left: -45%;
 	text-align:center;
 	position: fixed;
 	top: 50%;

+ 22 - 9
src/main/webapp/ux/mo/css/layout_m.css

@@ -466,7 +466,7 @@
 .pd_detail .descript_box .btn_group_flex button{border:1px solid #fd4802; color:#fd4802; background: #fff;}
 /* 2 */
 .pd_detail .desc_status{padding:1.5rem 2rem; margin-bottom:-1.2rem; color: #fd4802; border-bottom:1px solid #dddddd;}
-.pd_detail .timer_box{position: relative;width: 30rem;top:-2.0rem;left: 50%;transform: translateX(-50%);z-index: 2;}
+.pd_detail .timer_box{position: absolute;width: 30rem;top:-2.4rem;left: 50%;transform: translateX(-50%);z-index: 2;}
 .pd_detail .timer_box::before{position: absolute;left: 0;bottom: 0;width: 100%;height: 3rem;background-color: rgba(255,255,255,.95);z-index: -1;} /* content: ''; */
 .pd_detail .timer_box p{padding: 0;text-align: center;background: #222;height: 3.6rem;}
 /* .pd_detail .timer_box::after{content:''; position:absolute; right:-1.2rem; bottom:-1.8rem; border:1.2rem solid transparent; border-top:1.2rem solid #fff; transform:rotate(-45deg);} */
@@ -480,14 +480,14 @@
 .pd_detail .timer_box p .timer em::before {content:':'; position:absolute; left:-1px; top:50%; transform:translateY(-50%);}
 .pd_detail .timer_box p .timer em:first-of-type {padding-left:0.8rem;}
 .pd_detail .timer_box p .timer em:first-of-type::before {display:none;}
-.pd_detail .descript_box {padding-top: 0rem;}
+.pd_detail .descript_box {padding-top: 2.4rem;}
 .pd_detail .option_box .opt_color{padding:3rem 0;}
 .pd_detail .option_box .opt_color ul {margin:0 -2rem; padding-left:2rem; overflow-x:auto; font-size:0; white-space:nowrap;}
 .pd_detail .option_box .opt_color ul::after {content:''; position: relative; display:inline-block; width:2rem; height:1px;}
 .pd_detail .option_box .opt_color ul li {margin-right:0.5rem; display:inline-block; width:5rem;}
 .pd_detail .option_box .opt_color ul li:last-child {margin-right:0;}
 .pd_detail .option_box .opt_color ul li a {position:relative; display:block; padding-bottom:150%; box-sizing:border-box; width:5rem;}
-.pd_detail .option_box .opt_color ul li a img {position:absolute; top:0; left:0; width:100%;}
+.pd_detail .option_box .opt_color ul li a img {position:absolute; top:50%; left:50%; width:100%; transform: translate(-50%, -50%);}
 .pd_detail .option_box .opt_color ul li a.on:after{display:block; content:''; position:absolute; left:0; right:0; top:0; bottom:0; border:1px solid #fd4802; box-sizing:border-box;}
 .pd_detail .option_box > [class^="opt_"] .opt_header {margin-bottom:0.5rem;}
 .pd_detail .option_box > [class^="opt_"] .opt_header .title {margin-right:1rem; font-weight:500; color:#222;}
@@ -820,7 +820,7 @@ header .htop.trans{position:absolute; background:transparent !important;}
 .dp .popup_box .button_list.clear button{width:100% !important;}
 .dp .open_categori a{display: inline-block;font-size: 1.2rem;font-weight: 300;padding-right: 1.4rem;background: url(/images/mo/ico_sort_arrow.png) no-repeat right center;background-size: 0.7rem 0.43rem;}
 .dp .Bulletship_foot .clear{background:#f5f5f5; margin:4rem -2rem; padding:4rem 0 0rem 2rem;}
-.dp .items_option{padding-top:0; margin:0 2rem;}
+.dp .items_option{padding-top:0; margin:0 -2.1rem;}
 .dp .items_option #filter{height:4.5rem; border:0.1rem solid #dddddd; font-size:1.2rem; color:#666666; width:100%;line-height:4.5rem; padding:0 1.5rem; background-color:#fff;}
 .dp .items_option.fix{position:fixed; top:0; z-index:999; width:100%; left:0; margin:0; box-shadow:rgb(0 0 0 / 30%) 0px 3px 15px 0px;}
 .dp .dp_listItems_wrap .items_option #filter{font-size:1.2rem; color:#666666; width:100%;line-height:4.5rem; padding:0 1.5rem; background-color:#fff;}
@@ -860,7 +860,7 @@ header .subs .dp_list_btn_gnbs.on span i {transform: rotate(-180deg);-webkit-tra
 .brand_floormenu.soldout .prd_buy > .buying{display:none;}
 .brand_floormenu.soldout .prd_buy > .cantbuying{display:block; background-color:#ddd;}
 .dp_lookbook ~ .popup_box .popup_con{margin-bottom:5rem}
-.dp_listItems_cont.type1 .open_categori{background-color:#fff; padding: 1.6rem 2rem;}
+.dp_listItems_wrap.type1 .open_categori{background-color:#fff; padding: 1.6rem 2rem;}
 /* 210423 */
 .br .brand_si{margin-top:0.1rem}
 .br .brand_si .swiper-wrapper{height:0;}
@@ -885,7 +885,8 @@ header .subs .dp_list_btn_gnbs.on span i {transform: rotate(-180deg);-webkit-tra
 .pop_detail .review_list .review .info_box .writer span:first-child::after {display:none;}
 .pop_detail .review_list .review .response_box {margin-top:1.4rem;}
 .pop_detail .review_list .review .response_box > div:first-child {margin-top:0}
-.pop_detail .review_list .review .response_box > div dl div {display:flex; font-size:1.1rem;}
+.pop_detail .review_list .review .response_box > div dl{padding-top:2.3rem}
+.pop_detail .review_list .review .response_box > div dl div {display:flex; font-size:1.1rem; width:100%;}
 .pop_detail .review_list .review .response_box > div dl div dt {width:4.5rem; color:#888}
 .pop_detail .review_list .review .response_box > div dl div dd {margin-left:1.2rem; color:#fd4802}
 .pop_detail .review_list .review .response_box2 {margin-top:1.4rem;}
@@ -923,6 +924,18 @@ header .subs .dp_list_btn_gnbs.on span i {transform: rotate(-180deg);-webkit-tra
 .br .br_inlookbook .ioBtn.active{display:block}
 .br .br_inlookbook .itemsOut{display:none}
 .br .br_inlookbook .itemsOut.active{display:block}
+/* 210510 */
+.pd_detail .pd_info .inner:nth-of-type(2){background:linear-gradient(to bottom,rgba(255, 255, 255, 0.93) 1%,rgba(255, 255, 255, 1) 25%,rgba(255, 255, 255, 1) 50%,rgba(255, 255, 255, 1) 75%,rgba(255, 255, 255, 1) 100%)}
+/* 210511 */
+.dp .promotion_visual.type2{padding-bottom:3.8rem}
+.dp .dp_hotdeal .inner:nth-of-type(1){margin-bottom:0; padding-bottom:4rem;}
+.dp .dp_review_cont{padding-bottom:4rem;}
+.dp .mid_banner{padding-bottom:3rem;}
+.dp .dp_listItems_cont.type1{padding-bottom:3rem;}
+.dp .dp_listItems_cont.type2{padding-bottom:3rem;}
+.dp .dp_listItems_wrap{padding-bottom:3rem;}
+.dp .other_promotion_slide{padding-top:0}
+.dp .dp_lookbook ~ .popup_box.nodata .popup_con{margin-bottom:0;}
 
 
 
@@ -1754,7 +1767,7 @@ header .subs .dp_list_btn_gnbs.on span i {transform: rotate(-180deg);-webkit-tra
 .dp .dp_best .best_item .itemsGrp .item_prod:nth-child(2n) {margin-right: 0;}
 
 /* 핫딜 - dp_hotdeal */
-.dp_hotdeal .hotdeal {position: relative;height:49vw; margin-bottom:4rem; background: url(/images/mo/thumb/hotdeal_bg.png)no-repeat center center; background-size:cover;}
+.dp_hotdeal .hotdeal {position: relative;height:49vw; margin-bottom:0; background: url(/images/mo/thumb/hotdeal_bg.png)no-repeat center center; background-size:cover;}
 .dp_hotdeal .hotdeal #countdown{position: absolute; padding:0 6.1vw; height:10.1vw; line-height:10.1vw; border-radius:10.1vw;; border:1px solid #fff; white-space:nowrap; display:inline-block;  text-align: center; bottom:8.3vw; left:50%; transform: translateX(-50%);}
 .dp_hotdeal .hotdeal #countdown:before{content:''; display:inline-block; margin-right:1.8vw; width:5.1vw; height:5.1vw; background:url(/images/mo/icon_time_hotdeal.png) center center no-repeat; background-size:contain; vertical-align:middle;}
 .dp_hotdeal .hotdeal #countdown span{font-size:4vw; color:#fff; display:inline-block; vertical-align:middle;}
@@ -1773,7 +1786,7 @@ header .subs .dp_list_btn_gnbs.on span i {transform: rotate(-180deg);-webkit-tra
 .dp_hotdeal .itemsGrp.rowtype .item_prod .shape span{position:relative; width:auto; left:0; top:0; text-indent:0; transform:translate(0);}
 .dp_hotdeal .itemsGrp.rowtype .item_prod .shape:after{display:none;}
 .dp_hotdeal .itemsGrp.rowtype .item_prod .itemPic::after {background: #f5f5f5; opacity:1; z-index: 87;}
-.dp_hotdeal .itemsGrp.rowtype .item_prod .itemPic .pd_img {z-index: 88;}
+.dp_hotdeal .itemsGrp.rowtype .item_prod .itemPic .pd_img {z-index: 78;}
 .dp_hotdeal .itemsGrp.rowtype .item_prod.sold_out .itemPic:before {content:'SOLD OUT'; position: absolute; top: 50%; left: 50%; font-size:1.4rem; color:#fff; font-weight:bold; background: rgba(0,0,0,.5); width: 100%; height: 100%; transform:translate(-50%, -50%); line-height:23.4rem;; z-index: 99; text-align: center;}
 .dp_hotdeal .itemsGrp.rowtype .item_prod .shape{position:absolute; left:17.6rem; top:3rem;}
 .dp_hotdeal .itemsGrp.rowtype .item_prod .itemBrand {margin:3rem 0 0.5rem;}
@@ -1807,7 +1820,7 @@ header .subs .dp_list_btn_gnbs.on span i {transform: rotate(-180deg);-webkit-tra
 .dp .dp_exhibition .inner:first-child{padding-bottom:0; margin-bottom:0;}
 .dp .dp_exhibition .inner:last-child{padding-bottom: 4rem;}
 .dp .dp_exhibition .inner.bg_gray{background-color:#f5f5f5;}*/
-.dp .dp_listItems_wrap .items_option{padding-top:4rem;}
+.dp .dp_listItems_wrap .items_option{padding-top:0;}
 .dp .dp_listItems_wrap .items_option .select{display:block;}
 /*.dp .promotion_visual.type1{margin-bottom:-5.3rem;}*/
 .dp .promotion_visual.type1 .mid_banner{background-color:#fff;}

+ 3 - 8
src/main/webapp/ux/mo/css/style24_m.css

@@ -619,12 +619,7 @@ main.container .inner h2[data-style~="unusual"] {font-size:2.0rem;top: 0;positio
 .ev .survey_wrap .survey_con .survey_row {background: #fff; padding: 3rem 2rem; margin-bottom: 2rem;}
 .ev .survey_wrap .survey_con .survey_row:last-child {border-bottom: 0;}
 .ev .survey_wrap .survey_con .survey_row h4 {margin-bottom: 2rem; font-size: 1.33rem; line-height: 1.5; font-weight: 500; position: relative; padding-left: 2.5rem;}
-.ev .survey_wrap .survey_con .survey_row h4:before {position: absolute; top: 0; left: 0;}
-.ev .survey_wrap .survey_con .survey_row.q4  {margin-bottom: 0;}
-.ev .survey_wrap .survey_con .survey_row.q1 h4:before {content:'Q1.'}
-.ev .survey_wrap .survey_con .survey_row.q2 h4:before {content:'Q2.'}
-.ev .survey_wrap .survey_con .survey_row.q3 h4:before {content:'Q3.'}
-.ev .survey_wrap .survey_con .survey_row.q4 h4:before {content:'Q4.'}
+.ev .survey_wrap .survey_con .survey_row h4 span.question {position: absolute; top: 0; left: 0;}
 .ev .survey_wrap .survey_con .survey_row .answer ul {width: 100%;}
 
 .ev .survey_wrap .survey_con .survey_row ul li {position: relative; margin-bottom: 2rem;}
@@ -643,8 +638,8 @@ main.container .inner h2[data-style~="unusual"] {font-size:2.0rem;top: 0;positio
 
 .ev .survey_wrap .survey_con .survey_row.q4 {padding-bottom: 0;}
 .ev .survey_wrap .survey_con .survey_row.q4 .q4_ans {width: 100%; height: 4.5rem; padding: 1rem; font-size: 1.3rem; line-height: 1.6; color: #222; font-weight: 300; resize:none;}
-.ev .survey_wrap .survey_con .btn_wrap {padding: 3rem 2rem 6rem; text-align: center; background: #fff;}
-.ev .survey_wrap .survey_con .btn_wrap button.btn {width: 100%; padding:1.6rem 0; font-size: 1.4rem; font-weight: 500; height:auto;} 
+.ev .survey_wrap .survey_con .btn_wrap {padding: 3rem 2rem 6rem; text-align: center; background: #fff; margin-top: -2rem;}
+.ev .survey_wrap .survey_con .btn_wrap button.btn {width: 100%; padding:1.6rem 0; font-size: 1.4rem; font-weight: 500; height:auto; } 
 
 /* ev_comment_1 */
 .dp {background: #f5f5f5;}

+ 21 - 0
src/main/webapp/ux/plugins/gaga/gaga.common.js

@@ -377,3 +377,24 @@ String.prototype.addComma = function(decimalPosition) {
 String.prototype.removeComma = function() {
 	return this.replace(/,/gi,"");
 }
+
+/**
+ * @type   : prototype_function
+ * @access : public
+ * @desc   : 자바스크립트의 내장 객체인 String 객체에 &,<,>,",' 브라우져 출력용 변환한다.
+ * <pre>
+ *     "<문자열>".escapeHtml();
+ * </pre>
+ * @return : 콤마(,)가 제거된 스트링
+ * @author : gagamel
+ */
+String.prototype.escapeHtml = function() {
+	var map = {
+		'&': '&amp;',
+		'<': '&lt;',
+		'>': '&gt;',
+		'"': '&quot;',
+		"'": '&#039;'
+	};
+	return this.replace(/[&<>"']/g, function(m) { return map[m]; });
+}

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

@@ -51,6 +51,7 @@ const _PAGE_GOODS_REVIEW_PHTO_LIST_LAYER = _frontUrl + "/goods/review/photo/laye
 const _PAGE_GOODS_CPN_DOWNLOAD = "/goods/coupon/download";											// 상품쿠폰다운로드
 const _PAGE_GOODS_EP_CPN_DOWNLOAD = "/goods/ep/coupon/download";									// EP쿠폰다운로드
 const _PAGE_DEAL_GOODS_DETAIL_LAYER = _frontUrl + "/goods/deal/detail/layer/";						// 딜상품 상세레이어
+const _PAGE_SEARCH_LAYER = _frontUrl + "/display/search/layer/";									// 검색레이어
 
 //== 장바구니 ==/
 const _PAGE_CART = _frontUrl + "/cart/list/form";								// 장바구니
@@ -1302,6 +1303,32 @@ function copyToClipboard() {
 	mcxDialog.alert("URL이 복사 되었습니다.");
 }
 
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 검색 full 팝업
+ * <pre>
+ *		cfSearchLayer();
+ * </pre>
+ */
+function cfSearchLayer() {
+	var Param = new Object();
+	var str = '<div class="common_search active" id="layer_search"></div>';
+	if ("P" != _frontGb){
+		// str = '<div class="modal pop_full fade pd_pop pd_qnalist_pop" id="layer_goods_qna" tabindex="-1" role="dialog" aria-labelledby="exampleFullLabel" aria-hidden="true"></div>';
+	}
+
+	if ($('#layer_search').length == 0) {
+		$('body').append(str);
+	}
+
+	if ("P" == _frontGb){
+		cfOpenFullLayer(_PAGE_SEARCH_LAYER, 'layer_search');
+	}else{
+		cfOpenLayer(_PAGE_SEARCH_LAYER, 'layer_search');
+	}
+}
+
 /**
  * @type   : function
  * @access : public