Ver Fonte

1:1문의관리, 상품문의관리 추가

gagamel há 5 anos atrás
pai
commit
4a6531d713

+ 43 - 34
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaAnswerPhaseDao.java

@@ -1,34 +1,43 @@
-package com.style24.admin.biz.dao;
-
-import java.util.Collection;
-
-import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.AnswerPhase;
-
-/**
- * 답변문구 Dao
- * 
- * @author gagamel
- * @since 2020. 10. 29
- */
-@ShopDs
-public interface TsaAnswerPhaseDao {
-
-	/**
-	 * 답변문구 목록
-	 * @param ansPhase - 답변문구 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	Collection<AnswerPhase> getAnswerPhaseList(AnswerPhase ansPhase);
-
-	/**
-	 * 답변문구 등록/수정
-	 * @param ansPhase - 답변문구 정보
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	void saveAnswerPhase(AnswerPhase ansPhase);
-
-}
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.AnswerPhase;
+
+/**
+ * 답변문구 Dao
+ * 
+ * @author gagamel
+ * @since 2020. 10. 29
+ */
+@ShopDs
+public interface TsaAnswerPhaseDao {
+
+	/**
+	 * 답변문구 목록
+	 * @param ansPhase - 답변문구 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	Collection<AnswerPhase> getAnswerPhaseList(AnswerPhase ansPhase);
+
+	/**
+	 * 답변문구 등록/수정
+	 * @param ansPhase - 답변문구 정보
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	void saveAnswerPhase(AnswerPhase ansPhase);
+
+	/**
+	 * 1:1문의 답변문구 조회
+	 * @param ansPhase - 답변문구 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	AnswerPhase getOneToOneQnaAnswerPhase(AnswerPhase ansPhase);
+
+}

+ 69 - 0
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaCounselDao.java

@@ -0,0 +1,69 @@
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Counsel;
+
+/**
+ * 상담(1:1문의) Dao
+ * 
+ * @author gagamel
+ * @since 2020. 12. 24
+ */
+@ShopDs
+public interface TsaCounselDao {
+
+	/**
+	 * 1:1문의 목록
+	 * @param counsel -상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	Collection<Counsel> getOneToOneQnaList(Counsel counsel);
+
+	/**
+	 * 1:1문의 상세
+	 * @param counsel - 상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	Counsel getOneToOneQna(Counsel counsel);
+
+	/**
+	 * 문의 답변 저장
+	 * @param counsel - 상담정보
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	void updateQnaAnswer(Counsel counsel);
+
+	/**
+	 * 상품문의 목록
+	 * @param counsel -상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	Collection<Counsel> getGoodsQnaList(Counsel counsel);
+
+	/**
+	 * 상품문의 상세
+	 * @param counsel - 상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	Counsel getGoodsQna(Counsel counsel);
+
+	/**
+	 * 상품문의 답변의뢰 (입점상품인 경우)
+	 * @param counsel - 상담 정보
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	void updateGoodsQnaAnswerTransfer(Counsel counsel);
+
+}

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

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

+ 64 - 53
style24.admin/src/main/java/com/style24/admin/biz/service/TsaAnswerPhaseService.java

@@ -1,53 +1,64 @@
-package com.style24.admin.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.admin.biz.dao.TsaAnswerPhaseDao;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.persistence.domain.AnswerPhase;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 답변문구 Service
- *
- * @author gagamel
- * @since 2020. 10. 29
- */
-@Service
-@Slf4j
-public class TsaAnswerPhaseService {
-
-	@Autowired
-	private TsaAnswerPhaseDao ansPhaseDao;
-
-	/**
-	 * 답변문구 목록
-	 * @param ansPhase - 답변문구 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	public Collection<AnswerPhase> getAnswerPhaseList(AnswerPhase ansPhase) {
-		return ansPhaseDao.getAnswerPhaseList(ansPhase);
-	}
-
-	/**
-	 * 답변문구 등록/수정
-	 * @param ansPhase - 답변문구 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	@Transactional("shopTxnManager")
-	public void saveAnswerPhase(AnswerPhase ansPhase) {
-		ansPhase.setRegNo(TsaSession.getInfo().getUserNo());
-		ansPhase.setUpdNo(TsaSession.getInfo().getUserNo());
-		ansPhaseDao.saveAnswerPhase(ansPhase);
-	}
-
-}
+package com.style24.admin.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.admin.biz.dao.TsaAnswerPhaseDao;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.persistence.domain.AnswerPhase;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 답변문구 Service
+ *
+ * @author gagamel
+ * @since 2020. 10. 29
+ */
+@Service
+@Slf4j
+public class TsaAnswerPhaseService {
+
+	@Autowired
+	private TsaAnswerPhaseDao ansPhaseDao;
+
+	/**
+	 * 답변문구 목록
+	 * @param ansPhase - 답변문구 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	public Collection<AnswerPhase> getAnswerPhaseList(AnswerPhase ansPhase) {
+		return ansPhaseDao.getAnswerPhaseList(ansPhase);
+	}
+
+	/**
+	 * 답변문구 등록/수정
+	 * @param ansPhase - 답변문구 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	@Transactional("shopTxnManager")
+	public void saveAnswerPhase(AnswerPhase ansPhase) {
+		ansPhase.setRegNo(TsaSession.getInfo().getUserNo());
+		ansPhase.setUpdNo(TsaSession.getInfo().getUserNo());
+		ansPhaseDao.saveAnswerPhase(ansPhase);
+	}
+
+	/**
+	 * 1:1문의 답변문구 조회
+	 * @param ansPhase - 답변문구 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	public AnswerPhase getOneToOneQnaAnswerPhase(AnswerPhase ansPhase) {
+		return ansPhaseDao.getOneToOneQnaAnswerPhase(ansPhase);
+	}
+
+}

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

@@ -0,0 +1,102 @@
+package com.style24.admin.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.admin.biz.dao.TsaCounselDao;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.persistence.domain.Counsel;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 상담(1:1문의) Service
+ *
+ * @author gagamel
+ * @since 2020. 12. 24
+ */
+@Service
+@Slf4j
+public class TsaCounselService {
+
+	@Autowired
+	private TsaCounselDao counselDao;
+
+	/**
+	 * 1:1문의 목록
+	 * @param counsel -상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	public Collection<Counsel> getOneToOneQnaList(Counsel counsel) {
+		return counselDao.getOneToOneQnaList(counsel);
+	}
+
+	/**
+	 * 1:1문의 상세
+	 * @param counselSq - 상담일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	public Counsel getOneToOneQna(Integer counselSq) {
+		Counsel counsel = new Counsel();
+		counsel.setCounselSq(counselSq);
+		return counselDao.getOneToOneQna(counsel);
+	}
+
+	/**
+	 * 문의 답변 저장
+	 * @param counsel - 상담정보
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	@Transactional("shopTxnManager")
+	public void updateQnaAnswer(Counsel counsel) {
+		counselDao.updateQnaAnswer(counsel);
+	}
+
+	/**
+	 * 상품문의 목록
+	 * @param counsel -상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	public Collection<Counsel> getGoodsQnaList(Counsel counsel) {
+		counsel.setRoleCd(TsaSession.getInfo().getRoleCd());
+		counsel.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
+		return counselDao.getGoodsQnaList(counsel);
+	}
+
+	/**
+	 * 상품문의 상세
+	 * @param counselSq - 상담일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	public Counsel getGoodsQna(Integer counselSq) {
+		Counsel counsel = new Counsel();
+		counsel.setCounselSq(counselSq);
+		counsel.setRoleCd(TsaSession.getInfo().getRoleCd());
+		counsel.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
+		return counselDao.getOneToOneQna(counsel);
+	}
+
+	/**
+	 * 상품문의 입점업체에 답변의뢰 (입점상품인 경우)
+	 * @param counsel - 상담 정보
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	@Transactional("shopTxnManager")
+	public void updateGoodsQnaAnswerTransfer(Counsel counsel) {
+		counselDao.updateGoodsQnaAnswerTransfer(counsel);
+	}
+
+}

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

@@ -352,7 +352,7 @@ public class TsaRendererService {
 	 * @since 2020. 11. 24
 	 */
 	public Collection<CommonCode> getSupplyDeliveryFeePolicyList(String supplyCompCd) {
-		 return rendererDao.getSupplyDeliveryFeePolicyList(supplyCompCd);
+		return rendererDao.getSupplyDeliveryFeePolicyList(supplyCompCd);
 	}
 
 //	/**
@@ -496,18 +496,18 @@ public class TsaRendererService {
 //	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);
-//	}
-//
+
+	/**
+	 * 1:1문의용 답변문구 목록
+	 * @param ansClsf - 답변종류
+	 * @return CommonCode
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	public Collection<CommonCode> getAnswerPhaseList(String ansClsf) {
+		return rendererDao.getAnswerPhaseList(ansClsf);
+	}
+
 //	/**
 //	 * 제휴링크 목록
 //	 * @param afChannel - 제휴채널

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

@@ -0,0 +1,242 @@
+package com.style24.admin.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.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.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.AnswerPhase;
+import com.style24.persistence.domain.Counsel;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.rest.server.GagaResponse;
+
+/**
+ * 고객 Controller
+ *
+ * @author gagamel
+ * @since 2020. 12. 24
+ */
+@Controller
+@RequestMapping("/customer")
+@Slf4j
+public class TsaCustomerController extends TsaBaseController {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TsaCounselService counselService;
+
+	@Autowired
+	private TsaRendererService rendererService;
+
+	@Autowired
+	private TsaAnswerPhaseService answerPhaseService;
+
+	/**
+	* 1:1문의관리 화면
+	* @return
+	* @author gagamel
+	* @since 2020. 12. 24
+	*/
+	@GetMapping("/onetoone/qna/form")
+	public ModelAndView oneToOneQnaForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트 목록
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+
+		// 상담분류
+		mav.addObject("counselClsfList", rendererService.getCommonCodeList("G059", "Y", new String[] {"G596"}));
+
+		// 상담상태 목록
+		mav.addObject("ansStatList", rendererService.getAvailCommonCodeList("G060"));
+
+		mav.setViewName("customer/OneToOneQnaForm");
+
+		return mav;
+	}
+
+	/**
+	 * 1:1문의 목록
+	 * @param counsel - 상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	@PostMapping("/onetoone/qna/list")
+	@ResponseBody
+	public Collection<Counsel> getOneToOneQnaList(@RequestBody Counsel counsel) {
+		return counselService.getOneToOneQnaList(counsel);
+	}
+
+	/**
+	 * 1:1문의상세 화면
+	 * @param counselSq -상담일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	@GetMapping("/onetoone/qna/detail/form/{counselSq}")
+	public ModelAndView oneToOneQnaDetailForm(@PathVariable Integer counselSq) {
+		ModelAndView mav = new ModelAndView();
+
+		// 1:1문의 상세 정보
+		mav.addObject("counselInfo", counselService.getOneToOneQna(counselSq));
+
+		// 1:1문의용 답변문구
+		mav.addObject("ansPhaseList", rendererService.getAnswerPhaseList("20"));
+
+		mav.setViewName("customer/OneToOneQnaDetailForm");
+
+		return mav;
+	}
+
+	/**
+	 * 1:1문의 답변문구 조회
+	 * @param ansSq - 답변일련번호
+	 * @param ansClsf - 답변종류
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	@GetMapping("/onetoone/qna/answerphase/{ansSq}/{ansClsf}")
+	@ResponseBody
+	public AnswerPhase getOneToOneQnaAnswerPhase(@PathVariable Integer ansSq, @PathVariable String ansClsf) {
+		AnswerPhase ansPhase = new AnswerPhase();
+		ansPhase.setAnsSq(ansSq);
+		ansPhase.setAnsClsf(ansClsf);
+		return answerPhaseService.getOneToOneQnaAnswerPhase(ansPhase);
+	}
+
+	/**
+	 * 문의 답변 저장
+	 * @param counsel -상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	@PostMapping("/qna/answer/save")
+	@ResponseBody
+	public GagaResponse saveQnaAnswer(@RequestBody Counsel counsel) {
+		counsel.setAnsNo(TsaSession.getInfo().getUserNo());
+		counsel.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		counselService.updateQnaAnswer(counsel);
+
+		// 일대일문의상세 조회
+		Counsel tCounsel = counselService.getOneToOneQna(counsel.getCounselSq());
+
+//		try {
+//			// 일대일문의 답변 메일 발송
+//			mailService.sendOneToOneAnswer(tCounsel);
+//		} catch (Exception e) {
+//			// Do nothing
+//		}
+//
+//		try {
+//			// 일대일문의 답변 카카오알림톡 발송
+//			kakaoService.sendOnetoOneAnswer(tCounsel);
+//		} catch (Exception e) {
+//			// Do nothing
+//		}
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	* 상품문의관리 화면
+	* @return
+	* @author gagamel
+	* @since 2020. 12. 24
+	*/
+	@GetMapping("/goods/qna/form")
+	public ModelAndView goodsQnaForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트 목록
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+
+		// 답변의뢰업체 목록
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd(), "N"));
+
+		// 상담상태 목록
+		mav.addObject("ansStatList", rendererService.getAvailCommonCodeList("G060"));
+
+		mav.setViewName("customer/GoodsQnaForm");
+
+		return mav;
+	}
+
+	/**
+	 * 상품문의 목록
+	 * @param counsel - 상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	@PostMapping("/goods/qna/list")
+	@ResponseBody
+	public Collection<Counsel> getGoodsQnaList(@RequestBody Counsel counsel) {
+		return counselService.getGoodsQnaList(counsel);
+	}
+
+	/**
+	 * 상품문의상세 화면
+	 * @param counselSq -상담일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	@GetMapping("/goods/qna/detail/form/{counselSq}")
+	public ModelAndView goodsQnaDetailForm(@PathVariable Integer counselSq) {
+		ModelAndView mav = new ModelAndView();
+
+		// 답변의뢰업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd(), "N"));
+
+		// 문의상세
+		mav.addObject("counsel", counselService.getOneToOneQna(counselSq));
+
+		// 상품문의용 답변문구
+		mav.addObject("ansPhaseList", rendererService.getAnswerPhaseList("20"));
+
+		mav.setViewName("customer/GoodsQnaDetailForm");
+
+		return mav;
+	}
+
+	/**
+	 * 상품문의 입점업체에 답변의뢰 (입점상품일 경우)
+	 * @param counsel -상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	@PostMapping("/goods/qna/answer/transfer/save")
+	@ResponseBody
+	public GagaResponse saveGoodsQnaAnswerTransfer(@RequestBody Counsel counsel) {
+		counsel.setAnsTransNo(TsaSession.getInfo().getUserNo());
+		counsel.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		counselService.updateGoodsQnaAnswerTransfer(counsel);
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+}

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

@@ -0,0 +1,76 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상담(1:1문의) Domain
+ *
+ * @author gagamel
+ * @since 2020. 11. 3
+ */
+@SuppressWarnings("serial")
+@Data
+public class Counsel extends TscBaseDomain {
+
+	private Integer counselSq;		// 상담일련번호
+	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 email;			// 이메일
+	private String emailReqYn;		// 이메일요청여부
+	private String emailSendYn;		// 이메일발송여부
+//	private String relOrdNo;		// 관련주문번호
+	private String relGoodsCd;		// 관련상품코드
+	private String counselType;		// 상담유형(C-1:1문의, G-상품문의)
+	private String goodsNm;			// 상품명
+	private String questTitle;		// 문의제목
+	private String questContent;	// 문의내용
+	private String questDt;			// 문의일시
+	private String orgFileNm1;		// 원본파일명1
+	private String sysFileNm1;		// 시스템파일명1
+	private String orgFileNm2;		// 원본파일명2
+	private String sysFileNm2;		// 시스템파일명2
+	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 Integer assignedCsNo;	// 할당된CS담당자번호
+	private String assignedCsNm;	// 할당된CS담당자명
+	private String assignedYmd;		// 할당된연월일
+	private String assignedHms;		// 할당된시분초
+	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 roleCd;
+	private String supplyCompCd;
+
+	// 검색조건
+	private String condition;		// 검색어
+	private String custGb;			// 회원구분
+	private String termGb;			// 기간구분
+	private String termStdt;		// 검색시작날짜
+	private String termEddt;		// 검색끝날짜
+
+}

+ 83 - 71
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaAnswerPhase.xml

@@ -1,72 +1,84 @@
-<?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="getAnswerPhaseList" parameterType="AnswerPhase" resultType="AnswerPhase">
-		/* TsaAnswerPhase.getAnswerPhaseList */
-		 SELECT SITE_CD                                      /*사이트코드*/
-		      , ANS_SQ                                       /*답변일련번호*/
-		      , ANS_CLSF                                     /*답변종류코드*/
-		      , ANS_TITLE                                    /*답변제목*/
-		      , ANS_CONTENT                                  /*답변내용*/
-		      , USE_YN                                       /*사용여부*/
-		      , FN_GET_USER_NM(REG_NO)             AS REG_NM /*등록자*/
-		      , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT /*등록일자*/
-		      , FN_GET_USER_NM(UPD_NO)             AS UPD_NM /*수정자*/
-		      , DATE_FORMAT(UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT /*수정일자*/
-		FROM    TB_ANS_PHASE
-		WHERE   1 = 1
-		<if test="siteCd != null and siteCd != ''">
-		AND     SITE_CD = #{siteCd}
-		</if>
-		<if test="ansClsf != null and ansClsf != ''">
-		AND     ANS_CLSF = #{ansClsf}
-		</if>
-		<if test="useYn != null and useYn != ''">
-		AND     USE_YN = #{useYn}
-		</if>
-		<if test="ansTitle != null and ansTitle != ''">
-		AND     ANS_TITLE LIKE CONCAT('%',#{ansTitle},'%')
-		</if>
-		ORDER   BY SITE_CD, ANS_CLSF, ANS_SQ
-	</select>
-
-	<!-- 기본답변문구 등록/수정 -->
-	<insert id="saveAnswerPhase" parameterType="AnswerPhase">
-		/* TsaAnswerPhase.saveAnswerPhase */
-		INSERT INTO TB_ANS_PHASE (
-		       ANS_SQ
-		     , ANS_CLSF
-		     , SITE_CD
-		     , ANS_TITLE
-		     , ANS_CONTENT
-		     , USE_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       NULL
-		     , #{ansClsf}
-		     , #{siteCd}
-		     , #{ansTitle}
-		     , #{ansContent}
-		     , #{useYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       SITE_CD = #{siteCd}
-		     , ANS_CLSF = #{ansClsf}
-		     , ANS_TITLE = #{ansTitle}
-		     , ANS_CONTENT = #{ansContent}
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-
+<?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="getAnswerPhaseList" parameterType="AnswerPhase" resultType="AnswerPhase">
+		/* TsaAnswerPhase.getAnswerPhaseList */
+		 SELECT SITE_CD                                      /*사이트코드*/
+		      , ANS_SQ                                       /*답변일련번호*/
+		      , ANS_CLSF                                     /*답변종류코드*/
+		      , ANS_TITLE                                    /*답변제목*/
+		      , ANS_CONTENT                                  /*답변내용*/
+		      , USE_YN                                       /*사용여부*/
+		      , FN_GET_USER_NM(REG_NO)             AS REG_NM /*등록자*/
+		      , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT /*등록일자*/
+		      , FN_GET_USER_NM(UPD_NO)             AS UPD_NM /*수정자*/
+		      , DATE_FORMAT(UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT /*수정일자*/
+		FROM    TB_ANS_PHASE
+		WHERE   1 = 1
+		<if test="siteCd != null and siteCd != ''">
+		AND     SITE_CD = #{siteCd}
+		</if>
+		<if test="ansClsf != null and ansClsf != ''">
+		AND     ANS_CLSF = #{ansClsf}
+		</if>
+		<if test="useYn != null and useYn != ''">
+		AND     USE_YN = #{useYn}
+		</if>
+		<if test="ansTitle != null and ansTitle != ''">
+		AND     ANS_TITLE LIKE CONCAT('%',#{ansTitle},'%')
+		</if>
+		ORDER   BY SITE_CD, ANS_CLSF, ANS_SQ
+	</select>
+
+	<!-- 기본답변문구 등록/수정 -->
+	<insert id="saveAnswerPhase" parameterType="AnswerPhase">
+		/* TsaAnswerPhase.saveAnswerPhase */
+		INSERT INTO TB_ANS_PHASE (
+		       ANS_SQ
+		     , ANS_CLSF
+		     , SITE_CD
+		     , ANS_TITLE
+		     , ANS_CONTENT
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       NULL
+		     , #{ansClsf}
+		     , #{siteCd}
+		     , #{ansTitle}
+		     , #{ansContent}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       SITE_CD = #{siteCd}
+		     , ANS_CLSF = #{ansClsf}
+		     , ANS_TITLE = #{ansTitle}
+		     , ANS_CONTENT = #{ansContent}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 1:1문의 답변문구 조회 -->
+	<select id="getOneToOneQnaAnswerPhase" parameterType="AnswerPhase" resultType="AnswerPhase">
+		/* TsaAnswerPhase.getOneToOneQnaAnswerPhase */
+		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>

+ 251 - 0
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaCounsel.xml

@@ -0,0 +1,251 @@
+<?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.TsaCounselDao">
+
+	<!-- 1:1문의 목록 -->
+	<select id="getOneToOneQnaList" parameterType="Counsel" resultType="Counsel">
+		/* TsaCounsel.getOneToOneQnaList */
+		SELECT A.COUNSEL_SQ                                                        /*상담일련번호*/
+		     , A.SITE_CD                                                           /*사이트코드*/
+		     , FN_GET_CODE_NM('G059',A.COUNSEL_CLSF)           AS COUNSEL_CLSF_NM  /*상담분류명*/
+		     , FN_GET_CODE_NM(A.COUNSEL_CLSF,A.COUNSEL_DCLSF)  AS COUNSEL_DCLSF_NM /*상담상세분류명*/
+		     , A.COUNSEL_DCLSF                                                     /*상담상세분류*/
+		     , DATE_FORMAT(A.QUEST_DT,'%Y%m%d%H%i%S')          AS QUEST_DT         /*문의일시*/
+		     , A.QUEST_TITLE                                                       /*문의제목*/
+		     , A.CUST_NO                                                           /*고객번호*/
+		     , B.CUST_ID                                                           /*고객ID*/
+		     , B.CUST_NM                                                           /*고객명*/
+		     , A.CELL_PHNNO                                                        /*휴대전화번호*/
+		     , A.EMAIL                                                             /*이메일*/
+		     , A.EMAIL_REQ_YN                                                      /*이메일요청여부*/
+		     , A.EMAIL_SEND_YN                                                     /*이메일발송여부*/
+		     , A.ANS_STAT                                                          /*답변상태*/
+		     , 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
+		LEFT OUTER JOIN TB_USER D ON A.ANS_NO = D.USER_NO
+		WHERE  COUNSEL_TYPE = 'C' /*상담유형(1:1문의)*/
+		<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="ansNo != null and ansNo != ''">
+		AND    A.ANS_NO = #{ansNo}
+		</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    A.QUEST_DT <![CDATA[>=]]> STR_TO_DATE(#{termStdt},'%Y-%m-%d')
+		</if>
+		<if test="termEddt != null and termEddt != ''">
+		AND    A.QUEST_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{termEddt},'%Y-%m-%d'),INTERVAL 1 DAY)
+		</if>
+		<if test="ansStat != null and ansStat != ''">
+		AND    A.ANS_STAT = #{ansStat}
+		</if>
+		ORDER  BY A.QUEST_DT DESC
+	</select>
+
+	<!-- 1:1문의 상세 -->
+	<select id="getOneToOneQna" parameterType="Counsel" resultType="Counsel">
+		/* TsaCounsel.getOneToOneQna */
+		SELECT A.COUNSEL_SQ                                                       /*상담일련번호*/
+		     , FN_GET_CODE_NM('G000',A.SITE_CD)               AS SITE_NM          /*사이트명*/
+		     , FN_GET_CODE_NM('G059',A.COUNSEL_CLSF)          AS COUNSEL_CLSF_NM  /*상담분류명*/
+		     , FN_GET_CODE_NM(A.COUNSEL_CLSF,A.COUNSEL_DCLSF) AS COUNSEL_DCLSF_NM /*상담분류상세명*/
+		     , A.CUST_NO                                                          /*고객번호*/
+		     , B.CUST_ID                                                          /*고객ID*/
+		     , B.CUST_NM                                                          /*고객명*/
+		     , A.CELL_PHNNO                                                       /*휴대전화번호*/
+		     , A.EMAIL                                                            /*이메일*/
+		     , A.EMAIL_REQ_YN                                                     /*이메일요청여부*/
+		     , A.EMAIL_SEND_YN                                                    /*이메일발송여부*/
+		     , A.REL_GOODS_CD                                                     /*관련상품코드*/
+		     , G.GOODS_NM                                                         /*상품명*/
+		     , DATE_FORMAT(A.QUEST_DT,'%Y-%m-%d %H:%i:%S')    AS QUEST_DT         /*문의일시*/
+		     , A.ANS_NO                                                           /*답변자번호*/
+		     , C.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.ORG_FILE_NM1                                                     /*원본파일명1*/
+		     , A.ORG_FILE_NM2                                                     /*원본파일명2*/
+		     , A.SYS_FILE_NM1                                                     /*시스템파일명1*/
+		     , A.SYS_FILE_NM2                                                     /*시스템파일명2*/
+		     , A.ANS_STAT                                                         /*답변상태코드*/
+		     , FN_GET_CODE_NM('G060',A.ANS_STAT)              AS ANS_STAT_NM      /*답변상태명*/
+		FROM   TB_COUNSEL A
+		INNER JOIN TB_CUSTOMER B ON A.CUST_NO = B.CUST_NO
+		LEFT OUTER JOIN TB_GOODS G ON A.REL_GOODS_CD = G.GOODS_CD
+		LEFT OUTER JOIN TB_USER C ON A.ANS_NO = C.USER_NO
+		WHERE  A.COUNSEL_SQ = #{counselSq}
+		AND    A.COUNSEL_TYPE = 'C' /*상담유형(1:1문의)*/
+	</select>
+	
+	<!--문의 답변 저장 -->
+	<update id="updateQnaAnswer" parameterType="Counsel">
+		/* TsaCounsel.updateQnaAnswer */
+		UPDATE TB_COUNSEL
+		SET    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}
+	</update>
+	
+	<!-- 상품문의 목록 -->
+	<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.EMAIL                                                             /*이메일*/
+		     , A.EMAIL_REQ_YN                                                      /*이메일요청여부*/
+		     , A.EMAIL_SEND_YN                                                     /*이메일발송여부*/
+		     , A.REL_GOODS_CD                                                      /*관련상품코드*/
+		     , A.ANS_COMP_CD                                                       /*답변업체코드*/
+		     , A.ANS_STAT                                                          /*답변상태*/
+		     , 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
+		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="ansNo != null and ansNo != ''">
+		AND    A.ANS_NO = #{ansNo}
+		</if>
+		<if test="ansTransNo != null and ansTransNo != ''">
+		AND    A.ANS_TRANS_NO = #{ansTransNo}
+		</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>
+		<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>
+		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.EMAIL                                                             /*이메일*/
+		     , A.EMAIL_REQ_YN                                                      /*이메일요청여부*/
+		     , A.EMAIL_SEND_YN                                                     /*이메일발송여부*/
+		     , A.REL_GOODS_CD                                                      /*관련상품코드*/
+		     , G.GOODS_NM                                                          /*상품명*/
+		     , DATE_FORMAT(A.QUEST_DT,'%Y-%m-%d %H:%i:%S')     AS QUEST_DT         /*문의일시*/
+		     , A.ANS_NO                                                            /*답변자번호*/
+		     , C.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_TRANS_YN                                                      /*답변의뢰여부*/
+		     , A.ANS_COMP_CD                                                       /*답변업체코드*/
+		     , FN_GET_SUPPLY_COMP_NM(A.ANS_COMP_CD)            AS ANS_COMP_NM      /*답변업체명*/
+		     , DATE_FORMAT(A.ANS_TRANS_DT,'%Y-%m-%d %H:%i:%S') AS ANS_TRANS_DT     /*답변의뢰일시*/
+		     , A.ANS_STAT                                                          /*답변상태코드*/
+		     , FN_GET_CODE_NM('G060',A.ANS_STAT)               AS ANS_STAT_NM      /*답변상태명*/
+		FROM   TB_COUNSEL A
+		INNER JOIN TB_CUSTOMER B ON A.CUST_NO = B.CUST_NO
+		LEFT OUTER JOIN TB_GOODS G ON A.REL_GOODS_CD = G.GOODS_CD
+		LEFT OUTER JOIN TB_USER C ON A.ANS_NO = C.USER_NO
+		WHERE  A.COUNSEL_SQ = #{counselSq}
+		AND    A.COUNSEL_TYPE = 'G' /*상담유형(상품문의)*/
+		<if test="roleCd == 'B000'"> <!-- 입점업체권한일 때는 본인 것만 보도록 처리 -->
+		AND    A.ANS_COMP_CD = #{supplyCompCd}
+		</if>
+	</select>
+
+	<!--상품문의 입점업체에 답변의뢰 -->
+	<update id="updateGoodsQnaAnswerTransfer" parameterType="Counsel">
+		/* TsaCounsel.updateGoodsQnaAnswerTransfer */
+		UPDATE TB_COUNSEL
+		SET    ANS_COMP_CD = #{ansCompCd}
+		     , ANS_TRANS_YN = 'Y'
+		     , ANS_TRANS_NO = #{ansTransNo}
+		     , ANS_TRANS_DT = NOW()
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  COUNSEL_SQ = #{counselSq}
+	</update>
+
+</mapper>

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

@@ -331,12 +331,12 @@
 		FROM   TB_SELL_STORE
 	</select>
 
-	<!-- 기본답변문구 제목 목록 -->
-	<select id="getBasicAnsTitleList" parameterType="String" resultType="CommonCode">
-		/* TsaRenderer.getBasicAnsTitleList */
+	<!-- 1:1문의용 답변문구 목록 -->
+	<select id="getAnswerPhaseList" parameterType="String" resultType="CommonCode">
+		/* TsaRenderer.getAnswerPhaseList */
 		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>

+ 204 - 0
style24.admin/src/main/webapp/WEB-INF/views/customer/GoodsQnaForm.html

@@ -0,0 +1,204 @@
+<!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.24   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 style="width:15%;"/>
+						<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="ansCompCd">
+								<option value="">[전체]</option>
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}" th:selected="${#strings.equals(sessionInfo.supplyCompCd, oneData.cd)}"></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="7">
+							<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}]]); // 답변상태
+	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]); // 답변의뢰업체
+	
+	// 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: "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: "이메일", field: "email", width: 200},
+		{headerName: "이메일답변요청", field: "emailReqYn", width: 120, cellClass: 'text-center'},
+		{headerName: "이메일답변발송", field: "emailSendYn", width: 120, cellClass: 'text-center'},
+		{
+			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: "ansCompCd", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.lookupValue(supplyCompList, 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);
+		} else if (event.colDef.field == 'custNm') {
+			// 고객 상세
+			cfnOpenCustDetailPopup(event.data.custNo);
+		}
+	}
+	
+	// 조회
+	$('#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>

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

@@ -0,0 +1,197 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OneToOneQnaDetailForm.html
+ * @desc    : 1:1문의 상세 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.12.24   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1200" id="popupQna">
+	<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>
+		</div>
+		<!-- //TITLE -->
+		
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<form id="qnaDetailForm" name="qnaDetailForm" action="#" th:action="@{'/customer/onetoone/qna/answer/save'}" th:method="post" th:object="${counselInfo}">
+				<input type="hidden" name="counselSq" th:value="*{counselSq}"/>
+				
+				<h4>상담정보</h4>
+				<table class="tableStyle" aria-describedby="상담정보">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:10%;"/>
+						<col style="width:12%;"/>
+						<col style="width:15%;"/>
+						<col/>
+<!-- 						<col style="width:10%;"/> -->
+<!-- 						<col style="width:15%;"/> -->
+						<col style="width:25%;"/>
+					</colgroup>
+					<thead>
+						<tr>
+							<th>상담일련번호</th>
+							<th>사이트</th>
+							<th>상담분류</th>
+							<th>문의일시</th>
+							<th>고객정보</th>
+<!-- 							<th>주문번호</th> -->
+<!-- 							<th>답변의뢰</th> -->
+							<th>답변상태</th>
+						</tr>
+					</thead>
+					<tbody>
+						<tr>
+							<td th:text="*{counselSq}"></td>
+							<td th:text="*{siteNm}"></td>
+							<td th:utext="*{counselClsfNm}"></td>
+							<td th:text="*{questDt}"></td>
+							<td th:utext="*{custNm + ' / ' + cellPhnno + ' / ' + email}"></td>
+<!-- 							<td th:text="*{relOrdNo}"></td> -->
+<!-- 							<td th:utext="*{ansTransYn == 'Y' ? ansTransDt + '<br/>' + ansCompNm : ''}"></td> -->
+							<td th:utext="*{ansStat == '20' ? ansStatNm + ' / ' + ansDt + ' / ' + ansNm : ansStatNm}"></td>
+						</tr>
+					</tbody>
+				</table>
+				
+				<h4>고객문의</h4>
+				<table class="frmStyle" aria-describedby="고객문의">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:50%;"/>
+						<col style="width:10%;"/>
+						<col style="width:30%;"/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>문의 제목</th>
+							<td colspan="3" th:text="*{questTitle}"></td>
+						</tr>
+						<tr>
+							<th>문의 내용</th>
+							<td>
+								<textarea class="textareaR4" style="resize: none;" name="questContent" th:text="*{questContent}" disabled="disabled"></textarea>
+							</td>
+							<th>첨부 이미지</th>
+							<td class="userImg" id="onetooneImg">
+							</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">답변저장</button>
+			</li>
+		</ul>
+		<!-- //버튼 배치 영역 -->
+	</div>
+</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	// 답변 저장
+	$('#btnSaveAnswer').on('click', function() {
+		// 입력 값 체크
+		if (!gagajf.validation('#qnaDetailForm'))
+			return false;
+		
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxFormSubmit($('#qnaDetailForm').prop('action'), '#qnaDetailForm', function() {
+					uifnPopupClose('popupQna');
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	// 답변템플릿 선택 시
+	$('select[name=ansSq]').on('change', function() {
+		var ansSq = $(this).val();
+
+		if (!gagajf.isNull(ansSq)) {
+			var actionUrl = '/customer/onetoone/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(counsel.sysFileNm)) {
+// 			var imgTag = '<img style="height: 100px;" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \'' + _imgUrl + '/counsel/' + counsel.sysFileNm + '\')" src="' + _imgUrl + '/counsel/' + counsel.sysFileNm + '">';
+// 			$('#onetooneImg').append(imgTag);
+// 		}
+
+		cfnGetTextLength($('textarea[name=ansContent]'), 4000, $('#dpLocAnsContent'));
+	});
+/*]]>*/
+</script>
+
+</html>

+ 190 - 0
style24.admin/src/main/webapp/WEB-INF/views/customer/OneToOneQnaForm.html

@@ -0,0 +1,190 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OneToOneQnaForm.html
+ * @desc    : 1:1문의관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.12.24   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/onetoone/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:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:10%;"/>
+						<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="counselClsf">
+								<option value="">[선택]</option>
+								<option th:if="${counselClsfList}" th:each="oneData, status : ${counselClsfList}" 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="7" id="terms"></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: "counselClsfNm", width: 150, cellClass: 'text-center'
+// 			valueFormatter: function (params) { return params.value + (gagajf.isNull(params.data.counselDclsfNm) ? "" : "-" + params.data.counselDclsfNm); }
+		},
+		{
+			headerName: "문의일시", field: "questDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{headerName: "문의 제목", field: "questTitle", width: 300},
+		{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: "이메일", 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); }
+		}
+	];
+	
+	// Get GridOptions
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	
+	// 셀 클릭 이벤트
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field == 'counselSq') {
+			// 1:1문의 상세
+			cfnOpenOneToOneQnaDetailPopup(event.data.counselSq);
+		} else if (event.colDef.field == 'custNm') {
+			// 고객 상세
+			cfnOpenCustDetailPopup(event.data.custNo);
+		}
+	}
+	
+	// 조회
+	$('#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>

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

@@ -436,13 +436,13 @@ var cfnGrantPointPopup = function(){
 /**
  * @type   : function
  * @access : public
- * @desc   : 일대일문의상세팝업
- * @since  : 2020/02/21
- * @author : 이대형
+ * @desc   : 1:1문의 상세 팝업
+ * @author : gagamel
+ * @since  : 2020/12/24
  */
-var cfnOpenOneToOneAskDetailPopup = function(counselSq) {
-	var actionUrl = '/customer/onetoone/ask/detail/form/' + counselSq;
-	cfnOpenModalPopup(actionUrl, 'popupOneToOneAskDetail');
+var cfnOpenOneToOneQnaDetailPopup = function(counselSq) {
+	var actionUrl = '/customer/onetoone/qna/detail/form/' + counselSq;
+	cfnOpenModalPopup(actionUrl, 'popupOneToOneQnaDetail');
 }
 
 /**
@@ -453,8 +453,8 @@ var cfnOpenOneToOneAskDetailPopup = function(counselSq) {
  * @author : 이대형
  */
 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');
 }
 
 /**