Browse Source

Merge branch 'develop' of http://112.172.147.34:4936/style24/STYLE24.git into develop

gagamel 5 years ago
parent
commit
beba284b3d
22 changed files with 763 additions and 124 deletions
  1. 9 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaMarketingDao.java
  2. 68 8
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaMarketingService.java
  3. 39 18
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
  4. 12 1
      style24.admin/src/main/java/com/style24/persistence/domain/MoreBetter.java
  5. 1 1
      style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterBurden.java
  6. 9 64
      style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterGoods.java
  7. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterSection.java
  8. 32 4
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaMarketing.xml
  9. 48 22
      style24.admin/src/main/webapp/WEB-INF/views/marketing/MorebetterRegForm.html
  10. 67 0
      style24.batch/src/main/java/com/style24/batch/biz/dao/TsbGoodsDao.java
  11. 11 0
      style24.batch/src/main/java/com/style24/batch/biz/dao/TsbWmsGoodsDao.java
  12. 1 1
      style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsIncomelotJob.java
  13. 1 1
      style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsMeasurementJob.java
  14. 1 1
      style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsProductJob.java
  15. 76 0
      style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsProductStockJob.java
  16. 75 0
      style24.batch/src/main/java/com/style24/batch/biz/service/TsbGoodsService.java
  17. 11 0
      style24.batch/src/main/java/com/style24/batch/biz/service/TsbWmsGoodsService.java
  18. 18 1
      style24.batch/src/main/java/com/style24/batch/biz/task/TsbGoodsTask.java
  19. 33 0
      style24.batch/src/main/java/com/style24/persistence/domain/IfProductSku.java
  20. 227 0
      style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml
  21. 21 0
      style24.batch/src/main/java/com/style24/persistence/mybatis/wms/TsbWmsGoods.xml
  22. 1 0
      style24.batch/src/main/resources/config/application-locd.yml

+ 9 - 0
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaMarketingDao.java

@@ -68,6 +68,15 @@ public interface TsaMarketingDao {
 	 */
 	void saveMorebetterMst(MoreBetter tmtb);
 
+	/**
+	 * 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
+	 * @param MoreBetter
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 7
+	 */
+	void saveMorebetterGoods(MoreBetterGoods regSupplyComp);
+
 	/**
 	 * 다다익선 할인구간설정 2차조건(TB_TMTB_SECTION) 저장
 	 * @param MoreBetter

+ 68 - 8
style24.admin/src/main/java/com/style24/admin/biz/service/TsaMarketingService.java

@@ -138,24 +138,86 @@ public class TsaMarketingService {
 		tmtb.setRegNo(TsaSession.getInfo().getUserNo());
 		tmtb.setUdpNo(TsaSession.getInfo().getUserNo());
 
-
 		// TMTB 마스터(TB_TMTB) 저장
 		marketingDao.saveMorebetterMst(tmtb);
 
+		// 다다익선 적용대상 설정
+		// 공급업체
+		Collection<MoreBetterGoods> supplyCompList = tmtb.getSupplyCompListNew();
+		for(MoreBetterGoods regSupplyComp : supplyCompList){
+			// 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
+			// tmtbGoodsSq 생성
+			Integer tmtbGoodsSq =  commonService.getNextSequence("SEQ_TMTB_GOODS");
+			regSupplyComp.setTmtbGoodsSq(tmtbGoodsSq);
+			regSupplyComp.setTmtbSq(tmtb.getTmtbSq());
+			regSupplyComp.setGoodsGb("G800_20");
+			regSupplyComp.setTargetVal(regSupplyComp.getSupplyCompCd());
+			regSupplyComp.setRegNo(tmtb.getRegNo());
+			regSupplyComp.setUdpNo(tmtb.getUdpNo());
+
+			marketingDao.saveMorebetterGoods(regSupplyComp);
+		}
+
+		// 브랜드
+		Collection<MoreBetterGoods> brandList = tmtb.getBrandListNew();
+		for(MoreBetterGoods regBrand : brandList){
+			// 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
+			// tmtbGoodsSq 생성
+			Integer tmtbGoodsSq =  commonService.getNextSequence("SEQ_TMTB_GOODS");
+			regBrand.setTmtbGoodsSq(tmtbGoodsSq);
+			regBrand.setTmtbSq(tmtb.getTmtbSq());
+			regBrand.setGoodsGb("G800_20");
+			regBrand.setTargetVal(regBrand.getBrandCd());
+			regBrand.setRegNo(tmtb.getRegNo());
+			regBrand.setUdpNo(tmtb.getUdpNo());
+
+			marketingDao.saveMorebetterGoods(regBrand);
+		}
+
+		// 적용상품
+		Collection<MoreBetterGoods> applyGoodsList = tmtb.getApplyGoodsListNew();
+		for(MoreBetterGoods regApplyGoods : applyGoodsList){
+			// 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
+			// tmtbGoodsSq 생성
+			Integer tmtbGoodsSq =  commonService.getNextSequence("SEQ_TMTB_GOODS");
+			regApplyGoods.setTmtbGoodsSq(tmtbGoodsSq);
+			regApplyGoods.setTmtbSq(tmtb.getTmtbSq());
+			regApplyGoods.setTargetVal(regApplyGoods.getGoodsCd());
+			regApplyGoods.setRegNo(tmtb.getRegNo());
+			regApplyGoods.setUdpNo(tmtb.getUdpNo());
+
+			marketingDao.saveMorebetterGoods(regApplyGoods);
+		}
+
+		// 제외상품
+		Collection<MoreBetterGoods> exceptGoodsList = tmtb.getExceptGoodsListNew();
+		for(MoreBetterGoods regExceptGoods : exceptGoodsList){
+			// 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
+			// tmtbGoodsSq 생성
+			Integer tmtbGoodsSq =  commonService.getNextSequence("SEQ_TMTB_GOODS");
+			regExceptGoods.setTmtbGoodsSq(tmtbGoodsSq);
+			regExceptGoods.setTmtbSq(tmtb.getTmtbSq());
+			regExceptGoods.setTargetVal(regExceptGoods.getGoodsCd());
+			regExceptGoods.setRegNo(tmtb.getRegNo());
+			regExceptGoods.setUdpNo(tmtb.getUdpNo());
+
+			marketingDao.saveMorebetterGoods(regExceptGoods);
+		}
+
 		// 다다익선 할인구간 저장
 		Collection<MoreBetterSection> sectionGbList = tmtb.getSectionGbListNew();
 		for(MoreBetterSection regSection : sectionGbList){
 			// 다다익선 할인구간설정 2차조건(TB_TMTB_SECTION) 저장
 			// tmtbSectionSq 생성
 			Integer tmtbSectionSq =  commonService.getNextSequence("SEQ_TMTB_SECTION");
-			regSection.setTbTmtbSectionSq(tmtbSectionSq);
+			regSection.setTmtbSectionSq(tmtbSectionSq);
 
 			// 다다익선 조건에 따른 할인혜택(금액할인) 설정(TB_TMTB_VAL) 저장
 			// tmtbValSq 생성
 			Integer tmtbValSq =  commonService.getNextSequence("SEQ_TMTB_VAL");
-			regSection.setTbTmtbValSq(tmtbValSq);
+			regSection.setTmtbValSq(tmtbValSq);
 			regSection.setTmtbSq(tmtb.getTmtbSq());
-			regSection.setRegNo(tmtb.getRegNo());//udpNo UdpNo
+			regSection.setRegNo(tmtb.getRegNo());
 			regSection.setUdpNo(tmtb.getUdpNo());
 
 			marketingDao.saveMorebetterSection(regSection);
@@ -167,13 +229,11 @@ public class TsaMarketingService {
 		for (MoreBetterBurden regBurden : burdenList) {
 			// tmtbBurdenSq 생성
 			Integer tmtbBurdenSq =  commonService.getNextSequence("SEQ_TMTB_BURDEN");
-			regBurden.setTbTmtbBurdenSq(tmtbBurdenSq);
+			regBurden.setTmtbBurdenSq(tmtbBurdenSq);
 			regBurden.setTmtbSq(tmtb.getTmtbSq());
-			regBurden.setRegNo(tmtb.getRegNo());//udpNo UdpNo
+			regBurden.setRegNo(tmtb.getRegNo());
 			regBurden.setUdpNo(tmtb.getUdpNo());
 
-			log.info("MoreBetterBurden regBurden ::" +regBurden);
-
 			marketingDao.saveMorebetterBurden(regBurden);
 		}
 

+ 39 - 18
style24.admin/src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -295,7 +295,16 @@ public class TsaMarketingController extends TsaBaseController {
 		mav.addObject("dcWayList", rendererService.getAvailCommonCodeList("G240"));
 		log.info("CHECK param dcWayList>>"+rendererService.getAvailCommonCodeList("G240"));
 
+		// 적용 상품구분 목록
+		String[] exceptGoodsCds = {"G800_30","G800_40"};
+		mav.addObject("applyGoodsGbList", rendererService.getCommonCodeList("G800", "Y", exceptGoodsCds));
+		log.info("CHECK param applyGoodsGbList>>"+rendererService.getCommonCodeList("G800", "Y", exceptGoodsCds));
 
+		// 제외 상품구분 목록
+		mav.addObject("exceptGoodsGbList", rendererService.getAvailCommonCodeList("G800"));
+		log.info("CHECK param exceptGoodsGbList>>"+rendererService.getAvailCommonCodeList("G800"));
+
+		// 이것도 리스트 받아와서 바꿔야함 ㅠㅠ
 		String tmtbStat = "G232_10";
 		tmtb.setTmtbStat(tmtbStat);
 
@@ -321,43 +330,59 @@ public class TsaMarketingController extends TsaBaseController {
 	@PostMapping("/morebetter/save")
 	@ResponseBody
 	public GagaResponse saveMorebetterDetail(@RequestBody MoreBetter tmtb) {
-		Collection<MoreBetterGoods> tmtbCompList = null;
+		Collection<MoreBetterGoods> tmtbSupplyCompList = null;
 		Collection<MoreBetterGoods> tmtbBrandList = null;
+		Collection<MoreBetterGoods> tmtbApplyGoodsList = null;
+		Collection<MoreBetterGoods> tmtbExceptGoodsList = null;
 		Collection<MoreBetterBurden> tmtbBurdenList = null;
 		Collection<MoreBetterSection> tmtbSectionGbList = null;
 		ObjectMapper mapper = new ObjectMapper();
 
-		/*
 		// 공급업체
 		try {
 			if (tmtb.getSupplyCompList() != null) {
-				tmtbCompList = mapper.readValue(tmtb.getSupplyCompList(), new TypeReference<Collection<MoreBetterComp>>() {
+				tmtbSupplyCompList = mapper.readValue(tmtb.getSupplyCompList(), new TypeReference<Collection<MoreBetterGoods>>() {
 				});
 			}
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
-		*/
-/*
+
 		// 브랜드
 		try {
 			if (tmtb.getBrandList() != null) {
-				tmtbBrandList = mapper.readValue(tmtb.getBrandList(), new TypeReference<Collection<MoreBetterBrand>>() {
+				tmtbBrandList = mapper.readValue(tmtb.getBrandList(), new TypeReference<Collection<MoreBetterGoods>>() {
+				});
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		// 적용상품
+		try {
+			if (tmtb.getApplyGoodsList() != null) {
+				tmtbApplyGoodsList = mapper.readValue(tmtb.getApplyGoodsList(), new TypeReference<Collection<MoreBetterGoods>>() {
 				});
 			}
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
-*/
+		// 적용상품
+		try {
+			if (tmtb.getExceptGoodsList() != null) {
+				tmtbExceptGoodsList = mapper.readValue(tmtb.getExceptGoodsList(), new TypeReference<Collection<MoreBetterGoods>>() {
+				});
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
 		// 할인구간
 		try {
 			if (tmtb.getSectionGbList() != null) {
-				log.info("getSectionGbList here1");
 				tmtbSectionGbList = mapper.readValue(tmtb.getSectionGbList(), new TypeReference<Collection<MoreBetterSection>>() {
 				});
-				log.info("getSectionGbList here2");
 			}
-			log.info("getSectionGbList here123");
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
@@ -365,23 +390,19 @@ public class TsaMarketingController extends TsaBaseController {
 		// 업체분담율
 		try {
 			if (tmtb.getBurdenList() != null) {
-				log.info("here1");
 				tmtbBurdenList = mapper.readValue(tmtb.getBurdenList(), new TypeReference<Collection<MoreBetterBurden>>() {
 				});
-				log.info("here2");
 			}
-			log.info("here123");
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
 
 		log.info("tmtb::"+tmtb);
 
-		// html에서 SectionVal -> DcVal 안되서...여기서 set 왜지..?
-		//tmtb.setDcVal(tmtb.getSectionVal());
-
-		//tmtb.setSupplyCompListNew(tmtbCompList);
-		//tmtb.setBrandListNew(tmtbBrandList);
+		tmtb.setSupplyCompListNew(tmtbSupplyCompList);
+		tmtb.setBrandListNew(tmtbBrandList);
+		tmtb.setApplyGoodsListNew(tmtbApplyGoodsList);
+		tmtb.setExceptGoodsListNew(tmtbExceptGoodsList);
 		tmtb.setSectionGbListNew(tmtbSectionGbList);
 		tmtb.setBurdenListNew(tmtbBurdenList);
 

+ 12 - 1
style24.admin/src/main/java/com/style24/persistence/domain/MoreBetter.java

@@ -31,6 +31,17 @@ public class MoreBetter extends TscBaseDomain {
 	private String searchTxt;		// 프로모션 검색 조건
 	private String gbn;				// 팝업 구분 : C=등록, U=수정
 
+	// 공급업체
+	private String supplyCompCd;
+	private String supplyCompNm;
+	private String targetGb;
+
+	// 브랜드
+	private String brandCd;
+	private String brandEnm;
+
+	// 상품
+
 	// 다다익선 할인구간설정 2차조건(TB_TMTB_SECTION)
 	private int tmtbSectionSq;		// 다다익선 할인구간 시퀀스
 	private String sectionGb;		// 구간설정 구분값(G810_10:수량,G810_11:금액)
@@ -42,7 +53,7 @@ public class MoreBetter extends TscBaseDomain {
 	private int dcVal;				// 할인값
 
 	// 다다익선 업체분담율(TB_TMTB_BURDEN)
-	private int tbTmtbBurdenSq;		// 업체분담율Sq
+	private int tmtbBurdenSq;		// 업체분담율Sq
 	private String tmtbSupplyCd;	// 업체코드
 	private String tmtbBurdenRate;	// 업체분담율
 	//private String burdenRate;	// 업체분담율

+ 1 - 1
style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterBurden.java

@@ -13,7 +13,7 @@ import lombok.Data;
 @Data
 public class MoreBetterBurden extends TscBaseDomain {
 	// 다다익선 업체 분담율
-	private Integer tbTmtbBurdenSq;		// 업체분담율Sq
+	private Integer tmtbBurdenSq;		// 업체분담율Sq
 	private Integer tmtbSq;				// 프로모션Sq
 	private String tmtbSupplyCd;	// 업체코드
 	private String tmtbBurdenRate;	// 업체분담율

+ 9 - 64
style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterGoods.java

@@ -16,77 +16,22 @@ import java.util.Collection;
 @Data
 public class MoreBetterGoods extends TscBaseDomain {
 	// 다다익선 적용대상
-	private int tbTmtbGoodsSq;		// 업체분담율Sq
+	private int tmtbGoodsSq;		// 업체분담율Sq
 	private int tmtbSq;				// 프로모션Sq
-	private String goodsGb;
-	private String targetGb;
-	private String targetVal;
-	private String delYn;
+	private String goodsGb;			// 공통코드 (G800_10|기본상품, G800_20|적용상품, G800_30|제외상품, G800_40|ALL)
+	private String targetGb;		// 적용대상 (G260_10|상품, G260_12|브랜드, G260_13|공급처)
+	private String targetVal;		// 브랜드코드, 상품코드, 공급처코드
+	private String delYn;			// 삭제여부
 	private Integer regNo;			// 등록자
 	private String  regDt;			// 등록일시
 	private Integer udpNo;			// 수정자
 	private String  udtDt;			// 수정일시
 
-	// 공급업체
 	private String supplyCompCd;
 	private String supplyCompNm;
-	private int provierNo;
-	private String bizGb;				// 사업자구분
-	private String bizNo;				// 사업자번호
-	private String bizKind;				// 업종
-	private String bizType;				// 업태
-	private String ownerNm;				// 대표자명
-	private String bizZipcode;			// 사업장우편번호
-	private String bizBaseAddr;			// 사업장기본주소
-	private String bizDtlAddr;			// 사업장상세주소
-	private String mainTelno;			// 대표전화번호
-	private String mainFaxno;			// 대표팩스번호
-	private String homepageUrl;			// 홈페이지URL
-	private String selfYn;				// 자사여부(Y:자사, N:입점)
-	private String distributionGb;		// 유통구분(공통코드G065)
-	private String shotDelvYn;			// 총알배송여부
-	private String supplyStat;			// 입점상태(공통코드G010)
-	private int minOrdAmt;				// 무료배송비최소주문금액
-	private int delvFee;				// 배송비
-	private float sellFeeRate;			// 판매수수료율
-	private String settleDay;			// 정산일(매월)
-	private String bankCd;				// 은행코드
-	private String accountNo;			// 계좌번호
-	private String depositorNm;			// 예금주명
-	private String csChargeNm;			// CS담당자명
-	private String csChargeTelno;		// CS담당자전화번호
-	private String settleChargeNm;		// 정산담당자명
-	private String settleChargeTelno;	// 정산담당자전화번호
-	private String settleChargeEmail;	// 정산담당자이메일
-	private String billEmail;			// 계산서이메일
-	private String econtractYn;			// 전자계약여부
-	private String remarks;				// 비고
-	private String supplyStatNm;		// 입점상태명
+	private String brandCd;
+	private String brandEnm;
+	private String goodsCd;
+	private String goodsNm;
 
-	// 브랜드
-	private String brandGb;			// 브랜드구분
-	private String brandCd;			// 브랜드코드
-	private String brandEnm;		// 브랜드영문명
-	private String brandKnm;		// 브랜드한글명
-	private String dispNmLang;		// 노출명언어
-	private String rgbCd;			// RGB코드(front 브랜드메인 GNB 색상)
-	private String brandGrpNm;		// 브랜드그룹명
-	private String delvLocCd;		// 출고처코드(출고처)
-	private String delvLocNm;		// 출고처명
-	private String erpBrandCd;		// ERP브랜드코드
-	private String delvFeeCd;		// 배송비정책코드
-	private float pntPrate10;		// 포인트적립율(PC정상)
-	private float pntMrate10;		// 포인트적립율(모바일정상)
-	private float pntPrate20;		// 포인트적립율(PC이월)
-	private float pntMrate20;		// 포인트적립율(모바일이월)
-	private String logoFileNm;		// 로고파일명
-	private int dispOrd;			// 표시순서
-	private String useYn;			// 사용여부(Y:사용)
-	private int brandNo;			// 브랜드번호(WMS 연동용)
-	private String newSysFileNm;	//신규이미지파일명
-
-	// 검색조건
-	private String searchGb;			// 검색구분
-	private String searchTxt;			// 검색어
-	private String callbackFn;			// 콜백함수
 }

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterSection.java

@@ -14,8 +14,8 @@ import lombok.Data;
 public class MoreBetterSection extends TscBaseDomain {
 	// 다다익선 상품
 	private Integer tmtbSq;
-	private Integer tbTmtbSectionSq;	// 업체분담율Sq
-	private Integer tbTmtbValSq;		// 업체분담율Sq
+	private Integer tmtbSectionSq;	// 업체분담율Sq
+	private Integer tmtbValSq;		// 업체분담율Sq
 
 	private String  sectionGb;		// 구간설정구분값(G810_10:수량,G810_11:금액)
 	private Integer sectionVal;		// 구간설정값/구간할인시작(수량이상,금액이상)

+ 32 - 4
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaMarketing.xml

@@ -195,6 +195,34 @@
 				   )
 	</insert>
 
+	<insert id="saveMorebetterGoods" parameterType="MoreBetterGoods" >
+		/* TsaMarketing.saveMorebetterGoods */
+		INSERT INTO TB_TMTB_GOODS(
+		         	 TMTB_GOODS_SQ
+		        	,TMTB_SQ
+					,GOODS_GB
+					,TARGET_GB
+					,TARGET_VAL
+					,DEL_YN
+					,REG_NO
+					,REG_DT
+					,UDP_NO
+					,UDT_DT
+			)
+			VALUES (
+			         #{tmtbGoodsSq}
+			        ,#{tmtbSq}
+				    ,#{goodsGb}
+				    ,#{targetGb}
+				    ,#{targetVal}
+				    ,'N'
+				    ,#{regNo}
+				    ,NOW()
+				    ,#{udpNo}
+				    ,NOW()
+				   )
+	</insert>
+
 	<insert id="saveMorebetterSection" parameterType="MoreBetterSection" >
 		/* TsaMarketing.saveMorebetterSection */
 		INSERT INTO TB_TMTB_SECTION(
@@ -209,7 +237,7 @@
 					,UDT_DT
 			)
 			VALUES (
-					 #{tbTmtbSectionSq}
+					 #{tmtbSectionSq}
 					,#{tmtbSq}
 					,#{sectionGb}
 				    ,#{sectionVal}
@@ -236,9 +264,9 @@
 					,UDT_DT
 			)
 			VALUES (
-					#{tbTmtbValSq}
+					#{tmtbValSq}
 				   ,#{tmtbSq}
-				   ,#{tbTmtbSectionSq}
+				   ,#{tmtbSectionSq}
 				   ,#{dcWay}
 				   ,#{dcVal}
 				   ,'N'
@@ -263,7 +291,7 @@
 					,UDT_DT
 			)
 			VALUES (
-			         #{tbTmtbBurdenSq}
+			         #{tmtbBurdenSq}
 			        ,#{tmtbSq}
 			        ,#{tmtbSupplyCd}
 			        ,#{tmtbBurdenRate}

+ 48 - 22
style24.admin/src/main/webapp/WEB-INF/views/marketing/MorebetterRegForm.html

@@ -290,37 +290,51 @@
 		var FGAddGoodsStatList = gagajf.convertToArray([[${goodsStatList}]]);		// 상품 상태 리스트
 		var sectionGbList = gagajf.convertToArray([[${sectionGbList}]]);	// 할인구간 리스트
 		var dcWayList = gagajf.convertToArray([[${dcWayList}]]);	// 할인구분 리스트
+		var applyGoodsGbList = gagajf.convertToArray([[${applyGoodsGbList}]]);	// 적용 상품구분 목록
+		var exceptGoodsGbList = gagajf.convertToArray([[${exceptGoodsGbList}]]);	// 제외 상품구분 목록
 
 		// 공급업체 리스트 설정
 		var columnFGCompanyList = [
 			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
 			{headerName: "공급처ID", field: "supplyCompCd", width: 120, cellClass: 'text-center'},
-			{headerName: "공급업체명", field: "supplyCompNm", width: 150, cellClass: 'text-center'}
+			{headerName: "공급업체명", field: "supplyCompNm", width: 150, cellClass: 'text-center'},
+			{headerName: "적용대상", field: "targetGb", width: 150, cellClass: 'text-center'}
 		];
 		// 브랜드 리스트 설정
 		var columnBrandList = [
 			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
 			{headerName: "브랜드ID", field: "brandCd", width: 120, cellClass: 'text-center'},
-			{headerName: "공급업체명", field: "brandEnm", width: 150, cellClass: 'text-center'}
+			{headerName: "브랜드명", field: "brandEnm", width: 120, cellClass: 'text-center'},
+			{headerName: "공급업체명", field: "supplyCompNm", width: 150, cellClass: 'text-center'},
+			{headerName: "적용대상", field: "targetGb", width: 150, cellClass: 'text-center'}
 		];
 		// 적용상품 리스트 설정
 		var columnApplyGoodsList = [
 			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{headerName: "상품구분", field: "goodsGb", width: 100, cellClass: 'text-center',
+				cellEditor: 'agRichSelectCellEditor',
+				cellEditorParams: { values: gagaAgGrid.extractValues(applyGoodsGbList), required: true },
+				valueFormatter: function (params) { return gagaAgGrid.lookupValue(applyGoodsGbList, params.value); },
+				valueParser: function (params) { return gagaAgGrid.lookupKey(applyGoodsGbList, params.newValue); }
+			},
+			//{headerName: "상품구분", field: "goodsGb", width: 120, cellClass: 'text-center'},
 			{headerName: "Product ID", field: "goodsCd", width: 120, cellClass: 'text-center'},
-			{headerName: "브랜드명", field: "brandEnm", width: 150, cellClass: 'text-center'},
 			{headerName: "상품명", field: "goodsNm", width: 120, cellClass: 'text-center'},
-			{headerName: "판매상태", field: "goodsStat" , width: 120, cellClass: 'text-center',
-				cellEditorParams: { values: gagaAgGrid.extractValues(FGAddGoodsStatList) },
-				valueFormatter: function (params) { return gagaAgGrid.lookupValue(FGAddGoodsStatList, params.value); },
-				valueParser: function (params) { return gagaAgGrid.lookupKey(FGAddGoodsStatList, params.newValue); }
-			},
-			{headerName: "정상가", field: "listPrice", width: 120, cellClass: 'text-center', valueFormatter: function(params) {return params.value.addComma();}},
-			{headerName: "판매가", field: "currPrice", width: 120, cellClass: 'text-center', valueFormatter: function(params) {return params.value.addComma();}}
+			{headerName: "적용대상", field: "targetGb", width: 150, cellClass: 'text-center'}
 		];
 		// 제외상품 리스트 설정
 		var columnExceptGoodsList = [
 			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{headerName: "상품구분", field: "goodsGb", width: 100, cellClass: 'text-center',
+				cellEditor: 'agRichSelectCellEditor',
+				cellEditorParams: { values: gagaAgGrid.extractValues(exceptGoodsGbList), required: true },
+				valueFormatter: function (params) { return gagaAgGrid.lookupValue(exceptGoodsGbList, params.value); },
+				valueParser: function (params) { return gagaAgGrid.lookupKey(exceptGoodsGbList, params.newValue); }
+			},
 			{headerName: "Product ID", field: "goodsCd", width: 120, cellClass: 'text-center'},
+			{headerName: "상품명", field: "goodsNm", width: 120, cellClass: 'text-center'},
+			{headerName: "적용대상", field: "targetGb", width: 150, cellClass: 'text-center'}
+			/*{headerName: "Product ID", field: "goodsCd", width: 120, cellClass: 'text-center'},
 			{headerName: "브랜드명", field: "brandEnm", width: 150, cellClass: 'text-center'},
 			{headerName: "상품명", field: "goodsNm", width: 120, cellClass: 'text-center'},
 			{headerName: "판매상태", field: "goodsStat" , width: 120, cellClass: 'text-center',
@@ -329,7 +343,8 @@
 				valueParser: function (params) { return gagaAgGrid.lookupKey(FGAddGoodsStatList, params.newValue); }
 			},
 			{headerName: "정상가", field: "listPrice", width: 120, cellClass: 'text-center',valueFormatter: function(params) {return params.value.addComma();}},
-			{headerName: "판매가", field: "currPrice", width: 120, cellClass: 'text-center',valueFormatter: function(params) {return params.value.addComma();}}
+			{headerName: "판매가", field: "currPrice", width: 120, cellClass: 'text-center',valueFormatter: function(params) {return params.value.addComma();}},
+			{headerName: "적용대상", field: "targetGb", width: 150, cellClass: 'text-center'}*/
 		];
 
 		// 업체분담율 리스트 설정
@@ -375,6 +390,8 @@
 		gridOptionsFGBrandList.rowSelection = "multiple";
 		// 적용상품 리스트 설정
 		var gridOptionsFGApplyGoodsList = gagaAgGrid.getGridOptions(columnApplyGoodsList);
+		// Grid editable
+		gridOptionsFGApplyGoodsList.defaultColDef.editable = true;
 		gridOptionsFGApplyGoodsList.rowSelection = "multiple";
 		// 제외상품 리스트 설정
 		var gridOptionsFGExceptGoodsList = gagaAgGrid.getGridOptions(columnExceptGoodsList);
@@ -404,7 +421,6 @@
 
 		// 저장 버튼 클릭시
 		$('#btnMorebetterSave').on('click', function() {
-			console.log('save 1818');
 			// 각 ag-grid list 수량
 			let supplyCompCnt = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList).length;
 			let brandCnt = gagaAgGrid.getAllRowData(gridOptionsFGBrandList).length;
@@ -520,7 +536,9 @@
 				}
 
 				// 중복되지 않은 데이터 리스트에 추가
-				if(addChk) {	gagaAgGrid.addRowData(gridOptionsFGCompanyList, result[i], "supplyCompCd");	}
+				if(addChk) {
+					gagaAgGrid.addRowData(gridOptionsFGCompanyList, {"supplyCompCd" : result[i].supplyCompCd, "supplyCompNm" : result[i].supplyCompNm, "targetGb" : "G260_13"});
+				}
 			}
 		};
 
@@ -535,7 +553,9 @@
 				}
 
 				// 중복되지 않은 데이터 리스트에 추가
-				if(addChk) {	gagaAgGrid.addRowData(gridOptionsFGBrandList, result[i], "brandCd");	}
+				if(addChk) {
+					gagaAgGrid.addRowData(gridOptionsFGBrandList, {"brandCd" : result[i].brandCd, "brandEnm" : result[i].brandEnm, "supplyCompNm" : result[i].supplyCompNm, "targetGb" : "G260_12"});
+				}
 			}
 		};
 
@@ -543,12 +563,12 @@
 		var fnSetPopupApplyBurdenInfo = function(result) {
 			// 기존 리스트 데이터 for
 			for(let i = 0 ; i < result.length ; i++) {
-				console.log('old i::'+i+"::"+result[i].supplyCompCd);
+				//console.log('old i::'+i+"::"+result[i].supplyCompCd);
 				let addChk = true, gridListValue = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList);		// 받아온 모든 데이터
 
 				// 받아온 data for
 				for(let j = 0 ; j < gridListValue.length ; j++) {
-					console.log('new add j::'+j+":supplyCompCd:"+gridListValue[j].tmtbSupplyCd);
+					//console.log('new add j::'+j+":supplyCompCd:"+gridListValue[j].tmtbSupplyCd);
 					// 동일한 data는 추가하지 않음
 					if(gridListValue[j].tmtbSupplyCd == result[i].supplyCompCd) {	addChk = false;	}		// 중복체크
 				}
@@ -556,8 +576,6 @@
 				// 중복되지 않은 데이터 리스트에 추가
 				if(addChk) {
 					//gagaAgGrid.addRowData(gridOptionsApplyBurdenList, result[i], "tmtbSupplyCd");
-					console.log('add compCd>>'+result[i].supplyCompCd);
-					console.log('add useYn>>'+result[i].useYn);
 					gagaAgGrid.addRowData(gridOptionsApplyBurdenList, {"tmtbSupplyCd" : result[i].supplyCompCd, "useYn" : result[i].useYn});
 				}
 			}
@@ -565,17 +583,22 @@
 
 		// 적용 상품 리스트 콜백함수
 		var fnSetPopupApplyGoodsInfo = function(result) {
-			gridAddGoodsList(gridOptionsFGApplyGoodsList, result);
+			gridAddGoodsList(gridOptionsFGApplyGoodsList, result , "apply");
 		};
 
 		// 제외 상품 리스트 콜백함수
 		var fnSetPopupExceptGoodsInfo = function(result) {
-			gridAddGoodsList(gridOptionsFGExceptGoodsList, result);
+			gridAddGoodsList(gridOptionsFGExceptGoodsList, result , "except");
 		};
 
 
 		// ag-grid 상품관련 list 콜백함수
-		function gridAddGoodsList(OriginGridListOption, result) {
+		function gridAddGoodsList(OriginGridListOption, result, gubun) {
+			var goodsGbVal = "G800_10";
+			if(gubun == 'except'){
+				goodsGbVal = "G800_30";
+			}
+
 			for(let i = 0 ; i < result.length ; i++) {
 				let addChk = true, gridListValue = gagaAgGrid.getAllRowData(OriginGridListOption);		// 받아온 모든 데이터
 
@@ -585,7 +608,10 @@
 				}
 
 				// 중복되지 않은 데이터 리스트에 추가
-				if(addChk) {	gagaAgGrid.addRowData(OriginGridListOption, result[i], "goodsCd");	}
+				if(addChk) {
+					//gagaAgGrid.addRowData(OriginGridListOption, result[i], "goodsCd");
+					gagaAgGrid.addRowData(OriginGridListOption, {"goodsGb": goodsGbVal, "goodsCd" : result[i].goodsCd, "goodsNm" : result[i].goodsNm, "targetGb" : "G260_10"});
+				}
 			}
 		}
 

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

@@ -12,6 +12,7 @@ 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;
 
 /**
@@ -301,4 +302,70 @@ public interface TsbGoodsDao {
 	 */
 	Collection<IfProduct> getGoodsList();
 
+	/**
+	 * TB_IF_PRODUCTSKU_TEMP 삭제
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	void deleteIfProductSku();
+
+	/**
+	 * TB_IF_PRODUCTSKU_TEMP 저장
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	void createIfProductSku(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);
+
+
+	/**
+	 *  상품 전시재고 삭제
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	void deleteGoodsDispStock();
+
+	/**
+	 * 상품 전시재고 생성
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	void createGoodsDispStock();
+
+
+	/**
+	 * TB_STOCK = > TB_STOCK_SYNC 적용
+	 *
+	 * @author eskim
+	 * @since 2020. 08. 24
+	 */
+	void deleteTbOptionSyncTemp();
+
+	/**
+	 * ERP 재고 임시 테이블 이관
+	 *
+	 * @author eskim
+	 * @since 2020. 08. 24
+	 */
+	void createTbOptionSyncTemp();
+
 }

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

@@ -8,6 +8,7 @@ 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;
 
 /**
@@ -82,4 +83,14 @@ public interface TsbWmsGoodsDao {
 	 */
 	void saveWmsProduct(IfProduct ifProduct);
 
+	/**
+	 * WMS 재고 테이블 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	Collection<IfProductSku> getWmsIfProductSukList();
+
+
 }

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

@@ -13,7 +13,7 @@ import lombok.extern.slf4j.Slf4j;
 import com.gagaframework.web.util.GagaDateUtil;
 
 /**
- * WMS 입고 연용
+ * WMS 입고 수신
  *
  * @author eskim
  * @since 2021. 01. 01

+ 1 - 1
style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsMeasurementJob.java

@@ -13,7 +13,7 @@ import lombok.extern.slf4j.Slf4j;
 import com.gagaframework.web.util.GagaDateUtil;
 
 /**
- * WMS 실측사이즈 연용
+ * WMS 실측사이즈 수신
  *
  * @author eskim
  * @since 2020. 12. 31

+ 1 - 1
style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsProductJob.java

@@ -13,7 +13,7 @@ import lombok.extern.slf4j.Slf4j;
 import com.gagaframework.web.util.GagaDateUtil;
 
 /**
- * WMS 입고 연용
+ * WMS 상품정보 송신
  *
  * @author eskim
  * @since 2021. 01. 01

+ 76 - 0
style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsProductStockJob.java

@@ -0,0 +1,76 @@
+package com.style24.batch.biz.job.goods;
+
+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.TsbCommonService;
+import com.style24.batch.biz.service.TsbGoodsService;
+import com.style24.persistence.domain.IfProductSku;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.util.GagaDateUtil;
+
+/**
+ * WMS 상품재고 수신
+ *
+ * @author eskim
+ * @since 2021. 01. 06
+ */
+@Component
+@Slf4j
+public class TsbGoodsWmsProductStockJob extends TsbAbstractJob<IfProductSku, IfProductSku, IfProductSku> {
+
+	@Autowired
+	private TsbGoodsService goodsService;
+
+	@Autowired
+	private TsbCommonService commonService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+	private String jobdate = "";
+
+	@Override
+	public IfProductSku read() throws Exception {
+
+
+		IfProductSku ifProductSku = new IfProductSku();
+		return ifProductSku;
+	}
+
+	@Override
+	public IfProductSku process(IfProductSku ifProductSku) throws Exception {
+		return ifProductSku;
+	}
+
+	@Override
+	public IfProductSku write(IfProductSku ifProductSku) throws Exception {
+
+		jobdate = GagaDateUtil.getToday("yyyyMMddHHmm");
+
+		// WMS 동기화 옵션 여부 확인
+		String wmsSyncYn = commonService.getWmsSyncYn();
+		if ("N".equals(wmsSyncYn)) {
+			log.info("WMS 정보 동기화 미실행 {}, 연동여부 : {}", GagaDateUtil.getToday("yyyy-MM-dd HH:mm:ss"), wmsSyncYn);
+			return null;
+		}else {
+			//wms상품재고이력 생성
+			goodsService.createWmsProductSkuHst(jobdate);
+			//온라인 상품 재고 적용
+			goodsService.saveGoodsStock();
+		}
+
+		//온라인 전시 재고 작업
+		goodsService.saveGoodsDispStock();
+
+		return ifProductSku;
+	}
+
+	@Override
+	public void notify(IfProductSku ifProductSku) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

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

@@ -20,6 +20,7 @@ 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 io.netty.util.internal.StringUtil;
@@ -27,6 +28,7 @@ import io.netty.util.internal.StringUtil;
 import lombok.extern.slf4j.Slf4j;
 
 import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.util.GagaDateUtil;
 
 /**
  * 상품 Service
@@ -443,6 +445,79 @@ 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_TEMP 작업
+		goodsDao.deleteIfProductSku();
+		// TB_IF_PRODUCTSKU_TEMP 생성
+		Collection<IfProductSku> wmsIfProductSukList = wmsGoodsService.getWmsIfProductSukList();
+		for(IfProductSku ifProductSku : wmsIfProductSukList) {
+			goodsDao.createIfProductSku(ifProductSku);
+		}
+
+		// TB_IF_PRODUCTSKU_HST 2달 전 데이터 삭제
+		String delYyyymmdd = GagaDateUtil.getOffsetMonth(-2, "yyyyMMdd") + "000000";  //년월일시분초
+		goodsDao.deleteWmsProductSkuHst(delYyyymmdd);
+		// TB_IF_PRODUCTSKU_HST 생성
+		goodsDao.createWmsProductSkuHst(jobdate);
 
+	}
 
+	/**
+	 * WMS 임시 테이블에서 실테이블로 이관
+	 *
+	 * @throws Exception
+	 * @author eskim
+	 * @since 2021. 01. 07
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsStock() throws Exception {
+
+		// wms 재고 임시 테이블(TB_OPTION_SYNC_TEMP) 삭제
+		goodsDao.deleteTbOptionSyncTemp();
+		// wms 재고 임시 테이블(TB_OPTION_SYNC_TEMP) 적용 - 출고처별 판매비율 적용
+		goodsDao.createTbOptionSyncTemp();
+////
+//			// 입점 상품 재고 동기화 후 SELL_QTY 삭제
+//			updateOptionByOfSellQty();
+//
+//			// TB_OPTION = > TB_OPTION_SYNC 적용
+//			tsbGoodsDao.deleteGoodsOptionSync();
+//			tsbGoodsDao.createGoodsOptionSync();
+//
+//			// TB_OPTION_SYNC_TEMP => TB_OPTION_SYNC 변경적용
+//			tsbGoodsDao.saveGoodsOptionSyncSync();
+//
+//			// TB_OPTION_SYNC => TB_OPTION 적용
+//			tsbGoodsDao.saveGoodsOptionNew();
+//
+//			// TB_OPTION_SYNC에 없는 상품,  재고 초기화
+//			tsbGoodsDao.updateOptionZero();
+//
+//			// 자사상품중 주문상세상태가 입금대기, 결제완료, 교환대기 건은 TB_SELL_QTY 생성
+//			createSellQtySelfGoods();
+
+	}
+
+	/**
+	 * 상품 전시재고 생성
+	 *
+	 * @throws Exception
+	 * @author eskim
+	 * @since 2020. 01. 06
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsDispStock() throws Exception {
+		goodsDao.deleteGoodsDispStock();
+		goodsDao.createGoodsDispStock();
+	}
 }

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

@@ -13,6 +13,7 @@ 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 lombok.extern.slf4j.Slf4j;
@@ -141,7 +142,17 @@ public class TsbWmsGoodsService {
 			wmsGoodsDao.saveWmsProduct(ifProduct);
 
 		}
+	}
 
+	/**
+	 * WMS 재고 테이블 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	public Collection<IfProductSku> getWmsIfProductSukList() {
+		return wmsGoodsDao.getWmsIfProductSukList();
 	}
 
 }

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

@@ -16,6 +16,7 @@ import com.style24.batch.biz.job.goods.TsbGoodsWmsBrandproviderJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsIncomelotJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsMeasurementJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsProductJob;
+import com.style24.batch.biz.job.goods.TsbGoodsWmsProductStockJob;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -61,6 +62,11 @@ public class TsbGoodsTask {
 	@Autowired
 	private TsbGoodsWmsProductJob goodsWmsProductJob;
 
+	@Autowired
+	private TsbGoodsWmsProductStockJob goodsWmsProductStockJob;
+
+
+
 	/**
 	 * 초 분 시 일 월 주(년)
 	 * 0 0 12 * * ?" : 아무 요일, 매월, 매일 12:00:00
@@ -187,7 +193,7 @@ public class TsbGoodsTask {
 	 * @throws Exception
 	 */
 	@Scheduled(cron = "${cron.goods.wms.incomelot}")
-	@Scheduled(fixedDelay = 3500000)
+	//@Scheduled(fixedDelay = 3500000)
 	@Async
 	public void tsbGoodsWmsIncomelotJob() throws Exception {
 		goodsWmsIncomelotJob.runById("cron.goods.wms.incomelot");
@@ -217,5 +223,16 @@ public class TsbGoodsTask {
 		goodsWmsProductJob.runById("cron.goods.wms.product");
 	}
 
+	/**
+	 * WMS 상품 재고 수신 적용 주기 : 시간배치 - 01분
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.wms.product.stock}")
+	@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsWmsProductStockJob() throws Exception {
+		goodsWmsProductStockJob.runById("cron.goods.wms.product.stock");
+	}
 
 }

+ 33 - 0
style24.batch/src/main/java/com/style24/persistence/domain/IfProductSku.java

@@ -0,0 +1,33 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * wms 연동 상품재고정보 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 06
+ */
+@SuppressWarnings("serial")
+@Data
+public class IfProductSku extends TscBaseDomain {
+
+	private String skucode;				//옵션코드
+	private String skumodelno;			//옵션모델번호
+	private int productno;			//상품번호
+	private String productcode;			//상품코드
+	private String option1;				//옵션1(색상)
+	private String option2;				//옵션2(사이즈)
+	private String option3;				//옵션3(스타일)
+	private int sellingstockamount;	//판매재고수량
+	private String sellingstocktypecd;	//판매재고유형
+	private int limitstockamount;	//
+	private String vendorskumodelno;	//업체옵션모델번호
+	private String vendorskucode;		//업체옵션코드
+	private int isvirtualstock;		//
+	private String datevirtualstock;	//
+	private String skucode88;			//88코드
+
+}

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

@@ -1331,4 +1331,231 @@
 		]]>
 	</select>
 	
+	<!-- TB_IF_PRODUCTSKU_TEMP 삭제 -->
+	<delete id="deleteIfProductSku"  timeout="300">
+		/* TsbGoods.deleteIfProductSku */
+		TRUNCATE TABLE TB_IF_PRODUCTSKU
+	</delete>
+	
+	<!-- TB_IF_PRODUCTSKU_TEMP 저장 -->
+	<insert id="createIfProductSku"  parameterType="IfProduct">
+		/* TsbGoods.createIfProductSku */
+		INSERT INTO TB_IF_PRODUCTSKU(
+		       SKUCODE
+		     , SKUMODELNO
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , OPTION1
+		     , OPTION2
+		     , OPTION3
+		     , SELLINGSTOCKAMOUNT
+		     , SELLINGSTOCKTYPECD
+		     , LIMITSTOCKAMOUNT
+		     , VENDORSKUMODELNO
+		     , VENDORSKUCODE
+		     , ISVIRTUALSTOCK
+		     , DATEVIRTUALSTOCK
+		     , SKUCODE88
+		     , UPD_DT
+		)
+		VALUES(
+		       #{skucode}
+		     , #{skumodelno}
+		     , #{productno}
+		     , #{productcode}
+		     , #{option1}
+		     , #{option2}
+		     , #{option3}
+		     , #{sellingstockamount}
+		     , #{sellingstocktypecd}
+		     , #{limitstockamount}
+		     , #{vendorskumodelno}
+		     , #{vendorskucode}
+		     , #{isvirtualstock}
+		     , #{datevirtualstock}
+		     , #{skucode88}
+		     , NOW()
+		)
+	</insert>
+	
+	<!-- TB_IF_PRODUCTSKU_HST 삭제 -->
+	<delete id="deleteWmsProductSkuHst"  parameterType="String" timeout="300">
+		/* TsbGoods.deleteWmsProductSkuHst */
+		DELETE TB_IF_PRODUCTSKU_HST
+		WHERE JOBDATE <![CDATA[<=]]> #{jobdate} 
+	</delete>
+	
+	<!-- TB_IF_PRODUCTSKU_HST 저장 -->
+	<insert id="createWmsProductSkuHst"  parameterType="String" timeout="300">
+		/* TsbGoods.createWmsProductSkuHst */
+		INSERT INTO TB_IF_PRODUCTSKU_HST(
+		       JOBDATE
+		     , SKUCODE
+		     , SKUMODELNO
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , OPTION1
+		     , OPTION2
+		     , OPTION3
+		     , SELLINGSTOCKAMOUNT
+		     , SELLINGSTOCKTYPECD
+		     , LIMITSTOCKAMOUNT
+		     , VENDORSKUMODELNO
+		     , VENDORSKUCODE
+		     , ISVIRTUALSTOCK
+		     , DATEVIRTUALSTOCK
+		     , SKUCODE88
+		)
+		SELECT #{jobdate}
+		     , SKUCODE
+		     , SKUMODELNO
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , OPTION1
+		     , OPTION2
+		     , OPTION3
+		     , SELLINGSTOCKAMOUNT
+		     , SELLINGSTOCKTYPECD
+		     , LIMITSTOCKAMOUNT
+		     , VENDORSKUMODELNO
+		     , VENDORSKUCODE
+		     , ISVIRTUALSTOCK
+		     , DATEVIRTUALSTOCK
+		     , SKUCODE88
+		FROM TB_IF_PRODUCTSKU
+	</insert>
+	
+	<!-- TB_GOODS_STOCK 삭제 -->
+	<delete id="deleteGoodsDispStock"   timeout="300">
+		/* TsbGoods.deleteGoodsDispStock */
+		DELETE FROM TB_GOODS_STOCK
+	</delete>
+	
+	<!-- TB_GOODS_STOCK 저장 -->
+	<insert id="createGoodsDispStock"  parameterType="String" timeout="300">
+		/* TsbGoods.createGoodsDispStock */
+		INSERT INTO TB_GOODS_STOCK( 
+		    GOODS_CD
+		  , STOCK_QTY
+		  , REG_DT
+		)
+		SELECT Z.GOODS_CD
+		     , MIN(Z.STOCK_QTY_ITEM) AS STOCK_QTY
+		     , NOW()
+		FROM   (
+		        SELECT A.GOODS_CD
+		             , A.MIN_ORD_QTY
+		             , SUM(C.CURR_STOCK_QTY - C.BASE_STOCK_QTY) AS STOCK_QTY_ITEM
+		        FROM   TB_GOODS A
+		             , VW_STOCK C
+		        WHERE  A.GOODS_CD = C.GOODS_CD
+		        AND    C.SOLDOUT_YN = 'N'
+		        AND    C.CURR_STOCK_QTY - C.BASE_STOCK_QTY > 0
+		        GROUP  BY A.GOODS_CD, A.MIN_ORD_QTY
+		        UNION ALL
+		        SELECT A.GOODS_CD
+		             , A.MIN_ORD_QTY
+		             , SUM(C.CURR_STOCK_QTY - C.BASE_STOCK_QTY) AS STOCK_QTY_ITEM
+		        FROM   TB_GOODS A
+		             , TB_GOODS_COMPOSE B
+		             , VW_STOCK C
+		        WHERE  A.GOODS_CD = B.GOODS_CD
+		        AND    B.COMPS_GOODS_CD = C.GOODS_CD
+		        AND    B.USE_YN = 'Y'
+		        AND    A.GOODS_TYPE != 'N'
+		        AND    C.SOLDOUT_YN = 'N'
+		        AND    C.CURR_STOCK_QTY - C.BASE_STOCK_QTY > 0
+		        GROUP  BY A.GOODS_CD, A.MIN_ORD_QTY
+		       ) Z
+		GROUP  BY Z.GOODS_CD, Z.MIN_ORD_QTY
+		HAVING Z.MIN_ORD_QTY <![CDATA[<=]]> MIN(Z.STOCK_QTY_ITEM)
+	</insert>
+	
+	<!-- ERP 재고 임시 테이블 삭제 -->
+	<delete id="deleteTbOptionSyncTemp">
+		/* TsbGoods.deleteTbOptionSyncTemp */
+		TRUNCATE TABLE TB_OPTION_SYNC_TEMP
+	</delete>
+
+	<!--ERP 재고 임시 테이블 이관  -->
+	<insert id="createTbOptionSyncTemp">
+		/* TsbGoods.createTbOptionSyncTemp */
+		INSERT INTO TB_OPTION_SYNC_TEMP
+		(
+		       GOODS_CD
+		     , OPT_CD
+		     , OPT_CD1
+		     , OPT_CD2
+		     , SKU_MODEL_NO
+		     , PRODUCT_NO
+		     , PRODUCT_CODE
+		     , BASE_STOCK_QTY
+		     , CURR_STOCK_QTY
+		     , ADD_PRICE
+		     , SOLDOUT_YN
+		     , DISP_ORD
+		     , DISP_YN
+		     , ERP_STOCK_LINK_YN
+		     , REG_ID
+		     , REG_DT
+		     , UPD_ID
+		     , UPD_DT
+		)
+		SELECT GOODS_CD
+		     , OPT_CD
+		     , OPT_CD1
+		     , OPT_CD2
+		     , SKU_MODEL_NO
+		     , PRODUCT_NO
+		     , PRODUCT_CODE
+		     , 0 AS BASE_STOCK_QTY
+		     , CURR_STOCK_QTY
+		     , 'N' AS SOLDOUT_YN
+		     , DISP_ORD
+		     , 'Y' AS DISP_YN
+		     , ERP_STOCK_LINK_YN
+		     , 'batch' AS REG_ID
+		     , SYSDATE AS REG_DT
+		     , 'batch' AS UPD_ID
+		     , SYSDATE AS UPD_DT
+		FROM (
+		      SELECT GOODS_CD
+		           , SIZE_CD
+		           , SIZE_NM
+		           , SUM(CURR_ON_STOCK_QTY) AS CURR_ON_STOCK_QTY
+		           , SUM(CURR_OFF_STOCK_QTY) AS CURR_OFF_STOCK_QTY
+		           , SUM(CURR_SHOP_STOCK_QTY) AS CURR_SHOP_STOCK_QTY
+		           , NVL((SELECT (MAX(DISP_ORD) + 1) AS DISP_ORD FROM TB_STOCK WHERE GOODS_CD = Z.GOODS_CD)
+		           , ROW_NUMBER() OVER(PARTITION BY GOODS_CD ORDER BY SIZE_CD)) AS DISP_ORD
+		           , ERP_STOCK_LINK_YN
+		       FROM (
+		           SELECT B.GOODS_CD
+		                , A.SKUCODE AS OPT_CD
+		                , A.OPTION1 AS OPT_CD1
+		                , A.OPTION2 ASOPT_CD2
+		                , A.SKUMODELNO AS SKU_MODEL_NO
+		                , B.PRODUCT_NO
+		                , B.PRODUCT_CODE
+		                , SUM(GREATEST(A.SELLINGSTOCKAMOUNT, 0)) AS CURR_STOCK_QTY
+		                , B.ERP_STOCK_LINK_YN
+		                , A.CD_LOC
+		                , D.STOCK_APPL_RATE
+		           FROM TB_IF_PRODUCTSKU_TEMP A, TB_GOODS B, TB_STOCK_LINK_BASE C, TB_DELIVERY_LOC D
+		           WHERE B.SELF_GOODS_YN = 'Y'
+		           AND B.GOODS_TYPE = 'N'
+		           AND B.GOODS_NUM = A.CD_STYLE
+		           AND B.COLOR_CD = A.CD_COLOR
+		           AND B.BRAND_CD = C.BRAND_CD
+		           AND B.FORMAL_GB = C.FORMAL_GB
+		           AND B.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
+		           AND C.STOCK_LINK_YN = 'Y'
+		           AND D.USE_YN = 'Y'
+		           AND A.CD_LOC = C.DELV_LOC_CD
+		           AND A.CD_LOC = D.DELV_LOC_CD
+		           GROUP BY B.GOODS_CD, A.CD_SIZE, B.ERP_STOCK_LINK_YN, A.CD_LOC, D.STOCK_APPL_RATE
+		           ) Z
+		       GROUP BY GOODS_CD, SIZE_CD, ERP_STOCK_LINK_YN
+		      )
+	</insert>
+	
 </mapper>

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

@@ -213,4 +213,25 @@
 		WHERE PRODUCTCODE = #{productcode}
 	</update>
 	
+	<!-- WMS 재고 테이블 조회   -->
+	<select id="getWmsIfProductSukList"  resultType="IfProductSku">
+		/* TsbWmsGoods.getWmsIfProductSukList */
+		SELECT SKUCODE
+		     , SKUMODELNO
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , OPTION1
+		     , OPTION2
+		     , OPTION3
+		     , SELLINGSTOCKAMOUNT
+		     , SELLINGSTOCKTYPECD
+		     , LIMITSTOCKAMOUNT
+		     , VENDORSKUMODELNO
+		     , VENDORSKUCODE
+		     , ISVIRTUALSTOCK
+		     , DATEVIRTUALSTOCK
+		     , SKUCODE88
+		FROM TB_IF_PRODUCTSKU
+	</select>
+	
 </mapper>

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

@@ -53,6 +53,7 @@ cron:
         wms.incomelot: 2 22 2 29 2 ?
         wms.brandprovider: 2 22 2 29 2 ?
         wms.product: 2 22 2 29 2 ?
+        wms.product.stock: 2 22 2 29 2 ?
     
     #통계
     statistics: