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

상품상세- 상품문의개발중

eskim 5 лет назад
Родитель
Сommit
ac141009a6

+ 55 - 3
src/main/java/com/style24/front/biz/web/TsfGoodsController.java

@@ -5,6 +5,7 @@ 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.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
@@ -13,11 +14,13 @@ import org.springframework.web.servlet.ModelAndView;
 import com.style24.core.biz.service.TscEnvsetService;
 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.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;
@@ -45,7 +48,10 @@ public class TsfGoodsController extends TsfBaseController {
 
 	@Autowired
 	private TscEnvsetService envsetService;
-
+	
+	@Autowired
+	private TsfCounselService counselService;
+	
 	@Value("${has-ssl}")
 	private String hasSsl;
 
@@ -143,6 +149,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:정율
@@ -206,6 +219,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 +229,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 +311,42 @@ public class TsfGoodsController extends TsfBaseController {
 		stockQty = goodsService.getGoodsStockQty(goodsStock);
 		return stockQty;
 	}
+	
+	/**
+	 * 상품상세 -  상품 QNA LIST 레이어
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 4
+	 */
+	@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;
+	}
+	
+	
+	/**
+	 * 상품상세 -  카드혜택안내 레이어
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 4
+	 */
+	@PostMapping("/qna/create/layer/{goodsCd}")
+	public ModelAndView qnaCreateForm(@PathVariable String goodsCd) {
+		ModelAndView mav = new ModelAndView();
+		CardPromotion cardPromotion = new CardPromotion();
+		//mav.addObject("cardInfoList", goodsService.getCardPromotionList(cardPromotion));
+		mav.setViewName(super.getDeviceViewName("goods/GoodsQnaDetailForm"));
+		return mav;
+	}
+	
 }

+ 16 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfCounsel.xml

@@ -272,7 +272,15 @@
 		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' /*삭제안된넘*/
@@ -301,7 +309,15 @@
 		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' /*삭제안된넘*/

+ 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

+ 36 - 301
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");
@@ -3644,40 +3389,6 @@
 			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 +3564,7 @@
 
 		if (goodsType == 'G056_N'){
 			if (gagajf.isNull($("#cartForm  input[name=optCd2]").val())) {
-				
+				mcxDialog.alert("사이즈를 선택하세요.");
 				return;
 			}
 		
@@ -3872,6 +3583,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);

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

@@ -0,0 +1,86 @@
+<!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">
+			<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>
+<a href="#close-modal" rel="modal:close" id="pdQnaWritePop_close" 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자)");
+		}
+	});				
+
+
+/*]]>*/
+</script>
+ </html>

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

@@ -0,0 +1,545 @@
+<!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">
+			<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"><label for="except_secret"><span>비밀글제외</span></label>
+				</div>
+				<div class="ui_row">
+					<div class="foldGroup case1">
+						<ul>
+							<li class="my_qna"> <!-- 내가 쓴 글에 클래스 my_qna 추가 -->
+								<div class="fold_head">
+									<a href="javascript:void(0)">
+										<div>
+											<span class="fold_state done">답변완료</span> <!-- 답변완료 : done / 처리중 : doing -->
+											<div class="fold_tit">
+												<span>상품을 받았는데, 옷의 색상이 화면과 다릅니다.</span>												
+												<i class="ico ico_myqna"></i> <!-- 내가 쓴 글에 추가되는 아이콘 --> 
+												<i class="ico ico_secret"></i> <!-- 비밀글에 추가되는 아이콘 --> 
+											</div>
+											<div class="data">
+												<span class="wr_id">abcd***</span>
+												<span class="wr_date">2020.12.02</span>
+											</div>
+										</div>
+									</a>
+								</div>
+								<div class="fold_cont" style="display:none;">
+									<!-- 상품문의 내용 -->
+									<div class="fold_detail">
+										<div>
+											<p>
+												PC에서 남성 분또 맨투맨 (T203TS120P)<br>
+												오렌지 컬러 선물하려고 하는데 선물을 할 수 없다고 나오네요.<br>
+												다른 컬러는 선물이 가능한 것 같은데 오렌지 컬러는 왜 안 되는건가요?<br>
+												바쁘시겠지만 확인 부탁드립니다.
+											</p>
+										</div>
+										<button type="button" class="btn btn_default btn_del"><span><i class="ico ico_trash"></i>삭제</span></button>
+									</div>
+									<!-- //상품문의 내용 -->
+									<!-- 내 1대1문의 답변 -->
+									<div class="fold_answer">
+										<div class="answer_head">
+											답변이 등록되었습니다.
+										</div>
+										<div class="answer_body">
+											안녕하세요, 고객님. 스타일24 담당자 배수지 입니다. <br>
+											문의주신 해당 상품의 선물하기는 모바일에서만 사용이 가능합니다. <br>
+											이외 궁금하신 사항이 있으시면 1:1문의나 고객센터(1544-5336)로 문의 부탁 드립니다. <br>
+											고객 만족을 위해 더욱 더 노력하는 스타일24가 되겠습니다. <br>
+											좋은 하루 보내세요, 감사합니다.
+										</div>
+										<span class="data">2020.12.02</span>
+									</div>
+									<!-- //내 1대1문의 답변 -->
+								</div>
+							</li>
+							<li class="my_qna"> <!-- 내가 쓴 글에 클래스 my_qna 추가 -->
+								<div class="fold_head">
+									<a href="javascript:void(0)">
+										<div>
+											<span class="fold_state doing">처리중</span> <!-- 답변완료 : done / 처리중 : doing -->
+											<div class="fold_tit">
+												<span>상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요? 상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요?</span>
+												<i class="ico ico_myqna"></i> <!-- 내가 쓴 글에 추가되는 아이콘 --> 
+											</div>
+											<div class="data">
+												<span class="wr_id">abcd***</span>
+												<span class="wr_date">2020.12.02</span>
+											</div>
+										</div>
+									</a>
+								</div>
+								<div class="fold_cont" style="display: none;">
+									<!-- 상품문의 내용 -->
+									<div class="fold_detail">
+										<div>
+											<p>
+												핑크색 재입고 되나요?<br>
+												노랑 샀는데 편하고 좋아서<br> 
+												하나 더 사려하는데 핑크가 없네요 ㅠ<br>
+												재입고 가능여부 알려주세요!!!!!																
+											</p>
+										</div>
+										<button type="button" class="btn btn_default btn_del"><span><i class="ico ico_trash"></i>삭제</span></button>
+									</div> 
+									<!-- //상품문의 내용 -->
+								</div>
+							</li>
+							<li>
+								<div class="fold_head">
+									<a href="javascript:void(0)">
+										<div>
+											<span class="fold_state doing">처리중</span> <!-- 답변완료 : done / 처리중 : doing -->
+											<div class="fold_tit">
+												<span>상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요? 상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요?</span>
+												<i class="ico ico_secret"></i> <!-- 비밀글에 추가되는 아이콘 --> 
+											</div>
+											<div class="data">
+												<span class="wr_id">abcd***</span>
+												<span class="wr_date">2020.12.02</span>
+											</div>
+										</div>
+									</a>
+								</div>
+								<div class="fold_cont" style="display: none;">
+									<!-- 상품문의 내용 -->
+									<div class="fold_detail">
+										<div>
+											<p>
+												핑크색 재입고 되나요?<br>
+												노랑 샀는데 편하고 좋아서<br> 
+												하나 더 사려하는데 핑크가 없네요 ㅠ<br>
+												재입고 가능여부 알려주세요!!!!!																
+											</p>
+										</div>
+										<button type="button" class="btn btn_default btn_del"><span><i class="ico ico_trash"></i>삭제</span></button>
+									</div> 
+									<!-- //상품문의 내용 -->
+								</div>
+							</li>	
+							<li>
+								<div class="fold_head">
+									<a href="javascript:void(0)">
+										<div>
+											<span class="fold_state doing">처리중</span> <!-- 답변완료 : done / 처리중 : doing -->
+											<div class="fold_tit">
+												<span>상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요? 상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요?</span>
+											</div>
+											<div class="data">
+												<span class="wr_id">abcd***</span>
+												<span class="wr_date">2020.12.02</span>
+											</div>
+										</div>
+									</a>
+								</div>
+								<div class="fold_cont" style="display: none;">
+									<!-- 상품문의 내용 -->
+									<div class="fold_detail">
+										<div>
+											<p>
+												핑크색 재입고 되나요?<br>
+												노랑 샀는데 편하고 좋아서<br> 
+												하나 더 사려하는데 핑크가 없네요 ㅠ<br>
+												재입고 가능여부 알려주세요!!!!!																
+											</p>
+										</div>
+										<button type="button" class="btn btn_default btn_del"><span><i class="ico ico_trash"></i>삭제</span></button>
+									</div> 
+									<!-- //상품문의 내용 -->
+								</div>
+							</li>		
+							<li>
+								<div class="fold_head">
+									<a href="javascript:void(0)">
+										<div>
+											<span class="fold_state doing">처리중</span> <!-- 답변완료 : done / 처리중 : doing -->
+											<div class="fold_tit">
+												<span>상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요? 상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요?</span>
+											</div>
+											<div class="data">
+												<span class="wr_id">abcd***</span>
+												<span class="wr_date">2020.12.02</span>
+											</div>
+										</div>
+									</a>
+								</div>
+								<div class="fold_cont" style="display: none;">
+									<!-- 상품문의 내용 -->
+									<div class="fold_detail">
+										<div>
+											<p>
+												핑크색 재입고 되나요?<br>
+												노랑 샀는데 편하고 좋아서<br> 
+												하나 더 사려하는데 핑크가 없네요 ㅠ<br>
+												재입고 가능여부 알려주세요!!!!!																
+											</p>
+										</div>
+										<button type="button" class="btn btn_default btn_del"><span><i class="ico ico_trash"></i>삭제</span></button>
+									</div> 
+									<!-- //상품문의 내용 -->
+								</div>
+							</li>		
+							<li>
+								<div class="fold_head">
+									<a href="javascript:void(0)">
+										<div>
+											<span class="fold_state doing">처리중</span> <!-- 답변완료 : done / 처리중 : doing -->
+											<div class="fold_tit">
+												<span>상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요? 상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요?</span>
+											</div>
+											<div class="data">
+												<span class="wr_id">abcd***</span>
+												<span class="wr_date">2020.12.02</span>
+											</div>
+										</div>
+									</a>
+								</div>
+								<div class="fold_cont" style="display: none;">
+									<!-- 상품문의 내용 -->
+									<div class="fold_detail">
+										<div>
+											<p>
+												핑크색 재입고 되나요?<br>
+												노랑 샀는데 편하고 좋아서<br> 
+												하나 더 사려하는데 핑크가 없네요 ㅠ<br>
+												재입고 가능여부 알려주세요!!!!!																
+											</p>
+										</div>
+										<button type="button" class="btn btn_default btn_del"><span><i class="ico ico_trash"></i>삭제</span></button>
+									</div> 
+									<!-- //상품문의 내용 -->
+								</div>
+							</li>		
+							<li>
+								<div class="fold_head">
+									<a href="javascript:void(0)">
+										<div>
+											<span class="fold_state doing">처리중</span> <!-- 답변완료 : done / 처리중 : doing -->
+											<div class="fold_tit">
+												<span>상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요? 상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요?</span>
+											</div>
+											<div class="data">
+												<span class="wr_id">abcd***</span>
+												<span class="wr_date">2020.12.02</span>
+											</div>
+										</div>
+									</a>
+								</div>
+								<div class="fold_cont" style="display: none;">
+									<!-- 상품문의 내용 -->
+									<div class="fold_detail">
+										<div>
+											<p>
+												핑크색 재입고 되나요?<br>
+												노랑 샀는데 편하고 좋아서<br> 
+												하나 더 사려하는데 핑크가 없네요 ㅠ<br>
+												재입고 가능여부 알려주세요!!!!!																
+											</p>
+										</div>
+										<button type="button" class="btn btn_default btn_del"><span><i class="ico ico_trash"></i>삭제</span></button>
+									</div> 
+									<!-- //상품문의 내용 -->
+								</div>
+							</li>		
+							<li>
+								<div class="fold_head">
+									<a href="javascript:void(0)">
+										<div>
+											<span class="fold_state doing">처리중</span> <!-- 답변완료 : done / 처리중 : doing -->
+											<div class="fold_tit">
+												<span>상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요? 상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요?</span>
+											</div>
+											<div class="data">
+												<span class="wr_id">abcd***</span>
+												<span class="wr_date">2020.12.02</span>
+											</div>
+										</div>
+									</a>
+								</div>
+								<div class="fold_cont" style="display: none;">
+									<!-- 상품문의 내용 -->
+									<div class="fold_detail">
+										<div>
+											<p>
+												핑크색 재입고 되나요?<br>
+												노랑 샀는데 편하고 좋아서<br> 
+												하나 더 사려하는데 핑크가 없네요 ㅠ<br>
+												재입고 가능여부 알려주세요!!!!!																
+											</p>
+										</div>
+										<button type="button" class="btn btn_default btn_del"><span><i class="ico ico_trash"></i>삭제</span></button>
+									</div> 
+									<!-- //상품문의 내용 -->
+								</div>
+							</li>		
+							<li>
+								<div class="fold_head">
+									<a href="javascript:void(0)">
+										<div>
+											<span class="fold_state doing">처리중</span> <!-- 답변완료 : done / 처리중 : doing -->
+											<div class="fold_tit">
+												<span>상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요? 상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요?</span>
+											</div>
+											<div class="data">
+												<span class="wr_id">abcd***</span>
+												<span class="wr_date">2020.12.02</span>
+											</div>
+										</div>
+									</a>
+								</div>
+								<div class="fold_cont" style="display: none;">
+									<!-- 상품문의 내용 -->
+									<div class="fold_detail">
+										<div>
+											<p>
+												핑크색 재입고 되나요?<br>
+												노랑 샀는데 편하고 좋아서<br> 
+												하나 더 사려하는데 핑크가 없네요 ㅠ<br>
+												재입고 가능여부 알려주세요!!!!!																
+											</p>
+										</div>
+										<button type="button" class="btn btn_default btn_del"><span><i class="ico ico_trash"></i>삭제</span></button>
+									</div> 
+									<!-- //상품문의 내용 -->
+								</div>
+							</li>		
+							<li>
+								<div class="fold_head">
+									<a href="javascript:void(0)">
+										<div>
+											<span class="fold_state doing">처리중</span> <!-- 답변완료 : done / 처리중 : doing -->
+											<div class="fold_tit">
+												<span>상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요? 상품 상세정보에 품절이라고 되어있습니다. 언제 다시 구매할 수 있을까요?</span>
+											</div>
+											<div class="data">
+												<span class="wr_id">abcd***</span>
+												<span class="wr_date">2020.12.02</span>
+											</div>
+										</div>
+									</a>
+								</div>
+								<div class="fold_cont" style="display: none;">
+									<!-- 상품문의 내용 -->
+									<div class="fold_detail">
+										<div>
+											<p>
+												핑크색 재입고 되나요?<br>
+												노랑 샀는데 편하고 좋아서<br> 
+												하나 더 사려하는데 핑크가 없네요 ㅠ<br>
+												재입고 가능여부 알려주세요!!!!!																
+											</p>
+										</div>
+										<button type="button" class="btn btn_default btn_del"><span><i class="ico ico_trash"></i>삭제</span></button>
+									</div> 
+									<!-- //상품문의 내용 -->
+								</div>
+							</li>		
+						</ul>										
+					</div>
+				</div>
+				<div class="ui_foot">
+					<div class="ui_row">
+						<ul class="pageNav">
+							<li class="disabled"><a href="#">«</a></li>
+							<li class="prev disabled"><a href="#">‹</a></li>
+							<li><a href="#">1</a></li>
+							<li class="active"><a href="#">2</a></li>
+							<li><a href="#">3</a></li>
+							<li><a href="#">4</a></li>
+							<li><a href="#">5</a></li>
+							<li><a href="#">6</a></li>
+							<li><a href="#">7</a></li>
+							<li><a href="#">8</a></li>
+							<li><a href="#">9</a></li>
+							<li><a href="#">10</a></li>
+							<li class="next"><a href="#">›</a></li>
+							<li><a href="#">»</a></li>
+						</ul>
+					</div>			
+				</div>
+				<!-- //나열조건결과 있을 때 노출 내용 -->
+				<!-- 나열조건결과 없을 때 노출 내용 -->
+				<div class="nodata">
+					<div class="txt_box">
+						<p>
+							등록된 상품문의가 없습니다.
+						</p>
+					</div>
+				</div>
+				<!-- //나열조건결과 없을 때 노출 내용 -->
+			</div>
+		</div>
+				
+	</div>
+</div>
+<form id="goodsGnaForm" name="goodsGnaForm" action="#" th:action="@{'/callcenter/onetoone/qna/list'}">
+	<input type="hidden" name="pageNo" value ="1"/>
+	<input type="hidden" name="pageSize" value ="10"/>
+</form>
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	$(document).ready(function() {
+		// 고객센터 LNB 설정
+		fnSetCallcenterLnb(2);
+		
+		fnGetList();
+	});
+	
+	let fnGetList = function() {
+		// Initialize a pagination
+		gagaPaging.init('qnaForm', fnGetListCallback, 'pageNav', 10);
+
+		// Load data
+		gagaPaging.load(1);
+	}
+	
+	var fnGetListCallback = function(result) {
+		$('#ulQna').html('');
+
+		// 목록
+		if (result.dataList != null && result.dataList.length > 0) {
+			$.each(result.dataList, function(idx, item) {
+				let tag = '<li>\n';
+				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 class="prod">[' + item.counselClsfNm + ']</span>\n';
+				tag += '					<span>' + item.questTitle + '</span>\n';
+				tag += '				</div>\n';
+				tag += '				<span class="data">' + item.questDt + '</span>\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';
+				
+				if (!gagajf.isNull(item.sysFileNm1) || !gagajf.isNull(item.sysFileNm2)) {
+					tag += '				<p class="img_group">\n';
+					
+					if (!gagajf.isNull(item.sysFileNm1)) {
+						tag += '					<span class="thumb_pic">\n';
+						tag += '						<img src="' + _uploadImageUrl + '/counsel/' + item.sysFileNm1 + '" alt="" onerror="this.src=\'/image/bg_profile.png\'">\n';
+						tag += '					</span>\n';
+					}
+					
+					if (!gagajf.isNull(item.sysFileNm2)) {
+						tag += '					<span class="thumb_pic">\n';
+						tag += '						<img src="' + _uploadImageUrl + '/counsel/' + item.sysFileNm2 + '" alt="" onerror="this.src=\'/image/bg_profile.png\'">\n';
+						tag += '					</span>\n';
+					}
+					
+					tag += '				</p>\n';
+				}
+				
+				tag += '			</div>\n';
+				
+				if (item.ansStat == 'G060_10') { // 처리중일때
+					tag += '			<button type="button" class="btn btn_default btn_del" onclick="fnDeleteQna(' + item.counselSq + ');"><span><i class="ico ico_trash"></i>삭제</span></button>\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';
+				
+				$('#ulQna').append(tag);
+			});
+		} else {
+			let tag = '<li>내역이 없습니다.</li>\n';
+			$('#ulQna').append(tag);
+			$('#divQna').addClass('nodata');
+		}
+
+		// Create pagination
+		gagaPaging.createPagination(result.paging.pageable);
+	}
+	
+	// 삭제
+	let fnDeleteQna = function(counselSq) {
+		mcxDialog.confirm("등록된 내용을 삭제하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				let params = new Object();
+				params.counselSq = counselSq;
+				
+				var jsonData = JSON.stringify(params);
+				gagajf.ajaxJsonSubmit('/callcenter/onetoone/qna/delete'
+						, jsonData
+						, function() {
+							fnGetList();
+						});
+			}
+		});
+	}
+/*]]>*/
+</script>
+
+ </html>

+ 132 - 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=";				// 상품평 레이어
 
 //== 장바구니 ==/
 
@@ -67,7 +68,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 +208,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 +234,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 +260,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 +286,7 @@ var cfnLoginYes24 = function (requestGb, chkRememberMe) {
  * @access : public
  * @desc   : 상품상세로 이동
  * <pre>
- *        cfnGoToGoodsDetail('A83U-TS058S');
+ *		cfnGoToGoodsDetail('A83U-TS058S');
  * </pre>
  * @param  : goodsCd - 상품코드코드. 필수
  * @param  : ithrCd - 유입경로. 필수
@@ -308,7 +309,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 +317,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 +338,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 +353,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 +383,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');
+}
+