Browse Source

자사상품 단품등록 개발중

eskim 4 năm trước cách đây
mục cha
commit
3567d0d74f

+ 38 - 8
src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java

@@ -5,6 +5,7 @@ import java.util.Collection;
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.AdKeyword;
 import com.style24.persistence.domain.AdKeywordGoods;
+import com.style24.persistence.domain.Brand;
 import com.style24.persistence.domain.Color;
 import com.style24.persistence.domain.FreeGoods;
 import com.style24.persistence.domain.Goods;
@@ -23,6 +24,7 @@ import com.style24.persistence.domain.GoodsSearch;
 import com.style24.persistence.domain.GoodsTnmRes;
 import com.style24.persistence.domain.GoodsVideo;
 import com.style24.persistence.domain.IfIncomelot;
+import com.style24.persistence.domain.IfProductSku;
 import com.style24.persistence.domain.Itemkind;
 import com.style24.persistence.domain.NotiInfo;
 import com.style24.persistence.domain.Notice;
@@ -896,7 +898,7 @@ public interface TsaGoodsDao {
 	 * @since 2021. 05. 10
 	 */
 	GoodsSafeNo getGoodsDetailSafe(Goods goods);
-	
+
 	/**
 	 * 상품 구매등급 삭제
 	 *
@@ -1160,7 +1162,7 @@ public interface TsaGoodsDao {
 	 * @since 2021. 01. 27
 	 */
 	void saveSizeInfo(SizeInfo sizeInfo);
-	
+
 	/**
 	 * 총알배송 제외 상품 목록
 	 *
@@ -1170,7 +1172,7 @@ public interface TsaGoodsDao {
 	 * @since 2021. 02. 25
 	 */
 	Collection<Goods> getGoodsQuikDeleverySkipList(GoodsSearch goodsSearch);
-	
+
 	/**
 	 * 총알배송 제외 상품 건수
 	 *
@@ -1180,7 +1182,7 @@ public interface TsaGoodsDao {
 	 * @since 2021. 02. 25
 	 */
 	int getGoodsQuikDeleverySkipCount(GoodsSearch goodsSearch);
-	
+
 	/**
 	 * 총알배송 제외 상품 저장
 	 *
@@ -1190,7 +1192,7 @@ public interface TsaGoodsDao {
 	 * @since 2021. 02. 25
 	 */
 	void createGoodsQuikDeleverySkip(Goods goods);
-	
+
 	/**
 	 * 총알배송 제외 상품 삭제
 	 *
@@ -1210,7 +1212,7 @@ public interface TsaGoodsDao {
 	 * @since 2021. 04. 27
 	 */
 	GoodsImg getGoodsModelInfo(GoodsImg goodsImg);
-	
+
 	/**
 	 * 상품 모델 정보 저장
 	 *
@@ -1220,8 +1222,7 @@ public interface TsaGoodsDao {
 	 * @since 2021. 04. 27
 	 */
 	void saveGoodsModelInfo(GoodsImg goodsImg);
-	
-	
+
 	/**
 	 * WMS입고단품목록 건수
 	 * @param goodsSearch
@@ -1240,4 +1241,33 @@ public interface TsaGoodsDao {
 	 */
 	Collection<WmsGoods> getGoodsWmsIncomelotSkuList(IfIncomelot ifIncomelot);
 
+	/**
+	 * wms 상품정보 조회
+	 *
+	 * @param goodsMass
+	 * @return
+	 * @author eskim
+	 * @since 2021. 07. 04
+	 */
+	WmsGoods getWmsGoodsInfo(Goods goods);
+
+	/**
+	 * wms 상품 색상, 재고판매율 적용 조회
+	 *
+	 * @param ifProductSku
+	 * @return
+	 * @author eskim
+	 * @since 2021. 05. 29
+	 */
+	Option getWmsColorStock(IfProductSku ifProductSku);
+
+	/**
+	 * 자사브랜드, 업체 연관정보 확인 
+	 *
+	 * @param brand
+	 * @return
+	 * @author eskim
+	 * @since 2021. 07. 04
+	 */
+	int getBrandSupplyCount(Brand brand);
 }

+ 11 - 1
src/main/java/com/style24/admin/biz/dao/TsaRendererDao.java

@@ -248,7 +248,7 @@ public interface TsaRendererDao {
 	 * @since  2021-01-14
 	 */
 	Collection<CommonCode> getSelfBrandList();
-	
+
 	/**
 	 * poll 질문유형 조회
 	 * @param
@@ -275,4 +275,14 @@ public interface TsaRendererDao {
 	 * @since 2021. 3. 4
 	 */
 	Collection<CommonCode> getSelfBrandGroupList();
+
+	/**
+	 * 업체별 출고처 목록
+	 *
+	 * @param supplyCompCd - 업체코드
+	 * @return 업체별 출고처 목록
+	 * @author eskim
+	 * @since 2021. 07. 04
+	 */
+	Collection<CommonCode> getSupplyDeliveryLocList(String supplyCompCd);
 }

+ 27 - 0
src/main/java/com/style24/admin/biz/dao/TsaWmsGoodsDao.java

@@ -0,0 +1,27 @@
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.WmsDs;
+import com.style24.persistence.domain.IfProductSku;
+
+/**
+ * wms Dao
+ *
+ * @author eskim
+ * @since 2021. 07. 04
+ */
+@WmsDs
+public interface TsaWmsGoodsDao {
+
+	/**
+	 * wms 상품 색상 , 사이즈별 재고 정보 조회
+	 *
+	 * @param goodsCd
+	 * @return
+	 * @author eskim
+	 * @since 2021. 05. 29
+	 */
+	Collection<IfProductSku> getGoodsWmsSizeList(String goodsCd);
+
+}

+ 198 - 9
src/main/java/com/style24/admin/biz/service/TsaGoodsService.java

@@ -44,6 +44,7 @@ import com.style24.persistence.domain.GoodsSearch;
 import com.style24.persistence.domain.GoodsTnmRes;
 import com.style24.persistence.domain.GoodsVideo;
 import com.style24.persistence.domain.IfIncomelot;
+import com.style24.persistence.domain.IfProductSku;
 import com.style24.persistence.domain.Itemkind;
 import com.style24.persistence.domain.NaverLowestPrice;
 import com.style24.persistence.domain.NotiInfo;
@@ -113,6 +114,9 @@ public class TsaGoodsService {
 	@Autowired
 	private NaverLowestPriceApi naverLowestPriceApi;
 
+	@Autowired
+	private TsaWmsGoodsService wmsGoodsService;
+
 	@Autowired
 	private ObjectMapper mapper;
 
@@ -430,7 +434,7 @@ public class TsaGoodsService {
 
 		} else {
 			// 헤더 title 설정
-			String[] listTitles = {"상품코드", "업체명", "브랜드명", "상품명", "품목", "전시재고", "상품상태", "스타일년도", "시즌", 
+			String[] listTitles = {"상품코드", "업체명", "브랜드명", "상품명", "품목", "전시재고", "상품상태", "스타일년도", "시즌",
 				"정상가", "판매가", "자사즉시할인가", "가격변경일", "ERP재고연동여부", "정상이월구분", "반품가능 여부"};
 
 			// DB 처리 시 사용되는 파라미터명(셀명) 설정
@@ -1058,13 +1062,13 @@ public class TsaGoodsService {
 		// 판매기간설정 eskim
 		goods.setSellStdt(goods.getSellStYMD().replaceAll("-", "") + goods.getSellStHH() + "0000");
 		goods.setSellEddt(goods.getSellEdYMD().replaceAll("-", "") + goods.getSellEdHH() + "5959");
-		
+
 		// 신규가입기간
 		if (!StringUtils.isEmpty(goods.getNewCustOrdStdt())) {
 			goods.setNewCustOrdStdt(goods.getNewCustOrdStdt().replaceAll("-", "") + "000000");
-			goods.setNewCustOrdEddt(goods.getNewCustOrdEddt().replaceAll("-", "") + "235959");	
+			goods.setNewCustOrdEddt(goods.getNewCustOrdEddt().replaceAll("-", "") + "235959");
 		}
-		
+
 		// 기본정보 변경
 		if ("Y".equals(goods.getChDataYn())) {
 			goodsDao.createGoodsHst(goods);
@@ -1098,7 +1102,7 @@ public class TsaGoodsService {
 
 		// 상품 정보고시 변경
 		this.saveGoodsNotiInfo(goods);
-		
+
 		// 안전인증정보
 		GoodsSafeNo goodsSafeNo = new GoodsSafeNo();
 		goodsSafeNo.setGoodsCd(goods.getGoodsCd());
@@ -1392,7 +1396,7 @@ public class TsaGoodsService {
 		regGoods.setGoodsGb("G073_11"); // 자사상품은 신규
 		//regGoods.setDistributionGb("G065_12"); // 유통구분
 		regGoods.setTaxGb("10"); // 과세구분
-		regGoods.setTobeFormYn("Y"); 
+		regGoods.setTobeFormYn("Y");
 		regGoods.setGoodsNum(goodsCd);
 
 		Collection<GoodsCompose> goodsComposeList = null;
@@ -1473,7 +1477,7 @@ public class TsaGoodsService {
 		regGoods.setGoodsGb("G073_11"); // 자사상품은 신규
 		//regGoods.setDistributionGb("G065_12"); // 유통구분
 		regGoods.setTaxGb("10"); // 과세구분
-		regGoods.setTobeFormYn("Y"); 
+		regGoods.setTobeFormYn("Y");
 		regGoods.setGoodsNum(goodsCd);
 
 		Collection<GoodsCompose> goodsComposeList = null;
@@ -1550,7 +1554,7 @@ public class TsaGoodsService {
 				pntPrate = tmpBrand.getPntPrate20();
 				pntMrate = tmpBrand.getPntMrate20();
 			}
-			distributionGb = tmpBrand.getDistributionGb() ; // 유통구분
+			distributionGb = tmpBrand.getDistributionGb(); // 유통구분
 		}
 
 		regGoods.setPntPrate(pntPrate); // 포인트적립율(PC)
@@ -2255,7 +2259,7 @@ public class TsaGoodsService {
 				if (goodsVideoList != null && goodsVideoList.size() > 0) {
 					GoodsVideo orgingGoodsVideo = goodsVideoList.iterator().next();
 					goodsVideo.setVideoSq(orgingGoodsVideo.getVideoSq());
-				}	
+				}
 			}
 			goodsDao.createGoodsVideo(goodsVideo);
 
@@ -3783,4 +3787,189 @@ public class TsaGoodsService {
 		return goodsDao.getGoodsWmsIncomelotSkuList(ifIncomelot);
 	}
 
+	/**
+	 * 자사 상품 등록
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 07. 04
+	 */
+	@Transactional("shopTxnManager")
+	public void createSalfGoodsDetail(Goods goods) {
+
+		// 중복여부 확인
+		Goods goodsDup = goodsDao.getGoods(goods);
+		if (goodsDup != null) {
+			throw new IllegalStateException("자사상품코드 중복요청입니다.");
+		}
+
+		// 입고여부확인
+		WmsGoods WmsGoods = goodsDao.getWmsGoodsInfo(goods);
+		if (WmsGoods == null) {
+			throw new IllegalStateException("미입고 상품코드입니다.");
+		}
+
+		Brand brand = new Brand();
+		brand.setSupplyCompCd(goods.getSupplyCompCd());
+		brand.setBrandCd(goods.getBrandCd());
+		int brandCount = goodsDao.getBrandSupplyCount(brand);
+		if (brandCount != 1) {
+			throw new IllegalStateException("미입고 상품의 업체/브랜드코드와 상품의 업체/브랜드코드가 상이합니다.");
+		}
+
+		goods.setErpStockLinkYn("Y");
+		goods.setGoodsStat("G008_20");
+		goods.setNewCustOrdYn("N");
+		goods.setSelfGoodsYn("Y");
+		goods.setGoodsType("G056_N");
+		goods.setTobeFormYn("Y");
+
+		// <,> replace 처리
+		goods.setRegNo(TsaSession.getInfo().getUserNo());
+		goods.setUpdNo(TsaSession.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;", ">"));
+		goods.setGoodsMobileDownDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsMobileDownDesc(), "&lt;", "<"), "&gt;", ">"));
+
+		goods.setGoodsNm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsNm(), "&lt;", "<"), "&gt;", ">"));
+		goods.setGoodsTnm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsTnm(), "&lt;", "<"), "&gt;", ">"));
+		goods.setGoodsSnm1(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsSnm1(), "&lt;", "<"), "&gt;", ">"));
+
+		// 판매기간설정 eskim
+		goods.setSellStdt(goods.getSellStYMD().replaceAll("-", "") + goods.getSellStHH() + "0000");
+		goods.setSellEddt(goods.getSellEdYMD().replaceAll("-", "") + goods.getSellEdHH() + "5959");
+
+		// 품번코드
+		goods.setGoodsNum(goods.getGoodsCd());
+		// 입점상품코드
+		goods.setSupplyGoodsCd(goods.getGoodsCd());
+		// 정상가
+		goods.setListPrice(0);	// 기본처리
+		// 판매가
+		goods.setCurrPrice(0);	// 기본처리
+		// 원가
+		goods.setCostPrice(0);	// 기본처리	
+
+		// 판매수수료율
+		SupplyCompany supplyCompany = new SupplyCompany();
+		supplyCompany.setSupplyCompCd(goods.getSupplyCompCd());
+		Collection<SupplyCompany> supplyCompanyList = businessService.getSupplyCompanyList(supplyCompany);
+		if (supplyCompanyList == null || supplyCompanyList.isEmpty()) {
+			throw new IllegalStateException("업체정보를 확인해 주세요.");
+		}
+
+		goods.setSellFeeRate(supplyCompanyList.iterator().next().getSellFeeRate()); // 판매수수료율
+
+		// 적립포인트 관련 브랜드 확인
+//		Brand brand = new Brand();
+		brand.setBrandCd(goods.getBrandCd());
+		Collection<Brand> brandList = businessService.getBrandList(brand);
+		if (brandList == null || brandList.isEmpty()) {
+			throw new IllegalStateException("상품브랜드를 확인해 주세요.");
+		}
+
+		float pntPrate = 0f;
+		float pntMrate = 0f;
+		String distributionGb = "G065_12";
+		for (Brand tmpBrand : brandList) {
+			if ("G009_10".equals(goods.getFormalGb())) {
+				pntPrate = tmpBrand.getPntPrate10();
+				pntMrate = tmpBrand.getPntMrate10();
+			} else {
+				pntPrate = tmpBrand.getPntPrate20();
+				pntMrate = tmpBrand.getPntMrate20();
+			}
+			distributionGb = tmpBrand.getDistributionGb(); //유통구분
+		}
+		goods.setPntPrate(pntPrate); // 포인트적립율(PC)
+		goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
+		goods.setPrePpntUsableYn("N");
+		goods.setPreMpntUsableYn("N");
+		goods.setDistributionGb(distributionGb);
+
+		//출고처 코드
+		goods.setDelvLocCd("DL001"); // 자사상품 출고처 코드 고정		
+
+		// 기본정보 생성
+		goodsDao.createGoods(goods); // 상품기본 저장
+		goodsDao.createGoodsSmmary(goods); // 상품통계 생성
+
+		WmsGoods wmsGoods = new WmsGoods();
+		wmsGoods.setUpdNo(TsaSession.getInfo().getUserNo());
+		wmsGoods.setGoodsRegGb("G"); // G: 상품, F: 사은품
+		wmsGoods.setModelNo(goods.getGoodsCd());
+
+		goodsDao.saveGoodsWmsIncomelot(wmsGoods); // wms 상품 상품등록일 변경
+
+		// 사용자 검색어를 검색어에 적용
+		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);
+
+		// 상품사이즈 정보
+		Collection<IfProductSku> goodsWmsSizeList = wmsGoodsService.getGoodsWmsSizeList(goods.getGoodsCd());
+
+		if (goodsWmsSizeList == null || goodsWmsSizeList.isEmpty()) {
+			throw new IllegalStateException("WMS의 TB_IF_PRODUCTSKU 에  " + goods.getGoodsCd() + " 상품이 존재하지 않습니다.");
+		} else {
+			int index = 1;
+			for (IfProductSku ifProductSku : goodsWmsSizeList) {
+
+				Option wmsOption = goodsDao.getWmsColorStock(ifProductSku);
+				if (wmsOption == null) {
+					throw new IllegalStateException(goods.getGoodsCd() + " 의 WMS의 색상 " + ifProductSku.getWmsColorCd() + "이(가) WMS색상관리에 없습니다.");
+				}
+
+				Option goodsStock = new Option();
+				goodsStock.setGoodsCd(goods.getGoodsCd());
+				goodsStock.setOptCd(ifProductSku.getSkucode());
+				goodsStock.setOptCd1(wmsOption.getOptCd1());
+				goodsStock.setOptCd2(ifProductSku.getOption2());
+				goodsStock.setSkuModelNo(ifProductSku.getSkumodelno());
+				goodsStock.setProductNo(ifProductSku.getProductno());
+				goodsStock.setProductCode(ifProductSku.getProductcode());
+				goodsStock.setBaseStockQty(0);
+				goodsStock.setCurrStockQty(wmsOption.getCurrStockQty());
+				goodsStock.setStoreStockQty(0);
+				goodsStock.setStoreMaxQty(wmsOption.getCurrStockQty());
+				goodsStock.setAddPrice(0);
+				goodsStock.setSoldoutYn("N");
+				goodsStock.setDispOrd(index);
+				goodsStock.setDispYn("Y");
+				goodsStock.setRegNo(TsaSession.getInfo().getUserNo());
+				goodsStock.setUpdNo(TsaSession.getInfo().getUserNo());
+				goodsDao.saveStock(goodsStock);
+				index++;
+			}
+		}
+
+		// 상품상세정보 저장
+		this.saveGoodsDetailDesc(goods);
+
+		// 상품 정보고시 변경
+		this.saveGoodsNotiInfo(goods);
+
+		// 전시카테고리 작업
+		goodsDao.createCategoryGoods(goods);
+
+	}
+
 }

+ 13 - 4
src/main/java/com/style24/admin/biz/service/TsaRendererService.java

@@ -272,7 +272,6 @@ public class TsaRendererService {
 //	//	}
 //	//
 
-
 	/**
 	 * 브랜드 목록
 	 * @param
@@ -284,7 +283,6 @@ public class TsaRendererService {
 		return rendererDao.getBrandList(brand);
 	}
 
-
 	/**
 	 * 공급업체 브랜드 목록
 	 * @param supplyCompCd - 공급업체코드
@@ -565,7 +563,7 @@ public class TsaRendererService {
 	public Collection<CommonCode> getSelfBrandList() {
 		return rendererDao.getSelfBrandList();
 	}
-	
+
 	/**
 	 * poll 질문유형 조회
 	 * @param
@@ -595,7 +593,18 @@ public class TsaRendererService {
 	 * @author bin2107
 	 * @since 2021. 3. 4
 	 */
-	public Collection<CommonCode> getSelfBrandGroupList(){
+	public Collection<CommonCode> getSelfBrandGroupList() {
 		return rendererDao.getSelfBrandGroupList();
 	}
+
+	/**
+	 * 업체별 출고처 목록
+	 * @param supplyCompCd - 공급업체코드
+	 * @return 업체별 출고처 목록
+	 * @author eskim
+	 * @since 2021. 07. 4
+	 */
+	public Collection<CommonCode> getSupplyDeliveryLocList(String supplyCompCd) {
+		return rendererDao.getSupplyDeliveryLocList(supplyCompCd);
+	}
 }

+ 42 - 0
src/main/java/com/style24/admin/biz/service/TsaWmsGoodsService.java

@@ -0,0 +1,42 @@
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.admin.biz.dao.TsaWmsGoodsDao;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.IfProductSku;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ *  wms Service
+ *
+ * @author eskim
+ * @since 2021. 07. 04
+ */
+@Service
+@Slf4j
+public class TsaWmsGoodsService {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TsaWmsGoodsDao wmsGoodsDao;
+
+	/**
+	 * wms 상품 색상 , 사이즈별 재고 정보 조회
+	 *
+	 * @param goodsCd
+	 * @return
+	 * @author eskim
+	 * @since 2021. 05. 29
+	 */
+	public Collection<IfProductSku> getGoodsWmsSizeList(String goodsCd) {
+		return wmsGoodsDao.getGoodsWmsSizeList(goodsCd);
+	}
+
+}

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

@@ -3101,7 +3101,7 @@ public class TsaGoodsController extends TsaBaseController {
 
 		return mav;
 	}
-		
+
 	/**
 	 * 품목 목록 - 단건 조회
 	 *
@@ -3162,4 +3162,104 @@ public class TsaGoodsController extends TsaBaseController {
 
 		return result;
 	}
+
+	/**
+	 * 자사 상품  화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 07. 04
+	 */
+	@GetMapping("/salf/register/form")
+	public ModelAndView salfRegisterForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		String selfYn = "Y";
+		String supplyCompCd = TsaSession.getInfo().getSupplyCompCd();
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd, selfYn));
+
+		// 배송비정보
+		mav.addObject("delvFeeCdList", rendererService.getSupplyDeliveryFeePolicyList(supplyCompCd));
+
+		String[] goodsStatExceptCds = {"G008_00"};
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", goodsStatExceptCds));
+
+		// 정상이월
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+		// 성별
+		mav.addObject("sexGbList", rendererService.getAvailCommonCodeList("G007"));
+		// 시즌
+		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
+		// 사용여부
+		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
+		// 품목
+		mav.addObject("itemkindList", rendererService.getAllItemkindList());
+		// 정보고시 분류
+		mav.addObject("niClsfCdList", rendererService.getAvailCommonCodeList("G004"));
+		// 사용자 브랜드 조회
+		mav.addObject("authBrandList", rendererService.getSupplyCompanyBrandList(supplyCompCd));
+		// 상품타입
+		mav.addObject("goodsTypeList", rendererService.getAvailCommonCodeList("G056"));
+		// 상품구분
+		mav.addObject("goodsGbList", rendererService.getAvailCommonCodeList("G073"));
+		// 유통구분
+		String[] distributionGbExceptCds = {"G065_20"};
+		mav.addObject("distributionGbList", rendererService.getCommonCodeList("G065", "Y", distributionGbExceptCds));
+		// 상품연령대
+		mav.addObject("ageGrpCdList", rendererService.getAvailCommonCodeList("G023"));
+		// 원산지
+		mav.addObject("originCdList", rendererService.getAvailCommonCodeList("G076"));
+		// kc인증타입
+		mav.addObject("certTypeList", rendererService.getAvailCommonCodeList("G081"));
+		// kc인증대상구분
+		mav.addObject("certTargetGbList", rendererService.getAvailCommonCodeList("G083"));
+		// kc인증형태구분
+		mav.addObject("certFormGbList", rendererService.getAvailCommonCodeList("G084"));
+		// 년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear, 0, 5));
+		// 회원등급
+		//mav.addObject("custGradeList", rendererService.getAvailCommonCodeList("G110"));
+		// 출고처
+		mav.addObject("delvLocCdList", rendererService.getSupplyDeliveryLocList(supplyCompCd));
+
+		//mav.addObject("params", goods);
+		mav.setViewName("goods/GoodsSalfRegisterForm");
+
+		return mav;
+	}
+
+	/**
+	 * 자사 상품 등록
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 07. 04
+	 */
+	@PostMapping("/salf/detail/create")
+	@ResponseBody
+	public GagaMap createSalfGoodsDetail(@RequestBody Goods goods) {
+		GagaMap result = new GagaMap();
+		Collection<GoodsNotiInfo> notiList = null;
+		ObjectMapper mapper = new ObjectMapper();
+		try {
+			if (goods.getNotiList() != null) {
+				notiList = mapper.readValue(goods.getNotiList(), new TypeReference<Collection<GoodsNotiInfo>>() {
+				});
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		goods.setNotiListNew(notiList);
+
+		goodsService.createSalfGoodsDetail(goods);
+		result.set("goodsCd", goods.getGoodsCd());
+
+		return result;
+
+	}
+	
 }

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

@@ -0,0 +1,27 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * wms 연동 상품옵션정보 Domain
+ *
+ * @author eskim
+ * @since 2021. 07. 04
+ */
+@SuppressWarnings("serial")
+@Data
+public class IfProductSku extends TscBaseDomain {
+
+	private String goodsCd;			//상품코드
+	private String skucode;			//옵션코드
+	private String skumodelno;		//옵션모델번호
+	private int productno;			//상품번호
+	private String productcode;		//상품코드
+	private String option1;			//옵션1(색상)
+	private String option2;			//옵션2(사이즈)
+	private int WmsStockQty;		//재고
+	private String wmsColorCd;		//WMS 색상코드
+
+}

+ 51 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -4797,4 +4797,55 @@
 		LIMIT #{pageable.limitStartRow} ,  #{pageable.pageSize}
 	</select>
 	
+		<!-- wms 상품정보 조회 -->
+	<select  id="getWmsGoodsInfo" parameterType="Goods" resultType="WmsGoods" >
+		/* TssGoods.getWmsGoodsInfo */
+		SELECT PRODUCT_NO
+		     , PRODUCT_CODE
+		     , PRODUCT_NAME
+		     , MODEL_NO
+		     , PROVIDER_NO
+		     , PROVIDER_NAME
+		     , BRAND_NO
+		     , BRAND_NAME
+		     , GOODS_REG_DT
+		     , GOODS_REG_GB
+		FROM TB_WMS_GOODS
+		WHERE MODEL_NO = #{goodsCd}
+	</select>
+	
+	<!-- wms 상품 색상, 재고판매율 적용 조회 -->
+	<select id="getWmsColorStock" parameterType="IfProductSku"  resultType = "Option">
+		/* TssGoods.getGoodsWmsSizeList */
+		SELECT B.GOODS_CD
+		     , F.COLOR_CD AS OPT_CD1
+		     , ROUND(GREATEST(#{WmsStockQty}, 0) * (IFNULL(D.STOCK_APPL_RATE, 0)/100)) AS CURR_STOCK_QTY
+		FROM TB_GOODS B 
+		INNER JOIN TB_STOCK_SYNC_BASE C ON B.BRAND_CD = C.BRAND_CD
+		                                AND C.STOCK_SYNC_YN = 'Y'
+		                                AND C.DELV_LOC_CD = 'DL001'    -- WMS 매장코드
+		INNER JOIN TB_DELIVERY_LOC D ON B.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
+		                             AND C.DELV_LOC_CD = D.DELV_LOC_CD
+		                             AND D.USE_YN = 'Y'
+		                             AND D.DELV_LOC_CD = 'DL001'    -- WMS 매장코드
+		INNER JOIN TB_WMS_COLOR_MAPPING F ON B.SUPPLY_COMP_CD = F.SUPPLY_COMP_CD
+		                                  AND #{wmsColorCd} = F.WMS_COLOR_CD
+		                                  AND F.USE_YN ='Y' 
+		WHERE B.SELF_GOODS_YN = 'Y'
+		AND B.GOODS_TYPE = 'G056_N'
+		AND B.GOODS_CD = #{goodsCd}
+	</select>
+	
+	<!-- 자사브랜드, 업체 연관정보 확인  -->
+	<select id="getBrandSupplyCount" parameterType="Brand" resultType="int">
+		/* TsaGoods.getBrandSupplyCount */
+		SELECT  COUNT(*)
+		FROM TB_BRAND B
+		INNER JOIN TB_BRAND_SUPPLY BS ON B.BRAND_CD  = BS.BRAND_CD 
+		INNER JOIN TB_SUPPLY_COMPANY TSC ON BS.SUPPLY_COMP_CD  = TSC.SUPPLY_COMP_CD 
+		                                 AND TSC.SUPPLY_COMP_CD = #{supplyCompCd}
+		WHERE B.BRAND_CD = #{brandCd}
+		AND B.SELF_YN  = 'Y'
+	</select>
+	
 </mapper>

+ 11 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaRenderer.xml

@@ -445,4 +445,15 @@
 		ORDER BY Z.DISP_ORD
 	</select>
 
+	<!-- 업체별 출고처 목록 -->
+	<select id="getSupplyDeliveryLocList" parameterType="String" resultType="CommonCode">
+		/* TsaRenderer.getSupplyDeliveryLocList */
+		SELECT DELV_LOC_CD   AS CD
+		     , DELV_LOC_NM   AS CD_NM
+		FROM   TB_DELIVERY_LOC
+		WHERE  1 = 1
+		AND    SUPPLY_COMP_CD = #{supplyCompCd}
+		AND    USE_YN = 'Y'
+		ORDER  BY DELV_LOC_CD
+	</select>
 </mapper>

+ 46 - 0
src/main/java/com/style24/persistence/mybatis/wms/TsaWmsGoods.xml

@@ -0,0 +1,46 @@
+<?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.TssWmsGoodsDao">
+
+	<!-- wms 상품 색상 , 사이즈별 재고 정보 조회 -->
+	<select id="getGoodsWmsSizeList" parameterType="String"  resultType = "IfProductSku">
+		/* TssWmsGoods.getGoodsWmsSizeList */
+		SELECT GOODS_CD
+		     , SKUCODE
+		     , SKUMODELNO
+		     , OPTION1
+		     , OPTION2
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , WMS_COLOR_CD
+		     , (LOC_QTY- PICKING_QTY - EOUT_PICKING_QTY) AS WMS_STOCK_QTY
+		FROM (
+		      SELECT #{goodsCd} AS GOODS_CD
+		           , A.SKUCODE
+		           , A.SKUMODELNO
+		           , A.OPTION1
+		           , A.OPTION2
+		           , A.PRODUCTNO
+		           , A.PRODUCTCODE
+		           , SUM(B.LOC_QTY)          AS LOC_QTY
+		           , SUM(B.PICKING_QTY)      AS PICKING_QTY
+		           , SUM(B.EOUT_PICKING_QTY) AS EOUT_PICKING_QTY
+		           , MAX(CASE WHEN CHARINDEX('F20', REPLACE(A.SKUMODELNO, ' ', '')) = 1 THEN SUBSTRING(REPLACE(A.SKUMODELNO, ' ' , ''),13,2)
+		                      WHEN CHARINDEX('-', REPLACE(A.SKUMODELNO, ' ', '')) > 0 THEN SUBSTRING(REPLACE(A.SKUMODELNO, ' ' , ''),12,2)
+		                      ELSE SUBSTRING(REPLACE(A.SKUMODELNO, ' ' , ''),11,2) END) AS WMS_COLOR_CD
+		      FROM ISTYLE24_WMSIF.DBO.TB_IF_PRODUCTSKU A
+		               INNER JOIN ISTYLE24_WMS.DBO.VW_STOCK_BY_LOCCODE B ON A.SKUCODE = B.SKU_CODE
+		      WHERE 1 = 1
+		      AND (CASE
+		               WHEN CHARINDEX('F20', REPLACE(A.SKUMODELNO, ' ', '')) = 1
+		                   THEN LEFT(REPLACE(A.SKUMODELNO, ' ', ''), 12)
+		               WHEN CHARINDEX('-', REPLACE(A.SKUMODELNO, ' ', '')) > 0
+		                   THEN LEFT(REPLACE(A.SKUMODELNO, ' ', ''), 11)
+		               ELSE LEFT(REPLACE(A.SKUMODELNO, ' ', ''), 10) END) = #{goodsCd}
+		      GROUP BY A.SKUCODE, A.SKUMODELNO, A.OPTION1, A.OPTION2, A.PRODUCTNO, A.PRODUCTCODE
+		     ) Z
+		ORDER BY  PRODUCTNO, SKUCODE
+	</select>
+	
+	
+</mapper>

+ 802 - 0
src/main/webapp/WEB-INF/views/goods/GoodsSalfRegisterForm.html

@@ -0,0 +1,802 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"        >
+<!--
+ *******************************************************************************
+ * @source  : GoodsSelfRegisterForm.html
+ * @desc    : 자사 상품등록
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.07.04   eskim       최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<form id="goodsDetailForm" name="goodsDetailForm" action="#" th:method="post">
+				<input type="hidden" id="mode" name="mode" value="C"/>
+				<input type="hidden" id="notiList" name="notiList" />
+				<input type="hidden" id="safeNiClsfCd" name="safeNiClsfCd" />
+		<div class="panelStyle">
+			<div class="panelContent">
+				<table class="frmStyle">
+					<colgroup>
+						<col width="15%"/>
+						<col width="50%"/>
+						<col width="15%"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>업체/브랜드<em class="required" title="필수"></em></th>
+						<td>
+							<select name="supplyCompCd" id="supplyCompCd" required="required" data-valid-name="업체">
+								<option value="">[선택]</option>
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}" th:selected="${sessionInfo.supplyCompCd ==  oneData.cd}"></option>
+							</select>
+							<select name="brandCd" id="brandCd" required="required" data-valid-name="브랜드">
+								<option value="">[선택]</option>
+							</select>
+						</td>
+						<th>상품코드<em class="required" title="필수"></em></th>
+						<td><input type="text" class="w200" name="goodsCd" required="required" data-valid-name="상품코드"  onkeyup="$(this).val($(this).val().toUpperCase());"/></td>
+					</tr>
+				</table>
+				<!-- TABS BUTTON AREA -->
+				<ul class="panelBar">
+					<li>
+						<h3 class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i>상품이미지는 상품 등록 후 상품목록에서 등록일로 설정, 조회 후 상품상세에서 등록하세요.<br/>
+												<i class="fa fa-info-circle" aria-hidden="true"></i>옵션정보는 자동 등록 됩니다.</h3>
+					</li>	
+					<li class="right">
+						<th:block th:if="${sessionInfo.roleCd == 'G001_E000'}">
+						<button type="button" class="btn btnRight btn-success btn-lg" id="btnGoodsDetailSave">저장</button>
+						</th:block>
+					</li>
+				</ul>
+				<!-- //TABS BUTTON AREA -->
+				<!-- TABS SPACE -->
+				<div class="tabs">
+					<!-- TABS NAVI -->
+					<div class="tabsNav">
+						<ul>
+							<li class="on"><a href="#goodstab1">기본정보</a></li>
+							<li><a href="#goodstab3">상품상세정보</a></li>
+							<li><a href="#goodstab4">고시정보</a></li>
+						</ul>
+					</div>
+					<!-- //TABS NAVI -->
+					<!-- TABS CONTENTS -->
+					<ul class="tabsCont">
+						<!-- TAB1 : 기본정보 -->
+						<li class="tab on" id="goodstab1">
+							<!-- TAB1 CONTENTS AREA -->
+							<div class="panelStyle">
+								<table class="frmStyle">
+									<colgroup>
+										<col width="12%"/>
+										<col width="21%"/>
+										<col width="12%"/>
+										<col width="21%"/>
+										<col width="12%"/>
+										<col/>
+									</colgroup>
+									<tbody>
+									<tr>
+										<th>상품타이틀</th>
+										<td colspan="5">
+											<input type="text" class="w80p" id="goodsTnm" name="goodsTnm" maxlength=""></input>
+											<span class="byteChk"><em class="cBlue" id="goodsTnmLen">0</em>/100 bytes</span>
+										</td>
+									</tr>
+									<tr>
+										<th>상품명<em class="required" title="필수"></em></th>
+										<td colspan="5">
+											<input type="text" class="w80p" id="goodsNm" name="goodsNm" required="required" data-valid-name="상품명"></input>
+											<span class="byteChk"><em class="cBlue" id="goodsNmLen">0</em>/200 bytes</span>
+										</td>
+									</tr>
+									<tr>
+										<th>사용자검색어</th>
+										<td colspan="5">
+											<input type="text" class="w60p" id="goodsSnm1" name="goodsSnm1"></input>
+											<span class="byteChk"><em class="cBlue" id="goodsSnm1Len">0</em>/200 bytes</span><font class="cBlue padL10"><b>* 여러개설정할경우 ; 구분자 사용 / 공백은 자동삭제처리</b></font>
+										</td>
+									</tr>
+									<tr>
+										<th>정상/이월 구분<em class="required" title="필수"></em></th>
+										<td>
+											<label class="rdoBtn" th:if="${formalGbList}" th:each="oneData, status : ${formalGbList}" ><input type="radio" id="formalGb" name="formalGb" th:value="${oneData.cd}" th:text="${oneData.cdNm}" th:checked="${oneData.cd == 'G009_10'}"/></label>
+										</td>
+										<th>자사몰 노출여부<em class="required" title="필수"></em></th>
+										<td>
+											<label class="rdoBtn"><input type="radio" name="selfMallYn" id="selfMallYnY" value="Y"  checked="checked"/>Y</label>
+											<label class="rdoBtn"><input type="radio" name="selfMallYn" id="selfMallYnN" value="N"/>N</label>
+										</td>
+										<th>성인용품여부<em class="required" title="필수"></em></th>
+										<td>
+											<label class="rdoBtn"><input type="radio" name="adultYn" id="adultYnY" value="Y" />Y</label>
+											<label class="rdoBtn"><input type="radio" name="adultYn" id="adultYnN" value="N" checked="checked"/>N</label>
+											<input type="hidden" id="adultYnOrg" name="adultYnOrg"/>
+										</td>
+									</tr>
+									<tr>
+										<th>시즌<em class="required" title="필수"></em></th>
+										<td >
+											<select  name="seasonCd" id="seasonCd" required="required" data-valid-name="시즌">
+												<option value="">[선택]</option>
+												<option th:if="${seasonList}" th:each="oneData, status : ${seasonList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+											</select>
+										</td>
+										<th>성별<em class="required" title="필수" ></em></th>
+										<td>
+											<select  name="sexGb" id="sexGb" required="required" data-valid-name="성별">
+												<option value="">[선택]</option>
+												<option th:if="${sexGbList}" th:each="oneData, status : ${sexGbList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+											</select>
+										</td>
+										<th>스타일년도<em class="required" title="필수"></em></th>
+										<td><select  name="styleYear" id="styleYear" required="required" data-valid-name="스타일년도">
+												<option value="">[선택]</option>
+												<option th:if="${styleYearList}" th:each="oneData, status : ${styleYearList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+											</select>
+										</td>
+									</tr>
+									<tr>
+										<th>원산지<em class="required" title="필수"></em></th>
+										<td><select  name="originCd" id="originCd"  required="required" data-valid-name="원산지" >
+												<option value="">[선택]</option>
+												<option th:if="${originCdList}" th:each="oneData, status : ${originCdList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}" ></option>
+											</select>
+										</td>
+										<th>유통구분<em class="required" title="필수"></em></th>
+										<td><select  name="distributionGb" id="distributionGb"  required="required" data-valid-name="유통구분">
+												<option value="">[선택]</option>
+												<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+											</select>
+										</td>
+										<th>상품구분<em class="required" title="필수"></em></th>
+										<td>
+											<select  name="goodsGb" id="goodsGb" required="required" data-valid-name="상품구분">
+												<option value="">[선택]</option>
+												<option th:if="${goodsGbList}" th:each="oneData, status : ${goodsGbList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+											</select>
+										</td>
+									</tr>
+									<tr>
+										<th>해외구매대행여부</th>
+										<td><label class="rdoBtn"><input type="radio" name="foreignBuyYn" id="foreignBuyYnY" value="Y" />Y</label>
+											<label class="rdoBtn"><input type="radio" name="foreignBuyYn" id="foreignBuyYnN" value="N"  checked="checked"/>N</label>
+										</td>
+										<th>병행수입여부</th>
+										<td><label class="rdoBtn"><input type="radio" name="parallelImportYn" id="parallelImportYnY" value="Y" />Y</label>
+											<label class="rdoBtn"><input type="radio" name="parallelImportYn" id="parallelImportYnN" value="N"  checked="checked"/>N</label>
+										</td>
+										<th>주문제작여부</th>
+										<td>
+											<label class="rdoBtn"><input type="radio" name="orderMadeYn" id="orderMadeYnY" value="Y" />Y</label>
+											<label class="rdoBtn"><input type="radio" name="orderMadeYn" id="orderMadeYnN" value="N"  checked="checked"/>N</label>
+										</td>
+									</tr>
+									<tr>
+										<th>상품연령대</th>
+										<td>
+											<select  name="ageGrpCd" id="ageGrpCd">
+												<option value="">[선택]</option>
+												<option th:if="${ageGrpCdList}" th:each="oneData, status : ${ageGrpCdList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+											</select>
+										</td>
+										<th>선물 주문가능여부<em class="required" title="필수"></em></th>
+										<td colspan="3">
+											<label class="rdoBtn"><input type="radio" name="giftPackYn" id="giftPackYnY" value="Y" />Y</label>
+											<label class="rdoBtn"><input type="radio" name="giftPackYn" id="giftPackYnN" value="N" checked="checked"/>N</label>
+										</td>
+									</tr>
+									<tr id="selfGoodsNSellFeeRate">
+										<th>판매수수료율<em class="required" title="필수"></em></th>
+										<td><input type="text" class="w100 aR" id="sellFeeRate" name="sellFeeRate"  disabled="disabled" maxlength="10" data-valid-type="numeric" required="required" data-valid-name="판매수수료율"/> %
+										</td>
+										<th>과세구분<em class="required" title="필수"></em></th>
+										<td colspan="3">
+											<select name="taxGb" required="required" data-valid-name="과세구분">
+												<option value="">[선택]</option>
+												<option value="10">과세</option>
+												<option value="20">비과세</option>
+												<option value="30">면세</option>
+											</select>
+										</td>
+									</tr>
+									<tr>
+										<th>품목코드<em class="required" title="필수"></em></th>
+										<td colspan="3">
+											<select  name="itemkindCd" id="itemkindCd" required="required" data-valid-name="품목코드">
+												<option value="">[선택]</option>
+												<option th:if="${itemkindList}" th:each="oneData, status : ${itemkindList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+											</select>
+										</td>
+										<th>출고처<em class="required" title="필수"></em></th>
+										<td>
+											<select name="delvLocCd"  id="delvLocCd" required="required" data-valid-name="출고처">
+											</select>
+										</td>
+									</tr>
+									<tr>
+										<th>반품여부<em class="required" title="필수"></em></th>
+										<td>
+											<label class="rdoBtn"><input type="radio" name="returnableYn" id="returnableYnY" value="Y" checked="checked"/>Y</label>
+											<label class="rdoBtn"><input type="radio" name="returnableYn" id="returnableYnN" value="N"/>N</label>
+										</td>
+										<th>교환여부<em class="required" title="필수"></em></th>
+										<td colspan="3">
+											<label class="rdoBtn"><input type="radio" name="changeableYn" id="changeableYnY" value="Y" checked="checked"/>Y</label>
+											<label class="rdoBtn"><input type="radio" name="changeableYn" id="changeableYnN" value="N"/>N</label>
+										</td>
+									</tr>
+									<tr>
+										<th>배송비정책<em class="required" title="필수"></em></th>
+										<td>
+											<select name="delvFeeCd" required="required" data-valid-name="배송비정책">
+											</select>
+										</td>
+										<th>기본배송비</th>
+										<td>
+											<input type="text" class="w100 aR" id="delvFee" name="delvFee"  disabled="disabled"/> 원
+										</td>
+										<th>무료배송비기준</th>
+										<td>
+											<input type="text" class="w100 aR" id="minOrdAmt" name="minOrdAmt" disabled="disabled"/> 원
+										</td>
+									</tr>
+									<tr>
+										<th>최소주문수량<em class="required" title="필수"></em></th>
+										<td>
+											<input type="text" class="w100 aR" id="minOrdQty" name="minOrdQty" data-valid-type="integer" maxlength="5" value="1"  required="required" data-valid-name="최소주문수량"/>
+										</td>
+										<th>최대주문수량<em class="required" title="필수"></em></th>
+										<td>
+											<input type="text" class="w100 aR" id="maxOrdQty" name="maxOrdQty" data-valid-type="integer" maxlength="5" value="20" required="required" data-valid-name="최대주문수량"/>
+										</td>
+										<th>ID당1일최대구매수량<em class="required" title="필수"></em></th>
+										<td>
+											<input type="text" class="w100 aR" id="dayMaxOrdQty" name="dayMaxOrdQty" data-valid-type="integer" maxlength="5" value="20" required="required" data-valid-name="ID당1일최대구매수량"/>
+										</td>
+									</tr>
+									<tr>
+										<th>판매기간<em class="required" title="필수"></em></th>
+										<td colspan="5">
+											<input name="sellStYMD" id="sellStYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="판매시작일" />
+											<select name="sellStHH" id="sellStHH" required="required" data-valid-name="판매 시작시간">
+												<th:block th:each="num, index  : ${#numbers.sequence(0,23)}">
+												<option  th:value="${#numbers.formatInteger(num,2)}" th:text="|${#numbers.formatInteger(num,2)}시|" >시간</option>
+												</th:block>
+											</select>
+											~
+											<input name="sellEdYMD" id="sellEdYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="판매 종료일" />
+											<select name="sellEdHH" id="sellEdHH" required="required" data-valid-name="판매 종료시간">
+												<th:block th:each="num: ${#numbers.sequence(0,23)}">
+												<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="${#numbers.formatInteger(num,2)}==23 ? 'true'">시간</option>
+												</th:block>
+											</select>
+										</td>
+									</tr>
+									</tbody>
+								</table>
+							</div>
+							<!-- //TAB1  CONTENTS AREA -->
+						</li>
+						<!-- //TAB1 -->
+						<li class="tab" id="goodstab3">
+							<!-- TAB3 CONTENTS AREA -->
+							<div class="panelStyle">
+								<!-- TABS SPACE -->
+								<div class="tabsJr">
+									<!-- TABS NAVI -->
+									<ul class="tabsJrNav">
+										<li class="on"><a href="#goodstab11">타이틀/내용/특징</a></li>
+										<li><a href="#goodstab12">상세html</a></li>
+									</ul>
+									<!-- //TABS NAVI -->
+									<!-- TABS CONTENT -->
+									<ul class="tabsJrCont">
+										<!-- TAB11 CONTENTS AREA -->
+										<!-- TAB -->
+										<li class="tabJr on" id="goodstab11">
+											<div class="panelStyle">
+											<!-- TAB11 CONTENTS AREA -->
+											<table class="frmStyle">
+											<colgroup>
+												<col width="12%"/>
+												<col/>
+											</colgroup>
+											<tr>
+												<th>타이틀</th>
+												<td class="padT10"><input type="text" class= "w100p" id="goodsTitlesDesc" name="goodsTitlesDesc" maxlength="100" />
+												</td>
+											</tr>
+											<tr>
+												<th>내용</th>
+												<td class="padT10"><div class="tabJrContArea">
+													<textarea class="textareaR3 summernote" name="goodsContentsDesc" id="goodsContentsDesc"></textarea>
+													</div>
+												</td>
+											</tr>
+											<tr>
+												<th>상품 특징</th>
+												<td class="padT10"><div class="tabJrContArea">
+													<textarea class="textareaR3 summernote" name="goodsCharacterDesc" id="goodsCharacterDesc"></textarea>
+													</div>
+												</td>
+											</tr>
+											</table>
+											</div>
+										</li>
+										<li class="tabJr" id="goodstab12">
+											<div class="panelStyle">
+												<!-- TAB11 CONTENTS AREA -->
+												<table class="frmStyle">
+											<colgroup>
+												<col width="12%"/>
+												<col/>
+											</colgroup>
+											<tr>
+												<th>상품상세</th>
+												<td class="padT10"><div class="tabJrContArea">
+													<textarea class="textareaR4 summernote" name="goodsDesc" id="goodsDesc"></textarea>
+													</div>
+												</td>
+											</tr>
+											<tr>
+												<th>상위(PC)</th>
+												<td class="padT10"><div class="tabJrContArea">
+													<textarea class="textareaR4 summernote" name="goodsPcTopDesc" id="goodsPcTopDesc"></textarea>
+													</div>
+												</td>
+											</tr>
+											<tr>
+												<th>상위(MOBILE)</th>
+												<td class="padT10"><div class="tabJrContArea">
+													<textarea class="textareaR4 summernote" name="goodsMobileTopDesc" id="goodsMobileTopDesc"></textarea>
+													</div>
+												</td>
+											</tr>
+											<tr>
+												<th>하위(PC)</th>
+												<td class="padT10"><div class="tabJrContArea">
+													<textarea class="textareaR4 summernote" name="goodsPcDownDesc" id="goodsPcDownDesc"></textarea>
+													</div>
+												</td>
+											</tr>
+											<tr>
+												<th>하위(MOBILE)</th>
+												<td class="padT10"><div class="tabJrContArea">
+													<textarea class="textareaR4 summernote" name="goodsMobileDownDesc" id="goodsMobileDownDesc"></textarea>
+													</div>
+												</td>
+											</tr>
+											</table>
+											</div>
+										</li>
+										<!-- //TAB -->
+									</ul>
+									<!-- //TAB CONTENT -->
+								</div>
+								<!-- //TABS SPACE -->
+							</div>
+							<!-- //TAB3 CONTENTS AREA -->
+						</li>
+						<!-- //TAB3 : 상품상세 -->
+						<!-- TAB4 : 고시정보 -->
+						<li class="tab" id="goodstab4">
+							<!-- TAB5 CONTENTS AREA -->
+							<div class="panelStyle">
+								<!-- TABS SPACE -->
+								<table class="frmStyle">
+									<colgroup>
+										<col style="width:15%"/>
+										<col/>
+									</colgroup>
+									<tr>
+										<th>고시분류<em class="required" title="필수"></em></th>
+										<td>
+											<select id="niClsfCd" name="niClsfCd"  class="w40p">
+												<option value="">[선택]</option>
+												<option th:if="${niClsfCdList}" th:each="oneData, status : ${niClsfCdList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+											</select>
+											<button type="button" class="btn btn-dark btn-lg" id="btnNotinfo">선택</button>
+											<span class="padL10" id='itemkindNoti'></span>
+										</td>
+									</tr>
+								</table>
+								<hr/>
+								<div id="notiArea"></div>
+								<!-- //TABS SPACE -->
+							</div>
+							<!-- //TAB4 CONTENTS AREA -->
+						</li>
+						<!-- //TAB4 : 고시정보 -->
+					</ul>
+					<!-- //TABS CONTENTS -->
+					
+				</div>
+				<!-- //TABS SPACE -->
+			</div>	<!--  class=panelContent -->	
+		</div>	<!--  class=panelStyle -->	
+			</form>
+		
+	</div>
+<script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020103001"></script>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.summernote.js?v=2021053101"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	//상품명 길이표시
+	$("#goodsDetailForm input[name=goodsNm]").bind('focus focusout input keyup keydown paste change', function () {
+		fnDataLengthCheck('goodsNm',200);
+	});
+
+	//상품타이틀 길이표시
+	$("#goodsDetailForm input[name=goodsTnm]").bind('focus focusout input keyup keydown paste change', function () {
+		fnDataLengthCheck('goodsTnm',100);
+	});
+	
+	//사용자검색어 길이표시
+	$("#goodsDetailForm input[name=goodsSnm1]").bind('focus focusout input keyup keydown paste change', function () {
+		fnDataLengthCheck('goodsSnm1',200);
+	});
+
+	//데이터 길이 확인
+	var fnDataLengthCheck = function(id , maxByte){
+		var maximumByte = maxByte;
+		var strLenEng = $('#goodsDetailForm').find('#'+id).val().length;
+		var cbyteStr = 0;
+		var liLenStr = 0;
+		for (i = 0; i < strLenEng; i++) {
+			var lsOneChar = $('#goodsDetailForm').find('#'+id).val().charAt(i);
+			if (lsOneChar == "\n" || lsOneChar == "\'") {
+				cbyteStr += 5; //엔터면 5를 더한다
+			} else if (lsOneChar == "\"") {
+				cbyteStr += 6; //쌍따옴표면 6를 더한다
+			} else if (escape(lsOneChar).length > 4) {
+				cbyteStr += 3; //한글이면 3를 더한다
+			} else {
+				cbyteStr++; //한글아니면 1을 다한다
+			}
+			if (cbyteStr <= maximumByte) {
+				liLenStr = i + 1;
+			}
+		}
+
+		// 사용자가 입력한 값이 제한 값을 초과하는지를 검사한다.
+		if (parseInt(cbyteStr) > parseInt(maximumByte)) {
+			mcxDialog.alertC('허용된 글자수가 초과되었습니다.\n초과된 부분은 자동으로 삭제됩니다.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#goodsDetailForm').find('#'+id).focus();
+				}
+			});
+			var str = $('#goodsDetailForm').find('#'+id).val().substr(0, liLenStr);
+			$('#goodsDetailForm').find('#'+id).val(str);
+			var cbyteStr = 0;
+			for (i = 0; i < $('#goodsDetailForm').find('#'+id).val().length; i++) {
+				var lsOneChar = $('#goodsDetailForm').find('#'+id).val().charAt(i);
+				if (lsOneChar == "\n" || lsOneChar == "\'") {
+					cbyteStr += 5; //엔터면 5를 더한다
+				} else if (lsOneChar == "\"") {
+					cbyteStr += 6; //쌍따옴표면 6를 더한다
+				} else if (escape(lsOneChar).length > 4) {
+					cbyteStr += 3; //한글이면 3를 더한다
+				} else {
+					cbyteStr++; //한글아니면 1을 다한다
+				}
+			}
+		}
+
+		$('#goodsDetailForm').find('#'+id+'Len').text(cbyteStr);
+	}
+	
+	//업체변경시
+	$('#goodsDetailForm select[name=supplyCompCd]').on('change', function() {
+		var supplyCompCd = $(this).val();
+		// 하위 브랜드
+		$("#goodsDetailForm select[name=brandCd] option:gt(0)").remove();
+		cfnCreateCombo("/renderer/supplyCompany/brand/list/" + supplyCompCd, $('#goodsDetailForm select[name=brandCd]'), "[선택]", '');
+		
+		//판매수수료율
+		var data = {supplyCompCd : supplyCompCd};
+		var jsonData = JSON.stringify(data);
+		gagajf.ajaxJsonSubmit('/business/supply/company/list', jsonData, function(result) {
+			if (result != null){
+				$("#goodsDetailForm input[name=sellFeeRate]").val(result[0].sellFeeRate); 
+			}
+		});
+		
+		//배송지 정책
+		$("#goodsDetailForm select[name=delvFeeCd] option:gt(0)").remove();
+		cfnCreateCombo("/renderer/delvFee/list/" + supplyCompCd, $('#goodsDetailForm select[name=delvFeeCd]'), "[선택]", '');
+		
+		//출고처
+		$("#goodsDetailForm select[name=delvLocCd] option:gt(0)").remove();
+		cfnCreateCombo("/renderer/delvLoc/list/" + supplyCompCd, $('#goodsDetailForm select[name=delvLocCd]'), "[선택]", '');
+		
+	});
+	
+	//브랜드변경시
+	$('#goodsDetailForm select[name=brandCd]').on('change', function() {
+		var brandCd = $(this).val();
+		//판매수수료율
+		//포인트 적용
+		var params = new Object();
+		params.brandCd = brandCd;
+		cfnAjaxSubmit("/business/brand/list", "json", fnBrandCallback, params);
+			
+	});	
+	
+	// 브랜드
+	var fnBrandCallback = function(result){
+		if (result != null){
+			$("#goodsDetailForm select[name=distributionGb]").val(result[0].distributionGb); 
+		}
+	}
+	
+	//배송비정책변경시
+	$('#goodsDetailForm select[name=delvFeeCd]').on('change', function() {
+		var delvFeeCd = $("#goodsDetailForm select[name=delvFeeCd]").val();
+		
+		if (gagajf.isNull(delvFeeCd)){
+			$("#goodsDetailForm input[name=delvFee]").val('');
+			$("#goodsDetailForm input[name=minOrdAmt]").val('');
+		}else{
+			var arrDelvFeeed = $('#goodsDetailForm select[name=delvFeeCd] option:selected').text().split('/');
+			$("#goodsDetailForm input[name=delvFee]").val(arrDelvFeeed[1].addComma());
+			var minOrdAmt = arrDelvFeeed[0].split(']');
+			$("#goodsDetailForm input[name=minOrdAmt]").val(minOrdAmt[1].addComma());
+		}
+	});	
+	
+	//품목코드변경시
+	$('#goodsDetailForm select[name=itemkindCd]').on('change', function() {
+		var itemkindCd = $("#goodsDetailForm select[name=itemkindCd]").val();
+		var params = new Object();
+		params.itemkindCd = itemkindCd;
+		cfnAjaxSubmit("/goods/itemkind/list", "json", fnItemkindCallback, params);
+		
+	});	
+	
+	var fnItemkindCallback = function(result){
+		if (result == null) return;
+		$("#goodsDetailForm input[name=safeNiClsfCd]").val(result[0].niClsfCd)
+	}
+	
+	// 상품 고시 선택 버튼 클릭 시
+	$('#btnNotinfo').click(function(e) {
+
+		if(gagajf.isNull($("#goodsDetailForm select[name=niClsfCd]").val())) {
+			mcxDialog.alertC("상품정보제공 고시를 선택해주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm select[name=niClsfCd]").focus();
+				}
+			});
+			return false;
+		}
+
+		var params = new Object();
+		params.supplyCompCd = $("#goodsDetailForm input[name=supplyCompCd]").val();
+		params.niClsfCd = $("#goodsDetailForm select[name=niClsfCd]").val();
+		cfnAjaxSubmit("/goods/notiInfo/list", "json", fnGoodsDetailNotiInfoSearchCallback, params);
+
+	});
+	
+	//정보고시 콜백
+	var fnGoodsDetailNotiInfoSearchCallback = function(result) {
+		if (result == null) return;
+
+		var notiHtml = "";
+		var idx = 0;
+		$('#goodsDetailForm').find('#notiArea').html('');
+		notiHtml += '<table class="frmStyle">';
+		notiHtml += '<colgroup><col style="width:20%"/><col/></colgroup>';
+		notiHtml += '<tbody id="infoContents">\n';
+		notiHtml += '<tr><th>고시항목</th><th>고시내용</th></tr>';
+		result.forEach(function(info){
+			notiHtml += '<tr><th>'+ gagajf.convNull(info.niItemNm, '') +'<input type="hidden" name="niItemCd" value="'+ gagajf.convNull(info.niItemCd, '') +'" />\n<input type="hidden" name="dispOrd" value="'+ gagajf.convNull(info.dispOrd, '') +'" /></th>';
+			notiHtml += '<td><input type="text" name="niContent" value="'+ gagajf.convNull(info.niContent, '') +'"/></td>\n';
+			notiHtml += '</tr>\n';
+		});
+		notiHtml += '</tbody></table>';
+
+		$('#goodsDetailForm').find('#notiArea').append(notiHtml);
+	}
+
+	//상품저장 버튼 클릭 시
+	$('#btnGoodsDetailSave').click(function() {
+
+		var optCheck = false;
+		var idx = 0;
+		var formId = '#goodsDetailForm';
+		
+		// 입력 값 체크
+		if (!gagajf.validation(formId))
+			return false;
+
+		// 주문수량
+		if (Number($("#goodsDetailForm input[name=minOrdQty]").val()) <= 0) {
+			mcxDialog.alertC("최소주문 수량을 입력해 주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=minOrdQty]").focus();
+				}
+			});
+			return false;
+		}
+		if (Number($("#goodsDetailForm input[name=maxOrdQty]").val()) <= 0) {
+			mcxDialog.alertC("최대주문 수량을 입력해 주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=maxOrdQty]").focus();
+				}
+			});
+			return false;
+		}
+		if (Number($("#goodsDetailForm input[name=dayMaxOrdQty]").val()) <= 0) {
+			mcxDialog.alertC("ID당1일최대구매 수량을 입력해 주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=dayMaxOrdQty]").focus();
+				}
+			});
+			return false;
+		}
+
+		if(Number($("#goodsDetailForm input[name=minOrdQty]").val()) > Number($("#goodsDetailForm input[name=maxOrdQty]").val())){
+			mcxDialog.alertC("최소주문수량은 최대주문수량보다 클 수 없습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=minOrdQty]").focus();
+				}
+			});
+			return false;
+		}
+		
+		if(Number($("#goodsDetailForm input[name=maxOrdQty]").val()) > Number($("#goodsDetailForm input[name=dayMaxOrdQty]").val())){
+			mcxDialog.alertC("최대주문수량이 ID당1일최대구매수량보다 클 수 없습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=maxOrdQty]").focus();
+				}
+			});
+			return false;
+		}
+
+		if(isNaN(Date.parse($("#goodsDetailForm input[name=sellStYMD]").val()))){
+			mcxDialog.alertC('날짜형식이 아닙니다.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDealForm input[name=sellStYMD]").focus();
+				}
+			});	
+			return false;
+		}
+		
+		if(isNaN(Date.parse($("#goodsDetailForm input[name=sellEdYMD]").val()))){
+			mcxDialog.alertC('날짜형식이 아닙니다.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDealForm input[name=sellEdYMD]").focus();
+				}
+			});	
+			return false;
+		}
+	
+		idx = 0;
+		
+		//고시정보가 등록되지 않은 상품 체크
+		if($("#goodsDetailForm #notiArea").find("#infoContents tr").length == 0){
+			mcxDialog.alert("고시정보를 입력해 주세요");
+			return false;
+		}
+		
+		idx = 0;
+		//고시정보 필수나 전시표시값 입력여부 확인
+		$("#goodsDetailForm #notiArea").find("#infoContents tr").each(function() {
+			if (typeof($(this).find("td input[name=niContent]").val()) != 'undefined' && gagajf.isNull($(this).find("td input[name=niContent]").val())){
+				optCheck = true;
+				mcxDialog.alertC("고시정보를 입력해주세요.");
+				return false;
+			}
+
+			idx++;
+		});
+		
+		if(optCheck) {
+			return false;
+		}
+		
+		fnGoodsSave();
+		
+	});
+	
+	//고시정보 저장을 위한 데이터 처리
+	var fnGoodsDeailNotiSave = function(){
+
+		var goodsCd = $('#goodsDetailForm input[name=goodsCd]').val();
+		var goodsInfoList = [];
+
+		var index = 0;
+		$("#goodsDetailForm").find("#infoContents tr").each(function() {
+			if (index > 0){
+				var goodsInfo = {goodsCd: goodsCd
+						, niClsfCd : $('#goodsDetailForm select[name=niClsfCd]').val()
+						, niItemCd : $(this).find("input[name=niItemCd]").val()
+						, niContent : $(this).find("input[name=niContent]").val()
+						, dispOrd : $(this).find("input[name=dispOrd]").val()
+						};
+				goodsInfoList.push(goodsInfo);	
+			}
+			index++;
+		});
+
+		$("#goodsDetailForm input[name=notiList]").val(JSON.stringify(goodsInfoList));
+	}
+
+	
+	//저장처리
+	var fnGoodsSave = function(){
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+
+				fnGoodsDeailNotiSave();
+			
+				$('#goodsDetailForm input[name=goodsNm]').val($('#goodsDetailForm input[name=goodsNm]').val().trim().replace(/\n|\r/g, "<br/>").replace(/\"/gi, "&quot;").replace(/\'/gi, "&#39;"));
+				$('#goodsDetailForm input[name=goodsTnm]').val($('#goodsDetailForm input[name=goodsTnm]').val().trim().replace(/\n|\r/g, "<br/>").replace(/\"/gi, "&quot;").replace(/\'/gi, "&#39;"));
+				$('#goodsDetailForm input[name=goodsSnm1]').val($('#goodsDetailForm input[name=goodsSnm1]').val().trim().replace(/\n|\r/g, "<br/>").replace(/\"/gi, "&quot;").replace(/\'/gi, "&#39;"));
+	
+				gagajf.ajaxFormSubmit("/goods/salf/detail/create", "#goodsDetailForm", fnGoodsSaveCallBack); 
+			}
+		});
+	}
+	
+	//저장후 callback
+	var fnGoodsSaveCallBack = function(result){
+		mcxDialog.alert("등록상품 코드 : "+ result.goodsCd);
+		fnClickLnb('A2021'); // -- 메뉴 클릭
+	}
+	
+	
+	$(document).ready(function() {
+		
+		// 판매일자 설정
+		var date = new Date();
+		$('#goodsDetailForm  input[name=sellStYMD]').val(date.format("YYYY-MM-DD"));
+		$('#goodsDetailForm  input[name=sellEdYMD]').val("2030-12-31");
+		
+		// Create a summernote
+//		var snOptions1 = gagaSn.getToolbarOptions('media');
+//		var snOptions2 = gagaSn.getToolbarOptions('media');
+		var snOptions3 = gagaSn.getToolbarOptions('media');
+		var snOptions4 = gagaSn.getToolbarOptions('media');
+		var snOptions5 = gagaSn.getToolbarOptions('media');
+		var snOptions6 = gagaSn.getToolbarOptions('media');
+		var snOptions7 = gagaSn.getToolbarOptions('media');
+//		gagaSn.createSummernote(snOptions1, '#goodsContentsDesc');
+//		gagaSn.createSummernote(snOptions2, '#goodsCharacterDesc');
+		gagaSn.createSummernote(snOptions3, '#goodsDesc');
+		gagaSn.createSummernote(snOptions4, '#goodsPcTopDesc');
+		gagaSn.createSummernote(snOptions5, '#goodsMobileTopDesc');
+		gagaSn.createSummernote(snOptions6, '#goodsPcDownDesc');
+		gagaSn.createSummernote(snOptions7, '#goodsMobileDownDesc');
+	});
+	
+/*]]>*/
+</script>
+</html>