Pārlūkot izejas kodu

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

jsshin 5 gadi atpakaļ
vecāks
revīzija
af625e6157
30 mainītis faili ar 2628 papildinājumiem un 416 dzēšanām
  1. 35 0
      src/main/java/com/style24/persistence/domain/AflinkFee.java
  2. 2 0
      src/main/java/com/style24/persistence/domain/Goods.java
  3. 100 0
      src/main/java/com/style24/persistence/domain/GoodsCategory.java
  4. 18 4
      src/main/java/com/style24/persistence/domain/GoodsMass.java
  5. 1 1
      src/main/java/com/style24/persistence/domain/GoodsNotiInfo.java
  6. 1 0
      src/main/java/com/style24/persistence/domain/Itemkind.java
  7. 23 0
      src/main/java/com/style24/persistence/domain/ItemkindCategory.java
  8. 1 1
      src/main/java/com/style24/persistence/domain/Option.java
  9. 6 4
      src/main/java/com/style24/persistence/domain/SupplyCompany.java
  10. 6 2
      src/main/java/com/style24/persistence/domain/User.java
  11. 195 44
      src/main/java/com/style24/persistence/mybatis/shop/TssGoods.xml
  12. 25 1
      src/main/java/com/style24/persistence/mybatis/shop/TssLogin.xml
  13. 9 10
      src/main/java/com/style24/persistence/mybatis/shop/TssRenderer.xml
  14. 70 0
      src/main/java/com/style24/persistence/mybatis/shop/TssSettle.xml
  15. 46 4
      src/main/java/com/style24/scm/biz/dao/TssGoodsDao.java
  16. 9 9
      src/main/java/com/style24/scm/biz/dao/TssRendererDao.java
  17. 26 0
      src/main/java/com/style24/scm/biz/dao/TssSettleDao.java
  18. 1581 177
      src/main/java/com/style24/scm/biz/service/TssGoodsService.java
  19. 12 11
      src/main/java/com/style24/scm/biz/service/TssRendererService.java
  20. 37 0
      src/main/java/com/style24/scm/biz/service/TssSettleService.java
  21. 72 25
      src/main/java/com/style24/scm/biz/web/TssGoodsController.java
  22. 1 15
      src/main/java/com/style24/scm/biz/web/TssRendererController.java
  23. 78 0
      src/main/java/com/style24/scm/biz/web/TssSettleController.java
  24. 1 1
      src/main/webapp/WEB-INF/views/common/fragments/header.html
  25. 11 3
      src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html
  26. 24 68
      src/main/webapp/WEB-INF/views/goods/GoodsMassRegisterForm.html
  27. 189 0
      src/main/webapp/WEB-INF/views/settle/AfLinkSettleForm.html
  28. 11 7
      src/main/webapp/ux/css/admin.ui.css
  29. 3 2
      src/main/webapp/ux/plugins/agGrid/ag-theme-balham.css
  30. 35 27
      src/main/webapp/ux/plugins/gaga/gaga.paging.js

+ 35 - 0
src/main/java/com/style24/persistence/domain/AflinkFee.java

@@ -0,0 +1,35 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 제휴채널수수료 Domain
+ *
+ * @author gagamel
+ * @since 2021. 1. 20
+ */
+@SuppressWarnings("serial")
+@Data
+public class AflinkFee extends TscBaseDomain {
+
+	private String afLinkCd;	// 제휴채널코드
+	private String afLinkNm;	// 제휴채널명
+	private String afChannel;	// 상위제휴채널
+	private String afChannelNm;	// 상위제휴채널명
+	private String occurDt;		// 발생(정산)일자
+	private String ordNo;		// 주문번호
+	private String ordDtlStat;	// 주문상세상태
+	private long sellAmt;		// 판매금액
+	private long cpnDcAmt;		// 쿠폰할인금액
+	private long pntDcAmt;		// 포인트사용금액
+	private long gfcdUseAmt;	// 상품권사용금액
+	private long payAmt;		// 결제액(VAT포함)
+	private long salesAmt;		// 매출액(VAT제외)
+
+	// 검색조건
+	private String startDt;
+	private String endDt;
+
+}

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

@@ -77,7 +77,9 @@ public class Goods extends TscBaseDomain {
 	private String brandEnm;		//브랜드영문명
 	private String brandGrpNm;		//브랜드그룹명
 	private int brandNo;			// 브랜드번호
+	private String supplyVendorCd;	//벤더코드
 
+	private String goodsDesc;		//상품상세(as-is)
 	private String goodsPcTopDesc;
 	private String goodsPcDownDesc;
 	private String goodsMobileTopDesc;

+ 100 - 0
src/main/java/com/style24/persistence/domain/GoodsCategory.java

@@ -0,0 +1,100 @@
+package com.style24.persistence.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import com.style24.persistence.TscPageRequest;
+import lombok.Data;
+
+/**
+ * 상품별 카테고리 Domain
+ * @author eskim
+ * @since 2020. 10. 30
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsCategory extends TscBaseDomain {
+
+	private int startRow;
+	private int endRow;
+	private String fullCateNm;
+	private String imgPath1;
+	private String imgPath4;
+	private String imgPath6;
+	private String imgType;
+	private String goodsCd;
+	private String goodsNm;
+	private int currStockQty;
+	private int baseStockQty;
+	private int dcRate;
+	private String dcRateSt;
+	private String dcRateEd;
+	private int listPrice;
+	private int currPrice;
+	private String currPriceSt;
+	private String currPriceEd;
+	private int pntPrate;
+	private String prePpntUsableYn;
+	private int pntMrate;
+	private String preMpntUsableYn;
+	private String soldoutYn;
+	private String erpStockLinkYn;
+	private String formalGb;
+	private String selfGoodsYn;
+	private String mdId;
+	private String supplyGoodsCd;
+	private String supplyCompCd;
+	private String brandEnm;
+	private String brandGrpNm;
+	private String brandCd;
+	private String itemkindCd;
+	private String colorEnm;
+	private String goodsStat;
+	private String siteCd;
+	private String styleYear;
+	private String seasonCd;
+	private String changeableYn;
+	private String returnableYn;
+	private String returnFeeFreeYn;
+	private String changeFeeFreeYn;
+	private String stDate;
+	private String edDate;
+	private String dispYn;
+	private String searchGb;
+	private String cateCd;
+	private String cateGb;
+	private String cateType;
+	private String cateCd1;
+	private String cateCd2;
+	private String cateCd3;
+	private String cateCd4;
+	private String cateCd5;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCdArr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCd1Arr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCd2Arr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCd3Arr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCd4Arr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCd5Arr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateGbArr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateTypeArr;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] goodsCdList;
+
+	private String goodsCds;
+
+	// Pagination
+	private TscPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
+}

+ 18 - 4
src/main/java/com/style24/persistence/domain/GoodsMass.java

@@ -37,13 +37,25 @@ public class GoodsMass extends TscBaseDomain {
 	private String formalGb; 		//정상이월구분(공통코드G009)
 //	private String distributionGb;	//유통구분(공콩코드 G065)
 	private String taxGb;			//과세구분(10:과세, 20:비과세)
+	private String ageGrpCd;		//상품연령코드(공통코드G023)
 	private String adultYn;			//성인용품여부 'Y', 'N'
 
-	private String opt1Str;			//옵션1(입점용)
-	private String opt2Str;			//옵션2(입점용)
-	private String baseStockStr;	//안전재고(입점용)
-	private String currStockStr;	//재고(입점용)
+	private String pntPrate;		//포인트적립율(PC)
+	private String pntMrate;		//포인트적립율(모바일)
+	private String prePpntUsableYn;	//선포인트사용가능여부(PC)
+	private String preMpntUsableYn;	//선포인트사용가능여부(모바일)
+	private String sellFeeRate;		//판매수수료율
+	private String changeableYn;	//교환가능여부
+	private String returnableYn;	//반품가능여부
+	private String minOrdQty;		//최소주문수량
+	private String maxOrdQty;		//최대주문수량
+	private String dayMaxOrdQty;	//ID당1일최대구매수량
+	private String giftPackYn;		//선물포장여부
+	private String newCustOrdYn;	//신규고객 구매가능여부(Y:신규고객만 구매가능)
 
+	private String optStr;			//옵션(입점용)
+	private String opt1Str;			//옵션1
+	private String opt2Str;			//옵션2
 	private String goodsContent;	//상품상세 html(입점용)
 
 	private String niClsfCd;
@@ -85,4 +97,6 @@ public class GoodsMass extends TscBaseDomain {
 	private String regFailRsn;
 	private String goodsStat;		//상품상태(공통코드G008)
 
+	private String mainColorCd;
+
 }

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

@@ -23,6 +23,6 @@ public class GoodsNotiInfo extends TscBaseDomain {
 	private String reqYn;
 
 	private String niItemNm;
-	private String supplyCompCd;
+	private String supplyVendorCd;
 
 }

+ 1 - 0
src/main/java/com/style24/persistence/domain/Itemkind.java

@@ -19,6 +19,7 @@ public class Itemkind extends TscBaseDomain {
 	//private String itemkindEnm;		// 품목영문명
 	private String niClsfCd;		// 고시분류코드
 	private String useYn;			// 사용여부
+	private String itemkindLeafNm;		// leaf 품목명
 
 //	private String index;
 

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

@@ -0,0 +1,23 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 품목카테고리 Domain
+ *
+ * @author gagamel
+ * @since 2021. 1. 5
+ */
+@SuppressWarnings("serial")
+@Data
+public class ItemkindCategory extends TscBaseDomain {
+
+	private String itemkindCd;	// 품목코드
+	private String cateGb;		// 카테고리구분
+	private Integer cateNo;		// 카테고리번호
+	private String fullCateNo;	// FULL카테고리번호
+	private String fullCateNm;	// FULL카테고리명
+
+}

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

@@ -26,7 +26,7 @@ public class Option extends TscBaseDomain {
 	private int currStockQty;
 	private int addPrice;
 	private String soldoutYn;
-	private String dispOrd;
+	private int dispOrd;
 	private String dispYn;
 
 	private int rnum;

+ 6 - 4
src/main/java/com/style24/persistence/domain/SupplyCompany.java

@@ -16,7 +16,8 @@ public class SupplyCompany extends TscBaseDomain {
 
 	private String supplyCompCd;		// 공급업체코드
 	private String supplyCompNm;		// 공급업체명
-	private int provierNo;				// ProvierNo(WMS)
+	private String supplyVendorCd;		// 공급벤더코드
+	private Integer provierNo;			// ProvierNo(WMS)
 	private String bizGb;				// 사업자구분
 	private String bizNo;				// 사업자번호
 	private String bizKind;				// 업종
@@ -32,8 +33,9 @@ public class SupplyCompany extends TscBaseDomain {
 	private String distributionGb;		// 유통구분(공통코드G065)
 	private String shotDelvYn;			// 총알배송여부
 	private String supplyStat;			// 입점상태(공통코드G010)
-	private int minOrdAmt;				// 무료배송비최소주문금액
-	private int delvFee;				// 배송비
+	private String supplyStatNm;		// 입점상태명
+//	private int minOrdAmt;				// 무료배송비최소주문금액
+//	private int delvFee;				// 배송비
 	private float sellFeeRate;			// 판매수수료율
 	private String settleDay;			// 정산일(매월)
 	private String bankCd;				// 은행코드
@@ -55,6 +57,6 @@ public class SupplyCompany extends TscBaseDomain {
 	// 검색조건
 	private String searchGb;			// 검색구분
 	private String searchTxt;			// 검색어
-
+	private String multiGb;
 
 }

+ 6 - 2
src/main/java/com/style24/persistence/domain/User.java

@@ -30,10 +30,14 @@ public class User extends TscBaseDomain {
 	private String roleCd;
 	private String roleNm;
 	private String roleRefVal;
-	private String supplyCompCd;
-	private String supplyCompNm;
+	private String supplyCompCd;	// 공급업체코드
+	private String supplyCompNm;	// 공급업체명
 //	private String photoCompCd;
 //	private String photoCompNm;
+	private String afLinkCd;		// 제휴링크코드
+	private String afLinkNm;		// 제휴링크명
+	private String afChannel;		// 제휴채널
+	private String afChannelNm;		// 제휴채널명
 	private String email;
 	private String cellPhnno;
 	private String ipAddr;

+ 195 - 44
src/main/java/com/style24/persistence/mybatis/shop/TssGoods.xml

@@ -7,9 +7,9 @@
 		/* TssGoods.getItemkindList */
 		SELECT ITEMKIND_CD
 		     , ITEMKIND_NM
-		     /* , ITEMKIND_ENM*/
 		     , NI_CLSF_CD
 		     , USE_YN
+		     , REPLACE(SUBSTRING_INDEX(ITEMKIND_NM, '>', -2) ,'>','') AS ITEMKIND_LEAF_NM
 		FROM TB_ITEMKIND
 		WHERE 1 = 1
 		<if test="itemkindCd != null and itemkindCd != ''">
@@ -628,12 +628,15 @@
 		     , A.DISP_YN
 		     , A.REQ_YN
 		FROM TB_GOODS_NOTI_INFO C
+		INNER JOIN TB_GOODS B ON C.GOODS_CD = B.GOODS_CD
+		INNER JOIN TB_SUPPLY_COMPANY D ON B.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
 		INNER JOIN TB_NOTI_INFO A ON C.NI_CLSF_CD = A.NI_CLSF_CD
 		                          AND C.NI_ITEM_CD = A.NI_ITEM_CD
-		                          AND A.SUPPLY_COMP_CD = CASE #{supplyCompCd} 
-		                                                 WHEN 'S0001' THEN 'S0001'
-		                                                 WHEN 'S0002' THEN 'S0002'
-		                                                 ELSE 'E' END
+		                          AND A.SUPPLY_VENDOR_CD = CASE D.SUPPLY_VENDOR_CD
+		                                                        WHEN 'SV0001' THEN 'SV0001'
+		                                                        WHEN 'SV0002' THEN 'SV0002'
+		                                                        ELSE 'E' 
+		                                                   END
 		WHERE C.GOODS_CD = #{goodsCd}
 		AND C.NI_CLSF_CD = #{niClsfCd}
 		ORDER BY C.DISP_ORD
@@ -642,7 +645,7 @@
 	<!-- 상품의 정보고시 항목 목록 -->
 	<select id="getNotiGoodsInfoList" parameterType="NotiInfo" resultType="NotiInfo">
 		/* TssGoods.getNotiGoodsInfoList */
-		SELECT  N.SUPPLY_COMP_CD
+		SELECT  N.SUPPLY_VENDOR_CD
 		      , N.NI_CLSF_CD
 		      , N.NI_ITEM_CD
 		      , FN_GET_CODE_NM('G005', N.NI_ITEM_CD) AS NI_ITEM_NM
@@ -651,7 +654,6 @@
 		             WHEN NI_ITEM_CD = 'G005_006' THEN NVL(FN_GET_CODE_NM('G076', G.ORIGIN_CD),N.NI_CONTENT)
 		             WHEN NI_ITEM_CD = 'G005_097' AND FN_GET_CODE_NM('G076', G.ORIGIN_CD) IN ('대한민국', '한국', 'KOREA') THEN 'N'
 		             WHEN NI_ITEM_CD = 'G005_097' AND FN_GET_CODE_NM('G076', G.ORIGIN_CD) NOT IN ('대한민국', '한국', 'KOREA') THEN 'Y'
-		             WHEN NI_ITEM_CD = 'G005_005' AND G.BRAND_CD= 'T007' THEN G.SUPPLY_COMP_NM
 		             WHEN NI_ITEM_CD = 'G005_009' THEN NVL(G.MAKE_YMD, N.NI_CONTENT)
 		        ELSE N.NI_CONTENT
 		        END
@@ -662,13 +664,12 @@
 		 FROM (
 		     SELECT G.GOODS_CD
 		         , G.ITEMKIND_CD
-		         , G.SUPPLY_COMP_CD
+		         , (SELECT SUPPLY_VENDOR_CD FROM TB_SUPPLY_COMPANY SC WHERE SC.SUPPLY_COMP_CD = G.SUPPLY_COMP_CD) AS SUPPLY_VENDOR_CD
 		         , G.ORIGIN_CD
 		         , G.MAKE_YMD
 		         , (SELECT GROUP_CONCAT(DISTINCT T.OPT_CD1) FROM TB_OPTION T WHERE T.GOODS_CD = G.GOODS_CD)  AS COLOR_NM
 		         , (SELECT GROUP_CONCAT(DISTINCT T.OPT_CD2) FROM TB_OPTION T WHERE T.GOODS_CD = G.GOODS_CD)  AS SIZE_NAME
 		         , G.BRAND_CD
-		         , (SELECT SUPPLY_COMP_NM FROM tb_supply_company SC WHERE SC.SUPPLY_COMP_CD = G.SUPPLY_COMP_CD) AS SUPPLY_COMP_NM 
 		     FROM TB_GOODS G
 		     WHERE 1=1
 		     AND G.GOODS_CD = #{goodsCd}
@@ -676,10 +677,11 @@
 		  , TB_NOTI_INFO N
 		 WHERE 1 = 1
 		 AND N.NI_CLSF_CD = #{niClsfCd}
-		 AND N.SUPPLY_COMP_CD =  CASE G.SUPPLY_COMP_CD
-		                              WHEN 'S0001' THEN 'S0001'
-		                              WHEN 'S0002' THEN 'S0002'
-		                         ELSE 'E' END 
+		 AND N.SUPPLY_VENDOR_CD =  CASE G.SUPPLY_VENDOR_CD
+		                                WHEN 'SV0001' THEN 'SV0001'
+		                                WHEN 'SV0002' THEN 'SV0002'
+		                                ELSE 'E' 
+		                           END 
 		 ORDER BY  G.GOODS_CD , N.NI_CLSF_CD, N.DISP_ORD
 	</select>
 	
@@ -1000,7 +1002,7 @@
 		       FROM TB_NOTI_INFO A
 		          , TB_ITEMKIND B
 		       WHERE A.NI_CLSF_CD = B.NI_CLSF_CD
-		       AND A.SUPPLY_COMP_CD = #{supplyCompCd}
+		       AND A.SUPPLY_VENDOR_CD = #{supplyVendorCd}
 		       AND B.ITEMKIND_CD = #{itemkindCd}
 		     ) D
 		    LEFT OUTER JOIN (
@@ -1113,9 +1115,12 @@
 		FROM (
 		      SELECT A.GOODS_CD 
 		           , A.MAIN_COLOR_CD 
-		           , B.OPT_CD1 
+		           , NVL(B.OPT_CD1,'00') AS OPT_CD1
 		      FROM TB_GOODS A
 		      LEFT OUTER JOIN TB_OPTION B ON A.GOODS_CD = B.GOODS_CD
+		                                  AND 1 = (CASE WHEN A.SELF_GOODS_YN = 'Y' THEN 1
+		                                                ELSE 2 END
+		                                          )
 		      WHERE A.GOODS_CD  = #{goodsCd}
 		      GROUP BY A.GOODS_CD , B.OPT_CD1
 		     ) A 
@@ -1872,7 +1877,7 @@
 	
 	<!-- WMS 입고상품 사은품 상품 구분 저장 -->
 	<update id="saveGoodsWmsIncomelot" parameterType="WmsGoods">
-		/* TsaGoods.saveGoodsWmsIncomelot */
+		/* TssGoods.saveGoodsWmsIncomelot */
 		UPDATE TB_WMS_GOODS
 		SET GOODS_REG_GB = #{goodsRegGb} /* G: 상품, F: 사은품*/
 		  , GOODS_REG_DT = NOW()
@@ -1884,7 +1889,7 @@
 	
 	<!-- 품목 별 고시기본정보  조회 -->
 	<select id="getItemkindNotiInfoList" parameterType="Goods" resultType="GoodsNotiInfo">
-		/* TsaGoods.getItemkindNotiInfoList */
+		/* TssGoods.getItemkindNotiInfoList */
 		SELECT A.ITEMKIND_CD 
 		     , B.NI_CLSF_CD
 		     , B.NI_ITEM_CD
@@ -1896,16 +1901,17 @@
 		     , 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)             
+		                          AND B.SUPPLY_VENDOR_CD = (CASE #{supplyVendorCd} 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 */
+		/* TssGoods.createGoodsRegLog */
 		INSERT INTO TB_GOODS_REG_LOG (
 		    PROC_GB
 		  , GOODS_CD
@@ -1926,9 +1932,23 @@
 		  , COST_PRICE
 		  , SUPPLY_GOODS_CD
 		  , FORMAL_GB
+		  , SELL_FEE_RATE
 		  , GOODS_GB
 		  , TAX_GB
 		  , ADULT_YN
+		  , MIN_ORD_QTY
+		  , MAX_ORD_QTY
+		  , DAY_MAX_ORD_QTY
+		  , PNT_PRATE
+		  , PNT_MRATE
+		  , PRE_PPNT_USABLE_YN
+		  , PRE_MPNT_USABLE_YN
+		  , CHANGEABLE_YN
+		  , RETURNABLE_YN
+		  , GIFT_PACK_YN
+		  , NEW_CUST_ORD_YN
+		  , OPT_STR
+		  , GOODS_CONTENT
 		  , NI_CLSF_CD
 		  , NI_CONTENT1
 		  , NI_CONTENT2
@@ -1983,9 +2003,23 @@
 		  , #{costPrice}
 		  , #{supplyGoodsCd}
 		  , #{formalGb}
+		  , #{sellFeeRate}
 		  , #{goodsGb}
 		  , #{taxGb}
 		  , #{adultYn}
+		  , #{minOrdQty}
+		  , #{maxOrdQty}
+		  , #{dayMaxOrdQty}
+		  , #{pntPrate}
+		  , #{pntMrate}
+		  , #{prePpntUsableYn}
+		  , #{preMpntUsableYn}
+		  , #{changeableYn}
+		  , #{returnableYn}
+		  , #{giftPackYn}
+		  , #{newCustOrdYn}
+		  , #{optStr}
+		  , #{goodsContent}
 		  , #{niClsfCd}
 		  , #{niContent1}
 		  , #{niContent2}
@@ -2128,27 +2162,30 @@
 	<!-- 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
+		SELECT Z.GOODS_CD
+		     , Z.OPT_CD
+		     , F.COLOR_CD AS OPT_CD1
+		     , Z.OPT_CD2
+		     , Z.SKU_MODEL_NO
+		     , Z.PRODUCT_NO
+		     , Z.PRODUCT_CODE
+		     , SUM(Z.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
+		    , 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
+		    , MAX(B.SUPPLY_COMP_CD) AS SUPPLY_COMP_CD
+		    , MAX(B.BRAND_CD) AS BRAND_CD
+		    , MAX(RIGHT(LEFT(REPLACE(A.SKUMODELNO,'-',''),12),2)) AS WMS_COLOR_CD
 		FROM TB_IF_PRODUCTSKU A 
 		INNER JOIN TB_GOODS B ON A.PRODUCTCODE = B.PRODUCT_CODE 
 		                      AND B.SELF_GOODS_YN = 'Y'
@@ -2162,12 +2199,17 @@
 		WHERE 1 = 1
 		GROUP BY B.GOODS_CD, A.SKUCODE, D.DELV_LOC_CD, D.STOCK_APPL_RATE
 		) Z
+		INNER JOIN TB_SUPPLY_COMPANY G ON Z.SUPPLY_COMP_CD = G.SUPPLY_COMP_CD
+		INNER JOIN TB_WMS_COLOR_MAPPING F ON (CASE WHEN Z.BRAND_CD = 'S006' THEN Z.BRAND_CD
+		                                           ELSE G.SUPPLY_VENDOR_CD 
+		                                      END) = F.SUPPLY_VENDOR_CD
+		                                  AND F.USE_YN ='Y'
 		GROUP BY GOODS_CD, OPT_CD
 	</select>
 	
 	<!-- 상품등록로그 목록 조회 -->
 	<select id="getGoodsRegLogList" parameterType="GoodsSearch" resultType="GoodsMass">
-		/* TsaGoods.getGoodsRegLogList */
+		/* TssGoods.getGoodsRegLogList */
 		SELECT A.GOODS_REG_SQ
 		     , A.PROC_GB
 		     , A.GOODS_CD
@@ -2191,10 +2233,20 @@
 		     , A.GOODS_GB
 		     , A.TAX_GB
 		     , A.ADULT_YN
-		     -- , A.OPT_STR
-		     -- , A.BASE_STOCK_STR
-		     -- , A.CURR_STOCK_STR
-		     -- , A.GOODS_DESC_INFO
+		     , A.SELL_FEE_RATE
+		     , A.MIN_ORD_QTY
+		     , A.MAX_ORD_QTY
+		     , A.DAY_MAX_ORD_QTY
+		     , A.PNT_PRATE
+		     , A.PNT_MRATE
+		     , A.PRE_PPNT_USABLE_YN
+		     , A.PRE_MPNT_USABLE_YN
+		     , A.CHANGEABLE_YN
+		     , A.RETURNABLE_YN
+		     , A.GIFT_PACK_YN
+		     , A.NEW_CUST_ORD_YN
+		     , A.OPT_STR
+		     , A.GOODS_CONTENT
 		     , A.NI_CLSF_CD
 		     , A.NI_CONTENT1
 		     , A.NI_CONTENT2
@@ -2233,7 +2285,7 @@
 		-- LEFT OUTER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
 		WHERE 1 = 1 
 		<if test='condition != null and condition != "" '>
-		AND (UPPER(A.GOODS_CD) LIKE CONCAT('%',UPPER(#{condition}),'%')
+		AND (UPPER(A.GOODS_NUM) LIKE CONCAT('%',UPPER(#{condition}),'%')
 		     OR 
 		     UPPER(A.SUPPLY_GOODS_CD) LIKE CONCAT('%',UPPER(#{condition}),'%')
 		    )
@@ -2255,4 +2307,103 @@
 		ORDER BY A.REG_DT DESC, A.GOODS_CD
 	</select>
 	
+	<!-- 상품 색상, 사이즈 정보 조회 -->
+	<select id="getGoodsColorSize"  parameterType="Goods" resultType="GoodsMass">
+		/* TssGoods.getGoodsColorSize */
+		SELECT GOODS_CD
+		     , GROUP_CONCAT(DISTINCT OPT_CD1) AS OPT1_STR
+		     , GROUP_CONCAT(DISTINCT OPT_CD2) AS OPT2_STR
+		     , MIN(OPT_CD1) AS MAIN_COLOR_CD
+		FROM TB_OPTION
+		WHERE GOODS_CD = #{goodsCd}
+		GROUP BY GOODS_CD
+	</select>
+	
+	<!-- 상품 대표색상 설정 -->
+	<update id="updateGoodsMainColorCd" parameterType="GoodsMass">
+		/* TssGoods.updateGoodsMainColorCd */
+		UPDATE TB_GOODS 
+		SET MAIN_COLOR_CD = #{mainColorCd}
+		  , UPD_NO = #{updNo}
+		  , UPD_DT = NOW() 
+		WHERE GOODS_CD = #{goodsCd}
+	</update>
+	
+	<!-- 상품 상태만 변경 -->
+	<update id="updateGoodsStatOnly" parameterType="Goods">
+		/* TssGoods.updateGoodsStatOnly */
+		UPDATE TB_GOODS 
+		SET GOODS_STAT= #{goodsStat}
+		  , UPD_NO = #{updNo}
+		  , UPD_DT = NOW() 
+		WHERE GOODS_CD = #{goodsCd}
+	</update>
+	
+	<!-- 상품 기본 정보 수정  - 대량엑셀 -->
+	<update id="updateGoodsMass" parameterType="Goods">
+		/* TssGoods.updateGoodsMass */
+		UPDATE TB_GOODS
+		SET UPD_ID = #{updId}
+		  , UPD_DT = SYSDATE
+		<if test='goodsNm != null and goodsNm != "X"'>
+		  , GOODS_NM = #{goodsNm} 
+		</if>
+		<if test='goodsTnm != null and goodsTnm != "X"'>
+		  , GOODS_TNM = #{goodsTnm}
+		</if>
+		<if test='goodsSnm1 != null and goodsSnm1 != "X"'>
+		  , GOODS_SNM1 = #{goodsSnm1}
+		</if>
+		<if test='itemkindCd != null and itemkindCd != "X"'>
+		  , ITEMKIND_CD = #{itemkindCd}
+		</if>
+		<if test='styleYear != null and styleYear != "X"'>
+		  , STYLE_YEAR = #{styleYear}
+		</if>
+		<if test='seasonCd != null and seasonCd != "X"'>
+		  , SEASON_CD = #{seasonCd}
+		</if>
+		<if test='sexGb != null and sexGb != "X"'>
+		  , SEX_GB = #{sexGb}
+		</if>
+		<if test="currPrice != null and currPrice > 0">
+		  , CURR_PRICE = #{currPrice}
+		  , CURR_BPRICE = #{currBprice}
+		  , PRICE_UPD_DT = SYSDATE
+		  , DC_RATE = #{dcRate}
+		</if>
+		<if test="minOrdQty != null and minOrdQty > 0">
+		  , MIN_ORD_QTY = #{minOrdQty}
+		</if>
+		<if test="maxOrdQty != null and maxOrdQty > 0">
+		  , MAX_ORD_QTY = #{maxOrdQty}
+		</if>
+		<if test='buyingType != null and buyingType != "X"'>
+		  , BUYING_TYPE = #{buyingType}
+		</if>
+		<if test='formalGb != null and formalGb != "X"'>
+		  , FORMAL_GB = #{formalGb}
+		  , PNT_PRATE = NVL(#{pntPrate}, PNT_PRATE)
+		  , PNT_MRATE = NVL(#{pntMrate}, PNT_MRATE)
+		</if>
+		<if test='makeNm != null and makeNm != "X"'>
+		  , MAKE_NM = #{makeNm}
+		</if>
+		<if test='makeYmd != null and makeYmd != "X"'>
+		  , MAKE_YMD = #{makeYmd}
+		</if>
+		<if test='pntPrate != null and pntPrate >= 0'>
+		  , PNT_PRATE = #{pntPrate}
+		</if>
+		<if test='prePpntUsableYn != null and prePpntUsableYn != "X"'>
+		  , PRE_PPNT_USABLE_YN = DECODE(#{prePpntUsableYn}, 'Y', 'Y', 'N', 'N', PRE_PPNT_USABLE_YN)
+		</if>
+		<if test='pntMrate != null and pntMrate >= 0'>
+		  , PNT_MRATE = #{pntMrate}
+		</if>
+		<if test='makeYmd != preMpntUsableYn and preMpntUsableYn != "X"'>
+		  , PRE_MPNT_USABLE_YN = DECODE(#{preMpntUsableYn}, 'Y', 'Y', 'N', 'N', PRE_MPNT_USABLE_YN)
+		</if>
+		WHERE GOODS_CD = #{goodsCd}
+	</update>
 </mapper>

+ 25 - 1
src/main/java/com/style24/persistence/mybatis/shop/TssLogin.xml

@@ -27,6 +27,30 @@
 		     -- , CASE WHEN SUBSTRING(ROLE_CD,1,1) = 'E' THEN
 		     --            FN_GET_CODE_NM('G003',ROLE_REF_VAL)
 		     --   END                                       AS PHOTO_COMP_NM  /*촬영업체명*/
+		     , CASE WHEN SUBSTRING(REPLACE(ROLE_CD,'G001_', ''),1,1) = 'D' THEN
+		                ROLE_REF_VAL
+		       END                                       AS AF_LINK_CD     /*제휴링크코드*/
+		     , CASE WHEN SUBSTRING(REPLACE(ROLE_CD,'G001_', ''),1,1) = 'D' THEN
+		                (SELECT AF_LINK_NM
+		                 FROM   TB_AF_LINK
+		                 WHERE  AF_LINK_CD = A.ROLE_REF_VAL
+		                )
+		       END                                       AS AF_LINK_NM     /*제휴링크명*/
+		     , CASE WHEN SUBSTRING(REPLACE(ROLE_CD,'G001_', ''),1,1) = 'D' THEN
+		                (SELECT AF_CHANNEL
+		                 FROM   TB_AF_LINK
+		                 WHERE  AF_LINK_CD = A.ROLE_REF_VAL
+		                )
+		       END                                       AS AF_CHANNEL     /*제휴채널*/
+		     , CASE WHEN SUBSTRING(REPLACE(ROLE_CD,'G001_', ''),1,1) = 'D' THEN
+		                (SELECT CC.CD_NM
+		                 FROM   TB_AF_LINK AL
+		                      , TB_COMMON_CODE CC
+		                 WHERE  AL.AF_CHANNEL = CC.CD
+		                 AND    AL.AF_LINK_CD = A.ROLE_REF_VAL
+		                 AND    CC.CD_GB = 'G053'
+		                )
+		       END                                       AS AF_CHANNEL_NM  /*제휴채널명*/
 		     , EMAIL                                                       /*이메일*/
 		     , CELL_PHNNO                                                  /*휴대전화번호*/
 		     , IP_ADDR                                                     /*IP주소*/
@@ -35,7 +59,7 @@
 		     , MASKING_YN                                                  /*마스킹여부*/
 		FROM   TB_USER A
 		WHERE  USER_ID = #{userId}
-		AND    (ROLE_CD LIKE 'G001_B%' OR ROLE_CD LIKE 'G001_E%') /*입점업체담당자, 촬영업체담당자*/
+		AND    (ROLE_CD LIKE 'G001_B%' OR ROLE_CD LIKE 'G001_E%' OR ROLE_CD LIKE 'G001_D%') /*입점업체담당자, 촬영업체담당자, 제휴채널담당자*/
 		AND    USE_YN = 'Y'
 	</select>
 	

+ 9 - 10
src/main/java/com/style24/persistence/mybatis/shop/TssRenderer.xml

@@ -326,16 +326,6 @@
 		AND    USE_YN = 'Y'
 	</select>
 
-	<!-- 제휴링크 목록 -->
-	<select id="getAflinkList" parameterType="String" resultType="CommonCode">
-		/* TssRenderer.getAflinkList */
-		SELECT AF_LINK_CD AS CD
-		     , AF_LINK_NM AS CD_NM
-		FROM   TB_AF_LINK
-		WHERE  AF_CHANNEL = #{afChannel}
-		AND    USE_YN = 'Y'
-	</select>
-	
 	<!-- 색상그룹코드 RGB 목록 -->
 	<select id="getColorGrpCdRgbList" resultType="CommonCode">
 		/* TssRenderer.getColorGrpCdRgbList */
@@ -359,5 +349,14 @@
 		ORDER BY DELV_FEE_CD
 	</select>
 	
+	<!-- 제휴채널 목록 -->
+	<select id="getAflinkList" parameterType="String" resultType="CommonCode">
+		/* TssRenderer.getAflinkList */
+		SELECT AF_LINK_CD AS CD
+		     , AF_LINK_NM AS CD_NM
+		FROM   TB_AF_LINK
+		WHERE  AF_CHANNEL = #{afChannel}
+		AND    USE_YN = 'Y'
+	</select>
 
 </mapper>

+ 70 - 0
src/main/java/com/style24/persistence/mybatis/shop/TssSettle.xml

@@ -0,0 +1,70 @@
+<?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.scm.biz.dao.TssSettleDao">
+
+	<!-- 제휴채널정산 목록 -->
+	<select id="getAfLinkFeeList" parameterType="AfLinkFee" resultType="AfLinkFee">
+		/* TssSettle.getAfLinkFeeList */
+		SELECT AF_LINK_CD                                         /*채널코드*/
+		     , AF_LINK_NM                                         /*채널명*/
+		     , OCCUR_DT                                           /*발생일시*/
+		     , ORD_NO                                             /*주문번호*/
+		     , ORD_DTL_STAT                                       /*주문상세상태*/
+		     , SUM(SELL_AMT)                     AS SELL_AMT      /*판매금액(상품금액.배송비제외)*/
+		     , SUM(CPN1_DC_AMT +
+		           TMTB1_DC_AMT + TMTB2_DC_AMT +
+		           GOODS_CPN_DC_AMT +
+		           CART_CPN_DC_AMT)              AS CPN_DC_AMT     /*쿠폰할인금액*/
+		     , SUM(PNT_DC_AMT + PRE_PNT_DC_AMT)  AS PNT_DC_AMT     /*포인트할인금액*/
+		     , SUM(GFCD_USE_AMT)                 AS GFCD_USE_AMT   /*상품권사용금액*/
+		     , SUM(SELL_AMT - (CPN1_DC_AMT + TMTB1_DC_AMT + TMTB2_DC_AMT + GOODS_CPN_DC_AMT + CART_CPN_DC_AMT + PG_CPN_AMT)
+		                    - (PNT_DC_AMT + PRE_PNT_DC_AMT)
+		                    - GFCD_USE_AMT)      AS PAY_AMT        /*결제금액(VAT포함)*/
+		     , SUM(TRUNCATE((SELL_AMT - (CPN1_DC_AMT + TMTB1_DC_AMT + TMTB2_DC_AMT + GOODS_CPN_DC_AMT + CART_CPN_DC_AMT + PG_CPN_AMT)
+		                              - (PNT_DC_AMT + PRE_PNT_DC_AMT)
+		                              - GFCD_USE_AMT
+		                    ) / 1.1,0))          AS SALES_AMT      /*매출금액(VAT제외). 건별로 1.1로 나누고 소숫점을 절사하여 합계를 낸다.*/
+		FROM   (
+		        SELECT ODH.AF_LINK_CD                                              /*제휴링크코드*/
+		             , AL.AF_LINK_NM
+		             , DATE_FORMAT(ODH.REG_DT,'%Y-%m-%d %m:%h:%s') AS OCCUR_DT     /*발생일자*/
+		             , ODH.ORD_NO
+		             , ODH.ORD_DTL_NO
+		             , CASE WHEN ODH.ORD_DTL_STAT = 'G013_20' THEN
+		                        FN_GET_CODE_NM('G013',ODH.ORD_DTL_STAT)
+		                    ELSE
+		                        IFNULL(FN_GET_CODE_NM('G685',OCD.CHG_STAT),'주문취소')
+		               END                                         AS ORD_DTL_STAT /*주문상세상태*/
+		             , (ODH.ORD_AMT - ODH.CNCL_RTN_AMT)            AS SELL_AMT     /*판매금액(상품금액.배송비제외)*/
+		             , ODH.CPN1_DC_AMT                                             /*1차쿠폰(즉시할인쿠폰)할인금액*/
+		             , ODH.TMTB1_DC_AMT                                            /*다다익선할인금액(수량)*/
+		             , ODH.TMTB2_DC_AMT                                            /*다다익선할인금액(금액)*/
+		             , ODH.GOODS_CPN_DC_AMT                                        /*상품쿠폰할인금액*/
+		             , ODH.CART_CPN_DC_AMT                                         /*장바구니할인금액*/
+		             , 0                                           AS PG_CPN_AMT   /*PG쿠폰금액.TODO:바로 아래 쿼리문으로 대체해야 함*/
+		             -- , ODH.PG_CPN_AMT                                              /*PG쿠폰금액*/
+		             , ODH.PNT_DC_AMT                                              /*포인트할인금액*/
+		             , ODH.PRE_PNT_DC_AMT                                          /*선포인트할인금액*/
+		             , ODH.GFCD_USE_AMT                                            /*상품권사용금액*/
+		        FROM   TB_ORDER_DETAIL_HST ODH
+		        INNER JOIN TB_AF_LINK AL
+		                ON ODH.AF_LINK_CD = AL.AF_LINK_CD
+		        LEFT OUTER JOIN TB_ORDER_CHANGE_DETAIL OCD
+		                     ON ODH.ORD_DTL_NO = OCD.ORD_DTL_NO
+		                    AND OCD.CHG_STAT IN ('G685_21','G685_32','G685_42')	/*취소완료,교환완료,반품완료*/
+		        WHERE  ODH.ORD_DTL_STAT IN ('G013_20','G013_99') /*결제완료,주문취소*/
+		        AND    ODH.REG_DT <![CDATA[>=]]> STR_TO_DATE(#{startDt},'%Y-%m-%d')
+		        AND    ODH.REG_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{endDt},'%Y-%m-%d'),INTERVAL 1 DAY)
+		        <if test="ordNo != null and ordNo != ''">
+		        AND    ODH.ORD_NO = #{ordNo}
+		        </if>
+		        <if test="afLinkCd != null and afLinkCd != ''">
+		        AND    AL.AF_LINK_CD = #{afLinkCd}
+		        </if>
+		        AND    AL.AF_CHANNEL = #{afChannel}
+		       ) U
+		GROUP  BY AF_LINK_CD, AF_LINK_NM, OCCUR_DT, ORD_NO, ORD_DTL_STAT
+		ORDER  BY AF_LINK_CD, AF_LINK_NM, OCCUR_DT, ORD_NO, ORD_DTL_STAT
+	</select>
+
+</mapper>

+ 46 - 4
src/main/java/com/style24/scm/biz/dao/TssGoodsDao.java

@@ -40,7 +40,6 @@ public interface TssGoodsDao {
 	 */
 	Collection<Itemkind> getItemkindList(Itemkind itemkind);
 
-
 	/**
 	 * 상품 목록 건수
 	 *
@@ -160,7 +159,6 @@ public interface TssGoodsDao {
 	 */
 	void createGoodsHst(Goods goods);
 
-
 	/**
 	 * 상품 수정 항목 일괄변경
 	 *
@@ -170,7 +168,6 @@ public interface TssGoodsDao {
 	 */
 	void updateGoodsState(Goods goods);
 
-
 	/**
 	 * 상품 자동 검색어 조회
 	 *
@@ -454,7 +451,6 @@ public interface TssGoodsDao {
 	 */
 	Collection<GoodsNotiInfo> getItemkindNotiInfoList(Goods goods);
 
-
 	/**
 	 * 상품 등록 로그 생성
 	 *
@@ -493,5 +489,51 @@ public interface TssGoodsDao {
 	 */
 	Collection<GoodsMass> getGoodsRegLogList(GoodsSearch goodsSearch);
 
+	/**
+	 * 상품 색상, 사이즈 정보 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 14
+	 */
+	GoodsMass getGoodsColorSize(Goods goods);
+
+	/**
+	 * 상품 대표색상 설정
+	 *
+	 * @param goodsMass
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 14
+	 */
+	void updateGoodsMainColorCd(GoodsMass goodsMass);
+
+	/**
+	 * 상품 상태만 변경
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 18
+	 */
+	void updateGoodsStatOnly(Goods goods);
+
+	/**
+	 * 상품코드 생성
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	void createGoodsSequence(Goods goods);
 
+	/**
+	 * 상품 기본 정보 수정 - 대량엑셀
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2021. 1. 20
+	 */
+	void updateGoodsMass(Goods goods);
 }

+ 9 - 9
src/main/java/com/style24/scm/biz/dao/TssRendererDao.java

@@ -194,15 +194,6 @@ public interface TssRendererDao {
 	 */
 	Collection<CommonCode> getQnaAnswerPhaseList(String ansClsf);
 
-//	/**
-//	 * 제휴링크 목록
-//	 * @param afChannel - 제휴채널
-//	 * @return
-//	 * @author gagamel
-//	 * @since 2020. 5. 4
-//	 */
-//	Collection<CommonCode> getAflinkList(String afChannel);
-
 	/**
 	 * 색상그룹코드 RGB 목록
 	 *
@@ -223,4 +214,13 @@ public interface TssRendererDao {
 	 */
 	Collection<CommonCode> getSupplyDeliveryFeePolicyList(String supplyCompCd);
 
+	/**
+	 * 제휴채널 목록
+	 * @param afChannel - 상위제휴채널
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 20
+	 */
+	Collection<CommonCode> getAflinkList(String afChannel);
+
 }

+ 26 - 0
src/main/java/com/style24/scm/biz/dao/TssSettleDao.java

@@ -0,0 +1,26 @@
+package com.style24.scm.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.AflinkFee;
+
+/**
+ * 정산 Dao
+ *
+ * @author gagamel
+ * @since 2021. 1. 20
+ */
+@ShopDs
+public interface TssSettleDao {
+
+	/**
+	 * 제휴채널정산 목록
+	 * @param afLinkFee - 제휴채널정산 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 20
+	 */
+	Collection<AflinkFee> getAfLinkFeeList(AflinkFee afLinkFee);
+
+}

+ 1581 - 177
src/main/java/com/style24/scm/biz/service/TssGoodsService.java

@@ -5,11 +5,11 @@ import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.StringUtils;
 
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -17,6 +17,7 @@ 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.GoodsCategory;
 import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsImg;
@@ -75,8 +76,6 @@ public class TssGoodsService {
 	@Autowired
 	private TssRendererService rendererService;
 
-
-
 	@Autowired
 	private ObjectMapper mapper;
 
@@ -84,6 +83,8 @@ public class TssGoodsService {
 
 	private static final String UPDATE_NO_PATTERN = "X";
 
+	private static final String SELF_GOOODS_AFTER = "STY";
+
 	/**
 	 * 상품 목록 건수
 	 *
@@ -144,8 +145,8 @@ public class TssGoodsService {
 			Collection<GagaMap> dataList = goodsDao.getGoodsInfoExcelList(goodsSearch); // map형식으로 조회
 			if (dataList != null && !dataList.isEmpty()) {
 				for (GagaMap gagaMap : dataList) {
-					if (!StringUtils.isEmpty(gagaMap.get("SYS_IMG_NM").toString()) ) {
-						gagaMap.set("SYS_IMG_NM", targetPath + '/' +  gagaMap.get("SYS_IMG_NM").toString());
+					if (!StringUtils.isBlank(gagaMap.get("SYS_IMG_NM").toString())) {
+						gagaMap.set("SYS_IMG_NM", targetPath + '/' + gagaMap.get("SYS_IMG_NM").toString());
 					}
 				}
 			}
@@ -219,8 +220,8 @@ public class TssGoodsService {
 					brand.setBrandCd(originGoods.getBrandCd());
 					Collection<Brand> brandList = businessService.getBrandList(brand);
 					if (brandList != null && !brandList.isEmpty()) {
-						float pntPrate = 0;
-						float pntMrate = 0;
+						float pntPrate = 0f;
+						float pntMrate = 0f;
 						for (Brand tmpBrand : brandList) {
 							if ("G009_10".equals(goods.getFormalGb())) {
 								pntPrate = tmpBrand.getPntPrate10();
@@ -260,8 +261,8 @@ public class TssGoodsService {
 				brand.setBrandCd(originGoods.getBrandCd());
 				Collection<Brand> brandList = businessService.getBrandList(brand);
 				if (brandList != null && !brandList.isEmpty()) {
-					float pntPrate = 0;
-					float pntMrate = 0;
+					float pntPrate = 0f;
+					float pntMrate = 0f;
 					for (Brand tmpBrand : brandList) {
 						if ("G009_10".equals(goods.getFormalGb())) {
 							pntPrate = tmpBrand.getPntPrate10();
@@ -357,6 +358,11 @@ public class TssGoodsService {
 		String goodsMobileDownDesc = this.getGoodsDescList(goods);
 		resultGoods.setGoodsMobileDownDesc(goodsMobileDownDesc);
 
+		// 상품 상세 (as-is)
+		goods.setDescGb("80");
+		String goodsDesc = this.getGoodsDescList(goods);
+		resultGoods.setGoodsDesc(goodsDesc);
+
 		return resultGoods;
 	}
 
@@ -375,7 +381,7 @@ public class TssGoodsService {
 			for (GoodsDesc tmpGoodsDesc : goodsDescList) {
 				goodsDescSb.append(tmpGoodsDesc.getGoodsDesc());
 			}
-		}else {
+		} else {
 			goodsDescSb.append("");
 		}
 		return goodsDescSb.toString();
@@ -476,11 +482,11 @@ public class TssGoodsService {
 		String goodsNumFlag = "";
 		for (Goods goods : goodsList) {
 
-			if (!StringUtils.isEmpty(goodsCdFlag) && !StringUtils.isEmpty(goodsNumFlag)) {
+			if (!StringUtils.isBlank(goodsCdFlag) && !StringUtils.isBlank(goodsNumFlag)) {
 				throw new IllegalStateException("상품코드와 원코드 중 한 개의 셀에만 값을 입력해서 조회하세요.");
 			}
 
-			if (!StringUtils.isEmpty(goods.getSupplyCompCd())) {
+			if (!StringUtils.isBlank(goods.getSupplyCompCd())) {
 				goods.setGoodsCd(goods.getSupplyCompCd());
 			}
 
@@ -528,6 +534,7 @@ public class TssGoodsService {
 		goods.setRegNo(TssSession.getInfo().getUserNo());
 		goods.setUpdNo(TssSession.getInfo().getUserNo());
 
+		goods.setGoodsDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsDesc(), "&lt;", "<"), "&gt;", ">"));
 		goods.setGoodsPcTopDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsPcTopDesc(), "&lt;", "<"), "&gt;", ">"));
 		goods.setGoodsMobileTopDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsMobileTopDesc(), "&lt;", "<"), "&gt;", ">"));
 		goods.setGoodsPcDownDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsPcDownDesc(), "&lt;", "<"), "&gt;", ">"));
@@ -561,7 +568,7 @@ public class TssGoodsService {
 			}
 			goodsPriceRes.setApplyStdt(GagaDateUtil.getTodayDateTime());	//yyyymmddhhmiss
 			int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) + 4;
-			goodsPriceRes.setApplyEddt(toYear +"1231235959");	//yyyymmddhhmiss
+			goodsPriceRes.setApplyEddt(toYear + "1231235959");	//yyyymmddhhmiss
 			goodsPriceRes.setCfrmYn("N");
 			goodsPriceRes.setApplyYn("N");
 			goodsPriceRes.setRegNo(goods.getRegNo());
@@ -576,7 +583,7 @@ public class TssGoodsService {
 		goods.setGiftPackYn("N");
 		// 사용자 검색어를 검색어에 적용
 		String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
-		if (!StringUtils.isEmpty(goods.getGoodsSnm1())) {
+		if (!StringUtils.isBlank(goods.getGoodsSnm1())) {
 			goods.setGoodsSnm1(GagaStringUtil.replace(goods.getGoodsSnm1(), " ", "")); // 빈값 삭제
 			String[] arrGoodsSnm = goods.getGoodsSnm1().split(";");
 			StringBuilder tempGoodsSnm = new StringBuilder();
@@ -599,8 +606,8 @@ public class TssGoodsService {
 				brand.setBrandCd(goods.getBrandCd());
 				Collection<Brand> brandList = businessService.getBrandList(brand);
 				if (brandList != null && !brandList.isEmpty()) {
-					float pntPrate = 0.0f;
-					float pntMrate = 0.0f;
+					float pntPrate = 0f;
+					float pntMrate = 0f;
 					for (Brand tmpBrand : brandList) {
 						if ("G009_10".equals(goods.getFormalGb())) {
 							pntPrate = tmpBrand.getPntPrate10();
@@ -656,11 +663,11 @@ public class TssGoodsService {
 			goodsOrderGrade.setGoodsCd(goods.getGoodsCd());
 			goodsOrderGrade.setRegNo(TssSession.getInfo().getUserNo());
 			goodsDao.deleteGoodsCustGrade(goodsOrderGrade);
-			for(String custGrade : goods.getGoodsOrderGrade()) {
+			for (String custGrade : goods.getGoodsOrderGrade()) {
 				goodsOrderGrade.setCustGrade(custGrade);
 				goodsDao.createGoodsCustGrade(goodsOrderGrade);
 			}
-		}else {
+		} else {
 			Goods goodsOrderGrade = new Goods();
 			goodsOrderGrade.setGoodsCd(goods.getGoodsCd());
 			goodsOrderGrade.setRegNo(TssSession.getInfo().getUserNo());
@@ -677,7 +684,7 @@ public class TssGoodsService {
 	 * @since 2020. 10. 27.
 	 */
 	private void saveGoodsDetailDesc(Goods goods) {
-		// 상품상세 구분(10:상품타이틀,20:상품타이틀내용,30:상품특징,40:상위컨텐츠,50:하위컨텐츠,60:하위컨텐츠-모바일,70:상위컨텐츠-모바일)
+		// 상품상세 구분(10:상품타이틀,20:상품타이틀내용,30:상품특징,40:상위컨텐츠,50:하위컨텐츠,60:하위컨텐츠-모바일,70:상위컨텐츠-모바일,80:상품상세(as-is))
 		GoodsDesc goodsDesc = new GoodsDesc();
 		goodsDesc.setGoodsCd(goods.getGoodsCd());
 		goodsDesc.setRegNo(goods.getRegNo());
@@ -720,6 +727,11 @@ public class TssGoodsService {
 		goodsDesc.setDescGb("70");
 		goodsDesc.setGoodsDesc(goods.getGoodsMobileDownDesc());
 		this.saveGoodsDesc(goodsDesc);
+
+		// 상품상세(as-is,입점
+		goodsDesc.setDescGb("80");
+		goodsDesc.setGoodsDesc(goods.getGoodsDesc());
+		this.saveGoodsDesc(goodsDesc);
 	}
 
 	/**
@@ -838,7 +850,7 @@ public class TssGoodsService {
 			goodsStock.setOptCd2(goods.getOptCd2()[index]);
 			goodsStock.setBaseStockQty(Integer.parseInt(goods.getBaseStockQty()[index]));
 			goodsStock.setSoldoutYn(goods.getSoldoutYn()[index]);
-			goodsStock.setDispOrd(goods.getDispOrd()[index]);
+			goodsStock.setDispOrd(Integer.parseInt(goods.getDispOrd()[index]));
 			goodsStock.setDispYn(goods.getDispYn()[index]);
 			goodsStock.setRegNo(goods.getRegNo());
 			goodsStock.setUpdNo(goods.getUpdNo());
@@ -991,7 +1003,7 @@ public class TssGoodsService {
 			noticeService.updateNotice(notice);
 		}
 
-		if (!StringUtils.isEmpty(notice.getGoodsList())) {
+		if (!StringUtils.isBlank(notice.getGoodsList())) {
 			Collection<NoticeGoods> noticeGoodsList = null;
 			try {
 				noticeGoodsList = mapper.readValue(notice.getGoodsList(), new TypeReference<Collection<NoticeGoods>>() {
@@ -1057,7 +1069,7 @@ public class TssGoodsService {
 	 * @since 2020. 12. 23
 	 */
 	@Transactional("shopTxnManager")
-	public void saveGoodsImageList(Collection<GoodsImg> goodsImgList){
+	public void saveGoodsImageList(Collection<GoodsImg> goodsImgList) {
 		int index = 0;
 		for (GoodsImg goodsImg : goodsImgList) {
 			// 상품이미지 전체 삭제
@@ -1100,7 +1112,7 @@ public class TssGoodsService {
 	 * @since 2021. 01. 12
 	 */
 	@Transactional("shopTxnManager")
-	public String createExceluploadSelfGoods(GagaMap gagaMap,  String procJob) {
+	public String createExceluploadSelfGoods(GagaMap gagaMap, String procJob) {
 
 		GoodsMass goodsMass = mapper.convertValue(gagaMap, GoodsMass.class);
 
@@ -1112,7 +1124,7 @@ public class TssGoodsService {
 			return goods.getGoodsStat();  //continue
 		}
 
-		// 상품고시정보
+		// 상품고시정보 - 항목및 기본값
 		Collection<GoodsNotiInfo> goodsNotiList = goodsDao.getItemkindNotiInfoList(goods);
 		if (goodsNotiList == null || goodsNotiList.isEmpty()) {
 			goods.setGoodsRegMsg("품목의 고시정보 없음");
@@ -1121,42 +1133,6 @@ public class TssGoodsService {
 			return goods.getGoodsStat();
 		}
 
-		// 자사 상품 등록시 고시정보 처리
-		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);
-
-		if ("10".equals(goods.getGoodsStat())) { // 정보 오류
-			this.setGoodsRegResult(goods, goodsMass, procJob);
-			return goods.getGoodsStat();
-		}
-
 		// 할인율
 		goods.setDcRate((int)(this.getDcRate(goods.getListPrice(), goods.getCurrPrice())));
 
@@ -1171,21 +1147,73 @@ public class TssGoodsService {
 
 		goodsMass.setGoodsCd(goods.getGoodsCd());
 
-		this.createGoodsNoti(gagaMap, goodsNotiList); // 상품고시정보 저장
-
-		Collection<Option> goodsWmsSizeList = new ArrayList<>();
-		// 상품사이즈 정보 -- 재고 정보연동 해야함
-		goodsWmsSizeList = goodsDao.getGoodsWmsSizeList(goods);
+		// 상품사이즈 정보
+		Collection<Option> goodsWmsSizeList = goodsDao.getGoodsWmsSizeList(goods);
 		if (goodsWmsSizeList == null || goodsWmsSizeList.isEmpty()) {
 			goods.setGoodsRegMsg("WMS 상품 사이즈 정보 없음");
 			goods.setGoodsStat("G008_20");
+		} else {
+			this.createSelfGoodsSize(goods, goodsWmsSizeList); // 자사 상품사이즈 정보 저장
+		}
+
+		// 상품 색상 , 사이즈 옵션 정보 조회
+		GoodsMass goodsColorSize = goodsDao.getGoodsColorSize(goods);
+		if (goodsColorSize != null && !StringUtils.isBlank(goodsColorSize.getMainColorCd())) {
+			goodsColorSize.setUpdNo(TssSession.getInfo().getUserNo());
+			goodsDao.updateGoodsMainColorCd(goodsColorSize); // 대표색상 설정
+		}
+
+		int index = 0;
+		// 자사 상품 등록시 고시정보 처리
+		for (GoodsNotiInfo goodsNotiInfo : goodsNotiList) {
+			if (!StringUtils.isBlank(gagaMap.getString("niContent" + (index + 1)).trim())) {
+				goodsNotiInfo.setNiContent(gagaMap.getString("niContent" + (index + 1)).trim());
+			}
+
+			if ("G005_003".equals(goodsNotiInfo.getNiItemCd())) {	// 색상
+				if (!StringUtils.isBlank(goodsColorSize.getOpt1Str())) {
+					goodsNotiInfo.setNiContent(goodsColorSize.getOpt1Str());
+				}
+			} else if ("G005_004".equals(goodsNotiInfo.getNiItemCd())) {	//치수
+				if (!StringUtils.isBlank(goodsColorSize.getOpt2Str())) {
+					goodsNotiInfo.setNiContent(goodsColorSize.getOpt2Str());
+				}
+			} else if ("G005_006".equals(goodsNotiInfo.getNiItemCd())) {	//제조국
+				if (!StringUtils.isBlank(goods.getOriginNm())) {
+					goodsNotiInfo.setNiContent(goods.getOriginNm());
+				}
+			} else if ("G005_009".equals(goodsNotiInfo.getNiItemCd())) {	//제조년월
+				if (!StringUtils.isBlank(goods.getMakeYmd())) {
+					goodsNotiInfo.setNiContent(goods.getMakeYmd());
+				}
+			} else if ("G005_097".equals(goodsNotiInfo.getNiItemCd())) {	//수입여부
+				if (!StringUtils.isBlank(goods.getOriginNm()) &&
+					(goods.getOriginNm().indexOf("대한민국") >= 0 || goods.getOriginNm().indexOf("한국") >= 0 || goods.getOriginNm().toUpperCase().indexOf("KOREA") >= 0)) {
+					goodsNotiInfo.setNiContent("N");
+				} else {
+					goodsNotiInfo.setNiContent("Y");
+				}
+			} else if ("G005_099".equals(goodsNotiInfo.getNiItemCd())) {	//종류
+				if (!StringUtils.isBlank(goods.getItemkindNm())) {
+					goodsNotiInfo.setNiContent(goods.getItemkindNm());
+				}
+			}
+			index++;
 		}
 
-		this.createSelfGoodsSize(goods, goodsWmsSizeList); // 자사 상품사이즈 정보 자장
+		//고시항목 필수값 확인
+		goods = this.getGoodsNotiCheck(goods, goodsNotiList, gagaMap, procJob);
+
+		//고시 필수 항목 미입력으로 상품 상태 변경
+		if ("G008_20".equals(goods.getGoodsStat())) {
+			goodsDao.updateGoodsStatOnly(goods);
+		}
+
+		this.createGoodsNoti(gagaMap, goodsNotiList); // 상품고시정보 저장
 
 		// 사용자 검색어를 검색어에 적용
 		String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
-		if (!StringUtils.isEmpty(goods.getGoodsSnm1())) {
+		if (!StringUtils.isBlank(goods.getGoodsSnm1())) {
 			String[] arrGoodsSnm = goods.getGoodsSnm1().split(";");
 			StringBuilder tempGoodsSnm = new StringBuilder();
 			for (String loopGoodsSnm : arrGoodsSnm) {
@@ -1220,17 +1248,19 @@ public class TssGoodsService {
 	private Goods createSelfGoodsInfo(GoodsMass goodsMass, String procJob) {
 
 		Goods goods = new Goods();
-		goods.setGoodsStat("G008_40"); // 상품상태
-		goods.setGoodsRegMsg("승인대기");
+		goods.setGoodsStat("G008_20"); // 상품상태
+		goods.setGoodsRegMsg("이미지 등록 필요");
+		goods.setRegNo(TssSession.getInfo().getUserNo());
+		goods.setUpdNo(TssSession.getInfo().getUserNo());
 
-		// 품번정보 확인 (FRJ 는 11, 그외는 10)
-		if (StringUtils.isEmpty(goodsMass.getGoodsNum()) || goodsMass.getGoodsNum().length() < 10 || goodsMass.getGoodsNum().length() > 11) {
+		// 품번정보 확인 (길이 10, FRJ '-' 삭제)
+		if (StringUtils.isBlank(goodsMass.getGoodsNum().trim()) || goodsMass.getGoodsNum().trim().replace("-", "") .length() != 10) {
 			goods.setGoodsRegMsg("품번코드 오류");
 			goods.setGoodsStat("10");
 			return goods;
 		}
 
-		goods.setGoodsCd(goodsMass.getGoodsNum().toUpperCase()); // 상품코드
+		goods.setGoodsCd(goodsMass.getGoodsNum().trim().toUpperCase()); // 상품코드
 
 		// 상품코드 중복여부 확인
 		Goods goodsDup = goodsDao.getGoods(goods);
@@ -1240,20 +1270,10 @@ public class TssGoodsService {
 			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(goods);
 		if (wmsGoodsInfo == null) {
-			goods.setGoodsRegMsg("WMS 미존재 품코드");
+			goods.setGoodsRegMsg("WMS 미존재 품번코드");
 			goods.setGoodsStat("10");
 			return goods;
 		}
@@ -1261,71 +1281,36 @@ public class TssGoodsService {
 		goods.setProductCode(wmsGoodsInfo.getProductCode());
 
 		// 품번코드
-		goods.setGoodsNum(goodsMass.getGoodsNum().toUpperCase());
+		goods.setGoodsNum(goodsMass.getGoodsNum().trim().toUpperCase());
 		// 입점상품코드
-		goods.setSupplyGoodsCd(goodsMass.getGoodsNum().toUpperCase());
+		goods.setSupplyGoodsCd(goodsMass.getGoodsNum().trim().toUpperCase());
 
 		// 브랜드
-		if (StringUtils.isEmpty(goodsMass.getBrandCd())) {
+		if (StringUtils.isBlank(goodsMass.getBrandCd().trim())) {
 			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); // 업체 코드
-
+		goods.setBrandCd(goodsMass.getBrandCd().trim()); // 브랜드 코드
 
 		// 상품명
-		if (StringUtils.isEmpty(goodsMass.getGoodsNm())) {
+		if (StringUtils.isBlank(goodsMass.getGoodsNm().trim())) {
 			goods.setGoodsRegMsg("상품명 오류");
 			goods.setGoodsStat("10");
 			return goods;
 		}
-		goods.setGoodsNm(goodsMass.getGoodsNm().replaceAll("(\\r\\n|\\r|\\n|\\n\\r)", ""));
+		goods.setGoodsNm(goodsMass.getGoodsNm().trim().replaceAll("(\\r\\n|\\r|\\n|\\n\\r)", ""));
 
 		// 품목코드
-		if (StringUtils.isEmpty(goodsMass.getItemkindCd())) {
+		if (StringUtils.isBlank(goodsMass.getItemkindCd().trim())) {
 			goods.setGoodsRegMsg("품목코드 오류");
 			goods.setGoodsStat("10");
 			return goods;
 		}
-		goods.setItemkindCd(goodsMass.getItemkindCd());
+		goods.setItemkindCd(goodsMass.getItemkindCd().trim());
 
 		Itemkind itemkind = new Itemkind();
-		itemkind.setItemkindCd(goodsMass.getItemkindCd());
+		itemkind.setItemkindCd(goods.getItemkindCd());
 		itemkind.setUseYn("Y");
 		Collection<Itemkind> getItemkindList = goodsDao.getItemkindList(itemkind);
 		if (getItemkindList == null || getItemkindList.size() == 0) {
@@ -1333,22 +1318,23 @@ public class TssGoodsService {
 			goods.setGoodsStat("10");
 			return goods;
 		}
+		goods.setItemkindNm(getItemkindList.iterator().next().getItemkindLeafNm());	//LEAF품목명
 
 		// 스타일 년도
-		if (StringUtils.isEmpty(goodsMass.getStyleYear()) ||  goodsMass.getStyleYear().length() != 4 || !goodsMass.getStyleYear().trim().matches(NUMBER_PATTERN)) {
+		if (StringUtils.isBlank(goodsMass.getStyleYear().trim()) || goodsMass.getStyleYear().trim().length() != 4 || !goodsMass.getStyleYear().trim().matches(NUMBER_PATTERN)) {
 			goods.setGoodsRegMsg("스타일 년도 오류");
 			goods.setGoodsStat("10");
 			return goods;
 		}
-		goods.setStyleYear(goodsMass.getStyleYear());
+		goods.setStyleYear(goodsMass.getStyleYear().trim());
 
 		// 시즌
-		if (StringUtils.isEmpty(goodsMass.getSeasonCd())) {
+		if (StringUtils.isBlank(goodsMass.getSeasonCd().trim())) {
 			goods.setGoodsRegMsg("시즌 오류");
 			goods.setGoodsStat("10");
 			return goods;
 		}
-		goods.setSeasonCd(goodsMass.getSeasonCd()); // 시즌
+		goods.setSeasonCd(goodsMass.getSeasonCd().trim()); // 시즌
 
 		CommonCode commonCode = new CommonCode();
 		commonCode.setUseYn("Y");
@@ -1362,12 +1348,12 @@ public class TssGoodsService {
 		}
 
 		// 성별
-		if (StringUtils.isEmpty(goodsMass.getSexGb())) {
+		if (StringUtils.isBlank(goodsMass.getSexGb().trim())) {
 			goods.setGoodsRegMsg("성별 오류");
 			goods.setGoodsStat("10");
 			return goods;
 		}
-		goods.setSexGb(goodsMass.getSexGb()); // 성별
+		goods.setSexGb(goodsMass.getSexGb().trim()); // 성별
 		commonCode.setCdGb("G007"); // 성별
 		commonCode.setCd(goods.getSexGb());
 		Collection<CommonCode> sexGbList = rendererService.getCommonCodeList(commonCode);
@@ -1378,31 +1364,31 @@ public class TssGoodsService {
 		}
 
 		// 정상가
-		if (StringUtils.isEmpty(goodsMass.getListPrice())) {
+		if (StringUtils.isBlank(goodsMass.getListPrice().trim())) {
 			goods.setGoodsRegMsg("정상가 오류");
 			goods.setGoodsStat("10");
 			return goods;
 		}
-		if (!GagaStringUtil.replace(goodsMass.getListPrice(), ",", "").trim().matches(NUMBER_PATTERN)) {
+		if (!GagaStringUtil.replace(goodsMass.getListPrice().trim(), ",", "").trim().matches(NUMBER_PATTERN)) {
 			goods.setGoodsRegMsg("정상가 오류");
 			goods.setGoodsStat("10");
 			return goods;
 		}
 
 		// 판매가
-		if (StringUtils.isEmpty(goodsMass.getCurrPrice())) {
+		if (StringUtils.isBlank(goodsMass.getCurrPrice().trim())) {
 			goods.setGoodsRegMsg("판매가 오류");
 			goods.setGoodsStat("10");
 			return goods;
 		}
-		if (!GagaStringUtil.replace(goodsMass.getCurrPrice(), ",", "").trim().matches(NUMBER_PATTERN)) {
+		if (!GagaStringUtil.replace(goodsMass.getCurrPrice().trim(), ",", "").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());
+		int listPrice = Integer.parseInt(GagaStringUtil.replace(goodsMass.getListPrice().trim(), ",", ""));
+		int currPrice = Integer.parseInt(GagaStringUtil.replace(goodsMass.getCurrPrice().trim(), ",", ""));
 
 		if (currPrice > listPrice) {
 			goods.setGoodsRegMsg("판매가 오류");
@@ -1418,31 +1404,31 @@ public class TssGoodsService {
 		// 원가
 		// FRJ 필수 확인
 		if ("S006".equals(goods.getBrandCd())) {
-			if (StringUtils.isEmpty(goodsMass.getCostPrice())) {
+			if (StringUtils.isBlank(goodsMass.getCostPrice().trim())) {
 				goods.setGoodsRegMsg("원가 오류");
 				goods.setGoodsStat("10");
 				return goods;
 			}
-			if (!GagaStringUtil.replace(goodsMass.getCostPrice(), ",", "").trim().matches(NUMBER_PATTERN)) {
+			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());
+			int costPrice = Integer.parseInt(GagaStringUtil.replace(goodsMass.getCostPrice().trim(), ",", ""));
 			// 원가
 			goods.setCostPrice(costPrice);
-		}else {
+		} else {
 			goods.setCostPrice(0);
 		}
 
 		// 정상이월
-		if (StringUtils.isEmpty(goodsMass.getSexGb())) {
-			goods.setGoodsRegMsg("성별 오류");
+		if (StringUtils.isBlank(goodsMass.getFormalGb().trim())) {
+			goods.setGoodsRegMsg("정상이월 오류");
 			goods.setGoodsStat("10");
 			return goods;
 		}
-		goods.setFormalGb(goodsMass.getFormalGb());
-		commonCode.setCdGb("G009"); // 정상이월구분
+		goods.setFormalGb(goodsMass.getFormalGb().trim());
+		commonCode.setCdGb("G009"); 	//정상이월
 		commonCode.setCd(goods.getFormalGb());
 		Collection<CommonCode> formalGbList = rendererService.getCommonCodeList(commonCode);
 		if (formalGbList == null || formalGbList.isEmpty()) {
@@ -1451,15 +1437,50 @@ public class TssGoodsService {
 			return goods;
 		}
 
+		// 브랜드 확인
+		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 = 0f;
+		float pntMrate = 0f;
+		float sellFeeRate = 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.getOriginCd())) {
+		if (StringUtils.isBlank(goodsMass.getOriginCd().trim())) {
 			goods.setGoodsRegMsg("원산지 오류");
 			goods.setGoodsStat("10");
 			return goods;
 		}
-		goods.setOriginCd(goodsMass.getOriginCd());
+		goods.setOriginCd(goodsMass.getOriginCd().trim());
 		commonCode.setCdGb("G076"); // 원산지
-		commonCode.setCd(goods.getFormalGb());
+		commonCode.setCd(goods.getOriginCd());
 		Collection<CommonCode> originCdList = rendererService.getCommonCodeList(commonCode);
 		if (originCdList == null || originCdList.isEmpty()) {
 			goods.setGoodsRegMsg("원산지 오류");
@@ -1469,17 +1490,17 @@ public class TssGoodsService {
 		goods.setOriginNm(originCdList.iterator().next().getCdNm());	//고시정보 적용용
 
 		// 제조년월
-		if (StringUtils.isEmpty(goodsMass.getMakeYmd())) {
+		if (StringUtils.isBlank(goodsMass.getMakeYmd().trim())) {
 			goods.setGoodsRegMsg("제조년월일 오류");
 			goods.setGoodsStat("10");
 			return goods;
 		}
-		goods.setMakeYmd(goodsMass.getMakeYmd());
+		goods.setMakeYmd(goodsMass.getMakeYmd().trim());
 
 		SimpleDateFormat dateFormatParser = new SimpleDateFormat("yyyyMMdd");
 		dateFormatParser.setLenient(false);
 		try {
-			dateFormatParser.parse(goodsMass.getMakeYmd());
+			dateFormatParser.parse(goods.getMakeYmd());
 		} catch (Exception e) {
 			goods.setGoodsRegMsg("제조년월일 오류");
 			goods.setGoodsStat("10");
@@ -1493,13 +1514,11 @@ public class TssGoodsService {
 		if ("S006".equals(goods.getBrandCd())) { //frj 사입처리
 			goods.setDistributionGb("G065_11"); //자사 - 사입
 		}
+		goods.setTaxGb("10"); // 과세구분 10: 과세, 20:비과세
 		goods.setSelfGoodsYn("Y"); // 자사상품여부
 		goods.setSelfMallYn("Y"); //자사몰 노출여부
 		goods.setErpStockLinkYn("Y"); // ERP재고연동여부
 
-		goods.setRegNo(TssSession.getInfo().getUserNo());
-		goods.setUpdNo(TssSession.getInfo().getUserNo());
-
 		return goods;
 	}
 
@@ -1517,19 +1536,19 @@ public class TssGoodsService {
 		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 (StringUtils.isEmpty(goodsMass.getCostPrice())) {
-			goodsMass.setCostPrice("0");
-		}
-		if ("10".equals(goods.getGoodsStat())) {
-			goodsMass.setRegSuccYn("N");
-		}
+		//model은 string 테이블은 number 형이라 ,,,
+//		if (StringUtils.isBlank(goodsMass.getListPrice())) {
+//			goodsMass.setListPrice("0");
+//		}
+//		if (UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice()) || StringUtils.isBlank(goodsMass.getCurrPrice())) {
+//			goodsMass.setCurrPrice("0");
+//		}
+//		if (StringUtils.isBlank(goodsMass.getCostPrice())) {
+//			goodsMass.setCostPrice("0");
+//		}
+//		if ("10".equals(goods.getGoodsStat())) {
+//			goodsMass.setRegSuccYn("N");
+//		}
 		goodsMass.setProcGb("C");
 		if ("updateGoods".equals(procJob)) {
 			goodsMass.setProcGb("U");
@@ -1547,21 +1566,20 @@ public class TssGoodsService {
 	 * @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("고시항목 오류");
+				if ("Y".equals(goodsNotiInfo.getReqYn()) && StringUtils.isBlank(goodsNotiInfo.getNiContent())) {
+					goods.setGoodsRegMsg("고시항목 필수 항목 오류");
 					goods.setGoodsStat("G008_20");
 					return goods;
 				}
 			}
 		} else {
 			for (GoodsNotiInfo goodsNotiInfo : goodsNotiList) {
-				if ("Y".equals(goodsNotiInfo.getReqYn()) && StringUtils.isEmpty(excelMap.getString("niContent" + (index + 1)))) {
+				if ("Y".equals(goodsNotiInfo.getReqYn()) && StringUtils.isBlank(excelMap.getString("niContent" + (index + 1)).trim())) {
 					goods.setGoodsRegMsg("고시정보 없음 (" + (index + 1) + "번째 항목) - " + goodsNotiInfo.getNiItemCd() + "(" + goodsNotiInfo.getNiItemNm() + ")");
 					goods.setGoodsStat("10");
 					return goods;
@@ -1579,7 +1597,7 @@ public class TssGoodsService {
 	 *
 	 * @param goods
 	 * @param excelMap
-	 * @return TsaGoods
+	 * @return Goods
 	 * @author eskim
 	 * @since 2021. 01. 12
 	 */
@@ -1588,10 +1606,10 @@ public class TssGoodsService {
 		int index = 0;
 		for (GoodsNotiInfo goodsNotiInfo : goodsNotiList) {
 
-			if (StringUtils.isEmpty(excelMap.getString("niContent" + (index + 1)))) {
+			if (StringUtils.isBlank(excelMap.getString("niContent" + (index + 1)).trim())) {
 				goodsNotiInfo.setNiContent(goodsNotiInfo.getNiContent());
 			} else {
-				goodsNotiInfo.setNiContent(excelMap.getString("niContent" + (index + 1)));
+				goodsNotiInfo.setNiContent(excelMap.getString("niContent" + (index + 1)).trim());
 			}
 			goodsNotiInfo.setRegNo(TssSession.getInfo().getUserNo());
 			goodsNotiInfo.setUpdNo(TssSession.getInfo().getUserNo());
@@ -1605,7 +1623,7 @@ public class TssGoodsService {
 	 *
 	 * @param goods
 	 * @param excelMap
-	 * @return TsaGoods
+	 * @return Goods
 	 * @author eskim
 	 * @since 2021. 01. 13
 	 */
@@ -1623,4 +1641,1390 @@ public class TssGoodsService {
 			index++;
 		}
 	}
+
+	/**
+	 * 상품대량등록 엑셀 저장 - 입점상품
+	 *
+	 * @param ecxelGoodsList, excelFilename, procJob(자사:createSelfGoods, 입점:createGoods)
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 19
+	 */
+	@Transactional("shopTxnManager")
+	public String createExceluploadGoods(GagaMap gagaMap, String procJob) {
+
+		GoodsMass goodsMass = mapper.convertValue(gagaMap, GoodsMass.class);
+
+		// 상품기본정보
+		Goods goods = this.createGoodsInfo(goodsMass, procJob);
+
+		if ("10".equals(goods.getGoodsStat())) { // 정보 오류
+			this.setGoodsRegResult(goods, goodsMass, procJob);
+			return goods.getGoodsStat();  //continue
+		}
+
+		//상품코드 생성
+		goods.setGoodsCd(this.getGoodsCodeSeq("E", goods.getBrandCd())); // 입점상품 상품코드 생성
+
+		// 상품고시정보 - 항목및 기본값
+		Collection<GoodsNotiInfo> goodsNotiList = goodsDao.getItemkindNotiInfoList(goods);
+		if (goodsNotiList == null || goodsNotiList.isEmpty()) {
+			goods.setGoodsRegMsg("품목의 고시정보 없음");
+			goods.setGoodsStat("10");
+			this.setGoodsRegResult(goods, goodsMass, procJob);
+			return goods.getGoodsStat();
+		}
+
+		// 할인율
+		goods.setDcRate((int)(this.getDcRate(goods.getListPrice(), goods.getCurrPrice())));
+
+		Collection<Option> stockList = new ArrayList<>();
+		// 입점상품 사이즈 작업
+		if (StringUtils.isBlank(goodsMass.getOptStr())) {
+			goods.setGoodsRegMsg("옵션 정보 없음");
+			goods.setGoodsStat("10");
+			this.setGoodsRegResult(goods, goodsMass, procJob);
+			return goods.getGoodsStat();
+		}
+
+		//옵션1[필수]^옵션2[선택]^추가금액^안전재고[필수]^판매재고[필수]  |
+		//검정^90^0^0^10|검정^95^0^0^8|검정^100^0^0^5|파랑^90^0^0^15|파랑^95^0^0^5|파랑^100^0^0^1|파랑^105^0^0^7
+
+		String[] arrSizeCd = GagaStringUtil.cutTokenToArray(goodsMass.getOptStr().trim(), "|");
+		for (int i = 0; i < arrSizeCd.length; i++) {
+			String[] arrOptCd = GagaStringUtil.cutTokenToArray(arrSizeCd[i], "^");
+			if (arrOptCd.length != 5  ) {
+				goods.setGoodsRegMsg("옵션(SKU) " + (i+1)+ "번째 옵션구분자[^] 갯수 상이");
+				goods.setGoodsStat("10");
+				break;
+			}
+
+			// 옵션1 - 필수
+			if (StringUtils.isBlank(arrOptCd[0])) {
+				goods.setGoodsRegMsg("옵션(SKU) " + (i+1)+ "번째 옵션1 정보없음");
+				goods.setGoodsStat("10");
+				break;
+			}
+			// 추가금액 - 필수
+			if (StringUtils.isBlank(arrOptCd[2])) {
+				goods.setGoodsRegMsg("옵션(SKU) " + (i+1)+ "번째 추가금액 정보없음");
+				goods.setGoodsStat("10");
+				break;
+			}
+			if (!arrOptCd[2].trim().matches(NUMBER_PATTERN)) {
+				goods.setGoodsRegMsg("옵션(SKU) " + (i+1)+ "번째 추가금액 숫자 오류");
+				goods.setGoodsStat("10");
+				break;
+			}
+			// 안전재고 - 필수
+			if (StringUtils.isBlank(arrOptCd[3])) {
+				goods.setGoodsRegMsg("옵션(SKU) " + (i+1)+ "번째 안전재고 정보없음");
+				goods.setGoodsStat("10");
+				break;
+			}
+			if (!arrOptCd[3].trim().matches(NUMBER_PATTERN)) {
+				goods.setGoodsRegMsg("옵션(SKU) " + (i+1)+ "번째 안전재고 숫자 오류");
+				goods.setGoodsStat("10");
+				break;
+			}
+			// 판매재고 - 필수
+			if (StringUtils.isBlank(arrOptCd[4])) {
+				goods.setGoodsRegMsg("옵션(SKU) " + (i+1)+ "번째 판매재고 정보없음");
+				goods.setGoodsStat("10");
+				break;
+			}
+			if (!arrOptCd[4].trim().matches(NUMBER_PATTERN)) {
+				goods.setGoodsRegMsg("옵션(SKU) " + (i+1)+ "번째 판매재고 숫자 오류");
+				goods.setGoodsStat("10");
+				break;
+			}
+
+			Option goodsStock = new Option();
+			goodsStock.setGoodsCd(goods.getGoodsCd());
+			goodsStock.setOptCd(goods.getGoodsCd() + "-" + (i+1));
+			goodsStock.setOptCd1(arrOptCd[0].trim());
+			goodsStock.setOptCd2(arrOptCd[1].trim());
+			goodsStock.setAddPrice(Integer.parseInt(arrOptCd[2]));
+			goodsStock.setBaseStockQty(Integer.parseInt(arrOptCd[3]));
+			goodsStock.setCurrStockQty(Integer.parseInt(arrOptCd[4]));
+			goodsStock.setSoldoutYn("N");
+			goodsStock.setDispOrd(i + 1);
+			goodsStock.setDispYn("Y");
+			goodsStock.setRegNo(goods.getRegNo());
+			goodsStock.setUpdNo(goods.getUpdNo());
+
+			stockList.add(goodsStock);
+		}
+
+		if ("10".equals(goods.getGoodsStat())) { // 정보 오류
+			this.setGoodsRegResult(goods, goodsMass, procJob);
+			return goods.getGoodsStat();  //continue
+		}
+
+		// 상품상세 확인
+		if (!StringUtils.isBlank(goodsMass.getGoodsContent())) {
+			if (goodsMass.getGoodsContent().toLowerCase().indexOf("script") >= 0 ) {
+				goods.setGoodsRegMsg("상품상세 html script 선언 오류");
+				goods.setGoodsStat("10");
+				this.setGoodsRegResult(goods, goodsMass, procJob);
+				return goods.getGoodsStat();
+			}
+		}
+
+		goodsDao.createGoods(goods); // 상품기본 저장
+		goodsDao.createGoodsSmmary(goods); // 상품통계 생성
+
+		this.createGoodsSize(goods, stockList); // 입점 상품사이즈 정보 자장
+
+		goodsMass.setGoodsCd(goods.getGoodsCd());
+
+		int index = 0;
+		// 상품 등록시 고시정보 처리
+		for (GoodsNotiInfo goodsNotiInfo : goodsNotiList) {
+			if (!StringUtils.isBlank(gagaMap.getString("niContent" + (index + 1)))) {
+				goodsNotiInfo.setNiContent(gagaMap.getString("niContent" + (index + 1)));
+			}
+
+			if ("G005_006".equals(goodsNotiInfo.getNiItemCd())) {	//제조국
+				if (!StringUtils.isBlank(goods.getOriginNm())) {
+					goodsNotiInfo.setNiContent(goods.getOriginNm());
+				}
+			} else if ("G005_009".equals(goodsNotiInfo.getNiItemCd())) {	//제조년월
+				if (!StringUtils.isBlank(goods.getMakeYmd())) {
+					goodsNotiInfo.setNiContent(goods.getMakeYmd());
+				}
+			} else if ("G005_097".equals(goodsNotiInfo.getNiItemCd())) {	//수입여부
+				if (!StringUtils.isBlank(goods.getOriginNm()) &&
+					(goods.getOriginNm().indexOf("대한민국") >= 0 || goods.getOriginNm().indexOf("한국") >= 0 || goods.getOriginNm().toUpperCase().indexOf("KOREA") >= 0)) {
+					goodsNotiInfo.setNiContent("N");
+				} else {
+					goodsNotiInfo.setNiContent("Y");
+				}
+			} else if ("G005_099".equals(goodsNotiInfo.getNiItemCd())) {	//종류
+				if (!StringUtils.isBlank(goods.getItemkindNm())) {
+					goodsNotiInfo.setNiContent(goods.getItemkindNm());
+				}
+			}
+			index++;
+		}
+
+		//고시항목 필수값 확인
+		goods = this.getGoodsNotiCheck(goods, goodsNotiList, gagaMap, procJob);
+
+		//고시 필수 항목 미입력으로 상품 상태 변경
+		if ("G008_20".equals(goods.getGoodsStat())) {
+			goodsDao.updateGoodsStatOnly(goods);
+		}
+
+		this.createGoodsNoti(gagaMap, goodsNotiList); // 상품고시정보 저장
+
+		// 상품상세(입점)
+		if (!StringUtils.isBlank(goodsMass.getGoodsContent().trim())) {
+			GoodsDesc goodsDesc = new GoodsDesc();
+			goodsDesc.setGoodsCd(goods.getGoodsCd());
+			goodsDesc.setRegNo(goods.getRegNo());
+			goodsDesc.setUpdNo(goods.getUpdNo());
+
+			goodsDesc.setDescGb("80");
+			goodsDesc.setGoodsDesc(goodsMass.getGoodsContent().trim());
+			this.saveGoodsDesc(goodsDesc);
+		}
+
+		// 사용자 검색어를 검색어에 적용
+		String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
+		if (!StringUtils.isBlank(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);
+
+		return goods.getGoodsStat();
+
+	}
+
+	/**
+	 * 상품등록 - 상품기본정보 - 입점상품
+	 *
+	 * @param goodsMass
+	 * @param excelFilename
+	 * @author eskim
+	 * @since 2021. 01. 19
+	 */
+	private Goods createGoodsInfo(GoodsMass goodsMass, String procJob) {
+
+		Goods goods = new Goods();
+		goods.setGoodsStat("G008_20"); // 상품상태
+		goods.setGoodsRegMsg("이미지 등록 필요");
+		goods.setRegNo(TssSession.getInfo().getUserNo());
+		goods.setUpdNo(TssSession.getInfo().getUserNo());
+
+		if (StringUtils.isBlank(goodsMass.getSupplyGoodsCd().trim())) {
+			goods.setGoodsRegMsg("공급업체 상품코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setSupplyGoodsCd(goodsMass.getSupplyGoodsCd().trim());
+
+		if (StringUtils.isBlank(goodsMass.getSupplyCompCd().trim())) {
+			goods.setGoodsRegMsg("공급업체 코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setSupplyCompCd(goodsMass.getSupplyCompCd().trim());
+
+		// 상품코드 중복여부 확인 - 입점업체코드+입점상품코드
+		Goods goodsDup = goodsDao.getGoods(goods);
+		if (goodsDup != null) {
+			goods.setGoodsRegMsg("상품코드 중복등록요청");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		// 브랜드
+		if (StringUtils.isBlank(goodsMass.getBrandCd().trim())) {
+			goods.setGoodsRegMsg("브랜드코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setBrandCd(goodsMass.getBrandCd().trim()); // 브랜드 코드
+
+
+		// 상품명
+		if (StringUtils.isBlank(goodsMass.getGoodsNm().trim())) {
+			goods.setGoodsRegMsg("상품명 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setGoodsNm(goodsMass.getGoodsNm().trim().replaceAll("(\\r\\n|\\r|\\n|\\n\\r)", ""));
+
+		if (!StringUtils.isBlank(goodsMass.getGoodsTnm())) {
+			goods.setGoodsTnm(goodsMass.getGoodsTnm().trim().replaceAll("(\\r\\n|\\r|\\n|\\n\\r)", "")); // 상품 타이틀
+		}
+		if (!StringUtils.isBlank(goodsMass.getGoodsSnm1())) {
+			goods.setGoodsSnm1(goodsMass.getGoodsSnm1().trim().replaceAll("(\\r\\n|\\r|\\n|\\n\\r|\\s)", "")); // 상품 사용자 검색어
+		}
+
+		// 품목코드
+		if (StringUtils.isBlank(goodsMass.getItemkindCd().trim())) {
+			goods.setGoodsRegMsg("품목코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setItemkindCd(goodsMass.getItemkindCd().trim());
+
+		Itemkind itemkind = new Itemkind();
+		itemkind.setItemkindCd(goods.getItemkindCd());
+		itemkind.setUseYn("Y");
+		Collection<Itemkind> getItemkindList = goodsDao.getItemkindList(itemkind);
+		if (getItemkindList == null || getItemkindList.size() == 0) {
+			goods.setGoodsRegMsg("품목코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setItemkindNm(getItemkindList.iterator().next().getItemkindLeafNm());	//LEAF품목명
+
+		// 스타일 년도
+		if (StringUtils.isBlank(goodsMass.getStyleYear().trim()) || goodsMass.getStyleYear().trim().length() != 4 || !goodsMass.getStyleYear().trim().matches(NUMBER_PATTERN)) {
+			goods.setGoodsRegMsg("스타일 년도 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setStyleYear(goodsMass.getStyleYear().trim());
+
+		// 시즌
+		if (StringUtils.isBlank(goodsMass.getSeasonCd().trim())) {
+			goods.setGoodsRegMsg("시즌 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setSeasonCd(goodsMass.getSeasonCd().trim()); // 시즌
+
+		CommonCode commonCode = new CommonCode();
+		commonCode.setUseYn("Y");
+		commonCode.setCdGb("G006"); // 시즌
+		commonCode.setCd(goods.getSeasonCd());
+		Collection<CommonCode> styleYearList = rendererService.getCommonCodeList(commonCode);
+		if (styleYearList == null || styleYearList.isEmpty()) {
+			goods.setGoodsRegMsg("시즌 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		// 성별
+		if (StringUtils.isBlank(goodsMass.getSexGb().trim())) {
+			goods.setGoodsRegMsg("성별 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setSexGb(goodsMass.getSexGb().trim()); // 성별
+		commonCode.setCdGb("G007"); // 성별
+		commonCode.setCd(goods.getSexGb());
+		Collection<CommonCode> sexGbList = rendererService.getCommonCodeList(commonCode);
+		if (sexGbList == null || sexGbList.isEmpty()) {
+			goods.setGoodsRegMsg("성별 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		// 정상가
+		if (StringUtils.isBlank(goodsMass.getListPrice().trim())) {
+			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.isBlank(goodsMass.getCurrPrice().trim())) {
+			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);
+		// 원가
+		goods.setCostPrice(0);
+
+		// 상품구분
+		if (StringUtils.isBlank(goodsMass.getGoodsGb().trim())) {
+			goods.setGoodsRegMsg("상품구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setGoodsGb(goodsMass.getGoodsGb().trim());
+		commonCode.setCdGb("G073"); 	//상품구분
+		commonCode.setCd(goods.getGoodsGb());
+		Collection<CommonCode> goodsGbList = rendererService.getCommonCodeList(commonCode);
+		if (goodsGbList == null || goodsGbList.isEmpty()) {
+			goods.setGoodsRegMsg("상품구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		// 정상이월
+		if (StringUtils.isBlank(goodsMass.getFormalGb().trim())) {
+			goods.setGoodsRegMsg("정상이월 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setFormalGb(goodsMass.getFormalGb().trim());
+		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;
+		}
+
+		// 브랜드 확인
+		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 = 0f;
+		float pntMrate = 0f;
+		float sellFeeRate = 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.isBlank(goodsMass.getOriginCd().trim())) {
+			goods.setGoodsRegMsg("원산지 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setOriginCd(goodsMass.getOriginCd().trim());
+
+		commonCode.setCdGb("G076"); // 원산지
+		commonCode.setCd(goods.getOriginCd());
+		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.isBlank(goodsMass.getTaxGb().trim())) {
+			goods.setGoodsRegMsg("과세구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setTaxGb(goodsMass.getTaxGb().trim());
+		if (!"10".equals(goods.getTaxGb()) && !"20".equals(goods.getTaxGb())) {
+			goods.setGoodsRegMsg("과세구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		//상품연령
+		if (!StringUtils.isBlank(goodsMass.getAgeGrpCd().trim())) {
+			goods.setAgeGrpCd(goodsMass.getAgeGrpCd().trim());
+
+			commonCode.setCdGb("G023"); // 상품연령
+			commonCode.setCd(goods.getAgeGrpCd());
+			Collection<CommonCode> ageGrpCdList = rendererService.getCommonCodeList(commonCode);
+			if (ageGrpCdList == null || ageGrpCdList.isEmpty()) {
+				goods.setGoodsRegMsg("상품연령 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+
+		//성인용품여부
+		if (StringUtils.isBlank(goodsMass.getAdultYn().trim())) {
+			goods.setGoodsRegMsg("성인용품여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setAdultYn(goodsMass.getAdultYn().trim());
+		if (!"Y".equals(goods.getAdultYn()) && !"N".equals(goods.getAdultYn())) {
+			goods.setGoodsRegMsg("성인용품여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		// 제조년월
+		if (StringUtils.isBlank(goodsMass.getMakeYmd().trim())) {
+			goods.setGoodsRegMsg("제조년월일 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setMakeYmd(goodsMass.getMakeYmd().trim());
+
+		SimpleDateFormat dateFormatParser = new SimpleDateFormat("yyyyMMdd");
+		dateFormatParser.setLenient(false);
+		try {
+			dateFormatParser.parse(goods.getMakeYmd());
+		} catch (Exception e) {
+			goods.setGoodsRegMsg("제조년월일 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		goods.setGoodsType("G056_N"); //상품타입
+		goods.setDistributionGb("G065_20"); //유통구분
+		goods.setSelfGoodsYn("N"); // 자사상품여부
+		goods.setSelfMallYn("Y"); //자사몰 노출여부
+		goods.setErpStockLinkYn("N"); // ERP재고연동여부
+
+		return goods;
+	}
+
+
+	/**
+	 * 상품 코드 생성
+	 *
+	 * @param goodsType - 상품타입
+	 * @param goodsCdAfter - 상품시퀀스 앞에 붙는명
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	public String getGoodsCodeSeq(String goodsType, String goodsCdAfter) {
+
+		//상품코드 12자리
+		String goodsCd = "";
+		Goods goods = new Goods();
+		goodsDao.createGoodsSequence(goods);
+		String goodsSeq = GagaStringUtil.getLPadding(Integer.toString(goods.getGoodsSq()), 8, "0");
+		if ("S".equals(goodsType) || "D".equals(goodsType)) {
+			goodsCd = SELF_GOOODS_AFTER + goodsCdAfter + goodsSeq;
+
+		} else {
+			goodsCd = goodsCdAfter + goodsSeq; // 입점 : 브랜드코드
+		}
+		return goodsCd;
+	}
+
+	/**
+	 * 상품등록 - 상품재고정보 (입점)
+	 *
+	 * @param goods
+	 * @param excelMap
+	 * @return Goods
+	 * @author eskim
+	 * @since 2021. 01. 19
+	 */
+	private void createGoodsSize(Goods goods, Collection<Option> stockist) {
+
+		for (Option stock : stockist) {
+			goodsDao.saveStock(stock);
+		}
+	}
+
+	/**
+	 * 상품대량수정 엑셀 저장
+	 *
+	 * @param ecxelGoodsList, procJob(updateGoods)
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 20
+	 */
+	@Transactional("shopTxnManager")
+	public String updateMassExceluploadGoods(GagaMap gagaMap, String procJob) {
+
+		// 사용자의 관리 브랜드 조회
+		Collection<CommonCode> mdBrandList = rendererService.getAuthBrandList(TssSession.getInfo().getUserNo());
+
+		GoodsMass goodsMass = mapper.convertValue(gagaMap, GoodsMass.class);
+
+		if (StringUtils.isBlank(goodsMass.getGoodsCd().trim())) {
+			throw new IllegalStateException("상품코드가 없습니다.");
+		}
+
+		// 상품기본정보
+		Goods goodsData = new Goods();
+		goodsData.setGoodsCd(goodsMass.getGoodsCd().trim());
+		Goods goodsOrigin = goodsDao.getGoods(goodsData);
+		if (goodsOrigin == null) {
+			goodsData.setGoodsRegMsg("미등록 상품코드");
+			goodsData.setGoodsStat("10");
+			this.setGoodsRegResult(goodsData, goodsMass, procJob);
+			return goodsData.getGoodsStat();
+		}
+		Goods goods = this.updateMassGoodsInfo(goodsMass, procJob, mdBrandList, goodsOrigin);
+
+		if ("10".equals(goods.getGoodsStat())) { // 정보 오류
+			this.setGoodsRegResult(goods, goodsMass, procJob);
+			return goods.getGoodsStat();
+		}
+
+		// 상품 고시
+		goods = this.getUpdateMassGoodsNotiCheck(goods, gagaMap, goodsOrigin);
+		if ("10".equals(goods.getGoodsStat())) { // 정보 오류
+			this.setGoodsRegResult(goods, goodsMass, procJob);
+			return goods.getGoodsStat();
+		}
+
+		// 상품상세 수정
+
+		//log.info("[updateMassExceluploadGoods] goods={}", goods);
+		if ("N".equals(goods.getChDataYn()) && "N".equals(goods.getChkDescKeep()) && "N".equals(goods.getChNotiYn())) {
+			goods.setGoodsRegMsg("변경정보 없음");
+			goods.setGoodsStat("10");
+			this.setGoodsRegResult(goods, goodsMass, procJob);
+			return goods.getGoodsStat();
+		}
+
+		//상품 기본정부 변경여부 와 촬영업체가 아닌경우
+		if ("Y".equals(goods.getChDataYn()) && !"G001_E000".equals(TssSession.getInfo().getRoleCd())) {
+
+			goodsDao.createGoodsHst(goods); // 이력생성
+			goodsDao.updateGoodsMass(goods); // 상품기본 저장
+
+			if (!StringUtils.isBlank(goods.getGoodsSnm1()) && !UPDATE_NO_PATTERN.equals(goods.getGoodsSnm1())) {
+				// 사용자 검색어를 검색어에 적용
+				String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
+
+				String[] arrGoodsSnm = goods.getGoodsSnm1().split(";");
+				StringBuilder tempGoodsSnm = new StringBuilder();
+				for (String loopGoodsSnm : arrGoodsSnm) {
+					if (goodsSnm.toUpperCase().indexOf(loopGoodsSnm.toUpperCase()) <= -1) {
+						tempGoodsSnm.append(loopGoodsSnm).append(";");
+					}
+				}
+				goods.setGoodsSnm(tempGoodsSnm.toString() + goodsSnm);
+				goodsDao.updateGoodsSnm(goods);
+			}
+		}
+
+		if ("Y".equals(goods.getChNotiYn())) {
+			this.updateGoodsNoti(goods, gagaMap, goodsOrigin); // 상품고시정보 저장
+		}
+
+		// 품목변경시 카테고리 자동 전시
+		if (!UPDATE_NO_PATTERN.equals(goods.getItemkindCd())) {
+			GoodsCategory goodsCategory = new GoodsCategory();
+			goodsCategory.setRegNo(TssSession.getInfo().getUserNo());
+			goodsCategory.setUpdNo(TssSession.getInfo().getUserNo());
+			goodsCategory.setGoodsCd(goods.getGoodsCd());
+			// displayService.deleteGoodsCategory(goodsCategory);
+			// goodsDao.createGoodsCategory(goods);
+			this.saveGoodsCategory(goods);
+		}
+
+		this.setGoodsRegResult(goods, goodsMass, procJob);
+
+		return goods.getGoodsStat();
+	}
+
+	/**
+	 * 상품대량수정 - 상품기본정보
+	 *
+	 * @param goodsMass
+	 * @param excelFilename
+	 * @author eskim
+	 * @since 2021. 1. 20
+	 */
+	private Goods updateMassGoodsInfo(GoodsMass goodsMass, String procJob, Collection<CommonCode> mdBrandList, Goods goodsOrigin) {
+
+		Goods goods = new Goods();
+		goods.setChDataYn("N"); // 데이터 변경여부
+		goods.setGoodsRegMsg("상품정보 변경");
+		goods.setRegNo(TssSession.getInfo().getUserNo());
+		goods.setUpdNo(TssSession.getInfo().getUserNo());
+
+		goods.setGoodsCd(goodsMass.getGoodsCd().toUpperCase().trim()); // 상품코드
+
+		//촬영업체 skip(상품정보 수정할수 없음)
+		if ("G001_E000".equals(TssSession.getInfo().getRoleCd())) {
+			return goods;
+		}
+
+		// 입점담당자 해당 브랜드 체크
+		if ("G001_B000".equals(TssSession.getInfo().getRoleCd())) {
+			// 해당MD 조회
+			if (mdBrandList == null || mdBrandList.isEmpty()) {
+				goods.setGoodsRegMsg("미관리 브랜드");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			boolean mdBrandFlag = false;
+			for (CommonCode commonCode : mdBrandList) {
+				if (goodsOrigin.getBrandCd().equals(commonCode.getCd())) {
+					mdBrandFlag = true;
+				}
+			}
+			if (!mdBrandFlag) {
+				goods.setGoodsRegMsg("미관리 브랜드");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+
+		if (StringUtils.isBlank(goodsMass.getGoodsNm().trim())) {
+			goods.setGoodsRegMsg("상품명 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setGoodsNm(goodsMass.getGoodsNm().trim()); // 상품명
+		if (!UPDATE_NO_PATTERN.equals(goods.getGoodsNm())) {
+			goods.setGoodsNm(goods.getGoodsNm().replaceAll("(\\r\\n|\\r|\\n|\\n\\r)", "")); // 상품명
+			goods.setChDataYn("Y");
+		}
+		goods.setGoodsTnm(goodsMass.getGoodsTnm().trim()); // 상품 타이틀
+		if (!UPDATE_NO_PATTERN.equals(goods.getGoodsTnm())) {
+			goods.setChDataYn("Y");
+			if (!StringUtils.isBlank(goods.getGoodsTnm())) {
+				goods.setGoodsTnm(goods.getGoodsTnm().replaceAll("(\\r\\n|\\r|\\n|\\n\\r)", "")); // 상품 타이틀
+			}
+		}
+		goods.setGoodsSnm1(goodsMass.getGoodsSnm1().trim()); // 상품 사용자 검색어
+		if (!UPDATE_NO_PATTERN.equals(goods.getGoodsSnm1())) {
+			goods.setChDataYn("Y");
+			if (!StringUtils.isBlank(goods.getGoodsSnm1())) {
+				goods.setGoodsSnm1(goods.getGoodsSnm1().replaceAll("(\\r\\n|\\r|\\n|\\n\\r|\\s)", "")); // 상품 사용자 검색어
+			}
+		}
+		// 품목확인
+		if (StringUtils.isBlank(goodsMass.getItemkindCd().trim())) {
+			goods.setGoodsRegMsg("품목코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setItemkindCd(goodsMass.getItemkindCd().trim()); // 품목
+
+		if (!UPDATE_NO_PATTERN.equals(goods.getItemkindCd())) {
+			Itemkind itemkind = new Itemkind();
+			itemkind.setItemkindCd(goods.getItemkindCd());
+			itemkind.setUseYn("Y");
+			Collection<Itemkind> itemkindList = goodsDao.getItemkindList(itemkind);
+			if (itemkindList == null || itemkindList.isEmpty()) {
+				goods.setGoodsRegMsg("품목 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+		// 스타일년도 확인
+		if (StringUtils.isBlank(goodsMass.getStyleYear().trim()) || goodsMass.getStyleYear().trim().length() != 4 || !goodsMass.getStyleYear().trim().matches(NUMBER_PATTERN)) {
+			goods.setGoodsRegMsg("스타일 년도 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setStyleYear(goodsMass.getStyleYear().trim());
+
+		if (!UPDATE_NO_PATTERN.equals(goods.getStyleYear())) {
+			goods.setChDataYn("Y");
+		}
+
+		CommonCode commonCode = new CommonCode();
+		commonCode.setUseYn("Y");
+		// 시즌코드
+		if (StringUtils.isBlank(goodsMass.getSeasonCd().trim())) {
+			goods.setGoodsRegMsg("시즌코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setSeasonCd(goodsMass.getSeasonCd().trim());
+		if (!UPDATE_NO_PATTERN.equals(goods.getSeasonCd())) {
+			commonCode.setCdGb("G006"); // 시즌
+			commonCode.setCd(goods.getSeasonCd());
+			Collection<CommonCode> seassonList = rendererService.getCommonCodeList(commonCode);
+			if (seassonList == null || seassonList.isEmpty()) {
+				goods.setGoodsRegMsg("시즌 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+		// 성별
+		if (StringUtils.isBlank(goodsMass.getSexGb().trim())) {
+			goods.setGoodsRegMsg("성별코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setSexGb(goodsMass.getSexGb().trim());
+		// 성별
+		if (!UPDATE_NO_PATTERN.equals(goods.getSexGb())) {
+			commonCode.setCdGb("G007"); // 성별
+			commonCode.setCd(goods.getSexGb());
+			Collection<CommonCode> genderList = rendererService.getCommonCodeList(commonCode);
+			if (genderList == null || genderList.isEmpty()) {
+				goods.setGoodsRegMsg("성별 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+		//판매가
+		if (StringUtils.isBlank(goodsMass.getCurrPrice().trim())) {
+			goods.setGoodsRegMsg("판매가 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice().trim())) {
+			goods.setCurrPrice(0);
+		} else {
+
+			if (!GagaStringUtil.replace(goodsMass.getCurrPrice().trim(), ",", "").matches(NUMBER_PATTERN)) {
+				goods.setGoodsRegMsg("판매가 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			if (Integer.parseInt(goodsMass.getCurrPrice().trim()) == 0) {
+				goods.setGoodsRegMsg("판매가 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+		//판매수수료율
+		if (StringUtils.isBlank(goodsMass.getSellFeeRate().trim())) {
+			goods.setGoodsRegMsg("판매수수료율 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (UPDATE_NO_PATTERN.equals(goodsMass.getSellFeeRate().trim())) {
+			goods.setSellFeeRate(0);
+		} else {
+
+			if (!GagaStringUtil.replace(goodsMass.getSellFeeRate().trim(), ".", "").matches(NUMBER_PATTERN)) {
+				goods.setGoodsRegMsg("판매수수료율 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			if (Integer.parseInt(goodsMass.getSellFeeRate().trim()) == 0) {
+				goods.setGoodsRegMsg("판매수수료율 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+
+		//판매가나 판매수수료율이 변경되었을 때
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice().trim()) || !UPDATE_NO_PATTERN.equals(goodsMass.getSellFeeRate().trim())) {
+			//자사
+			if ("Y".equals(goodsOrigin.getSelfGoodsYn())) {
+				//판매가 변경시
+				if (!UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice().trim())) {
+					goods.setCurrPrice(Integer.parseInt(GagaStringUtil.replace(goodsMass.getCurrPrice().trim(), ",", ""))); // 판매가
+					goods.setCurrBprice(goodsOrigin.getCurrPrice());
+					goods.setDcRate((int)(this.getDcRate(goodsOrigin.getListPrice(), goods.getCurrPrice())));
+					goods.setChDataYn("Y");
+				}
+				//판매수수료율 변경시
+				if (!UPDATE_NO_PATTERN.equals(goodsMass.getSellFeeRate().trim())) {
+					goods.setSellFeeRate(Integer.parseInt(GagaStringUtil.replace(goodsMass.getCurrPrice().trim(), ",", ""))); // 판매수수료율
+					goods.setChDataYn("Y");
+				}
+			}else {
+			//입점
+				GoodsPriceRes goodsPriceRes = new GoodsPriceRes();
+				goodsPriceRes.setGoodsCd(goods.getGoodsCd());
+				if (goods.getCurrPrice() != goodsOrigin.getCurrPrice()) {
+					goodsPriceRes.setResGoodsPrice(goods.getCurrPrice());
+					goodsPriceRes.setEndGoodsPrice(goods.getCurrPrice());
+				}
+				if (goods.getSellFeeRate() != goodsOrigin.getSellFeeRate()) {
+					goodsPriceRes.setSellFeeRate(goods.getSellFeeRate());
+				}
+				goodsPriceRes.setApplyStdt(GagaDateUtil.getTodayDateTime());	//yyyymmddhhmiss
+				int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) + 4;
+				goodsPriceRes.setApplyEddt(toYear + "1231235959");	//yyyymmddhhmiss
+				goodsPriceRes.setCfrmYn("N");
+				goodsPriceRes.setApplyYn("N");
+				goodsPriceRes.setRegNo(goods.getRegNo());
+				goodsPriceRes.setUpdNo(goods.getUpdNo());
+				goodsDao.createGoodPriceRes(goodsPriceRes);
+
+				// 상품테이블에 바로 변경하지 않고 입점상품가격관리에서 승인해야함
+				goods.setCurrPrice(goodsOrigin.getCurrPrice());
+				goods.setSellFeeRate(goodsOrigin.getSellFeeRate());
+			}
+		}
+
+		// 상품구분
+		if (StringUtils.isBlank(goodsMass.getGoodsGb().trim())) {
+			goods.setGoodsRegMsg("상품구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setSexGb(goodsMass.getGoodsGb().trim());
+		// 상품구분
+		if (!UPDATE_NO_PATTERN.equals(goods.getGoodsGb())) {
+			commonCode.setCdGb("G073"); // 상품구분
+			commonCode.setCd(goods.getGoodsGb());
+			Collection<CommonCode> goodsGbList = rendererService.getCommonCodeList(commonCode);
+			if (goodsGbList == null || goodsGbList.isEmpty()) {
+				goods.setGoodsRegMsg("상품구분 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//정상이월구분
+		if (StringUtils.isBlank(goodsMass.getFormalGb().trim())) {
+			goods.setGoodsRegMsg("정상이월구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setFormalGb(goodsMass.getFormalGb().trim()); // 정상이월
+		if (!UPDATE_NO_PATTERN.equals(goods.getFormalGb())
+			&& !"G009_10".equals(goods.getFormalGb())
+			&& !"G009_20".equals(goods.getFormalGb())) {
+			goods.setGoodsRegMsg("정상이월구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		if (!UPDATE_NO_PATTERN.equals(goods.getFormalGb())) {
+			goods.setPntPrate(goodsOrigin.getPntPrate()); // 포인트적립율(PC)
+			goods.setPntMrate(goodsOrigin.getPntMrate()); // 포인트적립율(MOBILE)
+			Brand brand = new Brand();
+			brand.setBrandCd(goodsOrigin.getBrandCd());
+			Collection<Brand> brandList = businessService.getBrandList(brand);
+			if (brandList != null && !brandList.isEmpty()) {
+				// 브랜드 확인
+				float pntPrate = 0f;
+				float pntMrate = 0f;
+				for (Brand tmpBrand : brandList) {
+					if ("G009_10".equals(goods.getFormalGb())) {
+						pntPrate = tmpBrand.getPntPrate10();
+						pntMrate = tmpBrand.getPntMrate10();
+					} else {
+						pntPrate = tmpBrand.getPntPrate20();
+						pntMrate = tmpBrand.getPntMrate20();
+					}
+				}
+				goods.setPntPrate(pntPrate); // 포인트적립율(PC)
+				goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//최소주문수량
+		if (UPDATE_NO_PATTERN.equals(goodsMass.getMinOrdQty().trim())) {
+			goods.setMinOrdQty(0);
+		} else {
+			if (!goodsMass.getMinOrdQty().trim().matches(NUMBER_PATTERN) || Integer.parseInt(goodsMass.getMinOrdQty().trim()) == 0) {
+				goods.setGoodsRegMsg("최소주문수량 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setMinOrdQty(Integer.parseInt(goodsMass.getMinOrdQty().trim()));
+			goods.setChDataYn("Y");
+		}
+		//최대주문수량
+		if (UPDATE_NO_PATTERN.equals(goodsMass.getMaxOrdQty().trim())) {
+			goods.setMaxOrdQty(0);
+		} else {
+			if (!goodsMass.getMaxOrdQty().trim().matches(NUMBER_PATTERN) || Integer.parseInt(goodsMass.getMaxOrdQty().trim()) == 0) {
+				goods.setGoodsRegMsg("최대주문수량 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setMaxOrdQty(Integer.parseInt(goodsMass.getMaxOrdQty().trim()));
+			goods.setChDataYn("Y");
+		}
+		//ID당1일최대주문수량
+		if (UPDATE_NO_PATTERN.equals(goodsMass.getDayMaxOrdQty().trim())) {
+			goods.setMaxOrdQty(0);
+		} else {
+			if (!goodsMass.getDayMaxOrdQty().trim().matches(NUMBER_PATTERN) || Integer.parseInt(goodsMass.getDayMaxOrdQty().trim()) == 0) {
+				goods.setGoodsRegMsg("ID당1일최대주문수량 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setDayMaxOrdQty(Integer.parseInt(goodsMass.getDayMaxOrdQty().trim()));
+			goods.setChDataYn("Y");
+		}
+
+		if(goods.getMinOrdQty() > goods.getMaxOrdQty()){
+			goods.setGoodsRegMsg("최소주문수량 오류(최대주문수량보다 클 수 없음)");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		if(goods.getMaxOrdQty() > goods.getDayMaxOrdQty()){
+			goods.setGoodsRegMsg("최대주문수량 오류(ID당1일최대구매수량보다 클 수 없음)");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		//선물주문가능여부
+		if (StringUtils.isBlank(goodsMass.getGiftPackYn().trim())) {
+			goods.setGoodsRegMsg("선물주문가능여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if ("Y".equals(goodsOrigin.getSelfGoodsYn())) {
+			if (!UPDATE_NO_PATTERN.equals(goodsMass.getGiftPackYn().trim())) {
+				goods.setGiftPackYn(goodsMass.getGiftPackYn().trim());
+				if (!"Y".equals(goods.getGiftPackYn()) && !"N".equals(goods.getGiftPackYn())) {
+					goods.setGoodsRegMsg("선물주문가능여부 오류");
+					goods.setGoodsStat("10");
+					return goods;
+				}
+				goods.setChDataYn("Y");
+			}
+		}else {
+			goods.setGiftPackYn(goodsOrigin.getGiftPackYn());
+		}
+
+		//신규가입구매가능여부
+		if (StringUtils.isBlank(goodsMass.getNewCustOrdYn().trim())) {
+			goods.setGoodsRegMsg("신규가입구매가능여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if ("Y".equals(goodsOrigin.getSelfGoodsYn())) {
+			if (!UPDATE_NO_PATTERN.equals(goodsMass.getNewCustOrdYn().trim())) {
+				goods.setNewCustOrdYn(goodsMass.getNewCustOrdYn().trim());
+				if (!"Y".equals(goods.getNewCustOrdYn()) && !"N".equals(goods.getNewCustOrdYn())) {
+					goods.setGoodsRegMsg("신규가입구매가능여부 오류");
+					goods.setGoodsStat("10");
+					return goods;
+				}
+				goods.setChDataYn("Y");
+			}
+		}else {
+			goods.setNewCustOrdYn(goodsOrigin.getNewCustOrdYn());
+		}
+
+		//반품여부
+		if (StringUtils.isBlank(goodsMass.getReturnableYn().trim())) {
+			goods.setGoodsRegMsg("반품여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setReturnableYn(goodsMass.getReturnableYn().trim());
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getReturnableYn().trim())) {
+			if (!"Y".equals(goods.getReturnableYn()) && !"N".equals(goods.getReturnableYn())) {
+				goods.setGoodsRegMsg("반품여부 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//교환여부
+		if (StringUtils.isBlank(goodsMass.getChangeableYn().trim())) {
+			goods.setGoodsRegMsg("교환여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setChangeableYn(goodsMass.getChangeableYn().trim());
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getChangeableYn().trim())) {
+			if (!"Y".equals(goods.getChangeableYn()) && !"N".equals(goods.getChangeableYn())) {
+				goods.setGoodsRegMsg("교환여부 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//과세구분
+		if (StringUtils.isBlank(goodsMass.getTaxGb().trim())) {
+			goods.setGoodsRegMsg("과세구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setTaxGb(goodsMass.getTaxGb().trim());
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getTaxGb().trim())) {
+			if (!"Y".equals(goods.getTaxGb()) && !"N".equals(goods.getTaxGb())) {
+				goods.setGoodsRegMsg("과세구분 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//상품연령
+		if (StringUtils.isBlank(goodsMass.getAgeGrpCd().trim())) {
+			goods.setGoodsRegMsg("상품연령 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setAgeGrpCd(goodsMass.getAgeGrpCd().trim());
+		if (!UPDATE_NO_PATTERN.equals(goods.getAgeGrpCd())) {
+			commonCode.setCdGb("G023");
+			commonCode.setCd(goods.getAgeGrpCd());
+			Collection<CommonCode> ageGrpCdList = rendererService.getCommonCodeList(commonCode);
+			if (ageGrpCdList == null || ageGrpCdList.isEmpty()) {
+				goods.setGoodsRegMsg("상품연령 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//성인용품여부
+		if (StringUtils.isBlank(goodsMass.getAdultYn().trim())) {
+			goods.setGoodsRegMsg("성인용품여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setAdultYn(goodsMass.getAdultYn().trim());
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getAdultYn().trim())) {
+			if (!"Y".equals(goods.getAdultYn()) && !"N".equals(goods.getAdultYn())) {
+				goods.setGoodsRegMsg("성인용품여부 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		if (StringUtils.isEmpty(goodsMass.getPntPrate())) {
+			goods.setGoodsRegMsg("PC포인트율 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getPntPrate())) {
+			try {
+				int pntPrate = Integer.parseInt(goodsMass.getPntPrate());
+				goods.setPntPrate(pntPrate);
+			} catch (Exception e) {
+				goods.setGoodsRegMsg("PC포인트율 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		if (StringUtils.isEmpty(goodsMass.getPrePpntUsableYn())) {
+			goods.setGoodsRegMsg("PC선포인트 사용여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getPrePpntUsableYn())) {
+			if ("Y".equals(goodsMass.getPrePpntUsableYn()) || "N".equals(goodsMass.getPrePpntUsableYn())) {
+				goods.setPrePpntUsableYn(goodsMass.getPrePpntUsableYn());
+				goods.setChDataYn("Y");
+			} else {
+				goods.setGoodsRegMsg("PC선포인트 사용여부 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+
+		if (StringUtils.isEmpty(goodsMass.getPntMrate())) {
+			goods.setGoodsRegMsg("모바일포인트율 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getPntMrate())) {
+			try {
+				int pntMrate = Integer.parseInt(goodsMass.getPntMrate());
+				goods.setPntMrate(pntMrate);
+			} catch (Exception e) {
+				goods.setGoodsRegMsg("모바일포인트율 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		if (StringUtils.isEmpty(goodsMass.getPreMpntUsableYn())) {
+			goods.setGoodsRegMsg("모바일선포인트 사용여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getPreMpntUsableYn())) {
+			if ("Y".equals(goodsMass.getPreMpntUsableYn()) || "N".equals(goodsMass.getPreMpntUsableYn())) {
+				goods.setPreMpntUsableYn(goodsMass.getPreMpntUsableYn());
+				goods.setChDataYn("Y");
+			} else {
+				goods.setGoodsRegMsg("모바일선포인트 사용여부 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+
+		return goods;
+	}
+
+	/**
+	 * 상품대량수정 - 상품고시정보 check
+	 *
+	 * @param goods
+	 * @param excelMap
+	 * @param goodsOrigin
+	 * @return Goods
+	 * @author eskim
+	 * @since 2021. 01. 20
+	 */
+	private Goods getUpdateMassGoodsNotiCheck(Goods goods, GagaMap excelMap, Goods goodsOrigin) {
+
+		String oldItemKindCd = goodsOrigin.getItemkindCd();
+		String itemkindCd = goods.getItemkindCd();
+		if (UPDATE_NO_PATTERN.equals(goods.getItemkindCd())) {
+			itemkindCd = oldItemKindCd;
+		}
+		// old 품목고시분류 조회
+		String oldNiClsfCd = "";
+		Goods goodsNoti = new Goods();
+		goodsNoti.setGoodsCd(goods.getGoodsCd());
+		goodsNoti.setSupplyCompCd(goodsOrigin.getSupplyCompCd());
+		goodsNoti.setItemkindCd(oldItemKindCd);
+		Collection<GoodsNotiInfo> oldGoodsNotiList = goodsDao.getItemkindNotiInfoList(goodsNoti);
+		if (oldGoodsNotiList != null && oldGoodsNotiList.isEmpty()) {
+			for (GoodsNotiInfo oldGoodsNotiInfo : oldGoodsNotiList) {
+				oldNiClsfCd = oldGoodsNotiInfo.getNiClsfCd();
+				break;
+			}
+		}
+		// 품목코드가 변경되었을 경우
+		if (!oldItemKindCd.equals(itemkindCd)) {
+			goods.setChNotiYn("Y");
+
+			// new 품목고시분류 조회
+			String newNiClsfCd = "";
+			goodsNoti.setItemkindCd(itemkindCd);
+			Collection<GoodsNotiInfo> newGoodsNotiList = goodsDao.getItemkindNotiInfoList(goodsNoti);
+			if (newGoodsNotiList == null || newGoodsNotiList.isEmpty()) {
+				goods.setGoodsRegMsg("품목의 고시정보 없음");
+				goods.setGoodsStat("10");
+				return goods;
+			} else {
+				for (GoodsNotiInfo newGoodsNotiInfo : newGoodsNotiList) {
+					newNiClsfCd = newGoodsNotiInfo.getNiClsfCd();
+					break;
+				}
+			}
+
+			if (!oldNiClsfCd.equals(newNiClsfCd) && !UPDATE_NO_PATTERN.equals(excelMap.getString("niClsfCd"))) {
+				goods.setGoodsRegMsg("고시분류 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+
+			// 상품고시정보
+			Collection<GoodsNotiInfo> goodsNotiList = goodsDao.getItemkindNotiInfoList(goodsNoti);
+			if (goodsNotiList == null || goodsNotiList.isEmpty()) {
+				goods.setGoodsRegMsg("품목의 고시정보 없음");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		} else {
+			if (!UPDATE_NO_PATTERN.equals(excelMap.getString("niClsfCd"))
+				&& !oldNiClsfCd.equals(excelMap.getString("niClsfCd"))) {
+				goods.setGoodsRegMsg("고시분류 오류..");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+
+		for (int i = 0; i < 28; i++) {
+			String niContentVal = excelMap.getString("niContent" + (i + 1));
+			if (!UPDATE_NO_PATTERN.equals(niContentVal)) {
+				goods.setChNotiYn("Y");
+			}
+		}
+
+		return goods;
+	}
+
+	/**
+	 * 상품대량수정 - 상품고시정보
+	 *
+	 * @param goods
+	 * @param excelMap
+	 * @return Goods
+	 * @author eskim
+	 * @since 2021. 01. 20
+	 */
+	private void updateGoodsNoti(Goods goods, GagaMap excelMap, Goods goodsOrigin) {
+
+		String oldItemKindCd = goodsOrigin.getItemkindCd();
+		String itemkindCd = goods.getItemkindCd();
+		int index = 0;
+
+		if (UPDATE_NO_PATTERN.equals(goods.getItemkindCd())) {
+			itemkindCd = oldItemKindCd;
+		}
+
+		Collection<GoodsNotiInfo> newGoodsNotiList = new ArrayList<>();
+		// new 품목고시분류 조회
+		Goods goodsNoti = new Goods();
+		goodsNoti.setGoodsCd(goods.getGoodsCd());
+		goodsNoti.setSupplyCompCd(goodsOrigin.getSupplyCompCd());
+		// 품목코드가 변경되었을 경우
+		if (!oldItemKindCd.equals(itemkindCd)) {
+			goodsNoti.setItemkindCd(itemkindCd);
+			newGoodsNotiList = goodsDao.getItemkindNotiInfoList(goodsNoti);
+		} else {
+			// 원래 상품의 고시정보
+
+			GoodsNotiInfo goodsNotiInfo = new GoodsNotiInfo();
+			goodsNotiInfo.setGoodsCd(goods.getGoodsCd());
+			goodsNotiInfo.setSupplyVendorCd(goodsOrigin.getSupplyCompCd());  //수정해야함
+			goodsNotiInfo.setNiClsfCd(goodsOrigin.getNiClsfCd());
+			newGoodsNotiList = goodsDao.getGoodsNotiInfoList(goodsNotiInfo);
+		}
+		if (newGoodsNotiList != null && !newGoodsNotiList.isEmpty()) {
+
+			index = 0;
+			for (GoodsNotiInfo goodsNotiInfo : newGoodsNotiList) {
+
+				if (index == 0) {
+					goodsDao.deleteGoodsNotiInfo(goods);
+				}
+
+				if (StringUtils.isEmpty(excelMap.getString("niContent" + (index + 1)))
+					|| UPDATE_NO_PATTERN.equals(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
+	 * @author eskim
+	 * @since 2020. 4. 21.
+	 */
+	private void saveGoodsCategory(Goods goods) {
+
+//		GoodsCategory goodsCategory = new GoodsCategory();
+//		goodsCategory.setRegNo(TssSession.getInfo().getUserNo());
+//		goodsCategory.setUpdNo(TssSession.getInfo().getUserNo());
+//		goodsCategory.setGoodsCd(goods.getGoodsCd());
+//		displayService.deleteGoodsCategory(goodsCategory);
+//
+//		Collection<ItemkindCategory> itemkindCategoryList = displayService.getItemkindCategoryList(goods.getItemkindCd());
+//		for (ItemkindCategory itemkindCategory : itemkindCategoryList) {
+//			TsaCategory category = new TsaCategory();
+//			category.setCateGb(itemkindCategory.getCateGb());
+//			category.setCateCd(itemkindCategory.getCateCd());
+//			category = displayService.getCategory4srch(category);
+//
+//			GoodsCategory GoodsCategory = new GoodsCategory();
+//			GoodsCategory.setRegNo(TssSession.getInfo().getUserNo());
+//			GoodsCategory.setUpdNo(TssSession.getInfo().getUserNo());
+//			String[] goodsCdArr = {goods.getGoodsCd()};
+//			GoodsCategory.setGoodsCdArr(goodsCdArr);
+//			if (category.getCateGb() != null) {
+//				GoodsCategory.setNcateGb(String.valueOf(category.getCateGb()));
+//			}
+//			if (category.getCateType() != null) {
+//				GoodsCategory.setNcateType(String.valueOf(category.getCateType()));
+//			}
+//			if (category.getCateCd() != null) {
+//				GoodsCategory.setNcateCd(String.valueOf(category.getCateCd()));
+//			}
+//			if (category.getTcateCd() != null) {
+//				GoodsCategory.setNtcateCd(String.valueOf(category.getTcateCd()));
+//			}
+//			if (category.getMcateCd() != null) {
+//				GoodsCategory.setNmcateCd(String.valueOf(category.getMcateCd()));
+//			}
+//			if (category.getScateCd() != null) {
+//				GoodsCategory.setNscateCd(String.valueOf(category.getScateCd()));
+//			}
+//			if (category.getDcateCd() != null) {
+//				GoodsCategory.setNdcateCd(String.valueOf(category.getDcateCd()));
+//			}
+//			displayService.moveGoodsCategory(GoodsCategory);
+//		}
+	}
 }

+ 12 - 11
src/main/java/com/style24/scm/biz/service/TssRendererService.java

@@ -450,17 +450,6 @@ public class TssRendererService {
 		return rendererDao.getQnaAnswerPhaseList(ansClsf);
 	}
 
-//	/**
-//	 * 제휴링크 목록
-//	 * @param afChannel - 제휴채널
-//	 * @return
-//	 * @author gagamel
-//	 * @since 2020. 5. 4
-//	 */
-//	public Collection<CommonCode> getAflinkList(String afChannel) {
-//		return rendererDao.getAflinkList(afChannel);
-//	}
-
 	/**
 	 * 색상그룹코드 RGB 목록
 	 *
@@ -483,4 +472,16 @@ public class TssRendererService {
 	public Collection<CommonCode> getSupplyDeliveryFeePolicyList(String supplyCompCd) {
 		return rendererDao.getSupplyDeliveryFeePolicyList(supplyCompCd);
 	}
+
+	/**
+	 * 제휴채널 목록
+	 * @param afChannel - 상위제휴채널
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 20
+	 */
+	public Collection<CommonCode> getAflinkList(String afChannel) {
+		return rendererDao.getAflinkList(afChannel);
+	}
+
 }

+ 37 - 0
src/main/java/com/style24/scm/biz/service/TssSettleService.java

@@ -0,0 +1,37 @@
+package com.style24.scm.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.persistence.domain.AflinkFee;
+import com.style24.scm.biz.dao.TssSettleDao;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 정산 Service
+ *
+ * @author gagamel
+ * @since 2021. 1. 20
+ */
+@Service
+@Slf4j
+public class TssSettleService {
+
+	@Autowired
+	private TssSettleDao settleDao;
+
+	/**
+	 * 제휴채널정산 목록
+	 * @param afLinkFee - 제휴채널수수료 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 20
+	 */
+	public Collection<AflinkFee> getAfLinkFeeList(AflinkFee afLinkFee) {
+		return settleDao.getAfLinkFeeList(afLinkFee);
+	}
+
+}

+ 72 - 25
src/main/java/com/style24/scm/biz/web/TssGoodsController.java

@@ -6,13 +6,12 @@ import java.util.Collection;
 
 import javax.servlet.http.HttpServletRequest;
 
-import com.style24.persistence.TscPageRequest;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.core.io.InputStreamResource;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
-import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -25,6 +24,8 @@ import org.springframework.web.servlet.ModelAndView;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.TscPageRequest;
+import com.style24.persistence.domain.CommonCode;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsImg;
@@ -152,7 +153,7 @@ public class TssGoodsController extends TssBaseController {
 		}
 
 		// multi row 검색관련 처리
-		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
+		if (!StringUtils.isBlank(goodsSearch.getCondition())) {
 			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
 
 			if ("searchExtendGoodsCd".equals(goodsSearch.getSearch())) {
@@ -193,7 +194,7 @@ public class TssGoodsController extends TssBaseController {
 		goodsSearch.setRegNo(TssSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
 
 		// multi row 검색관련 처리
-		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
+		if (!StringUtils.isBlank(goodsSearch.getCondition())) {
 			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
 
 			if ("searchExtendGoodsCd".equals(goodsSearch.getSearch())) {
@@ -269,7 +270,6 @@ public class TssGoodsController extends TssBaseController {
 					//고시정보
 					GoodsNotiInfo goodsNotiInfo = new GoodsNotiInfo();
 					goodsNotiInfo.setGoodsCd(tmpGoods.getGoodsCd());
-					goodsNotiInfo.setSupplyCompCd(tmpGoods.getSupplyCompCd());
 					goodsNotiInfo.setNiClsfCd(tmpGoods.getNiClsfCd());
 					Collection<GoodsNotiInfo> goodsNotiInfoList = goodsService.getGoodsNotiInfoList(goodsNotiInfo);
 					if (goodsNotiInfoList == null || goodsNotiInfoList.isEmpty()) {
@@ -277,7 +277,7 @@ public class TssGoodsController extends TssBaseController {
 					} else {
 						for (GoodsNotiInfo tmpGoodsNotiInfo : goodsNotiInfoList) {
 							if ("Y".equals(tmpGoodsNotiInfo.getReqYn()) || "Y".equals(tmpGoodsNotiInfo.getDispYn())) {
-								if (StringUtils.isEmpty(tmpGoodsNotiInfo.getNiContent())) {
+								if (StringUtils.isBlank(tmpGoodsNotiInfo.getNiContent())) {
 									returnGoods += tmpGoods.getGoodsCd() + ",";
 									break;
 								}
@@ -497,7 +497,6 @@ public class TssGoodsController extends TssBaseController {
 		GoodsNotiInfo goodsInfo = new GoodsNotiInfo();
 		goodsInfo.setGoodsCd(goods.getGoodsCd());
 		goodsInfo.setNiClsfCd(goods.getNiClsfCd());
-		goodsInfo.setSupplyCompCd(goods.getSupplyCompCd());
 
 		return goodsService.getGoodsNotiInfoList(goodsInfo);
 	}
@@ -737,10 +736,6 @@ public class TssGoodsController extends TssBaseController {
 	public ModelAndView imageMassForm(Goods goods) {
 		ModelAndView mav = new ModelAndView();
 
-//		goods = goodsService.getGoods(goods);
-//		// mav.addObject("goodsImgList", goodsService.getGoodsImgList(goods)); //이미지 - 행
-//		mav.addObject("goodsImgInfo", goodsService.getGoodsImg(goods)); // 이미지 - 열
-//
 		mav.addObject("params", goods);
 		mav.setViewName("goods/GoodsImageMassForm");
 		return mav;
@@ -765,14 +760,9 @@ public class TssGoodsController extends TssBaseController {
 		mav.addObject("wmsSyncYn", commonService.getWmsSyncYn());
 		// 정보고시 목록
 		mav.addObject("niClsfCdList", rendererService.getAvailCommonCodeList("G004"));
-
 		// 사용자 업체
-		String supplyCompCd = StringUtils.hasLength(TssSession.getInfo().getSupplyCompCd()) ? TssSession.getInfo().getSupplyCompCd() : "NONE";
-//		User loginInfo = systemService.getUser(TssSession.getInfo().getUserNo());
-//		String supplyCompCd = "NONE";
-//		if (loginInfo != null) {
-//			supplyCompCd = loginInfo.getSupplyCompCd();
-//		}
+		String supplyCompCd = !StringUtils.isBlank(TssSession.getInfo().getSupplyCompCd()) ? TssSession.getInfo().getSupplyCompCd() : "NONE";
+
 		mav.addObject("supplyCompCd", supplyCompCd);
 		mav.setViewName("goods/GoodsMassRegisterForm");
 
@@ -796,7 +786,7 @@ public class TssGoodsController extends TssBaseController {
 	/**
 	 * 상품대량등록 엑셀 저장
 	 *
-	 * @param goods
+	 * @param goodsMass
 	 * @return
 	 * @author eskim
 	 * @since 2021. 01. 12
@@ -831,13 +821,11 @@ public class TssGoodsController extends TssBaseController {
 				goodsService.createExceluploadSelfGoods(gagaMap,  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",
+				"sexGb", "listPrice", "currPrice", "goodsGb", "formalGb",  "originCd", "makeYmd", "taxGb", "ageGrpCd", "adultYn","optStr", "goodsContent",
 				"niClsfCd", "niContent1", "niContent2", "niContent3", "niContent4", "niContent5",
 				"niContent6", "niContent7", "niContent8", "niContent9", "niContent10", "niContent11", "niContent12",
 				"niContent13", "niContent14", "niContent15", "niContent16", "niContent17", "niContent18",
@@ -846,7 +834,66 @@ public class TssGoodsController extends TssBaseController {
 
 			ecxelGoodsList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, goodsMass.getExcelFileNm()), 0, goodsNames, 0);
 
-			//goodsService.createExceluploadGoods(ecxelGoodsList, goodsMass.getExcelFileNm(), goodsMass.getProcJob());
+			// 사용자의 관리 브랜드 조회
+			Collection<CommonCode> mdBrandList = rendererService.getAuthBrandList(TssSession.getInfo().getUserNo());
+
+			if ("G001_B000".equals(TssSession.getInfo().getRoleCd())) {
+				if (mdBrandList == null || mdBrandList.isEmpty()) {
+					throw new IllegalStateException("담당 브랜드가 없습니다<br/>권한이 없습니다.");
+				}
+			} else {
+				throw new IllegalStateException("권한이 없습니다.");
+			}
+
+			for (GagaMap gagaMap : ecxelGoodsList) {
+				goodsService.createExceluploadGoods(gagaMap,  goodsMass.getProcJob());
+			}
+
+		}
+
+		// 파일 삭제
+		GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, goodsMass.getExcelFileNm()));
+
+		return super.ok("");
+	}
+
+	/**
+	 * 상품대량수정 엑셀 저장
+	 *
+	 * @param goodsMass
+	 * @return
+	 * @throws Exception
+	 * @author eskim
+	 * @since 2021. 1. 20
+	 */
+	@PostMapping("/mass/excelupload/update")
+	@ResponseBody
+	public GagaResponse updateMassExceluploadGoods(@RequestBody GoodsMass goodsMass) throws Exception {
+
+		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
+		Collection<GagaMap> ecxelGoodsList = new ArrayList<>();
+
+		// 상품수장
+		// DB 처리 시 사용되는 파라미터명(셀명) 설정 -
+		String[] goodsNames = {"goodsCd", "goodsNm", "goodsTnm", "goodsSnm1", "itemkindCd", "seasonCd",
+			"sexGb", "currPrice", "sellFeeRate", "goodsGb", "formalGb", "minOrdQty", "maxOrdQty", "dayMaxOrdQty",
+			"giftPackYn", "newCustOrdYn", "returnableYn", "changeableYn",
+			"taxGb", "ageGrpCd", "adultYn", "goodsContent",
+			"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);
+
+		// 입점담당자, 촬영업체
+		if (!"G001_B000".equals(TssSession.getInfo().getRoleCd()) && !"G001_E000".equals(TssSession.getInfo().getRoleCd())) {
+			throw new IllegalStateException("권한이 없습니다.");
+		}
+
+		for (GagaMap gagaMap : ecxelGoodsList) {
+			goodsService.updateMassExceluploadGoods(gagaMap,  goodsMass.getProcJob());
 		}
 
 		// 파일 삭제
@@ -947,7 +994,7 @@ public class TssGoodsController extends TssBaseController {
 		}
 
 		// multi row 검색관련 처리
-		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
+		if (!StringUtils.isBlank(goodsSearch.getCondition())) {
 			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
 		}
 
@@ -1070,7 +1117,7 @@ public class TssGoodsController extends TssBaseController {
 		}
 
 		// multi row 검색관련 처리
-		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
+		if (!StringUtils.isBlank(goodsSearch.getCondition())) {
 			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
 
 			if ("searchExtendGoodsCd".equals(goodsSearch.getSearch())) {

+ 1 - 15
src/main/java/com/style24/scm/biz/web/TssRendererController.java

@@ -83,8 +83,6 @@ public class TssRendererController extends TssBaseController {
 		return rendererService.getAuthBrandList(TssSession.getInfo().getUserNo());
 	}
 
-
-
 //	/**
 //	 * 벤더외부몰 목록
 //	 * @param vendorId - 벤더ID
@@ -175,19 +173,6 @@ public class TssRendererController extends TssBaseController {
 //	@ResponseBody
 //	public Collection<AdmCommonCode> getSellStoreList() {
 //		return rendererService.getSellStoreList();
-//	}
-//
-//	/**
-//	 * 제휴링크 목록
-//	 * @param afChannel - 제휴채널
-//	 * @return
-//	 * @author gagamel
-//	 * @since 2020. 5. 4
-//	 */
-//	@GetMapping("/aflink/list/{afChannel}")
-//	@ResponseBody
-//	public Collection<AdmCommonCode> getAflinkList(@PathVariable String afChannel) {
-//		return rendererService.getAflinkList(afChannel);
 //	}
 
 	/**
@@ -202,4 +187,5 @@ public class TssRendererController extends TssBaseController {
 	public Collection<CommonCode> getDeliveryFeeList(@PathVariable String supplyCompCd) {
 		return rendererService.getSupplyDeliveryFeePolicyList(supplyCompCd);
 	}
+
 }

+ 78 - 0
src/main/java/com/style24/scm/biz/web/TssSettleController.java

@@ -0,0 +1,78 @@
+package com.style24.scm.biz.web;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.style24.persistence.domain.AflinkFee;
+import com.style24.persistence.domain.CommonCode;
+import com.style24.scm.biz.service.TssRendererService;
+import com.style24.scm.biz.service.TssSettleService;
+import com.style24.scm.support.controller.TssBaseController;
+import com.style24.scm.support.security.session.TssSession;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 정산 Controller
+ *
+ * @author jaewonHo
+ * @since 2021. 1. 20
+ */
+@Controller
+@RequestMapping("/settle")
+@Slf4j
+public class TssSettleController extends TssBaseController {
+
+	@Autowired
+	private TssSettleService settleService;
+
+	@Autowired
+	private TssRendererService rendererService;
+
+	/**
+	 * 제휴채널정산 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 20
+	 */
+	@GetMapping("/aflink/fee/form")
+	public ModelAndView afLinkFeeForm() {
+		ModelAndView mav = new ModelAndView("settle/AfLinkSettleForm");
+
+		// 상위제휴채널 목록
+		CommonCode commoncode = new CommonCode();
+		commoncode.setCdGb("G053");
+		commoncode.setCd(TssSession.getInfo().getAfChannel());
+		mav.addObject("afChannelList", rendererService.getCommonCodeList(commoncode));
+
+		// 제휴채널 목록
+		mav.addObject("afLinkList", rendererService.getAflinkList(TssSession.getInfo().getAfChannel()));
+
+		return mav;
+	}
+
+	/**
+	 * 제휴채널정산 목록
+	 * @param aflinkFee - 제휴채널수수료 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 20
+	 */
+	@PostMapping("/aflink/fee/list")
+	@ResponseBody
+	public Collection<AflinkFee> getAfLinkFeeList(@RequestBody AflinkFee aflinkFee) {
+		// 파라미터로 다른 값을 입력해 조회할 수 있으므로 세션값으로 다시 설정
+		aflinkFee.setAfChannel(TssSession.getInfo().getAfChannel());
+
+		return settleService.getAfLinkFeeList(aflinkFee);
+	}
+
+}

+ 1 - 1
src/main/webapp/WEB-INF/views/common/fragments/header.html

@@ -21,7 +21,7 @@
 	<meta charset="utf-8"/>
 	<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
 	<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
-	<title>:: STYLE24 Admin ::</title>
+	<title>:: STYLE24 SCM ::</title>
 	<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet"/>
 	<link rel="shortcut icon" type="image/x-icon" href="/image/favicon.ico"/>
 

+ 11 - 3
src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html

@@ -270,7 +270,7 @@
 											<label class="rdoBtn"><input type="radio" name="changeableYn" id="changeableYnN" value="N"/>N</label>
 											<input type="hidden" id="changeableYnOrg" name="changeableYnOrg"/>
 										</td>
-										<th>신규가입구매가여부<em class="required" title="필수"></em></th>
+										<th>신규가입구매가여부<em class="required" title="필수"></em></th>
 										<td>
 											<label class="rdoBtn"><input type="radio" name="newCustOrdYn" id="newCustOrdYnY" value="Y" />Y</label>
 											<label class="rdoBtn"><input type="radio" name="newCustOrdYn" id="newCustOrdYnN" value="N"/>N</label>
@@ -423,6 +423,13 @@
 												<col width="12%"/>
 												<col/>
 											</colgroup>
+											<tr>
+												<th>상품상세</th>
+												<td><div class="tabJrContArea">
+													<textarea class="textareaR4 summernote" name="goodsDesc" id="goodsDesc"></textarea>
+													</div>
+												</td>
+											</tr>
 											<tr>
 												<th>상위(PC)</th>
 												<td><div class="tabJrContArea">
@@ -791,7 +798,8 @@
 			gagaSn.setContents('#goodsPcTopDesc', result.goodsPcTopDesc); 
 			gagaSn.setContents('#goodsMobileTopDesc', result.goodsMobileTopDesc); 
 			gagaSn.setContents('#goodsPcDownDesc', result.goodsPcDownDesc); 
-			gagaSn.setContents('#goodsMobileDownDesc', result.goodsMobileDownDesc); 
+			gagaSn.setContents('#goodsMobileDownDesc', result.goodsMobileDownDesc);
+			gagaSn.setContents('#goodsDesc', result.goodsDesc);
 
 			if (!gagajf.isNull(result.niClsfNm)){
 				$('#goodsDetailForm').find('#itemkindNoti').html('품목기준 고시분류 : ' + result.niClsfNm);
@@ -1079,7 +1087,7 @@
 		if($("#goodsDetailForm select[name=goodsStat]").val() == "G008_40" || $("#goodsDetailForm select[name=goodsStat]").val() == "G008_90"){
 
 			// SUPER관리자, 어드민관리자, 계정관리자. 총괄관리자, MD 를 제외하고 승인처리 할수 없음
-			if ($("#goodsDetailForm select[name=goodsStat]").val() == "G008_90" &&  $("#goodsDetailForm select[name=goodsStatOrg]").val() != "G008_90"){
+			if ($("#goodsDetailForm select[name=goodsStat]").val() == "G008_90" &&  $("#goodsDetailForm input[name=goodsStatOrg]").val() != "G008_90"){
 				mcxDialog.alert(" '승인완료' 상태로 변경할 권한이 없습니다.");
 				return false;
 			}

+ 24 - 68
src/main/webapp/WEB-INF/views/goods/GoodsMassRegisterForm.html

@@ -28,26 +28,22 @@
 			<ul class="notice">
 				<li>상품을 대량으로 등록하는 페이지입니다.</li>
 				<li>상품을 등록 할 경우 [승인대기] 상태이며, STYLE 관리자의 [승인완료] 상태 변경 후 FRONT애 노출이 가능합니다.</li>
-				<li><th:block th:if="${wmsSyncYn == 'N'}"><em><b>WMS연동여부가 [N]입니다. 관리자에게 문의하세요.</b></em></th:block></li>
+				<li><th:block th:if="${sessionInfo.roleCd == 'G001_E000'}">촬영업체의 대량수정은 상품정보(상세HTML포함)는 미적용되며 고시정보만 적용됩니다.</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" onclick="cfnDownloadSampleFile('SF001');">자사상품 등록양식 다운로드</button>
-						<button th:if="${wmsSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsSelfCreate" >자사상품 등록</button>
+						<button 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"  onclick="cfnDownloadSampleFile('SF005');">입점상품 등록양식 다운로드</button>
-						<button th:if="${wmsSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsCreate" >입점상품 등록</button>
+						<button 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>
-					<!--  추후 대량 수정 권한-->
-					<span th:if="${sessionInfo.roleCd == 'G001_B000' 
-									or sessionInfo.roleCd == 'G001_E000'  
-								}" 
-							th:style="'padding-left:80px;'">
+					<span th:if="${sessionInfo.roleCd == 'G001_B000' or sessionInfo.roleCd == 'G001_E000'}" th:style="'padding-left:80px;'">
 						<button type="button" class="btn btn-default btn-lg"  onclick="cfnDownloadSampleFile('SF014');">상품대량수정 등록양식 다운로드</button>
-						<button th:if="${wmsSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsUpdate" >수정상품 등록</button>
+						<button type="button" class="btn btn-primary btn-lg" id="btnGoodsUpdate" >수정상품 등록</button>
 					</span>
 				</li>
 			</ul>
@@ -100,32 +96,22 @@
 						<i class="fa fa-info" aria-hidden="true"></i>
 						<span class="left aL" style="width:580px;">
 						<!-- class="left" 또는 class="right" -->
-							<em>상품미등록</em><br/>
-							- 상품코드 오류 : 빈값, 길이 11이 아닐경우, '_'가 미존재<br/>
-							- 업체 오류 : 빈값, 'W'나 'F' 가 아닌경우<br/>
-							- 상품명 오류 : 빈값<br/>
-							- 제조국 오류 : 빈값<br/>
+							<em>* 상품미등록 *</em><br/>
+							- 품번 오류(자사) : 빈값, 길이 10이 아닐경우, FRJ는 '-'제외한 길이<br/>
 							- 제조년월일 오류 : 빈값, 날짜형식이 맞는지<br/>
-							- ERP 미존재 상품코드 : ERP에 상품코드가 존재하는지<br/>
-							- 스타일 연도 오류 : 온라인에서 관리되지 않는 스타일 연도<br/>
-							- 성별 오류 : 온라인에서 관리되지 않는 성별<br/>
-							- 컬러 오류 : 온라인에서 관리되지 않는 컬러<br/>
+							- WMS 미존재 품번코드(자사) : 온라인 입고테이블에 품번이 없는 경우<br/>
 							- 상품코드 중복등록요청 : 등록된 상품코드 등록요청<br/>
-							- 품목 오류 : 온라인에서 관리되지 않는 품목<br/>
-							- ERP 브랜드 오류 : 온라인에서 관리되지 않는 ERP 브랜드<br/>
-							- 이미지 유형 오류 : 온라인에서 관리되지 않는 이미지유형<br/>
-							- 상품이미지 필수 오류 : IMG_PATH1
+							- 항목별 오류 : 온라인에서 관리되지 않는 공통코드<br/>
 							- 품목의 고시정보 없음 : 품목의 고시분류 매핑이 안되어 있는 경우<br/>
 							- 고시분류 오류 : 등록요청 고시분류 와 온라인에서 품목과 매핑된 고시분류가 다른 경우<br/>
-							<em>상품등록</em><br/>
-							- ERP 상품 사이즈 정보 없음 : ERP에 상품코드의 사이즈가 없을 경우<br/>
+							<br/>
+							<em>* 상품등록 *</em><br/>
+							- WMS 상품 사이즈 정보 없음 : WMS에 상품코드의 사이즈가 없을 경우<br/>
+							- 고시항목 필수 항목 오류 : 필수 고시항목의 값이 없을 경우<br/>
 						</span>
 					</div>
 					<!-- //아이콘 툴팁 -->
 				</li>
-				<!-- <li class="right">
-					<button type="button" class="btn btn-default btn-lg" id="btnGoodsRegExcelDownLoad">엑셀다운로드</button>
-				</li> -->
 			</ul>
 			<!-- //상단버튼 영역  -->
 			<div id="gridList" style="width: 100%; height: 500px;" class="ag-theme-balham"></div>
@@ -141,10 +127,13 @@
 	var columnDefs = [
 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
 		{headerName: "작업일시", field: "regDt", width: 150, cellClass: 'text-center'},
+		{headerName: "작업자", field: "regNm", width: 120, cellClass: 'text-center'},
 		{headerName: "상품등록여부", field: "regSuccYn", width: 100, cellClass: 'text-center'},
 		{headerName: "등록결과메세지", field: "regFailRsn", width: 200, cellClass: 'text-left'},
-		{headerName: "브랜드코드", field: "brandCd", width: 120, cellClass: 'text-center'},
-		{headerName: "업체코드", field: "supplyCompCd", width: 130, cellClass: 'text-center'},
+		{headerName: "품번", field: "goodsNum", width: 100, cellClass: 'text-center'},
+		{headerName: "브랜드코드", field: "brandCd", width: 100, cellClass: 'text-center'},
+		{headerName: "공급업체상품코드", field: "supplyGoodsCd", width: 130, cellClass: 'text-center'},
+		{headerName: "공급업체코드", field: "supplyCompCd", width: 100, cellClass: 'text-center'},
 		{headerName: "상품코드", field: "goodsCd", width: 130, cellClass: 'text-center'},
 		{headerName: "상품명", field: "goodsNm", width: 150, cellClass: 'text-left'},
 		{headerName: "상품타이틀", field: "goodsTnm", width: 150, cellClass: 'text-left'},
@@ -153,22 +142,18 @@
 		{headerName: "제조일", field: "makeYmd", width: 100, cellClass: 'text-center'},
 		{headerName: "품목", field: "itemkindCd", width: 100, cellClass: 'text-center'},
 		{headerName: "스타일연도", field: "styleYear", width: 100, cellClass: 'text-center'},
-		{headerName: "시즌", field: "seasonCd", width: 80, cellClass: 'text-center'},
-		{headerName: "성별", field: "sexGb", width: 80, cellClass: 'text-center'},
-		{headerName: "품번", field: "goodsNum", width: 100, cellClass: 'text-center'},
+		{headerName: "시즌", field: "seasonCd", width: 100, cellClass: 'text-center'},
+		{headerName: "성별", field: "sexGb", width: 100, cellClass: 'text-center'},
 		{headerName: "정상가", field: "listPrice", width: 100, cellClass: 'text-center'},
 		{headerName: "판매가", field: "currPrice", width: 100, cellClass: 'text-center'},
 		{headerName: "원가", field: "costPrice", width: 100, cellClass: 'text-center'},
-		{headerName: "공급업체상품코드", field: "supplyGoodsCd", width: 130, cellClass: 'text-center'},
 		{headerName: "정상이월", field: "formalGb", width: 100, cellClass: 'text-center'},
 		{headerName: "상품구분", field: "goodsGb", width: 100, cellClass: 'text-center'},
 		{headerName: "과세구분", field: "taxGb", width: 100, cellClass: 'text-center'},
 		{headerName: "성인용품여부", field: "adultYn", width: 100, cellClass: 'text-center'},
-		{headerName: "고시분류코드", field: "niClsfCd", width: 200, cellClass: 'text-center',
-			cellEditorParams: { values: gagaAgGrid.extractValues(niClsfCdList) },
-			valueFormatter: function (params) { return gagaAgGrid.lookupValue(niClsfCdList, params.value); },
-			valueParser: function (params) { return gagaAgGrid.lookupKey(niClsfCdList, params.newValue); }
-		},
+		{headerName: "옵션정보", field: "optStr", width: 150, cellClass: 'text-center'},
+		{headerName: "상품상세 html", field: "goodsContent", width: 150, cellClass: 'text-center'},
+		{headerName: "고시분류코드", field: "niClsfCd", width: 100, cellClass: 'text-center'},
 		{headerName: "고시내용1", field: "niContent1", width: 200, cellClass: 'text-left'},
 		{headerName: "고시내용2", field: "niContent2", width: 200, cellClass: 'text-left'},
 		{headerName: "고시내용3", field: "niContent3", width: 200, cellClass: 'text-left'},
@@ -197,10 +182,6 @@
 		{headerName: "고시내용26", field: "niContent26", width: 200, cellClass: 'text-left'},
 		{headerName: "고시내용27", field: "niContent27", width: 200, cellClass: 'text-left'},
 		{headerName: "고시내용28", field: "niContent28", width: 200, cellClass: 'text-left'}
-		/* {headerName: "옵션문자열", field: "optStr", width: 200, cellClass: 'text-center'},
-		{headerName: "안전재고문자열", field: "baseStockStr", width: 200, cellClass: 'text-center'},
-		{headerName: "현재고문자열", field: "currStockStr", width: 200, cellClass: 'text-center'}, */
-		
 	];
 
 	// Get GridOptions
@@ -260,31 +241,6 @@
 		fnGoodsListSearch();
 	}
 	
-	$('#btnGoodsRegExcelDownLoad').on('click', function() {
-		
-		var date = new Date().format("YYYYMMDDHHmmss");
-		var params = {
-			
-			fileName : "상품대량등록결과_"+ date,
-			sheetName: "DATA"
-		}
-		gridOptions.excelStyles = [
-			{
-				id: 'text-center',
-				dataType: 'string',
-				font: {size : 10, bold: false}
-			},
-			{
-				id: 'text-left',
-				dataType: 'string',
-				font: {size : 10, bold: false}
-			}
-		]
-		
-		gridOptions.api.exportDataAsExcel(params);
-		
-	});
-	
 	// 초기화 클릭시
 	$('#btnInit').on('click', function() {
 		$('#massForm')[0].reset();

+ 189 - 0
src/main/webapp/WEB-INF/views/settle/AfLinkSettleForm.html

@@ -0,0 +1,189 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : AfLinkSettleForm.html
+ * @desc    : 제휴채널정산 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.20   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/settle/aflink/fee/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:58%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>발생(정산)기간<i class="required" title="필수" aria-hidden="true"></i></th>
+						<td id="terms">
+						</td>
+						<th>제휴채널</th>
+						<td>
+							<select name="afChannel" disabled="disabled">
+								<option th:if="${afChannelList}" th:each="oneData, status : ${afChannelList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<select name="afLinkCd">
+								<option value="">[전체]</option>
+								<option th:if="${afLinkList}" th:each="oneData, status : ${afLinkList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="left">
+					<span class="infoTxt cBlue">
+						<i class="fa fa-info-circle" aria-hidden="true"></i><strong>발생(정산)일시</strong> : 결제/취소/반품이 실제 발생한 일시. <i class="fa fa-info-circle marL10" aria-hidden="true"></i><strong>판매금액</strong> : 정상 판매가로 배송비를 제외한 상품금액 합계<br/>
+						<i class="fa fa-info-circle" aria-hidden="true"></i><strong>쿠폰할인금액</strong> : 즉시할인 + 다다익선 + 상품쿠폰 + 장바구니쿠폰 + PG결제쿠폰 등의 합계. <i class="fa fa-info-circle marL10" aria-hidden="true"></i><strong>포인트사용금액</strong> : 포인트사용 + 선포인트사용 합계<br/>
+						<i class="fa fa-info-circle" aria-hidden="true"></i><strong>결제액</strong> : 판매금액 - 쿠폰할인금액 - 포인트사용금액 - 상품권사용금액. <i class="fa fa-info-circle marL10" aria-hidden="true"></i><strong>매출액</strong> : 결제액 / 1.1
+					</span>
+				</li>
+				<li class="right">
+					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+			
+			<div id="gridList" style="width: 100%; height: 670px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let columnDefs = [
+		{headerName: "제휴채널", field: "afLinkNm", width: 100},
+		{headerName: "발생(정산)일시", field: "occurDt", width: 150, cellClass: 'text-center'},
+		{headerName: "주문번호", field: "ordNo", width: 80, cellClass: 'text-center'},
+		{headerName: "주문상태", field: "ordDtlStat", width: 100, cellClass: 'text-center'},
+		{
+			headerName: '판매금액', field: 'sellAmt', width: 120, cellClass: 'text-right',
+			aggFunc: 'sum', enableValue: true, cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: '쿠폰할인금액', field: 'cpnDcAmt', width: 120, cellClass: 'text-right',
+			aggFunc: 'sum', enableValue: true, cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: '포인트사용금액', field: 'pntDcAmt', width: 120, cellClass: 'text-right',
+			aggFunc: 'sum', enableValue: true, cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: '상품권사용금액', field: 'gfcdUseAmt', width: 120, cellClass: 'text-right',
+			aggFunc: 'sum', enableValue: true, cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: '결제액(VAT포함)', field: 'payAmt', width: 120, cellClass: 'text-right',
+			aggFunc: 'sum', enableValue: true, cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		},
+		{
+			headerName: '매출액(VAT제외)', field: 'salesAmt', width: 120, cellClass: 'text-right',
+			aggFunc: 'sum', enableValue: true, cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }
+		}
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	gridOptions.autoGroupColumnDef = {
+			headerName: "상위제휴채널",
+			field: "grouping",
+			width: 200,
+			cellRendererParams: {
+				suppressCount: true
+			}
+		};
+	
+	// for expand everything
+	gridOptions.groupDefaultExpanded = -1;
+	
+	// 검색
+	$('#btnSearch').on('click', function() {
+		// 입력 값 체크
+		if (!gagajf.validation($('#searchForm')))
+			return false;
+		
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm', fnCreateTotal);
+	});
+	
+	// 합계 생성
+	let fnCreateTotal = function() {
+		let sellAmt = 0;
+		let cpnDcAmt = 0;
+		let pntDcAmt = 0;
+		let gfcdUseAmt = 0;
+		let payAmt = 0;
+		let salesAmt = 0;
+
+		gridOptions.api.forEachNode(function(rowNode, index) {
+			if (!rowNode.group) {
+				if (typeof rowNode.data.sellAmt == 'number') { sellAmt += rowNode.data.sellAmt; }
+				if (typeof rowNode.data.cpnDcAmt == 'number') { cpnDcAmt += rowNode.data.cpnDcAmt; }
+				if (typeof rowNode.data.pntDcAmt == 'number') { pntDcAmt += rowNode.data.pntDcAmt; }
+				if (typeof rowNode.data.gfcdUseAmt == 'number') { gfcdUseAmt += rowNode.data.gfcdUseAmt; }
+				if (typeof rowNode.data.payAmt == 'number') { payAmt += rowNode.data.payAmt; }
+				if (typeof rowNode.data.salesAmt == 'number') { salesAmt += rowNode.data.salesAmt; }
+			}
+		});
+
+		let data = {
+			grouping: '합계', afLinkNm: null,
+			occurDt: null, ordNo: null, ordDtlStat: null,
+			sellAmt: sellAmt, cpnDcAmt: cpnDcAmt,
+			pntDcAmt: pntDcAmt, gfcdUseAmt: gfcdUseAmt,
+			payAmt: payAmt, salesAmt: salesAmt
+		};
+
+		gagaAgGrid.setPinnedRowData(gridOptions, data, 'top');
+	}
+	
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('제휴채널정산 목록', gridOptions);
+	});
+	
+	$(document).ready(function() {
+		cfnCreateCalendar('#terms', 'startDt', 'endDt', true, '발생(정산)');
+		$('.btnToday').trigger('click');
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 11 - 7
src/main/webapp/ux/css/admin.ui.css

@@ -414,7 +414,11 @@ td[rowspan] {border-bottom:1px solid #eee;}
 .dep3 .badge {position:relative; top:-28px; right:20px;}
 
 /* badge-등급 ------------*/
+<<<<<<< HEAD
+.badgeLevel{overflow:hidden;display:inline-block;margin:5px 0 0;padding:0;width:50px;height:50px;line-height:46px;font-size:30px;font-weight:bold;border-radius:100%;text-align:center;vertical-align:top;box-sizing:border-box;}
+=======
 .badgeLevel{overflow:hidden;display:inline-block;margin:4px 0;padding:0;width:60px;height:60px;line-height:56px;font-size:30px;font-weight:bold;border-radius:100%;text-align:center;vertical-align:top;box-sizing:border-box;}
+>>>>>>> refs/heads/develop
 .badgeLevel.white{background-color:#fff;border:1px solid #333;color:#333;}
 .badgeLevel.dark1{background-color:#ccc;border:1px solid #ccc;color:#333;}
 .badgeLevel.dark2{background-color:#aaa;border:1px solid #aaa;color:#333;}
@@ -760,13 +764,13 @@ table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
 .sortableWrap .item .cont input {margin-left:5px; width:37px;}
 
 
-.ag-theme-balham.lh60 .ag-cell {line-height:60px !important; height:60px;}
-.ag-theme-balham.lh70 .ag-cell {line-height:70px !important; height:70px;}
-.ag-theme-balham.lh80 .ag-cell {line-height:80px !important; height:80px;}
-.ag-theme-balham.lh90 .ag-cell {line-height:90px !important; height:90px;}
-.ag-theme-balham.lh100 .ag-cell {line-height:100px !important; height:100px;}
-.ag-theme-balham.lh110 .ag-cell {line-height:110px !important; height:110px;}
-.ag-theme-balham.lh120 .ag-cell {line-height:120px !important; height:120px;}
+.ag-theme-balham.lh60 .ag-cell {line-height:56px !important; height:60px;}
+.ag-theme-balham.lh70 .ag-cell {line-height:66px !important; height:70px;}
+.ag-theme-balham.lh80 .ag-cell {line-height:76px !important; height:80px;}
+.ag-theme-balham.lh90 .ag-cell {line-height:86px !important; height:90px;}
+.ag-theme-balham.lh100 .ag-cell {line-height:96px !important; height:100px;}
+.ag-theme-balham.lh110 .ag-cell {line-height:106px !important; height:110px;}
+.ag-theme-balham.lh120 .ag-cell {line-height:116px !important; height:120px;}
 
 
 /* 테이블 상품명 클릭시 이미지 레이어 활성화 */

+ 3 - 2
src/main/webapp/ux/plugins/agGrid/ag-theme-balham.css

@@ -463,7 +463,7 @@
 .ag-theme-balham .ag-row:not(.ag-row-first) {
   border-width: 1px 0 0; }
 .ag-theme-balham .ag-row.ag-row-last {
-  border-bottom-width: 1px; }
+  border-bottom-width: 1px; } 
 .ag-theme-balham .ag-row-odd {
   background-color: #fcfdfe; }
 .ag-theme-balham .ag-row-even {
@@ -1875,7 +1875,8 @@
 .ag-theme-balham .ag-rtl .ag-column-drop-horizontal.ag-column-drop.ag-width-half:first-child {
   border-left: 0; }
 .ag-theme-balham .ag-row {
-  border-color: #d9dcde; }
+  border-color: #d9dcde; 
+  }
 .ag-theme-balham .ag-row-selected {
   border-color: #b7e4ff; }
 .ag-theme-balham .ag-icon-row-drag {

+ 35 - 27
src/main/webapp/ux/plugins/gaga/gaga.paging.js

@@ -71,8 +71,13 @@ var gagaPaging = {
 	 */
 	createPagination : function(pageable) {
 		// Generate pagination
-		$('#' + oPaginationId).html(pageable.generatedPagination);
-		
+		var html;
+		if (gagajf.isNull(pageable.generatedPagination)) {
+			html = gagaPaging.generatedPagination(pageable);
+		} else {
+			html = pageable.generatedPagination;
+		}
+		$('#' + oPaginationId).html(html);
 		// Bind event
 		gagaPaging.bind();
 	},
@@ -154,59 +159,61 @@ var gagaPaging = {
 				mcxDialog.alert('오류로 인해 처리되지 않았습니다.');
 			}
 		});
-	},
-
+	} ,
 	generatedPagination : function (pageable) {
 		let pageNo = pageable.pageNo;
 		let pageSize = pageable.pageSize;
 		let pageUnit = pageable.pageUnit;
-		let totalCount = 0;
-
-		let firstCount = (getPageGroup()- 1) * pageable.pageUnit + 1;
+		let totalCount = pageable.totalCount;
+		let firstCount = (getPageGroup() - 1) * pageable.pageUnit + 1;
 		let loopCount = firstCount + pageUnit;
 		if (loopCount > getTotalPage()) {
-			loopCount = getTotalPage() + 1;
+			loopCount = Number(getTotalPage() + 1);
 		}
-
+		
 		var pageTag = '';
-		if (!(firstCount === 1 && loopCount === 1)) {
-			if (pageNo === 1) {
+		if (!(firstCount == 1 && loopCount == 1)) {
+			if (pageNo == 1) {
 				pageTag += "<a class=\"arrow\" href=\"#\"><i class=\"fa fa-angle-double-left\" alt=\"맨처음\"></i></a>\n";
 			} else {
 				pageTag += "<a class=\"arrow\" href=\"#pageNo=1\"><i class=\"fa fa-angle-double-left\" alt=\"맨처음\"></i></a>\n";
 			}
 
-			if (getPageGroup() === 1) {
+			if (getPageGroup() == 1) {
 				pageTag += "<a class=\"arrow\" href=\"#\"><i class=\"fa fa-angle-left\" alt=\"이전페이지\"></i></a>\n";
 			} else {
-				pageTag += "<a class=\"arrow\" href=\"#pageNo="+(getPageGroup()-1) * pageUnit+"\"><i class=\"fa fa-angle-left\" alt=\"이전페이지\"></i></a>\n"
+				pageTag += "<a class=\"arrow\" href=\"#pageNo="+ (getPageGroup()-1) * pageUnit + "\"><i class=\"fa fa-angle-left\" alt=\"이전페이지\"></i></a>\n"
 			}
 
 			for (let i = firstCount; i < loopCount; i++) {
-				if (pageNo === i) {
+				if (pageNo == i) {
 					pageTag += "<a class=\"num on\" href=\"#\">"+ i + "</a>\n";
 				} else {
-					pageTag += "<a class=\"num\" href=\"#pageNo=" + i + "\"></a>\n"
+					pageTag += "<a class=\"num\" href=\"#pageNo=" + i + "\">" + i +"</a>\n"
 				}
 			}
-
-			if (loopCount <= (getTotalPage() + 1)) {
-				if (pageNo === getTotalPage()) {
-					pageTag += "<a class=\"arrow\" href=\"#\"><i class=\"fa fa-angle-right\" alt=\"다음페이지\"></i></a>\n";
-					pageTag += "<a class=\"arrow\" href=\"#\"><i class=\"fa fa-angle-double-right\" alt=\"맨마지막\"></i></a>\n";
-				} else {
-					pageTag += "<a class=\"arrow\" href=\"#pageNo=" + (getPageGroup() * pageUnit + 1) + "\"><i class=\"fa fa-angle-right\" alt=\"다음페이지\"></i></a>\n";
+			
+			if (loopCount <= (Number(getTotalPage() + 1))) {
+				//if (getTotalPage() <= pageUnit) {
+				//	pageTag += "<a class=\"arrow\" href=\"#\"><i class=\"fa fa-angle-right\" alt=\"다음페이지\"></i></a>\n";
+				//	pageTag += "<a class=\"arrow\" href=\"#\"><i class=\"fa fa-angle-double-right\" alt=\"맨마지막\"></i></a>\n";
+				//} else {
+					if (getTotalPage() > loopCount){
+						pageTag += "<a class=\"arrow\" href=\"#pageNo=" + (getPageGroup() * pageUnit + 1) + "\"><i class=\"fa fa-angle-right\" alt=\"다음페이지\"></i></a>\n";	
+					}else{
+						pageTag += "<a class=\"arrow\" href=\"#pageNo=" + getTotalPage() + "\"><i class=\"fa fa-angle-right\" alt=\"다음페이지\"></i></a>\n";
+					}
 					pageTag += "<a class=\"arrow\" href=\"#pageNo=" + getTotalPage() + "\"><i class=\"fa fa-angle-double-right\" alt=\"맨마지막\"></i></a>\n";
-				}
+				//}
 			}
 		}
 
 		function getPageGroup() {
-			return pageNo / pageUnit + 1;
+			return parseInt((pageNo-1) / pageUnit + 1 );
 		}
 
-		function  getTotalPage() {
-			let totalPage = totalCount / pageSize;
+		function getTotalPage() {
+			let totalPage = parseInt(totalCount / pageSize);
 			if (totalCount % pageSize > 0) {
 				totalPage++;
 			}
@@ -215,5 +222,6 @@ var gagaPaging = {
 
 		return pageTag;
 	}
-	
+
 }
+