swkim 4 年之前
父節點
當前提交
0bd16f8dd6

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

@@ -4,6 +4,7 @@ import java.util.Collection;
 
 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;
 
 /**
@@ -107,4 +108,14 @@ public interface TsaStatisticsDao {
 	Collection<Statistics> getBestOrderList(Statistics statistics);
 	Collection<GagaMap> getBestOrderListMap(Statistics statistics);
 
+	/**
+	 * 카드목록 조회
+	 * @param
+	 * @return
+	 * @author swkim
+	 * @since 2021. 9. 28
+	 */
+	Collection<Card> getCardList();
+
+	Collection<Statistics> getPaymentList(Statistics statistics);
 }

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

@@ -19,6 +19,7 @@ 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 com.style24.persistence.domain.Card;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -211,4 +212,17 @@ public class TsaStatisticsService {
 
 	}
 
+	/**
+	 * 카드목록 조회
+	 * author: swkim
+	 * return: Collection<Card>
+	 * since: 2021. 9. 28.
+	 */
+	public Collection<Card> getCardList() {
+		return statisticsDao.getCardList();
+	}
+
+	public Collection<Statistics> getPaymentList(Statistics statistics) {
+		return statisticsDao.getPaymentList(statistics);
+	}
 }

+ 70 - 0
src/main/java/com/style24/admin/biz/web/TsaStatisticsController.java

@@ -4,11 +4,14 @@ import java.util.Collection;
 
 import javax.servlet.http.HttpServletRequest;
 
+import com.style24.persistence.domain.Card;
+import com.style24.persistence.domain.Extmall;
 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.security.web.jaasapi.JaasApiIntegrationFilter;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -626,4 +629,71 @@ public class TsaStatisticsController extends TsaBaseController {
 		return GagaFileUtil.writeFile(request, excelFilenameWithPath);
 	}
 
+	/**
+	 * 결제수단별통계 화면
+	 * @return
+	 * @author swkim
+	 * @since 2021. 9. 28
+	 */
+	@GetMapping("/payment/main/form")
+	public ModelAndView paymentForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("statistics/PaymentForm");
+
+		return mav;
+	}
+
+	/**
+	 * 결제수단별통계 조회
+	 * author: swkim
+	 * return: Collection<Statistics>
+	 * since: 2021. 9. 28.
+	 */
+	@PostMapping("/payment/main/list")
+	@ResponseBody
+	public Collection<Statistics> getPaymentList(@RequestBody Statistics statistics) {
+
+		if (!StringUtils.isBlank(statistics.getCardIdList())) {
+			try {
+				String[] arrCardId = mapper.readValue(statistics.getCardIdList(), String[].class);
+				statistics.setMultiCardId(arrCardId);
+			} catch (Exception e) {
+				throw new IllegalStateException("카드 검색조건 오류로 인해 조회되지 않았습니다.");
+			}
+		}
+
+		return statisticsService.getPaymentList(statistics);
+	}
+
+	/**
+	 * 카드 목록 화면(팝업)
+	 * @param
+	 * @return
+	 * @author swkim
+	 * @since 2021. 09. 28
+	 */
+	@GetMapping("/card/search/form")
+	public ModelAndView cardSearchForm(Card card) {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("params", card);
+		mav.setViewName("statistics/CardSearchForm");
+		return mav;
+	}
+
+	/**
+	 * 카드 목록
+	 * @param
+	 * @return
+	 * @author swkim
+	 * @since 2021. 09. 29
+	 */
+	@PostMapping("/card/list")
+	@ResponseBody
+	public Collection<Card> getCardList() {
+		return statisticsService.getCardList();
+	}
+
+
 }

+ 23 - 0
src/main/java/com/style24/persistence/domain/Card.java

@@ -0,0 +1,23 @@
+package com.style24.persistence.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+import com.style24.persistence.TscPageRequest;
+import lombok.Data;
+
+import java.util.Collection;
+
+/**
+ * 카드 Domain
+ *
+ * @author swkim
+ * @since 2021. 09. 28
+ */
+@SuppressWarnings("serial")
+@Data
+public class Card extends TscBaseDomain {
+
+	private String cardNm;	// 카드명
+	private String cardCd;	// 카드코드
+	private String callbackFn;		// 콜백함수
+}

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

@@ -177,6 +177,19 @@ public class Statistics extends TscBaseDomain {
 	private String sysImgNm;
 	private boolean isMap;
 
+	private String simpleGbC;
+	private String simpleGbB;
+	private long cdAmt;
+	private long acAmt;
+	private long vaAmt;
+	private long hpAmt;
+	private long cpAmt;
+	private long npayAmt;
+	private long paycoAmt;
+	private long kakaoAmt;
+
+	String cardIdList;
 
-
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiCardId;
 }

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

@@ -1100,4 +1100,286 @@
 		<include refid="getBestOrderListSql"></include>
 	</select>
 
+	<select id="getCardList" resultType="Card">
+		/* TsaStatistics.getCardList */
+		SELECT CD AS CARD_CD
+		, CD_NM AS CARD_NM
+		FROM   TB_COMMON_CODE
+		WHERE CD_GB = 'G050'
+		ORDER  BY CD_GB, DISP_ORD
+	</select>
+
+	<!-- 결제수단별통계 목록 -->
+	<select id="getPaymentList" parameterType="Statistics" resultType="Statistics">
+	/* TsaStatistics.getPaymentList */
+		WITH TAB AS (
+			SELECT
+				DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+				, PAY_MEANS -- 결제수단
+				, PAY_AMT -- 결제금액
+				, PG_GB -- PG구분
+			FROM TB_STAT_PAY A
+			WHERE 1=1
+				AND A.DAY <![CDATA[>=]]> STR_TO_DATE(#{startDt},'%Y-%m-%d')
+			  	AND A.DAY <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{endDt},'%Y-%m-%d'), INTERVAL 1 DAY)
+			<if test='multiCardId != null and multiCardId != ""'>
+				AND COM_CARD_CD IN
+				<foreach collection="multiCardId" item="item" index="index"  open="(" close=")" separator=",">
+					#{item}
+				</foreach>
+			</if>
+			<choose>
+			<when test='simpleGbC != null and simpleGbC != "" and simpleGbB != null and simpleGbB != ""'>
+				AND PG_GB IN('KAKAO','NAVER','PAYCO')
+			    AND PAY_MEANS IN ('G014_30','G014_10')
+			</when>
+			<when test='simpleGbC != null and simpleGbC != ""'>
+				AND PG_GB IN('KAKAO','NAVER','PAYCO')
+			  	AND PAY_MEANS = 'G014_30'
+			</when>
+			<when test='simpleGbB != null and simpleGbB != ""'>
+				AND PG_GB IN('KAKAO','NAVER','PAYCO')
+			  	AND PAY_MEANS = 'G014_10'
+			</when>
+			</choose>
+		)
+		SELECT
+			DAY
+			, SUM(CD_AMT) AS CD_AMT -- 카드
+			, SUM(AC_AMT) AS AC_AMT -- 실시간계좌이체
+			, SUM(VA_AMT) AS VA_AMT -- 무통장
+			, SUM(HP_AMT) AS HP_AMT -- 휴대폰
+			, SUM(CP_AMT) AS CP_AMT -- PG쿠폰
+			, SUM(NPAY_AMT) AS NPAY_AMT -- 네이버페이
+			, SUM(PAYCO_AMT) AS PAYCO_AMT -- 페이코
+			, SUM(KAKAO_AMT) AS KAKAO_AMT -- 카카오
+		FROM (
+			SELECT
+				DAY
+				, CASE WHEN PAY_MEANS = 'G014_30' THEN PAY_AMT ELSE 0 END AS CD_AMT
+				, CASE WHEN PAY_MEANS = 'G014_10' THEN PAY_AMT ELSE 0 END AS AC_AMT
+				, CASE WHEN PAY_MEANS = 'G014_20' THEN PAY_AMT ELSE 0 END AS VA_AMT
+				, CASE WHEN PAY_MEANS = 'G014_60' THEN PAY_AMT ELSE 0 END AS HP_AMT
+				, CASE WHEN PAY_MEANS = 'G014_50' THEN PAY_AMT ELSE 0 END AS CP_AMT
+				, CASE WHEN PAY_MEANS = 'NAVER' THEN PAY_AMT ELSE 0 END AS NPAY_AMT
+				, CASE WHEN PAY_MEANS = 'PAYCO' THEN PAY_AMT ELSE 0 END AS PAYCO_AMT
+				, CASE WHEN PAY_MEANS = 'KAKAO' THEN PAY_AMT ELSE 0 END AS KAKAO_AMT
+			FROM (
+				SELECT
+			<choose>
+				<when test='dayGb == "W"'> <!-- 주별 -->
+					CONCAT(MONTH(DAY), '월 ', WEEK(DAY,5) - WEEK(DATE_SUB(DAY, INTERVAL DAYOFMONTH(DAY) - 1 DAY), 5) + 1, '주') AS DAY
+				</when>
+				<when test='dayGb == "M"'> <!-- 월별 -->
+					DATE_FORMAT(DAY,'%Y-%m')                          AS DAY
+				</when>
+				<otherwise> <!-- 일별 -->
+					DATE_FORMAT(DAY,'%Y-%m-%d')                       AS DAY
+				</otherwise>
+			</choose>
+					, PAY_MEANS
+					, SUM(PAY_AMT) AS PAY_AMT
+				FROM TAB
+				WHERE PAY_MEANS = 'G014_30'
+		<choose>
+			<when test='dayGb == "W"'> <!-- 주별 -->
+				GROUP  BY CONCAT(MONTH(DAY), '월 ', WEEK(DAY,5) - WEEK(DATE_SUB(DAY, INTERVAL DAYOFMONTH(DAY) - 1 DAY), 5) + 1, '주')
+			</when>
+			<when test='dayGb == "M"'> <!-- 월별 -->
+				GROUP  BY DATE_FORMAT(DAY,'%Y-%m')
+			</when>
+			<otherwise> <!-- 일별 -->
+				GROUP  BY DATE_FORMAT(DAY,'%Y-%m-%d')
+			</otherwise>
+		</choose>
+				UNION ALL
+				SELECT
+			<choose>
+				<when test='dayGb == "W"'> <!-- 주별 -->
+					CONCAT(MONTH(DAY), '월 ', WEEK(DAY,5) - WEEK(DATE_SUB(DAY, INTERVAL DAYOFMONTH(DAY) - 1 DAY), 5) + 1, '주') AS DAY
+				</when>
+				<when test='dayGb == "M"'> <!-- 월별 -->
+					DATE_FORMAT(DAY,'%Y-%m')                          AS DAY
+				</when>
+				<otherwise> <!-- 일별 -->
+					DATE_FORMAT(DAY,'%Y-%m-%d')                       AS DAY
+				</otherwise>
+			</choose>
+					, PAY_MEANS
+					, SUM(PAY_AMT) AS PAY_AMT
+				FROM TAB
+				WHERE PAY_MEANS = 'G014_10'
+		<choose>
+			<when test='dayGb == "W"'> <!-- 주별 -->
+				GROUP  BY CONCAT(MONTH(DAY), '월 ', WEEK(DAY,5) - WEEK(DATE_SUB(DAY, INTERVAL DAYOFMONTH(DAY) - 1 DAY), 5) + 1, '주')
+			</when>
+			<when test='dayGb == "M"'> <!-- 월별 -->
+				GROUP  BY DATE_FORMAT(DAY,'%Y-%m')
+			</when>
+			<otherwise> <!-- 일별 -->
+				GROUP  BY DATE_FORMAT(DAY,'%Y-%m-%d')
+			</otherwise>
+		</choose>
+				UNION ALL
+				SELECT
+			<choose>
+				<when test='dayGb == "W"'> <!-- 주별 -->
+					CONCAT(MONTH(DAY), '월 ', WEEK(DAY,5) - WEEK(DATE_SUB(DAY, INTERVAL DAYOFMONTH(DAY) - 1 DAY), 5) + 1, '주') AS DAY
+				</when>
+				<when test='dayGb == "M"'> <!-- 월별 -->
+					DATE_FORMAT(DAY,'%Y-%m')                          AS DAY
+				</when>
+				<otherwise> <!-- 일별 -->
+					DATE_FORMAT(DAY,'%Y-%m-%d')                       AS DAY
+				</otherwise>
+			</choose>
+					, PAY_MEANS
+					, SUM(PAY_AMT) AS PAY_AMT
+				FROM TAB
+				WHERE PAY_MEANS = 'G014_20'
+		<choose>
+			<when test='dayGb == "W"'> <!-- 주별 -->
+				GROUP  BY CONCAT(MONTH(DAY), '월 ', WEEK(DAY,5) - WEEK(DATE_SUB(DAY, INTERVAL DAYOFMONTH(DAY) - 1 DAY), 5) + 1, '주')
+			</when>
+			<when test='dayGb == "M"'> <!-- 월별 -->
+				GROUP  BY DATE_FORMAT(DAY,'%Y-%m')
+			</when>
+			<otherwise> <!-- 일별 -->
+				GROUP  BY DATE_FORMAT(DAY,'%Y-%m-%d')
+			</otherwise>
+		</choose>
+				UNION ALL
+				SELECT
+			<choose>
+				<when test='dayGb == "W"'> <!-- 주별 -->
+					CONCAT(MONTH(DAY), '월 ', WEEK(DAY,5) - WEEK(DATE_SUB(DAY, INTERVAL DAYOFMONTH(DAY) - 1 DAY), 5) + 1, '주') AS DAY
+				</when>
+				<when test='dayGb == "M"'> <!-- 월별 -->
+					DATE_FORMAT(DAY,'%Y-%m')                          AS DAY
+				</when>
+				<otherwise> <!-- 일별 -->
+					DATE_FORMAT(DAY,'%Y-%m-%d')                       AS DAY
+				</otherwise>
+			</choose>
+					, PAY_MEANS
+					, SUM(PAY_AMT) AS PAY_AMT
+				FROM TAB
+				WHERE PAY_MEANS = 'G014_60'
+		<choose>
+			<when test='dayGb == "W"'> <!-- 주별 -->
+				GROUP  BY CONCAT(MONTH(DAY), '월 ', WEEK(DAY,5) - WEEK(DATE_SUB(DAY, INTERVAL DAYOFMONTH(DAY) - 1 DAY), 5) + 1, '주')
+			</when>
+			<when test='dayGb == "M"'> <!-- 월별 -->
+				GROUP  BY DATE_FORMAT(DAY,'%Y-%m')
+			</when>
+			<otherwise> <!-- 일별 -->
+				GROUP  BY DATE_FORMAT(DAY,'%Y-%m-%d')
+			</otherwise>
+		</choose>
+				UNION ALL
+				SELECT
+			<choose>
+				<when test='dayGb == "W"'> <!-- 주별 -->
+					CONCAT(MONTH(DAY), '월 ', WEEK(DAY,5) - WEEK(DATE_SUB(DAY, INTERVAL DAYOFMONTH(DAY) - 1 DAY), 5) + 1, '주') AS DAY
+				</when>
+				<when test='dayGb == "M"'> <!-- 월별 -->
+					DATE_FORMAT(DAY,'%Y-%m')                          AS DAY
+				</when>
+				<otherwise> <!-- 일별 -->
+					DATE_FORMAT(DAY,'%Y-%m-%d')                       AS DAY
+				</otherwise>
+			</choose>
+					, PAY_MEANS
+					, SUM(PAY_AMT) AS PAY_AMT
+				FROM TAB
+				WHERE PAY_MEANS = 'G014_50'
+		<choose>
+			<when test='dayGb == "W"'> <!-- 주별 -->
+				GROUP  BY CONCAT(MONTH(DAY), '월 ', WEEK(DAY,5) - WEEK(DATE_SUB(DAY, INTERVAL DAYOFMONTH(DAY) - 1 DAY), 5) + 1, '주')
+			</when>
+			<when test='dayGb == "M"'> <!-- 월별 -->
+				GROUP  BY DATE_FORMAT(DAY,'%Y-%m')
+			</when>
+			<otherwise> <!-- 일별 -->
+				GROUP  BY DATE_FORMAT(DAY,'%Y-%m-%d')
+			</otherwise>
+		</choose>
+				UNION ALL
+				SELECT
+			<choose>
+				<when test='dayGb == "W"'> <!-- 주별 -->
+					CONCAT(MONTH(DAY), '월 ', WEEK(DAY,5) - WEEK(DATE_SUB(DAY, INTERVAL DAYOFMONTH(DAY) - 1 DAY), 5) + 1, '주') AS DAY
+				</when>
+				<when test='dayGb == "M"'> <!-- 월별 -->
+					DATE_FORMAT(DAY,'%Y-%m')                          AS DAY
+				</when>
+				<otherwise> <!-- 일별 -->
+					DATE_FORMAT(DAY,'%Y-%m-%d')                       AS DAY
+				</otherwise>
+			</choose>
+					, PG_GB AS PAY_MEANS
+					, SUM(PAY_AMT) AS PAY_AMT
+				FROM TAB
+				WHERE PG_GB = 'NAVER'
+		<choose>
+			<when test='dayGb == "W"'> <!-- 주별 -->
+				GROUP  BY CONCAT(MONTH(DAY), '월 ', WEEK(DAY,5) - WEEK(DATE_SUB(DAY, INTERVAL DAYOFMONTH(DAY) - 1 DAY), 5) + 1, '주')
+			</when>
+			<when test='dayGb == "M"'> <!-- 월별 -->
+				GROUP  BY DATE_FORMAT(DAY,'%Y-%m')
+			</when>
+			<otherwise> <!-- 일별 -->
+				GROUP  BY DATE_FORMAT(DAY,'%Y-%m-%d')
+			</otherwise>
+		</choose>
+				UNION ALL
+				SELECT
+			<choose>
+				<when test='dayGb == "W"'> <!-- 주별 -->
+					CONCAT(MONTH(DAY), '월 ', WEEK(DAY,5) - WEEK(DATE_SUB(DAY, INTERVAL DAYOFMONTH(DAY) - 1 DAY), 5) + 1, '주') AS DAY
+				</when>
+				<when test='dayGb == "M"'> <!-- 월별 -->
+					DATE_FORMAT(DAY,'%Y-%m')                          AS DAY
+				</when>
+				<otherwise> <!-- 일별 -->
+					DATE_FORMAT(DAY,'%Y-%m-%d')                       AS DAY
+				</otherwise>
+			</choose>
+					, PG_GB AS PAY_MEANS
+					, SUM(PAY_AMT) AS PAY_AMT
+				FROM TAB
+				WHERE PG_GB = 'PAYCO'
+		<choose>
+			<when test='dayGb == "W"'> <!-- 주별 -->
+				GROUP  BY CONCAT(MONTH(DAY), '월 ', WEEK(DAY,5) - WEEK(DATE_SUB(DAY, INTERVAL DAYOFMONTH(DAY) - 1 DAY), 5) + 1, '주')
+			</when>
+			<when test='dayGb == "M"'> <!-- 월별 -->
+				GROUP  BY DATE_FORMAT(DAY,'%Y-%m')
+			</when>
+			<otherwise> <!-- 일별 -->
+				GROUP  BY DATE_FORMAT(DAY,'%Y-%m-%d')
+			</otherwise>
+		</choose>
+				UNION ALL
+				SELECT
+			<choose>
+				<when test='dayGb == "W"'> <!-- 주별 -->
+					CONCAT(MONTH(DAY), '월 ', WEEK(DAY,5) - WEEK(DATE_SUB(DAY, INTERVAL DAYOFMONTH(DAY) - 1 DAY), 5) + 1, '주') AS DAY
+				</when>
+				<when test='dayGb == "M"'> <!-- 월별 -->
+					DATE_FORMAT(DAY,'%Y-%m')                          AS DAY
+				</when>
+				<otherwise> <!-- 일별 -->
+					DATE_FORMAT(DAY,'%Y-%m-%d')                       AS DAY
+				</otherwise>
+			</choose>
+					, PG_GB AS PAY_MEANS
+					, SUM(PAY_AMT) AS PAY_AMT
+				FROM TAB
+				WHERE PG_GB = 'KAKAO'
+				GROUP BY DAY
+			) Z
+		) Z
+		GROUP BY DAY
+	</select>
 </mapper>

+ 127 - 0
src/main/webapp/WEB-INF/views/statistics/CardSearchForm.html

@@ -0,0 +1,127 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CardSearchForm.html
+ * @desc    : 카드 리스트 팝업
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.09.28   swkim       최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="500" id="popupCardList">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong>카드 목록</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupCardList');"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+
+		<!-- 검색 조건 -->
+		<div class="panelContent">
+			<form id="searchCardListForm" class="searchCardListForm" name="searchCardListForm" action="#" th:action="@{'/statistics/card/list'}" onsubmit="$('#btnSearchCardList').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:15%;"/>
+						<col/>
+					</colgroup>
+					<tbody>
+				</table>
+				<!--<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearchCardList">조회</button>
+					</li>
+				</ul>-->
+			</form>
+		</div>
+		<!-- //검색 조건 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelContent">
+			<div id="gridCardPopupList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+
+		<!-- 버튼 배치 영역 -->
+		<ul class="panelBar">
+			<li class="right">
+				<button type="button" class="btn btn-info btn-lg" id="btnConfirmCard">확인</button>
+			</li>
+		</ul>
+	</div>
+
+	<script th:inline="javascript">
+		/*<![CDATA[*/
+		let columnCardPopupDefList = [
+			{width: 40, minWidth: 40, field: "cardCheck", cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{headerName: "카드명", field: "cardNm", width: 400, cellClass: 'text-center'}
+		];
+
+		let gridOptionsCardPopupList = gagaAgGrid.getGridOptions(columnCardPopupDefList);
+		gridOptionsCardPopupList.rowSelection = "multiple";
+
+		// Row double click
+		gridOptionsCardPopupList.onRowDoubleClicked = function(event) {
+			$('#btnConfirmCard').trigger('click');
+		}
+
+		// 조회
+		/*$('#btnSearchCardList').on('click', function() {
+			// Fetch data
+			gagaAgGrid.fetch($('#searchCardListForm').prop('action'), gridOptionsCardPopupList, '#searchCardListForm', function() {
+				gridOptionsCardPopupList.api.forEachNode(function(rowNode, index) {
+				});
+			});
+		});*/
+
+		// 확인
+		$('#btnConfirmCard').on('click', function() {
+			var selectedData = gagaAgGrid.selectedRowData(gridOptionsCardPopupList);
+
+			if (selectedData.length == 0) {
+				mcxDialog.alert('선택된 카드가 없습니다.');
+				return false;
+			}
+
+			var callbackFn = [[${params.callbackFn}]];
+
+			var jsonData = JSON.stringify(selectedData);
+
+			if (typeof callbackFn != 'undefined' && callbackFn) {
+				if (typeof callbackFn == 'function') {
+					callbackFn(jsonData);
+				} else {
+					if (callbackFn) {
+						if (callbackFn.indexOf("(") == -1) {
+							eval(callbackFn + "(" + jsonData + ")");
+						} else {
+							eval(callbackFn(jsonData));
+						}
+					}
+				}
+				uifnPopupClose('popupCardList');
+			}
+		});
+
+		$(document).ready(function() {
+			// Create a agGrid
+			gagaAgGrid.createGrid('gridCardPopupList', gridOptionsCardPopupList);
+
+			// Fetch data
+			gagaAgGrid.fetch($('#searchCardListForm').prop('action'), gridOptionsCardPopupList, '#searchCardListForm', function() {
+				gridOptionsCardPopupList.api.forEachNode(function(rowNode, index) {
+				});
+			});
+		});
+		/*]]>*/
+	</script>
+
+</div>
+
+</html>

+ 304 - 0
src/main/webapp/WEB-INF/views/statistics/PaymentForm.html

@@ -0,0 +1,304 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : PaymentForm.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/payment/main/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 style="width:25%;"/>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+					</colgroup>
+					<tr>
+						<th>기간<i class="required" title="필수" aria-hidden="true"></i></th>
+						<td colspan="5" id="terms">
+						</td>
+					</tr>
+					<tr>
+						<th>PG카드사</th>
+						<td colspan="5">
+							<input type="text" class="w100" name="cardIdSearchTxt" id="cardIdSearchTxt" maxlength="20"/>
+							<button type="button" class="btn icn" onclick="cfnOpenPgCardListPopup('fnSetCardInfo', 'M');"><i class="fa fa-search"></i></button>
+							<span id="cardIdTxt"></span>
+							<input type="hidden" name="cardIdList"/>
+						</td>
+
+					</tr>
+					<tr>
+						<th>간편결제</th>
+						<td colspan="5">
+							<label class="chkBox checked"><input type="checkbox" name="simpleGbC" value="C"/>카드 간편결제</label>
+							<label class="chkBox checked"><input type="checkbox" name="simpleGbB" value="B"/>간편 계좌이체</label>
+						</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 class="left">
+					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+				</li>
+				<li class="right">
+					<span class="btnGroup marR10">
+						<button type="button" class="btn btn-default btn-lg active" id="dayGbD" onclick="fnSetDayGb('D');">일별</button>
+						<button type="button" class="btn btn-default btn-lg" id="dayGbW" onclick="fnSetDayGb('W');">주별</button>
+						<button type="button" class="btn btn-default btn-lg" id="dayGbM" onclick="fnSetDayGb('M');">월별</button>
+					</span>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+
+			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let columnDefs = [
+		{ headerName: "기간", field: "day", width: 100, cellClass: 'text-center' },
+		{
+			headerName: "PG수단별", field: "", width: 600, cellClass: 'text-center',
+			children: [
+				{headerName: "카드", field: "", width: 120, cellClass: 'text-center',
+					children: [
+						{headerName: "3.3%", field: "cdAmt", width: 120, cellClass: 'text-center',
+							cellRenderer: function(params) {
+								return gagaAgGrid.toAddComma(params.value);
+							}
+						}
+					]
+				},
+				{headerName: "실시간계좌", field: "", width: 120, cellClass: 'text-center',
+					children: [
+						{headerName: "2.4%", field: "acAmt", width: 120, cellClass: 'text-center',
+							cellRenderer: function(params) {
+								return gagaAgGrid.toAddComma(params.value);
+							}
+						}
+					]
+				},
+				{headerName: "무통장입금", field: "", width: 120, cellClass: 'text-center',
+					children: [
+						{headerName: "1건당 100원", field: "vaAmt", width: 120, cellClass: 'text-center',
+							cellRenderer: function(params) {
+								return gagaAgGrid.toAddComma(params.value);
+							}
+						}
+					]
+				},
+				{headerName: "휴대폰결제", field: "", width: 120, cellClass: 'text-center',
+					children: [
+						{headerName: "200원", field: "hpAmt", width: 120, cellClass: 'text-center',
+							cellRenderer: function(params) {
+								return gagaAgGrid.toAddComma(params.value);
+							}
+						}
+					]
+				},
+				{headerName: "PG쿠폰", field: "", width: 120, cellClass: 'text-center',
+					children: [
+						{headerName: "", field: "cpAmt", width: 120, cellClass: 'text-center',
+							cellRenderer: function(params) {
+								return gagaAgGrid.toAddComma(params.value);
+							}
+						}
+					]
+				}
+			]
+		},
+		{
+			headerName: "간편결제", field: "", width: 490, cellClass: 'text-center',
+			children: [
+				{headerName: "네이버페이", field: "", width: 130, cellClass: 'text-center',
+					children: [
+						{headerName: "카드3.2%/계좌3.4%", field: "npayAmt", width: 130, cellClass: 'text-center',
+							cellRenderer: function(params) {
+								return gagaAgGrid.toAddComma(params.value);
+							}
+						}
+					]
+				},
+				{headerName: "페이코", field: "", width: 130, cellClass: 'text-center',
+					children: [
+						{headerName: "카드3.2%/계좌3.4%", field: "paycoAmt", width: 130, cellClass: 'text-center',
+							cellRenderer: function(params) {
+								return gagaAgGrid.toAddComma(params.value);
+							}
+						}
+					]
+				},
+				{headerName: "카카오페이", field: "", width: 130, cellClass: 'text-center',
+					children: [
+						{headerName: "카드3.2%/계좌3.4%", field: "kakaoAmt", width: 130, cellClass: 'text-center',
+							cellRenderer: function(params) {
+								return gagaAgGrid.toAddComma(params.value);
+							}
+						}
+					]
+				}
+			]
+		}
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	gridOptions.autoGroupColumnDef = {
+			headerName: "일자",
+			field: "grouping",
+			width: 200,
+			cellRendererParams: {
+				suppressCount: true
+			}
+		};
+
+	// for expand everything
+	gridOptions.groupDefaultExpanded = -1;
+
+	// 제휴몰 조회 팝업에서 호출
+	var fnSetCardInfo = function(result) {
+		var arrCardId = [];
+		var cardIdTxt = "";
+		var sIndex = 0;
+		$('#cardIdTxt').html('');
+		$('#searchForm input[name=cardIdSearchTxt]').val('');
+
+		result.forEach(function(card) {
+			sIndex++;
+			arrCardId.push(card.cardCd);
+		});
+
+		// 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리
+		if (sIndex == 1) {
+			$('#searchForm input[name=cardIdSearchTxt]').val(arrCardId[0]);
+		} else {
+			cardIdTxt = sIndex + " 개";
+			$('#cardIdTxt').html(cardIdTxt);
+		}
+
+		var jsonData = JSON.stringify(arrCardId);
+		$("#searchForm input[name=cardIdList]").val(jsonData);
+	}
+
+	// 검색
+	$('#btnSearch').on('click', function() {
+		// 입력 값 체크
+		if (!gagajf.validation($('#searchForm')))
+			return false;
+
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm', fnCreateTotal);
+	});
+
+	// 합계 생성
+	let fnCreateTotal = function() {
+		// Draw chart
+
+		let cdAmt = 0;
+		let acAmt = 0;
+		let vaAmt = 0;
+		let hpAmt = 0;
+		let cpAmt = 0;
+		let npayAmt = 0;
+		let paycoAmt = 0;
+		let kakaoAmt = 0;
+
+		gridOptions.api.forEachNode(function(rowNode, index) {
+			if (!rowNode.group) {
+				if (typeof rowNode.data.cdAmt == 'number') { cdAmt += rowNode.data.cdAmt; }
+				if (typeof rowNode.data.acAmt == 'number') { acAmt += rowNode.data.acAmt; }
+				if (typeof rowNode.data.vaAmt == 'number') { vaAmt += rowNode.data.vaAmt; }
+				if (typeof rowNode.data.hpAmt == 'number') { hpAmt += rowNode.data.hpAmt; }
+				if (typeof rowNode.data.cpAmt == 'number') { cpAmt += rowNode.data.cpAmt; }
+				if (typeof rowNode.data.npayAmt == 'number') { npayAmt += rowNode.data.npayAmt; }
+				if (typeof rowNode.data.paycoAmt == 'number') { paycoAmt += rowNode.data.paycoAmt; }
+				if (typeof rowNode.data.kakaoAmt == 'number') { kakaoAmt += rowNode.data.kakaoAmt; }
+			}
+		});
+
+		let data = {
+			day: 'TOTAL',
+			cdAmt: cdAmt, acAmt: acAmt, vaAmt: vaAmt,
+			hpAmt: hpAmt, cpAmt: cpAmt, npayAmt: npayAmt,
+			paycoAmt: paycoAmt, kakaoAmt: kakaoAmt
+		};
+
+		gagaAgGrid.setPinnedRowData(gridOptions, data, 'top');
+	}
+
+	// 초기화 클릭시
+	$('#btnInit').on('click', function() {
+		$('#searchForm')[0].reset();
+
+		$('#cardIdTxt').html('');
+		$('#searchForm input[name=cardIdList]').val('');
+	});
+
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('결제수단별통계 목록', gridOptions);
+	});
+
+	// 일자구분 변경 시
+	var fnSetDayGb = function(dayGb) {
+		$('#searchForm input[name=dayGb]').val(dayGb);
+		$('#dayGbD').removeClass('active');
+		$('#dayGbW').removeClass('active');
+		$('#dayGbM').removeClass('active');
+		$('#dayGb' + dayGb).addClass('active');
+		$('#btnSearch').trigger('click');
+	}
+
+	$(document).ready(function() {
+		cfnCreateCalendar('#terms', 'startDt', 'endDt', true, '주문', undefined, ['btnToday']);
+		$('.btnRecentWeek').trigger('click');
+
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+
+	});
+/*]]>*/
+</script>
+
+</html>

+ 17 - 0
src/main/webapp/ux/js/admin.popup.js

@@ -1115,4 +1115,21 @@ var cfnOpenAfLinkListPopup = function(callbackfn, multiGb, searchTxt){
 	if (typeof(multiGb) != 'undefined' && multiGb != null && multiGb == "M") actionUrl += "&multiGb=" + multiGb; else actionUrl += "&multiGb=S";
 	if (typeof(searchTxt) != 'undefined') actionUrl += "&searchTxt=" + encodeURIComponent(searchTxt);
 	cfnOpenModalPopup(actionUrl, "popupAflinkList");
+}
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 카드사 조회 팝업
+ * <pre>
+ *     cfnOpenPgCardListPopup();
+ * </pre>
+ * @since  : 2021/09/28
+ * @author : swkim
+ */
+var cfnOpenPgCardListPopup = function(callbackfn) {
+	var actionUrl = "/statistics/card/search/form";
+	if (typeof(callbackfn) != 'undefined') actionUrl += "?callbackFn=" + callbackfn;
+	uifnPopupClose('popupPgCardList');
+	cfnOpenModalPopup(actionUrl, 'popupPgCardList');
 }