Browse Source

입점상품 등록시 안전인증정보 항목 추가

eskim 5 years ago
parent
commit
38b971af20

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

@@ -76,7 +76,13 @@ public class Goods extends TscBaseDomain {
 	private String newCustOrdYn;		//신규고객 구매가능여부(Y:신규고객만 구매가능)
 	private int costPrice;		//원가
 	private String adultYn;		//성인용품여부
-
+	private String sellStdt;		//판매시작일시
+	private String sellStYMD;		//판매시작일
+	private String sellStHH;		//판매시작시
+	private String sellEddt;		//판매종료일시
+	private String sellEdYMD;		//판매종료일
+	private String sellEdHH;		//판매종료시
+	
 	private String brandEnm;		//브랜드영문명
 	private String brandGrpNm;		//브랜드그룹명
 	private int brandNo;			// 브랜드번호

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

@@ -38,6 +38,7 @@ public class GoodsMass extends TscBaseDomain {
 //	private String distributionGb;	//유통구분(공콩코드 G065)
 	private String taxGb;			//과세구분(10:과세, 20:비과세)
 	private String ageGrpCd;		//상품연령코드(공통코드G023)
+	private String certNum;			//안전인증번호 
 	private String adultYn;			//성인용품여부 'Y', 'N'
 
 	private String pntPrate;		//포인트적립율(PC)

+ 24 - 0
src/main/java/com/style24/persistence/domain/GoodsSafeNo.java

@@ -0,0 +1,24 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 안전인증 Domain
+ *
+ * @author eskim
+ * @since 2020. 12. 07
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsSafeNo extends TscBaseDomain {
+
+	private String goodsCd;
+	private String goodsNum;
+	private String certNum;
+	private String certState;
+	private String certDiv;
+	private String certDt;
+
+}

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

@@ -24,6 +24,7 @@ public class Option extends TscBaseDomain {
 	private int productCode;
 	private int baseStockQty;
 	private int currStockQty;
+	private int storeStockQty;
 	private int addPrice;
 	private String soldoutYn;
 	private int dispOrd;

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

@@ -588,12 +588,13 @@
 		     , FN_GET_USER_NM(G.UPD_NO) AS UPD_NM
 		     , E.CERT_NUM
 		     , E.CERT_DT
+		     , DATE_FORMAT(G.SELL_STDT, '%Y%m%d%H%i%S') AS SELL_STDT
+		     , DATE_FORMAT(G.SELL_EDDT, '%Y%m%d%H%i%S') AS SELL_EDDT
 		FROM TB_GOODS G
 		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
 		LEFT OUTER JOIN TB_DELV_FEE_POLICY D ON G.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
 		                                     AND G.DELV_FEE_CD =  D.DELV_FEE_CD
 		LEFT OUTER JOIN TB_GOODS_SAFE_NO E ON G.GOODS_CD = E.GOODS_CD
-
 		WHERE 1 = 1 
 		<choose>
 		<when test="goodsCd != null and goodsCd != ''">
@@ -703,6 +704,8 @@
 		      , COST_PRICE
 		      , DC_RATE
 		      , GOODS_STAT
+		      , SELL_STDT
+		      , SELL_EDDT
 		      , SELF_MALL_YN
 		      , GOODS_GB
 		      , FOREIGN_BUY_YN
@@ -761,6 +764,8 @@
 		     , COST_PRICE
 		     , DC_RATE             
 		     , GOODS_STAT          
+		     , SELL_STDT
+		     , SELL_EDDT
 		     , SELF_MALL_YN             
 		     , GOODS_GB            
 		     , FOREIGN_BUY_YN
@@ -868,6 +873,12 @@
 		<if test="delvFeeCd != null and delvFeeCd != ''" >
 		    , DELV_FEE_CD = #{delvFeeCd}
 		</if>
+		<if test="sellStdt != null and sellStdt != ''" >
+		    , SELL_STDT = STR_TO_DATE(#{sellStdt},'%Y%m%d%H%i%S')
+		</if>
+		<if test="sellEddt != null and sellEddt != ''" >
+		    , SELL_EDDT = STR_TO_DATE(#{sellEddt},'%Y%m%d%H%i%S')
+		</if>
 		WHERE GOODS_CD = #{goodsCd}
 	</update>
 	
@@ -1281,6 +1292,8 @@
 		  , MAIN_COLOR_CD = #{mainColorCd}
 		  , NEW_CUST_ORD_YN = #{newCustOrdYn}
 		  , ADULT_YN = #{adultYn}
+		  , SELL_STDT = STR_TO_DATE(#{sellStdt},'%Y%m%d%H%i%S')
+		  , SELL_EDDT = STR_TO_DATE(#{sellEddt},'%Y%m%d%H%i%S')
 		  , UPD_NO = #{updNo}
 		  , UPD_DT = NOW()
 		WHERE GOODS_CD = #{goodsCd}
@@ -2135,13 +2148,15 @@
 	<insert id="createCategoryGoods" parameterType="Goods">
 		/* TssGoods.createCategoryGoods */
 		INSERT INTO TB_CATE_GOODS
-		    (CATE_NO
+		    (BRAND_GROUP_NO
+		   , CATE_NO
 		   , GOODS_CD
 		   , DISP_ORD
 		   , REG_NO
 		   , REG_DT
 		    )
-		 SELECT B.CATE_NO
+		 SELECT 0   /*BRAND_GROUP_NO*/
+		      , B.CATE_NO
 		      , A.GOODS_CD
 		      , 9999
 		      , #{regNo}
@@ -2155,6 +2170,7 @@
 		AND NOT EXISTS (SELECT 1
 		                FROM TB_CATE_GOODS
 		                WHERE CATE_NO = B.CATE_NO
+		                AND BRAND_GROUP_NO = 0
 		                AND GOODS_CD = A.GOODS_CD
 		                )
 	</insert>
@@ -2541,4 +2557,38 @@
 		WHERE PRODUCT_NO = #{productNo}
 	</update>
 	
+	<!--  상품 안전인증번호 저장 -->
+	<insert id="saveGoodsSafeNo"  parameterType="GoodsSafeNo">
+		/* TsaGoods.saveGoodsSafeNo */
+		INSERT INTO TB_GOODS_SAFE_NO (
+		    GOODS_CD
+		  , CERT_NUM
+		  , CERT_DIV
+		  , CERT_STATE
+		  , CERT_DT
+		  , REG_NO
+		  , REG_DT
+		  , UPD_NO
+		  , UPD_DT
+		)
+		VALUES (
+		    #{goodsCd}
+		  , #{certNum}
+		  , #{certDiv}
+		  , #{certState}
+		  , #{certDt}
+		  , #{regNo}
+		  , NOW()
+		  , #{updNo}
+		  , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       CERT_NUM = #{certNum}
+		     , CERT_DIV = #{certDiv}
+		     , CERT_STATE = #{certState}
+		     , CERT_DT = #{certDt}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
 </mapper>

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

@@ -13,6 +13,7 @@ import com.style24.persistence.domain.GoodsImg;
 import com.style24.persistence.domain.GoodsMass;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
+import com.style24.persistence.domain.GoodsSafeNo;
 import com.style24.persistence.domain.GoodsSearch;
 import com.style24.persistence.domain.Itemkind;
 import com.style24.persistence.domain.NotiInfo;
@@ -591,5 +592,13 @@ public interface TssGoodsDao {
 	 * @since 2020. 12. 28
 	 */
 	public void updateFreeGoods(FreeGoods freeGoods);
+	
+	/**
+	 * 안전인증대상 상품 저장
+	 *
+	 * @author eskim
+	 * @since 2020. 12. 07
+	 */
+	void saveGoodsSafeNo(GoodsSafeNo goodsSafeNo);
 
 }

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

@@ -13,6 +13,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.style24.core.biz.thirdparty.SafetyKoreaApi;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.Brand;
 import com.style24.persistence.domain.CommonCode;
@@ -26,6 +27,7 @@ import com.style24.persistence.domain.GoodsImg;
 import com.style24.persistence.domain.GoodsMass;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
+import com.style24.persistence.domain.GoodsSafeNo;
 import com.style24.persistence.domain.GoodsSearch;
 import com.style24.persistence.domain.Itemkind;
 import com.style24.persistence.domain.NotiInfo;
@@ -38,6 +40,8 @@ import com.style24.scm.biz.dao.TssGoodsDao;
 import com.style24.scm.support.env.TssConstants;
 import com.style24.scm.support.security.session.TssSession;
 
+import io.netty.util.internal.StringUtil;
+
 import lombok.extern.slf4j.Slf4j;
 
 import com.gagaframework.excel.GagaExcelUtil;
@@ -80,6 +84,9 @@ public class TssGoodsService {
 
 	@Autowired
 	private TssRendererService rendererService;
+	
+	@Autowired
+	private SafetyKoreaApi safetyKoreaApi;
 
 	@Autowired
 	private ObjectMapper mapper;
@@ -632,6 +639,10 @@ public class TssGoodsService {
 				}
 			}
 		}
+		
+		// 판매기간설정 eskim
+		goods.setSellStdt(goods.getSellStYMD().replaceAll("-","") + goods.getSellStHH() + "0000");
+		goods.setSellEddt(goods.getSellEdYMD().replaceAll("-","") + goods.getSellEdHH() + "5959");
 
 		// 기본정보 변경
 		if ("Y".equals(goods.getChDataYn())) {
@@ -1889,9 +1900,14 @@ public class TssGoodsService {
 			goods.setGoodsSnm(goodsSnm);
 		}
 
+		// 상품타이틀 수정
 		goodsDao.updateGoodsSnm(goods);
 
+		// 전시카테고리 작업
 		goodsDao.createCategoryGoods(goods);
+		
+		// 안전안증작업
+		saveGoodsDetailCertNum(goods);
 
 		this.setGoodsRegResult(goods, goodsMass, procJob);
 
@@ -2004,8 +2020,6 @@ public class TssGoodsService {
 			return goods;
 		}
 		goods.setItemkindNm(getItemkindList.iterator().next().getItemkindLeafNm());	//LEAF품목명
-
-
 		
 		// 성별
 		if (StringUtils.isBlank(goodsMass.getSexGb())) {
@@ -2202,7 +2216,9 @@ public class TssGoodsService {
 			goods.setGoodsStat("10");
 			return goods;
 		}
-
+		
+		goods.setCertNum(goodsMass.getCertNum()); //안전인증번호
+		
 		goods.setGoodsType("G056_N"); //상품타입
 		goods.setDistributionGb("G065_20"); //유통구분
 		goods.setSelfGoodsYn("N"); // 자사상품여부
@@ -3314,4 +3330,44 @@ public class TssGoodsService {
 		freeGoods.setUpdNo(TssSession.getInfo().getUserNo());
 		goodsDao.updateFreeGoods(freeGoods);
 	}
+	
+	/**
+	 * 안전인증번호 저장
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 07
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsDetailCertNum(Goods goods) {
+		try {
+			if (StringUtils.isNotBlank(goods.getCertNum())) {
+				if ("해당없음".equals(goods.getCertNum())) {
+					GoodsSafeNo goodsSafeNo = new GoodsSafeNo();
+					goodsSafeNo.setGoodsCd(goods.getGoodsCd());
+					goodsSafeNo.setCertNum(goods.getCertNum());
+					goodsSafeNo.setRegNo(TssSession.getInfo().getUserNo());
+					goodsSafeNo.setUpdNo(TssSession.getInfo().getUserNo());
+					goodsDao.saveGoodsSafeNo(goodsSafeNo);
+				}else {
+					GagaMap result = safetyKoreaApi.getKoreaCertifyDetail(goods.getCertNum());
+					if (result != null || !StringUtil.isNullOrEmpty(result.get("certNum").toString())) {
+						GoodsSafeNo goodsSafeNo = new GoodsSafeNo();
+						goodsSafeNo.setGoodsCd(goods.getGoodsCd());
+						goodsSafeNo.setCertDt(result.get("certDt").toString());
+						goodsSafeNo.setCertNum(result.get("certNum").toString());
+						goodsSafeNo.setCertState(result.get("certState").toString());
+						goodsSafeNo.setCertDiv(result.get("certDiv").toString());
+						goodsSafeNo.setRegNo(TssSession.getInfo().getUserNo());
+						goodsSafeNo.setUpdNo(TssSession.getInfo().getUserNo());
+						goodsDao.saveGoodsSafeNo(goodsSafeNo);
+					}
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
 }

+ 20 - 4
src/main/java/com/style24/scm/biz/web/TssGoodsController.java

@@ -737,7 +737,7 @@ public class TssGoodsController extends TssBaseController {
 	}
 
 	/**
-	 * 상품 이미지 대량관리 화면(자사)
+	 * 상품 이미지 대량관리 화면
 	 *
 	 * @param goodsCode - 상품코드
 	 * @return
@@ -845,7 +845,8 @@ public class TssGoodsController extends TssBaseController {
 			// 입점상품등록
 			// DB 처리 시 사용되는 파라미터명(셀명) 설정 -
 			String[] goodsNames = {"supplyGoodsCd", "supplyCompCd", "brandCd", "goodsNm", "goodsTnm", "goodsSnm1", "itemkindCd",
-				"sexGb", "listPrice", "currPrice", "goodsGb", "formalGb", "originCd", "makeYmd", "taxGb", "ageGrpCd", "adultYn", "optStr", "goodsContent",
+				"sexGb", "listPrice", "currPrice", "goodsGb", "formalGb", "originCd", "makeYmd", "taxGb", "ageGrpCd", "adultYn", 
+				"certNum", "optStr", "goodsContent",
 				"niClsfCd", "niContent1", "niContent2", "niContent3", "niContent4", "niContent5",
 				"niContent6", "niContent7", "niContent8", "niContent9", "niContent10", "niContent11", "niContent12",
 				"niContent13", "niContent14", "niContent15", "niContent16", "niContent17", "niContent18",
@@ -855,8 +856,8 @@ public class TssGoodsController extends TssBaseController {
 			ecxelGoodsList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, goodsMass.getExcelFileNm()), 0, goodsNames, 0);
 
 			//건수
-			if (ecxelGoodsList != null && ecxelGoodsList.size() > EXCEL_ROW_COUNT) {
-				throw new IllegalStateException("엑셀 파일의 건수를 " +EXCEL_ROW_COUNT + "건 이하로 사용하세요.");
+			if (ecxelGoodsList != null && ecxelGoodsList.size() > 100) {  //안전인증 로직 추가로 건수 줄임
+				throw new IllegalStateException("엑셀 파일의 건수를 100 건 이하로 사용하세요.");
 			}
 			
 			// 사용자의 관리 브랜드 조회
@@ -1268,4 +1269,19 @@ public class TssGoodsController extends TssBaseController {
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 
+	/**
+	 * 상품 안전인증번호 저장
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 07
+	 */
+	@PostMapping("/detail/certNum/save")
+	@ResponseBody
+	public GagaResponse saveGoodsDetailCertNum(@RequestBody Goods goods) {
+		goodsService.saveGoodsDetailCertNum(goods);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
 }

+ 1 - 1
src/main/resources/config/application-locd.yml

@@ -33,7 +33,7 @@ upload:
         target.path: /WIDE/workspace/files/data/style24/Upload/ProductImage
         max.size: 10
         allow.extension: jpg|gif|jpeg
-        view: //ldimage.style24.com/Upload/ProductImage
+        view: //image.istyle24.com/Upload/ProductImage
     image:
         target.path: /WIDE/workspace/files/data/style24
         max.size: 10

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

@@ -14,7 +14,7 @@
  * 1.0  2020.10.23   eskim       최초 작성
  *******************************************************************************
  -->
-	<div class="modalPopup" data-width="1500"> <!-- data-width="1500" data-height="870" -->
+	<div class="modalPopup"  data-width="1700"  data-height="870"> <!-- data-width="1500" data-height="870" -->
 		<div class="panelStyle">
 			<div class="panelTitle">
 				<h2>상품상세</h2>
@@ -43,9 +43,9 @@
 						<col/>
 						<col width="11%"/>
 						<col width="14%"/>
-						<col width="11%"/>
+						<col width="10%"/>
 						<col width="14%"/>
-						<col width="11%"/>
+						<col width="10%"/>
 						<col width="14%"/>
 					</colgroup>
 					<tr>
@@ -91,18 +91,18 @@
 							<div class="panelStyle">
 								<table class="frmStyle">
 									<colgroup>
-										<col width="10%"/>
-										<col width="15%"/>
-										<col width="15%"/>
-										<col width="15%"/>
-										<col width="15%"/>
-										<col width="15%"/>
 										<col/>
+										<col width="12%"/>
+										<col width="17%"/>
+										<col width="12%"/>
+										<col width="17%"/>
+										<col width="12%"/>
+										<col width="17%"/>
 									</colgroup>
 									<tbody>
 									<tr>
 										<td rowspan="4" style="text-align:center" th:with="uploadGoodsUrl=${@environment.getProperty('upload.goods.view')}">
-										<img id="goodsImgUrl" src="" width="100px"/>
+										<img id="goodsImgUrl" src="" width="130px"/>
 										<input type="hidden" name="sysImgNm" id="sysImgNm" />
 										</td>
 										<th>상품타이틀</th>
@@ -159,7 +159,7 @@
 										</td>
 									</tr>
 									<tr>
-										<td rowspan="11">&nbsp;</td>
+										<td rowspan="12">&nbsp;</td>
 										<th>시즌</th>
 										<td >
 											<select  name="seasonCd" id="seasonCd">
@@ -352,12 +352,32 @@
 											<input type="hidden" id="dayMaxOrdQtyOrg" name="dayMaxOrdQtyOrg"/>
 										</td>
 									</tr>
-									<!-- <tr>
-										<th>구매등급</th>
-										<td colspan="5">
-											<div id="goodsCustGradeList"></div>
+									<tr>
+										<th>안전인증번호</th>
+										<td>
+											<input type="text" class="w150" id="certNum" name="certNum"  maxlength="20"/>
+											<input type="hidden" id="certNumOrg" name="certNumOrg"/>
+											<button type="button" class="btn btn-success btn-lg" id="btnGoodsSafetyCertNum">안전인증</button>
+										</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="sellStdt" id="sellStdt" type="hidden" />
+											~
+											<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>
+											<input name="sellEddt" id="sellEddt" type="hidden" />
 										</td>
-									</tr> -->
+									</tr>
 									</tbody>
 								</table>
 							</div>
@@ -682,7 +702,6 @@
 			$('#goodsDetailForm input[name=goodsGbOrg]').val(result.goodsGb);
 			$('#goodsDetailForm input[name=mainColorCd]').val(result.mainColorCd);
 			
-
 			$("#goodsDetailForm input[name=goodsNm]").val(result.goodsNm);
 			$('#goodsDetailForm input[name=goodsNmOrg]').val(result.goodsNm);
 			fnDataLengthCheck('goodsNm',200);
@@ -818,9 +837,16 @@
 			$('#goodsDetailForm input[name=maxOrdQtyOrg]').val(result.maxOrdQty);
 			$('#goodsDetailForm input[name=dayMaxOrdQty]').val(result.dayMaxOrdQty);
 			$('#goodsDetailForm input[name=dayMaxOrdQtyOrg]').val(result.dayMaxOrdQty);
-			
+			$('#goodsDetailForm input[name=certNumOrg]').val(result.certNum);
+			$('#goodsDetailForm input[name=certNum]').val(result.certNum);
 			$('#goodsDetailForm input[name=goodsType]').val(result.goodsType);
 			$("#goodsDetailForm").find("#goodsTypeNm").html(result.goodsTypeNm);
+			$('#goodsDetailForm input[name=sellStdt]').val(result.sellStdt);
+			$('#goodsDetailForm input[name=sellStYMD]').val(result.sellStdt.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD") );
+			$('#goodsDetailForm input[name=sellStHH]').val(result.sellStdt.toDate("YYYYMMDDHHmmss").format("HH") );
+			$('#goodsDetailForm input[name=sellEddt]').val(result.sellEddt);
+			$('#goodsDetailForm input[name=sellEdYMD]').val(result.sellEddt.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD") );
+			$('#goodsDetailForm input[name=sellEdHH]').val(result.sellEddt.toDate("YYYYMMDDHHmmss").format("HH") );
 			
 			cfnCreateCombo('/renderer/delvFee/list/' + result.supplyCompCd, $('#goodsDetailForm select[name=delvFeeCd]'), "[선택]", result.delvFeeCd);
 			$('#goodsDetailForm input[name=delvFeeCdOrg]').val(result.delvFeeCd);
@@ -922,12 +948,6 @@
 	var fnGoodsDetailNotiInfoSearch = function(params) {
 		cfnAjaxSubmit("/goods/detail/notiInfo/list", "json", fnGoodsDetailNotiInfoSearchCallback, params);
 	}
-	
-	//구매등급
-	//var fnGoodsDetailOrderGradeSearch = function(params) {
-	//	cfnAjaxSubmit("/goods/detail/order/grade/list", "json", fnGoodsDetailOrderGradeSearchCallback, params);
-	//}
-	
 	//이력
 	var fnGoodsDetailHstSearch = function() {
 		gagaAgGrid.fetch("/goods/detail/hst/list?goodsCd=" + $('#goodsDetailForm input[name=goodsCd]').val() , gridGoodsHstoryOptions);
@@ -1433,6 +1453,26 @@
 			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;
 
 		//재고 옵션 관련 확인
@@ -1659,7 +1699,7 @@
 
 	//미리보기 클릭 시
 	$('#btnGoodsDetailPreview').click(function(e) {
-		cfnOpenFrontGoodsPopup($('#goodsDetailForm input[name=goodsCd]').val(), $('#goodsDetailForm input[name=siteCd]').val());
+		cfnOpenFrontGoodsPopup($('#goodsDetailForm input[name=goodsCd]').val());
 	});
 
 	//이미지 클릭 시
@@ -1832,7 +1872,16 @@
 		if ($("#goodsDetailForm input[name=orderMadeYnOrg]").val() != $("input[name=orderMadeYn]:checked").val()){
 			return true;
 		}
-		
+		// 판매기간 시작일
+		if ($("#goodsDetailForm input[name=sellStdt]").val().toDate("YYYYMMDDHHmmss").format("YYYYMMDDHH") != 
+			($("#goodsDetailForm input[name=sellStYMD]").val().replaceAll('-', '')+ $("#goodsDetailForm select[name=sellStHH]").val())){
+			return true;
+		}
+		// 판매기간 종료일
+		if ($("#goodsDetailForm input[name=sellEddt]").val().toDate("YYYYMMDDHHmmss").format("YYYYMMDDHH") != 
+			($("#goodsDetailForm input[name=sellEdYMD]").val().replaceAll('-', '')+ $("#goodsDetailForm select[name=sellEdHH]").val())){
+			return true;
+		}
 		return false;
 	}
 
@@ -1879,25 +1928,27 @@
 		});
 	});
 	
-	// 상품구매등급 
-	var fnGoodsOrderGrade = function(){
-		
-		var code = $('#goodsDetailForm select[name=custGrade]').val();
-		var codeText = $("#goodsDetailForm select[name=custGrade] option:selected").text();
-		var addHtml = '';
-		
-		var addFlag = true;
-		$("#goodsDetailForm #goodsCustGradeList").find("input").each(function() {
-			if (code == $(this).val() ){
-				addFlag = false;
+	
+	// 안전인증
+	$("#btnGoodsSafetyCertNum").on("click", function(){
+/*
+		if($("#goodsDetailForm  input[name=certNum]").val() == $("#goodsDetailForm  input[name=certNumOrg]").val()){
+			mcxDialog.alert("안전인증번호가 변경되지 않았습니다.");
+			return false;
+		}
+*/
+		mcxDialog.confirm('안전인증번호를 변경 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var data = {  goodsCd : $('#goodsDetailForm input[name=goodsCd]').val()
+							, certNum : $("#goodsDetailForm input[name=certNum]").val()
+							};
+				var jsonData = JSON.stringify(data);
+				gagajf.ajaxJsonSubmit('/goods/detail/certNum/save', jsonData );  //, fnGoodsDeailSearch
 			}
 		});
-		if (addFlag){
-			addHtml = '<span class="memAdd"><input type="hidden" name="goodsOrderGrade" value="'+code+'"/>'+ codeText+' <button type="button" onclick="$(this).parent().remove();return false;">삭제</button></span>';
-			$('#goodsCustGradeList').append(addHtml);	
-			//$('#goodsDetailForm').find('.tabs .tabsNav li:eq(4) a').attr("style", "color:red;");
-		}
-	}
+	});
 	
 	//엑셀 상품 조회
 	$('#btnGoodsDealSearchExcel').on('click', function() {

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

@@ -61,7 +61,7 @@
 	</ul>
 	<table class="frmStyle">
 		<colgroup>
-			<col width="15%"/>
+			<col width="20%"/>
 			<col/>
 			<col width="10%"/>
 			<col width="7%"/>

+ 48 - 0
src/main/webapp/WEB-INF/views/goods/GoodsListForm.html

@@ -360,6 +360,27 @@
 							</td>
 							<td colspan="2">
 						</tr>
+						<tr>
+							<th>판매일시</th>
+							<td colspan="7">
+								<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)}시|" th:selected="${#numbers.formatInteger(num,2)}==0 ? 'true'">시간</option>
+									</th:block>
+								</select>
+								<input name="sellStdt" id="sellStdt" type="hidden" />
+								~
+								<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>
+								<input name="sellEddt" id="sellEddt" type="hidden" />
+								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('sellDate')" >적용</button>
+							</td>
+						</tr>
 					</table>
 				</li>
 			</ul>
@@ -684,6 +705,26 @@
 				});
 				return;
 			}
+		}else if (proc == "sellDate"){
+			if(isNaN(Date.parse($("#searchForm input[name=sellStYMD]").val()))){
+				mcxDialog.alertC('날짜형식이 아닙니다.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$("#searchForm input[name=sellStYMD]").focus();
+					}
+				});	
+				return false;
+			}
+			
+			if(isNaN(Date.parse($("#searchForm input[name=sellEdYMD]").val()))){
+				mcxDialog.alertC('날짜형식이 아닙니다.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$("#searchForm input[name=sellEdYMD]").focus();
+					}
+				});	
+				return false;
+			}
 		}else{
 			if (gagajf.isNull($(objId).val())){
 				mcxDialog.alertC('적용하실 항목을 선택(입력)해주세요.', {
@@ -717,6 +758,8 @@
 		var pntMrateVal = '';
 		var giftPackYnVal = '';
 		var delvFeeCdVal = '';
+		var sellStdtVal = '';
+		var sellEddtVal = '';
 
 		if (proc == "goodsStat") {
 			goodsStatVal = $(objId).val();
@@ -798,6 +841,9 @@
 				return;
 			}
 			delvFeeCdVal = $(objId).val();	
+		}else if (proc == "sellDate") {
+			sellStdtVal = $("#searchForm input[name=sellStYMD]").val().replaceAll('-', '')+ $("#searchForm select[name=sellStHH]").val()+"0000";
+			sellEddtVal = $("#searchForm input[name=sellEdYMD]").val().replaceAll('-', '')+ $("#searchForm select[name=sellEdHH]").val()+"5959";
 		}else{
 			return;
 		}
@@ -827,6 +873,8 @@
 							,pntMrate : pntMrateVal
 							,giftPackYn : giftPackYnVal
 							,delvFeeCd : delvFeeCdVal
+							,sellStdt : sellStdtVal
+							,sellEddt : sellEddtVal
 							,procJob : proc
 							};
 

+ 2 - 2
src/main/webapp/ux/js/admin.popup.js

@@ -648,8 +648,8 @@ var cfnOpenPlanAnswerPopup = function(planSq) {
  * @since  : 2020/08/21
  * @author : swkim
  */
-var cfnOpenFrontGoodsPopup = function(goodsCd, siteCd) {
-	var actionUrl = _frontDomain +"/goods/detail/form?goodsCd=" + goodsCd + '&adminYn=Y';
+var cfnOpenFrontGoodsPopup = function(goodsCd) {
+	var actionUrl = _frontUrl +"/goods/detail/form?goodsCd=" + goodsCd + '&adminYn=Y';
 
 	window.open(actionUrl);
 }