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

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

card007 5 лет назад
Родитель
Сommit
023b2ef0ff
24 измененных файлов с 1117 добавлено и 277 удалено
  1. 35 0
      src/main/java/com/style24/admin/biz/dao/TsaReviewDao.java
  2. 41 0
      src/main/java/com/style24/admin/biz/service/TsaReviewService.java
  3. 1 1
      src/main/java/com/style24/admin/biz/web/TsaCustomerController.java
  4. 32 0
      src/main/java/com/style24/admin/biz/web/TsaGoodsController.java
  5. 235 163
      src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
  6. 1 0
      src/main/java/com/style24/persistence/domain/Contents.java
  7. 1 0
      src/main/java/com/style24/persistence/domain/Coupon.java
  8. 21 0
      src/main/java/com/style24/persistence/domain/CouponAfChannel.java
  9. 6 9
      src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml
  10. 5 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml
  11. 2 2
      src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  12. 85 1
      src/main/java/com/style24/persistence/mybatis/shop/TsaReview.xml
  13. 2 2
      src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html
  14. 213 34
      src/main/webapp/WEB-INF/views/display/MainContentsPopupForm.html
  15. 1 1
      src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html
  16. 2 2
      src/main/webapp/WEB-INF/views/goods/GoodsImageForm.html
  17. 33 0
      src/main/webapp/WEB-INF/views/goods/GoodsRegisterForm.html
  18. 20 20
      src/main/webapp/WEB-INF/views/marketing/CouponListForm.html
  19. 161 41
      src/main/webapp/WEB-INF/views/marketing/CouponPopupForm.html
  20. 194 0
      src/main/webapp/WEB-INF/views/marketing/ReviewDetailForm.html
  21. 3 1
      src/main/webapp/dx5/dextuploadx5-configuration.js
  22. BIN
      src/main/webapp/image/ico_play.png
  23. BIN
      src/main/webapp/image/star_empty.png
  24. 23 0
      src/main/webapp/ux/css/admin.ui.css

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

@@ -4,6 +4,7 @@ import java.util.Collection;
 
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Review;
+import com.style24.persistence.domain.ReviewAttach;
 
 /**
  * 상품평 Dao
@@ -23,4 +24,38 @@ public interface TsaReviewDao {
 	 */
 	Collection<Review> getReviewList(Review review);
 
+	/**
+	 * 상품평 정보
+	 * @param reviewSq - 상품평일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 4. 22
+	 */
+	Review getReview(Integer reviewSq);
+
+	/**
+	 * 상품평 첨부파일 목록
+	 * @param reviewSq - 상품평일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 4. 22
+	 */
+	Collection<ReviewAttach> getReviewAttachList(Integer reviewSq);
+
+	/**
+	 * 상품평 관리자 답변 저장
+	 * @param review - 상품평 정보
+	 * @author gagamel
+	 * @since 2021. 4. 22
+	 */
+	void saveReviewUserReply(Review review);
+
+	/**
+	 * 상품평 첨부파일 삭제(=미노출) 처리
+	 * @param reviewAttach - 상품평첨부파일 정보
+	 * @author gagamel
+	 * @since 2021. 4. 22
+	 */
+	void deleteReviewAttach(ReviewAttach reviewAttach);
+
 }

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

@@ -4,10 +4,12 @@ import java.util.Collection;
 
 import org.springframework.beans.factory.annotation.Autowired;
 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.persistence.domain.Review;
+import com.style24.persistence.domain.ReviewAttach;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -38,4 +40,43 @@ public class TsaReviewService {
 		return reviewDao.getReviewList(review);
 	}
 
+	/**
+	 * 상품평 상세
+	 * @param reviewSq - 상품평일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 4. 22
+	 */
+	public Review getReview(Integer reviewSq) {
+		// 상품평 정보
+		Review review = reviewDao.getReview(reviewSq);
+
+		// 상품평 첨부파일
+		review.setAttachList(reviewDao.getReviewAttachList(reviewSq));
+
+		return review;
+	}
+
+	/**
+	 * 상품평 관리자 답변 저장
+	 * @param review - 상품평 정보
+	 * @author gagamel
+	 * @since 2021. 4. 22
+	 */
+	@Transactional("shopTxnManager")
+	public void saveReviewUserReply(Review review) {
+		reviewDao.saveReviewUserReply(review);
+	}
+
+	/**
+	 * 상품평 첨부파일 삭제(=미노출) 처리
+	 * @param rvAtcSq - 상품평첨부파일일련번호
+	 * @author gagamel
+	 * @since 2021. 4. 22
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteReviewAttach(ReviewAttach reviewAttach) {
+		reviewDao.deleteReviewAttach(reviewAttach);
+	}
+
 }

+ 1 - 1
src/main/java/com/style24/admin/biz/web/TsaCustomerController.java

@@ -378,7 +378,7 @@ public class TsaCustomerController extends TsaBaseController {
 		mav.addObject("orderDtlStatList", rendererService.getCommonCodeList("G013"));
 
 		// 쿠폰유형
-		mav.addObject("cpnType", rendererService.getCommonCodeList("G230"));
+		mav.addObject("cpnType", rendererService.getCommonCodeList("G230", "Y"));
 
 		// 쿠폰할인방식
 		//mav.addObject("dcWayList", rendererService.getCommonCodeList("G240"));

+ 32 - 0
src/main/java/com/style24/admin/biz/web/TsaGoodsController.java

@@ -2886,4 +2886,36 @@ public class TsaGoodsController extends TsaBaseController {
 
 		return super.ok("");
 	}
+	
+	
+	/**
+	 * 입점 상품  화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 04. 21
+	 */
+	@GetMapping("/register/form")
+	public ModelAndView registerForm() {
+		ModelAndView mav = new ModelAndView();
+
+//		// 상품상태
+//		mav.addObject("goodsStatList", rendererService.getAvailCommonCodeList("G008"));
+//		// 사용여부
+//		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
+//		// WMS 연동여부
+//		mav.addObject("wmsSyncYn", commonService.getWmsSyncYn());
+//		// 정보고시 목록
+//		mav.addObject("niClsfCdList", rendererService.getAvailCommonCodeList("G004"));
+//		// 사용자 업체
+//		User loginInfo = systemService.getUser(TsaSession.getInfo().getUserNo());
+//		String supplyCompCd = "NONE";
+//		if (loginInfo != null) {
+//			supplyCompCd = loginInfo.getSupplyCompCd();
+//		}
+//		mav.addObject("supplyCompCd", supplyCompCd);
+		mav.setViewName("goods/GoodsRegisterForm");
+
+		return mav;
+	}
 }

Разница между файлами не показана из-за своего большого размера
+ 235 - 163
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java


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

@@ -47,6 +47,7 @@ public class Contents extends TscBaseDomain {
     private String mdTitle;
     private String useYn;
     private String contentsTitle;
+    private String html;
 
     private String multiContentsYn;
 

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

@@ -104,6 +104,7 @@ public class Coupon extends TscBaseDomain {
     private String[] payTypeArr;
 
     List<CouponLimitedTime> limitedTimeCpnList; //선착순 쿠폰 리스트
+    List<CouponAfChannel> afChannelList; //쿠폰 제휴채널 리스트
 
     // Pagination
     private TscPageRequest pageable;

+ 21 - 0
src/main/java/com/style24/persistence/domain/CouponAfChannel.java

@@ -0,0 +1,21 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+import lombok.Data;
+
+/**
+ * 쿠폰 제휴채널 도메인
+ * @author bin2107
+ * @since 2021-04-22
+ */
+@SuppressWarnings("serial")
+@Data
+public class CouponAfChannel extends TscBaseDomain {
+    private int  cpnId;					// 쿠폰ID
+    private String afLinkCd;
+
+    private String afLinkNm;
+    private int freeRate;
+    private int dispOrd;
+    private String afChannel;
+}

+ 6 - 9
src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml

@@ -362,7 +362,7 @@
 		       TAB2 E
 		ON     CC.CUST_CPN_SQ = E.CPN_SQ
 		WHERE  CC.CUST_NO = #{custNo}
-		ORDER BY E.ORD_NO DESC, CC.REG_DT DESC
+		ORDER BY CC.REG_DT DESC
 	</select>
 
 	<select id="getCustomerPoint" parameterType="Integer" resultType="Point">
@@ -395,15 +395,8 @@
 		               SELECT SUM(CPH.PNT_AMT) AS PNT_AMT
 		               FROM   TB_CUST_POINT_HST CPH
 		               WHERE  CPH.OCCUR_GB IN ('G069_12', 'G069_13')             -- 적립예정, 적립취소
-		               AND    CPH.PNT_UPLOAD_STAT IN ('G070_10', 'G070_20')        -- 반영예정, 반영전취소
+		               AND    CPH.PNT_UPLOAD_STAT IN ('G070_10')                 -- 반영예정
 		               AND    CPH.CUST_NO = #{custNo}
-		               AND    NOT EXISTS (
-		                                  SELECT 1
-		                                  FROM  TB_CUST_POINT_HST
-		                                  WHERE PNT_UPLOAD_STAT = 'G070_30'
-		                                  AND   ORD_NO = CPH.ORD_NO
-		                                  AND   ORD_DTL_NO = CPH.ORD_DTL_NO
-		                                  )
 		               ), 0)                           AS EXPECTED_PNT_AMT -- 적립예정포인트
 		     , IFNULL((
 		               SELECT SUM(RM_PNT_AMT) AS RM_PNT_AMT
@@ -475,6 +468,7 @@
 		       TB_CUSTOMER C
 		ON     CGH.CUST_NO = C.CUST_NO
 		WHERE  CGH.CUST_NO = #{custNo}
+		ORDER BY CGH.REG_DT DESC
 	</select>
 
 	<!--회원 상품평내역  -->
@@ -567,6 +561,7 @@
 		ON    CS.CUST_NO = C.CUST_NO
 		WHERE CS.COUNSEL_TYPE = 'C'
 		AND   CS.CUST_NO = #{custNo}
+		ORDER BY CS.REG_DT DESC
 	</select>
 
 	<!--회원 상품문의 내역  -->
@@ -614,6 +609,7 @@
 		ON    CS.CUST_NO = C.CUST_NO
 		WHERE CS.COUNSEL_TYPE = 'G'
 		AND   CS.CUST_NO = #{custNo}
+		ORDER BY CS.REG_DT DESC
 	</select>
 
 	<!--회원등급 변경내역  -->
@@ -632,6 +628,7 @@
 		       TB_CUSTOMER C
 		ON     CGH.CUST_NO = C.CUST_NO
 		WHERE  CGH.CUST_NO = #{custNo}
+		ORDER BY CGH.REG_DT DESC
 	</select>
 
 	<!-- 회원접촉내역 -->

+ 5 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml

@@ -1334,6 +1334,7 @@
 			 , A.SUB_TEXT2
 			 , A.SUB_TEXT3
 			 , A.SUB_TEXT4
+		     , A.HTML
 			 , A.BRAND_GROUP_NO
 			 , A.BRAND_GROUP_IMG
 			 , A.MD_TITLE
@@ -1431,6 +1432,7 @@
 			, SUB_TEXT2
 			, SUB_TEXT3
 			, SUB_TEXT4
+			, HTML
 			, BRAND_GROUP_NO
 			, BRAND_GROUP_IMG
 			, MD_TITLE
@@ -1473,6 +1475,7 @@
 			,#{subText2}
 			,#{subText3}
 			,#{subText4}
+			,#{html}
 			,#{brandGroupNo}
 			,#{brandGroupImg}
 			,#{mdTitle}
@@ -1533,6 +1536,7 @@
 			, SUB_TEXT2
 			, SUB_TEXT3
 			, SUB_TEXT4
+			, HTML
 			, BRAND_GROUP_NO
 			, BRAND_GROUP_IMG
 			, MD_TITLE
@@ -1573,6 +1577,7 @@
 			 , SUB_TEXT2
 			 , SUB_TEXT3
 			 , SUB_TEXT4
+		     , HTML
 			 , BRAND_GROUP_NO
 			 , BRAND_GROUP_IMG
 			 , MD_TITLE

+ 2 - 2
src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -928,7 +928,7 @@
 		     , G.ERP_PRICE_LINK_YN
 		     , G.NEW_CUST_ORD_YN
 		     , G.ADULT_YN
-		     , FN_GET_CODE_NM('G076', G.ORIGIN_CD) AS MAKE_NM
+		     , FN_GET_CODE_NM('G076', G.ORIGIN_CD) AS ORIGIN_NM
 		     , G.ORIGIN_CD
 		     , G.MAKE_YMD
 		     , G.TAX_GB
@@ -1461,7 +1461,7 @@
 		     , A.DISP_YN
 		     , C.DISP_ORD AS GOODS_ORD
 		     , COUNT(*) OVER(PARTITION BY A.GOODS_CD ) AS RCOUNT
-		     , ROW_NUMBER() OVER(PARTITION BY A.GOODS_CD ORDER BY C.DISP_ORD, A.OPT_CD1, A.OPT_CD2) AS RNUM
+		     , ROW_NUMBER() OVER(PARTITION BY A.GOODS_CD ORDER BY C.DISP_ORD, A.DISP_ORD, A.OPT_CD1, A.OPT_CD2) AS RNUM
 		FROM  TMP_GOODS C 
 		INNER JOIN TB_OPTION A ON C.COMPS_GOODS_CD = A.GOODS_CD 
 		LEFT OUTER JOIN (

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

@@ -39,7 +39,7 @@
 		     , 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 /*관리자댓글작성자명*/
+		     , 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     /*관리자댓글작성일시*/
 		FROM   TB_REVIEW R
 		     , TB_CUSTOMER C
@@ -79,4 +79,88 @@
 		ORDER  BY R.REG_DT DESC
 	</select>
 	
+	<!--상품평 정보 -->
+	<select id="getReview" parameterType="String" resultType="Review">
+		/* TsaReview.getReview */
+		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     /*댓글확인일시*/
+		FROM   TB_REVIEW R
+		     , TB_CUSTOMER C
+		     , TB_GOODS G
+		WHERE  R.REVIEW_SQ = #{reviewSq}
+	</select>
+	
+	<!--상품평 첨부파일 목록 -->
+	<select id="getReviewAttachList" parameterType="String" resultType="ReviewAttach">
+		/* TsaReview.getReviewAttachList */
+		SELECT RV_ATC_SQ   /*상품평첨부파일일련번호*/
+		     , REVIEW_SQ   /*상품평일련번호*/
+		     , FILE_GB     /*파일구분(M:동영상, I:이미지)*/
+		     , ORG_FILE_NM /*원본파일명*/
+		     , SYS_FILE_NM /*시스템파일명*/
+		     , KUF_KEY     /*KOLLUS업로드파일키*/
+		     , KMC_KEY     /*KOLLUS미디어컨텐츠키*/
+		FROM   TB_REVIEW_ATTACH
+		WHERE  REVIEW_SQ = #{reviewSq}
+		AND    DEL_YN = 'N' /*삭제안된넘*/
+	</select>
+	
+	<!-- 상품평 미노출 처리 -->
+	<update id="saveReviewUserReply" parameterType="Review">
+		/* TsaReview.saveReviewUserReply */
+		UPDATE TB_REVIEW
+		SET    ADM_RPL = #{admRpl}
+		     , ADM_RPL_REG_NO = #{admRplRegNo}
+		     , ADM_RPL_DT = NOW()
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  REVIEW_SQ = #{reviewSq}
+		AND    RPL_CFM_YN = 'N' /*고객이 관리자댓글 확인을 안한넘*/
+	</update>
+	
+	<!-- 상품평 미노출 처리 -->
+	<update id="deleteReviewAttach" parameterType="ReviewAttach">
+		/* TsaReview.deleteReviewAttach */
+		UPDATE TB_REVIEW_ATTACH
+		SET    DEL_YN = 'Y'
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  RV_ATC_SQ = #{rvAtcSq}
+		AND    DEL_YN = 'N' /*삭제안된넘*/
+	</update>
+	
 </mapper>

+ 2 - 2
src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html

@@ -767,9 +767,9 @@
 	const columnReviewDefs = [
 		{headerName: "상품코드", field: "goodsCd", width: 100, cellClass: 'text-center'},
 		{
-			headerName: "제목", field: "reviewTitle", width: 300, cellClass: 'text-center',
+			headerName: "내용", field: "reviewContent", width: 300, cellClass: 'text-center',
 			cellRenderer: function (params) {
-				return '<a href="javascript:void(0);">' + params.value + '</a>';
+				return !gagajf.isNull(params.value) ? '<a href="javascript:void(0);">' + params.value + '</a>' : '';
 			}
 		},
 		{headerName: "만족도", field: "score", width: 100, cellClass: 'text-center'},

+ 213 - 34
src/main/webapp/WEB-INF/views/display/MainContentsPopupForm.html

@@ -37,6 +37,8 @@
 	</div>
 </div>
 
+<script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020103001"></script>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.summernote.js?v=2020103001"></script>
 <script type="text/javascript" src="/ux/plugins/gaga/gaga.kollus.js"></script>
 <script th:inline="javascript">
 	/*<![CDATA[*/
@@ -65,7 +67,10 @@
 	var createIdx = 0;
 	var fnCreatePopLayout = function(result) {
 		var html = '';
+		var descIdx = '';
+
 		for(var i=0; i<result.length; i++){
+			descIdx = i;
 			var dispStdt = result[i].dispStdt.split(" ");
 			var dispEddt = result[i].dispEddt.split(" ");
 			var cate1No = result[i].contentsType;
@@ -93,9 +98,9 @@
 			html += '</select>';
 			html += '<input name="dispOrd" type="text" class="w80"placeholder="전시순서" style="margin-left:5px; text-align:center"/>';
 			html += '</td>';
-			if(contentsLoc!='SCM002' && contentsLoc!='SCM003' && contentsLoc!='SMM011' && contentsLoc!='SBM012'){
+			if(contentsLoc!='SCM002' && contentsLoc!='SCM003'){
 				html += '<td class="aL">';
-				if(contentsLoc!='SMM005'){
+				if(contentsLoc!='SMM005'  && contentsLoc!='SMM011' && contentsLoc!='SBM012'){
 					html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddTitlePopRow(this);">타이틀추가</button>';
 				}
 				if(contentsLoc=='SMM001' || contentsLoc=='SMM002' || contentsLoc=='SBM004' || contentsLoc=='SBMM004' || contentsLoc=='SCM001'){
@@ -104,10 +109,12 @@
 				if(contentsLoc=='SBM005' || contentsLoc=='SBMM005'){
 					html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddBrandDescRow(this);">브랜드소개추가</button>';
 				}
-				if(contentsLoc!='SMM005' && contentsLoc!='SBM005' && contentsLoc!='SBMM005' && contentsLoc!='SGNB001'){
+				if(contentsLoc!='SMM005' && contentsLoc!='SBM005' && contentsLoc!='SBMM005' && contentsLoc!='SGNB001'  && contentsLoc!='SMM011' && contentsLoc!='SBM012'){
 					html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddImgPopRow(this);">이미지추가</button>';
 				}
-				html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddLinkPopRow(this);">링크추가</button>';
+				if(contentsLoc!='SMM011' && contentsLoc!='SBM012'){
+					html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddLinkPopRow(this);">링크추가</button>';
+				}
 				html += '<button type="button" class="btn btn-danger btn-lg" onclick="fnDeleteContentsRow(this);">삭제</button></td>';
 			}
 			html += '</tr>';
@@ -125,6 +132,39 @@
 				html += '	</td>';
 				html += '</tr>';
 			}
+			if(contentsLoc=='SMM011' || contentsLoc=='SBM012'){
+				html += '<tr class="cateTypeTr">';
+				html += '	<th>동영상구분</th>';
+				html += '	<td colspan="3">';
+				if(result[i].strVar1=='Y'){
+					html += '		<label class="rdoBtn"><input type="radio" name="tvPlayer'+i+'" value="Y" onclick="fnChangeTvPlayer(this,'+i+');" checked="checked" />YouTube</label>';
+					html += '		<label class="rdoBtn"><input type="radio" name="tvPlayer'+i+'" value="M" onclick="fnChangeTvPlayer(this,'+i+');"/>MP4</label>';
+				}else{
+					html += '		<label class="rdoBtn"><input type="radio" name="tvPlayer'+i+'" value="Y" onclick="fnChangeTvPlayer(this,'+i+');" />YouTube</label>';
+					html += '		<label class="rdoBtn"><input type="radio" name="tvPlayer'+i+'" value="M" onclick="fnChangeTvPlayer(this,'+i+');" checked="checked" />MP4</label>';
+				}
+				html += '	</td>';
+				html += '</tr>';
+				html += '<tr class="cateTypeTr" name="tvY'+i+'">';
+				html += '	<th>미디어<br>컨텐츠키</th>';
+				html += '	<td colspan="3">';
+				html += '		<input name="tvMediaKey'+i+'" type="text" class="w150" maxlength="200" data-valid-name="미디어 컨텐츠키" value="'+result[i].strVar2+'"/>';
+				html += '	</td>';
+				html += '</tr>';
+				if(result[i].strVar1=='M'){
+					html += '<tr class="cateTypeTr" name="tvM'+i+'">';
+					html +='	<th>파일첨부<em className="required" title="필수"></em></th>';
+					html +='	<td className="infoTxt" colSpan="5">';
+					html +='		<div className="uFile w300">';
+					html +='			<input id="file'+i+'" name="file" type="file" className="uFileInput w300" onchange="fnVideoFileUpload(this, '+i+')"/>';
+					html +='			<label htmlFor="file'+i+'" className="uFileLabel">파일선택</label>';
+					html +='			<input type="hidden" name="kufKey" value="'+result[i].strVar3+'"/>';
+					html +='			<input type="hidden" name="kmcKey"/>';
+					html +='		</div>';
+					html +='	</td>';
+					html += '</tr>';
+				}
+			}
 			if(contentsLoc=='SGNB001'){
 				html += '<tr class="cateTypeTr">';
 				html += '	<th>유형선택</th>';
@@ -166,23 +206,47 @@
 					html += '	</div></td>';
 					html += '</tr>';
 
-					html += '<tr name="imgPopRow" id="openBanner1">';
-					html += '	<th>오픈배너<br>이미지</th>';
-					html += '	<td><div class="uFile w300">';
-					html += '			<input id="filePop_1" name="file" type="file" class="uFileInput w300" onchange="fnPopFileUpload(this, 1)"/>';
-					html += '			<label for="filePop_1" class="uFileLabel">파일선택</label>';
-					html += '			<input type="hidden" name="imgPath" value="'+result[i].imgPath2+'"/>';
-					html += '			<input type="hidden" name="newImgFile" value="" />';
-					html += '		</div>';
-					html += '	<div id="imgViewPop_1" class=';
-					if(src!=''){
-						html += '"on">';
+					html += '<tr class="cateTypeTr" name="openBannerTypeTr'+i+'" id="openBannerTypeTr">';
+					html += '	<th>확장형 배너<br>유형</th>';
+					html += '	<td colspan="3">';
+					if(result[i].strVar7=='IMG'){
+						html += '		<label class="rdoBtn"><input type="radio" name="openBannerType'+i+'" value="IMG" onclick="fnChangeOpenBannerType(this,'+i+');" checked="checked"/>이미지형</label>';
+						html += '		<label class="rdoBtn"><input type="radio" name="openBannerType'+i+'" value="HTML" onclick="fnChangeOpenBannerType(this,'+i+');"/>HTML형</label>';
 					}else{
-						html += '"off">';
+						html += '		<label class="rdoBtn"><input type="radio" name="openBannerType'+i+'" value="IMG" onclick="fnChangeOpenBannerType(this,'+i+');" />이미지형</label>';
+						html += '		<label class="rdoBtn"><input type="radio" name="openBannerType'+i+'" value="HTML" onclick="fnChangeOpenBannerType(this,'+i+');" checked="checked"/>HTML형</label>';
 					}
-					html += '		<img id="bannerPreViewUrlPop_1" src="'+src2+'" style="height:100px; max-width:500px;"  onclick="cfnOpenImagePreViewPopup(\'bannerPreimgViewPop\',$(this).attr(\'src2\'));"/>';
-					html += '	</div></td>';
+					html += '	</td>';
 					html += '</tr>';
+
+					if(result[i].strVar7=='IMG'){
+						html += '<tr name="imgPopRow" id="openBanner1">';
+						html += '	<th>오픈배너<br>이미지</th>';
+						html += '	<td><div class="uFile w300">';
+						html += '			<input id="filePop_1" name="file" type="file" class="uFileInput w300" onchange="fnPopFileUpload(this, 1)"/>';
+						html += '			<label for="filePop_1" class="uFileLabel">파일선택</label>';
+						html += '			<input type="hidden" name="imgPath" value="'+result[i].imgPath2+'"/>';
+						html += '			<input type="hidden" name="newImgFile" value="" />';
+						html += '		</div>';
+						html += '	<div id="imgViewPop_1" class=';
+						if(src!=''){
+							html += '"on">';
+						}else{
+							html += '"off">';
+						}
+						html += '		<img id="bannerPreViewUrlPop_1" src="'+src2+'" style="height:100px; max-width:500px;"  onclick="cfnOpenImagePreViewPopup(\'bannerPreimgViewPop\',$(this).attr(\'src2\'));"/>';
+						html += '	</div></td>';
+						html += '</tr>';
+					}else{
+						html += '<tr name="imgPopRow" id="openBanner2">';
+						html += '	<input type="hidden" name="htmlDesc'+i+'" id="htmlDesc'+i+'" value="'+result[i].html+'">';
+						html += '	<th>오픈배너<br>HTML</th>';
+						html += '	<td class="padT10"><div class="tabJrContArea">';
+						html += '		<textarea class="textareaR3 summernote" name="openBannerDesc'+i+'" id="openBannerDesc'+i+'" ></textarea>';
+						html += '	</div>';
+						html += '	</td>';
+						html += '</tr>';
+					}
 				}
 
 				if(result[i].contentsType=='IMG'){
@@ -330,7 +394,7 @@
 				html += '	</tr>';
 			}
 			html += '</thead><tbody>';
-			if(contentsLoc!='SCM002' && contentsLoc!='SCM003'){
+			if(contentsLoc!='SCM002' && contentsLoc!='SCM003' && contentsLoc!='SMM011' && contentsLoc!='SBM012'){
 				for(var j=1; j<5; j++){
 					var strTitle = eval("result["+i+"].strTitle" + j);
 					var imgPath = eval("result["+i+"].imgPath" + j);
@@ -364,17 +428,65 @@
 			defaultDate: $('.schDate').val()
 		});
 
+		// SGNB001 일때 확장형 배너 summernote
+		if(contentsLoc=='SGNB001'){
+			fnOpenBannerSummernote();
+		}
+
 		tableLen = $(".mcTable").length;
 	}
 
+	var fnOpenBannerSummernote = function (){
+		$('.mcTable').each(function(){
+			let idx = $(this).find('[name=tableIdx]').val();
+			let bannerCateType = $("#mcTable"+idx).find('input:radio[name=cateType'+idx+']:checked').val();
+
+			if(bannerCateType=='OPEN'){
+				let bannerType = $("#mcTable"+idx).find('input:radio[name=openBannerType'+idx+']:checked').val();
+				if(bannerType=='HTML'){
+					let htmlDesc = $("#mcTable"+idx).find('input[name=htmlDesc'+idx+']').val();
+					gagaSn.setContents('#openBannerDesc'+idx, '');
+					$('#openBannerDesc'+idx).summernote('code', htmlDesc);
+				}
+			}
+		});
+	}
+
+	var fnChangeTvPlayer = function (obj,idx){
+		let tvPlayer = $("#mcTable"+idx).find("input:radio[name=tvPlayer"+idx+"]:checked").val();
+
+		if(tvPlayer == 'Y'){
+			$(obj).closest("table").find("[name=tvY"+idx+"]").show();
+			$(obj).closest("table").find("[name=tvM"+idx+"]").hide();
+		}else{
+			$(obj).closest("table").find("[name=tvY"+idx+"]").show();
+			$(obj).closest("table").find("[name=tvM"+idx+"]").show();
+		}
+	}
+
+	var fnChangeOpenBannerType = function (obj, idx){
+		let openBannerType = $("#mcTable"+idx).find("input:radio[name=openBannerType"+idx+"]:checked").val();
+
+		if(openBannerType == 'IMG'){
+			$(obj).closest("table").find("[id=openBanner1]").show();
+			$(obj).closest("table").find("[id=openBanner2]").hide();
+		}else{
+			$(obj).closest("table").find("[id=openBanner1]").hide();
+			$(obj).closest("table").find("[id=openBanner2]").show();
+		}
+	}
+
 	var fnChangeGnbCateType = function (obj, idx){
 		let cateType = $("#mcTable"+idx).find("input:radio[name=cateType"+idx+"]:checked").val();
 
 		if(cateType=='OPEN'){
 			$(obj).closest("table").find("[name=tabBgColorRow"+idx+"]").show();
 			$(obj).closest("table").find("[name=tabShowYnRow"+idx+"]").show();
+			$(obj).closest("table").find("[name=openBannerTypeTr"+idx+"]").show();
+			$(obj).closest("table").find("input:radio[name=openBannerType"+idx+"]:input[value=IMG]").prop('checked',true);
 			$(obj).closest("table").find("[id=openBanner0]").show();
 			$(obj).closest("table").find("[id=openBanner1]").show();
+			$(obj).closest("table").find("[id=openBanner2]").hide();
 			$(obj).closest("table").find("[name=file]").closest('div').find('label').text('파일선택');
 			$(obj).closest("table").find("[name=imgPath]").val('');
 			$(obj).closest("table").find("[name=newImgFile]").val('');
@@ -385,8 +497,11 @@
 		}else if(cateType=='IMG'){
 			$(obj).closest("table").find("[name=tabBgColorRow"+idx+"]").show();
 			$(obj).closest("table").find("[name=tabShowYnRow"+idx+"]").hide();
+			$(obj).closest("table").find("[name=openBannerTypeTr"+idx+"]").hide();
+			$(obj).closest("table").find("input:radio[name=openBannerType"+idx+"]:input[value=IMG]").prop('checked',true);
 			$(obj).closest("table").find("[id=openBanner0]").show();
 			$(obj).closest("table").find("[id=openBanner1]").hide();
+			$(obj).closest("table").find("[id=openBanner2]").hide();
 			$(obj).closest("table").find("[name=file]").closest('div').find('label').text('파일선택');
 			$(obj).closest("table").find("[name=imgPath]").val('');
 			$(obj).closest("table").find("[name=newImgFile]").val('');
@@ -397,8 +512,11 @@
 		}else if(cateType=='TEXT'){
 			$(obj).closest("table").find("[name=tabBgColorRow"+idx+"]").hide();
 			$(obj).closest("table").find("[name=tabShowYnRow"+idx+"]").hide();
-			$(obj).closest("table").find("[id=openBanner0]").hide();
+			$(obj).closest("table").find("[name=openBannerTypeTr"+idx+"]").hide();
+			$(obj).closest("table").find("input:radio[name=openBannerType"+idx+"]:input[value=IMG]").prop('checked',true);
+			$(obj).closest("table").find("[id=openBanner0]").show();
 			$(obj).closest("table").find("[id=openBanner1]").hide();
+			$(obj).closest("table").find("[id=openBanner2]").hide();
 			$(obj).closest("table").find("[name=file]").closest('div').find('label').text('파일선택');
 			$(obj).closest("table").find("[name=imgPath]").val('');
 			$(obj).closest("table").find("[name=newImgFile]").val('');
@@ -449,10 +567,10 @@
 		html += '<td class="aL">';
 		if(contentsLoc!='SCM002' && contentsLoc!='SCM003' && contentsLoc!='SMM011' && contentsLoc!='SBM012'){
 			if(contentsLoc!='SMM005'){
-				html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddTitlePopRow(this);">타이틀추가</button>';
+				html += '<button type="button" class="btn btn-base btn-lg" id="addTitle'+dataIdx+'" onclick="fnAddTitlePopRow(this);">타이틀추가</button>';
 			}
 			if(contentsLoc=='SMM001' || contentsLoc=='SMM002' || contentsLoc=='SBM004' || contentsLoc=='SBMM004' || contentsLoc=='SCM001'){
-				html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddSubTextPopRow(this);">서브텍스트추가</button>';
+				html += '<button type="button" class="btn btn-base btn-lg" id="addSubText'+dataIdx+'" onclick="fnAddSubTextPopRow(this);">서브텍스트추가</button>';
 			}
 			if(contentsLoc=='SBM005' || contentsLoc=='SBMM005'){
 				html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddBrandDescRow(this);">브랜드소개추가</button>';
@@ -460,7 +578,7 @@
 			if(contentsLoc!='SBM005' && contentsLoc!='SBMM005' && contentsLoc!='SGNB001') {
 				html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddImgPopRow(this);">이미지추가</button>';
 			}
-				html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddLinkPopRow(this);">링크추가</button>';
+				html += '<button type="button" class="btn btn-base btn-lg" id="addLink'+dataIdx+'" onclick="fnAddLinkPopRow(this);">링크추가</button>';
 		}
 		html += '<button type="button" class="btn btn-danger btn-lg" onclick="fnDeleteContentsRow(this);">삭제</button></td>';
 		html += '</tr>';
@@ -475,24 +593,29 @@
 		}
 		if(contentsLoc=='SMM011' || contentsLoc=='SBM012'){
 			html += '<tr class="cateTypeTr">';
-			html += '	<th>플레이어</th>';
-			html += '	<td colspan="3">';
-			html += '		<label class="rdoBtn"><input type="radio" name="tvPlayer'+dataIdx+'" value="Y" checked="checked"/>YouTube</label>';
-			html += '		<label class="rdoBtn"><input type="radio" name="tvPlayer'+dataIdx+'" value="M" />MP4</label>';
-			html += '	</td>';
-			html += '</tr>';
-			html += '<tr class="cateTypeTr">';
-			html += '	<th>업로드<br>파일키</th>';
+			html += '	<th>동영상구분</th>';
 			html += '	<td colspan="3">';
-			html += '		<td><input name="tvFileKey'+dataIdx+'" type="text" maxlength="200" data-valid-name="업로드 파일키" value=""/></td>';
+			html += '		<label class="rdoBtn"><input type="radio" name="tvPlayer'+dataIdx+'" value="Y" onclick="fnChangeTvPlayer(this,'+dataIdx+');" checked="checked" />YouTube</label>';
+			html += '		<label class="rdoBtn"><input type="radio" name="tvPlayer'+dataIdx+'" value="M" onclick="fnChangeTvPlayer(this,'+dataIdx+');"/>MP4</label>';
 			html += '	</td>';
 			html += '</tr>';
-			html += '<tr class="cateTypeTr">';
+			html += '<tr class="cateTypeTr" name="tvY'+dataIdx+'">';
 			html += '	<th>미디어<br>컨텐츠키</th>';
 			html += '	<td colspan="3">';
-			html += '		<td><input name="tvMediaKey'+dataIdx+'" type="text" maxlength="200" data-valid-name="미디어 컨텐츠키" value=""/></td>';
+			html += '		<input name="tvMediaKey'+dataIdx+'" type="text" class="w150" maxlength="200" data-valid-name="미디어 컨텐츠키" value=""/>';
 			html += '	</td>';
 			html += '</tr>';
+			html += '<tr class="cateTypeTr" name="tvM'+dataIdx+'" style="display: none;">';
+			html +='	<th>파일첨부<em className="required" title="필수"></em></th>';
+			html +='	<td className="infoTxt" colSpan="5">';
+			html +='		<div className="uFile w300">';
+			html +='			<input id="file'+dataIdx+'" name="file" type="file" className="uFileInput w300" onchange="fnVideoFileUpload(this, '+dataIdx+')"/>';
+			html +='			<label htmlFor="file'+dataIdx+'" className="uFileLabel">파일선택</label>';
+			html +='			<input type="hidden" name="kufKey"/>';
+			html +='			<input type="hidden" name="kmcKey"/>';
+			html +='		</div>';
+			html +='	</td>';
+			html += '</tr>';
 		}
 		if(contentsLoc=='SGNB001'){
 			html += '<tr class="cateTypeTr">';
@@ -523,6 +646,14 @@
 			html += '	</div></td>';
 			html += '</tr>';
 
+			html += '<tr class="cateTypeTr" name="openBannerTypeTr'+dataIdx+'" id="openBannerTypeTr">';
+			html += '	<th>확장형 배너<br>유형</th>';
+			html += '	<td colspan="3">';
+			html += '		<label class="rdoBtn"><input type="radio" name="openBannerType'+dataIdx+'" value="IMG" onclick="fnChangeOpenBannerType(this,'+dataIdx+');" checked="checked"/>이미지형</label>';
+			html += '		<label class="rdoBtn"><input type="radio" name="openBannerType'+dataIdx+'" value="HTML" onclick="fnChangeOpenBannerType(this,'+dataIdx+');"/>HTML형</label>';
+			html += '	</td>';
+			html += '</tr>';
+
 			html += '<tr name="imgPopRow" id="openBanner1">';
 			html += '	<th>오픈배너<br>이미지</th>';
 			html += '	<td><div class="uFile w300">';
@@ -541,6 +672,15 @@
 			html += '	</div></td>';
 			html += '</tr>';
 
+			html += '<tr name="imgPopRow" id="openBanner2" style="display: none;">';
+			html += '	<input type="hidden" name="htmlDesc'+dataIdx+'" id="htmlDesc'+dataIdx+'" value="">';
+			html += '	<th>오픈배너<br>HTML</th>';
+			html += '	<td class="padT10"><div class="tabJrContArea">';
+			html += '		<textarea class="textareaR3 summernote" name="openBannerDesc'+dataIdx+'" id="openBannerDesc'+dataIdx+'"></textarea>';
+			html += '	</div>';
+			html += '	</td>';
+			html += '</tr>';
+
 			html += '	<tr name="tabBgColorRow'+dataIdx+'">';
 			html += '		<th>배경 RGB코드</th>';
 			html += '		<td><input name="gnbBgColor'+dataIdx+'" type="text" maxlength="200" data-valid-name="배경 RGB코드" value=""/></td>';
@@ -621,10 +761,24 @@
 			changeYear: true,
 			defaultDate: $('.schDate').val()
 		});
+		if(contentsLoc=='SMM001'){
+			$("#addTitle"+dataIdx).click();
+			$("#addSubText"+dataIdx).click();
+			$("#addLink"+dataIdx).click();
+		}
+
+		if(contentsLoc=='SGNB001'){
+			gagaSn.setContents('#openBannerDesc'+dataIdx, '');
+		}
 
 		tableLen = tableLen+1;
 	});
 
+	var fnVideoFileUpload = function (obj, idx){
+		var file = obj.files[0];
+		gagaKollus.upload('Display', file, $(obj).find('input[name=kufKey]'));
+	}
+
 	var fnChangeBannerType = function (obj, idx){
 		if(idx==1){
 			$(obj).closest("table").find("[id=bannerImgTr1]").show();
@@ -661,6 +815,9 @@
 
 	var callbackPlanPopup = function (result){
 		$("#mcTable"+tableDataId+" .planArea").find("input[name=planSq"+tableDataId+"]").val(result[0].planSq);
+		$("#mcTable"+tableDataId).find("tr[name=titlePopRow]").find("input[name=title]").val(result[0].planNm);
+		$("#mcTable"+tableDataId).find("tr[name=subTextPopRow]").find("input[name=subText]").val(result[0].dtlTitle1);
+		$("#mcTable"+tableDataId).find("tr[name=linkPopRow]").find("input[name=link]").val('/planning/detail/form?planSq='+result[0].planSq);
 	}
 
 	// SMM001 데이터 validation 체크
@@ -761,6 +918,7 @@
 			var subText4 = '';
 			var contentsType = '';
 			var useYn = 'Y';
+			var html = '';
 			var i = 1;
 			$(this).find('input[name=imgPath]').each(function(){
 				eval("imgPath" + i + "='"+$(this).val()+"'");
@@ -792,6 +950,13 @@
 				i++;
 			});
 
+			if(contentsLoc=='SMM011'){
+				var thisIdx = $(this).find("input[name=tableIdx]").val();
+				strVar1 = $(this).find("input:radio[name=tvPlayer"+thisIdx+"]:checked").val();
+				strVar2 = $(this).find("input[name=tvMediaKey"+thisIdx+"]").val();
+				strVar3 = $(this).find("input[name=kufKey]").val();
+			}
+
 			var dispStdt = $(this).find("[name=dispStdt]").val().replace(/[^0-9]/g, '') + "" +$(this).find("[name=stTimeHour]").val().replace('시', '') + "" +$(this).find("[name=stTimeMin]").val().replace('분', '') + "00";
 			var dispEddt = $(this).find("[name=dispEddt]").val().replace(/[^0-9]/g, '') + "" +$(this).find("[name=edTimeHour]").val().replace('시', '') + "" +$(this).find("[name=edTimeMin]").val().replace('분', '') + "59";
 
@@ -807,6 +972,10 @@
 				strVar5 = $(this).find("input[name=gnbBgColor"+thisIdx+"]").val();
 				strVar6 = $(this).find("input[name=gnbTextColor"+thisIdx+"]").val();
 				strVar8 = $(this).find("input:radio[name=todayYn"+thisIdx+"]:checked").val();
+				strVar7 = $(this).find("input:radio[name=openBannerType"+thisIdx+"]:checked").val();
+				if($(this).find("input:radio[name=openBannerType"+thisIdx+"]:checked").val() == 'HTML'){
+					html = $(this).find("textarea[name=openBannerDesc"+thisIdx+"]").val();
+				}
 			}
 
 			if(contentsLoc=='SMM001'){
@@ -862,6 +1031,7 @@
 				, useYn : useYn
 				, dispOrd : dispOrd
 				, brandGroupNo : brandGroupNo
+				, html : html
 			};
 
 			dataArr.push(data);
@@ -910,6 +1080,7 @@
 		}
 
 		var jsonData = JSON.stringify(dataArr);
+		console.log('jsonData::'+jsonData);
 		mcxDialog.confirm('컨텐츠를 저장 하시겠습니까?', {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
@@ -1120,6 +1291,12 @@
 		return html;
 	}
 
+	// 동영상파일 선택 시
+	$('#popSortable input[name=file]').on('change', function() {
+		var file = this.files[0];
+		gagaKollus.upload('Display', file, $('input[name=kufKey]'));
+	});
+
 	// 창닫기
 	var fnMainContentsPopupFormClose = function (){
 		uifnPopupClose('popupMainContents');
@@ -1130,6 +1307,8 @@
 
 		$("#popSortable").disableSelection();
 		fnGetContentsPreviewList();
+
+
 	});
 	/*]]>*/
 </script>

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

@@ -841,7 +841,7 @@
 			$('#goodsDetailForm input[name=seasonCdOrg]').val(result.seasonCd);
 			$('#goodsDetailForm select[name=sexGb]').val(result.sexGb);
 			$('#goodsDetailForm input[name=sexGbOrg]').val(result.sexGb);
-			$('#goodsDetailForm').find('#makeNmTxt').html(result.makeNm);
+			$('#goodsDetailForm').find('#makeNmTxt').html(result.originNm);
 			$('#goodsDetailForm').find('#styleYearTxt').html(result.styleYear);
 			$('#goodsDetailForm select[name=goodsGb]').val(result.goodsGb);
 			$('#goodsDetailForm input[name=goodsGbOrg]').val(result.goodsGb);

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

@@ -53,9 +53,9 @@
 							<th>컬러명</th>
 							<td th:text="${goodsImg.colorNm}">PINK</td>
 							<th>대표 이미지순번</th>
-							<td><input type="text" class="text-right" name="defaultImgOrd" maxlength="3" th:value="${defaultImgOrd}" required="required" data-valid-type="number" data-valid-name="대표이미지순번"/></td>
+							<td><input type="text" class="text-right" name="defaultImgOrd" maxlength="3" th:value="${defaultImgOrd}" required="required" data-valid-type="numeric" data-valid-name="대표이미지순번"/></td>
 							<th>마우스오버 이미지순번</th>
-							<td><input type="text" class="text-right" name="mouseoverImgOrd" maxlength="3" th:value="${mouseoverImgOrd}" required="required" data-valid-type="number" data-valid-name="마우스오버 이미지순번"/></td>
+							<td><input type="text" class="text-right" name="mouseoverImgOrd" maxlength="3" th:value="${mouseoverImgOrd}" required="required" data-valid-type="numeric" data-valid-name="마우스오버 이미지순번"/></td>
 						</tr>
 						<tr>
 							<th>이미지등록</th>

+ 33 - 0
src/main/webapp/WEB-INF/views/goods/GoodsRegisterForm.html

@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"        >
+<!--
+ *******************************************************************************
+ * @source  : GoodsRegisterForm.html
+ * @desc    : 입점 상품등록
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.21   eskim       최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- 검색조건 영역 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+		
+/*]]>*/
+</script>
+</html>

+ 20 - 20
src/main/webapp/WEB-INF/views/marketing/CouponListForm.html

@@ -20,7 +20,7 @@
 	</div>
 	<!-- //메인타이틀 영역 -->
 
-	<form id="searchForm" name="searchForm" action="#" th:action="@{'/marketing/coupon/list'}">
+	<form id="cpnSearchForm" name="cpnSearchForm" action="#" th:action="@{'/marketing/coupon/list'}">
 		<!-- 패널 영역1 -->
 		<div class="panelStyle" >
 			<!-- 검색조건 영역 -->
@@ -230,17 +230,17 @@
 
 		// 초기화 클릭시
 		$('#btnInit').on('click', function() {
-			$('#searchForm')[0].reset();
-			//$("#searchForm input[type=radio]").removeClass("checked");
-			$("#searchForm input[type=checkbox]").removeClass("checked");
-			//$("#searchForm input[type=radio]").parent("label").removeClass("checked");
-			$("#searchForm input[type=checkbox]").parent("label").removeClass("checked");
-			$("#searchForm input[type=radio][checked]").parent("label").addClass("checked");
+			$('#cpnSearchForm')[0].reset();
+			//$("#cpnSearchForm input[type=radio]").removeClass("checked");
+			$("#cpnSearchForm input[type=checkbox]").removeClass("checked");
+			//$("#cpnSearchForm input[type=radio]").parent("label").removeClass("checked");
+			$("#cpnSearchForm input[type=checkbox]").parent("label").removeClass("checked");
+			$("#cpnSearchForm input[type=radio][checked]").parent("label").addClass("checked");
 		});
 
 		// 조회클릭시
 		$('#btnSearch').on('click', function() {
-			$("#searchForm input[name=pageNo]").val('1');
+			$("#cpnSearchForm input[name=pageNo]").val('1');
 			fnCouponListSearch();
 		});
 
@@ -248,14 +248,14 @@
 		var fnCouponListSearch = function() {
 			if(!fnConditionCheck()) return;
 
-			gagaPaging.init('searchForm', fnSearchCallBack, 'couponListPagination', $('#searchForm').find('#pageSize').val());
-			gagaPaging.load($("#searchForm input[name=pageNo]").val());
+			gagaPaging.init('cpnSearchForm', fnSearchCallBack, 'couponListPagination', $('#cpnSearchForm').find('#pageSize').val());
+			gagaPaging.load($("#cpnSearchForm input[name=pageNo]").val());
 		}
 
 		//검색 조건 확인
 		var fnConditionCheck = function(){
-			var fromDate = $('#searchForm input[name=availStdt]').val();
-			var toDate = $('#searchForm input[name=availEddt]').val();
+			var fromDate = $('#cpnSearchForm input[name=availStdt]').val();
+			var toDate = $('#cpnSearchForm input[name=availEddt]').val();
 
 			if (!gagajf.isNull(fromDate) || !gagajf.isNull(toDate)) {
 
@@ -263,7 +263,7 @@
 					mcxDialog.alertC("기간 조회시 시작일자와 종료일자를 입력하세요.", {
 						sureBtnText: "확인",
 						sureBtnClick: function() {
-							$('#searchForm input[name=availStdt]').focus();
+							$('#cpnSearchForm input[name=availStdt]').focus();
 						}
 					});
 					return false;
@@ -273,7 +273,7 @@
 					mcxDialog.alertC("등록 시작일자는 종료일자 보다 클 수 없습니다.", {
 						sureBtnText: "확인",
 						sureBtnClick: function() {
-							$('#searchForm input[name=availEddt]').focus();
+							$('#cpnSearchForm input[name=availEddt]').focus();
 						}
 					});
 					return false;
@@ -285,18 +285,18 @@
 
 		var fnSearchCallBack = function(result){
 
-			$('#searchForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
-			$('#searchForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
-			$('#searchForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
-			$('#searchForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
+			$('#cpnSearchForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
+			$('#cpnSearchForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
+			$('#cpnSearchForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
+			$('#cpnSearchForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
 			gridOptions.api.setRowData(result.cpnList);
 			gagaPaging.createPagination(result.pageing.pageable);
 
 		}
 
 		//페이징
-		$('#searchForm select[name=pageSize]').on('change', function() {
-			$("#searchForm input[name=pageNo]").val('1');
+		$('#cpnSearchForm select[name=pageSize]').on('change', function() {
+			$("#cpnSearchForm input[name=pageNo]").val('1');
 			fnCouponListSearch();
 		});
 

+ 161 - 41
src/main/webapp/WEB-INF/views/marketing/CouponPopupForm.html

@@ -346,6 +346,22 @@
 												</label>
 											</td>
 										</tr>
+										<tr>
+											<th>제휴채널</th>
+											<td colspan="1">
+												<!-- 수정시 프로모션명 입력 : before -->
+												<div class="padding10"	style="display: inline-block; width: 100%;">
+													<!--<span>공급업체 설정</span>-->
+													<div class="padding10 inner-tb-solid">
+														<span class="buttonSpan">
+															<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddAf">제휴채널 추가</button>
+															<button type="button" class="btn btnRight btn-success btn-lg"id="btnDeleteAf">선택삭제</button>
+														</span> <br />
+														<div id="afChannelList" style="width: 100%; height: 200px;" class="ag-theme-balham"></div>
+													</div>
+												</div>
+											</td>
+										</tr>
 										<tr>
 											<th>쿠폰상태<em class="required" title="필수"></em></th>
 											<td>
@@ -354,14 +370,14 @@
 												</label>
 												<input type="hidden" id="cpnStat" name="cpnStat"/>
 											</td>
-											<th>제휴링크코드<em class="required" title="필수"></em></th>
+											<!--<th>제휴링크코드<em class="required" title="필수"></em></th>
 											<td>
 												<select name="afChannel" id="afChannel" onchange="fnChangeAfLinkCdList()" data-valid-name="제휴링크코드" required="required">
 													<option th:if="${upperAfLinkCdList}" th:each="oneData , status : ${upperAfLinkCdList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 												</select>
 												<select name="afLinkCd" id="afLinkCd">
 												</select>
-											</td>
+											</td>-->
 										</tr>
 									</tbody>
 								</table>
@@ -507,6 +523,7 @@
 					<button type="button" class="btn btnRight btn-success btn-lg couponButton" id="btnChangeStatIng" style="display: none;">진행</button>
 					<button type="button" class="btn btnRight btn-success btn-lg couponButton" id="btnCouponDelete" style="display: none;">삭제</button>
 					<button type="button" class="btn btnRight btn-success btn-lg couponButton" id="btnCouponStop" style="display: none;">중지</button>
+					<button type="button" class="btn btnRight btn-success btn-lg couponButton" id="btnCouponEnd" style="display: none;">종료</button>
 				</div>
 
 			</form>
@@ -531,6 +548,7 @@
 	var cpnCustGradeList = [[${cpnCustGradeList}]];
 	var cpnPayTypeList = [[${cpnPayTypeList}]];
 	var limitedTimeCpnList = [[${limitedTimeCpnList}]];
+	var afChannelList = [[${afChannelList}]];
 
 	// 공통코드 리스트
 	var ibSupplyComList = gagajf.convertToArray([[${ibSupplyCompList}]]);
@@ -539,6 +557,7 @@
 	var delYnList = { "Y":"Yes", "N":"No" };
 	var siteCdList = gagajf.convertToArray([[${siteCdList}]]);
 	var selfBrandList = gagajf.convertToArray([[${selfBrandList}]]);
+	let channelName = gagajf.convertToArray([[${channelList}]]);
 
 	// ag-grid 입점업체분담율 컬럼
 	var columnDefs = [
@@ -650,16 +669,50 @@
 		{ headerName: "선착순쿠폰명" , field: "limitCpnNm" , width: 200, cellClass: 'text-center'
 			,cellEditorParams: { maxlength: 20}
 		} ,
-		{ headerName: "시작일시" , field: "downStdt" , width: 200, cellClass: 'text-center'
-			,cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		{ headerName: "시작일" , field: "downStDate" , width: 200, cellClass: 'text-center'
+			,cellEditor: 'datePicker'
+			,cellEditorParams: { maxlength: 10, required: true }
+		},
+		{ headerName: "시작시간" , field: "downStTime" , width: 200, cellClass: 'text-center'
+			,cellEditor: 'dateTimer'
+			,cellEditorParams: { maxlength: 8, required: true }
 		},
-		{ headerName: "종료일시"  , field: "downEddt" , width: 200 , cellClass: 'text-center'
-			,cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		{ headerName: "종료일"  , field: "downEdDate" , width: 200 , cellClass: 'text-center'
+			,cellEditor: 'datePicker'
+			,cellEditorParams: { maxlength: 10, required: true }
+		} ,
+		{ headerName: "종료시간"  , field: "downEdTime" , width: 200 , cellClass: 'text-center'
+			,cellEditor: 'dateTimer'
+			,cellEditorParams: { maxlength: 8, required: true }
+			,valueFormatter: function (params) {
+				params.value = params.value.replace(/[^0-9]/g, '');
+				params.value = params.value.substr(0,2)+':'+params.value.substr(2,2)+':59';
+				return params.value;
+			}
 		} ,
 		{ headerName: "다운로드가능수량"  , field: "downLimitQty" , width: 150 , cellClass: 'text-center'
 			,cellEditorParams: { maxlength: 4, validType: 'numeric'}
 		},
 		{ headerName: "선착순시퀀스", field: "limitCpnId", width: 150, cellClass: 'text-center'} 	//, hide: true
+		,{headerName: "시작일시", field: "downStDt", width: 150, cellClass: 'text-center',hide: true}
+		,{headerName: "종료일시", field: "downEdDt", width: 150, cellClass: 'text-center',hide: true}
+	];
+
+	let columnAfDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "제휴채널코드", field: "afLinkCd", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "제휴채널명", field: "afLinkNm", width: 180,
+			cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "상위제휴채널", field: "afChannel", width: 120, cellClass: 'text-center',
+			cellEditor: 'agRichSelectCellEditor',
+			cellEditorParams: { values: gagaAgGrid.extractValues(channelName) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(channelName, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(channelName, params.newValue); }
+		}
 	];
 
 	var inComGridOptions = gagaAgGrid.getGridOptions(columnDefs);
@@ -670,6 +723,10 @@
 	var excepGoodsGridOptions = gagaAgGrid.getGridOptions(excepGoodsColumnDefs);
 	var randomCouponGridOptions = gagaAgGrid.getGridOptions(randomCouponDefs);
 	var limitedTimeCpnGridOptions = gagaAgGrid.getGridOptions(limitedTimeCpnDefs);
+	// 제휴채널 그리드 설정
+	var afLinkOptions = gagaAgGrid.getGridOptions(columnAfDefs);
+	afLinkOptions.rowSelection = "multiple";
+	afLinkOptions.suppressRowClickSelection = true;
 
 	inComGridOptions.defaultColDef.editable = true;
 	inComGridOptions.rowSelection = "multiple";
@@ -712,9 +769,14 @@
 		limitedTimeCpnGridOptions.api.updateRowData({remove:gagaAgGrid.selectedRowData(limitedTimeCpnGridOptions)});
 	});
 
+	// 제휴채널 선택삭제 버튼 클릭시
+	$('#btnDeleteAf').on('click', function() {
+		afLinkOptions.api.updateRowData({remove:gagaAgGrid.selectedRowData(afLinkOptions)});
+	});
+
 	// 선착순 쿠폰 행추가
 	$('#btnAddLimitedTimeCpnRow').on('click', function() {
-		var data = { cpnId: 1 ,limitCpnNm: null, downStdt: null, downEddt: null, downLimitQty: null, limitCpnId: null  };
+		var data = { cpnId: 1 ,limitCpnNm: null, downStDate: _today, downStTime: '00:00:00', downEdDate: _today, downEdTime: '23:59:59', downLimitQty: null, limitCpnId: null  };
 		gagaAgGrid.addRowData(limitedTimeCpnGridOptions, data, "limitCpnNm");
 	});
 
@@ -754,16 +816,6 @@
 		var chkBox= document.getElementById('limitedTimeCpnYn').checked;
 
 		if(chkBox){	//true 체크가 되어있었는데 해제됐어 -> 탭을 숨겨
-			$("#CouponForm .limitedTimeCpnTab").hide();
-			$("#limitedTimeCpnYn").val("N");
-			$("#CouponForm #totPubLimitQty").val(0);
-			$("#CouponForm input[id=chkBoxTotPubQty]").prop("disabled", false);
-			$("#CouponForm input[id=totPubLimitQty]").prop("disabled", false);
-			$("#CouponForm input[id=chkNoLimitTotPubLimitQty]").parent("label").removeClass("checked");
-			$("#CouponForm input[id=chkNoLimitTotPubLimitQty]").attr('readonly', false);
-			$("#CouponForm input[id=chkNoLimitTotPubLimitQty]").prop('disabled', false);
-			$("#CouponForm input[id=chkNoLimitTotPubLimitQty]").parent().prop('disabled', false);
-		}else{	//false 체크가 안되어있었는데 체크됐어 -> 탭을 보여줘
 			$("#CouponForm .limitedTimeCpnTab").show();
 			$("#limitedTimeCpnYn").val("Y");
 			$("#CouponForm #totPubLimitQty").val(0);
@@ -773,6 +825,16 @@
 			$("#CouponForm input[id=chkNoLimitTotPubLimitQty]").attr('readonly', true);
 			$("#CouponForm input[id=chkNoLimitTotPubLimitQty]").prop('disabled', true);
 			$("#CouponForm input[id=chkNoLimitTotPubLimitQty]").parent().prop('disabled', true);
+		}else{	//false 체크가 안되어있었는데 체크됐어 -> 탭을 보여줘
+			$("#CouponForm .limitedTimeCpnTab").hide();
+			$("#limitedTimeCpnYn").val("N");
+			$("#CouponForm #totPubLimitQty").val(0);
+			$("#CouponForm input[id=chkBoxTotPubQty]").prop("disabled", false);
+			$("#CouponForm input[id=totPubLimitQty]").prop("disabled", false);
+			$("#CouponForm input[id=chkNoLimitTotPubLimitQty]").parent("label").removeClass("checked");
+			$("#CouponForm input[id=chkNoLimitTotPubLimitQty]").attr('readonly', false);
+			$("#CouponForm input[id=chkNoLimitTotPubLimitQty]").prop('disabled', false);
+			$("#CouponForm input[id=chkNoLimitTotPubLimitQty]").parent().prop('disabled', false);
 		}
 	});
 
@@ -885,7 +947,7 @@
 						,cpnNm : $('#CouponForm input[name=cpnNm]').val()
 						,cpnDesc : $('#CouponForm input[name=cpnDesc]').val()
 						,siteCd : $('#CouponForm select[name=siteCd]').val()
-						,afLinkCd : $('#CouponForm select[name=afLinkCd]').val()
+						// ,afLinkCd : $('#CouponForm select[name=afLinkCd]').val()
 						,cpnType : $('input:radio[name="rdoCpnType"]:checked').val()
 						,applyScope : $('input:radio[name="rdoApplyScope"]:checked').val()
 						,dcWay : $('input:radio[name="rdoDcWay"]:checked').val()
@@ -912,7 +974,7 @@
 						,buyStdt : $('#CouponForm input[name=buyStdt]').val()
 						,buyEddt : $('#CouponForm input[name=buyEddt]').val()
 						,newCustYn : $('#CouponForm select[name=newCustYn]').val()
-						,afChannel : $('#CouponForm select[name=afChannel]').val()
+						// ,afChannel : $('#CouponForm select[name=afChannel]').val()
 						,dcCdGb : $('input:radio[name="dcCdGb"]:checked').val()
 						,rdCpnNm : $('input[name="serialCpnNm"]').val()
 						,supplyCompList : gagaAgGrid.getAllRowData(supplyGridOptions)
@@ -925,10 +987,11 @@
 						,usableCustGradeArr : usableCustGradeArr
 						,payTypeArr : payTypeArr
 						,limitedTimeCpnList : gagaAgGrid.getAllRowData(limitedTimeCpnGridOptions)
+						,afChannelList : gagaAgGrid.getAllRowData(afLinkOptions)
 				};
 
 				var jsonData = JSON.stringify(data);
-
+console.log('jsonData::'+jsonData);
 				gagajf.ajaxJsonSubmit($('#CouponForm').prop('action'), jsonData, fnCouponSaveCollback);
 
 			}
@@ -1215,6 +1278,18 @@
 			$("#CouponForm input:radio[name='dcCdGb']:radio[value='G233_00']").prop('checked', true);		// 주문서 쿠폰이 아닐 경우 일반 쿠폰으로 설정
 		}
 
+		// 선착순 쿠폰 비노출
+		$("#CouponForm .limitedTimeCpnTab").hide();
+		$('#CouponForm input:checkbox[name=limitedTimeCpnYn]').prop('checked', false);
+		$("#limitedTimeCpnYn").val("N");
+		$("#CouponForm #totPubLimitQty").val(0);
+		$("#CouponForm input[id=chkBoxTotPubQty]").prop("disabled", false);
+		$("#CouponForm input[id=totPubLimitQty]").prop("disabled", false);
+		$("#CouponForm input[id=chkNoLimitTotPubLimitQty]").parent("label").removeClass("checked");
+		$("#CouponForm input[id=chkNoLimitTotPubLimitQty]").attr('readonly', false);
+		$("#CouponForm input[id=chkNoLimitTotPubLimitQty]").prop('disabled', false);
+		$("#CouponForm input[id=chkNoLimitTotPubLimitQty]").parent().prop('disabled', false);
+
 		$('#CouponForm #cpnType').val(radioValue);
 	});
 
@@ -1625,24 +1700,24 @@
 	});*/
 
 	// 제휴링크채널 수정 (제휴링크가 꼭필요한지 확인필요)
-	function fnChangeAfLinkCdList(){
-		var actionUrl = "/business/aflink/list" + '?' + $('#afChannel').serialize();
-		var tag = "";
-
-		$("#CouponForm #afLinkCd").children('option').remove();
-
-		gagajf.ajaxJsonSubmit(actionUrl, '', function(data) {
-			for (let i = 0; i < data.length; i++) {
-				if (data[i].useYn == 'Y') {
-					tag += '<option value="' + data[i].afLinkCd + '">[' + data[i].afLinkCd + '] ' + data[i].afLinkNm + '</option>';
-				}
-			}
-
-			$("#CouponForm #afLinkCd").append(tag);
-			$("#CouponForm #afLinkCd option:first").attr("selected" , "selected");
-
-		});
-	}
+	// function fnChangeAfLinkCdList(){
+	// 	var actionUrl = "/business/aflink/list" + '?' + $('#afChannel').serialize();
+	// 	var tag = "";
+	//
+	// 	$("#CouponForm #afLinkCd").children('option').remove();
+	//
+	// 	gagajf.ajaxJsonSubmit(actionUrl, '', function(data) {
+	// 		for (let i = 0; i < data.length; i++) {
+	// 			if (data[i].useYn == 'Y') {
+	// 				tag += '<option value="' + data[i].afLinkCd + '">[' + data[i].afLinkCd + '] ' + data[i].afLinkNm + '</option>';
+	// 			}
+	// 		}
+	//
+	// 		$("#CouponForm #afLinkCd").append(tag);
+	// 		$("#CouponForm #afLinkCd option:first").attr("selected" , "selected");
+	//
+	// 	});
+	// }
 
 	// 발급받은회원 팝업
 	var fnPubCustListPopUp = function (){
@@ -1782,6 +1857,7 @@
 		gagaAgGrid.createGrid('excepGoodsGridList', excepGoodsGridOptions);
 		gagaAgGrid.createGrid('randomCpnList', randomCouponGridOptions);
 		gagaAgGrid.createGrid('limitedTimeCpnList', limitedTimeCpnGridOptions);
+		gagaAgGrid.createGrid('afChannelList', afLinkOptions );
 
 		// 일단 버튼 숨김
 		$(".couponButton").hide();
@@ -1818,16 +1894,19 @@
 			}
 			$("#btnCouponSave").show();	// 저장버튼
 			$("#CouponForm .buttonSpan").show();
+
 		} else {
 			if(cpnDetail.cpnStat == "G232_10"){
 				$("#btnCouponSave").show();		// 저장버튼
-				$("#btnChangeStatIng").show();		// 진행버튼
+				$("#btnChangeStatIng").show();	// 진행버튼
 				$("#btnCouponDelete").show();	// 삭제버튼
+				$("#btnCouponEnd").show();		// 종료버튼
 				$("#CouponForm .buttonSpan").show();	//행추가,삭제버튼
-			}else if(cpnDetail.cpnStat == "G232_10"){
+			}else if(cpnDetail.cpnStat == "G232_11"){
 				$("#btnCouponSave").hide();		// 저장버튼
 				$("#btnCouponStop").show();		// 중지버튼
 				$("#btnCouponDelete").show();	// 삭제버튼
+				$("#btnCouponEnd").show();		// 종료버튼
 				$("#CouponForm .buttonSpan").hide();	//행추가,삭제버튼
 			}else{
 				$("#CouponForm .buttonSpan").hide();	//행추가,삭제버튼
@@ -1884,6 +1963,7 @@
 			cateGridOptions.api.setRowData(cpnDtlRefvalCateList);
 			randomCouponGridOptions.api.setRowData(randomCpnList);
 			limitedTimeCpnGridOptions.api.setRowData(limitedTimeCpnList);
+			afLinkOptions.api.setRowData(afChannelList);
 			// 기본정보 세팅
 			$("#CouponForm input:radio[name='rdoDcWay']:radio[value=" + cpnDetail.dcWay + "]").prop('checked', true);
 			$("#CouponForm input:radio[name='rdoCpnType']:radio[value=" + cpnDetail.cpnType + "]").prop('checked', true);
@@ -2149,7 +2229,7 @@
 		pdGbChange();
 		firstOrdYnChange();
 		newCustYnChange();
-		fnChangeAfLinkCdList();
+		// fnChangeAfLinkCdList();
 
 		// 제휴채널2뎁스 기본세팅
 		if(cpnDetail != null ) {
@@ -2263,6 +2343,46 @@
 		});
 	});
 
+	// 종료 버튼 클릭
+	$("#btnCouponEnd").on("click", function() {
+		mcxDialog.confirmC("쿠폰을 종료하시겠습니까?<br/>종료한 프로모션은 복원하실 수 없습니다.", {
+			btn: ["아니오","예"],
+			btnClick: function(index) {
+				if(index == 2) {
+					let data = { cpnStat: "G232_13"			// 종료
+						, cpnId : $('#CouponForm input[name=cpnId]').val()
+					}
+					var jsonData = JSON.stringify(data);
+					gagajf.ajaxJsonSubmit('/marketing/coupon/changeStat', jsonData, fnCouponSaveCollback);
+				}
+			}
+		});
+	});
+
+	// 제휴채널 추가
+	$('#btnAddAf').on('click' , function () {
+		cfnOpenAfChannelPopup("callBackAf");
+	});
+
+	// 제휴채널 콜백
+	var callBackAf = function(result) {
+		// 기존 리스트 데이터 for
+		for(let i = 0 ; i < result.length ; i++) {
+			let addChk = true, gridListValue = gagaAgGrid.getAllRowData(afLinkOptions);		// 받아온 모든 데이터
+
+			// 받아온 data for
+			for(let j = 0 ; j < gridListValue.length ; j++) {
+				// 동일한 data는 추가하지 않음
+				if(gridListValue[j].afLinkCd == result[i].afLinkCd) {	addChk = false;	}		// 중복체크
+			}
+
+			// 중복되지 않은 데이터 리스트에 추가
+			if(addChk) {
+				gagaAgGrid.addRowData(afLinkOptions, {"afLinkCd":result[i].afLinkCd , "afLinkNm":result[i].afLinkNm, "afChannel":result[i].afChannel});
+			}
+		}
+	}
+
 	/*]]>*/
 </script>
 </html>

+ 194 - 0
src/main/webapp/WEB-INF/views/marketing/ReviewDetailForm.html

@@ -0,0 +1,194 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : ReviewDetailForm.html
+ * @desc    : 리뷰 상세 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.22   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1200" id="popupReviewDetail">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong>리뷰 상세</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupReviewDetail');"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+		
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<form id="reviewDetailForm" name="reviewDetailForm" action="#" th:action="@{'/marketing/review/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>
+			</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'))
+			return false;
+		
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxFormSubmit($('#reviewDetailForm').prop('action'), '#reviewDetailForm', function() {
+					uifnPopupClose('popupOneToOneQnaDetail');
+					$('#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'));
+	});
+/*]]>*/
+</script>
+
+</html>

+ 3 - 1
src/main/webapp/dx5/dextuploadx5-configuration.js

@@ -8,9 +8,11 @@
 
     var gAuthkey = '';
     if (location.host.indexOf("ld") > -1) {
-    	gAuthkey = "gx9EHEhXzTpbdxWjty/oHh9cfVi5WA5X4BV71AHaC/ORN/1fcs8nTTd4oUUvC5WhHqEa6Wt8cfmCBJ9w/pJpRhDd+tVu6kPDt9bxZL9n0bvaUn2rrbmJMA+HC9gzahwdEOcjr6ZOmNSEd6N0xN2BDBk55hvfPw02R77XjVuZrQU=";
+    	gAuthkey = "mEK6nvLPFD5zKL86wQPUBBiHLkMa+iogrAHH9wKqeuaQeGLfPv/PaOWtHXhN1OPqRfgtiaDYGj3Jetiewo186YA3aFqU3vK3UuNKGxJ8H8t34Hb0Ue4450xEJQK4awZqSFaR7HOPdxeWhSQ8oKhwgdZNZuolo4737WdsJZGq93Y= ";
     } else if (location.host.indexOf("lp") > -1) {
     	gAuthkey = "gx9EHEhXzTpbdxWjty/oHh9cfVi5WA5X4BV71AHaC/ORN/1fcs8nTTd4oUUvC5WhHqEa6Wt8cfmCBJ9w/pJpRhDd+tVu6kPDt9bxZL9n0bvaUn2rrbmJMA+HC9gzahwdEOcjr6ZOmNSEd6N0xN2BDBk55hvfPw02R77XjVuZrQU=";
+    } else if (location.host.indexOf("td") > -1) {
+    	gAuthkey = "pUlapJyQFZ3dQWegfjlLq1R/NLIOnSf7QBFpipc9XudSc/RafzVJ5GjAXELTmraWMSep2M2lv8ELx51g8QX7bmwyIR+xARQ5wIk/lpfzkYRALBXMIi2XHbxJjl4XCVkVwWa7HkSI02CGezyoCxN7HhDiGOGIKF+rq0aTkmRC2kg=";
     } else if (location.host.indexOf("dev") > -1) {
     	gAuthkey = "gx9EHEhXzTpbdxWjty/oHh9cfVi5WA5X4BV71AHaC/ORN/1fcs8nTTd4oUUvC5WhHqEa6Wt8cfmCBJ9w/pJpRhDd+tVu6kPDt9bxZL9n0bvaUn2rrbmJMA+HC9gzahwdEOcjr6ZOmNSEd6N0xN2BDBk55hvfPw02R77XjVuZrQU=";
     } else if (location.host.indexOf("qas") > -1) {

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


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


+ 23 - 0
src/main/webapp/ux/css/admin.ui.css

@@ -878,6 +878,29 @@ table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
 #pictureOffset .pos{position:absolute;width:0px;height:0px;}
 #pictureOffset .pos i{overflow:hidden;position:absolute;left:0;top:0;transform:translate(-50%,-50%);width:40px;height:40px;line-height:1;color:#fff;font-size:20px;text-align:center;background-color:#fd4802;border-radius:100%;box-sizing:border-box;padding-top:10px;}
 
+/* 고객 리뷰 */ /* 210420 */
+.reviewWrap{padding:10px 20px;}
+.reviewWrap .user_review .star_score {overflow: hidden;display:inline-block;position:relative;width:95px;height:14px;}
+.reviewWrap .user_review .star_score .star {position:absolute; top:0; width:100%; height:100%; background:#ccc;}
+.reviewWrap .user_review .star_score .star::after {content:''; position:absolute;top:0;left:0;z-index:2;width:100%; height:100%; background:url('../../image/star_empty.png') no-repeat 0 0; background-size:100% 100%; image-rendering:pixelated;}
+.reviewWrap .user_review .star_score .star .progbar {position:absolute;top:0;left:0;height:100%;background:#fd4802;}
+.reviewWrap .user_review .star_score .score {color:#222; font-size:16px; font-weight:200; line-height:1;}
+.reviewWrap .user_review .star_score .score em {font-weight:500;}
+.reviewWrap .user_review dl{padding-bottom:20px;}
+.reviewWrap .user_review dl::after{content:'';display:block;clear:both;}
+.reviewWrap .user_review dl dt{float:left;color:#888;}
+.reviewWrap .user_review dl dd{float:left;margin:0 50px 0 15px; color: #fd4802;}
+.reviewWrap .user_review dl .pic{float:left;position:relative; width:103px;height:103px;margin-right:10px;}
+.reviewWrap .user_review dl .pic:last-child{margin-right:0;}
+.reviewWrap .user_review dl .pic i{display:block;position:relative;padding-top:100%;height:0;background-repeat:no-repeat;background-position:50% 50%;background-size:cover;text-indent:-9999px;}
+.reviewWrap .user_review dl .pic.mov::after {content:'';position: absolute;left: 0;top: 0;z-index: 2;width: 100%;height: 100%;background: rgba(0,0,0,0.3) url('../../image/ico_play.png') no-repeat 50% 50%;}
+.reviewWrap .user_review .rvTxt{overflow-y:auto;margin-bottom:35px;line-height:2;word-break:keep-all;background-color:#fcfcfc;}
+.reviewWrap .user_review .date{float:right;}
+.reviewWrap .user_review .date dl{padding-bottom:unset}
+.reviewWrap .user_review .date dd{color:unset;margin-right:unset;}
+.reviewWrap .admDate{font-weight:normal;color:#777}
+
+
 
 /* 반응형:GNB 유저명,등급,로그아웃 --------------- */
 @media ( max-width:1370px ) {

Некоторые файлы не были показаны из-за большого количества измененных файлов