Browse Source

일자별 주문 통계 구현

gagamel 4 years ago
parent
commit
dcb68a0e35

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

@@ -0,0 +1,26 @@
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Statistics;
+
+/**
+ * 통계 Dao
+ *
+ * @author gagamel
+ * @since 2021. 8. 17
+ */
+@ShopDs
+public interface TsaStatisticsDao {
+
+	/**
+	 * 일자별 주문 목록
+	 * @param statistics - 통계 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 8. 17
+	 */
+	Collection<Statistics> getDailyOrderList(Statistics statistics);
+
+}

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

@@ -0,0 +1,37 @@
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.admin.biz.dao.TsaStatisticsDao;
+import com.style24.persistence.domain.Statistics;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 통계 Service
+ *
+ * @author gagamel
+ * @since 2021. 8. 17
+ */
+@Service
+@Slf4j
+public class TsaStatisticsService {
+
+	@Autowired
+	private TsaStatisticsDao statisticsDao;
+
+	/**
+	 * 일자별 주문 목록
+	 * @param statistics - 통계 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 8. 17
+	 */
+	public Collection<Statistics> getDailyOrderList(Statistics statistics) {
+		return statisticsDao.getDailyOrderList(statistics);
+	}
+
+}

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

@@ -0,0 +1,124 @@
+package com.style24.admin.biz.web;
+
+import java.util.Collection;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.style24.admin.biz.service.TsaRendererService;
+import com.style24.admin.biz.service.TsaStatisticsService;
+import com.style24.admin.support.controller.TsaBaseController;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Statistics;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 통계 Controller
+ *
+ * @author gagamel
+ * @since 2021. 8. 17
+ */
+@Controller
+@RequestMapping("/statistics")
+@Slf4j
+public class TsaStatisticsController extends TsaBaseController {
+
+	@Autowired
+	private TsaStatisticsService statisticsService;
+
+	@Autowired
+	private TsaRendererService rendererService;
+
+	@Autowired
+	private ObjectMapper mapper;
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private Environment env;
+
+	/**
+	 * 일자별주문 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 8. 17
+	 */
+	@GetMapping("/daily/order/form")
+	public ModelAndView dailyOrderForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("statistics/DailyOrderForm");
+
+		return mav;
+	}
+
+	/**
+	 * 일자별주문 목록
+	 * @param statistics - 통계 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 8. 17
+	 */
+	@PostMapping("/daily/order/list")
+	@ResponseBody
+	public Collection<Statistics> getDailyOrderList(@RequestBody Statistics statistics) {
+		if (!StringUtils.isBlank(statistics.getExtmallIdList())) {
+			try {
+				String[] arrExtmallId = mapper.readValue(statistics.getExtmallIdList(), String[].class);
+				statistics.setMultiExtmallId(arrExtmallId);
+			} catch (Exception e) {
+				throw new IllegalStateException("제휴몰 검색중 오류로 인해 조회되지 않았습니다.");
+			}
+		}
+
+		if (!StringUtils.isBlank(statistics.getSupplyCompCdList())) {
+			try {
+				String[] arrSupplyCompCd = mapper.readValue(statistics.getSupplyCompCdList(), String[].class);
+				statistics.setMultiSupplyCompCd(arrSupplyCompCd);
+			} catch (Exception e) {
+				throw new IllegalStateException("업체코드 검색중 오류로 인해 조회되지 않았습니다.");
+			}
+		}
+
+		if (!StringUtils.isBlank(statistics.getAfLinkCdList())) {
+			try {
+				String[] arrAfLinkCd = mapper.readValue(statistics.getAfLinkCdList(), String[].class);
+				statistics.setMultiAfLinkCd(arrAfLinkCd);
+			} catch (Exception e) {
+				throw new IllegalStateException("제휴채널 검색중 오류로 인해 조회되지 않았습니다.");
+			}
+		}
+
+		if (!StringUtils.isBlank(statistics.getBrandCdList())) {
+			try {
+				String[] arrBrandCd = mapper.readValue(statistics.getBrandCdList(), String[].class);
+				statistics.setMultiBrandCd(arrBrandCd);
+			} catch (Exception e) {
+				throw new IllegalStateException("브랜드코드 검색중 오류로 인해 조회되지 않았습니다.");
+			}
+		}
+
+		if (!StringUtils.isBlank(statistics.getItemkindCdList())) {
+			try {
+				String[] arrItemkindCd = mapper.readValue(statistics.getItemkindCdList(), String[].class);
+				statistics.setMultiItemkindCd(arrItemkindCd);
+			} catch (Exception e) {
+				throw new IllegalStateException("품목 검색중 오류로 인해 조회되지 않았습니다.");
+			}
+		}
+
+		return statisticsService.getDailyOrderList(statistics);
+	}
+
+}

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

@@ -0,0 +1,61 @@
+package com.style24.persistence.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 통계 Domain
+ *
+ * @author gagamel
+ * @since 2021. 8. 17
+ */
+@SuppressWarnings("serial")
+@Data
+public class Statistics extends TscBaseDomain {
+
+	private String day;			// 일자
+	private int totOrdAmt;		// 매출액
+	private int yoyTotOrdAmt;	// 전년동기대비매출액
+	private int selfAmt;		// 자사직방문매출액
+	private int channelAmt;		// 채널매출액
+	private int extmallAmt;		// 제휴몰매출액
+	private int cnclAmt;		// 취/반품액
+	private int ordCnt;			// 주문건수
+	private int sellQty;		// 판매수량
+	private int cnclQty;		// 취/반품수량
+
+	// 검색조건
+	private String dayGb;		// 날짜구분(D:일별, W:주별, M:월별)
+	private String startDt;		// 시작일
+	private String endDt;		// 종료일
+	private String frontGbP;	// 프론트구분(=디바이스구분)PC웹
+	private String frontGbM;	// 프론트구분(=디바이스구분)모바일웹
+	private String frontGbA;	// 프론트구분(=디바이스구분)앱
+	private String mallGb;		// 몰구분
+
+	private String extmallIdList;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiExtmallId;	// 제휴몰ID
+
+	private String distributionGbWms;	// 유통구분(WMS)
+	private String distributionGbScm;	// 유통구분(SCM)
+
+	private String supplyCompCdList;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiSupplyCompCd;	// 공급업체코드
+
+	private String afLinkCdList;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiAfLinkCd;		// 제휴채널코드
+
+	private String brandCdList;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiBrandCd;		// 브랜드코드
+
+	private String itemkindCdList;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiItemkindCd;	// 품목코드
+
+}

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

@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaStatisticsDao">
+
+	<!-- 일자별주문 목록 -->
+	<select id="getDailyOrderList" parameterType="Statistics" resultType="Statistics">
+		/* TsaStatistics.getDailyOrderList */
+		SELECT SUM(SOD.SELF_AMT + SOD.CHANNEL_AMT + SOD.EXTMALL_AMT) AS TOT_ORD_AMT     /*매출액*/
+		     , IFNULL((SELECT SUM(SELF_AMT + CHANNEL_AMT + EXTMALL_AMT)
+		               FROM   TB_STAT_ORD_DAY
+		               WHERE  1 = 1
+		               AND    DAY <![CDATA[>=]]> DATE_ADD(STR_TO_DATE(#{startDt},'%Y-%m-%d'), INTERVAL -1 YEAR)
+		               AND    DAY <![CDATA[<]]> DATE_ADD(DATE_ADD(STR_TO_DATE(#{endDt},'%Y-%m-%d'), INTERVAL 1 DAY), INTERVAL -1 YEAR)
+		               AND    (
+		                       1 = 1
+		               <if test='frontGbP != null and frontGbP != ""'>
+		                       OR FRONT_GB = 'P'
+		               </if>
+		               <if test='frontGbM != null and frontGbM != ""'>
+		                       OR FRONT_GB = 'M'
+		               </if>
+		               <if test='frontGbA != null and frontGbA != ""'>
+		                       OR FRONT_GB = 'A'
+		               </if>
+		                      )
+		               <if test='mallGb != null and mallGb != ""'>
+		               AND    IFNULL(EXTMALL_ID,'') != '' /*제휴몰만*/
+		                   <if test='multiExtmallId != null and multiExtmallId != ""'>
+		               AND    EXTMALL_ID IN
+		                       <foreach collection="multiExtmallId" item="item" index="index"  open="(" close=")" separator=",">
+		                       #{item}
+		                       </foreach>
+		                   </if>
+		               </if>
+		               AND    (
+		                       1 = 1
+		               <if test='distributionGbWms != null and distributionGbWms != ""'>
+		                       OR DISTRIBUTION_GB = 'WMS'
+		               </if>
+		               <if test='distributionGbScm != null and distributionGbScm != ""'>
+		                       OR DISTRIBUTION_GB = 'SCM'
+		               </if>
+		                      )
+		               <if test='multiSupplyCompCd != null and multiSupplyCompCd != ""'>
+		               AND    SUPPLY_COMP_CD IN
+		                      <foreach collection="multiSupplyCompCd" item="item" index="index"  open="(" close=")" separator=",">
+		                      #{item}
+		                      </foreach>
+		               </if>
+		               <if test='multiAfLinkCd != null and multiAfLinkCd != ""'>
+		               AND    AF_LINK_CD IN
+		                      <foreach collection="multiAfLinkCd" item="item" index="index"  open="(" close=")" separator=",">
+		                      #{item}
+		                      </foreach>
+		               </if>
+		               <if test='multiBrandCd != null and multiBrandCd != ""'>
+		               AND    BRAND_CD IN
+		                      <foreach collection="multiBrandCd" item="item" index="index"  open="(" close=")" separator=",">
+		                      #{item}
+		                      </foreach>
+		               </if>
+		               <if test='multiItemkindCd != null and multiItemkindCd != ""'>
+		               AND    ITEMKIND_CD IN
+		                      <foreach collection="multiItemkindCd" item="item" index="index"  open="(" close=")" separator=",">
+		                      #{item}
+		                      </foreach>
+		               </if>
+		              ),0)                                           AS YOY_TOT_ORD_AMT /*전년동기대비매출액*/
+		     , SUM(SOD.SELF_AMT)                                     AS SELF_AMT        /*자사직방문매출액*/
+		     , SUM(SOD.CHANNEL_AMT)                                  AS CHANNEL_AMT     /*채널매출액*/
+		     , SUM(SOD.EXTMALL_AMT)                                  AS EXTMALL_AMT     /*제휴몰매출액*/
+		     , SUM(SOD.CNCL_AMT + SOD.RTN_AMT)                       AS CNCL_AMT        /*취/반품액*/
+		     , SUM(SOD.ORD_CNT)                                      AS ORD_CNT         /*주문건수*/
+		     , SUM(SOD.SELL_QTY)                                     AS SELL_QTY        /*판매수량*/
+		     , SUM(SOD.CNCL_QTY + SOD.RTN_QTY)                       AS CNCL_QTY        /*취/반품수량*/
+		     <choose>
+		         <when test='dayGb == "W"'> <!-- 주별 -->
+		     , CONCAT(MONTH(SOD.DAY), '월 ', WEEK(SOD.DAY,5) - WEEK(DATE_SUB(SOD.DAY, INTERVAL DAYOFMONTH(SOD.DAY) - 1 DAY), 5) + 1, '주') AS DAY
+		         </when>
+		         <when test='dayGb == "M"'> <!-- 월별 -->
+		     , DATE_FORMAT(SOD.DAY,'%Y-%m')                          AS DAY
+		         </when>
+		         <otherwise> <!-- 일별 -->
+		     , DATE_FORMAT(SOD.DAY,'%Y-%m-%d')                       AS DAY
+		         </otherwise>
+		     </choose>
+		FROM   TB_STAT_ORD_DAY SOD
+		WHERE  1 = 1
+		AND    SOD.DAY <![CDATA[>=]]> STR_TO_DATE(#{startDt},'%Y-%m-%d')
+		AND    SOD.DAY <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{endDt},'%Y-%m-%d'), INTERVAL 1 DAY)
+		AND    (
+		        1 = 1
+		<if test='frontGbP != null and frontGbP != ""'>
+		        OR SOD.FRONT_GB = 'P'
+		</if>
+		<if test='frontGbM != null and frontGbM != ""'>
+		        OR SOD.FRONT_GB = 'M'
+		</if>
+		<if test='frontGbA != null and frontGbA != ""'>
+		        OR SOD.FRONT_GB = 'A'
+		</if>
+		       )
+		<if test='mallGb != null and mallGb != ""'>
+		AND    IFNULL(SOD.EXTMALL_ID,'') != '' /*제휴몰만*/
+		    <if test='multiExtmallId != null and multiExtmallId != ""'>
+		AND    SOD.EXTMALL_ID IN
+		        <foreach collection="multiExtmallId" item="item" index="index"  open="(" close=")" separator=",">
+		        #{item}
+		        </foreach>
+		    </if>
+		</if>
+		AND    (
+		        1 = 1
+		<if test='distributionGbWms != null and distributionGbWms != ""'>
+		        OR SOD.DISTRIBUTION_GB = 'WMS'
+		</if>
+		<if test='distributionGbScm != null and distributionGbScm != ""'>
+		        OR SOD.DISTRIBUTION_GB = 'SCM'
+		</if>
+		       )
+		<if test='multiSupplyCompCd != null and multiSupplyCompCd != ""'>
+		AND    SOD.SUPPLY_COMP_CD IN
+		       <foreach collection="multiSupplyCompCd" item="item" index="index"  open="(" close=")" separator=",">
+		       #{item}
+		       </foreach>
+		</if>
+		<if test='multiAfLinkCd != null and multiAfLinkCd != ""'>
+		AND    SOD.AF_LINK_CD IN
+		       <foreach collection="multiAfLinkCd" item="item" index="index"  open="(" close=")" separator=",">
+		       #{item}
+		       </foreach>
+		</if>
+		<if test='multiBrandCd != null and multiBrandCd != ""'>
+		AND    SOD.BRAND_CD IN
+		       <foreach collection="multiBrandCd" item="item" index="index"  open="(" close=")" separator=",">
+		       #{item}
+		       </foreach>
+		</if>
+		<if test='multiItemkindCd != null and multiItemkindCd != ""'>
+		AND    SOD.ITEMKIND_CD IN
+		       <foreach collection="multiItemkindCd" item="item" index="index"  open="(" close=")" separator=",">
+		       #{item}
+		       </foreach>
+		</if>
+		<choose>
+		         <when test='dayGb == "W"'> <!-- 주별 -->
+		GROUP  BY CONCAT(MONTH(SOD.DAY), '월 ', WEEK(SOD.DAY,5) - WEEK(DATE_SUB(SOD.DAY, INTERVAL DAYOFMONTH(SOD.DAY) - 1 DAY), 5) + 1, '주')
+		         </when>
+		         <when test='dayGb == "M"'> <!-- 월별 -->
+		GROUP  BY DATE_FORMAT(SOD.DAY,'%Y-%m')
+		         </when>
+		         <otherwise> <!-- 일별 -->
+		GROUP  BY DATE_FORMAT(SOD.DAY,'%Y-%m-%d')
+		         </otherwise>
+		     </choose>
+	</select>
+
+</mapper>

+ 401 - 0
src/main/webapp/WEB-INF/views/statistics/DailyOrderForm.html

@@ -0,0 +1,401 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : DailyOrderForm.html
+ * @desc    : 일자별주문 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.08.17   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/statistics/daily/order/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="3" id="terms">
+						</td>
+						<th>물류구분</th>
+						<td>
+							<label class="chkBox checked"><input type="checkbox" name="distributionGbScm" value="SCM" checked="checked"/>입점</label>
+							<label class="chkBox checked"><input type="checkbox" name="distributionGbWms" value="WMS" checked="checked"/>위탁</label>
+						</td>
+					</tr>
+					<tr>
+						<th>디바이스</th>
+						<td>
+							<label class="chkBox checked"><input type="checkbox" name="frontGbP" value="P" checked="checked"/>PC웹</label>
+							<label class="chkBox checked"><input type="checkbox" name="frontGbM" value="M" checked="checked"/>모바일웹</label>
+							<label class="chkBox checked"><input type="checkbox" name="frontGbA" value="A" checked="checked"/>APP</label>
+						</td>
+						<th>제휴몰</th>
+						<td>
+							<input type="text" class="w100" name="extmallIdSearchTxt" id="extmallIdSearchTxt" maxlength="20"/>
+							<button type="button" class="btn icn" onclick="cfnOpenExtmallListPopup('fnSetExtmallInfo', 'M');"><i class="fa fa-search"></i></button>
+							<span id="extmallIdTxt"></span>
+							<input type="hidden" name="extmallIdList"/>
+						</td>
+						<th>공급업체</th>
+						<td>
+							<input type="text" class="w100" name="supplyCompCdSearchTxt" id="supplyCompCdSearchTxt" maxlength="20"/>
+							<button type="button" class="btn icn" onclick="cfnOpenCompanyListPopup('fnSetSupplyCompInfo', 'M');"><i class="fa fa-search"></i></button>
+							<span id="supplyCompCdTxt"></span>
+							<input type="hidden" name="supplyCompCdList"/>
+						</td>
+					</tr>
+					<tr>
+						<th>제휴채널</th>
+						<td>
+							<input type="text" class="w100" name="afLinkCdSearchTxt" id="afLinkCdSearchTxt" maxlength="20" />
+							<button type="button" class="btn icn" onclick="cfnOpenAfLinkListPopup('fnSetAfLinkInfo', 'M');"><i class="fa fa-search"></i></button>
+							<span id="afLinkCdTxt"></span>
+							<input type="hidden" name="afLinkCdList"/>
+						</td>
+						<th>브랜드</th>
+						<td>
+							<input type="text" class="w100" name="brandCdSearchTxt" id="brandCdSearchTxt" maxlength="20" />
+							<button type="button" class="btn icn" onclick="cfnOpenBrandListPopup('fnSetBrandInfo', 'M');"><i class="fa fa-search"></i></button>
+							<span id="brandCdTxt"></span>
+							<input type="hidden" name="brandCdList"/>
+						</td>
+						<th>품목</th>
+						<td>
+							<input type="text" class="w100" name="itemkindCdSearchTxt" id="itemkindCdSearchTxt" maxlength="20" />
+							<button type="button" class="btn icn" onclick="cfnOpenItemkindListPopup('fnSetItemkindInfo', 'M');"><i class="fa fa-search"></i></button>
+							<span id="itemkindTxt"></span>
+							<input type="hidden" name="itemkindList"/>
+						</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: "매출액", field: "totOrdAmt", width: 150, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: "전년동기매출액", field: "yoyTotOrdAmt", width: 150, cellClass: 'text-right', hide: true,
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{ headerName: "YOY(%)", field: "yoyRate", width: 100, cellClass: 'text-center' },
+		{
+			headerName: "자사직방문", field: "selfAmt", width: 150, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: "채널", field: "channelAmt", width: 150, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: "제휴몰", field: "extmallAmt", width: 150, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: "취/반품액", field: "cnclAmt", width: 120, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: "주문수", field: "ordCnt", width: 150, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: "판매수", field: "sellQty", width: 150, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: "취/반품수", field: "cnclQty", width: 150, cellClass: 'text-right',
+			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 fnSetExtmallInfo = function(result) {
+		var arrExtmallId = [];
+		var extmallIdTxt = "";
+		var sIndex = 0;
+		$('#extmallIdTxt').html('');
+		$('#searchForm input[name=extmallIdSearchTxt]').val('');
+		
+		result.forEach(function(extmall) {
+			sIndex++; 
+			arrExtmallId.push(extmall.extmallId);
+		});
+
+		// 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리 
+		if (sIndex == 1) {
+			$('#searchForm input[name=extmallIdSearchTxt]').val(arrExtmallId[0]);
+		} else {
+			extmallIdTxt = sIndex + " 개";
+			$('#extmallIdTxt').html(extmallIdTxt);
+		}
+		
+		var jsonData = JSON.stringify(arrExtmallId);
+		$("#searchForm input[name=extmallIdList]").val(jsonData);
+	}
+	
+	// 업체 조회 팝업에서 호출
+	var fnSetSupplyCompInfo = function(result) {
+		var arrSupplyCompCd = [];
+		var supplyCompCdTxt = "";
+		var sIndex = 0;
+		$('#supplyCompCdTxt').html('');
+		$('#searchForm input[name=supplyCompCdSearchTxt]').val('');
+		
+		result.forEach(function(supplyComp) {
+			sIndex++; 
+			arrSupplyCompCd.push(supplyComp.supplyCompCd);
+		});
+
+		// 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리 
+		if (sIndex == 1) {
+			$('#searchForm input[name=supplyCompCdSearchTxt]').val(arrSupplyCompCd[0]);
+		} else {
+			supplyCompCdTxt = sIndex + " 개";
+			$('#supplyCompCdTxt').html(supplyCompCdTxt);
+		}
+		
+		var jsonData = JSON.stringify(arrSupplyCompCd);
+		$("#searchForm input[name=supplyCompCdList]").val(jsonData);
+	}
+	
+	// 제휴채널 조회 팝업에서 호출
+	var fnSetAfLinkInfo = function(result) {
+		var arrAfLinkCd = [];
+		var afLinkCdTxt = "";
+		var sIndex = 0;
+		$('#afLinkCdTxt').html('');
+		$('#searchForm input[name=afLinkCdSearchTxt]').val('');
+		
+		result.forEach(function(afLink) {
+			sIndex++; 
+			arrAfLinkCd.push(afLink.afLinkCd);
+		});
+
+		// 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리 
+		if (sIndex == 1) {
+			$('#searchForm input[name=afLinkCdSearchTxt]').val(arrAfLinkCd[0]);
+		} else {
+			afLinkCdTxt = sIndex + " 개";
+			$('#afLinkCdTxt').html(afLinkCdTxt);
+		}
+		
+		var jsonData = JSON.stringify(arrAfLinkCd);
+		$("#searchForm input[name=afLinkCdList]").val(jsonData);
+	}
+	
+	// 브랜드 조회 팝업에서 호출
+	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(jsonData);
+	}
+	
+	// 품목 조회 팝업에서 호출
+	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(jsonData);
+	}
+	
+	// 검색
+	$('#btnSearch').on('click', function() {
+		// 입력 값 체크
+		if (!gagajf.validation($('#searchForm')))
+			return false;
+		
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm', fnCreateTotal);
+	});
+	
+	// 합계 생성
+	let fnCreateTotal = function() {
+		let totOrdAmt = 0;
+		let yoyTotOrdAmt = 0;
+		let selfAmt = 0;
+		let channelAmt = 0;
+		let extmallAmt = 0;
+		let cnclAmt = 0;
+		let ordCnt = 0;
+		let sellQty = 0;
+		let cnclQty = 0;
+		
+		gridOptions.api.forEachNode(function(rowNode, index) {
+			if (!rowNode.group) {
+				if (typeof rowNode.data.totOrdAmt == 'number') { totOrdAmt += rowNode.data.totOrdAmt; }
+				if (typeof rowNode.data.yoyTotOrdAmt == 'number') { yoyTotOrdAmt += rowNode.data.yoyTotOrdAmt; }
+				if (typeof rowNode.data.selfAmt == 'number') { selfAmt += rowNode.data.selfAmt; }
+				if (typeof rowNode.data.channelAmt == 'number') { channelAmt += rowNode.data.channelAmt; }
+				if (typeof rowNode.data.extmallAmt == 'number') { extmallAmt += rowNode.data.extmallAmt; }
+				if (typeof rowNode.data.cnclAmt == 'number') { cnclAmt += rowNode.data.cnclAmt; }
+				if (typeof rowNode.data.ordCnt == 'number') { ordCnt += rowNode.data.ordCnt; }
+				if (typeof rowNode.data.sellQty == 'number') { sellQty += rowNode.data.sellQty; }
+				if (typeof rowNode.data.cnclQty == 'number') { cnclQty += rowNode.data.cnclQty; }
+			}
+		});
+
+		let yoyRate = yoyTotOrdAmt > 0 ? gagaAgGrid.toFixed((totOrdAmt / yoyTotOrdAmt - 1) * 100, 1) : '';
+		
+		let data = {
+			day: 'TOTAL',
+			totOrdAmt: totOrdAmt, yoyTotOrdAmt: yoyTotOrdAmt, yoyRate: yoyRate,
+			selfAmt: selfAmt, channelAmt: channelAmt, extmallAmt: extmallAmt,
+			cnclAmt: cnclAmt, ordCnt: ordCnt, sellQty: sellQty, cnclQty: cnclQty
+		};
+
+		gagaAgGrid.setPinnedRowData(gridOptions, data, 'top');
+	}
+	
+	// 초기화 클릭시
+	$('#btnInit').on('click', function() {
+		$('#searchForm')[0].reset();
+		
+		$('#extmallIdTxt').html('');
+		$('#searchForm input[name=extmallIdList]').val('');
+		$('#supplyCompCdTxt').html('');
+		$('#searchForm input[name=supplyCompCdList]').val('');
+		$('#afLinkCdTxt').html('');
+		$('#searchForm input[name=afLinkCdList]').val('');
+		$('#brandCdTxt').html('');
+		$('#searchForm input[name=brandCdList]').val('');
+		$('#itemkindCdTxt').html('');
+		$('#searchForm input[name=itemkindCdList]').val('');
+	});
+	
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('일자별주문 목록', gridOptions);
+	});
+	
+	// 일자구분 변경 시
+	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, '주문');
+		$('.btnRecentWeek').trigger('click');
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>