فهرست منبع

매출반영 추가

gagamel 4 سال پیش
والد
کامیت
d5ec4ca1d1

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

@@ -1,8 +1,14 @@
 package com.style24.batch.biz.dao;
 
+import java.util.Collection;
+import java.util.Map;
+
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Erp;
 import com.style24.persistence.domain.SalesSms;
 
+import com.gagaframework.web.parameter.GagaMap;
+
 /**
  * 통계 Dao
  *
@@ -35,4 +41,40 @@ public interface TsbStatisticsDao {
 	 * @since 2021. 8. 14
 	 */
 	SalesSms getCurrentDaySalesSms();
+
+	/**
+	 * 어제일자 매출반영목록 생성
+	 * @param erpGb - ERP구분(hsmk:한세MK, hsdr:한세드림)
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 8. 27
+	 */
+	int createYesterdaySalesUploadList(String erpGb);
+
+	/**
+	 * 매출반영 총건수
+	 * @param erpGb - ERP구분(hsmk:한세MK, hsdr:한세드림)
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 8. 27
+	 */
+	int getSalesUploadTotalCount(String erpGb);
+
+	/**
+	 * 매출반영 목록
+	 * @param erp - ERP 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 8. 27
+	 */
+	public Collection<GagaMap> getSalesUploadList(Erp erp);
+
+	/**
+	 * 매출반영결과 처리
+	 * @param paramMap - 매출결과 정보
+	 * @author gagamel
+	 * @since 2021. 8. 27
+	 */
+	void updateSalesUploadResult(Map<String, Object> paramMap);
+
 }

+ 103 - 0
src/main/java/com/style24/batch/biz/job/statistics/TsbSalesUploadJob.java

@@ -0,0 +1,103 @@
+package com.style24.batch.biz.job.statistics;
+
+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.TsbStatisticsService;
+import com.style24.core.biz.thirdparty.HansaeErp;
+import com.style24.persistence.domain.Erp;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.parameter.GagaMap;
+
+/**
+ * ERP 매출반영
+ *
+ * @author gagamel
+ * @since 2021. 8. 27
+ */
+@Component
+@Slf4j
+public class TsbSalesUploadJob extends TsbAbstractJob<String, String, String> {
+
+	@Autowired
+	private TsbStatisticsService statisticsService;
+
+	@Autowired
+	private HansaeErp hansaeErp;
+
+	private static final int PAGE_SIZE = 1000;
+
+	@Override
+	public String read() throws Exception {
+		// 어제일자 매출반영목록 생성 (한세드림)
+		statisticsService.createYesterdaySalesUploadList(HansaeErp.ErpGb.HANSAE_DR.value());
+
+//		// 어제일자 매출반영목록 생성 (한세드림)
+//		statisticsService.createYesterdaySalesUploadList(HansaeErp.ErpGb.HANSAE_MK.value());
+
+		return "OK";
+	}
+
+	@Override
+	public String process(String result) throws Exception {
+		// 한세드림 매출반영
+		this.uploadSales(HansaeErp.ErpGb.HANSAE_DR.value());
+
+//		// 한세MK 매출반영
+//		this.uploadSales(HansaeErp.ErpGb.HANSAE_MK.value());
+
+		return "OK";
+	}
+
+	@Override
+	public String write(String result) throws Exception {
+		return "OK";
+	}
+
+	@Override
+	public void notify(String result) throws Exception {
+		// Do nothing
+	}
+
+	/**
+	 * 매출반영
+	 * @param erpGb - ERP구분(hsmk:한세MK, hsdr:한세드림)
+	 * @throws Exception
+	 */
+	private void uploadSales(String erpGb) throws Exception {
+		// 매출반영 총건수
+		int totCnt = statisticsService.getSalesUploadTotalCount(erpGb);
+		log.info("{}'s totCnt: {}", erpGb, totCnt);
+
+		if (totCnt < 1) {
+			return;
+		}
+
+		int totPage = totCnt / PAGE_SIZE;
+		log.info("{}'s totalPage: {}", erpGb, totPage);
+
+		if (totCnt % PAGE_SIZE > 0) {
+			totPage++;
+		}
+
+		for (int page = 0; page < totPage; page++) {
+			int limitStartRow = (page * PAGE_SIZE + 1) - 1;
+			Erp erp = new Erp();
+			erp.setErpGb(erpGb);
+			erp.setLimitStartRow(limitStartRow);
+			erp.setPageSize(PAGE_SIZE);
+
+			// 매출업로드
+			GagaMap salesMap = hansaeErp.uploadErpSales(erpGb, statisticsService.getSalesUploadList(erp));
+
+			// 매출반영결과 처리
+			statisticsService.updateSalesUploadResult(erpGb, salesMap);
+
+			log.info("{}'s {} Page sales uploaded successfully!", erpGb, (page + 1));
+		}
+	}
+
+}

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

@@ -1,14 +1,22 @@
 package com.style24.batch.biz.service;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.style24.batch.biz.dao.TsbStatisticsDao;
+import com.style24.persistence.domain.Erp;
 import com.style24.persistence.domain.SalesSms;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.parameter.GagaMap;
+
 /**
  * 통계 Service
  *
@@ -63,4 +71,68 @@ public class TsbStatisticsService {
 	public SalesSms getCurrentDaySalesSms() {
 		return statisticsDao.getCurrentDaySalesSms();
 	}
+
+	/**
+	 * 어제일자 매출반영목록 생성
+	 * @param erpGb - ERP구분(hsmk:한세MK, hsdr:한세드림)
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 8. 27
+	 */
+	@Transactional("shopTxnManager")
+	public int createYesterdaySalesUploadList(String erpGb) {
+		return statisticsDao.createYesterdaySalesUploadList(erpGb);
+	}
+
+	/**
+	 * 매출반영 총건수
+	 * @param erpGb - ERP구분(hsmk:한세MK, hsdr:한세드림)
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 8. 27
+	 */
+	public int getSalesUploadTotalCount(String erpGb) {
+		return statisticsDao.getSalesUploadTotalCount(erpGb);
+	}
+
+	/**
+	 * 매출반영 목록
+	 * @param erp - ERP 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 8. 27
+	 */
+	public Collection<GagaMap> getSalesUploadList(Erp erp) {
+		return statisticsDao.getSalesUploadList(erp);
+	}
+
+	/**
+	 * 매출반영결과 처리
+	 * @param erpGb - ERP구분(hsmk:한세MK, hsdr:한세드림)
+	 * @param paramMap - 결과 정보
+	 * @author gagamel
+	 * @since 2021. 8. 27
+	 */
+	@SuppressWarnings("unchecked")
+	@Transactional("shopTxnManager")
+	public void updateSalesUploadResult(String erpGb, GagaMap salesMap) {
+		// 성공건 처리
+		List<Map<String, Object>> succList = (ArrayList<Map<String, Object>>)salesMap.get("succList");
+		if (succList != null && !succList.isEmpty()) {
+			for (Map<String, Object> dataMap : succList) {
+				dataMap.put("ERP_GB", erpGb);
+				statisticsDao.updateSalesUploadResult(dataMap);
+			}
+		}
+
+		// 실패건 처리
+		List<Map<String, Object>> failList = (ArrayList<Map<String, Object>>)salesMap.get("failList");
+		if (failList != null && !failList.isEmpty()) {
+			for (Map<String, Object> dataMap : failList) {
+				dataMap.put("ERP_GB", erpGb);
+				statisticsDao.updateSalesUploadResult(dataMap);
+			}
+		}
+	}
+
 }

+ 15 - 0
src/main/java/com/style24/batch/biz/task/TsbStatisticsTask.java

@@ -11,6 +11,7 @@ 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;
@@ -45,6 +46,9 @@ public class TsbStatisticsTask {
 	@Autowired
 	private TsbSalesSmsSendJob salesSmsSendJob;
 
+	@Autowired
+	private TsbSalesUploadJob salesUploadJob;
+
 	/**
 	 * 초 분 시 일 월 주(년)
 	 * 0 0 12 * * ?" : 아무 요일, 매월, 매일 12:00:00
@@ -151,4 +155,15 @@ public class TsbStatisticsTask {
 		salesSmsSendJob.runById("cron.statistics.sales.sms.send");
 	}
 
+	/**
+	 * 매출반영
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.statistics.sales.upload}")
+	@Async
+	public void salesUploadJob() throws Exception {
+		salesUploadJob.runById("cron.statistics.sales.upload");
+	}
+
 }

+ 16 - 0
src/main/java/com/style24/batch/biz/web/TsbStatisticsController.java

@@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import com.style24.batch.biz.job.statistics.TsbInflowStatisticsJob;
 import com.style24.batch.biz.job.statistics.TsbInflowYesterdayStatisticsJob;
 import com.style24.batch.biz.job.statistics.TsbSalesSmsSendJob;
+import com.style24.batch.biz.job.statistics.TsbSalesUploadJob;
 import com.style24.core.support.controller.TscBaseController;
 
 import lombok.extern.slf4j.Slf4j;
@@ -35,6 +36,9 @@ public class TsbStatisticsController extends TscBaseController {
 	@Autowired
 	private TsbSalesSmsSendJob salesSmsSendJob;
 
+	@Autowired
+	private TsbSalesUploadJob salesUploadJob;
+
 	/**
 	 * 제휴채널 유입집계 생성
 	 * @throws Exception
@@ -72,4 +76,16 @@ public class TsbStatisticsController extends TscBaseController {
 		return "OK";
 	}
 
+	/**
+	 * 매출반영
+	 *
+	 * @throws Exception
+	 */
+	@GetMapping("/sales/upload")
+	@ResponseBody
+	public String salesUploadJob() throws Exception {
+		salesUploadJob.runById("cron.statistics.sales.upload");
+		return "OK";
+	}
+
 }

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

@@ -2,6 +2,18 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.style24.batch.biz.dao.TsbStatisticsDao">
 	
+	<!-- 페이징을 위한 select절 상단 -->
+	<sql id="selectForPagingHeader">
+		SELECT *
+		FROM (
+	</sql>
+
+	<!-- 페이징을 위한 select절 하단 -->
+	<sql id="selectForPagingFooter">
+		) ORIGINAL
+		LIMIT #{limitStartRow} ,  #{pageSize}
+	</sql>
+	
 	<!-- 사이트 제휴코드 유입집계 -->
 	<insert id="createInflowDaily" parameterType="String">
 		/* TsbStatistics.createInflowDaily */
@@ -931,5 +943,148 @@
 		        AND    ODIH.ORD_DTL_STAT IN ('G720_10','G720_30','G720_40','G720_50','G720_60') /*판매-결제완료, 환입-취소완료, 환입-품절취소, 환입-반품완료, 환입-교환완료*/
 		       ) ODIH
 	</select>
+	
+	<!-- 어제일자 매출반영목록 생성 -->
+	<insert id="createYesterdaySalesUploadList" parameterType="String">
+		/* TsbStatistics.createYesterdaySalesUploadList */
+		INSERT INTO TB_HANSAE_SALES (
+		       ERP_GB
+		     , NO_IF
+		     , DT_SALE
+		     , TP_SALE
+		     , CD_STYLE
+		     , CD_COLOR
+		     , CD_SIZE
+		     , QT_SALE
+		     , AM_ACSALE
+		     , DS_REMARK
+		     , REG_DT
+		)
+		SELECT #{erpGb}            AS ERP_GB
+		     , CONCAT(DATE_FORMAT(NOW(),'%Y%m%d%H%i%S'),
+		              LPAD(ROW_NUMBER() OVER(ORDER BY DT_SALE
+		                                            , CD_STYLE
+		                                            , CD_COLOR
+		                                            , CD_SIZE),4,'0')
+		             )             AS NO_IF
+		     , DT_SALE
+		     , TP_SALE
+		     , CD_STYLE
+		     , CD_COLOR
+		     , CD_SIZE
+		     , QT_SALE
+		     , AM_ACSALE
+		     , 'TEST'              AS DS_REMARK
+		     , NOW()               AS REG_DT
+		FROM   (
+		        SELECT DATE_FORMAT(O.PAY_DT,'%Y%m%d')    AS DT_SALE  /*판매일자*/
+		             , CASE WHEN ODIH.ORD_DTL_STAT = 'G720_20' THEN '1'
+		                    ELSE '2'
+		               END                               AS TP_SALE  /*판매구분(1:판매, 2:환불)*/
+		             , ODIH.ITEM_CD                      AS CD_STYLE /*스타일코드*/
+		             , ODIH.OPT_CD1                      AS CD_COLOR /*색상코드*/
+		             , ODIH.OPT_CD2                      AS CD_SIZE  /*사이즈코드*/
+		             , SUM((CASE WHEN ODIH.ORD_DTL_STAT = 'G720_20' THEN 1 ELSE -1 END)
+		                   *
+		                   CAST(CASE WHEN ODIH.ORD_DTL_STAT = 'G720_20' THEN ODIH.ORD_QTY - ODIH.CNCL_RTN_QTY /*판매-배송중*/
+		                             ELSE ODIH.CNCL_RTN_QTY /*환입-반품완료,환입-교환완료*/
+		                        END AS SIGNED INT))      AS QT_SALE  /*판매수량*/
+		             , SUM((CASE WHEN ODIH.ORD_DTL_STAT = 'G720_20' THEN 1 ELSE -1 END)
+		                   *
+		                   CAST(CASE WHEN ODIH.ORD_DTL_STAT = 'G720_20' /*판매-배송중*/ THEN
+		                                 ((ODIH.ORD_QTY - ODIH.CNCL_RTN_QTY) * (CASE WHEN O.MALL_GB = 'G011_20' /*제휴몰*/ THEN
+		                                                                                 IFNULL(EUP.USAC_PRICE,ODIH.ITEM_PRICE)
+		                                                                             ELSE
+		                                                                                 ODIH.ITEM_PRICE
+		                                                                        END))
+		                                 + ODIH.CPN1_DC_AMT
+		                             ELSE /*환입-반품완료,환입-교환완료*/
+		                                 (ODIH.CNCL_RTN_QTY * (CASE WHEN O.MALL_GB = 'G011_20' /*제휴몰*/ THEN
+		                                                                IFNULL(EUP.USAC_PRICE,ODIH.ITEM_PRICE)
+		                                                            ELSE
+		                                                                ODIH.ITEM_PRICE
+		                                                       END))
+		                                 + ODIH.CPN1_DC_AMT
+		                        END AS SIGNED INT))      AS AM_ACSALE /*실판매금액(ORD_AMT에는 CPN1_DC_AMT가 빠진 금액이 들어가 있음)*/
+		        FROM   TB_ORDER_DETAIL_ITEM_HST ODIH
+		        INNER JOIN TB_ORDER_DETAIL OD ON ODIH.ORD_DTL_NO = OD.ORD_DTL_NO
+		        INNER JOIN TB_ORDER O ON ODIH.ORD_NO = O.ORD_NO
+		        INNER JOIN TB_SUPPLY_COMPANY SC ON OD.SUPPLY_COMP_CD = SC.SUPPLY_COMP_CD
+		        LEFT OUTER JOIN TB_EXTMALL_USAC_PRICE EUP ON ODIH.ORD_DTL_ITEM_HST_SQ = EUP.ORD_DTL_ITEM_HST_SQ
+		        WHERE  1 = 1
+		        -- AND    ODIH.REG_DT BETWEEN DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY) AND CURRENT_DATE() /*전일자*/
+		        AND    ODIH.REG_DT >= DATE_ADD(CURRENT_DATE(), INTERVAL -7 DAY)
+		        AND    ODIH.ORD_DTL_STAT IN ('G720_20','G720_50','G720_60') /*판매-배송중, 환입-반품완료, 환입-교환완료*/
+		        <if test='erpGb == "hsmk"'>
+		        AND    OD.SUPPLY_COMP_CD IN (5,4) /*한세MK, FRJ*/
+		        </if>
+		        <if test='erpGb == "hsdr"'>
+		        AND    OD.SUPPLY_COMP_CD = 3 /*한세드림*/
+		        </if>
+		        AND    SC.DISTRIBUTION_GB IN ('G065_10','G065_11','G065_12') /*자사*/
+		        GROUP  BY DATE_FORMAT(O.PAY_DT,'%Y%m%d')
+		                , CASE WHEN ODIH.ORD_DTL_STAT = 'G720_20' THEN '1'
+		                       ELSE '2'
+		                  END
+		                , ODIH.ITEM_CD
+		                , ODIH.OPT_CD1
+		                , ODIH.OPT_CD2
+		       ) ODIH
+		WHERE  QT_SALE <![CDATA[<>]]> 0
+		AND    NOT EXISTS (SELECT 1
+		                   FROM   TB_HANSAE_SALES
+		                   WHERE  ERP_GB = #{erpGb}
+		                   AND    DT_SALE = ODIH.DT_SALE
+		                   AND    TP_SALE = ODIH.TP_SALE
+		                   AND    CD_STYLE = ODIH.CD_STYLE
+		                   AND    CD_COLOR = ODIH.CD_COLOR
+		                   AND    CD_SIZE = ODIH.CD_SIZE
+		                  )
+	</insert>
+	
+	<!-- 매출반영 총건수 조회 -->
+	<select id="getSalesUploadTotalCount" parameterType="String" resultType="int">
+		/* TsbStatistics.getSalesUploadTotalCount */
+		SELECT COUNT(*) AS CNT
+		FROM   TB_HANSAE_SALES
+		WHERE  ERP_GB = #{erpGb}
+		AND    NO_IF LIKE CONCAT(DATE_FORMAT(NOW(),'%Y%m%d'),'%')
+	</select>
+	
+	<!-- 매출반영 목록 -->
+	<select id="getSalesUploadList" parameterType="Erp" resultType="paramMap">
+		/* TsbStatistics.getSalesUploadList */
+		<include refid="selectForPagingHeader"/>
+		SELECT NO_IF
+		     , DT_SALE
+		     , TP_SALE
+		     , CD_STYLE
+		     , CD_COLOR
+		     , CD_SIZE
+		     , QT_SALE
+		     , AM_ACSALE
+		     , DS_REMARK
+		FROM   TB_HANSAE_SALES
+		WHERE  ERP_GB = #{erpGb}
+		AND    NO_IF LIKE CONCAT(DATE_FORMAT(NOW(),'%Y%m%d'),'%')
+		AND    CD_SALEBILL IS NULL
+		ORDER  BY NO_IF
+		<include refid="selectForPagingFooter"/>
+	</select>
+	
+	<!-- 매출반영결과 처리 -->
+	<update id="updateSalesUploadResult" parameterType="paramMap">
+		/* TsbStatistics.updateSalesUploadResult */
+		UPDATE TB_HANSAE_SALES
+		SET    CD_SALEBILL = #{CD_SALEBILL}
+		     , DS_ERROR = #{DS_ERROR}
+		     , UPD_DT = NOW()
+		WHERE  ERP_GB = #{ERP_GB}
+		AND    NO_IF = #{NO_IF}
+		AND    DT_SALE = #{DT_SALE}
+		AND    CD_STYLE = #{CD_STYLE}
+		AND    CD_COLOR = #{CD_COLOR}
+		AND    CD_SIZE = #{CD_SIZE}
+	</update>
 
 </mapper>

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

@@ -151,6 +151,7 @@ cron:
         pay.sub.create: 2 22 2 29 2 ?                  #부결제수단통계
         sales.sms.send1: 2 22 2 29 2 ?                 #매출문자발송 (평일은 저녁 8:30분, 11시)
         sales.sms.send2: 2 22 2 29 2 ?                 #매출문자발송 (주말(토/일)은 오전 10시, 오후 2시, 6시, 저녁 10시)
+        sales.upload: 2 22 2 29 2 ?                    #매출반영
 
     #모니터링
     monitoring:

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

@@ -155,6 +155,7 @@ cron:
         pay.sub.create: 2 22 2 29 2 ?                  #부결제수단통계
         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 ?                    #매출반영
 
     #모니터링
     monitoring:

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

@@ -174,6 +174,8 @@ cron:
         pay.sub.create: 2 22 2 29 2 ?                  #부결제수단통계
         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 * * *                     #매출반영
+        sales.upload: 2 22 2 29 2 ?                    #매출반영
 
     #모니터링
     monitoring: