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

상품평관리 기능 추가

gagamel 5 роки тому
батько
коміт
40f9cbb8d9

+ 26 - 0
src/main/java/com/style24/admin/biz/dao/TsaReviewDao.java

@@ -0,0 +1,26 @@
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Review;
+
+/**
+ * 상품평 Dao
+ *
+ * @author gagamel
+ * @since 2021. 1. 25
+ */
+@ShopDs
+public interface TsaReviewDao {
+
+	/**
+	 * 상품평 목록
+	 * @param review - 상품평 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 25
+	 */
+	Collection<Review> getReviewList(Review review);
+
+}

+ 41 - 0
src/main/java/com/style24/admin/biz/service/TsaReviewService.java

@@ -0,0 +1,41 @@
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.admin.biz.dao.TsaReviewDao;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Review;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 상품평 Service
+ *
+ * @author gagamel
+ * @since 2021. 1. 25
+ */
+@Service
+@Slf4j
+public class TsaReviewService {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TsaReviewDao reviewDao;
+
+	/**
+	 * 상품평 목록
+	 * @param review - 상품평 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 25
+	 */
+	public Collection<Review> getReviewList(Review review) {
+		return reviewDao.getReviewList(review);
+	}
+
+}

+ 116 - 31
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -4,15 +4,10 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.style24.persistence.TscPageRequest;
-import com.style24.persistence.domain.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -27,10 +22,22 @@ import com.style24.admin.biz.service.TsaCouponService;
 import com.style24.admin.biz.service.TsaFreegiftPromotionService;
 import com.style24.admin.biz.service.TsaMorebetterService;
 import com.style24.admin.biz.service.TsaRendererService;
+import com.style24.admin.biz.service.TsaReviewService;
 import com.style24.admin.biz.service.TsaSystemService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.TscPageRequest;
+import com.style24.persistence.domain.CommonCode;
+import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.CouponRefval;
+import com.style24.persistence.domain.CustCoupon;
+import com.style24.persistence.domain.FreeGoodsPromotion;
+import com.style24.persistence.domain.MoreBetter;
+import com.style24.persistence.domain.MoreBetterBurden;
+import com.style24.persistence.domain.MoreBetterGoods;
+import com.style24.persistence.domain.MoreBetterSection;
+import com.style24.persistence.domain.Review;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -53,6 +60,9 @@ public class TsaMarketingController extends TsaBaseController {
 	@Autowired
 	private Environment env;
 
+	@Autowired
+	private TsaReviewService reviewService;
+
 	@Autowired
 	private TsaFreegiftPromotionService freegiftService;
 
@@ -74,6 +84,84 @@ public class TsaMarketingController extends TsaBaseController {
 	@Autowired
 	private TsaCouponService couponService;
 
+	/**
+	 * 상품평관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 25
+	 */
+	@GetMapping("/review/form")
+	public ModelAndView reviewForm() {
+		ModelAndView mav = new ModelAndView("marketing/ReviewForm");
+
+		// 사이즈점수
+		mav.addObject("scoreSizeList", rendererService.getAvailCommonCodeList("G040"));
+
+		// 색상점수
+		mav.addObject("scoreColorList", rendererService.getAvailCommonCodeList("G039"));
+
+		// 핏점수
+		mav.addObject("scoreFitList", rendererService.getAvailCommonCodeList("G042"));
+
+		// 두께감점수
+		mav.addObject("scoreThickList", rendererService.getAvailCommonCodeList("G079"));
+
+		// 무게감점수
+		mav.addObject("scoreWeightList", rendererService.getAvailCommonCodeList("G080"));
+
+		// 발볼넓이점수(G041)
+		mav.addObject("scoreBallList", rendererService.getAvailCommonCodeList("G041"));
+
+		// 포인트지급상태
+		mav.addObject("pntGiveStatList", rendererService.getAvailCommonCodeList("G043"));
+
+//		// 품목
+//		mav.addObject("itemkindList", rendererService.getAllItemkindList());
+//		
+//		// 브랜드그룹
+//		mav.addObject("brandGrpNmList", rendererService.getBrandGroupList());
+//		
+//		// MD
+//		mav.addObject("brandMdList", rendererService.getBrandMdList());
+//
+//		// 카테고리
+//		mav.addObject("tCateList", rendererService.getTCategoryList(""));
+//
+//		// 브랜드 조회
+//		mav.addObject("brandList", rendererService.getSupplyCompanyBrandList(""));
+
+		return mav;
+	}
+
+	/**
+	 * 상품평 목록
+	 * @param review - 상품평 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 25
+	 */
+	@PostMapping("/review/list")
+	@ResponseBody
+	public GagaMap getReviewList(@RequestBody Review review) {
+		GagaMap result = new GagaMap();
+
+		// multi row 검색관련 처리
+		if (StringUtils.isNotBlank(review.getGoodsCd())) {
+			review.setGoodsCds(review.getGoodsCd().replaceAll("\r", "").split("\n"));
+		}
+
+		// 상품평 목록
+		Collection<Review> reviewList = reviewService.getReviewList(review);
+
+		review.setPageable(new TscPageRequest(review.getPageNo() - 1, review.getPageSize()));
+		review.getPageable().setTotalCount(reviewList.size());
+
+		result.set("paging", review);
+		result.set("dataList", reviewList);
+
+		return result;
+	}
+
 	/* xodud1202 진행 */
 	/**
 	 * 사은품 프로모션 관리 화면
@@ -154,7 +242,7 @@ public class TsaMarketingController extends TsaBaseController {
 	public GagaResponse freeGoodsPromotionSave(@RequestBody FreeGoodsPromotion param) {
 		try {
 			freegiftService.saveFreegoodsPromotionInfo(param);
-		} catch(Exception e) {
+		} catch (Exception e) {
 			e.printStackTrace();
 			return super.error(message.getMessage("FAIL_0001"));
 		}
@@ -174,7 +262,7 @@ public class TsaMarketingController extends TsaBaseController {
 	public GagaResponse freeGoodsPromotionChangeStat(@RequestBody FreeGoodsPromotion param) {
 		try {
 			freegiftService.updateFreegoodsPromotionStat(param);
-		} catch(Exception e) {
+		} catch (Exception e) {
 			e.printStackTrace();
 			return super.error(message.getMessage("FAIL_0001"));
 		}
@@ -182,7 +270,6 @@ public class TsaMarketingController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 
-
 	/* // xodud1202 진행 */
 
 	/* JSM 진행 */
@@ -243,7 +330,7 @@ public class TsaMarketingController extends TsaBaseController {
 	 */
 	@GetMapping("/coupon/popup/form")
 	@ResponseBody
-	public ModelAndView couponCreatePopup(@RequestParam(value="cpnId") String cpnId ) {
+	public ModelAndView couponCreatePopup(@RequestParam(value = "cpnId") String cpnId) {
 		ModelAndView mav = new ModelAndView();
 		String num = "";
 		String mode = "N";
@@ -291,17 +378,17 @@ public class TsaMarketingController extends TsaBaseController {
 		// 입점업체 조회
 		mav.addObject("ibSupplyCompList", rendererService.getSupplyCompanyList("", "N"));
 		// 정상/이월 조회
-		mav.addObject("formalGbList" , rendererService.getCommonCodeList("G009"));
+		mav.addObject("formalGbList", rendererService.getCommonCodeList("G009"));
 		// 카테고리 구분 조회
-		mav.addObject("cateGbList" , rendererService.getCommonCodeList("G032"));
+		mav.addObject("cateGbList", rendererService.getCommonCodeList("G032"));
 		// 자사 브랜드 조회
-		mav.addObject("selfBrandList" , couponService.getSelfBrandList());
+		mav.addObject("selfBrandList", couponService.getSelfBrandList());
 		// 사이트코드 조회
 		mav.addObject("siteCdList", rendererService.getCommonCodeList("G000"));
 		// 쿠폰상태 조회
 		mav.addObject("cpnStatList", rendererService.getCommonCodeList("G232"));
 		// 쿠폰 유형 조회
-		mav.addObject("cpnTypeList", rendererService.getCommonCodeList("G230" , "Y"));
+		mav.addObject("cpnTypeList", rendererService.getCommonCodeList("G230", "Y"));
 		// 사용가능 고객구분 조회
 		mav.addObject("usableCustGbList", rendererService.getCommonCodeList("G100"));
 		// 사용가능 고객등급 조회
@@ -318,29 +405,29 @@ public class TsaMarketingController extends TsaBaseController {
 		mav.addObject("upperAfLinkCdList", rendererService.getCommonCodeList("G053"));
 
 		// 이미 쿠폰 아이디가 있으면 적용대상 조회
-		if(!StringUtils.isBlank(cpnId)) {
+		if (!StringUtils.isBlank(cpnId)) {
 			mode = "U";
 			issueCnt = couponService.getCouponIssueCnt(cpnId);
 			// 쿠폰상세조회
-			mav.addObject("cpnDetail" , couponService.getCouponDetail(cpnId));
+			mav.addObject("cpnDetail", couponService.getCouponDetail(cpnId));
 			// 쿠폰적용대상 - 공급업체 조회
-			mav.addObject("cpnDtlRefvalSupplyCompList" , couponService.getCouponRefvalSupplyCompList(cpnId));
+			mav.addObject("cpnDtlRefvalSupplyCompList", couponService.getCouponRefvalSupplyCompList(cpnId));
 			// 쿠폰적용대상 - 적용상품 조회
-			mav.addObject("cpnDtlRefvalApplyGoodsList" , couponService.getCouponRefvalGoodsList(cpnId , "G260_10"));
+			mav.addObject("cpnDtlRefvalApplyGoodsList", couponService.getCouponRefvalGoodsList(cpnId, "G260_10"));
 			// 쿠폰적용대상 - 카테고리 조회
-			mav.addObject("cpnDtlRefvalCateList" , couponService.getCouponRefvalCategoryList(cpnId));
+			mav.addObject("cpnDtlRefvalCateList", couponService.getCouponRefvalCategoryList(cpnId));
 			// 쿠폰적용대상 - 브랜드 조회
-			mav.addObject("cpnDtlRefvalBrandList" , couponService.getCouponRefvalBrandList(cpnId));
+			mav.addObject("cpnDtlRefvalBrandList", couponService.getCouponRefvalBrandList(cpnId));
 			// 쿠폰적용대상 - 제외상품 조회
-			mav.addObject("cpnDtlRefvalExceptGoodsList" , couponService.getCouponRefvalGoodsList(cpnId , "G260_14"));
+			mav.addObject("cpnDtlRefvalExceptGoodsList", couponService.getCouponRefvalGoodsList(cpnId, "G260_14"));
 			// 쿠폰 입점업체분담율 조회
-			mav.addObject("cpnDtlBurdenList" , couponService.getCouponBurdenList(cpnId));
+			mav.addObject("cpnDtlBurdenList", couponService.getCouponBurdenList(cpnId));
 		}
 
 		//issueCnt = 3;
 
-		mav.addObject("mode" , mode);
-		mav.addObject("issueCnt" , issueCnt);
+		mav.addObject("mode", mode);
+		mav.addObject("issueCnt", issueCnt);
 
 		mav.setViewName("marketing/CouponPopupForm");
 		return mav;
@@ -380,7 +467,6 @@ public class TsaMarketingController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 
-
 	/**
 	 * 쿠폰발행팝업
 	 * @param
@@ -433,14 +519,14 @@ public class TsaMarketingController extends TsaBaseController {
 		// 시간 시 리스트 세팅
 		mav.addObject("hhList", hhList);
 		// 사이트조회
-		mav.addObject("siteCdList" , rendererService.getCommonCodeList("G000"));
+		mav.addObject("siteCdList", rendererService.getCommonCodeList("G000"));
 		// 사용가능 고객구분 조회
 		mav.addObject("usableCustGbList", rendererService.getCommonCodeList("G100"));
 		// 사용가능 고객등급 조회
 		mav.addObject("usableCustGradeList", rendererService.getCommonCodeList("G110"));
 		// 쿠폰발행사유 조회
 		mav.addObject("cpnPubReasonList", rendererService.getCommonCodeList("G068"));
-		
+
 		mav.setViewName("marketing/CouponPubForCustPopupForm");
 
 		return mav;
@@ -455,7 +541,7 @@ public class TsaMarketingController extends TsaBaseController {
 	 */
 	@PostMapping("/coupon/insertCustPub")
 	@ResponseBody
-	public GagaResponse saveCouponCustPub(@RequestBody CustCoupon custCoupon ){
+	public GagaResponse saveCouponCustPub(@RequestBody CustCoupon custCoupon) {
 		couponService.saveCouponCustPub(custCoupon);
 
 		return super.ok(message.getMessage("SUCC_0006"));
@@ -577,7 +663,7 @@ public class TsaMarketingController extends TsaBaseController {
 
 	@PostMapping("/morebetter/save")
 	@ResponseBody
-	public GagaResponse saveMorebetterDetail(@RequestBody MoreBetter moreBetter){
+	public GagaResponse saveMorebetterDetail(@RequestBody MoreBetter moreBetter) {
 		String[] multiSupplyCompCd = moreBetter.getSupplyCompArr().split(",");
 		String[] multiBrand = moreBetter.getBrandArr().split(",");
 
@@ -585,7 +671,7 @@ public class TsaMarketingController extends TsaBaseController {
 
 		moreBetterGoods.setMultiSupplyCompCd(multiSupplyCompCd);
 		moreBetterGoods.setMultiBrand(multiBrand);
-		log.info("[saveMorebetterDetail moreBetterGoods]{}",moreBetterGoods);
+		log.info("[saveMorebetterDetail moreBetterGoods]{}", moreBetterGoods);
 
 		// TMTB_GOODS_TEMP TABLE TRUNCATE -> 다른 다다에서 사용중인 상품 조회 -> INSERT
 		morebetterService.createMorebetterGoodsTemp();
@@ -593,13 +679,12 @@ public class TsaMarketingController extends TsaBaseController {
 		// 다른 다다에서 사용중인 상품 조회
 		Collection<MoreBetterGoods> duplicateGoodsList = morebetterService.getMorebetterDuplicateList(moreBetterGoods);
 
-		log.info("[duplicateGoodsList size]{}",duplicateGoodsList.size());
+		log.info("[duplicateGoodsList size]{}", duplicateGoodsList.size());
 
 		// SELECT -> 지금 내가 선택한 업체&브랜드에 해당하는 상품 조회 MINUS TMTB_GOODS_TEMP 상품
 		// 조회 건수 있으면 -> 해당 상품코드 엑셀로 던져주기
 		// 조회 건수 없으면 -> 저장으로 넘어감
 
-
 		//morebetterService.saveMoreBetterDetail(moreBetter);
 		return super.ok(message.getMessage("SUCC_0001"));
 	}

+ 80 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaReview.xml

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaReviewDao">
+
+	<!--상품평 목록  -->
+	<select id="getReviewList" parameterType="Review" resultType="Review">
+		/* TsaReview.getReviewList */
+		SELECT R.REVIEW_SQ                                                /*상품평일련번호*/
+		     , R.GOODS_CD                                                 /*상품코드*/
+		     , G.GOODS_NM                                                 /*상품명*/
+		     , (SELECT SYS_IMG_NM
+		        FROM   TB_GOODS_IMG
+		        WHERE  GOODS_CD = G.GOODS_CD
+		        AND    COLOR_CD = G.MAIN_COLOR_CD
+		        AND    DEFAULT_IMG_YN = 'Y' /*디폴트이미지*/
+		        LIMIT 1
+		       )                                        AS GOODS_IMG      /*상품이미지*/
+		     , R.REVIEW_GB                                                /*상품평구분*/
+		     , R.CUST_NO                                                  /*고객번호*/
+		     , C.CUST_NM                                                  /*고객명*/
+		     , R.ORD_NO                                                   /*주문번호*/
+		     , R.ORD_DTL_NO                                               /*주문상세번호*/
+		     , R.REVIEW_TITLE                                             /*상품평제목*/
+		     , R.REVIEW_CONTENT                                           /*상품평내용*/
+		     , R.SCORE                                                    /*구매평점*/
+		     , R.HEIGHT                                                   /*키*/
+		     , R.WEIGHT                                                   /*몸무게*/
+		     , R.SCORE_SIZE                                               /*사이즈점수*/
+		     , R.SCORE_COLOR                                              /*컬러점수*/
+		     , R.SCORE_FIT                                                /*핏점수*/
+		     , R.SCORE_THICK                                              /*두께감점수*/
+		     , R.SCORE_WEIGHT                                             /*무게감점수*/
+		     , R.SCORE_BALL                                               /*볼넓이점수*/
+		     , R.GIVE_DUE_PNT                                             /*지급예정포인트*/
+		     , R.PNT_GIVE_STAT                                            /*포인트지급상태*/
+		     , R.DISP_YN                                                  /*표시여부*/
+		     , R.DEL_YN                                                   /*삭제여부*/
+		     , R.CONFIRM_YN                                               /*확인여부*/
+		     , FN_GET_USER_NM(R.CONFIRM_UNO)            AS CONFIRM_UNM    /*확인자명*/
+		     , DATE_FORMAT(R.CONFIRM_DT,'%Y%m%d%H%i%S') AS CONFIRM_DT     /*확인일시*/ 
+		     , R.ADM_RPL                                                  /*관리자댓글*/
+		     , FN_GET_USER_NM(R.ADM_RPL_REG_NO)         AS ADM_RPL_GRE_NM /*관리자댓글작성자명*/
+		     , DATE_FORMAT(R.ADM_RPL_DT,'%Y%m%d%H%i%S') AS ADM_RPL_DT     /*관리자댓글작성일시*/
+		FROM   TB_REVIEW R
+		     , TB_CUSTOMER C
+		     , TB_GOODS G
+		WHERE  R.CUST_NO = C.CUST_NO
+		AND    R.GOODS_CD = G.GOODS_CD
+		<if test="goodsCds != null and goodsCds != ''">
+		AND    (
+		        <foreach collection="goodsCds" item="item" index="index" separator="or">
+		        UPPER(R.GOODS_CD) LIKE CONCAT('%',UPPER(#{item}),'%') 
+		        </foreach>
+		       )
+		</if>
+		<if test="startDt != null and startDt != ''">
+		AND    R.REG_DT <![CDATA[>=]]> STR_TO_DATE(#{startDt},'%Y-%m-%d')
+		</if>
+		<if test="endDt != null and endDt != ''">
+		AND    R.REG_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{endDt},'%Y-%m-%d'),INTERVAL 1 DAY)
+		</if>
+		<if test="reviewGb != null and reviewGb != ''">
+		AND    R.REVIEW_GB = #{reviewGb}
+		</if>
+		<if test="pntGiveStat != null and pntGiveStat != ''">
+		AND    R.PNT_GIVE_STAT = #{pntGiveStat}
+		</if>
+		<if test="dispYn != null and dispYn != ''">
+		AND    R.DISP_YN = #{dispYn}
+		</if>
+		<if test="searchGb == 'memNm'">
+		AND    UPPER(C.CUST_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		</if>
+		<if test="searchGb == 'email'">
+		AND    UPPER(C.EMAIL) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		</if>
+		ORDER  BY R.REG_DT DESC
+	</select>
+	
+</mapper>

+ 298 - 0
src/main/webapp/WEB-INF/views/marketing/ReviewForm.html

@@ -0,0 +1,298 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : ReviewForm.html
+ * @desc    : 상품평관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.25   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/marketing/review/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<input type="hidden" name="pageNo" value ="1"/>
+				<input type="hidden" name="pageSize" value="50"/>
+				
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:8%;"/>
+						<col style="width:10%;"/>
+						<col style="width:13%;"/>
+						<col style="width:10%;"/>
+						<col style="width:10%;"/>
+						<col style="width:10%;"/>
+						<col style="width:8%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>등록일자</th>
+						<td colspan="7" id="terms">
+						</td>
+						<th rowspan="2">상품코드</th>
+						<td rowspan="2">
+							<textarea class="textareaR2 w150" name="goodsCd" id="goodsCd"></textarea>
+						</td>
+					</tr>
+					<tr>
+						<th>상품평유형</th>
+						<td>
+							<select name="reviewGb">
+								<option value="">[전체]</option>
+								<option value="R">일반</option>
+								<option value="P">포토/영상</option>
+							</select>
+						</td>
+						<th>회원검색</th>
+						<td>
+							<select name="searchGb">
+								<option value="memNm">회원명</option>
+								<option value="email">이메일</option>
+							</select>
+							<input type="text" name="seachTxt" class="w100" maxlength="50"/>
+						</td>
+						<th>포인트지급상태</th>
+						<td>
+							<select name="pntGiveStat">
+								<option value="">[전체]</option>
+								<option th:if="${pntGiveStatList}" th:each="oneData, status : ${pntGiveStatList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>노출여부</th>
+						<td>
+							<select name="dispYn">
+								<option value="">[전체]</option>
+								<option value="Y" selected="selected">[Y] Yes</option>
+								<option value="N">[N] No</option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- //검색조건 영역 -->
+		
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li>
+					<button type="button" class="btn btn-info btn-lg" id="btnSaveBestReview">베스트상품평 선정</button>
+				</li>
+				<li class="right">
+					검색결과 : <strong><span id="totCnt">0</span> 건</strong>&nbsp;
+					쪽번호 <span id="pageNo">0</span>/ <strong id="totPage" class="marR10">0</strong>
+					<select name="pageSize">
+						<option value="50" selected="selected">50개씩 보기</option>
+						<option value="100">100개씩 보기</option>
+						<option value="500">500개씩 보기</option>
+						<option value="1000">1000개씩 보기</option>
+					</select>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+			
+			<div id="gridList" style="width: 100%; height: 670px" class="ag-theme-balham lh60"></div>
+			
+			<ul class="panelBar">
+				<li class="center">
+					<div class="tablePaging" id="pagination"></div>
+				</li>
+			</ul>
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let scoreSizeList = gagajf.convertToArray([[${scoreSizeList}]]);
+	let scoreColorList = gagajf.convertToArray([[${scoreColorList}]]);
+	let scoreFitList = gagajf.convertToArray([[${scoreFitList}]]);
+	let scoreThickList = gagajf.convertToArray([[${scoreThickList}]]);
+	let scoreWeightList = gagajf.convertToArray([[${scoreWeightList}]]);
+	let scoreBallList = gagajf.convertToArray([[${scoreBallList}]]);
+	let pntGiveStatList = gagajf.convertToArray([[${pntGiveStatList}]]);
+	
+	// specify the columns
+	let columnDefs = [
+		{
+			width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false,
+			checkboxSelection: function (params) { return params.data.bestYn == 'N' ? true : false; }
+		},
+		{
+			headerName: "상품평번호", field: "reviewSq", width: 90, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + (params.value == 'R' ? '일반' : '포토/영상') + '</a>';
+			}
+		},
+		{headerName: "상품평유형", field: "reviewGb", width: 90, cellClass: 'text-center'},
+		{
+			headerName: "주문상품", cellClass: 'text-center',
+			children: [
+				{headerName: '주문번호', field: 'ordNo', width: 90, cellClass: 'text-center', cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }},
+				{headerName: '주문상세번호', field: 'ordDtlNo', width: 120, cellClass: 'text-center', hide: true},
+				{headerName: "브랜드명", field: "brandKnm", width: 130, cellClass: 'text-center'},
+				{
+					headerName: "이미지", field: "goodsImg", width: 100, height: 60, cellClass: 'text-center',
+					cellRenderer: function(params) {
+						return '<img width="60" src="' + _goodsUrl + '/' + params.value + '" alt="" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \'' + _goodsUrl + '/' + params.value + '\')" onerror="this.src=\'/image/no.gif\';"/>';
+					}
+				},
+				{headerName: "상품코드", field: "goodsCd", width: 120, cellClass: 'text-center', cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }},
+				{headerName: "상품명", field: "goodsNm", width: 240, cellClass: 'text-center'},
+				{headerName: '회원번호', field: 'custNo', width: 100, cellClass: 'text-center', hide: true},
+				{headerName: '주문자명', field: 'orderNm', width: 100, cellClass: 'text-center', cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }}
+			]
+		},
+		{headerName: "상품평 제목", field: "reviewTitle", width: 200, cellClass: 'text-center', hide: true},
+		{headerName: "상품평 내용", field: "reviewContent", width: 500, cellClass: 'text-center', hide: true},
+		{
+			headerName: "베스트", cellClass: 'text-center',
+			children: [
+				{headerName: '베스트여부', field: 'bestYn', width: 90, cellClass: 'text-center'},
+				{headerName: '포인트지급여부', field: 'bpntGiveYn', width: 120, cellClass: 'text-center', cellRenderer: function(params) { return params.value == 'N' ? '미지급' : '지급'; }},
+				{headerName: '지급포인트', field: 'giveDueBpnt', width: 100, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }}
+			]
+		},
+		{
+			headerName: "만족도 점수", cellClass: 'text-center',
+			children: [
+				{headerName: '총점', field: 'score', width: 100, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+				{headerName: '사이즈점수', field: 'scoreSize', width: 100, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(scoreSizeList, params.value); }},
+				{headerName: '컬러점수', field: 'scoreColor', width: 100, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(scoreColorList, params.value); }},
+				{headerName: '핏점수', field: 'scoreFit', width: 100, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(scoreFitList, params.value); }},
+				{headerName: '두께감점수', field: 'scoreThick', width: 100, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(scoreThickList, params.value); }},
+				{headerName: '무게감점수', field: 'scoreWeight', width: 100, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(scoreWeightList, params.value); }},
+				{headerName: '볼넓이점수', field: 'scoreBall', width: 100, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(scoreBallList, params.value); }}
+			]
+		},
+		{
+			headerName: "노출여부", field: "dispYn", width: 90, cellClass: 'text-center',
+			cellRenderer: function(params) { return params.value == 'N' ? '미노출' : '노출'; }
+		},
+		{headerName: "삭제여부", field: "delYn", width: 90, cellClass: 'text-center', hide: true},
+		{
+			headerName: "지급예정포인트", field: "giveDuePnt", width: 120, cellClass: 'text-center'},
+		{
+			headerName: "포인트지급상태", field: "pntGiveStat", width: 120, cellClass: 'text-center',
+			cellEditorParams: { values: gagaAgGrid.extractValues(pntGiveStatList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(pntGiveStatList, params.value); }
+		},
+		{
+			headerName: "확인", cellClass: 'text-center',
+			children: [
+				{headerName: '확인여부', field: 'confirmYn', width: 90, cellClass: 'text-center', cellRenderer: function(params) { return params.value == 'N' ? '미확인' : '확인'; }},
+				{headerName: '확인자', field: 'confirmUnm', width: 90, cellClass: 'text-center'},
+				{headerName: '확인일시', field: 'confirmDt', width: 150, cellClass: 'text-center', cellRenderer: function(params) { gagaAgGrid.toDateTimeFormat(params.value); }}
+			]
+		},
+		{
+			headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) { gagaAgGrid.toDateTimeFormat(params.value); }
+		}
+	];
+	
+	// Get GridOptions
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	
+	gridOptions.rowSelection = 'multiple';
+	gridOptions.rowHeight = 60; // 이미지가 있을경우 높이 지정해야함.
+	
+	// 조회
+	$('#btnSearch').on('click', function() {
+		gagaPaging.init('searchForm', fnSearchCallBack, 'pagination', $('#searchForm input[name=pageSize]').val());
+		gagaPaging.load($("#searchForm input[name=pageNo]").val());
+	});
+	
+	// 조회 콜백함수
+	var fnSearchCallBack = function(result) {
+		gridOptions.api.setRowData(result.dataList);
+		gagaPaging.createPagination(result.paging.pageable);
+		$('#totCnt').html(result.paging.pageable.totalCount.addComma());
+		$('#pageNo').val(result.paging.pageable.pageNo.addComma());
+		$('#totPage').val(result.paging.pageable.totalPage.addComma());
+	}
+
+	// 페이징크기 변경 시
+	$('select[name=pageSize]').on('change', function() {
+		$('#searchForm input[name=pageSize]').val($(this).val());
+		$('#searchForm input[name=pageNo]').val(1);
+		$('#btnSearch').trigger('click');
+	});
+	
+	// 베스트상품평 선정
+	$('#btnSaveBestReview').on('click', function() {
+		let chooseData = gagaAgGrid.selectedRowData(gridOptions);
+		
+		if (chooseData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		mcxDialog.confirm("베스트상품평으로 선정하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var updatedData = [];
+				
+				$.each(chooseData, function(idx, item) {
+					if (item.bestYn == 'N') {
+						item.bestYn = 'Y';
+						updatedData.push(item);
+					}
+				});
+				
+				var jsonData = JSON.stringify(updatedData);
+				gagajf.ajaxJsonSubmit('/marketing/review/best/save'
+						, jsonData
+						, function() {
+							$('#btnSearch').trigger('click');
+						});
+			}
+		});
+	});
+	
+	// 상품평 상세 팝업
+	var fnOpenReviewPopup = function(reviewSq) {
+		var actionUrl = "/marketing/review/detail/" + reviewSq;
+		cfnOpenModalPopup(actionUrl, "popupReviewDetail");
+	}
+	
+	$(document).ready(function() {
+		cfnCreateCalendar('#terms', 'startDt', 'endDt', true, '등록');
+		$('.btnToday').trigger('click');
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>