浏览代码

first commit

JUSEUNG 5 年之前
当前提交
aedd7ffca7
共有 84 个文件被更改,包括 7466 次插入0 次删除
  1. 16 0
      .gitignore
  2. 70 0
      pom.xml
  3. 40 0
      src/main/java/com/style24/batch/biz/dao/TsbBatchDao.java
  4. 57 0
      src/main/java/com/style24/batch/biz/dao/TsbCommonDao.java
  5. 39 0
      src/main/java/com/style24/batch/biz/dao/TsbDeliveryDao.java
  6. 484 0
      src/main/java/com/style24/batch/biz/dao/TsbGoodsDao.java
  7. 67 0
      src/main/java/com/style24/batch/biz/dao/TsbMonitoringDao.java
  8. 22 0
      src/main/java/com/style24/batch/biz/dao/TsbStatisticsDao.java
  9. 26 0
      src/main/java/com/style24/batch/biz/dao/TsbWmsDeliveryDao.java
  10. 96 0
      src/main/java/com/style24/batch/biz/dao/TsbWmsGoodsDao.java
  11. 204 0
      src/main/java/com/style24/batch/biz/job/TsbAbstractJob.java
  12. 73 0
      src/main/java/com/style24/batch/biz/job/delivery/TsbDailyDeliveryZoneJob.java
  13. 52 0
      src/main/java/com/style24/batch/biz/job/goods/TsbGoodsBenefitPriceJob.java
  14. 52 0
      src/main/java/com/style24/batch/biz/job/goods/TsbGoodsInfantsSafeNoJob.java
  15. 52 0
      src/main/java/com/style24/batch/biz/job/goods/TsbGoodsPriceJob.java
  16. 60 0
      src/main/java/com/style24/batch/biz/job/goods/TsbGoodsRelateScoreJob.java
  17. 52 0
      src/main/java/com/style24/batch/biz/job/goods/TsbGoodsSnmJob.java
  18. 52 0
      src/main/java/com/style24/batch/biz/job/goods/TsbGoodsSummaryJob.java
  19. 52 0
      src/main/java/com/style24/batch/biz/job/goods/TsbGoodsTnmJob.java
  20. 65 0
      src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsBrandproviderJob.java
  21. 72 0
      src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsIncomelotJob.java
  22. 66 0
      src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsMeasurementJob.java
  23. 69 0
      src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsProductJob.java
  24. 123 0
      src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsProductStockJob.java
  25. 84 0
      src/main/java/com/style24/batch/biz/job/monitoring/TsbHourMonitoringJob.java
  26. 55 0
      src/main/java/com/style24/batch/biz/job/statistics/TsbInflowStatisticsJob.java
  27. 56 0
      src/main/java/com/style24/batch/biz/job/statistics/TsbInflowYesterdayStatisticsJob.java
  28. 66 0
      src/main/java/com/style24/batch/biz/service/TsbBatchService.java
  29. 57 0
      src/main/java/com/style24/batch/biz/service/TsbCommonService.java
  30. 71 0
      src/main/java/com/style24/batch/biz/service/TsbDeliveryService.java
  31. 639 0
      src/main/java/com/style24/batch/biz/service/TsbGoodsService.java
  32. 96 0
      src/main/java/com/style24/batch/biz/service/TsbMonitoringService.java
  33. 35 0
      src/main/java/com/style24/batch/biz/service/TsbStatisticsService.java
  34. 46 0
      src/main/java/com/style24/batch/biz/service/TsbWmsDeliveryService.java
  35. 158 0
      src/main/java/com/style24/batch/biz/service/TsbWmsGoodsService.java
  36. 60 0
      src/main/java/com/style24/batch/biz/task/TsbDeliveryTask.java
  37. 238 0
      src/main/java/com/style24/batch/biz/task/TsbGoodsTask.java
  38. 30 0
      src/main/java/com/style24/batch/biz/task/TsbHealthCheckTask.java
  39. 48 0
      src/main/java/com/style24/batch/biz/task/TsbMonitoringTask.java
  40. 73 0
      src/main/java/com/style24/batch/biz/task/TsbStatisticsTask.java
  41. 48 0
      src/main/java/com/style24/batch/support/config/TsbMybatisShopConfig.java
  42. 48 0
      src/main/java/com/style24/batch/support/config/TsbMybatisWmsConfig.java
  43. 39 0
      src/main/java/com/style24/batch/support/config/TsbWebMvcConfig.java
  44. 49 0
      src/main/java/com/style24/batch/support/env/TsbConstants.java
  45. 56 0
      src/main/java/com/style24/batch/support/startup/TsbApplication.java
  46. 19 0
      src/main/java/com/style24/batch/support/startup/TsbServletInitializer.java
  47. 48 0
      src/main/java/com/style24/persistence/domain/Coupon.java
  48. 39 0
      src/main/java/com/style24/persistence/domain/Delivery.java
  49. 158 0
      src/main/java/com/style24/persistence/domain/Goods.java
  50. 28 0
      src/main/java/com/style24/persistence/domain/GoodsIfIncomelot.java
  51. 30 0
      src/main/java/com/style24/persistence/domain/GoodsIfIncomelotitem.java
  52. 33 0
      src/main/java/com/style24/persistence/domain/GoodsIfMeasurement.java
  53. 33 0
      src/main/java/com/style24/persistence/domain/GoodsIfProductsku.java
  54. 24 0
      src/main/java/com/style24/persistence/domain/GoodsSafeNo.java
  55. 26 0
      src/main/java/com/style24/persistence/domain/GoodsSummary.java
  56. 28 0
      src/main/java/com/style24/persistence/domain/IfBrand.java
  57. 31 0
      src/main/java/com/style24/persistence/domain/IfProduct.java
  58. 33 0
      src/main/java/com/style24/persistence/domain/IfProductSku.java
  59. 30 0
      src/main/java/com/style24/persistence/domain/IfProvider.java
  60. 48 0
      src/main/java/com/style24/persistence/domain/Option.java
  61. 45 0
      src/main/java/com/style24/persistence/mybatis/shop/TsbBatch.xml
  62. 15 0
      src/main/java/com/style24/persistence/mybatis/shop/TsbCommon.xml
  63. 58 0
      src/main/java/com/style24/persistence/mybatis/shop/TsbDelivery.xml
  64. 1900 0
      src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml
  65. 80 0
      src/main/java/com/style24/persistence/mybatis/shop/TsbMonitoring.xml
  66. 79 0
      src/main/java/com/style24/persistence/mybatis/shop/TsbStatistics.xml
  67. 40 0
      src/main/java/com/style24/persistence/mybatis/wms/TsbWmsDelivery.xml
  68. 237 0
      src/main/java/com/style24/persistence/mybatis/wms/TsbWmsGoods.xml
  69. 7 0
      src/main/resources/banner.txt
  70. 17 0
      src/main/resources/config/application-dev.yml
  71. 66 0
      src/main/resources/config/application-locd.yml
  72. 18 0
      src/main/resources/config/application-locp.yml
  73. 17 0
      src/main/resources/config/application-run.yml
  74. 14 0
      src/main/resources/config/application.yml
  75. 43 0
      src/main/resources/log/logback-dev.xml
  76. 59 0
      src/main/resources/log/logback-locd.xml
  77. 59 0
      src/main/resources/log/logback-locp.xml
  78. 43 0
      src/main/resources/log/logback-run.xml
  79. 24 0
      src/main/resources/persistence/mybatis-shop-config.xml
  80. 24 0
      src/main/resources/persistence/mybatis-wms-config.xml
  81. 二进制
      src/main/webapp/WEB-INF/lib/gagaframework-web-core-1.7.1-RELEASE.jar
  82. 二进制
      src/main/webapp/WEB-INF/lib/gagaframework-web-parameter-1.7-RELEASE.jar
  83. 二进制
      src/main/webapp/WEB-INF/lib/gagaframework-web-rest-1.7-RELEASE.jar
  84. 二进制
      src/main/webapp/WEB-INF/lib/gagaframework-web-util-1.7-RELEASE.jar

+ 16 - 0
.gitignore

@@ -0,0 +1,16 @@
+target/
+.settings/
+.classpath
+/bin/
+/target/
+.project
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### MacOS ###
+.DS_Store
+META-INF/context.xml

+ 70 - 0
pom.xml

@@ -0,0 +1,70 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.style24</groupId>
+		<artifactId>root</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<groupId>com.style24.batch</groupId>
+	<artifactId>style24.batch</artifactId>
+	<packaging>war</packaging>
+	<name>style24.batch</name>
+	<description>STYLE24 Batch</description>
+	
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-batch</artifactId>
+		</dependency>
+
+		<!-- /// WEB-INF lib -->
+		<dependency>
+			<groupId>com.gagaframework</groupId>
+			<artifactId>gagaframework-web-core</artifactId>
+			<version>1.7.1-RELEASE</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-web-core-1.7.1-RELEASE.jar</systemPath>
+		</dependency>
+		<dependency>
+			<groupId>com.gagaframework</groupId>
+			<artifactId>gagaframework-web-parameter</artifactId>
+			<version>1.7-RELEASE</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-web-parameter-1.7-RELEASE.jar</systemPath>
+		</dependency>
+		<dependency>
+			<groupId>com.gagaframework</groupId>
+			<artifactId>gagaframework-web-rest</artifactId>
+			<version>1.7.1-RELEASE</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-web-rest-1.7-RELEASE.jar</systemPath>
+		</dependency>
+		<dependency>
+			<groupId>com.gagaframework</groupId>
+			<artifactId>gagaframework-web-util</artifactId>
+			<version>1.7-RELEASE</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-web-util-1.7-RELEASE.jar</systemPath>
+		</dependency>
+		<!-- \\\ WEB-INF lib -->
+	</dependencies>
+	
+	<build>
+		<finalName>${project.name}</finalName>
+		<resources>
+			<resource>
+				<directory>src/main/java</directory>
+				<includes>
+					<include>**/*.xml</include>
+				</includes>
+			</resource>
+			<resource>
+				<directory>src/main/resources</directory>
+				<includes>
+					<include>**/*</include>
+				</includes>
+			</resource>
+		</resources>
+	</build>
+</project>

+ 40 - 0
src/main/java/com/style24/batch/biz/dao/TsbBatchDao.java

@@ -0,0 +1,40 @@
+package com.style24.batch.biz.dao;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.BatchLog;
+
+/**
+ * 배치 Dao
+ *
+ * @author gagamel
+ * @since 2020. 12. 2
+ */
+@ShopDs
+public interface TsbBatchDao {
+
+	/**
+	 * 배치ID로 배치명 조회
+	 * @param batchId - 배치ID
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 2
+	 */
+	String getBatchName(String batchId);
+
+	/**
+	 * 배치로그 생성
+	 * @param batchLog - 배치로그 정보
+	 * @author gagamel
+	 * @since 2020. 12. 2
+	 */
+	void createBatchLog(BatchLog batchLog);
+
+	/**
+	 * 배치로그 종료 처리
+	 * @param batchLogSq - 배치로그일련번호
+	 * @author gagamel
+	 * @since 2020. 12. 2
+	 */
+	void updateBatchLog(Integer batchLogSq);
+
+}

+ 57 - 0
src/main/java/com/style24/batch/biz/dao/TsbCommonDao.java

@@ -0,0 +1,57 @@
+package com.style24.batch.biz.dao;
+
+import org.springframework.stereotype.Repository;
+
+import com.style24.core.support.annotation.ShopDs;
+
+/**
+ * 공통 Dao
+ *
+ * @author eskim
+ * @since 2021. 01. 04
+ */
+@ShopDs
+@Repository
+public interface TsbCommonDao {
+
+//	/**
+//	 * 시퀀스 조회
+//	 *
+//	 * @param value - 시퀀스명
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2019. 8. 5
+//	 */
+//	String getNextSequence(String value);
+
+	/**
+	 * WMS 연동 여부
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 04
+	 */
+	String getWmsSyncYn();
+
+//	/**
+//	 * 기본답변문구내용 조회
+//	 *
+//	 * @param basicAnswer - 답변일련번호
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2020. 3. 30
+//	 */
+//	TsbBasicAnswer getBasicAnswer(TsbBasicAnswer basicAnswer);
+//
+//	/**
+//	 * 공통코드 목록
+//	 *
+//	 * @param commoncode - 공통코드
+//	 * @return Collection<TsbCommonCode> - 공통코드
+//	 * @author  card007
+//	 * @since  2020. 07. 07
+//	 */
+//	Collection<TsbCommonCode> getCommonCodeList(TsbCommonCode commoncode);
+
+}

+ 39 - 0
src/main/java/com/style24/batch/biz/dao/TsbDeliveryDao.java

@@ -0,0 +1,39 @@
+package com.style24.batch.biz.dao;
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Delivery;
+
+/**
+ * 배송 Dao
+ *
+ * @author moon
+ * @since 2020. 12. 08
+ */
+@ShopDs
+public interface TsbDeliveryDao {
+
+	/**
+	 * 총알배송 권역정보 갱신
+	 * @param 
+	 * @return
+	 * @author moon
+	 * @since 2020. 12. 08
+	 */
+	void mergeDailyDeliveryZone(Delivery delivery);
+
+	/**
+	 * 배치로그 생성
+	 * @param batchLog - 배치로그 정보
+	 * @author gagamel
+	 * @since 2020. 12. 2
+	 */
+	//void createBatchLog(BatchLog batchLog);
+
+	/**
+	 * 배치로그 종료 처리
+	 * @param batchLogSq - 배치로그일련번호
+	 * @author gagamel
+	 * @since 2020. 12. 2
+	 */
+	//void updateBatchLog(Integer batchLogSq);
+
+}

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

@@ -0,0 +1,484 @@
+package com.style24.batch.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsIfIncomelot;
+import com.style24.persistence.domain.GoodsIfIncomelotitem;
+import com.style24.persistence.domain.GoodsIfMeasurement;
+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.gagaframework.web.parameter.GagaMap;
+
+/**
+ * 상품 Dao
+ *
+ * @author eskim
+ * @since 2020. 11. 27
+ */
+@ShopDs
+public interface TsbGoodsDao {
+
+	/**
+	 * 상품 기본정보 이력 생성
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 11. 27
+	 */
+	void createGoodsHst(Goods goods);
+
+	/**
+	 * 상품 타이틀 예약건 초기화
+	 *
+	 * @author eskim
+	 * @since 2020. 11. 27
+	 */
+	void updateGoodTnmInit();
+
+	/**
+	 * 상품 타이틀예약 종료처리
+	 *
+	 * @author eskim
+	 * @since 2020. 11. 27
+	 */
+	void updateGoodsTnmRes();
+
+	/**
+	 * 상품 타이틀예약 작업
+	 *
+	 * @author eskim
+	 * @since 2020. 11. 27
+	 */
+	void updateGoodsTnm();
+
+	/**
+	 * 상품 가격 예약건 초기화
+	 *
+	 * @author eskim
+	 * @since 2020. 11. 27
+	 */
+	void updateGoodPriceInit();
+
+	/**
+	 * 상품 가격예약 종료처리
+	 *
+	 * @author eskim
+	 * @since 2020. 11. 27
+	 */
+	void updateGoodsPriceRes();
+
+	/**
+	 * 상품 가격예약 작업
+	 *
+	 * @author eskim
+	 * @since 2020. 11. 27
+	 */
+	void updateGoodsPrice();
+
+	/**
+	 * 상품 검색어 작업
+	 *
+	 * @author eskim
+	 * @since 2020. 11. 27
+	 */
+	void updateGoodsSnmByGoodsSnm1Null();
+
+	/**
+	 * 상품 자동 검색어 조회
+	 *
+	 * @author eskim
+	 * @since 2020. 11. 27
+	 */
+	Collection<Goods> getGoodsByGooodsSnm1List();
+
+	/**
+	 * 상품 검색어 작업
+	 *
+	 * @author eskim
+	 * @since 2020. 11. 27
+	 */
+	void updateGoodsSnm(Goods goods);
+
+	/**
+	 * 상품즉시할인가 temp 테이블 삭제
+	 *
+	 * @param
+	 * @author eskim
+	 * @since 2020. 12. 02
+	 */
+	void deleteGoodsBenefitPriceTemp();
+
+	/**
+	 * 상품즉시할인가 temp 적용 변경
+	 *
+	 * @param
+	 * @author eskim
+	 * @since 2020. 12. 02
+	 */
+	void crteateGoodsBenefitPriceTemp(Coupon coupon);
+
+	/**
+	 * 상품즉시할인가 temp 적용 변경
+	 *
+	 * @param
+	 * @author eskim
+	 * @since 2020. 12. 02
+	 */
+	void updateGoodsBenefitPriceTemp(Coupon coupon);
+
+	/**
+	 * 상품즉시할인가 테이블 삭제
+	 *
+	 * @param
+	 * @author eskim
+	 * @since 2020. 12. 02
+	 */
+	void deleteGoodsBenefitPrice();
+
+	/**
+	 * 상품즉시할인가 생성
+	 *
+	 * @param
+	 * @author eskim
+	 * @since 2020. 12. 02
+	 */
+	void createGoodsBenefitPrice();
+
+	/**
+	 * 연관상품보기 스코어링 삭제
+	 *
+	 * @author eskim
+	 * @since 2020. 12. 04
+	 */
+	void deleteGoodsRelate(String workDt);
+
+	/**
+	 * 연관상품보기 스코어링 생성
+	 *
+	 * @author eskim
+	 * @since 2020. 12. 04
+	 */
+	void createGoodsRelate(String work7agoDt);
+
+	/**
+	 * 전시상품 통계정보작업 - temp 테이블 삭제
+	 *
+	 * @author eskim
+	 * @since 2020. 12. 04
+	 */
+	void deleteGoodsSummaryTemp();
+
+	/**
+	 * 전시상품 통계정보작업 - 상품 판매수량
+	 *
+	 * @author eskim
+	 * @since 2020. 12. 04
+	 */
+	void createGoodsSummaryBySale(GoodsSummary goodsSummary);
+
+	/**
+	 * 전시상품 통계정보작업 -상품 조회수
+	 *
+	 * @author eskim
+	 * @since 2020. 12. 04
+	 */
+	void createGoodsSummaryByView(GoodsSummary goodsSummary);
+
+	/**
+	 * 전시상품 통계정보작업 - 상품평 건수
+	 *
+	 * @author eskim
+	 * @since 2020. 12. 04
+	 */
+	void createGoodsSummaryByReviewCount(GoodsSummary goodsSummary);
+
+	/**
+	 * 전시상품 통계정보작업 - 상품평 점수합계
+	 *
+	 * @author eskim
+	 * @since 2020. 12. 04
+	 */
+	void createGoodsSummaryByReviewSum(GoodsSummary goodsSummary);
+
+	/**
+	 * 전시상품 통계정보작업 - 상품평 스코어합계
+	 *
+	 * @author eskim
+	 * @since 2020. 12. 04
+	 */
+	void createGoodsSummaryByReviewScore(GoodsSummary goodsSummary);
+
+	/**
+	 * 전시상품 통계정보작업 - 상품문의
+	 *
+	 * @author eskim
+	 * @since 2020. 12. 04
+	 */
+	void createGoodsSummaryByCounsel(GoodsSummary goodsSummary);
+
+	/**
+	 * 전시상품 통계정보작업 - 통계정보 저장
+	 *
+	 * @author eskim
+	 * @since 2020. 12. 04
+	 */
+	void saveGoodsSummary();
+
+	/**
+	 * 안전인증대상 상품 조회
+	 *
+	 * @author eskim
+	 * @since 2020. 12. 04
+	 */
+	Collection<GoodsSafeNo> getGoodsSafeNoList();
+
+	/**
+	 * 안전인증대상 상품 저장
+	 *
+	 * @author eskim
+	 * @since 2020. 12. 04
+	 */
+	void saveGoodsSafeNo(GoodsSafeNo goodsSafeNo);
+
+	/**
+	 * 실측사이즈 저장
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	void saveGoodsIfMeasurement(GoodsIfMeasurement goodsMeasurement);
+
+	/**
+	 * 입고 저장
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	void saveGoodsIfIncomelot(GoodsIfIncomelot ㅎoodsIfIncomelot);
+
+	/**
+	 * 입고상품 저장
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	void saveGoodsIfIncomelotitem(GoodsIfIncomelotitem goodsIfIncomelotitem);
+
+	/**
+	 * 온라인 입고 상품 처리
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 04
+	 */
+	void saveWmsGoods(GoodsIfIncomelot goodsIfIncomelot);
+
+	/**
+	 * 공급업체 정보 조회
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 05
+	 */
+	Collection<IfProvider> getSupplyCompanyList();
+
+	/**
+	 * 브랜드 정보 조회
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 05
+	 */
+	Collection<IfBrand> getBrandList();
+
+	/**
+	 * 상품 정보 조회
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	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);
+	void createIfProductSku(GagaMap dataMap);
+
+	/**
+	 * TB_IF_PRODUCTSKU_TEMP 저장
+	 *
+	 * @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);
+
+
+	/**
+	 *  상품 전시재고 삭제
+	 *
+	 * @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();
+
+	/**
+	 * 입점상품 SELL_QTY 목록 조회
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	Collection<Option> getGoodsSelfNoStockList();
+
+	/**
+	 * 상품 옵션/재고 정보 이력생성
+	 *
+	 * @param option
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void createStockHst(Option option);
+
+	/**
+	 * 상품 옵션/재고 변경
+	 *
+	 * @param option
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void updateStock(Option option);
+
+	/**
+	 * WMS 재고 임시 테이블 삭제
+	 *
+	 * @param
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void deleteGoodsOptionSync();
+
+	/**
+	 * TB_OPTION = > TB_OPTION_SYNC 적용
+	 *
+	 * @param
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void createGoodsOptionSync();
+
+	/**
+	 * TB_OPTION_SYNC_TEMP => TB_OPTION_SYNC 변경적용
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void saveGoodsOptionSyncSync();
+
+	/**
+	 * WMS 임시 테이블에서 실테이블로 이관(재고가 상이한것만 수정)
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void saveGoodsOptionNew();
+
+	/**
+	 * TB_SELL_QTY_TEMP 테이블 삭제
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void deleteTtbSellQtyTemp();
+
+	/**
+	 * TB_SELL_QTY_TEMP 생성
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void createTtbSellQtyTemp();
+
+	/**
+	 * WMS 재고 테이블 이관 후 TB_SELL_QTY 데이터 삭제
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void deleteSellQty();
+
+	/**
+	 * TB_SELL_QTY_TEMP => TB_SELL_QTY 생성
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void createTtbSellQty();
+
+	/**
+	 * TB_ORDER_DETAIL => TB_SELL_QTY 생성
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void createTtbSellQtyByOrderDetail();
+
+}

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

@@ -0,0 +1,67 @@
+package com.style24.batch.biz.dao;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Alarm;
+
+/**
+ * 모니터링 Dao
+ * 
+ * @author gagamel
+ * @since 2020. 11. 13
+ */
+@ShopDs
+public interface TsbMonitoringDao {
+
+	/**
+	 * 알람SMS 생성
+	 * @param alarm - 알람 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 13
+	 */
+	void createAlarmSms(Alarm alarm);
+
+	/**
+	 * 1일내 회원가입건수 조회
+	 * @param siteCd - 사이트코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 13
+	 */
+	int getJoinCountWithinOneDay(String siteCd);
+
+	/**
+	 * 1시간내 로그인건수 조회
+	 * @param siteCd - 사이트코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 13
+	 */
+	int getLoginCountWithinOneHour(String siteCd);
+
+	/**
+	 * 1시간내 유입건수 조회
+	 * @param siteCd - 사이트코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 13
+	 */
+	int getInthrowCountWithinOneHour(String siteCd);
+
+	/**
+	 * 2시간내 결제건수 조회
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 13
+	 */
+	int getPayCountWithinTwoHour();
+
+	/**
+	 * 1일내 외부몰주문수집건수 조회
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 13
+	 */
+	int getExtmallOrderCollectionCountWithinOneDay();
+
+}

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

@@ -0,0 +1,22 @@
+package com.style24.batch.biz.dao;
+
+import com.style24.core.support.annotation.ShopDs;
+
+/**
+ * 통계 Dao
+ *
+ * @author eskim
+ * @since 2020. 12. 03
+ */
+@ShopDs
+public interface TsbStatisticsDao {
+
+	/**
+	 * 사이트 제휴코드 유입집계
+	 *
+	 * @author eskim
+	 * @since 2020. 12. 03
+	 */
+	int createInflowDaily(String inflowDt);
+
+}

+ 26 - 0
src/main/java/com/style24/batch/biz/dao/TsbWmsDeliveryDao.java

@@ -0,0 +1,26 @@
+package com.style24.batch.biz.dao;
+
+import java.util.Collection;
+import com.style24.core.support.annotation.WmsDs;
+import com.style24.persistence.domain.Delivery;
+
+/**
+ * 배송 Dao
+ *
+ * @author moon
+ * @since 2020. 12. 08
+ */
+@WmsDs
+public interface TsbWmsDeliveryDao {
+
+	/**
+	 * WMS_IF 총알배송 권역정보 조회
+	 * @param batchId - 배치ID
+	 * @return
+	 * @author moon
+	 * @since 2020. 12. 08
+	 */
+	Collection<Delivery> getWmsIfDailyDeliveryZoneList();
+	
+	
+}

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

@@ -0,0 +1,96 @@
+package com.style24.batch.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.WmsDs;
+import com.style24.persistence.domain.GoodsIfIncomelot;
+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;
+
+/**
+ * WMS 상품 연동Dao
+ *
+ * @author eskim
+ * @since 2021. 01. 01
+ */
+@WmsDs
+public interface TsbWmsGoodsDao {
+
+	/**
+	 * 실측사이즈 연동
+	 *
+	 * @param jobdate
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	Collection<GoodsIfMeasurement> getWmsMeasurementList(String jobdate);
+
+	/**
+	 * 입고 목록
+	 *
+	 * @param jobdate
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	Collection<GoodsIfIncomelot> getWmsIncomelotList(String jobdate);
+
+	/**
+	 * 입고 상품목록
+	 *
+	 * @param jobdate
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	Collection<GoodsIfIncomelotitem> getWmsIncomelotitemList(String jobdate);
+
+	/**
+	 * WMS 업체정보 송신
+	 *
+	 * @param ifProvider
+	 * @author eskim
+	 * @since 2021. 01. 05
+	 */
+	void saveWmsProvider(IfProvider ifProvider);
+
+	/**
+	 * WMS 브랜드정보 송신
+	 *
+	 * @param ifBrand
+	 * @author eskim
+	 * @since 2021. 01. 05
+	 */
+	void saveWmsBrand(IfBrand ifBrand);
+
+	/**
+	 * WMS 브랜드업체관계정보 송신
+	 *
+	 * @param ifBrand
+	 * @author eskim
+	 * @since 2021. 01. 05
+	 */
+	void saveWmsBrandProviderXref(IfBrand ifBrand);
+
+	/**
+	 * WMS 상품 정보 송신
+	 *
+	 * @param ifProduct
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	void saveWmsProduct(IfProduct ifProduct);
+
+	/**
+	 * WMS 재고 테이블 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	Collection<IfProductSku> getWmsIfProductSukList();
+
+
+}

+ 204 - 0
src/main/java/com/style24/batch/biz/job/TsbAbstractJob.java

@@ -0,0 +1,204 @@
+package com.style24.batch.biz.job;
+
+import java.sql.Timestamp;
+import java.util.Collection;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.style24.batch.biz.service.TsbBatchService;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Batch Abastract Class
+ *
+ * @author gagamel
+ * @since 2020. 11. 13
+ */
+@Slf4j
+public abstract class TsbAbstractJob<I, O, R> {
+
+	private long startTime = 0L;
+	private long endTime = 0L;
+
+	private String batchId;
+	private String batchName;
+
+	private I readItem = null;
+	private O convertedItem = null;
+	private R resultItem = null;
+
+	public int totalCount = 0;
+
+	@Autowired
+	private TsbBatchService batchService;
+
+	private Integer batchLogSq;	// 배치로그일련번호
+
+	/**
+	 * Batch Job 시작 로그를 출력한다.
+	 */
+	protected void printStart() {
+		startTime = System.currentTimeMillis();
+
+		log.info("################################################################################");
+		log.info("{} Start!!!\n", batchName);
+	}
+
+	/**
+	 * Batch Job 결과 건수 로그를 출력한다.
+	 */
+	@SuppressWarnings("rawtypes")
+	protected void printResult(int successCount, int failureCount) {
+		if (readItem instanceof Collection) {
+			totalCount = ((Collection)readItem).size();
+
+			log.info("--------------------------------------------------------------------------------");
+			log.info("배치: {}, 대상: {}건 중 성공: {}건, 실패: {}건", batchName, totalCount, successCount, failureCount);
+			log.info("--------------------------------------------------------------------------------");
+		}
+	}
+
+	/**
+	 * Batch Job 결과 건수 로그를 출력한다.
+	 */
+	@SuppressWarnings("rawtypes")
+	protected void printResult(int totalCount, int successCount, int failureCount) {
+		log.info("--------------------------------------------------------------------------------");
+		log.info("배치: {}, 대상: {}건 중 성공: {}건, 실패: {}건", batchName, totalCount, successCount, failureCount);
+		log.info("--------------------------------------------------------------------------------");
+	}
+
+	/**
+	 * Batch Job 종료 로그를 출력한다.
+	 */
+	protected void printEnd() {
+		if (StringUtils.isNotBlank(batchId)) {
+			// 배치로그 종료 처리
+			batchService.updateBatchLog(batchLogSq);
+		}
+
+		endTime = System.currentTimeMillis();
+
+		log.info("Start Time: {}", new Timestamp(startTime));
+		log.info("End Time: {}", new Timestamp(endTime));
+		log.info("Processing Time: {} seconds\n", ((endTime - startTime) / 1000.0));
+		log.info("{} End!!!", batchName);
+		log.info("################################################################################\n\n");
+	}
+
+	/**
+	 * 배치ID로 배치를 실행한다.
+	 * @param batchId - 배치ID
+	 * @throws Exception
+	 */
+	public void runById(String batchId) throws Exception {
+		this.batchId = batchId;
+
+		if (StringUtils.isNotBlank(batchId)) {
+			// 배치명 조회
+			batchName = batchService.getBatchName(batchId);
+
+			if (!StringUtils.isNotBlank(batchName)) {
+				System.exit(500);
+				log.info("{} 배치는 미사용으로 종료합니다.(TB_BATCH 테이블 참조)");
+			}
+
+			// 배치로그 생성
+			batchLogSq = batchService.createBatchLog(batchId);
+		}
+
+		this.printStart();
+
+		readItem = this.read();
+
+		if (readItem != null) {
+			convertedItem = this.process(readItem);
+
+			resultItem = this.write(convertedItem);
+
+			this.notify(resultItem);
+		} else { // 배치 처리할 대상 데이터가 없으면 종료
+			log.info("처리할 데이터가 없습니다.\n");
+		}
+
+		this.printEnd();
+	}
+
+	/**
+	 * 배치명으로 배치를 실행한다.
+	 * @param batchId - 배치ID
+	 * @throws Exception
+	 */
+	public void run(String batchName) throws Exception {
+		this.batchName = batchName;
+
+		this.printStart();
+
+		readItem = this.read();
+
+		if (readItem != null) {
+			convertedItem = this.process(readItem);
+
+			resultItem = this.write(convertedItem);
+
+			this.notify(resultItem);
+		} else { // 배치 처리할 대상 데이터가 없으면 종료
+			log.info("처리할 데이터가 없습니다.\n");
+		}
+
+		this.printEnd();
+	}
+
+//	/**
+//	 * 데이터 로그를 출력한다.
+//	 * @param dataMap - 데이터
+//	 */
+//	protected void printRowValue(GagaMap dataMap) {
+//		Iterator<Entry<Object, Object>> itr = dataMap.entrySet().iterator();
+//
+//		StringBuilder sb = new StringBuilder();
+//		while (itr.hasNext()) {
+//			Entry<Object, Object> entry = itr.next();
+//			sb.append(" | ").append(entry.getValue());
+//		}
+//
+//		String value = "";
+//		if (StringUtils.hasLength(sb.toString())) {
+//			value += "[" + sb.toString().substring(2) + "]";
+//			logger.info(value);
+//		}
+//	}
+
+	/**
+	 * 배치 처리할 항목을 조회한다.
+	 * @return 배치 처리를 위해 조회한 항목
+	 * @throws Exception
+	 */
+	public abstract I read() throws Exception;
+
+	/**
+	 * 조회한 항목을 실제 데이터 처리를 위해 변환한다. 변환할 데이터가 없으면 아무 처리 하지 않아도 된다.
+	 * @param readItem - 조회한 항목
+	 * @return 변환된 항목
+	 * @throws Exception
+	 */
+	public abstract O process(I readItem) throws Exception;
+
+	/**
+	 * 변환된 항목으로 배치를 처리하고, 그 결과를 조회한다.
+	 * @param convertedItem - 변환된 항목
+	 * @return 처리결과 항목
+	 * @throws Exception
+	 */
+	public abstract R write(O convertedItem) throws Exception;
+
+	/**
+	 * 배치처리결과를 노티한다.
+	 * @param resultItem - 배치처리결과 항목
+	 * @throws Exception
+	 */
+	public abstract void notify(R resultItem) throws Exception;
+
+}

+ 73 - 0
src/main/java/com/style24/batch/biz/job/delivery/TsbDailyDeliveryZoneJob.java

@@ -0,0 +1,73 @@
+package com.style24.batch.biz.job.delivery;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbDeliveryService;
+import com.style24.batch.biz.service.TsbWmsDeliveryService;
+import com.style24.persistence.domain.Delivery;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 권영배송정보 갱신 (wmsif to mall) 
+ *
+ * @author moon
+ * @since 2020. 12. 08
+ */
+@Component
+@Slf4j
+public class TsbDailyDeliveryZoneJob extends TsbAbstractJob<Delivery, Delivery, Delivery> {
+
+	@Autowired
+	private TsbDeliveryService deliveryService;
+
+	@Autowired
+	private TsbWmsDeliveryService wmsDeliveryService
+	
+	;
+	private int succCnt = 0;
+	private int failCnt = 0;
+
+	@Override
+	public Delivery read() throws Exception {
+
+		Delivery delivery = new Delivery();
+		return delivery;
+	}
+
+	@Override
+	public Delivery process(Delivery delivery) throws Exception {
+		succCnt = 0;
+		failCnt = 1;
+		/**
+		 * 1. wms_if: TB_IF_DailyDeliveryZone 조회 
+		 * 2. mall: TB_DailyDeliveryZone merge 
+		 * */
+		
+		// 1. wms_if: TB_IF_DailyDeliveryZone 조회 
+		Collection<Delivery> dailyDeliZoneList = wmsDeliveryService.getWmsIfDailyDeliveryZoneList();
+		
+		// 2. mall: TB_DailyDeliveryZone merge 
+		deliveryService.mergeDailyDeliveryZone(dailyDeliZoneList);
+		succCnt = 1;
+		failCnt = 0;
+		
+		return delivery;
+	}
+
+	@Override
+	public Delivery write(Delivery delivery) throws Exception {
+
+		return delivery;
+	}
+
+	@Override
+	public void notify(Delivery delivery) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 52 - 0
src/main/java/com/style24/batch/biz/job/goods/TsbGoodsBenefitPriceJob.java

@@ -0,0 +1,52 @@
+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.TsbGoodsService;
+import com.style24.persistence.domain.Goods;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 상품 즉시할인가 생성
+ *
+ * @author eskim
+ * @since 2020. 12. 02
+ */
+@Component
+@Slf4j
+public class TsbGoodsBenefitPriceJob extends TsbAbstractJob<Goods, Goods, Goods> {
+
+	@Autowired
+	private TsbGoodsService goodsService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+
+	@Override
+	public Goods read() throws Exception {
+
+		Goods goods = new Goods();
+		return goods;
+	}
+
+	@Override
+	public Goods process(Goods goods) throws Exception {
+		return goods;
+	}
+
+	@Override
+	public Goods write(Goods goods) throws Exception {
+
+		goodsService.createGoodsBenefitPrice();
+		return goods;
+	}
+
+	@Override
+	public void notify(Goods goods) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 52 - 0
src/main/java/com/style24/batch/biz/job/goods/TsbGoodsInfantsSafeNoJob.java

@@ -0,0 +1,52 @@
+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.TsbGoodsService;
+import com.style24.persistence.domain.Goods;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 영유아상품 인증번호 수신
+ *
+ * @author eskim
+ * @since 2020. 12. 04
+ */
+@Component
+@Slf4j
+public class TsbGoodsInfantsSafeNoJob extends TsbAbstractJob<Goods, Goods, Goods> {
+
+	@Autowired
+	private TsbGoodsService goodsService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+
+	@Override
+	public Goods read() throws Exception {
+
+		Goods goods = new Goods();
+		return goods;
+	}
+
+	@Override
+	public Goods process(Goods goods) throws Exception {
+		return goods;
+	}
+
+	@Override
+	public Goods write(Goods goods) throws Exception {
+
+		goodsService.saveGoodsSafeNo();
+		return goods;
+	}
+
+	@Override
+	public void notify(Goods goods) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 52 - 0
src/main/java/com/style24/batch/biz/job/goods/TsbGoodsPriceJob.java

@@ -0,0 +1,52 @@
+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.TsbGoodsService;
+import com.style24.persistence.domain.Goods;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 상품 가격예약 적용
+ *
+ * @author eskim
+ * @since 2020. 11. 27
+ */
+@Component
+@Slf4j
+public class TsbGoodsPriceJob extends TsbAbstractJob<Goods, Goods, Goods> {
+
+	@Autowired
+	private TsbGoodsService goodsService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+
+	@Override
+	public Goods read() throws Exception {
+
+		Goods goods = new Goods();
+		return goods;
+	}
+
+	@Override
+	public Goods process(Goods goods) throws Exception {
+		return goods;
+	}
+
+	@Override
+	public Goods write(Goods goods) throws Exception {
+
+		goodsService.saveGoodsPriceRsvt();
+		return goods;
+	}
+
+	@Override
+	public void notify(Goods goods) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 60 - 0
src/main/java/com/style24/batch/biz/job/goods/TsbGoodsRelateScoreJob.java

@@ -0,0 +1,60 @@
+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.TsbGoodsService;
+import com.style24.persistence.domain.Goods;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.util.GagaDateUtil;
+
+/**
+ * 연관상품보기 스코어링 작업 - 일배치
+ *
+ * @author eskim
+ * @since 2020. 12. 03
+ */
+@Component
+@Slf4j
+public class TsbGoodsRelateScoreJob extends TsbAbstractJob<Goods, Goods, Goods> {
+
+	@Autowired
+	private TsbGoodsService goodsService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+	private String workDate = "";
+	private String work7agoDate = "";
+
+	@Override
+	public Goods read() throws Exception {
+
+		//작업일
+		workDate = GagaDateUtil.getOffsetDate(-1, "yyyyMMdd");
+		work7agoDate = GagaDateUtil.getOffsetDate(-7, "yyyyMMdd");
+
+		Goods goods = new Goods();
+		return goods;
+	}
+
+	@Override
+	public Goods process(Goods goods) throws Exception {
+		return goods;
+	}
+
+	@Override
+	public Goods write(Goods goods) throws Exception {
+
+		goodsService.createGoodsRelateScore(workDate, work7agoDate);
+		return goods;
+	}
+
+	@Override
+	public void notify(Goods goods) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 52 - 0
src/main/java/com/style24/batch/biz/job/goods/TsbGoodsSnmJob.java

@@ -0,0 +1,52 @@
+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.TsbGoodsService;
+import com.style24.persistence.domain.Goods;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 상품 검색어 작업 - 시간배치
+ * 
+ * @author eskim
+ * @since 2020. 11. 30
+ */
+@Component
+@Slf4j
+public class TsbGoodsSnmJob extends TsbAbstractJob<Goods, Goods, Goods> {
+
+	@Autowired
+	private TsbGoodsService goodsService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+
+	@Override
+	public Goods read() throws Exception {
+
+		Goods goods = new Goods();
+		return goods;
+	}
+
+	@Override
+	public Goods process(Goods goods) throws Exception {
+		return goods;
+	}
+
+	@Override
+	public Goods write(Goods goods) throws Exception {
+
+		goodsService.updateGoodsSnm();
+		return goods;
+	}
+
+	@Override
+	public void notify(Goods goods) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 52 - 0
src/main/java/com/style24/batch/biz/job/goods/TsbGoodsSummaryJob.java

@@ -0,0 +1,52 @@
+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.TsbGoodsService;
+import com.style24.persistence.domain.Goods;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 전시상품 통계정보 작업 - 일배치
+ *
+ * @author eskim
+ * @since 2020. 12. 04
+ */
+@Component
+@Slf4j
+public class TsbGoodsSummaryJob extends TsbAbstractJob<Goods, Goods, Goods> {
+
+	@Autowired
+	private TsbGoodsService goodsService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+
+	@Override
+	public Goods read() throws Exception {
+
+		Goods goods = new Goods();
+		return goods;
+	}
+
+	@Override
+	public Goods process(Goods goods) throws Exception {
+		return goods;
+	}
+
+	@Override
+	public Goods write(Goods goods) throws Exception {
+
+		goodsService.createGoodsSummary();
+		return goods;
+	}
+
+	@Override
+	public void notify(Goods goods) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 52 - 0
src/main/java/com/style24/batch/biz/job/goods/TsbGoodsTnmJob.java

@@ -0,0 +1,52 @@
+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.TsbGoodsService;
+import com.style24.persistence.domain.Goods;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 상품 타이틀예약 적용
+ *
+ * @author eskim
+ * @since 2020. 11. 27
+ */
+@Component
+@Slf4j
+public class TsbGoodsTnmJob extends TsbAbstractJob<Goods, Goods, Goods> {
+
+	@Autowired
+	private TsbGoodsService goodsService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+
+	@Override
+	public Goods read() throws Exception {
+
+		Goods goods = new Goods();
+		return goods;
+	}
+
+	@Override
+	public Goods process(Goods goods) throws Exception {
+		return goods;
+	}
+
+	@Override
+	public Goods write(Goods goods) throws Exception {
+
+		goodsService.saveGoodsTnmRsvt();
+		return goods;
+	}
+
+	@Override
+	public void notify(Goods goods) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 65 - 0
src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsBrandproviderJob.java

@@ -0,0 +1,65 @@
+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.TsbWmsGoodsService;
+import com.style24.persistence.domain.IfBrand;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.util.GagaDateUtil;
+
+/**
+ * WMS 브랜드/업체정보 송신
+ *
+ * @author eskim
+ * @since 2021. 01. 05
+ */
+@Component
+@Slf4j
+public class TsbGoodsWmsBrandproviderJob extends TsbAbstractJob<IfBrand, IfBrand, IfBrand> {
+
+	@Autowired
+	private TsbWmsGoodsService wmsGoodsService;
+
+	@Autowired
+	private TsbCommonService commonService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+
+	@Override
+	public IfBrand read() throws Exception {
+
+		// WMS 동기화 옵션 여부 확인
+		String wmsSyncYn = commonService.getWmsSyncYn();
+		if ("N".equals(wmsSyncYn)) {
+			log.info("WMS 정보 동기화 미실행 {}, 연동여부 : {}", GagaDateUtil.getToday("yyyy-MM-dd HH:mm:ss"), wmsSyncYn);
+			return null;
+		}
+		IfBrand ifBrand = new IfBrand();
+		return ifBrand;
+	}
+
+	@Override
+	public IfBrand process(IfBrand ifBrand) throws Exception {
+		return ifBrand;
+	}
+
+	@Override
+	public IfBrand write(IfBrand ifBrand) throws Exception {
+
+		wmsGoodsService.saveWmsBrandProvider();
+
+		return ifBrand;
+	}
+
+	@Override
+	public void notify(IfBrand ifBrand) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

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

@@ -0,0 +1,72 @@
+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.GoodsIfIncomelotitem;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.util.GagaDateUtil;
+
+/**
+ * WMS 입고 수신
+ *
+ * @author eskim
+ * @since 2021. 01. 01
+ */
+@Component
+@Slf4j
+public class TsbGoodsWmsIncomelotJob extends TsbAbstractJob<GoodsIfIncomelotitem, GoodsIfIncomelotitem, GoodsIfIncomelotitem> {
+
+	@Autowired
+	private TsbGoodsService goodsService;
+
+	@Autowired
+	private TsbCommonService commonService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+	private String jobdate = "";
+
+	@Override
+	public GoodsIfIncomelotitem read() throws Exception {
+
+		// WMS 동기화 옵션 여부 확인
+		String wmsSyncYn = commonService.getWmsSyncYn();
+		if ("N".equals(wmsSyncYn)) {
+			log.info("WMS 정보 동기화 미실행 {}, 연동여부 : {}", GagaDateUtil.getToday("yyyy-MM-dd HH:mm:ss"), wmsSyncYn);
+			return null;
+		}
+		GoodsIfIncomelotitem goodsIfIncomelotitem = new GoodsIfIncomelotitem();
+		return goodsIfIncomelotitem;
+	}
+
+	@Override
+	public GoodsIfIncomelotitem process(GoodsIfIncomelotitem goodsIfIncomelotitem) throws Exception {
+		return goodsIfIncomelotitem;
+	}
+
+	@Override
+	public GoodsIfIncomelotitem write(GoodsIfIncomelotitem goodsIfIncomelotitem) throws Exception {
+
+		jobdate = GagaDateUtil.getOffsetDate(-1);	//전일자
+
+		//wms 입고 정보 처리
+		goodsService.saveGoodsWmsIncomelot(jobdate);
+
+		//온라인 입고 상품 처리
+		goodsService.saveWmsGoods(jobdate);
+
+		return goodsIfIncomelotitem;
+	}
+
+	@Override
+	public void notify(GoodsIfIncomelotitem goodsIfIncomelotitem) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

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

@@ -0,0 +1,66 @@
+package com.style24.batch.biz.job.goods;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbCommonService;
+import com.style24.batch.biz.service.TsbGoodsService;
+import com.style24.persistence.domain.GoodsIfMeasurement;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.util.GagaDateUtil;
+
+/**
+ * WMS 실측사이즈 수신
+ *
+ * @author eskim
+ * @since 2020. 12. 31
+ */
+@Component
+@Slf4j
+public class TsbGoodsWmsMeasurementJob extends TsbAbstractJob<GoodsIfMeasurement, GoodsIfMeasurement, GoodsIfMeasurement> {
+
+	@Autowired
+	private TsbGoodsService goodsService;
+
+	@Autowired
+	private TsbCommonService commonService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+	private String jobdate = "";
+
+	@Override
+	public GoodsIfMeasurement read() throws Exception {
+
+		// WMS 동기화 옵션 여부 확인
+		String wmsSyncYn = commonService.getWmsSyncYn();
+		if ("N".equals(wmsSyncYn)) {
+			log.info("WMS 정보 동기화 미실행 {}, 연동여부 : {}", GagaDateUtil.getToday("yyyy-MM-dd HH:mm:ss"), wmsSyncYn);
+			return null;
+		}
+		GoodsIfMeasurement goodsIfMeasurement = new GoodsIfMeasurement();
+		return goodsIfMeasurement;
+	}
+
+	@Override
+	public GoodsIfMeasurement process(GoodsIfMeasurement goodsIfMeasurement) throws Exception {
+		return goodsIfMeasurement;
+	}
+
+	@Override
+	public GoodsIfMeasurement write(GoodsIfMeasurement goodsIfMeasurement) throws Exception {
+
+		jobdate = GagaDateUtil.getOffsetDate(-1);	//전일자
+		goodsService.saveGoodsWmsMeasurement(jobdate);
+		return goodsIfMeasurement;
+	}
+
+	@Override
+	public void notify(GoodsIfMeasurement goodsIfMeasurement) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

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

@@ -0,0 +1,69 @@
+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.TsbWmsGoodsService;
+import com.style24.persistence.domain.IfProduct;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.util.GagaDateUtil;
+
+/**
+ * WMS 상품정보 송신
+ *
+ * @author eskim
+ * @since 2021. 01. 01
+ */
+@Component
+@Slf4j
+public class TsbGoodsWmsProductJob extends TsbAbstractJob<IfProduct, IfProduct, IfProduct> {
+
+	@Autowired
+	private TsbWmsGoodsService wmsGoodsService;
+
+	@Autowired
+	private TsbCommonService commonService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+	private String jobdate = "";
+
+	@Override
+	public IfProduct read() throws Exception {
+
+		// WMS 동기화 옵션 여부 확인
+		String wmsSyncYn = commonService.getWmsSyncYn();
+		if ("N".equals(wmsSyncYn)) {
+			log.info("WMS 정보 동기화 미실행 {}, 연동여부 : {}", GagaDateUtil.getToday("yyyy-MM-dd HH:mm:ss"), wmsSyncYn);
+			return null;
+		}
+		IfProduct ifProduct = new IfProduct();
+		return ifProduct;
+	}
+
+	@Override
+	public IfProduct process(IfProduct ifProduct) throws Exception {
+		return ifProduct;
+	}
+
+	@Override
+	public IfProduct write(IfProduct ifProduct) throws Exception {
+
+		jobdate = GagaDateUtil.getOffsetDate(-1);	//전일자
+
+		//온라인 상품정보 조회 처리
+		wmsGoodsService.saveGoodsWmsProduct(jobdate);
+
+		return ifProduct;
+	}
+
+	@Override
+	public void notify(IfProduct ifProduct) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

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

@@ -0,0 +1,123 @@
+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;
+
+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 lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.parameter.GagaMap;
+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 TsbWmsGoodsService wmsGoodsService;
+
+	@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);
+
+			// TB_IF_PRODUCTSKU_TEMP 작업
+			goodsService.deleteIfProductSku();
+
+			// TB_IF_PRODUCTSKU_TEMP 생성
+			Collection<IfProductSku> wmsIfProductSukList = wmsGoodsService.getWmsIfProductSukList();  //테스트 1000건
+
+			//대용량 : N
+			String byrow = "Y";
+			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.saveGoodsStock();
+		}
+
+		//온라인 전시 재고 작업
+		goodsService.saveGoodsDispStock();
+
+		return ifProductSku;
+	}
+
+	@Override
+	public void notify(IfProductSku ifProductSku) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 84 - 0
src/main/java/com/style24/batch/biz/job/monitoring/TsbHourMonitoringJob.java

@@ -0,0 +1,84 @@
+package com.style24.batch.biz.job.monitoring;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbMonitoringService;
+import com.style24.batch.support.env.TsbConstants;
+import com.style24.core.support.env.TscConstants;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.parameter.GagaMap;
+
+/**
+ * 시간 모니터링
+ * 
+ * @author gagamel
+ * @since 2020. 11. 13
+ */
+@Component
+@Slf4j
+public class TsbHourMonitoringJob extends TsbAbstractJob<Collection<GagaMap>, Collection<GagaMap>, Collection<GagaMap>> {
+
+	@Autowired
+	private TsbMonitoringService monitoringService;
+
+	@Override
+	public Collection<GagaMap> read() throws Exception {
+		Collection<GagaMap> dataList = new ArrayList<>();
+
+		GagaMap data = new GagaMap();
+
+		// 1시간내 로그인건수
+		data.setString("alarmType", TsbConstants.Monitoring.LOGIN_CNT.value());
+		data.setInt("readCnt", monitoringService.getLoginCountWithinOneHour(TscConstants.Site.STYLE24.value()));
+		dataList.add(data);
+
+		// 1시간내 유입건수
+		data = new GagaMap();
+		data.setString("alarmType", TsbConstants.Monitoring.INFLOW_CNT.value());
+		data.setInt("readCnt", monitoringService.getInthrowCountWithinOneHour(TscConstants.Site.STYLE24.value()));
+		dataList.add(data);
+
+		// 2시간내 결제건수
+		data = new GagaMap();
+		data.setString("alarmType", TsbConstants.Monitoring.PAY_CNT.value());
+		data.setInt("readCnt", monitoringService.getPayCountWithinTwoHour());
+		dataList.add(data);
+
+		return dataList;
+	}
+
+	@Override
+	public Collection<GagaMap> process(Collection<GagaMap> dataList) throws Exception {
+		if (dataList == null || dataList.isEmpty()) {
+			log.info("처리할 데이터가 없습니다.");
+			return null;
+		}
+
+		for (GagaMap data : dataList) {
+			log.info("Alarm type: {} - readCnt: {}", data.getString("alarmType"), data.getInt("readCnt"));
+			if (data.getInt("readCnt") == 0) {
+				monitoringService.createSystemAlarmSms(data.getString("alarmType"));
+			}
+		}
+
+		return null;
+	}
+
+	@Override
+	public Collection<GagaMap> write(Collection<GagaMap> dataList) throws Exception {
+		return dataList;
+	}
+
+	@Override
+	public void notify(Collection<GagaMap> dataList) throws Exception {
+		// Do nothing
+	}
+
+}

+ 55 - 0
src/main/java/com/style24/batch/biz/job/statistics/TsbInflowStatisticsJob.java

@@ -0,0 +1,55 @@
+package com.style24.batch.biz.job.statistics;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbStatisticsService;
+import com.style24.persistence.domain.Goods;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 사이트 제휴코드 유입집계
+ *
+ * @author eskim
+ * @since 2020. 12. 03
+ */
+@Component
+@Slf4j
+public class TsbInflowStatisticsJob extends TsbAbstractJob<Goods, Goods, Goods> {
+
+	@Autowired
+	private TsbStatisticsService statisticsService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+	private int totalCnt = 0;
+
+	@Override
+	public Goods read() throws Exception {
+
+		Goods goods = new Goods();
+		return goods;
+	}
+
+	@Override
+	public Goods process(Goods goods) throws Exception {
+		return goods;
+	}
+
+	@Override
+	public Goods write(Goods goods) throws Exception {
+
+		int result = statisticsService.createInflowDaily("today");
+		totalCnt = result;
+		succCnt = result;
+
+		return goods;
+	}
+
+	@Override
+	public void notify(Goods goods) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+}

+ 56 - 0
src/main/java/com/style24/batch/biz/job/statistics/TsbInflowYesterdayStatisticsJob.java

@@ -0,0 +1,56 @@
+package com.style24.batch.biz.job.statistics;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbStatisticsService;
+import com.style24.persistence.domain.Goods;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 사이트 제휴코드 전날 유입집계 (일배치)
+ *
+ * @author card007
+ * @since 2020. 08. 26
+ */
+@Component
+@Slf4j
+public class TsbInflowYesterdayStatisticsJob extends TsbAbstractJob<Goods, Goods, Goods> {
+
+	@Autowired
+	private TsbStatisticsService statisticsService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+	private int totalCnt = 0;
+
+	@Override
+	public Goods read() throws Exception {
+
+		Goods goods = new Goods();
+		return goods;
+	}
+
+	@Override
+	public Goods process(Goods goods) throws Exception {
+		return goods;
+	}
+
+	@Override
+	public Goods write(Goods goods) throws Exception {
+
+		int result = statisticsService.createInflowDaily("yesterday");
+		totalCnt = result;
+		succCnt = result;
+
+		return goods;
+	}
+
+	@Override
+	public void notify(Goods goods) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 66 - 0
src/main/java/com/style24/batch/biz/service/TsbBatchService.java

@@ -0,0 +1,66 @@
+package com.style24.batch.biz.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.batch.biz.dao.TsbBatchDao;
+import com.style24.batch.support.env.TsbConstants;
+import com.style24.persistence.domain.BatchLog;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 배치 Service
+ *
+ * @author gagamel
+ * @since 2020. 12. 2
+ */
+@Service
+@Slf4j
+public class TsbBatchService {
+
+	@Autowired
+	private TsbBatchDao batchDao;
+
+	/**
+	 * 배치ID로 배치명 조회
+	 * @param batchId - 배치ID
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 2
+	 */
+	public String getBatchName(String batchId) {
+		return batchDao.getBatchName(batchId);
+	}
+
+	/**
+	 * 배치로그 생성
+	 * @param batchId - 배치ID
+	 * @return 배치로그일련번호
+	 * @author gagamel
+	 * @since 2020. 12. 2
+	 */
+	@Transactional("shopTxnManager")
+	public Integer createBatchLog(String batchId) {
+
+		BatchLog batchLog = new BatchLog();
+		batchLog.setBatchId(batchId);
+		batchLog.setRegNo(TsbConstants.REG_NO);
+		batchDao.createBatchLog(batchLog);
+
+		return batchLog.getBatchLogSq();
+	}
+
+	/**
+	 * 배치로그 종료 처리
+	 * @param batchLogSq - 배치로그일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 2
+	 */
+	public void updateBatchLog(Integer batchLogSq) {
+		batchDao.updateBatchLog(batchLogSq);
+	}
+
+}

+ 57 - 0
src/main/java/com/style24/batch/biz/service/TsbCommonService.java

@@ -0,0 +1,57 @@
+package com.style24.batch.biz.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.batch.biz.dao.TsbCommonDao;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 공통 Service
+ *
+ * @author eskim
+ * @since 2021. 01. 04
+ */
+@Service
+@Slf4j
+public class TsbCommonService {
+
+	@Autowired
+	private TsbCommonDao commonDao;
+//
+//	/**
+//	 * 시퀀스 조회
+//	 *
+//	 * @param sequenceName - 시퀀스명
+//	 * @return String
+//	 * @author gagamel
+//	 * @since 2019. 8. 25
+//	 */
+//	public String getNextSequence(String sequenceName) {
+//		return commonDao.getNextSequence(sequenceName);
+//	}
+
+	/**
+	 * WMS Sync 옵션
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 04
+	 */
+	public String getWmsSyncYn() {
+		return commonDao.getWmsSyncYn();
+	}
+
+//	/**
+//	 * 공통코드 목록
+//	 *
+//	 * @param TsbCommonCode - 공통코드
+//	 * @return Collection<TsbCommonCode> - 공통코드
+//	 * @author card007
+//	 * @since 2020. 07. 07
+//	 */
+//	public Collection<TsbCommonCode> getCommonCodeList(TsbCommonCode commonCode) {
+//		return commonDao.getCommonCodeList(commonCode);
+//	}
+}

+ 71 - 0
src/main/java/com/style24/batch/biz/service/TsbDeliveryService.java

@@ -0,0 +1,71 @@
+package com.style24.batch.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.batch.biz.dao.TsbDeliveryDao;
+import com.style24.batch.support.env.TsbConstants;
+import com.style24.persistence.domain.Delivery;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 배치 Service
+ *
+ * @author moon
+ * @since 2020. 12. 08
+ */
+@Service
+@Slf4j
+public class TsbDeliveryService {
+
+	@Autowired
+	private TsbDeliveryDao deliveryDao;
+
+	/**
+	 * 총알배송 권역정보 갱신 
+	 * @param  Collection<Delivery>
+	 * @return 
+	 * @author moon
+	 * @since  2020. 12. 08
+	 */
+	public void mergeDailyDeliveryZone(Collection<Delivery> dailyDeliZoneList) {
+        
+		for(Delivery delivery : dailyDeliZoneList) {
+			deliveryDao.mergeDailyDeliveryZone(delivery);
+		}
+	}
+
+	/**
+	 * 배치로그 생성
+	 * @param batchId - 배치ID
+	 * @return 배치로그일련번호
+	 * @author gagamel
+	 * @since 2020. 12. 2
+	 */
+//	@Transactional("shopTxnManager")
+//	public Integer createBatchLog(String batchId) {
+//
+//		BatchLog batchLog = new BatchLog();
+//		batchLog.setBatchId(batchId);
+//		batchLog.setRegNo(TsbConstants.REG_NO);
+//		batchDao.createBatchLog(batchLog);
+//
+//		return batchLog.getBatchLogSq();
+//	}
+
+	/**
+	 * 배치로그 종료 처리
+	 * @param batchLogSq - 배치로그일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 2
+	 */
+//	public void updateBatchLog(Integer batchLogSq) {
+//		batchDao.updateBatchLog(batchLogSq);
+//	}
+
+}

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

@@ -0,0 +1,639 @@
+package com.style24.batch.biz.service;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.batch.biz.dao.TsbGoodsDao;
+import com.style24.batch.support.env.TsbConstants;
+import com.style24.core.biz.service.TscEnvsetService;
+import com.style24.core.biz.thirdparty.SafetyKoreaApi;
+import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsIfIncomelot;
+import com.style24.persistence.domain.GoodsIfIncomelotitem;
+import com.style24.persistence.domain.GoodsIfMeasurement;
+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 io.netty.util.internal.StringUtil;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.util.GagaDateUtil;
+
+/**
+ * 상품 Service
+ *
+ * @author eskim
+ * @since 2020. 11. 27
+ */
+@Service
+@Slf4j
+public class TsbGoodsService {
+
+	@Autowired
+	private TsbGoodsDao goodsDao;
+
+	@Autowired
+	private TscEnvsetService envsetService;
+
+	@Autowired
+	private SafetyKoreaApi safetyKoreaApi;
+
+	@Autowired
+	private TsbWmsGoodsService wmsGoodsService;
+
+	/**
+	 * 상품 타이틀예약 작업
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 27
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsTnmRsvt() {
+		Goods goods = new Goods();
+
+		// 1.예약기간 만료 상품 타이틀 작업
+		// 1.1 이력쌓기
+		goods.setProcJob("GTE"); // 상품타이틀예약 만료건 변경
+		goods.setRegNo(TsbConstants.REG_NO);
+		goods.setUpdNo(TsbConstants.REG_NO);
+		goodsDao.createGoodsHst(goods);
+		// 1.2 삼품타이틀 초기화
+		goodsDao.updateGoodTnmInit();
+
+		// 2.상품예약 종료처리
+		goodsDao.updateGoodsTnmRes();
+
+		// 3.예약도래 상품 타이틀 작업
+		// 3.1 이력쌓기
+		goods.setProcJob("GTS"); // 상품타이틀예약 예약 변경
+		goodsDao.createGoodsHst(goods);
+		// 3.2 상품타이틀 변경
+		goodsDao.updateGoodsTnm();
+	}
+
+	/**
+	 * 상품 가격예약 작업
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 27
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsPriceRsvt() {
+		Goods goods = new Goods();
+
+		// 1.예약기간 만료 상품 가격 작업
+		// 1.1 이력쌓기
+		goods.setProcJob("GPE"); // 상품 가격예약 만료건 변경
+		goods.setRegNo(TsbConstants.REG_NO);
+		goods.setUpdNo(TsbConstants.REG_NO);
+		goodsDao.createGoodsHst(goods);
+		// 1.2 삼품 가격 원복
+		goodsDao.updateGoodPriceInit();
+
+		// 2.상품예약 종료처리
+		goodsDao.updateGoodsPriceRes();
+
+		// 3.예약도래 상품 가격 작업
+		// 3.1 이력쌓기
+		goods.setProcJob("GPS"); // 상품 예약 가격 적용
+		goodsDao.createGoodsHst(goods);
+		// 3.2 상품 가격 변경
+		goodsDao.updateGoodsPrice();
+	}
+
+	/**
+	 * 상품 검색어 작업
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 30
+	 */
+	@Transactional("shopTxnManager")
+	public void updateGoodsSnm() {
+
+		// 사용자 검색어 없는 상품 일괄 작업
+		goodsDao.updateGoodsSnmByGoodsSnm1Null();
+		// 사용자 검색어 있는 상품 작업
+		Collection<Goods> goodsList = goodsDao.getGoodsByGooodsSnm1List();
+		if (goodsList != null && !goodsList.isEmpty()) {
+			for (Goods goods : goodsList) {
+
+				// 사용자 검색어를 검색어에 적용
+				String goodsSnm = goods.getGoodsSnm();
+				String[] arrGoodsSnm = goods.getGoodsSnm1().split(";");
+				StringBuilder tempGoodsSnm = new StringBuilder();
+				for (String loopGoodsSnm : arrGoodsSnm) {
+					if (goodsSnm.toUpperCase().indexOf(loopGoodsSnm.toUpperCase()) <= -1) {
+						tempGoodsSnm.append(loopGoodsSnm).append(";");
+					}
+				}
+				goods.setGoodsSnm(tempGoodsSnm.toString() + goodsSnm);
+				goodsDao.updateGoodsSnm(goods);
+			}
+		}
+	}
+
+	/**
+	 * 상품 즉시할인가 생성
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @throws IOException
+	 * @since 2020. 12. 02
+	 */
+	@Transactional("shopTxnManager")
+	public void createGoodsBenefitPrice() throws IOException {
+
+		// TB_GOODS_BENEFIT_PRICE_TEMP 삭제
+		goodsDao.deleteGoodsBenefitPriceTemp();
+
+		Coupon coupon = new Coupon();
+		int floorUnit = 100; //envsetService.getPointUnit(TsbConstants.SiteCd.STYLE24.value());  // 나중에 수정해주세용!!!!!!!!!!!!!!!!!!!!
+		coupon.setPointUnit(floorUnit);
+		/*
+		 * 쿠폰적용순선 전체->일반->임직원
+		 *
+		 * 테이블(TB_GOODS_BENEFIT_PRICE)은 전체기준으로만 생성
+		 */
+		coupon.setUsableCustGb("G100_00"); // 전체
+		// TB_GOODS_BENEFIT_PRICE_TEMP 생성 - 상품쿠폰 전체
+		goodsDao.crteateGoodsBenefitPriceTemp(coupon);
+
+		// TB_GOODS_BENEFIT_PRICE_TEMP 생성 - 상품쿠폰 일반
+		coupon.setUsableCustGb("G100_10"); // 일반
+		goodsDao.updateGoodsBenefitPriceTemp(coupon);
+
+		// TB_GOODS_BENEFIT_PRICE_TEMP 생성 - 상품쿠폰 임직원
+		coupon.setUsableCustGb("G100_20"); // 임직원
+		goodsDao.updateGoodsBenefitPriceTemp(coupon);
+
+		// TB_GOODS_BENEFIT_PRICE 삭제
+		goodsDao.deleteGoodsBenefitPrice();
+
+		// TB_GOODS_BENEFIT_PRICE_TEMP => TB_GOODS_BENEFIT_PRICE
+		goodsDao.createGoodsBenefitPrice();
+
+	}
+
+	/**
+	 * 연관상품보기 스코어링 작업
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 04
+	 */
+	@Transactional("shopTxnManager")
+	public void createGoodsRelateScore(String workDt, String work7agoDt) {
+
+		// 작업일 데이터 삭제
+		goodsDao.deleteGoodsRelate(workDt);
+		// 작업일 데이터 생성
+		goodsDao.createGoodsRelate(workDt);
+		// 7일전 데이터 삭제
+		goodsDao.deleteGoodsRelate(work7agoDt);
+
+	}
+
+	/**
+	 * 전시상품 통계정보작업
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 04
+	 */
+	@Transactional("shopTxnManager")
+	public void createGoodsSummary() {
+
+		GoodsSummary goodsSummary = new GoodsSummary();
+
+		goodsDao.deleteGoodsSummaryTemp();
+
+		// 상품 판매수량-총판매수량
+		goodsSummary.setColNm1("SELL_TOT_QTY");
+		goodsSummary.setFromDay("");
+		goodsDao.createGoodsSummaryBySale(goodsSummary);
+		// 상품 판매수량-주간판매수량
+		goodsSummary.setColNm1("SELL_WEEK_QTY");
+		goodsSummary.setFromDay("7");
+		goodsDao.createGoodsSummaryBySale(goodsSummary);
+		// 상품 판매수량-월간판매수량
+		goodsSummary.setColNm1("SELL_MONTH_QTY");
+		goodsSummary.setFromDay("30");
+		goodsDao.createGoodsSummaryBySale(goodsSummary);
+		// 상품 판매수량-전일판매수량
+		goodsSummary.setColNm1("SELL_YDAY_QTY");
+		goodsSummary.setFromDay("1");
+		goodsDao.createGoodsSummaryBySale(goodsSummary);
+		// 상품 판매수량-15일간판매수량
+		goodsSummary.setColNm1("SELL_DAY15_QTY");
+		goodsSummary.setFromDay("15");
+		goodsDao.createGoodsSummaryBySale(goodsSummary);
+		// 상품 조회수-금주조회건수
+		goodsSummary.setColNm1("READ_NWEEK_CNT");
+		goodsSummary.setFromDay("1");
+		goodsDao.createGoodsSummaryByView(goodsSummary);
+		// 상품 조회수-금주조회건수
+		goodsSummary.setColNm1("READ_PWEEK_CNT");
+		goodsSummary.setFromDay("8");
+		goodsDao.createGoodsSummaryByView(goodsSummary);
+		// 상품평-상품평등록건수
+		goodsSummary.setColNm1("REVIEW_REG_CNT");
+		goodsSummary.setFromDay("");
+		goodsSummary.setPhotoYn("");
+		goodsDao.createGoodsSummaryByReviewCount(goodsSummary);
+		// 상품평-텍스트상품평등록건수
+		goodsSummary.setColNm1("RREVIEW_REG_CNT");
+		goodsSummary.setFromDay("");
+		goodsSummary.setPhotoYn("N");
+		goodsDao.createGoodsSummaryByReviewCount(goodsSummary);
+		// 상품평-포토상품평등록건수
+		goodsSummary.setColNm1("PREVIEW_REG_CNT");
+		goodsSummary.setFromDay("");
+		goodsSummary.setPhotoYn("Y");
+		goodsDao.createGoodsSummaryByReviewCount(goodsSummary);
+		// 상품평-만족도점수
+		goodsSummary.setColNm1("SCORE");
+		goodsSummary.setReviewColNm("SCORE");
+		goodsSummary.setPhotoYn("");
+		goodsDao.createGoodsSummaryByReviewSum(goodsSummary);
+		// 상품평-사이즈점수
+		goodsSummary.setColNm1("SCORE_SIZE1");
+		goodsSummary.setColNm2("SCORE_SIZE2");
+		goodsSummary.setColNm3("SCORE_SIZE3");
+		goodsSummary.setReviewColNm("SCORE_SIZE");
+		goodsSummary.setPhotoYn("");
+		goodsDao.createGoodsSummaryByReviewScore(goodsSummary);
+		// 상품평-색상점수
+		goodsSummary.setColNm1("SCORE_COLOR1");
+		goodsSummary.setColNm2("SCORE_COLOR2");
+		goodsSummary.setColNm3("SCORE_COLOR3");
+		goodsSummary.setReviewColNm("SCORE_COLOR");
+		goodsSummary.setPhotoYn("");
+		goodsDao.createGoodsSummaryByReviewScore(goodsSummary);
+		// 상품평-핏점수
+		goodsSummary.setColNm1("SCORE_FIT1");
+		goodsSummary.setColNm2("SCORE_FIT2");
+		goodsSummary.setColNm3("SCORE_FIT3");
+		goodsSummary.setReviewColNm("SCORE_FIT");
+		goodsSummary.setPhotoYn("");
+		goodsDao.createGoodsSummaryByReviewScore(goodsSummary);
+		// 상품평-두께점수
+		goodsSummary.setColNm1("SCORE_THICK1");
+		goodsSummary.setColNm2("SCORE_THICK2");
+		goodsSummary.setColNm3("SCORE_THICK3");
+		goodsSummary.setReviewColNm("SCORE_THICK");
+		goodsSummary.setPhotoYn("");
+		goodsDao.createGoodsSummaryByReviewScore(goodsSummary);
+		// 상품평-무게점수
+		goodsSummary.setColNm1("SCORE_WEIGHT1");
+		goodsSummary.setColNm2("SCORE_WEIGHT2");
+		goodsSummary.setColNm3("SCORE_WEIGHT3");
+		goodsSummary.setReviewColNm("SCORE_WEIGHT");
+		goodsSummary.setPhotoYn("");
+		goodsDao.createGoodsSummaryByReviewScore(goodsSummary);
+		// 상품평-볼넓이점수
+		goodsSummary.setColNm1("SCORE_BALL1");
+		goodsSummary.setColNm2("SCORE_BALL2");
+		goodsSummary.setColNm3("SCORE_BALL3");
+		goodsSummary.setReviewColNm("SCORE_BALL");
+		goodsSummary.setPhotoYn("");
+		goodsDao.createGoodsSummaryByReviewScore(goodsSummary);
+		// 상품평-상품문의
+		goodsDao.createGoodsSummaryByCounsel(goodsSummary);
+
+		// 전시상품 통계 저장
+		goodsDao.saveGoodsSummary();
+
+	}
+
+	/**
+	 * 영유아상품 인증번호 수신
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 04
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsSafeNo() {
+
+		// 1. 대상 상품 조회
+		Collection<GoodsSafeNo> goodsSafeNoList = goodsDao.getGoodsSafeNoList();
+		// 2. 인증테이블 적용
+		for (GoodsSafeNo goodsSafeNo : goodsSafeNoList) {
+			try {
+				GagaMap result = safetyKoreaApi.getKoreaCertifyNo(goodsSafeNo.getGoodsNum()); // 품번으로 처리
+				if (result != null || !StringUtil.isNullOrEmpty(result.get("certNum").toString())) {
+					goodsSafeNo.setCertDt(result.get("certDt").toString());
+					goodsSafeNo.setCertNum(result.get("certNum").toString());
+					goodsSafeNo.setCertDiv(result.get("certDiv").toString());
+					goodsSafeNo.setCertState(result.get("certState").toString());
+					goodsSafeNo.setRegNo(TsbConstants.REG_NO);
+					goodsSafeNo.setUpdNo(TsbConstants.REG_NO);
+					goodsDao.saveGoodsSafeNo(goodsSafeNo);
+				}
+			} catch (Exception e) {
+				// do nothing
+			}
+		}
+	}
+
+	/**
+	 * WMS 실측사이즈 연용
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsWmsMeasurement(String jobdate) {
+
+		// wms 대상건 조회 (등록, 수정건 조회)
+		Collection<GoodsIfMeasurement> goodsMeasurementList = wmsGoodsService.getWmsMeasurementList(jobdate);
+
+		for (GoodsIfMeasurement goodsMeasurement : goodsMeasurementList) {
+			goodsDao.saveGoodsIfMeasurement(goodsMeasurement);
+		}
+	}
+
+	/**
+	 * WMS 입고정보 연동
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsWmsIncomelot(String jobdate) {
+
+		// wms 입고목록 조회 (등록, 수정건 조회)
+		Collection<GoodsIfIncomelot> goodsIfIncomelotList = wmsGoodsService.getWmsIncomelotList(jobdate);
+
+		for (GoodsIfIncomelot goodsIfIncomelot : goodsIfIncomelotList) {
+			goodsDao.saveGoodsIfIncomelot(goodsIfIncomelot);
+		}
+
+		// wms 입고상품목록 조회 (등록, 수정건 조회)
+		Collection<GoodsIfIncomelotitem> goodsIfIncomelotitemList = wmsGoodsService.getWmsIncomelotitemList(jobdate);
+
+		for (GoodsIfIncomelotitem goodsIfIncomelotitem : goodsIfIncomelotitemList) {
+			goodsDao.saveGoodsIfIncomelotitem(goodsIfIncomelotitem);
+		}
+	}
+
+	/**
+	 * 온라인 입고 상품 처리
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	@Transactional("shopTxnManager")
+	public void saveWmsGoods(String jobdate) {
+		GoodsIfIncomelot goodsIfIncomelot = new GoodsIfIncomelot();
+		goodsIfIncomelot.setRegNo(TsbConstants.REG_NO);
+		goodsIfIncomelot.setUpdNo(TsbConstants.REG_NO);
+		goodsIfIncomelot.setJobdate(jobdate);
+		goodsDao.saveWmsGoods(goodsIfIncomelot);
+
+	}
+
+	/**
+	 * 업체정보 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	public Collection<IfProvider> getSupplyCompanyList() {
+		return goodsDao.getSupplyCompanyList();
+	}
+
+	/**
+	 * 브랜드정보 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	public Collection<IfBrand> getBrandList() {
+		return goodsDao.getBrandList();
+	}
+
+
+	/**
+	 * 상품 정보 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	public Collection<IfProduct> getGoodsList() {
+		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();
+//		String byrow = "N";
+//		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 임시 테이블에서 실테이블로 이관
+	 *
+	 * @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 적용
+			goodsDao.deleteGoodsOptionSync();
+			goodsDao.createGoodsOptionSync();
+
+			// TB_OPTION_SYNC_TEMP => TB_OPTION_SYNC 변경적용
+			goodsDao.saveGoodsOptionSyncSync();
+
+			// TB_OPTION_SYNC => TB_OPTION 적용
+			goodsDao.saveGoodsOptionNew();
+
+			// 자사상품중 주문상세상태가 입금대기, 결제완료, 교환대기 건은 TB_SELL_QTY 생성
+			createSellQtySelfGoods();
+
+	}
+
+	/**
+	 * 입점상품 SELL_QTY 만큼 재고 차감
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	private void updateOptionByOfSellQty() {
+		Collection<Option> goodsSelfNoStockList = goodsDao.getGoodsSelfNoStockList();
+		if (goodsSelfNoStockList != null && !goodsSelfNoStockList.isEmpty()) {
+
+			for (Option option : goodsSelfNoStockList) {
+
+				option.setRegNo(TsbConstants.REG_NO);
+				option.setUpdNo(TsbConstants.REG_NO);
+				// 이력생성
+				goodsDao.createStockHst(option);
+
+				// 재고 변경
+				goodsDao.updateStock(option);
+			}
+		}
+	}
+
+	/**
+	 * 자사상품, TB_SELL_QTY 생성
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	private void createSellQtySelfGoods() {
+
+		// TB_SELL_QTY_TEMP 삭제
+		goodsDao.deleteTtbSellQtyTemp();
+
+		// TB_SELL_QTY_TEMP 생성
+		goodsDao.createTtbSellQtyTemp();
+
+		// 초기화
+		goodsDao.deleteSellQty();
+
+		// TB_SELL_QTY_TEMP => TB_SELL_QTY 생성
+		goodsDao.createTtbSellQty();
+
+		// TB_ORDER_DETAIL => TB_SELL_QTY 생성
+		goodsDao.createTtbSellQtyByOrderDetail();
+
+	}
+	/**
+	 * 상품 전시재고 생성
+	 *
+	 * @author eskim
+	 * @since 2020. 01. 06
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsDispStock()  {
+		goodsDao.deleteGoodsDispStock();
+		goodsDao.createGoodsDispStock();
+	}
+
+	/**
+	 * TB_IF_PRODUCTSKU_TEMP 삭제
+	 *
+	 * @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);
+	}
+
+
+}

+ 96 - 0
src/main/java/com/style24/batch/biz/service/TsbMonitoringService.java

@@ -0,0 +1,96 @@
+package com.style24.batch.biz.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.batch.biz.dao.TsbMonitoringDao;
+import com.style24.batch.support.env.TsbConstants;
+import com.style24.core.support.env.TscConstants;
+import com.style24.persistence.domain.Alarm;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 모니터링 Service
+ * 
+ * @author gagamel
+ * @since 2020. 11. 13
+ */
+@Service
+@Slf4j
+public class TsbMonitoringService {
+
+	@Autowired
+	private TsbMonitoringDao monitoringDao;
+
+	/**
+	 * 시스템알람SMS 생성
+	 * @param alarmId - 알람ID
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 13
+	 */
+	@Transactional("shopTxnManager")
+	public void createSystemAlarmSms(String alarmId) {
+		Alarm params = new Alarm();
+		params.setAlarmId(alarmId);
+		params.setFuserid(String.valueOf(TsbConstants.REG_NO));
+		params.setFcallback(TscConstants.CALLCENTER_TEL_NO);
+		monitoringDao.createAlarmSms(params);
+	}
+
+	/**
+	 * 1일내 회원가입건수 조회
+	 * @param siteCd - 사이트코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 5. 18
+	 */
+	public int getJoinCountWithinOneDay(String siteCd) {
+		return monitoringDao.getJoinCountWithinOneDay(siteCd);
+	}
+
+	/**
+	 * 1시간내 로그인건수 조회
+	 * @param siteCd - 사이트코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 5. 18
+	 */
+	public int getLoginCountWithinOneHour(String siteCd) {
+		return monitoringDao.getLoginCountWithinOneHour(siteCd);
+	}
+
+	/**
+	 * 1시간내 유입건수 조회
+	 * @param siteCd - 사이트코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 5. 18
+	 */
+	public int getInthrowCountWithinOneHour(String siteCd) {
+		return monitoringDao.getInthrowCountWithinOneHour(siteCd);
+	}
+
+	/**
+	 * 2시간내 결제건수 조회
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 5. 18
+	 */
+	public int getPayCountWithinTwoHour() {
+		return monitoringDao.getPayCountWithinTwoHour();
+	}
+
+	/**
+	 * 1일내 외부몰주문수집건수 조회
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 5. 18
+	 */
+	public int getExtmallOrderCollectionCountWithinOneDay() {
+		return monitoringDao.getExtmallOrderCollectionCountWithinOneDay();
+	}
+
+}

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

@@ -0,0 +1,35 @@
+package com.style24.batch.biz.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.batch.biz.dao.TsbStatisticsDao;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 통계 Service
+ *
+ * @author eskim
+ * @since 2020. 12. 03
+ */
+@Service
+@Slf4j
+public class TsbStatisticsService {
+
+	@Autowired
+	private TsbStatisticsDao statisticsDao;
+
+	/**
+	 * 사이트 제휴코드 유입집계
+	 *
+	 * @author daehyoung
+	 * @since 2020. 08. 18
+	 */
+	@Transactional("shopTxnManager")
+	public int createInflowDaily(String inflowDt) {
+		// 사이트 제휴코드 유입집계 전일데이터 생성
+		return statisticsDao.createInflowDaily(inflowDt);
+	}
+}

+ 46 - 0
src/main/java/com/style24/batch/biz/service/TsbWmsDeliveryService.java

@@ -0,0 +1,46 @@
+package com.style24.batch.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.batch.biz.dao.TsbWmsDeliveryDao;
+import com.style24.batch.support.env.TsbConstants;
+import com.style24.persistence.domain.Delivery;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 배치 Service
+ *
+ * @author moon
+ * @since  2020. 12. 08
+ */
+@Service
+@Slf4j
+public class TsbWmsDeliveryService {
+
+	@Autowired
+	private TsbWmsDeliveryDao wmsDeliveryDao;
+
+
+	/**
+	 * WMS_IF 총알배송 권역정보 조회 
+	 * @param 
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since  2020. 12. 08
+	 */
+	//@Transactional("wmsTxnManager")
+	public Collection<Delivery> getWmsIfDailyDeliveryZoneList() {
+
+		Collection<Delivery> list = null;
+		
+		list = wmsDeliveryDao.getWmsIfDailyDeliveryZoneList();
+		
+		return list ;
+	}
+
+}

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

@@ -0,0 +1,158 @@
+package com.style24.batch.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.batch.biz.dao.TsbWmsGoodsDao;
+import com.style24.batch.support.env.TsbConstants;
+import com.style24.persistence.domain.GoodsIfIncomelot;
+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;
+
+/**
+ * WMS 상품 연동  Service
+ *
+ * @author eskim
+ * @since 2021. 01. 01
+ */
+@Service
+@Slf4j
+public class TsbWmsGoodsService {
+
+	@Autowired
+	private TsbWmsGoodsDao wmsGoodsDao;
+
+	@Autowired
+	private TsbGoodsService goodsService;
+
+	/**
+	 * WMS 실측사이즈 연용
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	public Collection<GoodsIfMeasurement> getWmsMeasurementList(String jobdate) {
+		return wmsGoodsDao.getWmsMeasurementList(jobdate);
+	}
+
+	/**
+	 * WMS 입고 목록
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	public Collection<GoodsIfIncomelot> getWmsIncomelotList(String jobdate) {
+		return wmsGoodsDao.getWmsIncomelotList(jobdate);
+	}
+
+	/**
+	 * WMS 입고 상품목록
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	public Collection<GoodsIfIncomelotitem> getWmsIncomelotitemList(String jobdate) {
+		return wmsGoodsDao.getWmsIncomelotitemList(jobdate);
+	}
+
+	/**
+	 * WMS 업체정보 송신
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 05
+	 */
+	@Transactional("wmsTxnManager")
+	public void saveWmsBrand(IfBrand ifBrand) {
+		//브랜드 정보 송신
+		wmsGoodsDao.saveWmsBrand(ifBrand);
+		//WMS 브랜드업체관계정보 송신
+		wmsGoodsDao.saveWmsBrandProviderXref(ifBrand);
+	}
+
+
+	/**
+	 * WMS 브랜드/업체정보 송신
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	@Transactional("wmsTxnManager")
+	public void saveWmsBrandProvider() {
+
+		//업체정보 송신(수정일 7일)
+		/*
+		 * 매핑 확인건
+		G065_10	자사-제조
+		G065_11	자사-사입
+		G065_12	자사-위탁
+		 */
+
+		Collection<IfProvider> ifProviderList = goodsService.getSupplyCompanyList();
+
+		for (IfProvider ifProvider : ifProviderList) {
+			ifProvider.setRegNo(TsbConstants.REG_NO);
+			ifProvider.setUpdNo(TsbConstants.REG_NO);
+			wmsGoodsDao.saveWmsProvider(ifProvider);
+		}
+
+		//브랜드, 브랜드/업체 관계정보 송신
+		Collection<IfBrand> ifBrandList = goodsService.getBrandList();
+
+		for (IfBrand ifBrand : ifBrandList) {
+			ifBrand.setRegNo(TsbConstants.REG_NO);
+			ifBrand.setUpdNo(TsbConstants.REG_NO);
+			//브랜드 정보 송신
+			wmsGoodsDao.saveWmsBrand(ifBrand);
+			//WMS 브랜드업체관계정보 송신
+			wmsGoodsDao.saveWmsBrandProviderXref(ifBrand);
+		}
+
+	}
+
+	/**
+	 * WMS 상품정보 송신
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	@Transactional("wmsTxnManager")
+	public void saveGoodsWmsProduct(String jobdate) {
+		//상품 정보 송신
+		Collection<IfProduct> ifGoodsList = goodsService.getGoodsList();
+
+		for (IfProduct ifProduct : ifGoodsList) {
+			ifProduct.setRegNo(TsbConstants.REG_NO);
+			ifProduct.setUpdNo(TsbConstants.REG_NO);
+			//상품 정보 송신
+			wmsGoodsDao.saveWmsProduct(ifProduct);
+
+		}
+	}
+
+	/**
+	 * WMS 재고 테이블 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	public Collection<IfProductSku> getWmsIfProductSukList() {
+		return wmsGoodsDao.getWmsIfProductSukList();
+	}
+
+}

+ 60 - 0
src/main/java/com/style24/batch/biz/task/TsbDeliveryTask.java

@@ -0,0 +1,60 @@
+package com.style24.batch.biz.task;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import com.style24.batch.biz.job.delivery.TsbDailyDeliveryZoneJob;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 배송 Task
+ * @author moon
+ * @since 2020. 12. 08
+ */
+@Component
+@Slf4j
+public class TsbDeliveryTask {
+
+	@Autowired
+	private TsbDailyDeliveryZoneJob dailyDeliveryZoneJob;
+
+
+
+
+	/**
+	 * 초 분 시 일 월 주(년)
+	 * 0 0 12 * * ?"             : 아무 요일, 매월, 매일 12:00:00
+	 * 0 15 10 ? * *"            : 모든 요일, 매월, 아무 날이나 10:15:00
+	 * 0 15 10 * * ?"            : 아무 요일, 매월, 매일 10:15:00
+	 * 0 15 10 * * ? *"          : 모든 연도, 아무 요일, 매월, 매일 10:15
+	 * 0 15 10 * * ?             : 2005" 2005년 아무 요일이나 매월, 매일 10:15
+	 * 0 * 14 * * ?"             : 아무 요일, 매월, 매일, 14시 매분 0초
+	 * 0 0/5 14 * * ?"           : 아무 요일, 매월, 매일, 14시 매 5분마다 0초
+	 * 0 0/5 14,18 * * ?"        : 아무 요일, 매월, 매일, 14시, 18시 매 5분마다 0초
+	 * 0 0-5 14 * * ?"           : 아무 요일, 매월, 매일, 14:00 부터 매 14:05까지 매 분 0초
+	 * 0 10,44 14 ? 3 WED"       : 3월의 매 주 수요일, 아무 날짜나 14:10:00, 14:44:00
+	 * 0 15 10 ? * MON-FRI"      : 월~금, 매월, 아무 날이나 10:15:00
+	 * 0 15 10 15 * ?"           : 아무 요일, 매월 15일 10:15:00
+	 * 0 15 10 L * ?"            : 아무 요일, 매월 마지막 날 10:15:00
+	 * 0 15 10 ? * 6L"           : 매월 마지막 금요일 아무 날이나 10:15:00
+	 * 0 15 10 ? * 6L 2002-2005" : 2002년부터 2005년까지 매월 마지막 금요일 아무 날이나 10:15:00
+	 * 0 15 10 ? * 6#3"          : 매월 3번째 금요일 아무 날이나 10:15:00
+	 *
+	 * @throws Exception
+	 */
+
+	/**
+	 * 총알배송 권역정보   : 일배치  오전 11시
+	 *
+	 * @throws Exception
+	 */
+	//@Scheduled(cron = "${cron.delivery.tsbDailyDeliveryZoneJob}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbDailyDeliveryZoneJob() throws Exception {
+		dailyDeliveryZoneJob.run("cron.delivery.daily.deliveryZone");
+	}
+
+}

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

@@ -0,0 +1,238 @@
+package com.style24.batch.biz.task;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import com.style24.batch.biz.job.goods.TsbGoodsBenefitPriceJob;
+import com.style24.batch.biz.job.goods.TsbGoodsInfantsSafeNoJob;
+import com.style24.batch.biz.job.goods.TsbGoodsPriceJob;
+import com.style24.batch.biz.job.goods.TsbGoodsRelateScoreJob;
+import com.style24.batch.biz.job.goods.TsbGoodsSnmJob;
+import com.style24.batch.biz.job.goods.TsbGoodsSummaryJob;
+import com.style24.batch.biz.job.goods.TsbGoodsTnmJob;
+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;
+
+/**
+ * 상품 Task
+ * @author eskim
+ * @since 2020. 11. 27
+ */
+@Component
+@Slf4j
+public class TsbGoodsTask {
+
+	@Autowired
+	private TsbGoodsTnmJob goodsTnmJob;
+
+	@Autowired
+	private TsbGoodsPriceJob goodsPriceJob;
+
+	@Autowired
+	private TsbGoodsSnmJob goodsSnmJob;
+
+	@Autowired
+	private TsbGoodsBenefitPriceJob goodsBenefitPriceJob;
+
+	@Autowired
+	private TsbGoodsRelateScoreJob goodsRelateScoreJob;
+
+	@Autowired
+	private TsbGoodsSummaryJob goodsSummaryJob;
+
+	@Autowired
+	private TsbGoodsInfantsSafeNoJob goodsInfantsSafeNoJob;
+
+	@Autowired
+	private TsbGoodsWmsMeasurementJob goodsWmsMeasurementJob;
+
+	@Autowired
+	private TsbGoodsWmsIncomelotJob goodsWmsIncomelotJob;
+
+	@Autowired
+	private TsbGoodsWmsBrandproviderJob goodsWmsBrandproviderJob;
+
+	@Autowired
+	private TsbGoodsWmsProductJob goodsWmsProductJob;
+
+	@Autowired
+	private TsbGoodsWmsProductStockJob goodsWmsProductStockJob;
+
+
+
+	/**
+	 * 초 분 시 일 월 주(년)
+	 * 0 0 12 * * ?" : 아무 요일, 매월, 매일 12:00:00
+	 * 0 15 10 ? * *" : 모든 요일, 매월, 아무 날이나 10:15:00
+	 * 0 15 10 * * ?" : 아무 요일, 매월, 매일 10:15:00
+	 * 0 15 10 * * ? *" : 모든 연도, 아무 요일, 매월, 매일 10:15
+	 * 0 15 10 * * ? : 2005" 2005년 아무 요일이나 매월, 매일 10:15
+	 * 0 * 14 * * ?" : 아무 요일, 매월, 매일, 14시 매분 0초
+	 * 0 0/5 14 * * ?" : 아무 요일, 매월, 매일, 14시 매 5분마다 0초
+	 * 0 0/5 14,18 * * ?" : 아무 요일, 매월, 매일, 14시, 18시 매 5분마다 0초
+	 * 0 0-5 14 * * ?" : 아무 요일, 매월, 매일, 14:00 부터 매 14:05까지 매 분 0초
+	 * 0 10,44 14 ? 3 WED" : 3월의 매 주 수요일, 아무 날짜나 14:10:00, 14:44:00
+	 * 0 15 10 ? * MON-FRI" : 월~금, 매월, 아무 날이나 10:15:00
+	 * 0 15 10 15 * ?" : 아무 요일, 매월 15일 10:15:00
+	 * 0 15 10 L * ?" : 아무 요일, 매월 마지막 날 10:15:00
+	 * 0 15 10 ? * 6L" : 매월 마지막 금요일 아무 날이나 10:15:00
+	 * 0 15 10 ? * 6L 2002-2005" : 2002년부터 2005년까지 매월 마지막 금요일 아무 날이나 10:15:00
+	 * 0 15 10 ? * 6#3" : 매월 3번째 금요일 아무 날이나 10:15:00
+	 *
+	 * @throws Exception
+	 */
+
+	/**
+	 * 상품 타이틀예약 적용 주기 : 시간배치 - 매시 1분 (소셜과 시간 중복)
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.titlename.reserve}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsTnmJob() throws Exception {
+		goodsTnmJob.runById("cron.goods.titlename.reserve");
+	}
+
+	/**
+	 * 상품 가격예약 적용 주기 : 시간배치 - 매시 1분 (소셜과 시간 중복)
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.price.reserve}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsPriceJob() throws Exception {
+		goodsPriceJob.runById("cron.goods.price.reserve");
+	}
+
+	/**
+	 * 상품 검색어 적용 주기 : 시간배치 - 매시 5분
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.search.keyword}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsSnmJob() throws Exception {
+		goodsSnmJob.runById("cron.goods.search.keyword");
+	}
+
+	/**
+	 * 상품 즉시할인가 생성 : 시간배치 - 매시 2분
+	 *
+	 * @throws Exception
+	 * @author eskim
+	 * @since 2020. 12. 02.
+	 */
+	@Scheduled(cron = "${cron.goods.benefit.price}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsBenefitPriceJob() throws Exception {
+		goodsBenefitPriceJob.runById("cron.goods.benefit.price");
+	}
+
+	/**
+	 * 연관상품보기 스코어링 주기 : 일배치 - 매일 2시
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.relate.score}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsRelateScoreJob() throws Exception {
+		goodsRelateScoreJob.runById("cron.goods.relate.score");
+	}
+
+	/**
+	 * 전시상품 통계정보 주기 : 일배치 - 매일 1시 5분
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.summary}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsSummaryJob() throws Exception {
+		goodsSummaryJob.run("cron.goods.summary");
+	}
+
+	/**
+	 * 영유아상품 인증번호 수신 : 일배치 - 매일 3시 5분
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.infants.safe}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsInfantsSafeNoJob() throws Exception {
+		goodsInfantsSafeNoJob.run("cron.goods.infants.safe");
+	}
+
+	/**
+	 * WMS 실측사이즈 연동 적용 주기 : 일배치 - 03시
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.wms.measurement}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsWmsMeasurementJob() throws Exception {
+		goodsWmsMeasurementJob.runById("cron.goods.wms.measurement");
+	}
+
+	/**
+	 * WMS 입고상품 연동 적용 주기 : 일배치 - 03시 10분
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.wms.incomelot}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsWmsIncomelotJob() throws Exception {
+		goodsWmsIncomelotJob.runById("cron.goods.wms.incomelot");
+	}
+
+	/**
+	 * WMS 업체/브랜드 송신 적용 주기 : 일배치 - 03시 12분
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.wms.brandprovider}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsWmsBrandproviderJob() throws Exception {
+		goodsWmsBrandproviderJob.runById("cron.goods.wms.brandprovider");
+	}
+
+	/**
+	 * WMS 상품정보 송신 적용 주기 : 일배치 - 03시 15분
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.wms.product}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsWmsProductJob() throws Exception {
+		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");
+	}
+
+}

+ 30 - 0
src/main/java/com/style24/batch/biz/task/TsbHealthCheckTask.java

@@ -0,0 +1,30 @@
+package com.style24.batch.biz.task;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * HealthCheck Task
+ * @author gagamel
+ * @since 2020. 11. 16
+ */
+@Component
+@Slf4j
+public class TsbHealthCheckTask {
+
+	/**
+	 * fixedDelay = 5000: 이전 수행이 종료되고, 5초 이후 해당 job을 수행함
+	 */
+	@Scheduled(fixedDelay = 5000)
+	@Async
+	public void printCurrentTime() throws Exception {
+		log.info("/// Current time is {}.", (new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")).format(new Date()));
+	}
+
+}

+ 48 - 0
src/main/java/com/style24/batch/biz/task/TsbMonitoringTask.java

@@ -0,0 +1,48 @@
+package com.style24.batch.biz.task;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import com.style24.batch.biz.job.monitoring.TsbHourMonitoringJob;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 모니터링 Task
+ * @author gagamel
+ * @since 2020. 11. 16
+ */
+@Component
+@Slf4j
+public class TsbMonitoringTask {
+
+	@Autowired
+	private TsbHourMonitoringJob hourMonitoringJob;
+
+	/**
+	 * 시간 모니터링
+	 * @throws
+	 * @author gagamel
+	 * @since 2020. 11. 16
+	 */
+	@Scheduled(cron = "${cron.monitoring.hourJob}")
+	@Async
+	public void runHourMonitoring() throws Exception {
+		hourMonitoringJob.run("시간 모니터링 Job");
+	}
+
+//	/**
+//	 * 일 모니터링
+//	 * @throws
+//	 * @author gagamel
+//	 * @since 2020. 5. 18
+//	 */
+//	@Scheduled(cron = "${cron.monitoring.dayJob}")
+//	@Async
+//	public void runDayMonitoring() throws Exception {
+//		dayMonitoringJob.run("일 모니터링 Job");
+//	}
+
+}

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

@@ -0,0 +1,73 @@
+package com.style24.batch.biz.task;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import com.style24.batch.biz.job.statistics.TsbInflowStatisticsJob;
+import com.style24.batch.biz.job.statistics.TsbInflowYesterdayStatisticsJob;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 통계 Task
+ * @author eskim
+ * @since 2020. 12. 03
+ */
+@Component
+@Slf4j
+public class TsbStatisticsTask {
+
+	@Autowired
+	private TsbInflowYesterdayStatisticsJob inflowYesterdayStatisticsJob;
+
+	@Autowired
+	private TsbInflowStatisticsJob inflowStatisticsJob;
+
+	/**
+	 * 초 분 시 일 월 주(년)
+	 * 0 0 12 * * ?" : 아무 요일, 매월, 매일 12:00:00
+	 * 0 15 10 ? * *" : 모든 요일, 매월, 아무 날이나 10:15:00
+	 * 0 15 10 * * ?" : 아무 요일, 매월, 매일 10:15:00
+	 * 0 15 10 * * ? *" : 모든 연도, 아무 요일, 매월, 매일 10:15
+	 * 0 15 10 * * ? : 2005" 2005년 아무 요일이나 매월, 매일 10:15
+	 * 0 * 14 * * ?" : 아무 요일, 매월, 매일, 14시 매분 0초
+	 * 0 0/5 14 * * ?" : 아무 요일, 매월, 매일, 14시 매 5분마다 0초
+	 * 0 0/5 14,18 * * ?" : 아무 요일, 매월, 매일, 14시, 18시 매 5분마다 0초
+	 * 0 0-5 14 * * ?" : 아무 요일, 매월, 매일, 14:00 부터 매 14:05까지 매 분 0초
+	 * 0 10,44 14 ? 3 WED" : 3월의 매 주 수요일, 아무 날짜나 14:10:00, 14:44:00
+	 * 0 15 10 ? * MON-FRI" : 월~금, 매월, 아무 날이나 10:15:00
+	 * 0 15 10 15 * ?" : 아무 요일, 매월 15일 10:15:00
+	 * 0 15 10 L * ?" : 아무 요일, 매월 마지막 날 10:15:00
+	 * 0 15 10 ? * 6L" : 매월 마지막 금요일 아무 날이나 10:15:00
+	 * 0 15 10 ? * 6L 2002-2005" : 2002년부터 2005년까지 매월 마지막 금요일 아무 날이나 10:15:00
+	 * 0 15 10 ? * 6#3" : 매월 3번째 금요일 아무 날이나 10:15:00
+	 *
+	 * @throws Exception
+	 */
+
+	/**
+	 * 사이트 제휴코드 유입집계 생성
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.statistics.inflow}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbInflowStaticsJob() throws Exception {
+		inflowStatisticsJob.runById("cron.statistics.inflow");
+	}
+
+	/**
+	 * 사이트 제휴코드 전날 유입집계 생성
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.statistics.inflow.yesterday}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbInflowYesterdayStaticsJob() throws Exception {
+		inflowYesterdayStatisticsJob.runById("cron.statistics.inflow.yesterday");
+	}
+}

+ 48 - 0
src/main/java/com/style24/batch/support/config/TsbMybatisShopConfig.java

@@ -0,0 +1,48 @@
+package com.style24.batch.support.config;
+
+import javax.sql.DataSource;
+
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.core.support.env.TscConstants;
+
+/**
+ * shopDs용 Mybatis Configuration
+ * 
+ * @author gagamel
+ * @since 2020. 11. 16
+ */
+@Configuration
+@MapperScan(basePackages = TscConstants.BASE_PACKAGE, annotationClass = ShopDs.class, sqlSessionFactoryRef = "shopSqlSessionFactory")
+public class TsbMybatisShopConfig {
+
+	@Autowired
+	private ApplicationContext applicationContext;
+
+	@Bean(name = "shopSqlSessionFactory")
+	public SqlSessionFactory shopSqlSessionFactory(@Qualifier("shopDataSource") DataSource dataSource) throws Exception {
+		SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
+
+		sessionFactoryBean.setDataSource(dataSource);
+		sessionFactoryBean.setTypeAliasesPackage(TscConstants.DOMAIN_PACKAGE);
+		sessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:persistence/mybatis-shop-config.xml"));
+		sessionFactoryBean.setMapperLocations(applicationContext.getResources(TscConstants.MAPPER_LOCATION_PATH + "/shop/*.xml"));
+
+		return sessionFactoryBean.getObject();
+	}
+
+	@Bean(name = "shopSqlSessionTemplate")
+	public SqlSessionTemplate shopSqlSessionTemplate(@Qualifier("shopSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
+		return new SqlSessionTemplate(sqlSessionFactory);
+	}
+
+}

+ 48 - 0
src/main/java/com/style24/batch/support/config/TsbMybatisWmsConfig.java

@@ -0,0 +1,48 @@
+package com.style24.batch.support.config;
+
+import javax.sql.DataSource;
+
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.style24.core.support.annotation.WmsDs;
+import com.style24.core.support.env.TscConstants;
+
+/**
+ * wmsDs용 Mybatis Configuration
+ * 
+ * @author gagamel
+ * @since 2020. 11. 26
+ */
+@Configuration
+@MapperScan(basePackages = TscConstants.BASE_PACKAGE, annotationClass = WmsDs.class, sqlSessionFactoryRef = "wmsSqlSessionFactory")
+public class TsbMybatisWmsConfig {
+
+	@Autowired
+	private ApplicationContext applicationContext;
+
+	@Bean(name = "wmsSqlSessionFactory")
+	public SqlSessionFactory wmsSqlSessionFactory(@Qualifier("wmsDataSource") DataSource dataSource) throws Exception {
+		SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
+
+		sessionFactoryBean.setDataSource(dataSource);
+		sessionFactoryBean.setTypeAliasesPackage(TscConstants.DOMAIN_PACKAGE);
+		sessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:persistence/mybatis-wms-config.xml"));
+		sessionFactoryBean.setMapperLocations(applicationContext.getResources(TscConstants.MAPPER_LOCATION_PATH + "/wms/*.xml"));
+
+		return sessionFactoryBean.getObject();
+	}
+
+	@Bean(name = "wmsSqlSessionTemplate")
+	public SqlSessionTemplate wmsSqlSessionTemplate(@Qualifier("wmsSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
+		return new SqlSessionTemplate(sqlSessionFactory);
+	}
+
+}

+ 39 - 0
src/main/java/com/style24/batch/support/config/TsbWebMvcConfig.java

@@ -0,0 +1,39 @@
+package com.style24.batch.support.config;
+
+import java.nio.charset.Charset;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * Web MVC Configuration
+ * 
+ * @author gagamel
+ * @since 2020. 11. 16
+ */
+@Configuration
+public class TsbWebMvcConfig implements WebMvcConfigurer {
+
+	/**
+	 * API 호출을 위한 RestTemplate 설정
+	 * @return
+	 */
+	@Bean
+	public RestTemplate restTemplate() {
+		HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
+		factory.setConnectTimeout(300000);
+		factory.setReadTimeout(300000);
+
+		RestTemplate restTemplate = new RestTemplate(factory);
+
+		// Convert the message to UTF-8
+		restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
+
+		return restTemplate;
+	}
+
+}

+ 49 - 0
src/main/java/com/style24/batch/support/env/TsbConstants.java

@@ -0,0 +1,49 @@
+package com.style24.batch.support.env;
+
+/**
+ * 변경될 소지가 있는 변수 값을 정의
+ * 공통 모듈은 style24.core의 TscConstants에 정의하고 Batch 모듈에서만 사용하는 것을 정의
+ *
+ * @author gagamel
+ * @since 2020. 11. 13
+ */
+public class TsbConstants {
+
+	// 등록자번호
+	public static final Integer REG_NO = 0;
+
+	// 모니터링
+	public enum Monitoring {
+		JOIN_CNT("A001"),			// 회원가입건수
+		LOGIN_CNT("A002"),			// 로그인건수
+		INFLOW_CNT("A003"),			// 유입건수
+		PAY_CNT("A004"),			// 결제건수
+		EXTMALL_ORD_CNT("A005");	// 외부몰 주문건수
+
+		private String value;
+
+		private Monitoring(String value) {
+			this.value = value;
+		}
+
+		public String value() {
+			return value;
+		}
+	}
+
+	// 사이트코드
+		public enum SiteCd {
+			STYLE24("G000_10");
+
+			private String value;
+
+			private SiteCd(String value) {
+				this.value = value;
+			}
+
+			public String value() {
+				return value;
+			}
+		}
+
+}

+ 56 - 0
src/main/java/com/style24/batch/support/startup/TsbApplication.java

@@ -0,0 +1,56 @@
+package com.style24.batch.support.startup;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+import com.style24.core.support.env.TscConstants;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.core.GagaConstants;
+
+/**
+ * Application
+ * 
+ * @author gagamel
+ * @since 2020. 11. 16
+ */
+@Configuration
+@EnableAutoConfiguration(exclude = {DataSourceTransactionManagerAutoConfiguration.class, DataSourceAutoConfiguration.class})
+@ComponentScan(basePackages = {GagaConstants.GAGA_PACKAGE, TscConstants.BASE_PACKAGE})
+@EnableScheduling
+@EnableAsync
+@Slf4j
+public class TsbApplication {
+
+	@Autowired
+	private Environment env;
+
+	@PostConstruct
+	public void initApplication() throws IOException {
+		log.info("Running with Spring Profiles: {}", Arrays.toString(env.getActiveProfiles()));
+		if (env.getActiveProfiles().length == 0) {
+			log.warn("No spring profile configured, running with default configuration.");
+		} else if (env.getActiveProfiles().length > 1) {
+			log.error("You have misconfigured your application! It should not run with both Spring Profiles at the same time.");
+		}
+	}
+
+	public static void main(String[] args) {
+		SpringApplication.run(TsbApplication.class, args);
+	}
+
+}

+ 19 - 0
src/main/java/com/style24/batch/support/startup/TsbServletInitializer.java

@@ -0,0 +1,19 @@
+package com.style24.batch.support.startup;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+ * ServletInitializer
+ * 
+ * @author gagamel
+ * @since 2020. 11. 16
+ */
+public class TsbServletInitializer extends SpringBootServletInitializer {
+
+	@Override
+	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+		return application.sources(TsbApplication.class);
+	}
+
+}

+ 48 - 0
src/main/java/com/style24/persistence/domain/Coupon.java

@@ -0,0 +1,48 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 쿠폰 Domain
+ *
+ * @author eskim
+ * @since 2020. 12. 02
+ */
+@SuppressWarnings("serial")
+@Data
+public class Coupon extends TscBaseDomain {
+
+	private String cpnId;
+	private String cpnNm;
+	private String siteCd;
+	private String afLinkCd;
+	private String usableCustGb;
+	private String usableCustGrade;
+	private String cpnType;
+	private String applyScope;
+	private String dcWay;
+	private int dcPval;
+	private int dcMval;
+	private int dcAval;
+	private int maxDcAmt;
+	private String pdGb;
+	private String availStdt;
+	private String availEddt;
+	private int availDays;
+	private int custPubLimitQty;
+	private int totPubLimitQty;
+	private int onePubQty;
+	private String dnGb;
+	private String downStdt;
+	private String downEddt;
+	private int buyLimitAmt;
+	private int planSq;
+	private String reissuance;
+	private String cpnStat;
+	private String endAlimYn;
+
+	private int pointUnit;
+
+}

+ 39 - 0
src/main/java/com/style24/persistence/domain/Delivery.java

@@ -0,0 +1,39 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 배송 Domain
+ *
+ * @author moon
+ * @since 2020. 12. 08
+ */
+@SuppressWarnings("serial")
+@Data
+public class Delivery extends TscBaseDomain {
+
+	
+	private String zipNo;
+	private String pndBran;
+	private String pndBranNm;
+	private String operAboveBran;
+	private String trBranNm;
+	private String cityDo;
+	private String guGun;
+	private String dongYupMeun;
+	private String deliveryTime;
+	private String deliveryProbability;
+	private String deliveryclasscd;
+	private String isuse;
+	
+	private int rtnCd;
+	private String rtnMsg;
+	
+	
+
+	
+}
+
+

+ 158 - 0
src/main/java/com/style24/persistence/domain/Goods.java

@@ -0,0 +1,158 @@
+package com.style24.persistence.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 Domain
+ *
+ * @author eskim
+ * @since 2020. 10. 20
+ */
+@SuppressWarnings("serial")
+@Data
+public class Goods extends TscBaseDomain {
+
+	private String goodsCd;		//상품코드
+	private int productNo;		//ProductNo(WMS)
+	private String productCode;		//ProductCode(WMS)
+	private String brandCd;		//브랜드코드
+	private String itemkindCd;		//품목코드
+	private String goodsNm;		//상품명
+	private String goodsTnm;		//상품타이틀명
+	private String goodsSnm;		//상품검색명
+	private String goodsSnm1;		//상품검색명1(사용자등록용)
+	private String mainColorCd;		//대표색상코드
+	private String styleYear;		//스타일연도
+	private String seasonCd;		//시즌코드(공통코드G006)
+	private String sexGb;		//성별구분(공통코드G007)
+	private String goodsNum;		//품번(자사상품만 사용)
+	private String goodsType;		//상품타입(공통코드G056)
+	private int listPrice;		//정상가(최초판매가)
+	private int currPrice;		//현재판매가
+	private int currBprice;		//변경전현재판매가
+	private String priceUpdDt;		//가격변경일시
+	private float dcRate;		//할인율
+
+	private String goodsStat;		//상품상태(공통코드G008)
+	private String selfMallYn;		//자사몰노출여부
+	private String goodsGb;		//해외구매대행/병행수입 상품일 경우 주문 시 통관부호 입력 란이 추가되어야 한다
+	private String distributionGb;		//유통구분(공콩코드 G065)
+	private String selfGoodsYn;		//자사상품여부
+	private String supplyCompCd;		//공급업체코드
+	private String supplyGoodsCd;		//공급업체상품코드(원코드)
+	private String ageGrpCd;		//상품연령대(공통코드 G023)
+	private String delvFeeCd;	//배송비정책코드
+	private int delvFee;		//배송비
+	private int minOrdAmt;		//무료배송비최소구매금액
+	private float pntPrate;		//포인트적립율(PC)
+	private float pntMrate;		//포인트적립율(모바일)
+	private float sellFeeRate;		//판매수수료율
+	private String formalGb;		//정상이월구분(공통코드G009)
+	private String changeableYn;		//교환가능여부
+	private String returnableYn;		//반품가능여부
+	private String changeFeeFreeYn;		//교환배송비무료여부
+	private String returnFeeFreeYn;		//반품배송비무료여부
+	private String prePpntUsableYn;		//선포인트사용가능여부(PC)
+	private String preMpntUsableYn;		//선포인트사용가능여부(모바일)
+	private int minOrdQty;		//최소주문수량
+	private int maxOrdQty;		//최대주문수량
+	private int dayMaxOrdQty;		//ID당1일최대구매수량
+	private String giftPackYn;		//선물포장여부
+	private String frstCfrmDt;		//최초승인일시
+	private String originCd;		//제조국(원산지)
+	private String makeYmd;		//제조연월일
+	private String taxGb;		//과세구분(10:과세, 20:비과세)
+	private String erpPriceLinkYn;		//ERP가격연계여부(자사상품만 사용. Y:연계)
+	private String erpStockLinkYn;		//ERP재고연계여부(자사상품만 사용. Y:연계)
+
+	private String brandEnm;		//브랜드영문명
+	private String brandGrpNm;		//브랜드그룹명
+
+	private String goodsDesc;
+	private String goodsPcTopDesc;
+	private String goodsPcDownDesc;
+	private String goodsMobileTopDesc;
+	private String goodsMobileDownDesc;
+	private String chkDescKeep = "N";
+//
+	private String chDataYn = "N";
+	private String chImgYn = "N";
+	private String chNotiYn = "N";
+	private String chStockDataYn = "N";
+	private String chGoodsStatYn = "N";
+	private int stockQtySum;
+	private String goodsImageYn;
+	private String itemkindNm;
+	private String niClsfCd;
+	private String makeNm;
+
+	private int currPriceOrg;
+	private String goodsStatOrg;
+	private String formalGbOrg;
+
+	private String sysImgNm;
+	private String niClsfNm;
+	private String goodsTypeNm;
+	private String goodTnmInit;
+//
+//	private String goodsRegMsg;
+	private String procJob;
+	private String excelFileNm;
+//	private String searchGb;
+
+	private String blankFlag;
+//
+//	private Integer sizeCurrStockQty;
+//	private Integer sizeBaseStockQty;
+//	private Integer sizeSaleStockQty;
+//	private Integer sizeStockQty;
+//	private String goodsSizeCd;
+//	private String sizeSoldoutYn;
+	private String siteCd;
+	private int sellDay15Qty;
+
+	private int goodsSq;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrGoodsCd;
+
+	// 상품옵션/재고
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] compsGoodsCd; // 상품 사이즈
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] optCd; // 상품 사이즈
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] optCd1; // 상품 옵션1
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] optCd2; // 상품 옵션2
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] baseStockQty; // 안전재고
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] currStockQty; // erp가용재고
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] editCurrStockQty; // 수정가용재고
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] soldoutYn; // 품절여부
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] dispOrd; // 우선순위
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] dispYn; // 전시여부
+
+
+	private String notiList; // 고시항목
+
+
+
+}

+ 28 - 0
src/main/java/com/style24/persistence/domain/GoodsIfIncomelot.java

@@ -0,0 +1,28 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 wms 입고정보 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 01
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsIfIncomelot extends TscBaseDomain {
+
+	private Integer lotno;	//입고번호
+	private int purchaseno;	//발주번호
+	private int providerno;	//공급처번호
+	private String providername;	//공급처명
+	private int brandno;	//브랜드번호
+	private String brandname;	//브랜드명
+	private String dateincome;	//wms생성일
+
+
+	private String jobdate; 	// 작업일 YYYYMMDD
+
+}

+ 30 - 0
src/main/java/com/style24/persistence/domain/GoodsIfIncomelotitem.java

@@ -0,0 +1,30 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 wms 입고상품정보 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 01
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsIfIncomelotitem extends TscBaseDomain {
+
+	private Integer lotno;	//입고번호
+	private Integer itemno;	//입고항목번호
+	private int wmsitemno;
+	private String dateincome;	//wms생성일
+	private int productno;	//상품번호
+	private String productcode;	//상품코드
+	private String productname;	//상품명
+	private String skucode;	//옵션번호
+	private int normalqty;	//일반수량
+	private int brokenqty;	//불량수량
+	private int totalqty;	//총수량
+	private String modelno;	//모델번호
+
+}

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

@@ -0,0 +1,33 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 실측사이즈 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 01
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsIfMeasurement extends TscBaseDomain {
+
+	private String skucode;		//옵션번호
+	private int productno;	//상품 번호
+	private int productcode;	//상품 코드
+	private String typecd;	//상하의 타입
+	private String washingmethod;	//세탁방법
+	private float value1;	//치수1
+	private float value2;	//치수2
+	private float value3;	//치수3
+	private float value4;	//치수4
+	private float value5;	//치수5
+	private String memo;	//메모
+	private String dateinserted;	//등록일 yyyy-mm-dd hh:mi:ss
+	private String datelastmodified;	//수정일 yyyy-mm-dd hh:mi:ss
+	private String isuse;	//사용여부(1:Y, 0 N)
+	private int userlastmodified;	//수정자
+
+}

+ 33 - 0
src/main/java/com/style24/persistence/domain/GoodsIfProductsku.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. 04
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsIfProductsku 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 String isvirtualstock;		//
+	private String datevirtualstock;	//
+	private String skucode88;			//88코드
+
+}

+ 24 - 0
src/main/java/com/style24/persistence/domain/GoodsSafeNo.java

@@ -0,0 +1,24 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 안전인증 Domain
+ *
+ * @author eskim
+ * @since 2020. 11. 04
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsSafeNo extends TscBaseDomain {
+
+	private String goodsCd;
+	private String goodsNum;
+	private String certNum;
+	private String certState;
+	private String certDiv;
+	private String certDt;
+
+}

+ 26 - 0
src/main/java/com/style24/persistence/domain/GoodsSummary.java

@@ -0,0 +1,26 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품요약(통계성) Domain
+ *
+ * @author eskim
+ * @since 2020. 12. 04
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsSummary extends TscBaseDomain {
+
+	private String goodsCd;
+	private String colNm1;
+	private String colNm2;
+	private String colNm3;
+	private String reviewColNm;
+	private int colValue;
+	private String fromDay;
+	private String photoYn;
+
+}

+ 28 - 0
src/main/java/com/style24/persistence/domain/IfBrand.java

@@ -0,0 +1,28 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * wms 연동 브랜드 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 05
+ */
+@SuppressWarnings("serial")
+@Data
+public class IfBrand extends TscBaseDomain {
+
+	private Integer brandno;            //브랜드 넘버
+	private String brandname;           //브랜드 명
+	private String datecreated;         //생성일
+	private String statuscd;            //상태
+	private String brandCd;             //브랜드코드
+	private String dateupdateed;        //수정일
+
+	private String supplyCompCd;       //업체코드
+	private int providerNo;            //공급처번호
+
+
+}

+ 31 - 0
src/main/java/com/style24/persistence/domain/IfProduct.java

@@ -0,0 +1,31 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * wms 연동 상품정보 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 05
+ */
+@SuppressWarnings("serial")
+@Data
+public class IfProduct extends TscBaseDomain {
+
+	private Integer productno;			//상품번호
+	private String productcode;			//상품코드
+	private String productname;			//상품명
+	private int brandno;				//브랜드번호
+	private String brandname;			//브랜드명
+	private int providerno;				//공급처번호
+	private String statuscd;			//관리상태
+	private String producttypecd;		//상품타입
+	private String vendorproductcode;	//업체상품코드
+	private String goodsCd;				//온라인상품코드
+	private String brandCd;				//온라인브랜드코드
+	private String supplyCompCd;		//온라인공급업체코드
+	private String sysImgNm;			//온라인상품이미지
+
+}

+ 33 - 0
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코드
+
+}

+ 30 - 0
src/main/java/com/style24/persistence/domain/IfProvider.java

@@ -0,0 +1,30 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * wms 연동 업체정보 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 05
+ */
+@SuppressWarnings("serial")
+@Data
+public class IfProvider extends TscBaseDomain {
+
+	private Integer providerno;		//공급처번호
+	private int vendorno;			//벤더번호 --- 대체값 확인
+	private String providername;	//공급저명
+	private String categorytypecd;	//분류코드
+	private String distributioncd;	//유통구분
+	private String chargename;		//처리담당자 이름
+	private String chargecellnum;	//처리담당자 전화번호
+	private String statuscd;		//상태 (Y: 사용, N: 미사용)
+	private String stockmgmttypecd;	//재고관리 유형
+	private String supplyCompCd;	//온라인공급업체코드
+	private String datecreated;		//생성일
+	private String dateLastmodified; //수정일
+
+}

+ 48 - 0
src/main/java/com/style24/persistence/domain/Option.java

@@ -0,0 +1,48 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 재고 Domain
+ *
+ * @author eskim
+ * @since 2020. 10. 26
+ */
+@SuppressWarnings("serial")
+@Data
+public class Option extends TscBaseDomain {
+
+	private String goodsCd;
+	private String optCd;
+	private String optNm;
+	private String optCd1;
+	private String optCd2;
+	private String skuModelNo;
+	private int productNo;
+	private String productCode;
+	private int baseStockQty;
+	private int currStockQty;
+	private int addPrice;
+	private String soldoutYn;
+	private String dispOrd;
+	private String dispYn;
+
+	private int rnum;
+	private int rcount;
+	private int saleStockQty;
+	private int ableStockQty;
+	private String goodsNm;
+	private String goodsStat;
+	private String goodsStatNm;
+	private String compsGoodsCd;
+	private String selfGoodsYn;
+	private String itemkindNm;
+	private String brandEnm;
+	private String brandCd;
+	private String itemkindCd;
+	private String supplyCompCd;
+	private String supplyGoodsCd;
+
+}

+ 45 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsbBatch.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.batch.biz.dao.TsbBatchDao">
+	
+	<!-- 배치명 조회 -->
+	<select id="getBatchName" parameterType="String" resultType="String">
+		/* TsbBatch.getBatchName */
+		SELECT BATCH_NM
+		FROM   TB_BATCH
+		WHERE  BATCH_ID = #{batchId}
+		AND    USE_YN = 'Y' /*사용하는 넘만*/
+	</select>
+	
+	<!-- 배치로그 생성 -->
+	<insert id="createBatchLog" parameterType="BatchLog" keyProperty="batchLogSq">
+		/* TsbBatch.createBatchLog */
+		INSERT INTO TB_BATCH_LOG (
+		       BATCH_LOG_SQ
+		     , BATCH_ID
+		     , BATCH_STDT
+		     , BATCH_STAT
+		     , REG_NO
+		     , REG_DT
+		)
+		VALUES (
+		       #{batchLogSq}
+		     , #{batchId}
+		     , NOW(6) /*millisecond 까지 저장*/
+		     , 'I'
+		     , #{regNo}
+		     , NOW()
+		)
+	</insert>
+	
+	<!-- 배치로그 종료 처리 -->
+	<update id="updateBatchLog" parameterType="Integer">
+		/* TsbBatch.updateBatchLog */
+		UPDATE TB_BATCH_LOG
+		SET    BATCH_EDDT = NOW(6) /*millisecond 까지 저장*/
+		     , BATCH_STAT = 'F'
+		WHERE  BATCH_LOG_SQ = #{batchLogSq}
+		AND    BATCH_STAT = 'I'
+	</update>
+	
+</mapper>

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

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.batch.biz.dao.TsbCommonDao">
+	
+	
+	<!-- WMS 연동 여부 -->
+	<select id="getWmsSyncYn" resultType="String">
+		/* TsbCommon.getWmsSyncYn */
+		SELECT UPPER(NVL(USE_YN,'N')) AS WMS_SYNC_YN
+		FROM TB_COMMON_CODE
+		WHERE CD_GB = 'G077'
+		AND CD = 'WMSSYNCYN'
+	</select>
+	
+</mapper>

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

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.batch.biz.dao.TsbDeliveryDao">
+	
+	<!-- 총알배송 권역정보 등록  -->
+	<insert id="mergeDailyDeliveryZone" parameterType="Delivery" >
+		/*TsbDelivery.mergeDailyDeliveryZone*/
+		
+			INSERT INTO TB_DAILY_DELIVERY_ZONE
+			(
+				  ZIP_NO
+				, PND_BRAN
+				, PND_BRAN_NM
+				, OPER_ABOVE_BRAN
+				, TR_BRAN_NM
+				, CITY_DO
+				, GU_GUN
+				, DONG_YUP_MEUN
+				, DELIVERY_TIME
+				, DELIVERY_PROBABILITY
+				, DELIVERYCLASSCD
+				, ISUSE
+                , DATELASTUPDATE
+			)
+			VALUES
+			(
+			 	  #{zipNo}
+				, #{pndBran}
+				, #{pndBranNm}
+				, #{operAboveBran}
+				, #{trBranNm}
+				, #{cityDo}
+				, #{guGun}
+				, #{dongYupMeun}
+				, #{deliveryTime}
+				, #{deliveryProbability}
+				, #{deliveryclasscd}
+				, #{isuse}
+                , NOW()
+			)
+			ON 
+			DUPLICATE KEY
+			UPDATE
+			  PND_BRAN	            = #{pndBran}
+			, PND_BRAN_NM	        = #{pndBranNm}
+			, OPER_ABOVE_BRAN	    = #{operAboveBran}
+			, TR_BRAN_NM	        = #{trBranNm}
+			, CITY_DO	            = #{cityDo}
+			, GU_GUN	            = #{guGun}
+			, DONG_YUP_MEUN	        = #{dongYupMeun}
+			, DELIVERY_TIME	        = #{deliveryTime}
+			, DELIVERY_PROBABILITY	= #{deliveryProbability}
+			, DELIVERYCLASSCD	    = #{deliveryclasscd}
+			, ISUSE	                = #{isuse}
+            , DATELASTUPDATE        = NOW()
+	</insert>
+
+</mapper>

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

@@ -0,0 +1,1900 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.batch.biz.dao.TsbGoodsDao">
+	
+	<!-- 상품 기본정보 이력 생성 -->
+	<insert id="createGoodsHst" parameterType="Goods">
+		/* TsbGoods.createGoodsHst */
+		INSERT INTO TB_GOODS_HST 
+		(       GOODS_CD
+		      , PRODUCT_NO
+		      , PRODUCT_CODE
+		      , BRAND_CD
+		      , ITEMKIND_CD
+		      , GOODS_NM
+		      , GOODS_TNM
+		      , GOODS_SNM
+		      , GOODS_SNM1
+		      , MAIN_COLOR_CD
+		      , STYLE_YEAR
+		      , SEASON_CD
+		      , SEX_GB
+		      , GOODS_NUM
+		      , GOODS_TYPE
+		      , LIST_PRICE
+		      , CURR_PRICE
+		      , CURR_BPRICE
+		      , PRICE_UPD_DT
+		      , COST_PRICE
+		      , DC_RATE
+		      , GOODS_STAT
+		      , SELF_MALL_YN
+		      , GOODS_GB
+		      , DISTRIBUTION_GB
+		      , SELF_GOODS_YN
+		      , SUPPLY_COMP_CD
+		      , SUPPLY_GOODS_CD
+		      , AGE_GRP_CD
+		      , DELV_FEE_CD
+		      , PNT_PRATE
+		      , PNT_MRATE
+		      , SELL_FEE_RATE
+		      , FORMAL_GB
+		      , CHANGEABLE_YN
+		      , RETURNABLE_YN
+		      , CHANGE_FEE_FREE_YN
+		      , RETURN_FEE_FREE_YN
+		      , PRE_PPNT_USABLE_YN
+		      , PRE_MPNT_USABLE_YN
+		      , MIN_ORD_QTY
+		      , MAX_ORD_QTY
+		      , DAY_MAX_ORD_QTY
+		      , GIFT_PACK_YN
+		      , FRST_CFRM_DT
+		      , ORIGIN_CD
+		      , MAKE_YMD
+		      , TAX_GB
+		      , ERP_PRICE_LINK_YN
+		      , ERP_STOCK_LINK_YN
+		      , NEW_CUST_ORD_YN
+		      , ADULT_YN
+		      , REG_NO
+		      , REG_DT
+		      , UPD_NO
+		      , UPD_DT
+		)
+		SELECT GOODS_CD            
+		     , PRODUCT_NO
+		     , PRODUCT_CODE
+		     , BRAND_CD            
+		     , ITEMKIND_CD         
+		     , GOODS_NM            
+		     , GOODS_TNM           
+		     , GOODS_SNM           
+		     , GOODS_SNM1          
+		     , MAIN_COLOR_CD
+		     , STYLE_YEAR          
+		     , SEASON_CD           
+		     , SEX_GB              
+		     , GOODS_NUM           
+		     , GOODS_TYPE          
+		     , LIST_PRICE          
+		     , CURR_PRICE          
+		     , CURR_BPRICE         
+		     , PRICE_UPD_DT        
+		     , COST_PRICE
+		     , DC_RATE             
+		     , GOODS_STAT          
+		     , SELF_MALL_YN             
+		     , GOODS_GB            
+		     , DISTRIBUTION_GB     
+		     , SELF_GOODS_YN       
+		     , SUPPLY_COMP_CD      
+		     , SUPPLY_GOODS_CD     
+		     , AGE_GRP_CD          
+		     , DELV_FEE_CD            
+		     , PNT_PRATE           
+		     , PNT_MRATE           
+		     , SELL_FEE_RATE       
+		     , FORMAL_GB           
+		     , CHANGEABLE_YN       
+		     , RETURNABLE_YN       
+		     , CHANGE_FEE_FREE_YN  
+		     , RETURN_FEE_FREE_YN  
+		     , PRE_PPNT_USABLE_YN  
+		     , PRE_MPNT_USABLE_YN  
+		     , MIN_ORD_QTY         
+		     , MAX_ORD_QTY         
+		     , DAY_MAX_ORD_QTY     
+		     , GIFT_PACK_YN
+		     , FRST_CFRM_DT        
+		     , ORIGIN_CD             
+		     , MAKE_YMD            
+		     , TAX_GB              
+		     , ERP_PRICE_LINK_YN   
+		     , ERP_STOCK_LINK_YN   
+		     , NEW_CUST_ORD_YN
+		     , ADULT_YN
+		     , #{regNo}              
+		     , NOW()              
+		     , UPD_NO              
+		     , UPD_DT              
+		FROM TB_GOODS
+		WHERE 1 = 1
+		<choose>
+		      <when test='procJob != null and procJob == "G"'>
+		AND GOODS_CD = #{goodsCd}
+		      </when>
+		      <when test='procJob != null and procJob == "GTE"'>
+		AND GOODS_CD IN (
+		                 SELECT G.GOODS_CD
+		                 FROM TB_GOODS G
+		                     ,(
+		                       SELECT GOODS_CD
+		                            , GOODS_TNM
+		                       FROM (
+		                             SELECT GT.GOODS_CD
+		                                  , GT.GOODS_TNM
+		                                  , RANK() OVER(PARTITION BY GT.GOODS_CD ORDER BY GT.GOODS_TNM_RES_SQ DESC) RANK
+		                             FROM TB_GOODS_TNM_RES GT
+		                             WHERE GT.APPLY_YN = 'N'
+		                             AND GT.APPLY_EDDT <![CDATA[<]]> NOW()
+		                            ) Z
+		                       WHERE RANK = 1
+		                      ) S
+		                 WHERE G.GOODS_CD = S.GOODS_CD
+		                 AND G.GOODS_TNM = S.GOODS_TNM
+		                )
+		      </when>
+		      <when test='procJob != null and procJob == "GTS"'>
+		AND GOODS_CD IN (
+		                 SELECT G.GOODS_CD
+		                 FROM TB_GOODS G
+		                     ,(
+		                       SELECT GOODS_CD
+		                            , GOODS_TNM
+		                       FROM (
+		                             SELECT GT.GOODS_CD
+		                                  , GT.GOODS_TNM
+		                                  , RANK() OVER(PARTITION BY GT.GOODS_CD ORDER BY GT.GOODS_TNM_RES_SQ DESC) RANK
+		                             FROM TB_GOODS_TNM_RES GT
+		                             WHERE GT.APPLY_YN = 'N'
+		                             AND NOW() BETWEEN GT.APPLY_STDT AND GT.APPLY_EDDT
+		                            ) Z
+		                       WHERE RANK = 1
+		                      ) S
+		                 WHERE G.GOODS_CD = S.GOODS_CD
+		                 AND (G.GOODS_TNM IS NULL OR G.GOODS_TNM <![CDATA[<>]]> S.GOODS_TNM)
+		                )
+		      </when>
+		      <when test='procJob != null and procJob == "GPE"'>
+		AND GOODS_CD IN (
+		                 SELECT G.GOODS_CD
+		                 FROM TB_GOODS G
+		                     ,(
+		                       SELECT GOODS_CD
+		                            , RES_GOODS_PRICE
+		                       FROM (
+		                             SELECT GT.GOODS_CD
+		                                  , GT.RES_GOODS_PRICE
+		                                  , RANK() OVER(PARTITION BY GT.GOODS_CD ORDER BY GT.GOODS_PRICE_RES_SQ DESC) RANK
+		                             FROM TB_GOODS_PRICE_RES GT
+		                             WHERE GT.APPLY_YN = 'N'
+		                             AND GT.APPLY_EDDT <![CDATA[<]]> NOW()
+		                            ) Z
+		                       WHERE RANK = 1
+		                      ) S
+		                 WHERE G.GOODS_CD = S.GOODS_CD
+		                 AND G.CURR_PRICE = S.RES_GOODS_PRICE
+		                 AND G.SELF_GOODS_YN = 'Y'
+		                )
+		      </when>
+		      <when test='procJob != null and procJob == "GPS"'>
+		AND GOODS_CD IN (
+		                 SELECT G.GOODS_CD
+		                 FROM TB_GOODS G
+		                     ,(
+		                       SELECT GOODS_CD
+		                            , RES_GOODS_PRICE
+		                       FROM (
+		                             SELECT GT.GOODS_CD
+		                                  , GT.RES_GOODS_PRICE
+		                                  , RANK() OVER(PARTITION BY GT.GOODS_CD ORDER BY GT.GOODS_PRICE_RES_SQ DESC) RANK
+		                             FROM TB_GOODS_PRICE_RES GT
+		                             WHERE GT.APPLY_YN = 'N'
+		                             AND NOW() BETWEEN GT.APPLY_STDT AND GT.APPLY_EDDT
+		                            ) Z
+		                       WHERE RANK = 1
+		                      ) S
+		                 WHERE G.GOODS_CD = S.GOODS_CD
+		                 AND (G.CURR_PRICE <![CDATA[<>]]> S.RES_GOODS_PRICE)
+		                 AND G.SELF_GOODS_YN = 'Y'
+		                )
+		      </when>
+		      <otherwise>
+		AND 1 = 2
+		      </otherwise>
+		    </choose>
+
+	</insert>
+	
+	<!-- 상품 타이틀 예약건 초기화 -->
+	<update id="updateGoodTnmInit">
+		/* TsbGoods.updateGoodTnmInit */
+		UPDATE TB_GOODS A
+		SET A.UPD_NO = 0
+		  , A.UPD_DT = NOW()
+		  , A.GOODS_TNM = (SELECT S.GOODS_TNM
+		                   FROM (
+		                       SELECT GT.GOODS_CD
+		                            , GT.GOODS_TNM
+		                            , RANK() OVER(PARTITION BY GT.GOODS_CD ORDER BY GT.GOODS_TNM_RES_SQ DESC) RANK
+		                       FROM TB_GOODS_TNM_RES GT
+		                       WHERE GT.APPLY_YN = 'N'
+		                       AND NOW() BETWEEN GT.APPLY_STDT AND GT.APPLY_EDDT
+		                      ) S
+		                   WHERE S.RANK = 1
+		                   AND S.GOODS_CD = A.GOODS_CD
+		                   )
+		WHERE A.GOODS_CD IN (
+		                   SELECT P.GOODS_CD
+		                   FROM TB_GOODS P
+		                       ,(SELECT GOODS_CD
+		                              , GOODS_TNM
+		                         FROM (
+		                              SELECT RS.GOODS_CD
+		                                   , RS.GOODS_TNM
+		                                   , RANK() OVER(PARTITION BY RS.GOODS_CD ORDER BY RS.GOODS_TNM_RES_SQ DESC) RANK
+		                              FROM TB_GOODS_TNM_RES RS
+		                              WHERE RS.APPLY_EDDT <![CDATA[<]]> NOW()
+		                              AND RS.APPLY_YN = 'N'
+		                              ) Z
+		                         WHERE RANK = 1
+		                        ) TS
+		                   WHERE  P.GOODS_CD = TS.GOODS_CD
+		                  )
+	</update>
+	
+	<!-- 상품예약 종료처리 -->
+	<update id="updateGoodsTnmRes">
+		/* TsbGoods.updateGoodsTnmRes */
+		UPDATE TB_GOODS_TNM_RES
+		   SET APPLY_YN = 'Y'
+		     , UPD_NO = 0
+		     , UPD_DT = NOW()
+		WHERE APPLY_EDDT <![CDATA[<]]> NOW()
+		AND APPLY_YN = 'N'
+	</update>
+	
+	<!-- 상품타이틀 변경 -->
+	<update id="updateGoodsTnm">
+		/* TsbGoods.updateGoodsTnm */
+		UPDATE TB_GOODS A
+		SET A.UPD_NO = 0
+		  , A.UPD_DT = NOW()
+		  , A.GOODS_TNM = (
+		                 SELECT S.GOODS_TNM
+		                 FROM TB_GOODS P
+		                    , (
+		                       SELECT GOODS_CD
+		                            , GOODS_TNM
+		                       FROM (
+		                             SELECT RS.GOODS_CD
+		                                  , RS.GOODS_TNM
+		                                  , RANK() OVER(PARTITION BY RS.GOODS_CD ORDER BY RS.GOODS_TNM_RES_SQ DESC) RANK
+		                             FROM TB_GOODS_TNM_RES RS
+		                             WHERE NOW() BETWEEN RS.APPLY_STDT AND RS.APPLY_EDDT
+		                             AND RS.APPLY_YN = 'N'
+		                             ) Z
+		                       WHERE RANK = 1
+		                      ) S
+		                   WHERE P.GOODS_CD = S.GOODS_CD
+		                   AND  P.GOODS_CD = A.GOODS_CD
+		                   AND (P.GOODS_TNM IS NULL OR P.GOODS_TNM <![CDATA[<>]]> S.GOODS_TNM)
+		                 )
+		WHERE A.GOODS_CD IN (
+		                   SELECT P.GOODS_CD
+		                   FROM TB_GOODS P
+		                       ,(SELECT GOODS_CD
+		                              , GOODS_TNM
+		                         FROM (
+		                              SELECT RS.GOODS_CD
+		                                   , RS.GOODS_TNM
+		                                   , RANK() OVER(PARTITION BY RS.GOODS_CD ORDER BY RS.GOODS_TNM_RES_SQ DESC) RANK
+		                              FROM TB_GOODS_TNM_RES RS
+		                              WHERE NOW() BETWEEN RS.APPLY_STDT AND RS.APPLY_EDDT
+		                              AND RS.APPLY_YN = 'N'
+		                              ) Z
+		                         WHERE RANK = 1
+		                        ) S
+		                   WHERE  P.GOODS_CD = S.GOODS_CD
+		                   AND (P.GOODS_TNM IS NULL OR P.GOODS_TNM <![CDATA[<>]]> S.GOODS_TNM)
+		                  )
+	</update>
+	
+	<!-- 상품 가격 예약건 초기화 -->
+	<update id="updateGoodPriceInit">
+		/* TsbGoods.updateGoodPriceInit */
+		UPDATE TB_GOODS A, (SELECT P.GOODS_CD
+		                         , TS.END_GOODS_PRICE
+		                         , P.CURR_PRICE
+		                         , 100 - ROUND((TS.END_GOODS_PRICE / P.LIST_PRICE) * 100 ,0) AS DC_RATE
+		                    FROM TB_GOODS P
+		                      , (SELECT GOODS_CD
+		                              , END_GOODS_PRICE
+		                         FROM (SELECT GT.GOODS_CD
+		                                    , GT.END_GOODS_PRICE
+		                                    , RANK() OVER(PARTITION BY GT.GOODS_CD ORDER BY GT.GOODS_PRICE_RES_SQ DESC) RANK
+		                               FROM TB_GOODS_PRICE_RES GT
+		                               WHERE GT.APPLY_EDDT <![CDATA[<]]> NOW()
+		                               AND GT.APPLY_YN = 'N'
+		                              ) S
+		                         WHERE S.RANK = 1
+		                         ) TS
+		                    WHERE P.GOODS_CD = TS.GOODS_CD
+		                    ) B
+		SET A.UPD_NO = 0
+		  , A.UPD_DT = NOW()
+		  , A.CURR_PRICE = B.END_GOODS_PRICE
+		  , A.CURR_BPRICE = B.CURR_PRICE
+		  , A.DC_RATE = B.DC_RATE
+		  , A.PRICE_UPD_DT = NOW()
+		WHERE A.GOODS_CD = B.GOODS_CD
+		AND A.SELF_GOODS_YN = 'Y'
+	</update>
+	
+	<!-- 상품 가격 예약 종료처리 -->
+	<update id="updateGoodsPriceRes">
+		/* TsbGoods.updateGoodsPriceRes */
+		UPDATE TB_GOODS_PRICE_RES
+		   SET APPLY_YN = 'Y'
+		     , UPD_NO = 0
+		     , UPD_DT = NOW()
+		WHERE APPLY_EDDT <![CDATA[<]]> NOW()
+		AND APPLY_YN = 'N'
+	</update>
+	
+	<!-- 상품 가격 변경 -->
+	<update id="updateGoodsPrice">
+		/* TsbGoods.updateGoodsPrice */
+		UPDATE TB_GOODS A, (SELECT P.GOODS_CD
+		                         , S.RES_GOODS_PRICE
+		                         , P.CURR_PRICE
+		                         , 100 - ROUND((S.RES_GOODS_PRICE / P.LIST_PRICE) * 100 ,0) AS DC_RATE
+		                    FROM TB_GOODS P
+		                       , (
+		                          SELECT GOODS_CD
+		                               , RES_GOODS_PRICE
+		                          FROM (
+		                                SELECT RS.GOODS_CD
+		                                     , RS.RES_GOODS_PRICE
+		                                     , RANK() OVER(PARTITION BY RS.GOODS_CD ORDER BY RS.GOODS_PRICE_RES_SQ DESC) RANK
+		                                FROM TB_GOODS_PRICE_RES RS
+		                                WHERE NOW() BETWEEN RS.APPLY_STDT AND RS.APPLY_EDDT
+		                                AND RS.APPLY_YN = 'N'
+		                                ) Z
+		                          WHERE RANK = 1
+		                         ) S
+		                    WHERE P.GOODS_CD = S.GOODS_CD
+		                    AND P.CURR_PRICE <![CDATA[<>]]> S.RES_GOODS_PRICE
+		                 ) B
+		SET A.UPD_NO = 0
+		  , A.UPD_DT = NOW()
+		  , A.CURR_PRICE = B.RES_GOODS_PRICE
+		  , A.CURR_BPRICE = B.CURR_PRICE
+		  , A.DC_RATE = B.DC_RATE
+		  , A.PRICE_UPD_DT = NOW()
+		WHERE A.GOODS_CD = B.GOODS_CD
+		AND A.SELF_GOODS_YN = 'Y'
+	</update>
+	
+	<!--상품 검색어 작업 - 사용자검색어 없는 상품 일괄 -->
+	<update id="updateGoodsSnmByGoodsSnm1Null">
+		/* TsbGoods.updateGoodsSnmByGoodsSnm1Null */
+		UPDATE TB_GOODS A, (
+		                    WITH RECURSIVE TMP_COLOR_GOODS AS (
+		                       SELECT GOODS_CD
+		                            , REPLACE(CONCAT(GROUP_CONCAT(COLOR_GRP_CD),';',GROUP_CONCAT(COLOR_ENM),';',GROUP_CONCAT(CD_NM)),',',';') AS COLOR_INFO
+		                       FROM (
+		                           SELECT DISTINCT G.GOODS_CD, C.COLOR_GRP_CD, C.COLOR_ENM, D.CD_NM
+		                           FROM TB_GOODS G
+		                           LEFT OUTER JOIN TB_OPTION E ON G.GOODS_CD = E.GOODS_CD
+		                           LEFT OUTER JOIN TB_COLOR C ON E.OPT_CD1 = C.COLOR_CD
+		                                                      AND C.USE_YN= 'Y' 
+		                           LEFT OUTER JOIN TB_COMMON_CODE D ON C.COLOR_GRP_CD = D.CD
+		                                                      AND D.USE_YN= 'Y'
+		                           WHERE G.GOODS_SNM1 IS NULL
+		                       ) Z
+		                       GROUP BY GOODS_CD
+		                   )
+		                   SELECT GOODS_CD
+		                        , GOODS_SNM_COMP 
+		                   FROM (
+		                       SELECT DISTINCT Y.GOODS_CD
+		                            , Y.GOODS_SNM_COMP
+		                            , Y.GOODS_SNM
+		                       FROM (
+		                           SELECT G.GOODS_CD
+		                                , G.GOODS_SNM
+		                                , UPPER(CONCAT(
+		                                  G.GOODS_CD,';',
+		                                  REPLACE(G.GOODS_NM,' ',''),';',
+		                                  B.BRAND_ENM,';',
+		                                  B.BRAND_KNM,';',
+		                                  B.BRAND_GRP_NM,';',
+		                                  G.STYLE_YEAR,';',
+		                                  FN_GET_CODE_NM('G006',G.SEASON_CD),';',
+		                                  FN_GET_CODE_NM('G007',G.SEX_GB),';',
+		                                  NVL2(D.COLOR_INFO,CONCAT(D.COLOR_INFO,';'),''),
+		                                  REPLACE(I.ITEMKIND_NM,'>',';')
+		                                  )) AS GOODS_SNM_COMP
+		                           FROM TB_GOODS G
+		                           INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		                           LEFT OUTER JOIN TB_ITEMKIND I ON G.ITEMKIND_CD = I.ITEMKIND_CD
+		                           LEFT OUTER JOIN TMP_COLOR_GOODS D ON G.GOODS_CD = D.GOODS_CD
+		                           WHERE G.GOODS_SNM1 IS NULL
+		                            ) Y
+		                        )X
+		                        <![CDATA[
+		                        WHERE X.GOODS_SNM_COMP <> NVL(X.GOODS_SNM,'1')
+		                        ]]>
+		                    ) B
+		SET A.GOODS_SNM = B.GOODS_SNM_COMP
+		WHERE A.GOODS_CD = B.GOODS_CD
+	</update>
+	
+	<!-- 사용자검색어가 있는 상품 조회  -->
+	<select id="getGoodsByGooodsSnm1List"  resultType="Goods">
+		/* TsbGoods.getGoodsByGooodsSnm1List */
+		WITH RECURSIVE TMP_COLOR_GOODS AS (
+		    SELECT Z.GOODS_CD
+		         , REPLACE(CONCAT(GROUP_CONCAT(COLOR_GRP_CD),';',GROUP_CONCAT(COLOR_ENM),';',GROUP_CONCAT(CD_NM)),',',';') AS COLOR_INFO
+		    FROM (
+		        SELECT DISTINCT G.GOODS_CD, C.COLOR_GRP_CD, C.COLOR_ENM, D.CD_NM
+		        FROM TB_GOODS G
+		        LEFT OUTER JOIN TB_OPTION E ON G.GOODS_CD = E.GOODS_CD
+		        LEFT OUTER JOIN TB_COLOR C ON E.OPT_CD1 = C.COLOR_CD
+		                                   AND C.USE_YN= 'Y' 
+		        LEFT OUTER JOIN TB_COMMON_CODE D ON C.COLOR_GRP_CD = D.CD
+		                                   AND D.USE_YN= 'Y' 
+		        WHERE G.GOODS_SNM1 IS NOT NULL
+		        ) Z
+		        GROUP BY Z.GOODS_CD
+		)
+		SELECT G.GOODS_CD
+		     , G.GOODS_SNM1
+		     , UPPER(CONCAT(
+		       G.GOODS_CD,';',
+		       REPLACE(G.GOODS_NM,' ',''),';',
+		       B.BRAND_ENM,';',
+		       B.BRAND_KNM,';',
+		       B.BRAND_GRP_NM,';',
+		       G.STYLE_YEAR,';',
+		       FN_GET_CODE_NM('G006',G.SEASON_CD),';',
+		       FN_GET_CODE_NM('G007',G.SEX_GB),';',
+		       NVL2(D.COLOR_INFO,CONCAT(D.COLOR_INFO,';'),''),
+		       REPLACE(I.ITEMKIND_NM,'>',';')
+		       )) AS GOODS_SNM
+		FROM TB_GOODS G
+		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		LEFT OUTER JOIN TB_ITEMKIND I ON G.ITEMKIND_CD = I.ITEMKIND_CD
+		LEFT OUTER JOIN TMP_COLOR_GOODS D ON G.GOODS_CD = D.GOODS_CD
+		WHERE G.GOODS_SNM1 IS NOT NULL
+	</select>
+	
+	<!--상품 검색어 작업-   -->
+	<update id="updateGoodsSnm" parameterType="Goods">
+		/* TsbGoods.updateGoodsSnm */
+		UPDATE TB_GOODS A
+		SET GOODS_SNM = #{goodsSnm}
+		WHERE GOODS_CD = #{goodsCd}
+	</update>
+		
+	<!-- 상품 혜택가 목록 -->
+	<sql id="getGoodsBenefitList_sql">
+		SELECT GOODS_CD
+		       , 'G100_00' AS CUST_GB
+		       , CURR_PRICE
+		       , MIN(CURR_PRICE - 
+		           ( CASE WHEN DC_WAY = 'G240_10' THEN
+		                 (CASE WHEN NVL(MAX_DC_AMT, 0) >0 AND MAX_DC_AMT <![CDATA[<]]> DC_PVAL THEN MAX_DC_AMT ELSE DC_PVAL END)
+		            ELSE
+		                 (CASE WHEN NVL(MAX_DC_AMT, 0) >0 AND MAX_DC_AMT <![CDATA[<]]> FLOOR((CURR_PRICE * DC_PVAL / 100) / #{pointUnit}) * #{pointUnit} THEN MAX_DC_AMT ELSE FLOOR((CURR_PRICE * DC_PVAL / 100) / #{pointUnit}) * #{pointUnit} END)
+		            END) )AS PC_CURR_PRICE
+		       , MIN(CURR_PRICE - 
+		           ( CASE WHEN DC_WAY = 'G240_10' THEN
+		                 (CASE WHEN NVL(MAX_DC_AMT, 0) >0 AND MAX_DC_AMT <![CDATA[<]]> DC_MVAL THEN MAX_DC_AMT ELSE DC_MVAL END)
+		            ELSE
+		                 (CASE WHEN NVL(MAX_DC_AMT, 0) >0 AND MAX_DC_AMT <![CDATA[<]]> FLOOR((CURR_PRICE * DC_MVAL / 100) / #{pointUnit}) * #{pointUnit} THEN MAX_DC_AMT ELSE FLOOR((CURR_PRICE * DC_MVAL / 100) / #{pointUnit}) * #{pointUnit} END)
+		            END)  )AS MO_CURR_PRICE
+		       , STAFF_CURR_PRICE
+		       , MIN(STAFF_CURR_PRICE - 
+		           ( CASE WHEN DC_WAY = 'V' THEN
+		                 (CASE WHEN NVL(MAX_DC_AMT, 0) >0 AND MAX_DC_AMT <![CDATA[<]]> DC_PVAL THEN MAX_DC_AMT ELSE DC_PVAL END)
+		            ELSE
+		                 (CASE WHEN NVL(MAX_DC_AMT, 0) >0 AND MAX_DC_AMT <![CDATA[<]]> FLOOR((STAFF_CURR_PRICE * DC_PVAL / 100) / #{pointUnit}) * #{pointUnit} THEN MAX_DC_AMT ELSE FLOOR((STAFF_CURR_PRICE * DC_PVAL / 100) / #{pointUnit}) * #{pointUnit} END)
+		            END) )AS STAFF_PC_CURR_PRICE
+		       , MIN(STAFF_CURR_PRICE - 
+		           ( CASE WHEN DC_WAY = 'G240_10' THEN
+		                 (CASE WHEN NVL(MAX_DC_AMT, 0) >0 AND MAX_DC_AMT <![CDATA[<]]> DC_MVAL THEN MAX_DC_AMT ELSE DC_MVAL END)
+		            ELSE
+		                 (CASE WHEN NVL(MAX_DC_AMT, 0) >0 AND MAX_DC_AMT <![CDATA[<]]> FLOOR((STAFF_CURR_PRICE * DC_MVAL / 100) / #{pointUnit}) * #{pointUnit} THEN MAX_DC_AMT ELSE FLOOR((STAFF_CURR_PRICE * DC_MVAL / 100) / #{pointUnit}) * #{pointUnit} END)
+		            END)  )AS STAFF_MO_CURR_PRICE
+		FROM   (
+		        SELECT CP.CPN_ID
+		             , CP.CPN_NM
+		             , CP.DC_WAY                                              /*할인방식*/
+		             , CP.DC_PVAL                                             /*PC 할인값*/
+		             , CP.DC_MVAL                                             /*MO 할인값*/
+		             , CP.MAX_DC_AMT                                          /*최대할인금액*/
+		             , CP.CURR_PRICE                                          /*전체 판매가*/
+		             , CP.CURR_PRICE_YN
+		             , CP.STAFF_CURR_PRICE                                          /*임직원판매가*/
+		             , CP.STAFF_CURR_PRICE_YN
+		             , CP.AVAIL_EDDT
+		             , CP.USABLE_CUST_GB AS CUST_GB
+		             , CP.GOODS_CD
+		        FROM   (
+		                SELECT CP.CPN_ID    /*쿠폰ID*/
+		                     , CP.CPN_NM    /*쿠폰명*/
+		                     , CP.DC_WAY    /*할인방식*/
+		                     , CP.DC_PVAL   /*PC할인값*/
+		                     , CP.DC_MVAL   /*모바일할인값*/
+		                     , CP.MAX_DC_AMT  /*최대할인금액*/
+		                     , G.CURR_PRICE  /*현재판매가*/
+		                     , CASE WHEN BUY_LIMIT_AMT <![CDATA[<=]]> G.CURR_PRICE THEN 'Y'
+		                            ELSE 'N'
+		                            END AS CURR_PRICE_YN
+		                     , G.CURR_PRICE AS STAFF_CURR_PRICE  /*임직원판매가*/
+		                     , CASE WHEN BUY_LIMIT_AMT <![CDATA[<=]]> G.CURR_PRICE THEN 'Y'
+		                            ELSE 'N'
+		                            END AS STAFF_CURR_PRICE_YN
+		                     , IF (CP.PD_GB = 'D', DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S'), CP.AVAIL_EDDT) AS AVAIL_EDDT  
+		                     , CP.USABLE_CUST_GB   /*쿠폰사용이 가능한 고객(G100_00:전체, G100_10:일반회원, G100_20:임직원)*/
+		                     , G.GOODS_CD
+		                FROM   TB_GOODS G
+		                     , TB_COUPON CP
+		                WHERE  CP.SITE_CD = '10'
+		                AND    NOW() <![CDATA[<=]]> IF (CP.PD_GB = 'D', DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S'), CP.AVAIL_EDDT)
+		                AND    NOW() BETWEEN CP.DOWN_STDT AND CP.DOWN_EDDT
+		                AND    CP.DN_GB = 'G058_10' /* 자동다운로드(결제시)다운로드*/
+		                AND    CP.CPN_TYPE = 'G230_10' /*즉시할인쿠폰*/
+		                AND    CP.USABLE_CUST_GB  = #{usableCustGb}
+		                AND    CP.USABLE_CUST_GRADE  = 'G100_00' /* 사용가능고객등급이 일반만*/
+		                AND    CP.BUY_LIMIT_AMT <![CDATA[<=]]> G.CURR_PRICE  /*최소주문금액*/
+		                AND    IF (CP.TOT_PUB_LIMIT_QTY = 0, 9999999999,CP.TOT_PUB_LIMIT_QTY) > (SELECT COUNT(1) FROM TB_CUST_COUPON WHERE CPN_ID = CP.CPN_ID) /*총발행제한수*/
+		                AND   (
+		                        (CP.APPLY_SCOPE = 'A' ) 
+		                        OR  /* 적용대상:상품*/
+		                        (CP.APPLY_SCOPE = 'I' AND (SELECT COUNT(1) FROM TB_COUPON_REFVAL
+		                                                   WHERE CPN_ID = CP.CPN_ID
+		                                                   AND CPN_TARGET = 'G260_10'
+		                                                   AND DEL_YN = 'N'
+		                                                   AND REF_VAL = G.GOODS_CD
+		                                                   ) > 0
+		                        ) 
+		                        /*OR*/ /* 적용대상:카테고리*/
+		                        /*
+		                        (CP.APPLY_SCOPE = 'I' AND (SELECT COUNT(1) FROM TB_COUPON_REFVAL
+		                                                   WHERE CPN_ID = CP.CPN_ID
+		                                                   AND CPN_TARGET = 'G260_11' 
+		                                                   AND DEL_YN = 'N'
+		                                                   AND NVL(REF_FORMAL_GB,G.FORMAL_GB) = G.FORMAL_GB
+		                                                   AND NVL(REF_BRAND_CD,G.BRAND_CD) = G.BRAND_CD
+		                                                   AND REF_VAL IN (SELECT CATE_CD
+		                                                                   FROM TB_CATEGORY_GOODS
+		                                                                   WHERE GOODS_CD = G.GOODS_CD
+		                                                                   )
+		                                                  ) >0
+		                        ) 
+		                        */
+		                        OR /* 적용대상:브랜드*/
+		                        (CP.APPLY_SCOPE = 'I' AND (SELECT COUNT(1) FROM TB_COUPON_REFVAL
+		                                                   WHERE CPN_ID = CP.CPN_ID
+		                                                   AND CPN_TARGET = 'G260_12' 
+		                                                   AND DEL_YN = 'N'
+		                                                   AND REF_VAL = G.BRAND_CD
+		                                                   AND NVL(REF_FORMAL_GB,G.FORMAL_GB) = G.FORMAL_GB
+		                                                  ) >0
+		                        ) 
+		                        OR /* 적용대상:공급업체*/
+		                        (CP.APPLY_SCOPE = 'I' AND (SELECT COUNT(1) FROM TB_COUPON_REFVAL
+		                                                   WHERE CPN_ID = CP.CPN_ID
+		                                                   AND CPN_TARGET = 'G260_13' 
+		                                                   AND DEL_YN = 'N'
+		                                                   AND REF_VAL = G.SUPPLY_COMP_CD
+		                                                   /*AND NVL(REF_FORMAL_GB,G.FORMAL_GB) = G.FORMAL_GB*/
+		                                                  ) >0
+		                        )
+		                      )
+		                AND NOT EXISTS (
+		                                SELECT 1
+		                                FROM   TB_COUPON_REFVAL SCPR
+		                                WHERE  SCPR.CPN_ID = CP.CPN_ID
+		                                AND    SCPR.REF_VAL = G.GOODS_CD
+		                                AND    SCPR.DEL_YN = 'N' /*삭제안된넘*/
+		                                AND    SCPR.CPN_TARGET = '40' /* 제외상품*/
+		                               )
+		                AND NOT EXISTS (
+		                                 SELECT 1
+		                                FROM TB_COUPON_BAN_GOODS
+		                                WHERE GOODS_CD = G.GOODS_CD
+		                                AND DEL_YN = 'N'
+		                               )
+		               ) CP
+		       ) Y
+		GROUP BY GOODS_CD ,CURR_PRICE, STAFF_CURR_PRICE, CUST_GB
+	</sql>
+	
+	<!-- 상품혜택가 temp 테이블 삭제 -->
+	<delete id="deleteGoodsBenefitPriceTemp">
+		/* TsbGoods.deleteGoodsBenefitPriceTemp */
+		TRUNCATE TABLE TB_GOODS_BENEFIT_PRICE_TEMP
+	</delete>
+	
+	
+	<!-- 상품혜택가 temp 적용 등록 -->
+	<insert id="crteateGoodsBenefitPriceTemp"  parameterType="Coupon"  timeout="600">
+		/* TsbGoods.crteateGoodsBenefitPriceTemp */
+		INSERT INTO TB_GOODS_BENEFIT_PRICE_TEMP (
+		     GOODS_CD
+		   , CUST_GB
+		   , CURR_PRICE
+		   , PC_CURR_PRICE
+		   , MO_CURR_PRICE
+		   , STAFF_CURR_PRICE
+		   , STAFF_PC_CURR_PRICE
+		   , STAFF_MO_CURR_PRICE
+		   )
+		    <include refid="getGoodsBenefitList_sql"/>
+	</insert>
+	
+	<!-- 상품혜택가 temp 적용 변경 -->
+	<update id="updateGoodsBenefitPriceTemp"  parameterType="Coupon"  timeout="600">
+		/* TsbGoods.updateGoodsBenefitPriceTemp */
+		INSERT INTO TB_GOODS_BENEFIT_PRICE_TEMP (
+		         GOODS_CD
+		       , CUST_GB
+		       , CURR_PRICE
+		       , PC_CURR_PRICE
+		       , MO_CURR_PRICE
+		       , STAFF_CURR_PRICE
+		       , STAFF_PC_CURR_PRICE
+		       , STAFF_MO_CURR_PRICE
+		       , REG_DT
+		  )
+		  (
+		    SELECT * FROM (
+		       SELECT C.*, NOW() FROM (
+		           <include refid="getGoodsBenefitList_sql"/>
+		       ) C
+		    ) B
+		  )
+		ON DUPLICATE KEY UPDATE
+		     REG_DT = NOW()
+		   , CURR_PRICE = B.CURR_PRICE
+		   , STAFF_CURR_PRICE = B.STAFF_CURR_PRICE
+		    <if test="usableCustGb != null and usableCustGb == 'G100_00'">
+		   , PC_CURR_PRICE = B.PC_CURR_PRICE
+		   , MO_CURR_PRICE = B.MO_CURR_PRICE
+		   , STAFF_PC_CURR_PRICE = B.STAFF_PC_CURR_PRICE
+		   , STAFF_MO_CURR_PRICE = B.STAFF_MO_CURR_PRICE
+		    </if>
+		    <if test="usableCustGb != null and usableCustGb == 'G100_10'">
+		   , PC_CURR_PRICE = IF (TB_GOODS_BENEFIT_PRICE_TEMP.PC_CURR_PRICE >= B.PC_CURR_PRICE, B.PC_CURR_PRICE, TB_GOODS_BENEFIT_PRICE_TEMP.PC_CURR_PRICE)
+		   , MO_CURR_PRICE = IF (TB_GOODS_BENEFIT_PRICE_TEMP.MO_CURR_PRICE >= B.MO_CURR_PRICE, B.MO_CURR_PRICE, TB_GOODS_BENEFIT_PRICE_TEMP.MO_CURR_PRICE)
+		    </if>
+		    <if test="usableCustGb != null and usableCustGb == 'G100_20'">
+		   , STAFF_PC_CURR_PRICE = IF (TB_GOODS_BENEFIT_PRICE_TEMP.STAFF_PC_CURR_PRICE >= B.STAFF_PC_CURR_PRICE, B.STAFF_PC_CURR_PRICE, TB_GOODS_BENEFIT_PRICE_TEMP.STAFF_PC_CURR_PRICE)
+		   , STAFF_MO_CURR_PRICE = IF (TB_GOODS_BENEFIT_PRICE_TEMP.STAFF_MO_CURR_PRICE >= B.STAFF_MO_CURR_PRICE, B.STAFF_MO_CURR_PRICE, TB_GOODS_BENEFIT_PRICE_TEMP.STAFF_MO_CURR_PRICE)
+		    </if>
+	</update>
+	
+	<!-- 상품혜택가  테이블 삭제 -->
+	<delete id="deleteGoodsBenefitPrice">
+		/* TsbGoods.deleteGoodsBenefitPrice */
+		DELETE FROM TB_GOODS_BENEFIT_PRICE
+	</delete>
+	
+	<!-- 상품혜택가 생성 -->
+	<insert id="createGoodsBenefitPrice"  timeout="300">
+		/* TsbGoods.createGoodsBenefitPrice */
+		INSERT INTO TB_GOODS_BENEFIT_PRICE
+		    ( GOODS_CD
+		    , CUST_GB
+		    , CURR_PRICE
+		    , PC_CURR_PRICE
+		    , MO_CURR_PRICE
+		    , STAFF_CURR_PRICE
+		    , STAFF_PC_CURR_PRICE
+		    , STAFF_MO_CURR_PRICE
+		    , REG_DT
+		    )
+		SELECT GOODS_CD
+		     , CUST_GB
+		     , CURR_PRICE
+		     , PC_CURR_PRICE
+		     , MO_CURR_PRICE
+		     , STAFF_CURR_PRICE
+		     , STAFF_PC_CURR_PRICE
+		     , STAFF_MO_CURR_PRICE
+		     , NOW()
+		FROM TB_GOODS_BENEFIT_PRICE_TEMP
+	</insert>
+	
+	<!-- 연관상품보기 스코어링 삭제 -->
+	<delete id="deleteGoodsRelate" parameterType="String">
+		/* TsbGoods.deleteGoodsRelate */
+		DELETE FROM TB_RELATE_GOODS
+		WHERE REG_YMD = #{regYmd}
+	</delete>
+
+	<!-- 연관상품보기 스코어링 생성 -->
+	<insert id="createGoodsRelate" parameterType="String">
+		/* TsbGoods.createGoodsRelate */
+		INSERT INTO TB_RELATE_GOODS
+		    ( REG_YMD
+		    , GOODS_CD
+		    , PREV_GOODS_CD
+		    , RELATE_SCORE
+		    , REG_NO
+		    , REG_DT
+		    )
+		SELECT DISTINCT REG_YMD
+		     , GOODS_CD
+		     , PREV_GOODS_CD
+		     , RELATE_SCORE
+		     , 0
+		     , NOW()
+		FROM(
+		    SELECT REG_YMD
+		         , JSESSION_ID
+		         , REG_DT
+		         , GOODS_CD
+		         , PREV_GOODS_CD
+		         , COUNT(*) OVER (PARTITION BY CONCAT(GOODS_CD,PREV_GOODS_CD)  ORDER BY CONCAT(GOODS_CD,PREV_GOODS_CD)) RELATE_SCORE
+		    FROM(
+		         SELECT REG_YMD
+		              , JSESSION_ID
+		              , REG_DT
+		              , GOODS_CD
+		              , PREV_GOODS_CD
+		         FROM (
+		               SELECT DATE_FORMAT(REG_DT,'%Y%m%d') AS REG_YMD
+		                    , JSESSION_ID
+		                    , REG_DT
+		                    , GOODS_CD
+		                    , LAG(GOODS_CD,1) OVER (ORDER BY DATE_FORMAT(REG_DT, '%Y%m%d'),JSESSION_ID,REG_DT) PREV_GOODS_CD
+		               FROM TB_GOODS_VIEW_HST
+		               WHERE REG_DT >= DATE_FORMAT(#{workDt}, '%Y-%m-%d %H:%i:%S') 
+		                <![CDATA[
+		               AND   REG_DT < DATE_FORMAT(DATE_ADD(#{workDt}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		               ]]>
+		              ) A
+		         WHERE GOODS_CD <![CDATA[<>]]> PREV_GOODS_CD
+		         AND PREV_GOODS_CD IS NOT NULL
+		      ) B
+		  ) C
+	</insert>
+	
+	<!--  전시상품 통계 - temp 테이블 삭제 -->
+	<delete id="deleteGoodsSummaryTemp">
+		/* TsbGoods.deleteGoodsSummaryTemp */
+		TRUNCATE TABLE TB_GOODS_SUMMARY_TEMP
+	</delete>
+
+	<!--전시상품 통계 - 판매 -->
+	<insert id="createGoodsSummaryBySale" parameterType="GoodsSummary">
+		/* TsbGoods.createGoodsSummaryBySale */
+		INSERT INTO TB_GOODS_SUMMARY_TEMP (
+		    GOODS_CD
+		  , ${colNm1}
+		  , REG_NO
+		  , REG_DT
+		)
+		(
+		    SELECT *
+		    FROM (
+		        SELECT GOODS_CD
+		              ,SUM(USAC_QTY *  (CASE USAC_GB WHEN '10' THEN 1 ELSE -1 END) ) AS COL_DATA
+		              , 0
+		              , NOW() 
+		        FROM TB_USAC
+		        WHERE MALL_GB = '10'
+		        <if test="fromDay != null and fromDay != ''">
+		        AND OCCUR_DT >= DATE_FORMAT(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -#{fromDay} DAY), '%Y%m%d'), '%Y%m%d%H%i%S')
+		        <![CDATA[
+		        AND OCCUR_DT < DATE_FORMAT(DATE_ADD(DATE_FORMAT(NOW(), '%Y%m%d'), INTERVAL 1 DAY), '%Y%m%d%H%i%S')
+		        ]]>
+		        </if>
+		        GROUP BY GOODS_CD
+		    ) B
+		)
+		ON DUPLICATE KEY UPDATE
+		    ${colNm1} = B.COL_DATA
+	</insert>
+
+	<!--전시상품 통계 - 조회 -->
+	<insert id="createGoodsSummaryByView" parameterType="GoodsSummary">
+		/* TsbGoods.createGoodsSummaryByView */
+		INSERT INTO TB_GOODS_SUMMARY_TEMP (
+		    GOODS_CD
+		  , ${colNm1}
+		  , REG_NO
+		  , REG_DT
+		)
+		(
+		    SELECT *
+		    FROM (
+		       SELECT GOODS_CD
+		             ,COUNT(GOODS_CD) AS COL_DATA
+		             ,0
+		             ,NOW()
+		       FROM TB_GOODS_VIEW_HST
+		       WHERE 1 = 1
+		       AND REG_DT >= DATE_FORMAT(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -#{fromDay} DAY), '%Y%m%d'), '%Y%m%d%H%i%S')
+		       <![CDATA[
+		       AND REG_DT < DATE_FORMAT(DATE_FORMAT(DATE_ADD(DATE_ADD(NOW(), INTERVAL -7 DAY), INTERVAL 7 DAY ), '%Y%m%d'), '%Y%m%d%H%i%S') 
+		       ]]> 
+		       GROUP BY GOODS_CD
+		    ) B
+		)
+		ON DUPLICATE KEY UPDATE
+		    ${colNm1} = B.COL_DATA
+	</insert>
+
+	<!--전시상품 통계 - 상품평 건수 -->
+	<insert id="createGoodsSummaryByReviewCount" parameterType="GoodsSummary">
+		/* TsbGoods.createGoodsSummaryByReviewCount */
+		INSERT INTO TB_GOODS_SUMMARY_TEMP (
+		    GOODS_CD
+		  , ${colNm1}
+		  , REG_NO
+		  , REG_DT
+		)
+		(
+		    SELECT *
+		    FROM (
+		       SELECT GOODS_CD
+		             ,COUNT(GOODS_CD) AS COL_DATA
+		             ,0
+		             ,NOW()
+		       FROM TB_REVIEW
+		       WHERE DISP_YN = 'Y'
+		       AND DEL_YN = 'N'
+		       <if test='photoYn != null and photoYn == "Y"'>
+		       AND SYS_FILE_NM IS NOT NULL
+		       </if>
+		       <if test='photoYn != null and photoYn == "N"'>
+		       AND SYS_FILE_NM IS NULL
+		       </if>
+		       GROUP BY GOODS_CD
+		    ) B
+		)
+		ON DUPLICATE KEY UPDATE
+		    ${colNm1} = B.COL_DATA
+	</insert>
+
+	<!--전시상품 통계 - 상품평 점수 합계 -->
+	<insert id="createGoodsSummaryByReviewSum" parameterType="GoodsSummary">
+		/* TsbGoods.createGoodsSummaryByReviewSum */
+		INSERT INTO TB_GOODS_SUMMARY_TEMP (
+		    GOODS_CD
+		  , ${colNm1}
+		  , REG_NO
+		  , REG_DT
+		)
+		(
+		    SELECT *
+		    FROM (
+		       SELECT GOODS_CD
+		             ,SUM(${reviewColNm})AS COL_DATA
+		             ,0
+		             ,NOW()
+		       FROM TB_REVIEW
+		       WHERE DISP_YN = 'Y'
+		       AND DEL_YN = 'N'
+		       <if test='photoYn != null and photoYn == "Y"'>
+		       AND SYS_FILE_NM IS NOT NULL
+		       </if>
+		       <if test='photoYn != null and photoYn == "N"'>
+		       AND SYS_FILE_NM IS NULL
+		       </if>
+		       GROUP BY GOODS_CD
+		    ) B
+		)
+		ON DUPLICATE KEY UPDATE
+		    ${colNm1} = B.COL_DATA
+	</insert>
+
+	<!--전시상품 통계 - 상품평 스코어합계-->
+	<insert id="createGoodsSummaryByReviewScore" parameterType="GoodsSummary">
+		/* TsbGoods.createGoodsSummaryByReviewScore */
+		INSERT INTO TB_GOODS_SUMMARY_TEMP (
+		    GOODS_CD
+		  , ${colNm1}
+		  , ${colNm2}
+		  , ${colNm3}
+		  , REG_NO
+		  , REG_DT
+		)
+		(
+		    SELECT *
+		    FROM (
+		       SELECT GOODS_CD
+		             ,NVL(SUM(DECODE(${reviewColNm},'1',1,0)),0) AS COL_DATA1
+		             ,NVL(SUM(DECODE(${reviewColNm},'2',1,0)),0) AS COL_DATA2
+		             ,NVL(SUM(DECODE(${reviewColNm},'3',1,0)),0) AS COL_DATA3
+		             ,0
+		             ,NOW()
+		       FROM TB_REVIEW
+		       WHERE DISP_YN = 'Y'
+		       AND DEL_YN = 'N'
+		       <if test='photoYn != null and photoYn == "Y"'>
+		       AND SYS_FILE_NM IS NOT NULL
+		       </if>
+		       <if test='photoYn != null and photoYn == "N"'>
+		       AND SYS_FILE_NM IS NULL
+		       </if>
+		       GROUP BY GOODS_CD
+		    ) B
+		)
+		ON DUPLICATE KEY UPDATE
+		    ${colNm1} = B.COL_DATA1
+		   ,${colNm2} = B.COL_DATA2
+		   ,${colNm3} = B.COL_DATA3
+	</insert>
+
+	<!--전시상품 통계 - 상품문의 -->
+	<insert id="createGoodsSummaryByCounsel" parameterType="GoodsSummary">
+		/* TsbGoods.createGoodsSummaryByCounsel */
+		INSERT INTO TB_GOODS_SUMMARY_TEMP (
+		    GOODS_CD
+		  , GOODS_QNA_CNT
+		  , REG_NO
+		  , REG_DT
+		)
+		(
+		    SELECT *
+		    FROM (
+		       SELECT REL_GOODS_CD
+		             ,COUNT(REL_GOODS_CD) AS COL_DATA
+		             ,0
+		             ,NOW()
+		       FROM TB_COUNSEL
+		       WHERE COUNSEL_TYPE = 'G'
+		       AND REL_GOODS_CD IS NOT NULL
+		       GROUP BY REL_GOODS_CD
+		    ) B
+		)
+		ON DUPLICATE KEY UPDATE
+		    GOODS_QNA_CNT = B.COL_DATA
+	</insert>
+
+	<!--전시상품 통계 - 저장-->
+	<insert id="saveGoodsSummary">
+		/* TsbGoods.saveGoodsSummary */
+		UPDATE TB_GOODS_SUMMARY A, TB_GOODS_SUMMARY_TEMP GS
+		SET  A.SELL_TOT_QTY        = NVL(GS.SELL_TOT_QTY,0)
+		   , A.SELL_WEEK_QTY       = NVL(GS.SELL_WEEK_QTY,0)
+		   , A.SELL_MONTH_QTY      = NVL(GS.SELL_MONTH_QTY,0)
+		   , A.SELL_YDAY_QTY       = NVL(GS.SELL_YDAY_QTY,0)
+		   , A.SELL_DAY15_QTY      = NVL(GS.SELL_DAY15_QTY,0)
+		   , A.READ_NWEEK_CNT      = NVL(GS.READ_NWEEK_CNT,0)
+		   , A.READ_PWEEK_CNT      = NVL(GS.READ_PWEEK_CNT,0)
+		   , A.GOODS_QNA_CNT       = NVL(GS.GOODS_QNA_CNT,0)
+		   , A.REVIEW_REG_CNT      = NVL(GS.REVIEW_REG_CNT,0)
+		   , A.RREVIEW_REG_CNT     = NVL(GS.RREVIEW_REG_CNT,0)
+		   , A.PREVIEW_REG_CNT     = NVL(GS.PREVIEW_REG_CNT,0)
+		   , A.SCORE               = NVL(GS.SCORE,0)
+		   , A.SCORE_SIZE1         = NVL(GS.SCORE_SIZE1,0)
+		   , A.SCORE_SIZE2         = NVL(GS.SCORE_SIZE2,0)
+		   , A.SCORE_SIZE3         = NVL(GS.SCORE_SIZE3,0)
+		   , A.SCORE_COLOR1        = NVL(GS.SCORE_COLOR1,0)
+		   , A.SCORE_COLOR2        = NVL(GS.SCORE_COLOR2,0)
+		   , A.SCORE_COLOR3        = NVL(GS.SCORE_COLOR3,0)
+		   , A.SCORE_FIT1          = NVL(GS.SCORE_FIT1,0)
+		   , A.SCORE_FIT2          = NVL(GS.SCORE_FIT2,0)
+		   , A.SCORE_FIT3          = NVL(GS.SCORE_FIT3,0)
+		   , A.SCORE_THICK1        = NVL(GS.SCORE_THICK1,0)
+		   , A.SCORE_THICK2        = NVL(GS.SCORE_THICK2,0)
+		   , A.SCORE_THICK3        = NVL(GS.SCORE_THICK3,0)
+		   , A.SCORE_WEIGHT1       = NVL(GS.SCORE_WEIGHT1,0)
+		   , A.SCORE_WEIGHT2       = NVL(GS.SCORE_WEIGHT2,0)
+		   , A.SCORE_WEIGHT3       = NVL(GS.SCORE_WEIGHT2,0)
+		   , A.SCORE_BALL1         = NVL(GS.SCORE_BALL1,0)
+		   , A.SCORE_BALL2         = NVL(GS.SCORE_BALL2,0)
+		   , A.SCORE_BALL3         = NVL(GS.SCORE_BALL3,0)
+		   , A.UPD_NO              = 0
+		   , A.UPD_DT              = NOW()
+		WHERE A.GOODS_CD = GS.GOODS_CD
+	</insert>
+	
+	<!--  안전인증대상 상품 조회 -->
+	<select id="getGoodsSafeNoList"   resultType="GoodsSafeNo">
+		/* TsbGoods.getGoodsSafeNoList */
+		SELECT B.GOODS_CD
+		     , B.GOODS_NUM
+		     , A.ITEMKIND_CD 
+		     , C.CERT_NUM 
+		     , C.CERT_STATE
+		     , C.CERT_DIV
+		     , C.CERT_DT 
+		FROM TB_ITEMKIND A
+		INNER JOIN TB_GOODS B ON A.ITEMKIND_CD = B.ITEMKIND_CD AND B.SELF_GOODS_YN = 'Y'  /* 자사상품 */
+		INNER JOIN TB_BRAND D ON B.BRAND_CD = D.BRAND_CD AND D.USE_YN = 'Y'
+		LEFT OUTER JOIN TB_GOODS_SAFE_NO C ON B.GOODS_CD = C.GOODS_CD
+		                                   AND (CERT_NUM IS NULL
+		                                        <![CDATA[
+		                                        OR CERT_DT < DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -5 YEAR), '%Y%m%d')  /*인증유효 5년 경과*/
+		                                        OR CERT_STATE <> '적합'
+		                                        ]]>
+		                                       )
+		WHERE A.NI_CLSF_CD = 'G004_23'  /*고시 유아용품*/
+	</select>
+	
+	<!--  상품 안전인증번호 저장 -->
+	<insert id="saveGoodsSafeNo"  parameterType="GoodsSafeNo">
+		/* TsbGoods.saveGoodsSafeNo */
+		INSERT INTO TB_GOODS_SAFE_NO (
+		    GOODS_CD
+		  , CERT_NUM
+		  , CERT_STATE
+		  , CERT_DIV
+		  , CERT_DT
+		  , REG_NO
+		  , REG_DT
+		  , UPD_NO
+		  , UPD_DT
+		)
+		VALUES (
+		    #{goodsCd}
+		  , #{certNum}
+		  , #{certState}
+		  , #{certDiv}
+		  , #{certDt}
+		  , #{regNo}
+		  , NOW()
+		  , #{updNo}
+		  , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       CERT_NUM = #{certNum}
+		     , CERT_DIV = #{certDiv}
+		     , CERT_STATE = #{certState}
+		     , CERT_DT = #{certDt}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!--실측사이즈 저장-->
+	<insert id="saveGoodsIfMeasurement" parameterType="GoodsIfMeasurement">
+		/* TsbGoods.saveGoodsIfMeasurement */
+		INSERT INTO TB_IF_MEASUREMENT (
+		       SKUCODE
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , TYPECD
+		     , WASHINGMETHOD
+		     , VALUE1
+		     , VALUE2
+		     , VALUE3
+		     , VALUE4
+		     , VALUE5
+		     , MEMO
+		     , DATEINSERTED
+		     , DATELASTMODIFIED
+		     , ISUSE
+		     , USERLASTMODIFIED
+		     , UPD_DT
+		)
+		VALUES(
+		       #{skucode}
+		     , #{productno}
+		     , #{productcode}
+		     , #{typecd}
+		     , #{washingmethod}
+		     , NVL(#{value1},0)
+		     , NVL(#{value2},0)
+		     , NVL(#{value3},0)
+		     , NVL(#{value4},0)
+		     , NVL(#{value5},0)
+		     , #{memo}
+		     , DATE_FORMAT(#{dateinserted}, '%Y-%m-%d %H:%i:%S')
+		     , DATE_FORMAT(#{datelastmodified}, '%Y-%m-%d %H:%i:%S')
+		     , NVL(#{isuse},'1')
+		     , #{userlastmodified}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       WASHINGMETHOD = #{washingmethod}
+		     , VALUE1 = NVL(#{value1},0)
+		     , VALUE2 = NVL(#{value2},0)
+		     , VALUE3 = NVL(#{value3},0)
+		     , VALUE4 = NVL(#{value4},0)
+		     , VALUE5 = NVL(#{value5},0)
+		     , MEMO = #{memo}
+		     , DATEINSERTED = DATE_FORMAT(#{dateinserted}, '%Y-%m-%d %H:%i:%S')
+		     , DATELASTMODIFIED = DATE_FORMAT(#{datelastmodified}, '%Y-%m-%d %H:%i:%S')
+		     , ISUSE = NVL(#{isuse},'1')
+		     , USERLASTMODIFIED = #{userlastmodified}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!--입고 저장-->
+	<insert id="saveGoodsIfIncomelot" parameterType="GoodsIfIncomelot">
+		/* TsbGoods.saveGoodsIfIncomelot */
+		INSERT INTO TB_IF_INCOMELOT (
+		       LOTNO
+		     , PURCHASENO
+		     , PROVIDERNO
+		     , PROVIDERNAME
+		     , BRANDNO
+		     , BRANDNAME
+		     , DATEINCOME
+		     , UPD_DT
+		)
+		VALUES (
+		       #{lotno}
+		     , #{purchaseno}
+		     , #{providerno}
+		     , #{providername}
+		     , #{brandno}
+		     , #{brandname}
+		     , DATE_FORMAT(#{dateincome}, '%Y-%m-%d %H:%i:%S')
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       PURCHASENO = #{purchaseno}
+		     , PROVIDERNO = #{providerno}
+		     , PROVIDERNAME = #{providername}
+		     , BRANDNO = #{brandno}
+		     , BRANDNAME = #{brandname}
+		     , DATEINCOME = DATE_FORMAT(#{dateincome}, '%Y-%m-%d %H:%i:%S')
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!--입고상품 저장-->
+	<insert id="saveGoodsIfIncomelotitem" parameterType="GoodsIfIncomelotitem">
+		/* TsbGoods.saveGoodsIfIncomelotitem */
+		INSERT INTO TB_IF_INCOMELOTITEM (
+		       LOTNO
+		     , ITEMNO
+		     , WMSITEMNO
+		     , DATEINCOME
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , PRODUCTNAME
+		     , SKUCODE
+		     , NORMALQTY
+		     , BROKENQTY
+		     , TOTALQTY
+		     , MODELNO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{lotno}
+		     , #{itemno}
+		     , #{wmsitemno}
+		     , DATE_FORMAT(#{dateincome}, '%Y-%m-%d %H:%i:%S')
+		     , #{productno}
+		     , #{productcode}
+		     , #{productname}
+		     , #{skucode}
+		     , #{normalqty}
+		     , #{brokenqty}
+		     , #{totalqty}
+		     , #{modelno}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       WMSITEMNO = #{wmsitemno}
+		     , DATEINCOME = DATE_FORMAT(#{dateincome}, '%Y-%m-%d %H:%i:%S')
+		     , PRODUCTNO = #{productno}
+		     , PRODUCTCODE = #{productcode}
+		     , PRODUCTNAME = #{productname}
+		     , SKUCODE = #{skucode}
+		     , NORMALQTY = #{normalqty}
+		     , BROKENQTY = #{brokenqty}
+		     , TOTALQTY = #{totalqty}
+		     , MODELNO = #{modelno}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!--WMS 상품 저장-->
+	<insert id="saveWmsGoods" parameterType="GoodsIfIncomelot" >
+		/* TsbGoods.saveWmsGoods */
+		INSERT INTO TB_WMS_GOODS (
+		       PRODUCT_NO 
+		     , PRODUCT_CODE 
+		     , PRODUCT_NAME 
+		     , MODEL_NO 
+		     , PROVIDER_NO
+		     , PROVIDER_NAME
+		     , BRAND_NO
+		     , BRAND_NAME
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT 
+		)
+		SELECT B.PRODUCTNO 
+		     , B.PRODUCTCODE 
+		     , B.PRODUCTNAME 
+		     , LEFT(B.MODELNO,10) AS MODELNO 
+		     , A.PROVIDERNO
+		     , A.PROVIDERNAME
+		     , A.BRANDNO
+		     , A.BRANDNAME 
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		FROM TB_IF_INCOMELOT  A
+		INNER JOIN TB_IF_INCOMELOTITEM B ON A.LOTNO = B.LOTNO 
+		WHERE 1 = 1
+		<choose>
+		    <when test='jobdate != null and jobdate != ""'>
+		AND A.DATEINCOME >= DATE_FORMAT(DATE_FORMAT(#{jobdate}, '%Y%m%d'), '%Y%m%d%H%i%S') 
+		<![CDATA[
+		AND A.DATEINCOME < DATE_FORMAT(DATE_ADD(DATE_FORMAT(#{jobdate}, '%Y%m%d'), INTERVAL 1 DAY), '%Y%m%d%H%i%S')
+		]]>
+		    </when>
+		    <otherwise>
+		AND A.DATEINCOME >= DATE_FORMAT(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 DAY), '%Y%m%d'), '%Y%m%d%H%i%S') 
+		<![CDATA[
+		AND A.DATEINCOME < DATE_FORMAT(DATE_ADD(DATE_FORMAT(NOW(), '%Y%m%d'), INTERVAL 1 DAY), '%Y%m%d%H%i%S')
+		]]>
+		    </otherwise>
+		</choose>
+		ON DUPLICATE KEY UPDATE
+		       PRODUCT_NAME = IF(GOODS_REG_GB IS NULL, B.PRODUCTNAME, TB_WMS_GOODS.PRODUCT_NAME)
+		     , MODEL_NO = IF(GOODS_REG_GB IS NULL, B.MODELNO, TB_WMS_GOODS.MODEL_NO)
+		     , PROVIDER_NO = IF(GOODS_REG_GB IS NULL, A.PROVIDERNO, TB_WMS_GOODS.PROVIDER_NO)
+		     , PROVIDER_NAME = IF(GOODS_REG_GB IS NULL, A.PROVIDERNAME, TB_WMS_GOODS.PROVIDER_NAME)
+		     , BRAND_NO = IF(GOODS_REG_GB IS NULL, A.BRANDNO, TB_WMS_GOODS.BRAND_NO)
+		     , BRAND_NAME = IF(GOODS_REG_GB IS NULL, A.BRANDNAME, TB_WMS_GOODS.BRAND_NAME)
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 공급업체 목록 -->
+	<select id="getSupplyCompanyList" resultType="IfProvider">
+		/* TsbGoods.getSupplyCompanyList */
+		SELECT PROVIDER_NO AS PROVIDERNO
+		     , SUPPLY_COMP_NM AS PROVIDERNAME
+		     , '' AS CATEGORYTYPECD
+		     , '자사' AS DISTRIBUTIONCD
+		     , CS_CHARGE_NM AS CHARGENAME
+		     , CS_CHARGE_TELNO AS CHARGECELLNUM
+		     , CASE WHEN USE_YN = 'Y' THEN '정상'
+		            ELSE '사용중지' 
+		       END AS STATUSCD
+		     , 'WMS' AS STOCKMGMTTYPECD
+		     , SUPPLY_COMP_CD
+		FROM   TB_SUPPLY_COMPANY 
+		WHERE  DISTRIBUTION_GB  IN ('G065_10', 'G065_11', 'G065_12')  /* 자사 유통구분*/
+		AND UPD_DT >= DATE_FORMAT(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -7 DAY), '%Y%m%d'), '%Y%m%d%H%i%S') 
+		<![CDATA[
+		AND UPD_DT < DATE_FORMAT(DATE_FORMAT(NOW(), '%Y%m%d'), '%Y%m%d%H%i%S')
+		]]>
+	</select>
+	
+	<!-- 브랜드 목록 -->
+	<select id="getBrandList" resultType="IfBrand">
+		/* TsbGoods.getBrandList */
+		SELECT A.BRAND_NO AS BRANDNO
+		     , A.BRAND_ENM AS BRANDNAME
+		     , CASE WHEN A.USE_YN = 'Y' THEN '정상'
+		            ELSE '사용안함' 
+		       END AS STATUSCD
+		     , A.BRAND_CD
+		     , A.SUPPLY_COMP_CD
+		     , B.PROVIDER_NO
+		FROM   TB_BRAND A
+		INNER JOIN TB_SUPPLY_COMPANY B ON A.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD
+		WHERE  A.SELF_YN  = 'Y'  /* 자사 */
+		AND A.UPD_DT >= DATE_FORMAT(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -7 DAY), '%Y%m%d'), '%Y%m%d%H%i%S') 
+		<![CDATA[
+		AND A.UPD_DT < DATE_FORMAT(DATE_FORMAT(NOW(), '%Y%m%d'), '%Y%m%d%H%i%S')
+		]]>
+	</select>
+	
+	<!-- 상품 목록 -->
+	<select id="getGoodsList" resultType="IfProduct">
+		/* TsbGoods.getGoodsList */
+		SELECT G.PRODUCT_NO AS PRODUCTNO
+		     , G.PRODUCT_CODE AS PRODUCTCODE
+		     , G.GOODS_NM AS PRODUCTNAME
+		     , B.BRAND_NO AS BRANDNO
+		     , B.BRAND_ENM AS BRANDNAME
+		     , C.PROVIDER_NO AS PROVIDERNO
+		     , (CASE G.GOODS_STAT WHEN 'G008_20' THEN '승인보류' 
+		                         WHEN 'G008_40' THEN '승인대기' 
+		                         WHEN 'G008_70' THEN '품절'
+		                         WHEN 'G008_99' THEN '삭제'
+		                         WHEN 'G008_95' THEN '판매중지'
+		                         ELSE '판매중'
+		        END) AS STATUSCD
+		     , G.SUPPLY_GOODS_CD AS VENDORPRODUCTCODE
+		     , G.GOODS_CD
+		     , G.BRAND_CD
+		     , G.SUPPLY_COMP_CD
+		     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG  WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = G.MAIN_COLOR_CD AND DEFAULT_IMG_YN = 'Y' ) AS SYS_IMG_NM
+		FROM   TB_GOODS G
+		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		INNER JOIN TB_SUPPLY_COMPANY C ON G.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD
+		WHERE  G.SELF_GOODS_YN  = 'Y'  /* 자사 */
+		AND G.UPD_DT >= DATE_FORMAT(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 DAY), '%Y%m%d'), '%Y%m%d%H%i%S') 
+		<![CDATA[
+		AND G.UPD_DT < DATE_FORMAT(DATE_FORMAT(NOW(), '%Y%m%d'), '%Y%m%d%H%i%S')
+		]]>
+	</select>
+	
+	<!-- TB_IF_PRODUCTSKU_TEMP 삭제 -->
+	<delete id="deleteIfProductSku"  timeout="300">
+		/* TsbGoods.deleteIfProductSku */
+		DELETE FROM TB_IF_PRODUCTSKU
+	</delete>
+	
+	<!-- TB_IF_PRODUCTSKU_TEMP 저장 -->
+	<insert id="createIfProductSku"  parameterType="java.util.HashMap" >
+		/* 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
+		<foreach collection="productSukList" item="item" index="index"  separator=",">
+		(
+		       #{item.skucode}
+		     , #{item.skumodelno}
+		     , #{item.productno}
+		     , #{item.productcode}
+		     , #{item.option1}
+		     , #{item.option2}
+		     , #{item.option3}
+		     , #{item.sellingstockamount}
+		     , #{item.sellingstocktypecd}
+		     , #{item.limitstockamount}
+		     , #{item.vendorskumodelno}
+		     , #{item.vendorskucode}
+		     , #{item.isvirtualstock}
+		     , #{item.datevirtualstock}
+		     , #{item.skucode88}
+		     , NOW()
+		)
+		</foreach>
+		
+	</insert>
+	
+	<!-- TB_IF_PRODUCTSKU_TEMP 저장 -->
+	<insert id="createIfProductSkuByRow"  parameterType="IfProduct">
+		/* TsbGoods.createIfProductSkuByRow */
+		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 FROM 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>
+	
+	<!-- WMS 재고 임시 테이블 삭제 -->
+	<delete id="deleteTbOptionSyncTemp"   timeout="300">
+		/* TsbGoods.deleteTbOptionSyncTemp */
+		DELETE FROM TB_OPTION_SYNC_TEMP
+	</delete>
+
+	<!--WMS 재고 임시 테이블 이관  -->
+	<insert id="createTbOptionSyncTemp"   timeout="300">
+		/* 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_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
+		     , CURR_STOCK_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 GOODS_CD
+		           , OPT_CD
+		           , OPT_CD1
+		           , OPT_CD2
+		           , SKU_MODEL_NO
+		           , PRODUCT_NO
+		           , PRODUCT_CODE
+		           , SUM(CURR_STOCK_QTY) AS CURR_STOCK_QTY
+		           , NVL((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(B.PRODUCT_NO) AS PRODUCT_NO
+		                , MAX(B.PRODUCT_CODE) AS PRODUCT_CODE
+		                , ROUND(GREATEST(A.SELLINGSTOCKAMOUNT, 0) * (NVL(D.STOCK_APPL_RATE, 0)/100)) AS CURR_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_GOODS B ON A.PRODUCTCODE = B.PRODUCT_CODE 
+		                                 AND B.SELF_GOODS_YN = 'Y'
+		                                 AND B.GOODS_TYPE = 'N'
+		           INNER JOIN TB_OPTION E ON A.SKUCODE = E.OPT_CD
+		                                  AND A.PRODUCTCODE = E.PRODUCT_CODE
+		           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, ERP_STOCK_LINK_YN
+		      ) Y
+	</insert>
+	
+	<!-- 입점상품 SELL_QTY 목록 조회 -->
+	<select id="getGoodsSelfNoStockList" resultType="Option"   timeout="300">
+		/* TsbGoods.getGoodsSelfNoStockList */
+		SELECT A.GOODS_CD
+		     , A.OPT_CD
+		     , SUM(
+		           (CASE A.SELL_GB WHEN '10' THEN 1
+		                          WHEN '20' THEN 1
+		                          ELSE -1 END) * A.SELL_QTY
+		           ) AS SALE_STOCK_QTY
+		FROM TB_SELL_QTY A
+		   , TB_GOODS B
+		WHERE A.GOODS_CD = B.GOODS_CD
+		AND B.SELF_GOODS_YN = 'N'  -- 입점상품
+		GROUP BY A.GOODS_CD, A.OPT_CD
+	</select>
+	
+	<!-- 상품 옵션/재고 정보 이력생성 -->
+	<insert id="createStockHst" parameterType="Option"   timeout="300">
+		/* TsaGoods.createStockHst */
+		INSERT INTO TB_OPTION_HST 
+		(     OPTION_HST_SQ
+		    , 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
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		)
+		SELECT NULL
+		     , 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
+		     , #{regNo}
+		     , NOW()
+		     , UPD_NO
+		     , UPD_DT
+		FROM TB_OPTION
+		WHERE GOODS_CD = #{goodsCd}
+		AND OPT_CD = #{optCd}
+	</insert>
+	
+	<!-- 상품 재고 정보 저장 -->
+	<update id="updateStock" parameterType="Option"  timeout="300">
+		/* TsbGoods.updateStock */
+		UPDATE TB_STOCK
+		SET CURR_ON_STOCK_QTY = GREATEST(CURR_ON_STOCK_QTY - #{saleStockQty},0)
+		  , UPD_NO = #{updNo}
+		  , UPD_DT = NOW()
+		WHERE GOODS_CD = #{goodsCd}
+		AND OPT_CD = #{optCd}
+	</update>
+	
+	<!-- WMS 재고 임시 테이블 삭제 -->
+	<delete id="deleteGoodsOptionSync"  timeout="300">
+		/* TsbGoods.deleteGoodsOptionSync */
+		TRUNCATE TABLE TB_OPTION_SYNC
+	</delete>
+	
+	<!--TB_OPTION = > TB_OPTION_SYNC 적용 -->
+	<insert id="createGoodsOptionSync"  timeout="300">
+		/* TsbGoods.createGoodsOptionSync */
+		INSERT INTO TB_OPTION_SYNC
+		(
+		       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_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT B.GOODS_CD
+		     , B.OPT_CD
+		     , B.OPT_CD1
+		     , B.OPT_CD2
+		     , B.SKU_MODEL_NO
+		     , B.PRODUCT_NO
+		     , B.PRODUCT_CODE
+		     , B.BASE_STOCK_QTY
+		     , B.CURR_STOCK_QTY
+		     , B.ADD_PRICE
+		     , B.SOLDOUT_YN
+		     , B.DISP_ORD
+		     , B.DISP_YN
+		     , A.ERP_STOCK_LINK_YN
+		     , B.REG_NO
+		     , B.REG_DT
+		     , B.UPD_NO
+		     , B.UPD_DT
+		FROM   TB_GOODS A, TB_OPTION B
+		WHERE  A.GOODS_CD = B.GOODS_CD
+	</insert>
+	
+	<!-- TB_OPTION_SYNC_TEMP => TB_OPTION_SYNC 변경적용-->
+	<insert id="saveGoodsOptionSyncSync"  timeout="300">
+		/* TsbGoods.saveGoodsOptionSyncSync */
+		UPDATE TB_OPTION_SYNC A, (SELECT GOODS_CD
+		                               , OPT_CD
+		                               , CURR_STOCK_QTY
+		                               , ERP_STOCK_LINK_YN
+		                          FROM TB_OPTION_SYNC_TEMP
+		                          WHERE ERP_STOCK_LINK_YN = 'Y'
+		                          ) B
+		SET A.CURR_STOCK_QTY = B.CURR_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
+		]]>
+	</insert>
+	
+	<!-- WMS 임시 테이블에서 실테이블로 변경 -->
+	<insert id="saveGoodsOptionNew"  timeout="300">
+		/* TsbGoods.saveGoodsOptionNew */
+		UPDATE TB_OPTION A, (SELECT GOODS_CD
+		                          , OPT_CD
+		                          , CURR_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.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
+		]]>
+	</insert>
+		
+	<!-- TB_SELL_QTY_TEMP 테이블 삭제 -->
+	<delete id="deleteTtbSellQtyTemp"  timeout="300">
+		/* TsbGoods.deleteTtbSellQtyTemp */
+		TRUNCATE TABLE TB_SELL_QTY_TEMP
+	</delete>
+	
+	<!-- TB_SELL_QTY_TEMP 테이블 삭제 -->
+	<insert id="createTtbSellQtyTemp"  timeout="300">
+		/* TsbGoods.createTtbSellQtyTemp */
+		INSERT INTO TB_SELL_QTY_TEMP (
+		      GOODS_CD
+		    , OPT_CD
+		    , SELL_GB
+		    , ORD_DTL_NO
+		    , ORD_CHG_SQ
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , SELL_QTY
+		    , REG_NO
+		    , REG_DT
+		)
+		SELECT GOODS_CD
+		    , OPT_CD
+		    , SELL_GB
+		    , ORD_DTL_NO
+		    , ORD_CHG_SQ
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , SELL_QTY
+		    , REG_NO
+		    , REG_DT
+		FROM TB_SELL_QTY
+	</insert>
+
+	<!-- 주문적재 테이블 삭제 -->
+	<delete id="deleteSellQty"  timeout="300">
+		/* TsbGoods.deleteSellQty */
+		DELETE FROM TB_SELL_QTY
+	</delete>
+	
+	<!-- TB_SELL_QTY 테이블 생성 -->
+	<insert id="createTtbSellQty"  timeout="300">
+		/* TsbGoods.createTtbSellQty */
+		INSERT INTO TB_SELL_QTY (
+		      GOODS_CD
+		    , OPT_CD
+		    , SELL_GB
+		    , ORD_DTL_NO
+		    , ORD_CHG_SQ
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , SELL_QTY
+		    , REG_NO
+		    , REG_DT
+		)
+		SELECT  GOODS_CD
+		    , OPT_CD
+		    , SELL_GB
+		    , ORD_DTL_NO
+		    , ORD_CHG_SQ
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , SELL_QTY
+		    , REG_NO
+		    , REG_DT
+		FROM TB_SELL_QTY_TEMP
+		WHERE ORD_DTL_NO IN (
+		                     SELECT OD.ORD_DTL_NO
+		                     FROM TB_ORDER_DETAIL OD
+		                        , 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 G.SELF_GOODS_YN ='Y'
+		                    )
+	</insert>
+	
+	<!-- TB_SELL_QTY 테이블 생성 -->
+	<insert id="createTtbSellQtyByOrderDetail"  timeout="300">
+		/* TsbGoods.createTtbSellQtyByOrderDetail */
+		INSERT INTO TB_SELL_QTY (
+		      GOODS_CD
+		    , OPT_CD
+		    , SELL_GB
+		    , ORD_DTL_NO
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , SELL_QTY
+		    , REG_NO
+		    , REG_DT
+		)
+		SELECT ITEM_CD
+		     , OPT_CD
+		     , SELL_GB
+		     , ORD_DTL_NO
+		     , AGENT_ORDER_ID
+		     , EXTMALL_ORDER_ID
+		     , SELL_QTY
+		     , 0
+		     , NOW()
+		FROM (
+		      SELECT ODI.ITEM_CD
+		           , ODI.OPT_CD
+		           , '10' AS SELL_GB -- 주문건
+		           , OD.ORD_DTL_NO
+		           , OD.AGENT_ORDER_ID
+		           , OD.EXTMALL_ORDER_ID
+		           , SUM((OD.ORD_QTY - OD.CNCL_RTN_QTY) * ODI.ITEM_QTY) AS SELL_QTY
+		      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 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
+		WHERE NOT EXISTS (SELECT 1 
+		                  FROM TB_SELL_QTY Y 
+		                  WHERE Y.GOODS_CD = A.ITEM_CD 
+		                  AND Y.OPT_CD = A.OPT_CD
+		                  AND Y.SELL_GB = A.SELL_GB
+		                  AND Y.ORD_DTL_NO = A.ORD_DTL_NO
+		                  )
+	</insert>
+	
+</mapper>

+ 80 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsbMonitoring.xml

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.batch.biz.dao.TsbMonitoringDao">
+	
+	<!-- 알람SMS 생성 -->
+	<insert id="createAlarmSms" parameterType="Alarm">
+		/* TsbMonitoring.createAlarmSms */
+		INSERT INTO SSG_SEND_TRAN_SMS (
+		       FSEQ
+		     , FUSERID
+		     , FSECTIONCODE
+		     , FCAMPCODE
+		     , FMSGTYPE
+		     , FMESSAGE
+		     , FSENDDATE
+		     , FDESTINE
+		     , FCALLBACK
+		)
+		SELECT NULL          AS FSEQ
+		     , #{fuserid}    AS FUSERID
+		     , ''            AS FSECTIONCODE
+		     , ''            AS FCAMPCODE
+		     , '0'           AS FMSGTYPE
+		     , A.ALARM_MSG   AS FMESSAGE
+		     , NOW()         AS FSENDDATE
+		     , AR.CELL_PHNNO AS FDESTINE
+		     , #{fcallback}  AS FCALLBACK
+		FROM   TB_ALARM A
+		     , TB_ALARM_RECEIVER AR
+		WHERE  A.ALARM_ID = AR.ALARM_ID
+		AND    A.ALARM_ID = #{alarmId}
+		AND    A.USE_YN = 'Y'
+		AND    AR.USE_YN = 'Y'
+	</insert>
+	
+	<!-- 1일내 회원가입건수 조회 -->
+	<select id="getJoinCountWithinOneDay" parameterType="String" resultType="int">
+		/* TsbMonitoring.getJoinCountWithinOneDay */
+		SELECT COUNT(*) AS CNT
+		FROM   TB_CUSTOMER
+		WHERE  JOIN_DT <![CDATA[>=]]> DATE_ADD(NOW(), INTERVAL -1 DAY) /*1일내*/
+		AND    SITE_CD = #{siteCd}
+	</select>
+	
+	<!-- 1시간내 로그인건수 조회 -->
+	<select id="getLoginCountWithinOneHour" parameterType="String" resultType="int">
+		/* TsbMonitoring.getLoginCountWithinOneHour */
+		SELECT COUNT(*) AS CNT
+		FROM   TB_LOGIN_HST
+		WHERE  SITE_CD = #{siteCd}
+		AND    LOGIN_DT <![CDATA[>]]> DATE_ADD(NOW(), INTERVAL -1 HOUR) /*1시간내*/
+	</select>
+	
+	<!-- 1시간내 유입건수 조회 -->
+	<select id="getInthrowCountWithinOneHour" parameterType="String" resultType="int">
+		/* TsbMonitoring.getInthrowCountWithinOneHour */
+		SELECT COUNT(*) AS CNT
+		FROM   TB_INFLOW_HST
+		WHERE  INFLOW_DT <![CDATA[>]]> DATE_ADD(NOW(), INTERVAL -1 HOUR) /*1시간내*/
+		AND    SITE_CD = #{siteCd}
+	</select>
+	
+	<!-- 2시간내 결제건수 조회 -->
+	<select id="getPayCountWithinTwoHour" resultType="int">
+		/* TsbMonitoring.getPayCountWithinTwoHour */
+		SELECT COUNT(*) AS CNT
+		FROM   TB_PAYMENT
+		WHERE  PAY_DT <![CDATA[>]]> DATE_ADD(NOW(), INTERVAL -2 HOUR) /*2시간내*/
+		AND    PAY_STAT IN ('00','20','30') --결제대기, 결제성공, 결제완료
+	</select>
+	
+	<!-- 1일내 외부몰주문수집건수 조회 -->
+	<select id="getExtmallOrderCollectionCountWithinOneDay" resultType="int">
+		/* TsbMonitoring.getExtmallOrderCollectionCountWithinOneDay */
+		SELECT COUNT(*) AS CNT
+		FROM   TB_EXTMALL_ORDER_UPLOAD
+		WHERE  REG_DT <![CDATA[>=]]> DATE_ADD(NOW(), INTERVAL -1 DAY) /*1일내*/
+	</select>
+	
+</mapper>

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

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.batch.biz.dao.TsbStatisticsDao">
+	
+	<!-- 사이트 제휴코드 유입집계 -->
+	<insert id="createInflowDaily" parameterType="String">
+		/* TsbStatistics.createInflowDaily */
+		INSERT INTO TB_INFLOW_DAILY (
+		    INFLOW_YMD
+		  , SITE_CD
+		  , AF_LINK_CD
+		  , PC_INFLOW_TCNT
+		  , MOB_INFLOW_TCNT
+		  , AOS_INFLOW_TCNT
+		  , IOS_INFLOW_TCNT
+		  , PC_INFLOW_CNT
+		  , MOB_INFLOW_CNT
+		  , AOS_INFLOW_CNT
+		  , IOS_INFLOW_CNT
+		  , REG_NO
+		  , REG_DT
+		)
+		(
+		SELECT * FROM (
+		       SELECT INFLOW_YMD
+		            , SITE_CD
+		            , AF_LINK_CD
+		            , SUM(CASE WHEN FRONT_GB = 'P' AND APP_YN = 'N' THEN INFLOW_TCNT ELSE 0 END)                   AS PC_INFLOW_TCNT
+		            , SUM(CASE WHEN FRONT_GB = 'M' AND APP_YN = 'N' THEN INFLOW_TCNT ELSE 0 END)                   AS MOB_INFLOW_TCNT
+		            , SUM(CASE WHEN FRONT_GB = 'M' AND APP_YN = 'Y' AND OS_TYPE = 'A' THEN INFLOW_TCNT ELSE 0 END) AS AOS_INFLOW_TCNT
+		            , SUM(CASE WHEN FRONT_GB = 'M' AND APP_YN = 'Y' AND OS_TYPE = 'I' THEN INFLOW_TCNT ELSE 0 END) AS IOS_INFLOW_TCNT
+		            , SUM(CASE WHEN FRONT_GB = 'P' AND APP_YN = 'N' THEN INFLOW_CNT ELSE 0 END)                    AS PC_INFLOW_CNT
+		            , SUM(CASE WHEN FRONT_GB = 'M' AND APP_YN = 'N' THEN INFLOW_CNT ELSE 0 END)                    AS MOB_INFLOW_CNT
+		            , SUM(CASE WHEN FRONT_GB = 'M' AND APP_YN = 'Y' AND OS_TYPE = 'A' THEN INFLOW_CNT ELSE 0 END)  AS AOS_INFLOW_CNT
+		            , SUM(CASE WHEN FRONT_GB = 'M' AND APP_YN = 'Y' AND OS_TYPE = 'I' THEN INFLOW_CNT ELSE 0 END)  AS IOS_INFLOW_CNT
+		            , 0                                                                                            AS REG_NO
+		            , NOW()                                                                                        AS REG_DT
+		       FROM   (
+		               SELECT DATE_FORMAT(INFLOW_DT,'%Y%m%d') AS INFLOW_YMD
+		                    , SITE_CD
+		                    , AF_LINK_CD
+		                    , FRONT_GB
+		                    , APP_YN
+		                    , OS_TYPE
+		                    , COUNT(DISTINCT JSESSION_ID)   AS INFLOW_TCNT
+		                    , COUNT(DISTINCT IP_ADDR)       AS INFLOW_CNT
+		               FROM   TB_INFLOW_HST
+		               WHERE 1 = 1
+		               <if test="inflowDt == 'today'">
+		               AND   INFLOW_DT >= DATE_FORMAT(DATE_FORMAT(NOW(), '%Y%m%d'), '%Y%m%d%H%i%S')
+		               <![CDATA[
+		               AND   INFLOW_DT < DATE_FORMAT(DATE_ADD(DATE_FORMAT(NOW(), '%Y%m%d'), INTERVAL 1 DAY), '%Y%m%d%H%i%S')
+		               ]]>
+		               </if>
+		               <if test="inflowDt == 'yesterday'">
+		               AND   INFLOW_DT >= DATE_FORMAT(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 DAY), '%Y%m%d'), '%Y%m%d%H%i%S')
+		               <![CDATA[
+		               AND   INFLOW_DT < DATE_FORMAT(DATE_ADD(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 DAY), '%Y%m%d'), INTERVAL 1 DAY), '%Y%m%d%H%i%S')
+		               ]]>
+		               </if>
+		               GROUP  BY DATE_FORMAT(INFLOW_DT,'%Y%m%d'), AF_LINK_CD, SITE_CD, FRONT_GB, APP_YN, OS_TYPE
+		              ) Z
+		       GROUP  BY INFLOW_YMD, AF_LINK_CD, SITE_CD
+		      ) B 
+		)
+		ON DUPLICATE KEY UPDATE
+		   PC_INFLOW_TCNT  = B.PC_INFLOW_TCNT
+		 , MOB_INFLOW_TCNT = B.MOB_INFLOW_TCNT
+		 , AOS_INFLOW_TCNT = B.AOS_INFLOW_TCNT
+		 , IOS_INFLOW_TCNT = B.IOS_INFLOW_TCNT
+		 , PC_INFLOW_CNT   = B.PC_INFLOW_CNT
+		 , MOB_INFLOW_CNT  = B.MOB_INFLOW_CNT
+		 , AOS_INFLOW_CNT  = B.AOS_INFLOW_CNT
+		 , IOS_INFLOW_CNT  = B.IOS_INFLOW_CNT
+		 , REG_NO          = B.REG_NO
+		 , REG_DT          = B.REG_DT
+	</insert>
+		
+</mapper>

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

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.batch.biz.dao.TsbWmsDeliveryDao">
+	
+	<!-- WMS 총알배송 권역정보 생성 1  
+	<select id="uspWmsDailyTmlInfoE10" statementType="CALLABLE" parameterType="Delivery" resultType="Delivery"  >
+		/* TsbDelivery.saveOrderDeliveryLocAssign   */
+		{ CALL USP_WMS_DailyTmlInfo_E10( '14', #{rtnCd, mode=OUT, jdbcType=INT, javaType=integer}, #{rtnMsg, mode=OUT, jdbcType=NVARCHAR, javaType=String}) }
+	</select>
+	-->
+	<!-- WMS 총알배송 권역정보 생성 2  
+	<select id="uspWmsDailyTmlInfoE20" statementType="CALLABLE" parameterType="Delivery" resultType="Delivery"  >
+		/* TsbDelivery.saveOrderDeliveryLocAssign   */
+		{ CALL USP_WMS_DailyTmlInfo_E10( '14', #{rtnCd, mode=OUT, jdbcType=INT, javaType=integer}, #{rtnMsg, mode=OUT, jdbcType=NVARCHAR, javaType=String}) }
+	</select>	
+	-->
+	
+	<!-- WMS_IF 총알배송 권역정보 조회   -->	
+	<select id="getWmsIfDailyDeliveryZoneList" resultType="Delivery">
+	/*TsbWmsDelivery.getWmsIfDailyDeliveryZoneList*/
+		SELECT
+			  ZIP_NO	
+			, PND_BRAN	
+			, PND_BRAN_NM	
+			, OPER_ABOVE_BRAN	
+			, TR_BRAN_NM	
+			, CITY_DO	
+			, GU_GUN	
+			, DONG_YUP_MEUN	
+			, DELIVERY_TIME	
+			, DELIVERY_PROBABILITY	
+			, DELIVERYCLASSCD	 
+			, CASE WHEN ISUSE = 0 THEN 'Y' ELSE 'N' END AS ISUSE
+
+		FROM TB_IF_DAILYDELIVERYZONE
+	   WHERE ISUSE = 0
+	/*	WHERE DATELASTUPDATE > CONVERT(datetime,'20200311'+' 00:00:00') */
+	</select>
+	
+</mapper>

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

@@ -0,0 +1,237 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.batch.biz.dao.TsbWmsGoodsDao">
+	
+	<!-- wms 실측 사이즈 목록   -->
+	<select id="getWmsMeasurementList"  resultType="GoodsIfMeasurement">
+		/* TsbWmsGoods.getWmsMeasurementList */
+		SELECT SKUCODE
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , TYPECD
+		     , WASHINGMETHOD
+		     , VALUE1
+		     , VALUE2
+		     , VALUE3
+		     , VALUE4
+		     , VALUE5
+		     , MEMO
+		     , CONVERT(CHAR(19),DATEINSERTED,120) AS DATEINSERTED  /* yyyy-mm-dd hh:mi:ss */
+		     , CONVERT(CHAR(19),DATELASTMODIFIED,120) AS DATELASTMODIFIED 
+		     , ISUSE
+		     , USERLASTMODIFIED
+		FROM TB_IF_MEASUREMENT
+		WHERE 1 = 1 
+		<choose>
+		    <when test='jobdate != null and jobdate != ""'>
+		AND CONVERT(CHAR(8),DATELASTMODIFIED,112) = #{jobdate}
+		    </when>
+		    <otherwise>
+		AND CONVERT(CHAR(8),DATELASTMODIFIED,112) = CONVERT(CHAR(8),DATEADD(day,-1, GETDATE()),112)
+		    </otherwise>
+		</choose>
+	</select>
+	
+	<!-- wms 입고 목록   -->
+	<select id="getWmsIncomelotList"  parameterType="String" resultType="GoodsIfIncomelot">
+		/* TsbWmsGoods.getWmsIncomelotList */
+		SELECT LOTNO
+		     , PURCHASENO
+		     , PROVIDERNO
+		     , PROVIDERNAME
+		     , BRANDNO
+		     , BRANDNAME
+		     , CONVERT(CHAR(19),DATEINCOME,120) AS DATEINCOME  /* yyyy-mm-dd hh:mi:ss */
+		FROM TB_IF_INCOMELOT
+		WHERE 1 = 1 
+		<choose>
+		    <when test='jobdate != null and jobdate != ""'>
+		AND CONVERT(CHAR(8),DATEINCOME,112) = #{jobdate}
+		    </when>
+		    <otherwise>
+		AND CONVERT(CHAR(8),DATEINCOME,112) = CONVERT(CHAR(8),DATEADD(day,-1, GETDATE()),112)
+		    </otherwise>
+		</choose>
+	</select>
+	
+	<!-- wms 입고 상품목록   -->
+	<select id="getWmsIncomelotitemList" parameterType="String"  resultType="GoodsIfIncomelotitem">
+		/* TsbWmsGoods.getWmsIncomelotitemList */
+		SELECT LOTNO
+		     , ITEMNO
+		     , WMSITEMNO
+		     , CONVERT(CHAR(19),DATEINCOME,120) AS DATEINCOME  /* yyyy-mm-dd hh:mi:ss */
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , PRODUCTNAME
+		     , SKUCODE
+		     , NORMALQTY
+		     , BROKENQTY
+		     , TOTALQTY
+		     , MODELNO
+		FROM TB_IF_INCOMELOTITEM
+		WHERE 1 = 1 
+		<choose>
+		    <when test='jobdate != null and jobdate != ""'>
+		AND CONVERT(CHAR(8),DATEINCOME,112) = #{jobdate}
+		    </when>
+		    <otherwise>
+		AND CONVERT(CHAR(8),DATEINCOME,112) = CONVERT(CHAR(8),DATEADD(day,-1, GETDATE()),112)
+		    </otherwise>
+		</choose>
+	</select>
+
+	<!--WMS 업체정보 송신-->
+	<insert id="saveWmsProvider" parameterType="IfProvider" >
+		/* TsbWmsGoods.saveWmsProvider */
+		SET IDENTITY_INSERT test.dbo.TB_IF_Provider ON
+		MERGE TB_IF_PROVIDER 
+		      USING (SELECT 'AA' AS DUAL) AS B
+		         ON (PROVIDERNO = #{providerno})
+		      WHEN MATCHED THEN
+		           UPDATE SET
+		                   PROVIDERNAME = #{providername}
+		                 , CATEGORYTYPECD = #{categorytypecd}
+		                 , DISTRIBUTIONCD = #{distributioncd}
+		                 , CHARGENAME = #{chargename}
+		                 , CHARGECELLNUM = #{chargecellnum}
+		                 , STATUSCD = #{statuscd}
+		                 , STOCKMGMTTYPECD = #{stockmgmttypecd}
+		                 , SUPPLY_COMP_CD = #{supplyCompCd}
+		                 , DATElASTMODIFIED = GETDATE()
+		      WHEN NOT MATCHED THEN
+		           INSERT (
+		                   PROVIDERNO
+		                 , VENDORNO  
+		                 , PROVIDERNAME
+		                 , CATEGORYTYPECD
+		                 , DISTRIBUTIONCD
+		                 , CHARGENAME
+		                 , CHARGECELLNUM
+		                 , STATUSCD
+		                 , STOCKMGMTTYPECD
+		                 , SUPPLY_COMP_CD
+		                 , DATECREATED
+		                 , DATElASTMODIFIED
+		           )
+		           VALUES (
+		                  #{providerno}
+		                , #{vendorno}
+		                , #{providername}
+		                , #{categorytypecd}
+		                , #{distributioncd}
+		                , #{chargename}
+		                , #{statuscd}
+		                , #{chargecellnum}
+		                , #{stockmgmttypecd}
+		                , #{dateLastmodified}
+		                , GETDATE()
+		                , GETDATE()
+		           );
+		SET IDENTITY_INSERT test.dbo.TB_IF_Provider OFF
+	</insert>
+	
+	<!--WMS 브랜드정보 송신-->
+	<insert id="saveWmsBrand" parameterType="IfBrand" >
+		/* TsbWmsGoods.saveWmsBrand */
+		SET IDENTITY_INSERT test.dbo.TB_IF_BRAND ON
+		MERGE TB_IF_BRAND 
+		      USING (SELECT 'AA' AS DUAL) AS B
+		         ON (BRANDNO = #{brandno})
+		      WHEN MATCHED THEN
+		           UPDATE SET
+		                   BRANDNAME = #{brandname}
+		                 , STATUSCD = #{statuscd}
+		                 , BRAND_CD = #{brandCd}
+		                 , DATEUPDATEED = GETDATE()
+		      WHEN NOT MATCHED THEN
+		           INSERT (
+		                   BRANDNO
+		                 , BRANDNAME
+		                 , STATUSCD
+		                 , BRAND_CD
+		                 , DATECREATED
+		                 , DATEUPDATEED
+		           )
+		           VALUES (
+		                  #{brandno}
+		                , #{brandname}
+		                , #{statuscd}
+		                , #{brandCd}
+		                , GETDATE()
+		                , GETDATE()
+		           );
+		SET IDENTITY_INSERT test.dbo.TB_IF_BRAND OFF
+	</insert>
+	
+	<!--WMS 브랜드업체관계정보 송신-->
+	<insert id="saveWmsBrandProviderXref" parameterType="IfBrand" >
+		/* TsbWmsGoods.saveWmsBrandProviderXref */
+		MERGE TB_IF_BRANDPROVIDERXREF 
+		      USING (SELECT 'AA' AS DUAL) AS B
+		         ON (BRANDNO = #{brandno})
+		      WHEN MATCHED THEN
+		           UPDATE SET
+		                   PROVIDERNO = #{providerNo}
+		                 , BRAND_CD = #{brandCd}
+		                 , SUPPLY_COMP_CD = #{supplyCompCd}
+		                 , DATEUPDATEED = GETDATE()
+		      WHEN NOT MATCHED THEN
+		           INSERT (
+		                   BRANDNO
+		                 , PROVIDERNO
+		                 , BRAND_CD
+		                 , SUPPLY_COMP_CD
+		                 , DATECREATED
+		                 , DATEUPDATEED
+		           )
+		           VALUES (
+		                  #{brandno}
+		                , #{providerNo}
+		                , #{brandCd}
+		                , #{supplyCompCd}
+		                , GETDATE()
+		                , GETDATE()
+		           );
+	</insert>
+	
+	<!--WMS 상품정보 송신-->
+	<update id="saveWmsProduct" parameterType="IfProduct" >
+		/* TsbWmsGoods.saveWmsProduct */
+		UPDATE TB_IF_PRODUCT
+		SET PRODUCTNAME = #{productname}
+		  , BRANDNO = #{brandno}
+		  , BRANDNAME = #{brandname}
+		  , PROVIDERNO = #{providerno}
+		  , STATUSCD = #{statuscd}
+		  , VENDORPRODUCTCODE = #{vendorproductcode}
+		  , GOODS_CD = #{goodsCd}
+		  , BRAND_CD = #{brandCd }
+		  , SUPPLY_COMP_CD = #{supplyCompCd}
+		  , SYS_IMG_NM = #{sysImgNm}
+		  , DATElASTMODIFIED = GETDATE()
+		WHERE PRODUCTCODE = #{productcode}
+	</update>
+	
+	<!-- WMS 재고 테이블 조회   -->
+	<select id="getWmsIfProductSukList"  resultType="IfProductSku">
+		/* TsbWmsGoods.getWmsIfProductSukList */
+		SELECT  top 1000 SKUCODE
+		     , SKUMODELNO
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , OPTION1
+		     , OPTION2
+		     , OPTION3
+		     , SELLINGSTOCKAMOUNT
+		     , SELLINGSTOCKTYPECD
+		     , LIMITSTOCKAMOUNT
+		     , VENDORSKUMODELNO
+		     , VENDORSKUCODE
+		     , ISVIRTUALSTOCK
+		     , DATEVIRTUALSTOCK
+		     , SKUCODE88
+		FROM TB_IF_PRODUCTSKU
+	</select>
+	
+</mapper>

+ 7 - 0
src/main/resources/banner.txt

@@ -0,0 +1,7 @@
+   _____________  ____    _________  __ __     ____        __       __  
+  / ___/_  __/\ \/ / /   / ____/__ \/ // /    / __ )____ _/ /______/ /_ 
+  \__ \ / /    \  / /   / __/  __/ / // /_   / __  / __ `/ __/ ___/ __ \
+ ___/ // /     / / /___/ /___ / __/__  __/  / /_/ / /_/ / /_/ /__/ / / /
+/____//_/     /_/_____/_____//____/ /_/    /_____/\__,_/\__/\___/_/ /_/ 
+                                                                        
+:: (v1.0.0.RELEASE by tsinfotech.co.kr 2020) ::

+ 17 - 0
src/main/resources/config/application-dev.yml

@@ -0,0 +1,17 @@
+spring:
+    profiles:
+        active: dev
+    cache:
+        type: redis
+    redis:
+        lettuce:
+            pool:
+                max-active: 10
+                max-idle: 10
+                min-idle: 2
+        host: localhost
+        port: 6379
+        password: 
+
+logging:
+    config: classpath:log/logback-dev.xml

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

@@ -0,0 +1,66 @@
+spring:
+    profiles:
+        active: locd
+    cache:
+        type: redis
+    redis:
+        lettuce:
+            pool:
+                max-active: 10
+                max-idle: 10
+                min-idle: 2
+        host: localhost
+        port: 6379
+        password: 
+
+logging:
+    config: classpath:log/logback-locd.xml
+
+upload:
+    goods:
+        target.path: /WIDE/workspace/files/data/style24
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png
+        view: //image.wivismall.com/speedy_image-wivismall/goods
+
+# PG
+pg:
+    kcp:
+        cancel.url: http://locd.admin.wivismall.com/pg/nice/cancel
+        escrow.url: http://locd.admin.wivismall.com/pg/nice/escrow
+        merchantId: nictest00m
+        merchantKey: 33F49GnCMS1mFYlGXisbUDzVf2ATWCl9k3R++d5hDd3Frmuos/XLx8XhXpe+LDYAbpGKZYSwtlyyLOtS/8aD7A==
+        log.path: /WIDE/workspace/logs/wivis
+        account.cert.url: https://webapi.nicepay.co.kr/api/checkBankAccountAPI.jsp
+
+# Schedule
+cron:
+    #모니터링
+    monitoring:
+        dayJob: 2 22 2 29 2 ?
+        hourJob: 2 22 2 29 2 ?
+        
+    #상품
+    goods:
+        titlename.reserve: 2 22 2 29 2 ?
+        price.reserve: 2 22 2 29 2 ?
+        search.keyword: 2 22 2 29 2 ?
+        benefit.price: 2 22 2 29 2 ?
+        relate.score: 2 22 2 29 2 ?
+        summary: 2 22 2 29 2 ?
+        infants.safe: 2 22 2 29 2 ?
+        wms.measurement: 2 22 2 29 2 ?
+        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:
+        inflow: 2 22 2 29 2 ?
+        inflow.yesterday: 2 22 2 29 2 ?
+    #배송
+    delivery:
+        # 총알배송 권역정보 갱신 (매일 11시)
+        #tsbDailyDeliveryZoneJob: 0 0 11 * * ?
+        tsbDailyDeliveryZoneJob: 2 22 2 29 2 ?

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

@@ -0,0 +1,18 @@
+spring:
+    profiles:
+        active: locp
+    cache:
+        type: redis
+    redis:
+        lettuce:
+            pool:
+                max-active: 10
+                max-idle: 10
+                min-idle: 2
+        host: localhost
+        port: 6379
+        password: 
+
+logging:
+    config: classpath:log/logback-locp.xml
+

+ 17 - 0
src/main/resources/config/application-run.yml

@@ -0,0 +1,17 @@
+spring:
+    profiles:
+        active: run
+    cache:
+        type: redis
+    redis:
+        lettuce:
+            pool:
+                max-active: 10
+                max-idle: 10
+                min-idle: 2
+        host: localhost
+        port: 6379
+        password: 
+
+logging:
+    config: classpath:log/logback-run.xml

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

@@ -0,0 +1,14 @@
+spring:
+    messages:
+        cache-duration: -1
+        basename: classpath:i18n/messages/message
+        encoding: UTF-8
+    quartz:
+        scheduler-name: ecmsbScheduler
+# quartz.job-store-type을 별도 지정하지 않으면 memory 기반으로 동작하며 어플리케이션 재시작 시 데이터는 사라진다.
+#        job-store-type: jdbc
+#        jdbc.initialize-schema: never
+    batch:
+        job:
+            enabled: false
+            names: ${job.name:NONE}

+ 43 - 0
src/main/resources/log/logback-dev.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<configuration scan="true">
+	<property name="LOG_HOME" value="/home/app/logs/batch"/>
+	<property name="LOG_LEVEL" value="INFO"/>
+	
+	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<charset>utf-8</charset>
+			<pattern>[%d] [%thread] %-5level %logger{32} : %msg%n</pattern>
+		</encoder>
+	</appender>
+	
+	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${LOG_HOME}/style24_batch.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${LOG_HOME}/style24_batch.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+			<!-- keep 60 days' worth of history -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<charset>utf-8</charset>
+			<pattern>[%d] %-5level %logger{32} : %msg%n</pattern>
+		</encoder>
+	</appender>
+
+	<logger name="org.springframework" level="ERROR"/>
+	
+	<!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. -->
+	<logger name="jdbc.sqltiming" level="INFO" additivity="false">
+		<appender-ref ref="CONSOLE"/>
+	</logger>
+	
+	<!-- <logger name="com.wivismall.batch.biz" level="${LOG_LEVEL}" additivity="false">
+		<appender-ref ref="FILE"/>
+	</logger> -->
+	
+	<root level="${LOG_LEVEL}">
+		<appender-ref ref="CONSOLE"/>
+		<appender-ref ref="FILE"/>
+	</root>
+
+</configuration>

+ 59 - 0
src/main/resources/log/logback-locd.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<configuration scan="true">
+	<property name="LOG_HOME" value="/WIDE/workspace/logs/style24"/>
+	<property name="LOG_LEVEL" value="INFO"/>
+	
+	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<charset>utf-8</charset>
+			<pattern>[%d] [%thread] %-5level %logger{32} : %msg%n</pattern>
+		</encoder>
+	</appender>
+	
+	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${LOG_HOME}/style24_batch.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${LOG_HOME}/style24_batch.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+			<!-- keep 60 days' worth of history -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<charset>utf-8</charset>
+			<pattern>[%d] %-5level %logger{32} : %msg%n</pattern>
+		</encoder>
+	</appender>
+	
+	<logger name="org.springframework" level="ERROR"/>
+	
+	<!-- SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다. -->
+	<logger name="jdbc.sqlonly" level="${LOG_LEVEL}">
+		<appender-ref ref="CONSOLE"/>
+	</logger>
+	
+	<!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. -->
+	<logger name="jdbc.sqltiming" level="${LOG_LEVEL}">
+		<appender-ref ref="CONSOLE"/>
+	</logger>
+	
+	<!-- ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. -->
+	<!-- 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다. -->
+	<!-- <logger name="jdbc.audit" level="ERROR">
+		<appender-ref ref="CONSOLE"/>
+	</logger> -->
+	
+	<!-- ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다. -->
+	<!-- <logger name="jdbc.resultset" level="ERROR">
+		<appender-ref ref="CONSOLE"/>
+	</logger> -->
+	
+	<!-- <logger name="com.wivismall.batch.biz" level="${LOG_LEVEL}" additivity="false">
+		<appender-ref ref="FILE"/>
+	</logger> -->
+
+	<root level="${LOG_LEVEL}">
+		<appender-ref ref="CONSOLE"/>
+		<appender-ref ref="FILE"/>
+	</root>
+
+</configuration>

+ 59 - 0
src/main/resources/log/logback-locp.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<configuration scan="true">
+	<property name="LOG_HOME" value="/WIDE/workspace/logs/style24"/>
+	<property name="LOG_LEVEL" value="INFO"/>
+	
+	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<charset>utf-8</charset>
+			<pattern>[%d] [%thread] %-5level %logger{32} : %msg%n</pattern>
+		</encoder>
+	</appender>
+	
+	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${LOG_HOME}/style24_batch.log</file>
+		<encoder>
+			<charset>utf-8</charset>
+			<pattern>[%d] [%thread] %-5level %logger{32} : %msg%n</pattern>
+		</encoder>
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${LOG_HOME}/style24_batch.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+			<!-- keep 60 days' worth of history -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+	</appender>
+	
+	<logger name="org.springframework" level="ERROR"/>
+	
+	<!-- SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다. -->
+	<!-- <logger name="jdbc.sqlonly" level="${LOG_LEVEL}">
+		<appender-ref ref="CONSOLE"/>
+	</logger> -->
+	
+	<!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. -->
+	<!-- <logger name="jdbc.sqltiming" level="${LOG_LEVEL}">
+		<appender-ref ref="CONSOLE"/>
+	</logger> -->
+	
+	<!-- ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. -->
+	<!-- 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다. -->
+	<!-- <logger name="jdbc.audit" level="ERROR">
+		<appender-ref ref="CONSOLE"/>
+	</logger> -->
+	
+	<!-- ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다. -->
+	<!-- <logger name="jdbc.resultset" level="ERROR">
+		<appender-ref ref="CONSOLE"/>
+	</logger> -->
+	
+	<!-- <logger name="com.wivismall.batch.biz" level="${LOG_LEVEL}" additivity="false">
+		<appender-ref ref="FILE"/>
+	</logger> -->
+
+	<root level="${LOG_LEVEL}">
+		<appender-ref ref="CONSOLE"/>
+		<appender-ref ref="FILE"/>
+	</root>
+
+</configuration>

+ 43 - 0
src/main/resources/log/logback-run.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<configuration scan="true">
+	<property name="LOG_HOME" value="/home/app/logs/batch"/>
+	<property name="LOG_LEVEL" value="INFO"/>
+	
+	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<charset>utf-8</charset>
+			<pattern>[%d] [%thread] %-5level %logger{32} : %msg%n</pattern>
+		</encoder>
+	</appender>
+	
+	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${LOG_HOME}/style24_batch.log</file>
+		<encoder>
+			<charset>utf-8</charset>
+			<pattern>[%d] [%thread] %-5level %logger{32} : %msg%n</pattern>
+		</encoder>
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${LOG_HOME}/style24_batch.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+			<!-- keep 30 days' worth of history -->
+			<maxHistory>30</maxHistory>
+		</rollingPolicy>
+	</appender>
+
+	<logger name="org.springframework" level="ERROR"/>
+	
+	<!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. -->
+	<logger name="jdbc.sqltiming" level="INFO" additivity="false">
+		<appender-ref ref="CONSOLE"/>
+	</logger>
+	
+	<!-- <logger name="com.wivismall.batch.biz" level="${LOG_LEVEL}" additivity="false">
+		<appender-ref ref="FILE"/>
+	</logger> -->
+	
+	<root level="${LOG_LEVEL}">
+		<appender-ref ref="CONSOLE"/>
+		<appender-ref ref="FILE"/>
+	</root>
+
+</configuration>

+ 24 - 0
src/main/resources/persistence/mybatis-shop-config.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "HTTP://mybatis.org/dtd/mybatis-3-config.dtd">
+
+<configuration>
+
+	<settings>
+		<setting name="cacheEnabled" value="false" /> <!-- 설정에서 각 매퍼에 설정된 캐시를 전역적으로 사용할지 말지에 대한 여부 (default true)-->
+		<!-- <setting name="lazyLoadingEnabled" value="true" /> --> <!-- 지연로딩을 사용할지에 대한 여부. 사용하지 않는다면 모두 즉시 로딩 (default true) -->
+		<!-- <setting name="multipleResultSetsEnabled" value="true" /> --> <!-- 한개의 구문에서 여러개의 ResultSet을 허용할지의 여부 (default true) -->
+		<setting name="useGeneratedKeys" value="true" /> <!-- 생성키를 강제로 생성 (default false) -->
+		<setting name="defaultExecutorType" value="REUSE" /> <!-- 디폴트 실행자(executor) 설정. PreparedStatement를 재사용 (default SIMPLE)-->
+		<setting name="defaultStatementTimeout" value="25" /> <!-- 데이터베이스로의 응답을 얼마나 오래 기다릴지를 판단하는 타임아웃(초)를 설정 -->
+		<setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 데이터베이스 칼럼명 형태인 A_COLUMN을 CamelCase 형태의 자바 프로퍼티명 형태인 aColumn으로 자동으로 매핑하도록 함 (default false) -->
+		<setting name="logImpl" value="NO_LOGGING" /> <!-- 마이바티스가 사용할 로깅 구현체를 명시. 이 설정을 사용하지 않으면 마이바티스가 사용할 로깅 구현체를 자동으로 찾는다. -->
+		<setting name="jdbcTypeForNull" value="NULL"/> <!-- JDBC 타입을 파라미터에 제공하지 않을 때 null 값을 처리한 JDBC 타입을 명시 -->
+		<setting name="callSettersOnNulls" value="true"/> <!-- 가져온 값이 null일때 setter나 맵의 put 메소드를 호출할지를 명시 (default false) -->
+		<setting name="returnInstanceForEmptyRow" value="true"/> <!-- 모든 컬럼이 null이면 row를 null 인스턴스로 리턴 (default false: row를 null로 리턴) -->
+	</settings>
+	
+	<typeAliases>
+		<typeAlias alias="paramMap" type="com.gagaframework.web.parameter.GagaMap" />
+	</typeAliases>
+
+</configuration>

+ 24 - 0
src/main/resources/persistence/mybatis-wms-config.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "HTTP://mybatis.org/dtd/mybatis-3-config.dtd">
+
+<configuration>
+
+	<settings>
+		<setting name="cacheEnabled" value="false" /> <!-- 설정에서 각 매퍼에 설정된 캐시를 전역적으로 사용할지 말지에 대한 여부 (default true)-->
+		<!-- <setting name="lazyLoadingEnabled" value="true" /> --> <!-- 지연로딩을 사용할지에 대한 여부. 사용하지 않는다면 모두 즉시 로딩 (default true) -->
+		<!-- <setting name="multipleResultSetsEnabled" value="true" /> --> <!-- 한개의 구문에서 여러개의 ResultSet을 허용할지의 여부 (default true) -->
+		<!-- <setting name="useGeneratedKeys" value="true" /> --> <!-- 생성키를 강제로 생성 (default false) -->
+		<setting name="defaultExecutorType" value="REUSE" /> <!-- 디폴트 실행자(executor) 설정. PreparedStatement를 재사용 (default SIMPLE)-->
+		<setting name="defaultStatementTimeout" value="25" /> <!-- 데이터베이스로의 응답을 얼마나 오래 기다릴지를 판단하는 타임아웃(초)를 설정 -->
+		<setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 데이터베이스 칼럼명 형태인 A_COLUMN을 CamelCase 형태의 자바 프로퍼티명 형태인 aColumn으로 자동으로 매핑하도록 함 (default false) -->
+		<setting name="logImpl" value="NO_LOGGING" /> <!-- 마이바티스가 사용할 로깅 구현체를 명시. 이 설정을 사용하지 않으면 마이바티스가 사용할 로깅 구현체를 자동으로 찾는다. -->
+		<setting name="jdbcTypeForNull" value="NULL"/> <!-- JDBC 타입을 파라미터에 제공하지 않을 때 null 값을 처리한 JDBC 타입을 명시 -->
+		<setting name="callSettersOnNulls" value="true"/> <!-- 가져온 값이 null일때 setter나 맵의 put 메소드를 호출할지를 명시 (default false) -->
+		<setting name="returnInstanceForEmptyRow" value="true"/> <!-- 모든 컬럼이 null이면 row를 null 인스턴스로 리턴 (default false: row를 null로 리턴) -->
+	</settings>
+	
+	<typeAliases>
+		<typeAlias alias="paramMap" type="com.gagaframework.web.parameter.GagaMap" />
+	</typeAliases>
+
+</configuration>

二进制
src/main/webapp/WEB-INF/lib/gagaframework-web-core-1.7.1-RELEASE.jar


二进制
src/main/webapp/WEB-INF/lib/gagaframework-web-parameter-1.7-RELEASE.jar


二进制
src/main/webapp/WEB-INF/lib/gagaframework-web-rest-1.7-RELEASE.jar


二进制
src/main/webapp/WEB-INF/lib/gagaframework-web-util-1.7-RELEASE.jar