Explorar el Código

Merge branch 'develop' into bin2107

bin2107 hace 5 años
padre
commit
c34bcda45a

+ 1 - 1
src/main/java/com/style24/batch/biz/checkout/mall/ShipProductOrderRequest.java

@@ -10,7 +10,7 @@ package com.style24.batch.biz.checkout.mall;
 public class ShipProductOrderRequest  extends com.style24.batch.biz.checkout.base.BaseCheckoutRequestType  implements java.io.Serializable {
     private String productOrderID;
 
-    private com.style24.batch.biz.checkout.checkout.base.DeliveryMethodType deliveryMethodCode;
+    private com.style24.batch.biz.checkout.base.DeliveryMethodType deliveryMethodCode;
 
     private String deliveryCompanyCode;
 

+ 109 - 19
src/main/java/com/style24/batch/biz/dao/TsbGoodsDao.java

@@ -12,9 +12,9 @@ import com.style24.persistence.domain.GoodsSafeNo;
 import com.style24.persistence.domain.GoodsSummary;
 import com.style24.persistence.domain.IfBrand;
 import com.style24.persistence.domain.IfProduct;
-import com.style24.persistence.domain.IfProductSku;
 import com.style24.persistence.domain.IfProvider;
 import com.style24.persistence.domain.Option;
+import com.style24.persistence.domain.WmsStock;
 
 import com.gagaframework.web.parameter.GagaMap;
 
@@ -329,47 +329,121 @@ public interface TsbGoodsDao {
 	 */
 	Collection<IfProduct> getGoodsList();
 
+//	/**
+//	 * TB_IF_PRODUCTSKU 삭제
+//	 *
+//	 * @author eskim
+//	 * @since 2021. 01. 06
+//	 */
+//	void deleteIfProductSku();
+//
+//	/**
+//	 * TB_IF_PRODUCTSKU 저장
+//	 *
+//	 * @author eskim
+//	 * @since 2021. 01. 06
+//	 */
+//	//void createIfProductSku(IfProductSku ifProductSku);
+//	void createIfProductSku(GagaMap dataMap);
+//
+//	/**
+//	 * TB_IF_PRODUCTSKU 저장
+//	 *
+//	 * @author eskim
+//	 * @since 2021. 01. 06
+//	 */
+//	void createIfProductSkuByRow(IfProductSku ifProductSku);
+//
+//	/**
+//	 * TB_IF_PRODUCTSKU_HST 삭제
+//	 *
+//	 * @author eskim
+//	 * @since 2021. 01. 06
+//	 */
+//	void deleteWmsProductSkuHst(String jobdate);
+//
+//	/**
+//	 * TB_IF_PRODUCTSKU_HST 저장
+//	 *
+//	 * @author eskim
+//	 * @since 2021. 01. 06
+//	 */
+//	void createWmsProductSkuHst(String jobdate);
+
 	/**
-	 * TB_IF_PRODUCTSKU 삭제
+	 * TB_WMS_STOCK 삭제
 	 *
 	 * @author eskim
-	 * @since 2021. 01. 06
+	 * @since 2021. 05. 26
 	 */
-	void deleteIfProductSku();
+	void deleteWmsStock();
 
 	/**
-	 * TB_IF_PRODUCTSKU 저장
+	 * TB_WMS_STOCK 저장
 	 *
 	 * @author eskim
-	 * @since 2021. 01. 06
+	 * @since 2021. 05. 26
 	 */
-	//void createIfProductSku(IfProductSku ifProductSku);
-	void createIfProductSku(GagaMap dataMap);
+	void createWmsStock(GagaMap dataMap);
 
 	/**
-	 * TB_IF_PRODUCTSKU 저장
+	 * TB_WMS_STOCK 저장
 	 *
 	 * @author eskim
-	 * @since 2021. 01. 06
+	 * @since 2021. 05. 26
 	 */
-	void createIfProductSkuByRow(IfProductSku ifProductSku);
+	void createWmsStockByRow(WmsStock wmsStock);
 
 	/**
-	 * TB_IF_PRODUCTSKU_HST 삭제
+	 * TB_WMS_STOCK_HST 삭제
 	 *
 	 * @author eskim
-	 * @since 2021. 01. 06
+	 * @since 2021. 05. 26
 	 */
-	void deleteWmsProductSkuHst(String jobdate);
+	void deleteWmsStockHst(String jobdate);
 
 	/**
-	 * TB_IF_PRODUCTSKU_HST 저장
+	 * TB_WMS_STOCK_HST 저장
 	 *
 	 * @author eskim
-	 * @since 2021. 01. 06
+	 * @since 2021. 05. 26
 	 */
-	void createWmsProductSkuHst(String jobdate);
+	void createWmsStockHst(String jobdate);
+	
+	
+	/**
+	 * TB_SHOP_STOCK 삭제
+	 *
+	 * @author eskim
+	 * @since 2021. 05. 27
+	 */
+	void deleteShopStock();
+
+	/**
+	 * TB_SHOP_STOCK 저장
+	 *
+	 * @author eskim
+	 * @since 2021. 05. 27
+	 */
+	void createShopStock();
 
+	/**
+	 * TB_SHOP_STOCK_HST 삭제
+	 *
+	 * @author eskim
+	 * @since 2021. 05. 27
+	 */
+	void deleteShopStockHst(String jobdate);
+
+	/**
+	 * TB_SHOP_STOCK_HST 저장
+	 *
+	 * @author eskim
+	 * @since 2021. 05. 27
+	 */
+	void createShopStockHst(String jobdate);
+	
+	
 	/**
 	 *  상품 전시재고 삭제
 	 *
@@ -395,12 +469,20 @@ public interface TsbGoodsDao {
 	void deleteTbOptionSyncTemp();
 
 	/**
-	 * ERP 재고 임시 테이블 이관
+	 * wms 재고 임시 테이블 이관
 	 *
 	 * @author eskim
 	 * @since 2020. 08. 24
 	 */
 	void createTbOptionSyncTemp();
+	
+	/**
+	 * 매장 재고 임시 테이블 이관
+	 *
+	 * @author eskim
+	 * @since 2021. 05. 27
+	 */
+	void saveTbOptionSyncTemp();
 
 	/**
 	 * 입점상품 SELL_QTY 목록 조회
@@ -450,9 +532,17 @@ public interface TsbGoodsDao {
 	 * TB_OPTION_SYNC_TEMP => TB_OPTION_SYNC 변경적용
 	 *
 	 * @author eskim
-	 * @since 2021. 01. 08
+	 * @since 2021. 05. 27
 	 */
 	void saveGoodsOptionSyncSync();
+	
+	/**
+	 * TB_OPTION_SYNC 매장별 최대구매수량 적용-
+	 *
+	 * @author eskim
+	 * @since 2021. 05. 28
+	 */
+	void updateGoodsOptionSyncSync();
 
 	/**
 	 * WMS 임시 테이블에서 실테이블로 이관(재고가 상이한것만 수정)

+ 10 - 2
src/main/java/com/style24/batch/biz/dao/TsbPointDao.java

@@ -2,9 +2,7 @@ package com.style24.batch.biz.dao;
 
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Point;
-import com.style24.persistence.domain.Social;
 
-import org.springframework.dao.DataAccessException;
 import org.springframework.stereotype.Repository;
 
 import java.util.Collection;
@@ -58,5 +56,15 @@ public interface TsbPointDao {
 	 * @since  2021. 04. 26
 	 */
 	void updateCustPointExpire(Point point);
+	
+	/**
+	 * 포인트 기간만료 알림톡(30일) 리스트
+	 *
+	 * @param point
+	 * @return Collection<Point>
+	 * @author sowon
+	 * @since  2021. 05. 28
+	 */
+	Collection<Point> getSendPointExpectList(Point point);
 
 }

+ 3 - 4
src/main/java/com/style24/batch/biz/dao/TsbWmsGoodsDao.java

@@ -8,8 +8,8 @@ import com.style24.persistence.domain.GoodsIfIncomelotitem;
 import com.style24.persistence.domain.GoodsIfMeasurement;
 import com.style24.persistence.domain.IfBrand;
 import com.style24.persistence.domain.IfProduct;
-import com.style24.persistence.domain.IfProductSku;
 import com.style24.persistence.domain.IfProvider;
+import com.style24.persistence.domain.WmsStock;
 
 /**
  * WMS 상품 연동Dao
@@ -88,9 +88,8 @@ public interface TsbWmsGoodsDao {
 	 *
 	 * @return
 	 * @author eskim
-	 * @since 2021. 01. 06
+	 * @since 2021. 05. 26
 	 */
-	Collection<IfProductSku> getWmsIfProductSukList();
-
+	Collection<WmsStock> getWmsStockList();
 
 }

+ 49 - 50
src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsGoodsStockJob.java

@@ -1,5 +1,9 @@
 package com.style24.batch.biz.job.goods;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -7,10 +11,11 @@ import com.style24.batch.biz.job.TsbAbstractJob;
 import com.style24.batch.biz.service.TsbCommonService;
 import com.style24.batch.biz.service.TsbGoodsService;
 import com.style24.batch.biz.service.TsbWmsGoodsService;
-import com.style24.persistence.domain.IfProductSku;
+import com.style24.persistence.domain.WmsStock;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.util.GagaDateUtil;
 
 /**
@@ -21,7 +26,7 @@ import com.gagaframework.web.util.GagaDateUtil;
  */
 @Component
 @Slf4j
-public class TsbGoodsWmsGoodsStockJob extends TsbAbstractJob<IfProductSku, IfProductSku, IfProductSku> {
+public class TsbGoodsWmsGoodsStockJob extends TsbAbstractJob<WmsStock, WmsStock, WmsStock> {
 
 	@Autowired
 	private TsbGoodsService goodsService;
@@ -37,19 +42,19 @@ public class TsbGoodsWmsGoodsStockJob extends TsbAbstractJob<IfProductSku, IfPro
 	private String jobdate = "";
 
 	@Override
-	public IfProductSku read() throws Exception {
+	public WmsStock read() throws Exception {
 
-		IfProductSku ifProductSku = new IfProductSku();
-		return ifProductSku;
+		WmsStock wmsStock = new WmsStock();
+		return wmsStock;
 	}
 
 	@Override
-	public IfProductSku process(IfProductSku ifProductSku) throws Exception {
-		return ifProductSku;
+	public WmsStock process(WmsStock wmsStock) throws Exception {
+		return wmsStock;
 	}
 
 	@Override
-	public IfProductSku write(IfProductSku ifProductSku) throws Exception {
+	public WmsStock write(WmsStock wmsStock) throws Exception {
 
 		jobdate = GagaDateUtil.getToday("yyyyMMddHHmm");
 
@@ -59,59 +64,53 @@ public class TsbGoodsWmsGoodsStockJob extends TsbAbstractJob<IfProductSku, IfPro
 			log.info("WMS 정보 동기화 미실행 {}, 연동여부 : {}", GagaDateUtil.getToday("yyyy-MM-dd HH:mm:ss"), wmsSyncYn);
 			return null;
 		} else {
-			/**
-			 * 나중에 개발 서버에서 꼭 테스트 해봅시다~~~~
-			 */
+
+			// TB_WMS_STOCK 작업
+			goodsService.deleteWmsStock();
+
+			// TB_WMS_STOCK  생성
+			Collection<WmsStock> wmsStockList = wmsGoodsService.getWmsStockList();
+			String byrow = "N";
+			if ("Y".equals(byrow)) {
+				for (WmsStock loopWmsStock : wmsStockList) {
+					goodsService.createWmsStockByRow(loopWmsStock);
+				}
+			} else {
+
+				List<WmsStock> productSukList = new ArrayList<WmsStock>();
+				log.info("productSukList.size = {}", productSukList.size());
+				GagaMap dataMap = new GagaMap();
+				int index = 0;
+				for (WmsStock loopWmsStock : wmsStockList) {
+
+					productSukList.add(loopWmsStock);
+					index++;
+					if (index % 20 == 0 || wmsStockList.size() == index) {
+						dataMap.set("productSukList", productSukList);
+						goodsService.createWmsStock(dataMap);
+						productSukList.clear();
+					}
+				}
+			}
+			
 			//wms상품재고이력 생성
-			goodsService.createWmsProductSkuHst(jobdate);
-
-//  대용량 테스트 			
-			// TB_IF_PRODUCTSKU 작업
-//			goodsService.deleteIfProductSku();
-//
-//			// TB_IF_PRODUCTSKU  생성
-//			Collection<IfProductSku> wmsIfProductSukList = wmsGoodsService.getWmsIfProductSukList();  //테스트 1000건
-//
-//			//대용량 : N
-//			String byrow = "N";
-//			if ("Y".equals(byrow)) {
-//				for(IfProductSku ifProductSkuMap : wmsIfProductSukList) {
-//					goodsService.createIfProductSkuByRow(ifProductSkuMap);
-//				}
-//			}else {
-//
-//				List<IfProductSku> productSukList = new ArrayList<IfProductSku>();
-//				GagaMap dataMap = new GagaMap();
-//				int index = 0;
-//				for(IfProductSku ifProductSkuMap : wmsIfProductSukList) {
-//
-//					productSukList.add(ifProductSkuMap);
-//					index++;
-//					if (index % 200 == 0 ||  wmsIfProductSukList.size() == index) {
-//						dataMap.set("productSukList", productSukList);
-//						goodsService.createIfProductSku(dataMap);
-//
-//						productSukList.clear();
-//					}
-//				}
-//
-//			}
-//
-//			// TB_IF_PRODUCTSKU_HST 생성
-//			goodsService.createWmsProductSkuHst(jobdate);
+			goodsService.createWmsStockHst(jobdate);
+			
+			//매장재고생성 - 출고처별 판매비율 적용
+			goodsService.createShopStock(jobdate);
 
 			//온라인 상품 재고 적용
-			goodsService.saveGoodsStock();
+			goodsService.saveGoodsStock(); 
 		}
 
 		//온라인 전시 재고 작업
 		goodsService.saveGoodsDispStock();
 
-		return ifProductSku;
+		return wmsStock;
 	}
 
 	@Override
-	public void notify(IfProductSku ifProductSku) throws Exception {
+	public void notify(WmsStock wmsStock) throws Exception {
 		super.printResult(succCnt, failCnt);
 	}
 

+ 1 - 2
src/main/java/com/style24/batch/biz/job/marketing/TsbExpectGiftcardJob.java

@@ -37,8 +37,7 @@ public class TsbExpectGiftcardJob  extends TsbAbstractJob<Collection<GiftCard>,
 	public GagaMap process(Collection<GiftCard> readItem) throws Exception {
 		for (GiftCard giftcard : readItem) {
 			try {
-				log.info("giftcard ===> {}", giftcard);
-				kakaoService.sendGiftcardExpect(giftcard, giftcard.getCustNo());
+				kakaoService.sendGiftcardExpectNotify(giftcard, giftcard.getCustNo());
 				succCnt++;
 			} catch (Exception e) {
 				failCnt++;

+ 60 - 0
src/main/java/com/style24/batch/biz/job/marketing/TsbExpectPointJob.java

@@ -0,0 +1,60 @@
+package com.style24.batch.biz.job.marketing;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.gagaframework.web.parameter.GagaMap;
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbPointService;
+import com.style24.core.biz.service.TscKakaotalkService;
+import com.style24.persistence.domain.Point;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Component
+@Slf4j
+public class TsbExpectPointJob  extends TsbAbstractJob<Collection<Point>, GagaMap, GagaMap>{
+	
+	@Autowired
+	TsbPointService pointService;
+	
+	@Autowired
+	TscKakaotalkService kakaoService;
+	
+	private int succCnt = 0;
+	private int failCnt = 0;
+
+	
+	@Override
+	public Collection<Point> read() throws Exception {
+		Point point = new Point(); 
+		return pointService.getSendPointExpectList(point);
+	}
+
+	@Override
+	public GagaMap process(Collection<Point> readItem) throws Exception {
+		for (Point point : readItem) {
+			try {
+				kakaoService.sendPointExpectNotify(point, point.getCustNo());
+				succCnt++;
+			} catch (Exception e) {
+				failCnt++;
+				log.error(e.getMessage());
+			}
+		}
+		return null;
+	}
+
+	@Override
+	public GagaMap write(GagaMap convertedItem) throws Exception {
+		return null;
+	}
+
+	@Override
+	public void notify(GagaMap resultItem) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 148 - 57
src/main/java/com/style24/batch/biz/service/TsbGoodsService.java

@@ -1,9 +1,7 @@
 package com.style24.batch.biz.service;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -23,9 +21,9 @@ import com.style24.persistence.domain.GoodsSafeNo;
 import com.style24.persistence.domain.GoodsSummary;
 import com.style24.persistence.domain.IfBrand;
 import com.style24.persistence.domain.IfProduct;
-import com.style24.persistence.domain.IfProductSku;
 import com.style24.persistence.domain.IfProvider;
 import com.style24.persistence.domain.Option;
+import com.style24.persistence.domain.WmsStock;
 
 import io.netty.util.internal.StringUtil;
 
@@ -485,6 +483,54 @@ public class TsbGoodsService {
 		return goodsDao.getGoodsList();
 	}
 
+	/**
+	 * wms상품재고이력 생성
+	 *
+	 * @param jobdate
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 07
+	 */
+//	@Transactional("shopTxnManager")
+//	public void createWmsProductSkuHst(String jobdate) {
+//
+//		// TB_IF_PRODUCTSKU  작업
+//		goodsDao.deleteIfProductSku();
+//
+//		// TB_IF_PRODUCTSKU  생성
+//		Collection<IfProductSku> wmsIfProductSukList = wmsGoodsService.getWmsIfProductSukList();
+//		String byrow = "Y";
+//		if ("Y".equals(byrow)) {
+//			for (IfProductSku ifProductSku : wmsIfProductSukList) {
+//				goodsDao.createIfProductSkuByRow(ifProductSku);
+//			}
+//		} else {
+//
+//			List<IfProductSku> productSukList = new ArrayList<IfProductSku>();
+//
+//			GagaMap dataMap = new GagaMap();
+//			int index = 0;
+//			for (IfProductSku ifProductSku : wmsIfProductSukList) {
+//
+//				productSukList.add(ifProductSku);
+//				index++;
+//				if (index % 200 == 0 || wmsIfProductSukList.size() == index) {
+//					dataMap.set("productSukList", productSukList);
+//					goodsDao.createIfProductSku(dataMap);
+//					productSukList.clear();
+//				}
+//			}
+//
+//		}
+//
+//		// TB_IF_PRODUCTSKU_HST 2달 전 데이터 삭제
+//		String delYyyymmdd = GagaDateUtil.getOffsetMonth(-2, "yyyyMMdd") + "000000";  //년월일시분초
+//		goodsDao.deleteWmsProductSkuHst(delYyyymmdd);
+//		// TB_IF_PRODUCTSKU_HST 생성
+//		goodsDao.createWmsProductSkuHst(jobdate);
+//
+//	}
+	
 	/**
 	 * wms상품재고이력 생성
 	 *
@@ -494,45 +540,40 @@ public class TsbGoodsService {
 	 * @since 2021. 01. 07
 	 */
 	@Transactional("shopTxnManager")
-	public void createWmsProductSkuHst(String jobdate) {
+	public void createWmsStockHst(String jobdate) {
 
-		// TB_IF_PRODUCTSKU  작업
-		goodsDao.deleteIfProductSku();
-
-		// TB_IF_PRODUCTSKU  생성
-		Collection<IfProductSku> wmsIfProductSukList = wmsGoodsService.getWmsIfProductSukList();
-		String byrow = "Y";
-		if ("Y".equals(byrow)) {
-			for (IfProductSku ifProductSku : wmsIfProductSukList) {
-				goodsDao.createIfProductSkuByRow(ifProductSku);
-			}
-		} else {
-
-			List<IfProductSku> productSukList = new ArrayList<IfProductSku>();
-
-			GagaMap dataMap = new GagaMap();
-			int index = 0;
-			for (IfProductSku ifProductSku : wmsIfProductSukList) {
-
-				productSukList.add(ifProductSku);
-				index++;
-				if (index % 200 == 0 || wmsIfProductSukList.size() == index) {
-					dataMap.set("productSukList", productSukList);
-					goodsDao.createIfProductSku(dataMap);
-					productSukList.clear();
-				}
-			}
-
-		}
-
-		// TB_IF_PRODUCTSKU_HST 2달 전 데이터 삭제
+		// TB_WMS_STOCK_HST 2달 전 데이터 삭제
 		String delYyyymmdd = GagaDateUtil.getOffsetMonth(-2, "yyyyMMdd") + "000000";  //년월일시분초
-		goodsDao.deleteWmsProductSkuHst(delYyyymmdd);
-		// TB_IF_PRODUCTSKU_HST 생성
-		goodsDao.createWmsProductSkuHst(jobdate);
-
+		goodsDao.deleteWmsStockHst(delYyyymmdd);
+		// TB_WMS_STOCK_HST 생성
+		goodsDao.createWmsStockHst(jobdate);
 	}
+	
+	/**
+	 * shop 상품재고 생성
+	 *
+	 * @param jobdate
+	 * @return
+	 * @author eskim
+	 * @since 2021. 05. 27
+	 */
+	@Transactional("shopTxnManager")
+	public void createShopStock(String jobdate) {
 
+		// TB_SHOP_STOCK 작업
+		goodsDao.deleteShopStock();
+		goodsDao.createShopStock();
+		
+		// TB_SHOP_STOCK_HST 2달 전 데이터 삭제
+		String delYyyymmdd = GagaDateUtil.getOffsetMonth(-2, "yyyyMMdd") + "000000";  //년월일시분초
+		goodsDao.deleteShopStockHst(delYyyymmdd);
+		// TB_SHOP_STOCK_HST 생성
+		goodsDao.createShopStockHst(jobdate);
+	}
+	
+	
+	
+	
 	/**
 	 * WMS 임시 테이블에서 실테이블로 이관
 	 *
@@ -543,21 +584,27 @@ public class TsbGoodsService {
 	@Transactional("shopTxnManager")
 	public void saveGoodsStock() throws Exception {
 
-		// wms 재고 임시 테이블(TB_OPTION_SYNC_TEMP) 삭제
+		// wms 재고 임시 테이블(TB_OPTION_SYNC_TMP) 삭제
 		goodsDao.deleteTbOptionSyncTemp();
-		// wms 재고 임시 테이블(TB_OPTION_SYNC_TEMP) 적용 - 출고처별 판매비율 적용
+		// wms 재고 임시 테이블(TB_OPTION_SYNC_TMP) 적용 - 출고처별 판매비율 적용
 		goodsDao.createTbOptionSyncTemp();
-
-		// 입점 상품 재고 동기화 후 SELL_QTY 삭제
+//		// 매장재고 - 출고처별 판매비율 적용
+		goodsDao.saveTbOptionSyncTemp();
+		
+		// 입점 상품 재고 동기화 
 		updateOptionByOfSellQty();
 
 		// TB_OPTION = > TB_OPTION_SYNC 적용
 		goodsDao.deleteGoodsOptionSync();
-		goodsDao.createGoodsOptionSync();
+		goodsDao.createGoodsOptionSync();  // TB_OPTION_SYNC.CURR_STOCK_QTY, STORE_STOCK_QTY, STORE_MAX_QTY 초기화
 
-		// TB_OPTION_SYNC_TEMP => TB_OPTION_SYNC 변경적용
+		// TB_OPTION_SYNC_TMP => TB_OPTION_SYNC 변경적용
 		goodsDao.saveGoodsOptionSyncSync();
 
+		// WMS, 매장별 최대 주문수량 적용  == > 작업합시다.
+		//TB_SHOP_STOCK과 TB_OPTION_SYNC.CURR_STOCK_QTY 비교하여 STORE_MAX_QTY에 적용
+		goodsDao.updateGoodsOptionSyncSync();
+		  
 		// TB_OPTION_SYNC => TB_OPTION 적용
 		goodsDao.saveGoodsOptionNew();
 
@@ -630,50 +677,94 @@ public class TsbGoodsService {
 		goodsDao.createGoodsDispStock();
 	}
 
+//	/**
+//	 * TB_IF_PRODUCTSKU  삭제
+//	 *
+//	 * @author eskim
+//	 * @since 2020. 01. 11
+//	 */
+//	@Transactional("shopTxnManager")
+//	public void deleteIfProductSku() {
+//		goodsDao.deleteIfProductSku();
+//	}
+//
+//	/**
+//	 * TB_IF_PRODUCTSKU 생성(by row )
+//	 *
+//	 * @author eskim
+//	 * @since 2020. 01. 11
+//	 */
+//	@Transactional("shopTxnManager")
+//	public void createIfProductSkuByRow(IfProductSku ifProductSku) {
+//		goodsDao.createIfProductSkuByRow(ifProductSku);
+//	}
+//
+//	/**
+//	 * TB_IF_PRODUCTSKU 생성
+//	 *
+//	 * @author eskim
+//	 * @since 2020. 01. 11
+//	 */
+//	@Transactional("shopTxnManager")
+//	public void createIfProductSku(GagaMap dataMap) {
+//		goodsDao.createIfProductSku(dataMap);
+//	}
+//
+//	/**
+//	 * TB_IF_PRODUCTSKU_HST 저장
+//	 *
+//	 * @author eskim
+//	 * @since 2021. 01. 11
+//	 */
+//	@Transactional("shopTxnManager")
+//	public void createIfProductSku(String jobdate) {
+//		goodsDao.createWmsProductSkuHst(jobdate);
+//	}
+
 	/**
-	 * TB_IF_PRODUCTSKU  삭제
+	 * TB_WMS_STOCK  삭제
 	 *
 	 * @author eskim
 	 * @since 2020. 01. 11
 	 */
 	@Transactional("shopTxnManager")
-	public void deleteIfProductSku() {
-		goodsDao.deleteIfProductSku();
+	public void deleteWmsStock() {
+		goodsDao.deleteWmsStock();
 	}
 
 	/**
-	 * TB_IF_PRODUCTSKU 생성(by row )
+	 * TB_WMS_STOCK 생성(by row )
 	 *
 	 * @author eskim
 	 * @since 2020. 01. 11
 	 */
 	@Transactional("shopTxnManager")
-	public void createIfProductSkuByRow(IfProductSku ifProductSku) {
-		goodsDao.createIfProductSkuByRow(ifProductSku);
+	public void createWmsStockByRow(WmsStock wmsStock) {
+		goodsDao.createWmsStockByRow(wmsStock);
 	}
 
 	/**
-	 * TB_IF_PRODUCTSKU 생성
+	 * TB_WMS_STOCK 생성
 	 *
 	 * @author eskim
 	 * @since 2020. 01. 11
 	 */
 	@Transactional("shopTxnManager")
-	public void createIfProductSku(GagaMap dataMap) {
-		goodsDao.createIfProductSku(dataMap);
+	public void createWmsStock(GagaMap dataMap) {
+		goodsDao.createWmsStock(dataMap);
 	}
 
 	/**
-	 * TB_IF_PRODUCTSKU_HST 저장
+	 * TB_WMS_STOCK_HST 삭제
 	 *
 	 * @author eskim
 	 * @since 2021. 01. 11
 	 */
 	@Transactional("shopTxnManager")
-	public void createIfProductSku(String jobdate) {
-		goodsDao.createWmsProductSkuHst(jobdate);
+	public void deleteWmsStockHst(String jobdate) {
+		goodsDao.deleteWmsStockHst(jobdate);
 	}
-
+	
 	/**
 	 * 입고상품중 온라인 옵션이 없는 상품옵션 추가
 	 *

+ 36 - 1
src/main/java/com/style24/batch/biz/service/TsbNaverPayService.java

@@ -94,6 +94,8 @@ public class TsbNaverPayService {
 	}
 
 	public ChangedProductOrderInfo[] changedProductOrderList(ProductOrderChangeType option, Calendar from, Calendar to) throws Exception {
+		ChangedProductOrderInfo[] result = null;
+
 		String mallId = env.getProperty("naver.pay.mall.id");
 		String accessLicense = env.getProperty("naver.pay.access.license");
 		String secretKey = env.getProperty("naver.pay.secret.key");
@@ -128,7 +130,40 @@ public class TsbNaverPayService {
 		request.setInquiryTimeTo(to);
 		request.setLastChangedStatusCode(option);
 
-		// 이어서 진행
+		//GetChangedProductOrderList Response 수신
+		response = stub.getChangedProductOrderList(request);
+
+		String resultStr = "";
+		if (response.getResponseType() != null) {
+			resultStr = response.getResponseType().toUpperCase();
+		}
+
+		//결과 출력
+		/*if ("SUCCESS".equals(resultStr)) {
+			result = response.getChangedProductOrderInfoList();
+		} else {
+			CommonTemp commonTemp = new CommonTemp();
+
+			log.debug("response.getResponseType()) : " + response.getResponseType());
+			log.debug("option.toString() : " + option.toString());
+			log.debug("Code : " + response.getError().getCode());
+			log.debug("Message : " + response.getError().getMessage());
+			log.debug("Detail : " + response.getError().getDetail());
+
+			commonTemp.setData_01("변경상품주문조회 에러");
+			commonTemp.setData_02(option.toString());
+			commonTemp.setData_03(response.getError().getCode());
+			commonTemp.setData_04(response.getError().getMessage());
+			commonTemp.setData_05("");
+
+			commonTemp.setData_06(siteName);
+			commonTemp.setData_07(mallId);
+			commonTemp.setData_08(accessLicense);
+			commonTemp.setData_09(secretKey);
+			commonTemp.setData_10("");
+
+			commonTempService.insertCommonTempNpayLog(commonTemp);
+		}*/
 
 		return null;
 	}

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

@@ -74,4 +74,17 @@ public class TsbPointService {
 	public void updateCustPointExpire(Point point) {
 		pointDao.updateCustPointExpire(point);
 	}
+	
+	/**
+	 * 상품권 기간만료 알림톡(30일) 리스트
+	 *
+	 * @param point
+	 * @return Collection<Point>
+	 * @author sowon
+	 * @since  2021. 05. 28
+	 */
+	@Transactional("shopTxnManager")
+	public Collection<Point> getSendPointExpectList(Point point){
+		return pointDao.getSendPointExpectList(point);
+	}
 }

+ 4 - 4
src/main/java/com/style24/batch/biz/service/TsbWmsGoodsService.java

@@ -13,8 +13,8 @@ import com.style24.persistence.domain.GoodsIfIncomelotitem;
 import com.style24.persistence.domain.GoodsIfMeasurement;
 import com.style24.persistence.domain.IfBrand;
 import com.style24.persistence.domain.IfProduct;
-import com.style24.persistence.domain.IfProductSku;
 import com.style24.persistence.domain.IfProvider;
+import com.style24.persistence.domain.WmsStock;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -154,10 +154,10 @@ public class TsbWmsGoodsService {
 	 *
 	 * @return
 	 * @author eskim
-	 * @since 2021. 01. 06
+	 * @since 2021. 05. 26
 	 */
-	public Collection<IfProductSku> getWmsIfProductSukList() {
-		return wmsGoodsDao.getWmsIfProductSukList();
+	public Collection<WmsStock> getWmsStockList() {
+		return wmsGoodsDao.getWmsStockList();
 	}
 
 }

+ 19 - 2
src/main/java/com/style24/batch/biz/task/TsbCustomerTask.java

@@ -15,6 +15,7 @@ import com.style24.batch.biz.job.customer.TsbSecedeProcessJob;
 import com.style24.batch.biz.job.marketing.TsbAutoBuyConfirmJob;
 import com.style24.batch.biz.job.marketing.TsbBirthdayCouponNoticeJob;
 import com.style24.batch.biz.job.marketing.TsbExpectGiftcardJob;
+import com.style24.batch.biz.job.marketing.TsbExpectPointJob;
 import com.style24.batch.biz.job.marketing.TsbExpireGiftcardJob;
 import com.style24.batch.biz.job.marketing.TsbExpirePointJob;
 import com.style24.batch.biz.job.marketing.TsbReviewGuideJob;
@@ -59,6 +60,9 @@ public class TsbCustomerTask {
 
 	@Autowired
 	private TsbExpirePointJob expirePointJob;
+	
+	@Autowired
+	private TsbExpectPointJob expectPointJob;
 
 	@Autowired
 	private TsbExpireGiftcardJob expireGiftcardJob;
@@ -197,6 +201,19 @@ public class TsbCustomerTask {
 	public void pointExpireJob() throws Exception {
 		expirePointJob.runById("cron.customer.point.expire");
 	}
+	
+	/**
+	 * 포인트 기간만료 알림톡(30일)
+	 *
+	 * @throws Exception - 예외처리
+	 * @author sowon
+	 * @since 2021. 05. 28
+	 */
+	@Scheduled(cron = "${cron.customer.point.expect.notify}")
+	@Async
+	public void pointExpectJob() throws Exception {
+		expectPointJob.runById("cron.customer.point.expect.notify");
+	}
 
 	/**
 	 * 상품권 소멸처리
@@ -218,10 +235,10 @@ public class TsbCustomerTask {
 	 * @author sowon
 	 * @since 2021. 05. 27
 	 */
-	@Scheduled(cron = "${cron.customer.giftcard.expect}")
+	@Scheduled(cron = "${cron.customer.giftcard.expect.notify}")
 	@Async
 	public void giftcardExpectJob() throws Exception {
-		expectGiftcardJob.runById("cron.customer.giftcard.expect");
+		expectGiftcardJob.runById("cron.customer.giftcard.expect.notify");
 	}
 
 	/**

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

@@ -233,6 +233,7 @@ public class TsbGoodsTask {
 	 * @throws Exception
 	 */
 	@Scheduled(cron = "${cron.goods.wms.stock.receive}")
+	@Scheduled(fixedDelay = 3500000)
 	@Async
 	public void wmsStockReceiveJob() throws Exception {
 		goodsWmsGoodsStockJob.runById("cron.goods.wms.stock.receive");

+ 16 - 2
src/main/java/com/style24/batch/biz/web/TsbCustomerController.java

@@ -211,6 +211,20 @@ public class TsbCustomerController extends TscBaseController {
 		expirePointJob.runById("cron.customer.point.expire");
 		return "OK";
 	}
+	
+	/**
+	 * 포인트 소멸예정 알림톡
+	 *
+	 * @throws Exception - 예외처리
+	 * @author sowon
+	 * @since 2021. 05. 28
+	 */
+	@GetMapping("/point/expect/notify")
+	@ResponseBody
+	public String expectpoint() throws Exception {
+		expectGiftcardJob.runById("cron.customer.point.expect.notify");
+		return "OK";
+	}
 
 	/**
 	 * 상품권 소멸처리
@@ -233,10 +247,10 @@ public class TsbCustomerController extends TscBaseController {
 	 * @author sowon
 	 * @since 2021. 05. 27
 	 */
-	@GetMapping("/giftcard/expect")
+	@GetMapping("/giftcard/expect/notify")
 	@ResponseBody
 	public String expectGiftcard() throws Exception {
-		expectGiftcardJob.runById("cron.customer.giftcard.expect");
+		expectGiftcardJob.runById("cron.customer.giftcard.expect.notify");
 		return "OK";
 	}
 

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

@@ -0,0 +1,23 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * wms 연동 상품재고정보 Domain
+ *
+ * @author eskim
+ * @since 2021. 05. 26
+ */
+@SuppressWarnings("serial")
+@Data
+public class WmsStock extends TscBaseDomain {
+
+	private int productNo;		//ProductNo(WMS)
+	private String skuCode;		//옵션코드
+	private int locQty;			//위치재고수량
+	private int pickingQty;		//피킹수량
+	private int eoutPickingQty;	//EOUT피킹수량
+
+}

+ 331 - 55
src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml

@@ -1663,6 +1663,85 @@
 		FROM TB_IF_PRODUCTSKU
 	</insert>
 	
+	<!-- TB_WMS_STOCK 삭제 -->
+	<delete id="deleteWmsStock"  timeout="300">
+		/* TsbGoods.deleteWmsStock */
+		DELETE FROM TB_WMS_STOCK
+	</delete>
+	
+	<!-- TB_WMS_STOCK 저장 -->
+	<insert id="createWmsStock"  parameterType="java.util.HashMap" >
+		/* TsbGoods.createWmsStock */
+		INSERT INTO TB_WMS_STOCK(
+		      PRODUCT_NO      
+		      ,SKU_CODE        
+		      ,LOC_QTY         
+		      ,PICKING_QTY     
+		      ,EOUT_PICKING_QTY
+		      ,UPD_DT 
+		)
+		VALUES
+		<foreach collection="productSukList" item="item" index="index"  separator=",">
+		(
+		       #{item.productNo}
+		     , #{item.skuCode}
+		     , #{item.locQty}
+		     , #{item.pickingQty}
+		     , #{item.eoutPickingQty}
+		     , NOW()
+		)
+		</foreach>
+		
+	</insert>
+	
+	<!-- TB_IF_PRODUCTSKU 저장 -->
+	<insert id="createWmsStockByRow"  parameterType="WmsStock">
+		/* TsbGoods.createWmsStockByRow */
+		INSERT INTO TB_WMS_STOCK(
+		       PRODUCT_NO      
+		      ,SKU_CODE        
+		      ,LOC_QTY         
+		      ,PICKING_QTY     
+		      ,EOUT_PICKING_QTY
+		      ,UPD_DT
+		)
+		VALUES(
+		       #{productNo}
+		     , #{skuCode}
+		     , #{locQty}
+		     , #{pickingQty}
+		     , #{eoutPickingQty}
+		     , NOW()
+		)
+	</insert>
+	
+	<!-- TB_IF_PRODUCTSKU_HST 삭제 -->
+	<delete id="deleteWmsStockHst"  parameterType="String" timeout="300">
+		/* TsbGoods.deleteWmsStockHst */
+		DELETE FROM TB_WMS_STOCK_HST
+		WHERE JOBDATE <![CDATA[<=]]> #{jobdate} 
+	</delete>
+	
+	<!-- TB_IF_PRODUCTSKU_HST 저장 -->
+	<insert id="createWmsStockHst"  parameterType="String" timeout="300">
+		/* TsbGoods.createWmsStockHst */
+		INSERT INTO TB_WMS_STOCK_HST(
+		       JOBDATE
+		      ,PRODUCT_NO      
+		      ,SKU_CODE        
+		      ,LOC_QTY         
+		      ,PICKING_QTY     
+		      ,EOUT_PICKING_QTY
+		)
+		SELECT #{jobdate}
+		      ,PRODUCT_NO      
+		      ,SKU_CODE        
+		      ,LOC_QTY         
+		      ,PICKING_QTY     
+		      ,EOUT_PICKING_QTY
+		FROM TB_WMS_STOCK
+	</insert>
+	
 	<!-- TB_GOODS_STOCK 삭제 -->
 	<delete id="deleteGoodsDispStock" timeout="300">
 		/* TsbGoods.deleteGoodsDispStock */
@@ -1733,6 +1812,7 @@
 		     , BASE_STOCK_QTY
 		     , CURR_STOCK_QTY
 		     , STORE_STOCK_QTY
+		     , STORE_MAX_QTY
 		     , ADD_PRICE
 		     , SOLDOUT_YN
 		     , DISP_ORD
@@ -1752,7 +1832,82 @@
 		     , PRODUCT_CODE
 		     , 0 AS BASE_STOCK_QTY
 		     , CURR_STOCK_QTY
+		     , 0 AS STORE_STOCK_QTY
+		     , 0 AS STORE_MAX_QTY
+		     , 0 AS ADD_PRICE
+		     , 'N' AS SOLDOUT_YN
+		     , DISP_ORD
+		     , 'Y' AS DISP_YN
+		     , ERP_STOCK_LINK_YN
+		     , 0 AS REG_NO
+		     , NOW() AS REG_DT
+		     , 0 AS UPD_NO
+		     , NOW() AS UPD_DT
+		FROM (
+		      SELECT B.GOODS_CD
+		           , A.SKU_CODE AS OPT_CD
+		           , E.OPT_CD1
+		           , E.OPT_CD2
+		           , E.SKU_MODEL_NO
+		           , E.PRODUCT_NO
+		           , E.PRODUCT_CODE
+		           , ROUND((GREATEST(A.LOC_QTY, 0) -  GREATEST(A.PICKING_QTY, 0)  - GREATEST(A.EOUT_PICKING_QTY, 0)) * (IFNULL(D.STOCK_APPL_RATE, 0)/100)) AS CURR_STOCK_QTY
+		           , E.STORE_STOCK_QTY
+		           , E.DISP_ORD
+		           , B.ERP_STOCK_LINK_YN
+		      FROM TB_WMS_STOCK A
+		      INNER JOIN TB_OPTION E ON A.PRODUCT_NO = E.PRODUCT_NO
+		                             AND A.SKU_CODE = E.OPT_CD
+		      INNER JOIN TB_GOODS B ON E.GOODS_CD = B.GOODS_CD
+		                            AND B.SELF_GOODS_YN = 'Y'
+		                            AND B.ERP_STOCK_LINK_YN = 'Y'
+		      INNER JOIN TB_STOCK_SYNC_BASE C ON B.BRAND_CD = C.BRAND_CD
+		                                      AND C.STOCK_SYNC_YN = 'Y'
+		                                      AND C.DELV_LOC_CD = 'DL001'    -- WMS 매장코드
+		      INNER JOIN TB_DELIVERY_LOC D ON B.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
+		                                   AND C.DELV_LOC_CD = D.DELV_LOC_CD
+		                                   AND D.USE_YN = 'Y'
+		                                   AND D.DELV_LOC_CD = 'DL001'    -- WMS 매장코드
+		     ) Z
+	</insert>
+	
+	<!--매장 재고 임시 테이블 이관  -->
+	<insert id="saveTbOptionSyncTemp"   timeout="300">
+		/* TsbGoods.saveTbOptionSyncTemp */
+		INSERT INTO TB_OPTION_SYNC_TMP
+		(
+		       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
+		     , ERP_STOCK_LINK_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT GOODS_CD
+		     , OPT_CD
+		     , OPT_CD1
+		     , OPT_CD2
+		     , SKU_MODEL_NO
+		     , PRODUCT_NO
+		     , PRODUCT_CODE
+		     , 0 AS BASE_STOCK_QTY
+		     , 0 AS CURR_STOCK_QTY
 		     , STORE_STOCK_QTY
+		     , 0 AS STORE_MAX_QTY
 		     , 0 AS ADD_PRICE
 		     , 'N' AS SOLDOUT_YN
 		     , DISP_ORD
@@ -1763,46 +1918,27 @@
 		     , 0 AS UPD_NO
 		     , NOW() AS UPD_DT
 		FROM (
-		      SELECT GOODS_CD
-		           , OPT_CD
-		           , OPT_CD1
-		           , OPT_CD2
-		           , SKU_MODEL_NO
-		           , PRODUCT_NO
-		           , PRODUCT_CODE
-		           , SUM(CURR_STOCK_QTY) AS CURR_STOCK_QTY
-		           , STORE_STOCK_QTY
-		           , IFNULL((SELECT (MAX(DISP_ORD) + 1) AS DISP_ORD 
-		                  FROM TB_OPTION WHERE GOODS_CD = Z.GOODS_CD) , ROW_NUMBER() OVER(PARTITION BY GOODS_CD ORDER BY OPT_CD)) AS DISP_ORD
-		           , ERP_STOCK_LINK_YN
-		       FROM (
-		           SELECT B.GOODS_CD
-		                , A.SKUCODE AS OPT_CD
-		                , MAX(A.OPTION1) AS OPT_CD1
-		                , MAX(A.OPTION2) AS OPT_CD2
-		                , MAX(A.SKUMODELNO) AS SKU_MODEL_NO
-		                , MAX(E.PRODUCT_NO) AS PRODUCT_NO
-		                , MAX(E.PRODUCT_CODE) AS PRODUCT_CODE
-		                , ROUND(GREATEST(A.SELLINGSTOCKAMOUNT, 0) * (IFNULL(D.STOCK_APPL_RATE, 0)/100)) AS CURR_STOCK_QTY
-		                , MAX(E.STORE_STOCK_QTY) AS STORE_STOCK_QTY
-		                , MAX(B.ERP_STOCK_LINK_YN) AS ERP_STOCK_LINK_YN
-		                , D.DELV_LOC_CD
-		                , D.STOCK_APPL_RATE
-		           FROM TB_IF_PRODUCTSKU A 
-		           INNER JOIN TB_OPTION E ON A.SKUCODE = E.OPT_CD
-		                                  AND A.PRODUCTNO = E.PRODUCT_NO
-		           INNER JOIN TB_GOODS B ON E.GOODS_CD = B.GOODS_CD
-		                                 AND B.SELF_GOODS_YN = 'Y'
-		           INNER JOIN TB_STOCK_SYNC_BASE C ON B.BRAND_CD = C.BRAND_CD
-		                                           AND C.STOCK_SYNC_YN = 'Y'
-		           INNER JOIN TB_DELIVERY_LOC D ON B.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
-		                                        AND C.DELV_LOC_CD = D.DELV_LOC_CD
-		                                        AND D.USE_YN = 'Y'
-		           WHERE 1 = 1
-		           GROUP BY B.GOODS_CD, A.SKUCODE, D.DELV_LOC_CD, D.STOCK_APPL_RATE
-		           ) Z
-		       GROUP BY GOODS_CD, OPT_CD, OPT_CD1 , OPT_CD2, SKU_MODEL_NO, PRODUCT_NO, PRODUCT_CODE, STORE_STOCK_QTY, ERP_STOCK_LINK_YN
-		      ) Y
+		      SELECT E.GOODS_CD
+		           , E.OPT_CD
+		           , E.OPT_CD1
+		           , E.OPT_CD2
+		           , E.SKU_MODEL_NO
+		           , E.PRODUCT_NO
+		           , E.PRODUCT_CODE
+		           , E.CURR_STOCK_QTY
+		           , SUM(A.STORE_STOCK_QTY) AS STORE_STOCK_QTY
+		           , B.ERP_STOCK_LINK_YN
+		           , E.DISP_ORD
+		      FROM TB_SHOP_STOCK A
+		      INNER JOIN TB_OPTION E ON A.CD_STYLE = E.GOODS_CD
+		                             AND A.OPT_CD = E.OPT_CD
+		      INNER JOIN TB_GOODS B ON E.GOODS_CD = B.GOODS_CD
+		                            AND B.SELF_GOODS_YN = 'Y'
+		                            AND B.ERP_STOCK_LINK_YN = 'Y'
+		      GROUP BY GOODS_CD , OPT_CD , OPT_CD1 , OPT_CD2 , SKU_MODEL_NO , PRODUCT_NO , PRODUCT_CODE , CURR_STOCK_QTY , DISP_ORD , ERP_STOCK_LINK_YN
+		  ) Z
+		ON DUPLICATE KEY UPDATE
+		     STORE_STOCK_QTY = Z.STORE_STOCK_QTY
 	</insert>
 	
 	<!-- 입점상품 SELL_QTY 목록 조회 -->
@@ -1837,6 +1973,7 @@
 		    , BASE_STOCK_QTY
 		    , CURR_STOCK_QTY
 		    , STORE_STOCK_QTY
+		    , STORE_MAX_QTY
 		    , ADD_PRICE
 		    , SOLDOUT_YN
 		    , DISP_ORD
@@ -1857,6 +1994,7 @@
 		     , BASE_STOCK_QTY
 		     , CURR_STOCK_QTY
 		     , STORE_STOCK_QTY
+		     , STORE_MAX_QTY
 		     , ADD_PRICE
 		     , SOLDOUT_YN
 		     , DISP_ORD
@@ -1873,8 +2011,8 @@
 	<!-- 상품 재고 정보 저장 -->
 	<update id="updateStock" parameterType="Option"  timeout="300">
 		/* TsbGoods.updateStock */
-		UPDATE TB_STOCK
-		SET CURR_ON_STOCK_QTY = GREATEST(CURR_ON_STOCK_QTY - #{saleStockQty},0)
+		UPDATE TB_OPTION
+		SET CURR_STOCK_QTY = GREATEST(CURR_STOCK_QTY - #{saleStockQty},0)
 		  , UPD_NO = #{updNo}
 		  , UPD_DT = NOW()
 		WHERE GOODS_CD = #{goodsCd}
@@ -1902,6 +2040,7 @@
 		     , BASE_STOCK_QTY
 		     , CURR_STOCK_QTY
 		     , STORE_STOCK_QTY
+		     , STORE_MAX_QTY
 		     , ADD_PRICE
 		     , SOLDOUT_YN
 		     , DISP_ORD
@@ -1920,8 +2059,9 @@
 		     , B.PRODUCT_NO
 		     , B.PRODUCT_CODE
 		     , B.BASE_STOCK_QTY
-		     , B.CURR_STOCK_QTY
-		     , B.STORE_STOCK_QTY
+		     , 0 AS CURR_STOCK_QTY
+		     , 0 AS STORE_STOCK_QTY
+		     , 0 AS STORE_MAX_QTY
 		     , B.ADD_PRICE
 		     , B.SOLDOUT_YN
 		     , B.DISP_ORD
@@ -1932,48 +2072,91 @@
 		     , B.UPD_NO
 		     , B.UPD_DT
 		FROM   TB_GOODS A, TB_OPTION B
-		WHERE  A.GOODS_CD = B.GOODS_CD
+		WHERE  A.ERP_STOCK_LINK_YN = 'Y'
+		AND    A.GOODS_CD = B.GOODS_CD
 	</insert>
 	
 	<!-- TB_OPTION_SYNC_TMP => TB_OPTION_SYNC 변경적용-->
-	<insert id="saveGoodsOptionSyncSync"  timeout="300">
+	<update id="saveGoodsOptionSyncSync"  timeout="300">
 		/* TsbGoods.saveGoodsOptionSyncSync */
 		UPDATE TB_OPTION_SYNC A, (SELECT GOODS_CD
 		                               , OPT_CD
 		                               , CURR_STOCK_QTY
+		                               , STORE_STOCK_QTY
 		                               , ERP_STOCK_LINK_YN
 		                          FROM TB_OPTION_SYNC_TMP
 		                          WHERE ERP_STOCK_LINK_YN = 'Y'
 		                          ) B
 		SET A.CURR_STOCK_QTY = B.CURR_STOCK_QTY
+		  , A.STORE_STOCK_QTY = B.STORE_STOCK_QTY
 		  , A.UPD_NO = 0
 		  , A.UPD_DT = NOW()
 		WHERE A.GOODS_CD = B.GOODS_CD
 		AND A.OPT_CD = B.OPT_CD
 		<![CDATA[
-		AND A.CURR_STOCK_QTY <> B.CURR_STOCK_QTY
+		AND (A.CURR_STOCK_QTY <> B.CURR_STOCK_QTY
+		    OR
+		    A.STORE_STOCK_QTY <> B.STORE_STOCK_QTY
+		    )
 		]]>
-	</insert>
+	</update>
+	
+	<!-- TB_OPTION_SYNC 매장별 최대구매수량 적용-->
+	<update id="updateGoodsOptionSyncSync"  timeout="300">
+		/* TsbGoods.updateGoodsOptionSyncSync */
+		UPDATE TB_OPTION_SYNC A, (SELECT GOODS_CD
+		                               , OPT_CD
+		                               , STORE_MAX_QTY
+		                          FROM (     
+		                                SELECT GOODS_CD
+		                                     , OPT_CD
+		                                     , GREATEST(CURR_STOCK_QTY, QT_STOCK) AS STORE_MAX_QTY
+		                                FROM (
+		                                         SELECT OS.GOODS_CD
+		                                              , OS.OPT_CD
+		                                              , GREATEST(OS.CURR_STOCK_QTY, 0)  AS CURR_STOCK_QTY
+		                                              , GREATEST(IFNULL(SS.QT_STOCK, 0), 0) AS QT_STOCK
+		                                         FROM TB_OPTION_SYNC OS
+		                                         LEFT OUTER JOIN TB_SHOP_STOCK SS ON OS.GOODS_CD = SS.CD_STYLE
+		                                                                       AND OS.OPT_CD = SS.OPT_CD
+		                                         WHERE OS.ERP_STOCK_LINK_YN = 'Y'
+		                                      ) Z
+		                               ) WHERE STORE_MAX_QTY > 0
+		                           ) B
+		SET A.STORE_MAX_QTY = B.STORE_MAX_QTY
+		  , A.UPD_NO = 0
+		  , A.UPD_DT = NOW()
+		WHERE A.GOODS_CD = B.GOODS_CD
+		AND A.OPT_CD = B.OPT_CD
+		<![CDATA[
+		AND A.STORE_MAX_QTY <> B.STORE_MAX_QTY
+		]]>
+	</update>
 	
 	<!-- WMS 임시 테이블에서 실테이블로 변경 -->
-	<insert id="saveGoodsOptionNew"  timeout="300">
+	<update id="saveGoodsOptionNew"  timeout="300">
 		/* TsbGoods.saveGoodsOptionNew */
 		UPDATE TB_OPTION A, (SELECT GOODS_CD
 		                          , OPT_CD
 		                          , CURR_STOCK_QTY
+		                          , STORE_STOCK_QTY
 		                          , ERP_STOCK_LINK_YN
 		                      FROM TB_OPTION_SYNC
 		                      WHERE ERP_STOCK_LINK_YN = 'Y'
 		                      ) B
 		SET A.CURR_STOCK_QTY = B.CURR_STOCK_QTY
+		  , A.STORE_STOCK_QTY = B.STORE_STOCK_QTY
 		  , A.UPD_NO = 0
 		  , A.UPD_DT = NOW()
 		WHERE A.GOODS_CD = B.GOODS_CD
 		AND A.OPT_CD = B.OPT_CD
 		<![CDATA[
-		AND A.CURR_STOCK_QTY <> B.CURR_STOCK_QTY
+		AND (A.CURR_STOCK_QTY <> B.CURR_STOCK_QTY
+		    OR
+		    A.STORE_STOCK_QTY <> B.STORE_STOCK_QTY
+		    )
 		]]>
-	</insert>
+	</update>
 		
 	<!-- TB_SELL_QTY_TMP 테이블 삭제 -->
 	<delete id="deleteTtbSellQtyTemp"  timeout="300">
@@ -2044,11 +2227,11 @@
 		WHERE ORD_DTL_NO IN (
 		                     SELECT OD.ORD_DTL_NO
 		                     FROM TB_ORDER_DETAIL OD
-		                        , TB_ORDER_DETAIL_ITEM ODI
+		                        -- , TB_ORDER_DETAIL_ITEM ODI
 		                        , TB_GOODS G
 		                     WHERE OD.ORD_DTL_NO = ODI.ORD_DTL_NO
-		                     AND OD.ORD_DTL_STAT IN ('G013_10','G013_20') -- 입금대기, 결제완료
-		                     AND ODI.ITEM_CD = G.GOODS_CD
+		                     AND OD.ORD_DTL_STAT IN ('G013_10','G013_20','G013_25','G013_30','G013_35','G013_40') -- 입금대기, 결제완료, 교환대기, 상품준비중,출고처지정,배송준비중
+		                     AND OD.GOODS_CD = G.GOODS_CD
 		                     AND G.SELF_GOODS_YN ='Y'
 		                    )
 	</insert>
@@ -2087,7 +2270,7 @@
 		      FROM TB_ORDER_DETAIL OD
 		         , TB_ORDER_DETAIL_ITEM ODI
 		      WHERE OD.ORD_DTL_NO = ODI.ORD_DTL_NO
-		      AND OD.ORD_DTL_STAT IN ('G013_10','G013_20') -- 입금대기, 결제완료
+		      AND OD.ORD_DTL_STAT IN ('G013_10','G013_20','G013_25','G013_30','G013_35','G013_40') -- 입금대기, 결제완료, 교환대기, 상품준비중,출고처지정,배송준비중
 		      AND EXISTS (SELECT 1 FROM TB_OPTION X WHERE X.GOODS_CD = ODI.ITEM_CD AND X.OPT_CD = ODI.OPT_CD)
 		      GROUP BY ODI.ITEM_CD, ODI.OPT_CD, OD.ORD_DTL_NO, OD.AGENT_ORDER_ID, OD.EXTMALL_ORDER_ID
 		     ) A
@@ -2114,6 +2297,7 @@
 		     , BASE_STOCK_QTY
 		     , CURR_STOCK_QTY
 		     , STORE_STOCK_QTY
+		     , STORE_MAX_QTY
 		     , ADD_PRICE
 		     , SOLDOUT_YN
 		     , DISP_ORD
@@ -2133,6 +2317,7 @@
 		     , 0 AS BASE_STOCK_QTY
 		     , E.NORMALQTY AS CURR_STOCK_QTY
 		     , 0 AS STORE_STOCK_QTY
+		     , E.NORMALQTY AS STORE_MAX_QTY
 		     , 0 AS ADD_PRICE
 		     , 'N' AS SOLDOUT_YN
 		     , IFNULL((SELECT (MAX(DISP_ORD) + 1)
@@ -2495,4 +2680,95 @@
 		       ) Z
 	</insert>
 	
+	<!-- TB_SHOP_STOCK 삭제 -->
+	<delete id="deleteShopStock"  timeout="300">
+		/* TsbGoods.deleteShopStock */
+		DELETE FROM TB_SHOP_STOCK
+	</delete>
+
+	<!-- TB_SHOP_STOCK 저장 -->
+	<insert id="createShopStock" >
+		/* TsbGoods.createShopStock */
+		INSERT INTO TB_SHOP_STOCK(
+		      SUPPLY_COMP_CD   
+		    , CD_SHOP          
+		    , CD_STYLE         
+		    , CD_COLOR         
+		    , CD_SIZE          
+		    , QT_STOCK         
+		    , OPT_CD           
+		    , OPT_CD1          
+		    , STORE_STOCK_QTY  
+		    , UPD_DT           
+		)
+		SELECT A.SUPPLY_COMP_CD
+		     , A.CD_SHOP
+		     , A.CD_STYLE
+		     , A.CD_COLOR
+		     , A.CD_SIZE
+		     , A.QT_STOCK
+		     , E.OPT_CD
+		     , E.OPT_CD1
+		     , ROUND(GREATEST(A.QT_STOCK, 0) * (IFNULL(D.STOCK_APPL_RATE, 0)/100)) AS STORE_STOCK_QTY
+		     , NOW()
+		FROM (SELECT S.SUPPLY_COMP_CD
+		          , S.CD_SHOP
+		          , S.CD_STYLE
+		          , S.CD_COLOR
+		          , S.CD_SIZE
+		          , S.QT_STOCK
+		          , M.COLOR_CD AS OPT_CD1
+		     FROM TB_SHOP_GOODS_STOCK S
+		     INNER JOIN TB_WMS_COLOR_MAPPING M ON S.SUPPLY_COMP_CD = M.SUPPLY_COMP_CD
+		                                       AND S.CD_COLOR = M.WMS_COLOR_CD
+		                                       AND M.USE_YN = 'Y') A
+		INNER JOIN TB_OPTION E ON A.CD_STYLE = E.GOODS_CD
+		                       AND A.OPT_CD1 = E.OPT_CD1
+		                       AND A.CD_SIZE = E.OPT_CD2
+		INNER JOIN TB_GOODS B ON A.CD_STYLE = B.GOODS_CD
+		                      AND B.SELF_GOODS_YN = 'Y'
+		                      AND B.ERP_STOCK_LINK_YN = 'Y'
+		INNER JOIN TB_STOCK_SYNC_BASE C ON B.BRAND_CD = C.BRAND_CD
+		                                AND C.STOCK_SYNC_YN = 'Y'
+		                                AND A.CD_SHOP = C.DELV_LOC_CD
+		INNER JOIN TB_DELIVERY_LOC D ON A.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
+		                             AND A.CD_SHOP = D.DELV_LOC_CD
+		                             AND D.USE_YN = 'Y'
+	</insert>
+	
+	<!-- TB_SHOP_STOCK_HST 삭제 -->
+	<delete id="deleteShopStockHst"  parameterType="String" timeout="300">
+		/* TsbGoods.deleteShopStockHst */
+		DELETE FROM TB_SHOP_STOCK_HST
+		WHERE JOBDATE <![CDATA[<=]]> #{jobdate} 
+	</delete>
+	
+	<!-- TB_SHOP_STOCK_HST 저장 -->
+	<insert id="createShopStockHst"  parameterType="String" timeout="300">
+		/* TsbGoods.createShopStockHst */
+		INSERT INTO TB_SHOP_STOCK_HST(
+		       JOBDATE
+		     , SUPPLY_COMP_CD
+		     , CD_SHOP
+		     , CD_STYLE
+		     , CD_COLOR
+		     , CD_SIZE
+		     , QT_STOCK
+		     , OPT_CD
+		     , OPT_CD1
+		     , STORE_STOCK_QTY
+		)
+		SELECT #{jobdate}
+		      SUPPLY_COMP_CD
+		     , CD_SHOP
+		     , CD_STYLE
+		     , CD_COLOR
+		     , CD_SIZE
+		     , QT_STOCK
+		     , OPT_CD
+		     , OPT_CD1
+		     , STORE_STOCK_QTY
+		FROM TB_SHOP_STOCK
+	</insert>
+	
 </mapper>

+ 15 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsbPoint.xml

@@ -88,4 +88,19 @@
 		WHERE  CUST_PNT_SQ = #{custPntSq}
 	</update>
 	
+	<select id="getSendPointExpectList" parameterType="Point" resultType="Point">
+		/*TsbPointDao.getSendPointExpectList*/
+		SELECT  C.CUST_NO 
+		      , C.CUST_NM 
+		      , C.CELL_PHNNO 
+		      , DATE_FORMAT(CP.EXP_BE_DT, '%Y.%m.%d') AS EXP_BE_DT
+		      , CP.RM_PNT_AMT 
+		FROM TB_CUST_POINT CP INNER JOIN TB_CUSTOMER C 
+		                  ON CP.CUST_NO = C.CUST_NO 
+		WHERE CP.EXP_BE_DT BETWEEN CONCAT(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 30 DAY),'%Y-%m-%d'), ' 00:00:00') AND CONCAT(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 30 DAY),'%Y-%m-%d'), ' 23:59:59')
+		AND CP.RM_PNT_AMT > 0
+		AND CP.EXP_CMP_DT IS NULL
+		AND C.CUST_STAT = 'G104_10' /*활동회원 만 */
+	</select>
+	
 </mapper>

+ 21 - 0
src/main/java/com/style24/persistence/mybatis/wms/TsbWmsGoods.xml

@@ -234,4 +234,25 @@
 		-- AND B.PRODUCTNO  IN (16561091 ,16561090)   -- 테스트용
 	</select>
 	
+		<!-- WMS view 재고 테이블 조회   -->
+	<select id="getWmsStockList"  resultType="WmsStock">
+		/* TsbWmsGoods.getWmsStockList */
+		SELECT PRODUCT_NO 
+		     , SKU_CODE
+		     , LOC_QTY
+		     , PICKING_QTY
+		     , EOUT_PICKING_QTY
+		FROM (
+		     SELECT PRODUCT_NO
+		          , SKU_CODE
+		          , SUM(LOC_QTY) AS LOC_QTY
+		          , SUM(PICKING_QTY) AS PICKING_QTY 
+		          , SUM(EOUT_PICKING_QTY) AS EOUT_PICKING_QTY
+		     FROM iSTYLE24_WMS.DBO.VW_STOCK_BY_LOCCODE
+		     GROUP BY PRODUCT_NO, SKU_CODE
+		) Z
+		WHERE 1 = 1
+		AND LOC_QTY - PICKING_QTY - EOUT_PICKING_QTY > 0
+	</select>
+	
 </mapper>

+ 3 - 1
src/main/resources/config/application.yml

@@ -52,7 +52,9 @@ cron:
         point.expire: 2 22 2 29 2 ?            #포인트 소멸 처리
         giftcard.expire : 2 22 2 29 2 ?        #상품권 소멸 처리
         review.register.notify: 2 22 2 29 2 ?  #상품평등록안내 발송(일배치)
-        giftcard.expect : 2 22 2 29 2 ?        #상품권 소멸예정 알림톡
+        giftcard.expect.notify : 2 22 2 29 2 ? #상품권 소멸예정 알림톡
+        point.expect.notify : 2 22 2 29 2 ?    #포인트 소멸예정 알림톡
+        coupon.expect.notify : 2 22 2 29 2 ?    #쿠폰 소멸예정 알림톡
         
 
     # 전시