Przeglądaj źródła

Merge remote-tracking branch 'origin/develop' into xodud1202

xodud1202 5 lat temu
rodzic
commit
be8e387026

+ 59 - 39
src/main/java/com/style24/persistence/mybatis/shop/TssBusiness.xml

@@ -5,56 +5,76 @@
 	<!-- 공급업체 목록 -->
 	<select id="getSupplyCompanyList" parameterType="SupplyCompany" resultType="SupplyCompany">
 		/* TssBusiness.getSupplyCompanyList */
-		SELECT SUPPLY_COMP_CD       /*공급업체코드*/
-		     , SUPPLY_COMP_NM       /*공급업체명*/
-		     , BIZ_GB               /*사업자구분*/
-		     , BIZ_NO               /*사업자등록번호*/
-		     , BIZ_KIND             /*업종*/
-		     , BIZ_TYPE             /*업태*/
-		     , OWNER_NM             /*대표자명*/
-		     , BIZ_ZIPCODE          /*사업장우편번호*/
-		     , BIZ_BASE_ADDR        /*사업장기본주소*/
-		     , BIZ_DTL_ADDR         /*사업장상세주소*/
-		     , MAIN_TELNO           /*대표전화번호*/
-		     , MAIN_FAXNO           /*대표팩스번호*/
-		     , HOMEPAGE_URL         /*홈페이지URL*/
-		     , DISTRIBUTION_GB      /*유통구분*/
-		     , SHOT_DELV_YN         /*총알배송여부*/
-		     , SUPPLY_STAT          /*입점상태*/
-		     , MIN_ORD_AMT          /*무료배송비최소주문금액*/
-		     , DELV_FEE             /*배송비*/
-		     , SELL_FEE_RATE        /*판매수수료율*/
-		     , SETTLE_DAY           /*정산일*/
-		     , BANK_CD              /*은행코드*/
-		     , ACCOUNT_NO           /*계좌번호*/
-		     , DEPOSITOR_NM         /*예금주명*/
-		     , CS_CHARGE_NM         /*CS담당자명*/
-		     , CS_CHARGE_TELNO      /*CS담당자전화번호*/
-		     , SETTLE_CHARGE_NM     /*정산담당자명*/
-		     , SETTLE_CHARGE_TELNO  /*정산담당자전화번호*/
-		     , SETTLE_CHARGE_EMAIL  /*정산담당자이메일*/
-		     , BILL_EMAIL           /*계산서이메일*/
-		     , ECONTRACT_YN         /*전자계약여부*/
-		     , REMARKS              /*비고*/
-		     , USE_YN               /*사용여부*/
-		FROM   TB_SUPPLY_COMPANY
-		WHERE  1 = 1
+		SELECT SC.SUPPLY_COMP_CD                                       /*공급업체코드*/
+		     , SC.SUPPLY_COMP_NM                                       /*공급업체명*/
+		     , SC.SUPPLY_VENDOR_CD                                     /*공급벤더코드*/
+		     , SV.SUPPLY_VENDOR_NM                                     /*공급벤더명*/
+		     , SV.BIZ_GB                                               /*사업자구분*/
+		     , SV.BIZ_NO                                               /*사업자등록번호*/
+		     , SV.BIZ_KIND                                             /*업종*/
+		     , SV.BIZ_TYPE                                             /*업태*/
+		     , SV.OWNER_NM                                             /*대표자명*/
+		     , SV.BIZ_ZIPCODE                                          /*사업장우편번호*/
+		     , SV.BIZ_BASE_ADDR                                        /*사업장기본주소*/
+		     , SV.BIZ_DTL_ADDR                                         /*사업장상세주소*/
+		     , SV.MAIN_TELNO                                           /*대표전화번호*/
+		     , SV.MAIN_FAXNO                                           /*대표팩스번호*/
+		     , SV.HOMEPAGE_URL                                         /*홈페이지URL*/
+		     , SC.DISTRIBUTION_GB                                      /*유통구분*/
+		     , SC.SHOT_DELV_YN                                         /*총알배송여부*/
+		     , SC.SUPPLY_STAT                                          /*입점상태*/
+		     , FN_GET_CODE_NM('G010',SC.SUPPLY_STAT) AS SUPPLY_STAT_NM /*입점상태명*/
+		     , SC.SELL_FEE_RATE                                        /*판매수수료율*/
+		     , SC.SETTLE_DAY                                           /*정산일*/
+		     , SC.BANK_CD                                              /*은행코드*/
+		     , SC.ACCOUNT_NO                                           /*계좌번호*/
+		     , SC.DEPOSITOR_NM                                         /*예금주명*/
+		     , SC.CS_CHARGE_NM                                         /*CS담당자명*/
+		     , SC.CS_CHARGE_TELNO                                      /*CS담당자전화번호*/
+		     , SC.SETTLE_CHARGE_NM                                     /*정산담당자명*/
+		     , SC.SETTLE_CHARGE_TELNO                                  /*정산담당자전화번호*/
+		     , SC.SETTLE_CHARGE_EMAIL                                  /*정산담당자이메일*/
+		     , SC.BILL_EMAIL                                           /*계산서이메일*/
+		     , SC.ECONTRACT_YN                                         /*전자계약여부*/
+		     , SC.REMARKS                                              /*비고*/
+		     , SC.USE_YN                                               /*사용여부*/
+		     , SC.NOTE                                                 /*배송안내*/
+		FROM   TB_SUPPLY_COMPANY SC
+		     , TB_SUPPLY_VENDOR SV
+		WHERE  SC.SUPPLY_VENDOR_CD = SV.SUPPLY_VENDOR_CD
 		<if test="supplyStat != null and supplyStat != ''">
-		AND    SUPPLY_STAT = #{supplyStat}
+		AND    SC.SUPPLY_STAT = #{supplyStat}
 		</if>
 		<if test="searchTxt != null and searchTxt != ''">
 		    <if test='searchGb == "NAME"'>
-		AND    UPPER(SUPPLY_COMP_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		AND    (
+		        UPPER(SC.SUPPLY_COMP_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		        OR
+		        UPPER(SV.SUPPLY_VENDOR_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		       )
 		    </if>
 		    <if test='searchGb == "OWNER"'>
-		AND    UPPER(OWNER_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		AND    UPPER(SV.OWNER_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
 		    </if>
 		</if>
 		<if test="econtractYn != null and econtractYn != ''">
-		AND    ECONTRACT_YN = #{econtractYn}
+		AND    SC.ECONTRACT_YN = #{econtractYn}
+		</if>
+		<if test="supplyCompCd != null and supplyCompCd != ''"> <!-- 브랜드관리 화면에서 사용 -->
+		AND    SC.SUPPLY_COMP_CD = #{supplyCompCd}
+		</if>
+		<if test='selfYn != null and (selfYn == "Y" or selfYn == "N")'>
+		<choose>
+		    <when test='selfYn  == "Y"'>
+		AND    SC.DISTRIBUTION_GB IN ('G065_10','G065_11','G065_12') 
+		    </when>
+		    <otherwise>
+		AND    SC.DISTRIBUTION_GB IN ('G065_20')
+		    </otherwise>
+		</choose>
 		</if>
 		<if test="supplyCompCd != null and supplyCompCd != ''"> <!-- 브랜드관리 화면에서 사용 -->
-		AND    SUPPLY_COMP_CD = #{supplyCompCd}
+		AND    SC.SUPPLY_COMP_CD = #{supplyCompCd}
 		</if>
 	</select>
 	

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

@@ -567,7 +567,7 @@
 		     , G.ERP_PRICE_LINK_YN
 		     , G.NEW_CUST_ORD_YN
 		     , G.ADULT_YN
-		     , FN_GET_CODE_NM('G076', G.ORIGIN_CD) AS MAKE_NM
+		     , FN_GET_CODE_NM('G076', G.ORIGIN_CD) AS ORIGIN_NM
 		     , G.ORIGIN_CD
 		     , G.MAKE_YMD
 		     , G.TAX_GB
@@ -1081,20 +1081,20 @@
 		SELECT #{goodsCd} AS GOODS_CD
 		     , A.GOODS_CD AS COMPS_GOODS_CD
 		     , A.OPT_CD
-		     , CONCAT(A.OPT_CD1,  COALESCE(A.OPT_CD2, '', CONCAT('/', A.OPT_CD2))) AS OPT_NM 
 		     , A.OPT_CD1
 		     , A.OPT_CD2
 		     , A.ADD_PRICE
 		     , A.BASE_STOCK_QTY
 		     , A.CURR_STOCK_QTY
-		     , IFNULL(B.STOCK_QTY,0) AS SALE_STOCK_QTY
-		     , GREATEST(GREATEST(A.CURR_STOCK_QTY - A.BASE_STOCK_QTY, 0) - IFNULL(B.STOCK_QTY, 0), 0) AS ABLE_STOCK_QTY
+		     , A.STORE_STOCK_QTY
+		     , IFNULL(B.STOCK_QTY,0) AS SALE_STOCK_QTY  /*출고대기*/
+		     , GREATEST(GREATEST((GREATEST(A.CURR_STOCK_QTY,0) + GREATEST(A.STORE_STOCK_QTY,0)) - A.BASE_STOCK_QTY, 0) - IFNULL(B.STOCK_QTY, 0), 0) AS ABLE_STOCK_QTY  /*판매가능재고*/
 		     , A.SOLDOUT_YN
 		     , A.DISP_ORD
 		     , A.DISP_YN
 		     , C.DISP_ORD AS GOODS_ORD
 		     , COUNT(*) OVER(PARTITION BY A.GOODS_CD ) AS RCOUNT
-		     , ROW_NUMBER() OVER(PARTITION BY A.GOODS_CD ORDER BY A.DISP_ORD, A.OPT_CD1, A.OPT_CD2) AS RNUM
+		     , ROW_NUMBER() OVER(PARTITION BY A.GOODS_CD ORDER BY C.DISP_ORD, A.DISP_ORD, A.OPT_CD1, A.OPT_CD2) AS RNUM
 		FROM  TMP_GOODS C 
 		INNER JOIN TB_OPTION A ON C.COMPS_GOODS_CD = A.GOODS_CD 
 		LEFT OUTER JOIN (
@@ -1205,8 +1205,8 @@
 		  , #{costPrice}
 		  , #{dcRate}
 		  , #{goodsStat}
-		  , STR_TO_DATE(#{sellStdt}},'%Y%m%d%H%i%S')
-		  , STR_TO_DATE(#{sellEddt}},'%Y%m%d%H%i%S')
+		  , STR_TO_DATE(#{sellStdt},'%Y%m%d%H%i%S')
+		  , STR_TO_DATE(#{sellEddt},'%Y%m%d%H%i%S')
 		  , IFNULL(#{selfMallYn},'Y') 
 		  , #{goodsGb}
 		  , #{distributionGb}

+ 183 - 7
src/main/java/com/style24/scm/biz/service/TssGoodsService.java

@@ -35,6 +35,7 @@ import com.style24.persistence.domain.Notice;
 import com.style24.persistence.domain.NoticeGoods;
 import com.style24.persistence.domain.Option;
 import com.style24.persistence.domain.SearchData;
+import com.style24.persistence.domain.SupplyCompany;
 import com.style24.persistence.domain.WmsGoods;
 import com.style24.scm.biz.dao.TssGoodsDao;
 import com.style24.scm.support.env.TssConstants;
@@ -92,6 +93,8 @@ public class TssGoodsService {
 	private ObjectMapper mapper;
 
 	private static final String NUMBER_PATTERN = "^[0-9]+$";
+	
+	private static final String ALPHA_NUMERIC = "^[a-zA-Z0-9]$";
 
 	private static final String UPDATE_NO_PATTERN = "X";
 
@@ -915,6 +918,7 @@ public class TssGoodsService {
 		if (goods.getNotiListNew() != null && !goods.getNotiListNew().isEmpty()) {
 			index = 0;
 			for (GoodsNotiInfo goodsNotiInfo : goods.getNotiListNew()) {
+				goodsNotiInfo.setGoodsCd(goods.getGoodsCd());
 				if (index == 0) {
 					goodsDao.deleteGoodsNotiInfo(goods);
 				}
@@ -1503,19 +1507,28 @@ public class TssGoodsService {
 		goods.setPntPrate(pntPrate); // 포인트적립율(PC)
 		goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
 
-		goods.setSellFeeRate(sellFeeRate); // 판매수수료율
-
 		// 업체코드 조회
-
 		Collection<Brand> brandSupplyList = businessService.getBrandSupplyList(goods.getBrandCd());
 		String supplyCompCd = brandSupplyList.iterator().next().getSupplyCompCd();
 		goods.setSupplyCompCd(supplyCompCd); // 업체코드
 		goodsMass.setSupplyCompCd(supplyCompCd); // 업체 코드
+		
+		// 판매수수료율
+		SupplyCompany supplyCompany = new SupplyCompany();
+		supplyCompany.setSupplyCompCd(goods.getSupplyCompCd());
+		Collection<SupplyCompany> supplyCompanyList = businessService.getSupplyCompanyList(supplyCompany);
+		if (supplyCompanyList == null || supplyCompanyList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("상품의 업체 판매수수율를 확인해 주세요."));
+		}
+		
+		goods.setSellFeeRate(supplyCompanyList.iterator().next().getSellFeeRate()); // 판매수수료율
 
 		// 배송비 정책 적용
 		Collection<CommonCode> supplyDeliveryFeePolicyList = rendererService.getSupplyDeliveryFeePolicyList(goods.getSupplyCompCd());
 		if (supplyDeliveryFeePolicyList != null && !supplyDeliveryFeePolicyList.isEmpty()) {
 			goods.setDelvFeeCd(supplyDeliveryFeePolicyList.iterator().next().getCd());
+		}else {
+			throw new IllegalStateException(message.getMessage("상품의 업체 배송비정책을 확인해 주세요."));
 		}
 
 		// 원산지 / 제조국
@@ -1950,6 +1963,13 @@ public class TssGoodsService {
 			goods.setGoodsStat("10");
 			return goods;
 		}
+		
+		if (!GagaStringUtil.replace(goodsMass.getSupplyGoodsCd().trim(), ",", "").matches(ALPHA_NUMERIC)) {
+			goods.setGoodsRegMsg("공급업체 상품코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		
 		goods.setSupplyGoodsCd(goodsMass.getSupplyGoodsCd().trim().toUpperCase());
 
 		if (StringUtils.isBlank(goodsMass.getSupplyCompCd())) {
@@ -2137,7 +2157,7 @@ public class TssGoodsService {
 
 		float pntPrate = 0f;
 		float pntMrate = 0f;
-		float sellFeeRate = 0f;
+		
 		for (Brand tmpBrand : brandList) {
 			if ("G009_10".equals(goods.getFormalGb())) {
 				pntPrate = tmpBrand.getPntPrate10();
@@ -2146,12 +2166,43 @@ public class TssGoodsService {
 				pntPrate = tmpBrand.getPntPrate20();
 				pntMrate = tmpBrand.getPntMrate20();
 			}
-			sellFeeRate = tmpBrand.getSellFeeRate();	//판매수수료율
-		}
+				}
 		goods.setPntPrate(pntPrate); // 포인트적립율(PC)
 		goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
-		goods.setSellFeeRate(sellFeeRate); // 판매수수료율
+		
+		// 판매수수료율
+		SupplyCompany supplyCompany = new SupplyCompany();
+		supplyCompany.setSupplyCompCd(goods.getSupplyCompCd());
+		Collection<SupplyCompany> supplyCompanyList = businessService.getSupplyCompanyList(supplyCompany);
+		if (supplyCompanyList == null || supplyCompanyList.isEmpty()) {
+			goods.setGoodsRegMsg("업체 판매수수율를 확인");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		
+		goods.setSellFeeRate(supplyCompanyList.iterator().next().getSellFeeRate()); // 판매수수료율
 
+		// 배송비 정책 적용
+		boolean deliveryFolicy = false;
+		Collection<CommonCode> supplyDeliveryFeePolicyList = rendererService.getSupplyDeliveryFeePolicyList(goods.getSupplyCompCd());
+		if (supplyDeliveryFeePolicyList != null && !supplyDeliveryFeePolicyList.isEmpty()) {
+			for(CommonCode supplyDeliveryFeePolicy: supplyDeliveryFeePolicyList) {
+				if (goodsMass.getDelvFeeCd().equals(supplyDeliveryFeePolicy.getCd())) {
+					deliveryFolicy = true;
+					break;
+				}
+			}
+			if (!deliveryFolicy) {
+				goods.setGoodsRegMsg("배송비정책 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}else {
+			goods.setGoodsRegMsg("배송비정책 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		
 		// 배송비 정책
 		goods.setDelvFeeCd(goodsMass.getDelvFeeCd()); // 화면에서 받은값
 
@@ -3385,4 +3436,129 @@ public class TssGoodsService {
 		}
 	}
 
+	
+	/**
+	 * 상품정보고시 항목 목록
+	 * 
+	 * @param
+	 * @throws 
+	 * @author eskim
+	 * @since 2021. 04. 21
+	 */
+	public Collection<NotiInfo> getNotiInfoItemList(NotiInfo notiInfo) {
+		return goodsDao.getNotiInfoItemList(notiInfo);
+	}
+
+	/**
+	 * 입점 상품 등록
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 04. 21
+	 */
+	@Transactional("shopTxnManager")
+	public void createGoodsDetail(Goods goods) {
+
+		// 중복여부 확인
+		Goods goodsDup = goodsDao.getGoods(goods);
+		if (goodsDup != null) {
+			throw new IllegalStateException("업체상품코드 중복요청입니다.");
+		}
+		
+		log.info("[createGoodsDetail 11] goods=>{}", goods);
+		// 상품코드 생성
+		goods.setGoodsCd(this.getGoodsCodeSeq("E", goods.getBrandCd())); // 입점상품 상품코드 생성
+		
+		// <,> replace 처리
+		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;", ">"));
+		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");
+		
+		// 판매수수료율
+		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()); // 판매수수료율
+
+		log.info("[createGoodsDetail 22 ] goods=>{}", goods);
+		// 기본정보 생성
+		goodsDao.createGoods(goods); // 상품기본 저장
+		goodsDao.createGoodsSmmary(goods); // 상품통계 생성
+		
+		// 사용자 검색어를 검색어에 적용
+		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);
+		}
+
+		log.info("[createGoodsDetail 33 ] goods.getGoodsSnm()=>{}", goods.getGoodsSnm());
+		
+		// 상품타이틀 수정
+		goodsDao.updateGoodsSnm(goods);
+		
+		// 상품상세정보 저장
+		this.saveGoodsDetailDesc(goods);
+
+		// 옵션/재고 저장
+		int index = 0;
+		for (String optCd1 : goods.getOptCd1()) {
+			String optCd = goods.getGoodsCd() + "-" + (index + 1);
+
+			Option goodsStock = new Option();
+			goodsStock.setGoodsCd(goods.getGoodsCd()); // 구성상품 코드
+			goodsStock.setOptCd(optCd);
+			goodsStock.setOptCd1(optCd1);
+			goodsStock.setOptCd2(goods.getOptCd2()[index]);
+			goodsStock.setAddPrice(Integer.parseInt(goods.getAddPrice()[index]));
+			goodsStock.setBaseStockQty(Integer.parseInt(goods.getBaseStockQty()[index]));
+			goodsStock.setCurrStockQty(Integer.parseInt(goods.getEditCurrStockQty()[index]));
+			goodsStock.setSoldoutYn(goods.getSoldoutYn()[index]);
+			goodsStock.setDispOrd(Integer.parseInt(goods.getDispOrd()[index]));
+			goodsStock.setDispYn(goods.getDispYn()[index]);
+			goodsStock.setRegNo(goods.getRegNo());
+			goodsStock.setUpdNo(goods.getUpdNo());
+			goodsStock.setSelfGoodsYn(goods.getSelfGoodsYn());
+			log.info("[createGoodsDetail 44 ] goodsStock=>{}", goodsStock);
+			goodsDao.saveStock(goodsStock);
+			index++;
+		}
+
+		// 상품 정보고시 변경
+		this.saveGoodsNotiInfo(goods);
+				
+		// 전시카테고리 작업
+		goodsDao.createCategoryGoods(goods);
+
+		// 안전안증작업
+		saveGoodsDetailCertNum(goods);
+	}
+
 }

+ 50 - 0
src/main/java/com/style24/scm/biz/web/TssBusinessController.java

@@ -0,0 +1,50 @@
+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.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Brand;
+import com.style24.scm.biz.service.TssBusinessService;
+import com.style24.scm.support.controller.TssBaseController;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 영업관리 Controller
+ *
+ * @author gagamel
+ * @since 2020. 10. 14
+ */
+@Controller
+@RequestMapping("/business")
+@Slf4j
+public class TssBusinessController extends TssBaseController {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TssBusinessService businessService;
+
+	/**
+	 * 브랜드 목록
+	 * @param brand - 브랜드 정보
+	 * @return
+	 * @author eskim
+	 * @since 2021. 04. 21
+	 */
+	@PostMapping("/brand/list")
+	@ResponseBody
+	public Collection<Brand> getBrandList(Brand brand) {
+
+		return businessService.getBrandList(brand);
+	}
+
+
+}

+ 112 - 0
src/main/java/com/style24/scm/biz/web/TssGoodsController.java

@@ -39,6 +39,8 @@ import com.style24.persistence.domain.NotiInfo;
 import com.style24.persistence.domain.Notice;
 import com.style24.persistence.domain.NoticeGoods;
 import com.style24.persistence.domain.Option;
+import com.style24.persistence.domain.SupplyCompany;
+import com.style24.scm.biz.service.TssBusinessService;
 import com.style24.scm.biz.service.TssCommonService;
 import com.style24.scm.biz.service.TssGoodsService;
 import com.style24.scm.biz.service.TssRendererService;
@@ -77,6 +79,9 @@ public class TssGoodsController extends TssBaseController {
 
 	@Autowired
 	private TssRendererService rendererService;
+	
+	@Autowired
+	private TssBusinessService businessService;
 
 	@Autowired
 	private TssCommonService commonService;
@@ -1284,4 +1289,111 @@ public class TssGoodsController extends TssBaseController {
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 
+	/**
+	 * 입점 상품  화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 04. 21
+	 */
+	@GetMapping("/register/form")
+	public ModelAndView registerForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		String selfYn = "N";
+		String supplyCompCd = TssSession.getInfo().getSupplyCompCd();
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd, selfYn));
+		
+		SupplyCompany supplyCompany = new SupplyCompany();
+		supplyCompany.setSupplyCompCd(supplyCompCd);
+		Collection<SupplyCompany> supplyCompanyInfoList = businessService.getSupplyCompanyList(supplyCompany); 
+		mav.addObject("supplyCompanyInfo", supplyCompanyInfoList.iterator().next());
+		
+		// 배송비정보
+		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.getAuthBrandList(TssSession.getInfo().getUserNo()));
+		// 상품타입
+		mav.addObject("goodsTypeList", rendererService.getAvailCommonCodeList("G056"));
+		// 상품구분
+		mav.addObject("goodsGbList", rendererService.getAvailCommonCodeList("G073"));
+		// 유통구분
+		String[] distributionGbExceptCds = {"G065_10","G065_11","G065_12"};
+		mav.addObject("distributionGbList", rendererService.getCommonCodeList("G065", "Y", distributionGbExceptCds));
+		// 상품연령대
+		mav.addObject("ageGrpCdList", rendererService.getAvailCommonCodeList("G023"));
+		// 원산지
+		mav.addObject("originCdList", rendererService.getAvailCommonCodeList("G076"));
+		// 년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear, 0, 5));
+		// 회원등급
+		//mav.addObject("custGradeList", rendererService.getAvailCommonCodeList("G110"));
+
+		//mav.addObject("params", goods);
+		mav.setViewName("goods/GoodsRegisterForm");
+
+		return mav;
+	}
+	
+	/**
+	 * 상품의 정보고시 항목 목록
+	 *
+	 * @param notiInfo
+	 * @return
+	 * @author eskim
+	 * @since 2010. 11. 18
+	 */
+	@PostMapping("/notiInfo/list")
+	@ResponseBody
+	public Collection<NotiInfo> getNotiInfoItemList(NotiInfo notiInfo) {
+		return goodsService.getNotiInfoItemList(notiInfo);
+	}
+	
+	/**
+	 * 입점 상품 등록
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 04. 21
+	 */
+	@PostMapping("/detail/create")
+	@ResponseBody
+	public GagaResponse createGoodsDetail(@RequestBody Goods goods) {
+
+		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.createGoodsDetail(goods);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
 }

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

@@ -696,7 +696,7 @@
 			$('#goodsDetailForm input[name=seasonCdOrg]').val(result.seasonCd);
 			$('#goodsDetailForm select[name=sexGb]').val(result.sexGb);
 			$('#goodsDetailForm input[name=sexGbOrg]').val(result.sexGb);
-			$('#goodsDetailForm').find('#makeNmTxt').html(result.makeNm);
+			$('#goodsDetailForm').find('#makeNmTxt').html(result.originNm);
 			$('#goodsDetailForm').find('#styleYearTxt').html(result.styleYear);
 			$('#goodsDetailForm select[name=goodsGb]').val(result.goodsGb);
 			$('#goodsDetailForm input[name=goodsGbOrg]').val(result.goodsGb);

+ 2 - 2
src/main/webapp/WEB-INF/views/goods/GoodsImageForm.html

@@ -53,9 +53,9 @@
 							<th>컬러명</th>
 							<td th:text="${goodsImg.colorNm}">PINK</td>
 							<th>대표 이미지순번</th>
-							<td><input type="text" class="text-right" name="defaultImgOrd" maxlength="3" th:value="${defaultImgOrd}" required="required" data-valid-type="number" data-valid-name="대표이미지순번"/></td>
+							<td><input type="text" class="text-right" name="defaultImgOrd" maxlength="3" th:value="${defaultImgOrd}" required="required" data-valid-type="numeric" data-valid-name="대표이미지순번"/></td>
 							<th>마우스오버 이미지순번</th>
-							<td><input type="text" class="text-right" name="mouseoverImgOrd" maxlength="3" th:value="${mouseoverImgOrd}" required="required" data-valid-type="number" data-valid-name="마우스오버 이미지순번"/></td>
+							<td><input type="text" class="text-right" name="mouseoverImgOrd" maxlength="3" th:value="${mouseoverImgOrd}" required="required" data-valid-type="numeric" data-valid-name="마우스오버 이미지순번"/></td>
 						</tr>
 						<tr>
 							<th>이미지등록</th>

+ 1121 - 0
src/main/webapp/WEB-INF/views/goods/GoodsRegisterForm.html

@@ -0,0 +1,1121 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"        >
+<!--
+ *******************************************************************************
+ * @source  : GoodsRegisterForm.html
+ * @desc    : 입점 상품등록
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.21   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="erpStockLinkYn" name="erpStockLinkYn"  value="N"/>
+				<input type="hidden" id="goodsStat" name="goodsStat"  value="G008_20"/>
+				<input type="hidden" id="newCustOrdYn" name="newCustOrdYn" value="N"/>
+				<input type="hidden" id="mainColorCd" name="mainColorCd" value="XX"/>
+				<input type="hidden" id="selfGoodsYn" name="selfGoodsYn" value="N"/>
+				<input type="hidden" id="goodsType" name="goodsType" value="G056_N"/>
+				<input type="hidden" id="pntPrate10" name="pntPrate10" />
+				<input type="hidden" id="pntPrate20" name="pntPrate20" />
+				<input type="hidden" id="pntMrate10" name="pntMrate10" />
+				<input type="hidden" id="pntMrate20" name="pntMrate20" />
+		<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 colspan="3">
+							<select name="selSupplyCompCd" id="selSupplyCompCd" disabled="disabled" class="w40p">
+								<option value="">[선택]</option>
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" th:selected="${sessionInfo.supplyCompCd ==  oneData.cd}"></option>
+							</select>
+							<select name="selBrandCd" id="selBrandCd" class="w40p" required="required" data-valid-name="브랜드">
+								<option value="">[선택]</option>
+							</select>
+	
+							<input type="hidden" name="supplyCompCd" id="supplyCompCd"  th:value="${sessionInfo.supplyCompCd}"/>
+							<input type="hidden" name="brandCd" id="brandCd" />
+						</td>
+						<th>업체상품코드<em class="required" title="필수"></em></th>
+						<td><input type="text" class="w200" name="supplyGoodsCd" required="required" data-valid-name="업체상품코드"  data-valid-type="alphaNumeric" 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>상품이미지는 상품 등록 후 상품목록에서 오늘로 등록일을 설정, 조회 후 상품상세에서 등록하세요.</h3>
+					</li>	
+					<li class="right">
+						<th:block th:if="${sessionInfo.roleCd == 'G001_B000'}">
+						<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="#goodstab2">옵션/재고정보</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="15%"/>
+										<col width="18%"/>
+										<col width="15%"/>
+										<col width="18%"/>
+										<col width="15%"/>
+										<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>시즌</th>
+										<td >
+											<select  name="seasonCd" id="seasonCd">
+												<option value="">[선택]</option>
+												<option th:if="${seasonList}" th:each="oneData, status : ${seasonList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+											</select>
+										</td>
+									</tr>
+									<tr>
+										<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>상품연령대</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>
+											<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>
+										<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}" th:selected="${oneData.cd == 'G065_20'}"></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>해외구매대행여부<em class="required" title="필수"></em></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>병행수입여부<em class="required" title="필수"></em></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>주문제작여부<em class="required" title="필수"></em></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>정상가<em class="required" title="필수"></em></th>
+										<td><input type="text" class="w80p aR" id="listPrice" name="listPrice" maxlength="10" data-valid-type="numeric"  required="required" data-valid-name="정상가"/> 원
+										</td>
+										<th>판매가<em class="required" title="필수"></em></th>
+										<td><input type="text" class="w80p aR" id="currPrice" name="currPrice" maxlength="10" data-valid-type="numeric" required="required" data-valid-name="판매가"/> 원
+										</td>
+										<th>할인율</th>
+										<td class="aR" ><span id="dcRateTxt"></span> %  <input type="hidden" id="dcRate" name="dcRate"/></td>
+									</tr>
+									<tr>
+										<th>판매수수료율<em class="required" title="필수"></em></th>
+										<td><input type="text" class="w80p aR" id="sellFeeRate" name="sellFeeRate" maxlength="10" th:value="${supplyCompanyInfo.sellFeeRate}"  disabled="disabled"/> %
+										</td>
+										<th>과세구분<em class="required" title="필수"></em></th>
+										<td>
+											<select name="taxGb"  required="required" data-valid-name="과세구분">
+												<option value="">[선택]</option>
+												<option value="10">과세</option>
+												<option value="20">비과세</option>
+											</select>
+										</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>
+										</td>
+									</tr>
+									<tr>
+										<th>품목코드<em class="required" title="필수"></em></th>
+										<td colspan="5">
+											<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>
+									</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" id="delvFeeCd" required="required" data-valid-name="배송지정책">
+												<option value="">[선택]</option>
+												<option th:if="${delvFeeCdList}" th:each="oneData, status : ${delvFeeCdList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+											</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>PC포인트/즉시사용여부<em class="required" title="필수"></em></th>
+										<td>
+											<input type="text" class="w50 aR" id="pntPrate" name="pntPrate" data-valid-type="numeric" maxlength="3" required="required" data-valid-name="PC포인트"/> % /&nbsp;
+											<label class="rdoBtn"><input type="radio" name="prePpntUsableYn" id="prePpntUsableYnY" value="Y"/>Y</label>
+											<label class="rdoBtn"><input type="radio" name="prePpntUsableYn" id="prePpntUsableYnN" value="N"  checked="checked"/>N</label>
+										</td>
+										<th>모바일포인트/즉시사용여부<em class="required" title="필수"></em></th>
+										<td colspan="3">
+											<input type="text" class="w50 aR" id="pntMrate" name="pntMrate" data-valid-type="numeric" maxlength="3" required="required" data-valid-name="모바일포인트"/> % /&nbsp;
+											<label class="rdoBtn"><input type="radio" name="preMpntUsableYn" id="preMpntUsableYnY" value="Y"/>Y</label>
+											<label class="rdoBtn"><input type="radio" name="preMpntUsableYn" id="preMpntUsableYnN" value="N" checked="checked"/>N</label>
+										</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>안전인증번호</th>
+										<td>
+											<input type="text" class="w150" id="certNum" name="certNum"  maxlength="20"/>
+										</td>
+										<th>판매기간<em class="required" title="필수"></em></th>
+										<td colspan="3">
+											<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 -->
+						<!-- TAB2 : 옵셥/재고 -->
+						<li class="tab" id="goodstab2">
+							<!-- TAB2 CONTENTS AREA -->
+							<div class="panelStyle">
+								<ul class="panelBar">
+									<li>
+										<h3 class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i>옵션추가시 옵션1, 옵션2를 정확히 입력해주세요. 저장 후 수정할수 없습니다.</h3>
+									</li>	
+									<li class="right">
+										<button type="button" class="btn btn-info btn-lg" id="btnOptionAdd" >옵션추가</button>
+									</li>
+								</ul>
+								<table class="frmStyle">
+									<colgroup>
+										<col width="25%"/>
+										<col/>
+										<col width="8%"/>
+										<col width="8%"/>
+										<col width="7%"/>
+										<col width="8%"/>
+										<col width="8%"/>
+										<col width="7%"/>
+										<col width="5%"/>
+									</colgroup>
+									<tr>
+										<th>옵션1</th>
+										<th>옵션2</th>
+										<th>추가가격</th>
+										<th>노출순서</th>
+										<th>노출여부</th>
+										<th>가용재고</th>
+										<th>안전재고</th>
+										<th>품절여부</th>
+										<th></th>
+									</tr>
+									<tbody id="optionList" >
+									</tbody>
+								</table>
+							</div>
+							<!-- //TAB2 CONTENTS AREA -->
+						</li>
+						<!-- //TAB2 : 이미지/옵셥/재고 -->
+						<!-- TAB3 : 상품상세 -->
+						<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="15%"/>
+												<col/>
+											</colgroup>
+											<tr>
+												<th>타이틀</th>
+												<td><input type="text" class= "w100p" id="goodsTitlesDesc" name="goodsTitlesDesc" maxlength="100" />
+												</td>
+											</tr>
+											<tr>
+												<th>내용</th>
+												<td><div class="tabJrContArea">
+													<textarea class="textareaR3 summernote" name="goodsContentsDesc" id="goodsContentsDesc"></textarea>
+													</div>
+												</td>
+											</tr>
+											<tr>
+												<th>상품 특징</th>
+												<td><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="15%"/>
+												<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">
+													<textarea class="textareaR4 summernote" name="goodsPcTopDesc" id="goodsPcTopDesc"></textarea>
+													</div>
+												</td>
+											</tr>
+											<tr>
+												<th>상위(MOBILE)</th>
+												<td><div class="tabJrContArea">
+													<textarea class="textareaR4 summernote" name="goodsMobileTopDesc" id="goodsMobileTopDesc"></textarea>
+													</div>
+												</td>
+											</tr>
+											<tr>
+												<th>하위(PC)</th>
+												<td><div class="tabJrContArea">
+													<textarea class="textareaR4 summernote" name="goodsPcDownDesc" id="goodsPcDownDesc"></textarea>
+													</div>
+												</td>
+											</tr>
+											<tr>
+												<th>하위(MOBILE)</th>
+												<td><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=2020103001"></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 input[name=listPrice]").bind('focusout paste', function () {
+		fnCurrPriceCheck();
+	});
+	
+	//판매가 변경시 할인율 계산
+	$("#goodsDetailForm input[name=currPrice]").bind('focusout paste', function () {
+		fnCurrPriceCheck();
+	});
+	
+	//판매가의 할인율 확인
+	var fnCurrPriceCheck = function(){
+		var dcRate = 0;
+
+		if (gagajf.isNull($("#goodsDetailForm input[name=listPrice]").val()) || gagajf.isNull($("#goodsDetailForm input[name=currPrice]").val())){
+			return false;
+		}
+		
+		var listPrice = $("#goodsDetailForm input[name=listPrice]").val().removeComma();
+		var currPrice = $("#goodsDetailForm input[name=currPrice]").val().removeComma();
+		dcRate =  100 - Math.floor(Number(currPrice) / Number(listPrice) * 100);	//절사
+
+		if (dcRate < 0){
+			mcxDialog.alertC('판매가를 확인해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=currPrice]").focus();
+				}
+			});
+		}else{
+			$("#goodsDetailForm").find("#dcRateTxt").html(dcRate);
+		}
+	}
+	
+	// 브랜드 조회
+	var fnBrand = function(supplyCompCd, brandCd) {
+		var actionUrl = '/renderer/brand/AuthBrandlist';
+		$("#goodsDetailForm select[name=selBrandCd] option:gt(0)").remove();
+
+		cfnCreateCombo(actionUrl, $('#goodsDetailForm select[name=selBrandCd]'), "[선택]", brandCd);
+
+	}
+	
+	//브랜드변경시
+	$('#goodsDetailForm select[name=selBrandCd]').on('change', function() {
+		var brandCd = $("#goodsDetailForm select[name=selBrandCd]").val();
+		$('#goodsDetailForm input[name=brandCd]').val(brandCd);	//선택 브랜드코드 설정
+		if (gagajf.isNull(brandCd)){
+			$('#goodsDetailForm input[name=pntPrate]').val('');
+			$('#goodsDetailForm input[name=pntMrate]').val('');
+			
+		}else{
+		
+			//포인트 적용
+			var params = new Object();
+			params.brandCd = brandCd;
+			cfnAjaxSubmit("/business/brand/list", "json", fnBrandCallback, params);
+			
+		}
+	});	
+	
+	// 브랜드별 포인트 처리
+	var fnBrandCallback = function(result){
+		if (result != null){
+			$('#goodsDetailForm input[name=pntPrate10]').val(result[0].pntPrate10);
+			$('#goodsDetailForm input[name=pntPrate20]').val(result[0].pntPrate20);
+			$('#goodsDetailForm input[name=pntMrate10]').val(result[0].pntMrate10);
+			$('#goodsDetailForm input[name=pntMrate20]').val(result[0].pntMrate20);
+			if ("G009_10" == $('#goodsDetailForm input[name=formalGb]').val()){
+				$('#goodsDetailForm input[name=pntPrate]').val(result[0].pntPrate10);
+				$('#goodsDetailForm input[name=pntMrate]').val(result[0].pntMrate10);
+			}else{
+				$('#goodsDetailForm input[name=pntPrate]').val(result[0].pntPrate20);
+				$('#goodsDetailForm input[name=pntMrate]').val(result[0].pntMrate20);
+			}
+		}else{
+			$('#goodsDetailForm input[name=pntPrate10]').val('');
+			$('#goodsDetailForm input[name=pntPrate20]').val('');
+			$('#goodsDetailForm input[name=pntMrate10]').val('');
+			$('#goodsDetailForm input[name=pntMrate20]').val('');
+			$('#goodsDetailForm input[name=pntPrate]').val('');
+			$('#goodsDetailForm input[name=pntMrate]').val('');
+		}
+	}
+	
+	//배송비정책변경시
+	$('#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());
+			$("#goodsDetailForm input[name=minOrdAmt]").val(arrDelvFeeed[0].addComma());
+		}
+	});	
+	
+	// 상품 고시 선택 버튼 클릭 시
+	$('#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);
+	}
+	
+	//옵션추가버튼 클릭 시
+	$('#btnOptionAdd').click(function() {
+		
+		var len =   $('#goodsDetailForm').find('#optionList tr').length;
+		var goodsCd = $('#goodsDetailForm input[name=goodsCd]').val();
+		
+		var addOptionHtml = "";
+		addOptionHtml += '<tr>\n';
+		addOptionHtml += '	<td><input type="text" name="optCd1" class="W100" maxlength="30"/>\n';
+		addOptionHtml += '	</td>\n';
+		addOptionHtml += '	<td><input type="text" name="optCd2" class="W100" maxlength="30"/>\n';
+		addOptionHtml += '	</td>\n';
+		addOptionHtml += '	<td><input type="text" class="w100p aR" name="addPrice"  maxlength="7"  data-valid-type="numeric" value="0"/>\n';
+		addOptionHtml += '	</td>\n';
+		addOptionHtml += '	<td><input type="text" class="w100p aC" name="dispOrd" maxlength="7" data-valid-type="numeric" value="'+ (len+1)+'"/>\n';
+		addOptionHtml += '	</td>\n';
+		addOptionHtml += '	<td><select name="dispYn" class="w100p aC">\n';
+		addOptionHtml += '			<option value="Y" selected>Yes</option>\n';
+		addOptionHtml += '			<option value="N">No</option>\n';
+		addOptionHtml += '		</select>\n';
+		addOptionHtml += '	</td>\n';
+		addOptionHtml += '	<td><input type="text" class="w100p aC" name="editCurrStockQty"  maxlength="7" data-valid-type="numeric" value="0"/>\n';
+		addOptionHtml += '	</td>\n';
+		addOptionHtml += '	<td><input type="text" class="w100p aC"  name="baseStockQty" maxlength="7" data-valid-type="integer" value="0">\n';
+		addOptionHtml += '	</td>\n';
+		addOptionHtml += '	<td><select name="soldoutYn" class="w100p aC" >\n';
+		addOptionHtml += '			<option value="Y">Yes</option>\n';
+		addOptionHtml += '			<option value="N" selected>No</option>\n';
+		addOptionHtml += '		</select>\n';
+		addOptionHtml += '		<input type="hidden" name="hidSoldoutYn"/>\n';
+		addOptionHtml += '	</td>\n';
+		addOptionHtml += '	<td><button type="button" class="btn icn" onclick="$(this).parent().parent().remove();return false;"><i class="fa fa-times" aria-hidden="true" ></i></button></td>\n';
+		addOptionHtml += '</tr>\n';
+		
+		$('#optionList').append(addOptionHtml);
+	});
+	
+	//상품저장 버튼 클릭 시
+	$('#btnGoodsDetailSave').click(function() {
+
+		var optCheck = false;
+		var idx = 0;
+		var formId = '#goodsDetailForm';
+		
+		// 입력 값 체크
+		if (!gagajf.validation(formId))
+			return false;
+
+
+		//list가 등록되지 않은 상품은 상태변경 불가
+		if(Number($("#goodsDetailForm input[name=listPrice]").val()) == 0){
+			mcxDialog.alertC("정상가를 바르게 입력해 주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=listPrice]").focus();
+				}
+			});
+			return false;
+		}
+		
+		//판매가가 0인  상품은 상태변경 불가
+		if(Number($("#goodsDetailForm input[name=currPrice]").val()) == 0){
+			mcxDialog.alertC("판매가가를 바르게 입력해 주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=currPrice]").focus();
+				}
+			});
+			return;
+		}
+		
+		//정상가와 판매가 비교
+		if(Number($("#goodsDetailForm input[name=listPrice]").val().removeComma()) < Number($("#goodsDetailForm input[name=currPrice]").val().removeComma())) {
+			mcxDialog.alertC("판매가를 올바르게 입력해주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=currPrice]").focus();
+				}
+			});
+			return false;
+		}
+		
+		if(Number($("#goodsDetailForm input[name=sellFeeRate]").val()) < 0 || Number($("#goodsDetailForm input[name=sellFeeRate]").val()) > 100) {
+			mcxDialog.alertC("판매수수료를 올바르게 입력해주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=sellFeeRate]").focus();
+				}
+			});
+			return false;
+		}
+		
+	
+		if(Number($("#goodsDetailForm input[name=pntPrate]").val()) < 0 || Number($("#goodsDetailForm input[name=pntPrate]").val()) > 100) {
+			mcxDialog.alertC("PC 포인트를 올바르게 입력해주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=pntPrate]").focus();
+				}
+			});
+			return false;
+		}
+		if(Number($("#goodsDetailForm input[name=pntMrate]").val()) < 0 || Number($("#goodsDetailForm input[name=pntMrate]").val()) > 100) {
+			mcxDialog.alertC("MOBILE 포인트를 올바르게 입력해주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=pntMrate]").focus();
+				}
+			});
+			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").find("#optionList tr").length == 0){
+			mcxDialog.alert("옵션정보를 입력해 주세요");
+			return false;
+		}
+
+		$("#optionList tr").each(function() {
+			var optCd1 = $(this).find("input[name=optCd1]").val();
+			var optCd2 = $(this).find("input[name=optCd2]").val();
+			var baseStockQty = $(this).find("input[name=baseStockQty]").val();
+			var dispOrd = $(this).find("input[name=dispOrd]").val();
+			var dispYn = $(this).find("select[name=dispYn]").val();
+			var soldoutYn = $(this).find("select[name=soldoutYn]").val();
+			var addPrice = $(this).find("input[name=addPrice]").val();
+			var editCurrStockQty = $(this).find("input[name=editCurrStockQty]").val();
+			
+			//입점용 추가조건 S 
+			if (gagajf.isNull(optCd1)){
+				optCheck = true;
+				mcxDialog.alertC("옵션1를 입력해주세요", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$("#optionList tr").find("input[name=optCd1]").eq(idx).focus();
+					}
+				});
+				return false;
+			}	
+			if (gagajf.isNull(optCd2)){
+				optCheck = true;
+				mcxDialog.alertC("옵션2를 입력해주세요", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$("#optionList tr").find("input[name=optCd2]").eq(idx).focus();
+					}
+				});
+				return false;
+			}	
+			
+			// 첫번째 옵션2의 정보를 확인하여 동일 한지 체크--- ?
+			/* var firstOptCd2 = $("#optionList tr").find("input[name=optCd2]").eq(idx).val();
+			if ((gagajf.isNull(firstOptCd2) == !gagajf.isNull(optCd2))  || (!gagajf.isNull(firstOptCd2) == gagajf.isNull(optCd2))){
+				optCheck = true;
+				mcxDialog.alertC("옵션2를 확인해주세요", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$("#optionList tr").find("input[name=optCd2]").eq(idx).focus();
+					}
+				});
+				return false;
+			} */
+			//입점용 추가조건 E
+			
+			if(gagajf.isNull(addPrice)){
+				optCheck = true;
+				mcxDialog.alertC("추가가격을 입력해주세요", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$("#optionList tr").find("input[name=addPrice]").eq(idx).focus();
+					}
+				});
+				return false;
+			}
+			
+			if(gagajf.isNull(dispOrd)){
+				optCheck = true;
+				mcxDialog.alertC("노출순서를 입력해주세요", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$("#optionList tr").find("input[name=dispOrd]").eq(idx).focus();
+					}
+				});
+				return false;
+			}
+				
+			if(gagajf.isNull(editCurrStockQty)){
+				optCheck = true;
+				mcxDialog.alertC("가용재고를 입력해주세요", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$("#optionList tr").find("input[name=editCurrStockQty]").eq(idx).focus();
+					}
+				});
+				return false;
+			}
+		
+			
+			if(gagajf.isNull(baseStockQty)){
+				optCheck = true;
+				mcxDialog.alertC("안전재고를 입력해주세요", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$("#optionList tr").find("input[name=baseStockQty]").eq(idx).focus();
+					}
+				});
+				return false;
+			}
+
+			idx++;
+		});
+
+		if(optCheck) {
+			return false;
+		}
+		
+		//고시정보가 등록되지 않은 상품 체크
+		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;
+		}
+		
+		var dcRate = 0;
+		var listPrice = $("#goodsDetailForm input[name=listPrice]").val().removeComma();
+		var currPrice = $("#goodsDetailForm input[name=currPrice]").val().removeComma();
+		dcRate =  100 - Math.floor(Number(currPrice) / Number(listPrice) * 100);	//절사
+			
+		if (dcRate < 0){
+			mcxDialog.alertC('할인율이 0보다 작습니다.\n판매가를 확인해주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=currPrice]").focus();
+				}
+			});
+			return false;
+		}else if (dcRate >= 90){
+			mcxDialog.confirmC("할인율이 90%이상입니다. 계속하시겠습니까?", {
+				btn: ["아니요","예"],
+				btnClick: function(index){
+					if (index == 1){
+						optCheck = true;
+					} else {
+						fnGoodsSave();
+					}
+				}
+			});
+
+		}else{
+			$("#goodsDetailForm").find("#dcRateTxt").html(dcRate);
+			$("#goodsDetailForm input[name=dcRate]").val(dcRate);
+			fnGoodsSave();
+		}
+		
+		if (optCheck) return false;
+		
+	});
+	
+	//고시정보 저장을 위한 데이터 처리
+	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/detail/create", "#goodsDetailForm", fnGoodsSaveCallBack); 
+			}
+		});
+	}
+	
+	//저장후 callback
+	var fnGoodsSaveCallBack = function(){
+		fnClickLnb('A2019'); // -- 메뉴 클릭
+	}
+	
+	
+	$(document).ready(function() {
+		
+		// 업체 브랜드 조회
+		fnBrand([[${sessionInfo.supplyCompCd}]], '');
+		
+		// 판매일자 설정
+		var date = new Date();
+		$('#goodsDetailForm  input[name=sellStYMD]').val(date.format("YYYY-MM-DD"));
+		$('#goodsDetailForm  input[name=sellEdYMD]').val("2030-12-31");
+		
+	});
+	
+/*]]>*/
+</script>
+</html>

+ 3 - 1
src/main/webapp/dx5/dextuploadx5-configuration.js

@@ -8,9 +8,11 @@
 
     var gAuthkey = '';
     if (location.host.indexOf("ld") > -1) {
-    	gAuthkey = "hr0AqviRLOCsbiIneYWPXdkhMn8awpDYw6HPDAvYo/cKKYVOyyuonGO2qFLlmur6svsAV6tkMZY5N1Iygq42R74h7AFlzk8xhM9YzIP8ySVhEN2LFlRxgsm/GQyLrzNoS1BwcHSYyOvAfzBCAVu6f8ubLw68bOFWivcvJKAz91I=";
+    	gAuthkey = "PMW65Dgn2LQ6/YyYHJJsrHHLJyX+UndGTiJsAHrw6Wwo8n30YXfDQTTp9j91uc+f2I9Zy9UVYQS6cYnlo41Olo2aK80HoG7c8SC9S5ecnFfnUBj0g45T2jZiKiUf/+crqNgixpI4zxSFHBX1y1dPS8iEj24qDRFvtaP2mtHZYg8= ";
     } else if (location.host.indexOf("lp") > -1) {
     	gAuthkey = "hr0AqviRLOCsbiIneYWPXdkhMn8awpDYw6HPDAvYo/cKKYVOyyuonGO2qFLlmur6svsAV6tkMZY5N1Iygq42R74h7AFlzk8xhM9YzIP8ySVhEN2LFlRxgsm/GQyLrzNoS1BwcHSYyOvAfzBCAVu6f8ubLw68bOFWivcvJKAz91I=";
+    } else if (location.host.indexOf("td") > -1) {
+    	gAuthkey = "Jykwjt2KOmAKAQf8eTuiYAej+o7AMW4L9ToeLPSbJ6MXA7OLcpvFwixUjmbdQiSL/CwNKvJa6yXaIXMIDMD5oRK/LMD3/YU1A9oLJK2Pbdm7qYLQYOEH46i+riwBsz2O8HaM1f/pKcfhLDtfuTXBPerPQDxmWwjuUPkUBF0JUrE= ";
     } else if (location.host.indexOf("dev") > -1) {
     	gAuthkey = "hr0AqviRLOCsbiIneYWPXdkhMn8awpDYw6HPDAvYo/cKKYVOyyuonGO2qFLlmur6svsAV6tkMZY5N1Iygq42R74h7AFlzk8xhM9YzIP8ySVhEN2LFlRxgsm/GQyLrzNoS1BwcHSYyOvAfzBCAVu6f8ubLw68bOFWivcvJKAz91I=";
     } else if (location.host.indexOf("qas") > -1) {