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

Merge branch 'develop' into bin2107

bin2107 5 лет назад
Родитель
Сommit
383b5b031a
29 измененных файлов с 1465 добавлено и 474 удалено
  1. 28 1
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  2. 1 1
      src/main/java/com/style24/front/biz/service/TsfGoodsService.java
  3. 8 3
      src/main/java/com/style24/front/biz/service/TsfReviewService.java
  4. 2 2
      src/main/java/com/style24/front/biz/web/TsfGoodsController.java
  5. 21 15
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  6. 18 0
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  7. 13 11
      src/main/java/com/style24/persistence/domain/GoodsSafeNo.java
  8. 1 0
      src/main/java/com/style24/persistence/domain/Review.java
  9. 13 10
      src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml
  10. 1 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml
  11. 12 7
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  12. 3 3
      src/main/java/com/style24/persistence/mybatis/shop/TsfPoint.xml
  13. 26 9
      src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml
  14. 6 5
      src/main/java/com/style24/persistence/mybatis/shop/TsfSocial.xml
  15. 16 3
      src/main/resources/config/application-style.yml
  16. 38 12
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDealDescFormMob.html
  17. 94 16
      src/main/webapp/WEB-INF/views/mob/goods/GoodsDetailFormMob.html
  18. 670 0
      src/main/webapp/WEB-INF/views/mob/mypage/MypageReviewCreateFormMob.html
  19. 253 240
      src/main/webapp/WEB-INF/views/mob/mypage/MypageReviewFormMob.html
  20. 86 54
      src/main/webapp/WEB-INF/views/mob/mypage/MypageWishListFormMob.html
  21. 14 4
      src/main/webapp/WEB-INF/views/web/common/fragments/FooterWeb.html
  22. 31 10
      src/main/webapp/WEB-INF/views/web/goods/GoodsDealDescFormWeb.html
  23. 67 32
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html
  24. 7 5
      src/main/webapp/WEB-INF/views/web/goods/GoodsReviewDetailFormWeb.html
  25. 5 3
      src/main/webapp/WEB-INF/views/web/mypage/MypageReviewCreateFormWeb.html
  26. 16 7
      src/main/webapp/WEB-INF/views/web/mypage/MypageReviewDetailFormWeb.html
  27. 2 2
      src/main/webapp/WEB-INF/views/web/mypage/MypageReviewFormWeb.html
  28. 1 1
      src/main/webapp/WEB-INF/views/web/mypage/MypageWishListFormWeb.html
  29. 12 17
      src/main/webapp/WEB-INF/views/web/planning/PlanningCustGradeBenefitFormWeb.html

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

@@ -967,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) {
@@ -1043,4 +1042,32 @@ public class TsfCustomerService {
 		}
 	}
 
+
+
+	/*
+	 * 고객 예상등급 이후 정보
+	 *
+	 * @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;

+ 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);
 	}
 	
 	/**

+ 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);

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

@@ -1556,6 +1556,8 @@ public class TsfMypageController extends TsfBaseController {
 			result.set("message", "쿠폰이 발급되었습니다.");
 		}
 		result.set("status", "200");
+		
+		result.set("couponList", couponService.getQuickCouponDownList(coupon));
 		return result;
 	}
 
@@ -1619,9 +1621,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 +1631,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 +1656,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 +1666,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 +1766,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;
 	}

+ 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;			// 지급포인트금액

+ 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>

+ 1 - 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  (

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

@@ -638,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>
 	
 	<!-- 상품  배송안내정보  -->

+ 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 '구매 취소'

+ 26 - 9
src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml

@@ -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명*/

+ 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
 

+ 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">

+ 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);
 			}
+			
 		}
 	});
 }

+ 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();
 		
 	}
 

+ 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">

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

@@ -759,19 +759,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 +795,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 +1654,6 @@
 		
 		$('.timer_box').css('display', 'none');
 		
-		
-		
 		//공유 버튼 토글 
 		$("button[data-name=openShare]").on("click", function(){
 			$(this).toggleClass("on").next(".shareWrap").toggleClass("on");
@@ -1962,7 +1997,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"));
  			}
  			

+ 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';

+ 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 + '">';

+ 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) {