Forráskód Böngészése

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

jsh77b 4 éve
szülő
commit
e34b1b27aa
28 módosított fájl, 1577 hozzáadás és 329 törlés
  1. 19 4
      src/main/java/com/style24/admin/biz/dao/TsaCounselDao.java
  2. 8 0
      src/main/java/com/style24/admin/biz/dao/TsaRendererDao.java
  3. 1 1
      src/main/java/com/style24/admin/biz/dao/TsaSettleDao.java
  4. 10 0
      src/main/java/com/style24/admin/biz/dao/TsaStatisticsDao.java
  5. 40 2
      src/main/java/com/style24/admin/biz/service/TsaCounselService.java
  6. 7 7
      src/main/java/com/style24/admin/biz/service/TsaGoodsService.java
  7. 10 0
      src/main/java/com/style24/admin/biz/service/TsaRendererService.java
  8. 5 8
      src/main/java/com/style24/admin/biz/service/TsaSettleService.java
  9. 85 0
      src/main/java/com/style24/admin/biz/service/TsaStatisticsService.java
  10. 79 5
      src/main/java/com/style24/admin/biz/web/TsaCustomerController.java
  11. 8 6
      src/main/java/com/style24/admin/biz/web/TsaSettleController.java
  12. 81 27
      src/main/java/com/style24/admin/biz/web/TsaStatisticsController.java
  13. 4 1
      src/main/java/com/style24/persistence/domain/Counsel.java
  14. 2 0
      src/main/java/com/style24/persistence/domain/DelvFeeSettle.java
  15. 2 0
      src/main/java/com/style24/persistence/domain/GoodsSettle.java
  16. 4 0
      src/main/java/com/style24/persistence/domain/SettleConfirm.java
  17. 12 0
      src/main/java/com/style24/persistence/domain/Statistics.java
  18. 104 64
      src/main/java/com/style24/persistence/mybatis/shop/TsaCounsel.xml
  19. 6 7
      src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml
  20. 11 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaRenderer.xml
  21. 162 140
      src/main/java/com/style24/persistence/mybatis/shop/TsaSettle.xml
  22. 71 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaStatistics.xml
  23. 264 19
      src/main/webapp/WEB-INF/views/customer/OneToOneQnaDetailForm.html
  24. 83 19
      src/main/webapp/WEB-INF/views/customer/OneToOneQnaForm.html
  25. 2 1
      src/main/webapp/WEB-INF/views/settle/DeliveryFeeSettleForm.html
  26. 57 11
      src/main/webapp/WEB-INF/views/settle/GoodsSettleForm.html
  27. 38 7
      src/main/webapp/WEB-INF/views/settle/SettleConfirmForm.html
  28. 402 0
      src/main/webapp/WEB-INF/views/statistics/BestTradingForm.html

+ 19 - 4
src/main/java/com/style24/admin/biz/dao/TsaCounselDao.java

@@ -2,9 +2,10 @@ package com.style24.admin.biz.dao;
 
 import java.util.Collection;
 
+import org.springframework.stereotype.Repository;
+
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Counsel;
-import org.springframework.stereotype.Repository;
 
 /**
  * 상담(1:1문의) Dao
@@ -24,7 +25,14 @@ public interface TsaCounselDao {
 	 * @since 2020. 12. 24
 	 */
 	Collection<Counsel> getOneToOneQnaList(Counsel counsel);
-	
+
+	/**
+	 * 1:1문의 상담사 할당 Update
+	 * @param counsel - 상담정보
+	 * @author gagamel
+	 * @since 2021. 9. 24
+	 */
+	void updateOneToOneQnaCounselor(Counsel counsel);
 
 	/**
 	 * 1:1문의 전체 카운트
@@ -35,7 +43,6 @@ public interface TsaCounselDao {
 	 */
 	int getOneToOneQnaListCount(Counsel counsel);
 
-
 	/**
 	 * 1:1문의 상세
 	 * @param counsel - 상담정보
@@ -45,6 +52,14 @@ public interface TsaCounselDao {
 	 */
 	Counsel getOneToOneQna(Counsel counsel);
 
+	/**
+	 * 문의 답변 임시 저장
+	 * @param counsel - 상담정보
+	 * @author gagamel
+	 * @since 2021. 9. 24
+	 */
+	void updateQnaAnswerTemp(Counsel counsel);
+
 	/**
 	 * 문의 답변 저장
 	 * @param counsel - 상담정보
@@ -61,7 +76,7 @@ public interface TsaCounselDao {
 	 * @since 2020. 12. 24
 	 */
 	Collection<Counsel> getGoodsQnaList(Counsel counsel);
-	
+
 	/**
 	 * 상품문의 목록 카운트
 	 * @param counsel -상담정보

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

@@ -315,4 +315,12 @@ public interface TsaRendererDao {
 	 */
 	Collection<CommonCode> getSupplyVendorList(SupplyCompany supplyComp);
 
+	/**
+	 * 상담사 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 9. 24
+	 */
+	Collection<CommonCode> getCounselorList();
+
 }

+ 1 - 1
src/main/java/com/style24/admin/biz/dao/TsaSettleDao.java

@@ -33,7 +33,7 @@ public interface TsaSettleDao {
 	 * @author gagamel
 	 * @since 2021. 7. 30
 	 */
-	void deleteSettleConfirm(String settleYm);
+	void deleteSettleConfirm(SettleConfirm settleConfirm);
 
 	/**
 	 * 정산확정 데이터 생성

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

@@ -2,6 +2,7 @@ package com.style24.admin.biz.dao;
 
 import java.util.Collection;
 
+import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Statistics;
 
@@ -97,4 +98,13 @@ public interface TsaStatisticsDao {
 	 */
 	Collection<Statistics> getClaimOrderList(Statistics statistics);
 
+	/**
+	 * 베스트 주문 조회
+	 * author: 이명철
+	 * return: Collection<Statistics>
+	 * since: 2021. 9. 25.
+	 */
+	Collection<Statistics> getBestOrderList(Statistics statistics);
+	Collection<GagaMap> getBestOrderListMap(Statistics statistics);
+
 }

+ 40 - 2
src/main/java/com/style24/admin/biz/service/TsaCounselService.java

@@ -7,6 +7,7 @@ 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;
@@ -34,7 +35,21 @@ public class TsaCounselService {
 	public Collection<Counsel> getOneToOneQnaList(Counsel counsel) {
 		return counselDao.getOneToOneQnaList(counsel);
 	}
-	
+
+	/**
+	 * 1:1문의 상담사 할당 Update
+	 * @param counselList - 상담사 목록
+	 * @author gagamel
+	 * @since 2021. 9. 24
+	 */
+	@Transactional("shopTxnManager")
+	public void updateOneToOneQnaListCounselor(Collection<Counsel> counselList) {
+		for (Counsel counsel : counselList) {
+			counsel.setUpdNo(TsaSession.getInfo().getUserNo());
+			counselDao.updateOneToOneQnaCounselor(counsel);
+		}
+	}
+
 	/**
 	 * 1:1문의 목록 카운트
 	 * @param counsel -상담정보
@@ -59,6 +74,29 @@ public class TsaCounselService {
 		return counselDao.getOneToOneQna(counsel);
 	}
 
+	/**
+	 * 1:1문의 상담사 할당 Update
+	 * @param counselList - 상담사 목록
+	 * @author gagamel
+	 * @since 2021. 9. 24
+	 */
+	@Transactional("shopTxnManager")
+	public void updateOneToOneQnaCounselor(Counsel counsel) {
+		counsel.setUpdNo(TsaSession.getInfo().getUserNo());
+		counselDao.updateOneToOneQnaCounselor(counsel);
+	}
+
+	/**
+	 * 문의 답변 임시 저장
+	 * @param counsel - 상담정보
+	 * @author gagamel
+	 * @since 2021. 9. 24
+	 */
+	@Transactional("shopTxnManager")
+	public void updateQnaAnswerTemp(Counsel counsel) {
+		counselDao.updateQnaAnswerTemp(counsel);
+	}
+
 	/**
 	 * 문의 답변 저장
 	 * @param counsel - 상담정보
@@ -80,7 +118,7 @@ public class TsaCounselService {
 	public Collection<Counsel> getGoodsQnaList(Counsel counsel) {
 		return counselDao.getGoodsQnaList(counsel);
 	}
-	
+
 	/**
 	 * 상품문의 목록 카운트
 	 * @param counsel -상담정보

+ 7 - 7
src/main/java/com/style24/admin/biz/service/TsaGoodsService.java

@@ -3095,7 +3095,7 @@ public class TsaGoodsService {
 			}
 			goods.setChDataYn("Y");
 		}
-		
+
 		// 상품상태
 		if (StringUtils.isBlank(goodsMass.getGoodsStatCd())) {
 			goods.setGoodsRegMsg("상품상태 오류");
@@ -3115,14 +3115,14 @@ public class TsaGoodsService {
 			}
 			goods.setChDataYn("Y");
 		}
-		
+
 		//판매가
 		if (StringUtils.isBlank(goodsMass.getCurrPrice())) {
 			goods.setGoodsRegMsg("판매가 오류");
 			goods.setGoodsStat("10");
 			return goods;
 		}
-		
+
 		int chkCurrPrice = 0;
 		int chkListPrice = 0;
 		if (UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice().trim())) {
@@ -3157,14 +3157,14 @@ public class TsaGoodsService {
 			}
 			chkListPrice = Integer.parseInt(GagaStringUtil.replace(goodsMass.getListPrice().trim(), ",", ""));
 		}
-		
+
 		if( !UPDATE_NO_PATTERN.equals(goodsMass.getListPrice().trim()) || !UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice().trim()) ) {
 			if (chkCurrPrice > chkListPrice) {
 				goods.setGoodsRegMsg("판매가 오류(정상가보다 높음)");
 				goods.setGoodsStat("10");
 				return goods;
 			}
-			
+
 			//금액 변경시
 			goods.setListPrice(chkListPrice); // 정상가
 			goods.setCurrPrice(chkCurrPrice); // 판매가
@@ -3203,10 +3203,10 @@ public class TsaGoodsService {
 				goods.setGoodsStat("10");
 				return goods;
 			}
-			
+
 			goods.setSellFeeRate(sellFeeRate); // 판매수수료율
 			goods.setChDataYn("Y");
-		
+
 
 		}
 

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

@@ -646,4 +646,14 @@ public class TsaRendererService {
 		return rendererDao.getSupplyVendorList(supplyComp);
 	}
 
+	/**
+	 * 상담사 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 9. 24
+	 */
+	public Collection<CommonCode> getCounselorList() {
+		return rendererDao.getCounselorList();
+	}
+
 }

+ 5 - 8
src/main/java/com/style24/admin/biz/service/TsaSettleService.java

@@ -57,14 +57,11 @@ public class TsaSettleService {
 	 * @since 2021. 7. 30
 	 */
 	@Transactional("shopTxnManager")
-	public void saveSettleConfirm(String settleYm) {
+	public void saveSettleConfirm(SettleConfirm settleConfirm) {
 		// 정산데이터 삭제
-		settleDao.deleteSettleConfirm(settleYm);
+		settleDao.deleteSettleConfirm(settleConfirm);
 
 		// 정산데이터 생성
-		SettleConfirm settleConfirm = new SettleConfirm();
-		settleConfirm.setSettleYm(settleYm);
-		settleConfirm.setRegNo(TsaSession.getInfo().getUserNo());
 		settleDao.createSettleConfirm(settleConfirm);
 	}
 
@@ -105,8 +102,8 @@ public class TsaSettleService {
 			throw new IllegalStateException("발생연월은 필수입니다.");
 		}
 
-		if (StringUtils.isBlank(settleConfirm.getSupplyCompCd())) {
-			throw new IllegalStateException("업체번호는 필수입니다.");
+		if (StringUtils.isBlank(settleConfirm.getSupplyVendorCd())) {
+			throw new IllegalStateException("벤더업체코드는 필수입니다.");
 		}
 
 		if (settleConfirm.getRewardAmt() <= 0) {
@@ -145,7 +142,7 @@ public class TsaSettleService {
 		String[] listTitles = {"작성연월", "품목", "공급가액", "세액", "현금거래액", "사업자번호", "상호", "대표자명", "업태", "업종", "기본주소", "상세주소", "정산담당자", "전화번호", "계산서이메일", "계산서발행금액"};
 
 		// DB 처리 시 사용되는 셀명 설정
-		String[] cellNames = {"usacYm", "billType", "supplyAmt", "taxAmt", "tradeAmt", "bizNo", "supplyCompNm", "ownerNm", "bizType", "bizKind", "bizBaseAddr", "bizDtlAddr", "settleChargeNm", "settleChargeTelno", "billEmail", "billAmt"};
+		String[] cellNames = {"usacYm", "billType", "supplyAmt", "taxAmt", "tradeAmt", "bizNo", "supplyVendorNm", "ownerNm", "bizType", "bizKind", "bizBaseAddr", "bizDtlAddr", "settleChargeNm", "settleChargeTelno", "billEmail", "billAmt"};
 
 		String[] cellTypes = {
 			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),

+ 85 - 0
src/main/java/com/style24/admin/biz/service/TsaStatisticsService.java

@@ -1,11 +1,23 @@
 package com.style24.admin.biz.service;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
+import java.util.Map;
 
+import org.apache.catalina.mapper.Mapper;
+import org.apache.commons.collections4.map.LinkedMap;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.gagaframework.excel.GagaExcelUtil;
+import com.gagaframework.excel.env.GagaExcelConstants;
+import com.gagaframework.web.parameter.GagaMap;
 import com.style24.admin.biz.dao.TsaStatisticsDao;
+import com.style24.admin.support.env.TsaConstants;
 import com.style24.persistence.domain.Statistics;
 
 import lombok.extern.slf4j.Slf4j;
@@ -23,6 +35,12 @@ public class TsaStatisticsService {
 	@Autowired
 	private TsaStatisticsDao statisticsDao;
 
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private ObjectMapper mapper;
+
 	/**
 	 * 일일거래내역
 	 * @param statistics - 통계 정보
@@ -126,4 +144,71 @@ public class TsaStatisticsService {
 		return statisticsDao.getClaimOrderList(statistics);
 	}
 
+	/**
+	 * 베스트 주문 조회
+	 * author: 이명철
+	 * return: Collection<Statistics>
+	 * since: 2021. 9. 25.
+	 */
+	public Collection<Statistics> getBestOrderList(Statistics statistics) {
+		return statisticsDao.getBestOrderList(statistics);
+	}
+
+	/**
+	 * 베스트 주문 엑셀다운로드
+	 * author: 이명철
+	 * return: void
+	 * since: 2021. 9. 25.
+	 */
+	public void getBestGoodsExcelList(Statistics statistics, String excelFilenameWithPath) {
+
+		List<String> colInfoList = new ArrayList<String>();
+		String[] listTitles;
+		String[] cellNames;
+		String[] cellTypes;
+
+		if ("Y".equals(statistics.getImageViewYn())) {
+//			colInfoList.add("이미지|SYS_IMG_NM|"+ GagaExcelConstants.CellType.IMAGE.name());
+		}
+		colInfoList.add("브랜드명|BRAND_ENM|"+ GagaExcelConstants.CellType.CHAR_CENTER.name());
+		colInfoList.add("상품번호|GOODS_CD|"+ GagaExcelConstants.CellType.CHAR_CENTER.name());
+		colInfoList.add("상품명|GOODS_NM|"+ GagaExcelConstants.CellType.CHAR_LEFT.name());
+		colInfoList.add("구분|DISTRIBUTION_GB|"+ GagaExcelConstants.CellType.CHAR_CENTER.name());
+		colInfoList.add("판매가|CURR_PRICE|"+ GagaExcelConstants.CellType.CHAR_RIGHT.name());
+		colInfoList.add("판매수|SELL_QTY|"+ GagaExcelConstants.CellType.CHAR_RIGHT.name());
+		colInfoList.add("매출액|TOT_AMT|"+ GagaExcelConstants.CellType.CHAR_RIGHT.name());
+		colInfoList.add("현재고수량|STOCK_QTY|"+ GagaExcelConstants.CellType.CHAR_RIGHT.name());
+
+		listTitles = new String[colInfoList.size()];
+		cellNames = new String[colInfoList.size()];
+		cellTypes = new String[colInfoList.size()];
+
+		String[] temp;
+		int i = 0;
+		for (String colInfo : colInfoList) {
+			temp = colInfo.split("\\|");
+			listTitles[i] = temp[0];
+			cellNames[i] = temp[1];
+			cellTypes[i] = temp[2];
+			i++;
+		}
+
+		String targetPath = env.getProperty("upload.goods.view");
+		Collection<GagaMap> bestOrderList = statisticsDao.getBestOrderListMap(statistics); // map형식으로 조회
+		if (bestOrderList != null && !bestOrderList.isEmpty()) {
+			for (GagaMap gagaMap : bestOrderList) {
+				if (!StringUtils.isBlank(gagaMap.get("SYS_IMG_NM").toString())) {
+					gagaMap.set("SYS_IMG_NM", targetPath + '/' + gagaMap.get("SYS_IMG_NM").toString() + "?RS=60");
+				}
+			}
+		}
+
+		try {
+			GagaExcelUtil.createExcel(excelFilenameWithPath, bestOrderList, "주문 정보", listTitles, cellNames, cellTypes, TsaConstants.EXCEL_FOOTER_TITLE);
+		} catch (Exception e) {
+			throw new IllegalStateException(e);
+		}
+
+	}
+
 }

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

@@ -87,8 +87,8 @@ public class TsaCustomerController extends TsaBaseController {
 	public ModelAndView oneToOneQnaForm() {
 		ModelAndView mav = new ModelAndView();
 
-		// 사이트 목록
-		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+//		// 사이트 목록
+//		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
 
 		// 상담분류
 		mav.addObject("counselClsfList", rendererService.getCommonCodeList("G059", "Y", new String[] {"G596"}));
@@ -96,6 +96,9 @@ public class TsaCustomerController extends TsaBaseController {
 		// 상담상태 목록
 		mav.addObject("ansStatList", rendererService.getAvailCommonCodeList("G060"));
 
+		// 상담사 목록
+		mav.addObject("counselorList", rendererService.getCounselorList());
+
 		mav.setViewName("customer/OneToOneQnaForm");
 
 		return mav;
@@ -124,6 +127,24 @@ public class TsaCustomerController extends TsaBaseController {
 		return result;
 	}
 
+	/**
+	 * 1:1문의 상담사 할당 처리
+	 * @param counselList - 상담사 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 9. 24
+	 */
+	@PostMapping("/onetoone/qna/list/assign")
+	@ResponseBody
+	public GagaResponse assignOneToOneQnaList(@RequestBody Collection<Counsel> counselList) {
+		if (counselList == null || counselList.isEmpty())
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+
+		counselService.updateOneToOneQnaListCounselor(counselList);
+
+		return super.ok(message.getMessage("SUCC_0004"));
+	}
+
 	/**
 	 * 1:1문의상세 화면
 	 * @param counselSq -상담일련번호
@@ -141,6 +162,15 @@ public class TsaCustomerController extends TsaBaseController {
 		// 문의용 답변문구
 		mav.addObject("ansPhaseList", rendererService.getQnaAnswerPhaseList("G061_20"));
 
+		// 상담사 목록
+		mav.addObject("counselorList", rendererService.getCounselorList());
+
+		// 상담분류
+		mav.addObject("counselClsfList", rendererService.getCommonCodeList("G059", "Y", new String[] {"G596"}));
+
+		// 상담상태 목록
+		mav.addObject("ansStatList", rendererService.getAvailCommonCodeList("G060"));
+
 		mav.setViewName("customer/OneToOneQnaDetailForm");
 
 		return mav;
@@ -163,6 +193,38 @@ public class TsaCustomerController extends TsaBaseController {
 		return ansPhaseService.getQnaAnswerPhase(ansPhase);
 	}
 
+	/**
+	 * 1:1문의 상담사 할당 처리
+	 * @param counselList - 상담사 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 9. 24
+	 */
+	@PostMapping("/onetoone/qna/assign")
+	@ResponseBody
+	public GagaResponse assignOneToOneQna(@RequestBody Counsel counsel) {
+		counselService.updateOneToOneQnaCounselor(counsel);
+		return super.ok(message.getMessage("SUCC_0004"));
+	}
+
+	/**
+	 * 문의 답변 임시 저장
+	 * @param counsel -상담정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 9. 24
+	 */
+	@PostMapping("/qna/answer/temp/save")
+	@ResponseBody
+	public GagaResponse saveQnaAnswerTemp(@RequestBody Counsel counsel) {
+		counsel.setAnsNo(TsaSession.getInfo().getUserNo());
+		counsel.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		counselService.updateQnaAnswerTemp(counsel);
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
 	/**
 	 * 문의 답변 저장
 	 * @param counsel -상담정보
@@ -200,6 +262,19 @@ public class TsaCustomerController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 
+	/**
+	 * 1:1문의상세 조회
+	 * @param counselSq -상담일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 24
+	 */
+	@GetMapping("/onetoone/qna/detail/{counselSq}")
+	@ResponseBody
+	public Counsel getOneToOneQnaDetail(@PathVariable Integer counselSq) {
+		return counselService.getOneToOneQna(counselSq);
+	}
+
 	/**
 	 * 상품문의관리 화면
 	 * @return
@@ -356,7 +431,7 @@ public class TsaCustomerController extends TsaBaseController {
 		if (!"Y".equals(customerSearch.getCpnPubPopYn())) {
 			customerSearch.setCpnPubPopYn("N");
 		}
-		if("custId".equals(customerSearch.getSearchGb())) {
+		if ("custId".equals(customerSearch.getSearchGb())) {
 			customerSearch.setStDate(null);
 			customerSearch.setEdDate(null);
 		}
@@ -563,7 +638,6 @@ public class TsaCustomerController extends TsaBaseController {
 		return mav;
 	}
 
-
 	/**
 	 * 메시지 발송
 	 *
@@ -624,7 +698,7 @@ public class TsaCustomerController extends TsaBaseController {
 		//Customer custInfo = customerService.getCustomerInfo(customer.getCustNo());
 		//customer.setCustNm(custInfo.getCustNm());
 		//customer.setCustNo(custInfo.getCustNo());
-		log.info("sendLms3 {}"+customer);
+		log.info("sendLms3 {}" + customer);
 		if (StringUtils.isNotBlank(customer.getCellPhnno())) {
 			Integer userNo = TsaSession.getInfo().getUserNo();
 			kakaotalkService.sendBasicLms3(customer, userNo);

+ 8 - 6
src/main/java/com/style24/admin/biz/web/TsaSettleController.java

@@ -12,7 +12,6 @@ import org.springframework.core.io.InputStreamResource;
 import org.springframework.http.ResponseEntity;
 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;
@@ -125,15 +124,18 @@ public class TsaSettleController extends TsaBaseController {
 
 	/**
 	 * 정산확정 처리 - 업체별정산데이터 생성
-	 * @param settleYm - 정산기준월
+	 * @param settleConfirm - 정산확정 정보
 	 * @return
 	 * @author gagamel
 	 * @since 2021. 7. 30
 	 */
-	@PostMapping("/confirm/save/{settleYm}")
+	@PostMapping("/confirm/save")
 	@ResponseBody
-	public GagaResponse saveSettleConfirm(@PathVariable String settleYm) {
-		settleService.saveSettleConfirm(settleYm);
+	public GagaResponse saveSettleConfirm(@RequestBody SettleConfirm settleConfirm) {
+		settleConfirm.setRegNo(TsaSession.getInfo().getUserNo());
+
+		settleService.saveSettleConfirm(settleConfirm);
+
 		return super.ok(message.getMessage("SUCC_0004"));
 	}
 
@@ -251,7 +253,7 @@ public class TsaSettleController extends TsaBaseController {
 		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
 
 		// DB 처리 시 사용되는 셀명 설정
-		String[] cellNames = {"occurYm", "custId", "custNm", "ordNo", "cateNm", "supplyCompCd", "supplyCompNm", "chargeNm", "ordGoods", "currPrice", "rewardAmt", "reason"};
+		String[] cellNames = {"occurYm", "custId", "custNm", "ordNo", "cateNm", "supplyVendorCd", "supplyVendorNm", "chargeNm", "ordGoods", "currPrice", "rewardAmt", "reason"};
 
 		Collection<GagaMap> ecxelList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, settleConfirm.getExcelFileNm()), 0, cellNames, 0);
 

+ 81 - 27
src/main/java/com/style24/admin/biz/web/TsaStatisticsController.java

@@ -2,9 +2,13 @@ package com.style24.admin.biz.web;
 
 import java.util.Collection;
 
+import javax.servlet.http.HttpServletRequest;
+
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
+import org.springframework.core.io.InputStreamResource;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -14,10 +18,15 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.gagaframework.web.util.GagaDateUtil;
+import com.gagaframework.web.util.GagaFileUtil;
 import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.biz.service.TsaStatisticsService;
 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.TscPageRequest;
+import com.style24.persistence.domain.GoodsSearch;
 import com.style24.persistence.domain.Statistics;
 
 import lombok.extern.slf4j.Slf4j;
@@ -202,10 +211,6 @@ public class TsaStatisticsController extends TsaBaseController {
 			statistics.setMultiGoodsCd(statistics.getGoodsCd().split(System.lineSeparator()));
 		}
 
-		if (!StringUtils.isBlank(statistics.getFormalGb())) {
-			statistics.setMultiFrontGb(statistics.getExtmallIdList().split(","));
-		}
-
 		return statisticsService.getGoodsOrderList(statistics);
 	}
 
@@ -261,10 +266,6 @@ public class TsaStatisticsController extends TsaBaseController {
 			statistics.setMultiGoodsCd(statistics.getGoodsCd().split(System.lineSeparator()));
 		}
 
-		if (!StringUtils.isBlank(statistics.getFormalGb())) {
-			statistics.setMultiFrontGb(statistics.getExtmallIdList().split(","));
-		}
-
 		return statisticsService.getExtmallOrderList(statistics);
 	}
 
@@ -319,10 +320,6 @@ public class TsaStatisticsController extends TsaBaseController {
 			statistics.setMultiGoodsCd(statistics.getGoodsCd().split(System.lineSeparator()));
 		}
 
-		if (!StringUtils.isBlank(statistics.getFormalGb())) {
-			statistics.setMultiFrontGb(statistics.getExtmallIdList().split(","));
-		}
-
 		return statisticsService.getChannelOrderList(statistics);
 	}
 
@@ -377,10 +374,6 @@ public class TsaStatisticsController extends TsaBaseController {
 			statistics.setMultiGoodsCd(statistics.getGoodsCd().split(System.lineSeparator()));
 		}
 
-		if (!StringUtils.isBlank(statistics.getFormalGb())) {
-			statistics.setMultiFrontGb(statistics.getExtmallIdList().split(","));
-		}
-
 		return statisticsService.getBrandOrderList(statistics);
 	}
 
@@ -436,10 +429,6 @@ public class TsaStatisticsController extends TsaBaseController {
 			statistics.setMultiGoodsCd(statistics.getGoodsCd().split(System.lineSeparator()));
 		}
 
-		if (!StringUtils.isBlank(statistics.getFormalGb())) {
-			statistics.setMultiFrontGb(statistics.getExtmallIdList().split(","));
-		}
-
 		return statisticsService.getHourlyOrderList(statistics);
 	}
 
@@ -495,10 +484,6 @@ public class TsaStatisticsController extends TsaBaseController {
 			statistics.setMultiGoodsCd(statistics.getGoodsCd().split(System.lineSeparator()));
 		}
 
-		if (!StringUtils.isBlank(statistics.getFormalGb())) {
-			statistics.setMultiFrontGb(statistics.getExtmallIdList().split(","));
-		}
-
 		return statisticsService.getCategoryOrderList(statistics);
 	}
 
@@ -565,11 +550,80 @@ public class TsaStatisticsController extends TsaBaseController {
 			statistics.setMultiGoodsCd(statistics.getGoodsCd().split(System.lineSeparator()));
 		}
 
-		if (!StringUtils.isBlank(statistics.getFormalGb())) {
-			statistics.setMultiFrontGb(statistics.getExtmallIdList().split(","));
+		return statisticsService.getClaimOrderList(statistics);
+	}
+
+
+	/**
+	 * 베스트 주문 화면
+	 * author: 이명철
+	 * return: ModelAndView
+	 * since: 2021. 9. 25.
+	 */
+	@GetMapping("/best/trading/form")
+	public ModelAndView bestTradingForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 정상이월구분
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+		mav.addObject("sexGbList", rendererService.getAvailCommonCodeList("G007"));
+
+		mav.setViewName("statistics/BestTradingForm");
+		return mav;
+	}
+
+	/**
+	 * 베스트 주문 조회
+	 * author: 이명철
+	 * return: Collection<Statistics>
+	 * since: 2021. 9. 25.
+	 */
+	@PostMapping("/best/order/list")
+	@ResponseBody
+	public Collection<Statistics> getBestOrderList(@RequestBody Statistics statistics) {
+
+		if (!StringUtils.isBlank(statistics.getExtmallIdList())) {
+			statistics.setMultiExtmallId(statistics.getExtmallIdList().split(","));
+		}
+
+		if (!StringUtils.isBlank(statistics.getSupplyCompCdList())) {
+			statistics.setMultiSupplyCompCd(statistics.getSupplyCompCdList().split(","));
 		}
 
-		return statisticsService.getClaimOrderList(statistics);
+		if (!StringUtils.isBlank(statistics.getAfLinkCdList())) {
+			statistics.setMultiAfLinkCd(statistics.getAfLinkCdList().split(","));
+		}
+
+		if (!StringUtils.isBlank(statistics.getBrandCdList())) {
+			statistics.setMultiBrandCd(statistics.getBrandCdList().split(","));
+		}
+
+		if (!StringUtils.isBlank(statistics.getItemkindCdList())) {
+			statistics.setMultiItemkindCd(statistics.getItemkindCdList().split(","));
+		}
+
+		if (!StringUtils.isBlank(statistics.getGoodsCd())) {
+			statistics.setMultiGoodsCd(statistics.getGoodsCd().split(System.lineSeparator()));
+		}
+
+		return statisticsService.getBestOrderList(statistics);
+	}
+
+
+	/**
+	 * 베스트상품 엑셀 다운로드
+	 * author: 이명철
+	 * return: ResponseEntity<InputStreamResource>
+	 * since: 2021. 9. 25.
+	 */
+	@GetMapping("/best/excel/down")
+	public ResponseEntity<InputStreamResource> downloadBestGoodsOrderList(HttpServletRequest request, Statistics statistics) throws Exception {
+		String excelfileName = "베스트상품 주문정보 " + GagaDateUtil.getTodayDateTime() + ".xlsx";
+		String excelFilenameWithPath = GagaFileUtil.getConcatenationPath(env.getProperty("download.path"), "excel", excelfileName);
+
+		statisticsService.getBestGoodsExcelList(statistics, excelFilenameWithPath);
+
+		return GagaFileUtil.writeFile(request, excelFilenameWithPath);
 	}
 
 }

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

@@ -59,6 +59,9 @@ public class Counsel extends TscBaseDomain {
 	private String assignedCsNm;	// 할당된CS담당자명
 	private String assignedYmd;		// 할당된연월일
 	private String assignedHms;		// 할당된시분초
+	private Integer assignerNo;		// 할당자번호
+	private String assignerNm;		// 할당자명
+	private String assignedDt;		// 할당일시
 	private String ansTitle;		// 답변제목
 	private String ansContent;		// 답변내용
 	private Integer ansNo;			// 답변자번호
@@ -76,7 +79,7 @@ public class Counsel extends TscBaseDomain {
 	private String termGb;			// 기간구분
 	private String termStdt;		// 검색시작날짜
 	private String termEddt;		// 검색끝날짜
-	
+
 	// Pagination
 	private TscPageRequest pageable;
 	private int pageNo = 1;

+ 2 - 0
src/main/java/com/style24/persistence/domain/DelvFeeSettle.java

@@ -16,6 +16,8 @@ import lombok.Data;
 public class DelvFeeSettle extends TscBaseDomain {
 
 	private String occurDt;				// 발생(출고/회수)일시
+	private String supplyVendorCd;		// 공급벤더코드
+	private String supplyVendorNm;		// 공급벤더명
 	private String supplyCompCd;		// 공급업체코드
 	private String supplyCompNm;		// 공급업체명
 	private String distributionGb;		// 유통구분

+ 2 - 0
src/main/java/com/style24/persistence/domain/GoodsSettle.java

@@ -22,6 +22,8 @@ public class GoodsSettle extends TscBaseDomain {
 	private String extmallOrderId;		// 제휴몰주문번호
 	private String extmallId;			// 제휴몰ID
 	private String extmallNm;			// 제휴몰명
+	private String supplyVendorCd;		// 공급벤더코드
+	private String supplyVendorNm;		// 공급벤더명
 	private String supplyCompCd;		// 공급업체코드
 	private String supplyCompNm;		// 공급업체명
 	private String distributionGb;		// 유통구분

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

@@ -16,6 +16,8 @@ import lombok.Data;
 public class SettleConfirm extends TscBaseDomain {
 
 	private String usacYm;				// 정산연월
+	private String supplyVendorCd;		// 공급벤더코드
+	private String supplyVendorNm;		// 공급벤더명
 	private String supplyCompCd;		// 공급업체코드
 	private String supplyCompNm;		// 공급업체명
 	private String econtractYn;			// 전자계약여부
@@ -58,6 +60,8 @@ public class SettleConfirm extends TscBaseDomain {
 	private String settleChargeTelno;	// 정산담당자연락처
 
 	// 검색조건
+	private String salesStdt;			// 매출시작일
+	private String salesEddt;			// 매출종료일
 	private String settleYm;			// 정산연월
 	private String supplyCompList;		// 공급업체코드목록
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)

+ 12 - 0
src/main/java/com/style24/persistence/domain/Statistics.java

@@ -91,6 +91,12 @@ public class Statistics extends TscBaseDomain {
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] dtGb;	// 날짜구분
 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiSexGb;	// 성별구분
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiAgeGb;	// 나이구분
+
 	// 일일거래내역
 	private Integer ordNo;				// 주문번호
 	private Integer ordDtlNo;			// 주문상세번호
@@ -164,6 +170,12 @@ public class Statistics extends TscBaseDomain {
 	private long rtnAmt;      //반품금액
 	private int chgQty;       //교환수량
 	private long chgDelvFee;  //교환금액
+	private int currPrice;    //판매가
+
+	private String imageViewYn;
+	private String sysImgUrl;
+	private String sysImgNm;
+	private boolean isMap;
 
 
 

+ 104 - 64
src/main/java/com/style24/persistence/mybatis/shop/TsaCounsel.xml

@@ -19,70 +19,77 @@
 	<!-- 1:1문의 목록 -->
 	<select id="getOneToOneQnaList" parameterType="Counsel" resultType="Counsel">
 		/* TsaCounsel.getOneToOneQnaList */
-		 SELECT Z.*
-		 FROM(
-		      SELECT @rownum := @rownum + 1 AS RNUM
-		            ,A.*
-		      FROM (
-		             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.SMS_REQ_YN                                                        /*SMS요청여부*/
-		                  , A.SMS_SEND_YN                                                       /*SMS발송여부*/
-		                  , A.EMAIL                                                             /*이메일*/
-		                  , 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
-		             JOIN ( SELECT @rownum := 0) R
-		             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 FN_ENC_AES(#{condition})||'%'
-		                 </if>
-		                 <if test="custGb == 'email'">
-		             AND    A.EMAIL LIKE FN_ENC_AES(#{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 Z.*
+		FROM   (
+		        SELECT @rownum := @rownum + 1 AS RNUM
+		             , A.*
+		        FROM   (
+		                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.SMS_REQ_YN                                                        /*SMS요청여부*/
+		                     , A.SMS_SEND_YN                                                       /*SMS발송여부*/
+		                     , A.EMAIL                                                             /*이메일*/
+		                     , A.ANS_STAT                                                          /*답변상태*/
+		                     , A.ASSIGNED_CS_NO                                                    /*할당된상담사번호*/
+		                     , (SELECT USER_NM
+		                        FROM   TB_USER
+		                        WHERE  USER_NO = A.ASSIGNED_CS_NO)             AS ASSIGNED_CS_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 D ON A.ANS_NO = D.USER_NO
+		                JOIN (SELECT @rownum := 0) R
+		                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 FN_ENC_AES(#{condition})||'%'
+		                    </if>
+		                    <if test="custGb == 'email'">
+		                AND    A.EMAIL LIKE FN_ENC_AES(#{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>
+		                <if test="assignedCsNo != null and assignedCsNo != ''">
+		                AND    A.ASSIGNED_CS_NO = #{assignedCsNo}
+		                </if>
+		                ORDER  BY A.QUEST_DT DESC
 		        <include refid="getListPagingCondition_sql"/>
 	</select>
 	
@@ -128,9 +135,26 @@
 		<if test="ansStat != null and ansStat != ''">
 		AND    A.ANS_STAT = #{ansStat}
 		</if>
+		<if test="assignedCsNo != null and assignedCsNo != ''">
+		AND    A.ASSIGNED_CS_NO = #{assignedCsNo}
+		</if>
 		ORDER  BY A.QUEST_DT DESC
 	</select>
 
+	<!--1:1문의 상담사 할당 Update -->
+	<update id="updateOneToOneQnaCounselor" parameterType="Counsel">
+		/* TsaCounsel.updateOneToOneQnaCounselor */
+		UPDATE TB_COUNSEL
+		SET    ASSIGNED_CS_NO = #{assignedCsNo}
+		     , ASSIGNED_YMD = DATE_FORMAT(NOW(),'%Y%m%d')
+		     , ASSIGNED_HMS = DATE_FORMAT(NOW(),'%H%i%S')
+		     , ASSIGNER_NO = #{updNo}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  COUNSEL_SQ = #{counselSq}
+		AND    ANS_STAT IN ('G060_00','G060_10') /*대기중,처리중*/
+	</update>
+
 	<!-- 1:1문의 상세 -->
 	<select id="getOneToOneQna" parameterType="Counsel" resultType="Counsel">
 		/* TsaCounsel.getOneToOneQna */
@@ -159,13 +183,29 @@
 		     , A.SYS_FILE_NM2                                                     /*시스템파일명2*/
 		     , A.ANS_STAT                                                         /*답변상태코드*/
 		     , FN_GET_CODE_NM('G060',A.ANS_STAT)              AS ANS_STAT_NM      /*답변상태명*/
+		     , A.ASSIGNED_CS_NO                                                   /*할당된상담사번호*/
+		     , D.USER_NM                                      AS ASSIGNER_NM      /*할당자명*/
+		     , DATE_FORMAT(CONCAT(A.ASSIGNED_YMD,A.ASSIGNED_HMS),'%Y-%m-%d %H:%i:%S') AS ASSIGNED_DT /*할당일시*/
 		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_NO = C.USER_NO
+		LEFT OUTER JOIN TB_USER D ON A.ASSIGNER_NO = D.USER_NO
 		WHERE  A.COUNSEL_SQ = #{counselSq}
 		AND    A.COUNSEL_TYPE = 'C' /*상담유형(1:1문의)*/
 	</select>
 	
+	<!--문의 답변 임시 저장 -->
+	<update id="updateQnaAnswerTemp" parameterType="Counsel">
+		/* TsaCounsel.updateQnaAnswerTemp */
+		UPDATE TB_COUNSEL
+		SET    ANS_TITLE = #{ansTitle}
+		     , ANS_CONTENT = #{ansContent}
+		     , ANS_STAT = 'G060_10' /*처리중*/
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  COUNSEL_SQ = #{counselSq}
+	</update>
+	
 	<!--문의 답변 저장 -->
 	<update id="updateQnaAnswer" parameterType="Counsel">
 		/* TsaCounsel.updateQnaAnswer */

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

@@ -609,7 +609,7 @@
 		     , CS.COUNSEL_TYPE
 		     , CS.QUEST_TITLE
 		     , CS.QUEST_CONTENT
-		     , CS.QUEST_DT
+		     , DATE_FORMAT(CS.QUEST_DT, '%Y%m%d%H%i%S') AS QUEST_DT
 		     , CS.ORG_FILE_NM1
 		     , CS.SYS_FILE_NM1
 		     , CS.ORG_FILE_NM2
@@ -620,18 +620,17 @@
 		     , CS.ANS_TRANS_NO
 		     , CS.ANS_TRANS_DT
 		     , CS.ASSIGNED_CS_NO
+		     , FN_GET_USER_NM(CS.ASSIGNED_CS_NO)        AS ASSIGNED_CS_NM
 		     , CS.ASSIGNED_YMD
 		     , CS.ASSIGNED_HMS
 		     , CS.ANS_TITLE
 		     , CS.ANS_CONTENT
-		     , CS.ANS_NO				 AS ANS_NO
-		     , FN_GET_USER_NM(CS.ANS_NO) AS ANS_NM
-		     , DATE_FORMAT(CS.ANS_DT, '%Y%m%d%H%i%S') AS ANS_DT
+		     , CS.ANS_NO
+		     , FN_GET_USER_NM(CS.ANS_NO)                AS ANS_NM
+		     , DATE_FORMAT(CS.ANS_DT, '%Y%m%d%H%i%S')   AS ANS_DT
 		     , CS.SECRET_YN
 		FROM  TB_COUNSEL CS
-		INNER JOIN
-		      TB_CUSTOMER C
-		ON    CS.CUST_NO = C.CUST_NO
+		INNER JOIN TB_CUSTOMER C ON CS.CUST_NO = C.CUST_NO
 		WHERE CS.COUNSEL_TYPE = 'C'
 		AND   CS.CUST_NO = #{custNo}
 		ORDER BY CS.REG_DT DESC

+ 11 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaRenderer.xml

@@ -508,4 +508,15 @@
 		ORDER  BY SUPPLY_VENDOR_NM
 	</select>
 	
+	<!-- 상담사 목록 -->
+	<select id="getCounselorList" resultType="CommonCode">
+		/* TsaRenderer.getCounselorList */
+		SELECT USER_NO                         AS CD
+		     , CONCAT(USER_NM,'(',USER_ID,')') AS CD_NM
+		FROM   TB_USER
+		WHERE  ROLE_CD IN ('G001_A300','G001_A301') /*CS관리자, CS상담사*/
+		AND    USE_YN = 'Y'
+		ORDER  BY USER_NM, USER_ID
+	</select>
+	
 </mapper>

+ 162 - 140
src/main/java/com/style24/persistence/mybatis/shop/TsaSettle.xml

@@ -12,6 +12,8 @@
 		     , ODIH.EXTMALL_ORDER_ID                                                      /*제휴몰주문번호*/
 		     , ODIH.EXTMALL_ID                                                            /*제휴몰ID*/
 		     , ODIH.EXTMALL_NM                                                            /*제휴몰명*/
+		     , ODIH.SUPPLY_VENDOR_CD                                                      /*공급벤더코드*/
+		     , ODIH.SUPPLY_VENDOR_NM                                                      /*공급벤더명*/
 		     , ODIH.SUPPLY_COMP_CD                                                        /*공급업체코드*/
 		     , ODIH.SUPPLY_COMP_NM                                                        /*공급업체명*/
 		     , ODIH.DISTRIBUTION_GB                                                       /*유통구분*/
@@ -76,12 +78,14 @@
 		             , OD.EXTMALL_ORDER_ID                                                                             /*제휴몰주문번호*/
 		             , OD.EXTMALL_ID                                                                                   /*제휴몰ID*/
 		             , E.EXTMALL_NM                                                                                    /*제휴몰명*/
+		             , SC.SUPPLY_VENDOR_CD                                                                             /*공급벤더코드*/
+		             , SV.SUPPLY_VENDOR_NM                                                                             /*공급벤더명*/
 		             , OD.SUPPLY_COMP_CD                                                                               /*공급업체코드*/
 		             , SC.SUPPLY_COMP_NM                                                                               /*공급업체명*/
 		             , SC.DISTRIBUTION_GB                                                                              /*유통구분*/
 		             , FN_GET_CODE_NM('G065',SC.DISTRIBUTION_GB)                            AS DISTRIBUTION_GB_NM      /*유통구분명*/
-		             , SC.SETTLE_DAY                                                                                   /*정산주기*/
-		             , FN_GET_CODE_NM('G075',SC.SETTLE_DAY)                                 AS SETTLE_DAY_NM           /*정산주기명*/
+		             , SV.SETTLE_DAY                                                                                   /*정산주기*/
+		             , FN_GET_CODE_NM('G075',SV.SETTLE_DAY)                                 AS SETTLE_DAY_NM           /*정산주기명*/
 		             , DATE_FORMAT(O.PAY_DT,'%Y-%m-%d %H:%i:%S')                            AS ORD_DT                  /*주문일시*/
 		             , ODIH.ORD_DTL_STAT                                                    AS SETTLE_GB               /*정산구분*/
 		             , FN_GET_CODE_NM('G720',ODIH.ORD_DTL_STAT)                             AS SETTLE_GB_NM            /*정산구분명*/
@@ -153,6 +157,7 @@
 		        INNER JOIN TB_ORDER_DETAIL OD ON ODIH.ORD_DTL_NO = OD.ORD_DTL_NO
 		        INNER JOIN TB_ORDER O ON ODIH.ORD_NO = O.ORD_NO
 		        INNER JOIN TB_SUPPLY_COMPANY SC ON OD.SUPPLY_COMP_CD = SC.SUPPLY_COMP_CD
+		        INNER JOIN TB_SUPPLY_VENDOR SV ON SC.SUPPLY_VENDOR_CD = SV.SUPPLY_VENDOR_CD
 		        INNER JOIN TB_GOODS G ON OD.GOODS_CD = G.GOODS_CD
 		        INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
 		        LEFT OUTER JOIN TB_EXTMALL E ON OD.EXTMALL_ID = E.EXTMALL_ID
@@ -197,21 +202,18 @@
 	</select>
 	
 	<!-- 정산확정 데이터 삭제 -->
-	<delete id="deleteSettleConfirm" parameterType="String">
+	<delete id="deleteSettleConfirm" parameterType="SettleConfirm">
 		/* TsaSettle.deleteSettleConfirm */
 		DELETE FROM TB_USAC
-		WHERE  USAC_YM = REPLACE(#{settleYm},'-','')
+		WHERE  USAC_DT BETWEEN REPLACE(#{salesStdt},'-','') AND REPLACE(#{salesEddt},'-','')
 	</delete>
 	
 	<!-- 정산확정 데이터 생성 -->
 	<insert id="createSettleConfirm" parameterType="SettleConfirm">
 		/* TsaSettle.createSettleConfirm */
 		INSERT INTO TB_USAC (
-		       USAC_YM
-		     , SUPPLY_COMP_CD
-		     , ECONTRACT_YN
-		     , DISTRIBUTION_GB
-		     , SETTLE_DAY
+		       USAC_DT
+		     , SUPPLY_VENDOR_CD
 		     , SELL_QTY
 		     , REAL_SELL_AMT
 		     , SELL_FEE_AMT
@@ -225,18 +227,11 @@
 		     , SUPPLY_AMT
 		     , TAX_AMT
 		     , DELV_FEE
-		     , BANK_CD
-		     , ACCOUNT_NO
-		     , DEPOSITOR_NM
-		     , BILL_EMAIL
 		     , REG_NO
 		     , REG_DT
 		)
-		SELECT ODIH.USAC_YM                                                       /*정산연월*/
-		     , ODIH.SUPPLY_COMP_CD                                                /*공급업체코드*/
-		     , SC.ECONTRACT_YN                                                    /*전자계약여부*/
-		     , SC.DISTRIBUTION_GB                                                 /*유통구분*/
-		     , SC.SETTLE_DAY                                                      /*정산주기*/
+		SELECT ODIH.USAC_DT                                                       /*정산일*/
+		     , SC.SUPPLY_VENDOR_CD                                                /*공급벤더코드*/
 		     , SUM(ODIH.SELL_QTY)                      AS SELL_QTY                /*판매수량*/
 		     , SUM(ODIH.REAL_SELL_AMT)                 AS REAL_SELL_AMT           /*실판매금액(=상품총액)*/
 		     , SUM(ODIH.SELL_FEE_AMT)                  AS SELL_FEE_AMT            /*수수료*/
@@ -258,14 +253,10 @@
 		                                     ELSE ODIH.SELL_FEE_AMT - (ODIH.SELF_CPN_DC_AMT + ODIH.SELF_TMTB_DC_AMT)
 		                                END) / 1.1,0)) AS TAX_AMT                /*세액*/
 		     , SUM(ODIH.DELV_FEE)                      AS DELV_FEE               /*배송비*/
-		     , SC.BANK_CD                                                        /*은행코드*/
-		     , SC.ACCOUNT_NO                                                     /*계좌번호*/
-		     , SC.DEPOSITOR_NM                                                   /*예금주명*/
-		     , SC.BILL_EMAIL                                                     /*세금계산서이메일*/
 		     , #{regNo}                                AS REG_NO
 		     , NOW()                                   AS REG_DT
 		FROM   (
-		        SELECT DATE_FORMAT(ODIH.OCCUR_DT,'%Y%m')            AS USAC_YM                 /*정산연월*/
+		        SELECT DATE_FORMAT(ODIH.OCCUR_DT,'%Y%m%d')          AS USAC_DT                 /*정산일*/
 		             , ODIH.SUPPLY_COMP_CD                                                     /*공급업체코드*/
 		             , SUM(ODIH.SELL_QTY)                           AS SELL_QTY                /*판매수량*/
 		             , SUM(ODIH.SELL_AMT
@@ -345,28 +336,28 @@
 		                                                  AND OD.SUPPLY_COMP_CD = TB2.TMTB_SUPPLY_CD
 		                LEFT OUTER JOIN TB_EXTMALL_USAC_PRICE EUP ON ODIH.ORD_DTL_ITEM_HST_SQ = EUP.ORD_DTL_ITEM_HST_SQ
 		                WHERE  1 = 1
-		                AND    ODIH.REG_DT <![CDATA[>=]]> STR_TO_DATE(CONCAT(#{settleYm},'-01'),'%Y-%m-%d')
-		                AND    ODIH.REG_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(CONCAT(#{settleYm},'-01'),'%Y-%m-%d'), INTERVAL 1 MONTH)
+		                AND    ODIH.REG_DT <![CDATA[>=]]> STR_TO_DATE(#{salesStdt},'%Y-%m-%d')
+		                AND    ODIH.REG_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{salesEddt},'%Y-%m-%d'), INTERVAL 1 DAY)
 		                AND    ODIH.ORD_DTL_STAT IN ('G720_20','G720_50','G720_60') /*판매-배송중,환입-반품완료,환입-교환완료*/
 		               ) ODIH
-		        GROUP  BY DATE_FORMAT(ODIH.OCCUR_DT,'%Y%m')
+		        GROUP  BY DATE_FORMAT(ODIH.OCCUR_DT,'%Y%m%d')
 		                , ODIH.SUPPLY_COMP_CD
 		        
 		        UNION ALL
 		        
 		        /*업체별배송비*/
-		        SELECT DATE_FORMAT(OD.OCCUR_DT,'%Y%m') AS USAC_YM                 /*정산연월*/
-		             , OD.SUPPLY_COMP_CD                                          /*공급업체코드*/
-		             , 0                               AS SELL_QTY                /*판매수량*/
-		             , 0                               AS REAL_SELL_AMT           /*실판매금액(=상품총액. 쿠폰과 다다익선만 차감. 상품권과 포인트는 포함)*/
-		             , 0                               AS SELL_FEE_AMT            /*수수료*/
-		             , 0                               AS CPN_DC_AMT              /*쿠폰할인금액*/
-		             , 0                               AS SELF_CPN_DC_AMT         /*자사쿠폰분담액*/
-		             , 0                               AS SUPPLY_COMP_CPN_DC_AMT  /*입점쿠폰분담액*/
-		             , 0                               AS TMTB_DC_AMT             /*다다익선할인금액*/
-		             , 0                               AS SELF_TMTB_DC_AMT        /*자사다다익선분담액*/
-		             , 0                               AS SUPPLY_COMP_TMTB_DC_AMT /*입점다다익선분담액*/
-		             , SUM(DF.DELV_FEE)                AS DELV_FEE                /*배송비*/
+		        SELECT DATE_FORMAT(OD.OCCUR_DT,'%Y%m%d') AS USAC_DT                 /*정산일*/
+		             , OD.SUPPLY_COMP_CD                                            /*공급업체코드*/
+		             , 0                                 AS SELL_QTY                /*판매수량*/
+		             , 0                                 AS REAL_SELL_AMT           /*실판매금액(=상품총액. 쿠폰과 다다익선만 차감. 상품권과 포인트는 포함)*/
+		             , 0                                 AS SELL_FEE_AMT            /*수수료*/
+		             , 0                                 AS CPN_DC_AMT              /*쿠폰할인금액*/
+		             , 0                                 AS SELF_CPN_DC_AMT         /*자사쿠폰분담액*/
+		             , 0                                 AS SUPPLY_COMP_CPN_DC_AMT  /*입점쿠폰분담액*/
+		             , 0                                 AS TMTB_DC_AMT             /*다다익선할인금액*/
+		             , 0                                 AS SELF_TMTB_DC_AMT        /*자사다다익선분담액*/
+		             , 0                                 AS SUPPLY_COMP_TMTB_DC_AMT /*입점다다익선분담액*/
+		             , SUM(DF.DELV_FEE)                  AS DELV_FEE                /*배송비*/
 		        FROM   (
 		                SELECT DISTINCT
 		                       ODIH.REG_DT       AS OCCUR_DT  /*발생일시*/
@@ -378,34 +369,29 @@
 		                     , TB_GOODS G
 		                WHERE  ODIH.ORD_DTL_NO = OD.ORD_DTL_NO
 		                AND    OD.GOODS_CD = G.GOODS_CD
-		                AND    ODIH.REG_DT <![CDATA[>=]]> STR_TO_DATE(CONCAT(#{settleYm},'-01'),'%Y-%m-%d')
-		                AND    ODIH.REG_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(CONCAT(#{settleYm},'-01'),'%Y-%m-%d'), INTERVAL 1 MONTH)
+		                AND    ODIH.REG_DT <![CDATA[>=]]> STR_TO_DATE(#{salesStdt},'%Y-%m-%d')
+		                AND    ODIH.REG_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{salesEddt},'%Y-%m-%d'), INTERVAL 1 DAY)
 		                AND    ODIH.ORD_DTL_STAT IN ('G720_20','G720_50','G720_60') /*판매-배송중,환입-반품완료,환입-교환완료*/
 		               ) OD
 		             , TB_DELIVERY_FEE DF
 		        WHERE  OD.SUPPLY_COMP_CD = DF.SUPPLY_COMP_CD
 		        AND    OD.ORD_NO = DF.ORD_NO
 		        AND    OD.OCCUR_DT >= DF.REG_DT /*출고기준의 일자 보다 배송비 발생일자가 적은 넘만*/
-		        GROUP  BY DATE_FORMAT(OD.OCCUR_DT,'%Y%m')
+		        GROUP  BY DATE_FORMAT(OD.OCCUR_DT,'%Y%m%d')
 		                , OD.SUPPLY_COMP_CD
 		       ) ODIH
 		     , TB_SUPPLY_COMPANY SC
 		WHERE  ODIH.SUPPLY_COMP_CD = SC.SUPPLY_COMP_CD
-		GROUP  BY ODIH.USAC_YM
-		     , ODIH.SUPPLY_COMP_CD
-		     , SC.ECONTRACT_YN
-		     , SC.DISTRIBUTION_GB
-		     , SC.SETTLE_DAY
-		     , SC.BANK_CD
-		     , SC.ACCOUNT_NO
-		     , SC.DEPOSITOR_NM
-		     , SC.BILL_EMAIL
+		GROUP  BY ODIH.USAC_DT
+		        , SC.SUPPLY_VENDOR_CD
 	</insert>
 	
 	<!-- 배송비정산 목록 -->
 	<select id="getDeliveryFeeSettleList" parameterType="DelvFeeSettle" resultType="DelvFeeSettle">
 		/* TsaSettle.getDeliveryFeeSettleList */
 		SELECT DATE_FORMAT(OD.OCCUR_DT,'%Y-%m-%d')       AS OCCUR_DT           /*발생(출고/회수)일시*/
+		     , SV.SUPPLY_VENDOR_CD                                             /*공급벤더코드*/
+		     , SV.SUPPLY_VENDOR_NM                                             /*공급벤더명*/
 		     , OD.SUPPLY_COMP_CD                                               /*공급업체코드*/
 		     , SC.SUPPLY_COMP_NM                                               /*공급업체명*/
 		     , FN_GET_CODE_NM('G065',SC.DISTRIBUTION_GB) AS DISTRIBUTION_GB_NM /*유통구분명*/
@@ -433,41 +419,45 @@
 		            #{item}
 		            </foreach>
 		        </if>
-			    <if test="multiBrand != null and multiBrand != ''">
+		        <if test="multiBrand != null and multiBrand != ''">
 		        AND    G.BRAND_CD IN
 		            <foreach collection="multiBrand" item="item" index="index"  open="(" close=")" separator=",">
 		            #{item}
 		            </foreach>
 		        </if>
-			   ) OD
-			 , TB_DELIVERY_FEE DF
+		       ) OD
+		     , TB_DELIVERY_FEE DF
 		     , TB_SUPPLY_COMPANY SC
+		     , TB_SUPPLY_VENDOR SV
 		WHERE  OD.SUPPLY_COMP_CD = DF.SUPPLY_COMP_CD
 		AND    OD.ORD_NO = DF.ORD_NO
 		AND    OD.OCCUR_DT >= DF.REG_DT /*출고기준의 일자 보다 배송비 발생일자가 적은 넘만*/
 		AND    OD.SUPPLY_COMP_CD = SC.SUPPLY_COMP_CD
+		AND    SC.SUPPLY_VENDOR_CD = SV.SUPPLY_VENDOR_CD
 		<if test='distributionGb != null and distributionGb != ""'>
 		AND    SC.DISTRIBUTION_GB = #{distributionGb}
 		</if>
 		GROUP  BY DATE_FORMAT(OD.OCCUR_DT,'%Y-%m-%d')
+		        , SV.SUPPLY_VENDOR_CD
+		        , SV.SUPPLY_VENDOR_NM
 		        , OD.SUPPLY_COMP_CD
 		        , SC.SUPPLY_COMP_NM
 		        , SC.DISTRIBUTION_GB
 		        , DF.DELV_FEE_GB
 		        , OD.ORD_NO
-		ORDER  BY DATE_FORMAT(OD.OCCUR_DT,'%Y-%m-%d'), OD.SUPPLY_COMP_CD, DF.DELV_FEE_GB
+		ORDER  BY DATE_FORMAT(OD.OCCUR_DT,'%Y-%m-%d'), SV.SUPPLY_VENDOR_CD, OD.SUPPLY_COMP_CD, DF.DELV_FEE_GB
 	</select>
 	
 	<!-- 정산확정 목록 -->
 	<select id="getSettleConfirmList" parameterType="SettleConfirm" resultType="SettleConfirm">
 		/* TsaSettle.getSettleConfirmList */
 		SELECT U.USAC_YM                                                                                                 /*정산연월*/
-		     , U.SUPPLY_COMP_CD                                                                                          /*공급업체코드*/
-		     , SC.SUPPLY_COMP_NM                                                                                         /*공급업체명*/
-		     , U.ECONTRACT_YN                                                                                            /*전자계약여부*/
+		     , U.SUPPLY_VENDOR_CD                                                                                        /*공급벤더코드*/
+		     , SV.SUPPLY_VENDOR_NM                                                                                       /*공급벤더명*/
+		     , SV.ECONTRACT_YN                                                                                           /*전자계약여부*/
 		     , SV.BIZ_NO                                                                                                 /*사업자번호*/
-		     , U.SETTLE_DAY                                                                                              /*정산주기*/
-		     , FN_GET_CODE_NM('G075',U.SETTLE_DAY)                                                     AS SETTLE_DAY_NM  /*정산주기명*/
+		     , SV.SETTLE_DAY                                                                                             /*정산주기*/
+		     , FN_GET_CODE_NM('G075',SV.SETTLE_DAY)                                                     AS SETTLE_DAY_NM /*정산주기명*/
 		     , U.SELL_QTY                                                                                                /*판매수량*/
 		     , U.REAL_SELL_AMT                                                                                           /*실판매금액(=상품총액)*/
 		     , U.SELL_FEE_AMT                                                                                            /*수수료*/
@@ -488,7 +478,7 @@
 		     , (U.REAL_SELL_AMT - U.SELL_FEE_AMT + U.SELF_CPN_DC_AMT + U.SELF_TMTB_DC_AMT)
 		       + U.DELV_FEE - IFNULL(UR2.ETC_DEDUCT_AMT,0)
 		       - IFNULL(UR1.RECEIVABLE_AMT,0)                                                          AS TOT_GIVE_AMT   /*총지급금액*/
-		     , CASE WHEN U.ECONTRACT_YN = 'N' THEN '보류'
+		     , CASE WHEN SV.ECONTRACT_YN = 'N' THEN '보류'
 		            ELSE
 		                CASE WHEN (U.BILL_AMT + U.DELV_FEE - IFNULL(UR2.ETC_DEDUCT_AMT,0)) <![CDATA[<]]> 0 THEN
 		                         '미수금'
@@ -496,32 +486,54 @@
 		                         '정상'
 		                END
 		       END                                                                                     AS SETTLE_STAT    /*정산상태*/
-		     , U.BANK_CD                                                                                                 /*은행코드*/
-		     , FN_GET_CODE_NM('G940',U.BANK_CD)                                                        AS BANK_NM        /*은행명*/
-		     , U.ACCOUNT_NO                                                                                              /*계좌번호*/
-		     , U.DEPOSITOR_NM                                                                                            /*예금주명*/
-		     , U.BILL_EMAIL                                                                                              /*계산서이메일*/
-		FROM   TB_USAC U
-		INNER JOIN TB_SUPPLY_COMPANY SC ON U.SUPPLY_COMP_CD = SC.SUPPLY_COMP_CD
-		INNER JOIN TB_SUPPLY_VENDOR SV ON SC.SUPPLY_VENDOR_CD = SV.SUPPLY_VENDOR_CD
+		     , SV.BANK_CD                                                                                                /*은행코드*/
+		     , FN_GET_CODE_NM('G940',SV.BANK_CD)                                                       AS BANK_NM        /*은행명*/
+		     , SV.ACCOUNT_NO                                                                                             /*계좌번호*/
+		     , SV.DEPOSITOR_NM                                                                                           /*예금주명*/
+		     , SV.BILL_EMAIL                                                                                             /*계산서이메일*/
+		FROM   (
+		        SELECT DATE_FORMAT(U.USAC_DT,'%Y%m')                    AS USAC_YM                 /*정산연월*/
+		             , U.SUPPLY_VENDOR_CD                                                          /*공급벤더코드*/
+		             , SUM(U.SELL_QTY)                                  AS SELL_QTY                /*판매수량*/
+		             , SUM(U.REAL_SELL_AMT)                             AS REAL_SELL_AMT           /*실판매금액(=상품총액)*/
+		             , SUM(U.SELL_FEE_AMT)                              AS SELL_FEE_AMT            /*수수료*/
+		             , SUM(U.CPN_DC_AMT)                                AS CPN_DC_AMT              /*쿠폰할인금액*/
+		             , SUM(U.SELF_CPN_DC_AMT)                           AS SELF_CPN_DC_AMT         /*자사쿠폰분담액*/
+		             , SUM(U.SUPPLY_COMP_CPN_DC_AMT)                    AS SUPPLY_COMP_CPN_DC_AMT  /*입점쿠폰분담액*/
+		             , SUM(U.TMTB_DC_AMT)                               AS TMTB_DC_AMT             /*다다익선할인금액*/
+		             , SUM(U.SELF_TMTB_DC_AMT)                          AS SELF_TMTB_DC_AMT        /*자사다다익선분담액*/
+		             , SUM(U.SUPPLY_COMP_TMTB_DC_AMT)                   AS SUPPLY_COMP_TMTB_DC_AMT /*입점다다익선분담액*/
+		             , SUM(U.BILL_AMT)                                  AS BILL_AMT                /*계산서발행금액*/
+		             , SUM(U.SUPPLY_AMT)                                AS SUPPLY_AMT              /*공급금액*/
+		             , SUM(U.TAX_AMT)                                   AS TAX_AMT                 /*세액*/
+		             , SUM(U.DELV_FEE)                                  AS DELV_FEE                /*배송비*/
+		        FROM   TB_USAC U
+		        WHERE  1 = 1
+		        AND    U.USAC_DT <![CDATA[>=]]> REPLACE(CONCAT(#{settleYm},'-01'),'-','')
+		        AND    U.USAC_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(CONCAT(#{settleYm},'-01'),'%Y-%m-%d'), INTERVAL 1 MONTH)
+		        <if test="multiSupplyComp != null and multiSupplyComp != ''">
+		        AND    U.SUPPLY_VENDOR_CD IN (SELECT SUPPLY_VENDOR_CD
+		                                      FROM   TB_SUPPLY_COMPANY
+		                                      WHERE  SUPPLY_COMP_CD IN
+		                                      <foreach collection="multiSupplyComp" item="item" index="index"  open="(" close=")" separator=",">
+		                                      #{item}
+		                                      </foreach>
+		                                     )
+		        </if>
+		        GROUP  BY DATE_FORMAT(U.USAC_DT,'%Y%m'), U.SUPPLY_VENDOR_CD
+		       ) U
+		INNER JOIN TB_SUPPLY_VENDOR SV ON U.SUPPLY_VENDOR_CD = SV.SUPPLY_VENDOR_CD
 		LEFT OUTER JOIN TB_USAC_RECEIVE UR1 ON U.USAC_YM = UR1.USAC_YM
-		                                   AND U.SUPPLY_COMP_CD = UR1.SUPPLY_COMP_CD
+		                                   AND U.SUPPLY_VENDOR_CD = UR1.SUPPLY_VENDOR_CD
 		LEFT OUTER JOIN (
-		                 SELECT OCCUR_YM        AS USAC_YM
-		                      , SUPPLY_COMP_CD
-		                      , SUM(REWARD_AMT) AS ETC_DEDUCT_AMT
+		                 SELECT OCCUR_YM         AS USAC_YM
+		                      , SUPPLY_VENDOR_CD
+		                      , SUM(REWARD_AMT)  AS ETC_DEDUCT_AMT
 		                 FROM   TB_USAC_DEDUCT
 		                 WHERE  OCCUR_YM = REPLACE(#{settleYm},'-','')
-		                 GROUP  BY OCCUR_YM, SUPPLY_COMP_CD
+		                 GROUP  BY OCCUR_YM, SUPPLY_VENDOR_CD
 		                ) UR2 ON U.USAC_YM = UR2.USAC_YM
-		                     AND U.SUPPLY_COMP_CD = UR2.SUPPLY_COMP_CD
-		WHERE  U.USAC_YM = REPLACE(#{settleYm},'-','')
-		<if test="multiSupplyComp != null and multiSupplyComp != ''">
-		AND    U.SUPPLY_COMP_CD IN
-		    <foreach collection="multiSupplyComp" item="item" index="index"  open="(" close=")" separator=",">
-		    #{item}
-		    </foreach>
-		</if>
+		                     AND U.SUPPLY_VENDOR_CD = UR2.SUPPLY_VENDOR_CD
 	</select>
 	
 	<!-- 정산확정 미수금 생성 -->
@@ -529,7 +541,7 @@
 		/* TsaSettle.createReceivableAmt */
 		INSERT INTO TB_USAC_RECEIVE (
 		       USAC_YM
-		     , SUPPLY_COMP_CD
+		     , SUPPLY_VENDOR_CD
 		     , RECEIVABLE_AMT
 		     , REG_NO
 		     , REG_DT
@@ -538,7 +550,7 @@
 		)
 		VALUES (
 		       #{usacYm}
-		     , #{supplyCompCd}
+		     , #{supplyVendorCd}
 		     , IFNULL(#{receivableAmt},0)
 		     , #{regNo}
 		     , NOW()
@@ -557,8 +569,8 @@
 		INSERT INTO TB_USAC_DEDUCT (
 		       DEDUCT_SQ
 		     , OCCUR_YM
-		     , SUPPLY_COMP_CD
-		     , SUPPLY_COMP_NM
+		     , SUPPLY_VENDOR_CD
+		     , SUPPLY_VENDOR_NM
 		     , CUST_ID
 		     , CUST_NM
 		     , ORD_NO
@@ -574,8 +586,8 @@
 		VALUES (
 		       NULL
 		     , REPLACE(#{occurYm},'-','')
-		     , #{supplyCompCd}
-		     , #{supplyCompNm}
+		     , #{supplyVendorCd}
+		     , #{supplyVendorNm}
 		     , #{custId}
 		     , #{custNm}
 		     , #{ordNo}
@@ -593,27 +605,42 @@
 	<!-- 세금계산서용 정산 목록 -->
 	<select id="getTaxBillSettleList" parameterType="SettleConfirm" resultType="SettleConfirm">
 		/* TsaSettle.getTaxBillSettleList */
-		SELECT U.USAC_YM                                /*정산연월*/
-		     , '상품판매수수료'            AS BILL_TYPE /*계산서유형*/
-		     , U.SUPPLY_AMT                             /*공급가액*/
-		     , U.TAX_AMT                                /*세액*/
-		     , U.BILL_AMT                  AS TRADE_AMT /*계산서발행금액*/
-		     , SV.BIZ_NO                                /*사업자번호*/
-		     , U.SUPPLY_COMP_CD                         /*공급업체코드*/
-		     , SC.SUPPLY_COMP_NM                        /*공급업체명*/
-		     , SV.OWNER_NM                              /*대표자명*/
-		     , SV.BIZ_TYPE                              /*업태*/
-		     , SV.BIZ_KIND                              /*업종*/
-		     , SV.BIZ_BASE_ADDR                         /*사업장기본주소*/
-		     , SV.BIZ_DTL_ADDR                          /*사업장상세주소*/
-		     , SC.SETTLE_CHARGE_NM                      /*정산담당자명*/
-		     , SC.SETTLE_CHARGE_TELNO                   /*정산담당자전화번호*/
-		     , U.BILL_EMAIL                             /*계산서이메일*/
-		     , U.BILL_AMT                               /*계산서발행금액*/
-		FROM   TB_USAC U
-		INNER JOIN TB_SUPPLY_COMPANY SC ON U.SUPPLY_COMP_CD = SC.SUPPLY_COMP_CD
-		INNER JOIN TB_SUPPLY_VENDOR SV ON SC.SUPPLY_VENDOR_CD = SV.SUPPLY_VENDOR_CD
-		WHERE  U.USAC_YM = REPLACE(#{settleYm},'-','')
+		SELECT U.USAC_YM                                  /*정산연월*/
+		     , '상품판매수수료'    AS BILL_TYPE           /*계산서유형*/
+		     , U.SUPPLY_AMT                               /*공급가액*/
+		     , U.TAX_AMT                                  /*세액*/
+		     , U.BILL_AMT          AS TRADE_AMT           /*거래금액*/
+		     , SV.BIZ_NO                                  /*사업자번호*/
+		     , U.SUPPLY_VENDOR_CD                         /*공급업체코드*/
+		     , SV.SUPPLY_VENDOR_NM                        /*공급업체명*/
+		     , SV.OWNER_NM                                /*대표자명*/
+		     , SV.BIZ_TYPE                                /*업태*/
+		     , SV.BIZ_KIND                                /*업종*/
+		     , SV.BIZ_BASE_ADDR                           /*사업장기본주소*/
+		     , SV.BIZ_DTL_ADDR                            /*사업장상세주소*/
+		     , (SELECT MAX(SETTLE_CHARGE_NM)
+		        FROM   TB_SUPPLY_COMPANY
+		        WHERE  SUPPLY_VENDOR_CD = SV.SUPPLY_VENDOR_CD
+		       )                   AS SETTLE_CHARGE_NM    /*정산담당자명*/
+		     , (SELECT MAX(SETTLE_CHARGE_TELNO)
+		        FROM   TB_SUPPLY_COMPANY
+		        WHERE  SUPPLY_VENDOR_CD = SV.SUPPLY_VENDOR_CD
+		       )                   AS SETTLE_CHARGE_TELNO /*정산담당자전화번호*/
+		     , SV.BILL_EMAIL                              /*계산서이메일*/
+		     , U.BILL_AMT                                 /*계산서발행금액*/
+		FROM   (
+		        SELECT DATE_FORMAT(U.USAC_DT,'%Y%m') AS USAC_YM    /*정산연월*/
+		             , U.SUPPLY_VENDOR_CD                          /*공급업체코드*/
+		             , SUM(U.SUPPLY_AMT)             AS SUPPLY_AMT /*공급가액*/
+		             , SUM(U.TAX_AMT)                AS TAX_AMT    /*세액*/
+		             , SUM(U.BILL_AMT)               AS BILL_AMT   /*계산서발행금액*/
+		        FROM   TB_USAC U
+		        WHERE  1 = 1
+		        AND    U.USAC_DT <![CDATA[>=]]> REPLACE(CONCAT(#{settleYm},'-01'),'-','')
+		        AND    U.USAC_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(CONCAT(#{settleYm},'-01'),'%Y-%m-%d'), INTERVAL 1 MONTH)
+		        GROUP  BY DATE_FORMAT(U.USAC_DT,'%Y%m'), U.SUPPLY_VENDOR_CD
+		       ) U
+		INNER JOIN TB_SUPPLY_VENDOR SV ON U.SUPPLY_VENDOR_CD = SV.SUPPLY_VENDOR_CD
 	</select>
 	
 	<!-- 상품권현황 목록 -->
@@ -720,39 +747,34 @@
 		                              - GFCD_USE_AMT
 		                    ) / 1.1,0))          AS SALES_AMT      /*매출금액(VAT제외). 건별로 1.1로 나누고 소숫점을 절사하여 합계를 낸다.*/
 		FROM   (
-		        SELECT AL.AF_CHANNEL
-		             , ODH.AF_LINK_CD                                              /*제휴링크코드*/
-		             , AL.AF_LINK_NM
-		             , DATE_FORMAT(ODH.REG_DT,'%Y-%m-%d %H:%i:%S') AS OCCUR_DT     /*발생일자*/
-		             , ODH.ORD_NO
-		             , ODH.ORD_DTL_NO
-		             , CASE WHEN ODH.ORD_DTL_STAT = 'G013_20' THEN
-		                        FN_GET_CODE_NM('G013',ODH.ORD_DTL_STAT)
-		                    ELSE
-		                        IFNULL(FN_GET_CODE_NM('G685',OCD.CHG_STAT),'주문취소')
-		               END                                         AS ORD_DTL_STAT /*주문상세상태*/
-		             , (ODH.ORD_AMT - ODH.CNCL_RTN_AMT)            AS SELL_AMT     /*판매금액(상품금액.배송비제외)*/
-		             , ODH.CPN1_DC_AMT                                             /*1차쿠폰(즉시할인쿠폰)할인금액*/
-		             , ODH.TMTB1_DC_AMT                                            /*다다익선할인금액(수량)*/
-		             , ODH.TMTB2_DC_AMT                                            /*다다익선할인금액(금액)*/
-		             , ODH.GOODS_CPN_DC_AMT                                        /*상품쿠폰할인금액*/
-		             , ODH.CART_CPN_DC_AMT                                         /*장바구니할인금액*/
-		             , 0                                           AS PG_CPN_AMT   /*PG쿠폰금액.TODO:바로 아래 쿼리문으로 대체해야 함*/
-		             -- , ODH.PG_CPN_AMT                                              /*PG쿠폰금액*/
-		             , ODH.PNT_DC_AMT                                              /*포인트할인금액*/
-		             , ODH.PRE_PNT_DC_AMT                                          /*선포인트할인금액*/
-		             , ODH.GFCD_USE_AMT                                            /*상품권사용금액*/
-		        FROM   TB_ORDER_DETAIL_HST ODH
-		        INNER JOIN TB_AF_LINK AL
-		                ON ODH.AF_LINK_CD = AL.AF_LINK_CD
-		        LEFT OUTER JOIN TB_ORDER_CHANGE_DETAIL OCD
-		                     ON ODH.ORD_DTL_NO = OCD.ORD_DTL_NO
-		                    AND OCD.CHG_STAT IN ('G685_21','G685_32','G685_42')	/*취소완료,교환완료,반품완료*/
-		        WHERE  ODH.ORD_DTL_STAT IN ('G013_20','G013_99') /*결제완료,주문취소*/
-		        AND    ODH.REG_DT <![CDATA[>=]]> STR_TO_DATE(#{startDt},'%Y-%m-%d')
-		        AND    ODH.REG_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{endDt},'%Y-%m-%d'),INTERVAL 1 DAY)
+		        SELECT AL.AF_CHANNEL                                                                                                       /*제휴채널*/
+		             , OD.AF_LINK_CD                                                                                                       /*제휴링크코드*/
+		             , AL.AF_LINK_NM                                                                                                       /*제휴링크명*/
+		             , DATE_FORMAT(ODIH.REG_DT,'%Y-%m-%d %H:%i:%S')                                                    AS OCCUR_DT         /*발생일자*/
+		             , ODIH.ORD_NO                                                                                                         /*주문번호*/
+		             , ODIH.ORD_DTL_NO                                                                                                     /*주문상세번호*/
+		             , IF(ODIH.ORD_DTL_STAT = 'G720_10','결제완료',IFNULL(FN_GET_CODE_NM('G685',OCD.CHG_STAT),'주문취소')) AS ORD_DTL_STAT     /*주문상세상태*/
+		             , IF(ODIH.ORD_DTL_STAT = 'G720_10',ODIH.ORD_AMT,-1 * ODIH.CNCL_RTN_AMT)                           AS SELL_AMT         /*판매금액(상품금액.배송비제외)*/
+		             , IF(ODIH.ORD_DTL_STAT = 'G720_10',1,-1) * ODIH.CPN1_DC_AMT                                       AS CPN1_DC_AMT      /*1차쿠폰(즉시할인쿠폰)할인금액*/
+		             , IF(ODIH.ORD_DTL_STAT = 'G720_10',1,-1) * ODIH.TMTB1_DC_AMT                                      AS TMTB1_DC_AMT     /*다다익선할인금액(수량)*/
+		             , IF(ODIH.ORD_DTL_STAT = 'G720_10',1,-1) * ODIH.TMTB2_DC_AMT                                      AS TMTB2_DC_AMT     /*다다익선할인금액(금액)*/
+		             , IF(ODIH.ORD_DTL_STAT = 'G720_10',1,-1) * ODIH.GOODS_CPN_DC_AMT                                  AS GOODS_CPN_DC_AMT /*상품쿠폰할인금액*/
+		             , IF(ODIH.ORD_DTL_STAT = 'G720_10',1,-1) * ODIH.CART_CPN_DC_AMT                                   AS CART_CPN_DC_AMT  /*장바구니할인금액*/
+		             , 0                                                                                               AS PG_CPN_AMT       /*PG쿠폰금액.TODO:바로 아래 쿼리문으로 대체해야 함*/
+		             -- , IF(ODIH.ORD_DTL_STAT = 'G720_10',1,-1) * ODIH.PG_CPN_AMT                                     AS PG_CPN_AMT       /*PG쿠폰금액*/
+		             , IF(ODIH.ORD_DTL_STAT = 'G720_10',1,-1) * ODIH.PNT_DC_AMT                                        AS PNT_DC_AMT       /*포인트할인금액*/
+		             , IF(ODIH.ORD_DTL_STAT = 'G720_10',1,-1) * ODIH.PRE_PNT_DC_AMT                                    AS PRE_PNT_DC_AMT   /*선포인트할인금액*/
+		             , IF(ODIH.ORD_DTL_STAT = 'G720_10',1,-1) * ODIH.GFCD_USE_AMT                                      AS GFCD_USE_AMT     /*상품권사용금액*/
+		        FROM   TB_ORDER_DETAIL_ITEM_HST ODIH
+		        INNER JOIN TB_ORDER_DETAIL OD ON ODIH.ORD_DTL_NO = OD.ORD_DTL_NO
+		        INNER JOIN TB_AF_LINK AL ON OD.AF_LINK_CD = AL.AF_LINK_CD
+		        LEFT OUTER JOIN TB_ORDER_CHANGE_DETAIL OCD ON ODIH.ORD_DTL_NO = OCD.ORD_DTL_NO
+		                                                  AND OCD.CHG_STAT IN ('G685_21','G685_32','G685_42') /*취소완료,교환완료,반품완료*/
+		        WHERE  ODIH.ORD_DTL_STAT IN ('G720_10','G720_30','G720_40') /*판매-결제완료,환입-취소완료,환입-품절취소*/
+		        AND    ODIH.REG_DT <![CDATA[>=]]> STR_TO_DATE(#{startDt},'%Y-%m-%d')
+		        AND    ODIH.REG_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{endDt},'%Y-%m-%d'),INTERVAL 1 DAY)
 		        <if test="ordNo != null and ordNo != ''">
-		        AND    ODH.ORD_NO = #{ordNo}
+		        AND    ODIH.ORD_NO = #{ordNo}
 		        </if>
 		        <if test="afLinkCd != null and afLinkCd != ''">
 		        AND    AL.AF_LINK_CD = #{afLinkCd}

+ 71 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaStatistics.xml

@@ -1031,4 +1031,75 @@
 		GROUP BY DATE_FORMAT(DAY, '%m-%d')
 	</select>
 
+	<!-- 베스트 상품 조회 -->
+	<sql id="getBestOrderListSql">
+        /* TsaStatistics.getBestOrderList */
+        SELECT
+            (SELECT SUBSTRING_INDEX(SYS_IMG_NM , '/', 2) FROM TB_GOODS_IMG X WHERE X.GOODS_CD = B.GOODS_CD AND X.DEFAULT_IMG_YN = 'Y' LIMIT 1) AS SYS_IMG_NM /*상품이미지*/
+            , C.BRAND_ENM /*브랜드명*/
+            , A.GOODS_CD /*상품코드*/
+            , B.GOODS_NM /*상품명*/
+            , CASE WHEN A.DISTRIBUTION_GB = 'WMS' THEN '위탁' ELSE '입점' END AS DISTRIBUTION_GB /*구분*/
+            , B.CURR_PRICE /*판매가*/
+            , SUM(A.SELL_QTY - A.CNCL_QTY - A.RTN_QTY) AS SELL_QTY /*판매수*/
+            , SUM(A.SELF_AMT + A.CHANNEL_AMT + A.EXTMALL_AMT - A.CNCL_AMT - A.RTN_AMT) AS TOT_AMT /*매출액*/
+            , SUM(D.STOCK_QTY) AS STOCK_QTY /*현재고수량*/
+        FROM TB_STAT_ORD_DAY A, TB_GOODS B, TB_BRAND C, TB_GOODS_STOCK D
+        WHERE A.GOODS_CD = B.GOODS_CD
+            AND A.BRAND_CD = C.BRAND_CD
+            AND A.GOODS_CD = D.GOODS_CD
+            <![CDATA[
+            /* 직접선택 */
+            AND A.DAY >= DATE_FORMAT(#{startDt}, '%Y%m%d')
+            AND A.DAY <  DATE_ADD(DATE_FORMAT(#{endDt}, '%Y%m%d'), INTERVAL 1 DAY)
+            ]]>
+            <if test="multiFrontGb != null">
+                /* 디바이스 */
+                <foreach collection="multiFrontGb" item="item" index="index"  open="AND A.FRONT_GB IN (" close=")" separator=",">#{item}</foreach>
+            </if>
+            <if test="multiExtmallId != null">
+                /* 제휴몰 */
+                <foreach collection="multiExtmallId" item="item" index="index"  open="AND A.EXTMALL_ID IN (" close=")" separator=",">#{item}</foreach>
+            </if>
+            <if test="multiDistributionGb != null">
+                /* 물류구분 */
+                <foreach collection="multiDistributionGb" item="item" index="index"  open="AND A.DISTRIBUTION_GB IN (" close=")" separator=",">#{item}</foreach>
+            </if>
+            <if test="multiFormalGb != null">
+                /* 정상/이월구분 */
+                <foreach collection="multiFormalGb" item="item" index="index"  open="AND A.FORMAL_GB IN (" close=")" separator=",">#{item}</foreach>
+            </if>
+            <if test="multiSexGb != null">
+                /* 성별구분 */
+                <foreach collection="multiSexGb" item="item" index="index"  open="AND A.SEX_GB IN (" close=")" separator=",">#{item}</foreach>
+            </if>
+            <if test="multiAgeGb != null">
+                /* 성별구분 */
+                <foreach collection="multiAgeGb" item="item" index="index"  open="AND A.AGE IN (" close=")" separator=",">#{item}</foreach>
+            </if>
+            <if test="multiBrandCd != null">
+                /* 브랜드 */
+                <foreach collection="multiBrandCd" item="item" index="index"  open="AND A.BRAND_CD IN (" close=")" separator=",">#{item}</foreach>
+            </if>
+            <if test="multiItemkindCd != null">
+                /* 품목 */
+                <foreach collection="multiItemkindCd" item="item" index="index"  open="AND A.ITEMKIND_CD IN (" close=")" separator=",">#{item}</foreach>
+            </if>
+            <if test="multiAfLinkCd != null">
+                /* 채널 */
+                <foreach collection="multiAfLinkCd" item="item" index="index"  open="AND A.AF_LINK_CD IN (" close=")" separator=",">#{item}</foreach>
+            </if>
+        GROUP BY C.BRAND_ENM, A.GOODS_CD, B.GOODS_NM, A.DISTRIBUTION_GB, B.CURR_PRICE
+        ORDER BY TOT_AMT DESC
+	</sql>
+
+	<!-- 베스트 주문조회 -->
+	<select id="getBestOrderList" parameterType="Statistics" resultType="Statistics">
+		<include refid="getBestOrderListSql"></include>
+	</select>
+	<!-- 베스트 주문조회 -->
+	<select id="getBestOrderListMap" parameterType="Statistics" resultType="paramMap">
+		<include refid="getBestOrderListSql"></include>
+	</select>
+
 </mapper>

+ 264 - 19
src/main/webapp/WEB-INF/views/customer/OneToOneQnaDetailForm.html

@@ -14,7 +14,7 @@
  * 1.0  2020.12.24   gagamel     최초 작성
  *******************************************************************************
  -->
-<div class="modalPopup" data-width="1200" id="popupOneToOneQnaDetail">
+<div class="modalPopup" data-width="1200" data-height="900" id="popupOneToOneQnaDetail">
 	<div class="panelStyle">
 		<!-- TITLE -->
 		<div class="panelTitle">
@@ -24,7 +24,7 @@
 		<!-- //TITLE -->
 		
 		<!-- CONTENT -->
-		<div class="panelContent">
+		<div class="panelContent" style="height:90%; overflow-y:auto; padding-right: 10px !important;">
 			<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}"/>
@@ -34,18 +34,18 @@
 				<table class="tableStyle" aria-describedby="상담정보">
 					<colgroup>
 						<col style="width:10%;"/>
-						<col style="width:10%;"/>
+<!-- 						<col style="width:10%;"/> -->
 						<col style="width:12%;"/>
 						<col style="width:15%;"/>
 						<col/>
 <!-- 						<col style="width:10%;"/> -->
 <!-- 						<col style="width:10%;"/> -->
-						<col style="width:25%;"/>
+						<col style="width:30%;"/>
 					</colgroup>
 					<thead>
 						<tr>
 							<th>상담일련번호</th>
-							<th>사이트</th>
+<!-- 							<th>사이트</th> -->
 							<th>상담분류</th>
 							<th>문의일시</th>
 							<th>고객정보</th>
@@ -54,16 +54,17 @@
 							<th>답변상태</th>
 						</tr>
 					</thead>
-					<tbody>
+					<tbody id="otoQnaCounselInfo">
 						<tr>
 							<td th:text="*{counselSq}"></td>
-							<td th:text="*{siteNm}"></td>
+<!-- 							<td th:text="*{siteNm}"></td> -->
 							<td th:utext="*{counselClsfNm}"></td>
 							<td th:text="*{questDt}"></td>
-							<td th:utext="*{maskingCustNm + ' / ' + maskingCellPhnno + '<br/>' + maskingEmail}"></td>
+<!-- 							<td><a href="javascript:void(0);" th:onclick="|cfnOpenCustDetailPopup(*{custNo});|"><span th:utext="*{maskingCustNm + ' / ' + maskingCellPhnno + ' / ' + maskingEmail}"></span></a></td> -->
+							<td th:utext="*{maskingCustNm + ' / ' + maskingCellPhnno + ' / ' + maskingEmail}"></td>
 <!-- 							<td th:text="*{relOrdNo}"></td> -->
 <!-- 							<td th:utext="*{ansTransYn == 'Y' ? ansTransDt + '<br/>' + ansCompNm : ''}"></td> -->
-							<td th:utext="*{ansStat == 'G060_20' ? ansStatNm + ' / ' + ansDt + '<br/>' + ansNm : ansStatNm}"></td>
+							<td th:utext="*{ansStat == 'G060_20' ? ansStatNm + ' / ' + ansDt + ' / ' + ansNm : ansStatNm}"></td>
 						</tr>
 					</tbody>
 				</table>
@@ -79,9 +80,9 @@
 					<tbody>
 						<tr>
 							<th>문의 제목</th>
-							<td th:text="*{questTitle}"></td>
+							<td th:text="*{questTitle}" id="otoQnaQuestTitle"></td>
 							<th>SMS답변요청</th>
-							<td th:text="*{smsReqYn == 'Y' ? '수신' : '미수신'}"></td>
+							<td th:text="*{smsReqYn == 'Y' ? '수신' : '미수신'}" id="otoQnaSmsReqYn"></td>
 						</tr>
 						<tr>
 							<th>문의 내용</th>
@@ -89,7 +90,7 @@
 								<textarea class="textareaR4" style="resize: none;" name="questContent" th:text="*{questContent}" disabled="disabled"></textarea>
 							</td>
 							<th>첨부 이미지</th>
-							<td class="userImg">
+							<td class="userImg" id="otoQnaUserImg">
 								<img th:if="${counselInfo.sysFileNm1 != null}" style="height: 100px;" th:src="${@environment.getProperty('domain.image') + '/' + counselInfo.sysFileNm1}" onclick="fnPopupOpen('layer_review_pic', this);" alt="" onerror='this.src="/image/no.png"'/>
 								<img th:if="${counselInfo.sysFileNm2 != null}" style="height: 100px;" th:src="${@environment.getProperty('domain.image') + '/' + counselInfo.sysFileNm2}" onclick="fnPopupOpen('layer_review_pic', this);" alt="" onerror='this.src="/image/no.png"'/>
 							</td>
@@ -131,34 +132,201 @@
 						</tr>
 					</tbody>
 				</table>
+				
+				<h4>상담사 할당</h4>
+				<table class="frmStyle" aria-describedby="상담사 할당">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:40%;"/>
+						<col style="width:10%;"/>
+						<col style="width:40%;"/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>상담사</th>
+							<td>
+								<select name="assignedCsNo" th:if="${sessionInfo.roleCd == 'G001_A300' or sessionInfo.roleCd == 'G001_0000' or sessionInfo.roleCd == 'G001_A000'}">
+									<option value="">[상담사 선택]</option>
+									<option th:if="${counselorList}" th:each="oneData, status : ${counselorList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|" th:selected="${#strings.equals(counselInfo.assignedCsNo, oneData.cd)}"></option>
+								</select>
+								<button type="button" class="btn btn-warning btn-lg" id="btnAssignCounselor">담당할당</button>
+							</td>
+							<th>할당자</th>
+							<td th:if="${counselInfo?.assignerNm != null}" th:utext="${counselInfo?.assignerNm + ' / ' + counselInfo?.assignedDt}" id="assignerNm"></td>
+							<td th:if="${counselInfo?.assignerNm == null}" id="assignerNm"></td>
+						</tr>
+					</tbody>
+				</table>
 			</form>
+			
+			<h4>1:1문의 이력</h4>
+			<div id="custOneToOneCounselList" style="width: 100%; height: 300px" class="ag-theme-balham"></div>
 		</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>
+				<button type="button" class="btn btn-gray btn-lg" id="btnSaveTemp">임시저장</button>
+				<button type="button" class="btn btn-info btn-lg" id="btnSaveAnswer">답변저장</button>
 			</li>
 		</ul>
 		<!-- //버튼 배치 영역 -->
 	</div>
 </div>
 
+<!-- 사용자 레이어팝업 : 등록 파일 출력 -->
 <div class="uPopupWrap off" id="layer_review_pic">
 	<div class="area reviewPic" style="width:700px; height:700px;">
-		<ul class="picList" th:object="${counselInfo}">
-			<li><div class="img"></div></li>
+		<ul class="picList" th:object="${counselInfo}" id="otoQnaLayerReviewPic">
+<!-- 			<li><div class="img"></div></li> -->
+			<li th:if="${counselInfo.sysFileNm1 != null}"><div class="img" th:style="${'background-image:url(' + @environment.getProperty('domain.image') + '/' + counselInfo.sysFileNm1 + ');'}"></div></li>
+			<li th:if="${counselInfo.sysFileNm2 != null}"><div class="img" th:style="${'background-image:url(' + @environment.getProperty('domain.image') + '/' + counselInfo.sysFileNm2 + ');'}"></div></li>
 		</ul>
-		<!-- <button type="button" class="btnArr prev" onclick="fnPicPrev('layer_review_pic');">이전</button>
-		<button type="button" class="btnArr next" onclick="fnPicNext('layer_review_pic');">다음</button> -->
+<!-- 		<button type="button" class="btnArr prev" onclick="fnPicPrev('layer_review_pic');">이전</button> -->
+<!-- 		<button type="button" class="btnArr next" onclick="fnPicNext('layer_review_pic');">다음</button> -->
+		<button type="button" id="prev" class="btnArr prev">이전</button>
+		<button type="button" id="next" class="btnArr next">다음</button>
 		<button type="button" class="btnClose">닫기</button>
 	</div>
 </div>
-
+<!-- //사용자 레이어팝업 : 등록 파일 출력 -->
 
 <script th:inline="javascript">
 /*<![CDATA[*/
+	let counselClsfList = gagajf.convertToArray([[${counselClsfList}]]); // 상담분류
+	let ansStatList = gagajf.convertToArray([[${ansStatList}]]); // 답변상태
+	
+	const columnOneToOneCounselDefs = [
+		{ headerName: "상담일련번호", field: "counselSq", width: 100, cellClass: 'text-center' },
+		{
+			headerName: "상담분류", field: "counselClsf", width: 150, cellClass: 'text-center',
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(counselClsfList, params.value); }
+		},
+		{
+			headerName: "문의일시", field: "questDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{
+			headerName: "문의제목", field: "questTitle", width: 380,
+			cellRenderer: function (params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
+		{ headerName: "상담사", field: "assignedCsNm", width: 90, cellClass: 'text-center' },
+		{
+			headerName: "답변상태", field: "ansStat", width: 90, cellClass: 'text-center',
+			valueGetter: function (params) { return gagaAgGrid.lookupValue(ansStatList, params.data.ansStat); }
+		},
+		{
+			headerName: "답변일시", field: "ansDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		}
+	];
+	
+	let gridOneToOneCounselOptions = gagaAgGrid.getGridOptions(columnOneToOneCounselDefs);	// 1:1문의이력
+	
+	// 셀 클릭 이벤트
+	gridOneToOneCounselOptions.onCellClicked = function(event) {
+		if (event.colDef.field == 'questTitle') {
+			fnSetOneToOneQnaDetail(event.data.counselSq);
+		}
+	}
+	
+	// 1:1문의 상세 데이터 설정
+	var fnSetOneToOneQnaDetail = function(counselSq) {
+		const actionUrl = 'customer/onetoone/qna/detail/' + counselSq;
+		
+		$.getJSON(actionUrl
+			, function(result) {
+				$('#qnaDetailForm input[name=counselSq]').val(result.counselSq);
+				$('#qnaDetailForm input[name=smsReqYn]').val(result.smsReqYn);
+			
+				let tag = '';
+				tag += '<tr>\n';
+				tag += '	<td>' + result.counselSq + '</td>\n';
+				tag += '	<td>' + result.counselClsfNm + '</td>\n';
+				tag += '	<td>' + result.questDt + '</td>\n';
+				tag += '	<td>' + result.maskingCustNm + ' / ' + result.maskingCellPhnno + ' / ' + result.maskingEmail + '</td>\n';
+				tag += '	<td>' + (result.ansStat == "G060_20" ? (result.ansStatNm + ' / ' + result.ansDt + ' / ' + result.ansNm) : result.ansStatNm) + '</td>\n';
+				tag += '</tr>\n';
+				$('#otoQnaCounselInfo').html(tag);
+				
+				$('#otoQnaQuestTitle').html(result.questTitle);
+				$('#otoQnaSmsReqYn').html((result.smsReqYn == "Y" ? "수신" : "미수신"));
+				$('#qnaDetailForm textarea[name=questContent]').val(result.questContent);
+				
+				tag = '';
+				if (!gagajf.isNull(result.sysFileNm1)) {
+					tag += '<img style="height: 100px;" src="' + _imgUrl + '/' + result.sysFileNm1 + '" onclick=\"fnPopupOpen(\'layer_review_pic\', this);\" alt=\"\" onerror=\'this.src=\"/image/no.png\"\'/>\n';
+				}
+				if (!gagajf.isNull(result.sysFileNm2)) {
+					tag += '<img style="height: 100px;" src="' + _imgUrl + '/' + result.sysFileNm2 + '" onclick=\"fnPopupOpen(\'layer_review_pic\', this);\" alt=\"\" onerror=\'this.src=\"/image/no.png\"\'/>\n';
+				}
+				$('#otoQnaUserImg').html(tag);
+				
+				tag = '';
+				if (!gagajf.isNull(result.sysFileNm1)) {
+					tag += '<li><div class="img" style=\"background-image:url(' + _imgUrl + '/' + result.sysFileNm1 + ');\"></div></li>\n';
+				}
+				if (!gagajf.isNull(result.sysFileNm2)) {
+					tag += '<li><div class="img" style=\"background-image:url(' + _imgUrl + '/' + result.sysFileNm2 + ');\"></div></li>\n';
+				}
+				$('#otoQnaLayerReviewPic').html(tag);
+				
+				$('#qnaDetailForm input[name=ansTitle]').val(result.ansTitle);
+				$('#qnaDetailForm textarea[name=ansContent]').val(result.ansContent);
+				cfnGetTextLength($('textarea[name=ansContent]'), 4000, $('#dpLocAnsContent'));
+				
+				$('#qnaDetailForm select[name=assignedCsNo]').val(result.assignedCsNo);
+				$('#assignerNm').html(gagajf.isNull(result.assignerNm) ? '' : (result.assignerNm + ' / ' + result.assignedDt));
+				
+				fnShowOrHideOneToOneQnaButton(result.ansStat);
+			});
+	}
+	
+	// 담당할당
+	$('#btnAssignCounselor').on('click', function() {
+		if (gagajf.isNull($('#qnaDetailForm select[name=assignedCsNo]').val())) {
+			mcxDialog.alertC('상담사를 선택해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#qnaDetailForm select[name=assignedCsNo]').focus();
+				}
+			});
+			return;
+		}
+		
+		mcxDialog.confirm("담당을 할당하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify({
+					counselSq : $('#qnaDetailForm input[name=counselSq]').val(),
+					assignedCsNo : $('#qnaDetailForm select[name=assignedCsNo]').val()
+				});
+				gagajf.ajaxJsonSubmit('/customer/onetoone/qna/assign', jsonData, function() {
+					let assignerNm = [[${sessionInfo.userNm}]] + ' / ' + new Date().format("YYYY-MM-DD HH:mm:ss");
+					$('#assignerNm').html(assignerNm);
+					
+					fnSearchOneToOneCustomerHistory();
+				});
+			}
+		});
+	});
+	
+	// 임시 저장
+	$('#btnSaveTemp').on('click', function() {
+		mcxDialog.confirm("임시로 저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxFormSubmit('/customer/qna/answer/temp/save', '#qnaDetailForm', function() {
+					uifnPopupClose('popupOneToOneQnaDetail');
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
 	// 답변 저장
 	$('#btnSaveAnswer').on('click', function() {
 		// 입력 값 체크
@@ -207,7 +375,6 @@
 		let onIdx = $(el).index();
 		$("#"+id).find(".picList li").eq(onIdx).addClass("on");
 		let picTot = $("#"+id).find(".picList li").length - 1;
-		//console.log(onIdx +', '+ picTot);
 		
 		if (onIdx == 0) {
 			$("#"+id).find("button.prev").addClass("off");
@@ -222,10 +389,88 @@
 		$("#layer_review_pic").find("button.btnArr").removeClass("off"); //버튼 초기화
 	});
 	
+	//등록파일 상세보기 팝업 버튼
+	var togglePlayer = function (type) {
+		let layers = document.querySelectorAll('#layer_review_pic .picList li');
+		let len = layers.length - 1
+		let activePlayerIndex = -1;
+		layers.forEach(function (item, index) {
+			if (item.classList.contains('on')) {
+				activePlayerIndex = index;
+				item.classList.remove('on');
+			}
+		});
+		if (type === 'next') {
+			if (activePlayerIndex >= len ) {
+				activePlayerIndex = 0
+			} else {
+				activePlayerIndex += 1;
+			}
+		} else if (type === 'prev') {
+
+			if (activePlayerIndex <= 0) {
+				activePlayerIndex = len;
+			} else {
+				activePlayerIndex -= 1;
+			}
+		} else {
+			activePlayerIndex = type;
+		};
+
+		//버튼 비활성화
+		if (activePlayerIndex == 0 ) {
+			document.getElementById('prev').classList.add("off");
+		} else if (activePlayerIndex == len ) {
+			document.getElementById('next').classList.add("off");
+		} else {
+			document.getElementById('prev').classList.remove("off");
+			document.getElementById('next').classList.remove("off");
+		};
+		layers[activePlayerIndex].classList.add('on');
+	};
+	
+	//이전버튼
+	var prev = document.getElementById('prev');
+	prev.addEventListener('click', function () {
+		togglePlayer('prev');
+	});
+	//다음버튼
+	var next = document.getElementById('next');
+	next.addEventListener('click', function () {
+		togglePlayer('next');
+	});
+	
+	var fnShowOrHideOneToOneQnaButton = function(ansStat) {
+		let roleCd = [[${sessionInfo.roleCd}]];
+		if (ansStat != 'G060_20') {
+			if (roleCd == 'G001_A300' || roleCd == 'G001_0000' || roleCd == 'G001_A000') {
+				$('#btnAssignCounselor').show();
+			} else {
+				$('#btnAssignCounselor').hide();
+			}
+			
+			$('#btnSaveTemp').show();
+			$('#btnSaveAnswer').show();
+		} else {
+			$('#btnAssignCounselor').hide();
+			$('#btnSaveTemp').hide();
+			$('#btnSaveAnswer').hide();
+		}
+	}
+	
+	var fnSearchOneToOneCustomerHistory = function() {
+		const actionUrl = '/customer/counsel/list/' + [[${counselInfo.custNo}]];
+		gagaAgGrid.fetch(actionUrl, gridOneToOneCounselOptions);
+	}
+	
 	$(document).ready(function() {
 		cfnGetTextLength($('textarea[name=ansContent]'), 4000, $('#dpLocAnsContent'));
 		
+		gagaAgGrid.createGrid('custOneToOneCounselList', gridOneToOneCounselOptions);
+		
+		fnSearchOneToOneCustomerHistory();
 		
+		fnShowOrHideOneToOneQnaButton([[${counselInfo.ansStat}]]);
 	});
 /*]]>*/
 </script>

+ 83 - 19
src/main/webapp/WEB-INF/views/customer/OneToOneQnaForm.html

@@ -34,23 +34,23 @@
 						<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:12%;"/>
 						<col style="width:10%;"/>
 						<col/>
+						<col style="width:10%;"/>
+						<col style="width:12%;"/>
 					</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="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 value="">[전체]</option>
 								<option th:if="${counselClsfList}" th:each="oneData, status : ${counselClsfList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
 						</td>
@@ -71,6 +71,13 @@
 							</select>
 							<input type="text" name="condition" class="w200" maxlength="100"/>
 						</td>
+						<th>상담사</th>
+						<td>
+							<select name="assignedCsNo">
+								<option value="">[전체]</option>
+								<option th:if="${counselorList}" th:each="oneData, status : ${counselorList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+							</select>
+						</td>
 					</tr>
 <!-- 					<tr> -->
 <!-- 						<th>답변자</th> -->
@@ -98,13 +105,17 @@
 		<div class="panelStyle">
 			<ul class="panelBar">
 				<li>
+					<select name="assignedCsNo2" id="assignedCsNo2" th:if="${sessionInfo.roleCd == 'G001_A300' or sessionInfo.roleCd == 'G001_0000' or sessionInfo.roleCd == 'G001_A000'}">
+						<option value="">[상담사 선택]</option>
+						<option th:if="${counselorList}" th:each="oneData, status : ${counselorList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+					</select>
+					<button type="button" class="btn btn-warning btn-lg" id="btnAssign" th:if="${sessionInfo.roleCd == 'G001_A300' or sessionInfo.roleCd == 'G001_0000' or sessionInfo.roleCd == 'G001_A000'}">담당할당</button>
 					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
 				</li>
 				<li class="right">
 					검색결과 : <strong>
 					<span id="gridRowTotalCount">0</span> 건</strong>&nbsp; 쪽번호 <span id="pgNo">0</span>/
-					<strong id="endPgNo">0</strong>&nbsp;&nbsp; <select id="pageSize"
-					name="pageSize">
+					<strong id="endPgNo">0</strong>&nbsp;&nbsp; <select id="pageSize" name="pageSize">
 						<option value="50" selected="selected">50개씩 보기</option>
 						<option value="100">100개씩 보기</option>
 						<option value="500">500개씩 보기</option>
@@ -127,19 +138,25 @@
 <script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
-	let siteList = gagajf.convertToArray([[${siteList}]]); // 사이트
+// 	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>'; }
+			width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false,
+			checkboxSelection: function (params) {
+				return (params.data.ansStat != 'G060_20') ? true : false;
+			}
 		},
 		{
-			headerName: "사이트", field: "siteCd", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) { return gagaAgGrid.lookupValue(siteList, params.data.siteCd); }
+			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',
+// 			valueGetter: function (params) { return gagaAgGrid.lookupValue(siteList, params.data.siteCd); }
+// 		},
 		{
 			headerName: "상담분류", field: "counselClsfNm", width: 150, cellClass: 'text-center'
 // 			valueFormatter: function (params) { return params.value + (gagajf.isNull(params.data.counselDclsfNm) ? "" : "-" + params.data.counselDclsfNm); }
@@ -148,7 +165,10 @@
 			headerName: "문의일시", field: "questDt", width: 150, cellClass: 'text-center',
 			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
 		},
-		{headerName: "문의 제목", field: "questTitle", width: 300},
+		{
+			headerName: "문의 제목", field: "questTitle", width: 300,
+			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
 		{headerName: "고객번호", field: "custNo", width: 100, cellClass: 'text-center', hide: true},
 		{headerName: "고객ID", field: "maskingCustId", width: 100, cellClass: 'text-center', hide: true},
 		{
@@ -177,6 +197,8 @@
 			headerName: "답변상태", field: "ansStat", width: 100, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.lookupValue(ansStatList, params.data.ansStat); }
 		},
+		{headerName: "상담사번호", field: "assignedCsNo", width: 100, cellClass: 'text-center', hide: true},
+		{headerName: "상담사명", field: "assignedCsNm", width: 100, cellClass: 'text-center'},
 		{headerName: "답변자번호", field: "ansNo", width: 100, cellClass: 'text-center', hide: true},
 		{headerName: "답변자명", field: "ansNm", width: 100, cellClass: 'text-center'},
 		{
@@ -188,9 +210,11 @@
 	// Get GridOptions
 	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
 	
+	gridOptions.rowSelection = 'multiple';
+	
 	// 셀 클릭 이벤트
 	gridOptions.onCellClicked = function(event) {
-		if (event.colDef.field == 'counselSq') {
+		if (event.colDef.field == 'counselSq' || event.colDef.field == 'questTitle') {
 			// 1:1문의 상세
 			cfnOpenOneToOneQnaDetailPopup(event.data.counselSq);
 		} else if (event.colDef.field == 'maskingCustNm') {
@@ -223,6 +247,46 @@
 		gagaPaging.createPagination(result.pageing.pageable);
 	}
 	
+	// 담당할당
+	$('#btnAssign').on('click', function() {
+		if (gagajf.isNull($('#assignedCsNo2').val())) {
+			mcxDialog.alertC('상담사를 선택해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#assignedCsNo2').focus();
+				}
+			});
+			return;
+		}
+		
+		var chooseData = gagaAgGrid.selectedRowData(gridOptions);
+		
+		if (chooseData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		mcxDialog.confirm("담당을 할당하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var updatedData = [];
+				
+				$.each(chooseData, function(idx, item) {
+					item.assignedCsNo = $('#assignedCsNo2').val();
+					updatedData.push(item);
+				});
+				
+				var jsonData = JSON.stringify(updatedData);
+				gagajf.ajaxJsonSubmit('/customer/onetoone/qna/list/assign'
+						, jsonData
+						, function() {
+							$('#btnSearch').trigger('click');
+						});
+			}
+		});
+	});
+	
 	// 엑셀다운로드
 	$('#btnExcel').on('click', function() {
 		gagaAgGrid.exportToExcel('1:1문의 목록', gridOptions);

+ 2 - 1
src/main/webapp/WEB-INF/views/settle/DeliveryFeeSettleForm.html

@@ -105,7 +105,8 @@
 
 	let columnDefs = [
 		{ headerName: "발생(출고/회수)일자", field: "occurDt", width: 150, cellClass: 'text-center' },
-		{ headerName: "공급업체", field: "supplyCompNm", width: 200, cellClass: 'text-center' },
+		{ headerName: "공급벤더", field: "supplyVendorNm", width: 200, cellClass: 'text-center' },
+// 		{ headerName: "공급업체", field: "supplyCompNm", width: 200, cellClass: 'text-center' },
 		{ headerName: "유통구분", field: "distributionGbNm", width: 150, cellClass: 'text-center' },
 		{ headerName: "배송비구분", field: "delvFeeGbNm", width: 150, cellClass: 'text-center' },
 		{ headerName: "주문번호", field: "ordNo", width: 100, cellClass: 'text-center' },

+ 57 - 11
src/main/webapp/WEB-INF/views/settle/GoodsSettleForm.html

@@ -105,11 +105,11 @@
 		<div class="panelStyle" th:if="${sessionInfo.roleCd == 'G001_A106' or sessionInfo.roleCd == 'G001_0000' or sessionInfo.roleCd == 'G001_A000'}">
 			<ul class="panelBar">
 				<li class="center">
-					<h3><strong>정산기준월</strong> : </h3>
-					<input type="text" class="schMonth w60" name="settleYm" id="settleYm" maxlength="7"/>
-					<button type="button" class="btn icn schBtn" data-id="settleYm"><i class="fa fa-calendar" aria-hidden="true"></i></button>
-					<button type="button" class="btn btn-base btn-lg" id="btnConfirmSettle">정산확정</button>
-					<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>[정산확정] 버튼 클릭 시 해당월의 업체별 정산 데이터가 재확정됩니다.</span>
+<!-- 					<h3><strong>정산기준월</strong> : </h3> -->
+<!-- 					<input type="text" class="schMonth w60" name="settleYm" id="settleYm" maxlength="7"/> -->
+<!-- 					<button type="button" class="btn icn schBtn" data-id="settleYm"><i class="fa fa-calendar" aria-hidden="true"></i></button> -->
+					<button type="button" class="btn btn-base btn-lg" id="btnConfirmSettle">정산확정</button><br/>
+					<p class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>[정산확정] 버튼 클릭 시 매출기간 동안의 업체별 정산 데이터가 재확정됩니다.</p>
 				</li>
 			</ul>
 		</div>
@@ -160,13 +160,14 @@
 		{ headerName: "몰구분", field: "mallGbNm", width: 100, cellClass: 'text-center' },
 		{ headerName: "제휴몰주문번호", field: "extmallOrderId", width: 150, cellClass: 'text-center' },
 		{ headerName: "제휴몰명", field: "extmallNm", width: 150, cellClass: 'text-center' },
+		{ headerName: "공급벤더", field: "supplyVendorNm", width: 150, cellClass: 'text-center' },
 // 		{
 // 			headerName: "공급업체", field: "supplyCompCd", width: 100, cellClass: 'text-center',
 // 			valueGetter: function (params) {
 // 				return gagaAgGrid.lookupValue(supplyCompList, params.data.supplyCompCd);
 // 			}
 // 		},
-		{ headerName: "공급업체", field: "supplyCompNm", width: 150, cellClass: 'text-center' },
+// 		{ headerName: "공급업체", field: "supplyCompNm", width: 150, cellClass: 'text-center' },
 // 		{
 // 			headerName: "유통구분", field: "distributionGb", width: 100, cellClass: 'text-center',
 // 			valueGetter: function (params) {
@@ -371,23 +372,68 @@
 	
 	// 정산확정
 	$('#btnConfirmSettle').on('click', function() {
-		if (gagajf.isNull($('#settleYm').val())) {
-			mcxDialog.alertC('정산기준월을 입력해 주세요.', {
+		if (gagajf.isNull($('#salesStdt').val())) {
+			mcxDialog.alertC('매출시작일자를 입력해 주세요.', {
 				sureBtnText: "확인",
 				sureBtnClick: function() {
-					$('#settleYm').focus();
+					$('#salesStdt').focus();
 				}
 			});
 			return;
 		}
 		
-		mcxDialog.confirm('정산확정을 하시면 업체별 정산 데이터가 생성됩니다.<br/>' + $('#settleYm').val() + '월의 정산을 확정하시겠습니까?', {
+		if (gagajf.isNull($('#salesEddt').val())) {
+			mcxDialog.alertC('매출종료일자를 입력해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#salesEddt').focus();
+				}
+			});
+			return;
+		}
+		
+		mcxDialog.confirm('매출기간 ' + $('#salesStdt').val().toDate('YYYY-MM-DD').format('YYYY-MM-DD') + '~' + $('#salesEddt').val().toDate('YYYY-MM-DD').format('YYYY-MM-DD') + ' 동안의<br/>업체별 정산 데이터를 확정하시겠습니까?', {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
 			sureBtnClick: function() {
-				gagajf.ajaxJsonSubmit('/settle/confirm/save/' + $('#settleYm').val(), null);
+				let jsonData = JSON.stringify({
+					salesStdt : $('#salesStdt').val(),
+					salesEddt : $('#salesEddt').val()
+				});
+				gagajf.ajaxJsonSubmit('/settle/confirm/save', jsonData);
 			}
 		});
+		
+// 		if (gagajf.isNull($('#settleYm').val())) {
+// 			mcxDialog.alertC('정산기준월을 입력해 주세요.', {
+// 				sureBtnText: "확인",
+// 				sureBtnClick: function() {
+// 					$('#settleYm').focus();
+// 				}
+// 			});
+// 			return;
+// 		}
+		
+// 		let salesEdYm = $('#salesEddt').val().toDate('YYYY-MM');
+// 		let settleYm = ($('#settleYm').val() + '-01').toDate('YYYY-MM');
+		
+// 		if (salesEdYm > settleYm) {
+// 			mcxDialog.alertC('정산기준월은 매출종료일자 보다 커야 합니다.', {
+// 				sureBtnText: "확인",
+// 				sureBtnClick: function() {
+// 					$('#salesEddt').focus();
+// 				}
+// 			});
+// 			return;
+// 		}
+		
+// 		mcxDialog.confirm('정산확정을 하시면 업체별 정산 데이터가 생성됩니다.<br/>매출기간 ' + $('#salesStdt').val().toDate('YYYY-MM-DD').format('YYYY-MM-DD') + '~' + $('#salesEddt').val().toDate('YYYY-MM-DD').format('YYYY-MM-DD') + ' 동안의 업체별 정산 데이터를<br/>' + $('#settleYm').val() + '월로 확정하시겠습니까?', {
+// 			cancelBtnText: "취소",
+// 			sureBtnText: "확인",
+// 			sureBtnClick: function() {
+// 				gagajf.ajaxJsonSubmit('/settle/confirm/save/' + $('#settleYm').val(), null);
+// 			}
+// 		});
 	});
 	
 	// 엑셀다운로드

+ 38 - 7
src/main/webapp/WEB-INF/views/settle/SettleConfirmForm.html

@@ -43,10 +43,14 @@
 						</td>
 						<th>공급업체</th>
 						<td>
-							<select name="supplyCompCd">
-								<option value="">[전체]</option>
-								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
+<!-- 							<select name="supplyCompCd"> -->
+<!-- 								<option value="">[전체]</option> -->
+<!-- 								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option> -->
+<!-- 							</select> -->
+							<input type="text" class="w100" name="supplyCompSearchTxt" id="supplyCompSearchTxt" maxlength="20"/>
+							<button type="button" class="btn icn" onclick="cfnOpenCompanyListPopup('fnSetSupplyCompInfo', 'M');"><i class="fa fa-search"></i></button>
+							<span id="supplyCompTxt"></span>
+							<input type="hidden" name="supplyCompList"/>
 						</td>
 					</tr>
 				</table>
@@ -117,8 +121,10 @@
 // 			}
 // 		},
 		{ headerName: "정산연월", field: "usacYm", width: 80, cellClass: 'text-center', hide: true },
-		{ headerName: "공급업체코드", field: "supplyCompCd", width: 100, cellClass: 'text-center', hide: true },
-		{ headerName: "공급업체", field: "supplyCompNm", width: 200 },
+		{ headerName: "공급벤더코드", field: "supplyVendorCd", width: 100, cellClass: 'text-center' },
+		{ headerName: "공급벤더명", field: "supplyVendorNm", width: 200 },
+// 		{ headerName: "공급업체코드", field: "supplyCompCd", width: 100, cellClass: 'text-center', hide: true },
+// 		{ headerName: "공급업체", field: "supplyCompNm", width: 200 },
 		{ headerName: "전자계약여부", field: "econtractYn", width: 100, cellClass: 'text-center' },
 		{ headerName: "사업자등록번호", field: "bizNo", width: 120, cellClass: 'text-center' },
 		{ headerName: "정산주기", field: "settleDay", width: 100, cellClass: 'text-center', hide:true },
@@ -229,13 +235,38 @@
 		{ headerName: "은행", field: "bankNm", width: 100, cellClass: 'text-center' },
 		{ headerName: "계좌번호", field: "accountNo", width: 150, cellClass: 'text-center' },
 		{ headerName: "예금주명", field: "depositorNm", width: 100, cellClass: 'text-center' },
-		{ headerName: "계산서이메일", field: "billEmail", width: 100, cellClass: 'text-center' }
+		{ headerName: "계산서이메일", field: "billEmail", width: 200 }
 	];
 
 	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
 
 	gridOptions.stopEditingWhenGridLosesFocus = true;
 	
+	// 업체 조회 팝업에서 호출
+	var fnSetSupplyCompInfo = function(result) {
+		var arrSupplyComp = [];
+		var supplyCompTxt = "";
+		var sIndex = 0;
+		$('#supplyCompTxt').html('');
+		$('#searchForm input[name=supplyCompSearchTxt]').val('');
+		
+		result.forEach(function(supplyComp) {
+			sIndex++; 
+			arrSupplyComp.push(supplyComp.supplyCompCd);
+		});
+
+		// 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리 
+		if (sIndex == 1) {
+			$('#searchForm input[name=supplyCompSearchTxt]').val(arrSupplyComp[0]);
+		} else {
+			supplyCompTxt = sIndex + " 개";
+			$('#supplyCompTxt').html(supplyCompTxt);
+		}
+		
+		var jsonData = JSON.stringify(arrSupplyComp);
+		$("#searchForm input[name=supplyCompList]").val(jsonData);
+	}
+	
 	// 검색
 	$('#btnSearch').on('click', function() {
 		// 입력 값 체크

+ 402 - 0
src/main/webapp/WEB-INF/views/statistics/BestTradingForm.html

@@ -0,0 +1,402 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : BestTradingForm.html
+ * @desc    : 베스트주문 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021-09-25 토   lmc        최초 작성
+ *******************************************************************************
+ -->
+	<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="@{'/statistics/best/order/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<input type="hidden" name="dayGb" value="D"/>
+				<input type="hidden" name="imageViewYn" value="Y"/>
+                <a href="javascript:void(0);" id="excelList" style="display: none;"></a>
+
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:25%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>기간<i class="required" title="필수" aria-hidden="true"></i></th>
+						<td colspan="3" id="terms"></td>
+					</tr>
+					<tr>
+						<th>디바이스</th>
+						<td>
+							<label class="chkBox checked"><input type="checkbox" name="multiFrontGb" value="P" checked="checked"/>PC웹</label>
+							<label class="chkBox checked"><input type="checkbox" name="multiFrontGb" value="M" checked="checked"/>모바일웹</label>
+							<label class="chkBox checked"><input type="checkbox" name="multiFrontGb" value="A" checked="checked"/>APP</label>
+						</td>
+						<th>제휴몰</th>
+						<td>
+							<input type="text" class="w100" name="extmallIdSearchTxt" id="extmallIdSearchTxt" maxlength="20"/>
+							<button type="button" class="btn icn" onclick="cfnOpenExtmallListPopup('fnSetExtmallInfo', 'M');"><i class="fa fa-search"></i></button>
+							<span id="extmallIdTxt"></span>
+							<input type="hidden" name="extmallIdList"/>
+						</td>
+					</tr>
+                    <tr>
+                        <th>물류구분</th>
+                        <td>
+                            <label class="chkBox checked"><input type="checkbox" name="multiDistributionGb" value="SCM" checked="checked"/>입점</label>
+                            <label class="chkBox checked"><input type="checkbox" name="multiDistributionGb" value="WMS" checked="checked"/>위탁</label>
+                        </td>
+                        <th>정상/이월구분</th>
+                        <td>
+                            <label th:if="${formalGbList}" th:each="oneData, status : ${formalGbList}" class="chkBox checked"><input type="checkbox" name="multiFormalGb" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" checked="checked"/></label>
+                        </td>
+                    </tr>
+                    <tr>
+                        <th>성별</th>
+                        <td>
+                            <label th:if="${sexGbList}" th:each="oneData, status : ${sexGbList}" class="chkBox checked"><input type="checkbox" name="multiSexGb" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" checked="checked"/></label>
+                        </td>
+                        <th>연령별</th>
+                        <td>
+                            <label class="chkBox checked"><input type="checkbox" name="multiAgeGb" value="10" checked="checked"/>10대</label>
+                            <label class="chkBox checked"><input type="checkbox" name="multiAgeGb" value="20" checked="checked"/>20대</label>
+                            <label class="chkBox checked"><input type="checkbox" name="multiAgeGb" value="20" checked="checked"/>30대</label>
+                            <label class="chkBox checked"><input type="checkbox" name="multiAgeGb" value="30" checked="checked"/>40대</label>
+                            <label class="chkBox checked"><input type="checkbox" name="multiAgeGb" value="X" checked="checked"/>기타/미상</label>
+                        </td>
+                    </tr>
+					<tr>
+						<th>브랜드</th>
+						<td>
+							<input type="text" class="w100" name="brandCdSearchTxt" id="brandCdSearchTxt" maxlength="20" />
+							<button type="button" class="btn icn" onclick="cfnOpenBrandListPopup('fnSetBrandInfo', 'M');"><i class="fa fa-search"></i></button>
+							<span id="brandCdTxt"></span>
+							<input type="hidden" name="brandCdList"/>
+						</td>
+						<th>품목</th>
+						<td>
+							<input type="text" class="w100" name="itemkindCdSearchTxt" id="itemkindCdSearchTxt" maxlength="20" />
+							<button type="button" class="btn icn" onclick="cfnOpenItemkindListPopup('fnSetItemkindInfo', 'M');"><i class="fa fa-search"></i></button>
+							<span id="itemkindTxt"></span>
+							<input type="hidden" name="itemkindCdList"/>
+						</td>
+					</tr>
+					<tr>
+                        <th>제휴채널</th>
+                        <td>
+                            <input type="text" class="w100" name="afLinkCdSearchTxt" id="afLinkCdSearchTxt" maxlength="20" />
+                            <button type="button" class="btn icn" onclick="cfnOpenAfLinkListPopup('fnSetAfLinkInfo', 'M');"><i class="fa fa-search"></i></button>
+                            <span id="afLinkCdTxt"></span>
+                            <input type="hidden" name="afLinkCdList"/>
+                        </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" id="btnInit">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<ul class="panelBar">
+				<li>
+					<button type="button" class="btn btn-default btn-lg" onclick="fnExcelDownLoad();">엑셀다운로드</button>
+				</li>
+			</ul>
+			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+
+<style>
+.ag-header-group-text{
+	margin-left: calc(50% - 25px);
+}
+</style>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let columnDefs = [
+		{ headerName: "No", field: "day", width: 100, cellClass: 'text-center', valueGetter: "node.rowIndex + 1" },
+		{ headerName: "이미지", field: "sysImgUrl", width: 100, height: 60, cellClass: 'text-center'
+            ,cellRenderer: function(params) {
+                return '<img width="60" src="'+ _goodsUrl+ "/" + params.value + '?RS=60" alt="" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \''+ _goodsUrl+ "/" + params.value +'\')" onerror="this.src=\'/image/no.png\';"/>';
+            }
+        },
+        { headerName: "브랜드", field: "brandEnm", width: 100, cellClass: 'text-center'},
+        { headerName: "상품번호", field: "goodsCd", width: 100, cellClass: 'text-center'},
+        { headerName: "구분", field: "distributionGb", width: 100, cellClass: 'text-center'},
+        { headerName: "상품명", field: "goodsNm", width: 400, cellClass: 'text-left'},
+        { headerName: "판매가", field: "currPrice", width: 100, cellClass: 'text-right',
+            cellRenderer: function(params) {
+                return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
+            }
+        },
+        { headerName: "판매갯수", field: "sellQty", width: 100, cellClass: 'text-right',
+            cellRenderer: function(params) {
+                return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
+            }
+        },
+        { headerName: "매출액", field: "totAmt", width: 100, cellClass: 'text-right',
+            cellRenderer: function(params) {
+                return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
+            }
+        },
+        { headerName: "현재고", field: "stockQty", width: 100, cellClass: 'text-right',
+            cellRenderer: function(params) {
+                return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
+            }
+        },
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+    // 중복 선택 가능
+    gridOptions.rowSelection = 'multiple';
+    gridOptions.suppressRowClickSelection = true;
+    gridOptions.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
+
+	// Row Click
+	gridOptions.onCellClicked = function(event) {
+		var goodsCd = event.data.goodsCd;
+		if (event.colDef.field == "goodsCd"){
+			cfnOpenGoodsDetailPopup('U',goodsCd);
+		}
+		if (event.colDef.field == "goodsNm"){
+			cfnOpenGoodsDetailPopup('U',goodsCd);
+		}
+	}
+
+    gridOptions.excelStyles = [
+        {
+            id: 'text-center',
+            dataType: 'string',
+			font: {size : 10, bold: false}
+        },
+        {
+            id: 'text-left',
+            dataType: 'string',
+			font: {size : 10, bold: false}
+        },
+        {
+            id: 'text-right',
+            dataType: 'number',
+			font: {size : 10, bold: false}
+        }
+    ];
+
+    var fnExcelDownLoad = function(){
+
+        var formId = '#searchForm';
+        if (gridOptions.api.getDisplayedRowCount() <= 0){
+            mcxDialog.alert("조회된 데이터가 없습니다.<br/>다시 조회 후 다운로드 받으세요.");
+            return;
+        }
+        $("#searchForm input[name=imageViewYn]").val('Y');
+
+        $('#excelList').attr({ href : '/statistics/best/excel/down?' + $("#searchForm").serialize() }).get(0).click();
+
+//     	var totalRows = gridOptions.api.getDisplayedRowCount();
+// 		if(totalRows==0){
+// 			mcxDialog.alert('조회된 내역이 없습니다.');
+// 			return;
+// 		}
+
+//     	var date = new Date().format("YYYYMMDDHHmmss");
+// 		var params = {
+// 						fileName : "베스트상품 주문목록_"+ date,
+// 						sheetName: "DATA"
+// 					 };
+
+// 		gridOptions.api.exportDataAsExcel(params);
+    }
+
+	// 제휴몰 조회 팝업에서 호출
+	var fnSetExtmallInfo = function(result) {
+		var arrExtmallId = [];
+		var extmallIdTxt = "";
+		var sIndex = 0;
+		$('#extmallIdTxt').html('');
+		$('#searchForm input[name=extmallIdSearchTxt]').val('');
+
+		result.forEach(function(extmall) {
+			sIndex++;
+			arrExtmallId.push(extmall.extmallId);
+		});
+
+		// 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리
+		if (sIndex == 1) {
+			$('#searchForm input[name=extmallIdSearchTxt]').val(arrExtmallId[0]);
+		} else {
+			extmallIdTxt = sIndex + " 개";
+			$('#extmallIdTxt').html(extmallIdTxt);
+		}
+
+		var jsonData = JSON.stringify(arrExtmallId);
+		$("#searchForm input[name=extmallIdList]").val(arrExtmallId.join(','));
+	}
+
+	// 업체 조회 팝업에서 호출
+	var fnSetSupplyCompInfo = function(result) {
+		var arrSupplyCompCd = [];
+		var supplyCompCdTxt = "";
+		var sIndex = 0;
+		$('#supplyCompCdTxt').html('');
+		$('#searchForm input[name=supplyCompCdSearchTxt]').val('');
+
+		result.forEach(function(supplyComp) {
+			sIndex++;
+			arrSupplyCompCd.push(supplyComp.supplyCompCd);
+		});
+
+		// 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리
+		if (sIndex == 1) {
+			$('#searchForm input[name=supplyCompCdSearchTxt]').val(arrSupplyCompCd[0]);
+		} else {
+			supplyCompCdTxt = sIndex + " 개";
+			$('#supplyCompCdTxt').html(supplyCompCdTxt);
+		}
+
+		var jsonData = JSON.stringify(arrSupplyCompCd);
+		$("#searchForm input[name=supplyCompCdList]").val(arrSupplyCompCd.join(','));
+	}
+
+	// 제휴채널 조회 팝업에서 호출
+	var fnSetAfLinkInfo = function(result) {
+		var arrAfLinkCd = [];
+		var afLinkCdTxt = "";
+		var sIndex = 0;
+		$('#afLinkCdTxt').html('');
+		$('#searchForm input[name=afLinkCdSearchTxt]').val('');
+
+		result.forEach(function(afLink) {
+			sIndex++;
+			arrAfLinkCd.push(afLink.afLinkCd);
+		});
+
+		// 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리
+		if (sIndex == 1) {
+			$('#searchForm input[name=afLinkCdSearchTxt]').val(arrAfLinkCd[0]);
+		} else {
+			afLinkCdTxt = sIndex + " 개";
+			$('#afLinkCdTxt').html(afLinkCdTxt);
+		}
+
+		var jsonData = JSON.stringify(arrAfLinkCd);
+		$("#searchForm input[name=afLinkCdList]").val(arrAfLinkCd.join(","));
+	}
+
+	// 브랜드 조회 팝업에서 호출
+	var fnSetBrandInfo = function(result) {
+		var arrBrandCd = [];
+		var brandCdTxt = "";
+		var bIndex = 0;
+		$('#brandCdTxt').html('');
+		$('#searchForm input[name=brandCdSearchTxt]').val('');
+
+		result.forEach(function(brand){
+			bIndex++;
+			arrBrandCd.push(brand.brandCd);
+		});
+
+		// 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리
+		if (bIndex == 1) {
+			$('#searchForm input[name=brandCdSearchTxt]').val(arrBrandCd[0]);
+		} else {
+			brandCdTxt = bIndex + " 개";
+			$('#brandCdTxt').html(brandCdTxt);
+		}
+
+		var jsonData = JSON.stringify(arrBrandCd);
+		$("#searchForm input[name=brandCdList]").val(arrBrandCd.join(","));
+	}
+
+	// 품목 조회 팝업에서 호출
+	var fnSetItemkindInfo = function(result) {
+		var arrItemkindCd = [];
+		var itemkindCdTxt = "";
+		var bIndex = 0;
+		$('#itemkindCdTxt').html('');
+		$('#searchForm input[name=itemkindCdSearchTxt]').val('');
+
+		result.forEach(function(itemkind){
+			bIndex++;
+			arrItemkindCd.push(itemkind.itemkindCd);
+		});
+
+		// 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리
+		if (bIndex == 1) {
+			$('#searchForm input[name=itemkindCdSearchTxt]').val(arrItemkindCd[0]);
+		} else {
+			itemkindCdTxt = bIndex + " 개";
+			$('#itemkindCdTxt').html(itemkindCdTxt);
+		}
+
+		var jsonData = JSON.stringify(arrItemkindCd);
+		$("#searchForm input[name=itemkindCdList]").val(arrItemkindCd.join(','));
+	}
+
+	// 검색
+	$('#btnSearch').on('click', function() {
+		// 입력 값 체크
+		if (!gagajf.validation($('#searchForm')))
+			return false;
+
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+
+	// 초기화 클릭시
+	$('#btnInit').on('click', function() {
+		$('#searchForm')[0].reset();
+
+		$('#extmallIdTxt').html('');
+		$('#searchForm input[name=extmallIdList]').val('');
+		$('#supplyCompCdTxt').html('');
+		$('#searchForm input[name=supplyCompCdList]').val('');
+		$('#afLinkCdTxt').html('');
+		$('#searchForm input[name=afLinkCdList]').val('');
+		$('#brandCdTxt').html('');
+		$('#searchForm input[name=brandCdList]').val('');
+		$('#itemkindCdTxt').html('');
+		$('#searchForm input[name=itemkindCdList]').val('');
+	});
+
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('일자별주문 목록', gridOptions);
+	});
+
+	$(document).ready(function() {
+		cfnCreateCalendar('#terms', 'startDt', 'endDt', true, '주문', undefined, ['btnToday']);
+		$('.btnYesterday').trigger('click');
+
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+
+	});
+/*]]>*/
+</script>
+
+</html>