Sfoglia il codice sorgente

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

eskim 5 anni fa
parent
commit
944bba3170

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

@@ -58,4 +58,28 @@ public interface TsaReviewDao {
 	 */
 	void deleteReviewAttach(ReviewAttach reviewAttach);
 
+	/**
+	 * 베스트상품평포인트 생성
+	 * @param review - 상품평 정보
+	 * @author gagamel
+	 * @since 2021. 4. 27
+	 */
+	void createBestReviewPoint(Review review);
+
+	/**
+	 * 베스트상품평포인트이력 생성
+	 * @param review - 상품평 정보
+	 * @author gagamel
+	 * @since 2021. 4. 27
+	 */
+	void createBestReviewPointHistory(Review review);
+
+	/**
+	 * 베스트상품평 선정 처리
+	 * @param review - 상품평 정보
+	 * @author gagamel
+	 * @since 2021. 4. 27
+	 */
+	void updateBestReviewSelection(Review review);
+
 }

+ 44 - 3
src/main/java/com/style24/admin/biz/service/TsaReviewService.java

@@ -7,7 +7,9 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.style24.admin.biz.dao.TsaReviewDao;
-import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.biz.service.TscEnvsetService;
+import com.style24.core.support.env.TscConstants;
 import com.style24.persistence.domain.Review;
 import com.style24.persistence.domain.ReviewAttach;
 
@@ -24,10 +26,10 @@ import lombok.extern.slf4j.Slf4j;
 public class TsaReviewService {
 
 	@Autowired
-	private TscMessageByLocale message;
+	private TsaReviewDao reviewDao;
 
 	@Autowired
-	private TsaReviewDao reviewDao;
+	private TscEnvsetService envsetService;
 
 	/**
 	 * 상품평 목록
@@ -79,4 +81,43 @@ public class TsaReviewService {
 		reviewDao.deleteReviewAttach(reviewAttach);
 	}
 
+	/**
+	 * 베스트상품평선정 처리
+	 * @param reviewList - 상품평 목록
+	 * @author gagamel
+	 * @since 2021. 4. 27
+	 */
+	@Transactional("shopTxnManager")
+	public void saveBestReviewList(Collection<Review> reviewList) {
+		// 1.베스트상품평포인트금액
+		int bestPntAmt = envsetService.getBestReviewPoint(TscConstants.Site.STYLE24.value());
+
+		for (Review review : reviewList) {
+			review.setGvPntAmt(bestPntAmt);
+			review.setRegNo(TsaSession.getInfo().getUserNo());
+			review.setUpdNo(TsaSession.getInfo().getUserNo());
+
+			// 2.베스트상품평포인트 생성
+			reviewDao.createBestReviewPoint(review);
+
+			// 고객포인트일련번호 설정
+			Integer custPntSq = review.getCustPntSq();
+			if (review.getCustPntSq() == null) {
+				review.setCustPntSq(custPntSq);
+			}
+
+			review.setOccurGb(TscConstants.PointOccurGb.REVIEW_POINT.value());
+			review.setOccurDtlDesc("베스트상품평포인트 지급");
+			review.setPntAmt(bestPntAmt);
+			review.setPntUploadStat(TscConstants.PntUploadStat.APPLY_COMPLETE.value());
+
+			// 3.베스트상품평포인트이력 생성
+			reviewDao.createBestReviewPointHistory(review);
+
+			// 4.베스트상품평선정 처리
+			review.setGiveDueBpnt(bestPntAmt);
+			reviewDao.updateBestReviewSelection(review);
+		}
+	}
+
 }

+ 24 - 4
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -217,11 +217,11 @@ public class TsaMarketingController extends TsaBaseController {
 	 * @author gagamel
 	 * @since 2021. 4. 22
 	 */
-	@GetMapping("/review/detail/form/{reviewSq}")
-	public ModelAndView oneToOneQnaDetailForm(@PathVariable Integer reviewSq) {
+	@GetMapping("/review/detail/form")
+	public ModelAndView reviewDetailForm(@RequestParam(value = "reviewSq") Integer reviewSq) {
 		ModelAndView mav = new ModelAndView();
 
-		// 1:1문의 상세 정보
+		// 상품평 상세
 		mav.addObject("reviewInfo", reviewService.getReview(reviewSq));
 
 		mav.setViewName("marketing/ReviewDetailForm");
@@ -239,6 +239,7 @@ public class TsaMarketingController extends TsaBaseController {
 	@PostMapping("/review/user/reply/save")
 	@ResponseBody
 	public GagaResponse saveReviewUserReply(@RequestBody Review review) {
+		review.setAdmRplRegNo(TsaSession.getInfo().getUserNo());
 		review.setUpdNo(TsaSession.getInfo().getUserNo());
 
 		reviewService.saveReviewUserReply(review);
@@ -261,6 +262,25 @@ public class TsaMarketingController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0004"));
 	}
 
+	/**
+	 * 베스트상품평선정 처리
+	 * @param reviewList - 상품평 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 4. 27
+	 */
+	@PostMapping("/review/best/list/save")
+	@ResponseBody
+	public GagaResponse saveBestReviewList(@RequestBody Collection<Review> reviewList) {
+		if (reviewList == null || reviewList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		reviewService.saveBestReviewList(reviewList);
+
+		return super.ok(message.getMessage("SUCC_0004"));
+	}
+
 	/* xodud1202 진행 */
 	/**
 	 * 사은품 프로모션 관리 화면
@@ -540,7 +560,7 @@ public class TsaMarketingController extends TsaBaseController {
 		// 선착순쿠폰 조회
 		mav.addObject("limitedTimeCpnList", new Coupon());
 		// 제휴채널 조회
-		mav.addObject("channelList", rendererService.getCommonCodeList("G053","Y"));
+		mav.addObject("channelList", rendererService.getCommonCodeList("G053", "Y"));
 		// 이미 쿠폰 아이디가 있으면 적용대상 조회
 		if (cpnId != 0) {
 			mode = "U";

+ 12 - 2
src/main/java/com/style24/persistence/domain/Review.java

@@ -46,13 +46,15 @@ public class Review extends TscBaseDomain {
 	private String dispYn;				// 표시여부
 	private String delYn;				// 삭제여부
 	private String confirmYn;			// 확인여부
-	private String confirmUno;			// 확인자번호
+	private Integer confirmUno;			// 확인자번호
 	private String confirmUnm;			// 확인자명
 	private String confirmDt;			// 확인일시
 	private String admRpl;				// 관리자댓글
-	private String admRplRegNo;			// 댓글등록자번호
+	private Integer admRplRegNo;		// 댓글등록자번호
 	private String admRplRegNm;			// 댓글등록자명
 	private String admRplDt;			// 관리자댓글등록일시
+	private String rplCfmYn;			// 댓글확인여부
+	private String rplCfmDt;			// 댓글확인일시
 	private String bestYn;				// 베스트상품평여부
 	private String bpntGiveYn;			// 베스트상품평포인트지급여부
 	private int giveDueBpnt;			// 지급예정베스트포인트
@@ -84,4 +86,12 @@ public class Review extends TscBaseDomain {
 		return TsaSession.getInfo().getMaskingYn().equals("Y") ? MaskingUtils.name(getCustNm()) : getCustNm();
 	}
 
+	// 베스트상품평포인트 생성
+	private Integer custPntSq;		// 고객포인트일련번호
+	private int gvPntAmt;			// 지급포인트금액
+	private String occurGb;			// 포인트발생구분
+	private String occurDtlDesc;	// 포인트발생상세설명
+	private int pntAmt;				// 포인트금액
+	private String pntUploadStat;	// 포인트반영상태
+
 }

+ 129 - 33
src/main/java/com/style24/persistence/mybatis/shop/TsaReview.xml

@@ -35,6 +35,9 @@
 		     , R.PNT_GIVE_STAT                                            /*포인트지급상태*/
 		     , R.DISP_YN                                                  /*표시여부*/
 		     , R.DEL_YN                                                   /*삭제여부*/
+		     , R.BEST_YN                                                  /*베스트여부*/
+		     , R.GIVE_DUE_BPNT                                            /*베스트지급에정포인트*/
+		     , R.BPNT_GIVE_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     /*확인일시*/ 
@@ -80,52 +83,57 @@
 	</select>
 	
 	<!--상품평 정보 -->
-	<select id="getReview" parameterType="String" resultType="Review">
+	<select id="getReview" parameterType="Integer" resultType="Review">
 		/* TsaReview.getReview */
-		SELECT R.REVIEW_SQ                                                /*상품평일련번호*/
-		     , R.GOODS_CD                                                 /*상품코드*/
-		     , G.GOODS_NM                                                 /*상품명*/
+		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                                                   /*몸무게*/
-		     , FN_GET_CODE('G040',R.SCORE_SIZE)         AS SCORE_SIZE     /*사이즈점수*/
-		     , FN_GET_CODE('G039',R.SCORE_COLOR)        AS SCORE_COLOR    /*컬러점수*/
-		     , FN_GET_CODE('G042',R.SCORE_FIT)          AS SCORE_FIT      /*핏점수*/
-		     , FN_GET_CODE('G079',R.SCORE_THICK)        AS SCORE_THICK    /*두께감점수*/
-		     , FN_GET_CODE('G080',R.SCORE_WEIGHT)       AS SCORE_WEIGHT   /*무게감점수*/
-		     , FN_GET_CODE('G041',R.SCORE_BALL)         AS SCORE_BALL     /*볼넓이점수*/
-		     , R.GIVE_DUE_PNT                                             /*지급예정포인트*/
-		     , FN_GET_CODE('G043',R.PNT_GIVE_STAT)      AS PNT_GIVE_STAT  /*포인트지급상태*/
-		     , 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_REG_NM /*관리자댓글작성자명*/
-		     , DATE_FORMAT(R.ADM_RPL_DT,'%Y%m%d%H%i%S') AS ADM_RPL_DT     /*관리자댓글작성일시*/
-		     , R.RPL_CFM_YN                                               /*댓글확인여부*/
-		     , DATE_FORMAT(R.RPL_CFM_DT,'%Y%m%d%H%i%S') AS RPL_CFM_DT     /*댓글확인일시*/
+		       )                                             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                                                        /*몸무게*/
+		     , FN_GET_CODE_NM('G040',R.SCORE_SIZE)           AS SCORE_SIZE     /*사이즈점수*/
+		     , FN_GET_CODE_NM('G039',R.SCORE_COLOR)          AS SCORE_COLOR    /*컬러점수*/
+		     , FN_GET_CODE_NM('G042',R.SCORE_FIT)            AS SCORE_FIT      /*핏점수*/
+		     , FN_GET_CODE_NM('G079',R.SCORE_THICK)          AS SCORE_THICK    /*두께감점수*/
+		     , FN_GET_CODE_NM('G080',R.SCORE_WEIGHT)         AS SCORE_WEIGHT   /*무게감점수*/
+		     , FN_GET_CODE_NM('G041',R.SCORE_BALL)           AS SCORE_BALL     /*볼넓이점수*/
+		     , R.GIVE_DUE_PNT                                                  /*지급예정포인트*/
+		     , FN_GET_CODE_NM('G043',R.PNT_GIVE_STAT)        AS PNT_GIVE_STAT  /*포인트지급상태*/
+		     , R.BEST_YN                                                       /*베스트여부*/
+		     , R.GIVE_DUE_BPNT                                                 /*베스트지급에정포인트*/
+		     , R.BPNT_GIVE_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_REG_NM /*관리자댓글작성자명*/
+		     , DATE_FORMAT(R.ADM_RPL_DT,'%Y-%m-%d %H:%i:%S') AS ADM_RPL_DT     /*관리자댓글작성일시*/
+		     , R.RPL_CFM_YN                                                    /*댓글확인여부*/
+		     , DATE_FORMAT(R.RPL_CFM_DT,'%Y-%m-%d %H:%i:%S') AS RPL_CFM_DT     /*댓글확인일시*/
 		FROM   TB_REVIEW R
 		     , TB_CUSTOMER C
 		     , TB_GOODS G
-		WHERE  R.REVIEW_SQ = #{reviewSq}
+		WHERE  R.CUST_NO = C.CUST_NO
+		AND    R.GOODS_CD = G.GOODS_CD
+		AND    R.REVIEW_SQ = #{reviewSq}
 	</select>
 	
 	<!--상품평 첨부파일 목록 -->
-	<select id="getReviewAttachList" parameterType="String" resultType="ReviewAttach">
+	<select id="getReviewAttachList" parameterType="Integer" resultType="ReviewAttach">
 		/* TsaReview.getReviewAttachList */
 		SELECT RV_ATC_SQ   /*상품평첨부파일일련번호*/
 		     , REVIEW_SQ   /*상품평일련번호*/
@@ -137,6 +145,7 @@
 		FROM   TB_REVIEW_ATTACH
 		WHERE  REVIEW_SQ = #{reviewSq}
 		AND    DEL_YN = 'N' /*삭제안된넘*/
+		ORDER  BY FILE_GB DESC, RV_ATC_SQ
 	</select>
 	
 	<!-- 상품평 미노출 처리 -->
@@ -163,4 +172,91 @@
 		AND    DEL_YN = 'N' /*삭제안된넘*/
 	</update>
 	
+	<!-- 베스트상품평포인트 생성-->
+	<insert id="createBestReviewPoint" parameterType="Review" keyProperty="custPntSq">
+		/* TsaReview.createBestReviewPoint */
+		INSERT INTO TB_CUST_POINT (
+		       CUST_PNT_SQ
+		     , CUST_NO
+		     , GV_PNT_AMT
+		     , US_PNT_AMT
+		     , RM_PNT_AMT
+		     , EXP_BE_DT
+		     , EXP_CMP_DT
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT NULL                             AS CUST_PNT_SQ
+		     , CUST_NO
+		     , #{gvPntAmt}                      AS GV_PNT_AMT
+		     , 0                                AS US_PNT_AMT
+		     , 0                                AS RM_PNT_AMT
+		     , DATE_ADD(NOW(), INTERVAL 1 YEAR) AS EXP_BE_DT
+		     , NULL                             AS EXP_CMP_DT
+		     , #{regNo}                         AS REG_NO
+		     , NOW()                            AS REG_DT
+		     , #{updNo}                         AS UPD_NO
+		     , NOW()                            AS UPD_DT
+		FROM   TB_REVIEW
+		WHERE  REVIEW_SQ = #{reviewSq}
+		AND    BEST_YN = 'N' /*베스트상품이아닌넘. 베스트여부 값이 변경될 수도 있으므로 체크로직 추가*/
+	</insert>
+
+	<!-- 베스트상품평포인트이력 생성-->
+	<insert id="createBestReviewPointHistory" parameterType="Review">
+		/* TsaReview.createBestReviewPointHistory */
+		INSERT INTO TB_CUST_POINT_HST (
+		       PNT_HST_SQ
+		     , CUST_NO
+		     , OCCUR_GB
+		     , OCCUR_DTL_DESC
+		     , PNT_AMT
+		     , CUST_PNT_SQ
+		     , ORD_NO
+		     , ORD_DTL_NO
+		     , REVIEW_SQ
+		     , SWITCH_DUE_DT
+		     , PNT_UPLOAD_STAT
+		     , PNT_UPLOAD_DT
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT NULL            AS PNT_HST_SQ
+		     , CUST_NO
+		     , #{occurGb}      AS OCCUR_GB
+		     , #{occurDtlDesc} AS OCCUR_DTL_DESC
+		     , #{pntAmt}       AS PNT_AMT
+		     , #{custPntSq}    AS CUST_PNT_SQ
+		     , ORD_NO
+		     , ORD_DTL_NO
+		     , REVIEW_SQ
+		     , NOW()            AS SWITCH_DUE_DT
+		     , #{pntUploadStat} AS PNT_UPLOAD_STAT
+		     , NOW()            AS PNT_UPLOAD_DT
+		     , #{regNo}         AS REG_NO
+		     , NOW()            AS REG_DT
+		     , #{updNo}         AS UPD_NO
+		     , NOW()            AS UPD_DT
+		FROM   TB_REVIEW
+		WHERE  REVIEW_SQ = #{reviewSq}
+		AND    BEST_YN = 'N' /*베스트상품이아닌넘. 베스트여부 값이 변경될 수도 있으므로 체크로직 추가*/
+	</insert>
+	
+	<!-- 베스트상품평 선정 처리 -->
+	<update id="updateBestReviewSelection" parameterType="Review">
+		/* TsaReview.updateBestReviewSelection */
+		UPDATE TB_REVIEW
+		SET    BEST_YN = 'Y'
+		     , GIVE_DUE_BPNT = #{giveDueBpnt}
+		     , BPNT_GIVE_YN = 'Y'
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  REVIEW_SQ = #{reviewSq}
+		AND    BEST_YN = 'N' /*베스트상품이아닌넘. 베스트여부 값이 변경될 수도 있으므로 체크로직 추가*/
+	</update>
+	
 </mapper>

+ 2 - 0
src/main/webapp/WEB-INF/views/display/MainContentsPopupForm.html

@@ -389,6 +389,7 @@
 						html += '<option value="'+cate1List[i].cd+'">['+cate1List[i].cd+'] '+cate1List[i].cdNm+'</option>';
 					}
 				}
+				html += '				<option value="3000">[3000] 아울렛</option>';
 				html += '			</select>';
 				html += '		</td>';
 				html += '	</tr>';
@@ -746,6 +747,7 @@
 			for(let i=0; i<cate1List.length; i++){
 				html += '<option value="'+cate1List[i].cd+'">['+cate1List[i].cd+'] '+cate1List[i].cdNm+'</option>';
 			}
+			html += '				<option value="3000">[3000] 아울렛</option>';
 			html += '			</select>';
 			html += '		</td>';
 			html += '	</tr>';

+ 118 - 139
src/main/webapp/WEB-INF/views/marketing/ReviewDetailForm.html

@@ -25,168 +25,147 @@
 		
 		<!-- CONTENT -->
 		<div class="panelContent">
-			<form id="reviewDetailForm" name="reviewDetailForm" action="#" th:action="@{'/marketing/review/save'}" th:method="post" th:object="${reviewInfo}">
+			<form id="reviewDetailForm" name="reviewDetailForm" action="#" th:action="@{'/marketing/review/user/reply/save'}" th:method="post" th:object="${reviewInfo}">
 				<input type="hidden" name="reviewSq" th:value="*{reviewSq}"/>
 				
-				<h4>리뷰 정보</h4>
-				<table class="tableStyle" aria-describedby="상담정보">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:10%;"/>
-						<col style="width:12%;"/>
-						<col style="width:15%;"/>
-						<col/>
-<!-- 						<col style="width:10%;"/> -->
-<!-- 						<col style="width:15%;"/> -->
-						<col style="width:25%;"/>
-					</colgroup>
-					<thead>
-						<tr>
-							<th>상담일련번호</th>
-							<th>사이트</th>
-							<th>상담분류</th>
-							<th>문의일시</th>
-							<th>고객정보</th>
-<!-- 							<th>주문번호</th> -->
-<!-- 							<th>답변의뢰</th> -->
-							<th>답변상태</th>
-						</tr>
-					</thead>
-					<tbody>
-						<tr>
-							<td th:text="*{counselSq}"></td>
-							<td th:text="*{siteNm}"></td>
-							<td th:utext="*{counselClsfNm}"></td>
-							<td th:text="*{questDt}"></td>
-							<td th:utext="*{custNm + ' / ' + cellPhnno + ' / ' + email}"></td>
-<!-- 							<td th:text="*{relOrdNo}"></td> -->
-<!-- 							<td th:utext="*{ansTransYn == 'Y' ? ansTransDt + '<br/>' + ansCompNm : ''}"></td> -->
-							<td th:utext="*{ansStat == 'G060_20' ? ansStatNm + ' / ' + ansDt + ' / ' + ansNm : ansStatNm}"></td>
-						</tr>
-					</tbody>
-				</table>
-				
-				<h4>고객문의</h4>
-				<table class="frmStyle" aria-describedby="고객문의">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:50%;"/>
-						<col style="width:10%;"/>
-						<col/>
-					</colgroup>
-					<tbody>
-						<tr>
-							<th>문의 제목</th>
-							<td th:text="*{questTitle}"></td>
-							<th>SMS답변요청</th>
-							<td th:text="*{smsReqYn == 'Y' ? '수신' : '미수신'}"></td>
-						</tr>
-						<tr>
-							<th>문의 내용</th>
-							<td>
-								<textarea class="textareaR4" style="resize: none;" name="questContent" th:text="*{questContent}" disabled="disabled"></textarea>
-							</td>
-							<th>첨부 이미지</th>
-							<td class="userImg">
-								<img th:if="${counselInfo.sysFileNm1 != null}" style="height: 100px;" th:src="${@environment.getProperty('domain.image') + '/counsel/' + counselInfo.sysFileNm1}" alt="" onerror='this.src="/image/no.gif"'/>
-								<img th:if="${counselInfo.sysFileNm2 != null}" style="height: 100px;" th:src="${@environment.getProperty('domain.image') + '/counsel/' + counselInfo.sysFileNm2}" alt="" onerror='this.src="/image/no.gif"'/>
-							</td>
-						</tr>
-					</tbody>
-				</table>
-				
-				<h4>답변등록</h4>
-				<table class="frmStyle" aria-describedby="답변등록">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:90%;"/>
-					</colgroup>
-					<tbody>
-						<tr>
-							<th>답변 템플릿</th>
-							<td>
-								<select name="ansSq">
-									<option value="">[선택]</option>
-									<option th:if="${ansPhaseList}" th:each="oneData, statue : ${ansPhaseList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
-								</select>
-							</td>
-						</tr>
-						<tr>
-							<th>답변 제목<i class="required" title="필수" aria-hidden="true"></i></th>
-							<td>
-								<input type="text" class="" name="ansTitle" th:value="*{ansTitle}" required="required" data-valid-name="답변 제목"/>
-							</td>
-						</tr>
-						<tr>
-							<th>
-								답변 내용<i class="required" title="필수" aria-hidden="true"></i>
-								<br/>
-								<span id="dpLocAnsContent">0</span>/4,000Byte
-							</th>
-							<td>
-								<textarea class="textareaR4" style="resize: none;" name="ansContent" th:text="*{ansContent}" onkeyup="cfnGetTextLength(this, 4000, $('#dpLocAnsContent'));" required="required" data-valid-name="답변 내용"></textarea>
-							</td>
-						</tr>
-					</tbody>
-				</table>
+				<div class="reviewWrap">
+					<div class="user_review">
+						<!-- 상품정보 -->
+						<div class="prodInfo">
+							<div class="prodImg">
+								<img th:src="${@environment.getProperty('upload.goods.view') + '/' + reviewInfo.goodsImg}" onerror="this.src=\'/image/no.gif\';"/>
+							</div>
+							<dl>
+								<dt>상품코드</dt>
+								<dd class="cBk" style="width: 100px;"><strong th:text="*{goodsCd}">ABC123456</strong></dd>
+								<dt>상품명</dt>
+								<dd class="cBk" th:text="*{goodsNm}"></dd>
+							</dl>
+							<dl>
+								<dt>주문번호</dt>
+								<dd class="cBk" style="width: 100px;"><strong th:text="*{ordNo}"></strong></dd>
+								<dt>고객명</dt>
+								<dd class="cBk" style="width: 100px;"><span th:text="*{custNm}"></span> <strong th:text="*{'(' + custNo + ')'}"></strong></dd>
+								<dt>구매옵션</dt>
+								<dd style="width: 100px;">베이지 / 100</dd>
+							</dl>
+							<dl>
+								<dt>고객별점</dt>
+								<dd>
+									<div class="star_score">
+										<span class="star">
+											<em class="progbar" style="width:70%;"></em>
+										</span>
+									</div>
+								</dd>
+								<dt>키/몸무게</dt><dd th:text="*{height + '/' + weight}">178cm/71kg</dd>
+								<dt th:if="*{scoreSize != null}">사이즈</dt><dd th:text="*{scoreSize}">작음</dd>
+								<dt th:if="*{scoreColor != null}">컬러</dt><dd th:text="*{scoreColor}">밝음</dd>
+								<dt th:if="*{scoreFit != null}">핏</dt><dd th:text="*{scoreFit}">레귤러</dd>
+								<dt th:if="*{scoreThick != null}">두께감</dt><dd th:text="*{scoreThick}">적당함</dd>
+								<dt th:if="*{scoreWeight != null}">무게감</dt><dd th:text="*{scoreWeight}"></dd>
+								<dt th:if="*{scoreBall != null}">볼넓이</dt><dd th:text="*{scoreBall}"></dd>
+							</dl>
+						</div>
+						<!-- //상품정보 -->
+						
+						<!-- 고객 등록 -->
+						<ul class="rvCont">
+							<!-- 동영상 및 썸네일 이미지 -->
+							<li class="rvPic">
+								<th:block th:if="*{attachList != null}" th:each="oneData, status : *{attachList}">
+									<a href="javascript:void(0);" onclick="vdoOpen()" th:if="${oneData.fileGb == 'M'}">
+										<span class="pic">
+											<iframe th:src="${kollusMediaUrl + '/' + oneData.kmcKey}" width="90px" height="90px"></iframe>
+<!-- 											<iframe th:src="${kollusMediaUrl + '/' + oneData.kmcKey + '?autoplay&mute'}" width="90px" height="90px"></iframe> -->
+<!-- 											<i th:style="${'background-image: url(' + kollusMediaUrl + '/' + oneData.kmcKey + ');'}"></i> -->
+										</span>
+									</a>
+									<a href="javascript:void(0);" th:if="${oneData.fileGb == 'I'}">
+										<span class="pic">
+											<i th:style="${'background-image: url(' + @environment.getProperty('upload.default.view') + oneData.sysFileNm + ');'}"></i>
+										</span>
+									</a>
+								</th:block>
+<!-- 								<a href="javascript:void(0);" onclick="vdoOpen()"><span class="pic mov"><i style="background-image:url(image/@item01.jpg);">업로드 파일</i></span></a> -->
+<!-- 								<a href="javascript:void(0);"><span class="pic mov"><i style="background-image:url(image/@item01.jpg);">업로드 파일</i></span></a> -->
+<!-- 								<a href="javascript:void(0);"><span class="pic"><i style="background-image:url(image/@item01.jpg);">업로드 파일</i></span></a> -->
+<!-- 								<a href="javascript:void(0);"><span class="pic"><i style="background-image:url(image/@item01.jpg);">업로드 파일</i></span></a> -->
+							</li>
+							<!-- //동영상 및 썸네일 -->
+							<li class="rvTxt" th:utext="*{reviewContent}"></li>
+						</ul>
+						<!-- //고객 등록 -->
+						
+						<!-- 포인트 지급 정보 -->
+<!-- 						<dl class="orderInfo"> -->
+<!-- 							<dt>포인트</dt> -->
+<!-- 							<dd class="cBk"><strong th:text="*{giveDuePnt}"></strong> <span th:text="*{pntGiveStat}"></span></dd> -->
+<!-- 							<dt th:if="*{bestYn != null}">베스트포인트</dt> -->
+<!-- 							<dd class="cBk" th:if="*{bestYn != null}"><strong th:text="*{giveDueBpnt}"></strong> <span th:text="*{bpntGiveYn}"></span></dd> -->
+<!-- 						</dl> -->
+						<!-- //포인트 지급 정보 -->
+						
+						<!-- 관리자 답변 등록 -->
+						<div class="admArea">
+							<i class="fa fa-smile-o" aria-hidden="true"></i> 관리자
+							<strong th:if="*{admRplRegNm != null}" th:text="*{admRplRegNm}"></strong>
+							<span th:if="*{admRplDt != null}" class="date" th:text="*{admRplDt}"></span>
+						</div>
+						<table class="frmStyle">
+							<colgroup>
+								<col width="110px"/>
+								<col/>
+							</colgroup>
+							<tbody>
+								<tr>
+									<th>관리자 답변<br/><span id="dpLocAdmRpt">0</span>/4,000</th>
+									<td>
+										<textarea th:if="*{rplCfmYn != null and rplCfmYn == 'Y'}" class="textareaR3" name="admRpl" th:text="*{admRpl}" disabled="disabled"></textarea>
+										<textarea th:if="*{rplCfmYn == null or rplCfmYn == 'N'}" class="textareaR3" name="admRpl" th:text="*{admRpl}" onkeyup="cfnGetTextLength(this, 4000, $('#dpLocAdmRpt'));"></textarea>
+									</td>
+								</tr>
+							</tbody>
+						</table>
+						<!-- //관리자 답변 등록 -->
+						
+						<!-- 버튼 배치 영역 -->
+						<ul class="panelBar" th:if="${reviewInfo.rplCfmYn == 'N'}">
+							<li class="center">
+								<button type="button" class="btn btn-base btn-lg" id="btnSaveReply">저장</button>
+							</li>
+						</ul>
+						<!-- //버튼 배치 영역 -->
+					</div>
+				</div>
 			</form>
 		</div>
-		<!-- //CONTENT -->
-
-		<!-- 버튼 배치 영역 -->
-		<ul class="panelBar">
-			<li class="right">
-				<button type="button" class="btn btn-info btn-lg" id="btnSaveAnswer" th:if="${counselInfo.ansStat == 'G060_10'}">답변저장</button>
-			</li>
-		</ul>
-		<!-- //버튼 배치 영역 -->
 	</div>
 </div>
 
 <script th:inline="javascript">
 /*<![CDATA[*/
-	// 답변 저장
-	$('#btnSaveAnswer').on('click', function() {
-		// 입력 값 체크
-		if (!gagajf.validation('#reviewDetailForm'))
+	// 관리자 댓글 저장
+	$('#btnSaveReply').on('click', function() {
+		if (gagajf.isNull($('textarea[name=admRpl]').val())) {
+			mcxDialog.alert("관리자 답변 내용을 입력해 주세요.");
 			return false;
+		}
 		
 		mcxDialog.confirm("저장하시겠습니까?", {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
 			sureBtnClick: function() {
 				gagajf.ajaxFormSubmit($('#reviewDetailForm').prop('action'), '#reviewDetailForm', function() {
-					uifnPopupClose('popupOneToOneQnaDetail');
+					uifnPopupClose('popupReviewDetail');
 					$('#btnSearch').trigger('click');
 				});
 			}
 		});
 	});
 	
-	// 답변템플릿 선택 시
-	$('select[name=ansSq]').on('change', function() {
-		var ansSq = $(this).val();
-
-		if (!gagajf.isNull(ansSq)) {
-			var actionUrl = '/customer/qna/answerphase/' + ansSq + '/20';
-			$.get(actionUrl
-				, function(data) {
-					if (!gagajf.isNull(data.ansSq)) {
-						$('input[name=ansTitle]').val(data.ansTitle);
-						$('textarea[name=ansContent]').val(data.ansContent);
-						cfnGetTextLength($('textarea[name=ansContent]'), 4000, $('#dpLocAnsContent'));
-					}
-				});
-		} else {
-			// 답변 내용 초기화
-			$('input[name=ansTitle]').val('');
-			$('textarea[name=ansContent]').val('');
-			cfnGetTextLength($('textarea[name=ansContent]'), 4000, $('#dpLocAnsContent'));
-		}
-	});
-	
 	$(document).ready(function() {
-		cfnGetTextLength($('textarea[name=ansContent]'), 4000, $('#dpLocAnsContent'));
+		cfnGetTextLength($('textarea[name=admRpl]'), 4000, $('#dpLocAdmRpt'));
 	});
 /*]]>*/
 </script>

+ 2 - 4
src/main/webapp/WEB-INF/views/marketing/ReviewForm.html

@@ -237,8 +237,6 @@
 	gridOptions.onCellClicked = function(event) {
 		if (event.colDef.field == 'reviewSq') {
 			// 상품평 상세
-			alert('작업해야 함.');
-			return;
 			cfnOpenReviewDetailPopup(event.data.reviewSq);
 		} else if (event.colDef.field == 'ordNo') {
 			// 주문 상세
@@ -283,7 +281,7 @@
 			return;
 		}
 		
-		mcxDialog.confirm("베스트상품평으로 선정하시겠습니까?", {
+		mcxDialog.confirm("베스트 상품평으로 선정하시겠습니까?", {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
 			sureBtnClick: function() {
@@ -297,7 +295,7 @@
 				});
 				
 				var jsonData = JSON.stringify(updatedData);
-				gagajf.ajaxJsonSubmit('/marketing/review/best/save'
+				gagajf.ajaxJsonSubmit('/marketing/review/best/list/save'
 						, jsonData
 						, function() {
 							$('#btnSearch').trigger('click');

BIN
src/main/webapp/image/bg_photo.png


+ 6 - 10
src/main/webapp/ux/js/admin.popup.js

@@ -252,18 +252,14 @@ var cfnOpenCategoryPopup = function(callbackfun, siteCd) {
  * @access : public
  * @desc   : 상품평 상세팝업
  * <pre>
- *     cfnOpenReviewDetailPopup('reviewSq');
+ *     cfnOpenReviewDetailPopup(127);
  * </pre>
- * @param  : callbackfunction -콜백함수
- * @since  : 2020/01/03
- * @author : jaewonHo
+ * @param  : reviewSq - 상품평일련번호
+ * @since  : 2021/04/26
+ * @author : gagamel
  */
 var cfnOpenReviewDetailPopup = function(reviewSq) {
-	var actionUrl = "/marketing/review/detail/form";
-
-	if (typeof(reviewSq) != 'undefined') actionUrl += "?reviewSq=" + reviewSq;
-	cfnOpenModalPopup(actionUrl, "popupReviewDetail");
-
+	cfnOpenModalPopup('/marketing/review/detail/form?reviewSq=' + reviewSq, "popupReviewDetail");
 }
 
 /**
@@ -930,4 +926,4 @@ var cfnOpenMainGnbContentsPopup = function(cateNo, contentsLoc, brandGroupNo) {
 	var actionUrl = "/display/main/gnbcontents/popup/form?cateNo="+cateNo+"&contentsLoc=" + contentsLoc;
 	if (typeof(brandGroupNo) != 'undefined') actionUrl += "&brandGroupNo=" + brandGroupNo;
 	cfnOpenModalPopup(actionUrl, 'popupMainGnbContents');
-}
+}