JUSEUNG 5 yıl önce
ebeveyn
işleme
a87dbfe06a
39 değiştirilmiş dosya ile 2344 ekleme ve 102 silme
  1. 2 2
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaCommonDao.java
  2. 3 3
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaCommonService.java
  3. 2 2
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaGoodsController.java
  4. 4 4
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaCommon.xml
  5. 4 4
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsMassRegisterForm.html
  6. 7 7
      style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsProductStockJob.java
  7. 1 1
      style24.batch/src/main/java/com/style24/batch/biz/service/TsbCommonService.java
  8. 29 31
      style24.batch/src/main/java/com/style24/batch/biz/service/TsbGoodsService.java
  9. 5 4
      style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml
  10. 0 0
      style24.front/.classpath
  11. 11 0
      style24.front/target/classes/banner.txt
  12. 93 0
      style24.front/target/classes/com/style24/persistence/mybatis/TsfFaq.xml
  13. 192 0
      style24.front/target/classes/com/style24/persistence/mybatis/TsfLogin.xml
  14. 69 0
      style24.front/target/classes/com/style24/persistence/mybatis/TsfNotice.xml
  15. 71 0
      style24.front/target/classes/config/application-dev.yml
  16. 72 0
      style24.front/target/classes/config/application-locd.yml
  17. 73 0
      style24.front/target/classes/config/application-locp.yml
  18. 72 0
      style24.front/target/classes/config/application-run.yml
  19. 65 0
      style24.front/target/classes/config/application.yml
  20. 87 0
      style24.front/target/classes/i18n/messages/message_ko_KR.properties
  21. 25 0
      style24.front/target/classes/log/logback-dev.xml
  22. 41 0
      style24.front/target/classes/log/logback-locd.xml
  23. 41 0
      style24.front/target/classes/log/logback-locp.xml
  24. 39 0
      style24.front/target/classes/log/logback-run.xml
  25. 24 0
      style24.front/target/classes/persistence/mybatis-shop-config.xml
  26. 7 0
      style24.front/target/m2e-wtp/web-resources/META-INF/maven/com.style24.front/style24.front/pom.properties
  27. 111 0
      style24.front/target/m2e-wtp/web-resources/META-INF/maven/com.style24.front/style24.front/pom.xml
  28. 6 6
      style24.scm/src/main/java/com/style24/persistence/domain/Goods.java
  29. 80 0
      style24.scm/src/main/java/com/style24/persistence/domain/GoodsMass.java
  30. 44 0
      style24.scm/src/main/java/com/style24/persistence/domain/WmsGoods.java
  31. 11 5
      style24.scm/src/main/java/com/style24/persistence/mybatis/shop/TssBusiness.xml
  32. 5 5
      style24.scm/src/main/java/com/style24/persistence/mybatis/shop/TssCommon.xml
  33. 356 17
      style24.scm/src/main/java/com/style24/persistence/mybatis/shop/TssGoods.xml
  34. 2 2
      style24.scm/src/main/java/com/style24/scm/biz/dao/TssCommonDao.java
  35. 79 0
      style24.scm/src/main/java/com/style24/scm/biz/dao/TssGoodsDao.java
  36. 3 3
      style24.scm/src/main/java/com/style24/scm/biz/service/TssCommonService.java
  37. 542 0
      style24.scm/src/main/java/com/style24/scm/biz/service/TssGoodsService.java
  38. 62 2
      style24.scm/src/main/java/com/style24/scm/biz/web/TssGoodsController.java
  39. 4 4
      style24.scm/src/main/webapp/WEB-INF/views/goods/GoodsMassRegisterForm.html

+ 2 - 2
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaCommonDao.java

@@ -68,12 +68,12 @@ public interface TsaCommonDao {
 	String getSampleFileSystemFilename(String sampleFileId);
 
 	/**
-	 * ERP 연동 여부
+	 * WMS 연동 여부
 	 *
 	 * @return
 	 * @author eskim
 	 * @since 2020. 01. 16
 	 */
-	String getErpSyncYn();
+	String getWmsSyncYn();
 
 }

+ 3 - 3
style24.admin/src/main/java/com/style24/admin/biz/service/TsaCommonService.java

@@ -92,15 +92,15 @@ public class TsaCommonService {
 	}
 
 	/**
-	 * ERP 연동 여부
+	 * WMS 연동 여부
 	 *
 	 * @param
 	 * @return
 	 * @author eskim
 	 * @since 2020. 01. 16
 	 */
-	public String getErpSyncYn() {
-		return commonDao.getErpSyncYn();
+	public String getWmsSyncYn() {
+		return commonDao.getWmsSyncYn();
 	}
 
 }

+ 2 - 2
style24.admin/src/main/java/com/style24/admin/biz/web/TsaGoodsController.java

@@ -1221,8 +1221,8 @@ public class TsaGoodsController extends TsaBaseController {
 		mav.addObject("goodsStatList", rendererService.getAvailCommonCodeList("G008"));
 		// 사용여부
 		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
-		// ERP 연동여부
-		mav.addObject("erpSyncYn", commonService.getErpSyncYn());
+		// WMS 연동여부
+		mav.addObject("wmsSyncYn", commonService.getWmsSyncYn());
 		// 정보고시 목록
 		mav.addObject("niClsfCdList", rendererService.getAvailCommonCodeList("G004"));
 		// 사용자 업체

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

@@ -80,12 +80,12 @@
 	</select>
 	
 	<!-- ERP 연동 여부 -->
-	<select id="getErpSyncYn" resultType="String">
-		/* TsaSystem.getErpSyncYn */
-		SELECT UPPER(NVL(USE_YN,'N')) AS ERP_SYNC_YN
+	<select id="getWmsSyncYn" resultType="String">
+		/* TsaSystem.getWmsSyncYn */
+		SELECT UPPER(NVL(USE_YN,'N')) AS WMS_SYNC_YN
 		FROM TB_COMMON_CODE
 		WHERE CD_GB = 'G077'
-		AND CD = 'ERPSYNCYN'
+		AND CD = 'WMSSYNCYN'
 	</select>
 	
 </mapper>

+ 4 - 4
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsMassRegisterForm.html

@@ -28,7 +28,7 @@
 			<ul class="notice">
 				<li>상품을 대량으로 등록하는 페이지입니다.</li>
 				<li>상품을 등록 할 경우 [승인대기] 상태이며, STYLE 관리자의 [승인완료] 상태 변경 후 FRONT애 노출이 가능합니다.</li>
-				<li><th:block th:if="${erpSyncYn == 'N'}"><em><b>WMS연동여부가 [N]입니다. 관리자에게 문의하세요.</b></em></th:block></li>
+				<li><th:block th:if="${wmsSyncYn == 'N'}"><em><b>WMS연동여부가 [N]입니다. 관리자에게 문의하세요.</b></em></th:block></li>
 			</ul>
 			<ul class="panelBar">
 				<li class="center">
@@ -39,7 +39,7 @@
 									or sessionInfo.roleCd == 'G001_A101'
 									}">
 						<button type="button" class="btn btn-default btn-lg" id="btnInit" onclick="cfnDownloadSampleFile('SF001');">자사상품 등록양식 다운로드</button>
-						<button th:if="${erpSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsSelfCreate" >자사상품 등록</button>
+						<button th:if="${wmsSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsSelfCreate" >자사상품 등록</button>
 					</th:block>
 					<th:block th:if="${sessionInfo.roleCd == 'G001_0000' 
 									or sessionInfo.roleCd == 'G001_A000' 
@@ -48,7 +48,7 @@
 									or sessionInfo.roleCd == 'G001_A101'
 									}">
 						<button type="button" class="btn btn-default btn-lg" id="btnInit" onclick="cfnDownloadSampleFile('SF005');">입점상품 등록양식 다운로드</button>
-						<button th:if="${erpSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsCreate" >입점상품 등록</button> -->
+						<button th:if="${wmsSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsCreate" >입점상품 등록</button> -->
 					</th:block>
 					<label class="off"><a href="javascript:void(0);" id="excelList" style="display: none;">엑셀다운로드</a></label>
 					<!--  추후 대량 수정 권한-->
@@ -60,7 +60,7 @@
 								}" 
 							th:style="'padding-left:80px;'">
 						<button type="button" class="btn btn-default btn-lg" id="btnInit" onclick="cfnDownloadSampleFile('SF014');">상품대량수정 등록양식 다운로드</button>
-						<button th:if="${erpSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsUpdate" >상품 수정</button>
+						<button th:if="${wmsSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsUpdate" >상품 수정</button>
 					</span>
 				</li>
 			</ul>

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

@@ -75,10 +75,10 @@ public class TsbGoodsWmsProductStockJob extends TsbAbstractJob<IfProductSku, IfP
 			goodsService.deleteIfProductSku();
 
 			// TB_IF_PRODUCTSKU_TEMP 생성
-			Collection<IfProductSku> wmsIfProductSukList = wmsGoodsService.getWmsIfProductSukList();
+			Collection<IfProductSku> wmsIfProductSukList = wmsGoodsService.getWmsIfProductSukList();  //테스트 1000건
 
 			//대용량 : N
-			String byrow = "N";
+			String byrow = "Y";
 			if ("Y".equals(byrow)) {
 				for(IfProductSku ifProductSkuMap : wmsIfProductSukList) {
 					goodsService.createIfProductSkuByRow(ifProductSkuMap);
@@ -101,16 +101,16 @@ public class TsbGoodsWmsProductStockJob extends TsbAbstractJob<IfProductSku, IfP
 				}
 
 			}
-//
-//			// TB_IF_PRODUCTSKU_HST 생성
-//			//goodsService.createWmsProductSkuHst(jobdate);
+
+			// TB_IF_PRODUCTSKU_HST 생성
+			goodsService.createWmsProductSkuHst(jobdate);
 
 			//온라인 상품 재고 적용
-			//goodsService.saveGoodsStock();
+			goodsService.saveGoodsStock();
 		}
 
 		//온라인 전시 재고 작업
-		//goodsService.saveGoodsDispStock();
+		goodsService.saveGoodsDispStock();
 
 		return ifProductSku;
 	}

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

@@ -33,7 +33,7 @@ public class TsbCommonService {
 //	}
 
 	/**
-	 * ERP Sync 옵션
+	 * WMS Sync 옵션
 	 *
 	 * @return
 	 * @author eskim

+ 29 - 31
style24.batch/src/main/java/com/style24/batch/biz/service/TsbGoodsService.java

@@ -1,9 +1,7 @@
 package com.style24.batch.biz.service;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -459,34 +457,34 @@ public class TsbGoodsService {
 	@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_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";  //년월일시분초
@@ -625,7 +623,7 @@ public class TsbGoodsService {
 		goodsDao.createIfProductSku(dataMap);
 	}
 
-	
+
 	/**
 	 * TB_IF_PRODUCTSKU_HST 저장
 	 *

+ 5 - 4
style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml

@@ -1334,7 +1334,7 @@
 	<!-- TB_IF_PRODUCTSKU_TEMP 삭제 -->
 	<delete id="deleteIfProductSku"  timeout="300">
 		/* TsbGoods.deleteIfProductSku */
-		TRUNCATE TABLE TB_IF_PRODUCTSKU
+		DELETE FROM TB_IF_PRODUCTSKU
 	</delete>
 	
 	<!-- TB_IF_PRODUCTSKU_TEMP 저장 -->
@@ -1516,13 +1516,13 @@
 		HAVING Z.MIN_ORD_QTY <![CDATA[<=]]> MIN(Z.STOCK_QTY_ITEM)
 	</insert>
 	
-	<!-- ERP 재고 임시 테이블 삭제 -->
+	<!-- WMS 재고 임시 테이블 삭제 -->
 	<delete id="deleteTbOptionSyncTemp"   timeout="300">
 		/* TsbGoods.deleteTbOptionSyncTemp */
-		TRUNCATE TABLE TB_OPTION_SYNC_TEMP
+		DELETE FROM TB_OPTION_SYNC_TEMP
 	</delete>
 
-	<!--ERP 재고 임시 테이블 이관  -->
+	<!--WMS 재고 임시 테이블 이관  -->
 	<insert id="createTbOptionSyncTemp"   timeout="300">
 		/* TsbGoods.createTbOptionSyncTemp */
 		INSERT INTO TB_OPTION_SYNC_TEMP
@@ -1855,6 +1855,7 @@
 		/* TsbGoods.createTtbSellQtyByOrderDetail */
 		INSERT INTO TB_SELL_QTY (
 		      GOODS_CD
+		    , OPT_CD
 		    , SELL_GB
 		    , ORD_DTL_NO
 		    , AGENT_ORDER_ID

+ 0 - 0
style24.front/.classpath


+ 11 - 0
style24.front/target/classes/banner.txt

@@ -0,0 +1,11 @@
+  ______   ________  __      __  __        ________   ______   __    __        ________                               __     
+ /      \ /        |/  \    /  |/  |      /        | /      \ /  |  /  |      /        |                             /  |    
+/$$$$$$  |$$$$$$$$/ $$  \  /$$/ $$ |      $$$$$$$$/ /$$$$$$  |$$ |  $$ |      $$$$$$$$/______    ______   _______   _$$ |_   
+$$ \__$$/    $$ |    $$  \/$$/  $$ |      $$ |__    $$____$$ |$$ |__$$ |      $$ |__  /      \  /      \ /       \ / $$   |  
+$$      \    $$ |     $$  $$/   $$ |      $$    |    /    $$/ $$    $$ |      $$    |/$$$$$$  |/$$$$$$  |$$$$$$$  |$$$$$$/   
+ $$$$$$  |   $$ |      $$$$/    $$ |      $$$$$/    /$$$$$$/  $$$$$$$$ |      $$$$$/ $$ |  $$/ $$ |  $$ |$$ |  $$ |  $$ | __ 
+/  \__$$ |   $$ |       $$ |    $$ |_____ $$ |_____ $$ |_____       $$ |      $$ |   $$ |      $$ \__$$ |$$ |  $$ |  $$ |/  |
+$$    $$/    $$ |       $$ |    $$       |$$       |$$       |      $$ |      $$ |   $$ |      $$    $$/ $$ |  $$ |  $$  $$/ 
+ $$$$$$/     $$/        $$/     $$$$$$$$/ $$$$$$$$/ $$$$$$$$/       $$/       $$/    $$/        $$$$$$/  $$/   $$/    $$$$/  
+                                                                                                                             
+:: (v1.0.0.RELEASE by tsinfotech.co.kr 2020) ::

+ 93 - 0
style24.front/target/classes/com/style24/persistence/mybatis/TsfFaq.xml

@@ -0,0 +1,93 @@
+<?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.front.biz.dao.TsfFaqDao">
+
+	<!-- Paging -->
+	<sql id="pageSql">
+		LIMIT #{pageable.startRow}, #{pageable.pageSize}
+	</sql>
+	<!--// Paging -->
+	
+	<!-- FAQ 자주 묻는 질문 목록 (10개) -->
+	<select id="getFaqLikesList" parameterType="String" resultType="Faq">
+		/* TsfFaq.getFaqLikesList */
+		SELECT FAQ_SQ   /*FAQ일련번호*/
+		     , SITE_CD  /*사이트코드(공통코드G000)*/
+		     , FAQ_TYPE /*FAQ유형(공통코드G046)*/
+		     , QUESTION /*질문*/
+		     , ANSWER   /*답변*/
+		     , DISP_ORD /*표시순서*/
+		FROM   TB_FAQ
+		WHERE  SITE_CD = #{siteCd}
+		AND    USE_YN = 'Y'
+		ORDER  BY DISP_ORD
+		LIMIT 10
+	</select>
+	
+	<!-- FAQ 총건수 -->
+	<select id="getFaqTotalCount" parameterType="Faq" resultType="int">
+		/* TsfFaq.getFaqTotalCount */
+		SELECT COUNT(*) AS CNT
+		FROM   TB_FAQ
+		WHERE  SITE_CD = #{siteCd}
+		<if test='faqType != null and faqType !=""'>
+		AND    FAQ_TYPE = #{faqType}
+		</if>
+		AND    USE_YN = 'Y'
+		<if test="searchTxt != null and searchTxt !=''">
+		AND    (
+		        LOWER(QUESTION) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		        OR
+		        LOWER(ANSWER) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		       )
+		</if>
+	</select>
+	
+	<!-- FAQ 목록 -->
+	<select id="getFaqList" parameterType="Faq" resultType="Faq">
+		/* TsfFaq.getFaqList */
+		SELECT FAQ_SQ   /*FAQ일련번호*/
+		     , SITE_CD  /*사이트코드(공통코드G000)*/
+		     , FAQ_TYPE /*FAQ유형(공통코드G046)*/
+		     , QUESTION /*질문*/
+		     , ANSWER   /*답변*/
+		     , DISP_ORD /*표시순서*/
+		FROM   TB_FAQ
+		WHERE  SITE_CD = #{siteCd}
+		<if test='faqType != null and faqType !=""'>
+		AND    FAQ_TYPE = #{faqType}
+		</if>
+		AND    USE_YN = 'Y'
+		<if test="searchTxt != null and searchTxt !=''">
+		AND    (
+		        LOWER(QUESTION) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		        OR
+		        LOWER(ANSWER) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		       )
+		</if>
+		ORDER  BY REG_DT DESC
+		<include refid="pageSql"></include>
+	</select>
+
+	<!-- FAQ 조회수 Update -->
+	<update id="updateFaqReadCount" parameterType="Integer">
+		/* TsfFaq.updateFaqReadCount */
+		UPDATE TB_FAQ
+		SET    READ_CNT = READ_CNT + 1
+		WHERE  FAQ_SQ = #{faqSq}
+	</update>
+
+	<!-- FAQ 상세 -->
+	<select id="getFaq" parameterType="Integer" resultType="Faq">
+		/* TsfFaq.getFaq */
+		SELECT FAQ_SQ                                         /*FAQ일련번호*/
+		     , FAQ_TYPE                                       /*FAQ유형*/
+		     , FN_GET_CODE_NM('G046',FAQ_TYPE) AS FAQ_TYPE_NM /*FAQ유형명*/
+		     , QUESTION                                       /*질문*/
+		     , ANSWER                                         /*답변*/
+		FROM   TB_FAQ
+		WHERE  FAQ_SQ = #{faqSq}
+		AND    USE_YN = 'Y'
+	</select>
+
+</mapper>

+ 192 - 0
style24.front/target/classes/com/style24/persistence/mybatis/TsfLogin.xml

@@ -0,0 +1,192 @@
+<?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.front.biz.dao.TsfLoginDao">
+
+	<!-- 로그인체크 정보 조회 -->
+	<select id="getLoginCheckInfo" parameterType="Login" resultType="Login">
+		/* TsfLogin.getLoginCheckInfo */
+		SELECT CUST_NO                                      --고객번호
+		     , CUST_ID                                      --고객ID
+		     , CUST_NM                                      --고객명
+		     , PASSWD                                       --비밀번호
+		     , CUST_GB                                      --고객구분
+		     , FN_GET_CODE_NM('G100',CUST_GB) AS CUST_GB_NM --고객구분명
+		     , CUST_STAT                                    --회원상태
+		     , EMAIL                                        --이메일
+		     , SNS_TYPE                                     --SNS유형
+		     , SNS_JOIN_ID                                  --SNS가입ID
+		     , NVL((SELECT LOGIN_FAIL_CNT
+		            FROM   TB_LOGIN_FAIL
+		            WHERE  LOGIN_ID = TO_CHAR(A.CUST_NO)
+		            AND    IP_ADDR = #{ipAddr}
+		            AND    SITE_CD = #{siteCd}
+		           ),0)    AS LOGIN_FAIL_CNT                --로그인실패건수
+		FROM   TB_CUSTOMER A
+		WHERE  CUST_STAT <![CDATA[<>]]> '40'                --전환대상고객제외
+		<choose>
+		    <when test="snsType != null and snsType != ''"> <!-- SNS로그인 -->
+		AND    (
+		        SNS_TYPE||'-'||SNS_JOIN_ID = #{custId}
+		        OR
+		        EMAIL = #{email}
+		       )
+		    </when>
+		    <otherwise> <!-- 일반로그인 -->
+		AND    CUST_ID = #{custId}
+		    </otherwise>
+		</choose>
+	</select>
+
+	<!-- 로그인실패 남기기 -->
+	<insert id="createLoginFail" parameterType="Login">
+		/* TsfLogin.createLoginFail */
+		MERGE INTO TB_LOGIN_FAIL
+		USING (
+		       SELECT TO_CHAR(CUST_NO) AS CUST_NO
+		       FROM   TB_CUSTOMER
+		       WHERE  CUST_ID = #{custId}
+		      ) B
+		ON    (
+		       LOGIN_ID = B.CUST_NO
+		AND    IP_ADDR = #{ipAddr}
+		AND    SITE_CD = #{siteCd}
+		      )
+		WHEN MATCHED THEN
+		    UPDATE
+		    SET    LOGIN_FAIL_CNT = DECODE(#{loginFailYn},'Y',LOGIN_FAIL_CNT + 1,0)
+		         , UPD_NO = B.CUST_NO
+		         , UPD_DT = NOW()
+		WHEN NOT MATCHED THEN
+		    INSERT (LOGIN_ID, IP_ADDR, SITE_CD, LOGIN_FAIL_CNT, REG_ID, REG_DT, UPD_NO, UPD_DT)
+		    VALUES (B.CUST_NO, #{ipAddr}, #{siteCd}, 1, B.CUST_NO, NOW(), B.CUST_NO, NOW())
+	</insert>
+
+	<!-- 로그인 실패건수 조회 -->
+	<select id="getLoginFailCount" parameterType="Login" resultType="int">
+		/* TsfLogin.getLoginFailCount */
+		SELECT NVL((SELECT LOGIN_FAIL_CNT
+		            FROM   TB_LOGIN_FAIL
+		            WHERE  LOGIN_ID = #{custNo}
+		            AND    IP_ADDR = #{ipAddr}
+		            AND    SITE_CD = #{siteCd}
+		           ),0)
+		FROM   DUAL
+	</select>
+
+	<!-- 최종로그인일시 Update -->
+	<update id="updateLastLoginDate" parameterType="Integer">
+		/* TsfLogin.updateLastLoginDate */
+		UPDATE TB_CUSTOMER
+		SET    LOGIN_LDT = NOW()
+		     , UPD_NO = #{custNo}
+		     , UPD_DT = NOW()
+		WHERE  CUST_NO = #{custNo}
+	</update>
+
+	<!-- 로그인이력 남기기 -->
+	<insert id="createLoginHistory" parameterType="Login">
+		/* TsfLogin.createLoginHistory */
+		INSERT INTO TB_LOGIN_HST (
+		       LOGIN_HST_SQ
+		     , LOGIN_ID
+		     , IP_ADDR
+		     , SITE_CD
+		     , FRONT_GB
+		     , LOGIN_DT
+		     , REG_ID
+		     , REG_DT
+		)
+		VALUES (
+		       SEQ_LOGIN_HST.NEXTVAL
+		     , #{custNo}
+		     , #{ipAddr}
+		     , #{siteCd}
+		     , #{frontGb}
+		     , NOW()
+		     , #{custNo}
+		     , NOW()
+		)
+	</insert>
+
+	<!-- 로그인 세션정보 조회 -->
+	<select id="getLoginSessionInfo" parameterType="Login" resultType="Login">
+		/* TsfLogin.getLoginSessionInfo */
+		SELECT CUST_NO                                                --고객번호
+		     , CUST_ID                                                --고객ID
+		     , CUST_NM                                                --고객명
+		     , PASSWD                                                 --비밀번호
+		     , CELL_PHNNO                                             --휴대전화번호
+		     , EMAIL                                                  --이메일
+		     , CUST_GB                                                --회원구분코드
+		     , FN_GET_CODE_NM('G100',CUST_GB)        AS CUST_GB_NM    --회원구분명
+		     , CUST_GRADE                                             --회원등급코드
+		     , FN_GET_CODE_NM('G110',CUST_GRADE)     AS CUST_GRADE_NM --회원등급명
+		     , SITE_CD                                                --사이트코드
+		     , TO_CHAR(LOGIN_LDT,'YYYYMMDDHH24MISS') AS LOGIN_LDT     --최종로그인일시
+		     , MANAGED_RSN                                            --관리대상지정사유(공통코드G120)
+		     , CASE WHEN ADD_MONTHS(PASSWD_CHG_DT,6) <![CDATA[<]]> NOW() THEN 'Y'
+		            ELSE 'N'
+		       END                                   AS PASSWD_CHG_YN --비밀번호변경도래여부
+		FROM   TB_CUSTOMER A
+		WHERE  CUST_ID = #{custId}
+		AND    CUST_STAT = '10' --활동회원
+	</select>
+
+	<!-- 로그인유지토큰 생성 -->
+	<insert id="createPersistentToken" parameterType="PersistentToken">
+		/* TsfLogin.createPersistentToken */
+		MERGE INTO TB_PERSISTENT_TOKEN
+		USING DUAL
+		ON    (
+		       CUST_NO = #{custNo}
+		       AND
+		       REMEMBERME_TOKEN = #{remembermeToken}
+		)
+		WHEN MATCHED THEN
+		    UPDATE
+		    SET    LIMIT_DT = #{limitDt}
+		WHEN NOT MATCHED THEN
+		    INSERT (
+		            CUST_NO
+		          , REMEMBERME_TOKEN
+		          , LIMIT_DT
+		    )
+		    VALUES (
+		           #{custNo}
+		         , #{remembermeToken}
+		         , NOW()
+		    )
+	</insert>
+
+	<!-- 로그인유지토큰 조회 -->
+	<select id="getPersistentToken" parameterType="String" resultType="PersistentToken">
+		/* TsfLogin.getPersistentToken */
+		SELECT PT.CUST_NO
+		     , PT.REMEMBERME_TOKEN
+		     , PT.LIMIT_DT
+		     , C.CUST_ID
+		FROM   TB_PERSISTENT_TOKEN PT
+		     , TB_CUSTOMER C
+		WHERE  PT.CUST_NO = C.CUST_NO
+		AND    PT.REMEMBERME_TOKEN = #{remembermeToken}
+		AND    NOW() <![CDATA[<=]]> PT.LIMIT_DT
+	</select>
+
+	<!-- 로그인유지토큰 갱신 -->
+	<update id="updatePersistentToken" parameterType="PersistentToken">
+		/* TsfLogin.updatePersistentToken */
+		UPDATE TB_PERSISTENT_TOKEN
+		SET    REMEMBERME_TOKEN = #{remembermeToken}
+		     , LIMIT_DT = #{limitDt}
+		WHERE  CUST_NO = #{custNo}
+		AND    REMEMBERME_TOKEN = #{prevRemembermeToken}
+	</update>
+
+	<!-- 로그인유지토근 삭제 -->
+	<delete id="deletePersistentToken" parameterType="String">
+		/* TsfLogin.deletePersistentToken */
+		DELETE FROM TB_PERSISTENT_TOKEN
+		WHERE  REMEMBERME_TOKEN = #{remembermeToken}
+	</delete>
+
+</mapper>

+ 69 - 0
style24.front/target/classes/com/style24/persistence/mybatis/TsfNotice.xml

@@ -0,0 +1,69 @@
+<?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.front.biz.dao.TsfNoticeDao">
+
+	<!-- Paging -->
+	<sql id="pageSql">
+		LIMIT #{pageable.startRow}, #{pageable.pageSize}
+	</sql>
+	
+	<!-- 공지사항 전체 건수 조회 -->
+	<select id="getNoticeTotalCount" parameterType="Notice" resultType="int">
+		/* TsfNotice.getNoticeTotalCount */
+		SELECT COUNT(*)
+		FROM   TB_NOTICE A
+		WHERE  NOTICE_TYPE = 'G047_10' /*사이트공지*/
+		AND    USE_YN = 'Y'
+		AND    CURRENT_DATE() BETWEEN NOTICE_STDT AND NOTICE_EDDT
+		AND    EXISTS (SELECT 1
+		               FROM   TB_NOTICE_RECEIVER
+		               WHERE  NOTICE_SQ = A.NOTICE_SQ
+		               AND    RECEIVER_ID = #{siteCd}
+		              )
+	</select>
+	
+	<!-- 공지사항 목록 -->
+	<select id="getNoticeList" parameterType="Notice" resultType="Notice">
+		/* TsfNotice.getNoticeList */
+		SELECT NOTICE_SQ                                  /*공지사항일련번호*/
+		     , NOTICE_TITLE                               /*공지제목*/
+		     , NOTICE_CONTENT                             /*공지내용*/
+		     , READ_CNT                                   /*조회수*/
+		     , DATE_FORMAT(REG_DT,'%Y.%m.%d') AS REG_DT   /*등록일자*/
+		     , (SELECT COUNT(1)
+		        FROM   TB_NOTICE_FILE
+		        WHERE  NOTICE_SQ = A.NOTICE_SQ
+		       )                              AS FILE_CNT /*첨부파일건수*/
+		FROM   TB_NOTICE A
+		WHERE  NOTICE_TYPE = 'G047_10' /*사이트공지*/
+		AND    USE_YN =  'Y'
+		AND    CURRENT_DATE() BETWEEN NOTICE_STDT AND NOTICE_EDDT
+		AND    EXISTS (SELECT 1
+		               FROM   TB_NOTICE_RECEIVER
+		               WHERE  NOTICE_SQ = A.NOTICE_SQ
+		               AND    RECEIVER_ID = #{siteCd}
+		              )
+		ORDER  BY URGENT_YN DESC, REG_DT DESC
+		<include refid="pageSql"></include>
+	</select>
+
+	<!-- 공지사항 파일 목록 -->
+	<select id="getNoticeFileList" parameterType="Integer" resultType="Notice">
+		/* TsfNotice.getNoticeFileList */
+		SELECT NOTICE_SQ
+		     , SEQ
+		     , ORG_FILE_NM
+		     , SYS_FILE_NM
+		FROM   TB_NOTICE_FILE
+		WHERE  NOTICE_SQ = #{noticeSq}
+	</select>
+	
+	<!-- 공지사항  조회건수 Update -->
+	<update id="updateNoticeReadCount" parameterType="Integer">
+		/* TsfNotice.updateNoticeReadCount */
+		UPDATE TB_NOTICE
+		SET    READ_CNT = READ_CNT + 1
+		WHERE  NOTICE_SQ = #{noticeSq}
+	</update>
+
+</mapper>

+ 71 - 0
style24.front/target/classes/config/application-dev.yml

@@ -0,0 +1,71 @@
+spring:
+    profiles:
+        active: dev
+    cache:
+        type: redis
+    redis:
+        lettuce:
+            pool:
+                max-active: 10
+                max-idle: 10
+                min-idle: 2
+        host: 116.121.60.104
+        port: 6379
+        password: 
+
+logging.config: classpath:log/logback-dev.xml
+
+domain:
+    wivis: //116.121.60.104
+    image: //116.121.60.104:90
+    uximage: //116.121.60.104
+
+# SSL Server
+has-ssl: false
+
+upload:
+    default:
+        target.path: /home/app/www/data
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png|bmp|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
+        view: //116.121.60.104:90
+    goods:
+        target.path: /home/app/www/data/goods
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png
+        view: //image.style24.com/speedy_image-wivismall/goods
+    image:
+        target.path: /home/app/www/data
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png
+        view: //116.121.60.104:90
+    excel:
+        target.path: /home/app/www/data/excel
+        max.size: 10
+        allow.extension: xls|xlsx
+        view: //116.121.60.104:90/excel
+
+download.path: /home/app/www/data
+
+# SMTP(운영서버만 설정되어 있어 작동안함)
+mail:
+    host: mail.wivis.com
+    #    port: 465
+    username: admin@wivis.com
+    password: dnlqltm1!
+    protocol: smtp
+    #    tls: true
+    auth: true
+    from: admin@wivis.com
+    wivis.url: http://116.121.60.104
+    image.url: http://116.121.60.104/image/mailing
+    template.path: /home/app/www/front/WEB-INF/mail
+
+# PG
+pg:
+    nicepay:
+        merchantId: nictest00m
+        merchantKey: 33F49GnCMS1mFYlGXisbUDzVf2ATWCl9k3R++d5hDd3Frmuos/XLx8XhXpe+LDYAbpGKZYSwtlyyLOtS/8aD7A==
+        log.path: /home/app/logs/nicepay
+        account.cert.url: https://webapi.nicepay.co.kr/api/checkBankAccountAPI.jsp
+        vbank.refund.url: https://webapi.nicepay.co.kr/v2/api/merchant/vbank_refund.jsp

+ 72 - 0
style24.front/target/classes/config/application-locd.yml

@@ -0,0 +1,72 @@
+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
+
+# SSL Server
+has-ssl: false
+
+domain:
+    wivis: //ldfront.style24.com
+    image: //ldimage.style24.com
+    uximage: //ldfront.style24.com
+
+upload:
+    default:
+        target.path: /WIDE/workspace/files/data
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png|bmp|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
+        view: //ldimage.style24.com
+    goods:
+        target.path: /WIDE/workspace/files/data/goods
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png
+        view: //image.style24.com/speedy_image-wivismall/goods
+    image:
+        target.path: /WIDE/workspace/files/data
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png
+        view: //ldimage.style24.com
+    excel:
+        target.path: /WIDE/workspace/files/data/excel
+        max.size: 10
+        allow.extension: xls|xlsx
+        view: //ldimage.style24.com/excel
+
+download.path: /WIDE/workspace/files/data
+
+# SMTP(naver의 본인 username과 password, from(메일주소) 입려 후 테스트 하면 됨)
+mail:
+    host: mail.wivis.com
+    #    port: 465
+    username: admin@wivis.com
+    password: dnlqltm1!
+    protocol: smtp
+    #    tls: true
+    auth: true
+    from: admin@wivis.com
+    wivis.url: https://ldfront.style24.com
+    image.url: http://ldfront.style24.com/image/mailing
+    template.path: /WIDE/workspace/webapps/wivis/wivismall.front/src/main/webapp/WEB-INF/mail
+
+# PG
+pg:
+    nicepay:
+        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
+        vbank.refund.url: https://webapi.nicepay.co.kr/v2/api/merchant/vbank_refund.jsp

+ 73 - 0
style24.front/target/classes/config/application-locp.yml

@@ -0,0 +1,73 @@
+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
+
+# SSL Server
+has-ssl: false
+
+domain:
+    wivis: //lpfront.style24.com
+    image: //image.style24.com/speedy_image-wivismall
+    uximage: //lpfront.style24.com
+
+upload:
+    default:
+        target.path: /WIDE/workspace/files/data
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png|bmp|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
+        view: //image.style24.com/speedy_image-wivismall
+    goods:
+        target.path: /WIDE/workspace/files/data/goods
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png
+        view: //image.style24.com/speedy_image-wivismall/goods
+    image:
+        target.path: /WIDE/workspace/files/data
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png
+        view: //image.style24.com/speedy_image-wivismall
+    excel:
+        target.path: /WIDE/workspace/files/data/excel
+        max.size: 10
+        allow.extension: xls|xlsx
+        view: //lpimage.style24.com/excel
+
+download.path: /WIDE/workspace/files/data
+
+# SMTP(naver의 본인 username과 password, from(메일주소) 입려 후 테스트 하면 됨)
+mail:
+    host: mail.wivis.com
+    #    port: 465
+    username: admin@wivis.com
+    password: dnlqltm1!
+    protocol: smtp
+    #    tls: true
+    auth: true
+    from: admin@wivis.com
+    wivis.url: http://lpfront.style24.com
+    image.url: http://lpfront.style24.com/image/mailing
+    template.path: /WIDE/workspace/webapps/wivis/wivismall.front/src/main/webapp/WEB-INF/mail
+
+# PG
+pg:
+    nicepay:
+        merchantId: wivismallm
+        merchantKey: pXTdML8rIaOVCeXQQsyRp1uCfTSTT/n80BV4LCqa+/yJM64MYIqeBCIQdH1rKhJRwSOsdCxVPa1V6hRxkkdJxg==
+        cancelPwd: wivis@2020
+        log.path: /WIDE/workspace/logs/wivis
+        account.cert.url: https://webapi.nicepay.co.kr/api/checkBankAccountAPI.jsp
+        vbank.refund.url: https://webapi.nicepay.co.kr/v2/api/merchant/vbank_refund.jsp

+ 72 - 0
style24.front/target/classes/config/application-run.yml

@@ -0,0 +1,72 @@
+spring:
+    profiles:
+        active: run
+    cache:
+        type: redis
+    redis:
+        lettuce:
+            pool:
+                max-active: 10
+                max-idle: 10
+                min-idle: 2
+        host: 192.186.1.30
+        port: 6379
+        password: wivismall
+
+logging.config: classpath:log/logback-run.xml
+
+domain:
+    wivis: //www.style24.com
+    image: //image.style24.com/speedy_image-wivismall
+    uximage: //www.style24.com
+
+# SSL Server
+has-ssl: true
+
+upload:
+    default:
+        target.path: /app/was/deploy/wivismall.front/data
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png|bmp|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
+        view: //image.style24.com/speedy_image-wivismall
+    goods:
+        target.path: /app/was/deploy/wivismall.front/data/goods
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png
+        view: //image.style24.com/speedy_image-wivismall/goods
+    image:
+        target.path: /app/was/deploy/wivismall.front/data
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png
+        view: //image.style24.com/speedy_image-wivismall
+    excel:
+        target.path: /app/was/deploy/wivismall.front/data/excel
+        max.size: 10
+        allow.extension: xls|xlsx
+        view: //www.style24.com/excel
+
+download.path: /app/was/deploy/wivismall.front/data
+
+# SMTP
+mail:
+    host: mail.wivis.com
+    #    port: 465
+    username: admin@wivis.com
+    password: dnlqltm1!
+    protocol: smtp
+    #    tls: true
+    auth: true
+    from: admin@wivis.com
+    wivis.url: https://www.style24.com
+    image.url: http://www.style24.com/image/mailing
+    template.path: /app/was/deploy/wivismall.front/WEB-INF/mail
+
+# PG
+pg:
+    nicepay:
+        merchantId: wivismallm
+        merchantKey: pXTdML8rIaOVCeXQQsyRp1uCfTSTT/n80BV4LCqa+/yJM64MYIqeBCIQdH1rKhJRwSOsdCxVPa1V6hRxkkdJxg==
+        cancelPwd: wivis@2020
+        log.path: /app/was/applogs/nicepay
+        account.cert.url: https://webapi.nicepay.co.kr/api/checkBankAccountAPI.jsp
+        vbank.refund.url: https://webapi.nicepay.co.kr/v2/api/merchant/vbank_refund.jsp

+ 65 - 0
style24.front/target/classes/config/application.yml

@@ -0,0 +1,65 @@
+spring:
+    messages:
+        cache-duration: -1
+        basename: classpath:i18n/messages/message
+        encoding: UTF-8
+    thymeleaf:
+        check-template-location: true
+        prefix: /WEB-INF/views/
+        suffix: .html
+    servlet:
+        multipart:
+            max-file-size: 10MB
+            max-request-size: 10MB
+#    session.store-type: redis
+    data:
+        redis:
+            repositories:
+                enabled: true
+
+server:
+#    servlet:
+#        session:
+#            cookie:
+#                name: WSESSIONID
+#                secure: true
+    error.whitelabel.enabled: false
+
+# 네이버 API
+naver:
+    clientId: OMmbCMu7ac7GgYWgjlhv
+    clientSecret: jwRNdDbEBG
+    login.callbackUrl: /signin/snsLoginCallback?snsType=NV
+    shortUrl: https://openapi.naver.com/v1/util/shorturl
+    tokenUrl: https://nid.naver.com/oauth2.0/token
+    userInfoUrl : https://openapi.naver.com/v1/nid/me
+    authorizeUrl : https://nid.naver.com/oauth2.0/authorize
+
+# SPEEDY Image Upload
+speedy:
+    ftp:
+        host: fileupload.cdn.cloudn.co.kr
+        port: 21
+        username: speedy_image-wivismall
+        pwd: wZ31jS_!@
+
+#카카오 API
+kakao:
+    appId : 399207
+    appName : WIVISMALL
+    companyName : 위비스
+    restApiKey: 8f8db3657b60b2c83df79a37d38becd4
+    nativeAppKey : a4790e2102950309d87ad81a39c0597d
+    javascriptKey : f435c12d89ddb9cc6337f4cf0a05fd30
+    adminKey : 567e9476b15d2149c714aaecd0fee740
+    addressApiRequestUrl : https://dapi.kakao.com/v2/local/search/address.json?page=1&query=
+    login.callbackUrl: /signin/snsLoginCallback?snsType=KK
+    tokenUrl: https://kauth.kakao.com/oauth/token
+    userInfoUrl: https://kapi.kakao.com/v2/user/me
+    authorizeUrl: https://kauth.kakao.com/oauth/authorize
+    unlinkUrl : https://kapi.kakao.com/v1/user/unlink
+
+# APP 다운로드 URL
+app.down.url: 
+    ios: https://apps.apple.com/kr/app/WIVISMALL/id1517275108
+    aos: https://play.google.com/store/apps/details?id=com.wivis.wivismal

+ 87 - 0
style24.front/target/classes/i18n/messages/message_ko_KR.properties

@@ -0,0 +1,87 @@
+## -----------------------------------------------------------------------------
+## Message properties
+## -----------------------------------------------------------------------------
+SUCC_0001=\uC131\uACF5\uC801\uC73C\uB85C \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+SUCC_0002=\uC131\uACF5\uC801\uC73C\uB85C \uC218\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+SUCC_0003=\uC131\uACF5\uC801\uC73C\uB85C \uC0AD\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+SUCC_0004=\uC131\uACF5\uC801\uC73C\uB85C \uCC98\uB9AC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+SUCC_0005=\uC131\uACF5\uC801\uC73C\uB85C \uBC1C\uC1A1\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+SUCC_0006=\uC131\uACF5\uC801\uC73C\uB85C \uBC1C\uD589\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+SUCC_0007=\uC131\uACF5\uC801\uC73C\uB85C \uC5C5\uB85C\uB4DC \uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+#SUCC_0008=\uC131\uACF5\uC801\uC73C\uB85C \uB4F1\uB85D\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+SUCC_0009=\uC131\uACF5\uC801\uC73C\uB85C \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+
+FAIL_0001=\uC624\uB958\uB85C \uC778\uD574 \uC800\uC7A5\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.
+FAIL_0002=\uC624\uB958\uB85C \uC778\uD574 \uC218\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.
+FAIL_0003=\uC624\uB958\uB85C \uC778\uD574 \uC0AD\uC81C\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.
+FAIL_0004=\uC624\uB958\uB85C \uC778\uD574 \uCC98\uB9AC\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.
+FAIL_0005=\uC624\uB958\uB85C \uC778\uD574 \uBC1C\uC1A1\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.
+FAIL_0006=\uC624\uB958\uB85C \uC778\uD574 \uBC1C\uD589\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.
+FAIL_0007=\uC624\uB958\uB85C \uC778\uD574 \uC5C5\uB85C\uB4DC \uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.
+#FAIL_0008=\uC624\uB958\uB85C \uC778\uD574 \uB4F1\uB85D\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.
+FAIL_0009=\uC624\uB958\uB85C \uC778\uD574 \uBCC0\uACBD\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.
+FAIL_1001=\uC800\uC7A5\uD560 \uB370\uC774\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.
+FAIL_1002=\uC804\uC1A1\uD560 \uB370\uC774\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.
+
+LOGN_0001=\uC785\uB825\uD558\uC2E0 \uC815\uBCF4\uB85C \uAC00\uC785\uB41C \uB0B4\uC5ED\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.
+LOGN_0002=\uBE44\uBC00\uBC88\uD638\uAC00 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
+LOGN_0003=\uB85C\uADF8\uC778 \uC0C1\uD0DC\uAC00 \uC544\uB2D9\uB2C8\uB2E4. \uB2E4\uC2DC \uB85C\uADF8\uC778 \uD574\uC8FC\uC138\uC694.
+LOGN_0004=\uBE44\uBC00\uBC88\uD638\uB97C \uBCC0\uACBD\uD55C \uB0A0\uB85C\uBD80\uD130 3\uAC1C\uC6D4\uC774 \uACBD\uACFC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+LOGN_0005=\uBE44\uBC00\uBC88\uD638\uAC00 5\uD68C \uC774\uC0C1 \uD2C0\uB824 \uACC4\uC815\uC774 \uC7A0\uACBC\uC2B5\uB2C8\uB2E4.
+LOGN_0006=\uD734\uBA74 \uD68C\uC6D0\uC785\uB2C8\uB2E4.
+LOGN_0007=\uD0C8\uD1F4 \uD68C\uC6D0\uC785\uB2C8\uB2E4.
+LOGN_0008=\uC774\uBBF8 \uAC00\uC785\uD558\uC2E0 \uC774\uBA54\uC77C\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4.
+
+##\uC7A5\uBC14\uAD6C\uB2C8
+CART_0001=\uC7A5\uBC14\uAD6C\uB2C8\uC5D0 \uB2F4\uACBC\uC2B5\uB2C8\uB2E4.
+
+##\uC8FC\uBB38
+ORDER_0001=\uC8FC\uBB38\uC815\uBCF4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.
+ORDER_0002=\uC8FC\uBB38\uC0C1\uD0DC\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.\n[\uACB0\uC81C\uC644\uB8CC][\uCD9C\uACE0\uC644\uB8CC] \uC0C1\uD0DC\uC5D0\uC11C\uB9CC \uC0C1\uD488\uC900\uBE44\uC911\uC73C\uB85C \uBCC0\uACBD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.
+ORDER_0003=\uD574\uB2F9 \uC0C1\uD488 \uBE0C\uB79C\uB4DC \uC218\uC815 \uAD8C\uD55C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.
+ORDER_0004=\uC8FC\uBB38\uC0C1\uD0DC\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.\n[\uC0C1\uD488\uC900\uBE44\uC911][\uAD6C\uB9E4\uD655\uC815] \uC0C1\uD0DC\uC5D0\uB9CC \uC1A1\uC7A5\uBC88\uD638\uB97C \uC785\uB825\uD558\uC2E4\uC218 \uC788\uC2B5\uB2C8\uB2E4.
+ORDER_0005=\uC8FC\uBB38\uC0C1\uD0DC\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.\n[\uCD9C\uACE0\uC644\uB8CC]\uC0C1\uD0DC\uC5D0\uC11C\uB9CC \uAD6C\uB9E4\uD655\uC815 \uC0C1\uD0DC\uB85C \uBCC0\uACBD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.
+ORDER_0006=\uAD6C\uB9E4\uD655\uC815\uC744 \uD558\uC2E4\uC218 \uC788\uB294 \uC0C1\uD488\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \n\uBC18\uD488\uC774\uB098 \uAD50\uD658\uC0C1\uD0DC\uB97C \uD655\uC778\uD574\uC8FC\uC2DC\uAE30 \uBC14\uB78D\uB2C8\uB2E4.
+ORDER_0007=\uC8FC\uBB38 \uC804\uCCB4\uCDE8\uC18C\uB97C \uD558\uC2E4\uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\n\uAD50\uD658,\uBC18\uD488,\uCDE8\uC18C\uC911\uC778 \uC0C1\uD488\uC774 \uC788\uB294\uC9C0 \uD655\uC778 \uBC14\uB78D\uB2C8\uB2E4.
+ORDER_0008=\uD0C0 \uC5C5\uCCB4\uC758 \uC0C1\uD488\uC774 \uC788\uC2B5\uB2C8\uB2E4. \uC804\uCCB4 \uBC18\uD488\uC744 \uC9C4\uD589\uD558\uC2E4\uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
+ORDER_0009=\uD3EC\uC778\uD2B8 \uC6D0\uBCF5 \uCC98\uB9AC\uB97C \uC2E4\uD328\uD558\uC600\uC2B5\uB2C8\uB2E4.
+ORDER_0010=\uACB0\uC81C \uCDE8\uC18C\uB97C \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.
+ORDER_0011=\uCE74\uB4DC \uACB0\uC81C\uC778 \uACBD\uC6B0\uC5D0\uB9CC \uBD80\uBD84\uCDE8\uC18C\uAC00 \uAC00\uB2A5\uD569\uB2C8\uB2E4.
+ORDER_0012=\uCDE8\uC18C\uC218\uB7C9\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694. \uCDE8\uC18C\uAC00\uB2A5 \uC218\uB7C9\uBCF4\uB2E4 \uB9CE\uC2B5\uB2C8\uB2E4.
+ORDER_0013=\uC8FC\uBB38\uC0C1\uD0DC\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.\n[\uACB0\uC81C\uC644\uB8CC][\uC0C1\uD488\uC900\uBE44\uC911]\uC0C1\uD0DC\uC5D0\uC11C\uB9CC \uBD80\uBD84\uCDE8\uC18C\uAC00 \uAC00\uB2A5\uD569\uB2C8\uB2E4.
+ORDER_0014=\uCD9C\uACE0\uC644\uB8CC\uB97C \uD558\uC2E4\uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\n\uC8FC\uBB38 \uCDE8\uC18C\uC2E0\uCCAD\uB41C \uC8FC\uBB38\uC744 \uBA3C\uC800 \uCC98\uB9AC\uD574\uC8FC\uC2DC\uAE30\uBC14\uB78D\uB2C8\uB2E4.
+ORDER_0015=\uC8FC\uBB38\uC0C1\uD0DC\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.\n[\uCD9C\uACE0\uC644\uB8CC]\uC0C1\uD0DC\uC5D0\uC11C\uB9CC \uC8FC\uBB38\uAD50\uD658\uC774 \uAC00\uB2A5\uD569\uB2C8\uB2E4.
+ORDER_0016=\uAD50\uD658\uC218\uB7C9\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694.\uAD50\uD658\uAC00\uB2A5 \uC218\uB7C9\uBCF4\uB2E4 \uB9CE\uC2B5\uB2C8\uB2E4.
+ORDER_0017=\uC8FC\uBB38\uC0C1\uD0DC\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.\n[\uAD50\uD658\uC2E0\uCCAD]\uC0C1\uD0DC\uC5D0\uC11C\uB9CC \uAD50\uD658\uC9C4\uD589\uC774 \uAC00\uB2A5\uD569\uB2C8\uB2E4.
+ORDER_0018=\uC8FC\uBB38\uC0C1\uD0DC\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.\n[\uAD50\uD658\uC9C4\uD589]\uC0C1\uD0DC\uC5D0\uC11C\uB9CC \uAD50\uD658\uC644\uB8CC\uAC00 \uAC00\uB2A5\uD569\uB2C8\uB2E4.
+ORDER_0019=\uC8FC\uBB38\uC0C1\uD0DC\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.\n[\uAD50\uD658\uC2E0\uCCAD]\uC0C1\uD0DC\uC5D0\uC11C\uB9CC \uAD50\uD658\uBC18\uB824\uAC00 \uAC00\uB2A5\uD569\uB2C8\uB2E4.
+ORDER_0020=\uC8FC\uBB38\uC0C1\uD0DC\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.\n[\uBC18\uD488\uC2E0\uCCAD]\uC0C1\uD0DC\uC5D0\uC11C\uB9CC \uBC18\uD488\uC9C4\uD589\uC774 \uAC00\uB2A5\uD569\uB2C8\uB2E4.
+ORDER_0021=\uC8FC\uBB38\uC0C1\uD0DC\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.\n[\uBC18\uD488\uC9C4\uD589]\uC0C1\uD0DC\uC5D0\uC11C\uB9CC \uBC18\uD488\uC644\uB8CC\uAC00 \uAC00\uB2A5\uD569\uB2C8\uB2E4.
+ORDER_0022=\uC8FC\uBB38\uC0C1\uD0DC\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.\n[\uBC18\uD488\uC2E0\uCCAD]\uC0C1\uD0DC\uC5D0\uC11C\uB9CC \uBC18\uD488\uBC18\uB824\uAC00 \uAC00\uB2A5\uD569\uB2C8\uB2E4.
+ORDER_0023=\uC8FC\uBB38\uC0C1\uD0DC\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.\n[\uCDE8\uC18C\uC2E0\uCCAD]\uC0C1\uD0DC\uC5D0\uC11C\uB9CC \uCDE8\uC18C\uBC18\uB824\uAC00 \uAC00\uB2A5\uD569\uB2C8\uB2E4.
+ORDER_0024=\uC8FC\uBB38\uC0C1\uD0DC\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.\n[\uCDE8\uC18C\uC2E0\uCCAD]\uC0C1\uD0DC\uC5D0\uC11C\uB9CC \uCDE8\uC18C\uC644\uB8CC\uAC00 \uAC00\uB2A5\uD569\uB2C8\uB2E4.
+ORDER_0025=\uBC18\uD488\uC218\uB7C9\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694. \uBC18\uD488\uAC00\uB2A5 \uC218\uB7C9\uBCF4\uB2E4 \uB9CE\uC2B5\uB2C8\uB2E4.
+ORDER_0026=\uC8FC\uBB38 \uC804\uCCB4\uBC18\uD488\uC744 \uD558\uC2E4\uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\n\uAD50\uD658,\uBC18\uD488,\uCDE8\uC18C\uC911\uC778 \uC0C1\uD488\uC774 \uC788\uB294\uC9C0 \uD655\uC778 \uBC14\uB78D\uB2C8\uB2E4.
+ORDER_0027=\uC8FC\uBB38\uC0C1\uD0DC\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.\n[\uC0C1\uD488\uC900\uBE44\uC911] \uC0C1\uD0DC\uC5D0\uC11C\uB9CC \uACB0\uC81C\uC644\uB8CC \uBCC0\uACBD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.
+ORDER_0028=\uACB0\uC81C \uC644\uB8CC \uC0C1\uD0DC\uB85C \uBCC0\uACBD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\n\uCDE8\uC18C,\uBC18\uD488\uC774 \uC644\uB8CC\uB41C \uC8FC\uBB38\uC785\uB2C8\uB2E4.
+ORDER_0029=\uC8FC\uBB38 \uC0C1\uD0DC\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694. [\uCD9C\uACE0\uC911][\uAD6C\uB9E4\uD655\uC815]\uC0C1\uD0DC\uC778 \uC8FC\uBB38\uAC74\uC774 \uC788\uC2B5\uB2C8\uB2E4.
+ORDER_0030=\uD544\uC218\uAC12\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.
+ORDER_0031=\uC8FC\uBB38\uC804\uCCB4\uCDE8\uC18C \uCC98\uB9AC\uAC00 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+
+##\uD68C\uC6D0
+CUST_0001=\uC815\uC0C1\uC801\uC73C\uB85C \uD0C8\uD1F4\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+CUST_0002=\uC774\uBBF8 \uD0C8\uD1F4\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+CUST_0003=\uC9C4\uD589\uC911\uC778 \uAC70\uB798\uAC00 \uC788\uC2B5\uB2C8\uB2E4. \uC9C4\uD589\uC911\uC778 \uAC70\uB798\uB97C \uC644\uB8CC \uD6C4 \uD0C8\uD1F4 \uC2E0\uCCAD\uC744 \uD574\uC8FC\uC138\uC694.
+CUST_0004=\uD0C8\uD1F4\uAC00 \uC815\uC0C1\uC801\uC73C\uB85C \uCC98\uB9AC\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.
+
+#\uC0AC\uBC29\uB137
+SABANGNET_0001=\uC131\uACF5\uC801\uC73C\uB85C \uC0C1\uD488 \uC815\uBCF4\uAC00 \uC804\uC1A1\uB418\uC5C8\uC2B5\uB2C8\uB2E4.(\uCD1D {0}\uAC74 \uC911 {1}\uAC74 \uC131\uACF5)
+SABANGNET_0002=\uC131\uACF5\uC801\uC73C\uB85C \uC1FC\uD551\uBAB0\uBCC4 DATA \uAC00 \uC804\uC1A1\uB418\uC5C8\uC2B5\uB2C8\uB2E4.(\uCD1D {0}\uAC74 \uC911 {1}\uAC74 \uC131\uACF5)
+SABANGNET_0003=\uC131\uACF5\uC801\uC73C\uB85C \uC0C1\uD488 \uC694\uC57D \uC815\uBCF4\uAC00 \uC804\uC1A1\uB418\uC5C8\uC2B5\uB2C8\uB2E4.(\uCD1D {0}\uAC74 \uC911 {1}\uAC74 \uC131\uACF5)
+SABANGNET_0004=\uC8FC\uBB38\uC774 \uC218\uC9D1\uB418\uC5C8\uC2B5\uB2C8\uB2E4.(\uCD1D {0}\uAC74 \uC911 {1}\uAC74 \uC131\uACF5, \uC2E4\uD328: {2}\uAC74)
+SABANGNET_0005=\uC131\uACF5\uC801\uC73C\uB85C \uC1A1\uC7A5\uBC88\uD638\uAC00 \uB4F1\uB85D\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+SABANGNET_0006=\uCDE8\uC18C\uC8FC\uBB38\uC774 \uC218\uC9D1\uB418\uC5C8\uC2B5\uB2C8\uB2E4.(\uCD1D {0}\uAC74 \uC911 {1}\uAC74 \uC2E4\uD328 {2}\uAC74 \uC131\uACF5)
+SABANGNET_0007=\uAD50\uD658\uC8FC\uBB38\uC774 \uC218\uC9D1\uB418\uC5C8\uC2B5\uB2C8\uB2E4.(\uCD1D {0}\uAC74 \uC911 {1}\uAC74 \uC2E4\uD328 {2}\uAC74 \uC131\uACF5)
+SABANGNET_0008=\uBC18\uD488\uC8FC\uBB38\uC774 \uC218\uC9D1\uB418\uC5C8\uC2B5\uB2C8\uB2E4.(\uCD1D {0}\uAC74 \uC911 {1}\uAC74 \uC2E4\uD328 {2}\uAC74 \uC131\uACF5)
+SABANGNET_0009=\uC720\uD6A8\uC131 \uAC80\uC99D \uC2E4\uD328\uB85C \uCC98\uB9AC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
+SABANGNET_0010=\uCD9C\uACE0\uB97C \uC704\uD574 ERP\uB85C \uC804\uC1A1\uD558\uC600\uC2B5\uB2C8\uB2E4.(\uC131\uACF5: {0}\uAC74, \uC2E4\uD328: {1}\uAC74)

+ 25 - 0
style24.front/target/classes/log/logback-dev.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<configuration scan="true">
+	<property name="LOG_HOME" value="./logs/applog"/>
+	<property name="LOG_LEVEL" value="DEBUG"/>
+	
+	<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>
+
+	<logger name="org.springframework" level="ERROR"/>
+	
+	<!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. -->
+	<logger name="jdbc.sqltiming" level="INFO" additivity="false">
+		<appender-ref ref="CONSOLE"/>
+	</logger>
+	
+	<root level="${LOG_LEVEL}">
+		<appender-ref ref="CONSOLE"/>
+	</root>
+
+</configuration>

+ 41 - 0
style24.front/target/classes/log/logback-locd.xml

@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<configuration scan="true">
+	<property name="LOG_HOME" value="/WIDE/workspace/logs/style24/front"/>
+	<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>
+	
+	<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> -->
+
+	<root level="${LOG_LEVEL}">
+		<appender-ref ref="CONSOLE"/>
+	</root>
+
+</configuration>

+ 41 - 0
style24.front/target/classes/log/logback-locp.xml

@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<configuration scan="true">
+	<property name="LOG_HOME" value="/WIDE/workspace/logs/style24/front"/>
+	<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>
+
+	<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> -->
+
+	<root level="${LOG_LEVEL}">
+		<appender-ref ref="CONSOLE"/>
+	</root>
+
+</configuration>

+ 39 - 0
style24.front/target/classes/log/logback-run.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<configuration scan="true">
+	<property name="LOG_HOME" value="./logs/applog"/>
+	<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}/wivismall_front.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}/wivismall_front.%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>
+
+	<root level="${LOG_LEVEL}">
+		<appender-ref ref="CONSOLE"/>
+		<appender-ref ref="FILE" />
+	</root>
+
+</configuration>

+ 24 - 0
style24.front/target/classes/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>

+ 7 - 0
style24.front/target/m2e-wtp/web-resources/META-INF/maven/com.style24.front/style24.front/pom.properties

@@ -0,0 +1,7 @@
+#Generated by Maven Integration for Eclipse
+#Wed Jan 13 09:48:24 KST 2021
+version=0.0.1-SNAPSHOT
+groupId=com.style24.front
+m2e.projectName=style24.front
+m2e.projectLocation=D\:\\WIDE\\workspace\\webapps\\style24\\STYLE24\\style24.front
+artifactId=style24.front

+ 111 - 0
style24.front/target/m2e-wtp/web-resources/META-INF/maven/com.style24.front/style24.front/pom.xml

@@ -0,0 +1,111 @@
+<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.front</groupId>
+	<artifactId>style24.front</artifactId>
+	<packaging>war</packaging>
+	<name>style24.front</name>
+	<description>STYLE24 Front</description>
+	
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-security</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.security</groupId>
+			<artifactId>spring-security-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-mobile</artifactId>
+			<version>1.5.22.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-thymeleaf</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>nz.net.ultraq.thymeleaf</groupId>
+			<artifactId>thymeleaf-layout-dialect</artifactId>
+		</dependency>
+		
+		<dependency>
+			<groupId>servlets.com</groupId>
+			<artifactId>cos</artifactId>
+			<version>05Nov2002</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-fileupload</groupId>
+			<artifactId>commons-fileupload</artifactId>
+			<version>1.4</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>2.6</version>
+		</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-security</artifactId>
+			<version>1.7.1-RELEASE</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-web-security-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>

+ 6 - 6
style24.scm/src/main/java/com/style24/persistence/domain/Goods.java

@@ -20,7 +20,7 @@ public class Goods extends TscBaseDomain {
 
 	private String goodsCd;		//상품코드
 	private int productNo;		//ProductNo(WMS)
-	private int productCode;		//ProductCode(WMS)
+	private String productCode;		//ProductCode(WMS)
 	private String brandCd;		//브랜드코드
 	private String itemkindCd;		//품목코드
 	private String goodsNm;		//상품명
@@ -41,7 +41,7 @@ public class Goods extends TscBaseDomain {
 
 	private String goodsStat;		//상품상태(공통코드G008)
 	private String selfMallYn;		//자사몰노출여부
-	private String goodsGb;		//해외구매대행/병행수입 상품일 경우 주문 시 통관부호 입력 란이 추가되어야 한다
+	private String goodsGb;		//상품구분(공콩코드 G073)
 	private String distributionGb;		//유통구분(공콩코드 G065)
 	private String selfGoodsYn;		//자사상품여부
 	private String supplyCompCd;		//공급업체코드
@@ -71,8 +71,8 @@ public class Goods extends TscBaseDomain {
 	private String erpPriceLinkYn;		//ERP가격연계여부(자사상품만 사용. Y:연계)
 	private String erpStockLinkYn;		//ERP재고연계여부(자사상품만 사용. Y:연계)
 	private String newCustOrdYn;		//신규고객 구매가능여부(Y:신규고객만 구매가능)
-	private String costPrice;		//원가
-	private String adultYn;		//성인용품여부
+	private int costPrice;		//원가
+	private String adultYn;		//성인용품여부 'Y', 'N'
 
 	private String brandEnm;		//브랜드영문명
 	private String brandGrpNm;		//브랜드그룹명
@@ -98,7 +98,7 @@ public class Goods extends TscBaseDomain {
 	private String goodsImageYn;
 	private String itemkindNm;
 	private String niClsfCd;
-	private String makeNm;
+	private String originNm;
 
 	private int currPriceOrg;
 	private String goodsStatOrg;
@@ -114,7 +114,7 @@ public class Goods extends TscBaseDomain {
 	private String custGrade;
 	private String custGradeName;
 //
-//	private String goodsRegMsg;
+	private String goodsRegMsg;
 	private String procJob;
 	private String excelFileNm;
 //	private String searchGb;

+ 80 - 0
style24.scm/src/main/java/com/style24/persistence/domain/GoodsMass.java

@@ -0,0 +1,80 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 대량등록 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 12
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsMass extends TscBaseDomain {
+
+	private String goodsNum;
+	private String brandCd;		//브랜드코드
+	private String itemkindCd;	//품목코드
+	private String goodsNm;		//상품명
+	private String styleYear;	//스타일연도
+	private String seasonCd;	//시즌코드(공통코드G006)
+	private String sexGb;		//성별구분(공통코드G007)
+	private String listPrice;		//정상가(최초판매가)
+	private String currPrice;		//현재판매가
+	private String costPrice;	//원가
+	private String delvFeeCd;	//배송비정책코드
+	private String originCd;	//제조국(원산지)
+	private String makeYmd;		//제조연월일
+
+	private String supplyCompCd;		//공급업체코드
+	private String supplyGoodsCd;		//공급업체상품코드(원코드)
+	private String goodsTnm;		//상품타이틀명
+	private String goodsSnm1;		//상품검색명1(사용자등록용)
+	private String goodsGb;			//상품구분(공콩코드 G073)
+	private String formalGb; 		//정상이월구분(공통코드G009)
+	private String distributionGb;		//유통구분(공콩코드 G065)
+	private String taxGb;		//과세구분(10:과세, 20:비과세)
+	private String adultYn;		//성인용품여부 'Y', 'N'
+
+	private String niClsfCd;
+	private String niContent1;
+	private String niContent2;
+	private String niContent3;
+	private String niContent4;
+	private String niContent5;
+	private String niContent6;
+	private String niContent7;
+	private String niContent8;
+	private String niContent9;
+	private String niContent10;
+	private String niContent11;
+	private String niContent12;
+	private String niContent13;
+	private String niContent14;
+	private String niContent15;
+	private String niContent16;
+	private String niContent17;
+	private String niContent18;
+	private String niContent19;
+	private String niContent20;
+	private String niContent21;
+	private String niContent22;
+	private String niContent23;
+	private String niContent24;
+	private String niContent25;
+	private String niContent26;
+	private String niContent27;
+	private String niContent28;
+
+	private String excelFileNm;
+	private String procJob;
+	private String procGb;
+
+	private int goodsRegSq;
+	private String regSuccYn;
+	private String regFailRsn;
+	private String goodsStat;		//상품상태(공통코드G008)
+
+}

+ 44 - 0
style24.scm/src/main/java/com/style24/persistence/domain/WmsGoods.java

@@ -0,0 +1,44 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+import com.style24.persistence.TssPageRequest;
+
+import lombok.Data;
+
+/**
+ * wms 상품 정보 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 04
+ */
+@SuppressWarnings("serial")
+@Data
+public class WmsGoods extends TscBaseDomain {
+
+	private Integer productNo;		//wms상품번호
+	private String productCode;		//wms상품코드
+	private String productName;		//상품명
+	private String modelNo;			//모델번호
+	private int providerNo;			//공급처번호
+	private String providerName;	//공급처명
+	private int brandNo;			//브랜드번호
+	private String brandName;		//브랜드명
+	private String goodsRegDt;		//상품등록일시
+	private String goodsRegGb;		//상품등록구분(G:상품, F:사은품)
+
+	private String supplyCompCd;
+	private String brandCd;
+	private String brandEnm;
+	private String stDate;
+	private String edDate;
+
+	private int startRow;
+	private int endRow;
+	private String goodsPriceYn;
+	// Pagination
+	private TssPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
+
+}

+ 11 - 5
style24.scm/src/main/java/com/style24/persistence/mybatis/shop/TssBusiness.xml

@@ -199,6 +199,8 @@
 		     , A.BRAND_ENM                   /*브랜드영문명*/
 		     , A.BRAND_KNM                   /*브랜드한글명*/
 		     , A.BRAND_GRP_NM                /*브랜드그룹명*/
+		     , A.DISP_NM_LANG                /*노출명언어*/
+		     , A.RGB_CD                      /*RGB코드*/
 		     , A.DISTRIBUTION_GB             /*유통구분*/
 		     , A.SUPPLY_COMP_CD              /*업체코드*/
 		     , B.SUPPLY_COMP_NM              /*업체명*/
@@ -206,18 +208,22 @@
 		     , C.DELV_LOC_NM                 /*출고처명*/
 		     , A.ERP_BRAND_CD                /*ERP브랜드코드*/
 		     , A.SELF_YN                     /*자사여부*/
-		     , A.DELV_FEE                    /*기본배송비*/
-		     , A.MIN_ORD_AMT                 /*무료배송비기준*/
+		     , A.DELV_FEE_CD                 /*배송비정책코드*/
 		     , A.SELL_FEE_RATE               /*판매수수료율*/
 		     , A.USE_YN                      /*사용여부*/
 		     , A.PNT_PRATE10                 /*포인트적립율(PC)*/
 		     , A.PNT_MRATE10                 /*포인트적립율(모바일)*/
 		     , A.PNT_PRATE20                 /*포인트적립율(PC)*/
 		     , A.PNT_MRATE20                 /*포인트적립율(모바일)*/
+		     , A.LOGO_FILE_NM                 /*로고파일명*/
 		     , A.DISP_ORD                    /*표시순서*/
+		     , D.MIN_ORD_AMT                 /*무료배송최소금액*/
+		     , D.DELV_FEE                    /*배송비*/
 		FROM   TB_BRAND A
 		INNER JOIN TB_SUPPLY_COMPANY B ON A.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD
 		LEFT OUTER JOIN TB_DELIVERY_LOC C ON A.DELV_LOC_CD = C.DELV_LOC_CD
+		LEFT OUTER JOIN TB_DELV_FEE_POLICY D ON A.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
+		                                  AND A.DELV_FEE_CD =  D.DELV_FEE_CD
 		WHERE  1 = 1
 		<if test='supplyCompCd != null and supplyCompCd != ""'>
 		AND    A.SUPPLY_COMP_CD = #{supplyCompCd}
@@ -235,11 +241,11 @@
 		AND    (
 		        A.BRAND_CD LIKE CONCAT('%',#{searchTxt},'%')
 		        OR
-		        A.BRAND_ENM LIKE CONCAT('%',#{searchTxt},'%')
+		        UPPER(A.BRAND_ENM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
 		        OR
-		        A.BRAND_KNM LIKE CONCAT('%',#{searchTxt},'%')
+		        UPPER(A.BRAND_KNM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
 		        OR
-		        A.BRAND_GRP_NM LIKE CONCAT('%',#{searchTxt},'%')
+		        UPPER(A.BRAND_GRP_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
 		       )
 		</if>
 		<if test='useYn != null and useYn != ""'>

+ 5 - 5
style24.scm/src/main/java/com/style24/persistence/mybatis/shop/TssCommon.xml

@@ -63,13 +63,13 @@
 		WHERE  SAMPLE_FILE_ID = #{sampleFileId}
 	</select>
 	
-	<!-- ERP 연동 여부 -->
-	<select id="getErpSyncYn" resultType="String">
-		/* TsaSystem.getErpSyncYn */
-		SELECT UPPER(NVL(USE_YN,'N')) AS ERP_SYNC_YN
+	<!-- WMS 연동 여부 -->
+	<select id="getWmsSyncYn" resultType="String">
+		/* TsaSystem.getWmsSyncYn */
+		SELECT UPPER(NVL(USE_YN,'N')) AS WMS_SYNC_YN
 		FROM TB_COMMON_CODE
 		WHERE CD_GB = 'G077'
-		AND CD = 'ERPSYNCYN'
+		AND CD = 'WMSSYNCYN'
 	</select>
 	
 </mapper>

+ 356 - 17
style24.scm/src/main/java/com/style24/persistence/mybatis/shop/TssGoods.xml

@@ -2,6 +2,25 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.style24.scm.biz.dao.TssGoodsDao">
 
+	<!-- 품목 목록 -->
+	<select id="getItemkindList" parameterType="Itemkind" resultType="Itemkind">
+		/* TssGoods.getItemkindList */
+		SELECT ITEMKIND_CD
+		     , ITEMKIND_NM
+		     /* , ITEMKIND_ENM*/
+		     , NI_CLSF_CD
+		     , USE_YN
+		FROM TB_ITEMKIND
+		WHERE 1 = 1
+		<if test="itemkindCd != null and itemkindCd != ''">
+		AND ITEMKIND_CD = #{itemkindCd} 
+		</if>
+		<if test="useYn != null and useYn != ''">
+		AND USE_YN = #{useYn} 
+		</if>
+		ORDER BY ITEMKIND_CD
+	</select>
+	
 	<!-- 상품 목록 건수 -->
 	<select id="getGoodsListCount" parameterType="GoodsSearch" resultType="int">
 		/* TssGoods.getGoodsListCount */
@@ -666,7 +685,7 @@
 	
 	<!-- 상품 기본정보 이력 생성 -->
 	<insert id="createGoodsHst" parameterType="Goods">
-		/* TsaGoods.createGoodsHst */
+		/* TssGoods.createGoodsHst */
 		INSERT INTO TB_GOODS_HST 
 		(       GOODS_CD
 		      , PRODUCT_NO
@@ -1256,7 +1275,7 @@
 	
 	<!-- 상품 상세 정보 이력 생성 -->
 	<insert id="createGoodsDetailDescHst" parameterType="GoodsDesc">
-		/* TsaGoods.createGoodsDetailDescHst */
+		/* TssGoods.createGoodsDetailDescHst */
 		INSERT INTO TB_GOODS_DESC_HST (
 		    GOODS_CD
 		  , DESC_GB
@@ -1409,7 +1428,7 @@
 	
 	<!-- 상품 옵션 존재여부 확인 -->
 	<select id="getGoodsOptionCount" parameterType="Option" resultType="int">
-		/* TsaGoods.getGoodsOptionCount */
+		/* TssGoods.getGoodsOptionCount */
 		SELECT COUNT(*)
 		FROM TB_OPTION
 		WHERE GOODS_CD = #{goodsCd}
@@ -1420,7 +1439,7 @@
 	
 	<!-- 상품 가격 승인 목록 건수 -->
 	<select id="getGoodsSupplyPriceCount"  parameterType="GoodsPriceRes" resultType="int">
-		/* TsaGoods.getGoodsSupplyPriceCount */
+		/* TssGoods.getGoodsSupplyPriceCount */
 		SELECT COUNT(A.GOODS_PRICE_RES_SQ)
 		FROM TB_GOODS_PRICE_RES A
 		INNER JOIN TB_GOODS G ON A.GOODS_CD = G.GOODS_CD
@@ -1466,7 +1485,7 @@
 	
 	<!-- 상품 가격 승인 목록 -->
 	<select id="getGoodsSupplyPriceList"  parameterType="GoodsPriceRes" resultType="GoodsPriceRes">
-		/* TsaGoods.getGoodsSupplyPriceList */
+		/* TssGoods.getGoodsSupplyPriceList */
 		SELECT Q.*
 		FROM (
 		SELECT Z.*
@@ -1571,7 +1590,7 @@
 	
 	<!-- 상품상세 공지사항 목록 -->
 	<select id="getNoticeList" parameterType="GoodsSearch" resultType="Notice">
-		/* TsaGoods.getNoticeList */
+		/* TssGoods.getNoticeList */
 		SELECT A.NOTICE_SQ                                  
 		     , A.NOTICE_TYPE                                
 		     , A.NOTICE_TITLE                               
@@ -1653,7 +1672,7 @@
 	
 	<!-- 상품상세 공지사항 상품 목록 -->
 	<select id="getNoticeGoodsList" parameterType="Notice" resultType="NoticeGoods">
-		/* TsaGoods.getNoticeGoodsList */
+		/* TssGoods.getNoticeGoodsList */
 		SELECT A.NOTICE_SQ
 		     , A.GOODS_CD
 		     , B.GOODS_NM
@@ -1665,7 +1684,7 @@
 	
 	<!-- 상품상세 공지사항 상품저장 -->
 	<insert id="saveNoticeGoods" parameterType="NoticeGoods">
-		/* TsaGoods.saveNoticeGoods */
+		/* TssGoods.saveNoticeGoods */
 		INSERT INTO TB_NOTICE_GOODS (
 		       NOTICE_SQ
 		     , GOODS_CD
@@ -1688,7 +1707,7 @@
 	
 	<!-- 상품상세 공지사항 상품 삭제 -->
 	<delete id="deleteNoticeGoods" parameterType="NoticeGoods">
-		/* TsaGoods.deleteNoticeGoods */
+		/* TssGoods.deleteNoticeGoods */
 		DELETE FROM TB_NOTICE_GOODS 
 		WHERE NOTICE_SQ =  #{noticeSq}
 		AND GOODS_CD = #{goodsCd}
@@ -1696,7 +1715,7 @@
 	
 	<!-- 상품 가격예약 등록 -->
 	<insert id="createGoodPriceRes" parameterType="GoodsPriceRes">
-		/* TsaGoods.createGoodPriceRes */
+		/* TssGoods.createGoodPriceRes */
 		INSERT INTO TB_GOODS_PRICE_RES (
 		  GOODS_PRICE_RES_SQ
 		, GOODS_CD
@@ -1735,7 +1754,7 @@
 	
 	<!-- 상품 구매등급 목록 -->
 	<select id="getGoodsDetailOrderGradeList" parameterType="Goods" resultType="Goods">
-		/* TsaGoods.getGoodsDetailOrderGradeList */
+		/* TssGoods.getGoodsDetailOrderGradeList */
 		SELECT  G.GOODS_CD
 		      , A.CUST_GRADE
 		      , FN_GET_CODE_NM('G101', A.CUST_GRADE) AS CUST_GRADE_NAME
@@ -1747,14 +1766,14 @@
 	
 	<!-- 상품 구매등급 삭제 -->
 	<delete id="deleteGoodsCustGrade" parameterType="Goods" >
-		/* TsaGoods.saveGoodsNaverLowestPrice */
+		/* TssGoods.saveGoodsNaverLowestPrice */
 		DELETE FROM TB_GOODS_ORDER_GRADE
 		WHERE GOODS_CD = #{goodsCd}
 	</delete>
 	
 	<!-- 상품 구매등급 저장 -->
 	<insert id="createGoodsCustGrade"  parameterType="Goods" >
-		/* TsaGoods.createGoodsCustGrade */
+		/* TssGoods.createGoodsCustGrade */
 		INSERT INTO TB_GOODS_ORDER_GRADE (
 		    GOODS_CD
 		  , CUST_GRADE
@@ -1771,7 +1790,7 @@
 	
 	<!-- 상품이미지 목록 -->
 	<select id="getGoodsImageList" parameterType="GoodsImg" resultType="GoodsImg">
-		/* TsaGoods.getGoodsImageList */
+		/* TssGoods.getGoodsImageList */
 		SELECT GOODS_CD
 		     , COLOR_CD
 		     , DISP_ORD
@@ -1786,7 +1805,7 @@
 	
 	<!-- 상품이미지 전체 삭제 -->
 	<delete id="deleteGoodsImageTotal" parameterType="GoodsImg">
-		/* TsaGoods.deleteGoodsImageTotal */
+		/* TssGoods.deleteGoodsImageTotal */
 		DELETE
 		FROM TB_GOODS_IMG
 		WHERE GOODS_CD = #{goodsCd}
@@ -1795,7 +1814,7 @@
 
 	<!-- 상품이미지 삭제 -->
 	<delete id="deleteGoodsImage" parameterType="GoodsImg">
-		/* TsaGoods.deleteGoodsImage */
+		/* TssGoods.deleteGoodsImage */
 		DELETE
 		FROM TB_GOODS_IMG
 		WHERE GOODS_CD = #{goodsCd}
@@ -1805,7 +1824,7 @@
 
 	<!-- 상품이미지 등록 -->
 	<insert id="createGoodsImage" parameterType="GoodsImg">
-		/* TsaGoods.createGoodsImage */
+		/* TssGoods.createGoodsImage */
 		INSERT INTO TB_GOODS_IMG (
 		       GOODS_CD
 		     , COLOR_CD
@@ -1826,4 +1845,324 @@
 		)
 	</insert>
 	
+	<!-- wms 상품정보 조회 -->
+	<select  id="getWmsGoodsInfo" parameterType="GoodsMass" resultType="WmsGoods" >
+		/* TssGoods.getWmsGoodsInfo */
+		SELECT PRODUCT_NO
+		     , PRODUCT_CODE
+		     , PRODUCT_NAME
+		     , MODEL_NO
+		     , PROVIDER_NO
+		     , PROVIDER_NAME
+		     , BRAND_NO
+		     , BRAND_NAME
+		     , GOODS_REG_DT
+		     , GOODS_REG_GB
+		FROM TB_WMS_GOODS
+		WHERE LEFT(MODEL_NO,10) = #{goodsCd}
+	</select>
+	
+	<!-- WMS 입고상품 사은품 상품 구분 저장 -->
+	<update id="saveGoodsWmsIncomelot" parameterType="WmsGoods">
+		/* TsaGoods.saveGoodsWmsIncomelot */
+		UPDATE TB_WMS_GOODS
+		SET GOODS_REG_GB = #{goodsRegGb} /* G: 상품, F: 사은품*/
+		  , GOODS_REG_DT = NOW()
+		  , UPD_NO = #{updNo}
+		  , UPD_DT = NOW()
+		WHERE PRODUCT_NO = #{productNo}
+	</update>
+	
+	
+	<!-- 품목 별 고시기본정보  조회 -->
+	<select id="getItemkindNotiInfoList" parameterType="Goods" resultType="GoodsNotiInfo">
+		/* TsaGoods.getItemkindNotiInfoList */
+		SELECT A.ITEMKIND_CD 
+		     , B.NI_CLSF_CD
+		     , B.NI_ITEM_CD
+		     , B.NI_CONTENT
+		     , B.DISP_ORD
+		     , FN_GET_CODE_NM('G005', B.NI_ITEM_CD) AS NI_ITEM_NM
+		     , #{goodsCd} AS GOODS_CD
+		     , B.DISP_YN
+		     , B.REQ_YN
+		FROM TB_ITEMKIND A
+		INNER JOIN TB_NOTI_INFO B ON A.NI_CLSF_CD = B.NI_CLSF_CD
+		                          AND B.SUPPLY_COMP_CD = (CASE #{supplyCompCd} WHEN 'S0001' THEN 'S0001' 
+		                                                                       WHEN 'S0002' THEN 'S0002'
+		                                                                       ELSE 'E' END)             
+		WHERE A.ITEMKIND_CD = #{itemkindCd}
+		ORDER BY  B.NI_CLSF_CD, B.DISP_ORD
+	</select>
+	
+	<!-- 상품  등록 로그 생성 -->
+	<insert id="createGoodsRegLog" parameterType="GoodsMass">
+		/* TsaGoods.createGoodsRegLog */
+		INSERT INTO TB_GOODS_REG_LOG (
+		    GOODS_REG_SQ
+		  , PROC_GB
+		  , GOODS_CD
+		  , SUPPLY_COMP_CD
+		  , GOODS_NM
+		  , GOODS_TNM
+		  , GOODS_SNM1
+		  , ORIGIN_CD
+		  , MAKE_YMD
+		  , BRAND_CD
+		  , ITEMKIND_CD
+		  , STYLE_YEAR
+		  , SEASON_CD
+		  , SEX_GB
+		  , GOODS_NUM
+		  , LIST_PRICE
+		  , CURR_PRICE
+		  , COST_PRICE
+		  , SUPPLY_GOODS_CD
+		  , FORMAL_GB
+		  , GOODS_GB
+		  , TAX_GB
+		  , ADULT_YN
+		  , OPT_STR
+		  , BASE_STOCK_STR
+		  , CURR_STOCK_STR
+		  , NI_CLSF_CD
+		  , NI_CONTENT1
+		  , NI_CONTENT2
+		  , NI_CONTENT3
+		  , NI_CONTENT4
+		  , NI_CONTENT5
+		  , NI_CONTENT6
+		  , NI_CONTENT7
+		  , NI_CONTENT8
+		  , NI_CONTENT9
+		  , NI_CONTENT10
+		  , NI_CONTENT11
+		  , NI_CONTENT12
+		  , NI_CONTENT13
+		  , NI_CONTENT14
+		  , NI_CONTENT15
+		  , NI_CONTENT16
+		  , NI_CONTENT17
+		  , NI_CONTENT18
+		  , NI_CONTENT19
+		  , NI_CONTENT20
+		  , NI_CONTENT21
+		  , NI_CONTENT22
+		  , NI_CONTENT23
+		  , NI_CONTENT24
+		  , NI_CONTENT25
+		  , NI_CONTENT26
+		  , NI_CONTENT27
+		  , NI_CONTENT28
+		  , REG_SUCC_YN
+		  , REG_FAIL_RSN
+		  , REG_NO
+		  , REG_DT
+		)
+		VALUES(
+		    NULL
+		  , #{procGb}
+		  , #{goodsCd}
+		  , #{supplyCompCd}
+		  , #{goodsNm}
+		  , #{goodsTnm}
+		  , #{goodsSnm1}
+		  , #{originCd}
+		  , #{makeYmd}
+		  , #{brandCd}
+		  , #{itemkindCd}
+		  , #{styleYear}
+		  , #{seasonCd}
+		  , #{sexGb}
+		  , #{goodsNum}
+		  , #{listPrice}
+		  , #{currPrice}
+		  , #{costPrice}
+		  , #{supplyGoodsCd}
+		  , #{formalGb}
+		  , #{goodsGb}
+		  , #{taxGb}
+		  , #{adultYn}
+		  , #{optStr}
+		  , #{baseStockStr}
+		  , #{currStockStr}
+		  , #{niClsfCd}
+		  , #{niContent1}
+		  , #{niContent2}
+		  , #{niContent3}
+		  , #{niContent4}
+		  , #{niContent5}
+		  , #{niContent6}
+		  , #{niContent7}
+		  , #{niContent8}
+		  , #{niContent9}
+		  , #{niContent10}
+		  , #{niContent11}
+		  , #{niContent12}
+		  , #{niContent13}
+		  , #{niContent14}
+		  , #{niContent15}
+		  , #{niContent16}
+		  , #{niContent17}
+		  , #{niContent18}
+		  , #{niContent19}
+		  , #{niContent20}
+		  , #{niContent21}
+		  , #{niContent22}
+		  , #{niContent23}
+		  , #{niContent24}
+		  , #{niContent25}
+		  , #{niContent26}
+		  , #{niContent27}
+		  , #{niContent28}
+		  , #{regSuccYn}
+		  , #{regFailRsn}
+		  , #{regNo}
+		  , NOW()
+		)
+	</insert>
+	
+	
+	<!-- 상품 품목별 매핑 카테고리 저장 (LEAF 상위카테고리까지)-->
+	<insert id="createCategoryGoods_ORG" parameterType="Goods">
+		/* TssGoods.createCategoryGoods */
+		INSERT INTO TB_CATE_GOODS
+		    (CATE_NO
+		   , GOODS_CD
+		   , DISP_ORD
+		   , REG_NO
+		   , REG_DT
+		    )
+		WITH RECURSIVE TAB_GOODS AS (
+		    SELECT A.GOODS_CD
+		         , A.ITEMKIND_CD
+		         , B.CATE_NO
+		    FROM TB_GOODS A
+		    INNER JOIN TB_ITEMKIND_CATE  B ON A.ITEMKIND_CD = B.ITEMKIND_CD
+		    WHERE A.GOODS_CD = #{goodsCd}
+		)
+		, TAB_4SCRH AS (
+		    SELECT  LEAF_CATE_NO
+		          , CATE1_NO
+		          , CATE2_NO
+		          , CATE3_NO
+		          , CATE4_NO
+		          , CATE5_NO
+		    FROM  TB_CATE_4SRCH
+		    WHERE SITE_CD = 'G000_10'
+		    AND CATE_TYPE = 'G031_10' -- 상품타입
+		)
+		, TAB_CATE AS (
+		    SELECT LEAF_CATE_NO 
+		         , CATE_LVL 
+		         , CATE_NO
+		    FROM (
+		          SELECT LEAF_CATE_NO ,
+		                 CASE WHEN X = 1 THEN 'CATE1_NO'  -- 컬럼과 매핑(컬럼명)
+		                      WHEN X = 2 THEN 'CATE2_NO'
+		                      WHEN X = 3 THEN 'CATE3_NO'
+		                      WHEN X = 4 THEN 'CATE4_NO'
+		                      ELSE  'CATE5_NO' 
+		                 END CATE_LVL,
+		                 CASE WHEN X = 1 THEN CATE1_NO  -- 컬럼과 매핑(컬럼 데이터)
+		                      WHEN X = 2 THEN CATE2_NO
+		                      WHEN X = 3 THEN CATE3_NO
+		                      WHEN X = 4 THEN CATE4_NO
+		                      ELSE  CATE5_NO 
+		                 END CATE_NO
+		          FROM (
+		                 SELECT * FROM TAB_4SCRH A,
+		                 (SELECT 1 AS X                -- UNPIVOT 컬럼 수 만큼 선언
+		                  UNION ALL SELECT 2 AS X
+		                  UNION ALL SELECT 3 AS X
+		                  UNION ALL SELECT 4 AS X
+		                  UNION ALL SELECT 5 AS X
+		                ) B
+		         ) A
+		    ORDER BY LEAF_CATE_NO, CATE_LVL
+		) C
+		WHERE CATE_NO IS NOT NULL
+		)
+		SELECT DISTINCT B.CATE_NO
+		     , A.GOODS_CD
+		     , 9999
+		     , #{regNo}
+		     , NOW()
+		FROM TAB_GOODS A, TAB_CATE B
+		WHERE 1 = 1 
+		AND A.CATE_ NO = B.LEAF_CATE_NO
+		AND NOT EXISTS (SELECT 1
+		                FROM TB_CATE_GOODS
+		                WHERE CATE_NO = B.CATE_NO
+		                AND GOODS_CD = A.GOODS_CD
+		                )
+	</insert>
+	
+	<!-- 상품 품목별 매핑 카테고리 저장 (LEAF CATE에만 상품 적용 )-->
+	<insert id="createCategoryGoods" parameterType="Goods">
+		/* TssGoods.createCategoryGoods */
+		INSERT INTO TB_CATE_GOODS
+		    (CATE_NO
+		   , GOODS_CD
+		   , DISP_ORD
+		   , REG_NO
+		   , REG_DT
+		    )
+		 SELECT B.CATE_NO
+		      , A.GOODS_CD
+		      , 9999
+		      , #{regNo}
+		      , NOW()
+		FROM TB_GOODS A
+		INNER JOIN TB_ITEMKIND_CATE  B ON A.ITEMKIND_CD = B.ITEMKIND_CD
+		INNER JOIN TB_CATE_4SRCH C ON B.CATE_NO = C.LEAF_CATE_NO
+		                   AND C.SITE_CD = 'G000_10'
+		                   AND C.CATE_TYPE = 'G031_10' -- 상품타입
+		WHERE A.GOODS_CD = #{goodsCd}
+		AND NOT EXISTS (SELECT 1
+		                FROM TB_CATE_GOODS
+		                WHERE CATE_NO = B.CATE_NO
+		                AND GOODS_CD = A.GOODS_CD
+		                )
+	</insert>
+	
+	<!-- wms 상품 색상 , 사이즈별 재고 정보 조회 -->
+	<select id="getGoodsWmsSizeList" parameterType="Goods"  resultType = "Option">
+		/* TssGoods.getGoodsWmsSizeList */
+		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
+		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
+			, 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_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
+	</select>
+	
 </mapper>

+ 2 - 2
style24.scm/src/main/java/com/style24/scm/biz/dao/TssCommonDao.java

@@ -49,11 +49,11 @@ public interface TssCommonDao {
 	String getSampleFileSystemFilename(String sampleFileId);
 
 	/**
-	 * ERP 연동 여부
+	 * WMS 연동 여부
 	 *
 	 * @return
 	 * @author eskim
 	 * @since 2020. 01. 16
 	 */
-	String getErpSyncYn();
+	String getWmsSyncYn();
 }

+ 79 - 0
style24.scm/src/main/java/com/style24/scm/biz/dao/TssGoodsDao.java

@@ -9,13 +9,16 @@ import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsImg;
+import com.style24.persistence.domain.GoodsMass;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
 import com.style24.persistence.domain.GoodsSearch;
+import com.style24.persistence.domain.Itemkind;
 import com.style24.persistence.domain.NotiInfo;
 import com.style24.persistence.domain.Notice;
 import com.style24.persistence.domain.NoticeGoods;
 import com.style24.persistence.domain.Option;
+import com.style24.persistence.domain.WmsGoods;
 
 import com.gagaframework.web.parameter.GagaMap;
 
@@ -28,6 +31,16 @@ import com.gagaframework.web.parameter.GagaMap;
 @ShopDs
 public interface TssGoodsDao {
 
+	/**
+	 * 품목 목록
+	 * @param itemkind
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 12
+	 */
+	Collection<Itemkind> getItemkindList(Itemkind itemkind);
+
+
 	/**
 	 * 상품 목록 건수
 	 *
@@ -404,4 +417,70 @@ public interface TssGoodsDao {
 	 */
 	public void createGoodsImage(GoodsImg goodsImg);
 
+	/**
+	 * wms 상품정보 조회
+	 *
+	 * @param goodsMass
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 12
+	 */
+	WmsGoods getWmsGoodsInfo(GoodsMass goodsMass);
+
+	/**
+	 * 상품통계 생성
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2021. 01. 12
+	 */
+	void createGoodsSmmary(Goods goods);
+
+	/**
+	 *  WMS 입고상품 사은품 상품 구분 저장
+	 * @param wmsGoods
+	 * @author eskim
+	 * @since 2021. 01. 12
+	 */
+	public void saveGoodsWmsIncomelot(WmsGoods wmsGoods);
+
+	/**
+	 * 품목 별 고시기본정보 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 12
+	 */
+	Collection<GoodsNotiInfo> getItemkindNotiInfoList(Goods goods);
+
+
+	/**
+	 * 상품 등록 로그 생성
+	 *
+	 * @param goodsMass
+	 * @author eskim
+	 * @since 2021. 01. 12
+	 */
+	void createGoodsRegLog(GoodsMass goodsMass);
+
+	/**
+	 * 상품 품목별 매핑 카테고리 저장
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2021. 01. 12
+	 */
+	void createCategoryGoods(Goods goods);
+
+	/**
+	 * wms 상품 색상 , 사이즈별 재고 정보 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 13
+	 */
+	Collection<Option> getGoodsWmsSizeList(Goods goods);
+
 }

+ 3 - 3
style24.scm/src/main/java/com/style24/scm/biz/service/TssCommonService.java

@@ -69,15 +69,15 @@ public class TssCommonService {
 	}
 
 	/**
-	 * ERP 연동 여부
+	 * WMS 연동 여부
 	 *
 	 * @param
 	 * @return
 	 * @author eskim
 	 * @since 2020. 01. 16
 	 */
-	public String getErpSyncYn() {
-		return commonDao.getErpSyncYn();
+	public String getWmsSyncYn() {
+		return commonDao.getWmsSyncYn();
 	}
 
 }

+ 542 - 0
style24.scm/src/main/java/com/style24/scm/biz/service/TssGoodsService.java

@@ -1,6 +1,8 @@
 package com.style24.scm.biz.service;
 
 import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Collection;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -13,18 +15,22 @@ import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.Brand;
+import com.style24.persistence.domain.CommonCode;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsImg;
+import com.style24.persistence.domain.GoodsMass;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
 import com.style24.persistence.domain.GoodsSearch;
+import com.style24.persistence.domain.Itemkind;
 import com.style24.persistence.domain.NotiInfo;
 import com.style24.persistence.domain.Notice;
 import com.style24.persistence.domain.NoticeGoods;
 import com.style24.persistence.domain.Option;
 import com.style24.persistence.domain.SearchData;
+import com.style24.persistence.domain.WmsGoods;
 import com.style24.scm.biz.dao.TssGoodsDao;
 import com.style24.scm.support.env.TssConstants;
 import com.style24.scm.support.security.session.TssSession;
@@ -66,9 +72,18 @@ public class TssGoodsService {
 	@Autowired
 	private TssNoticeService noticeService;
 
+	@Autowired
+	private TssRendererService rendererService;
+
+
+
 	@Autowired
 	private ObjectMapper mapper;
 
+	private static final String NUMBER_PATTERN = "^[0-9]+$";
+
+	private static final String UPDATE_NO_PATTERN = "X";
+
 	/**
 	 * 상품 목록 건수
 	 *
@@ -1058,4 +1073,531 @@ public class TssGoodsService {
 		}
 	}
 
+	/**
+	 * 상품대량등록 엑셀 저장 - 자사상품
+	 *
+	 * @param ecxelGoodsList, excelFilename, procJob(자사:createSelfGoods, 입점:createGoods)
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 12
+	 */
+	@Transactional("shopTxnManager")
+	public void createExceluploadSelfGoods(Collection<GagaMap> ecxelGoodsList, String excelFilename, String procJob) {
+		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
+		if ((ecxelGoodsList == null || ecxelGoodsList.isEmpty())) {
+			this.deleteExceluploadFile(targetPath, excelFilename);
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		for (GagaMap gagaMap : ecxelGoodsList) {
+			GoodsMass goodsMass = mapper.convertValue(gagaMap, GoodsMass.class);
+
+			// 상품기본정보
+			Goods goods = this.createSelfGoodsInfo(goodsMass, procJob);
+
+			if ("10".equals(goods.getGoodsStat())) { // 정보 오류
+				this.setGoodsRegResult(goods, goodsMass, procJob);
+				continue;
+			}
+
+			// 상품고시정보
+			Collection<GoodsNotiInfo> goodsNotiList = goodsDao.getItemkindNotiInfoList(goods);
+			if (goodsNotiList == null || goodsNotiList.isEmpty()) {
+				goods.setGoodsRegMsg("품목의 고시정보 없음");
+				goods.setGoodsStat("10");
+				this.setGoodsRegResult(goods, goodsMass, procJob);
+				continue;
+			}
+
+			// 자사 상품 등록시 고시정보 처리
+			for (GoodsNotiInfo goodsNotiInfo : goodsNotiList) {
+//				if ("003".equals(goodsNotiInfo.getNiItemCd())) {	// 색상
+//					if (!StringUtils.isEmpty(goods.getColorNm())) {
+//						goodsNotiInfo.setNiContent(goods.getColorNm());
+//					}
+//				} else if ("004".equals(goodsNotiInfo.getNiItemCd())) {	//치수
+//					if (!StringUtils.isEmpty(goods.getSizeName())) {
+//						goodsNotiInfo.setNiContent(goods.getSizeName());
+//					}
+				if ("006".equals(goodsNotiInfo.getNiItemCd())) {	//제조국
+					if (!StringUtils.isEmpty(goods.getOriginNm())) {
+						goodsNotiInfo.setNiContent(goods.getOriginNm());
+					}
+				} else if ("009".equals(goodsNotiInfo.getNiItemCd())) {	//제조년월
+					if (!StringUtils.isEmpty(goods.getMakeYmd())) {
+						goodsNotiInfo.setNiContent(goods.getMakeYmd());
+					}
+				} else if ("097".equals(goodsNotiInfo.getNiItemCd())) {	//수입여부
+					if (!StringUtils.isEmpty(goods.getOriginNm()) &&
+							(goods.getOriginNm().indexOf("대한민국") >= 0 || goods.getOriginNm().indexOf("한국") >= 0 || goods.getOriginNm().toUpperCase().indexOf("KOREA") >= 0)) {
+						goodsNotiInfo.setNiContent("N");
+					} else {
+						goodsNotiInfo.setNiContent("Y");
+					}
+				}
+			}
+
+			//고시항목 필수값 확인
+			goods = this.getGoodsNotiCheck(goods, goodsNotiList, gagaMap, procJob);
+
+			Collection<Option> goodsWmsSizeList = new ArrayList<>();
+
+			// 상품사이즈 정보 -- 재고 정보연동 해야함
+			goodsWmsSizeList = goodsDao.getGoodsWmsSizeList(goods);
+			if (goodsWmsSizeList == null || goodsWmsSizeList.isEmpty()) {
+				goods.setGoodsRegMsg("WMS 상품 사이즈 정보 없음");
+				goods.setGoodsStat("20");
+			}
+
+			// 할인율
+			goods.setDcRate((int)(this.getDcRate(goods.getListPrice(), goods.getCurrPrice())));
+
+			goodsDao.createGoods(goods); // 상품기본 저장
+			goodsDao.createGoodsSmmary(goods); // 상품통계 생성
+
+			WmsGoods wmsGoods = new WmsGoods();
+			wmsGoods.setUpdNo(TssSession.getInfo().getUserNo());
+			wmsGoods.setGoodsRegGb("G"); // G: 상품, F: 사은품
+			wmsGoods.setProductNo(goods.getProductNo());
+			goodsDao.saveGoodsWmsIncomelot(wmsGoods); // wms 상품 상품등록일 변경
+
+			this.createGoodsNoti(gagaMap, goodsNotiList); // 상품고시정보 저장
+			this.createSelfGoodsSize(goods, goodsWmsSizeList); // 자사 상품사이즈 정보 자장
+
+			// 사용자 검색어를 검색어에 적용
+			String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
+			if (!StringUtils.isEmpty(goods.getGoodsSnm1())) {
+				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);
+
+			} else if (!goodsSnm.equals(goods.getGoodsSnm())) {
+				goods.setGoodsSnm(goodsSnm);
+			}
+
+			goodsDao.updateGoodsSnm(goods);
+
+			goodsDao.createCategoryGoods(goods);
+
+			this.setGoodsRegResult(goods, goodsMass, procJob);
+
+		}
+	}
+
+	/**
+	 * 상품등록 - 상품기본정보 - 자사상품
+	 *
+	 * @param goodsMass
+	 * @param excelFilename
+	 * @author eskim
+	 * @since 2021. 01. 12
+	 */
+	private Goods createSelfGoodsInfo(GoodsMass goodsMass, String procJob) {
+
+		Goods goods = new Goods();
+		goods.setGoodsStat("40"); // 상품상태
+		goods.setGoodsRegMsg("승인대기");
+
+		// 품번정보 확인 (FRJ 는 11개, 그외는 10개)
+		if (StringUtils.isEmpty(goodsMass.getGoodsNum()) || (goodsMass.getGoodsNum().length() >= 10 && goodsMass.getGoodsNum().length() <= 11)) {
+			goods.setGoodsRegMsg("품번코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		goods.setGoodsCd(goodsMass.getGoodsNum().toUpperCase()); // 상품코드
+
+		// 상품코드 중복여부 확인
+		Goods goodsDup = goodsDao.getGoods(goods);
+		if (goodsDup != null) {
+			goods.setGoodsRegMsg("상품코드(품번) 중복등록요청");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		if ("createSelfGoods".equals(procJob)) {
+			if (!StringUtils.isEmpty(goodsMass.getSupplyCompCd())) {
+				throw new IllegalStateException("입점상품은 입점상품등록으로 작업해 주세요.");
+			}
+		} else {
+			if ("S0001".equals(goodsMass.getSupplyCompCd()) || "S0002".equals(goodsMass.getSupplyCompCd())) {
+				throw new IllegalStateException("자사상품은 자사상등록으로 작업해 주세요.");
+			}
+		}
+
+		// wms 상품 정보 확인
+		WmsGoods wmsGoodsInfo = goodsDao.getWmsGoodsInfo(goodsMass);
+		if (wmsGoodsInfo == null) {
+			goods.setGoodsRegMsg("WMS 미존재 상품코드");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setProductNo(wmsGoodsInfo.getProductNo());
+		goods.setProductCode(wmsGoodsInfo.getProductCode());
+
+		// 품번코드
+		goods.setGoodsNum(goodsMass.getGoodsNum().toUpperCase());
+		// 입점상품코드
+		goods.setSupplyGoodsCd(goodsMass.getGoodsNum().toUpperCase());
+
+		// 브랜드
+		if (StringUtils.isEmpty(goodsMass.getBrandCd())) {
+			goods.setGoodsRegMsg("브랜드코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setBrandCd(goodsMass.getBrandCd()); // 브랜드 코드
+		// 브랜드 확인
+		Brand brand = new Brand();
+		brand.setBrandCd(goods.getBrandCd());
+		Collection<Brand> brandList = businessService.getBrandList(brand);
+		if (brandList == null || brandList.isEmpty()) {
+			goods.setGoodsRegMsg("브랜드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		float pntPrate = 0.0f;
+		float pntMrate = 0.0f;
+		float sellFeeRate = 0.0f;
+		String delvFeeCd = "";
+		String supplyCompCd = "";
+		for (Brand tmpBrand : brandList) {
+			if ("G009_10".equals(goods.getFormalGb())) {
+				pntPrate = tmpBrand.getPntPrate10();
+				pntMrate = tmpBrand.getPntMrate10();
+			} else {
+				pntPrate = tmpBrand.getPntPrate20();
+				pntMrate = tmpBrand.getPntMrate20();
+			}
+			delvFeeCd = tmpBrand.getDelvFeeCd();	//배송비정책 코드
+			supplyCompCd = tmpBrand.getSupplyCompCd();	//업체코드
+			sellFeeRate = tmpBrand.getSellFeeRate();	//판매수수료율
+		}
+		goods.setPntPrate(pntPrate); // 포인트적립율(PC)
+		goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
+		goods.setSupplyCompCd(supplyCompCd); // 업체코드
+		goods.setDelvFeeCd(delvFeeCd); // 배송비정책 코드
+		goods.setSellFeeRate(sellFeeRate); // 판매수수료율
+
+		goodsMass.setSupplyCompCd(supplyCompCd); // 업체 코드
+
+
+		// 상품명
+		if (StringUtils.isEmpty(goodsMass.getGoodsNm())) {
+			goods.setGoodsRegMsg("상품명 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setGoodsNm(goodsMass.getGoodsNm().replaceAll("(\\r\\n|\\r|\\n|\\n\\r)", ""));
+
+		// 품목코드
+		if (StringUtils.isEmpty(goodsMass.getItemkindCd())) {
+			goods.setGoodsRegMsg("품목코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setItemkindCd(goodsMass.getItemkindCd());
+
+		Itemkind itemkind = new Itemkind();
+		itemkind.setItemkindCd(goodsMass.getItemkindCd());
+		itemkind.setUseYn("Y");
+		Collection<Itemkind> getItemkindList = goodsDao.getItemkindList(itemkind);
+		if (getItemkindList == null || getItemkindList.size() == 0) {
+			goods.setGoodsRegMsg("품목코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		// 스타일 년도
+		if (StringUtils.isEmpty(goodsMass.getStyleYear()) ||  goodsMass.getStyleYear().length() != 4 || !goodsMass.getStyleYear().trim().matches(NUMBER_PATTERN)) {
+			goods.setGoodsRegMsg("스타일 년도 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setStyleYear(goodsMass.getStyleYear());
+
+		// 시즌
+		if (StringUtils.isEmpty(goodsMass.getSeasonCd())) {
+			goods.setGoodsRegMsg("시즌 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setSeasonCd(goodsMass.getSeasonCd()); // 시즌
+
+		CommonCode commonCode = new CommonCode();
+		commonCode.setUseYn("Y");
+		commonCode.setCdGb("G0006"); // 시즌
+		commonCode.setCd(goods.getSeasonCd());
+		Collection<CommonCode> styleYearList = rendererService.getCommonCodeList(commonCode);
+		if (styleYearList == null || styleYearList.isEmpty()) {
+			goods.setGoodsRegMsg("시즌 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		// 성별
+		if (StringUtils.isEmpty(goodsMass.getSexGb())) {
+			goods.setGoodsRegMsg("성별 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setSexGb(goodsMass.getSexGb()); // 성별
+		commonCode.setCdGb("G0007"); // 성별
+		commonCode.setCd(goods.getSexGb());
+		Collection<CommonCode> sexGbList = rendererService.getCommonCodeList(commonCode);
+		if (sexGbList == null || sexGbList.isEmpty()) {
+			goods.setGoodsRegMsg("성별 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		// 정상가
+		if (StringUtils.isEmpty(goodsMass.getListPrice())) {
+			goods.setGoodsRegMsg("정상가 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (!GagaStringUtil.replace(goodsMass.getListPrice(), ",", "").trim().matches(NUMBER_PATTERN)) {
+			goods.setGoodsRegMsg("정상가 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		// 판매가
+		if (StringUtils.isEmpty(goodsMass.getCurrPrice())) {
+			goods.setGoodsRegMsg("판매가 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (!GagaStringUtil.replace(goodsMass.getCurrPrice(), ",", "").trim().matches(NUMBER_PATTERN)) {
+			goods.setGoodsRegMsg("판매가 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		int listPrice = Integer.parseInt(GagaStringUtil.replace(goodsMass.getListPrice(), ",", "").trim());
+		int currPrice = Integer.parseInt(GagaStringUtil.replace(goodsMass.getCurrPrice(), ",", "").trim());
+
+		if (currPrice > listPrice) {
+			goods.setGoodsRegMsg("판매가 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		// 정상가
+		goods.setListPrice(listPrice);
+		// 판매가
+		goods.setCurrPrice(currPrice);
+
+		// 원가
+		// FRJ 필수 확인
+		if ("S006".equals(goods.getBrandCd())) {
+			if (StringUtils.isEmpty(goodsMass.getCostPrice())) {
+				goods.setGoodsRegMsg("원가 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			if (!GagaStringUtil.replace(goodsMass.getCostPrice(), ",", "").trim().matches(NUMBER_PATTERN)) {
+				goods.setGoodsRegMsg("원가 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			int costPrice = Integer.parseInt(GagaStringUtil.replace(goodsMass.getCostPrice(), ",", "").trim());
+			// 원가
+			goods.setCostPrice(costPrice);
+		}else {
+			goods.setCostPrice(0);
+		}
+
+		// 정상이월
+		if (StringUtils.isEmpty(goodsMass.getSexGb())) {
+			goods.setGoodsRegMsg("성별 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setFormalGb(goodsMass.getFormalGb());
+		commonCode.setCdGb("G009"); // 정상이월구분
+		commonCode.setCd(goods.getFormalGb());
+		Collection<CommonCode> formalGbList = rendererService.getCommonCodeList(commonCode);
+		if (formalGbList == null || formalGbList.isEmpty()) {
+			goods.setGoodsRegMsg("정상이월구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		// 원산지 / 제조국
+		if (StringUtils.isEmpty(goodsMass.getOriginCd())) {
+			goods.setGoodsRegMsg("원산지 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setOriginCd(goodsMass.getOriginCd());
+		commonCode.setCdGb("G076"); // 원산지
+		commonCode.setCd(goods.getFormalGb());
+		Collection<CommonCode> originCdList = rendererService.getCommonCodeList(commonCode);
+		if (originCdList == null || originCdList.isEmpty()) {
+			goods.setGoodsRegMsg("원산지 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setOriginNm(originCdList.iterator().next().getCdNm());	//고시정보 적용용
+
+		// 제조년월
+		if (StringUtils.isEmpty(goodsMass.getMakeYmd())) {
+			goods.setGoodsRegMsg("제조년월일 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setMakeYmd(goodsMass.getMakeYmd());
+
+		SimpleDateFormat dateFormatParser = new SimpleDateFormat("yyyyMMdd");
+		dateFormatParser.setLenient(false);
+		try {
+			dateFormatParser.parse(goodsMass.getMakeYmd());
+		} catch (Exception e) {
+			goods.setGoodsRegMsg("제조년월일 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		goods.setGoodsType("G056_N"); //상품타입
+		goods.setFormalGb("G009_10"); // 정상이월 구분
+		goods.setGoodsGb("G073_11"); //상품구분
+		goods.setDistributionGb("G065_12"); //유통구분
+		if ("S006".equals(goods.getBrandCd())) { //frj 사입처리
+			goods.setDistributionGb("G065_11"); //자사 - 사입
+		}
+		goods.setSelfGoodsYn("Y"); // 자사상품여부
+		goods.setSelfMallYn("Y"); //자사몰 노출여부
+		goods.setErpStockLinkYn("Y"); // ERP재고연동여부
+
+		goods.setRegNo(TssSession.getInfo().getUserNo());
+		goods.setUpdNo(TssSession.getInfo().getUserNo());
+
+		return goods;
+	}
+
+	/**
+	 * 상품 대량 등록 결과 정보
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2021. 01. 12
+	 */
+	private void setGoodsRegResult(Goods goods, GoodsMass goodsMass, String procJob) {
+		// 결과 저장
+		goodsMass.setBrandCd(goods.getBrandCd());
+		goodsMass.setGoodsStat(goods.getGoodsStat());
+		goodsMass.setRegSuccYn("Y");
+		goodsMass.setRegFailRsn(goods.getGoodsRegMsg());
+		goodsMass.setRegNo(TssSession.getInfo().getUserNo());
+		 //model은 string 테이블은 number 형이라 ,,,
+		if (StringUtils.isEmpty(goodsMass.getListPrice())) {
+			goodsMass.setListPrice("0");
+		}
+		if (UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice()) || StringUtils.isEmpty(goodsMass.getCurrPrice())) {
+			goodsMass.setCurrPrice("0");
+		}
+		if ("10".equals(goods.getGoodsStat())) {
+			goodsMass.setRegSuccYn("N");
+		}
+		goodsMass.setProcGb("C");
+		if ("updateGoods".equals(procJob)) {
+			goodsMass.setProcGb("U");
+		}
+		goodsDao.createGoodsRegLog(goodsMass);
+	}
+
+	/**
+	 * 상품등록 - 상품고시정보 check
+	 *
+	 * @param goods
+	 * @param goodsNotiList
+	 * @return Goods
+	 * @author eskim
+	 * @since 2021. 01. 12
+	 */
+	private Goods getGoodsNotiCheck(Goods goods, Collection<GoodsNotiInfo> goodsNotiList, GagaMap excelMap, String procJob) {
+
+		// 고시항목 필수값 입력 확인
+		int index = 0;
+
+		if ("createSelfGoods".equals(procJob)) {
+			for (GoodsNotiInfo goodsNotiInfo : goodsNotiList) {
+				if ("Y".equals(goodsNotiInfo.getReqYn()) && StringUtils.isEmpty(goodsNotiInfo.getNiContent())) {
+					goods.setGoodsRegMsg("고시항목 오류");
+					goods.setGoodsStat("20");
+					return goods;
+				}
+			}
+		} else {
+			for (GoodsNotiInfo goodsNotiInfo : goodsNotiList) {
+				if ("Y".equals(goodsNotiInfo.getReqYn()) && StringUtils.isEmpty(excelMap.getString("niContent" + (index + 1)))) {
+					goods.setGoodsRegMsg("고시정보 없음 (" + (index + 1) + "번째 항목) - " + goodsNotiInfo.getNiItemCd() + "(" + goodsNotiInfo.getNiItemNm() + ")");
+					goods.setGoodsStat("10");
+					return goods;
+				}
+			}
+			index++;
+
+		}
+
+		return goods;
+	}
+
+	/**
+	 * 상품등록 - 상품고시정보
+	 *
+	 * @param goods
+	 * @param excelMap
+	 * @return TsaGoods
+	 * @author eskim
+	 * @since 2021. 01. 12
+	 */
+	private void createGoodsNoti(GagaMap excelMap, Collection<GoodsNotiInfo> goodsNotiList) {
+
+		int index = 0;
+		for (GoodsNotiInfo goodsNotiInfo : goodsNotiList) {
+
+			if (StringUtils.isEmpty(excelMap.getString("niContent" + (index + 1)))) {
+				goodsNotiInfo.setNiContent(goodsNotiInfo.getNiContent());
+			} else {
+				goodsNotiInfo.setNiContent(excelMap.getString("niContent" + (index + 1)));
+			}
+			goodsNotiInfo.setRegNo(TssSession.getInfo().getUserNo());
+			goodsNotiInfo.setUpdNo(TssSession.getInfo().getUserNo());
+			goodsDao.saveGoodsNotiInfo(goodsNotiInfo);
+			index++;
+		}
+	}
+
+	/**
+	 * 상품등록 - 상품재고정보 (자상상품등록시)
+	 *
+	 * @param goods
+	 * @param excelMap
+	 * @return TsaGoods
+	 * @author eskim
+	 * @since 2021. 01. 13
+	 */
+	private void createSelfGoodsSize(Goods goods, Collection<Option> goodsSizeList) {
+
+		int index = 0;
+		for (Option goodsStock : goodsSizeList) {
+			goodsStock.setSoldoutYn("N");
+			goodsStock.setDispYn("N");
+			goodsStock.setBaseStockQty(0);
+			goodsStock.setAddPrice(0);
+			goodsStock.setRegNo(TssSession.getInfo().getUserNo());
+			goodsStock.setUpdNo(TssSession.getInfo().getUserNo());
+			goodsDao.saveStock(goodsStock);
+			index++;
+		}
+	}
 }

+ 62 - 2
style24.scm/src/main/java/com/style24/scm/biz/web/TssGoodsController.java

@@ -28,6 +28,7 @@ import com.style24.persistence.TssPageRequest;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsImg;
+import com.style24.persistence.domain.GoodsMass;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
 import com.style24.persistence.domain.GoodsSearch;
@@ -760,8 +761,8 @@ public class TssGoodsController extends TssBaseController {
 		mav.addObject("goodsStatList", rendererService.getAvailCommonCodeList("G008"));
 		// 사용여부
 		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
-		// ERP 연동여부
-		mav.addObject("erpSyncYn", commonService.getErpSyncYn());
+		// WMS 연동여부
+		mav.addObject("wmsSyncYn", commonService.getWmsSyncYn());
 		// 정보고시 목록
 		mav.addObject("niClsfCdList", rendererService.getAvailCommonCodeList("G004"));
 
@@ -778,6 +779,65 @@ public class TssGoodsController extends TssBaseController {
 		return mav;
 	}
 
+	/**
+	 * 상품대량등록 엑셀 저장
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 12
+	 */
+	@PostMapping("/mass/excelupload/create")
+	@ResponseBody
+	public GagaResponse createExceluploadGoods(@RequestBody GoodsMass goodsMass) throws Exception {
+
+		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
+		Collection<GagaMap> ecxelGoodsList = new ArrayList<>();
+		// 자사상품등록
+		if ("createSelfGoods".equals(goodsMass.getProcJob())) {
+
+			if ("N".equals(commonService.getWmsSyncYn())) {
+				// 파일 삭제
+				GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, goodsMass.getExcelFileNm()));
+				throw new IllegalStateException("WMS 연동여부가 [N]입니다. 관리자에게 문의하세요.");
+			}
+
+			// DB 처리 시 사용되는 파라미터명(셀명) 설정
+			String[] goodsNames = {"goodsNum", "brandCd",  "goodsNm", "itemkindCd", "styleYear", "seasonCd",
+				"sexGb", "listPrice", "currPrice", "costPrice", "formalGb", "originCd", "makeYmd",
+				"niClsfCd", "niContent1", "niContent2", "niContent3", "niContent4", "niContent5",
+				"niContent6", "niContent7", "niContent8", "niContent9", "niContent10", "niContent11", "niContent12",
+				"niContent13", "niContent14", "niContent15", "niContent16", "niContent17", "niContent18",
+				"niContent19", "niContent20", "niContent21", "niContent22", "niContent23", "niContent24",
+				"niContent25", "niContent26", "niContent27", "niContent28"};
+
+			ecxelGoodsList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, goodsMass.getExcelFileNm()), 0, goodsNames, 0);
+
+			goodsService.createExceluploadSelfGoods(ecxelGoodsList, goodsMass.getExcelFileNm(), goodsMass.getProcJob());
+
+		} else {
+			// 입점상품등록
+			// DB 처리 시 사용되는 파라미터명(셀명) 설정 -
+			String[] goodsNames = {"supplyGoodsCd", "supplyCompCd", "brandCd", "goodsNm", "goodsTnm","goodsSnm1","itemkindCd",  "styleYear", "seasonCd",
+				"sexGb", "listPrice", "currPrice", "goodsGb", "formalGb",  "originCd", "makeYmd", "taxGb", "adultYn",
+				"optStr","currStockStr", "baseStockStr",
+				"niClsfCd", "niContent1", "niContent2", "niContent3", "niContent4", "niContent5",
+				"niContent6", "niContent7", "niContent8", "niContent9", "niContent10", "niContent11", "niContent12",
+				"niContent13", "niContent14", "niContent15", "niContent16", "niContent17", "niContent18",
+				"niContent19", "niContent20", "niContent21", "niContent22", "niContent23", "niContent24",
+				"niContent25", "niContent26", "niContent27", "niContent28"};
+
+			ecxelGoodsList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, goodsMass.getExcelFileNm()), 0, goodsNames, 0);
+
+			//goodsService.createExceluploadGoods(ecxelGoodsList, goodsMass.getExcelFileNm(), goodsMass.getProcJob());
+		}
+
+		// 파일 삭제
+		GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, goodsMass.getExcelFileNm()));
+
+		return super.ok("");
+	}
+
 	/**
 	 * 입점 가격 관리 화면
 	 *

+ 4 - 4
style24.scm/src/main/webapp/WEB-INF/views/goods/GoodsMassRegisterForm.html

@@ -28,17 +28,17 @@
 			<ul class="notice">
 				<li>상품을 대량으로 등록하는 페이지입니다.</li>
 				<li>상품을 등록 할 경우 [승인대기] 상태이며, STYLE 관리자의 [승인완료] 상태 변경 후 FRONT애 노출이 가능합니다.</li>
-				<li><th:block th:if="${erpSyncYn == 'N'}"><em><b>ERP연동여부가 [N]입니다. 관리자에게 문의하세요.</b></em></th:block></li>
+				<li><th:block th:if="${wmsSyncYn == 'N'}"><em><b>WMS연동여부가 [N]입니다. 관리자에게 문의하세요.</b></em></th:block></li>
 			</ul>
 			<ul class="panelBar">
 				<li class="center">
 					<th:block th:if="${sessionInfo.roleCd == 'G001_E000'}">
 						<button type="button" class="btn btn-default btn-lg" id="btnInit" onclick="cfnDownloadSampleFile('SF001');">자사상품 등록양식 다운로드</button>
-						<button th:if="${erpSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsSelfCreate" >자사상품 등록</button>
+						<button th:if="${wmsSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsSelfCreate" >자사상품 등록</button>
 					</th:block>
 					<th:block th:if="${sessionInfo.roleCd == 'G001_B000'}">
 						<button type="button" class="btn btn-default btn-lg" id="btnInit" onclick="cfnDownloadSampleFile('SF005');">입점상품 등록양식 다운로드</button>
-						<button th:if="${erpSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsCreate" >입점상품 등록</button>
+						<button th:if="${wmsSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsCreate" >입점상품 등록</button>
 					</th:block>
 					<label class="off"><a href="javascript:void(0);" id="excelList" style="display: none;">엑셀다운로드</a></label>
 					<!--  추후 대량 수정 권한-->
@@ -47,7 +47,7 @@
 								}" 
 							th:style="'padding-left:80px;'">
 						<button type="button" class="btn btn-default btn-lg" id="btnInit" onclick="cfnDownloadSampleFile('SF014');">상품대량수정 등록양식 다운로드</button>
-						<button th:if="${erpSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsUpdate" >입점상품 등록</button>
+						<button th:if="${wmsSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsUpdate" >입점상품 등록</button>
 					</span>
 				</li>
 			</ul>