jmh 4 лет назад
Родитель
Сommit
1f52b06a56

+ 15 - 0
src/main/java/com/style24/batch/biz/dao/TsbGoodsDao.java

@@ -606,6 +606,14 @@ public interface TsbGoodsDao {
 	 * @since 2021. 01. 18
 	 */
 	void createGoodsOptionList(String jobdate);
+	
+	/**
+	 * 입고상품중 온라인 옵션이 없는 상품옵션 추가
+	 *
+	 * @author jmh
+	 * @since 2021. 09. 1s4
+	 */
+	void createGoodsOptionList_new(String jobdate);
 
 	/**
 	 * 상품혜택임시 truncate
@@ -723,4 +731,11 @@ public interface TsbGoodsDao {
 	 */
 	int createVwStock();
 
+	/**
+	 * 입고상품중 온라인 옵션이 없는 상품옵션 추가
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 18
+	 */
+	void createGoodsOptionList_TEST();
 }

+ 3 - 0
src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsIncomelotJob.java

@@ -64,6 +64,9 @@ public class TsbGoodsWmsIncomelotJob extends TsbAbstractJob<GoodsIfIncomelotitem
 
 		//입고상품중 온라인 옵션이 없는 상품옵션 추가  -미사용(쿼리 수정해야함)
 //		goodsService.createGoodsOptionList(jobdate);
+		
+		//입고상품 중 옵션정보만 추가된 경우 (21.09.14 추가)
+		//goodsService.createGoodsOptionList_new(jobdate);
 
 		return goodsIfIncomelotitem;
 	}

+ 66 - 0
src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsIncomelotOptionJob.java

@@ -0,0 +1,66 @@
+package com.style24.batch.biz.job.goods;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.gagaframework.web.util.GagaDateUtil;
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbCommonService;
+import com.style24.batch.biz.service.TsbGoodsService;
+import com.style24.persistence.domain.GoodsIfIncomelotitem;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * WMS 입고 수신
+ *
+ * @author eskim
+ * @since 2021. 01. 01
+ */
+@Component
+@Slf4j
+public class TsbGoodsWmsIncomelotOptionJob extends TsbAbstractJob<GoodsIfIncomelotitem, GoodsIfIncomelotitem, GoodsIfIncomelotitem> {
+
+	@Autowired
+	private TsbGoodsService goodsService;
+
+	@Autowired
+	private TsbCommonService commonService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+	private String jobdate = "";
+
+	@Override
+	public GoodsIfIncomelotitem read() throws Exception {
+
+		// WMS 동기화 옵션 여부 확인
+		String wmsSyncYn = commonService.getWmsSyncYn();
+		if ("N".equals(wmsSyncYn)) {
+			log.info("WMS 정보 동기화 미실행 {}, 연동여부 : {}", GagaDateUtil.getToday("yyyy-MM-dd HH:mm:ss"), wmsSyncYn);
+			return null;
+		}
+		GoodsIfIncomelotitem goodsIfIncomelotitem = new GoodsIfIncomelotitem();
+		return goodsIfIncomelotitem;
+	}
+
+	@Override
+	public GoodsIfIncomelotitem process(GoodsIfIncomelotitem goodsIfIncomelotitem) throws Exception {
+		return goodsIfIncomelotitem;
+	}
+
+	@Override
+	public GoodsIfIncomelotitem write(GoodsIfIncomelotitem goodsIfIncomelotitem) throws Exception {
+
+		//입고상품 중 옵션정보만 추가된 경우 (21.09.14 추가) 테스트용
+		goodsService.createGoodsOptionList_TEST();
+
+		return goodsIfIncomelotitem;
+	}
+
+	@Override
+	public void notify(GoodsIfIncomelotitem goodsIfIncomelotitem) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 22 - 0
src/main/java/com/style24/batch/biz/service/TsbGoodsService.java

@@ -781,6 +781,17 @@ public class TsbGoodsService {
 	public void createGoodsOptionList(String jobdate) {
 		goodsDao.createGoodsOptionList(jobdate);
 	}
+	
+	/**
+	 * 입고상품중 온라인 옵션이 없는 상품옵션 추가
+	 *
+	 * @author jmh
+	 * @since 2021. 09. 14
+	 */
+	@Transactional("shopTxnManager")
+	public void createGoodsOptionList_new(String jobdate) {
+		goodsDao.createGoodsOptionList_new(jobdate);
+	}
 
 	/**
 	 * 상품혜택임시 생성
@@ -890,4 +901,15 @@ public class TsbGoodsService {
 		return goodsDao.createVwStock();
 	}
 
+	
+	/**
+	 * 입고상품중 온라인 옵션이 없는 상품옵션 추가
+	 *
+	 * @author jmh
+	 * @since 2021. 09. 14
+	 */
+	@Transactional("shopTxnManager")
+	public void createGoodsOptionList_TEST() {
+		goodsDao.createGoodsOptionList_TEST();
+	}
 }

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

@@ -25,6 +25,7 @@ import com.style24.batch.biz.job.goods.TsbGoodsWmsBrandproviderJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsGoodsJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsGoodsStockJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsIncomelotJob;
+import com.style24.batch.biz.job.goods.TsbGoodsWmsIncomelotOptionJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsMeasurementJob;
 import com.style24.batch.biz.job.goods.TsbNaverAllEp;
 import com.style24.batch.biz.job.goods.TsbNaverSellEp;
@@ -117,6 +118,8 @@ public class TsbGoodsTask {
 	@Autowired
 	private TsbGoodsVwStockJob goodVwStockJob;
 
+	@Autowired
+	private TsbGoodsWmsIncomelotOptionJob goodsWmsIncomelotOptionJob;
 	/**
 	 * 초 분 시 일 월 주(년)
 	 * 0 0 12 * * ?" : 아무 요일, 매월, 매일 12:00:00
@@ -410,4 +413,16 @@ public class TsbGoodsTask {
 		goodVwStockJob.runById("cron.goods.vwstock.create");
 	}
 
+	
+	/**
+	 * WMS 입고상품 연동 적용 - 임시 테스트용
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.wms.incomelot.receive.option}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void wmsIncomelotReceiveOptionJob() throws Exception {
+		goodsWmsIncomelotOptionJob.runById("cron.goods.wms.incomelot.receive.option");
+	}
 }

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

@@ -26,6 +26,7 @@ import com.style24.batch.biz.job.goods.TsbGoodsWmsBrandproviderJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsGoodsJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsGoodsStockJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsIncomelotJob;
+import com.style24.batch.biz.job.goods.TsbGoodsWmsIncomelotOptionJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsMeasurementJob;
 import com.style24.batch.biz.job.goods.TsbNaverAllEp;
 import com.style24.batch.biz.job.goods.TsbNaverSellEp;
@@ -118,6 +119,9 @@ public class TsbGoodsController extends TscBaseController {
 
 	@Autowired
 	private TsbGoodsVwStockJob goodVwStockJob;
+	
+	@Autowired
+	private TsbGoodsWmsIncomelotOptionJob goodsWmsIncomelotOptionJob;
 
 	/**
 	 * 상품 타이틀예약 적용 주기 : 시간배치 - 매시 1분 (소셜과 시간 중복)
@@ -402,4 +406,16 @@ public class TsbGoodsController extends TscBaseController {
 		return "OK";
 	}
 
+	
+	/**
+	 * WMS 입고상품 연동 적용 주기 - 테스트용 (기존 저장안된 것)
+	 *
+	 * @throws Exception
+	 */
+	@GetMapping("/wms/incomelot/receive/option")
+	@ResponseBody
+	public String receiveWmsIncomelotOption() throws Exception {
+		goodsWmsIncomelotOptionJob.runById("cron.goods.wms.incomelot.receive.option");
+		return "OK";
+	}
 }

+ 161 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml

@@ -2504,6 +2504,94 @@
 
 	</insert>
 
+	<!-- 입고상품중 온라인 옵션이 없는 상품옵션 추가  -->
+	<insert id="createGoodsOptionList_new" parameterType="String" timeout="300">
+		/* TsbGoods.createGoodsOptionList_new */
+		INSERT INTO TB_OPTION(
+		       GOODS_CD
+		     , OPT_CD
+		     , OPT_CD1
+		     , OPT_CD2
+		     , SKU_MODEL_NO
+		     , PRODUCT_NO
+		     , PRODUCT_CODE
+		     , BASE_STOCK_QTY
+		     , CURR_STOCK_QTY
+		     , STORE_STOCK_QTY
+		     , STORE_MAX_QTY
+		     , ADD_PRICE
+		     , SOLDOUT_YN
+		     , DISP_ORD
+		     , DISP_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT 
+			Z.MODELNO
+			, Z.SKUCODE
+			, Z.OPTION1
+			, Z.OPTION2
+			, Z.SKUMODELNO
+			, Z.PRODUCTNO
+			, Z.PRODUCTCODE
+			, 0
+			, 0
+			, 0
+			, 0
+			, 0 	/*추가금액*/
+			, 'N' 	/*SOLDOUT_YN*/
+			, ROW_NUMBER() OVER (PARTITION BY Z.MODELNO ORDER BY PRODUCTNO, SKUCODE ) 
+				+ (select MAX(DISP_ORD) from TB_OPTION where GOODS_CD = Z.MODELNO) AS DISP_ORD /*DISP_ORD*/
+			, 'Y'	/*DISP_YN*/
+			, 99999
+			, NOW()
+			, 99999
+			, NOW()
+		FROM (
+		      SELECT 
+		        B.PRODUCTNO
+			   , B.PRODUCTCODE
+			   , B.SKUCODE
+			   , B.SKUMODELNO
+			   , MAX(B.PRODUCTNAME) AS PRODUCTNAME
+			   , MAX(CASE WHEN INSTR(REPLACE(B.SKUMODELNO, ' ' , ''), 'F20') = 1 THEN LEFT(REPLACE(B.SKUMODELNO, ' ' , ''),12)
+				      WHEN INSTR(REPLACE(B.SKUMODELNO, ' ' , ''), '-') > 0 AND INSTR(REPLACE(B.SKUMODELNO, ' ' , ''), '-') <![CDATA[<]]> 10 THEN LEFT(REPLACE(B.SKUMODELNO, ' ' , ''),11)
+				      ELSE LEFT(REPLACE(B.SKUMODELNO, ' ' , ''),10) END) AS MODELNO
+			   , IFP.OPTION1
+			   , IFP.OPTION2
+		      FROM TB_IF_INCOMELOT  A
+		      INNER JOIN TB_IF_INCOMELOTITEM B ON A.LOTNO = B.LOTNO
+		      INNER JOIN ISTYLE24_WMSIF.DBO.TB_IF_PRODUCTSKU IFP ON B.SKUCODE = IFP.SKUCODE
+		      WHERE 1 = 1
+		      AND LENGTH(REPLACE(B.SKUMODELNO, ' ' , '')) >= 13                       -- 품번+색상+사이즈 최소길이
+		      <choose>
+			      <when test='jobdate != null and jobdate != ""'>
+				      AND DATEINCOME >= DATE_FORMAT(#{jobdate}, '%Y-%m-%d %H:%i:%S')
+				      <![CDATA[
+				      AND DATEINCOME < DATE_FORMAT(DATE_ADD(#{jobdate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+				      ]]>
+			      </when>
+			      <otherwise>
+				      AND DATEINCOME >= DATE_FORMAT(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 DAY),'%Y%m%d' ), '%Y-%m-%d %H:%i:%S')
+				      <![CDATA[
+				      AND DATEINCOME < DATE_FORMAT(DATE_FORMAT(NOW() ,'%Y%m%d'), '%Y-%m-%d %H:%i:%S')
+				      ]]>
+			      </otherwise>
+		      </choose>
+		      GROUP BY B.PRODUCTNO , B.PRODUCTCODE, B.SKUCODE, B.SKUMODELNO, IFP.OPTION1, IFP.OPTION2
+		      ORDER BY 6, B.PRODUCTNO , B.PRODUCTCODE, B.SKUCODE
+		) Z
+		WHERE 1=1
+		AND EXISTS (SELECT 1 FROM TB_GOODS WHERE GOODS_CD = Z.MODELNO)  	/* 마이그된 상품이 있는경우*/
+		AND NOT EXISTS (SELECT 1 FROM TB_OPTION WHERE OPT_CD = Z.SKUCODE )  /* 마이그된 상품이 없는경우 */
+		
+		ON DUPLICATE KEY UPDATE
+            UPD_DT = NOW()
+	</insert>
+	
+	
 	<!-- 상품혜택임시 테이블 truncate -->
 	<delete id="truncateTemporaryGoodsBenefit" timeout="600">
 		/* TsbGoods.truncateTemporaryGoodsBenefit */
@@ -3251,4 +3339,77 @@
 		FROM   VW_STOCK_TMP
 	</insert>
 
+	<!-- 입고상품중 온라인 옵션이 없는 상품옵션 추가 테스트용 (기존 누적된 데이터 테스트하며 확인하기 위함용) -->
+	<insert id="createGoodsOptionList_TEST" timeout="300">
+		/* TsbGoods.createGoodsOptionList_TEST */
+		INSERT INTO TB_OPTION(
+		       GOODS_CD
+		     , OPT_CD
+		     , OPT_CD1
+		     , OPT_CD2
+		     , SKU_MODEL_NO
+		     , PRODUCT_NO
+		     , PRODUCT_CODE
+		     , BASE_STOCK_QTY
+		     , CURR_STOCK_QTY
+		     , STORE_STOCK_QTY
+		     , STORE_MAX_QTY
+		     , ADD_PRICE
+		     , SOLDOUT_YN
+		     , DISP_ORD
+		     , DISP_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT 
+			Z.MODELNO
+			, Z.SKUCODE
+			, Z.OPTION1
+			, Z.OPTION2
+			, Z.SKUMODELNO
+			, Z.PRODUCTNO
+			, Z.PRODUCTCODE
+			, 0
+			, 0
+			, 0
+			, 0
+			, 0 	/*추가금액*/
+			, 'N' 	/*SOLDOUT_YN*/
+			, ROW_NUMBER() OVER (PARTITION BY Z.MODELNO ORDER BY PRODUCTNO, SKUCODE ) 
+				+ (select MAX(DISP_ORD) from TB_OPTION where GOODS_CD = Z.MODELNO) AS DISP_ORD /*DISP_ORD*/
+			, 'Y'	/*DISP_YN*/
+			, 99999
+			, NOW()
+			, 99999
+			, NOW()
+		FROM (
+		      SELECT 
+		        B.PRODUCTNO
+			   , B.PRODUCTCODE
+			   , B.SKUCODE
+			   , B.SKUMODELNO
+			   , MAX(B.PRODUCTNAME) AS PRODUCTNAME
+			   , MAX(CASE WHEN INSTR(REPLACE(B.SKUMODELNO, ' ' , ''), 'F20') = 1 THEN LEFT(REPLACE(B.SKUMODELNO, ' ' , ''),12)
+				      WHEN INSTR(REPLACE(B.SKUMODELNO, ' ' , ''), '-') > 0 AND INSTR(REPLACE(B.SKUMODELNO, ' ' , ''), '-') <![CDATA[<]]> 10 THEN LEFT(REPLACE(B.SKUMODELNO, ' ' , ''),11)
+				      ELSE LEFT(REPLACE(B.SKUMODELNO, ' ' , ''),10) END) AS MODELNO
+			   , IFP.OPTION1
+			   , IFP.OPTION2
+		      FROM TB_IF_INCOMELOT  A
+		      INNER JOIN TB_IF_INCOMELOTITEM B ON A.LOTNO = B.LOTNO
+		      INNER JOIN ISTYLE24_WMSIF.DBO.TB_IF_PRODUCTSKU IFP ON B.SKUCODE = IFP.SKUCODE
+		      WHERE 1 = 1
+		      AND LENGTH(REPLACE(B.SKUMODELNO, ' ' , '')) >= 13                       -- 품번+색상+사이즈 최소길이
+		      AND DATE(B.UPD_DT) = '2021-07-07'
+		      GROUP BY B.PRODUCTNO , B.PRODUCTCODE, B.SKUCODE, B.SKUMODELNO, IFP.OPTION1, IFP.OPTION2
+		      ORDER BY 6, B.PRODUCTNO , B.PRODUCTCODE, B.SKUCODE
+		) Z
+		WHERE 1=1
+		AND EXISTS (SELECT 1 FROM TB_GOODS WHERE GOODS_CD = Z.MODELNO)  	/* 마이그된 상품이 있는경우*/
+		AND NOT EXISTS (SELECT 1 FROM TB_OPTION WHERE OPT_CD = Z.SKUCODE )  /* 마이그된 상품이 없는경우 */
+		
+		ON DUPLICATE KEY UPDATE
+            UPD_DT = NOW()
+	</insert>
 </mapper>

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

@@ -66,6 +66,7 @@ cron:
             measurement.receive: 2 22 2 29 2 ?    #WMS 실측사이즈 수신
             brandprovider.send: 2 22 2 29 2 ?     #WMS 업체/브랜드 송신
             goods.send: 2 22 2 29 2 ?             #WMS 상품정보 송신
+            incomelot.receive.option: 2 22 2 29 2 ?      #WMS 입고상품 수신(임시테스트용)
         shop.stock.receive: 2 22 2 29 2 ?         #ERP 매장재고 수신
         search:
             all.create: 2 22 2 29 2 ?             #검색전체색인 생성

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

@@ -56,6 +56,7 @@ cron:
             measurement.receive: 2 22 2 29 2 ?     #WMS 실측사이즈 수신 (1일 1회)
             brandprovider.send: 2 22 2 29 2 ?       #WMS 업체/브랜드 송신 (1일 1회)
             goods.send: 2 22 2 29 2 ?              #WMS 상품정보 송신 (1일 1회)
+            incomelot.receive.option: 2 22 2 29 2 ?      #WMS 입고상품 수신(임시테스트용)
         shop.stock.receive: 2 22 2 29 2 ?           #ERP 매장재고 수신 (1시간 1회)
         search:
             all.create: 2 22 2 29 2 ?               #검색전체색인 생성 (1일 1회)

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

@@ -56,6 +56,7 @@ cron:
             measurement.receive: 2 22 2 29 2 ?     #WMS 실측사이즈 수신 (1일 1회)
             brandprovider.send: 2 22 2 29 2 ?       #WMS 업체/브랜드 송신 (1일 1회)
             goods.send: 2 22 2 29 2 ?              #WMS 상품정보 송신 (1일 1회)
+            incomelot.receive.option: 2 22 2 29 2 ?      #WMS 입고상품 수신(임시테스트용)
         shop.stock.receive: 2 22 2 29 2 ?           #ERP 매장재고 수신 (1시간 1회)
         search:
             all.create: 2 22 2 29 2 ?               #검색전체색인 생성 (1일 1회)

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

@@ -66,6 +66,7 @@ cron:
             measurement.receive: 0 50 0 * * *     #WMS 실측사이즈 수신 (1일 1회)
             brandprovider.send: 0 0 1 * * *       #WMS 업체/브랜드 송신 (1일 1회)
             goods.send: 0 10 1 * * *              #WMS 상품정보 송신 (1일 1회)
+            incomelot.receive.option: 2 22 2 29 2 ?      #WMS 입고상품 수신(임시테스트용)
         #shop.stock.receive: 0 7 * * * *           #ERP 매장재고 수신 (1시간 1회). 직송매장 오픈 시 적용
         shop.stock.receive: 2 22 2 29 2 ?         #ERP 매장재고 수신 (1시간 1회)
         search: