Преглед на файлове

자사상품 등록 개발중

eskim преди 5 години
родител
ревизия
72cc9ac931

+ 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>