Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/develop' into xodud1202

xodud1202 5 gadi atpakaļ
vecāks
revīzija
26c7e3cfdc
27 mainītis faili ar 1411 papildinājumiem un 482 dzēšanām
  1. 9 0
      src/main/java/com/style24/front/biz/dao/TsfCounselDao.java
  2. 0 20
      src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java
  3. 24 0
      src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java
  4. 11 0
      src/main/java/com/style24/front/biz/service/TsfCounselService.java
  5. 1 18
      src/main/java/com/style24/front/biz/service/TsfGoodsService.java
  6. 27 0
      src/main/java/com/style24/front/biz/service/TsfPlanningService.java
  7. 1 0
      src/main/java/com/style24/front/biz/web/TsfCallcenterController.java
  8. 96 4
      src/main/java/com/style24/front/biz/web/TsfGoodsController.java
  9. 41 0
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  10. 9 1
      src/main/java/com/style24/persistence/domain/Counsel.java
  11. 0 37
      src/main/java/com/style24/persistence/domain/Lookbook.java
  12. 0 22
      src/main/java/com/style24/persistence/domain/LookbookGoods.java
  13. 292 0
      src/main/java/com/style24/persistence/domain/Plan.java
  14. 59 2
      src/main/java/com/style24/persistence/mybatis/shop/TsfCounsel.xml
  15. 10 9
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  16. 30 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  17. 1 1
      src/main/webapp/WEB-INF/views/web/callcenter/FaqFormWeb.html
  18. 2 2
      src/main/webapp/WEB-INF/views/web/callcenter/GoodsQnaFormWeb.html
  19. 1 1
      src/main/webapp/WEB-INF/views/web/callcenter/NoticeFormWeb.html
  20. 1 1
      src/main/webapp/WEB-INF/views/web/callcenter/OneToOneQnaFormWeb.html
  21. 1 1
      src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html
  22. 1 1
      src/main/webapp/WEB-INF/views/web/goods/CardPrmtFormWeb.html
  23. 36 319
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html
  24. 122 0
      src/main/webapp/WEB-INF/views/web/goods/GoodsQnaDetailFormWeb.html
  25. 166 0
      src/main/webapp/WEB-INF/views/web/goods/GoodsQnaFormWeb.html
  26. 337 0
      src/main/webapp/WEB-INF/views/web/planning/PlanningMainFormWeb.html
  27. 133 43
      src/main/webapp/ux/style24_link.js

+ 9 - 0
src/main/java/com/style24/front/biz/dao/TsfCounselDao.java

@@ -119,6 +119,15 @@ public interface TsfCounselDao {
 	 * @since 2020. 12. 28
 	 */
 	Collection<Counsel> getGoodsQnaList(Counsel counsel);
+	
+	/**
+	 * 상품문의 목록 - 상품상세용
+	 * @param counsel -상담정보
+	 * @return
+	 * @author eskim
+	 * @since 2021. 03. 05
+	 */
+	Collection<Counsel> getGoodsQnaListForGoods(Counsel counsel);
 
 	/**
 	 * 상품문의 삭제

+ 0 - 20
src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java

@@ -12,8 +12,6 @@ import com.style24.persistence.domain.GoodsImg;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsStock;
 import com.style24.persistence.domain.GoodsViewHst;
-import com.style24.persistence.domain.Lookbook;
-import com.style24.persistence.domain.LookbookGoods;
 import com.style24.persistence.domain.VideoDisploc;
 
 /**
@@ -173,25 +171,7 @@ public interface TsfGoodsDao {
 	 */
 	Goods getGoodsResSell(Goods goods);
 	
-	/**
-	 * 룩북 베너 목록
-	 *
-	 * @param lookbook
-	 * @return
-	 * @author eskim
-	 * @date 2021. 2. 18
-	 */
-	Collection<Lookbook> getLookbookBannerList(Lookbook lookbook);
 	
-	/**
-	 * 룩북 베너별 상품 목록
-	 *
-	 * @param lookbook
-	 * @return
-	 * @author eskim
-	 * @date 2021. 2. 18
-	 */
-	Collection<LookbookGoods> getLookbookBannerGoodsList(Lookbook lookbook);
 
 	/**
 	 * 상품 사이즈 선택 시 재고수량 가져오기

+ 24 - 0
src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java

@@ -1,6 +1,10 @@
 package com.style24.front.biz.dao;
 
+import java.util.Collection;
+
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Cate4Srch;
+import com.style24.persistence.domain.Plan;
 
 /**
  * 기획전 Dao
@@ -10,5 +14,25 @@ import com.style24.core.support.annotation.ShopDs;
  */
 @ShopDs
 public interface TsfPlanningDao {
+	
+	/**
+	 * 기획전 카테고리 1deth 조회
+	 * 
+	 * @param Cate4Srch
+	 * @return Collection<Cate4Srch>
+	 * @author sowon
+	 * @since 2021.03.05
+	 */
+	Collection<Cate4Srch> getPlanCate1(Cate4Srch Cate);
+	
+	/**
+	 * 기획전 갯수 조회
+	 * 
+	 * @param Plan
+	 * @return int
+	 * @author sowon
+	 * @since 2021.03.05
+	 */
+	int getPlanAllCount(Plan plan);
 
 }

+ 11 - 0
src/main/java/com/style24/front/biz/service/TsfCounselService.java

@@ -193,6 +193,17 @@ public class TsfCounselService {
 		return counselDao.getGoodsQnaList(counsel);
 	}
 
+	/**
+	 * 상품문의 목록 - 상품상세용
+	 * @param counsel -상담정보
+	 * @return
+	 * @author eskim
+	 * @since 2021. 03. 05
+	 */
+	public Collection<Counsel> getGoodsQnaListForGoods(Counsel counsel) {
+		return counselDao.getGoodsQnaListForGoods(counsel);
+	}
+	
 	/**
 	 * 상품문의 삭제
 	 * @param counsel - 상담정보

+ 1 - 18
src/main/java/com/style24/front/biz/service/TsfGoodsService.java

@@ -19,7 +19,6 @@ import com.style24.persistence.domain.GoodsImg;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsStock;
 import com.style24.persistence.domain.GoodsViewHst;
-import com.style24.persistence.domain.Lookbook;
 import com.style24.persistence.domain.VideoDisploc;
 
 import lombok.extern.slf4j.Slf4j;
@@ -364,23 +363,7 @@ public class TsfGoodsService {
 		return resultGoods;
 	}
 
-	/**
-	 * 룩북
-	 *
-	 * @param lookbook
-	 * @return
-	 * @author eskim
-	 * @since 2021. 2. 18
-	 */
-	public Collection<Lookbook> getLookbookList(Lookbook lookbook) {
-		Collection<Lookbook> lookbookBannerList = goodsDao.getLookbookBannerList(lookbook);
-		
-		for (Lookbook tempLookbook : lookbookBannerList) {
-			tempLookbook.setLookbookGoodsList(goodsDao.getLookbookBannerGoodsList(tempLookbook));
-		}
-		
-		return lookbookBannerList;
-	}
+	
 
 	/**
 	 * 상품 사이즈 선택 시 재고수량 가져오기

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

@@ -1,9 +1,14 @@
 package com.style24.front.biz.service;
 
+import java.util.Collection;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.style24.front.biz.dao.TsfPlanningDao;
+import com.style24.persistence.domain.Cate4Srch;
+import com.style24.persistence.domain.Plan;
+import com.style24.persistence.domain.Point;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -19,5 +24,27 @@ public class TsfPlanningService {
 
 	@Autowired
 	private TsfPlanningDao planningDao;
+	
+	/**
+	 * 기획전 카테고리 1deth 조회
+	 *
+	 * @param Cate4Srch
+	 * @author sowon
+	 * @since 2021. 03. 05
+	 */	
+	public Collection<Cate4Srch> getPlanCate1(Cate4Srch cate) {
+		return planningDao.getPlanCate1(cate);
+	}
+	
+	/**
+	 * 기획전 갯수 조회
+	 * 
+	 * @param Plan
+	 * @author sowon
+	 * @since 2021.03.05
+	 */
+	public int getPlanAllCount(Plan plan) {
+		return planningDao.getPlanAllCount(plan);
+	}
 
 }

+ 1 - 0
src/main/java/com/style24/front/biz/web/TsfCallcenterController.java

@@ -316,6 +316,7 @@ public class TsfCallcenterController extends TsfBaseController {
 	@PostMapping("/goods/qna/create")
 	@ResponseBody
 	public GagaResponse createGoodsQna(@RequestBody Counsel counsel) {
+		log.info("createGoodsQna counsel = {}", counsel);
 		counselService.createGoodsQna(counsel);
 		return super.ok(message.getMessage("SUCC_0001"));
 	}

+ 96 - 4
src/main/java/com/style24/front/biz/web/TsfGoodsController.java

@@ -5,25 +5,32 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.style24.core.biz.service.TscEnvsetService;
+import com.style24.core.biz.service.TscLookbookService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.front.biz.service.TsfCounselService;
 import com.style24.front.biz.service.TsfGoodsService;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.env.TsfConstants;
 import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.CardPromotion;
+import com.style24.persistence.domain.Counsel;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsStock;
 import com.style24.persistence.domain.Lookbook;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.util.GagaCookieUtil;
 
 /**
@@ -45,7 +52,13 @@ public class TsfGoodsController extends TsfBaseController {
 
 	@Autowired
 	private TscEnvsetService envsetService;
-
+	
+	@Autowired
+	private TsfCounselService counselService;
+	
+	@Autowired
+	private TscLookbookService coreLookbookService;
+	
 	@Value("${has-ssl}")
 	private String hasSsl;
 
@@ -143,6 +156,13 @@ public class TsfGoodsController extends TsfBaseController {
 			// 상품쿠폰
 //			mav.addObject("goodsCouponList", goodsService.getGoodsCouponList(paramsGoods));
 		}
+		
+		// 상품 문의건수
+		Counsel counsel = new Counsel();
+		counsel.setRelGoodsCd(goods.getGoodsCd());
+		counsel.setSiteCd(TscConstants.Site.STYLE24.value());
+		int goodsQnaCnt = counselService.getGoodsQnaTotalCount(counsel);
+		mav.addObject("goodsQnaCnt", goodsQnaCnt);
 //
 //		// 상품포인트사용방법
 //		mav.addObject("goodsPointMothod", envsetService.getPointMothod(TscConstants.Site.STYLE24.value())); // A:정액, R:정율
@@ -166,7 +186,7 @@ public class TsfGoodsController extends TsfBaseController {
 		// 룩북
 		Lookbook lookbook = new Lookbook();
 		lookbook.setGoodsCd(paramsGoods.getGoodsCd());
-		mav.addObject("lookbookList", goodsService.getLookbookList(lookbook));
+		mav.addObject("lookbookList", coreLookbookService.getLookbookListForGoods(lookbook));
 		// 오늘본 상품 쿠키 담기
 		// SSL Server
 		boolean isSslServer = Boolean.parseBoolean(hasSsl);
@@ -206,6 +226,7 @@ public class TsfGoodsController extends TsfBaseController {
 		goods.setFrontGb(TsfSession.getFrontGb());
 		goods.setIsApp(TsfSession.getAttribute("isApp"));	//앱여부 true
 		goods.setSiteCd(TscConstants.Site.STYLE24.value());
+		goods.setAfLinkCd(TsfSession.getAttribute("afLinkCd"));
 //		goods.setSoldoutGoodsDisplayYn(envsetService.getSoldoutGoodsDisplayYn(TscConstants.Site.STYLE24.value())); // 품절상품노출여부
 //		goods.setPointUnit(envsetService.getPointUnit(TscConstants.Site.STYLE24.value())); // 10:원단위절사(int)
 //		goods.setFloorUnit(envsetService.getPointUnit(TscConstants.Site.STYLE24.value()));
@@ -215,9 +236,9 @@ public class TsfGoodsController extends TsfBaseController {
 			goods.setCustNo(TsfSession.getInfo().getCustNo());
 			goods.setCustGrade(TsfSession.getInfo().getCustGrade());
 		} else {
-			goods.setCustGb("00");
+			goods.setCustGb("G100_00");
 			goods.setCustNo(0);
-			goods.setCustGrade("00");
+			goods.setCustGrade("00"); //?  확인해보자
 		}
 	}
 
@@ -297,4 +318,75 @@ public class TsfGoodsController extends TsfBaseController {
 		stockQty = goodsService.getGoodsStockQty(goodsStock);
 		return stockQty;
 	}
+	
+	
+	
+	/**
+	 * 상품상세 -  상품 QNA LIST 레이어
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 5
+	 */
+	@PostMapping("/qna/layer/{goodsCd}")
+	public ModelAndView goodsQnaForm(@PathVariable String goodsCd) {
+		ModelAndView mav = new ModelAndView();
+		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
+		Goods paramsGoods = new Goods();
+		paramsGoods.setGoodsCd(goodsCd);
+		setGoods(paramsGoods);
+		Goods goods = goodsService.getGoodsInfo(paramsGoods);
+		// 상품 기본정보
+		mav.addObject("goodsInfo", goods);
+
+		mav.setViewName(super.getDeviceViewName("goods/GoodsQnaForm"));
+		return mav;
+	}
+	
+	
+	/**
+	 * 상품문의 목록
+	 * @param counsel - 상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 28
+	 */
+	@PostMapping("/qna/list")
+	@ResponseBody
+	public GagaMap getGoodsQnaList(@RequestBody Counsel counsel) {
+
+		log.info(" getGoodsQnaList =>{}", counsel);
+		counsel.setSiteCd(TscConstants.Site.STYLE24.value());
+
+		GagaMap result = new GagaMap();
+
+		TscPageRequest pageable = new TscPageRequest((counsel.getPageNo() > 0 ? counsel.getPageNo() - 1 : 0), counsel.getPageSize(), counsel.getPageUnit());
+		pageable.setTotalCount(counselService.getGoodsQnaTotalCount(counsel));
+		counsel.setPageable(pageable);
+
+		if(TsfSession.isLogin()) {
+			counsel.setCustNo(TsfSession.getInfo().getCustNo());
+		}
+		
+		result.set("paging", counsel);
+		result.set("dataList", counselService.getGoodsQnaListForGoods(counsel));
+
+		return result;
+	}
+	
+	/**
+	 * 상품상세 -  상품 QNA 등록
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 5
+	 */
+	@PostMapping("/qna/create/layer/{goodsCd}")
+	public ModelAndView qnaCreateForm(@PathVariable String goodsCd) {
+		ModelAndView mav = new ModelAndView();
+		mav.addObject("goodsCd", goodsCd);
+		mav.setViewName(super.getDeviceViewName("goods/GoodsQnaDetailForm"));
+		return mav;
+	}
+	
+	
+	
 }

+ 41 - 0
src/main/java/com/style24/front/biz/web/TsfPlanningController.java

@@ -1,12 +1,23 @@
 package com.style24.front.biz.web;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.ModelAndView;
 
+import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.front.biz.service.TsfPlanningService;
 import com.style24.front.support.controller.TsfBaseController;
+import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.domain.Cate4Srch;
+import com.style24.persistence.domain.Customer;
+import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.Plan;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -26,5 +37,35 @@ public class TsfPlanningController extends TsfBaseController {
 
 	@Autowired
 	private TsfPlanningService planningService;
+	
+	/**
+	 * 기획전 메인 화면
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 5
+	 */
+	@GetMapping("/main/form")
+	public ModelAndView PlanningMainForm(Plan plan) throws Exception {
+		ModelAndView mav = new ModelAndView();
+		Cate4Srch cate = new Cate4Srch();
+		// 카테고리 
+		mav.addObject("categoryList", planningService.getPlanCate1(cate));
+		mav.addObject("cateNo", plan.getCateNo());
+		
+		// 각 가테고리 기획전 갯수
+		mav.addObject("planCount",planningService.getPlanAllCount(plan));
+		
+		if (plan.getCateNo() != null) {
+			cate.setCate1No(plan.getCateNo());
+			mav.addObject("cateNm", planningService.getPlanCate1(cate).iterator().next().getCate1Nm());
+			
+		}
+		
+		
+		mav.setViewName(super.getDeviceViewName("planning/PlanningMainForm"));
+		return mav;
+	}
+
 
 }

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

@@ -47,12 +47,19 @@ public class Counsel extends TscBaseDomain {
 	private String ansDt;			// 답변일자
 	private String secretYn;		// 비밀글여부(상품문의에서만 사용)
 	private String delYn;			// 삭제여부
+	private int selfGb;				// 내문의 1: , 그외 0
 
 	// 1:1문의(총, 답변완료, 처리중) 건수
 	private int totCnt;		// 총건수
 	private int ansCnt;		// 답변완료건수
 	private int ingCnt;		// 처리중건수
 
+	
+	// Masking
+	//public String getMaskingCustId() {
+		//return MaskingUtils.id(this.custId);
+	//}
+		
 	// Pagination
 	@JsonInclude(JsonInclude.Include.NON_EMPTY)
 	private TscPageRequest pageable;
@@ -60,5 +67,6 @@ public class Counsel extends TscBaseDomain {
 	private int pageNo = 1;
 	private int pageSize = 10;
 	private int pageUnit = 10;
-
+	
+	
 }

+ 0 - 37
src/main/java/com/style24/persistence/domain/Lookbook.java

@@ -1,37 +0,0 @@
-package com.style24.persistence.domain;
-
-import java.util.Collection;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 룩북 Domain
- *
- * @author eskim
- * @since 2021. 02. 18
- */
-@SuppressWarnings("serial")
-@Data
-public class Lookbook extends TscBaseDomain {
-
-	private Integer lookbookSq;		// 룩북일련번호
-	private String brandCd;			// 브랜드코드(브랜드)
-	private String title;			// 제목
-	private String dispStdt;		// 노출시작일시
-	private String dispEddt;		// 노출종료일시
-	private String dispYn;			// 표시여부
-	private int dispOrd;			// 표시순서
-
-	private Integer lookbookbSq;	// 룩북배너일련번호
-	private String orgFileNm;		// 원본파일명
-	private String sysFileNm;		// 시스템파일명
-
-	Collection<LookbookGoods> lookbookGoodsList;	//베너별 상품목록
-	
-	private String goodsCd; 		// 상품상세검색용
-	private String frontGb; 		// 상품상세검색용
-	private String custGb; 			// 상품상세검색용
-
-}

+ 0 - 22
src/main/java/com/style24/persistence/domain/LookbookGoods.java

@@ -1,22 +0,0 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 룩북 베너별 상품 Domain
- *
- * @author eskim
- * @since 2021. 02. 18
- */
-@SuppressWarnings("serial")
-@Data
-public class LookbookGoods extends TscBaseDomain {
-
-	private Integer lookbookbSq;	// 룩북배너일련번호
-	private String goodsCd;			// 상품코드
-	private String delYn;			// 삭제여부
-	private int dispOrd;			// 표시순서
-
-}

+ 292 - 0
src/main/java/com/style24/persistence/domain/Plan.java

@@ -0,0 +1,292 @@
+package com.style24.persistence.domain;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+import com.style24.persistence.TscPageRequest;
+
+import lombok.Data;
+
+/**
+ * 기획전 Domain
+ *
+ * @author sowon
+ * @since 2021. 02. 04
+ */
+
+@SuppressWarnings("serial")
+@Data
+public class Plan extends TscBaseDomain{
+	// 기획전
+		private Integer planSq;				//기획전일련번호(SeqPlan sequence)
+		private String planNm;				//기획전명
+		private String planGb;				//기획전구분(P:기획전private String  E:이벤트)
+		private String custGb;				//고객구분
+		private String custGrade;			//회원등급
+		private String planSnm;				//검색어
+		private String templateType;		//템플릿유형(H:Htmlprivate String  T:텍스트)
+		private String siteCd;				//사이트코드(공통코드g000)
+		private String frontGb;				//프론트구분(A:All, P:웹, M:모바일)
+		private String dispStdt;			//기획전 시작일시
+		private String dispEddt;			//기획전 종료일시
+		private String mainPimg;			//메인이미지(Pc)
+		private String mainMimg;			//메인이미지(모바일)
+		private String dtlPimg;				//상세이미지(Pc)
+		private String dtlMimg;				//상세이미지(모바일)
+		private String orgMainPimg;			//원본메인이미지(Pc)
+		private String orgMainMimg;			//원본메인이미지(모바일)
+		private String orgDtlPimg;			//원본상세이미지(Pc)
+		private String orgDtlMimg;			//원본상세이미지(모바일)
+		private String orgMainPimgDelYn;	//원본메인이미지(Pc) 삭제여부
+		private String orgMainMimgDelYn;	//원본메인이미지(모바일) 삭제여부
+		private String orgDtlPimgDelYn;		//원본상세이미지(Pc) 삭제여부
+		private String orgDtlMimgDelYn;		//원본상세이미지(모바일) 삭제여부
+		private String dtlTitle1;			//상세제목1
+		private String dtlTitle2;			//상세제목2
+		private String cateCd;				//카테고리코드(대/중/소/세카테고리)
+		private String cateDispYn;			//카테고리전시여부(Y:전시)
+		private String replyYn;				//댓글여부(Y:댓글)
+		private String replyLoc;			//댓글위치(U:상품리스트상단 D:상품리스트하단)
+		private String replyImg;			//댓글이미지
+		private String orgReplyImg;			//원본댓글이미지
+		private String replyTitle1;			//댓글제목1
+		private String replyTitle2;			//댓글제목2
+		private String devUrl;				//호출 URL
+		private String orgReplyImgDelYn;	//원본댓글이미지 삭제여부
+		private String cornerNmDispYn;		//코너명노출여부(Y:노출)
+		private String goodsLimitYn;		//상품등록제한여부(Y:상품등록제한)
+		private String goodsLimitQty;		//상품등록제한수(상품등록제한여부가 "Y"일 떄)
+		private String delYn;				//삭제여부(Y:삭제)
+		private String openYn;				//오픈여부(Y:오픈)
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private long[] dispOrdArr;			// 표시순서 배열
+		private long dispOrd;				//표시순서
+		private long readCnt;				//조회수
+		private Integer pollSq;				//투표일련번호
+		private String badgeNm;				//뱃지이름
+		private String badgeFcolor;			//뱃지글자컬러
+		private String badgeBcolor;			//뱃지배경컬러
+		private String privacyPolicy;		//개인정보수집동의정책
+
+		// 기획전 소스
+		private Integer seq;					//일련번호
+		private String fsrcPc;				//프론트소스(pc)	/ 화면용
+		private String fsrcMob;			//프론트소스(모바일)	/ 화면용
+		private String locGb;			//위치구분(T:상단 / B:하단)
+
+		// 기획전 상세
+		private Integer planDtlSq;				//기획전상세일련번호(SEQ_PLAN_DTL sequence)
+		private Integer copyPlanDtlSq;			//복사할 상세 일련번호
+		private Integer copyPlanSq;			//복사할 일련번호
+		private String copyMode;			//복사 선택(CORNER:코너복사, PLAN:기획전복사)
+		private String cornerDispType;		//코너노출유형(공통코드G045) (2:2컷 , 3:3컷, 4:4컷)
+		private String cornerNm;			//코너 명
+		private String planDtlStat;			//기획전상세상태(공통코드G044)
+		private String copyBrandCd;	        //복사할 브랜드코드
+		private String adminPreview;	// 어드민미리보기 여부 (Y:미리보기)
+		// 기획전 브랜드
+		private String brandGroupNo;	//기획전브랜드그룹번호
+		private String DispYn;      	//표시여부           
+		private String brandGroupKnm; 	// 브랜드 그룹명(한글)
+		private String brandGroupEnm; 	// 브랜드 그룹명(영어)
+		/* Multi CheckBox 항목*/
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiBrand;
+		private String[] multiCate;
+		
+		// 코너
+		private String cateGb;		// 카테고리구분
+		private String cateNm;		// 카테고리명
+		private Integer cateNo;		// 카테고리번호
+		
+		// 기획전 응모
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] planQtitle;
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] attachYn;
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] planAnswerSq;
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] answer;
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] sysFileNm;
+
+		//private Collection<TsaPlanQuestAnswer> planQuestAnswerList; // 고시항목
+
+		// 검색
+		private String startSearchDate;		// 진행기간 시작일
+		private String startSearchTime;		// 진행기간 시작시간
+		private String endSearchDate;		// 진행기간 종료일
+		private String endSearchTime;		// 진행기간 종료시간
+		private String excelFileNm;			// 엑셀 파일 명
+		//private int startRow;				// 페이징 시작
+		//private int endRow;					// 피이징 종료
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] siteCds;			// 사이트
+
+		// 코너 상품
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] goodsCdArr;		// 상품 코드 배열
+		private String goodsCd;				// 상품 코드
+		private String goodsNm;				// 상품 명
+		private String goodsStat;			// 제품상태
+		private String imgType;				// 이미지 타입
+		private String imgPath1;			// 이미지 경로1
+		private String imgPath2;			// 이미지 경로2
+		private String imgPath4;			// 이미지 경로4
+		private String imgPath5;			// 이미지 경로5
+		private String imgPath6;			// 이미지 경로6
+		private String dcRate;				// 할인율
+		private String listPrice;			// 최소 소비자가
+		private String tagPrice;			// tag 가
+		private String currPrice;			// 판매가
+		private String supplyCompCd;		// 업체코드
+		private String supplyCompNm;		// 업체명
+		private String formalGb;			// 정상/이월 여부
+		private String currStockQty;		// 재고
+		private String pageYn;				// 페이징 사용 여부
+		private String changeGb;			// 순서변경 updown 구분
+		private int stockQtySum;			// 재고
+		private String afLinkCd;			// 제휴채널
+		private String afChannel;			// 제휴채널 공통코드
+		private String afLinkNm;			// 제휴채널 명
+
+		// 기획전 팝업
+		private String callBackFun;			// 콜백함수명
+		private String popupDispStdt;		//기획전 시작일시
+		private String popupDispEddt;		//기획전 종료일시
+		
+		//기획전 템플릿
+		private Integer planContSq;			// 기획전 컨텐츠 일련번호
+		private String tmplType;			//템플릿 유형(공통코드 G082)
+		private String title;				//타이틀
+		private String linkUrl;				//링크url
+		private String dispYn;				//표시여부
+		private Integer planContItemSq;		//기획전 컨텐프 아이템 일련번호
+		private String itemVal;				//아이템값(상품코드, 이미지파일명 등)
+		private String reviewDispStdt;		//리뷰노출시작일시
+		private String reviewDispEddt;		//리뷰노툴종료일시
+		
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanReview;		//리뷰상품목록
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanReviewStartD;		//리뷰시작날짜
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanReviewStartT;		//리뷰시작시간
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanReviewEndD;		//리뷰종료날짜
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanReviewEndT;		//리뷰종료시간
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanCoupon;		//쿠폰목록
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanFile;			//이미지목록
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiChannel;			//제휴채널목록
+		
+
+		
+		// 템플릿 저장하기 위한 임시 변수
+		private String reTitle;				//리뷰타이틀
+		private String mode;				//모드
+		private long reDispOrd;				//리뷰전시순서
+		private String reItemVal;			//리뷰아이템
+		private String reDispYn;			//리뷰전시여부
+		private String reItemNm;			//리뷰상품이름
+		private Integer rePlanContSq;		//리뷰 컨텐츠일련번호
+		
+		private String cuTitle;				//쿠폰타이틀
+		private long cuDispOrd;				//쿠폰전시순서
+		private String cuDispYn;			//쿠폰전시여부
+		private String cuItemVal;			//쿠폰 아이템
+		private String cuItemNm;			//쿠폰 아이템 이름
+		private Integer cuPlanContSq;		//쿠폰 컨텐츠일련번호
+		
+		private String fileItemVal;			//파일아이템
+		private String fileDispYn;			//파일전시여부
+		private long fileDispOrd;			//파일전시순서
+		private Integer filePlanContSq;		//파일 컨텐츠일련번호
+		
+		private String topFsrcDispYn;		//html상단 전시여부
+		private String BtmFsrcDispYn;		//html하단 전시여부
+		private long   topFsrcDispOrd;		//html상단 전시순서
+		private long   btmFsrcDispOrd;		//html하단 전시순서
+		private String fsrcPcTop;			//html상단 내용(pc)
+		private String fsrcMobileTop;	    //html상단 내용(mobile)
+		private String fsrcPcBtm;			//html하단 내용(pc)
+		private String fsrcMobileBtm;		//html하단 내용(pc)
+		
+		private String goodsTitle;			//상품타이틀
+		private String goodsUrl;			//상품 url
+		private String goodsDispYn;			//상품전시여부
+		private long goodsDispOrd;			//상품 전시순서
+		private String goodsType;			//상품노출순서
+		private String goodsItemVal;		//상품아이템
+		private String brandEnm;			//브랜드명
+		private Integer goodsPlanContSq;	//상품 컨텐츠일련번호
+		
+		// Pagination
+		private TscPageRequest pageable;
+		private int pageNo = 1;
+		private int pageSize = 50;
+		private int pageUnit = 10;
+		
+		private String condition; // 키워드 종류
+		private String search; // 검색어
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] conditionList;
+		
+		 // 사용가능고객등급
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	    private String[] usableCustGradeArr;
+		
+	    // 사용가능고객구분
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	    private String[] usableCustGbArr;
+	    
+	    
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent1; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent2; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent3; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent4; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent5; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent6; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent7; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent8; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent9; 
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContent10; 
+	    
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal1; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal2; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal3; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal4; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal5; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal6; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal7; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal8; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal9; 
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		List<Plan> multiPlanGoodsContentVal10; 
+}

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

@@ -242,7 +242,7 @@
 		     , CONCAT('[',#{relGoodsCd},'] 상품문의')
 		     , #{questContent}
 		     , NOW()
-		     , #{secretYn}
+		     , ifNull(#{secretYn},'N')
 		     , 'G060_10' /*답변상태:처리중*/
 		     , 'N'
 		     , #{regNo}
@@ -272,13 +272,21 @@
 		FROM   TB_COUNSEL A
 		     , TB_GOODS G
 		WHERE  A.REL_GOODS_CD = G.GOODS_CD
+		<if test="custNo != null and custNo != '' ">
 		AND    A.CUST_NO = #{custNo}
+		</if>
+		<if test="relGoodsCd != null and relGoodsCd != '' ">
+		AND    A.REL_GOODS_CD = #{relGoodsCd}
+		</if>
+		<if test="secretYn != null and secretYn != '' ">
+		AND    A.SECRET_YN = #{secretYn}
+		</if>
 		AND    A.SITE_CD = #{siteCd}
 		AND    A.COUNSEL_TYPE = 'G' /*상담유형(상품문의)*/
 		AND    A.DEL_YN = 'N' /*삭제안된넘*/
 	</select>
 	
-	<!-- 상품문의 목록 -->
+	<!-- 상품문의 목록 - 고객센터용-->
 	<select id="getGoodsQnaList" parameterType="Counsel" resultType="Counsel">
 		/* TsfCounsel.getGoodsQnaList */
 		<include refid="selectForPagingHeader"/>
@@ -301,13 +309,62 @@
 		FROM   TB_COUNSEL A
 		     , TB_GOODS G
 		WHERE  A.REL_GOODS_CD = G.GOODS_CD
+		<if test="custNo != null and custNo != '' ">
 		AND    A.CUST_NO = #{custNo}
+		</if>
+		<if test="relGoodsCd != null and relGoodsCd != '' ">
+		AND    A.REL_GOODS_CD = #{relGoodsCd}
+		</if>
+		<if test='secretYn != null and secretYn == "Y" '>
+		AND    A.SECRET_YN = #{secretYn}
+		</if>
 		AND    A.SITE_CD = #{siteCd}
 		AND    A.COUNSEL_TYPE = 'G' /*상담유형(상품문의)*/
 		AND    A.DEL_YN = 'N' /*삭제안된넘*/
 		<include refid="selectForPagingFooter"/>
 	</select>
 	
+	<!-- 상품문의 목록 - 상품목록용 -->
+	<select id="getGoodsQnaListForGoods" parameterType="Counsel" resultType="Counsel">
+		/* TsfCounsel.getGoodsQnaListForGoods */
+		<include refid="selectForPagingHeader"/>
+		SELECT Z.*
+		     , RANK() OVER(ORDER BY SELF_GB DESC, QUEST_DT_ORD DESC) AS NUMB
+		FROM (
+		SELECT A.COUNSEL_SQ                                       /*상담일련번호*/
+		     , A.SITE_CD                                          /*사이트코드*/
+		     , DATE_FORMAT(A.QUEST_DT,'%Y.%m.%d')  AS QUEST_DT    /*문의일자*/
+		     , A.SECRET_YN                                        /*비밀글여부*/
+		     , A.CELL_PHNNO                                       /*휴대전화번호*/
+		     , A.SMS_REQ_YN                                       /*SMS(알림톡)답변수신여부*/
+		     , A.REL_GOODS_CD                                     /*관련상품코드*/
+		     , G.GOODS_NM                                         /*상품명*/
+		     , A.QUEST_TITLE                                      /*문의제목*/
+		     , A.QUEST_CONTENT                                    /*질문내용*/
+		     , A.ANS_TITLE                                        /*답변제목*/
+		     , A.ANS_CONTENT                                      /*답변내용*/
+		     , A.ANS_STAT                                         /*답변상태*/
+		     , FN_GET_CODE_NM('G060',ANS_STAT)     AS ANS_STAT_NM /*답변상태명*/
+		     , DATE_FORMAT(A.ANS_DT,'%Y.%m.%d')    AS ANS_DT      /*답변일자*/
+		     , C.CUST_ID                                          /*등록자ID*/
+		     , (CASE WHEN A.CUST_NO  = #{custNo} THEN 1 ELSE 0 END) AS SELF_GB
+		     , A.QUEST_DT AS QUEST_DT_ORD
+		FROM   TB_COUNSEL A
+		     , TB_GOODS G
+		     , TB_CUSTOMER C
+		WHERE  A.REL_GOODS_CD = G.GOODS_CD
+		AND    A.CUST_NO = C.CUST_NO
+		AND    A.REL_GOODS_CD = #{relGoodsCd}
+		<if test='secretYn != null and secretYn == "Y" '>
+		AND    A.SECRET_YN = #{secretYn}
+		</if>
+		AND    A.SITE_CD = #{siteCd}
+		AND    A.COUNSEL_TYPE = 'G' /*상담유형(상품문의)*/
+		AND    A.DEL_YN = 'N' /*삭제안된넘*/
+		) Z
+		<include refid="selectForPagingFooter"/>
+	</select>
+	
 	<!-- 상품문의 삭제 -->
 	<update id="deleteGoodsQna" parameterType="Counsel">
 		/* TsfCounsel.deleteGoodsQna */

+ 10 - 9
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -79,6 +79,10 @@
 	<!-- 상품 정보 -->
 	<select id="getGoodsInfo" parameterType="Goods" resultType="Goods">
 		/* TsfGoods.getGoods */
+		SELECT Z.*
+		     , 100 - ROUND((CURR_PRICE / LIST_PRICE) * 100 ,0) AS DC_RATE 
+		     , ((PNT_RATE * CURR_PRICE) / 100) AS PNT_AMT
+		FROM (
 		SELECT G.GOODS_CD
 		     , G.GOODS_NM
 		     , G.GOODS_TNM
@@ -94,13 +98,14 @@
 		     , G.ITEMKIND_CD
 		     , G.FORMAL_GB
 		     , G.LIST_PRICE
-		     , BP.CURR_PRICE
-		     , 100 - ROUND((BP.CURR_PRICE / G.LIST_PRICE) * 100 ,0) AS DC_RATE
+		     -- , BP.CURR_PRICE
+		     , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD, G.CURR_PRICE,#{custGb}) AS CURR_PRICE
+		     -- , 100 - ROUND((BP.CURR_PRICE / G.LIST_PRICE) * 100 ,0) AS DC_RATE
 		     , G.SELF_GOODS_YN
 		     , G.GOODS_STAT
 		     , (CASE WHEN #{frontGb} = 'P' THEN G.PNT_PRATE ELSE G.PNT_MRATE END) AS PNT_RATE
 		     , (CASE WHEN #{frontGb} = 'P' THEN G.PRE_PPNT_USABLE_YN ELSE G.PRE_MPNT_USABLE_YN END) AS PRE_PNT_USABLE_YN
-		     , (CASE WHEN #{frontGb} = 'P' THEN (G.PNT_PRATE * BP.CURR_PRICE)/100 ELSE (G.PNT_MRATE * BP.CURR_PRICE) / 100 END) AS PNT_AMT
+		    -- 
 		     , G.MIN_ORD_QTY
 		     , G.MAX_ORD_QTY
 		     , G.DAY_MAX_ORD_QTY
@@ -124,7 +129,7 @@
 		     , G.RETURNABLE_YN
 		     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(#{colorCd}, IFNULL(G.MAIN_COLOR_CD,'XX')) AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
 		     , (SELECT COLOR_KNM FROM tb_color C WHERE COLOR_CD = IFNULL(NULLIF(#{colorCd},'') , G.MAIN_COLOR_CD ) AND USE_YN  = 'Y') AS COLOR_NM
-		     , BP.CURR_PRICE AS BENEFIT_PRICE
+		     -- , BP.CURR_PRICE AS BENEFIT_PRICE
 		     , (CASE WHEN W.GOODS_CD IS NULL THEN 'N' ELSE 'Y' END) AS WISH_YN
 		     , (CASE WHEN G.GOODS_TYPE = 'G056_N' THEN (SELECT IFNULL(MAX(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
 		                                                               ELSE CURR_STOCK_QTY
@@ -146,10 +151,6 @@
 		                      AND B.USE_YN = 'Y'
 		INNER JOIN TB_BRAND_GROUP D ON B.BRAND_GROUP_NO = D.BRAND_GROUP_NO
 		                            AND D.USE_YN = 'Y'
-		INNER JOIN (SELECT GOODS_CD, 
-		            FN_GET_BENEFIT_PRICE(#{frontGb},GOODS_CD, CURR_PRICE,#{custGb}) AS CURR_PRICE 
-		            FROM TB_GOODS
-		            WHERE GOODS_CD = #{goodsCd}) BP ON G.GOODS_CD = BP.GOODS_CD
 		INNER JOIN TB_DELV_FEE_POLICY E ON G.SUPPLY_COMP_CD = E.SUPPLY_COMP_CD
 		                                     AND G.DELV_FEE_CD =  E.DELV_FEE_CD
 		LEFT OUTER JOIN TB_WISHLIST W ON G.GOODS_CD = W.GOODS_CD
@@ -159,6 +160,7 @@
 		<if test='adminYn == null or adminYn != "Y"'>
 		AND G.GOODS_STAT = 'G008_90'
 		</if>
+		) Z
 	</select>
 
 	<!-- 상품 상세 정보 조회 -->
@@ -651,7 +653,6 @@
 	<select id="getGoodsStockQty"  parameterType="GoodsStock" resultType="int">
 		/* TsfGoods.getGoodsStockQty */
 		SELECT (CASE WHEN STOCK_QTY - MIN_ORD_QTY >= 0 THEN STOCK_QTY
-		             ELSE 0
 		        END ) AS STOCK_QTY
 		FROM ( 
 		    SELECT CASE WHEN A.SOLDOUT_YN = 'Y' THEN 0

+ 30 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml

@@ -14,6 +14,36 @@
 		WHERE  NUMB BETWEEN #{pageable.startRow} AND #{pageable.endRow}
 	</sql>
 	
+	<select id="getPlanCate1" resultType="Cate4Srch" parameterType="Cate4Srch">
+		SELECT CATE1_NO 
+      		  ,CATE1_NM 
+		      ,CATE_GB 
+		      ,CATE_TYPE 
+		      ,CONTENTS_LOC 
+		      ,FORMAL_GB 
+		      ,DISP_ORD 
+		      ,DISP_YN 
+	   FROM TB_CATE1
+	   WHERE 1=1
+	   	<if test="cate1No != null and cate1No != ''">
+	   	AND CATE1_NO = #{cate1No}
+	   	</if>
+	</select>
+	
+	<select id="getPlanAllCount" resultType="int" parameterType="Plan">
+		SELECT COUNT(*) AS CNT
+		FROM TB_PLAN P  
+		WHERE 1=1
+		   AND P.DEL_YN = 'N'
+		   <if test="cateNo != null and cateNo != ''">
+		   AND P.PLAN_SQ IN (
+		   						SELECT PLAN_SQ 
+		   						FROM TB_PLAN_CATE 
+		   						WHERE CATE_NO = #{cateNo}
+		   					)
+		   </if>
+	</select>
+	
 	
 
 </mapper>

+ 1 - 1
src/main/webapp/WEB-INF/views/web/callcenter/FaqFormWeb.html

@@ -81,7 +81,7 @@
 								</div>
 								<div class="ui_foot">
 									<div class="ui_row">
-										<ul class="pageNav">
+										<ul class="pageNav" id="pageNav">
 										</ul>
 									</div>
 								</div>

+ 2 - 2
src/main/webapp/WEB-INF/views/web/callcenter/GoodsQnaFormWeb.html

@@ -70,7 +70,7 @@
 								</div>
 								<div class="ui_foot">
 									<div class="ui_row">
-										<ul class="pageNav">
+										<ul class="pageNav" id="pageNav">
 										</ul>
 									</div>
 								</div>
@@ -120,7 +120,7 @@
 				tag += '				<span class="fold_state ' + (item.ansStat == "G060_10" ? "doing" : "done") + '">' + item.ansStatNm + '</span>\n'; //답변완료 : done / 처리중 : doing
 				tag += '				<div class="fold_tit">\n';
 				tag += '					<span class="prod">' + item.goodsNm + ' ' + item.relGoodsCd + '</span>\n';
-				tag += '					<span>' + item.questTitle + '</span>\n';
+				tag += '					<span>' + item.questContent + '</span>\n';
 				tag += '				</div>\n';
 				tag += '				<span class="data">' + item.questDt + '</span>\n';
 				tag += '			</div>\n';

+ 1 - 1
src/main/webapp/WEB-INF/views/web/callcenter/NoticeFormWeb.html

@@ -49,7 +49,7 @@
 								</div>
 								<div class="ui_foot">
 									<div class="ui_row">
-										<ul class="pageNav">
+										<ul class="pageNav" id="pageNav">
 										</ul>
 									</div>
 								</div>

+ 1 - 1
src/main/webapp/WEB-INF/views/web/callcenter/OneToOneQnaFormWeb.html

@@ -73,7 +73,7 @@
 								</div>
 								<div class="ui_foot">
 									<div class="ui_row">
-										<ul class="pageNav">
+										<ul class="pageNav" id="pageNav">
 										</ul>
 									</div>
 								</div>

+ 1 - 1
src/main/webapp/WEB-INF/views/web/common/fragments/GnbWeb.html

@@ -97,7 +97,7 @@
 				<ul class="bundle" id="nav3">
 					<li class="active" ><a href="#">베스트</a></li>
 					<li><a href="#">핫딜</a></li>
-					<li><a href="#">기획전</a></li>
+					<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);" title="기획전 바로가기">기획전</a></li>
 					<li><a href="#">총알배송</a></li>
 					<li><a href="#">아울렛</a></li>
 					<li><a href="#">룩북</a></li>

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

@@ -94,5 +94,5 @@
 		</div>
 	</div>
 </div>	
-<a href="#close-modal" rel="modal:close" onclick="cfCloseLayer('layer_card_benefit')" class="close-modal">Close</a>
+<a href="javascript:void(0);" rel="modal:close" onclick="cfCloseLayer('layer_card_benefit')" class="close-modal">Close</a>
 </html>

+ 36 - 319
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -102,7 +102,7 @@
 										</span>
 									</div>
 									<div class="price_blk">
-										<span class="sale_percent" th:if="${goodsInfo.dcRate > 0}" th:text="|${goodsInfo.dcRate}%|">
+										<span class="sale_percent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">
 											5%
 										</span>
 										<span class="sale_price" >
@@ -171,10 +171,6 @@
 										<button type="button" id="btn_infoSize_pop" class="btn_popup"><span>사이즈정보</span></button>
 									</div>
 									<div class="form_field">
-										<!-- <div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize1" value="" checked="">
-											<label for="rdi-optsize1"><span>90</span></label>
-										</div> -->
 										<div  th:each="goodsOption2, status : ${goodsOption2List}">
 											<input type="radio" name="rdi-optsize"  th:disabled="${goodsOption2.soldoutYn == 'Y' or goodsOption2.stockQty <= 0}" 
 													th:attr="addPrice=${goodsOption2.addPrice}, optCd1=${goodsOption2.optCd1}, optCd=${goodsOption2.optCd}">
@@ -298,15 +294,15 @@
 								<div class="btn_group_block ui_row">
 								<th:block  th:if="${goodsInfo.stockQty > 0}">
 									<div class="ui_col_6">
-										<button id="btn_add_cart" class="btn btn_dark btn_block" onclick="jfAddCart('C');"><span>쇼핑백</span></button>
+										<button type="button" class="btn btn_dark btn_block" onclick="jfAddCart('C');"><span>쇼핑백</span></button>
 									</div>
 									<div class="ui_col_6">
-										<button class="btn btn_primary btn_block" onclick="jfAddCart('O');"><span>바로구매</span></button>
+										<button type="button" class="btn btn_primary btn_block" onclick="jfAddCart('O');"><span>바로구매</span></button>
 									</div>
 								</th:block>
 								<th:block  th:unless="${goodsInfo.stockQty > 0}">
 									<div class="ui_col_12">
-										<button class="btn btn_dark btn_block" id="" disabled=""><span>SOLD OUT</span></button>
+										<button type="button" class="btn btn_dark btn_block" id="" disabled=""><span>SOLD OUT</span></button>
 									</div>
 								</th:block>
 								</div>
@@ -351,8 +347,8 @@
 									</li>
 									<li>
 										<div class="ex_qna">
-											<a href="" id="btn_pdQnaList_pop">
-												<span class="tit">문의<em class="number">(9,999+)</em></span>
+											<a href="javascript:void(0);" id="btn_pdQnaList_pop" th:onclick="cfGoodsQng([[${goodsInfo.goodsCd}]])" >
+												<span class="tit">문의<em class="number">(<th:block th:text="${#numbers.formatInteger(goodsQnaCnt, 0,'COMMA')}" ></th:block><th:block th:if="${goodsQnaCnt > 0}" th:text="${'+'}"></th:block>)</em></span>
 											</a>
 										</div>
 									</li>
@@ -1870,121 +1866,7 @@
 		</div>
 	</div>	
 	<!-- //쇼핑혜택 팝업 -->
-
-	<!-- 카드혜택 팝업 -->
-<!-- 	<div class="modal fade pd_pop bnf_card_pop" id="bnfCardPop" tabindex="-1" role="dialog" aria-labelledby="bnfCardLabel" aria-hidden="true">
-		<div class="modal-dialog" role="document">
-			<div class="modal-content">
-				<div class="modal-header">
-					<h5 class="modal-title" id="bnfCardLabel">카드혜택</h5>
-				</div>
-				<div class="modal-body">
-					<div class="pop_cont">
-						<div class="benefit_blk">
-							<h6>할인혜택</h6>
-							<div class="tbl type1">
-								<table>
-									<colgroup>
-										<col width="140">
-										<col width="290">
-										<col width="*">
-									</colgroup>
-									<tbody>
-										<tr>
-											<th>
-												KB국민카드
-											</th>
-											<td>
-												<div class="info_card">
-													<p>5% 즉시할인</p>
-													<p>7만원 이상 구매 시 최대 5만원 할인</p>
-												</div>
-											</td>
-											<td>
-												<a href="" target="_blank" class="btn_more">자세히보기</a>
-											</td>
-										</tr>
-										<tr>
-											<th>
-												삼성카드
-											</th>
-											<td>
-												<div class="info_card">
-													<p>5% 즉시할인</p>
-													<p>7만원 이상 구매 시 최대 5만원 할인</p>
-												</div>
-											</td>
-											<td>
-												&nbsp;
-											</td>
-										</tr>
-										<tr>
-											<th>
-												롯데카드
-											</th>
-											<td>
-												<div class="info_card">
-													<p>[제휴카드] YES24 MANIA 롯데카드</p>
-													<p>최대 12~24% 청구할인</p>
-													<p>1회 1만5천원이상 결제시, 바로발급가능</p>
-												</div>
-											</td>
-											<td>
-												<a href="" target="_blank" class="btn_more">자세히보기</a>
-											</td>
-										</tr>
-									</tbody>
-								</table>
-							</div>
-						</div>
-						<div class="benefit_blk">
-							<h6>무이자 할부</h6>
-							<div class="tbl type1">
-								<table>
-									<colgroup>
-										<col width="140">
-										<col width="*">
-									</colgroup>
-									<tbody>
-										<tr>
-											<th>
-												KB국민카드
-											</th>
-											<td>
-												<div class="info_card">
-													<p>2~6개월 무이자</p>
-													<p>5만원 이상 구매 시</p>
-												</div>
-											</td>
-										</tr>
-										<tr>
-											<th>
-												KB국민카드
-											</th>
-											<td>
-												<div class="info_card">
-													<p>2~6개월 무이자</p>
-													<p>5만원 이상 구매 시</p>
-												</div>
-											</td>
-										</tr>
-									</tbody>
-								</table>
-							</div>
-							<div class="info_txt">
-								<ul>
-									<li>무이자할부는 행사기간 동안 실 결제금액 기준으로 가능</li>
-									<li>법인, 체크, 기프트 카드는 부분 무이자 할부 제외</li>
-								</ul>				   
-							</div>
-						</div>					
-					</div>
-				</div>
-			</div>
-		</div>
-	</div>	 -->
-	<!-- //카드혜택 팝업 -->
-
+	
 	<!-- 사이즈정보 팝업 -->
 	<div class="modal fade pd_pop info_size_pop" id="infoSizePop" tabindex="-1" role="dialog" aria-labelledby="infoSizeLabel" aria-hidden="true">
 		<div class="modal-dialog" role="document">
@@ -3180,122 +3062,6 @@
 	</div>
 	<!-- //포토영상 리뷰 리스트 팝업 -->   
 	<!-- //**************** 상품리뷰 팝업 **************** -->  
-
-	<!-- **************** 상품문의 팝업 **************** -->
-	<!-- 상품문의 작성 팝업 -->
-	<div class="modal fade pd_pop pd_qnawrite_pop" id="pdQnaWritePop" tabindex="-1" role="dialog" aria-labelledby="pdQnaWriteLabel" aria-hidden="true">
-		<div class="modal-dialog" role="document">
-			<div class="modal-content">
-				<div class="modal-header">
-					<h5 class="modal-title" id="pdQnaWriteLabel">상품 문의하기</h5>
-				</div>
-				<div class="modal-body">
-					<div class="pop_cont">
-						<div class="info_txt">
-							<ul>
-								<li>배송, 주문/결제, 취소/반품/교환/환불, 회원, 쿠폰/포인트, 이벤트 등의 자세한 문의사항은 고객센터 > 1:1문의를 이용하여 주시기 바랍니다.</li>
-								<li>상품문의에 부합하지 않는 광고, 이유없는 비방, 욕설 및 오해의 소지가 있는 문의건에 대해서는 사전 통보 없이 삭제 될 수 있습니다.</li>
-								<li>답변은 마이페이지 > 상품 문의에서 확인 하실 수 있습니다.</li>
-							</ul>
-						</div>
-						<div class="form_field">
-							<div class="input_box">
-								<textarea class="doc_itemqna" name="" id="" cols="30" rows="10" placeholder="문의내용 입력(500자 이내)" style="resize: none;"></textarea>
-								<p class="txt_cnt">
-									<span id="itemqna_cnt" class="itemqna_cnt">(<em class="c_primary">0</em>/500자)</span>
-								</p>			  
-								<div class="secret_box">
-									<input id="wr_secret" type="checkbox"><label for="wr_secret"><span>비밀글설정</span></label>
-								</div>
-							</div> 
-						</div>
-						<div class="push_box">
-							<dl>
-								<div>
-									<dt>알림톡 수신 여부</dt>
-									<dd>
-										<div class="form_field">
-											<div>
-												<input type="radio" name="rdi-push" id="rdi-push1" value="" checked="">
-												<label for="rdi-push1"><span>수신</span></label>
-											</div>
-											<div>
-												<input type="radio" name="rdi-push" id="rdi-push2" value="">
-												<label for="rdi-push2"><span>미수신</span></label>
-											</div>
-										</div>
-									</dd>
-								</div>
-							</dl>
-						</div>
-					</div>
-				</div>
-				<div class="modal-footer">
-					<button type="button" class="btn btn_dark"><span>등록</span></button>
-				</div>
-			</div>
-		</div>		
-	</div>
-	<!-- //상품문의 작성 팝업 -->
-
-	<!-- 상품문의 리스트 팝업 -->
-	<div class="pd_pop full_pop pd_qnalist_pop" id="pdQnaListPop">
-		<div class="full_popup_wrap">
-			<h5 class="sr-only">상품문의</h5>
-			<div class="btn_close">
-				<a href="" id="btn_close_qnaListPop">닫기버튼</a>
-			</div>
-			<div class="full_pop_header">
-				<!-- 해당 상품 -->
-				<div class="item_prod">
-					<div class="item_state">
-						<a href="#none" class="itemLink">
-							<div class="itemPic">
-								<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdDetail1.jpg">
-							</div>
-							<p class="itemBrand">NBA 키즈</p>
-							<div class="itemName">유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업</div>
-							<p class="itemPrice">134,100
-								<span class="itemPrice_original">149,000</span>
-								<span class="itemPercent">30%</span>
-							</p>
-						</a>
-					</div>
-				</div>
-				<!-- //해당 상품 -->
-			</div>
-			<div class="full_pop_container">
-				<!-- 상품문의 리스트 내용 -->
-			</div>
-		</div>
-	</div>
-	<!-- //상품문의 리스트 팝업 -->
-
-	<!-- 상품문의 이미지 팝업 -->
-	<div class="modal fade pd_pop qna_img_pop" id="qnaImgPop" tabindex="-1" role="dialog" aria-labelledby="qnaImgLabel" aria-hidden="true">
-		<div class="modal-dialog" role="document">
-			<div class="modal-content">
-				<div class="modal-header sr-only">
-					<h5 class="modal-title" id="qnaImgLabel">이미지 상세보기</h5>
-				</div>
-				<div class="modal-body">
-					<div class="pop_cont">
-						<div class="swiper-container">
-							<div class="swiper-wrapper">
-								<!-- 이미지 슬라이드 영역 -->
-							</div>
-						</div>
-						<div class="swiper-button-next"></div>
-						<div class="swiper-button-prev"></div>						
-						<div class="swiper-pagination"></div>
-					</div>
-				</div>
-			</div>
-		</div>		
-	</div>
-	<!-- //상품문의 이미지 팝업 -->
-	<!-- **************** 상품문의 팝업 **************** -->
-
 <script th:inline="javascript">
 /*<![CDATA[*/
 
@@ -3509,23 +3275,9 @@
 				clickable: true,
 			},
 		});	  
-		
-		//슬라이드 - 상품문의 이미지 팝업
-		var itemQnaPopSwiper = new Swiper('.qna_img_pop .swiper-container', {
-			navigation: {
-				nextEl: '.qna_img_pop .swiper-button-next',
-				prevEl: '.qna_img_pop .swiper-button-prev',
-			},
-			pagination: {
-				el: '.qna_img_pop .swiper-pagination',
-				clickable: true,
-			},
-			observer:true,
-			observeParents: true,
-		});	
 
 		//alert -쇼핑백담기
-		document.getElementById("btn_add_cart").onclick = function(){
+		/* document.getElementById("btn_add_cart").onclick = function(){
 			mcxDialog.confirm("<div class="+"dialog-title"+">"+"상품이 쇼핑백에 추가되었습니다.</div><p>쇼핑백으로 이동하시겠습니까?</p>", {
 				cancelBtnText: "계속 쇼핑하기",
 				sureBtnText: "쇼핑백 가기",
@@ -3533,13 +3285,13 @@
 					location.href=''; 	//내 쇼핑백 이동url
 				}
 			});
-		};
+		}; */
 
 		//팝업 - 공통 닫기 sample
-		$(document).on('click','.modal a.close-modal',function(e){
+	/* 	$(document).on('click','.modal a.close-modal',function(e){
 			$(".modal").modal("hide");
 			return false;
-		});
+		}); */
 		
 		//팝업 - 쿠폰받기
 		$(document).on('click','#btn_saleCoupon_pop',function(e){
@@ -3554,13 +3306,6 @@
 			return false;
 		});
 
-		//팝업 - 카드혜택 > 자세히보기
-		/* $(document).on('click','#btn_bnfCard_pop',function(e){
-			//$("#bnfCardPop").modal("show");
-			cfCardInfo();
-			return false;
-		}); */
-
 		//팝업 - 사이즈정보
 		$(document).on('click','#btn_infoSize_pop',function(e){
 			$("#infoSizePop").modal("show");
@@ -3626,58 +3371,6 @@
 			return false;
 		});		
 		
-		//팝업 - 상품문의 작성
-		$(document).on('click','#btn_pdQnaWrite_pop',function(e){
-			$("#pdQnaWritePop").modal("show");
-
-			// 상품문의 작성 > 글자수 체크
-			$('.pd_qnawrite_pop .doc_itemqna').keyup(function (e){
-				var contentQna = $(this).val();
-				$('#itemqna_cnt').html("(<em class='c_primary'>"+contentQna.length+"</em>/500자)");  
-				if (contentQna.length > 500){
-					alert("최대 500자까지 입력 가능합니다.");
-					$(this).val(contentQna.substring(0, 500));
-					$('#itemqna_cnt').html("(<em class='c_primary'>500</em>/500자)");
-				}
-			});				
-
-			return false;
-		});
-
-		//팝업 - 상품문의 리스트
-		$(document).on('click','#btn_pdQnaList_pop',function(e){
-			$('body').addClass('lock');
-			$("#pdQnaListPop .full_pop_container").load("pd_qnalist_pop.html");
-			$("#pdQnaListPop").show(); 
-			return false;
-		}).on('click','#btn_close_qnaListPop',function(e){
-			$("#pdQnaListPop").hide(); 
-			$('body').removeClass('lock');
-			return false;
-		});			
-
-		//팝업 - 상품문의 이미지 슬라이드
-		$(document).on('click','.qna_list .img_group .thumb_pic',function(e){
-			$("#qnaImgPop .swiper-wrapper").empty();
-
-			var pdPopSlideIndex = $(this).index();
-			itemQnaPopSwiper.slideTo(pdPopSlideIndex);
-			itemQnaPopSwiper.update();
-
-			var itemQnaImglength = $('.qna_list .img_group .thumb_pic').length;
-			var itemPopImgHtml = "";
-			for (i = 1; i <= itemQnaImglength; i++) {
-				var itemQnaImg = $(this).find('img');
-				var itemQnaImgSrc = $('.img_group .thumb_pic:nth-child('+i+') img').attr('src');
-				itemPopImgHtml += "<div class='swiper-slide'><div class='pop_img' style='background-image:url("+ itemQnaImgSrc +")'></div></div>";
-			}
-
-			$("#qnaImgPop .swiper-wrapper").append(itemPopImgHtml);
-			$('#qnaImgPop').modal("show");
-			
-			return false;
-		});
-
 		//팝업 - 배송교환반품 안내
 		$(document).on('click','#btn_pdDeliveryPop',function(e){
 			$('body').addClass('lock');
@@ -3853,7 +3546,7 @@
 
 		if (goodsType == 'G056_N'){
 			if (gagajf.isNull($("#cartForm  input[name=optCd2]").val())) {
-				
+				mcxDialog.alert("사이즈를 선택하세요.");
 				return;
 			}
 		
@@ -3872,6 +3565,30 @@
 
 		}else if (goodsType == 'G056_S'){  //수정요
 			alert("작업필요");
+/* 			var target=$('.sizelistCart');
+			var targetSize=target.length;
+			var itemSize = target.find('.item').find('input[type=radio]:checked').length;
+			if (targetSize != itemSize){
+				mcxDialog.alert("구성상품들의 사이즈를 선택하세요.");
+				return false;
+			}
+
+			target.find('.item').find('input[type=radio]:checked').each(function() {
+
+				var arrInfo = $(this).val().split('|');	// 상품코드|사이즈|구성수량
+
+				var obj = new Object();
+				obj.btnType = btnType;
+				obj.goodsType = $("#cartForm  input[name=goodsType]").val();
+				obj.goodsCd = $("#cartForm  input[name=goodsCd]").val();
+				obj.itemCd = arrInfo[0];
+				obj.sizeCd = arrInfo[1];
+				obj.goodsQty = $("#cartForm  input[name=ordQty]").val();
+				obj.itemQty = Number(arrInfo[2]);
+				obj.planDtlSq =$("#cartForm  input[name=planDtlSq]").val();
+				params.push(obj);
+
+			}); */
 		}
 		// 장바구니담기
 		cfnAddCart(params);

+ 122 - 0
src/main/webapp/WEB-INF/views/web/goods/GoodsQnaDetailFormWeb.html

@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsQnaFormDetailWeb.html
+ * @desc    : 상품 문의 등록 팝업
+ *============================================================================
+ * Wivismall
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.05   eskim        최초 작성
+ *******************************************************************************
+ -->
+ <div class="modal-dialog" role="document">
+	<div class="modal-content">
+		<div class="modal-header">
+			<h5 class="modal-title" id="pdQnaWriteLabel">상품 문의하기</h5>
+		</div>
+		<div class="modal-body">
+		<form id="goodsQnaDetailForm" name="goodsQnaDetailForm" action="#" th:action="@{'/callcenter/goods/qna/create'}">
+		<input type="hidden" name="relGoodsCd" th:value ="${goodsCd}"/>
+			<div class="pop_cont">
+				<div class="info_txt">
+					<ul>
+						<li>배송, 주문/결제, 취소/반품/교환/환불, 회원, 쿠폰/포인트, 이벤트 등의 자세한 문의사항은 고객센터 > 1:1문의를 이용하여 주시기 바랍니다.</li>
+						<li>상품문의에 부합하지 않는 광고, 이유없는 비방, 욕설 및 오해의 소지가 있는 문의건에 대해서는 사전 통보 없이 삭제 될 수 있습니다.</li>
+						<li>답변은 마이페이지 > 상품 문의에서 확인 하실 수 있습니다.</li>
+					</ul>
+				</div>
+				<div class="form_field">
+					<div class="input_box">
+						<textarea class="doc_itemqna" name="questContent" id="" cols="30" rows="10" placeholder="문의내용 입력(500자 이내)" style="resize: none;"></textarea>
+						<p class="txt_cnt">
+							<span id="itemqna_cnt" class="itemqna_cnt">(<em class="c_primary">0</em>/500자)</span>
+						</p>			  
+						<div class="secret_box">
+							<input id="wr_secret" type="checkbox" name="secretYn" value="Y"><label for="wr_secret"><span>비밀글설정</span></label>
+						</div>
+					</div> 
+				</div>
+				<div class="push_box">
+					<dl>
+						<div>
+							<dt>알림톡 수신 여부</dt>
+							<dd>
+								<div class="form_field">
+									<div>
+										<input type="radio" name="smsReqYn" id="rdi-push1" value="Y" checked="checked">
+										<label for="rdi-push1"><span>수신</span></label>
+									</div>
+									<div>
+										<input type="radio" name="smsReqYn" id="rdi-push2" value="N">
+										<label for="rdi-push2"><span>미수신</span></label>
+									</div>
+								</div>
+							</dd>
+						</div>
+					</dl>
+				</div>
+			</div>
+		</form>	
+		</div>
+		<div class="modal-footer">
+			<button type="button" class="btn btn_dark" id="btnGoodsQnaSave"><span>등록</span></button>
+		</div>
+	</div>
+</div>
+<a href="javascript:void(0);" rel="modal:close" onclick="cfCloseLayer('layer_goods_qna_reg')" class="close-modal">Close</a> 	
+<script th:inline="javascript">
+/*<![CDATA[*/
+
+	// 상품문의 작성 > 글자수 체크
+	$('.pd_qnawrite_pop .doc_itemqna').keyup(function (e){
+		var contentQna = $(this).val();
+		$('#itemqna_cnt').html("(<em class='c_primary'>"+contentQna.length+"</em>/500자)");  
+		if (contentQna.length > 500){
+			alert("최대 500자까지 입력 가능합니다.");
+			$(this).val(contentQna.substring(0, 500));
+			$('#itemqna_cnt').html("(<em class='c_primary'>500</em>/500자)");
+		}
+	});
+	
+	// 저장
+	$('#btnGoodsQnaSave').on('click', function() {
+		
+		// 테스트용
+/* 		gagajf.ajaxFormSubmit($('#goodsQnaDetailForm').prop('action')
+				, $('#goodsQnaDetailForm')
+				, function() {
+					mcxDialog.alert("상품 문의가 등록되었습니다. 빠른 시일 내에 답변드리겠습니다.");
+				}
+		); */
+		
+		// 입력 값 체크
+		if (gagajf.isNull($("#goodsQnaDetailForm  textarea[name=questContent]").val())){
+			mcxDialog.alert("문의내용을 입력해주세요.");
+			return false;
+		}
+		
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxFormSubmit($('#goodsQnaDetailForm').prop('action')
+						, $('#goodsQnaDetailForm')
+						, function() {
+							mcxDialog.alert("상품 문의가 등록되었습니다. 빠른 시일 내에 답변드리겠습니다.");
+						}
+				);
+			}
+		});
+	
+	});
+	
+
+
+/*]]>*/
+</script>
+ </html>

+ 166 - 0
src/main/webapp/WEB-INF/views/web/goods/GoodsQnaFormWeb.html

@@ -0,0 +1,166 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsQnaFormWeb.html
+ * @desc	: 상품 문의 팝업
+ *============================================================================
+ * Wivismall
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE		 AUTHOR	  DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.05   eskim		최초 작성
+ *******************************************************************************
+ -->
+ <div class="full_popup_wrap">
+	<h5 class="sr-only">상품문의</h5>
+	<div class="btn_close">
+		<a href="javascript:void(0)" onclick="cfCloseFullLayer('layer_goods_qna');">닫기버튼</a>
+	</div>
+	<div class="full_pop_header">
+		<!-- 해당 상품 -->
+		<div class="item_prod" th:with="imgGoodsUrl=${@environment.getProperty('upload.goods.view')}, uxImgUrl=${@environment.getProperty('domain.uximage')}">
+			<div class="item_state">
+				<a href="#none" class="itemLink">
+					<div class="itemPic">
+						<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}">
+					</div>
+					<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">NBA 키즈</p>
+					<div class="itemName" th:text="${goodsInfo.goodsFullNm}">유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업</div>
+					<p class="itemPrice"><th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"> 134,100</th:block>
+						<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</span>
+						<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
+					</p>
+				</a>
+			</div>
+		</div>
+		<!-- //해당 상품 -->
+	</div>
+	<div class="full_pop_container">
+		<!-- 상품문의 리스트 내용 -->
+		<div class="pd_qnalist">
+		<form id="goodsQnaForm" name="goodsQnaForm" action="#" th:action="@{'/goods/qna/list'}">
+		<input type="hidden" name="pageNo" value ="1"/>
+		<input type="hidden" name="pageSize" value ="10"/>
+		<input type="hidden" name="relGoodsCd" th:value ="${goodsInfo.goodsCd}"/>
+			<div class="info_txt">
+				<ul>
+					<li>상품에 대해 궁금한 점이 있으시다면 문의해주세요.</li>
+					<li>배송, 주문/결제, 취소/반품/교환/환불, 회원, 쿠폰/포인트, 이벤트 등의 자세한 문의사항은 고객센터 > 1:1문의를 이용하여 주시기 바랍니다.</li>
+				</ul>			  
+				<div class="btn_box">
+					<button type="button" class="btn btn_default" onclick="cfnGoToPage(_PAGE_GOODS_QNA);"><span>고객센터 1:1문의</span></button>
+					<button type="button" class="btn btn_dark" th:onclick="cfGoodsQngCreate([[${goodsInfo.goodsCd}]] )"><span>상품 문의하기</span></button>
+				</div>	 
+			</div>
+			<div class="qna_list">
+				<!-- 나열조건결과 있을 때 노출 내용 -->
+				<div class="form_field">
+					<input id="except_secret" type="checkbox" value="Y" name="secretYn" onclick=""><label for="except_secret"><span>비밀글제외</span></label>
+				</div>
+				<div class="ui_row">
+					<div class="foldGroup case1">
+						<ul id="ulGoodsQna">
+						</ul>
+					</div>
+				</div>
+				<div class="ui_foot">
+					<div class="ui_row">
+						<ul class="pageNav" id="pageNav">
+						</ul>
+					</div>			
+				</div>
+				<!-- //나열조건결과 있을 때 노출 내용 -->
+				<!-- 나열조건결과 없을 때 노출 내용 -->
+				<div class="nodata" style="display:none;">
+					<div class="txt_box">
+						<p>
+							등록된 상품문의가 없습니다.
+						</p>
+					</div>
+				</div>
+				<!-- //나열조건결과 없을 때 노출 내용 -->
+			</div>
+		</form>	
+		</div>
+	</div>
+</div>
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	let fnGetList = function() {
+		// Initialize a pagination
+		gagaPaging.init('goodsQnaForm', fnGetListCallback, 'pageNav', 10);
+
+		// Load data
+		gagaPaging.load(1);
+	}
+	
+	var fnGetListCallback = function(result) {
+		$('#ulGoodsQna').html('');
+		$('.nodata').hide();
+		// 목록
+		if (result.dataList != null && result.dataList.length > 0) {
+			
+			$.each(result.dataList, function(idx, item) {
+				let tag = '<li class="'+ (item.selfGb == 1 ? "my_qna" : "") +'">\n';  // <!-- 내가 쓴 글에 클래스 my_qna 추가 -->
+				tag += '	<div class="fold_head">\n';
+				tag += '		<a href="javascript:void(0)">\n';
+				tag += '			<div>\n';
+				tag += '				<span class="fold_state ' + (item.ansStat == "G060_10" ? "doing" : "done") + '">' + item.ansStatNm + '</span>\n'; //답변완료 : done / 처리중 : doing
+				tag += '				<div class="fold_tit">\n';
+				tag += '					<span>' + item.questContent + '</span>\n';
+				if (item.selfGb == 1){
+				tag += '					<i class="ico ico_myqna"></i>\n';	//내가 쓴 글에 추가되는 아이콘
+				}
+				if (item.secretYn == "Y"){
+				tag += '					<i class="ico ico_secret"></i>\n';	//비밀글에 추가되는 아이콘
+				}
+				tag += '				</div>\n';
+				tag += '				<div class="data">\n';
+				tag += '					<span class="wr_id">'+ item.custId+'</span>\n';
+				tag += '					<span class="wr_data">' + item.questDt + '</span>\n';
+				tag += '				</div>\n';
+				tag += '			</div>\n';
+				tag += '		</a>\n';
+				tag += '	</div>\n';
+				tag += '	<div class="fold_cont" style="display: none;">\n';
+				tag += '		<div class="fold_detail">\n'; //문의 내용
+				tag += '			<div>\n';
+				tag += '				<p>' + item.questContent + '</p>\n';
+				tag += '			</div>\n';
+				tag += '		</div>\n';
+				
+				if (item.ansStat == 'G060_20') { // 답변완료 상태일 때
+					tag += '	<div class="fold_answer">\n'; //문의 답변
+					tag += '		<div class="answer_head">답변이 등록되었습니다.</div>\n';
+					tag += '		<div class="answer_body">' + item.ansContent + '</div>\n';
+					tag += '		<span class="data">' + item.ansDt + '</span>\n';
+					tag += '	</div>\n';
+				}
+				
+				tag += '	</div>\n';
+				tag += '</li>\n';
+				
+				$('#ulGoodsQna').append(tag);
+			});
+		} else {
+			$('.nodata').show();
+			$('.ui_foot').hide();
+		}
+
+		// Create pagination
+		gagaPaging.createPagination(result.paging.pageable);
+	}
+	
+	$(document).ready(function() {
+		fnGetList();
+	});
+	
+/*]]>*/
+</script>
+
+ </html>

+ 337 - 0
src/main/webapp/WEB-INF/views/web/planning/PlanningMainFormWeb.html

@@ -0,0 +1,337 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : PlanningMainFormWeb.html
+ * @desc    : 기획전메인 Page
+ *============================================================================
+ * Pastelmall
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.5   sowon     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+	<!--  container -->
+	<div id="container" class="container dp">
+		<div class="breadcrumb"> 
+			<ul>
+				<li class="bread_home"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);">홈</a></li>
+				<li class="bread_2depth"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);">기획전</a></li>
+				<th:block th:if="${cateNm != null}">
+				<li class="bread_3depth"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN+'?cateNo='+[[${cateNo}]]);">[[${cateNm}]]</a></li>
+				</th:block>
+			</ul> 
+		</div>
+		<div class="wrap">
+			<div class="content dp_Exhibition"> <!-- 페이지특정 클래스 = dp_Exhibition -->
+				<div class="cont_head">
+					<div>
+                        <h3>기획전</h3>
+                    </div>
+				</div>
+				<div class="cont_body">
+                    <div class="best_nav">
+                        <ul>
+                            <li><button th:class="${cateNo == null ? 'active' : ''}" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);">전체</button></li>
+                             <th:block th:each="CategoryData, CategoryStat : ${categoryList}">
+                             <li><button th:class="${CategoryData.cate1No == cateNo ? 'active' : '' }" th:onclick="|cfnGoToPage(_PAGE_PLANNING_MAIN+'?cateNo=*{CategoryData.cate1No}');|">[[${CategoryData.cate1Nm}]]</button></li>
+						    </th:block>
+						    	
+                        </ul>
+                    </div>
+                    <div class="ui_row">
+                        <div class="ui_col_12">
+                            <div class="form_count">
+                                <p><span>[[${planCount}]]</span>개의 기획전</p>
+                            </div>
+                        </div>
+                    </div>
+                    <!-- 기획전 0개 -->
+                  	<th:block th:if="${planCount == 0}">
+                   	 <div class="list_content nodata"> <!-- 데이터 없을시 클래스 nodata 추가 -->
+                    </th:block>
+                     <!-- 기획전 1개 이상 -->
+                  	<th:block th:if="${planCount != 0}">
+                   	 <div class="list_content"> <!-- 데이터 없을시 클래스 nodata 추가 -->
+                    </th:block>
+                        <div class="list_defult">
+                            <div>
+                                <img src="/images/pc/ico_content_find.png" alt="">
+                                <p>등록된 기획전이 없습니다.</p>
+                            </div>
+                            <div class="ui_row">
+                                <button type="button" class="btn btn_default" onclick="cfnGoToPage(_PAGE_MAIN);"><span>홈으로 가기</span></button>
+                            </div>
+                        </div>
+                        <div class="itemsGrp">
+                            <div class="exhi_item">
+                                <div class="exhi_item_img">
+                                    <a href="">
+                                        <div class="shape ranker"><span>NEW</span></div>
+                                        <img src="/images/pc/thumb/ev_list_img01.jpg" alt=""> <!-- 430x430 사이즈 최적 -->
+                                        <div class="exhi_detail">
+                                            <p class="brand">TBJ 외</p>
+                                            <h3 class="tit">ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션 ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션</h3>
+                                            <p class="sale">신상 15%쿠폰할인</p>
+                                        </div>
+                                    </a>
+                                </div>
+                                <div class="exhi_item_pr">
+                                    <ul class="prod_list clear">
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr01.jpg" alt="볼패딩 푸퍼점퍼">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">볼패딩 푸퍼점퍼 T204JP060P 볼패딩 푸퍼점퍼 T204JP060P</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr02.jpg" alt="테이퍼드 M톤 기모 데님 팬츠">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">테이퍼드 M톤 기모 데님 팬츠</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr03.jpg" alt="패딩 리버서블 FLEECE  점퍼">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">패딩 리버서블 FLEECE  점퍼</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                            <div class="exhi_item">
+                                <div class="exhi_item_img">
+                                    <a href="">
+                                        <div class="shape ranker"><span>NEW</span></div>
+                                        <img src="/images/pc/thumb/tmp_pdLookbook1.jpg" alt="">
+                                        <div class="exhi_detail">
+                                            <p class="brand">TBJ 외</p>
+                                            <h3 class="tit">ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션 ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션</h3>
+                                            <p class="sale">신상 15%쿠폰할인</p>
+                                        </div>
+                                    </a>
+                                </div>
+                                <div class="exhi_item_pr">
+                                    <ul class="prod_list clear">
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr01.jpg" alt="볼패딩 푸퍼점퍼">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">볼패딩 푸퍼점퍼 T204JP060P 볼패딩 푸퍼점퍼 T204JP060P</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr02.jpg" alt="테이퍼드 M톤 기모 데님 팬츠">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">테이퍼드 M톤 기모 데님 팬츠</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr03.jpg" alt="패딩 리버서블 FLEECE  점퍼">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">패딩 리버서블 FLEECE  점퍼</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                            <div class="exhi_item">
+                                <div class="exhi_item_img">
+                                    <a href="">
+                                        <div class="shape ranker"><span>NEW</span></div>
+                                        <img src="/images/pc/thumb/tmp_pdLookbook1.jpg" alt="">
+                                        <div class="exhi_detail">
+                                            <p class="brand">TBJ 외</p>
+                                            <h3 class="tit">ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션 ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션</h3>
+                                            <p class="sale">신상 15%쿠폰할인</p>
+                                        </div>
+                                    </a>
+                                </div>
+                                <div class="exhi_item_pr">
+                                    <ul class="prod_list clear">
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr01.jpg" alt="볼패딩 푸퍼점퍼">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">볼패딩 푸퍼점퍼 T204JP060P 볼패딩 푸퍼점퍼 T204JP060P</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr02.jpg" alt="테이퍼드 M톤 기모 데님 팬츠">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">테이퍼드 M톤 기모 데님 팬츠</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr03.jpg" alt="패딩 리버서블 FLEECE  점퍼">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">패딩 리버서블 FLEECE  점퍼</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                            <div class="exhi_item">
+                                <div class="exhi_item_img">
+                                    <a href="">
+                                        <img src="/images/pc/thumb/tmp_pdLookbook1.jpg" alt="">
+                                        <div class="exhi_detail">
+                                            <p class="brand">TBJ 외</p>
+                                            <h3 class="tit">ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션 ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션</h3>
+                                            <p class="sale">신상 15%쿠폰할인</p>
+                                        </div>
+                                    </a>
+                                </div>
+                                <div class="exhi_item_pr">
+                                    <ul class="prod_list clear">
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr01.jpg" alt="볼패딩 푸퍼점퍼">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">볼패딩 푸퍼점퍼 T204JP060P 볼패딩 푸퍼점퍼 T204JP060P</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr02.jpg" alt="테이퍼드 M톤 기모 데님 팬츠">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">테이퍼드 M톤 기모 데님 팬츠</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr03.jpg" alt="패딩 리버서블 FLEECE  점퍼">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">패딩 리버서블 FLEECE  점퍼</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                            <div class="exhi_item">
+                                <div class="exhi_item_img">
+                                    <a href="">
+                                        <img src="/images/pc/thumb/tmp_pdLookbook1.jpg" alt="">
+                                        <div class="exhi_detail">
+                                            <p class="brand">TBJ 외</p>
+                                            <h3 class="tit">ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션 ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션</h3>
+                                            <p class="sale">신상 15%쿠폰할인</p>
+                                        </div>
+                                    </a>
+                                </div>
+                                <div class="exhi_item_pr">
+                                    <ul class="prod_list clear">
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr01.jpg" alt="볼패딩 푸퍼점퍼">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">볼패딩 푸퍼점퍼 T204JP060P 볼패딩 푸퍼점퍼 T204JP060P</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr02.jpg" alt="테이퍼드 M톤 기모 데님 팬츠">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">테이퍼드 M톤 기모 데님 팬츠</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                        <li>
+                                            <a href="">
+                                                <div class="img">
+                                                    <img src="/images/pc/thumb/dp_exhibition_pr03.jpg" alt="패딩 리버서블 FLEECE  점퍼">
+                                                </div>
+                                                <div class="txt">
+                                                    <p class="pr_tit">패딩 리버서블 FLEECE  점퍼</p>
+                                                    <p class="price"><span>25,410</span>원</p>
+                                                </div>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+		    </div>
+        </div>
+    </div>
+	<!-- // container -->	
+
+<script th:inline="javascript">
+
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 133 - 43
src/main/webapp/ux/style24_link.js

@@ -19,14 +19,15 @@ const _PAGE_CUSTOMER_PWD_CHANGE_TEMP = _frontUrl + "/customer/password/change/fo
 const _PAGE_CUSTOMER_DORMANT = _frontUrl + "/customer/dormant/certify/form";						// 고객 > 휴면회원
 
 //== 상품상세 ==/
-const _PAGE_GOODS_DETAIL = _frontUrl + "/goods/detail/form?goodsCd=";		// 상품 상세
-//const _PAGE_GOODS_DETAIL = _frontUrl + "/goods/detail/coupon/layer?goodsCd=";		// 쿠폰레이어
-const _PAGE_SHOPPING_BENEFIT = _frontUrl + "/goods/shopping/benefit/layer";		// 쇼핑혜택레이어
-const _PAGE_CARD_PRMT_LAYER = _frontUrl + "/goods/card/prmt/layer";		// 카드혜택레이어
-const _PAGE_GOODS_SIZEINFO_LAYER = _frontUrl + "/goods/sizeInfo/layer?goodsCd=";		// 사이즈정보레이어
-const _PAGE_GOODS_COUNSEL_LAYER = _frontUrl + "/goods/counsel/layer?goodsCd=";		// 상품문의레이어
-const _PAGE_GOODS_DELIVERY_LAYER = _frontUrl + "/goods/delivery/layer?goodsCd=";		// 배송/교환/반품 레이어
-const _PAGE_GOODS_REVIEW_LAYER = _frontUrl + "/goods/review/layer?goodsCd=";		// 상품평 레이어
+const _PAGE_GOODS_DETAIL = _frontUrl + "/goods/detail/form?goodsCd=";						// 상품 상세
+//const _PAGE_GOODS_DETAIL = _frontUrl + "/goods/detail/coupon/layer?goodsCd=";				// 쿠폰레이어
+const _PAGE_SHOPPING_BENEFIT = _frontUrl + "/goods/shopping/benefit/layer";					// 쇼핑혜택레이어
+const _PAGE_CARD_PRMT_LAYER = _frontUrl + "/goods/card/prmt/layer";							// 카드혜택레이어
+const _PAGE_GOODS_SIZEINFO_LAYER = _frontUrl + "/goods/sizeInfo/layer?goodsCd=";			// 사이즈정보레이어
+const _PAGE_GOODS_QNA_LAYER = _frontUrl + "/goods/qna/layer/";								// 상품문의레이어
+const _PAGE_GOODS_QNA_CREATE_LAYER = _frontUrl + "/goods/qna/create/layer/";				// 상품문의레이어
+const _PAGE_GOODS_DELIVERY_LAYER = _frontUrl + "/goods/delivery/layer?goodsCd=";			// 배송/교환/반품 레이어
+const _PAGE_GOODS_REVIEW_LAYER = _frontUrl + "/goods/review/layer?goodsCd=";				// 상품평 레이어
 
 //== 장바구니 ==/
 
@@ -50,6 +51,7 @@ const _PAGE_MYPAGE_SECEDE = _frontUrl + "/mypage/customer/secede/form";			// 마
 //== 검색 ==/
 
 //== 기획전 ==/
+const _PAGE_PLANNING_MAIN = _frontUrl + "/planning/main/form"; 					// 기획전 메인
 
 //== 고객센터 ==/
 const _PAGE_FAQ = _frontUrl + "/callcenter/faq/form";									// 고객센터 > FAQ
@@ -67,7 +69,7 @@ const _PAGE_NOTICE = _frontUrl + "/callcenter/notice/form";								// 고객센
  * @access : public
  * @desc   : page 이동
  * <pre>
- *     cfnGoToPage(PAGE_LOGIN);
+ *	 cfnGoToPage(PAGE_LOGIN);
  * </pre>
  * @param  : page - page
  * @return : None
@@ -207,10 +209,10 @@ function cfnAddCart(cartList) {
  * @access : public
  * @desc   :  네이버 로그인
  * <pre>
- *     cfnLoginNaver();
- *     호출된 페이지에서
- *     PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
- *     MO :
+ *	 cfnLoginNaver();
+ *	 호출된 페이지에서
+ *	 PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
+ *	 MO :
  * </pre>
  * @since  : 2021/02/23
  * @author : jsshin
@@ -233,10 +235,10 @@ var cfnLoginNaver = function (requestGb, chkRememberMe) {
  * @access : public
  * @desc   : 카카오 로그인
  * <pre>
- *     cfnLoginKakao();
- *     호출된 페이지에서
- *     PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
- *     MO :
+ *	 cfnLoginKakao();
+ *	 호출된 페이지에서
+ *	 PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
+ *	 MO :
  * </pre>
  * @since  : 2021/02/23
  * @author : jsshin
@@ -259,10 +261,10 @@ var cfnLoginKakao = function (requestGb, chkRememberMe) {
  * @access : public
  * @desc   : Yes24 로그인
  * <pre>
- *     cfnLoginYes24();
- *     호출된 페이지에서
- *     PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
- *     MO :
+ *	 cfnLoginYes24();
+ *	 호출된 페이지에서
+ *	 PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
+ *	 MO :
  * </pre>
  * @since  : 2021/02/23
  * @author : jsshin
@@ -285,7 +287,7 @@ var cfnLoginYes24 = function (requestGb, chkRememberMe) {
  * @access : public
  * @desc   : 상품상세로 이동
  * <pre>
- *        cfnGoToGoodsDetail('A83U-TS058S');
+ *		cfnGoToGoodsDetail('A83U-TS058S');
  * </pre>
  * @param  : goodsCd - 상품코드코드. 필수
  * @param  : ithrCd - 유입경로. 필수
@@ -308,7 +310,7 @@ var cfnGoToGoodsDetail = function (goodsCd, colorCd, ithrCd, contentsLoc, planDt
  * @access : public
  * @desc   : 공통 레이어 띄우기
  * <pre>
- *     cfOpenLayer(_PAGE_CARD_LAYER, 'layer_card_benefit');
+ *	 cfOpenLayer(_PAGE_CARD_LAYER, 'layer_card_benefit');
  * </pre>
  * @param  : page - page. 필수
  * @param  : tgt - 레이어가 표시될 위치(예, div 태크의 ID). 필수
@@ -316,20 +318,20 @@ var cfnGoToGoodsDetail = function (goodsCd, colorCd, ithrCd, contentsLoc, planDt
  * @param  : callbackFnc - 콜백함수. 옵션
  */
 function cfOpenLayer(page, tgt, oParam, callbackFnc) {
-    if (!oParam) oParam = new Object();
-
-    $.post(page
-        , oParam
-        , function (result) {
-            $('#' + tgt).html(result);
-            $('#' + tgt).modal("show");
-            //$('#' + tgt).show();
-            //layerPop_resize(tgt);
-            if (callbackFnc && $.isFunction(callbackFnc))
-                callbackFnc();
-        }
-        , "html");
-    return false;
+	if (!oParam) oParam = new Object();
+
+	$.post(page
+		, oParam
+		, function (result) {
+			$('#' + tgt).html(result);
+			$('#' + tgt).modal("show");
+			//$('#' + tgt).show();
+			//layerPop_resize(tgt);
+			if (callbackFnc && $.isFunction(callbackFnc))
+				callbackFnc();
+		}
+		, "html");
+	return false;
 }
 
 /**
@@ -337,14 +339,14 @@ function cfOpenLayer(page, tgt, oParam, callbackFnc) {
  * @access : public
  * @desc   : 공통 레이어 위치 조정
  * <pre>
- *     layerPop_resize('layer_card_benefit');
+ *	 layerPop_resize('layer_card_benefit');
  * </pre>
  * @param  : tgt - 레이어가 표시될 위치(예, div 태크의 ID). 필수
  */
 function layerPop_resize(tgt) {
-    var thisH = $("#" + tgt).find(".modal").outerHeight();
-    var thisT = ($(window).height() / 2) - (thisH / 2);
-    $("#" + tgt).find(".modal").css('top', thisT + 'px');
+	var thisH = $("#" + tgt).find(".modal").outerHeight();
+	var thisT = ($(window).height() / 2) - (thisH / 2);
+	$("#" + tgt).find(".modal").css('top', thisT + 'px');
 }
 
 /**
@@ -352,7 +354,7 @@ function layerPop_resize(tgt) {
  * @access : public
  * @desc   : 공통 레이어 닫기(레이어 숨기기)
  * <pre>
- *     cfCloseLayer("layer_card_benefit");
+ *	 cfCloseLayer("layer_card_benefit");
  * </pre>
  * @param  : tgt - 숨길 레이어 ID(예, div 태크의 ID). 필수
  */
@@ -382,4 +384,92 @@ function cfCardInfo() {
 	}
 
 	cfOpenLayer(_PAGE_CARD_PRMT_LAYER, 'layer_card_benefit');
-}
+}
+
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 공통 full 레이어 띄우기
+ * <pre>
+ *	 cfOpenFullLayer(_PAGE_CARD_LAYER, 'layer_card_benefit');
+ * </pre>
+ * @param  : page - page. 필수
+ * @param  : tgt - 레이어가 표시될 위치(예, div 태크의 ID). 필수
+ * @param  : oParam - Parameter Object. 옵션
+ * @param  : callbackFnc - 콜백함수. 옵션
+ */
+function cfOpenFullLayer(page, tgt, oParam, callbackFnc) {
+	if (!oParam) oParam = new Object();
+
+	$.post(page
+		, oParam
+		, function (result) {
+			$('body').addClass('lock');
+			$('#' + tgt).html(result);
+			$('#' + tgt).show();
+			if (callbackFnc && $.isFunction(callbackFnc))
+				callbackFnc();
+		}
+		, "html");
+	return false;
+}
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 공통 full 레이어 닫기(레이어 숨기기)
+ * <pre>
+ *	 cfCloseFullLayer("layer_card_benefit");
+ * </pre>
+ * @param  : tgt - 숨길 레이어 ID(예, div 태크의 ID). 필수
+ */
+function cfCloseFullLayer(tgt) {
+	//if (_frontGb == "M"){
+	//	btnClose(tgt);
+	//}else{
+		$('#' + tgt).hide();
+		$('#' + tgt).remove();
+		$('body').removeClass('lock');
+	//}
+	return false;
+}
+
+/**
+* @type   : function
+* @access : public
+* @desc   : 상품문의 full 팝업
+* <pre>
+*		cfGoodsQngReg();
+* </pre>
+*/
+function cfGoodsQng(goodsCd) {
+	var Param = new Object();
+	var str = '<div class="pd_pop full_pop pd_qnalist_pop" id="layer_goods_qna">';
+
+	if ($('#layer_goods_qna').length == 0) {
+		$('body').append(str);
+	}
+
+	cfOpenFullLayer(_PAGE_GOODS_QNA_LAYER + goodsCd, 'layer_goods_qna');
+}
+
+/**
+* @type   : function
+* @access : public
+* @desc   : 상품문의 등록 팝업
+* <pre>
+*		cfGoodsQngReg();
+* </pre>
+*/
+function cfGoodsQngCreate(goodsCd) {
+	var Param = new Object();
+	var str = '<div class="modal fade pd_pop pd_qnawrite_pop" id="layer_goods_qna_reg" tabindex="-1" role="dialog" aria-labelledby="pdQnaWriteLabel" aria-hidden="true">';
+
+	if ($('#layer_goods_qna_reg').length == 0) {
+		$('body').append(str);
+	}
+
+	cfOpenLayer(_PAGE_GOODS_QNA_CREATE_LAYER + goodsCd, 'layer_goods_qna_reg');
+}
+