Переглянути джерело

Merge branch 'jmh' into jmh_option

jmh 4 роки тому
батько
коміт
5d5aec1021
29 змінених файлів з 1103 додано та 105 видалено
  1. 12 1
      src/main/java/com/style24/batch/biz/dao/TsbGoodsEpDao.java
  2. 19 1
      src/main/java/com/style24/batch/biz/dao/TsbOrderDao.java
  3. 11 0
      src/main/java/com/style24/batch/biz/dao/TsbStatisticsDao.java
  4. 53 25
      src/main/java/com/style24/batch/biz/job/goods/TsbNaverSellEp.java
  5. 83 0
      src/main/java/com/style24/batch/biz/job/naverpay/TsbNaverPayOrderDecisionJob.java
  6. 62 0
      src/main/java/com/style24/batch/biz/job/statistics/TsbCustOrderStaticsJob.java
  7. 62 0
      src/main/java/com/style24/batch/biz/job/statistics/TsbCustStaticsJob.java
  8. 2 2
      src/main/java/com/style24/batch/biz/job/statistics/TsbPayStaticsJob.java
  9. 2 2
      src/main/java/com/style24/batch/biz/job/statistics/TsbSubPayStaticsJob.java
  10. 14 3
      src/main/java/com/style24/batch/biz/service/TsbGoodsEpService.java
  11. 19 2
      src/main/java/com/style24/batch/biz/service/TsbOrderService.java
  12. 13 0
      src/main/java/com/style24/batch/biz/service/TsbStatisticsService.java
  13. 30 2
      src/main/java/com/style24/batch/biz/task/TsbNaverPayTask.java
  14. 8 1
      src/main/java/com/style24/batch/biz/task/TsbOrderTask.java
  15. 29 10
      src/main/java/com/style24/batch/biz/task/TsbStatisticsTask.java
  16. 36 30
      src/main/java/com/style24/persistence/mybatis/shop/TsbCustomer.xml
  17. 4 0
      src/main/java/com/style24/persistence/mybatis/shop/TsbDelivery.xml
  18. 4 2
      src/main/java/com/style24/persistence/mybatis/shop/TsbDisplay.xml
  19. 9 16
      src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml
  20. 27 0
      src/main/java/com/style24/persistence/mybatis/shop/TsbGoodsEp.xml
  21. 5 4
      src/main/java/com/style24/persistence/mybatis/shop/TsbGoodsSearch.xml
  22. 33 0
      src/main/java/com/style24/persistence/mybatis/shop/TsbOrder.xml
  23. 552 0
      src/main/java/com/style24/persistence/mybatis/shop/TsbStatistics.xml
  24. 3 3
      src/main/java/com/style24/persistence/mybatis/wms/TsbWmsDelivery.xml
  25. 1 0
      src/main/resources/config/application-brdg.yml
  26. 3 0
      src/main/resources/config/application-locd.yml
  27. 1 0
      src/main/resources/config/application-locp.yml
  28. 4 1
      src/main/resources/config/application-style.yml
  29. 2 0
      src/main/resources/config/application.yml

+ 12 - 1
src/main/java/com/style24/batch/biz/dao/TsbGoodsEpDao.java

@@ -142,19 +142,29 @@ public interface TsbGoodsEpDao {
 
 	/**
 	 * 네이버 EP 페이징 목록
+	 * @param goodsEp - 상품EP 정보
 	 * @return
 	 * @author gagamel
 	 * @since 2021. 6. 14
 	 */
 	Collection<GoodsEp> getNaverEpPagingList(GoodsEp goodsEp);
 
+	/**
+	 * 네이버 판매지수EP 총건수
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 9. 23
+	 */
+	int getNaverSellEpTotalCount();
+
 	/**
 	 * 네이버 판매지수EP 목록
+	 * @param goodsEp - 상품EP 정보
 	 * @return
 	 * @author gagamel
 	 * @since 2021. 6. 15
 	 */
-	Collection<GoodsEp> getNaverSellEpList();
+	Collection<GoodsEp> getNaverSellEpList(GoodsEp goodsEp);
 
 	/**
 	 * EP다음 정보 삭제
@@ -207,6 +217,7 @@ public interface TsbGoodsEpDao {
 
 	/**
 	 * 다음 EP 페이징 목록
+	 * @param goodsEp - 상품EP 정보
 	 * @return
 	 * @author gagamel
 	 * @since 2021. 6. 14

+ 19 - 1
src/main/java/com/style24/batch/biz/dao/TsbOrderDao.java

@@ -6,7 +6,6 @@ import org.springframework.stereotype.Repository;
 
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.Point;
 
 /**
  * 주문 Dao
@@ -45,4 +44,23 @@ public interface TsbOrderDao {
 	 * @since  2021. 07. 13
 	 */
 	Collection<Order> getOrderDepositWaitingCustomerList();
+
+	/**
+	 * 네이버페이 결제형 구매확정 대상 리스트 조회
+	 * 
+	 * @return Collection<Order>
+	 * @author card007
+	 * @since 2021. 09. 20
+	 */
+	Collection<Order> getNaverPayOrderDecisionList();
+
+	/**
+	 * 네이버페이 결제형 구매확정 여부 수정
+	 * 
+	 * @param Order
+	 * @return int
+	 * @author card007
+	 * @since 2021. 09. 23
+	 */
+	int updateNaverPayOrderDecision(Order order);
 }

+ 11 - 0
src/main/java/com/style24/batch/biz/dao/TsbStatisticsDao.java

@@ -94,4 +94,15 @@ public interface TsbStatisticsDao {
 	 */
 	void updateSalesUploadResult(Map<String, Object> paramMap);
 
+	int createStatCustAll(String currDay);
+
+	int createStatCustDorm(String currDay);
+
+	int createStatCustExt(String currDay);
+
+	int createStatCustJoin(String currDay);
+
+	int createStatCust(String currDay);
+
+	int createStatCustOrd(String currDay);
 }

+ 53 - 25
src/main/java/com/style24/batch/biz/job/goods/TsbNaverSellEp.java

@@ -26,7 +26,7 @@ import com.gagaframework.web.util.GagaFileUtil;
  */
 @Component
 @Slf4j
-public class TsbNaverSellEp extends TsbAbstractJob<Collection<GoodsEp>, Collection<GoodsEp>, String> {
+public class TsbNaverSellEp extends TsbAbstractJob<String, String, String> {
 
 	@Autowired
 	private TsbGoodsEpService naverEpService;
@@ -34,36 +34,60 @@ public class TsbNaverSellEp extends TsbAbstractJob<Collection<GoodsEp>, Collecti
 	@Autowired
 	private Environment env;
 
+	private static final int PAGE_SIZE = 10000;
+
 	@Override
-	public Collection<GoodsEp> read() throws Exception {
-		// 네이버 판매지수EP 목록
-		return naverEpService.getNaverSellEpList();
+	public String read() throws Exception {
+		return "OK";
 	}
 
 	@Override
-	public Collection<GoodsEp> process(Collection<GoodsEp> goodsEpList) throws Exception {
-		return goodsEpList;
+	public String process(String result) throws Exception {
+		return "OK";
 	}
 
 	@Override
-	public String write(Collection<GoodsEp> goodsEpList) throws Exception {
-		if (goodsEpList != null && !goodsEpList.isEmpty()) {
-			StringBuilder sb = new StringBuilder();
-			this.setEpTitle(sb);
+	public String write(String result) throws Exception {
+		// 총건수
+		int totCnt = naverEpService.getNaverSellEpTotalCount();
+		log.info("totCnt: {}", totCnt);
 
-			for (GoodsEp goodsEp : goodsEpList) {
-				this.setEpInfo(sb, goodsEp);
-			}
+		if (totCnt < 1) {
+			return "OK";
+		}
+
+		String uploadPath = GagaFileUtil.getConcatenationPath(env.getProperty("ep.file.path"), "iStyle24ProductFeed_NaverEP_SellingIndex_new.txt");
+		log.info("네이버 판매지수EP 파일 경로: {}", uploadPath);
+
+		int totPage = totCnt / PAGE_SIZE;
+		log.info("totalPage: {}", totPage);
 
-			String uploadPath = GagaFileUtil.getConcatenationPath(env.getProperty("ep.file.path"), "iStyle24ProductFeed_NaverEP_SellingIndex_new.txt");
-			log.info("네이버 판매지수EP 파일 경로: {}", uploadPath);
+		if (totCnt % PAGE_SIZE > 0) {
+			totPage++;
+		}
+
+		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(uploadPath)), "UTF-8"));
+
+		// 타이틀 Write
+		bw.append(this.getEpTitle());
+
+		for (int page = 0; page < totPage; page++) {
+			int limitStartRow = (page * PAGE_SIZE + 1) - 1;
+			GoodsEp goodsEp = new GoodsEp();
+			goodsEp.setLimitStartRow(limitStartRow);
+			goodsEp.setPageSize(PAGE_SIZE);
 
-			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(uploadPath)), "UTF-8"));
-			bw.write(sb.toString());
-			bw.flush();
-			bw.close();
+			// 네이버 판매지수EP 목록
+			Collection<GoodsEp> goodsEpList = naverEpService.getNaverSellEpList(goodsEp);
+
+			for (GoodsEp goodsEpInfo : goodsEpList) {
+				bw.append(this.getEpInfo(goodsEpInfo));
+			}
+			log.info("{} Page data wrote successfully!", (page + 1));
 		}
 
+		bw.close();
+
 		return "OK";
 	}
 
@@ -73,24 +97,28 @@ public class TsbNaverSellEp extends TsbAbstractJob<Collection<GoodsEp>, Collecti
 	}
 
 	/**
-	 * EP 타이틀 설정
-	 * @param sb - StringBuilder
+	 * Get EP 타이틀
+	 * @return
 	 */
-	private void setEpTitle(StringBuilder sb) {
+	private String getEpTitle() {
+		StringBuilder sb = new StringBuilder();
 		sb.append("id\t").append("sale_count\t").append("sale_price\t").append("order_count\t").append("dt\n");
+		return sb.toString();
 	}
 
 	/**
-	 * EP 정보 설정
-	 * @param sb - StringBuilder
+	 * Get EP 정보
 	 * @param goodsEp - 상품EP 정보
+	 * @return
 	 */
-	private void setEpInfo(StringBuilder sb, GoodsEp goodsEp) {
+	private String getEpInfo(GoodsEp goodsEp) {
+		StringBuilder sb = new StringBuilder();
 		sb.append(goodsEp.getId()).append("\t");
 		sb.append(goodsEp.getSaleCount()).append("\t");
 		sb.append(goodsEp.getSalePrice()).append("\t");
 		sb.append(goodsEp.getOrderCount()).append("\t");
 		sb.append(goodsEp.getDt()).append("\n");
+		return sb.toString();
 	}
 
 }

+ 83 - 0
src/main/java/com/style24/batch/biz/job/naverpay/TsbNaverPayOrderDecisionJob.java

@@ -0,0 +1,83 @@
+package com.style24.batch.biz.job.naverpay;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbOrderService;
+import com.style24.core.biz.service.TscNaverPayService;
+import com.style24.persistence.domain.Order;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 네이버페이 결제형 구매확정 처리 
+ *
+ * @author card007
+ * @since 2021. 09. 23
+ */
+@Component
+@Slf4j
+public class TsbNaverPayOrderDecisionJob extends TsbAbstractJob<Collection<Order>, Collection<Order> , Collection<Order>> {
+
+	@Autowired
+	private TsbOrderService orderService;
+	
+	@Autowired
+	private TscNaverPayService coreNaverPayService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+
+	@Override
+	public Collection<Order> read() throws Exception {
+		// 네이버페이 결제형 구매확정 대상 리스트 조회
+		return orderService.getNaverPayOrderDecisionList();
+	}
+
+	@Override
+	public Collection<Order> process(Collection<Order> dataList) throws Exception {
+		succCnt = 0;
+		failCnt = 0;
+
+		for(Order order: dataList) {
+			try {
+				Order result = coreNaverPayService.decideNaverPayOrder(order);
+
+				// 성공
+				if ("200".equals(result.getResultCd())) {
+					if ("Success".equals(result.getResultMsg()) || "AlreadyConfirm".equals(result.getResultMsg())) {
+						// 네이버페이 결제형 구매확정 여부 수정
+						orderService.updateNaverPayOrderDecision(result);
+
+						succCnt++;
+					} else {
+						failCnt++;
+					}
+				}
+				// 실패
+				else {
+					failCnt++;
+				}
+			}catch(Exception e) {
+				e.printStackTrace();
+
+				failCnt++;
+			}
+		}
+		return dataList;
+	}
+
+	@Override
+	public Collection<Order> write(Collection<Order> dataList) throws Exception {
+		return dataList;
+	}
+
+	@Override
+	public void notify(Collection<Order> invoiceList) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 62 - 0
src/main/java/com/style24/batch/biz/job/statistics/TsbCustOrderStaticsJob.java

@@ -0,0 +1,62 @@
+package com.style24.batch.biz.job.statistics;
+
+import com.gagaframework.web.util.GagaDateUtil;
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbStatisticsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 회원통계
+ *
+ * @author swkim
+ * @since 2021.05.17
+ */
+@Component
+@Slf4j
+public class TsbCustOrderStaticsJob extends TsbAbstractJob<String, String, String> {
+
+	@Autowired
+	private TsbStatisticsService statisticsService;
+
+	@Override
+	public String read() throws Exception {
+		return "OK";
+	}
+
+	@Override
+	public String process(String result) throws Exception {
+
+		// 기간
+		/*String startDay = "20210701";
+		String endDay = "20210831";
+		int days = GagaDateUtil.getOffsetDays(endDay, startDay) + 1;
+
+		System.out.println("term === " + days);
+
+		for (int i=0; i<days; i++) {
+			String currDay = GagaDateUtil.getOffsetDate(startDay, i, "yyyyMMdd");
+			System.out.println(currDay);
+
+			statisticsService.createStatCustOrd(currDay);
+		}*/
+
+		String toDay = GagaDateUtil.getToday();
+		String currDay = GagaDateUtil.getOffsetDate(toDay, -1, "yyyyMMdd");
+
+		statisticsService.createStatCustOrd(currDay);
+
+		return result;
+	}
+
+	@Override
+	public String write(String result) throws Exception {
+		return result;
+	}
+
+	@Override
+	public void notify(String result) throws Exception {
+		// Do nothing
+	}
+}

+ 62 - 0
src/main/java/com/style24/batch/biz/job/statistics/TsbCustStaticsJob.java

@@ -0,0 +1,62 @@
+package com.style24.batch.biz.job.statistics;
+
+import com.gagaframework.web.util.GagaDateUtil;
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbStatisticsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 회원통계
+ *
+ * @author swkim
+ * @since 2021.05.17
+ */
+@Component
+@Slf4j
+public class TsbCustStaticsJob extends TsbAbstractJob<String, String, String> {
+
+	@Autowired
+	private TsbStatisticsService statisticsService;
+
+	@Override
+	public String read() throws Exception {
+		return "OK";
+	}
+
+	@Override
+	public String process(String result) throws Exception {
+
+		// 기간
+		/*String startDay = "20210901";
+		String endDay = "20210925";
+		int days = GagaDateUtil.getOffsetDays(endDay, startDay) + 1;
+
+		System.out.println("term === " + days);
+
+		for (int i=0; i<days; i++) {
+			String currDay = GagaDateUtil.getOffsetDate(startDay, i, "yyyyMMdd");
+			System.out.println(currDay);
+
+			statisticsService.createStatCust(currDay);
+		}*/
+
+		String toDay = GagaDateUtil.getToday();
+		String currDay = GagaDateUtil.getOffsetDate(toDay, -1, "yyyyMMdd");
+
+		statisticsService.createStatCust(currDay);
+
+		return result;
+	}
+
+	@Override
+	public String write(String result) throws Exception {
+		return result;
+	}
+
+	@Override
+	public void notify(String result) throws Exception {
+		// Do nothing
+	}
+}

+ 2 - 2
src/main/java/com/style24/batch/biz/job/statistics/TsbPayStaticsJob.java

@@ -29,8 +29,8 @@ public class TsbPayStaticsJob extends TsbAbstractJob<String, String, String> {
 	public String process(String result) throws Exception {
 
 		// 기간
-		/*String startDay = "20180701";
-		String endDay = "20210915";
+		/*String startDay = "20180101";
+		String endDay = "20210925";
 		int days = GagaDateUtil.getOffsetDays(endDay, startDay) + 1;
 
 		System.out.println("term === " + days);

+ 2 - 2
src/main/java/com/style24/batch/biz/job/statistics/TsbSubPayStaticsJob.java

@@ -29,8 +29,8 @@ public class TsbSubPayStaticsJob extends TsbAbstractJob<String, String, String>
 	public String process(String result) throws Exception {
 
 		// 기간
-		/*String startDay = "20180701";
-		String endDay = "20210915";
+		/*String startDay = "20180101";
+		String endDay = "20210925";
 		int days = GagaDateUtil.getOffsetDays(endDay, startDay) + 1;
 
 		System.out.println("days === " + days);

+ 14 - 3
src/main/java/com/style24/batch/biz/service/TsbGoodsEpService.java

@@ -47,7 +47,7 @@ public class TsbGoodsEpService {
 			// 1.1. 상품 이미지 정보 truncate
 			goodsEpDao.truncateEpGoodsImage();
 			log.info("1.1. 상품 이미지 정보 truncate");
-			
+
 			// 1.2. 상품 이미지 정보 생성
 			cnt = goodsEpDao.createEpGoodsImage(goodsEp);
 			log.info("1.2. 상품 이미지 정보 생성: {}건", cnt);
@@ -177,14 +177,25 @@ public class TsbGoodsEpService {
 		return goodsEpDao.getNaverEpPagingList(goodsEp);
 	}
 
+	/**
+	 * 네이버 판매지수EP 총건수
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 9. 23
+	 */
+	public int getNaverSellEpTotalCount() {
+		return goodsEpDao.getNaverSellEpTotalCount();
+	}
+
 	/**
 	 * 네이버 판매지수EP 목록
+	 * @param goodsEp - 상품EP 정보
 	 * @return
 	 * @author gagamel
 	 * @since 2021. 6. 15
 	 */
-	public Collection<GoodsEp> getNaverSellEpList() {
-		return goodsEpDao.getNaverSellEpList();
+	public Collection<GoodsEp> getNaverSellEpList(GoodsEp goodsEp) {
+		return goodsEpDao.getNaverSellEpList(goodsEp);
 	}
 
 	/**

+ 19 - 2
src/main/java/com/style24/batch/biz/service/TsbOrderService.java

@@ -6,9 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.style24.batch.biz.dao.TsbOrderDao;
-import com.style24.batch.biz.dao.TsbPointDao;
 import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.Point;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -56,4 +54,23 @@ public class TsbOrderService {
 	public Collection<Order> getOrderDepositWaitingCustomerList() {
 		return orderDao.getOrderDepositWaitingCustomerList();
 	}
+
+	/**
+	 * 네이버페이 결제형 구매확정 대상 리스트 조회
+	 * 
+	 * @return Collection<Order>
+	 * @author card007
+	 * @since 2021. 09. 23
+	 */
+	public Collection<Order> getNaverPayOrderDecisionList() { return orderDao.getNaverPayOrderDecisionList(); }
+
+	/**
+	 * 네이버페이 결제형 구매확정 여부 수정
+	 *
+	 * @param Order
+	 * @return int
+	 * @author card007
+	 * @since 2021. 09. 23
+	 */
+	public int updateNaverPayOrderDecision(Order order) { return orderDao.updateNaverPayOrderDecision(order); }
 }

+ 13 - 0
src/main/java/com/style24/batch/biz/service/TsbStatisticsService.java

@@ -165,4 +165,17 @@ public class TsbStatisticsService {
 		}
 	}
 
+	@Transactional("shopTxnManager")
+	public void createStatCust(String currDay) {
+		statisticsDao.createStatCustAll(currDay);
+		statisticsDao.createStatCustDorm(currDay);
+		statisticsDao.createStatCustExt(currDay);
+		statisticsDao.createStatCustJoin(currDay);
+		statisticsDao.createStatCust(currDay);
+	}
+
+	@Transactional("shopTxnManager")
+	public void createStatCustOrd(String currDay) {
+		statisticsDao.createStatCustOrd(currDay);
+	}
 }

+ 30 - 2
src/main/java/com/style24/batch/biz/task/TsbNaverPayTask.java

@@ -1,11 +1,22 @@
 package com.style24.batch.biz.task;
 
-import com.style24.batch.biz.job.naverpay.*;
-import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import com.style24.batch.biz.job.naverpay.TsbNaverPayOrderDecisionJob;
+import com.style24.batch.biz.job.naverpay.TsbNaverPayRecvOrderCancelCompleteJob;
+import com.style24.batch.biz.job.naverpay.TsbNaverPayRecvOrderCancelReqJob;
+import com.style24.batch.biz.job.naverpay.TsbNaverPayRecvOrderCompleteJob;
+import com.style24.batch.biz.job.naverpay.TsbNaverPayRecvOrderConfirmJob;
+import com.style24.batch.biz.job.naverpay.TsbNaverPayRecvOrderExchangeReqJob;
+import com.style24.batch.biz.job.naverpay.TsbNaverPayRecvOrderReturnReqJob;
+import com.style24.batch.biz.job.naverpay.TsbNaverPayRecvWdInvoiceNoJob;
+import com.style24.batch.biz.job.naverpay.TsbNaverPaySendReadyDeliveryJob;
+
+import lombok.extern.slf4j.Slf4j;
+
 /**
  *
  * 네이버페이 주문형 Task
@@ -40,6 +51,9 @@ public class TsbNaverPayTask {
 	@Autowired
 	private TsbNaverPayRecvWdInvoiceNoJob recvWdInvoiceNoJob;
 
+	@Autowired
+	private TsbNaverPayOrderDecisionJob naverPayOrderDecisionJob;
+
 	/**
 	 * 네이버페이 주문형 배치 실행
 	 *
@@ -92,4 +106,18 @@ public class TsbNaverPayTask {
 
 		// // 교환 반려 주문 정보 송신 > 관리자 교환반려 버튼 클릭시 송부로 변경 (완료)
 	}
+
+	/**
+	 * 네이버페이 결제형 구매확정
+	 *
+	 * @throws Exception
+	 * @author card007
+	 * @since 2021. 09. 23
+	 */
+	@Scheduled(cron = "${cron.naverPay.order.decision}")
+	// @Scheduled(fixedDelay = 3500000)
+	@Async
+	public void orderDecision() throws Exception {
+		naverPayOrderDecisionJob.runById("cron.naverPay.order.decision");
+	}
 }

+ 8 - 1
src/main/java/com/style24/batch/biz/task/TsbOrderTask.java

@@ -1,11 +1,18 @@
 package com.style24.batch.biz.task;
 
-import com.style24.batch.biz.job.order.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import com.style24.batch.biz.job.order.TsbCartAddCouponPushJob;
+import com.style24.batch.biz.job.order.TsbCartExpirationJob;
+import com.style24.batch.biz.job.order.TsbCartUnpurchasePushJob;
+import com.style24.batch.biz.job.order.TsbOrderDepositExpirationJob;
+import com.style24.batch.biz.job.order.TsbOrderDepositWaitingNotifyJob;
+import com.style24.batch.biz.job.order.TsbOrderGiftExpirationJob;
+import com.style24.batch.biz.job.order.TsbWishAddCouponPushJob;
+
 import lombok.extern.slf4j.Slf4j;
 
 /**

+ 29 - 10
src/main/java/com/style24/batch/biz/task/TsbStatisticsTask.java

@@ -1,19 +1,11 @@
 package com.style24.batch.biz.task;
 
+import com.style24.batch.biz.job.statistics.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
-import com.style24.batch.biz.job.statistics.TsbDateTimeOrderStaticsJob;
-import com.style24.batch.biz.job.statistics.TsbDayOrderStaticsJob;
-import com.style24.batch.biz.job.statistics.TsbInflowStatisticsJob;
-import com.style24.batch.biz.job.statistics.TsbInflowYesterdayStatisticsJob;
-import com.style24.batch.biz.job.statistics.TsbPayStaticsJob;
-import com.style24.batch.biz.job.statistics.TsbSalesSmsSendJob;
-import com.style24.batch.biz.job.statistics.TsbSalesUploadJob;
-import com.style24.batch.biz.job.statistics.TsbSubPayStaticsJob;
-
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -49,6 +41,12 @@ public class TsbStatisticsTask {
 	@Autowired
 	private TsbSalesUploadJob salesUploadJob;
 
+	@Autowired
+	private TsbCustStaticsJob custStaticsJob;
+
+	@Autowired
+	private TsbCustOrderStaticsJob custOrderStaticsJob;
+
 	/**
 	 * 초 분 시 일 월 주(년)
 	 * 0 0 12 * * ?" : 아무 요일, 매월, 매일 12:00:00
@@ -134,7 +132,7 @@ public class TsbStatisticsTask {
 	@Async
 	public void subPayStaticsJob() throws Exception {
 		//subPayStaticsJob.run("subPayStaticsJob");
-		payStaticsJob.runById("cron.statistics.pay.sub.create");
+		subPayStaticsJob.runById("cron.statistics.pay.sub.create");
 	}
 
 	/**
@@ -166,4 +164,25 @@ public class TsbStatisticsTask {
 		salesUploadJob.runById("cron.statistics.sales.upload");
 	}
 
+	/**
+	 * 회원통계
+	 */
+	//@Scheduled(fixedDelay = 999999999)
+	@Scheduled(cron = "${cron.statistics.customer.create}")
+	@Async
+	public void custStaticsJob() throws Exception {
+		//custStaticsJob.run("custStaticsJob");
+		custStaticsJob.runById("cron.statistics.customer.create");
+	}
+
+	/**
+	 * 회원주문통계
+	 */
+	//@Scheduled(fixedDelay = 999999999)
+	@Scheduled(cron = "${cron.statistics.customer.order.create}")
+	@Async
+	public void custOrderStaticsJob() throws Exception {
+		//custOrderStaticsJob.run("custOrderStaticsJob");
+		custOrderStaticsJob.runById("cron.statistics.customer.order.create");
+	}
 }

+ 36 - 30
src/main/java/com/style24/persistence/mybatis/shop/TsbCustomer.xml

@@ -859,19 +859,21 @@
 		    ORDER BY C.CUST_NO
 		<include refid="selectForPagingFooter"/>
 	</select>
-	
+
 	<!-- 넷퍼시메일솔루션 회원정보 Truncate - 운영DB -->
-	<delete id="truncateNetpathyMailCustomer">
+	<select id="truncateNetpathyMailCustomer" statementType="CALLABLE">
 		/* TsbCustomerDao.truncateNetpathyMailCustomer */
-		TRUNCATE TABLE STYLE24_MAILBATCH.NETPATHY_MEMBER
-	</delete>
-	
+		/* TRUNCATE TABLE STYLE24_MAILBATCH.NETPATHY_MEMBER */
+		{ CALL FN_INIT_TABLE('STYLE24_MAILBATCH.NETPATHY_MEMBER') }
+	</select>
+
 	<!-- 넷퍼시메일솔루션 회원정보 Truncate - 개발DB -->
-	<delete id="truncateNetpathyMailCustomerDev">
+	<select id="truncateNetpathyMailCustomerDev" statementType="CALLABLE">
 		/* TsbCustomerDao.truncateNetpathyMailCustomerDev */
-		TRUNCATE TABLE NETPATHY_MEMBER
-	</delete>
-	
+		/* TRUNCATE TABLE NETPATHY_MEMBER */
+		{ CALL FN_INIT_TABLE('NETPATHY_MEMBER') }
+	</select>
+
 	<!-- 넷퍼시메일솔루션 회원정보 생성 - 운영DB -->
 	<insert id="createNetpathyMailCustomer" timeout="600">
 		/* TsbCustomerDao.createNetpathyMailCustomer */
@@ -903,7 +905,7 @@
 		                                         AND CDA.DEFAULT_YN = 'Y' /*기본배송지*/
 		WHERE  CUST_STAT = 'G104_10' /*활동회원*/
 	</insert>
-	
+
 	<!-- 넷퍼시메일솔루션 회원정보 생성 - 개발DB -->
 	<insert id="createNetpathyMailCustomerDev" timeout="600">
 		/* TsbCustomerDao.createNetpathyMailCustomerDev */
@@ -935,19 +937,21 @@
 		                                         AND CDA.DEFAULT_YN = 'Y' /*기본배송지*/
 		WHERE  CUST_STAT = 'G104_10' /*활동회원*/
 	</insert>
-	
+
 	<!-- 넷퍼시메일솔루션 탈퇴/휴면회원정보 Truncate - 운영DB -->
-	<delete id="truncateNetpathyMailWithdrawalCustomer">
+	<select id="truncateNetpathyMailWithdrawalCustomer" statementType="CALLABLE">
 		/* TsbCustomerDao.truncateNetpathyMailWithdrawalCustomer */
-		TRUNCATE TABLE STYLE24_MAILBATCH.NETPATHY_WITHDRAWAL
-	</delete>
-	
+		/*TRUNCATE TABLE STYLE24_MAILBATCH.NETPATHY_WITHDRAWAL*/
+		{ CALL FN_INIT_TABLE('STYLE24_MAILBATCH.NETPATHY_WITHDRAWAL') }
+	</select>
+
 	<!-- 넷퍼시메일솔루션 탈퇴/휴면회원정보 Truncate - 개발DB -->
-	<delete id="truncateNetpathyMailWithdrawalCustomerDev">
+	<select id="truncateNetpathyMailWithdrawalCustomerDev" statementType="CALLABLE">
 		/* TsbCustomerDao.truncateNetpathyMailWithdrawalCustomerDev */
-		TRUNCATE TABLE NETPATHY_WITHDRAWAL
-	</delete>
-	
+		/*TRUNCATE TABLE NETPATHY_WITHDRAWAL*/
+		{ CALL FN_INIT_TABLE('NETPATHY_WITHDRAWAL') }
+	</select>
+
 	<!-- 넷퍼시메일솔루션 탈퇴/휴면회원정보 생성 - 운영DB -->
 	<insert id="createNetpathyMailWithdrawalCustomer" timeout="600">
 		/* TsbCustomerDao.createNetpathyMailWithdrawalCustomer */
@@ -972,7 +976,7 @@
 		     , DORMANT_DT AS REG_DT /*등록일시*/
 		FROM   TB_DORMANT_CUST
 	</insert>
-	
+
 	<!-- 넷퍼시메일솔루션 탈퇴/휴면회원정보 생성 - 개발DB -->
 	<insert id="createNetpathyMailWithdrawalCustomerDev" timeout="600">
 		/* TsbCustomerDao.createNetpathyMailWithdrawalCustomerDev */
@@ -997,19 +1001,21 @@
 		     , DORMANT_DT AS REG_DT /*등록일시*/
 		FROM   TB_DORMANT_CUST
 	</insert>
-	
+
 	<!-- 넷퍼시메일솔루션 회원포인트정보 Truncate - 운영DB -->
-	<delete id="truncateNetpathyMailCustomerPoint">
+	<select id="truncateNetpathyMailCustomerPoint" statementType="CALLABLE">
 		/* TsbCustomerDao.truncateNetpathyMailCustomerPoint */
-		TRUNCATE TABLE STYLE24_MAILBATCH.NETPATHY_POINT
-	</delete>
-	
+		/*TRUNCATE TABLE STYLE24_MAILBATCH.NETPATHY_POINT*/
+		{ CALL FN_INIT_TABLE('STYLE24_MAILBATCH.NETPATHY_POINT') }
+	</select>
+
 	<!-- 넷퍼시메일솔루션 회원포인트정보 Truncate - 개발DB -->
-	<delete id="truncateNetpathyMailCustomerPointDev">
+	<select id="truncateNetpathyMailCustomerPointDev" statementType="CALLABLE">
 		/* TsbCustomerDao.truncateNetpathyMailCustomerPointDev */
-		TRUNCATE TABLE NETPATHY_POINT
-	</delete>
-	
+		/* TRUNCATE TABLE NETPATHY_POINT */
+		{ CALL FN_INIT_TABLE('NETPATHY_POINT') }
+	</select>
+
 	<!-- 넷퍼시메일솔루션 회원포인트정보 생성 - 운영DB -->
 	<insert id="createNetpathyMailCustomerPoint" timeout="600">
 		/* TsbCustomerDao.createNetpathyMailCustomerPoint */
@@ -1034,7 +1040,7 @@
 		AND    C.CUST_STAT = 'G104_10' /*활동회원만*/
 		GROUP  BY CP.CUST_NO
 	</insert>
-	
+
 	<!-- 넷퍼시메일솔루션 회원포인트정보 생성 - 개발DB -->
 	<insert id="createNetpathyMailCustomerPointDev" timeout="600">
 		/* TsbCustomerDao.createNetpathyMailCustomerPointDev */

+ 4 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsbDelivery.xml

@@ -620,6 +620,7 @@
 			   AND NOT EXISTS (SELECT '1' FROM TB_GOODS_RES_SELL WHERE GOODS_CD = B.GOODS_CD AND USE_YN ='Y') 
 			   AND 'Y' = CASE WHEN B.GIFT_PACK_YN ='Y' AND B.GIFT_ADDR_INP_YN = 'N' THEN 'N' ELSE 'Y' END 
 			   AND A.ORD_DT <= DATE_ADD(NOW(), INTERVAL -30 SECOND) -- 30초 DELAY
+			   AND 'Y' = (SELECT BI.BIZDAY_YN FROM TB_BIZDAY BI WHERE BIZDAY  = DATE_FORMAT(NOW(),'%Y%m%d'))
 			   AND NOT EXISTS (
 			                SELECT 1
 			                  FROM TB_DELIVERY_ASSIGN
@@ -647,6 +648,7 @@
 			   AND 1 >= FN_GET_BIZDAYS(DATE_FORMAT(CASE WHEN E.WD_BF_SEND_YN = 'Y' THEN B.REG_DT ELSE D.COMPLETE_DT END, '%Y%m%d') , DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY ), '%Y%m%d'))
 			   AND CASE WHEN E.WD_BF_SEND_YN = 'Y' THEN B.REG_DT ELSE D.COMPLETE_DT END <= DATE_ADD(NOW(), INTERVAL -30 SECOND)
 			   AND NOT EXISTS (SELECT 1 FROM TB_EXCHANGE_DELV_FAIL WHERE ORD_NO = A.ORD_NO AND ORD_DTL_NO= D.CHG_ORD_DTL_NO AND ORD_CHG_SQ = D.ORD_CHG_SQ AND DELV_CNCL_YN ='N')
+			   AND 'Y' = (SELECT BI.BIZDAY_YN FROM TB_BIZDAY BI WHERE BIZDAY  = DATE_FORMAT(NOW(),'%Y%m%d'))
 			   AND NOT EXISTS (
 			                SELECT 1
 			                  FROM TB_DELIVERY_ASSIGN
@@ -671,6 +673,7 @@
 			   AND B.ORD_EXCH_GB   = 'O'       -- 주문 
 			   AND 1 >= FN_GET_BIZDAYS(DATE_FORMAT(CASE WHEN  A.ORD_DT < D.DELV_RES_DT THEN D.DELV_RES_DT ELSE A.ORD_DT END, '%Y%m%d') , DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY ), '%Y%m%d'))
 			   AND 'Y' = CASE WHEN B.GIFT_PACK_YN ='Y' AND B.GIFT_ADDR_INP_YN = 'N' THEN 'N' ELSE 'Y' END 
+			   AND 'Y' = (SELECT BI.BIZDAY_YN FROM TB_BIZDAY BI WHERE BIZDAY  = DATE_FORMAT(NOW(),'%Y%m%d'))
 			   AND NOT EXISTS (
 			                SELECT 1
 			                  FROM TB_DELIVERY_ASSIGN
@@ -1595,6 +1598,7 @@
 		 WHERE B.REASON_CODE IN ('08','10')
 		   AND A.RECALL_STAT ='P'
 		   AND NOT EXISTS (SELECT 1 FROM TB_EXCHANGE_DELV_FAIL WHERE ORD_NO = A.ORDER_NO AND ORD_DTL_NO= B.ORDER_DTL_NO) 
+		   AND  EXISTS (SELECT 1 FROM TB_ORDER_DETAIL OD WHERE OD.ORD_DTL_NO = B.ORDER_DTL_NO AND OD.ORD_DTL_STAT != 'G013_99')
 		 GROUP BY A.ORDER_NO 
 	</select>
 		

+ 4 - 2
src/main/java/com/style24/persistence/mybatis/shop/TsbDisplay.xml

@@ -4187,6 +4187,7 @@
 		         , BG.BRAND_GROUP_NO
 		         , CG.GOODS_CD
 		         , G.REG_DT
+		         , G.SELF_GOODS_YN 
 		    FROM   TB_CATE_4SRCH C4
 		         , TB_CATE_GOODS CG
 		         , TB_GOODS G
@@ -4220,11 +4221,12 @@
 		             , 0                                                 AS CATE_BGRP_NO
 		             , GOODS_CD
 		             , REG_DT
-		             , ROW_NUMBER() OVER(ORDER BY REG_DT DESC, GOODS_CD) AS RK
+		             , ROW_NUMBER() OVER(ORDER BY SELF_GOODS_YN DESC, REG_DT DESC, GOODS_CD) AS RK
 		        FROM   (
 		                SELECT DISTINCT
 		                       GOODS_CD
 		                     , REG_DT
+		                     , SELF_GOODS_YN
 		                FROM   TAB_BASE
 		               ) Z
 		        UNION ALL
@@ -4234,7 +4236,7 @@
 		             , GOODS_CD
 		             , REG_DT
 		             , ROW_NUMBER() OVER(PARTITION BY CATE1_NO
-		                                 ORDER BY REG_DT DESC, GOODS_CD) AS RK
+		                                 ORDER BY SELF_GOODS_YN DESC, REG_DT DESC, GOODS_CD) AS RK
 		        FROM   TAB_BASE
 		        UNION ALL
 		        /*브랜드메인에 노출할 브랜드그룹별 최근등록된 상품 100개*/

+ 9 - 16
src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml

@@ -503,10 +503,7 @@
 		    AND    CPR.DEL_YN = 'N'
 		)
 		, CTE_DETAIL AS (
-		        SELECT CP.CPN_REFVAL_SQ
-		             , CPR.CPN_ID
-		             , CPR.REF_VAL
-		             , G.GOODS_CD GKEY
+		        SELECT CPR.CPN_ID
 		             , G.GOODS_CD
 		        FROM   CTE CP
 		        INNER  JOIN TB_COUPON_REFVAL CPR 
@@ -516,10 +513,7 @@
 		        WHERE  CPR.CPN_TARGET = 'G260_10' -- 적용상품
 		        UNION
 		        /* 적용대상:카테고리*/
-		        SELECT CP.CPN_REFVAL_SQ
-		             , CPR.CPN_ID
-		             , CPR.REF_VAL
-		             , G.GOODS_CD GKEY
+		        SELECT CPR.CPN_ID
 		             , G.GOODS_CD
 		        FROM   CTE CP
 		        INNER  JOIN TB_COUPON_REFVAL CPR 
@@ -570,19 +564,16 @@
 		        AND IFNULL(REF_BRAND_CD,G.BRAND_CD) = G.BRAND_CD
 		        UNION
 		        /* 적용대상:브랜드, 공급업체 */
-		        SELECT CP.CPN_REFVAL_SQ
-				     , CPR1.CPN_ID
-				     , CPR1.REF_VAL
-				     , G1.BRAND_CD GKEY
+		        SELECT CPR1.CPN_ID
 				     , G1.GOODS_CD
 				FROM   CTE CP
-				INNER  JOIN TB_COUPON_REFVAL CPR1 
-				ON     CP.CPN_ID = CPR1.CPN_ID
+				INNER  JOIN TB_COUPON_REFVAL CPR1
+				ON     CP.CPN_REFVAL_SQ = CPR1.CPN_REFVAL_SQ
 				INNER  JOIN TB_GOODS G1 
 				ON     CPR1.REF_VAL = G1.BRAND_CD
 				AND    CPR1.CPN_TARGET = 'G260_12'
-				INNER  JOIN TB_COUPON_REFVAL CPR2 
-				ON     CP.CPN_ID = CPR2.CPN_ID
+				INNER  JOIN TB_COUPON_REFVAL CPR2
+				ON     CP.CPN_REFVAL_SQ = CPR2.CPN_REFVAL_SQ
 				INNER  JOIN TB_GOODS G2
 				ON     CPR2.REF_VAL = G2.SUPPLY_COMP_CD
 				AND    CPR2.CPN_TARGET = 'G260_13'
@@ -590,6 +581,8 @@
 				AND    IFNULL(CPR1.REF_FORMAL_GB, G1.FORMAL_GB) = G1.FORMAL_GB
 				AND    CPR1.CPN_ID = CPR2.CPN_ID
 				AND    G1.GOODS_CD = G2.GOODS_CD
+				GROUP  BY CPR1.CPN_ID
+				     , G1.GOODS_CD
 		 )
 		SELECT GOODS_CD
 		     , 'G100_00' AS CUST_GB

+ 27 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsbGoodsEp.xml

@@ -914,9 +914,35 @@
 		<include refid="selectForPagingFooter"/>
 	</select>
 	
+	<!-- 네이버 판매지수EP 총건수 -->
+	<select id="getNaverSellEpTotalCount" resultType="int">
+		/* TsbGoodsEp.getNaverSellEpTotalCount */
+		SELECT COUNT(*) AS CNT
+		FROM   (
+		        SELECT DATE_FORMAT(DATE_ADD(CURRENT_DATE(),INTERVAL -1 DAY),'%Y-%m-%d') AS DT          /*일자*/
+		             , OD.GOODS_CD                                                      AS ID          /*상품ID*/
+		             , SUM(OD.ORD_QTY - OD.CNCL_RTN_QTY)                                AS SALE_COUNT  /*판매수량*/
+		             , SUM(OD.ORD_AMT - OD.CNCL_RTN_AMT)                                AS SALE_PRICE  /*판매금액*/
+		             , COUNT(DISTINCT OD.ORD_NO)                                        AS ORDER_COUNT /*주문수량*/
+		        FROM   TB_ORDER O
+		             , TB_ORDER_DETAIL OD
+		        WHERE  O.ORD_NO = OD.ORD_NO
+		        AND    O.PAY_DT <![CDATA[>]]> DATE_ADD(CURRENT_DATE(), INTERVAL -2 DAY)
+		        AND    O.PAY_DT <![CDATA[<]]> CURRENT_DATE()
+		        AND    OD.ORD_DTL_STAT IN ('G013_20','G013_30','G013_35','G013_40','G013_50','G013_55','G013_60','G013_70')
+		        AND    OD.AF_LINK_CD IN (SELECT AF_LINK_CD
+		                                 FROM   TB_AF_LINK
+		                                 WHERE  AF_CHANNEL = 'G053_02' /*네이버*/
+		                                 AND    USE_YN = 'Y'
+		                                )
+		        GROUP  BY DATE_FORMAT(DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY),'%Y-%m-%d'), OD.GOODS_CD
+		       ) Z
+	</select>
+	
 	<!-- 네이버 판매지수EP 목록 -->
 	<select id="getNaverSellEpList" resultType="GoodsEp">
 		/* TsbGoodsEp.getNaverSellEpList */
+		<include refid="selectForPagingHeader"/>
 		SELECT DATE_FORMAT(DATE_ADD(CURRENT_DATE(),INTERVAL -1 DAY),'%Y-%m-%d') AS DT          /*일자*/
 		     , OD.GOODS_CD                                                      AS ID          /*상품ID*/
 		     , SUM(OD.ORD_QTY - OD.CNCL_RTN_QTY)                                AS SALE_COUNT  /*판매수량*/
@@ -934,6 +960,7 @@
 		                         AND    USE_YN = 'Y'
 		                        )
 		GROUP  BY DATE_FORMAT(DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY),'%Y-%m-%d'), OD.GOODS_CD
+		<include refid="selectForPagingFooter"/>
 	</select>
 	
 	<!-- EP다음 정보 삭제 -->

+ 5 - 4
src/main/java/com/style24/persistence/mybatis/shop/TsbGoodsSearch.xml

@@ -3,13 +3,14 @@
 <mapper namespace="com.style24.batch.biz.dao.TsbGoodsSearchDao">
 
 	<!-- 상품검색 temp 테이블 삭제 -->
-	<delete id="deleteGoodsSearchTemp" timeout="600">
+	<select id="deleteGoodsSearchTemp" timeout="600" statementType="CALLABLE">
 		/* TsbGoodsSearch.deleteGoodsSearchTemp */
-		TRUNCATE TABLE TB_GOODS_SEARCH_TEMP
-	</delete>
+		/* TRUNCATE TABLE TB_GOODS_SEARCH_TEMP */
+		{ CALL FN_INIT_TABLE('TB_GOODS_SEARCH_TEMP') }
+	</select>
 
 	<!-- 상품검색 temp 상품기본정보 생성 -->
-	<insert id="createGoodsSearchTempByGoods"  parameterType="String" timeout="600">
+	<insert id="createGoodsSearchTempByGoods"  parameterType="String"  timeout="600">
 		/* TsbGoods.createGoodsSearchTempByGoods */
 		INSERT INTO TB_GOODS_SEARCH_TEMP (
 		      GOODS_CD

+ 33 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsbOrder.xml

@@ -69,4 +69,37 @@
 		AND    P.PAY_STAT = 'G016_10'
 		AND    CAST(P.VA_DEADLINE AS DATE) = CAST(NOW() AS DATE)
 	</select>
+	
+	<!-- 네이버페이 결제형 구매확정 대상 리스트 조회 -->
+	<select id="getNaverPayOrderDecisionList" resultType="Order">
+		/* TsbOrder.getNaverPayOrderDecisionList */
+		SELECT P.ORD_NO
+		     , P.PG_TID
+		  FROM TB_PAYMENT P
+		  INNER JOIN TB_ORDER_DETAIL OD
+		  ON P.ORD_NO = OD.ORD_NO
+		 WHERE P.PG_GB = 'NAVER'
+		   AND P.PAY_GB = 'O'
+		   AND P.PAY_STAT = 'G016_30'
+		   AND P.PAY_AMT <![CDATA[>]]> 0
+		   AND OD.ORD_EXCH_GB = 'O'
+		   AND OD.ORD_DTL_STAT IN ('G013_50', 'G013_60', 'G013_70')
+		   AND P.NPAY_DECISION_YN = 'N'
+		   AND P.PAY_DT <![CDATA[>]]> DATE_ADD(CURRENT_DATE, INTERVAL -15 DAY)
+		 GROUP BY P.ORD_NO, P.PG_TID
+	</select>
+	
+	<!-- 네이버페이 결제형 구매확정 여부 수정 -->
+	<update id="updateNaverPayOrderDecision" parameterType="Order">
+		/* TsbOrder.updateNaverPayOrderDecision */
+		UPDATE TB_PAYMENT
+		   SET NPAY_DECISION_YN = 'Y'
+		     , UPD_NO = 99999
+		     , UPD_DT = NOW()
+		 WHERE ORD_NO = #{ordNo}
+		   AND NPAY_DECISION_YN = 'N'
+		   AND PAY_STAT = 'G016_30'
+		   AND PAY_GB = 'O'
+		   AND PAY_AMT <![CDATA[>]]> 0
+	</update>
 </mapper>

+ 552 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsbStatistics.xml

@@ -1127,4 +1127,556 @@
 		AND    CD_SIZE = #{CD_SIZE}
 	</update>
 
+	<!-- 전체회원 -->
+	<insert id="createStatCustAll" parameterType="String" timeout="6000">
+		/* TsbStatistics.createStatCustAll */
+		INSERT INTO TB_STAT_CUST_ALL (DAY, SEX_GB, AGE, CUST_STAT, CUST_GRADE, CUST_CNT)
+		SELECT
+			DATE_FORMAT(#{currDay},'%Y-%m-%d') AS DAY
+			, IFNULL(FN_DEC_AES(SEX_GB), 'G007_X') AS SEX_GB
+			, 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
+			, CUST_STAT
+			, CUST_GRADE
+			, COUNT(1) AS CNT
+		FROM TB_CUSTOMER
+		WHERE CUST_NO > 0
+			AND JOIN_DT >= DATE_FORMAT('20060101', '%Y%m%d')
+			AND JOIN_DT &lt;= DATE_FORMAT(CONCAT(#{currDay},'235959'), '%Y%m%d%h%i%s')
+		GROUP BY DAY, SEX_GB, AGE, CUST_STAT, CUST_GRADE
+	</insert>
+
+	<!-- 전체휴면회원 -->
+	<insert id="createStatCustDorm" parameterType="String" timeout="6000">
+		/* TsbStatistics.createStatCustDorm */
+		INSERT INTO TB_STAT_CUST_DORM (DAY, SEX_GB, AGE, CUST_CNT)
+		SELECT
+			DAY
+			, SEX_GB
+			, AGE
+			, SUM(CNT) AS CNT
+		FROM (
+			SELECT
+				DATE_FORMAT(DORMANT_DT,'%Y-%m-%d') AS DAY
+				, IFNULL(FN_DEC_AES(SEX_GB), 'G007_X') AS SEX_GB
+				, 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
+				, COUNT(1) AS CNT
+			FROM TB_DORMANT_CUST
+			WHERE CUST_NO > 0
+				AND DORMANT_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d')
+				AND DORMANT_DT &lt;= DATE_FORMAT(CONCAT(#{currDay},'235959'), '%Y%m%d%h%i%s')
+			GROUP BY DAY, SEX_GB, AGE
+			UNION ALL
+			SELECT
+				DATE_FORMAT(RM_DORMANT_DT,'%Y-%m-%d') AS DAY
+				, IFNULL(FN_DEC_AES(SEX_GB), 'G007_X') AS SEX_GB
+				, 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
+				, COUNT(1) * -1 AS CNT
+			FROM TB_CUSTOMER
+			WHERE CUST_NO > 0
+				AND RM_DORMANT_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d')
+				AND RM_DORMANT_DT &lt;= DATE_FORMAT(CONCAT(#{currDay},'235959'), '%Y%m%d%h%i%s')
+			GROUP BY DAY, SEX_GB, AGE
+			UNION ALL
+			SELECT
+				DATE_FORMAT(#{currDay}, '%Y-%m-%d') AS DAY
+				, SEX_GB
+				, AGE
+				,SUM(DORM_CNT) AS CNT
+			FROM TB_STAT_CUST
+			WHERE DAY = DATE_ADD(DATE_FORMAT(#{currDay}, '%Y%m%d'), INTERVAL -1 DAY)
+			GROUP BY DAY, SEX_GB, AGE
+		) Z
+		GROUP BY DAY, SEX_GB, AGE
+	</insert>
+
+	<!-- 휴면탈퇴회원 -->
+	<insert id="createStatCustExt" parameterType="String" timeout="6000">
+		/* TsbStatistics.createStatCustExt */
+		INSERT INTO TB_STAT_CUST_EXT (DAY, SEX_GB, AGE, GB, CUST_CNT)
+		SELECT
+			DATE_FORMAT(DORMANT_DT,'%Y-%m-%d') AS DAY
+			, IFNULL(FN_DEC_AES(SEX_GB), 'G007_X') AS SEX_GB
+			, 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
+			, 'A' AS GB
+			, COUNT(1) AS CNT
+		FROM TB_DORMANT_CUST
+		WHERE CUST_NO > 0
+			AND DORMANT_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d')
+			AND DORMANT_DT &lt;= DATE_FORMAT(CONCAT(#{currDay},'235959'), '%Y%m%d%h%i%s')
+		GROUP BY DAY, SEX_GB, AGE
+		UNION ALL
+		SELECT
+			DATE_FORMAT(RM_DORMANT_DT,'%Y-%m-%d') AS DAY
+			, IFNULL(FN_DEC_AES(SEX_GB), 'G007_X') AS SEX_GB
+			, 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
+			, 'B' AS GB
+			, COUNT(1) AS CNT
+		FROM TB_CUSTOMER
+		WHERE CUST_NO > 0
+			AND RM_DORMANT_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d')
+			AND RM_DORMANT_DT &lt;= DATE_FORMAT(CONCAT(#{currDay},'235959'), '%Y%m%d%h%i%s')
+		GROUP BY DAY, SEX_GB, AGE
+		UNION ALL
+		SELECT
+			DATE_FORMAT(SECEDE_DT,'%Y-%m-%d') AS DAY
+			, IFNULL(FN_DEC_AES(SEX_GB), 'G007_X') AS SEX_GB
+			, 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
+			, 'C' AS GB
+			, COUNT(1) AS CNT
+		FROM TB_SECEDE_CUST A
+		WHERE CUST_NO > 0
+		AND SECEDE_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d')
+		AND SECEDE_DT &lt;= DATE_FORMAT(CONCAT(#{currDay},'235959'), '%Y%m%d%h%i%s')
+		GROUP BY DAY, SEX_GB, AGE
+	</insert>
+
+	<!-- 가입회원 -->
+	<insert id="createStatCustJoin" parameterType="String" timeout="6000">
+		/* TsbStatistics.createStatCustJoin */
+		INSERT INTO TB_STAT_CUST_JOIN (DAY, SEX_GB, AGE, DIRECT_YN, CUST_CNT)
+		SELECT
+			DATE_FORMAT(JOIN_DT,'%Y-%m-%d') AS DAY
+			, IFNULL(FN_DEC_AES(SEX_GB), 'G007_X') AS SEX_GB
+			, 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
+			, CASE WHEN (SELECT COUNT(1) FROM TB_AF_LINK X WHERE X.AF_LINK_CD = A.AF_LINK_CD AND X.AF_CHANNEL = 'G053_01') > 0 THEN 'Y' ELSE 'N' END AS DIRECT_YN
+			, COUNT(1) AS CNT
+		FROM TB_CUSTOMER A
+		WHERE CUST_NO > 0
+		AND JOIN_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d')
+		AND JOIN_DT &lt;= DATE_FORMAT(CONCAT(#{currDay},'235959'), '%Y%m%d%h%i%s')
+		GROUP BY DAY, SEX_GB, AGE, DIRECT_YN
+	</insert>
+
+	<!-- 회원통계 -->
+	<insert id="createStatCust" parameterType="String" timeout="6000">
+		/* TsbStatistics.createStatCust */
+		INSERT INTO TB_STAT_CUST (DAY, SEX_GB, AGE, ALL_CNT, REAL_CNT, DORM_CNT, VIP_CNT, GOLD_CNT, SILVER_CNT, BRONZE_CNT, WELCOME_CNT, JOIN_CNT, DR_JOIN_CNT, AF_JOIN_CNT, CHG_DORM_CNT, RM_DORM_CNT, SECEED_CNT)
+		SELECT
+			DAY
+			 , SEX_GB
+			 , AGE
+			 , IFNULL(SUM(CASE WHEN GB = '1' THEN CUST_CNT ELSE 0 END), 0) AS ALL_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '2' THEN CUST_CNT ELSE 0 END), 0) AS REAL_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '3' THEN CUST_CNT ELSE 0 END), 0) AS DORM_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '4' THEN CUST_CNT ELSE 0 END), 0) AS VIP_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '5' THEN CUST_CNT ELSE 0 END), 0) AS GOLD_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '6' THEN CUST_CNT ELSE 0 END), 0) AS SILVER_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '7' THEN CUST_CNT ELSE 0 END), 0) AS BRONZE_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '8' THEN CUST_CNT ELSE 0 END), 0) AS WELCOME_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '9' THEN CUST_CNT ELSE 0 END), 0) AS JOIN_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '10' THEN CUST_CNT ELSE 0 END), 0) AS DR_JOIN_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '11' THEN CUST_CNT ELSE 0 END), 0) AS AF_JOIN_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '12' THEN CUST_CNT ELSE 0 END), 0) AS CHG_DORM_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '13' THEN CUST_CNT ELSE 0 END), 0) AS RM_DORM_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '14' THEN CUST_CNT ELSE 0 END), 0) AS SECEED_CNT
+		FROM (
+				 -- 전체회원
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '1'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_ALL
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- 실회원
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '2'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_ALL
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND CUST_STAT = 'G104_10'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- 휴면회원
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '3'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_DORM
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- VIP
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '4'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_ALL
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND CUST_STAT = 'G104_10'
+				   AND CUST_GRADE = 'G110_10'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- GOLD
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '5'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_ALL
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND CUST_STAT = 'G104_10'
+				   AND CUST_GRADE = 'G110_20'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- SILVER
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '6'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_ALL
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND CUST_STAT = 'G104_10'
+				   AND CUST_GRADE = 'G110_30'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- BRONZE
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '7'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_ALL
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND CUST_STAT = 'G104_10'
+				   AND CUST_GRADE = 'G110_40'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- WELCOME
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '8'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_ALL
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND CUST_STAT = 'G104_10'
+				   AND CUST_GRADE = 'G110_50'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- 가입수
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '9'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_JOIN
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- 직방문가입수
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '10'                         AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_JOIN
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND DIRECT_YN = 'Y'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- 제휴가입수
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '11'                         AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_JOIN
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND DIRECT_YN = 'N'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- 휴면전환
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '12'                         AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_EXT
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND GB = 'A'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- 휴면해제
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '13'                         AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_EXT
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND GB = 'B'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- 탈퇴
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '14'                         AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_EXT
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND GB = 'C'
+				 GROUP BY DAY, SEX_GB, AGE
+			 ) Z
+		GROUP BY DAY, SEX_GB, AGE
+	</insert>
+
+	<!-- 회원주문통계 -->
+	<insert id="createStatCustOrd" parameterType="String" timeout="600">
+		/* TsbStatistics.createStatCustOrd */
+		INSERT INTO TB_STAT_CUST_ORD (DAY, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE, SELL_QTY, ORD_AMT, CNCL_QTY, RTN_QTY, CNCL_AMT, RTN_AMT, ORD_CNT)
+		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
+					, IFNULL(FN_DEC_AES(E.SEX_GB), 'G007_X')                            AS SEX_GB
+					, 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                                                  AS AGE
+					, 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 >= DATE_FORMAT(#{currDay}, '%Y%m%d')                         -- 시작일변수
+					AND A.PAY_DT &lt;= DATE_FORMAT(CONCAT(#{currDay}, '235959'), '%Y%m%d%H%i%s') -- 종료일변수
+					AND A.MALL_GB = 'G011_10'
+					AND B.ORD_EXCH_GB = 'O'
+					AND B.ORD_DTL_STAT = 'G013_20' -- 결제완료
+				) A
+				WHERE RNK = 1
+		)
+		-- 판매수
+		, TAB_SELL_QTY AS (
+			SELECT
+				DATE_FORMAT(PAY_DT, '%Y-%m-%d') AS TERM
+				, SUM(ORD_QTY) AS VAL
+				, '1' AS GBN
+				, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+			FROM TAB
+			GROUP BY TERM, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+		)
+		-- 매출
+		, TAB_ORD AS (
+			SELECT
+				DATE_FORMAT(PAY_DT, '%Y-%m-%d') AS TERM
+				, 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
+				, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+			FROM TAB A
+			GROUP BY TERM, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+		)
+		-- 취소갯수
+		, TAB_CNCL_QTY AS (
+			SELECT DATE_FORMAT(COMPLETE_DT, '%Y-%m-%d') AS TERM
+				, SUM(CHG_QTY) AS VAL
+				, '3' AS GBN
+				, C.FRONT_GB, BRAND_CD, ITEMKIND_CD
+				, IFNULL(FN_DEC_AES(G.SEX_GB), 'G007_X') AS SEX_GB
+				, 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                                                  AS AGE
+				, CUST_GRADE
+			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 >= DATE_FORMAT(#{currDay}, '%Y%m%d') -- 시작일변수
+				AND COMPLETE_DT &lt;= DATE_FORMAT(CONCAT(#{currDay}, '235959'), '%Y%m%d%H%i%s') -- 종료일변수
+				AND MALL_GB = 'G011_10'
+			GROUP BY TERM, C.FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+		)
+		-- 반품갯수
+		, TAB_RTN_QTY AS (
+			SELECT DATE_FORMAT(COMPLETE_DT, '%Y-%m-%d') AS TERM
+				, SUM(CHG_QTY) AS VAL
+				, '4' AS GBN
+				, C.FRONT_GB, BRAND_CD, ITEMKIND_CD
+				, IFNULL(FN_DEC_AES(G.SEX_GB), 'G007_X') AS SEX_GB
+				, 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                                                  AS AGE
+				, CUST_GRADE
+			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 >= DATE_FORMAT(#{currDay}, '%Y%m%d') -- 시작일변수
+				AND COMPLETE_DT &lt;= DATE_FORMAT(CONCAT(#{currDay}, '235959'), '%Y%m%d%H%i%s') -- 종료일변수
+				AND MALL_GB = 'G011_10'
+			GROUP BY TERM, C.FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+		)
+		-- 취소액
+		, TAB_CNCL_AMT AS (
+			SELECT DATE_FORMAT(COMPLETE_DT, '%Y-%m-%d') AS TERM
+				, 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.FRONT_GB, BRAND_CD, ITEMKIND_CD
+				, IFNULL(FN_DEC_AES(G.SEX_GB), 'G007_X') AS SEX_GB
+				, 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                                                  AS AGE
+				, CUST_GRADE
+			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 >= DATE_FORMAT(#{currDay}, '%Y%m%d') -- 시작일변수
+				AND B.COMPLETE_DT &lt;= DATE_FORMAT(CONCAT(#{currDay}, '235959'), '%Y%m%d%H%i%s') -- 종료일변수
+				AND MALL_GB = 'G011_10'
+			GROUP BY TERM, D.FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+		)
+		-- 반품액
+		, TAB_RTN_AMT AS (
+			SELECT DATE_FORMAT(COMPLETE_DT, '%Y-%m-%d') AS TERM
+				, 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.FRONT_GB, BRAND_CD, ITEMKIND_CD
+				, IFNULL(FN_DEC_AES(G.SEX_GB), 'G007_X') AS SEX_GB
+				, 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                                                  AS AGE
+				, CUST_GRADE
+			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 >= DATE_FORMAT(#{currDay}, '%Y%m%d') -- 시작일변수
+				AND B.COMPLETE_DT &lt;= DATE_FORMAT(CONCAT(#{currDay}, '235959'), '%Y%m%d%H%i%s') -- 종료일변수
+				AND MALL_GB = 'G011_10'
+			GROUP BY TERM, D.FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+		)
+		-- 주문수
+		, TAB_ORD_CNT AS (
+			SELECT
+				TERM
+				, SUM(VAL) AS VAL
+				, '7' AS GBN
+				, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+			FROM (
+				SELECT
+					DATE_FORMAT(PAY_DT, '%Y-%m-%d') AS TERM
+					, 1 AS VAL
+					, ORD_NO
+					, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+				FROM TAB
+				GROUP BY TERM, ORD_NO, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+			) A
+			GROUP BY TERM, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+		)
+		SELECT
+			TERM
+			, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+			, SELL_QTY, ORD_AMT, CNCL_QTY, RTN_QTY, CNCL_AMT, RTN_AMT
+			, ORD_CNT
+		FROM (
+			SELECT
+				TERM
+				, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+				, 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 TERM, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+		) X
+	</insert>
 </mapper>

+ 3 - 3
src/main/java/com/style24/persistence/mybatis/wms/TsbWmsDelivery.xml

@@ -50,7 +50,7 @@
 		  FROM iSTYLE24_WmsIf.DBO.TB_IF_RecallException
 		WHERE 1=1
 		  AND IfStat = '0'
-		  AND StatusCd = '대기'
+		--   AND StatusCd = '대기'
 	</select>
 	
 	<!-- WMS_IF 회수예외 목록 -D -->	
@@ -78,7 +78,7 @@
 		   AND A.DeliveryOrderItemNo = C.DeliveryOrderItemNo 
 		   AND A.SKUCode  = C.SKUCode 
 		   AND A.IfStat = 0
-		   AND B.StatusCd = '대기'
+		--   AND B.StatusCd = '대기'
 	</select>
 	
 	
@@ -98,7 +98,7 @@
 		  FROM iSTYLE24_WmsIf.DBO.TB_IF_RecallExceptionMemo A, iSTYLE24_WmsIf.DBO.TB_IF_RecallException B
 		 WHERE A.RecallExceptionNo = B.RecallExceptionNo
 		   AND A.IfStat = 0
-		   AND B.StatusCd = '대기'
+		 --  AND B.StatusCd = '대기'
 	</select>
 	
 	

+ 1 - 0
src/main/resources/config/application-brdg.yml

@@ -139,6 +139,7 @@ cron:
     #네이버페이
     naverPay.order.batch: 2 22 2 29 2 ?                  #네이버페이 배치 실행 (20분배치)
     #naverPay.order.batch: 0 0/20 * 1/1 * *               #네이버페이 배치 실행 (20분배치). 네이버페이 검증 완료 후 access.license와 secret.key 설정 후 주석 해제
+    naverPay.order.decision: 2 22 2 29 2 ?              #네이버페이 결제형 구매확정
 
     #통계
     statistics:

+ 3 - 0
src/main/resources/config/application-locd.yml

@@ -146,6 +146,7 @@ cron:
 
     #네이버페이
     naverPay.order.batch: 2 22 2 29 2 ?                 #네이버페이 배치 실행 (20분배치)
+    naverPay.order.decision: 2 22 2 29 2 ?              #네이버페이 결제형 구매확정
 
     #통계
     statistics:
@@ -158,6 +159,8 @@ cron:
         sales.sms.send1: 2 22 2 29 2 ?                 #매출문자발송 (평일은 저녁 8시30분, 11시30분)
         sales.sms.send2: 2 22 2 29 2 ?                 #매출문자발송 (주말(토/일)은 오전 10시, 오후 2시, 6시, 저녁 10시)
         sales.upload: 2 22 2 29 2 ?                    #매출반영
+        customer.create: 2 22 2 29 2 ?                 #회원통계
+        customer.order.create: 2 22 2 29 2 ?           #회원주문통계
 
     #모니터링
     monitoring:

+ 1 - 0
src/main/resources/config/application-locp.yml

@@ -146,6 +146,7 @@ cron:
 
     #네이버페이
     naverPay.order.batch: 2 22 2 29 2 ?                 #네이버페이 배치 실행 (20분배치)
+    naverPay.order.decision: 2 22 2 29 2 ?              #네이버페이 결제형 구매확정
 
     #통계
     statistics:

+ 4 - 1
src/main/resources/config/application-style.yml

@@ -139,18 +139,21 @@ cron:
 
     #네이버페이
     naverPay.order.batch: 2 22 2 29 2 ?                  #네이버페이 배치 실행
+    naverPay.order.decision: 0 46 11 * * *               #네이버페이 결제형 구매확정 (1일 1회)
 
     #통계
     statistics:
         aflink.inflow.create: 0 16 * * * *             #유입통계 (1시간 1회)
         aflink.inflow.yesterday.create: 2 22 2 29 2 ?  #어제일자유입통계
         order.daily.create: 0 20 1 * * *               #주문일자별통계
-        order.datetime.create: 0 10 * * * ?            #주문시간대별통계 (매시간)
+        order.datetime.create: 0 10 * * * *            #주문시간대별통계 (매시간)
         pay.create: 0 25 0 * * *                       #결제수단통계
         pay.sub.create: 0 55 0 * * *                   #부결제수단통계
         sales.sms.send1: 0 30 20,23 * * MON-FRI        #매출문자발송 (평일은 저녁 8시30분, 11시30분)
         sales.sms.send2: 0 0 10,14,18,22 * * SAT,SUN   #매출문자발송 (주말(토/일)은 오전 10시, 오후 2시, 6시, 저녁 10시)
         sales.upload: 0 0 6 * * *                      #매출반영 (매일 아침 6시)
+        customer.create: 0 0 3 * * *                   #회원통계
+        customer.order.create: 0 30 3 * * *            #회원주문통계
 
     #모니터링
     monitoring:

+ 2 - 0
src/main/resources/config/application.yml

@@ -33,6 +33,7 @@ naver:
         approvePaymentUrl: /naverpay/payments/v2/apply/payment
         paymentOrderUrl: /naverpay/payments/v2/list/history
         cancelPaymentUrl: /naverpay/payments/v1/cancel
+        decideOrderUrl: /naverpay/payments/v1/purchase-confirm
 
 # 네이버페이 API
 naverPay:
@@ -44,6 +45,7 @@ naverPay:
     approvePaymentUrl: /naverpay/payments/v2/apply/payment
     paymentOrderUrl: /naverpay/payments/v2/list/history
     cancelPaymentUrl: /naverpay/payments/v1/cancel
+    decideOrderUrl: /naverpay/payments/v1/purchase-confirm
 
 # 핑거푸시
 fingerPush: