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

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

eskim 5 лет назад
Родитель
Сommit
12928a462d
27 измененных файлов с 1088 добавлено и 246 удалено
  1. 0 9
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaAnswerPhaseDao.java
  2. 2 2
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaRendererDao.java
  3. 0 11
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaAnswerPhaseService.java
  4. 0 5
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaCounselService.java
  5. 3 3
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaRendererService.java
  6. 11 21
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaCustomerController.java
  7. 0 4
      style24.admin/src/main/java/com/style24/persistence/domain/Counsel.java
  8. 0 12
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaAnswerPhase.xml
  9. 1 6
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaCounsel.xml
  10. 3 3
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaRenderer.xml
  11. 16 13
      style24.admin/src/main/webapp/WEB-INF/views/customer/GoodsQnaDetailForm.html
  12. 3 3
      style24.admin/src/main/webapp/WEB-INF/views/customer/OneToOneQnaDetailForm.html
  13. 3 3
      style24.admin/src/main/webapp/ux/js/admin.popup.js
  14. 33 33
      style24.core/src/main/java/com/style24/core/biz/dao/TscAnswerPhaseDao.java
  15. 46 46
      style24.core/src/main/java/com/style24/core/biz/service/TscAnswerPhaseService.java
  16. 26 26
      style24.core/src/main/java/com/style24/persistence/mybatis/shop/TscAnswerPhase.xml
  17. 66 0
      style24.scm/src/main/java/com/style24/persistence/domain/Counsel.java
  18. 140 0
      style24.scm/src/main/java/com/style24/persistence/mybatis/shop/TssCounsel.xml
  19. 5 5
      style24.scm/src/main/java/com/style24/persistence/mybatis/shop/TssRenderer.xml
  20. 43 0
      style24.scm/src/main/java/com/style24/scm/biz/dao/TssCounselDao.java
  21. 10 10
      style24.scm/src/main/java/com/style24/scm/biz/dao/TssRendererDao.java
  22. 66 0
      style24.scm/src/main/java/com/style24/scm/biz/service/TssCounselService.java
  23. 13 14
      style24.scm/src/main/java/com/style24/scm/biz/service/TssRendererService.java
  24. 155 0
      style24.scm/src/main/java/com/style24/scm/biz/web/TssCustomerController.java
  25. 236 0
      style24.scm/src/main/webapp/WEB-INF/views/customer/GoodsQnaDetailForm.html
  26. 202 0
      style24.scm/src/main/webapp/WEB-INF/views/customer/GoodsQnaForm.html
  27. 5 17
      style24.scm/src/main/webapp/ux/js/admin.popup.js

+ 0 - 9
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaAnswerPhaseDao.java

@@ -31,13 +31,4 @@ public interface TsaAnswerPhaseDao {
 	 */
 	void saveAnswerPhase(AnswerPhase ansPhase);
 
-	/**
-	 * 문의용 답변문구 조회
-	 * @param ansPhase - 답변문구 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 12. 24
-	 */
-	AnswerPhase getQnaAnswerPhase(AnswerPhase ansPhase);
-
 }

+ 2 - 2
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaRendererDao.java

@@ -196,13 +196,13 @@ public interface TsaRendererDao {
 //	Collection<CommonCode> getSellStoreList();
 
 	/**
-	 * 1:1문의용 답변문구 목록
+	 * 문의용 답변문구 목록
 	 * @param ansClsf - 답변종류
 	 * @return
 	 * @author gagamel
 	 * @since 2020. 12. 24
 	 */
-	Collection<CommonCode> getAnswerPhaseList(String ansClsf);
+	Collection<CommonCode> getQnaAnswerPhaseList(String ansClsf);
 
 //	/**
 //	 * 제휴링크 목록

+ 0 - 11
style24.admin/src/main/java/com/style24/admin/biz/service/TsaAnswerPhaseService.java

@@ -50,15 +50,4 @@ public class TsaAnswerPhaseService {
 		ansPhaseDao.saveAnswerPhase(ansPhase);
 	}
 
-	/**
-	 * 문의용 답변문구 조회
-	 * @param ansPhase - 답변문구 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 12. 24
-	 */
-	public AnswerPhase getQnaAnswerPhase(AnswerPhase ansPhase) {
-		return ansPhaseDao.getQnaAnswerPhase(ansPhase);
-	}
-
 }

+ 0 - 5
style24.admin/src/main/java/com/style24/admin/biz/service/TsaCounselService.java

@@ -7,7 +7,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.style24.admin.biz.dao.TsaCounselDao;
-import com.style24.admin.support.security.session.TsaSession;
 import com.style24.persistence.domain.Counsel;
 
 import lombok.extern.slf4j.Slf4j;
@@ -68,8 +67,6 @@ public class TsaCounselService {
 	 * @since 2020. 12. 24
 	 */
 	public Collection<Counsel> getGoodsQnaList(Counsel counsel) {
-		counsel.setRoleCd(TsaSession.getInfo().getRoleCd());
-		counsel.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
 		return counselDao.getGoodsQnaList(counsel);
 	}
 
@@ -83,8 +80,6 @@ public class TsaCounselService {
 	public Counsel getGoodsQna(Integer counselSq) {
 		Counsel counsel = new Counsel();
 		counsel.setCounselSq(counselSq);
-		counsel.setRoleCd(TsaSession.getInfo().getRoleCd());
-		counsel.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
 		return counselDao.getGoodsQna(counsel);
 	}
 

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

@@ -498,14 +498,14 @@ public class TsaRendererService {
 //	}
 
 	/**
-	 * 1:1문의용 답변문구 목록
+	 * 문의용 답변문구 목록
 	 * @param ansClsf - 답변종류
 	 * @return CommonCode
 	 * @author gagamel
 	 * @since 2020. 12. 24
 	 */
-	public Collection<CommonCode> getAnswerPhaseList(String ansClsf) {
-		return rendererDao.getAnswerPhaseList(ansClsf);
+	public Collection<CommonCode> getQnaAnswerPhaseList(String ansClsf) {
+		return rendererDao.getQnaAnswerPhaseList(ansClsf);
 	}
 
 //	/**

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

@@ -12,11 +12,11 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
-import com.style24.admin.biz.service.TsaAnswerPhaseService;
 import com.style24.admin.biz.service.TsaCounselService;
 import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.biz.service.TscAnswerPhaseService;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.AnswerPhase;
 import com.style24.persistence.domain.Counsel;
@@ -29,7 +29,7 @@ import com.gagaframework.web.rest.server.GagaResponse;
  * 고객 Controller
  *
  * @author gagamel
- * @since 2020. 12. 24
+ * @since 2020. 12. 28
  */
 @Controller
 @RequestMapping("/customer")
@@ -46,7 +46,7 @@ public class TsaCustomerController extends TsaBaseController {
 	private TsaRendererService rendererService;
 
 	@Autowired
-	private TsaAnswerPhaseService answerPhaseService;
+	private TscAnswerPhaseService ansPhaseService;
 
 	/**
 	* 1:1문의관리 화면
@@ -99,8 +99,8 @@ public class TsaCustomerController extends TsaBaseController {
 		// 1:1문의 상세 정보
 		mav.addObject("counselInfo", counselService.getOneToOneQna(counselSq));
 
-		// 1:1문의용 답변문구
-		mav.addObject("ansPhaseList", rendererService.getAnswerPhaseList("20"));
+		// 문의용 답변문구
+		mav.addObject("ansPhaseList", rendererService.getQnaAnswerPhaseList("G061_20"));
 
 		mav.setViewName("customer/OneToOneQnaDetailForm");
 
@@ -121,7 +121,7 @@ public class TsaCustomerController extends TsaBaseController {
 		AnswerPhase ansPhase = new AnswerPhase();
 		ansPhase.setAnsSq(ansSq);
 		ansPhase.setAnsClsf(ansClsf);
-		return answerPhaseService.getQnaAnswerPhase(ansPhase);
+		return ansPhaseService.getQnaAnswerPhase(ansPhase);
 	}
 
 	/**
@@ -145,18 +145,8 @@ public class TsaCustomerController extends TsaBaseController {
 //		// TODO. 고객이 SMS답변수신을 요청했을 때
 //		if (counsel.getSmsReqYn().equals("Y")) {
 //			try {
-//				// 답변완료안내 카카오알림톡 발송
-//				kakaoService.sendOnetoOneAnswer(tCounsel);
-//			} catch (Exception e) {
-//				// Do nothing
-//			}
-//		}
-
-		// 고객이 이메일답변수신을 요청했을 때
-//		if (counsel.getEmailReqYn().equals("Y")) {
-//			try {
-//				// 답변완료안내 메일 발송
-//				mailService.sendOneToOneAnswer(tCounsel);
+//				// 문의답변완료안내 카카오알림톡 발송
+//				kakaoService.sendQnaAnswer(tCounsel);
 //			} catch (Exception e) {
 //				// Do nothing
 //			}
@@ -219,8 +209,8 @@ public class TsaCustomerController extends TsaBaseController {
 		// 상품문의 상세
 		mav.addObject("counselInfo", counselService.getGoodsQna(counselSq));
 
-		// 상품문의용 답변문구
-		mav.addObject("ansPhaseList", rendererService.getAnswerPhaseList("20"));
+		// 문의용 답변문구
+		mav.addObject("ansPhaseList", rendererService.getQnaAnswerPhaseList("G061_20"));
 
 		mav.setViewName("customer/GoodsQnaDetailForm");
 
@@ -242,7 +232,7 @@ public class TsaCustomerController extends TsaBaseController {
 
 		counselService.updateGoodsQnaAnswerTransfer(counsel);
 
-		return super.ok(message.getMessage("SUCC_0001"));
+		return super.ok(message.getMessage("SUCC_0004"));
 	}
 
 }

+ 0 - 4
style24.admin/src/main/java/com/style24/persistence/domain/Counsel.java

@@ -64,10 +64,6 @@ public class Counsel extends TscBaseDomain {
 	private Integer ansSq;
 	private String ansClsf;
 
-	// 입점업체일 경우 본인 것만 조회되도록 사용
-	private String roleCd;
-	private String supplyCompCd;
-
 	// 검색조건
 	private String condition;		// 검색어
 	private String custGb;			// 회원구분

+ 0 - 12
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaAnswerPhase.xml

@@ -69,16 +69,4 @@
 		     , UPD_DT = NOW()
 	</insert>
 	
-	<!-- 문의용 답변문구 조회 -->
-	<select id="getQnaAnswerPhase" parameterType="AnswerPhase" resultType="AnswerPhase">
-		/* TsaAnswerPhase.getQnaAnswerPhase */
-		SELECT ANS_SQ      --답변일련번호
-		     , ANS_TITLE   --답변제목
-		     , ANS_CONTENT --답변내용
-		FROM   TB_ANS_PHASE
-		WHERE  ANS_SQ = #{ansSq}
-		AND    ANS_CLSF = #{ansClsf}
-		AND    USE_YN = 'Y'
-	</select>
-
 </mapper>

+ 1 - 6
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaCounsel.xml

@@ -195,9 +195,6 @@
 		<if test="ansCompCd != null and ansCompCd != ''">
 		AND    A.ANS_COMP_CD = #{ansCompCd}
 		</if>
-		<if test="roleCd == 'B000'"> <!-- 입점업체권한일 때는 본인 것만 보도록 처리 -->
-		AND    A.ANS_COMP_CD = #{supplyCompCd}
-		</if>
 		<if test="ansStat != null and ansStat != ''">
 		AND    A.ANS_STAT = #{ansStat}
 		</if>
@@ -222,6 +219,7 @@
 		     , G.GOODS_NM                                                          /*상품명*/
 		     , G.SELF_GOODS_YN                                                     /*자사상품여부*/
 		     , DATE_FORMAT(A.QUEST_DT,'%Y-%m-%d %H:%i:%S')     AS QUEST_DT         /*문의일시*/
+		     , A.SECRET_YN                                                         /*비밀글여부*/
 		     , A.ANS_NO                                                            /*답변자번호*/
 		     , D.USER_NM                                       AS ANS_NM           /*답변자명*/
 		     , DATE_FORMAT(A.ANS_DT,'%Y-%m-%d %H:%i:%S')       AS ANS_DT           /*답변일시*/
@@ -244,9 +242,6 @@
 		LEFT OUTER JOIN TB_USER D ON A.ANS_NO = D.USER_NO
 		WHERE  A.COUNSEL_SQ = #{counselSq}
 		AND    A.COUNSEL_TYPE = 'G' /*상담유형(상품문의)*/
-		<if test="roleCd == 'B000'"> <!-- 입점업체권한일 때는 본인 것만 보도록 처리 -->
-		AND    A.ANS_COMP_CD = #{supplyCompCd}
-		</if>
 	</select>
 
 	<!--상품문의 입점업체에 답변의뢰 -->

+ 3 - 3
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaRenderer.xml

@@ -331,9 +331,9 @@
 		FROM   TB_SELL_STORE
 	</select>
 
-	<!-- 1:1문의용 답변문구 목록 -->
-	<select id="getAnswerPhaseList" parameterType="String" resultType="CommonCode">
-		/* TsaRenderer.getAnswerPhaseList */
+	<!-- 문의용 답변문구 목록 -->
+	<select id="getQnaAnswerPhaseList" parameterType="String" resultType="CommonCode">
+		/* TsaRenderer.getQnaAnswerPhaseList */
 		SELECT ANS_SQ     AS CD
 		     , ANS_TITLE  AS CD_NM
 		FROM   TB_ANS_PHASE

+ 16 - 13
style24.admin/src/main/webapp/WEB-INF/views/customer/GoodsQnaDetailForm.html

@@ -14,12 +14,12 @@
  * 1.0  2020.12.25   gagamel     최초 작성
  *******************************************************************************
  -->
-<div class="modalPopup" data-width="1200" id="popupQna">
+<div class="modalPopup" data-width="1200" id="popupGoodsQnaDetail">
 	<div class="panelStyle">
 		<!-- TITLE -->
 		<div class="panelTitle">
 			<strong>상품문의 상세</strong>
-			<button type="button" class="close" onclick="uifnPopupClose('popupQna');"><em class="fa fa-times"></em></button>
+			<button type="button" class="close" onclick="uifnPopupClose('popupGoodsQnaDetail');"><em class="fa fa-times"></em></button>
 		</div>
 		<!-- //TITLE -->
 		
@@ -100,6 +100,17 @@
 					</tbody>
 				</table>
 				
+				<!-- 아직 업체에게 의뢰를 하지 않은 답변대기중인 입점상품이면서 권한이 "SUPER관리자, 어드민관리자, CS관리자, CS상담사"일 때 -->
+				<ul class="panelBar" th:if="${counselInfo.selfGoodsYn == 'N' && counselInfo.ansTransYn == 'N' && counselInfo.ansStat == 'G060_10' && (sessionInfo.roleCd == 'G001_0000' || sessionInfo.roleCd == 'G001_A000' || sessionInfo.roleCd == 'G001_A3000' || sessionInfo.roleCd == 'G001_A301')}">
+					<li class="right">
+						<select name="ansCompCd" id="ansCompCd">
+							<option value="">[답변의뢰업체]</option>
+							<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+						</select>
+						<button type="button" class="btn btn-danger btn-lg" id="btnTransferAnswer">답변의뢰</button>
+					</li>
+				</ul>
+				
 				<h4>답변등록</h4>
 				<table class="frmStyle" aria-describedby="답변등록">
 					<colgroup>
@@ -141,14 +152,6 @@
 		<!-- 버튼 배치 영역 -->
 		<ul class="panelBar">
 			<li class="right">
-				<!-- 아직 업체에게 의뢰를 하지 않은 답변대기중인 입점상품이면서 권한이 "SUPER관리자, 어드민관리자, CS관리자, CS상담사"일 때 -->
-				<span th:if="${counselInfo.selfGoodsYn == 'N' && counselInfo.ansTransYn == 'N' && counselInfo.ansStat == 'G060_10' && (sessionInfo.roleCd == 'G001_0000' || sessionInfo.roleCd == 'G001_A000' || sessionInfo.roleCd == 'G001_A3000' || sessionInfo.roleCd == 'G001_A301')}">
-					<select name="ansCompCd" id="ansCompCd">
-						<option value="">[답변의뢰업체]</option>
-						<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
-					</select>
-					<button type="button" class="btn btn-danger btn-lg" id="btnTransferAnswer">답변의뢰</button>
-				</span>
 				<button type="button" class="btn btn-info btn-lg" id="btnSaveAnswer" th:if="${counselInfo.ansStat == 'G060_10'}">답변저장</button>
 			</li>
 		</ul>
@@ -180,8 +183,8 @@
 
 				var jsonData = JSON.stringify(params);
 
-				gagajf.ajaxJsonSubmit('/customer/goods/answer/transfer/save', jsonData, function() {
-					uifnPopupClose('popupQna');
+				gagajf.ajaxJsonSubmit('/customer/goods/qna/answer/transfer/save', jsonData, function() {
+					uifnPopupClose('popupGoodsQnaDetail');
 					$('#btnSearch').trigger('click');
 				});
 			}
@@ -199,7 +202,7 @@
 			sureBtnText: "확인",
 			sureBtnClick: function() {
 				gagajf.ajaxFormSubmit($('#qnaDetailForm').prop('action'), '#qnaDetailForm', function() {
-					uifnPopupClose('popupQna');
+					uifnPopupClose('popupGoodsQnaDetail');
 					$('#btnSearch').trigger('click');
 				});
 			}

+ 3 - 3
style24.admin/src/main/webapp/WEB-INF/views/customer/OneToOneQnaDetailForm.html

@@ -14,12 +14,12 @@
  * 1.0  2020.12.24   gagamel     최초 작성
  *******************************************************************************
  -->
-<div class="modalPopup" data-width="1200" id="popupQna">
+<div class="modalPopup" data-width="1200" id="popupOneToOneQnaDetail">
 	<div class="panelStyle">
 		<!-- TITLE -->
 		<div class="panelTitle">
 			<strong>1:1문의 상세</strong>
-			<button type="button" class="close" onclick="uifnPopupClose('popupQna');"><em class="fa fa-times"></em></button>
+			<button type="button" class="close" onclick="uifnPopupClose('popupOneToOneQnaDetail');"><em class="fa fa-times"></em></button>
 		</div>
 		<!-- //TITLE -->
 		
@@ -155,7 +155,7 @@
 			sureBtnText: "확인",
 			sureBtnClick: function() {
 				gagajf.ajaxFormSubmit($('#qnaDetailForm').prop('action'), '#qnaDetailForm', function() {
-					uifnPopupClose('popupQna');
+					uifnPopupClose('popupOneToOneQnaDetail');
 					$('#btnSearch').trigger('click');
 				});
 			}

+ 3 - 3
style24.admin/src/main/webapp/ux/js/admin.popup.js

@@ -448,9 +448,9 @@ var cfnOpenOneToOneQnaDetailPopup = function(counselSq) {
 /**
  * @type   : function
  * @access : public
- * @desc   : 상품문의상세팝업
- * @since  : 2020/08/14
- * @author : 이대형
+ * @desc   : 상품문의 상세 팝업
+ * @author : gagamel
+ * @since  : 2020/12/24
  */
 var cfnOpenGoodsQnaDetailPopup = function(counselSq) {
 	var actionUrl = '/customer/goods/qna/detail/form/' + counselSq;

+ 33 - 33
style24.core/src/main/java/com/style24/core/biz/dao/TscAnswerPhaseDao.java

@@ -1,33 +1,33 @@
-package com.style24.core.biz.dao;
-
-import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.AnswerPhase;
-
-/**
- * 답변문구 Dao
- * 
- * @author gagamel
- * @since 2020. 10. 29
- */
-@ShopDs
-public interface TscAnswerPhaseDao {
-
-	/**
-	 * 답변문구 조회
-	 * @param ansSq - 답변일련번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	AnswerPhase getAnswerPhase(Integer ansSq);
-
-	/**
-	 * 일대일문의답변문구 조회
-	 * @param ansPhase - 답변문구 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	AnswerPhase getOneToOneAnswerPhase(AnswerPhase ansPhase);
-
-}
+package com.style24.core.biz.dao;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.AnswerPhase;
+
+/**
+ * 답변문구 Dao
+ * 
+ * @author gagamel
+ * @since 2020. 10. 29
+ */
+@ShopDs
+public interface TscAnswerPhaseDao {
+
+	/**
+	 * 답변문구 조회
+	 * @param ansSq - 답변일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	AnswerPhase getAnswerPhase(Integer ansSq);
+
+	/**
+	 * 문의답변문구 조회
+	 * @param ansPhase - 답변문구 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	AnswerPhase getQnaAnswerPhase(AnswerPhase ansPhase);
+
+}

+ 46 - 46
style24.core/src/main/java/com/style24/core/biz/service/TscAnswerPhaseService.java

@@ -1,46 +1,46 @@
-package com.style24.core.biz.service;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import com.style24.core.biz.dao.TscAnswerPhaseDao;
-import com.style24.persistence.domain.AnswerPhase;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 답변문구 Service
- *
- * @author gagamel
- * @since 2020. 10. 29
- */
-@Service
-@Slf4j
-public class TscAnswerPhaseService {
-
-	@Autowired
-	private TscAnswerPhaseDao ansPhaseDao;
-
-	/**
-	 * 답변문구 조회
-	 * @param ansSq - 답변일련번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	public AnswerPhase getAnswerPhase(Integer ansSq) {
-		return ansPhaseDao.getAnswerPhase(ansSq);
-	}
-
-	/**
-	 * 일대일문의 답변 템플릿 조회
-	 * @param ansPhase - 답변문구 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	public AnswerPhase getOneToOneAnswerPhase(AnswerPhase ansPhase) {
-		return ansPhaseDao.getOneToOneAnswerPhase(ansPhase);
-	}
-
-}
+package com.style24.core.biz.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.core.biz.dao.TscAnswerPhaseDao;
+import com.style24.persistence.domain.AnswerPhase;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 답변문구 Service
+ *
+ * @author gagamel
+ * @since 2020. 10. 29
+ */
+@Service
+@Slf4j
+public class TscAnswerPhaseService {
+
+	@Autowired
+	private TscAnswerPhaseDao ansPhaseDao;
+
+	/**
+	 * 답변문구 조회
+	 * @param ansSq - 답변일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	public AnswerPhase getAnswerPhase(Integer ansSq) {
+		return ansPhaseDao.getAnswerPhase(ansSq);
+	}
+
+	/**
+	 * 문의용 답변문구 조회
+	 * @param ansPhase - 답변문구 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	public AnswerPhase getQnaAnswerPhase(AnswerPhase ansPhase) {
+		return ansPhaseDao.getQnaAnswerPhase(ansPhase);
+	}
+
+}

+ 26 - 26
style24.core/src/main/java/com/style24/persistence/mybatis/shop/TscAnswerPhase.xml

@@ -1,27 +1,27 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.style24.admin.biz.dao.TsaAnswerPhaseDao">
-
-	<!-- 답변문구 조회 -->
-	<select id="getAnswerPhase" parameterType="Integer" resultType="AnswerPhase">
-		/* TsaAnswerPhase.getAnswerPhase */
-		 SELECT ANS_TITLE   --답변제목
-		      , ANS_CONTENT --답변내용
-		FROM    TB_ANS_PHASE
-		WHERE   ANS_SQ = #{ansSq}
-		AND     USE_YN = 'Y'
-	</select>
-
-	<!-- 일대일문의 답변 템플릿 조회 -->
-	<select id="getOneToOneAnswerPhase" parameterType="AnswerPhase" resultType="AnswerPhase">
-		/* TsaAnswerPhase.getOneToOneAnswerPhase */
-		SELECT ANS_SQ      --답변일련번호
-		     , ANS_TITLE   --답변제목
-		     , ANS_CONTENT --답변내용
-		FROM   TB_ANS_PHASE
-		WHERE  ANS_SQ = #{ansSq}
-		AND    ANS_CLSF = #{ansClsf}
-		AND    USE_YN = 'Y'
-	</select>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaAnswerPhaseDao">
+
+	<!-- 답변문구 조회 -->
+	<select id="getAnswerPhase" parameterType="Integer" resultType="AnswerPhase">
+		/* TsaAnswerPhase.getAnswerPhase */
+		 SELECT ANS_TITLE   --답변제목
+		      , ANS_CONTENT --답변내용
+		FROM    TB_ANS_PHASE
+		WHERE   ANS_SQ = #{ansSq}
+		AND     USE_YN = 'Y'
+	</select>
+
+	<!-- 문의용 답변문구 조회 -->
+	<select id="getQnaAnswerPhase" parameterType="AnswerPhase" resultType="AnswerPhase">
+		/* TsaAnswerPhase.getQnaAnswerPhase */
+		SELECT ANS_SQ      --답변일련번호
+		     , ANS_TITLE   --답변제목
+		     , ANS_CONTENT --답변내용
+		FROM   TB_ANS_PHASE
+		WHERE  ANS_SQ = #{ansSq}
+		AND    ANS_CLSF = #{ansClsf}
+		AND    USE_YN = 'Y'
+	</select>
+
 </mapper>

+ 66 - 0
style24.scm/src/main/java/com/style24/persistence/domain/Counsel.java

@@ -0,0 +1,66 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상담(상품문의) Domain
+ *
+ * @author gagamel
+ * @since 2020. 12. 28
+ */
+@SuppressWarnings("serial")
+@Data
+public class Counsel extends TscBaseDomain {
+
+	private Integer counselSq;		// 상담일련번호
+	private String counselType;		// 상담유형(C-1:1문의, G-상품문의)
+	private String siteCd;			// 사이트코드(공통코드G000)
+	private String siteNm;			// 사이트명
+	private String counselClsf;		// 상담분류(공통코드G059)
+	private String counselClsfNm;	// 상담분류명
+	private String counselDclsf;	// 상담분류상세(공통코드G591~G599)
+	private String counselDclsfNm;	// 상담분류상세명
+	private Integer custNo;			// 고객번호
+	private String custId;			// 고객ID
+	private String custNm;			// 고객명
+	private String cellPhnno;		// 휴대전화번호
+	private String smsReqYn;		// SMS(알림톡)요청여부
+	private String smsSendYn;		// SMS(알림톡)발송여부
+	private String email;			// 이메일
+//	private String emailReqYn;		// 이메일요청여부
+//	private String emailSendYn;		// 이메일발송여부
+	private String relGoodsCd;		// 관련상품코드(상품문의에서만 사용)
+	private String goodsNm;			// 상품명(상품문의에서만 사용)
+	private String selfGoodsYn;		// 자사상품여부(상품문의에서만 사용)
+	private String questTitle;		// 문의제목
+	private String questContent;	// 문의내용
+	private String questDt;			// 문의일시
+	private String ansStat;			// 답변상태(공통코드G060)
+	private String ansStatNm;		// 답변상태명
+	private String ansTransYn;		// 답변의뢰여부(상품문의에서만 사용)
+	private String ansCompCd;		// 답변업체코드(상품문의에서만 사용)
+	private String ansCompNm;		// 답변업체명(상품문의에서만 사용)
+	private Integer ansTransNo;		// 답변의뢰자번호(상품문의에서만 사용)
+	private String ansTransNm;		// 답변의뢰자명(상품문의에서만 사용)
+	private String ansTransDt;		// 답변의뢰일시(상품문의에서만 사용)
+	private String ansTitle;		// 답변제목
+	private String ansContent;		// 답변내용
+	private Integer ansNo;			// 답변자번호
+	private String ansNm;			// 답변자명
+	private String ansDt;			// 답변일시
+	private String secretYn;		// 비밀글여부(상품문의에서만 사용)
+	private String delYn;			// 삭제여부
+
+	private Integer ansSq;
+	private String ansClsf;
+
+	// 검색조건
+	private String condition;		// 검색어
+	private String custGb;			// 회원구분
+	private String termGb;			// 기간구분
+	private String termStdt;		// 검색시작날짜
+	private String termEddt;		// 검색끝날짜
+
+}

+ 140 - 0
style24.scm/src/main/java/com/style24/persistence/mybatis/shop/TssCounsel.xml

@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.scm.biz.dao.TssCounselDao">
+
+	<!-- 상품문의 목록 -->
+	<select id="getGoodsQnaList" parameterType="Counsel" resultType="Counsel">
+		/* TsaCounsel.getGoodsQnaList */
+		SELECT A.COUNSEL_SQ                                                        /*상담일련번호*/
+		     , A.SITE_CD                                                           /*사이트코드*/
+		     , DATE_FORMAT(A.QUEST_DT,'%Y-%m-%d %H:%i:%S')     AS QUEST_DT         /*문의일시*/
+		     , A.SECRET_YN                                                         /*비밀글여부*/
+		     , A.CUST_NO                                                           /*고객번호*/
+		     , B.CUST_ID                                                           /*고객ID*/
+		     , B.CUST_NM                                                           /*고객명*/
+		     , A.CELL_PHNNO                                                        /*휴대전화번호*/
+		     , A.SMS_REQ_YN                                                        /*SMS요청여부*/
+		     , A.SMS_SEND_YN                                                       /*SMS발송여부*/
+		     , A.EMAIL                                                             /*이메일*/
+		     -- , A.EMAIL_REQ_YN                                                      /*이메일요청여부*/
+		     -- , A.EMAIL_SEND_YN                                                     /*이메일발송여부*/
+		     , A.REL_GOODS_CD                                                      /*관련상품코드*/
+		     , G.GOODS_NM                                                          /*상품명*/
+		     , A.ANS_STAT                                                          /*답변상태*/
+		     , A.ANS_TRANS_YN                                                      /*답변의뢰여부*/
+		     , DATE_FORMAT(A.ANS_TRANS_DT,'%Y-%m-%d %H:%i:%S') AS ANS_TRANS_DT     /*답변의뢰일시*/
+		     , A.ANS_TRANS_NO                                                      /*답변의뢰자번호*/
+		     , C.USER_NM                                       AS ANS_TRANS_NM     /*답변의뢰자명*/
+		     , DATE_FORMAT(A.ANS_DT, '%Y-%m-%d %H:%i:%S')      AS ANS_DT           /*답변일시*/
+		     , A.ANS_NO                                                            /*답변자번호*/
+		     , D.USER_NM                                       AS ANS_NM           /*답변자명*/
+		FROM   TB_COUNSEL A
+		INNER JOIN TB_CUSTOMER B ON A.CUST_NO = B.CUST_NO
+		INNER JOIN TB_GOODS G ON A.REL_GOODS_CD = G.GOODS_CD
+		LEFT OUTER JOIN TB_USER C ON A.ANS_TRANS_NO = C.USER_NO
+		LEFT OUTER JOIN TB_USER D ON A.ANS_NO = D.USER_NO
+		WHERE  COUNSEL_TYPE = 'G' /*상담유형(상품문의)*/
+		<if test="siteCd != null and siteCd != ''">
+		AND    A.SITE_CD = #{siteCd}
+		</if>
+		<if test="counselClsf != null and counselClsf != ''">
+		AND    A.COUNSEL_CLSF = #{counselClsf}
+		</if>
+		<if test="counselDclsf != null and counselDclsf != ''">
+		AND    A.COUNSEL_DCLSF = #{counselDclsf}
+		</if>
+		<if test="delYn != null and delYn != ''">
+		AND    A.DEL_YN = #{delYn}
+		</if>
+		<if test="condition != null and condition != ''">
+		    <if test="custGb == 'custId'">
+		AND    B.CUST_ID LIKE #{condition}||'%'
+		    </if>
+		    <if test="custGb == 'custNm'">
+		AND    B.CUST_NM LIKE #{condition}||'%'
+		    </if>
+		    <if test="custGb == 'email'">
+		AND    A.EMAIL LIKE #{condition}||'%'
+		    </if>
+		</if>
+		<if test="termStdt != null and termStdt != '' and termEddt != null and termEddt != ''">
+		    <if test="termGb == 'regDt'">
+		AND    A.QUEST_DT <![CDATA[>=]]> STR_TO_DATE(#{termStdt},'%Y-%m-%d')
+		AND    A.QUEST_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{termEddt},'%Y-%m-%d'),INTERVAL 1 DAY)
+		    </if>
+		    <if test="termGb == 'ansDt'">
+		AND    A.ANS_DT <![CDATA[>=]]> STR_TO_DATE(#{termStdt},'%Y-%m-%d')
+		AND    A.ANS_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{termEddt},'%Y-%m-%d'),INTERVAL 1 DAY)
+		    </if>
+		</if>
+		AND    A.ANS_COMP_CD = #{ansCompCd}
+		AND    A.ANS_TRANS_YN = 'Y' /*답변의뢰*/
+		<if test="ansStat != null and ansStat != ''">
+		AND    A.ANS_STAT = #{ansStat}
+		</if>
+		ORDER  BY A.QUEST_DT DESC
+	</select>
+	
+	<!-- 상품문의 상세 -->
+	<select id="getGoodsQna" parameterType="Counsel" resultType="Counsel">
+		/* TsaCounsel.getGoodsQna */
+		SELECT A.COUNSEL_SQ                                                        /*상담일련번호*/
+		     , FN_GET_CODE_NM('G000',A.SITE_CD)                AS SITE_NM          /*사이트명*/
+		     , A.CUST_NO                                                           /*고객번호*/
+		     , B.CUST_ID                                                           /*고객ID*/
+		     , B.CUST_NM                                                           /*고객명*/
+		     , A.CELL_PHNNO                                                        /*휴대전화번호*/
+		     , A.SMS_REQ_YN                                                        /*SMS요청여부*/
+		     , A.SMS_SEND_YN                                                       /*SMS발송여부*/
+		     , A.EMAIL                                                             /*이메일*/
+		     -- , A.EMAIL_REQ_YN                                                      /*이메일요청여부*/
+		     -- , A.EMAIL_SEND_YN                                                     /*이메일발송여부*/
+		     , A.REL_GOODS_CD                                                      /*관련상품코드*/
+		     , G.GOODS_NM                                                          /*상품명*/
+		     , G.SELF_GOODS_YN                                                     /*자사상품여부*/
+		     , DATE_FORMAT(A.QUEST_DT,'%Y-%m-%d %H:%i:%S')     AS QUEST_DT         /*문의일시*/
+		     , A.SECRET_YN                                                         /*비밀글여부*/
+		     , A.ANS_NO                                                            /*답변자번호*/
+		     , D.USER_NM                                       AS ANS_NM           /*답변자명*/
+		     , DATE_FORMAT(A.ANS_DT,'%Y-%m-%d %H:%i:%S')       AS ANS_DT           /*답변일시*/
+		     , A.QUEST_TITLE                                                       /*질문제목*/
+		     , A.QUEST_CONTENT                                                     /*질문내용*/
+		     , A.ANS_TITLE                                                         /*답변제목*/
+		     , A.ANS_CONTENT                                                       /*답변내용*/
+		     , A.ANS_STAT                                                          /*답변상태코드*/
+		     , FN_GET_CODE_NM('G060',A.ANS_STAT)               AS ANS_STAT_NM      /*답변상태명*/
+		     , A.ANS_TRANS_YN                                                      /*답변의뢰여부*/
+		     , A.ANS_COMP_CD                                                       /*답변업체코드*/
+		     , FN_GET_SUPPLY_COMP_NM(A.ANS_COMP_CD)            AS ANS_COMP_NM      /*답변업체명*/
+		     , A.ANS_TRANS_NO                                                      /*답변의뢰자번호*/
+		     , C.USER_NM                                       AS ANS_TRANS_NM     /*답변의뢰자명*/
+		     , DATE_FORMAT(A.ANS_TRANS_DT,'%Y-%m-%d %H:%i:%S') AS ANS_TRANS_DT     /*답변의뢰일시*/
+		FROM   TB_COUNSEL A
+		INNER JOIN TB_CUSTOMER B ON A.CUST_NO = B.CUST_NO
+		INNER JOIN TB_GOODS G ON A.REL_GOODS_CD = G.GOODS_CD
+		LEFT OUTER JOIN TB_USER C ON A.ANS_TRANS_NO = C.USER_NO
+		LEFT OUTER JOIN TB_USER D ON A.ANS_NO = D.USER_NO
+		WHERE  A.COUNSEL_SQ = #{counselSq}
+		AND    A.COUNSEL_TYPE = 'G' /*상담유형(상품문의)*/
+		AND    A.ANS_COMP_CD = #{ansCompCd}
+		AND    A.ANS_TRANS_YN = 'Y' /*답변의뢰*/
+	</select>
+
+	<!--상품문의 답변 저장 -->
+	<update id="updateGoodsQnaAnswer" parameterType="Counsel">
+		/* TssCounsel.updateGoodsQnaAnswer */
+		UPDATE TB_COUNSEL
+		SET    SMS_SEND_YN = SMS_REQ_YN /*SMS답변수신 값에 따라 SMS를 먼저 발송함으로 SMS답변수신 값과 동일하게 처리*/
+		     -- , EMAIL_SEND_YN = EMAIL_REQ_YN /*이메일답변수신 값에 따라 이메일을 먼저 발송함으로 이메일답변수신 값과 동일하게 처리*/
+		     , ANS_TITLE = #{ansTitle}
+		     , ANS_CONTENT = #{ansContent}
+		     , ANS_STAT = 'G060_20' /*답변완료*/
+		     , ANS_NO = #{ansNo}
+		     , ANS_DT = NOW()
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  COUNSEL_SQ = #{counselSq}
+		AND    ANS_COMP_CD = #{ansCompCd}
+	</update>
+
+</mapper>

+ 5 - 5
style24.scm/src/main/java/com/style24/persistence/mybatis/shop/TssRenderer.xml

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.style24.scm.biz.dao.TssRendererDao">
 
-<!-- 공급업체 목록 -->
+	<!-- 공급업체 목록 -->
 	<select id="getSupplyCompanyList" parameterType="SupplyCompany" resultType="CommonCode">
 		/* TssRenderer.getSupplyCompanyList */
 		SELECT SUPPLY_COMP_CD  AS CD
@@ -316,12 +316,12 @@
 		FROM   TB_SELL_STORE
 	</select>
 
-	<!-- 기본답변문구 제목 목록 -->
-	<select id="getBasicAnsTitleList" parameterType="String" resultType="CommonCode">
-		/* TssRenderer.getBasicAnsTitleList */
+	<!-- 문의용 답변문구 목록 -->
+	<select id="getQnaAnswerPhaseList" parameterType="String" resultType="CommonCode">
+		/* TsaRenderer.getQnaAnswerPhaseList */
 		SELECT ANS_SQ     AS CD
 		     , ANS_TITLE  AS CD_NM
-		FROM   TB_BASIC_ANS
+		FROM   TB_ANS_PHASE
 		WHERE  ANS_CLSF = #{ansClsf}
 		AND    USE_YN = 'Y'
 	</select>

+ 43 - 0
style24.scm/src/main/java/com/style24/scm/biz/dao/TssCounselDao.java

@@ -0,0 +1,43 @@
+package com.style24.scm.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Counsel;
+
+/**
+ * 상담문의 Dao
+ * 
+ * @author gagamel
+ * @since 2020. 12. 28
+ */
+@ShopDs
+public interface TssCounselDao {
+
+	/**
+	 * 상품문의 목록
+	 * @param counsel -상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 28
+	 */
+	Collection<Counsel> getGoodsQnaList(Counsel counsel);
+
+	/**
+	 * 상품문의 상세
+	 * @param counsel - 상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 28
+	 */
+	Counsel getGoodsQna(Counsel counsel);
+
+	/**
+	 * 상품문의 답변 저장
+	 * @param counsel - 상담정보
+	 * @author gagamel
+	 * @since 2020. 12. 28
+	 */
+	void updateGoodsQnaAnswer(Counsel counsel);
+
+}

+ 10 - 10
style24.scm/src/main/java/com/style24/scm/biz/dao/TssRendererDao.java

@@ -184,16 +184,16 @@ public interface TssRendererDao {
 //	 * @since 2020. 03. 19
 //	 */
 //	Collection<CommonCode> getSellStoreList();
-//
-//	/**
-//	 * 기본답변문구 제목 조회
-//	 * @param ansClsf
-//	 * @return
-//	 * @author yujung
-//	 * @since 2020. 04. 02
-//	 */
-//	Collection<CommonCode> getBasicAnsTitleList(String ansClsf);
-//
+
+	/**
+	 * 문의용 답변문구 목록
+	 * @param ansClsf - 답변종류
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	Collection<CommonCode> getQnaAnswerPhaseList(String ansClsf);
+
 //	/**
 //	 * 제휴링크 목록
 //	 * @param afChannel - 제휴채널

+ 66 - 0
style24.scm/src/main/java/com/style24/scm/biz/service/TssCounselService.java

@@ -0,0 +1,66 @@
+package com.style24.scm.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.persistence.domain.Counsel;
+import com.style24.scm.biz.dao.TssCounselDao;
+import com.style24.scm.support.security.session.TssSession;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 상품문의 Service
+ *
+ * @author gagamel
+ * @since 2020. 12. 28
+ */
+@Service
+@Slf4j
+public class TssCounselService {
+
+	@Autowired
+	private TssCounselDao counselDao;
+
+	/**
+	 * 상품문의 목록
+	 * @param counsel -상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 28
+	 */
+	public Collection<Counsel> getGoodsQnaList(Counsel counsel) {
+		counsel.setAnsCompCd(TssSession.getInfo().getSupplyCompCd());
+		return counselDao.getGoodsQnaList(counsel);
+	}
+
+	/**
+	 * 상품문의 상세
+	 * @param counselSq - 상담일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 28
+	 */
+	public Counsel getGoodsQna(Integer counselSq) {
+		Counsel counsel = new Counsel();
+		counsel.setCounselSq(counselSq);
+		counsel.setAnsCompCd(TssSession.getInfo().getSupplyCompCd());
+		return counselDao.getGoodsQna(counsel);
+	}
+
+	/**
+	 * 상품문의 답변 저장
+	 * @param counsel - 상담정보
+	 * @author gagamel
+	 * @since 2020. 12. 28
+	 */
+	@Transactional("shopTxnManager")
+	public void updateGoodsQnaAnswer(Counsel counsel) {
+		counsel.setAnsCompCd(TssSession.getInfo().getSupplyCompCd());
+		counselDao.updateGoodsQnaAnswer(counsel);
+	}
+
+}

+ 13 - 14
style24.scm/src/main/java/com/style24/scm/biz/service/TssRendererService.java

@@ -308,7 +308,6 @@ public class TssRendererService {
 		return rendererDao.getAuthBrandList(userNo);
 	}
 
-
 //
 //	//	/**
 //	//	 * 정보고시 목록
@@ -439,18 +438,18 @@ public class TssRendererService {
 //	public Collection<CommonCode> getSellStoreList() {
 //		return rendererDao.getSellStoreList();
 //	}
-//
-//	/**
-//	 * 기본답변문구 제목 조회
-//	 * @param
-//	 * @return CommonCode
-//	 * @author yujing
-//	 * @since 2020. 04. 02
-//	 */
-//	public Collection<CommonCode> getBasicAnsTitleList(String ansClsf) {
-//		return rendererDao.getBasicAnsTitleList(ansClsf);
-//	}
-//
+
+	/**
+	 * 문의용 답변문구 목록
+	 * @param ansClsf - 답변종류
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	public Collection<CommonCode> getQnaAnswerPhaseList(String ansClsf) {
+		return rendererDao.getQnaAnswerPhaseList(ansClsf);
+	}
+
 //	/**
 //	 * 제휴링크 목록
 //	 * @param afChannel - 제휴채널
@@ -482,6 +481,6 @@ public class TssRendererService {
 	 * @since 2020. 11. 24
 	 */
 	public Collection<CommonCode> getSupplyDeliveryFeePolicyList(String supplyCompCd) {
-		 return rendererDao.getSupplyDeliveryFeePolicyList(supplyCompCd);
+		return rendererDao.getSupplyDeliveryFeePolicyList(supplyCompCd);
 	}
 }

+ 155 - 0
style24.scm/src/main/java/com/style24/scm/biz/web/TssCustomerController.java

@@ -0,0 +1,155 @@
+package com.style24.scm.biz.web;
+
+import java.util.Collection;
+
+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.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.TscAnswerPhaseService;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.AnswerPhase;
+import com.style24.persistence.domain.Counsel;
+import com.style24.scm.biz.service.TssCounselService;
+import com.style24.scm.biz.service.TssRendererService;
+import com.style24.scm.support.controller.TssBaseController;
+import com.style24.scm.support.security.session.TssSession;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.rest.server.GagaResponse;
+
+/**
+ * 고객 Controller
+ *
+ * @author gagamel
+ * @since 2020. 12. 28
+ */
+@Controller
+@RequestMapping("/customer")
+@Slf4j
+public class TssCustomerController extends TssBaseController {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TssCounselService counselService;
+
+	@Autowired
+	private TssRendererService rendererService;
+
+	@Autowired
+	private TscAnswerPhaseService ansPhaseService;
+
+	/**
+	* 상품문의관리 화면
+	* @return
+	* @author gagamel
+	* @since 2020. 12. 28
+	*/
+	@GetMapping("/goods/qna/form")
+	public ModelAndView goodsQnaForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트 목록
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+
+		// 상담상태 목록
+		mav.addObject("ansStatList", rendererService.getAvailCommonCodeList("G060"));
+
+		mav.setViewName("customer/GoodsQnaForm");
+
+		return mav;
+	}
+
+	/**
+	 * 상품문의 목록
+	 * @param counsel - 상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 28
+	 */
+	@PostMapping("/goods/qna/list")
+	@ResponseBody
+	public Collection<Counsel> getGoodsQnaList(@RequestBody Counsel counsel) {
+		return counselService.getGoodsQnaList(counsel);
+	}
+
+	/**
+	 * 상품문의상세 화면
+	 * @param counselSq -상담일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 28
+	 */
+	@GetMapping("/goods/qna/detail/form/{counselSq}")
+	public ModelAndView goodsQnaDetailForm(@PathVariable Integer counselSq) {
+		ModelAndView mav = new ModelAndView();
+
+		// 상품문의 상세
+		mav.addObject("counselInfo", counselService.getGoodsQna(counselSq));
+
+		// 문의용 답변문구
+		mav.addObject("ansPhaseList", rendererService.getQnaAnswerPhaseList("G061_20"));
+
+		mav.setViewName("customer/GoodsQnaDetailForm");
+
+		return mav;
+	}
+
+	/**
+	 * 문의용 답변문구 조회
+	 * @param ansSq - 답변일련번호
+	 * @param ansClsf - 답변종류
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 28
+	 */
+	@GetMapping("/qna/answerphase/{ansSq}/{ansClsf}")
+	@ResponseBody
+	public AnswerPhase getQnaAnswerPhase(@PathVariable Integer ansSq, @PathVariable String ansClsf) {
+		AnswerPhase ansPhase = new AnswerPhase();
+		ansPhase.setAnsSq(ansSq);
+		ansPhase.setAnsClsf(ansClsf);
+		return ansPhaseService.getQnaAnswerPhase(ansPhase);
+	}
+
+	/**
+	 * 문의 답변 저장
+	 * @param counsel -상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 28
+	 */
+	@PostMapping("/qna/answer/save")
+	@ResponseBody
+	public GagaResponse saveQnaAnswer(@RequestBody Counsel counsel) {
+		counsel.setAnsNo(TssSession.getInfo().getUserNo());
+		counsel.setUpdNo(TssSession.getInfo().getUserNo());
+
+		counselService.updateGoodsQnaAnswer(counsel);
+
+		// 상품문의상세 조회
+		Counsel tCounsel = counselService.getGoodsQna(counsel.getCounselSq());
+
+//		// TODO. 고객이 SMS답변수신을 요청했을 때
+//		if (counsel.getSmsReqYn().equals("Y")) {
+//			try {
+//				// 답변완료안내 카카오알림톡 발송
+//				kakaoService.sendQnaAnswer(tCounsel);
+//			} catch (Exception e) {
+//				// Do nothing
+//			}
+//		}
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+}

+ 236 - 0
style24.scm/src/main/webapp/WEB-INF/views/customer/GoodsQnaDetailForm.html

@@ -0,0 +1,236 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsQnaDetailForm.html
+ * @desc    : 상품문의 상세 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.12.25   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1200" id="popupGoodsQnaDetail">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong>상품문의 상세</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupGoodsQnaDetail');"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+		
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<form id="qnaDetailForm" name="qnaDetailForm" action="#" th:action="@{'/customer/qna/answer/save'}" th:method="post" th:object="${counselInfo}">
+				<input type="hidden" name="counselSq" th:value="*{counselSq}"/>
+				<input type="hidden" name="smsReqYn" th:value="*{smsReqYn}"/>
+				
+				<h4>상담정보</h4>
+				<table class="tableStyle" aria-describedby="상담정보">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:10%;"/>
+						<col style="width:8%;"/>
+						<col style="width:12%;"/>
+						<col/>
+						<col style="width:22%;"/>
+						<col style="width:22%;"/>
+					</colgroup>
+					<thead>
+						<tr>
+							<th>상담일련번호</th>
+							<th>사이트</th>
+							<th>상담분류</th>
+							<th>문의일시</th>
+							<th>고객정보</th>
+							<th>답변의뢰</th>
+							<th>답변상태</th>
+						</tr>
+					</thead>
+					<tbody>
+						<tr>
+							<td th:text="*{counselSq}"></td>
+							<td th:text="*{siteNm}"></td>
+							<td>상품문의</td>
+							<td th:text="*{questDt}"></td>
+							<td th:utext="*{custNm + ' / ' + cellPhnno + '<br/>' + email}"></td>
+							<td th:utext="*{ansTransYn == 'Y' ? ansTransDt + '<br/>' + ansCompNm : ''}"></td>
+							<td th:utext="*{ansStat == 'G060_20' ? ansStatNm + ' / ' + ansDt + '<br/>' + ansNm : ansStatNm}"></td>
+						</tr>
+					</tbody>
+				</table>
+				
+				<h4>고객문의</h4>
+				<table class="frmStyle" aria-describedby="고객문의">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col/>
+						<col style="width:10%;"/>
+						<col style="width:30%;"/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>상품코드</th>
+							<td colspan="3" th:text="*{relGoodsCd}"></td>
+							<th rowspan="3">상품이미지</th>
+							<td rowspan="3" class="userImg" id="onetooneImg"></td>
+						</tr>
+						<tr>
+							<th>상품명</th>
+							<td colspan="3" th:text="*{goodsNm}"></td>
+						</tr>
+						<tr>
+							<th>비밀글여부</th>
+							<td th:text="*{secretYn == 'Y' ? 'Yes' : 'No'}"></td>
+							<th>SMS답변요청</th>
+							<td th:text="*{smsReqYn == 'Y' ? '수신' : '미수신'}"></td>
+						</tr>
+						<tr>
+							<th>문의 내용</th>
+							<td colspan="5">
+								<textarea class="textareaR4" style="resize: none;" name="questContent" th:text="*{questContent}" disabled="disabled"></textarea>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+				
+				<h4>답변등록</h4>
+				<table class="frmStyle" aria-describedby="답변등록">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:90%;"/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>답변 템플릿</th>
+							<td>
+								<select name="ansSq">
+									<option value="">[선택]</option>
+									<option th:if="${ansPhaseList}" th:each="oneData, statue : ${ansPhaseList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<th>답변 제목<i class="required" title="필수" aria-hidden="true"></i></th>
+							<td>
+								<input type="text" class="" name="ansTitle" th:value="*{ansTitle}" required="required" data-valid-name="답변 제목"/>
+							</td>
+						</tr>
+						<tr>
+							<th>
+								답변 내용<i class="required" title="필수" aria-hidden="true"></i>
+								<br/>
+								<span id="dpLocAnsContent">0</span>/4,000Byte
+							</th>
+							<td>
+								<textarea class="textareaR4" style="resize: none;" name="ansContent" th:text="*{ansContent}" onkeyup="cfnGetTextLength(this, 4000, $('#dpLocAnsContent'));" required="required" data-valid-name="답변 내용"></textarea>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+			</form>
+		</div>
+		<!-- //CONTENT -->
+
+		<!-- 버튼 배치 영역 -->
+		<ul class="panelBar">
+			<li class="right">
+				<button type="button" class="btn btn-info btn-lg" id="btnSaveAnswer" th:if="${counselInfo.ansStat == 'G060_10'}">답변저장</button>
+			</li>
+		</ul>
+		<!-- //버튼 배치 영역 -->
+	</div>
+</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	// 답변의뢰
+	$('#btnTransferAnswer').on('click', function() {
+		if (gagajf.isNull($('#ansCompCd').val())) {
+			mcxDialog.alertC("답변의뢰업체를 선택해 주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#ansCompCd').focus();
+				}
+			});
+			return;
+		}
+
+		mcxDialog.confirm("답변을 의뢰하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var params = new Object;
+				params.counselSq = $('input[name=counselSq]').val();
+				params.ansCompCd = $('#ansCompCd').val();
+
+				var jsonData = JSON.stringify(params);
+
+				gagajf.ajaxJsonSubmit('/customer/goods/answer/transfer/save', jsonData, function() {
+					uifnPopupClose('popupGoodsQnaDetail');
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	// 답변 저장
+	$('#btnSaveAnswer').on('click', function() {
+		// 입력 값 체크
+		if (!gagajf.validation('#qnaDetailForm'))
+			return false;
+		
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxFormSubmit($('#qnaDetailForm').prop('action'), '#qnaDetailForm', function() {
+					uifnPopupClose('popupGoodsQnaDetail');
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	// 답변템플릿 선택 시
+	$('select[name=ansSq]').on('change', function() {
+		var ansSq = $(this).val();
+
+		if (!gagajf.isNull(ansSq)) {
+			var actionUrl = '/customer/qna/answerphase/' + ansSq + '/20';
+			$.get(actionUrl
+				, function(data) {
+					if (!gagajf.isNull(data.ansSq)) {
+						$('input[name=ansTitle]').val(data.ansTitle);
+						$('textarea[name=ansContent]').val(data.ansContent);
+						cfnGetTextLength($('textarea[name=ansContent]'), 4000, $('#dpLocAnsContent'));
+					}
+				});
+		} else {
+			// 답변 내용 초기화
+			$('input[name=ansTitle]').val('');
+			$('textarea[name=ansContent]').val('');
+			cfnGetTextLength($('textarea[name=ansContent]'), 4000, $('#dpLocAnsContent'));
+		}
+	});
+	
+	$(document).ready(function() {
+// 		var counsel = [[${counsel}]];
+
+// 		if (!gagajf.isNull(counselInfo.sysFileNm)) {
+// 			var imgTag = '<img style="height: 100px;" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \'' + _imgUrl + '/counsel/' + counselInfo.sysFileNm + '\')" src="' + _imgUrl + '/counsel/' + counselInfo.sysFileNm + '">';
+// 			$('#onetooneImg').append(imgTag);
+// 		}
+
+		cfnGetTextLength($('textarea[name=ansContent]'), 4000, $('#dpLocAnsContent'));
+	});
+/*]]>*/
+</script>
+
+</html>

+ 202 - 0
style24.scm/src/main/webapp/WEB-INF/views/customer/GoodsQnaForm.html

@@ -0,0 +1,202 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsQnaForm.html
+ * @desc    : 상품문의관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.12.28   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/customer/goods/qna/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:12%;"/>
+						<col style="width:10%;"/>
+						<col style="width:12%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>사이트</th>
+						<td>
+							<select name="siteCd">
+								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+							</select>
+						</td>
+						<th>답변상태</th>
+						<td>
+							<select name="ansStat">
+								<option value="">[전체]</option>
+								<option th:if="${ansStatList}" th:each="oneData, status : ${ansStatList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>회원검색</th>
+						<td>
+							<select name="custGb">
+								<option value="">[선택]</option>
+								<option value="custId">회원ID</option>
+								<option value="custNm">회원명</option>
+								<option value="email">이메일</option>
+							</select>
+							<input type="text" name="condition" class="w200" maxlength="100"/>
+						</td>
+					</tr>
+<!-- 					<tr> -->
+<!-- 						<th>답변자</th> -->
+<!-- 						<td><input type="text" name="ansId" placeholder="" class="w300" maxlength="20"/></td> -->
+<!-- 						<th>의뢰자</th> -->
+<!-- 						<td colspan="3"><input type="text" name="ansTransId" class="w300" placeholder="" maxlength="20"/></td> -->
+<!-- 					</tr> -->
+					<tr>
+						<th>기간<i class="required" title="필수"></i></th>
+						<td colspan="5">
+							<select name="termGb">
+								<option value="regDt">문의일</option>
+								<option value="ansDt">답변일</option>
+							</select>
+							<span id="terms"></span>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- //검색조건 영역 -->
+		
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<div id="gridList" style="width: 100%; height: 570px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let siteList = gagajf.convertToArray([[${siteList}]]); // 사이트
+	let ansStatList = gagajf.convertToArray([[${ansStatList}]]); // 답변상태
+	
+	// specify the columns
+	let columnDefs = [
+		{
+			headerName: "상담일련번호", field: "counselSq", width: 100, cellClass: 'text-center',
+			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
+		{
+			headerName: "사이트", field: "siteCd", width: 100, cellClass: 'text-center',
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(siteList, params.value); }
+		},
+		{
+			headerName: "문의일시", field: "questDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{
+			headerName: "상품코드", field: "relGoodsCd", width: 100, cellClass: 'text-center',
+			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
+		{headerName: "상품명", field: "goodsNm", width: 300},
+		{
+			headerName: "비밀글여부", field: "secretYn", width: 100, cellClass: 'text-center',
+			cellRenderer: function(params) { return params.value == 'Y' ? 'Yes' : 'No'; }
+		},
+		{headerName: "고객번호", field: "custNo", width: 100, cellClass: 'text-center', hide: true},
+		{headerName: "고객ID", field: "custId", width: 100, cellClass: 'text-center', hide: true},
+		{
+			headerName: "고객명", field: "custNm", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '(' + params.data.custId + ')</a>'; }
+		},
+		{headerName: "휴대전화번호", field: "cellPhnno", width: 120, cellClass: 'text-center'},
+		{
+			headerName: "SMS답변요청", field: "smsReqYn", width: 120, cellClass: 'text-center',
+			cellRenderer: function(params) { return params.value == 'Y' ? 'Yes' : 'No'; }
+		},
+		{
+			headerName: "SMS답변발송", field: "smsSendYn", width: 120, cellClass: 'text-center',
+			cellRenderer: function(params) { return params.value == 'Y' ? 'Yes' : 'No'; }
+		},
+		{headerName: "이메일", field: "email", width: 200},
+// 		{
+// 			headerName: "이메일답변요청", field: "emailReqYn", width: 120, cellClass: 'text-center',
+// 			cellRenderer: function(params) { return params.value == 'Y' ? 'Yes' : 'No'; }
+// 		},
+// 		{
+// 			headerName: "이메일답변발송", field: "emailSendYn", width: 120, cellClass: 'text-center',
+// 			cellRenderer: function(params) { return params.value == 'Y' ? 'Yes' : 'No'; }
+// 		},
+		{
+			headerName: "답변상태", field: "ansStat", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.lookupValue(ansStatList, params.value); }
+		},
+		{headerName: "답변자번호", field: "ansNo", width: 100, cellClass: 'text-center', hide: true},
+		{headerName: "답변자명", field: "ansNm", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "답변일시", field: "ansDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{
+			headerName: "답변의뢰일시", field: "ansTransDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{headerName: "답변의뢰자번호", field: "ansTransNo", width: 100, cellClass: 'text-center', hide: true},
+		{headerName: "답변의뢰자명", field: "ansTransNm", width: 100, cellClass: 'text-center'}
+	];
+	
+	// Get GridOptions
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	
+	// 셀 클릭 이벤트
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field == 'counselSq') {
+			// 상품문의 상세
+			cfnOpenGoodsQnaDetailPopup(event.data.counselSq);
+		}
+	}
+	
+	// 조회
+	$('#btnSearch').on('click', function() {
+		// 입력 값 체크
+		if (!gagajf.validation('#searchForm'))
+			return false;
+		
+		// Fetch data
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+	
+	$(document).ready(function() {
+		// 공통 달력 생성
+		cfnCreateCalendar('#terms', 'termStdt', 'termEddt', true);
+		$('.btnToday').trigger('click');
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 5 - 17
style24.scm/src/main/webapp/ux/js/admin.popup.js

@@ -436,25 +436,13 @@ var cfnGrantPointPopup = function(){
 /**
  * @type   : function
  * @access : public
- * @desc   : 일대일문의상세팝업
- * @since  : 2020/02/21
- * @author : 이대형
- */
-var cfnOpenOneToOneAskDetailPopup = function(counselSq) {
-	var actionUrl = '/customer/onetoone/ask/detail/form/' + counselSq;
-	cfnOpenModalPopup(actionUrl, 'popupOneToOneAskDetail');
-}
-
-/**
- * @type   : function
- * @access : public
- * @desc   : 상품문의상세팝업
- * @since  : 2020/08/14
- * @author : 이대형
+ * @desc   : 상품문의 상세 팝업
+ * @author : gagamel
+ * @since  : 2020/12/24
  */
 var cfnOpenGoodsQnaDetailPopup = function(counselSq) {
-	var actionUrl = '/customer/goodsQna/detail/form/' + counselSq;
-	cfnOpenModalPopup(actionUrl, 'popupGoodsQnaPopup');
+	var actionUrl = '/customer/goods/qna/detail/form/' + counselSq;
+	cfnOpenModalPopup(actionUrl, 'popupGoodsQnaDetail');
 }
 
 /**