yujung 4 лет назад
Родитель
Сommit
80fdd3230e

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

@@ -6,6 +6,7 @@ import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Card;
 import com.style24.persistence.domain.Statistics;
+import jdk.internal.dynalink.beans.StaticClass;
 
 /**
  * 통계 Dao
@@ -179,4 +180,16 @@ public interface TsaStatisticsDao {
 
 	Collection<Statistics> getCustomerAgeOrderList(Statistics statistics);
 
+	Collection<Statistics> getCustomerRankingList(Statistics statistics);
+
+	Collection<Statistics> getCustomerUnloginList();
+
+	Collection<Statistics> getCustomerUnloginInfoList();
+
+	Collection<Statistics> getCustomerMarketingList();
+
+	Collection<Statistics> getCustomerDormRemainList();
+
+	Collection<Statistics> getCustomerDormRemainInfoList();
+
 }

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

@@ -309,4 +309,28 @@ public class TsaStatisticsService {
 	public Collection<Statistics> getCustomerAgeOrderList(Statistics statistics) {
 		return statisticsDao.getCustomerAgeOrderList(statistics);
 	}
+
+	public Collection<Statistics> getCustomerRankingList(Statistics statistics) {
+		return statisticsDao.getCustomerRankingList(statistics);
+	}
+
+	public Collection<Statistics> getCustomerUnloginList() {
+		return statisticsDao.getCustomerUnloginList();
+	}
+
+	public Collection<Statistics> getCustomerUnloginInfoList() {
+		return statisticsDao.getCustomerUnloginInfoList();
+	}
+
+	public Collection<Statistics> getCustomerMarketingList() {
+		return statisticsDao.getCustomerMarketingList();
+	}
+
+	public Collection<Statistics> getCustomerDormRemainList() {
+		return statisticsDao.getCustomerDormRemainList();
+	}
+
+	public Collection<Statistics> getCustomerDormRemainInfoList() {
+		return statisticsDao.getCustomerDormRemainInfoList();
+	}
 }

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

@@ -1246,6 +1246,54 @@ public class TsaCustomerController extends TsaBaseController {
 		return result;
 	}
 
+//	/**
+//	 * CTI에서 접속한 회원목록 화면
+//	 * @param hphoneNo - 휴대전화번호
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2021. 8. 31
+//	 */
+//	@GetMapping("/cti/form/{cellPhnno}")
+//	public ModelAndView customerCtiForm(@PathVariable String cellPhnno) {
+//		ModelAndView mav = new ModelAndView();
+//
+//		// 사이트 목록
+//		mav.addObject("siteList", rendererService.getCommonCodeList("G000", "Y"));
+//
+//		// 성별
+//		mav.addObject("genderGbList", rendererService.getCommonCodeList("G007", "Y"));
+//
+//		// 회원 구분
+//		mav.addObject("custGbList", rendererService.getCommonCodeList("G100", "Y"));
+//
+//		// 회원 등급
+//		mav.addObject("custGradeList", rendererService.getCommonCodeList("G110", "Y"));
+//
+//		// 관리대상
+//		mav.addObject("managedRsnList", rendererService.getCommonCodeList("G103", "Y"));
+//
+//		// 간편가입유형
+//		mav.addObject("snsTypeList", rendererService.getCommonCodeList("G105", "Y"));
+//
+//		// 전화번호 형식 체크 및 변환
+//		String[] hp = cellPhnno.split("-");
+//		if (hp.length < 2) {
+//			String tempNo = String.format("%-11s", cellPhnno);
+//			String no1 = tempNo.substring(0, 3);
+//			String no2 = tempNo.substring(3, 7);
+//			String no3 = tempNo.substring(7);
+//			tempNo = no1 + "-" + no2 + "-" + no3;
+//			String[] arrTemp = tempNo.split(" ");
+//			cellPhnno = arrTemp[0];
+//		}
+//
+//		mav.addObject("cellPhnno", cellPhnno);
+//
+//		mav.setViewName("customer/CustomerCtiListForm");
+//
+//		return mav;
+//	}
+
 	/**
 	 * CTI에서 접속한 회원목록 화면
 	 * @param hphoneNo - 휴대전화번호
@@ -1255,25 +1303,7 @@ public class TsaCustomerController extends TsaBaseController {
 	 */
 	@GetMapping("/cti/form/{cellPhnno}")
 	public ModelAndView customerCtiForm(@PathVariable String cellPhnno) {
-		ModelAndView mav = new ModelAndView();
-
-		// 사이트 목록
-		mav.addObject("siteList", rendererService.getCommonCodeList("G000", "Y"));
-
-		// 성별
-		mav.addObject("genderGbList", rendererService.getCommonCodeList("G007", "Y"));
-
-		// 회원 구분
-		mav.addObject("custGbList", rendererService.getCommonCodeList("G100", "Y"));
-
-		// 회원 등급
-		mav.addObject("custGradeList", rendererService.getCommonCodeList("G110", "Y"));
-
-		// 관리대상
-		mav.addObject("managedRsnList", rendererService.getCommonCodeList("G103", "Y"));
-
-		// 간편가입유형
-		mav.addObject("snsTypeList", rendererService.getCommonCodeList("G105", "Y"));
+		ModelAndView mav = new ModelAndView("dashboard");
 
 		// 전화번호 형식 체크 및 변환
 		String[] hp = cellPhnno.split("-");
@@ -1289,8 +1319,6 @@ public class TsaCustomerController extends TsaBaseController {
 
 		mav.addObject("cellPhnno", cellPhnno);
 
-		mav.setViewName("customer/CustomerCtiListForm");
-
 		return mav;
 	}
 

+ 65 - 72
src/main/java/com/style24/admin/biz/web/TsaOrderController.java

@@ -16,11 +16,6 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.gagaframework.excel.GagaExcelUtil;
-import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.rest.server.GagaResponse;
-import com.gagaframework.web.rest.server.GagaResponseStatus;
-import com.gagaframework.web.util.GagaFileUtil;
 import com.style24.admin.biz.service.TsaPgService;
 import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.support.controller.TsaBaseController;
@@ -35,6 +30,12 @@ import com.style24.persistence.domain.OrderSample;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.excel.GagaExcelUtil;
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponse;
+import com.gagaframework.web.rest.server.GagaResponseStatus;
+import com.gagaframework.web.util.GagaFileUtil;
+
 /**
  * 주문관리 Controller
  *
@@ -57,10 +58,10 @@ public class TsaOrderController extends TsaBaseController {
 
 	@Autowired
 	private TscOrderService orderService;
-	
+
 	@Autowired
 	private TsaPgService pgService;
-	
+
 	@Autowired
 	private ObjectMapper mapper;
 
@@ -72,23 +73,26 @@ public class TsaOrderController extends TsaBaseController {
 	 * @since 2020. 11. 16
 	 */
 	@GetMapping("/list/form")
-	public ModelAndView orderListForm() {
+	public ModelAndView orderListForm(@RequestParam(value = "cellPhnno", required = false) String cellPhnno) {
 		ModelAndView mav = new ModelAndView();
 
-		mav.addObject("siteCdList"		, rendererService.getAvailCommonCodeList("G012"));		// 사이트구분
-		mav.addObject("mallGbList"		, rendererService.getAvailCommonCodeList("G011"));		// 몰구분
-		mav.addObject("supplyCompList"	, rendererService.getSupplyCompanyList());				// 공급업제목록
-		
+		mav.addObject("siteCdList", rendererService.getAvailCommonCodeList("G012"));		// 사이트구분
+		mav.addObject("mallGbList", rendererService.getAvailCommonCodeList("G011"));		// 몰구분
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList());				// 공급업제목록
+
 		// 2021.05.11 프론트기준으로 상태값 정리
-		mav.addObject("ordDtlStatList"	, rendererService.getCommonCodeList("G013", "Y", new String[] {"G013_10", "G013_11", "G013_25", "G013_35", "G013_55", "G013_97", "G013_98", "G013_99"}));
-		mav.addObject("chgStatList"		, rendererService.getAvailCommonCodeList("G685"));		// 주문변경요청상태코드
-		mav.addObject("chgGbList"		, rendererService.getAvailCommonCodeList("G680"));		// 주문변경구분코드
-		mav.addObject("pgGbList"		, rendererService.getAvailCommonCodeList("G015"));		// 결제타입
-		mav.addObject("payMeansList"	, rendererService.getAvailCommonCodeList("G014"));		// 결제수단
-		mav.addObject("siteCdList"		, rendererService.getAvailCommonCodeList("G000"));		// 사이트구분
-		mav.addObject("formalGbList"	, rendererService.getAvailCommonCodeList("G009"));		// 정상/이월
+		mav.addObject("ordDtlStatList", rendererService.getCommonCodeList("G013", "Y", new String[] {"G013_10", "G013_11", "G013_25", "G013_35", "G013_55", "G013_97", "G013_98", "G013_99"}));
+		mav.addObject("chgStatList", rendererService.getAvailCommonCodeList("G685"));		// 주문변경요청상태코드
+		mav.addObject("chgGbList", rendererService.getAvailCommonCodeList("G680"));		// 주문변경구분코드
+		mav.addObject("pgGbList", rendererService.getAvailCommonCodeList("G015"));		// 결제타입
+		mav.addObject("payMeansList", rendererService.getAvailCommonCodeList("G014"));		// 결제수단
+		mav.addObject("siteCdList", rendererService.getAvailCommonCodeList("G000"));		// 사이트구분
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));		// 정상/이월
+
+		mav.addObject("userNo", TsaSession.getInfo().getUserNo());
 
-		mav.addObject("userNo"			, TsaSession.getInfo().getUserNo());
+		// CTI 접속을 통해 접근 시
+		mav.addObject("cellPhnno", cellPhnno);
 
 		mav.setViewName("order/OrderListForm");
 
@@ -113,12 +117,12 @@ public class TsaOrderController extends TsaBaseController {
 
 		// 주문상태 CD_GB 변경
 		if (order.getMultiOrdStat() != null) {
-			for (int i=0 ; i<order.getMultiOrdStat().length ; i++) {
+			for (int i = 0; i < order.getMultiOrdStat().length; i++) {
 				String ordStat = order.getMultiOrdStat()[i].replace("G012", "G013");
 				order.getMultiOrdStat()[i] = ordStat;
 			}
 		}
-		
+
 		// 2021.07.13 업체,브랜드 검색방법 변경
 		if (!StringUtils.isBlank(order.getBrandList())) {
 			try {
@@ -151,8 +155,8 @@ public class TsaOrderController extends TsaBaseController {
 		// 주문목록 페이지 조회
 		Collection<Order> orderList = orderService.getOrderList(order);
 
-		result.set("pageing"	, order);
-		result.set("orderList"	, orderList);
+		result.set("pageing", order);
+		result.set("orderList", orderList);
 
 		return result;
 	}
@@ -213,10 +217,10 @@ public class TsaOrderController extends TsaBaseController {
 		Order order = new Order();
 		order.setOrdNo(ordNo);
 		order.setDelYn("N");
-		
+
 		// 2021.05.11 배송비수정여부추가
 		Collection<Order> orderDetailList = orderService.getOrderDetailList(order);
-		
+
 		/*
 		// 2021.07.29 결제금액관련정보
 		int listSumAmt 			= 0; // 상품금액합계(정상가)
@@ -252,7 +256,7 @@ public class TsaOrderController extends TsaBaseController {
 		int gfcdUseAmtSum		= 0;	// 상품권결제액
 		int savePntAmtSum		= 0;	// 적립금액
 		*/
-		
+
 		String allCanYn = "Y";
 		for (Order orderDetail : orderDetailList) {
 			if ("Y".equals(allCanYn)
@@ -265,24 +269,24 @@ public class TsaOrderController extends TsaBaseController {
 		}
 
 		// 1. 주문기본정보
-		mav.addObject("ordNo"					, ordNo);												// 주문번호
-		mav.addObject("userNo"					, TsaSession.getInfo().getUserNo());					// 관리자번호
+		mav.addObject("ordNo", ordNo);												// 주문번호
+		mav.addObject("userNo", TsaSession.getInfo().getUserNo());					// 관리자번호
 
-		mav.addObject("orderInfo"				, orderService.getOrderInfoList(order));				// 주문기본정보
-		mav.addObject("orderGoodsInfo"			, orderDetailList);										// 주문상품정보
-		mav.addObject("orderFreeGiftInfo"		, orderService.getOrderFreeGiftList(order));			// 주문사은품정보 2020.12.16 추가
-		mav.addObject("orderDeliveryAddrInfo"	, orderService.getDeliveryAddrList(order));				// 배송정보
-		mav.addObject("orderPaymentInfo"		, orderService.getOrderPaymentBasicInfoList(order));	// 결제정보
-		mav.addObject("orderDeliveryFeeInfo"	, orderService.getDeliveryFeeList(order));				// 배송비정보
+		mav.addObject("orderInfo", orderService.getOrderInfoList(order));				// 주문기본정보
+		mav.addObject("orderGoodsInfo", orderDetailList);										// 주문상품정보
+		mav.addObject("orderFreeGiftInfo", orderService.getOrderFreeGiftList(order));			// 주문사은품정보 2020.12.16 추가
+		mav.addObject("orderDeliveryAddrInfo", orderService.getDeliveryAddrList(order));				// 배송정보
+		mav.addObject("orderPaymentInfo", orderService.getOrderPaymentBasicInfoList(order));	// 결제정보
+		mav.addObject("orderDeliveryFeeInfo", orderService.getDeliveryFeeList(order));				// 배송비정보
 
 		// 2. 클레임정보
-		mav.addObject("orderChangeInfo"			, orderService.getOrderChangeList(order));				// 취소/반품/교환 요청 정보
-		mav.addObject("orderRefundInfo"			, orderService.getOrderRefundInfo(order));				// 환불정보
+		mav.addObject("orderChangeInfo", orderService.getOrderChangeList(order));				// 취소/반품/교환 요청 정보
+		mav.addObject("orderRefundInfo", orderService.getOrderRefundInfo(order));				// 환불정보
 
 		// 3. 주문메모정보
-		mav.addObject("orderCounselInfo"		, orderService.getOrderCounselInfo(order));				// 상담내역
-		mav.addObject("orderAdminMemoInfo"		, orderService.getOrderMemoList(order));				// 관리자메모목록
-		mav.addObject("allCanYn"				, allCanYn);											// 배송지수정가능여부
+		mav.addObject("orderCounselInfo", orderService.getOrderCounselInfo(order));				// 상담내역
+		mav.addObject("orderAdminMemoInfo", orderService.getOrderMemoList(order));				// 관리자메모목록
+		mav.addObject("allCanYn", allCanYn);											// 배송지수정가능여부
 
 		mav.setViewName("order/OrderDetailForm");
 
@@ -303,8 +307,8 @@ public class TsaOrderController extends TsaBaseController {
 	@ResponseBody
 	public ModelAndView orderMemoCreateFrom(@RequestParam(value = "ordNo") int ordNo, @RequestParam(value = "seq") int seq, @RequestParam(value = "mode") String mode) {
 		ModelAndView mav = new ModelAndView();
-		int userNo 		= TsaSession.getInfo().getUserNo();
-		String userNm 	= TsaSession.getInfo().getUserNm();
+		int userNo = TsaSession.getInfo().getUserNo();
+		String userNm = TsaSession.getInfo().getUserNm();
 
 		if ("U".equals(mode)) {
 			Order order = new Order();
@@ -317,11 +321,11 @@ public class TsaOrderController extends TsaBaseController {
 			mav.addObject("orderMemo", orderMemo);
 		}
 
-		mav.addObject("userNo"	, userNo);
-		mav.addObject("userNm"	, userNm);
-		mav.addObject("ordNo"	, ordNo);
-		mav.addObject("seq"		, seq);
-		mav.addObject("mode"	, mode);
+		mav.addObject("userNo", userNo);
+		mav.addObject("userNm", userNm);
+		mav.addObject("ordNo", ordNo);
+		mav.addObject("seq", seq);
+		mav.addObject("mode", mode);
 
 		mav.setViewName("order/OrderMemoRegistForm");
 		return mav;
@@ -524,7 +528,7 @@ public class TsaOrderController extends TsaBaseController {
 
 		return super.ok(message.getMessage("SUCC_0004"));
 	}
-	
+
 	/**
 	 * 배송 > 배송지 정보 수정
 	 *
@@ -540,7 +544,7 @@ public class TsaOrderController extends TsaBaseController {
 		orderService.updateOrderAddr(order);
 		return super.ok(message.getMessage("SUCC_0002"));
 	}
-	
+
 	/**
 	 * 반품/교환 > 회수지 정보 수정
 	 *
@@ -557,7 +561,6 @@ public class TsaOrderController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0002"));
 	}
 
-
 	/* 주문 샘플 데이터 (추후 삭제 예정) */
 	@GetMapping("/sample/create/form")
 	@ResponseBody
@@ -571,12 +574,12 @@ public class TsaOrderController extends TsaBaseController {
 		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
 		// 시즌
 		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
-		
+
 		mav.setViewName("order/OrderSamplePopupForm");
-		
+
 		return mav;
 	}
-	
+
 	@PostMapping("/sample/create")
 	@ResponseBody
 	public GagaMap createOrderSample(@RequestBody OrderSample orderSample) {
@@ -584,9 +587,9 @@ public class TsaOrderController extends TsaBaseController {
 		result.set("status", GagaResponseStatus.FAIL.getCode());
 
 		log.info("orderSample >>> {}", orderSample);
-		
+
 		result = pgService.createOrderSample(orderSample);
-		
+
 		// 처리 결과 코드에 따른 메세지 설정
 		if (result.get("status").equals(GagaResponseStatus.SUCCESS.getCode())) {
 			result.set("message", message.getMessage("SUCC_0004"));
@@ -602,7 +605,7 @@ public class TsaOrderController extends TsaBaseController {
 	public Collection<Goods> getOrderSampleGoodsInfo(@RequestBody String[] arrGoodsCd) {
 		Goods goods = new Goods();
 		goods.setArrGoodsCd(arrGoodsCd);
-		
+
 		return pgService.getOrderSampleGoodsInfo(goods);
 	}
 
@@ -611,9 +614,9 @@ public class TsaOrderController extends TsaBaseController {
 	public Goods getOrderSampleGoodsStock(@RequestBody Goods goods) {
 		return pgService.getOrderSampleGoodsStock(goods);
 	}
-	
+
 	/* //주문 샘플 데이터 (추후 삭제 예정) */
-	
+
 	/**
 	 * 스윗트래커 정보 조회
 	 *
@@ -626,13 +629,13 @@ public class TsaOrderController extends TsaBaseController {
 		ModelAndView mav = new ModelAndView();
 
 		Collection<Order> sweetTrackerDeliveryList = orderService.getSweetTrackerDeliveryInfo(order);
-		mav.addObject("sweetTrackerDeliveryList"	, sweetTrackerDeliveryList); // 택배사 목록
-		
+		mav.addObject("sweetTrackerDeliveryList", sweetTrackerDeliveryList); // 택배사 목록
+
 		mav.setViewName("order/SweetTrackerDeliveryList");
 
 		return mav;
 	}
-	
+
 	/**
 	 * 자동품절취소실패목록
 	 *
@@ -648,7 +651,7 @@ public class TsaOrderController extends TsaBaseController {
 
 		return mav;
 	}
-	
+
 	/**
 	 * 자동품절취소실패목록
 	 *
@@ -669,13 +672,3 @@ public class TsaOrderController extends TsaBaseController {
 	}
 
 }
-
-
-
-
-
-
-
-
-
-

+ 43 - 2
src/main/java/com/style24/admin/biz/web/TsaStatisticsController.java

@@ -970,6 +970,42 @@ public class TsaStatisticsController extends TsaBaseController {
 		return statisticsService.getCustomerAgeOrderList(statistics);
 	}
 
+	/**
+	 * 구매자랭킹 화면
+	 * @return
+	 * @author swkim
+	 * @since 2021. 9. 28
+	 */
+	@GetMapping("/customer/ranking/form")
+	public ModelAndView customerRankingForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("statistics/CustomerRankingForm");
+
+		return mav;
+	}
+
+	/**
+	 * 구매자랭킹 조회
+	 * author: swkim
+	 * return: Collection<Statistics>
+	 * since: 2021. 9. 28.
+	 */
+	@PostMapping("/customer/ranking/list")
+	@ResponseBody
+	public Collection<Statistics> getCustomerRankingList(@RequestBody Statistics statistics) {
+
+		if (!StringUtils.isBlank(statistics.getBrandCdList())) {
+			statistics.setMultiBrandCd(statistics.getBrandCdList().split(","));
+		}
+
+		if (!StringUtils.isBlank(statistics.getItemkindCdList())) {
+			statistics.setMultiItemkindCd(statistics.getItemkindCdList().split(","));
+		}
+
+		return statisticsService.getCustomerRankingList(statistics);
+	}
+
 	/**
 	 * 회원활동현황 화면
 	 * @return
@@ -980,8 +1016,13 @@ public class TsaStatisticsController extends TsaBaseController {
 	public ModelAndView customerActiveForm() {
 		ModelAndView mav = new ModelAndView();
 
-		// 회원등급
-		mav.addObject("gradeGbList", rendererService.getAvailCommonCodeList("G110"));
+		//미로그인회원형황
+		mav.addObject("unloginList", statisticsService.getCustomerUnloginList());
+		//마케팅수신동의현황
+		mav.addObject("marketingList", statisticsService.getCustomerMarketingList());
+		//휴면전환 잔여일별 회원현황
+		mav.addObject("dormRemainList", statisticsService.getCustomerDormRemainList());
+
 		mav.setViewName("statistics/CustomerActiveForm");
 
 		return mav;

+ 7 - 1
src/main/java/com/style24/persistence/domain/Statistics.java

@@ -205,7 +205,7 @@ public class Statistics extends TscBaseDomain {
 	private int ordQty;
 	private int custCnt;
 	private int custCpnCnt;
-	private int ordRate;
+	private double ordRate;
 
 	private String planSq;
 	private String planNm;
@@ -264,4 +264,10 @@ public class Statistics extends TscBaseDomain {
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] multiGradeGb;
 
+	private String custId;
+	private int custNo;
+	private int custPoint;
+
+	private String distributionGbS;
+	private String distributionGbW;
 }

+ 585 - 43
src/main/java/com/style24/persistence/mybatis/shop/TsaStatistics.xml

@@ -1193,7 +1193,7 @@
 		    , CPN_NM -- 쿠폰명
 		    , BURDEN -- 자사분담율
 		    , DOWN_CNT
-		    , FLOOR(USE_CNT / DOWN_CNT * 100 * 10) / 10 AS USE_RATE -- 사용율
+			, ROUND((USE_CNT / DOWN_CNT) * 100 * 100) / 10 / 10 AS USE_RATE
 		    , USE_CNT -- 사용수
 		    , ORD_AMT -- 주문금액
 		    , CPN_AMT -- 쿠폰비용
@@ -1231,7 +1231,7 @@
 		    , Z.ORD_QTY
 		    , Z.CUST_CNT
 		    , X.CUST_CPN_CNT
-		    , FLOOR((X.CUST_CPN_CNT / Z.CUST_CNT * 100) / 10) * 10 AS ORD_RATE
+			, ROUND((X.CUST_CPN_CNT / Z.CUST_CNT * 100 * 100) / 10) / 10 AS ORD_RATE
 		FROM (
 		     SELECT
 		        A.BRAND_CD
@@ -1339,21 +1339,23 @@
 		      ]]>
 		      AND B.ORD_DTL_STAT NOT IN ('G013_00', 'G013_10', 'G013_98')               -- 주문접수,입금대기,입금전취소 제외
 		      AND B.ORD_QTY > B.CNCL_RTN_QTY
-              <if test="applyGbArr == null">
-	              /* 프로모션유형값없을시 */
-			      AND (B.TMTB1_DC_AMT + B.TMTB2_DC_AMT) > 0
-              </if>
-	          <if test="applyGbArr != null">
-	              /* 프로모션유형 */
-	              <foreach collection="applyGbArr" item="item" index="index">
-	                  <if test='item == "G810_10"'>
-	                      AND TMTB1_DC_AMT > 0 -- 수량
-	                  </if>
-	                  <if test='item == "G810_11"'>
-	                      AND TMTB2_DC_AMT > 0 -- 금액
-	                  </if>
-	              </foreach>
-	          </if>
+              <choose>
+				  <when test="applyGbArr != null and applyGbArr != ''">
+					  /* 프로모션유형 */
+					  <foreach collection="applyGbArr" item="item" index="index">
+						  <if test='item == "G810_10"'>
+							  AND TMTB1_DC_AMT > 0 -- 수량
+						  </if>
+						  <if test='item == "G810_11"'>
+							  AND TMTB2_DC_AMT > 0 -- 금액
+						  </if>
+					  </foreach>
+				  </when>
+		    	<otherwise>
+					/* 프로모션유형값없을시 */
+					AND (B.TMTB1_DC_AMT + B.TMTB2_DC_AMT) > 0
+				</otherwise>
+			  </choose>
 		)
 		-- 수량할인
 		, TMTB1 AS (
@@ -1468,7 +1470,7 @@
 		GROUP BY A.BRAND_CD, B.BRAND_ENM, A.GOODS_CD
 	</select>
 
-	<!-- 사은품 주문조회 -->
+	<!-- 기획전 주문조회 -->
 	<select id="getPlanOrderList" parameterType="Statistics" resultType="Statistics">
 	    /* TsaStatistics.getPlanOrderList */
 		SELECT
@@ -1501,18 +1503,18 @@
 		      ]]>
 		      AND B.ORD_DTL_STAT NOT IN ('G013_00', 'G013_10', 'G013_98')               -- 주문접수,입금대기,입금전취소 제외
 		      AND B.ORD_QTY > B.CNCL_RTN_QTY
-	          <if test="multiDistributionGb != null">
-	              /* 물류구분 */
-	              <foreach collection="multiDistributionGb" item="item" index="index">
-	                  <if test="item == 'SCM'">
-	                      AND C.DISTRIBUTION_GB = 'G065_20' -- 입점
-	                  </if>
-	                  <if test="item == 'WMS'">
-		                  AND C.DISTRIBUTION_GB IN ('G065_10', 'G065_11', 'G065_12') -- 위탁
-	                  </if>
-	              </foreach>
-	          </if>
-		      <if test="multiTmtbSq != null">
+		      <choose>
+				  <when test="distributionGbS != null and distributionGbS !='' and distributionGbW != null and distributionGbW !=''">
+					  AND C.DISTRIBUTION_GB IN ('G065_10', 'G065_11', 'G065_12', 'G065_20')
+				  </when>
+				  <when test="distributionGbW != null and distributionGbW !=''">
+					  AND C.DISTRIBUTION_GB IN ('G065_10', 'G065_11', 'G065_12')
+				  </when>
+				  <when test="distributionGbS != null and distributionGbS !=''">
+					  AND C.DISTRIBUTION_GB = 'G065_20'
+				  </when>
+			  </choose>
+		      <if test="multiPlanSq != null">
 		          /* 기획전번호  */
 		          <foreach collection="multiPlanSq" item="item" index="index"  open="AND E.PLAN_SQ IN (" close=")" separator=",">#{item}</foreach>
 		      </if>
@@ -1521,7 +1523,7 @@
 		GROUP BY DISTRIBUTION_GB, BRAND_ENM, PLAN_SQ
 	</select>
 
-	<!-- 사은품 주문상세 조회 -->
+	<!-- 기획전 주문상세 조회 -->
 	<select id="getPlanOrderDetailList" parameterType="Statistics" resultType="Statistics">
 	    /* TsaStatistics.getPlanOrderDetailList */
 		WITH TAB AS (
@@ -1556,7 +1558,7 @@
 		    , SUM(ORD_AMT) AS ORD_AMT
 		    , SUM(ORD_QTY) AS ORD_QTY
 		    , SUM(CUST_CNT) AS CUST_CNT
-		    , FLOOR((SUM(CUST_CNT) / (SELECT TOT_CUST_CNT FROM TAB) * 100) / 10) * 10 AS ORD_RATE
+		    , ROUND((SUM(CUST_CNT) / (SELECT TOT_CUST_CNT FROM TAB) * 100 * 100) / 10) / 10 AS ORD_RATE
 		FROM (
 		     SELECT C.DISTRIBUTION_GB
 		         , C.GOODS_CD
@@ -1581,17 +1583,6 @@
 		      ]]>
 		      AND B.ORD_DTL_STAT NOT IN ('G013_00', 'G013_10', 'G013_98')               -- 주문접수,입금대기,입금전취소 제외
 		      AND B.ORD_QTY > B.CNCL_RTN_QTY
-              <if test="multiDistributionGb != null">
-                  /* 물류구분 */
-                  <foreach collection="multiDistributionGb" item="item" index="index">
-                      <if test="item == 'SCM'">
-                          AND C.DISTRIBUTION_GB = 'G065_20' -- 입점
-                      </if>
-                      <if test="item == 'WMS'">
-                          AND C.DISTRIBUTION_GB IN ('G065_10', 'G065_11', 'G065_12') -- 위탁
-                      </if>
-                  </foreach>
-              </if>
 		      AND E.PLAN_SQ = #{planSq}
 		    GROUP BY C.DISTRIBUTION_GB, C.GOODS_CD, C.GOODS_NM, A.CUST_NO
 		) X
@@ -2085,4 +2076,555 @@
 		ORDER BY A.AGE, A.SEX_GB
 	</select>
 
+	<!-- 구매자랭킹 -->
+	<select id="getCustomerRankingList" parameterType="Statistics" resultType="Statistics">
+		/* TsaStatistics.getCustomerRankingList */
+		WITH TAB AS (
+			SELECT *
+			FROM (
+			SELECT A.ORD_NO
+				, B.ORD_DTL_NO
+				, B.ORD_QTY
+				, B.CNCL_RTN_QTY
+				, B.ORD_AMT
+				, B.CNCL_RTN_AMT
+				, B.CPN1_DC_AMT
+				, A.PAY_DT
+				, A.FRONT_GB
+				, C.ITEMKIND_CD
+				, C.BRAND_CD
+				, E.CUST_NO
+				, E.CUST_GRADE
+				, RANK() OVER (PARTITION BY B.ORD_DTL_NO ORDER BY B.ORD_DTL_HST_SQ) AS RNK
+			FROM TB_ORDER A,
+				TB_ORDER_DETAIL_HST B,
+				TB_GOODS C,
+				TB_CUSTOMER E
+			WHERE A.ORD_NO = B.ORD_NO
+				AND B.GOODS_CD = C.GOODS_CD
+				AND A.CUST_NO = E.CUST_NO
+				AND A.PAY_DT >= STR_TO_DATE(#{startDt},'%Y-%m-%d')                         -- 시작일변수
+				AND A.PAY_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{endDt},'%Y-%m-%d'), INTERVAL 1 DAY) -- 종료일변수
+				AND E.CUST_NO > 0
+				AND A.MALL_GB = 'G011_10'
+				AND B.ORD_EXCH_GB = 'O'
+				AND B.ORD_DTL_STAT = 'G013_20' -- 결제완료
+		<if test="multiFrontGb != null">
+			/* 디바이스 */
+			<foreach collection="multiFrontGb" item="item" index="index"  open="AND A.FRONT_GB IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiSexGb != null">
+			/* 성별구분 */
+			<foreach collection="multiSexGb" item="item" index="index"  open="AND FN_DEC_AES(E.SEX_GB) IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiAgeGb != null">
+			/* 연령구분 */
+			<foreach collection="multiAgeGb" item="item" index="index"  open="AND CASE WHEN FN_DEC_AES(E.BIRTH_YMD) = '' OR FN_DEC_AES(E.BIRTH_YMD) IS NULL THEN 'X'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(E.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(E.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(E.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(E.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+				ELSE 'X' END IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiBrandCd != null">
+			/* 브랜드 */
+			<foreach collection="multiBrandCd" item="item" index="index"  open="AND BRAND_CD IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiItemkindCd != null">
+			/* 품목 */
+			<foreach collection="multiItemkindCd" item="item" index="index"  open="AND ITEMKIND_CD IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+			) A
+			WHERE RNK = 1
+		)
+		-- 판매수
+		, TAB_SELL_QTY AS (
+			SELECT
+				SUM(ORD_QTY) AS VAL
+				, '1' AS GBN
+				, CUST_NO
+			FROM TAB
+			GROUP BY CUST_NO
+		)
+		-- 매출
+		, TAB_ORD AS (
+			SELECT
+				SUM(ORD_AMT + CPN1_DC_AMT + (SELECT SUM(OPT_ADD_PRICE * ITEM_QTY) FROM TB_ORDER_DETAIL_ITEM X WHERE X.ORD_DTL_NO = A.ORD_DTL_NO)) AS VAL
+				, '2' AS GBN
+				, CUST_NO
+			FROM TAB A
+			GROUP BY CUST_NO
+		)
+		-- 취소갯수
+		, TAB_CNCL_QTY AS (
+			SELECT SUM(CHG_QTY) AS VAL
+				, '3' AS GBN
+				, C.CUST_NO
+			FROM TB_ORDER_CHANGE_DETAIL A, TB_ORDER_DETAIL B, TB_ORDER C, TB_GOODS E, TB_CUSTOMER G
+			WHERE A.ORD_DTL_NO = B.ORD_DTL_NO
+				AND B.ORD_NO = C.ORD_NO
+				AND B.GOODS_CD = E.GOODS_CD
+				AND C.CUST_NO = G.CUST_NO
+				AND CHG_STAT = 'G685_18' -- 결제후취소
+				AND COMPLETE_DT >= STR_TO_DATE(#{startDt},'%Y-%m-%d') -- 시작일변수
+				AND COMPLETE_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{endDt},'%Y-%m-%d'), INTERVAL 1 DAY) -- 종료일변수
+				AND MALL_GB = 'G011_10'
+				AND G.CUST_NO > 0
+		<if test="multiFrontGb != null">
+			/* 디바이스 */
+			<foreach collection="multiFrontGb" item="item" index="index"  open="AND C.FRONT_GB IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiSexGb != null">
+			/* 성별구분 */
+			<foreach collection="multiSexGb" item="item" index="index"  open="AND FN_DEC_AES(G.SEX_GB) IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiAgeGb != null">
+			/* 연령구분 */
+			<foreach collection="multiAgeGb" item="item" index="index"  open="AND CASE WHEN FN_DEC_AES(G.BIRTH_YMD) = '' OR FN_DEC_AES(G.BIRTH_YMD) IS NULL THEN 'X'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+				ELSE 'X' END IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiBrandCd != null">
+			/* 브랜드 */
+			<foreach collection="multiBrandCd" item="item" index="index"  open="AND BRAND_CD IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiItemkindCd != null">
+			/* 품목 */
+			<foreach collection="multiItemkindCd" item="item" index="index"  open="AND ITEMKIND_CD IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+			GROUP BY C.CUST_NO
+		)
+		-- 반품갯수
+		, TAB_RTN_QTY AS (
+			SELECT SUM(CHG_QTY) AS VAL
+				, '4' AS GBN
+				, C.CUST_NO
+			FROM TB_ORDER_CHANGE_DETAIL A, TB_ORDER_DETAIL B, TB_ORDER C, TB_GOODS E, TB_CUSTOMER G
+			WHERE A.ORD_DTL_NO = B.ORD_DTL_NO
+				AND B.ORD_NO = C.ORD_NO
+				AND B.GOODS_CD = E.GOODS_CD
+				AND C.CUST_NO = G.CUST_NO
+				AND CHG_STAT = 'G685_60' -- 반품완료
+				AND COMPLETE_DT >= STR_TO_DATE(#{startDt},'%Y-%m-%d') -- 시작일변수
+				AND COMPLETE_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{endDt},'%Y-%m-%d'), INTERVAL 1 DAY) -- 종료일변수
+				AND MALL_GB = 'G011_10'
+				AND G.CUST_NO > 0
+		<if test="multiFrontGb != null">
+			/* 디바이스 */
+			<foreach collection="multiFrontGb" item="item" index="index"  open="AND C.FRONT_GB IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiSexGb != null">
+			/* 성별구분 */
+			<foreach collection="multiSexGb" item="item" index="index"  open="AND FN_DEC_AES(G.SEX_GB) IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiAgeGb != null">
+			/* 연령구분 */
+			<foreach collection="multiAgeGb" item="item" index="index"  open="AND CASE WHEN FN_DEC_AES(G.BIRTH_YMD) = '' OR FN_DEC_AES(G.BIRTH_YMD) IS NULL THEN 'X'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+				ELSE 'X' END IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiBrandCd != null">
+			/* 브랜드 */
+			<foreach collection="multiBrandCd" item="item" index="index"  open="AND BRAND_CD IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiItemkindCd != null">
+			/* 품목 */
+			<foreach collection="multiItemkindCd" item="item" index="index"  open="AND ITEMKIND_CD IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+			GROUP BY C.CUST_NO
+		)
+		-- 취소액
+		, TAB_CNCL_AMT AS (
+			SELECT SUM((C.CURR_PRICE + (SELECT SUM(OPT_ADD_PRICE * ITEM_QTY) FROM TB_ORDER_DETAIL_ITEM X WHERE X.ORD_DTL_NO = C.ORD_DTL_NO)) * B.CHG_QTY) AS VAL
+				, '5' AS GBN
+				, D.CUST_NO
+			FROM TB_ORDER_CHANGE_DETAIL B, TB_ORDER_DETAIL C, TB_ORDER D, TB_GOODS E, TB_CUSTOMER G
+			WHERE B.ORD_DTL_NO = C.ORD_DTL_NO
+				AND C.ORD_NO = D.ORD_NO
+				AND C.GOODS_CD = E.GOODS_CD
+				AND D.CUST_NO = G.CUST_NO
+				AND CHG_STAT = 'G685_18' -- 결제후취소
+				AND B.COMPLETE_DT >= STR_TO_DATE(#{startDt},'%Y-%m-%d') -- 시작일변수
+				AND B.COMPLETE_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{endDt},'%Y-%m-%d'), INTERVAL 1 DAY) -- 종료일변수
+				AND MALL_GB = 'G011_10'
+				AND G.CUST_NO > 0
+		<if test="multiFrontGb != null">
+			/* 디바이스 */
+			<foreach collection="multiFrontGb" item="item" index="index"  open="AND D.FRONT_GB IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiSexGb != null">
+			/* 성별구분 */
+			<foreach collection="multiSexGb" item="item" index="index"  open="AND FN_DEC_AES(G.SEX_GB) IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiAgeGb != null">
+			/* 연령구분 */
+			<foreach collection="multiAgeGb" item="item" index="index"  open="AND CASE WHEN FN_DEC_AES(G.BIRTH_YMD) = '' OR FN_DEC_AES(G.BIRTH_YMD) IS NULL THEN 'X'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+				ELSE 'X' END IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiBrandCd != null">
+			/* 브랜드 */
+			<foreach collection="multiBrandCd" item="item" index="index"  open="AND BRAND_CD IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiItemkindCd != null">
+			/* 품목 */
+			<foreach collection="multiItemkindCd" item="item" index="index"  open="AND ITEMKIND_CD IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+			GROUP BY D.CUST_NO
+		)
+		-- 반품액
+		, TAB_RTN_AMT AS (
+			SELECT SUM((C.CURR_PRICE + (SELECT SUM(OPT_ADD_PRICE * ITEM_QTY) FROM TB_ORDER_DETAIL_ITEM X WHERE X.ORD_DTL_NO = C.ORD_DTL_NO)) * B.CHG_QTY) AS VAL
+				, '6' AS GBN
+				, D.CUST_NO
+			FROM TB_ORDER_CHANGE_DETAIL B, TB_ORDER_DETAIL C, TB_ORDER D, TB_GOODS E, TB_CUSTOMER G
+			WHERE B.ORD_DTL_NO = C.ORD_DTL_NO
+				AND C.ORD_NO = D.ORD_NO
+				AND C.GOODS_CD = E.GOODS_CD
+				AND D.CUST_NO = G.CUST_NO
+				AND CHG_STAT = 'G685_60' -- 반품완료
+				AND B.COMPLETE_DT >= STR_TO_DATE(#{startDt},'%Y-%m-%d') -- 시작일변수
+				AND B.COMPLETE_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{endDt},'%Y-%m-%d'), INTERVAL 1 DAY) -- 종료일변수
+				AND MALL_GB = 'G011_10'
+				AND G.CUST_NO > 0
+		<if test="multiFrontGb != null">
+			/* 디바이스 */
+			<foreach collection="multiFrontGb" item="item" index="index"  open="AND D.FRONT_GB IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiSexGb != null">
+			/* 성별구분 */
+			<foreach collection="multiSexGb" item="item" index="index"  open="AND FN_DEC_AES(G.SEX_GB) IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiAgeGb != null">
+			/* 연령구분 */
+			<foreach collection="multiAgeGb" item="item" index="index"  open="AND CASE WHEN FN_DEC_AES(G.BIRTH_YMD) = '' OR FN_DEC_AES(G.BIRTH_YMD) IS NULL THEN 'X'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+				ELSE 'X' END IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiBrandCd != null">
+			/* 브랜드 */
+			<foreach collection="multiBrandCd" item="item" index="index"  open="AND BRAND_CD IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+		<if test="multiItemkindCd != null">
+			/* 품목 */
+			<foreach collection="multiItemkindCd" item="item" index="index"  open="AND ITEMKIND_CD IN (" close=")" separator=",">#{item}</foreach>
+		</if>
+			GROUP BY D.CUST_NO
+		)
+		-- 주문수
+		, TAB_ORD_CNT AS (
+			SELECT
+				SUM(VAL) AS VAL
+				, '7' AS GBN
+				, CUST_NO
+			FROM (
+				SELECT
+					1 AS VAL
+					, ORD_NO
+					, CUST_NO
+				FROM TAB
+				GROUP BY ORD_NO, CUST_NO
+			) A
+			GROUP BY CUST_NO
+		)
+		SELECT
+			CONCAT(SUBSTRING(CUST_ID, 1, 3), '****', '(', SUBSTRING(FN_DEC_AES(CUST_NM), 1, 1), '**', ')') AS CUST_ID -- 아이디
+			, CASE WHEN FN_DEC_AES(BIRTH_YMD) = '' OR FN_DEC_AES(BIRTH_YMD) IS NULL THEN 'X'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+			ELSE 'X' END AS AGE
+		    , X.CUST_NO
+			, FN_GET_CODE_NM('G007', FN_DEC_AES(SEX_GB)) AS SEX_GB
+			, FN_GET_CODE_NM('G110', CUST_GRADE) AS CUST_GRADE -- 등급
+			, SUM(ORD_AMT - CNCL_AMT - RTN_AMT) AS TOT_ORD_AMT -- 매출액
+			, SUM(ORD_CNT) AS ORD_CNT -- 주문수
+			, SUM(SELL_QTY - CNCL_QTY - RTN_QTY) AS SELL_QTY -- 판매수
+			, FLOOR(SUM(ORD_AMT) / SUM(ORD_CNT)) AS CUST_PRICE -- 객단가
+			, IFNULL((SELECT SUM(RM_PNT_AMT) FROM TB_CUST_POINT CP WHERE CP.CUST_NO = X.CUST_NO AND EXP_CMP_DT IS NULL), 0) AS CUST_POINT -- 회원포인트
+		FROM (
+			SELECT
+				CUST_NO
+				, SUM(CASE WHEN GBN = '1' THEN VAL ELSE 0 END) AS SELL_QTY -- 판매수
+				, SUM(CASE WHEN GBN = '2' THEN VAL ELSE 0 END) AS ORD_AMT -- 매출액(판매금액)
+				, SUM(CASE WHEN GBN = '3' THEN VAL ELSE 0 END) AS CNCL_QTY -- 취소수량
+				, SUM(CASE WHEN GBN = '4' THEN VAL ELSE 0 END) AS RTN_QTY -- 반품수량
+				, SUM(CASE WHEN GBN = '5' THEN VAL ELSE 0 END) AS CNCL_AMT -- 취소금액
+				, SUM(CASE WHEN GBN = '6' THEN VAL ELSE 0 END) AS RTN_AMT -- 반품금액
+				, SUM(CASE WHEN GBN = '7' THEN VAL ELSE 0 END) AS ORD_CNT -- 주문수
+			FROM (
+				SELECT * FROM TAB_SELL_QTY
+				UNION ALL
+				SELECT * FROM TAB_ORD
+				UNION ALL
+				SELECT * FROM TAB_CNCL_QTY
+				UNION ALL
+				SELECT * FROM TAB_RTN_QTY
+				UNION ALL
+				SELECT * FROM TAB_CNCL_AMT
+				UNION ALL
+				SELECT * FROM TAB_RTN_AMT
+				UNION ALL
+				SELECT * FROM TAB_ORD_CNT
+			) A
+			GROUP BY CUST_NO
+		) X, TB_CUSTOMER Y
+		WHERE X.CUST_NO = Y.CUST_NO
+		GROUP BY X.CUST_NO
+		ORDER BY TOT_ORD_AMT DESC
+		LIMIT 50
+	</select>
+
+	<!-- 미로그인현황 -->
+	<select id="getCustomerUnloginList" resultType="Statistics">
+		/* TsaStatistics.getCustomerUnloginList */
+		SELECT
+			X.*
+			, ROUND(CNT_5 / TOT_CNT * 100) AS PER_CNT_5
+			, ROUND(CNT_4 / TOT_CNT * 100) AS PER_CNT_4
+			, ROUND(CNT_3 / TOT_CNT * 100) AS PER_CNT_3
+			, ROUND(CNT_2 / TOT_CNT * 100) AS PER_CNT_2
+			, ROUND(CNT_1 / TOT_CNT * 100) AS PER_CNT_1
+		FROM (
+			SELECT
+				SUM(CASE WHEN GB = 5 THEN CNT ELSE 0 END) AS CNT_5
+				, SUM(CASE WHEN GB = 4 THEN CNT ELSE 0 END) AS CNT_4
+				, SUM(CASE WHEN GB = 3 THEN CNT ELSE 0 END) AS CNT_3
+				, SUM(CASE WHEN GB = 2 THEN CNT ELSE 0 END) AS CNT_2
+				, SUM(CASE WHEN GB = 1 THEN CNT ELSE 0 END) AS CNT_1
+				, SUM(CNT) AS TOT_CNT
+			FROM (
+				-- 1년
+				SELECT COUNT(1) AS CNT
+					, 5 AS GB -- 1년 ~
+				FROM TB_CUSTOMER
+				WHERE CUST_NO > 0
+					AND CUST_STAT = 'G104_10'
+					AND LOGIN_LDT &lt; DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -1 YEAR ), '%Y%m%d%H%i%s') -- now() 수정 : 조회시점의 시간까지만. ex) 2019년9월25일15시 조회 -> 20210925150000
+				-- 12개월
+				UNION ALL
+				SELECT COUNT(1) AS CNT
+					, 4 AS GB -- 9개월~12개월
+				FROM TB_CUSTOMER
+				WHERE CUST_NO > 0
+					AND CUST_STAT = 'G104_10'
+					AND LOGIN_LDT >= DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -1 YEAR ), '%Y%m%d%H%i%s')
+					AND LOGIN_LDT &lt; DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -9 MONTH ), '%Y%m%d%H%i%s')
+				-- 9개월
+				UNION ALL
+				SELECT COUNT(1) AS CNT
+					, 3 AS GB -- 6개월~9개월
+				FROM TB_CUSTOMER
+				WHERE CUST_NO > 0
+					AND CUST_STAT = 'G104_10'
+					AND LOGIN_LDT >= DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -9 MONTH ), '%Y%m%d%H%i%s')
+					AND LOGIN_LDT &lt; DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -6 MONTH ), '%Y%m%d%H%i%s')
+				-- 6개월
+				UNION ALL
+				SELECT COUNT(1) AS CNT
+					, 2 AS GB -- 3개월~6개월
+				FROM TB_CUSTOMER
+				WHERE CUST_NO > 0
+					AND CUST_STAT = 'G104_10'
+					AND LOGIN_LDT >= DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -6 MONTH ), '%Y%m%d%H%i%s')
+					AND LOGIN_LDT &lt; DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -3 MONTH ), '%Y%m%d%H%i%s')
+				-- 3개월
+				UNION ALL
+				SELECT COUNT(1) AS CNT
+					, 1 AS GB -- ~3개월
+				FROM TB_CUSTOMER
+				WHERE CUST_NO > 0
+					AND CUST_STAT = 'G104_10'
+					AND LOGIN_LDT >= DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -3 MONTH ), '%Y%m%d%H%i%s')
+					AND LOGIN_LDT &lt; DATE_FORMAT(NOW(), '%Y%m%d%H%i%s')
+			) Z
+		) X
+	</select>
+
+	<!-- 미로그인현황 회원리스트 -->
+	<select id="getCustomerUnloginInfoList" resultType="Statistics">
+		/* TsaStatistics.getCustomerUnloginInfoList */
+		SELECT
+			CUST_ID
+			, FN_DEC_AES(CUST_NM) AS CUST_NM
+			, TIMESTAMPDIFF(MONTH, LOGIN_LDT, NOW()) AS MONTHS
+			, FN_DEC_AES(CELL_PHNNO) AS CELL_PHNNO
+			, FN_DEC_AES(EMAIL) AS EMAIL
+			, SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 6) AS BIRTH_YM
+		FROM TB_CUSTOMER
+		WHERE CUST_NO > 0
+			AND CUST_STAT = 'G104_10'
+			AND LOGIN_LDT &lt; DATE_FORMAT(STR_TO_DATE(DATE_FORMAT(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), '%Y%m%d%H'), '%Y%m%d%H'), '%Y%m%d%H%i%s') -- now() 수정 : 조회시점의 시간까지만. ex) 2019년9월25일15시 조회 -> 20210925150000
+	</select>
+
+	<!-- 마케팅수신동의현황 -->
+	<select id="getCustomerMarketingList" resultType="Statistics">
+		/* TsaStatistics.getCustomerMarketingList */
+		SELECT
+			X.*
+			 , ROUND(CNT_4 / TOT_CNT * 100) AS PER_CNT_4
+			 , ROUND(CNT_3 / TOT_CNT * 100) AS PER_CNT_3
+			 , ROUND(CNT_2 / TOT_CNT * 100) AS PER_CNT_2
+			 , ROUND(CNT_1 / TOT_CNT * 100) AS PER_CNT_1
+		FROM (
+			 SELECT SUM(CASE WHEN GB = 4 THEN CNT ELSE 0 END) AS CNT_4
+				  , SUM(CASE WHEN GB = 3 THEN CNT ELSE 0 END) AS CNT_3
+				  , SUM(CASE WHEN GB = 2 THEN CNT ELSE 0 END) AS CNT_2
+				  , SUM(CASE WHEN GB = 1 THEN CNT ELSE 0 END) AS CNT_1
+				  , SUM(CNT)                                  AS TOT_CNT
+			 FROM (
+				  -- SMS
+				  SELECT COUNT(1) AS CNT
+					   , 4        AS GB
+				  FROM TB_CUSTOMER
+				  WHERE CUST_NO > 0
+					AND CUST_STAT = 'G104_10'
+					AND SMS_AGREE_YN = 'Y'
+					-- EMAIL
+				  UNION ALL
+				  SELECT COUNT(1) AS CNT
+					   , 3        AS GB
+				  FROM TB_CUSTOMER
+				  WHERE CUST_NO > 0
+					AND CUST_STAT = 'G104_10'
+					AND EMAIL_AGREE_YN = 'Y'
+					-- 푸쉬
+				  UNION ALL
+				  SELECT COUNT(1) AS CNT
+					   , 2        AS GB
+				  FROM TB_CUSTOMER
+				  WHERE CUST_NO > 0
+					AND CUST_STAT = 'G104_10'
+					AND APP_AGREE_YN = 'Y'
+					-- 미동의
+				  UNION ALL
+				  SELECT COUNT(1) AS CNT
+					   , 1        AS GB
+				  FROM TB_CUSTOMER
+				  WHERE CUST_NO > 0
+					AND CUST_STAT = 'G104_10'
+					AND SMS_AGREE_YN = 'N'
+					AND EMAIL_AGREE_YN = 'N'
+					AND APP_AGREE_YN = 'N'
+			  ) Z
+		 ) X
+	</select>
+
+	<!-- 휴면전환 잔여일별현황 -->
+	<select id="getCustomerDormRemainList" resultType="Statistics">
+		/* TsaStatistics.getCustomerDormRemainList */
+		SELECT
+			SUM(CASE WHEN GB = 4 THEN CNT ELSE 0 END) AS CNT_4 -- 12개월
+			, SUM(CASE WHEN GB = 3 THEN CNT ELSE 0 END) AS CNT_3 -- 9개월
+			, SUM(CASE WHEN GB = 2 THEN CNT ELSE 0 END) AS CNT_2 -- 6개월
+			, SUM(CASE WHEN GB = 1 THEN CNT ELSE 0 END) AS CNT_1 -- 9개월
+		FROM (
+			-- 12개월
+			SELECT COUNT(1) AS CNT
+				, 4 AS GB -- 12개월
+			FROM TB_CUSTOMER
+			WHERE CUST_NO > 0
+				AND CUST_STAT = 'G104_10'
+				AND LOGIN_LDT &lt; DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -1 DAY ), '%Y%m%d%H%i%s') -- now() 수정 : 조회시점의 시간까지만. ex) 2019년9월25일15시 조회 -> 20210925150000
+			-- 9개월
+			UNION ALL
+			SELECT COUNT(1) AS CNT
+				, 3 AS GB -- 9개월
+			FROM TB_CUSTOMER
+			WHERE CUST_NO > 0
+				AND CUST_STAT = 'G104_10'
+				AND LOGIN_LDT >= DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -3 MONTH ), '%Y%m%d%H%i%s')
+				AND LOGIN_LDT &lt; DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -1 DAY ), '%Y%m%d%H%i%s')
+			-- 6개월
+			UNION ALL
+			SELECT COUNT(1) AS CNT
+				, 2 AS GB -- 6개월
+			FROM TB_CUSTOMER
+			WHERE CUST_NO > 0
+				AND CUST_STAT = 'G104_10'
+				AND LOGIN_LDT >= DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -6 MONTH ), '%Y%m%d%H%i%s')
+				AND LOGIN_LDT &lt; DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -3 MONTH ), '%Y%m%d%H%i%s')
+			-- 3개월
+			UNION ALL
+			SELECT COUNT(1) AS CNT
+				, 1 AS GB -- ~3개월
+			FROM TB_CUSTOMER
+			WHERE CUST_NO > 0
+				AND CUST_STAT = 'G104_10'
+				AND LOGIN_LDT >= DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -9 MONTH ), '%Y%m%d%H%i%s')
+				AND LOGIN_LDT &lt; DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -6 MONTH ), '%Y%m%d%H%i%s')
+		) Z
+	</select>
+
+	<!-- 휴면전환 잔여일별현황 회원리스트 -->
+	<select id="getCustomerDormRemainInfoList" resultType="Statistics">
+	/* TsaStatistics.getCustomerDormRemainInfoList */
+		SELECT
+			*
+		FROM (
+			-- 12개월
+			SELECT '12개월' AS GB -- 12개월
+				, CUST_ID
+				, FN_DEC_AES(CUST_NM) AS CUST_NM
+				, FN_DEC_AES(CELL_PHNNO) AS CELL_PHNNO
+				, FN_DEC_AES(EMAIL) AS EMAIL
+				, SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 6) AS BIRTH_YM
+			FROM TB_CUSTOMER
+			WHERE CUST_NO > 0
+				AND CUST_STAT = 'G104_10'
+				AND LOGIN_LDT > DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -1 DAY ), '%Y%m%d%H%i%s') -- now() 수정 : 조회시점의 시간까지만. ex) 2019년9월25일15시 조회 -> 20210925150000
+			-- 9개월
+			UNION ALL
+			SELECT '9개월' AS GB -- 9개월
+				, CUST_ID
+				, FN_DEC_AES(CUST_NM) AS CUST_NM
+				, FN_DEC_AES(CELL_PHNNO) AS CELL_PHNNO
+				, FN_DEC_AES(EMAIL) AS EMAIL
+				, SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 6) AS BIRTH_YM
+			FROM TB_CUSTOMER
+			WHERE CUST_NO > 0
+				AND CUST_STAT = 'G104_10'
+				AND LOGIN_LDT >= DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -3 MONTH ), '%Y%m%d%H%i%s')
+				AND LOGIN_LDT &lt; DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -1 DAY ), '%Y%m%d%H%i%s')
+			-- 6개월
+			UNION ALL
+			SELECT '6개월' AS GB -- 6개월
+				, CUST_ID
+				, FN_DEC_AES(CUST_NM) AS CUST_NM
+				, FN_DEC_AES(CELL_PHNNO) AS CELL_PHNNO
+				, FN_DEC_AES(EMAIL) AS EMAIL
+				, SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 6) AS BIRTH_YM
+			FROM TB_CUSTOMER
+			WHERE CUST_NO > 0
+				AND CUST_STAT = 'G104_10'
+				AND LOGIN_LDT >= DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -6 MONTH ), '%Y%m%d%H%i%s')
+				AND LOGIN_LDT &lt; DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -3 MONTH ), '%Y%m%d%H%i%s')
+			-- 3개월
+			UNION ALL
+			SELECT '3개월' AS GB -- ~3개월
+				, CUST_ID
+				, FN_DEC_AES(CUST_NM) AS CUST_NM
+				, FN_DEC_AES(CELL_PHNNO) AS CELL_PHNNO
+				, FN_DEC_AES(EMAIL) AS EMAIL
+			, SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 6) AS BIRTH_YM
+			FROM TB_CUSTOMER
+			WHERE CUST_NO > 0
+				AND CUST_STAT = 'G104_10'
+				AND LOGIN_LDT >= DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -9 MONTH ), '%Y%m%d%H%i%s')
+				AND LOGIN_LDT &lt; DATE_FORMAT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL -6 MONTH ), '%Y%m%d%H%i%s')
+		) Z
+	</select>
 </mapper>

+ 10 - 2
src/main/webapp/WEB-INF/views/common/fragments/lnb.html

@@ -24,7 +24,7 @@
 <script th:inline="javascript">
 /*<![CDATA[*/
 	// LNB 메뉴 클릭 시
-	let fnClickLnb = function(menuId) {
+	let fnClickLnb = function(menuId, ctiCellPhnno) {
 		let menu = cfnGetMenuInfo(menuId);
 
 		// Menu 정보가 없으면 skip
@@ -32,7 +32,15 @@
 			return;
 		}
 		
-		$('#content').load(menu.menuUrl, function() {
+		let menuUrl = menu.menuUrl;
+		if (!gagajf.isNull(ctiCellPhnno)) {
+			if (!gagajf.isNull(menuUrl)) {
+				(menuUrl.indexOf('?') > -1) ? menuUrl += '&' : menuUrl += '?';
+			}
+			menuUrl += 'cellPhnno=' + ctiCellPhnno;
+		}
+		
+		$('#content').load(menuUrl, function() {
 			// Content Main Title
 			let arrNavigation = menu.navigation.split(' > ');
 			let contentTitle = '';

Разница между файлами не показана из-за своего большого размера
+ 0 - 33
src/main/webapp/WEB-INF/views/dashboard.html


+ 12 - 5
src/main/webapp/WEB-INF/views/order/OrderListForm.html

@@ -182,7 +182,7 @@
 						</td>
 						<th>주문자휴대폰번호</th>
 						<td>
-							<input type="text" name="orderPhnno" placeholder="" maxlength="20"/>
+							<input type="text" name="orderPhnno" placeholder="" maxlength="20" th:value="${cellPhnno}"/>
 						</td>
 					</tr>
 					<tr>
@@ -512,12 +512,12 @@ var fnSearchList = function () {
 	var edDate 	= $('#edDate').val();
 
 	if (gagajf.isNull(ordNo)) {
-		if (gagajf.isNull(stDate)) {
+		if (gagajf.isNull($('#searchForm input[name=orderPhnno]').val()) && gagajf.isNull(stDate)) {
 			mcxDialog.alert('시작 기간을 입력하세요.');
 			return;
 		}
 
-		if (gagajf.isNull(edDate)) {
+		if (gagajf.isNull($('#searchForm input[name=orderPhnno]').val()) && gagajf.isNull(edDate)) {
 			mcxDialog.alert('종료 기간을 입력하세요.');
 			return;
 		}
@@ -529,7 +529,7 @@ var fnSearchList = function () {
 	var brandText 				= $("#searchForm #brandText").val();
 	var brandList 				= $('#searchForm input[name=brandList]').val();
 	
-	if (gagajf.isNull(stDate) && gagajf.isNull(edDate)) {
+	if (gagajf.isNull($('#searchForm input[name=orderPhnno]').val()) && gagajf.isNull(stDate) && gagajf.isNull(edDate)) {
 		var temp = false;
 		
 		if (!gagajf.isNull(ordNo)) {
@@ -646,9 +646,16 @@ $('#searchForm select[name=pageSize]').on('change', function() {
 $(document).ready(function() {
 	// 달력기능 활성화
 	cfnCreateCalendar('#terms', 'stDate', 'edDate', true, '주문', 'X');
-	$('.btnRecentWeek').trigger('click');
+	if (gagajf.isNull($('#searchForm input[name=orderPhnno]').val())) {
+		$('.btnRecentWeek').trigger('click');
+	}
+	
 	gagaAgGrid.createGrid('gridOrderList', gridOptionsOrderList);
 	gridOptionsOrderList.api.hideOverlay();
+	
+	if (!gagajf.isNull($('#searchForm input[name=orderPhnno]').val())) {
+		$('#btnOrderSearch').trigger('click');
+	}
 });
 
 var fnCreateSampleOrder = function() {

+ 5 - 3
src/main/webapp/WEB-INF/views/statistics/CouponTradingForm.html

@@ -75,6 +75,7 @@
 			<ul class="panelBar">
 				<li>
 					<button type="button" class="btn btn-default btn-lg" onclick="fnDetailExcelDownLoad();">엑셀다운로드</button>
+					<span id="couponNmTxt" style="text-align: left"></span>
 				</li>
 			</ul>
 			<div id="detailGridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
@@ -155,7 +156,7 @@
 		},
 		{ headerName: "구매율", field: "ordRate", width: 150, cellClass: 'text-right',
 			cellRenderer: function(params) {
-				return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
+				return params.value + '%';
 			}
 		},
 	];
@@ -176,6 +177,7 @@
 			$("#detailSearchForm input[name=startDt]").val($("#searchForm input[name=startDt]").val());
 			$("#detailSearchForm input[name=endDt]").val($("#searchForm input[name=endDt]").val());
 			$("#detailSearchForm input[name=cpnId]").val(params.cpnId);
+			$("#couponNmTxt").text(params.cpnNm);
 			gagaAgGrid.fetch($('#detailSearchForm').prop('action'), detailGridOptions, '#detailSearchForm', fnDetailCreateTotal);
 		}
 	}
@@ -184,10 +186,10 @@
 	detailGridOptions.onCellClicked = function(event) {
 		var params = event.data;
 		if (event.colDef.field == "goodsCd"){
-			cfnOpenGoodsDetailPopup('U',goodsCd);
+			cfnOpenGoodsDetailPopup('U',params.goodsCd);
 		}
 		else if (event.colDef.field == "goodsNm"){
-			cfnOpenGoodsDetailPopup('U',goodsCd);
+			cfnOpenGoodsDetailPopup('U',params.goodsCd);
 		}
 	}
 

+ 7 - 266
src/main/webapp/WEB-INF/views/statistics/CustomerActiveForm.html

@@ -11,287 +11,28 @@
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION
  * ===  ===========  ==========  =============================================
- * 1.0  2021.09.29   yujung       최초 작성
+ * 1.0  2021.09.28   swkim       최초 작성
  *******************************************************************************
  -->
 	<div id="main">
 		<!-- 메인타이틀 영역 -->
-		<div class="main-title"></div>
+		<div class="main-title">
+		</div>
 		<!-- //메인타이틀 영역 -->
 
 		<!-- 메뉴 설명 -->
-		<div class="infoBox menu-desc"></div>
+		<div class="infoBox menu-desc">
+		</div>
 		<!-- //메뉴 설명 -->
 
 		<!-- 검색조건 영역 -->
 		<div class="panelStyle">
-			* 2020년 12월 25일 02:00 기준 / 휴면 회원 제외
-			<!-- 리스트 영역 -->
-			<div class="panelStyle">
-				<ul class="panelBar">
-					<li class="left" style="width: 50%;">
-						<div id="chart1" class="chartUnit c3" style="max-height: 300px; position: relative;">
-						</div>
-						<button type="button" class="btn btn-default btn-lg" onclick="fnExcelDownLoad();">엑셀다운로드</button>
-					</li>
-					<li class="right"  style="width: 50%;">
-						<div id="chart2" class="chartUnit c3" style="max-height: 300px; position: relative;"></div>
-					</li>
-				</ul>
-				<ul>
-					<li class="left"  style="width: 50%;">
-						<div id="chart3" class="chartUnit c3" style="max-height: 300px; position: relative;"></div>
-						<button type="button" class="btn btn-default btn-lg" onclick="fnExcelDownLoad();">엑셀다운로드</button>
-					</li>
-				</ul>
-			</div>
 		</div>
-			<!-- //리스트 영역 -->
-	</div>
-
-<style>
-.ag-header-group-text{
-	margin-left: calc(50% - 25px);
-}
-</style>
-<script th:inline="javascript">
-/*<![CDATA[*/
-
-	//chart1	======================
-	var chart1  =   c3.generate({
-		bindto: "#chart1",
-		data: {
-			columns: [
-				['3개월 이내', 76],
-				['~6개월', 21],
-				['~9개월', 0],
-				['~12개월', 0],
-				['1년~', 3],
-			],
-			type : 'pie',
-		},
-		title: {
-			text: '미로그인 회원 현황'
-		},
-		color : {pattern : ['#FF7043', '#48C9B0', '#FFD54F', '', '']},
-		legend: {
-			padding: 15, //범례 item 우측 간격
-		},
-		axis: {
-			x: {
-				type: 'category',
-				padding: {left:0, right: 0.7}, //x축 data 좌우 여백
-
-			},
-		},
-		padding: {bottom: 40},
-		size: {
-			height: 300
-		},
-
-	});
-
-	//chart2	======================
-	var chart2  =   c3.generate({
-		bindto: "#chart2",
-		data: {
-			columns: [
-				['SMS/LMS', 444,202],
-				['이메일', 455,900],
-				['푸시', 289,900],
-				['미동의', 80,900],
-			],
-			type : 'pie',
-		},
-		title: {
-			text: '마케팅 수신동의 현황'
-		},
-		color : {pattern : ['#FF7043', '#48C9B0', '#FFD54F', '', '']},
-		legend: {
-			padding: 15, //범례 item 우측 간격
-		},
-		axis: {
-			x: {
-				type: 'category',
-				padding: {left:0, right: 0.7}, //x축 data 좌우 여백
-
-			},
-		},
-		padding: {bottom: 40},
-		size: {
-			height: 300
-		},
-
-	})
-
-	//chart3	======================
-	var chart3  =   c3.generate({
-		bindto: "#chart3",
-		data: {
-			columns: [
-				['SMS/LMS', 444,202],
-				['이메일', 455,900],
-				['푸시', 289,900],
-				['미동의', 80,900],
-			],
-			type : 'bar',
-		},
-		title: {
-			text: '휴면전환 잔여일별 회원현황'
-		},
-		color : {pattern : ['#FF7043', '#48C9B0', '#FFD54F', '', '']},
-		legend: {
-			padding: 15, //범례 item 우측 간격
-		},
-		axis: {
-			x: {
-				type: 'category',
-				padding: {left:0, right: 0.7}, //x축 data 좌우 여백
-
-			},
-		},
-		padding: {bottom: 40},
-		size: {
-			height: 300
-		},
-
-	});
-
-    var fnExcelDownLoad = function(){
-
-    	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 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', fnCreateTotal);
-	});
-
-	// 합계 생성
-	let fnCreateTotal = function() {
-		let len = 0;
-
-		let totInfo = {};
-		totInfo.age     = '';
-		totInfo.sexGb = 'TOTAL';
-		totInfo.totOrdAmt   = 0;
-		totInfo.ordAmt     = 0;
-		totInfo.cnclAmt = 0;
-		totInfo.ordCnt  = 0;
-		totInfo.cnclQty  = 0;
-		totInfo.avgOrdCnt     = 0;
-		totInfo.avgSellQty    = 0;
-		totInfo.custPrice    = 0;
-
-		gridOptions.api.forEachNode(function(rowNode, index) {
-			if (!rowNode.group) {
-				if( typeof rowNode.data.totOrdAmt      == 'number') { totInfo.totOrdAmt       += rowNode.data.totOrdAmt      ; }
-				if( typeof rowNode.data.ordAmt     == 'number') { totInfo.ordAmt      += rowNode.data.ordAmt     ; }
-				if( typeof rowNode.data.cnclAmt == 'number') { totInfo.cnclAmt  += rowNode.data.cnclAmt ; }
-				if( typeof rowNode.data.ordCnt  == 'number') { totInfo.ordCnt   += rowNode.data.ordCnt  ; if (rowNode.data.ordCnt > 0) len++; }
-				if( typeof rowNode.data.cnclQty  == 'number') { totInfo.cnclQty   += rowNode.data.cnclQty  ; }
-				if( typeof rowNode.data.avgOrdCnt  == 'number') { totInfo.avgOrdCnt   += rowNode.data.avgOrdCnt  ; }
-				if( typeof rowNode.data.avgSellQty     == 'number') { totInfo.avgSellQty      += rowNode.data.avgSellQty     ; }
-				if( typeof rowNode.data.custPrice    == 'number') { totInfo.custPrice     += rowNode.data.custPrice    ; }
-			}
-		});
-
-		totInfo.avgOrdCnt = (Math.round(totInfo.avgOrdCnt / len * 10) / 10);
-		totInfo.avgSellQty = (Math.round(totInfo.avgSellQty / len * 10) / 10);
-		totInfo.custPrice = Math.floor(totInfo.custPrice / len);
-
-		gagaAgGrid.setPinnedRowData(gridOptions, totInfo, 'top');
-	}
-
-	// 초기화 클릭시
-	$('#btnInit').on('click', function() {
-		$('#searchForm')[0].reset();
-
-		$('#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');
+	</div>
 
-		// Create a agGrid
-		gagaAgGrid.createGrid('gridList', gridOptions);
 
-	});
-/*]]>*/
-</script>
 
 </html>

+ 2 - 2
src/main/webapp/WEB-INF/views/statistics/CustomerAgeOrderForm.html

@@ -49,7 +49,7 @@
 					</tr>
 					<tr>
 						<th>등급</th>
-						<td>
+						<td colspan="3">
 							<label th:if="${gradeGbList}" th:each="oneData, status : ${gradeGbList}" class="chkBox checked"><input type="checkbox" name="multiGradeGb" th:value="${oneData.cd}" th:text="${oneData.cdNm}" checked="checked"/></label>
 						</td>
 					</tr>
@@ -121,7 +121,7 @@
 						return gagaAgGrid.toAddComma(params.value);
 					}
 				},
-				{headerName: "주문수", field: "ordCnt", width: 120, cellClass: 'text-center',
+				{headerName: "주문수", field: "ordCnt", width: 150, cellClass: 'text-center',
 					cellRenderer: function(params) {
 						return gagaAgGrid.toAddComma(params.value);
 					}

+ 337 - 0
src/main/webapp/WEB-INF/views/statistics/CustomerRankingForm.html

@@ -0,0 +1,337 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CustomerRankingForm.html
+ * @desc    : 구매자랭킹 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.09.28   swkim       최초 작성
+ *******************************************************************************
+ -->
+	<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/customer/ranking/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<input type="hidden" name="dayGb" value="D"/>
+
+				<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 colspan="3">
+							<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>
+					</tr>
+					<tr>
+						<th>성별</th>
+						<td>
+							<label class="chkBox checked"><input type="checkbox" name="multiSexGb" value="G007_F" checked="checked"/>여성</label>
+							<label class="chkBox checked"><input type="checkbox" name="multiSexGb" value="G007_M" checked="checked"/>남성</label>
+							<label class="chkBox checked"><input type="checkbox" name="multiSexGb" value="G007_X" 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="30" checked="checked"/>30대</label>
+							<label class="chkBox checked"><input type="checkbox" name="multiAgeGb" value="40" 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="itemkindCdTxt"></span>
+							<input type="hidden" name="itemkindCdList"/>
+						</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: "순위", field: "rank", width: 100, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				if(params.data.custId != 'TOTAL') return  params.node.rowIndex + 1;
+				else return '';
+			}
+		},
+		{headerName: "회원NO", field: "custNo", width: 120, cellClass: 'text-center', hide: true},
+		{
+			headerName: "회원정보", field: "", width: 450, cellClass: 'text-center',
+			children: [
+				{headerName: "아이디(이름)", field: "custId", width: 200, cellClass: 'text-center',
+					cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+				},
+				{headerName: "연령/성별", field: "age", width: 150, cellClass: 'text-center',
+					cellRenderer: function(params) {
+						let str1 = params.value;
+						let str2 = params.data.sexGb;
+
+						if(str1 == 'X') str1 = "알수없음";
+						else str1 = str1 + '대';
+						if(str2 == 'X') str2 = "알수없음";
+
+						if(params.data.custId != 'TOTAL') return str1 + '(' + str2 + ')';
+						else return '';
+					}
+				},
+				{headerName: "등급", field: "custGrade", width: 100, cellClass: 'text-center',
+					cellRenderer: function(params) {
+						return gagaAgGrid.toAddComma(params.value);
+					}
+				}
+			]
+		},
+		{
+			headerName: "주문 현황", field: "", width: 1200, cellClass: 'text-center',
+			children: [
+				{headerName: "총매출액", field: "totOrdAmt", width: 150, cellClass: 'text-center',
+					cellRenderer: function(params) {
+						return gagaAgGrid.toAddComma(params.value);
+					}
+				},
+				{headerName: "주문수", field: "ordCnt", width: 150, cellClass: 'text-center',
+					cellRenderer: function(params) {
+						return gagaAgGrid.toAddComma(params.value);
+					}
+				},
+				{headerName: "판매수량", field: "sellQty", width: 150, cellClass: 'text-center',
+					cellRenderer: function(params) {
+						return gagaAgGrid.toAddComma(params.value);
+					}
+				},
+				{headerName: "객단가", field: "custPrice", width: 150, cellClass: 'text-center',
+					cellRenderer: function(params) {
+						return gagaAgGrid.toAddComma(params.value);
+					}
+				},
+				{headerName: "보유포인트", field: "custPoint", width: 150, cellClass: 'text-center',
+					cellRenderer: function(params) {
+						return gagaAgGrid.toAddComma(params.value);
+					}
+				}
+			]
+		}
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 셀 클릭 이벤트
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field === 'custId') {
+			// 고객 상세
+			cfnOpenCustDetailPopup(event.data.custNo);
+		}
+	}
+
+    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 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 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', fnCreateTotal);
+	});
+
+	// 합계 생성
+	let fnCreateTotal = function() {
+		let len = 0;
+
+		let totInfo = {};
+		totInfo.rank     = '';
+		totInfo.custId = 'TOTAL';
+		totInfo.age = '';
+		totInfo.totOrdAmt   = 0;
+		totInfo.ordCnt  = 0;
+		totInfo.sellQty  = 0;
+		totInfo.custPrice    = 0;
+		totInfo.custPoint    = 0;
+
+		gridOptions.api.forEachNode(function(rowNode, index) {
+			if (!rowNode.group) {
+				if( typeof rowNode.data.totOrdAmt      == 'number') { totInfo.totOrdAmt       += rowNode.data.totOrdAmt      ; }
+				if( typeof rowNode.data.ordCnt  == 'number') { totInfo.ordCnt   += rowNode.data.ordCnt  ; if (rowNode.data.ordCnt > 0) len++; }
+				if( typeof rowNode.data.sellQty  == 'number') { totInfo.sellQty   += rowNode.data.sellQty  ; }
+				if( typeof rowNode.data.custPrice    == 'number') { totInfo.custPrice     += rowNode.data.custPrice    ; }
+				if( typeof rowNode.data.custPoint    == 'number') { totInfo.custPoint     += rowNode.data.custPoint    ; }
+			}
+		});
+
+		totInfo.custPrice = Math.floor(totInfo.custPrice / len);
+
+		gagaAgGrid.setPinnedRowData(gridOptions, totInfo, 'top');
+	}
+
+	// 초기화 클릭시
+	$('#btnInit').on('click', function() {
+		$('#searchForm')[0].reset();
+
+		$('#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>

+ 15 - 6
src/main/webapp/WEB-INF/views/statistics/PlanTradingForm.html

@@ -43,8 +43,8 @@
 					<tr>
 					   <th>물류구분</th>
 					   <td colspan="2">
-                            <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>
+                            <label class="chkBox checked"><input type="checkbox" name="distributionGbS" value="SCM" checked="checked"/>입점</label>
+                            <label class="chkBox checked"><input type="checkbox" name="distributionGbW" value="WMS" checked="checked"/>위탁</label>
 					   </td>
 					</tr>
 				</table>
@@ -76,6 +76,7 @@
 			<ul class="panelBar">
 				<li>
 					<button type="button" class="btn btn-default btn-lg" onclick="fnDetailExcelDownLoad();">엑셀다운로드</button>
+					<span id="planNmTxt" style="text-align: left"></span>
 				</li>
 			</ul>
 			<div id="detailGridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
@@ -139,9 +140,9 @@
 				return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
 			}
 		},
-		{ headerName: "구매율", field: "custCnt", width: 150, cellClass: 'text-right',
+		{ headerName: "구매율", field: "ordRate", width: 150, cellClass: 'text-right',
 			cellRenderer: function(params) {
-				return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
+				return params.value + '%';
 			}
 		},
 	];
@@ -162,6 +163,7 @@
 			$("#detailSearchForm input[name=startDt]").val($("#searchForm input[name=startDt]").val());
 			$("#detailSearchForm input[name=endDt]").val($("#searchForm input[name=endDt]").val());
 			$("#detailSearchForm input[name=planSq]").val(params.planSq);
+			$("#planNmTxt").text(params.planNm);
 			gagaAgGrid.fetch($('#detailSearchForm').prop('action'), detailGridOptions, '#detailSearchForm', fnDetailCreateTotal);
 		}
 	}
@@ -170,10 +172,10 @@
 	detailGridOptions.onCellClicked = function(event) {
 		var params = event.data;
 		if (event.colDef.field == "goodsCd"){
-			cfnOpenGoodsDetailPopup('U',goodsCd);
+			cfnOpenGoodsDetailPopup('U',params.goodsCd);
 		}
 		else if (event.colDef.field == "goodsNm"){
-			cfnOpenGoodsDetailPopup('U',goodsCd);
+			cfnOpenGoodsDetailPopup('U',params.goodsCd);
 		}
 	}
 
@@ -270,15 +272,22 @@
 		totInfo.ordAmt   = 0;
 		totInfo.ordQty   = 0;
 		totInfo.custCnt  = 0;
+		totInfo.ordRate = 0;
+
+		let len = 0;
 
 		detailGridOptions.api.forEachNode(function(rowNode, index) {
 			if (!rowNode.group) {
 				if( typeof rowNode.data.ordAmt        == 'number') { totInfo.ordAmt         += rowNode.data.ordAmt        ; }
 				if( typeof rowNode.data.ordQty        == 'number') { totInfo.ordQty         += rowNode.data.ordQty        ; }
 				if( typeof rowNode.data.custCnt       == 'number') { totInfo.custCnt        += rowNode.data.custCnt       ; }
+				if( typeof rowNode.data.ordRate       == 'number') { totInfo.ordRate        += rowNode.data.ordRate       ; if (rowNode.data.ordRate > 0) len++;}
 			}
 		});
 
+		if (len == 0) totInfo.ordRate = 0;
+		else totInfo.ordRate = Math.floor(totInfo.ordRate / len);
+
 		gagaAgGrid.setPinnedRowData(detailGridOptions, totInfo, 'top');
 	}
 

+ 4 - 2
src/main/webapp/WEB-INF/views/statistics/TmtbTradingForm.html

@@ -75,6 +75,7 @@
 			<ul class="panelBar">
 				<li>
 					<button type="button" class="btn btn-default btn-lg" onclick="fnDetailExcelDownLoad();">엑셀다운로드</button>
+					<span id="tmtbNmTxt" style="text-align: left"></span>
 				</li>
 			</ul>
 			<div id="detailGridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
@@ -165,6 +166,7 @@
 			$("#detailSearchForm input[name=startDt]").val($("#searchForm input[name=startDt]").val());
 			$("#detailSearchForm input[name=endDt]").val($("#searchForm input[name=endDt]").val());
 			$("#detailSearchForm input[name=tmtbSq]").val(params.tmtbSq);
+			$("#tmtbNmTxt").text(params.tmtbNm);
 			gagaAgGrid.fetch($('#detailSearchForm').prop('action'), detailGridOptions, '#detailSearchForm', fnDetailCreateTotal);
 		}
 	}
@@ -173,10 +175,10 @@
 	detailGridOptions.onCellClicked = function(event) {
 		var params = event.data;
 		if (event.colDef.field == "goodsCd"){
-			cfnOpenGoodsDetailPopup('U',goodsCd);
+			cfnOpenGoodsDetailPopup('U',params.goodsCd);
 		}
 		else if (event.colDef.field == "goodsNm"){
-			cfnOpenGoodsDetailPopup('U',goodsCd);
+			cfnOpenGoodsDetailPopup('U',params.goodsCd);
 		}
 	}
 

Некоторые файлы не были показаны из-за большого количества измененных файлов