Ver código fonte

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

gagamel 4 anos atrás
pai
commit
8bc278ca6b

+ 22 - 69
src/main/java/com/style24/admin/biz/service/TsaShoplinkerService.java

@@ -62,49 +62,31 @@ public class TsaShoplinkerService {
 	 * @author jmh
 	 * @since 2021. 5. 20
 	 */
-	public GagaMap createShoplinkerXml(Collection<GagaMap> ecxelGoodsList, ShoplinkerGoods shoplinkerGoods)throws IOException {
+	public void createShoplinkerXml(Collection<GagaMap> ecxelGoodsList, ShoplinkerGoods shoplinkerGoods) {
 		// 파일명 추가 네이밍 규칙
 		fileAddNm = shoplinkerGoods.getRegNo() +"_"+ GagaDateUtil.getToday("yyMMddHHmmss");
 
-		GagaMap rtnMap = new GagaMap();
-		int optionAll=0, optionSucc=0;
-		int excelCnt= ecxelGoodsList.size();
-		int tProdSucc = 0, productSucc=0, goodsNotiSucc=0, certSucc=0, imageSucc=0;
-		log.info(" #### SHOPLINKER CHK3 - "+excelCnt);
+		log.info(" #### SHOPLINKER CHK3 - "+ecxelGoodsList.size());
 		for (GagaMap gagaMap : ecxelGoodsList) {
 			if( !"".equals(gagaMap.getString("goodsCd").trim())) {
 				shoplinkerGoods.setGoodsCd(gagaMap.getString("goodsCd"));
 
 				// 1. 단품생성
-				rtnMap = createOptionRegisterXml(shoplinkerGoods);
-				optionAll += rtnMap.getInt("allCnt");
-				optionSucc += rtnMap.getInt("succCnt");
+				createOptionRegisterXml(shoplinkerGoods);
 
 				// 2. 상품생성
-				tProdSucc = createGoodsRegisterXml(shoplinkerGoods);
-				productSucc += tProdSucc;
+				createGoodsRegisterXml(shoplinkerGoods);
 
 				// 3. 고시정보(품목정보)
-				goodsNotiSucc += createGoodsNotiRegisterXml(shoplinkerGoods);
+				createGoodsNotiRegisterXml(shoplinkerGoods);
 
 				// 4. 인증정보
-				certSucc += createCertRegisterXml(shoplinkerGoods);
+				createCertRegisterXml(shoplinkerGoods);
 
 				// 5. 상품이미지정보
-				imageSucc += createImageRegisterXml(shoplinkerGoods);
+				createImageRegisterXml(shoplinkerGoods);
 			}
 		}
-
-		rtnMap = new GagaMap();
-		rtnMap.setInt("excelCnt", excelCnt);
-		rtnMap.setInt("optionAll", optionAll);
-		rtnMap.setInt("optionSucc", optionSucc);
-		rtnMap.setInt("productSucc", productSucc);
-		rtnMap.setInt("goodsNotiSucc", goodsNotiSucc);
-		rtnMap.setInt("certSucc", certSucc);
-		rtnMap.setInt("imageSucc", imageSucc);
-
-		return rtnMap;
 	}
 
 	/**
@@ -115,9 +97,8 @@ public class TsaShoplinkerService {
 	 * @author jmh
 	 * @since 2021. 5. 20
 	 */
-	private GagaMap createOptionRegisterXml(ShoplinkerGoods shoplinkerGoods) throws IOException {
+	private void createOptionRegisterXml(ShoplinkerGoods shoplinkerGoods) {
 
-		GagaMap returnMap = new GagaMap();
 		ShoplinkerGoods regMap = new ShoplinkerGoods();
 		regMap.setApiType("OPTION");
 		regMap.setApiSubUrl(env.getProperty("shoplinker.url.option"));
@@ -126,14 +107,10 @@ public class TsaShoplinkerService {
 		regMap.setXmlPath(shoplinkerGoods.getXmlPath());
 		regMap.setDomainUrl(shoplinkerGoods.getDomainUrl());
 
-		int succCnt = 0;
-		int allCnt = 0;
-
 		try {
 			// 옵션 목록조회
 			Collection<ShoplinkerGoods> list = admShoplinkerDao.getOptionList(shoplinkerGoods);
 			if( null != list && !list.isEmpty()) {
-				allCnt = list.size();
 
 				StringBuilder sbRequest;
 				int opCnt = 0;
@@ -166,7 +143,7 @@ public class TsaShoplinkerService {
 					regMap.setQuantity(map.getQuantity());		// 재고 기록은 실재고 기록 0일경우 샵링커에 전송하지 않기위함.(md가 샵링커에서 몰로 수동전송시 재고가 0일경우 몰에 등록안된다 함)
 
 					// api 호출 및 결과 history 저장
-					succCnt += callGoodsRegApi(regMap , sbRequest, "option_"+opCnt);
+					callGoodsRegApi(regMap , sbRequest, "option_"+opCnt);
 				}
 			}
 		}catch(Exception e) {
@@ -175,11 +152,6 @@ public class TsaShoplinkerService {
 			regMap.setApiMessage("xml 생성오류");
 			tscShoplinkerDao.insertShoplinerApiHst(regMap);
 		}
-
-		returnMap.setInt("allCnt", allCnt);
-		returnMap.setInt("succCnt", succCnt);
-
-		return returnMap;
 	}
 
 	/**
@@ -190,7 +162,7 @@ public class TsaShoplinkerService {
 	 * @author jmh
 	 * @since 2021. 5. 20
 	 */
-	public int createGoodsRegisterXml(ShoplinkerGoods shoplinkerGoods) throws IOException {
+	public void createGoodsRegisterXml(ShoplinkerGoods shoplinkerGoods) {
 
 		ShoplinkerGoods regMap = new ShoplinkerGoods();
 		regMap.setApiType("PRODUCT");
@@ -200,8 +172,6 @@ public class TsaShoplinkerService {
 		regMap.setXmlPath(shoplinkerGoods.getXmlPath());
 		regMap.setDomainUrl(shoplinkerGoods.getDomainUrl());
 
-		int succCnt = 0;
-
 		try {
 			// 상품기본정보
 			ShoplinkerGoods goodsMap = admShoplinkerDao.getGoods(shoplinkerGoods);
@@ -265,7 +235,7 @@ public class TsaShoplinkerService {
 
 			if( null != goodsMap.getShoplinkerItemkindNm()) {
 				// api 호출 및 결과 history 저장
-				succCnt = callGoodsRegApi(regMap , sbRequest, "product");
+				callGoodsRegApi(regMap , sbRequest, "product");
 
 			}else {
 				// 품목매핑정보 없음. 전송 안함
@@ -281,8 +251,6 @@ public class TsaShoplinkerService {
 			regMap.setApiMessage("xml 생성오류");
 			tscShoplinkerDao.insertShoplinerApiHst(regMap);
 		}
-
-		return succCnt;
 	}
 
 	/**
@@ -590,7 +558,7 @@ public class TsaShoplinkerService {
 	 * @author jmh
 	 * @since 2021. 5. 20
 	 */
-	private int createGoodsNotiRegisterXml(ShoplinkerGoods shoplinkerGoods) throws IOException {
+	private void createGoodsNotiRegisterXml(ShoplinkerGoods shoplinkerGoods) {
 
 		ShoplinkerGoods regMap = new ShoplinkerGoods();
 		regMap.setApiType("NOTI");
@@ -600,8 +568,6 @@ public class TsaShoplinkerService {
 		regMap.setXmlPath(shoplinkerGoods.getXmlPath());
 		regMap.setDomainUrl(shoplinkerGoods.getDomainUrl());
 
-		int succCnt = 0;
-
 		try {
 
 			Collection<ShoplinkerGoods> list = admShoplinkerDao.getGoodsNotiList(shoplinkerGoods);
@@ -636,7 +602,7 @@ public class TsaShoplinkerService {
 					sbRequest.append("</openMarket>\n");
 
 					// api 호출 및 결과 history 저장
-					succCnt = callGoodsRegApi(regMap , sbRequest, "goods");
+					callGoodsRegApi(regMap , sbRequest, "goods");
 				}
 			}
 
@@ -646,7 +612,6 @@ public class TsaShoplinkerService {
 			regMap.setApiMessage("xml 생성오류");
 			tscShoplinkerDao.insertShoplinerApiHst(regMap);
 		}
-		return succCnt;
 	}
 
 	/**
@@ -657,7 +622,7 @@ public class TsaShoplinkerService {
 	 * @author jmh
 	 * @since 2021. 5. 20
 	 */
-	private int createCertRegisterXml(ShoplinkerGoods shoplinkerGoods) throws IOException {
+	private void createCertRegisterXml(ShoplinkerGoods shoplinkerGoods) {
 
 		ShoplinkerGoods regMap = new ShoplinkerGoods();
 		regMap.setApiType("CERT");
@@ -667,8 +632,6 @@ public class TsaShoplinkerService {
 		regMap.setXmlPath(shoplinkerGoods.getXmlPath());
 		regMap.setDomainUrl(shoplinkerGoods.getDomainUrl());
 
-		int succCnt = 0;
-
 		try {
 
 			ShoplinkerGoods map = admShoplinkerDao.getCert(shoplinkerGoods);
@@ -706,7 +669,7 @@ public class TsaShoplinkerService {
 			sbRequest.append("</shoplinker>\n");
 
 			// api 호출 및 결과 history 저장
-			succCnt = callGoodsRegApi(regMap , sbRequest, "cert");
+			callGoodsRegApi(regMap , sbRequest, "cert");
 
 		}catch(Exception e) {
 			log.error("xml 생성오류 ", e);
@@ -714,8 +677,6 @@ public class TsaShoplinkerService {
 			regMap.setApiMessage("xml 생성오류");
 			tscShoplinkerDao.insertShoplinerApiHst(regMap);
 		}
-
-		return succCnt;
 	}
 
 	/**
@@ -726,7 +687,7 @@ public class TsaShoplinkerService {
 	 * @author jmh
 	 * @since 2021. 5. 20
 	 */
-	private int createImageRegisterXml(ShoplinkerGoods shoplinkerGoods) throws IOException {
+	private void createImageRegisterXml(ShoplinkerGoods shoplinkerGoods) {
 
 		ShoplinkerGoods regMap = new ShoplinkerGoods();
 		regMap.setApiType("IMAGE");
@@ -736,8 +697,6 @@ public class TsaShoplinkerService {
 		regMap.setXmlPath(shoplinkerGoods.getXmlPath());
 		regMap.setDomainUrl(shoplinkerGoods.getDomainUrl());
 
-		int succCnt = 0;
-
 		try {
 
 			// 상품이미지정보
@@ -780,7 +739,7 @@ public class TsaShoplinkerService {
 				sbRequest.append("</Shoplinker>\n");
 
 				// api 호출 및 결과 history 저장
-				succCnt = callGoodsRegApi(regMap , sbRequest, "image");
+				callGoodsRegApi(regMap , sbRequest, "image");
 			}
 
 		}catch(Exception e) {
@@ -789,8 +748,6 @@ public class TsaShoplinkerService {
 			regMap.setApiMessage("xml 생성오류");
 			tscShoplinkerDao.insertShoplinerApiHst(regMap);
 		}
-
-		return succCnt;
 	}
 
 	/**
@@ -801,13 +758,13 @@ public class TsaShoplinkerService {
 	 * @author jmh
 	 * @since 2021. 5. 20
 	 */
-	private int callGoodsRegApi(ShoplinkerGoods map, StringBuilder sbRequest, String fileNm) throws IOException {
+	private void callGoodsRegApi(ShoplinkerGoods map, StringBuilder sbRequest, String fileNm) throws Exception {
 
-		int succCnt = 0;
 		map.setApiProductId(null);
 		com.gagaframework.shoplinker.domain.goods.result.Shoplinker shoplinkerResult;
 		com.gagaframework.shoplinker.domain.goods.result.ResultMessage resultMsg;
 
+		String responseXmlData = "";
 		StringBuilder xmlFileName = new StringBuilder();
 
 		try {
@@ -824,7 +781,7 @@ public class TsaShoplinkerService {
 			String apiUrl = GagaShoplinkerConstants.API_DOMAIN + map.getApiSubUrl() + URLEncoder.encode(xmlUrl);
 
 			// API 호출결과
-			String responseXmlData = shoplinkerUtil.callShoplinkerApiByGet(apiUrl, "");
+			responseXmlData = shoplinkerUtil.callShoplinkerApiByGet(apiUrl, "");
 
 			// response 결과
 			shoplinkerResult = (com.gagaframework.shoplinker.domain.goods.result.Shoplinker)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.goods.result.Shoplinker.class, responseXmlData);
@@ -836,8 +793,6 @@ public class TsaShoplinkerService {
 			map.setApiMessage(StringUtils.abbreviate(resultMsg.getMessage(), 0 , 120));
 
 			if( "true".equals(resultMsg.getResult())){
-				succCnt = 1;
-
 				// 재고 단품 생성
 				if( "OPTION".equals(map.getApiType())) {
 					admShoplinkerDao.insertStockOption(map);
@@ -845,10 +800,10 @@ public class TsaShoplinkerService {
 			}
 
 		} catch (Exception e) {
-			log.error("error", e);
+			log.error(" callGoodsRegApi error", e);
 			map.setXmlTxt(sbRequest.toString());
 			map.setApiResult("error");
-			map.setApiMessage("API 오류");
+			map.setApiMessage("API 오류 "+StringUtils.abbreviate(responseXmlData, 0 , 120));
 		}
 
 		// 전송이력 저장
@@ -856,8 +811,6 @@ public class TsaShoplinkerService {
 
 		// 생성 파일삭제
 		GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(map.getXmlPath(), xmlFileName.toString()));
-
-		return succCnt;
 	}
 
 	/**

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

@@ -209,7 +209,7 @@ log.info(" #### SHOPLINKER CHK1 - "+runMap.getRunCnt() +" || "+GagaDateUtil.getT
 				shoplinkerGoods.setCustomerId(env.getProperty("shoplinker.customer_id"));
 				shoplinkerGoods.setRegNo(TsaSession.getInfo().getUserNo());
 				log.info(" #### SHOPLINKER CHK2 ");
-				rtnMap = admShoplinkerService.createShoplinkerXml(ecxelGoodsList, shoplinkerGoods);
+				admShoplinkerService.createShoplinkerXml(ecxelGoodsList, shoplinkerGoods);
 
 				// 4. 파일 삭제
 				GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, shoplinkerGoods.getExcelFileNm()));

+ 3 - 3
src/main/java/com/style24/persistence/domain/CustGradePolicy.java

@@ -21,11 +21,11 @@ public class CustGradePolicy extends TscBaseDomain {
 	private int minBuyAmt;			// 등급산정최소구매금액
 	private int minBuyCnt;			// 등급산정최소구매건수
 	private int buyExceptAmt;		// 구매제외금액(최소구매건수제외조건)
-	private String gradeCpnId1;		// 혜택쿠폰1
+	private int gradeCpnId1;		// 혜택쿠폰1
 	private String gradeCpnNm1;		// 혜택쿠폰명1
-	private String gradeCpnId2;		// 혜택쿠폰2
+	private int gradeCpnId2;		// 혜택쿠폰2
 	private String gradeCpnNm2;		// 혜택쿠폰명2
-	private String gradeCpnId3;		// 혜택쿠폰3
+	private int gradeCpnId3;		// 혜택쿠폰3
 	private String gradeCpnNm3;		// 혜택쿠폰명3
 	private int dispOrd;			// 표시순서
 	private String useYn;			// 사용여부

+ 105 - 105
src/main/java/com/style24/persistence/mybatis/shop/TsaEnvset.xml

@@ -6,58 +6,58 @@
 	<insert id="createEnvset" parameterType="Envset">
 		/* TsaEnvset.createEnvset */
 		INSERT INTO TB_ENVSET (
-								ENVSET_SQ
-							  , SITE_CD
-							  , ENVSET_TYPE
-							  , ENVSET_NM
-							  , STR_SET_VAL1
-							  , STR_SET_VAL2
-							  , STR_SET_VAL3
-							  , STR_SET_VAL4
-							  , STR_SET_VAL5
-							  , STR_SET_VAL6
-							  , STR_SET_VAL7
-							  , STR_SET_VAL8
-							  , REG_NO
-							  , REG_DT
+		       ENVSET_SQ
+		     , SITE_CD
+		     , ENVSET_TYPE
+		     , ENVSET_NM
+		     , STR_SET_VAL1
+		     , STR_SET_VAL2
+		     , STR_SET_VAL3
+		     , STR_SET_VAL4
+		     , STR_SET_VAL5
+		     , STR_SET_VAL6
+		     , STR_SET_VAL7
+		     , STR_SET_VAL8
+		     , REG_NO
+		     , REG_DT
 		)
 		VALUES (
-				   NULL
-			   , #{siteCd}
-			   , #{envsetType}
-			   , #{envsetNm}
-			   , #{strSetVal1}
-			   , #{strSetVal2}
-			   , #{strSetVal3}
-			   , #{strSetVal4}
-			   , #{strSetVal5}
-			   , #{strSetVal6}
-			   , #{strSetVal7}
-			   , #{strSetVal8}
-			   , #{regNo}
-			   , NOW()
-			   )
+		        NULL
+		     , #{siteCd}
+		     , #{envsetType}
+		     , #{envsetNm}
+		     , #{strSetVal1}
+		     , #{strSetVal2}
+		     , #{strSetVal3}
+		     , #{strSetVal4}
+		     , #{strSetVal5}
+		     , #{strSetVal6}
+		     , #{strSetVal7}
+		     , #{strSetVal8}
+		     , #{regNo}
+		     , NOW()
+		)
 	</insert>
 
 	<!-- 환경설정 목록 -->
 	<select id="getEnvsetList" parameterType="Envset" resultType="Envset">
 		/* TsaEnvset.getEnvsetList */
 		SELECT SITE_CD
-			 , ENVSET_TYPE
-			 , ENVSET_NM
-			 , STR_SET_VAL1
-			 , STR_SET_VAL2
-			 , STR_SET_VAL3
-			 , STR_SET_VAL4
-			 , STR_SET_VAL5
-			 , STR_SET_VAL6
-			 , STR_SET_VAL7
-			 , STR_SET_VAL8
-			 , FN_GET_USER_NM(REG_NO)             AS REG_NM
-			 , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT
+		     , ENVSET_TYPE
+		     , ENVSET_NM
+		     , STR_SET_VAL1
+		     , STR_SET_VAL2
+		     , STR_SET_VAL3
+		     , STR_SET_VAL4
+		     , STR_SET_VAL5
+		     , STR_SET_VAL6
+		     , STR_SET_VAL7
+		     , STR_SET_VAL8
+		     , FN_GET_USER_NM(REG_NO)             AS REG_NM
+		     , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT
 		FROM   TB_ENVSET
 		WHERE  SITE_CD = #{siteCd}
-		  AND    ENVSET_TYPE = #{envsetType}
+		AND    ENVSET_TYPE = #{envsetType}
 		ORDER  BY ENVSET_SQ DESC
 	</select>
 
@@ -65,80 +65,80 @@
 	<insert id="createCustomerGradePolicy" parameterType="CustGradePolicy">
 		/* TsaEnvset.createCustomerGradePolicy */
 		INSERT INTO TB_CUST_GRADE_POLICY (
-										   SITE_CD
-										 , GRADE_CD
-										 , ICON_NM
-										 , CAL_MONTHS
-										 , MIN_BUY_AMT
-										 , MIN_BUY_CNT
-										 , BUY_EXCEPT_AMT
-										 , GRADE_CPN_ID1
-										 , GRADE_CPN_ID2
-										 , GRADE_CPN_ID3
-										 , DISP_ORD
-										 , USE_YN
-										 , REG_NO
-										 , REG_DT
-										 , UPD_NO
-										 , UPD_DT
+		       SITE_CD
+		     , GRADE_CD
+		     , ICON_NM
+		     , CAL_MONTHS
+		     , MIN_BUY_AMT
+		     , MIN_BUY_CNT
+		     , BUY_EXCEPT_AMT
+		     , GRADE_CPN_ID1
+		     , GRADE_CPN_ID2
+		     , GRADE_CPN_ID3
+		     , DISP_ORD
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
 		)
 		VALUES (
-				   #{siteCd}
-			   , #{gradeCd}
-			   , #{iconNm}
-			   , #{calMonths}
-			   , #{minBuyAmt}
-			   , #{minBuyCnt}
-			   , #{buyExceptAmt}
-			   , #{gradeCpnId1}
-			   , #{gradeCpnId2}
-			   , #{gradeCpnId3}
-			   , #{dispOrd}
-			   , #{useYn}
-			   , #{regNo}
-			   , NOW()
-			   , #{updNo}
-			   , NOW()
-			   )
-			ON DUPLICATE KEY UPDATE
-								 ICON_NM = #{iconNm}
-								 , CAL_MONTHS = #{calMonths}
-								 , MIN_BUY_AMT = #{minBuyAmt}
-								 , MIN_BUY_CNT = #{minBuyCnt}
-								 , BUY_EXCEPT_AMT = #{buyExceptAmt}
-								 , GRADE_CPN_ID1 = #{gradeCpnId1}
-								 , GRADE_CPN_ID2 = #{gradeCpnId2}
-								 , GRADE_CPN_ID3 = #{gradeCpnId3}
-								 , DISP_ORD = #{dispOrd}
-								 , USE_YN = #{useYn}
-								 , UPD_NO = #{updNo}
-								 , UPD_DT = NOW()
+		       #{siteCd}
+		     , #{gradeCd}
+		     , #{iconNm}
+		     , #{calMonths}
+		     , #{minBuyAmt}
+		     , #{minBuyCnt}
+		     , #{buyExceptAmt}
+		     , #{gradeCpnId1}
+		     , #{gradeCpnId2}
+		     , #{gradeCpnId3}
+		     , #{dispOrd}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       ICON_NM = #{iconNm}
+		     , CAL_MONTHS = #{calMonths}
+		     , MIN_BUY_AMT = #{minBuyAmt}
+		     , MIN_BUY_CNT = #{minBuyCnt}
+		     , BUY_EXCEPT_AMT = #{buyExceptAmt}
+		     , GRADE_CPN_ID1 = #{gradeCpnId1}
+		     , GRADE_CPN_ID2 = #{gradeCpnId2}
+		     , GRADE_CPN_ID3 = #{gradeCpnId3}
+		     , DISP_ORD = #{dispOrd}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
 	</insert>
 
 	<!-- 회원등급정책 목록 -->
 	<select id="getCustomerGradePolicyList" parameterType="CustGradePolicy" resultType="CustGradePolicy">
 		/* TsaEnvset.getCustomerGradePolicyList */
 		SELECT SITE_CD
-		, GRADE_CD
-		, ICON_NM
-		, CAL_MONTHS
-		, MIN_BUY_AMT
-		, MIN_BUY_CNT
-		, BUY_EXCEPT_AMT
-		, GRADE_CPN_ID1
-		, FN_GET_COUPON_NM(GRADE_CPN_ID1)    AS GRADE_CPN_NM1
-		, GRADE_CPN_ID2
-		, FN_GET_COUPON_NM(GRADE_CPN_ID2)    AS GRADE_CPN_NM2
-		, GRADE_CPN_ID3
-		, FN_GET_COUPON_NM(GRADE_CPN_ID3)    AS GRADE_CPN_NM3
-		, DISP_ORD
-		, USE_YN
-		, FN_GET_USER_NM(UPD_NO)             AS UPD_NM
-		, DATE_FORMAT(UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
+		     , GRADE_CD
+		     , ICON_NM
+		     , CAL_MONTHS
+		     , MIN_BUY_AMT
+		     , MIN_BUY_CNT
+		     , BUY_EXCEPT_AMT
+		     , GRADE_CPN_ID1
+		     , FN_GET_COUPON_NM(GRADE_CPN_ID1)    AS GRADE_CPN_NM1
+		     , GRADE_CPN_ID2
+		     , FN_GET_COUPON_NM(GRADE_CPN_ID2)    AS GRADE_CPN_NM2
+		     , GRADE_CPN_ID3
+		     , FN_GET_COUPON_NM(GRADE_CPN_ID3)    AS GRADE_CPN_NM3
+		     , DISP_ORD
+		     , USE_YN
+		     , FN_GET_USER_NM(UPD_NO)             AS UPD_NM
+		     , DATE_FORMAT(UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
 		FROM   TB_CUST_GRADE_POLICY A
 		WHERE  SITE_CD = #{siteCd}
 		<if test="gradeCd != null and gradeCd != ''">
-			AND    GRADE_CD = #{gradeCd}
+		AND    GRADE_CD = #{gradeCd}
 		</if>
 		ORDER  BY SITE_CD, GRADE_CD
 	</select>

+ 73 - 4
src/main/webapp/WEB-INF/views/display/MainContentsPopupForm.html

@@ -1037,6 +1037,7 @@
 	// SMM001 데이터 validation 체크
 	function smm001DataValidation(){
 		var dataBool = true;
+		let dupCnt = 0;
 		$(".mcTable").each(function(i){
 			var thisIdx = $(this).find("input[name=tableIdx]").val();
 			var contentsTypeVal = $(this).find("input:radio[name=contentsType"+thisIdx+"]:checked").val();
@@ -1048,25 +1049,30 @@
 
 			if(gagajf.isNull(contentsTypeVal)){
 				mcxDialog.alert((i+1)+'번째 컨텐츠 유형을 선택해주세요.');
+				dupCnt++;
 				return false;
 			}
 			if(contentsTypeVal=='P'){
 				if(gagajf.isNull($(this).find("input[name=planSq"+thisIdx+"]").val())){
 					mcxDialog.alert((i+1)+'번째 기획전 번호를 입력해주세요.');
 					$(this).find("input[name=planSq"+thisIdx+"]").focus();
+					dupCnt++;
 					return false;
 				}
 			}
 			if(gagajf.isNull(textColorVal)){
 				mcxDialog.alert((i+1)+'번째 썸네일 글자 색상을 선택해주세요.');
+				dupCnt++;
 				return false;
 			}
 			if(gagajf.isNull(imgVal) && gagajf.isNull(newImgVal)){
 				mcxDialog.alert((i+1)+'번째 이미지를 선택해주세요.');
+				dupCnt++;
 				return false;
 			}
 			if(gagajf.isNull(mImgVal) && gagajf.isNull(mNewImgVal)){
 				mcxDialog.alert((i+1)+'번째 모바일용 이미지를 선택해주세요.');
+				dupCnt++;
 				return false;
 			}
 		});
@@ -1075,7 +1081,9 @@
 		// }else{
 		// 	return true;
 		// }
-		return true;
+		if(dupCnt==0){
+			return true;
+		}
 	}
 
 	// 전시 일시 체크
@@ -1106,6 +1114,7 @@
 	// 동영상 확장자 체크
 	function videoValidation(){
 		var dataBool = true;
+		let dupCnt = 0;
 		$(".mcTable").each(function(i){
 			var thisIdx = $(this).find("input[name=tableIdx]").val();
 			if($(this).find("input:radio[name=tvPlayer"+thisIdx+"]:checked").val()=='M' && ($(this).find("input[name=tvMediaKey"+thisIdx+"]").val()==null || $(this).find("input[name=tvMediaKey"+thisIdx+"]").val()=='')){
@@ -1114,6 +1123,7 @@
 				if(ext!='mp4'&&ext!='MP4'){
 					mcxDialog.alert((i+1) +'번째 ' +ext+'파일은 업로드 하실 수 없습니다.');
 					$(this).find("input:radio[name=tvPlayer"+thisIdx+"]").focus();
+					dupCnt++;
 					return false;
 				}
 			}
@@ -1124,55 +1134,65 @@
 		// }else{
 		// 	return true;
 		// }
-		return true;
+		if(dupCnt==0){
+			return true;
+		}
 	}
 
 	var bannerDataValidation = function (){
 		var dataBool = true;
+		let dupCnt = 0;
 		$(".mcTable").each(function(i) {
 			var thisIdx = $(this).find("input[name=tableIdx]").val();
 			var bannerType = $(this).find("input[name=bannerType"+thisIdx+"]:checked").val();
-			console.log(i+1+' bannerType::'+bannerType);
 
 			if(bannerType == 1){
 				if(gagajf.isNull($("#mcTable"+thisIdx+" #halfBanner0").find("input[name=imgPath]").val())){
 					if(gagajf.isNull($("#mcTable"+thisIdx+" #halfBanner0").find("input[name=newImgFile]").val())){
 						mcxDialog.alert((i+1) +'번째 컨텐츠 1단 이미지를 선택해주세요.');
+						dupCnt++;
 						return false;
 					}
 				}
 
 				if(gagajf.isNull($("#mcTable"+thisIdx+" #link1dep").find("input[name=link]").val())){
 					mcxDialog.alert((i+1) +'번째 컨텐츠 1단 링크를 입력해주세요.');
+					dupCnt++;
 					return false;
 				}
 			}else{
 				if(gagajf.isNull($("#mcTable"+thisIdx+" #halfBanner0").find("input[name=imgPath]").val())){
 					if(gagajf.isNull($("#mcTable"+thisIdx+" #halfBanner0").find("input[name=newImgFile]").val())){
 						mcxDialog.alert((i+1) +'번째 컨텐츠 1단 이미지를 선택해주세요.');
+						dupCnt++;
 						return false;
 					}
 				}
 
 				if(gagajf.isNull($("#mcTable"+thisIdx+" #link1dep").find("input[name=link]").val())){
 					mcxDialog.alert((i+1) +'번째 컨텐츠 1단 링크를 입력해주세요.');
+					dupCnt++;
 					return false;
 				}
 
 				if(gagajf.isNull($("#mcTable"+thisIdx+" #halfBanner1").find("input[name=imgPath]").val())){
 					if(gagajf.isNull($("#mcTable"+thisIdx+" #halfBanner1").find("input[name=newImgFile]").val())){
 						mcxDialog.alert((i+1) +'번째 컨텐츠 2단 이미지를 선택해주세요.');
+						dupCnt++;
 						return false;
 					}
 				}
 
 				if(gagajf.isNull($("#mcTable"+thisIdx+" #link2dep").find("input[name=link]").val())){
 					mcxDialog.alert((i+1) +'번째 컨텐츠 2단 링크를 입력해주세요.');
+					dupCnt++;
 					return false;
 				}
 			}
 		});
-		return true;
+		if(dupCnt==0){
+			return true;
+		}
 		// if(!dataBool){
 		// 	return false;
 		// }else{
@@ -1180,6 +1200,50 @@
 		// }
 	}
 
+	var dateNullValidation = function (){
+		var dateBool = true;
+		let dupCnt = 0;
+		$(".mcTable").each(function(i){
+			if(gagajf.isNull($(this).find("[name=dispStdt]").val())){
+				mcxDialog.alert((i+1) +"번째 " +"시작일자를 입력해주세요.");
+				$(this).find('input[name=dispStdt]').focus();
+				// dateBool = false;
+				dupCnt++;
+				return false;
+			}
+
+			if(gagajf.isNull($(this).find("[name=dispEddt]").val())){
+				mcxDialog.alert((i+1) +"번째 " +"종료일자를 입력해주세요.");
+				$(this).find('input[name=dispEddt]').focus();
+				// dateBool = false;
+				dupCnt++;
+				return false;
+			}
+
+			var thisIdx = $(this).find("input[name=tableIdx]").val();
+			var dispStdt = $(this).find("[name=dispStdt]").val().replace(/[^0-9]/g, '') + "" +$(this).find("[name=stTimeHour]").val().replace('시', '') + "" +$(this).find("[name=stTimeMin]").val().replace('분', '') + "00";
+			var dispEddt = $(this).find("[name=dispEddt]").val().replace(/[^0-9]/g, '') + "" +$(this).find("[name=edTimeHour]").val().replace('시', '') + "" +$(this).find("[name=edTimeMin]").val().replace('분', '') + "59";
+
+			let fromDate = dispStdt.replace(/[^0-9]/g, '');
+			let toDate = dispEddt.replace(/[^0-9]/g, '');
+			if(fromDate > toDate){
+				mcxDialog.alert((i+1) +"번째 " +"시작일자는 종료일자 보다 클 수 없습니다.");
+				$(this).find('input[name=dispStdt]').focus();
+				// dateBool = false;
+				dupCnt++;
+				return false;
+			}
+		});
+		// if(!dateBool){
+		// 	return false;
+		// }else{
+		// 	return true;
+		// }
+		if(dupCnt==0){
+			return true;
+		}
+	}
+
 	/**
 	 * 임시저장
 	 */
@@ -1189,6 +1253,11 @@
 			if (!gagajf.checkRequired("#popSortable")) {
 				return;
 			}
+		}else{
+			// 전시일시 체크
+			if(!dateNullValidation()){
+				return false;
+			}
 		}
 
 		// 전시일시 체크

+ 14 - 3
src/main/webapp/WEB-INF/views/display/MainGnbContentsPopupForm.html

@@ -304,12 +304,14 @@
 	// 데이터 체크
 	function groupDataValidation(){
 		var dataBool = true;
+		let dupCnt = 0;
 		$(".tabTable").each(function (i){
 			var thisIdx = $(this).find("input[name=tableIdx]").val();
 			$(this).find("input[name=brandGroup"+thisIdx+"]").each(function (idx2){
 				if(gagajf.isNull($(this).val())){
 					mcxDialog.alert((i+1)+"번째 컨텐츠영역의 "+(idx2+1)+"번째 GROUP명을 입력해주세요.");
 					$(this).focus();
+					dupCnt++;
 					return false;
 				}
 			});
@@ -317,18 +319,21 @@
 			if($("#tabTable"+thisIdx+" #tabBrand1 #brandListTd1").find('ul').find('input[name=brandGroupNo]').length < 1){
 				mcxDialog.alert((i+1)+"번째 컨텐츠영역의 1번째 브랜드 정보가 없습니다.");
 				$(this).focus();
+				dupCnt++;
 				return false;
 			}
 
 			if($("#tabTable"+thisIdx+" #tabBrand2 #brandListTd2").find('ul').find('input[name=brandGroupNo]').length < 1){
 				mcxDialog.alert((i+1)+"번째 컨텐츠영역의 2번째 브랜드 정보가 없습니다.");
 				$(this).focus();
+				dupCnt++;
 				return false;
 			}
 
 			if($("#tabTable"+thisIdx+" #tabBrand3 #brandListTd3").find('ul').find('input[name=brandGroupNo]').length < 1){
 				mcxDialog.alert((i+1)+"번째 컨텐츠영역의 3번째 브랜드 정보가 없습니다.");
 				$(this).focus();
+				dupCnt++;
 				return false;
 			}
 		});
@@ -338,18 +343,22 @@
 		// }else{
 		// 	return true;
 		// }
-		return true;
+		if(dupCnt==0){
+			return true;
+		}
+
 	}
 
 	// 유형선택 체크
 	var dataTypeValidation = function (){
 		var dataBool = true;
-
+		let dupCnt = 0;
 		$("#gnbTabList .tabTable").each(function (i){
 			var thisIdx = $(this).find("input[name=tableIdx]").val();
 			if(gagajf.isNull($(this).find("input:radio[name=cateType"+thisIdx+"]:checked").val())){
 				mcxDialog.alert((i+1)+'번째 유형을 선택해주세요.');
 				// dataBool = false;
+				dupCnt++;
 				return false;
 			}
 		});
@@ -359,7 +368,9 @@
 		// }else{
 		// 	return true;
 		// }
-		return true;
+		if(dupCnt==0){
+			return true;
+		}
 	}
 
 	/**

+ 5 - 2
src/main/webapp/WEB-INF/views/display/MainMultiContentsPopupForm.html

@@ -579,7 +579,7 @@ console.log('brandGroupNo:'+brandGroupNo);
 	// 몰메인 신상품 : 상품데이터 체크
 	var goodsArrValidation = function (){
 		var dataBool = true;
-
+		let dupCnt = 0;
 		$("#multiPopSortable .tableTest").each(function(i){
 			var thisIdx = $(this).find("input[name=tableIdx]").val();
 
@@ -587,6 +587,7 @@ console.log('brandGroupNo:'+brandGroupNo);
 				mcxDialog.alert((i+1)+"번째 컨텐츠영역의 상품 정보가 없습니다.");
 				$(this).focus();
 				// dataBool = false;
+				dupCnt++;
 				return false;
 			}
 		});
@@ -596,7 +597,9 @@ console.log('brandGroupNo:'+brandGroupNo);
 		// }else{
 		// 	return true;
 		// }
-		return true;
+		if(dupCnt==0){
+			return true;
+		}
 	}
 
 	/**

+ 1 - 1
src/main/webapp/WEB-INF/views/shoplinker/ShoplinkerOrderForm.html

@@ -29,7 +29,7 @@
 
 			<div class="panelStyle">
 				<div class="panelTitle">
-					<h3><i class="fa fa-info-circle"></i>[배치주기] 평일: 5시~15시 한시간 단위 | (월) 5시: 전주 금요일 15 ~ 금일 5시 / (화~금) 5시: 전날 15 ~ 금일 5시 -T1</h3>
+					<h3><i class="fa fa-info-circle"></i>[배치주기] 평일: 5시~15시 한시간 단위 | (월) 5시: 전주 금요일 15 ~ 금일 5시 / (화~금) 5시: 전날 15 ~ 금일 5시 -v1</h3>
 					<span class="panelControl">
 						<i class="fa fa-chevron-up"></i>
 					</span>