Explorar el Código

Merge branch 'develop' of http://112.172.147.34:4936/style24/style24.front.git into develop

gagamel hace 5 años
padre
commit
7aef2689e1

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

@@ -88,6 +88,16 @@ public interface TsfCouponDao {
 	 */
 	Coupon getCouponDetailInfo(int cpnId);
 	
+	/**
+	 * 마이페이지 등급쿠폰 다운가능 쿠폰 정보 조회
+	 * 
+	 * @param coupon
+	 * @return Collection<Coupon>
+	 * @author sowon
+	 * @since 2021.03.24
+	 */
+	Collection<Coupon> getPlanCouponInfo(Coupon coupon);
+	
 	
 	
 }

+ 18 - 0
src/main/java/com/style24/front/biz/dao/TsfReviewDao.java

@@ -60,6 +60,24 @@ public interface TsfReviewDao {
 	 * @since 2021. 3. 19
 	 */
 	Collection<Goods> getReviewOptionList(String goodsCd);
+	
+	/**
+	 * 마이페이지 작성가능한 리뷰 건수
+	 * @param review
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 3. 25
+	 */
+	int getCompleteReviewCount(Review review);
+	
+	/**
+	 * 마이페이지 작성가능한 리뷰 목록
+	 * @param review
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 3. 25
+	 */
+	Collection<Review> getCompleteReviewList(Review review);
 
 
 }

+ 40 - 0
src/main/java/com/style24/front/biz/service/TsfCouponService.java

@@ -421,4 +421,44 @@ public class TsfCouponService {
 	}
 	
 	
+	/**
+	 * 기획전 쿠폰 다운 처리
+	 *
+	 * @param coupon
+	 * @return Collection<Coupon>
+	 * @author card007
+	 * @since 2021.02.25
+	 */
+	@Transactional("shopTxnManager")
+	public int getPlanCouponInfo(Coupon coupon) {
+		int count = 0;
+
+		Collection<Coupon> couponList = couponDao.getPlanCouponInfo(coupon);
+
+		for (Coupon tmpCoupon : couponList) {
+			//int downloadCnt = tmpCoupon.getDownloadCnt();
+			for (int i = 0; i < couponList.size(); i++) {
+				if(couponList.iterator().next().getOwnCoupon()==0) {
+					CustCoupon custCoupon = new CustCoupon();
+					custCoupon.setCustNo(tmpCoupon.getCustNo());
+					custCoupon.setCpnId(tmpCoupon.getCpnId());
+					custCoupon.setAvailStdt(tmpCoupon.getAvailStdt());
+					custCoupon.setAvailEddt(tmpCoupon.getAvailEddt());
+					custCoupon.setPubReason(TscConstants.PubReason.DOWNLOAD.value());
+					custCoupon.setEndAlimSendYn("N");		// 알림 발송 여부(발송되면 Y)
+					custCoupon.setRegNo(tmpCoupon.getCustNo());
+					custCoupon.setUpdNo(tmpCoupon.getCustNo());
+
+					coreCouponDao.saveCouponCustPub(custCoupon);
+
+					count++;
+
+				}
+			}
+		}
+
+		return count;
+	}
+
+	
 }

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

@@ -10,11 +10,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.style24.core.support.env.TscConstants;
 import com.style24.front.biz.dao.TsfPlanningDao;
 import com.style24.front.support.env.TsfConstants;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Cate4Srch;
 import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.Login;
 import com.style24.persistence.domain.Plan;
 import com.style24.persistence.domain.Point;
@@ -35,6 +37,9 @@ public class TsfPlanningService {
 	@Autowired
 	private TsfPlanningDao planningDao;
 	
+	@Autowired
+	private TsfCouponService couponService;
+	
 	/**
 	 * 기획전 카테고리 1deth 조회
 	 *
@@ -182,6 +187,20 @@ public class TsfPlanningService {
 	public Collection<Plan> getPlanGoods1Info(Plan plan) {
 		return planningDao.getPlanGoods1Info(plan);
 	}
+	
+	/**
+	 * 상품 쿠폰 다운 처리
+	 *
+	 * @param coupon
+	 * @return 
+	 * @author sowon
+	 * @since 2021.03.24
+	 */
+	@Transactional("shopTxnManager")
+	public int getPlanCouponDownInfo(Coupon coupon) {
+		return couponService.getPlanCouponInfo(coupon);
+	}
+
 
 
 	/**

+ 22 - 0
src/main/java/com/style24/front/biz/service/TsfReviewService.java

@@ -66,4 +66,26 @@ public class TsfReviewService {
 		 return reviewDao.getReviewOptionList(goodsCd);
 	}
 	
+	/**
+	 * 마이페이지 작성가능한 리뷰 건수
+	 * @param review
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 3. 25
+	 */
+	public int getCompleteReviewCount(Review review) {
+		return reviewDao.getCompleteReviewCount(review);
+	}
+	
+	/**
+	 * 마이페이지 작성가능한 리뷰 목록
+	 * @param review
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 3. 25
+	 */
+	public Collection<Review> getCompleteReviewList(Review review){
+		return reviewDao.getCompleteReviewList(review);
+	}
+	
 }

+ 83 - 1
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -24,6 +24,7 @@ import com.style24.front.biz.thirdparty.NiceCertify;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.TscPageRequest;
+import com.style24.persistence.domain.Counsel;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.CustAccount;
 import com.style24.persistence.domain.Customer;
@@ -31,6 +32,7 @@ import com.style24.persistence.domain.GiftCard;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.OrderChange;
 import com.style24.persistence.domain.Point;
+import com.style24.persistence.domain.Review;
 import com.style24.persistence.domain.WishList;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -720,7 +722,7 @@ public class TsfMypageController extends TsfBaseController {
 		return result;
 	}
 
-	/* 김소원 상품권 쿠폰 시작 */
+	/* 김소원 상품권 쿠폰 리뷰 시작 */
 	/**
 	 * 마이페이지 상품권화면
 	 *
@@ -826,6 +828,86 @@ public class TsfMypageController extends TsfBaseController {
 		mav.setViewName(super.getDeviceViewName("mypage/MypageCouponDetailPop"));
 		return mav;
 	}
+	
+	/**
+	 * 마이페이지 리뷰화면
+	 *
+	 * @return
+	 * @author sowon	
+	 * @since 2021. 03. 24
+	 */
+	@GetMapping("/review/form")
+	public ModelAndView mypageReviewForm(Review review) {
+		ModelAndView mav = new ModelAndView();
+		
+		review.setCustNo(TsfSession.getInfo().getCustNo());
+		review.setSiteCd(TscConstants.Site.STYLE24.value());
+		// 작성가능한 리뷰 카운트
+		mav.addObject("completeReviewCount", reviewService.getCompleteReviewCount(review));
+		// 작성가능한 리뷰 목록
+		//mav.addObject("completeReviewList", reviewService.getCompleteReviewList(review));
+		mav.setViewName(super.getDeviceViewName("mypage/MypageReviewForm"));
+
+		return mav;
+	}
+	
+	/**
+	 * 마이페이지 리뷰 목록
+	 * @param review
+	 * @return
+	 * @author sowon
+	 * @since 2021. 03. 25
+	 */
+	@PostMapping("/review/list")
+	@ResponseBody
+	public GagaMap getMypageReviewList(@RequestBody Review review) {
+
+		review.setSiteCd(TscConstants.Site.STYLE24.value());
+
+		GagaMap result = new GagaMap();
+
+		TscPageRequest pageable = new TscPageRequest((review.getPageNo() > 0 ? review.getPageNo() - 1 : 0), review.getPageSize(), review.getPageUnit());
+		pageable.setTotalCount(reviewService.getCompleteReviewCount(review));
+		review.setPageable(pageable);
+		log.info("pageable: {}", pageable);
+		log.info("totalCount {}", pageable.getTotalCount());
+		
+
+		if (TsfSession.isLogin()) {
+			review.setCustNo(TsfSession.getInfo().getCustNo());
+		}
+
+		result.set("paging", review);
+		result.set("completeReviewCount", reviewService.getCompleteReviewCount(review));
+		result.set("dataList", reviewService.getCompleteReviewList(review));
+
+		return result;
+	}
+	
+	/**
+	 * 마이페이지 리뷰작성화면
+	 *
+	 * @return
+	 * @author sowon	
+	 * @since 2021. 03. 25
+	 */
+	@GetMapping("/review/create/form/{ordNo}/{ordDtlNo}/{goodsCd}")
+	public ModelAndView mypageReviewCreateForm(@PathVariable(value = "ordNo") Integer ordNo,@PathVariable(value = "ordDtlNo") Integer ordDtlNo,@PathVariable(value = "goodsCd") String goodsCd) {
+		Review review = new Review();
+		ModelAndView mav = new ModelAndView();
+		
+		review.setCustNo(TsfSession.getInfo().getCustNo());
+		review.setSiteCd(TscConstants.Site.STYLE24.value());
+		review.setOrdNo(ordNo);
+		review.setOrdDtlNo(ordDtlNo);
+		review.setGoodsCd(goodsCd);
+		
+		mav.addObject("completeReviewList", reviewService.getCompleteReviewList(review));
+		
+		mav.setViewName(super.getDeviceViewName("mypage/MypageReviewCreateForm"));
+
+		return mav;
+	}
 
 	/*신주승 시작*/
 

+ 49 - 4
src/main/java/com/style24/front/biz/web/TsfPlanningController.java

@@ -14,21 +14,21 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.rest.server.GagaResponse;
+import com.gagaframework.web.rest.server.GagaResponseStatus;
+import com.style24.core.biz.service.TscCustomerService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.front.biz.service.TsfCouponService;
 import com.style24.front.biz.service.TsfPlanningService;
 import com.style24.front.support.controller.TsfBaseController;
-import com.style24.front.support.env.TsfConstants;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Cate4Srch;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.Customer;
-import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.Plan;
 import com.style24.persistence.domain.Review;
 
@@ -51,6 +51,9 @@ public class TsfPlanningController extends TsfBaseController {
 	@Autowired
 	private TsfPlanningService planningService;
 	
+	@Autowired
+	private TscCustomerService coreCustomerService;
+	
 	/**
 	 * 기획전 메인 화면
 	 * 
@@ -186,6 +189,48 @@ public class TsfPlanningController extends TsfBaseController {
 		mav.setViewName(super.getDeviceViewName("planning/PlanningDetailForm"));
 		return mav;
 	}
+	
+	/**
+	 * 기획전 쿠폰 다운로드. 고객이 상품쿠폰 다운로드 시 발급됨.
+	 *
+	 * @param params
+	 * @return
+	 * @throws Exception
+	 * @author sowon
+	 * @since 2021. 3. 24.
+	 */
+	@PostMapping(value = "/coupon/download")
+	@ResponseBody
+	public GagaMap createPlanCoupon(@RequestBody Coupon coupon) throws Exception {
+
+		GagaMap result = new GagaMap();
+
+		// 고객정보 조회
+		Customer customer = new Customer();
+		customer.setSiteCd(TscConstants.Site.STYLE24.value());
+		customer.setCustNo(TsfSession.getInfo().getCustNo());
+		customer.setCustStat(TscConstants.CustStat.ACTIVE.value());
+		customer = coreCustomerService.getCustomerInfo(customer);
+
+		// 고객정보 설정
+		coupon.setCustGb(customer.getCustGb());
+		coupon.setCustGrade(customer.getCustGrade());
+		coupon.setCustNo(customer.getCustNo());
+		// 등급쿠폰 다운 처리
+		int count = planningService.getPlanCouponDownInfo(coupon);
+
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		if (count == 0) {
+			result.set("message", message.getMessage("COUPON_0002"));
+		} else {
+			result.set("message", message.getMessage("COUPON_0001", new Object[] {count}));
+		}
+
+		return result;
+	}
+
+	
 	/**
 	 * 이벤트 메인 화면
 	 * 

+ 9 - 1
src/main/java/com/style24/persistence/domain/Goods.java

@@ -74,7 +74,7 @@ public class Goods extends TscBaseDomain {
 
 	private String colorCd;		//색상코드
 	private String colorNm;		//색상코드명
-	private String brandnm;		//브랜드명
+	private String brandNm;		//브랜드명
 	private Integer brandGroupNo;	//브랜드그룹번호
 	private String brandGroupNm;	//브랜드그룹명
 	private String goodsGbNm;		//상품구분명
@@ -154,6 +154,14 @@ public class Goods extends TscBaseDomain {
 	private String mobileYn;
 	private String delvResDt;		// 예약판매 출고예정일
 	private int maxRownum;			// 조회건수
+	
+	private String payDt;			// 구매일	
+	private String remainDt;		// 리뷰 남아있는시간
+	private String brandEnm;
+	private String brandKnm;
+	private Integer ordNo;			// 주문번호
+	private Integer ordDtlNo;		// 주문상세번호
+	
 
 	//상품상세 구분(10:상품타이틀,20:상품타이틀내용,30:상품특징,40:상위컨텐츠,50:하위컨텐츠,60:상위컨텐츠-모바일,70:하위컨텐츠-모바일,80:상품상세(as-is,입점))
 	private String goodsTitle; 			// 10:상품타이틀

+ 7 - 3
src/main/java/com/style24/persistence/domain/Review.java

@@ -80,6 +80,9 @@ public class Review extends TscBaseDomain {
 	private String goodsNm;			// 상품이름
 	private int currPrice;		// 현재가
 	private String fileGb;			// 첨부파일 종류
+	private int cnt;				// 리뷰 카운트
+	private String siteCd;
+	
 	// Masking
 	public String getMaskingCustId() {
 		return (this.custId != null) ?  MaskingUtils.id(this.custId) : this.custId;
@@ -93,8 +96,9 @@ public class Review extends TscBaseDomain {
 	@JsonInclude(JsonInclude.Include.NON_EMPTY)
 	private TscPageRequest pageable;
 
-	private int pageNo = 1;
-	private int pageSize = 10;
-	private int pageUnit = 10;
+	private int pageNo = 1;							// 페이지번호
+	private int pageSize = 10;						// 페이지목록수
+	private int pageUnit = 10;						// 페이지번호수
+	
 	
 }

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

@@ -235,7 +235,7 @@
 		                     , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD, G.CURR_PRICE,#{custGb}) AS CURR_PRICE
 		                FROM   TB_GOODS G
 		                     , TB_COUPON CP
-		                WHERE  G.GOODS_CD = #{goodsCd}
+		                WHERE G.GOODS_CD = #{goodsCd}
 		                <if test="cpnId != null and cpnId != ''">
 		                AND    CP.CPN_ID = #{cpnId}
 		                </if>
@@ -585,4 +585,69 @@
 		 AND A.CPN_ID = #{cpnId}
 	</select>
 	
+	<!-- 기획전 다운가능 쿠폰 정보 조회 -->
+	<select id="getPlanCouponInfo" parameterType="Coupon" resultType="Coupon">
+		/* TsfCoupon.getPlanCouponInfo */
+		SELECT Z.CUST_NO
+		     , Z.CPN_ID
+		     , Z.AVAIL_STDT
+		     , Z.AVAIL_EDDT
+		     , Z.END_ALIM_YN
+		     , Z.DOWNLOAD_CNT
+		     , Z.OWN_COUPON
+		  FROM (SELECT A.*
+					 , CASE WHEN A.CNT <![CDATA[<=]]> 0 THEN 0
+							WHEN A.CNT > (A.DN_ABLE_CNT * A.ONE_PUB_QTY) THEN (A.DN_ABLE_CNT * A.ONE_PUB_QTY)
+							ELSE A.CNT
+						END AS DOWNLOAD_CNT
+				  FROM (SELECT #{custNo} AS CUST_NO
+							 , C.CPN_ID
+							 , C.CPN_NM
+							 , C.CUST_PUB_LIMIT_QTY
+							 , C.ONE_PUB_QTY
+							 , IF(C.PD_GB = 'P', C.AVAIL_STDT, NOW()) AS AVAIL_STDT
+							 , IF(C.PD_GB = 'P', C.AVAIL_EDDT, CONCAT(CURRENT_DATE + INTERVAL C.AVAIL_DAYS DAY, ' 23:59:59')) AS AVAIL_EDDT
+				             , C.END_ALIM_YN
+							 , IFNULL(CC.CPN_CNT, 0) AS DN_CNT
+				             , IF(C.CUST_PUB_LIMIT_QTY = 0 OR C.CUST_PUB_LIMIT_QTY - CC.CPN_CNT > 0, 1, 0) AS DN_ABLE_CNT
+				             , IF(C.TOT_PUB_LIMIT_QTY > 0, C.TOT_PUB_LIMIT_QTY - CC2.CPN_CNT, 99999) AS CNT
+				             , (SELECT COUNT(*) FROM TB_CUST_COUPON TCC WHERE CPN_ID = #{cpnId} AND CUST_NO = #{custNo}) AS OWN_COUPON
+						  FROM TB_COUPON C
+						 INNER JOIN TB_COUPON_CUST_GBN CCGB
+							ON C.CPN_ID = CCGB.CPN_ID
+						   AND CCGB.USABLE_CUST_GB = #{custGb}
+						 INNER JOIN TB_COUPON_CUST_GRADE CCGR
+							ON C.CPN_ID = CCGR.CPN_ID
+						   AND CCGR.USABLE_CUST_GRADE = #{custGrade}
+						  LEFT OUTER JOIN (SELECT CPN_ID
+												, CUST_NO
+												, COUNT(*) AS CPN_CNT
+											 FROM TB_CUST_COUPON
+											GROUP BY CPN_ID, CUST_NO) CC
+							ON C.CPN_ID = CC.CPN_ID
+						   AND CC.CUST_NO = #{custNo}
+						  LEFT OUTER JOIN (SELECT CPN_ID
+												, COUNT(*) AS CPN_CNT
+											 FROM TB_CUST_COUPON
+											GROUP BY CPN_ID) CC2
+							ON C.CPN_ID = CC2.CPN_ID
+						 WHERE C.DOWN_ABL_YN = 'N'
+						    AND C.CPN_ID IN (
+						       					SELECT PCI.ITEM_VAL 
+						       					FROM TB_PLAN_CONTENTS_ITEM PCI 
+						       					WHERE PCI.ITEM_VAL = #{cpnId}
+						       				)
+						   AND NOW() BETWEEN C.DOWN_STDT AND C.DOWN_EDDT
+						   AND C.CPN_STAT = 'G232_11'  -- 진행
+						   AND CASE WHEN C.TOT_PUB_LIMIT_QTY = 0 THEN 1
+									WHEN C.TOT_PUB_LIMIT_QTY - CC2.CPN_CNT > 0 THEN 1
+									ELSE 0
+								END = 1
+						   AND IF(C.NEW_CUST_YN = 'Y', (SELECT COUNT(*) FROM TB_CUSTOMER WHERE CUST_NO = #{custNo} AND REG_DT BETWEEN C.CUST_JOIN_STDT AND C.CUST_JOIN_EDDT), 1) = 1
+						   AND IF(C.FIRST_ORD_YN = 'Y', (SELECT COUNT(*) FROM TB_ORDER WHERE CUST_NO = #{custNo} AND ORD_DT BETWEEN C.BUY_STDT AND C.BUY_EDDT), 0) = 0
+						) A
+				) Z
+		 <!-- WHERE Z.DOWNLOAD_CNT <![CDATA[>=]]> 0 -->
+	
+	</select>
 </mapper>

+ 135 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfReview.xml

@@ -276,4 +276,139 @@
 		WHERE R.GOODS_CD = #{goodsCd}
 	</select>
 
+	<!-- 마이페이지 작성가능한 리뷰 -->
+	<select id="getCompleteReviewList" parameterType="Review" resultType="Goods">
+		SELECT F.*
+			  , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG  WHERE GOODS_CD = F.GOODS_CD AND COLOR_CD = F.MAIN_COLOR_CD AND DEFAULT_IMG_YN = 'Y' ) AS SYS_IMG_NM
+		FROM
+		(
+			SELECT O.ORD_NO 
+			      ,O.ORD_NM
+			      ,DATE_FORMAT(O.PAY_DT, '%Y-%m-%d') AS PAY_DT 
+			      ,O.CUST_NO 
+			      ,OD.ORD_DTL_NO
+			      ,OD.ORD_EXCH_GB 
+			      ,OD.GOODS_CD 
+			      ,OD.REAL_ORD_AMT 
+			      ,OD.SAVE_PNT_AMT 
+			      ,OD.GFCD_USE_AMT 
+			      ,ODI.ORD_DTL_ITEM_SQ 
+			      ,ODI.ITEM_CD 
+			      ,ODI.OPT_CD 
+			      ,ODI.OPT_CD1
+			      ,ODI.OPT_CD2
+			      ,ODI.ITEM_QTY 
+			      ,ODI.ITEM_PRICE
+			      ,G.GOODS_NM 
+			      ,G.MAIN_COLOR_CD
+			      ,B.BRAND_ENM 
+			      ,DATEDIFF( DATE_ADD(O.PAY_DT,INTERVAL 90 DAY),NOW()) AS REMAIN_DT -- 남은시간
+			FROM TB_ORDER O INNER JOIN TB_ORDER_DETAIL OD ON O.ORD_NO = OD.ORD_NO 
+								 			<!--  AND OD.ORD_DTL_STAT = 'G013_70' 구매 확정인것만 -->
+			                INNER JOIN TB_ORDER_DETAIL_ITEM ODI ON OD.ORD_DTL_NO = ODI.ORD_DTL_NO 
+			                  					 AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+			                  	              <!--    AND ODI.ORD_DTL_STAT = 'G013_70' -->
+			                INNER JOIN TB_GOODS G ON G.GOODS_CD = OD.GOODS_CD 
+			                INNER JOIN TB_BRAND B ON B.BRAND_CD = G.BRAND_CD
+			WHERE 1=1
+				AND O.PAY_DT <![CDATA[>]]>  DATE_FORMAT(DATE_ADD(CURRENT_DATE(), INTERVAL -90 DAY), '%Y%M%D%H%I%S') <!--  60 일이내것만 -->
+				AND O.ORD_NO NOT IN (SELECT R.ORD_NO FROM TB_REVIEW R WHERE R.DEL_YN = 'N')
+				AND O.CUST_NO = 100011
+				AND O.DISP_YN = 'Y'
+				AND O.SITE_CD = #{siteCd}
+				<if test="ordNo!=null and ordNo != ''">
+				AND O.ORD_NO = #{ordNo}
+				</if>
+				<if test="ordDtlNo!=null and ordDtlNo != ''">
+				AND OD.ORD_DTL_NO = #{ordDtlNo}
+				</if>
+				<if test="goodsCd!=null and goodsCd!=''">
+				AND G.GOODS_CD = #{goodsCd}
+				</if>
+			GROUP BY O.ORD_NO 
+			      ,O.ORD_NM 
+			      ,O.PAY_DT 
+			      ,O.CUST_NO 
+			      ,OD.ORD_DTL_NO
+			      ,OD.ORD_EXCH_GB 
+			      ,OD.GOODS_CD 
+			      ,OD.REAL_ORD_AMT 
+			      ,OD.SAVE_PNT_AMT 
+			      ,OD.GFCD_USE_AMT 
+			      ,ODI.ORD_DTL_ITEM_SQ 
+			      ,ODI.ITEM_CD 
+			      ,ODI.OPT_CD 
+			      ,ODI.OPT_CD1
+			      ,ODI.OPT_CD2
+			      ,ODI.ITEM_QTY 
+			      ,ODI.ITEM_PRICE
+			      ,G.GOODS_NM 
+			      ,G.MAIN_COLOR_CD
+			      ,B.BRAND_ENM 
+		)F
+		ORDER BY F.PAY_DT DESC
+	</select>
+	
+	<!-- 마이페이지 작성가능한 리뷰 -->
+	<select id="getCompleteReviewCount" parameterType="Review" resultType="int">
+		SELECT  COUNT(*) AS CNT 
+		FROM
+		(
+			SELECT O.ORD_NO 
+			      ,O.ORD_NM 
+			      ,O.PAY_DT 
+			      ,O.CUST_NO 
+			      ,OD.ORD_DTL_NO
+			      ,OD.ORD_EXCH_GB 
+			      ,OD.GOODS_CD 
+			      ,OD.REAL_ORD_AMT 
+			      ,OD.SAVE_PNT_AMT 
+			      ,OD.GFCD_USE_AMT 
+			      ,ODI.ORD_DTL_ITEM_SQ 
+			      ,ODI.ITEM_CD 
+			      ,ODI.OPT_CD 
+			      ,ODI.OPT_CD1
+			      ,ODI.OPT_CD2
+			      ,ODI.ITEM_QTY 
+			      ,ODI.ITEM_PRICE
+			      ,G.GOODS_NM 
+			      ,G.MAIN_COLOR_CD
+			      ,B.BRAND_ENM 
+			      ,DATEDIFF( DATE_ADD(O.PAY_DT,INTERVAL 90 DAY),NOW()) AS DT -- 남은시간
+			FROM TB_ORDER O INNER JOIN TB_ORDER_DETAIL OD ON O.ORD_NO = OD.ORD_NO 
+								 			<!--  AND OD.ORD_DTL_STAT = 'G013_70' 구매 확정인것만 -->
+			                INNER JOIN TB_ORDER_DETAIL_ITEM ODI ON OD.ORD_DTL_NO = ODI.ORD_DTL_NO 
+			                  					 AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+			                  	              <!--    AND ODI.ORD_DTL_STAT = 'G013_70' -->
+			                INNER JOIN TB_GOODS G ON G.GOODS_CD = OD.GOODS_CD 
+			                INNER JOIN TB_BRAND B ON B.BRAND_CD = G.BRAND_CD
+			WHERE 1=1
+				AND O.PAY_DT <![CDATA[>]]>  DATE_FORMAT(DATE_ADD(CURRENT_DATE(), INTERVAL -90 DAY), '%Y%M%D%H%I%S') <!--  60 일이내것만 -->
+				AND O.ORD_NO NOT IN (SELECT R.ORD_NO FROM TB_REVIEW R WHERE R.DEL_YN = 'N')
+				AND O.CUST_NO = 100011
+				AND O.DISP_YN = 'Y'
+				AND O.SITE_CD = #{siteCd}
+			GROUP BY O.ORD_NO 
+			      ,O.ORD_NM 
+			      ,O.PAY_DT 
+			      ,O.CUST_NO 
+			      ,OD.ORD_DTL_NO
+			      ,OD.ORD_EXCH_GB 
+			      ,OD.GOODS_CD 
+			      ,OD.REAL_ORD_AMT 
+			      ,OD.SAVE_PNT_AMT 
+			      ,OD.GFCD_USE_AMT 
+			      ,ODI.ORD_DTL_ITEM_SQ 
+			      ,ODI.ITEM_CD 
+			      ,ODI.OPT_CD 
+			      ,ODI.OPT_CD1
+			      ,ODI.OPT_CD2
+			      ,ODI.ITEM_QTY 
+			      ,ODI.ITEM_PRICE
+			      ,G.GOODS_NM 
+			      ,G.MAIN_COLOR_CD
+			      ,B.BRAND_ENM 
+		)F
+		ORDER BY F.PAY_DT DESC
+	</select>
 </mapper>

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

@@ -36,21 +36,18 @@
                		</th:block>
                 </p>
                 
-                
                 <p><strong>카테고리</strong>
                 	<th:block th:each="CateData, CateStat : ${cpnDtlRefvalCateList}">
                 		[[${CateData.cateNm}]],
                 	</th:block>
                 </p>
                 
-                
                 <p><strong>상품</strong>
                 	<th:block th:each="GoodsData, GoodsStat : ${cpnDtlRefvalApplyGoodsList}">
                 		[[${GoodsData.goodsNm}]],
                 	</th:block>
                 </p>
                 
-                
                 <p><strong>제외상품</strong>
                 	<th:block th:each="ExceptData, ExceptStat : ${cpnDtlRefvalExceptGoodsList}">
                 		[[${ExceptData.goodsNm}]],

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

@@ -26,10 +26,11 @@
 				<div class="lnb">
 							<div class="lnb_tit">
 						<h2>마이페이지</h2>
-					</div>
-					<div class="lnb_list">
+						<div class="lnb_list">
 						<ul id="mypageLnbList"></ul>
 					</div>
+					</div>
+					
 				</div>
 				<div class="cont">
 					<div class="sec_head">

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

@@ -0,0 +1,375 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/MypageLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : MypageReviewFormWeb.html
+ * @desc    : 마이페이지 > 리뷰 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.24   sowon     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+		<div class="content myReviewWrite"> <!-- 페이지특정 클래스 = myReviewWrite -->
+				<div class="cont_body">
+					<!-- CONT-BODY -->
+					<div class="lnb">
+						<div class="lnb_tit">
+							<h2>마이페이지</h2>
+						</div>
+						<div class="lnb_list">
+							<ul id="mypageLnbList"></ul>
+						</div>
+					</div>
+					<div class="cont">
+						<div class="sec_head">
+							<h3 class="subH1">리뷰</h3>
+						</div>
+						<div class="sec_body">
+							<div class="com_info_txt">
+								<p class="tit">리뷰 안내</p>
+								<ul>
+									<li>일반 리뷰 작성 시 150P, 포토/영상 리뷰는 350P가 추가 적립됩니다!</li>
+									<li>월 최대 10,000 P까지 적립 가능합니다.(합산 후 월 1회 지급)</li>
+									<li>베스트 리뷰로 선정되면 10,000P가 추가 적립됩니다!</li>
+									<li>리뷰 작성시 욕설, 비방, 선정적인 내용등이 있을 경우 통보 없이 관리자에 의해 삭제 될 수 있습니다.</li>
+								</ul>
+							</div>
+							
+							<form class="form_wrap">
+								<h4 class="subH3">리뷰쓰기</h4>
+								<div class="part_goods">
+									<div class="goods_cont">
+										<!-- 주문상품 -->
+										<th:block th:each="review, status : ${completeReviewList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
+										<div class="goods_info">
+											<div class="order_desc">
+												<div class="goods_box">
+													<div class="gd_item">	
+														<a href="">
+															<span class="thumb">
+																<img th:src="${imageUrl + '/' + review.sysImgNm}" width="100%" alt="">
+															</span>
+															<p>
+																<span class="buy_date"><em th:text="${review.payDt}"></em>&nbsp;구매</span>
+															</p>
+															<p>
+																<span class="brand" th:text="${review.brandEnm}"></span>
+																<!-- <span class="tag">STYLE24 일반배송</span> -->
+															</p>
+															<p>
+																<span class="name" th:text="${review.goodsNm}"></span>																
+															</p>
+														</a>
+													</div>
+													<div class="gd_opt">
+														<div class="option_wrap">
+															<span class="title sr-only">주문 옵션</span>
+															<span class="option">[[${review.optCd1}]]K&nbsp;/&nbsp;[[${review.optCd2}]]</span>
+														</div>
+													</div>
+												</div>
+											</div>
+										</div>
+										</th:block>
+										<!-- //주문상품 -->
+									</div>
+								</div>			
+
+								<h4 class="subH3">별점 선택</h4>
+								<div class="tbl type1">
+									<table>
+										<colgroup>
+											<col width="170">
+											<col width="*">
+										</colgroup>   
+										<tr>
+											<th>
+												별점
+											</th>
+											<td>
+												<div class="input_starscore">
+													<button type="button"></button>
+													<button type="button"></button>
+													<button type="button"></button>
+													<button type="button"></button>
+													<button type="button"></button>
+												</div>
+											</td>
+										</tr>
+									</table>
+								</div>
+
+								<h4 class="subH3">키 / 몸무게</h4>
+								<div class="tbl type1">
+									<table>
+										<colgroup>
+											<col width="170">
+											<col width="*">
+										</colgroup>   
+										<tr>
+											<th>
+												키
+											</th>
+											<td>
+												<div class="input_my_physical">
+													<div class="form_field">
+														<div class="input_wrap">
+															<input type="text" class="form_control" placeholder="숫자만 입력해 주세요.">
+															<span class="unit">cm</span>
+														</div>
+													</div>
+												</div>
+											</td>
+										</tr>
+										<tr>
+											<th>
+												몸무게
+											</th>
+											<td>
+												<div class="input_my_physical">
+													<div class="form_field">
+														<div class="input_wrap">
+															<input type="text" class="form_control" placeholder="숫자만 입력해 주세요.">
+															<span class="unit">cm</span>
+														</div>
+													</div>
+												</div>
+											</td>
+										</tr>
+									</table>
+								</div>
+								
+								<h4 class="subH3">상품 평가</h4>
+								<div class="tbl type1">
+									<table>
+										<colgroup>
+											<col width="170">
+											<col width="*">
+										</colgroup>   
+										<tr>
+											<th>
+												사이즈
+											</th>
+											<td>
+												<div class="input_simple_review">
+													<div class="form_field">
+														<div>
+															<input type="radio" name="rdi_review_size" id="rdi_review_size1" value="" checked="">
+															<label for="rdi_review_size1"><span>작음</span></label>
+														</div>
+														<div>
+															<input type="radio" name="rdi_review_size" id="rdi_review_size2" value="">
+															<label for="rdi_review_size2"><span>딱맞음</span></label>
+														</div>
+														<div>
+															<input type="radio" name="rdi_review_size" id="rdi_review_size3" value="">
+															<label for="rdi_review_size3"><span>큼</span></label>
+														</div>
+													</div>
+												</div>
+											</td>
+										</tr>
+										<tr>
+											<th>
+												컬러
+											</th>
+											<td>
+												<div class="input_simple_review">
+													<div class="form_field">
+														<div>
+															<input type="radio" name="rdi_review_color" id="rdi_review_color1" value="" checked="">
+															<label for="rdi_review_color1"><span>밝음</span></label>
+														</div>
+														<div>
+															<input type="radio" name="rdi_review_color" id="rdi_review_color2" value="">
+															<label for="rdi_review_color2"><span>똑같음</span></label>
+														</div>
+														<div>
+															<input type="radio" name="rdi_review_color" id="rdi_review_color3" value="">
+															<label for="rdi_review_color3"><span>큼</span></label>
+														</div>
+													</div>
+												</div>
+											</td>
+										</tr>
+										<tr>
+											<th>
+												핏
+											</th>
+											<td>
+												<div class="input_simple_review">
+													<div class="form_field">
+														<div>
+															<input type="radio" name="rdi_review_fit" id="rdi_review_fit1" value="" checked="">
+															<label for="rdi_review_fit1"><span>슬림</span></label>
+														</div>
+														<div>
+															<input type="radio" name="rdi_review_fit" id="rdi_review_fit2" value="">
+															<label for="rdi_review_fit2"><span>레귤러</span></label>
+														</div>
+														<div>
+															<input type="radio" name="rdi_review_fit" id="rdi_review_fit3" value="">
+															<label for="rdi_review_fit3"><span>오버</span></label>
+														</div>
+													</div>
+												</div>
+											</td>
+										</tr>
+										<tr>
+											<th>
+												두께감
+											</th>
+											<td>
+												<div class="input_simple_review">
+													<div class="form_field">
+														<div>
+															<input type="radio" name="rdi_review_thick" id="rdi_review_thick1" value="" checked="">
+															<label for="rdi_review_thick1"><span>얇음</span></label>
+														</div>
+														<div>
+															<input type="radio" name="rdi_review_thick" id="rdi_review_thick2" value="">
+															<label for="rdi_review_thick2"><span>적당함</span></label>
+														</div>
+														<div>
+															<input type="radio" name="rdi_review_thick" id="rdi_review_thick3" value="">
+															<label for="rdi_review_thick3"><span>도톰함</span></label>
+														</div>
+													</div>
+												</div>
+											</td>
+										</tr>
+										<tr>
+											<th>
+												무게감
+											</th>
+											<td>
+												<div class="input_simple_review">
+													<div class="form_field">
+														<div>
+															<input type="radio" name="rdi_review_weight" id="rdi_review_weight1" value="" checked="">
+															<label for="rdi_review_weight1"><span>가벼움</span></label>
+														</div>
+														<div>
+															<input type="radio" name="rdi_review_weight" id="rdi_review_weight2" value="">
+															<label for="rdi_review_weight2"><span>적당함</span></label>
+														</div>
+														<div>
+															<input type="radio" name="rdi_review_weight" id="rdi_review_weight3" value="">
+															<label for="rdi_review_weight3"><span>무거움</span></label>
+														</div>
+													</div>
+												</div>
+											</td>
+										</tr>
+										<tr>
+											<th>
+												볼너비
+											</th>
+											<td>
+												<div class="input_simple_review">
+													<div class="form_field">
+														<div>
+															<input type="radio" name="rdi_review_width" id="rdi_review_width1" value="" checked="">
+															<label for="rdi_review_width1"><span>작음</span></label>
+														</div>
+														<div>
+															<input type="radio" name="rdi_review_width" id="rdi_review_width2" value="">
+															<label for="rdi_review_width2"><span>딱맞음</span></label>
+														</div>
+														<div>
+															<input type="radio" name="rdi_review_width" id="rdi_review_width3" value="">
+															<label for="rdi_review_width3"><span>큼</span></label>
+														</div>
+													</div>
+												</div>
+											</td>
+										</tr>
+									</table>
+								</div>
+
+								<h4 class="subH3">고객님의 리뷰가 다른 고객들에게 도움이 될 수 있어요!</h4>
+								<div class="tbl type1">
+									<table>
+										<colgroup>
+											<col width="170">
+											<col width="*">
+										</colgroup>   
+										<tr>
+											<th>
+												리뷰내용
+											</th>
+											<td>
+												<div class="input_txt_review">
+													<div class="form_field">
+														<div class="input_wrap">
+															<textarea class="doc_review" name="" id="" cols="30" rows="10" placeholder="·&nbsp;리뷰 내용은 최소 10자 이상 입력해 주세요.&#13;&#10;·&nbsp;상품과 무관하거나 스팸, 음란, 불법적인 내용의 리뷰는 통보 없이 삭제되며, 지급한 포인트는 회수 될 수 있습니다.&#13;&#10;·&nbsp;리뷰 등록 후 관리자 승인이 필요한 경우 바로 노출이 되지 않을 수 있습니다." style="resize: none;"></textarea>
+															<p class="txt_cnt"><span id="review_cnt" class="c_primary">0</span>/500</p>			
+														</div> 
+													</div>
+												</div>
+											</td>
+										</tr>
+										<tr>
+											<th>
+												포토/영상 첨부
+											</th>
+											<td>
+												<div class="form_field">
+													<div class="input_wrap">
+														<!-- 이미지첨부 -->
+														<div class="form_field">
+															<div class="imgUpload">
+																<label for="fileAdd" class="fileAdd">첫번째업로드</label>
+																<input type="file" id="fileAdd" name="files[]">
+															</div>
+														</div>
+														<!-- //이미지첨부 -->
+													</div> 
+												</div>
+												<div class="txt_info">
+													<ul>
+														<li>
+															최대 10개까지 등록 가능
+														</li>
+													</ul>
+												</div>
+											</td>
+										</tr>
+									</table>
+								</div>							
+
+								<div class="btn_footer_area">
+									<button type="button" class="btn btn_default btn_md"><span>취소</span></button>
+									<button type="button" id="btn_review_registration" class="btn btn_dark btn_md"><span>리뷰 등록</span></button>
+								</div>		
+							</form>							
+						</div>
+					</div>
+					<!-- // CONT-BODY -->					
+				</div>
+			</div>
+
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+$(document).ready(function() {
+
+	// 마이페이지 LNB 설정
+	fnSetMypageLnbList(7);
+
+	// 마이페이지 location 설정
+	fnSetMypageLocation('리뷰', '_PAGE_MYPAGE_REVIEW');
+	
+});
+</script>
+</th:block>
+
+</body>
+</html>

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

@@ -0,0 +1,191 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/MypageLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : MypageReviewFormWeb.html
+ * @desc    : 마이페이지 > 리뷰 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.24   sowon     최초 작성
+ *******************************************************************************
+ -->
+<body>
+	<th:block layout:fragment="content">
+			<div class="content myReviewList"> <!-- 페이지특정 클래스 = myReviewList -->
+				<div class="cont_body">
+					<!-- CONT-BODY -->
+					<div class="lnb">
+					<div class="lnb_tit">
+						<h2>마이페이지</h2>
+					</div>
+					<div class="lnb_list">
+						<ul id="mypageLnbList"></ul>
+					</div>
+				</div>
+					<!-- <div class="lnb_list">
+						<ul id="mypageLnbList"></ul>
+					</div> -->
+					<div class="cont">
+						<div class="sec_head">
+							<h3 class="subH1">리뷰</h3>
+						</div>
+						<div class="sec_body">
+							<div class="com_info_txt">
+								<p class="tit">리뷰 안내</p>
+								<ul>
+									<li>일반 리뷰 작성 시 150P, 포토/영상 리뷰는 350P가 추가 적립됩니다!</li>
+									<li>월 최대 10,000 P까지 적립 가능합니다.(합산 후 월 1회 지급)</li>
+									<li>베스트 리뷰로 선정되면 10,000P가 추가 적립됩니다!</li>
+									<li>리뷰는 주문일 기준 90일간 작성이 가능합니다.</li>
+								</ul>
+							</div>
+							<div class="taps" id="tpasReview">
+								<div>
+									<ul>
+										<li id="completeReview"><a href="javascript:void(0);" >작성 가능한 리뷰<span th:text="'('+${#numbers.formatInteger(completeReviewCount,0,'COMMA')}+')'"></span></a></li>
+										<li id="alreadyReview"><a href="javascript:void(0);" >내가 쓴 리뷰<span>(2,405)</span></a></li>
+									</ul>
+								</div>
+							</div>
+							<div class="area_list" id="completeList">
+			
+								<!-- //주문번호 기준 상품 내역 -->	
+								<!-- 데이터 없을 시 -->
+								<div class="nodata" style="display:none;">
+									<div class="txt_box">
+										<p>
+											작성 가능한 리뷰가 없습니다.<br>
+										</p>
+									</div>
+								</div>
+								<!-- //데이터 없을 시 -->																							
+							</div>
+						</div>
+						<div class="sec_foot">
+							<div class="ui_row">
+								<ul class="pageNav" id="paging">
+								
+								</ul>
+							</div>
+						</div>
+						<form id="searchForm" name="searchForm" th:action="@{'/mypage/review/list'}" th:method="post">
+							<input type="hidden" name="pageNo" value="1" />
+							<input type="hidden" name="pageSize" value="10" />
+						</form>
+					</div>
+					<!-- // CONT-BODY -->					
+				</div>
+			</div>
+
+	<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+	<script th:inline="javascript">
+	// 작성가능한 리뷰 클릭 시 
+	$("#completeReview").click(function() {
+		$("#alreadyReview").removeClass("active");
+		$("#completeReview").addClass("active");
+		
+	})
+	
+	$("#alreadyReview").click(function() {
+		$("#completeReview").removeClass("active");
+		$("#alreadyReview").addClass("active");
+		
+	})
+	
+	$(document).ready(function() {
+
+		// 마이페이지 LNB 설정
+		fnSetMypageLnbList(7);
+
+		// 마이페이지 location 설정
+		fnSetMypageLocation('리뷰', '_PAGE_MYPAGE_REVIEW');
+		
+		// Initialize a pagination
+		gagaPaging.init('searchForm', fnSearchCallback, 'paging', 10);
+		
+		// Load data
+		gagaPaging.load(1);
+		
+		// 작성가능한 리뷰표시
+		$("#completeReview").trigger('click');
+
+	
+	});
+	
+	// 주문 목록 조회 콜백
+	var fnSearchCallback = function(result) {
+		$('.nodata').hide();
+		let imageUrl = [[${@environment.getProperty('upload.goods.view')}]];
+		$('#completeList').html('');
+		if (result.dataList != null && result.dataList.length > 0) {
+			$.each(result.dataList, function(idx, item) {
+				let html = '';
+				html += '<div class="part_goods">                                                                                                  ';
+				html += '	<div class="goods_cont">                                                                                              ';
+				html += '		<div class="goods_info">                                                                                          ';
+				html += '			<div class="order_desc">                                                                                      ';
+				html += '				<div class="goods_box">                                                                                   ';
+				html += '					<div class="gd_item">	                                                                              ';
+				html += '						<a href="">                                                                                       ';
+				html += '							<span class="thumb">                                                                          ';
+				html += '								<img th:src="' + imageUrl + '/' + item.sysImgNm + '"  width="100%" alt="">  ';
+				html += '							</span>                                                                                       ';
+				html += '							<p>                                                                                           ';
+				html += '								<span class="buy_date"><em>'+item.payDt+'</em>&nbsp;구매</span>             ';
+				html += '							</p>                                                                                          ';
+				html += '							<p>                                                                                           ';
+				html += '								<span class="brand">'+item.brandEnm+'</span>                               ';
+				html += '							</p>                                                                                          ';
+				html += '							<p>                                                                                           ';
+				html += '								<span class="name">'+item.goodsNm+'</span>									';
+				html += '							</p>                                                                                          ';
+				html += '						</a>                                                                                              ';
+				html += '					</div>                                                                                                ';
+				html += '					<div class="gd_opt">                                                                                  ';
+				html += '						<div class="option_wrap">                                                                         ';
+				html += '							<span class="title sr-only">주문 옵션</span>                                                      ';
+				html += '							<span class="option">'+item.optCd1+'&nbsp;/&nbsp;'+item.optCd2+'</span>     ';
+				html += '						</div>                                                                                            ';
+				html += '					</div>                                                                                                ';
+				html += '				</div>                                                                                                    ';
+				html += '				<div class="status_box">                                                                                  ';
+				html += '					<p>'+item.remainDt+'일 남음</p>                                                                                                  ';
+				html += '				</div>                                                                                                    ';
+				html += '				<div class="button_box">                                                                                  ';
+				html += '					<p><button type="button" class="btn btn_primary_line btn_sm" onclick="fnReviewCreate('+item.ordNo+','+item.ordDtlNo+','+item.goodsCd+')"><span>리뷰쓰기</span></button></p>           ';
+				html += '				</div>                                                                                                    ';
+				html += '			</div>                                                                                                        ';
+				html += '		</div>                                                                                                            ';
+				html += '	</div>                                                                                                                ';
+				html += '</div>                                                                                                                    ';
+				$('#completeList').append(html);
+			})
+		}else{
+			$('.nodata').show();
+		}
+
+		// Create pagination
+		gagaPaging.createPagination(result.paging.pageable);
+	}
+	
+	var fnReviewCreate = function(obj1,obj2,obj3) {
+		let ordNo = obj1;
+		let ordDtlNo = obj2;
+		let goodsCd = obj3;
+		
+
+		
+		cfnGoToPage(_PAGE_MYPAGE_CREATE_REVIEW + ordNo +'/'+ordDtlNo+'/'+goodsCd);
+		
+	}
+	</script>
+	</th:block>
+
+</body>
+</html>

+ 41 - 5
src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html

@@ -193,7 +193,7 @@
 									<div class="swiper-slide">
 										<a th:onclick="planDetailSearch([[${PlanData.planSq}]])">
 											<div class="thumb">
-												<img th:src="${@environment.getProperty('domain.image')+'/planning/'+PlanData.mainPimg}" alt="${PlanData.planNm}">
+												<img th:src="${@environment.getProperty('domain.image')+PlanData.mainPimg}" alt="${PlanData.planNm}">
 											</div>
 											<div class="txt">
 												<span class="brand" th:if="${PlanData.cnt > 1}" th:text="${PlanData.brand}+' 외'"></span>
@@ -212,6 +212,8 @@
 				</th:block>
 			</div>
 		</div>
+		
+	<div class="modal fade dp_coupon_pop"  id="coupon_modal_02" tabindex="-1" role="dialog"	aria-labelledby="PopupBasicLabel" aria-hidden="true"></div>
 		<!-- // container -->
 <script th:inline="javascript">
 let review = [[${reviewInfo}]];
@@ -327,8 +329,7 @@ if(coupon != null || coupon != ''){
 		html += '						</p>';
 		html += '					</div>';
 		if (coupon[i].couponStat == '쿠폰받기') {
-			html += '					<button type="button"';
-			html += '						class="btn btn_dark btn_block btn_coupon_down">';  /* btn_coupon_done */
+			html += '					<button type="button" id="coupon_" class="btn btn_dark btn_block btn_coupon_down" onclick="fnPlanCouponDown('+coupon[i].cpnId+')">';  /* btn_coupon_done */
 			html += '						<span>쿠폰받기</span>';								/* 받기완료  */
 			html += '					</button>';			
 		}else{
@@ -376,7 +377,7 @@ if(image != null || image != ''){
 	
 	for (var i = 0; i < image.length; i++) {
 		html += '                	<div class="swiper-slide">';
-		html += '                    	<img alt="" src="'+ imgUrl +'/planning/'+image[i].itemVal +'">';
+		html += '                    	<img alt="" src="'+ imgUrl + image[i].itemVal +'">';
 		html += '                	</div>';
 	}
 	html += '            	</div>';
@@ -527,9 +528,44 @@ if(goods2 != null || goods2 != ''){
 		
 }
 
+//사용안내 모달
+var useInfoCoupon = function (id) {
+	 $.ajax( {
+		type		: "GET",
+		url 		: '/mypage/coupon/detailPop?cpnId='+ id,
+		dataType 	: 'html',
+		success 	: function(result) {
+			if (result != null) {
+				$("#coupon_modal_02").html(result);
+				$("#coupon_modal_02").modal("show");
+			}
+		}
+	});
+	
+	return false; 
+}
+
+// 쿠폰 다운로드
+	var fnPlanCouponDown = function(obj){
+	
+		if (!cfCheckLogin()) {
+			cfnGoToPage(_PAGE_LOGIN);
+			return false;
+		}
+		
+		let cpnId = obj;
+		gagajf.ajaxJsonSubmit(_PAGE_PLANNING_CPN_DOWNLOAD, JSON.stringify({cpnId: cpnId}), fnPlanCouponCallBack);
+	}
+	
+	// 쿠폰다운로드 콜백
+	var fnPlanCouponCallBack = function(result){
+		
+		// 화면 전환 필요		
+	}
+
 //세번째 자리 콤마찍기 (숫자만 포함, 소수점자리 구분)
 function comma(num){
-return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
+	return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
 }
 
 

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

@@ -59,6 +59,7 @@ const _PAGE_MYPAGE_COUPON = _frontUrl + "/mypage/coupon/form";					// 마이페
 const _PAGE_MYPAGE_POINT = _frontUrl + "/mypage/point/form";					// 마이페이지 > 포인트
 const _PAGE_MYPAGE_GIFTCARD = _frontUrl + "/mypage/gift/card/form";				// 마이페이지 > 상품권
 const _PAGE_MYPAGE_REVIEW = _frontUrl + "/mypage/review/form";					// 마이페이지 > 리뷰
+const _PAGE_MYPAGE_CREATE_REVIEW = _frontUrl + "/mypage/review/create/form/";	// 마이페이지 > 리뷰 > 리뷰작성
 const _PAGE_MYPAGE_DELIVERY_ADDR = _frontUrl + "/mypage/delivery/addr/form";	// 마이페이지 > 배송지 관리
 const _PAGE_MYPAGE_WISHLIST = _frontUrl + "/mypage/wish/list/form";				// 마이페이지 > 위시리스트
 const _PAGE_MYPAGE_CUSTOMER = _frontUrl + "/mypage/customer/confirm/form";		// 마이페이지 > 내정보 관리 > 회원정보 확인
@@ -74,6 +75,7 @@ const _PAGE_WISHLIST_DEL = _frontUrl + "/mypage/wish/list/delete";				// 위시
 //== 기획전 ==/
 const _PAGE_PLANNING_MAIN = _frontUrl + "/planning/main/form"; 					// 기획전 메인
 const _PAGE_PLANNING_DETAIL = _frontUrl + "/planning/detail/form";				// 기획전 상세
+const _PAGE_PLANNING_CPN_DOWNLOAD = "/planning/coupon/download";			    // 상품쿠폰다운로드
 
 //== 핫딜==/
 const _PAGE_SOCIAL_MAIN = _frontUrl + "/social/main/form";						// 소설(핫딜) 메인