Przeglądaj źródła

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

gagamel 5 lat temu
rodzic
commit
30ce5014c2
38 zmienionych plików z 3785 dodań i 1524 usunięć
  1. 123 1
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java
  2. 11 12
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaOrderDao.java
  3. 243 0
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaGoodsService.java
  4. 13 14
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaOrderService.java
  5. 147 3
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaGoodsController.java
  6. 37 5
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaOrderController.java
  7. 13 13
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaRendererController.java
  8. 31 0
      style24.admin/src/main/java/com/style24/persistence/domain/AdKeyword.java
  9. 28 0
      style24.admin/src/main/java/com/style24/persistence/domain/AdKeywordGoods.java
  10. 6 1
      style24.admin/src/main/java/com/style24/persistence/domain/Goods.java
  11. 30 0
      style24.admin/src/main/java/com/style24/persistence/domain/GoodsNaverLowestPrice.java
  12. 2 0
      style24.admin/src/main/java/com/style24/persistence/domain/GoodsSafeNo.java
  13. 13 1
      style24.admin/src/main/java/com/style24/persistence/domain/Order.java
  14. 0 18
      style24.admin/src/main/java/com/style24/persistence/domain/OrderDetailForm.html
  15. 297 3
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  16. 346 82
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml
  17. 488 0
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsAdKeywordForm.html
  18. 103 30
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html
  19. 25 5
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsListForm.html
  20. 147 161
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsNaverPriceForm.html
  21. 274 100
      style24.admin/src/main/webapp/WEB-INF/views/order/OrderDetailForm.html
  22. 102 57
      style24.admin/src/main/webapp/WEB-INF/views/order/OrderListForm.html
  23. 88 73
      style24.admin/src/main/webapp/ux/css/admin.ui.css
  24. 0 13
      style24.batch/.classpath
  25. 2 0
      style24.batch/src/main/java/com/style24/batch/biz/service/TsbGoodsService.java
  26. 1 1
      style24.batch/src/main/java/com/style24/batch/biz/task/TsbGoodsTask.java
  27. 2 0
      style24.batch/src/main/java/com/style24/persistence/domain/GoodsSafeNo.java
  28. 9 0
      style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml
  29. 6 2
      style24.core/src/main/java/com/style24/core/biz/thirdparty/SafetyKoreaApi.java
  30. 6 0
      style24.scm/src/main/java/com/style24/persistence/domain/Goods.java
  31. 85 2
      style24.scm/src/main/java/com/style24/persistence/mybatis/shop/TssGoods.xml
  32. 29 0
      style24.scm/src/main/java/com/style24/scm/biz/dao/TssGoodsDao.java
  33. 29 0
      style24.scm/src/main/java/com/style24/scm/biz/service/TssGoodsService.java
  34. 16 3
      style24.scm/src/main/java/com/style24/scm/biz/web/TssGoodsController.java
  35. 13 13
      style24.scm/src/main/java/com/style24/scm/biz/web/TssRendererController.java
  36. 119 32
      style24.scm/src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html
  37. 25 3
      style24.scm/src/main/webapp/WEB-INF/views/goods/GoodsListForm.html
  38. 876 876
      style24.scm/src/main/webapp/ux/css/admin.ui.css

+ 123 - 1
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java

@@ -3,6 +3,8 @@ package com.style24.admin.biz.dao;
 import java.util.Collection;
 
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.AdKeyword;
+import com.style24.persistence.domain.AdKeywordGoods;
 import com.style24.persistence.domain.Color;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsCompose;
@@ -10,6 +12,7 @@ import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsEpSkip;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsImg;
+import com.style24.persistence.domain.GoodsNaverLowestPrice;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
 import com.style24.persistence.domain.GoodsResSell;
@@ -271,7 +274,6 @@ public interface TsaGoodsDao {
 	 */
 	Collection<NotiInfo> getNotiGoodsInfoList(NotiInfo notiInfo);
 
-
 	/**
 	 * 구성상품 목록
 	 *
@@ -850,4 +852,124 @@ public interface TsaGoodsDao {
 	 */
 	void updateGoodsSupplyPricecfrmDt(GoodsPriceRes goodsPriceRes);
 
+	/**
+	 * 상품 네이버 최저가 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 08
+	 */
+	Collection<GoodsNaverLowestPrice> getGoodsNaverPriceList(GoodsSearch goodsSearch);
+
+	/**
+	 * 상품 네이버 최저가 최종 작업일
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 09
+	 */
+	String getGoodsNaverLowestPriceReqYmd();
+
+	/**
+	 * 상품 네이버 최저가  삭제
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 09
+	 */
+	void deleteGoodsNaverLowestPrice();
+
+	/**
+	 * 상품 네이버 최저가 저장
+	 *
+	 * @param goodsNaverLowestPrice
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 09
+	 */
+	void saveGoodsNaverLowestPrice(GoodsNaverLowestPrice goodsNaverLowestPrice);
+
+	/**
+	 * 상품 구매등급 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 11
+	 */
+	Collection<Goods> getGoodsDetailOrderGradeList(Goods goods);
+
+	/**
+	 * 상품 구매등급 삭제
+	 *
+	 * @param map
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 11
+	 */
+	void deleteGoodsCustGrade(Goods goods);
+
+	/**
+	 * 상품 구매등급 저장
+	 *
+	 * @param map
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 11
+	 */
+	void createGoodsCustGrade(Goods goods);
+
+	/**
+	 * 광고 키워드 목록
+	 *
+	 * @param adKeyword
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 14
+	 */
+	Collection<AdKeyword> getAdKeywordList(AdKeyword adKeyword);
+
+	/**
+	 * 광고 키워드 저장
+	 *
+	 * @param adKeywordGoods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 14
+	 */
+	void saveAdKeyword(AdKeyword adKeyword);
+
+	/**
+	 * 광고 키워드 상품 목록
+	 *
+	 * @param adKeyword
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 14
+	 */
+	Collection<AdKeywordGoods> getAdKeywordGoodsList(AdKeyword adKeyword);
+
+	/**
+	 * 광고 키워드 상품 저장
+	 *
+	 * @param adKeywordGoods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 14
+	 */
+	void saveAdKeywordGoods(AdKeywordGoods adKeywordGoods);
+
+	/**
+	 * 광고 키워드 상품 삭제
+	 *
+	 * @param noticeGoods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 14
+	 */
+	void deleteAdKeywordGoods(AdKeywordGoods adKeywordGoods);
+
 }

+ 11 - 12
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaOrderDao.java

@@ -17,6 +17,15 @@ import com.style24.persistence.domain.Order;
 @ShopDs
 public interface TsaOrderDao {
 	
+	/**
+	 * 주문 목록 카운트
+	 * @param Order
+	 * @return
+	 * @author jsh77b	
+	 * @since 2020. 11. 18
+	 */
+	int getOrderListCount(Order order);
+	
 	/**
 	 * 주문 목록
 	 * @param Order
@@ -36,7 +45,7 @@ public interface TsaOrderDao {
 	Order getOrderListSumInfo(Order order);
 	
 	/**
-	 * 주문 정보
+	 * 주문기본정보
 	 *
 	 * @param Order - 주문 정보
 	 * @return
@@ -46,7 +55,7 @@ public interface TsaOrderDao {
 	Collection<Order> getOrderInfoList(Order order);
 	
 	/**
-	 * 주문상 목록
+	 * 주문상품정보 목록
 	 *
 	 * @param Order - 주문 정보
 	 * @return
@@ -55,16 +64,6 @@ public interface TsaOrderDao {
 	 */
 	Collection<Order> getOrderDetailList(Order order);
 	
-	/**
-	 * 주문상세 단품 목록
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	Collection<Order> getOrderDetailItemList(Order order);
-	
 	/**
 	 * 배송정보
 	 *

+ 243 - 0
style24.admin/src/main/java/com/style24/admin/biz/service/TsaGoodsService.java

@@ -15,8 +15,11 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.style24.admin.biz.dao.TsaGoodsDao;
 import com.style24.admin.support.env.TsaConstants;
 import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.biz.thirdparty.NaverLowestPriceApi;
 import com.style24.core.biz.thirdparty.SafetyKoreaApi;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.AdKeyword;
+import com.style24.persistence.domain.AdKeywordGoods;
 import com.style24.persistence.domain.Brand;
 import com.style24.persistence.domain.Color;
 import com.style24.persistence.domain.Goods;
@@ -25,6 +28,7 @@ import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsEpSkip;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsImg;
+import com.style24.persistence.domain.GoodsNaverLowestPrice;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
 import com.style24.persistence.domain.GoodsResSell;
@@ -33,6 +37,7 @@ import com.style24.persistence.domain.GoodsSearch;
 import com.style24.persistence.domain.GoodsTnmRes;
 import com.style24.persistence.domain.GoodsVideo;
 import com.style24.persistence.domain.Itemkind;
+import com.style24.persistence.domain.NaverLowestPrice;
 import com.style24.persistence.domain.NotiInfo;
 import com.style24.persistence.domain.Notice;
 import com.style24.persistence.domain.NoticeGoods;
@@ -88,6 +93,10 @@ public class TsaGoodsService {
 	@Autowired
 	private SafetyKoreaApi safetyKoreaApi;
 
+	@Autowired
+	private NaverLowestPriceApi naverLowestPriceApi;
+
+
 	@Autowired
 	private ObjectMapper mapper;
 
@@ -584,6 +593,18 @@ public class TsaGoodsService {
 		return goodsDao.getNotiGoodsInfoList(notiInfo);
 	}
 
+	/**
+	 * 상품 구매등급 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 18
+	 */
+	public Collection<Goods> getGoodsDetailOrderGradeList(Goods goods) {
+		return goodsDao.getGoodsDetailOrderGradeList(goods);
+	}
+
 	/**
 	 * 구성상품 목록
 	 *
@@ -626,6 +647,8 @@ public class TsaGoodsService {
 				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(TsaSession.getInfo().getUserNo());
 				goodsSafeNo.setUpdNo(TsaSession.getInfo().getUserNo());
 				goodsDao.saveGoodsSafeNo(goodsSafeNo);
@@ -1029,6 +1052,22 @@ public class TsaGoodsService {
 		// 상품 정보고시 변경
 		this.saveGoodsNotiInfo(goods);
 
+		// 상품 구매등급 적용
+		if (goods.getGoodsOrderGrade() != null && goods.getGoodsOrderGrade().length > 0) {
+			Goods goodsOrderGrade = new Goods();
+			goodsOrderGrade.setGoodsCd(goods.getGoodsCd());
+			goodsOrderGrade.setRegNo(TsaSession.getInfo().getUserNo());
+			goodsDao.deleteGoodsCustGrade(goodsOrderGrade);
+			for(String custGrade : goods.getGoodsOrderGrade()) {
+				goodsOrderGrade.setCustGrade(custGrade);
+				goodsDao.createGoodsCustGrade(goodsOrderGrade);
+			}
+		}else {
+			Goods goodsOrderGrade = new Goods();
+			goodsOrderGrade.setGoodsCd(goods.getGoodsCd());
+			goodsOrderGrade.setRegNo(TsaSession.getInfo().getUserNo());
+			goodsDao.deleteGoodsCustGrade(goodsOrderGrade);
+		}
 	}
 
 	/**
@@ -1075,6 +1114,7 @@ public class TsaGoodsService {
 		goodsDesc.setDescGb("50");
 		goodsDesc.setGoodsDesc(goods.getGoodsMobileDownDesc());
 		this.saveGoodsDesc(goodsDesc);
+
 	}
 
 	/**
@@ -2245,4 +2285,207 @@ public class TsaGoodsService {
 		}
 	}
 
+	/**
+	 * 상품 네이버 최저가 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 08
+	 */
+	public Collection<GoodsNaverLowestPrice> getGoodsNaverPriceList(GoodsSearch goodsSearch) {
+		return goodsDao.getGoodsNaverPriceList(goodsSearch);
+	}
+
+	/**
+	 * 상품 네이버 최저가 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 08
+	 */
+	@Transactional("shopTxnManager")
+	public Collection<GoodsNaverLowestPrice> saveGoodsNaverPrice(GoodsSearch goodsSearch) {
+
+		// 1. 조회 상품 TB_SEARCH_DATA 담기
+		int index = 0;
+		for (String goodsCd : goodsSearch.getConditionList()) {
+
+			SearchData searchData = new SearchData();
+			searchData.setRegNo(TsaSession.getInfo().getUserNo());
+			searchData.setSearchCd(goodsCd);
+			if (index == 0) {
+				commonService.deleteExceluploadSearCh(searchData);
+			}
+
+			commonService.createExceluploadSearch(searchData);
+			index++;
+		}
+
+		// 2. 일 최초 조회이면 테이블 삭제
+		String regYmd  = goodsDao.getGoodsNaverLowestPriceReqYmd();
+		if (!StringUtils.isEmpty(regYmd) && !regYmd.equals(GagaDateUtil.getToday())) {
+			goodsDao.deleteGoodsNaverLowestPrice();
+		}
+
+		// 3. 네이버 최저가 조회 저장
+		saveGoodsNaverLowestPrice(goodsSearch);
+
+		// 4. 최저가 상품 조회
+		goodsSearch.setSearchGb("EXCEL");
+		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
+		return goodsDao.getGoodsNaverPriceList(goodsSearch);
+	}
+
+	/**
+	 * 상품 네이버 최저가 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 08
+	 */
+	private void saveGoodsNaverLowestPrice(GoodsSearch goodsSearch) {
+
+		for (String goodsCd : goodsSearch.getConditionList()) {
+			try {
+				log.info("saveGoodsNaverLowestPrice  11 =  {}", GagaDateUtil.getTodayDateTime());
+				TaskSleeep();
+				log.info("saveGoodsNaverLowestPrice  22 =  {}", GagaDateUtil.getTodayDateTime());
+				NaverLowestPrice naverLowestPrice = naverLowestPriceApi.getLowestPrice(goodsCd);
+
+				log.info("[saveGoodsNaverLowestPrice] naverLowestPrice= {}",naverLowestPrice);
+				if (naverLowestPrice != null) {
+					GoodsNaverLowestPrice goodsNaverLowestPrice = new GoodsNaverLowestPrice();
+					goodsNaverLowestPrice.setReqYmd(GagaDateUtil.getToday());
+					goodsNaverLowestPrice.setGoodsCd(goodsCd);
+					goodsNaverLowestPrice.setMallNm(naverLowestPrice.getItems().iterator().next().getMallName());
+					goodsNaverLowestPrice.setMallLink(naverLowestPrice.getItems().iterator().next().getLink());
+					goodsNaverLowestPrice.setLowestPrice(naverLowestPrice.getItems().iterator().next().getLprice());
+					goodsNaverLowestPrice.setRegNo(TsaSession.getInfo().getUserNo());
+					goodsNaverLowestPrice.setUpdNo(TsaSession.getInfo().getUserNo());
+					log.info("[saveGoodsNaverLowestPrice] goodsNaverLowestPrice= {}", goodsNaverLowestPrice);
+					goodsDao.saveGoodsNaverLowestPrice(goodsNaverLowestPrice);
+
+				}
+
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+
+		}
+
+	}
+
+	/**
+	 *
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 08
+	 */
+	static void TaskSleeep() {
+		try {
+			Thread.sleep(100);
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * 광고 키워드 목록
+	 *
+	 * @param adKeyword
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	public Collection<AdKeyword> getAdKeywordList(AdKeyword adKeyword) {
+		return goodsDao.getAdKeywordList(adKeyword);
+	}
+
+	/**
+	 * 광고 키워드 상품 목록
+	 *
+	 * @param adKeyword
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	public Collection<AdKeywordGoods> getAdKeywordGoodsList(AdKeyword adKeyword) {
+		return goodsDao.getAdKeywordGoodsList(adKeyword);
+	}
+
+	/**
+	 * 광고 키워드 저장
+	 * @param adKeyword
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	@Transactional("shopTxnManager")
+	public void saveAdKeywordGoods(AdKeyword adKeyword) {
+		adKeyword.setRegNo(TsaSession.getInfo().getUserNo());
+		adKeyword.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		// 신규 일때
+		if (adKeyword.getAdKeywordSq() == null) {
+			// 공지사항 저장
+			goodsDao.saveAdKeyword(adKeyword);
+
+			// 등록된 사용자번호 값 가져오기
+			Integer noticeSq = adKeyword.getAdKeywordSq();
+
+			adKeyword.setAdKeywordSq(noticeSq);
+
+		} else {
+			// 공지사항 수정
+			goodsDao.saveAdKeyword(adKeyword);
+		}
+
+		if (!StringUtils.isEmpty(adKeyword.getGoodsList())) {
+			Collection<AdKeywordGoods> adKeywordGoodsList = null;
+			try {
+				adKeywordGoodsList = mapper.readValue(adKeyword.getGoodsList(), new TypeReference<Collection<AdKeywordGoods>>() {
+				});
+			} catch (Exception e) {
+				e.printStackTrace();
+				throw new IllegalStateException(message.getMessage("광고 키워드 저장 중 오류로 인해 저장되지 않았습니다."));
+			}
+			log.info("adKeywordGoodsList: {}", adKeywordGoodsList);
+
+			int idx = 0;
+			for (AdKeywordGoods adKeywordGoods : adKeywordGoodsList) {
+				if (idx == 0) goodsDao.deleteAdKeywordGoods(adKeywordGoods); // 전체 상품 삭제
+				adKeywordGoods.setAdKeywordSq(adKeyword.getAdKeywordSq());
+				adKeywordGoods.setRegNo(TsaSession.getInfo().getUserNo());
+				adKeywordGoods.setUpdNo(TsaSession.getInfo().getUserNo());
+
+				goodsDao.saveAdKeywordGoods(adKeywordGoods);
+				idx++;
+			}
+		}
+	}
+
+	/**
+	 * 광고 키워드 상품 삭제
+	 * @param adKeywordGoods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteAdKeywordGoods(AdKeywordGoods adKeywordGoods) {
+
+		if (adKeywordGoods == null || (adKeywordGoods.getArrGoodsCd() == null && adKeywordGoods.getArrGoodsCd().length <= 0)) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		if (adKeywordGoods.getArrGoodsCd().length > 0) {
+			goodsDao.deleteAdKeywordGoods(adKeywordGoods);
+		}
+	}
+
 }

+ 13 - 14
style24.admin/src/main/java/com/style24/admin/biz/service/TsaOrderService.java

@@ -41,6 +41,17 @@ public class TsaOrderService {
 	@Autowired
 	private ObjectMapper mapper;
 	
+	/**
+	 * 주문목록 카운트
+	 * @param Order
+	 * @return
+	 * @author jsh77b
+	 * @since 2020. 11. 18
+	 */
+	public int getOrderListCount(Order order) {
+		return orderDao.getOrderListCount(order);
+	}
+	
 	/**
 	 * 주문목록
 	 * @param Order
@@ -78,7 +89,7 @@ public class TsaOrderService {
 	}
 	
 	/**
-	 * 주문상세 정보
+	 * 주문기본정보
 	 *
 	 * @param order - 주문 정보
 	 * @return Collection<Order>
@@ -90,7 +101,7 @@ public class TsaOrderService {
 	}
 	
 	/**
-	 * 주문상 목록
+	 * 주문상품정보 목록
 	 *
 	 * @param order - 주문 정보
 	 * @return Collection<Order>
@@ -113,18 +124,6 @@ public class TsaOrderService {
 		return orderDao.getDeliveryAddrList(order);
 	}
 	
-	/**
-	 * 주문상세 단품 목록
-	 *
-	 * @param order - 주문 정보
-	 * @return Collection<Order>
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	public Collection<Order> getOrderDetailItemList(Order order) {
-		return orderDao.getOrderDetailItemList(order);
-	}
-	
 	/**
 	 * 결제내역 > 결제 기본정보
 	 *

+ 147 - 3
style24.admin/src/main/java/com/style24/admin/biz/web/TsaGoodsController.java

@@ -29,11 +29,14 @@ import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.TsaPageRequest;
+import com.style24.persistence.domain.AdKeyword;
+import com.style24.persistence.domain.AdKeywordGoods;
 import com.style24.persistence.domain.Color;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsCompose;
 import com.style24.persistence.domain.GoodsEpSkip;
 import com.style24.persistence.domain.GoodsHst;
+import com.style24.persistence.domain.GoodsNaverLowestPrice;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
 import com.style24.persistence.domain.GoodsResSell;
@@ -758,9 +761,8 @@ public class TsaGoodsController extends TsaBaseController {
 		// 년도
 		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
 		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
-		// 색상
-//		Color color = new Color();
-//		mav.addObject("colorList", rendererService.getColorList(color));
+		// 회원등급
+		//mav.addObject("custGradeList", rendererService.getAvailCommonCodeList("G101"));
 
 		mav.addObject("params", goods);
 
@@ -854,6 +856,19 @@ public class TsaGoodsController extends TsaBaseController {
 		return goodsService.getNotiGoodsInfoList(notiInfo);
 	}
 
+	/**
+	 * 상품 구매등급 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 11
+	 */
+	@PostMapping("/detail/order/grade/list")
+	@ResponseBody
+	public Collection<Goods> getGoodsDetailOrderGradeList(Goods goods) {
+		return goodsService.getGoodsDetailOrderGradeList(goods);
+	}
 
 	/**
 	 * 구성상품 목록
@@ -2039,9 +2054,138 @@ public class TsaGoodsController extends TsaBaseController {
 		// 공급업체
 		String supplyCompCd = "";
 		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd, "Y"));
+		// 시즌
+		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
+		// 년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
 
 		mav.setViewName("goods/GoodsNaverPriceForm");
 		return mav;
 	}
 
+	/**
+	 * 상품 네이버 최저가 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 03
+	 */
+	@PostMapping("/naver/price/list")
+	@ResponseBody
+	public Collection<GoodsNaverLowestPrice> getGoodsNaverPriceList(@RequestBody GoodsSearch goodsSearch) {
+
+		// 입점업체담당자는 업체코드 설정
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
+			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
+			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo().toString());
+		}
+
+		// multi row 검색관련 처리
+		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
+			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
+
+			if ("searchExtendGoodsCd".equals(goodsSearch.getSearch())) {
+				goodsSearch.setSearchGb("EXTEND");
+			} else if ("searchMasterGoodsCd".equals(goodsSearch.getSearch())) {
+				goodsSearch.setSearchGb("MASTER");
+			}
+		}
+
+		return goodsService.getGoodsNaverPriceList(goodsSearch);
+	}
+
+	/**
+	 * 네이버 최저가 상품 정보 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 03
+	 */
+	@PostMapping("/naver/lowest/price/save")
+	@ResponseBody
+	public Collection<GoodsNaverLowestPrice> saveGoodsNaverPrice(@RequestBody GoodsSearch goodsSearch) {
+
+		// multi row 검색관련 처리
+		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
+			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
+		}
+
+		return goodsService.saveGoodsNaverPrice(goodsSearch);
+	}
+
+	/**
+	 * 광고 키워드 관리  화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 11
+	 */
+	@GetMapping("/ad/keyword/form")
+	@ResponseBody
+	public ModelAndView goodsAdForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("goods/GoodsAdKeywordForm");
+		return mav;
+	}
+
+	/**
+	 * 광고 키워드 목록
+	 * @param adKeyword
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	@PostMapping("/ad/keyword/list")
+	@ResponseBody
+	public Collection<AdKeyword> getAdKeywordList(@RequestBody AdKeyword adKeyword) {
+		return goodsService.getAdKeywordList(adKeyword);
+	}
+
+	/**
+	 * 광고 키워드 상품목록
+	 * @param adKeywordSq
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	@GetMapping("/ad/keyword/goods/list/{adKeywordSq}")
+	@ResponseBody
+	public Collection<AdKeywordGoods> getAdKeywordGoodsList(@PathVariable Integer adKeywordSq) {
+		AdKeyword adKeyword = new AdKeyword();
+		adKeyword.setAdKeywordSq(adKeywordSq);
+		return goodsService.getAdKeywordGoodsList(adKeyword);
+	}
+
+	/**
+	 * 광고 키워드 저장/등록
+	 *
+	 * @param adKeyword
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	@PostMapping("/ad/keyword/save")
+	@ResponseBody
+	public GagaResponse saveAdKeywordGoods(@RequestBody AdKeyword adKeyword) {
+		goodsService.saveAdKeywordGoods(adKeyword);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 광고 키워드 상품 삭제
+	 *
+	 * @param adKeywordGoods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	@PostMapping("/ad/keyword/goods/delete")
+	@ResponseBody
+	public GagaResponse deleteAdKeywordGoods(@RequestBody AdKeywordGoods adKeywordGoods) {
+		goodsService.deleteAdKeywordGoods(adKeywordGoods);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
 }

+ 37 - 5
style24.admin/src/main/java/com/style24/admin/biz/web/TsaOrderController.java

@@ -30,6 +30,7 @@ import com.style24.admin.biz.service.TsaOrderService;
 import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
+import com.style24.persistence.TsaPageRequest;
 import com.style24.persistence.domain.Order;
 
 import lombok.extern.slf4j.Slf4j;
@@ -71,6 +72,7 @@ public class TsaOrderController extends TsaBaseController {
 		mav.addObject("siteCdList"		, rendererService.getAvailCommonCodeList("G012"));		// 사이트구분
 		mav.addObject("mallGbList"		, rendererService.getAvailCommonCodeList("G011"));		// 몰구분		
 		mav.addObject("supplyCompList"	, rendererService.getSupplyCompanyList());				// 공급업제목록
+		mav.addObject("ordStatList"		, rendererService.getAvailCommonCodeList("G012"));		// 주문상태코드
 		mav.addObject("ordDtlStatList"	, rendererService.getAvailCommonCodeList("G013"));		// 주문상세상태코드
 		
 		mav.addObject("chgStatList"		, rendererService.getAvailCommonCodeList("G685"));		// 주문변경요청상태코드
@@ -94,9 +96,37 @@ public class TsaOrderController extends TsaBaseController {
 	 */
 	@PostMapping("/list")
 	@ResponseBody
-	public Collection<Order> getOrderList(@RequestBody Order order) throws Exception {		
-		Collection<Order> orderList = orderService.getOrderList(order); 
-		return orderList;
+	public GagaMap getOrderList(@RequestBody Order order) throws Exception {
+		GagaMap result = new GagaMap();
+		
+		order.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
+		order.setPageable(new TsaPageRequest(order.getPageNo() - 1, order.getPageSize()));
+		
+		// 주문상태 CD_GB 변경
+		if (order.getMultiOrdStat() != null) {
+			for (int i=0 ; i<order.getMultiOrdStat().length ; i++) {
+				String ordStat = order.getMultiOrdStat()[i].replace("G012", "G013"); 
+				order.getMultiOrdStat()[i] = ordStat;
+			}
+		}
+		
+		// 주문취소상태 CD_GB 변경
+		if (order.getChgGb() != null) {
+			String chgDtlStat = order.getChgGb().replace("G680", "G685"); 
+			order.setChgGb(chgDtlStat);
+		}
+		
+		// 주문전체건수 조회
+		int totalCount = orderService.getOrderListCount(order);
+		order.getPageable().setTotalCount(totalCount);
+		
+		// 주문목록 페이지 조회
+		Collection<Order> orderList = orderService.getOrderList(order);
+		
+		result.set("pageing", order);
+		result.set("orderList", orderList);
+		
+		return result;
 	}
 	
 	/**
@@ -169,13 +199,15 @@ public class TsaOrderController extends TsaBaseController {
 		Order order = new Order();
 		order.setOrdNo(ordNo);
 		
+		// 1. 주문기본정보
 		mav.addObject("ordNo"					, ordNo);												// 주문번호
-		mav.addObject("orderInfo"				, orderService.getOrderInfoList(order));				// 기본정보
+		mav.addObject("orderInfo"				, orderService.getOrderInfoList(order));				// 주문기본정보
 		mav.addObject("orderGoodsInfo"			, orderService.getOrderDetailList(order));				// 주문상품정보
-		//mav.addObject("orderGoodsItemInfo"		, orderService.getOrderDetailItemList(order));			// 주문상품단품정보
 		mav.addObject("orderDeliveryAddrInfo"	, orderService.getDeliveryAddrList(order));				// 배송정보
 		mav.addObject("orderPaymentInfo"		, orderService.getOrderPaymentBasicInfoList(order));	// 결제정보
 		mav.addObject("orderDeliveryFeeInfo"	, orderService.getDeliveryFeeList(order));				// 배송비정보
+		
+		// 2. 클레임정보
 		mav.addObject("orderChangeInfo"			, orderService.getOrderChangeList(order));				// 취소/반품/교환요청 정보
 		mav.addObject("orderRefundInfo"			, orderService.orderRefundInfo(order));					// 환불정보
 		mav.addObject("orderCounselInfo"		, orderService.orderCounselInfo(order));				// 상담내역

+ 13 - 13
style24.admin/src/main/java/com/style24/admin/biz/web/TsaRendererController.java

@@ -134,19 +134,19 @@ public class TsaRendererController extends TsaBaseController {
 //		return rendererService.getVendorExtmallSellStoreList(vendorId);
 //	}
 //
-//	/**
-//	 * 현재 유효한 공통코드 목록
-//	 * @param cdGb - 공통그룹코드
-//	 * @return
-//	 * @author eskim
-//	 * @since 2020. 01. 22
-//	 */
-//	@GetMapping("/avail/commonCode/list/{cdGb}")
-//	@ResponseBody
-//	public Collection<AdmCommonCode> getAvailCommonCodeList(@PathVariable String cdGb) {
-//		return rendererService.getAvailCommonCodeList(cdGb);
-//	}
-//
+	/**
+	 * 현재 유효한 공통코드 목록
+	 * @param cdGb - 공통그룹코드
+	 * @return
+	 * @author eskim
+	 * @since 2020. 01. 22
+	 */
+	@GetMapping("/avail/commonCode/list/{cdGb}")
+	@ResponseBody
+	public Collection<CommonCode> getAvailCommonCodeList(@PathVariable String cdGb) {
+		return rendererService.getAvailCommonCodeList(cdGb);
+	}
+
 	/**
 	 * 업체별 색상 목록
 	 * @param cdGb - 공통그룹코드

+ 31 - 0
style24.admin/src/main/java/com/style24/persistence/domain/AdKeyword.java

@@ -0,0 +1,31 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 광고 키워드 Domain
+ *
+ * @author eskim
+ * @since 2020. 12. 14
+ */
+@SuppressWarnings("serial")
+@Data
+public class AdKeyword extends TscBaseDomain {
+
+	private Integer adKeywordSq;
+	private String adKeyword;
+	private String adKeywordStdt;
+	private String adKeywordEddt;
+	private String useYn;
+
+	private String goodsCd;
+	private String stDate;
+	private String edDate;
+
+	private String goodsList;
+	private Collection<AdKeywordGoods> goodsListNew;
+}

+ 28 - 0
style24.admin/src/main/java/com/style24/persistence/domain/AdKeywordGoods.java

@@ -0,0 +1,28 @@
+package com.style24.persistence.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 광고 키워드 Domain
+ *
+ * @author eskim
+ * @since 2020. 12. 14
+ */
+@SuppressWarnings("serial")
+@Data
+public class AdKeywordGoods extends TscBaseDomain {
+
+	private Integer adKeywordSq;
+	private String goodsCd;
+	private int dispOrd;
+	private String delYn;
+
+	private String goodsNm;
+	private String crud;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrGoodsCd;
+}

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

@@ -68,6 +68,7 @@ public class Goods extends TscBaseDomain {
 	private String taxGb;		//과세구분(10:과세, 20:비과세)
 	private String erpPriceLinkYn;		//ERP가격연계여부(자사상품만 사용. Y:연계)
 	private String erpStockLinkYn;		//ERP재고연계여부(자사상품만 사용. Y:연계)
+	private String newCustOrdYn;		//신규고객 구매가능여부(Y:신규고객만 구매가능)
 
 	private String brandEnm;		//브랜드영문명
 	private String brandGrpNm;		//브랜드그룹명
@@ -102,8 +103,9 @@ public class Goods extends TscBaseDomain {
 	private String goodTnmInit;
 	private String certNum;
 	private String certDt;
+	private String custGrade;
+	private String custGradeName;
 
-//
 //	private String goodsRegMsg;
 	private String procJob;
 	private String excelFileNm;
@@ -156,6 +158,9 @@ public class Goods extends TscBaseDomain {
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] dispYn; // 전시여부
 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] goodsOrderGrade; // 구매 등급
+
 	private Collection<GoodsNotiInfo> notiListNew; // 고시항목
 
 	private String notiList; // 고시항목

+ 30 - 0
style24.admin/src/main/java/com/style24/persistence/domain/GoodsNaverLowestPrice.java

@@ -0,0 +1,30 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 네이버 최저가 도메인
+ *
+ * @author gagamel
+ * @since 2020. 12. 08
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsNaverLowestPrice extends TscBaseDomain {
+
+	private String reqYmd;
+	private String goodsCd;
+	private String mallNm;
+	private String mallLink;
+	private int lowestPrice;
+
+	private String brandCd;
+	private String brandEnm;
+	private String goodsNm;
+	private int listPrice;
+	private int currPrice;
+	private int benefitPrice;
+
+}

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

@@ -17,6 +17,8 @@ public class GoodsSafeNo extends TscBaseDomain {
 	private String goodsCd;
 	private String goodsNum;
 	private String certNum;
+	private String certState;
+	private String certDiv;
 	private String certDt;
 
 }

+ 13 - 1
style24.admin/src/main/java/com/style24/persistence/domain/Order.java

@@ -1,6 +1,7 @@
 package com.style24.persistence.domain;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TsaPageRequest;
 import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
@@ -179,6 +180,7 @@ public class Order extends TscBaseDomain {
 	
 	private String delvFeeGb;
 	private String delvFeeGbNm;
+	private int delvFee;
 	private String delvUsacYn;
 	private String delvUsacDt;
 	private int delvFeeSq;
@@ -217,7 +219,17 @@ public class Order extends TscBaseDomain {
 	
 	private int itemQty;
 	private int itemPrice;
-
+	private String itemNm;
+	private int gfcdUseAmt;
+	
+	private int itemOrdQty;
+	private int itemCnclRtnQty;
+	
+	// Pagination
+	private TsaPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
 }
 
 

+ 0 - 18
style24.admin/src/main/java/com/style24/persistence/domain/OrderDetailForm.html

@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : OrderDetailForm.html
- * @desc    : 주문정보상세 Page (주문내역)
- *============================================================================
- * SISUN
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.11.16   jsh77b       최초 작성
- *******************************************************************************
- -->
-
-</html>

+ 297 - 3
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -404,7 +404,7 @@
 		    , (SELECT ITEMKIND_NM FROM TB_ITEMKIND WHERE ITEMKIND_CD = Z.ITEMKIND_CD ) AS ITEMKIND_NM
 		    , FN_GET_USER_NM(REG_NO) AS REG_NM
 		    , FN_GET_USER_NM(UPD_NO) AS UPD_NM
-		    <if test='goodsPriceYn != null and goodsPriceYn = "Y"'>
+		    <if test='goodsPriceYn != null and goodsPriceYn == "Y"'>
 		    , GB.CURR_PRICE AS BENEFIT_CURR_PRICE
 		    </if>
 		FROM (
@@ -433,6 +433,7 @@
 		              , G.ERP_PRICE_LINK_YN
 		              , G.CHANGEABLE_YN
 		              , G.RETURNABLE_YN
+		              , G.NEW_CUST_ORD_YN
 		              , G.GIFT_PACK_YN
 		              , G.DELV_FEE_CD
 		              , DATE_FORMAT(G.FRST_CFRM_DT, '%Y%m%d%H%i%S') AS FRST_CFRM_DT
@@ -732,7 +733,7 @@
 		<when test="pageable != null">
 		    ) A
 		)Z
-		<if test='goodsPriceYn != null and goodsPriceYn = "Y"'>
+		<if test='goodsPriceYn != null and goodsPriceYn == "Y"'>
 		LEFT OUTER JOIN TB_GOODS_BENEFIT_PRICE GB ON Z.GOODS_CD = GB.GOODS_CD AND GB.CUST_GB = 'G100_00'
 		</if> 
 		WHERE RNUM BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
@@ -740,7 +741,7 @@
 		<otherwise>
 		    ) A
 		)Z
-		<if test='goodsPriceYn != null and goodsPriceYn = "Y"'>
+		<if test='goodsPriceYn != null and goodsPriceYn == "Y"'>
 		LEFT OUTER JOIN TB_GOODS_BENEFIT_PRICE GB ON Z.GOODS_CD = GB.GOODS_CD AND GB.CUST_GB = 'G100_00'
 		</if> 
 		</otherwise>
@@ -880,14 +881,17 @@
 		     , G.SELL_FEE_RATE
 		     , G.FORMAL_GB
 		     , G.RETURNABLE_YN
+		     , G.CHANGEABLE_YN
 		     , G.PRE_PPNT_USABLE_YN
 		     , G.PRE_MPNT_USABLE_YN
+		     , G.NEW_CUST_ORD_YN
 		     , G.MIN_ORD_QTY
 		     , G.MAX_ORD_QTY
 		     , G.DAY_MAX_ORD_QTY
 		     , G.GIFT_PACK_YN
 		     , G.ERP_STOCK_LINK_YN
 		     , G.ERP_PRICE_LINK_YN
+		     , G.NEW_CUST_ORD_YN
 		     , FN_GET_CODE_NM('G076', G.ORIGIN_CD) AS MAKE_NM
 		     , G.ORIGIN_CD
 		     , G.MAKE_YMD
@@ -1063,6 +1067,7 @@
 		      , TAX_GB
 		      , ERP_PRICE_LINK_YN
 		      , ERP_STOCK_LINK_YN
+		      , NEW_CUST_ORD_YN
 		      , REG_NO
 		      , REG_DT
 		      , UPD_NO
@@ -1115,6 +1120,7 @@
 		     , TAX_GB              
 		     , ERP_PRICE_LINK_YN   
 		     , ERP_STOCK_LINK_YN   
+		     , NEW_CUST_ORD_YN
 		     , #{regNo}              
 		     , NOW()              
 		     , UPD_NO              
@@ -1162,6 +1168,9 @@
 		<if test="preMpntUsableYn != null and preMpntUsableYn != ''" >
 		    , PRE_MPNT_USABLE_YN = #{preMpntUsableYn}
 		</if>
+		<if test="newCustOrdYn != null and newCustOrdYn != ''" >
+		    , NEW_CUST_ORD_YN = #{newCustOrdYn}
+		</if>
 		<if test='procJob == "minOrdAmt"  and minOrdAmt != null and minOrdAmt != ""' >
 		    , MIN_ORD_AMT = #{minOrdAmt}
 		</if>
@@ -1186,6 +1195,7 @@
 		<if test="delvFeeCd != null and delvFeeCd != ''" >
 		    , DELV_FEE_CD = #{delvFeeCd}
 		</if>
+		
 		WHERE GOODS_CD = #{goodsCd}
 	</update>
 	
@@ -1620,6 +1630,9 @@
 		  , PRE_PPNT_USABLE_YN = #{prePpntUsableYn}
 		  , PRE_MPNT_USABLE_YN = #{preMpntUsableYn}
 		  , DISTRIBUTION_GB = #{distributionGb}
+		  , RETURNABLE_YN = #{returnableYn}
+		  , CHANGEABLE_YN = #{changeableYn}
+		  , NEW_CUST_ORD_YN = #{newCustOrdYn}
 		  , AGE_GRP_CD = #{ageGrpCd}
 		  , SELL_FEE_RATE = #{sellFeeRate}
 		  , GIFT_PACK_YN = #{giftPackYn}
@@ -2487,6 +2500,8 @@
 		)
 		ON DUPLICATE KEY UPDATE
 		       GOODS_CD = #{goodsCd}
+		      ,UPD_NO = #{updNo}
+		      ,UPD_DT = NOW()
 	</insert>
 	
 	<!-- 상품상세 공지사항 상품 삭제 -->
@@ -3034,6 +3049,8 @@
 		INSERT INTO TB_GOODS_SAFE_NO (
 		    GOODS_CD
 		  , CERT_NUM
+		  , CERT_DIV
+		  , CERT_STATE
 		  , CERT_DT
 		  , REG_NO
 		  , REG_DT
@@ -3043,6 +3060,8 @@
 		VALUES (
 		    #{goodsCd}
 		  , #{certNum}
+		  , #{certDiv}
+		  , #{certState}
 		  , #{certDt}
 		  , #{regNo}
 		  , NOW()
@@ -3051,9 +3070,284 @@
 		)
 		ON DUPLICATE KEY UPDATE
 		       CERT_NUM = #{certNum}
+		     , CERT_DIV = #{certDiv}
+		     , CERT_STATE = #{certState}
 		     , CERT_DT = #{certDt}
 		     , UPD_NO = #{updNo}
 		     , UPD_DT = NOW()
 	</insert>
+	
+	<!-- 상품 네이버 최저가 목록 -->
+	<select id="getGoodsNaverPriceList" parameterType="GoodsSearch" resultType="GoodsNaverLowestPrice">
+		/* TsaGoods.getGoodsNaverPriceList */
+		        SELECT
+		                GE.REQ_YMD
+		              , G.GOODS_CD
+		              , GE.MALL_NM
+		              , GE.MALL_LINK
+		              , GE.LOWEST_PRICE
+		              , B.BRAND_ENM
+		              , G.BRAND_CD
+		              , G.GOODS_NUM
+		              , G.GOODS_NM
+		              , G.LIST_PRICE
+		              , G.CURR_PRICE
+		              , NVL(GB.PC_CURR_PRICE,G.CURR_PRICE) AS BENEFIT_PRICE
+		              , FN_GET_USER_NM(GE.REG_NO) AS UPD_NM
+		              , DATE_FORMAT(GE.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
+		              , FN_GET_USER_NM(GE.UPD_NO) AS UPD_NM
+		              , DATE_FORMAT(GE.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
+		               <choose>
+		                  <when test="searchGb != null and searchGb =='EXCEL'">
+		              , SD.TMP_DISP_ORD
+		                  </when>
+		                  <otherwise>
+		              , 0 AS TMP_DISP_ORD
+		                  </otherwise>
+		              </choose>
+		        FROM TB_GOODS G
+		        INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		        INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
+		        INNER JOIN TB_GOODS_NAVER_LOWEST_PRICE GE ON G.GOODS_NUM = GE.GOODS_CD
+		        LEFT OUTER JOIN TB_GOODS_BENEFIT_PRICE GB ON G.GOODS_CD = GB.GOODS_CD AND GB.CUST_GB = 'G100_00'
+		        <if test="searchGb != null and searchGb =='EXCEL'">
+		        INNER JOIN (
+		                     SELECT SEARCH_CD
+		                          , TMP_DISP_ORD
+		                     FROM (
+		                           SELECT SEARCH_CD
+		                                , MIN(DISP_ORD) AS TMP_DISP_ORD
+		                           FROM TB_SEARCH_DATA
+		                           WHERE REG_NO = #{regNo}
+		                           GROUP BY SEARCH_CD) T
+		                   ) SD
+		                   ON ( (G.GOODS_NUM LIKE CONCAT(SD.SEARCH_CD,'%')) 
+		                        <if test="mdNo != null and mdNo != ''">
+		                        AND G.BRAND_CD IN (
+		                                           SELECT DISTINCT BRAND_CD
+		                                           FROM TB_BRAND_MD
+		                                           WHERE MD_NO = CAST(#{mdNo} AS UNSIGNED)
+		                                           )
+		                       </if>
+		                   )
+		        </if>
+		        WHERE 1=1
+		        <if test="mdNo != null and mdNo != ''">
+		        AND G.BRAND_CD IN (
+		                           SELECT DISTINCT BRAND_CD
+		                           FROM TB_BRAND_MD
+		                           WHERE MD_NO = CAST(#{mdNo} AS UNSIGNED)
+		                          )
+		        </if>
+		        <if test="searchGb == null or searchGb =='BASIC' " >
+		        <include refid="getGoodsListCondition_sql"/>
+		        ORDER BY GE.REQ_YMD, G.GOODS_CD
+		        </if>
+		        <if test="searchGb != null and searchGb =='EXCEL'">
+		        ORDER BY SD.TMP_DISP_ORD
+		        </if>
+	</select>
+	
+	<!-- 상품 네이버 최저가 최종 작업일 -->
+	<select id="getGoodsNaverLowestPriceReqYmd" resultType="String">
+		/* TsaGoods.getGoodsNaverLowestPriceReqYmd */
+		SELECT MAX(REQ_YMD)
+		FROM TB_GOODS_NAVER_LOWEST_PRICE
+	</select>
+	
+	<!-- 상품 네이버 최저가 삭제 -->
+	<delete id="deleteGoodsNaverLowestPrice">
+		/* TsaGoods.deleteGoodsNaverLowestPrice */
+		TRUNCATE TABLE TB_GOODS_NAVER_LOWEST_PRICE
+	</delete>
+	
+	<!-- 상품 네이버 최저가 저장 -->
+	<insert id="saveGoodsNaverLowestPrice"  parameterType="GoodsNaverLowestPrice" >
+		/* TsaGoods.saveGoodsNaverLowestPrice */
+		INSERT INTO TB_GOODS_NAVER_LOWEST_PRICE (
+		    REQ_YMD
+		  , GOODS_CD
+		  , MALL_NM
+		  , MALL_LINK
+		  , LOWEST_PRICE
+		  , REG_NO
+		  , REG_DT
+		  , UPD_NO
+		  , UPD_DT
+		)
+		VALUES(
+		    #{reqYmd}
+		  , #{goodsCd}
+		  , #{mallNm}
+		  , #{mallLink}
+		  , #{lowestPrice}
+		  , #{regNo}
+		  , NOW()
+		  , #{updNo}
+		  , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       MALL_NM = #{mallNm}
+		     , MALL_LINK = #{mallLink}
+		     , LOWEST_PRICE = #{lowestPrice}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 상품 구매등급 목록 -->
+	<select id="getGoodsDetailOrderGradeList" parameterType="Goods" resultType="Goods">
+		/* TsaGoods.getGoodsDetailOrderGradeList */
+		SELECT  G.GOODS_CD
+		      , A.CUST_GRADE
+		      , FN_GET_CODE_NM('G101', A.CUST_GRADE) AS CUST_GRADE_NAME
+		 FROM TB_GOODS_ORDER_GRADE A 
+		 INNER JOIN TB_GOODS G ON A.GOODS_CD = G.GOODS_CD
+		 WHERE A.GOODS_CD = #{goodsCd}
+		 ORDER BY G.GOODS_CD, A.CUST_GRADE
+	</select>
+	
+	<!-- 상품 구매등급 삭제 -->
+	<delete id="deleteGoodsCustGrade" parameterType="Goods" >
+		/* TsaGoods.saveGoodsNaverLowestPrice */
+		DELETE FROM TB_GOODS_ORDER_GRADE
+		WHERE GOODS_CD = #{goodsCd}
+	</delete>
+	
+	<!-- 상품 구매등급 저장 -->
+	<insert id="createGoodsCustGrade"  parameterType="Goods" >
+		/* TsaGoods.createGoodsCustGrade */
+		INSERT INTO TB_GOODS_ORDER_GRADE (
+		    GOODS_CD
+		  , CUST_GRADE
+		  , REG_NO
+		  , REG_DT
+		)
+		VALUES(
+		    #{goodsCd}
+		  , #{custGrade}
+		  , #{regNo}
+		  , NOW()
+		)
+	</insert>
+	
+	<!-- 광고 키워드 목록 -->
+	<select id="getAdKeywordList" parameterType="AdKeyword" resultType="AdKeyword">
+		/* TsaGoods.getAdKeywordList */
+		SELECT A.AD_KEYWORD_SQ
+		     , A.AD_KEYWORD
+		     , A.USE_YN
+		     , DATE_FORMAT(A.AD_KEYWORD_STDT,'%Y-%m-%d')  AS AD_KEYWORD_STDT 
+		     , DATE_FORMAT(A.AD_KEYWORD_EDDT,'%Y-%m-%d')  AS AD_KEYWORD_EDDT 
+		     , FN_GET_USER_NM(A.REG_NO)             AS REG_NM    
+		     , DATE_FORMAT(A.REG_DT,'%Y-%m-%d %H:%i:%S') AS REG_DT
+		     , FN_GET_USER_NM(A.UPD_NO)             AS UPD_NM    
+		     , DATE_FORMAT(A.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT    
+		FROM   TB_AD_KEYWORD A
+		WHERE  1 = 1
+		<if test="stDate != null and stDate !=''">
+		AND A.AD_KEYWORD_EDDT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		</if>
+		<if test="edDate != null and edDate !=''">
+		<![CDATA[
+		AND A.AD_KEYWORD_STDT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		]]>
+		</if>
+		<if test='useYn != null and useYn !=""'>
+		AND A.USE_YN = #{useYn}
+		</if>
+		<if test="adKeyword != null and adKeyword !=''">
+		AND LOWER(A.AD_KEYWORD) LIKE CONCAT('%',LOWER(#{adKeyword}),'%')
+		</if>
+		<if test='goodsCd != null and goodsCd != "" '>
+		AND A.AD_KEYWORD_SQ IN (
+		                    SELECT AD_KEYWORD_SQ
+		                    FROM TB_AD_KEYWORD_GOODS
+		                    WHERE GOODS_CD = #{goodsCd}
+		                        )
+		</if>
+		ORDER  BY A.AD_KEYWORD_SQ DESC
+	</select>
+	
+	<!-- 광고 키워드 저장 -->
+	<insert id="saveAdKeyword" parameterType="AdKeyword">
+		/* TsaGoods.saveAdKeyword */
+		INSERT INTO TB_AD_KEYWORD (
+		       AD_KEYWORD_SQ
+		     , AD_KEYWORD
+		     , AD_KEYWORD_STDT
+		     , AD_KEYWORD_EDDT
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{adKeywordSq}
+		     , #{adKeyword}
+		     , #{adKeywordStdt}
+		     , #{adKeywordEddt}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       AD_KEYWORD_STDT = #{adKeywordStdt}
+		      ,AD_KEYWORD_EDDT = #{adKeywordEddt}
+		      ,USE_YN = #{useYn}
+		      ,UPD_NO = #{updNo}
+		      ,UPD_DT = NOW()
+	</insert>
+	
+	<!-- 광고 키워드 상품 목록 -->
+	<select id="getAdKeywordGoodsList" parameterType="AdKeyword" resultType="AdKeywordGoods">
+		/* TsaGoods.getAdKeywordGoodsList */
+		SELECT A.AD_KEYWORD_SQ
+		     , A.GOODS_CD
+		     , A.DISP_ORD
+		     , B.GOODS_NM
+		FROM TB_AD_KEYWORD_GOODS A
+		INNER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
+		WHERE AD_KEYWORD_SQ = #{adKeywordSq}
+		ORDER BY A.DISP_ORD, A.GOODS_CD
+	</select>
+	
+	<!-- 광고 키워드 상품저장 -->
+	<insert id="saveAdKeywordGoods" parameterType="AdKeywordGoods">
+		/* TsaGoods.saveAdKeywordGoods */
+		INSERT INTO TB_AD_KEYWORD_GOODS (
+		       AD_KEYWORD_SQ
+		     , GOODS_CD
+		     , DISP_ORD
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{adKeywordSq}
+		     , #{goodsCd}
+		     , #{dispOrd}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+	</insert>
+	
+	<!-- 광고 키워드 삭제 -->
+	<delete id="deleteAdKeywordGoods" parameterType="AdKeywordGoods">
+		/* TsaGoods.deleteAdKeywordGoods */
+		DELETE FROM TB_AD_KEYWORD_GOODS 
+		WHERE AD_KEYWORD_SQ =  #{adKeywordSq}
+		<if test="arrGoodsCd != null and arrGoodsCd.length>0">
+		AND GOODS_CD IN
+		    <foreach collection="arrGoodsCd" item="item" index="index"  open="(" close=")" separator=",">
+		#{item}
+		    </foreach>
+		</if>
+	</delete>
 	
 </mapper>

+ 346 - 82
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml

@@ -2,63 +2,40 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.style24.admin.biz.dao.TsaOrderDao">
 
-	<!-- 주문목록 -->
-	<select id="getOrderList" parameterType="Order" resultType="Order">
-		/* order.getOrderList */
-		SELECT O.ORD_NO
-		     , O.ORD_NM
-		     , O.CUST_NO
-		     , OD.VENDOR_ID
-		     , O.FRONT_GB
-		     , DATE_FORMAT(O.ORD_DT,'%Y%m%d%H%i%S') AS ORD_DT
-		     , OD.ORD_EXCH_GB
-		     , OD.ORD_DTL_STAT
-		     , OD.DELV_LOC_CD
-		     , GI.IMG_PATH1
-		     , G.BRAND_CD
-		     , (SELECT Z.BRAND_ENM
-                FROM   TB_BRAND Z
-                WHERE  Z.BRAND_CD = G.BRAND_CD) AS BRAND_ENM
-		     , G.GOODS_CD
-		     , ODI.OPT_CD1
-		     , ODI.OPT_CD2
-		     , G.GOODS_NM
-		     , G.GOODS_TYPE
-		     , FN_GET_CODE_NM('G056', G.GOODS_TYPE) AS GOODS_TYPE_NM
-		     , OD.EXTMALL_ORDER_ID
-		     , OD.AGENT_ORDER_ID 
-		     , OD.ORD_QTY
-		     , OD.CNCL_RTN_QTY
-		     , OD.ORD_AMT
-		     , OD.CNCL_RTN_AMT
-		     , OD.CPN1_DC_AMT + TMTB1_DC_AMT + TMTB2_DC_AMT +  GOODS_CPN_DC_AMT + CART_CPN_DC_AMT + PNT_DC_AMT + PRE_PNT_DC_AMT AS TOT_DC_AMT
-		     , OD.REAL_ORD_AMT
-		     , ODI.ITEM_CD
-		     , G.SUPPLY_GOODS_CD
-		     , OD.FORMAL_GB
-		     , DATE_FORMAT(OD.DELV_ASSIGN_DT,'%Y%m%d%H%i%S') AS DELV_ASSIGN_DT 
-		     , OD.INVOICE_NO
-		     , OD.DELV_STDT
-		     , OD.SOLDOUT_YN
-		     , OD.SOLDOUT_MEMO
-		     , DATE_FORMAT(OD.SOLDOUT_REG_DT,'%Y%m%d%H%i%S') AS SOLDOUT_REG_DT 
-		     , OD.SOLDOUT_REG_NO     
+	<!-- 주문목록 카운트 -->
+	<select id="getOrderListCount" parameterType="Order" resultType="int">
+		/* order.getOrderListCnt */
+		SELECT COUNT(1)  
 		FROM   TB_ORDER O
 		INNER  JOIN TB_ORDER_DETAIL OD
 		ON     O.ORD_NO = OD.ORD_NO
+		INNER  JOIN TB_GOODS G1
+		ON     OD.GOODS_CD = G1.GOODS_CD
 		INNER  JOIN TB_ORDER_DETAIL_ITEM ODI
 		ON     OD.ORD_NO = ODI.ORD_NO
 		AND    OD.ORD_DTL_NO = ODI.ORD_DTL_NO
-		INNER  JOIN TB_GOODS G
-		ON     OD.GOODS_CD = G.GOODS_CD
+		INNER  JOIN TB_GOODS G2
+		ON     ODI.ITEM_CD = G2.GOODS_CD
 		INNER  JOIN TB_GOODS_IMG GI
-		ON     OD.GOODS_CD = GI.GOODS_CD
+		ON     ODI.ITEM_CD = GI.GOODS_CD
 		AND    ODI.OPT_CD1 = GI.COLOR_CD
 		INNER  JOIN TB_PAYMENT P
 		ON     O.ORD_NO = P.ORD_NO
 		AND    P.PAY_GB = 'O'
 		INNER  JOIN TB_DELIVERY_ADDR DA
 		ON     OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
+		LEFT   OUTER JOIN (
+			SELECT OC.WD_INVOICE_NO
+			     , OC.WD_INVOICE_SEND_YN
+			     , OC.SHIP_COMP_CD
+			     , OCD.ORD_DTL_NO 
+			     , OCD.CHG_QTY
+			     , OCD.CHG_STAT
+			FROM   TB_ORDER_CHANGE OC
+			INNER  JOIN TB_ORDER_CHANGE_DETAIL OCD
+			ON     OC.ORD_CHG_SQ  = OCD.ORD_CHG_SQ 
+		) OCD
+		ON    OD.ORD_DTL_NO = OCD.ORD_DTL_NO
 		WHERE  1=1
 		<if test='siteCd != null and siteCd != ""'>
 		AND    O.SITE_CD = #{siteCd}
@@ -70,7 +47,7 @@
 		AND    OD.SUPPLY_COMP_CD = #{supplyCompCd}
 		</if>
 		<if test="multiBrand != null and multiBrand != ''">
-        AND    G.BRAND_CD IN
+        AND    G1.BRAND_CD IN
 			<foreach collection="multiBrand" item="item" index="index"  open="(" close=")" separator=",">
         		#{item}
             </foreach>
@@ -81,6 +58,28 @@
         		#{item}
             </foreach>
         </if>
+        <if test="multiOrdDtlStat == null or multiOrdDtlStat == ''">
+        	<if test="multiOrdStat != null and multiOrdStat != ''">
+        AND    OD.ORD_DTL_STAT IN
+				<foreach collection="multiOrdStat" item="item" index="index"  open="(" close=")" separator=",">
+	        		#{item}
+	            </foreach>
+            </if>
+        </if>
+		<if test="chgStat != null and chgStat != ''">
+        AND    OCD.CHG_STAT = #{chgStat}
+        </if>
+        <if test="chgStat == null or chgStat == ''">
+        	<if test="chgGb != null and chgGb != ''">
+        AND    OCD.CHG_STAT = #{chgGb}
+        	</if>
+        </if>
+		<if test="chgStat != null and chgStat != ''">
+        AND    OCD.CHG_STAT = #{chgStat}
+        </if>
+        <if test="chgStat == null or chgStat == ''">
+        AND    OCD.CHG_STAT = #{chgGb}
+        </if>
         <if test='search != null and search == "searchOrdNo"'>
         	<if test="condition != null and condition != ''">
 		AND    O.ORD_NO = #{condition}
@@ -88,7 +87,12 @@
 		</if>
 		<if test='search != null and search == "searchExtmallOrderId"'>
         	<if test="condition != null and condition != ''">
-		AND    O.ORD_NO = #{condition}
+		AND    OD.EXTMALL_ORDER_ID = #{condition}
+			</if>
+		</if>
+		<if test='search != null and search == "searchAgentOrderId"'>
+        	<if test="condition != null and condition != ''">
+		AND    OD.AGENT_ORDER_ID = #{condition}
 			</if>
 		</if>
 		<if test='payMeans != null and payMeans != ""'>
@@ -104,13 +108,34 @@
 		AND    O.ORD_PHNNO = #{orderPhnno}
 		</if>
 		<if test='goodsCd != null and goodsCd != ""'>
-		AND    G.GOODS_CD = #{goodsCd}
+		AND    G1.GOODS_CD = #{goodsCd}
 		</if>
 		<if test='sizeCd != null and sizeCd != ""'>
 		AND    ODI.OPT_CD2 = #{sizeCd}
 		</if>
 		<if test='goodsNm != null and goodsNm != ""'>
-		AND    G.GOODS_NM = #{goodsNm}
+		AND    G1.GOODS_NM = #{goodsNm}
+		</if>
+		<if test='payMeans != null and payMeans != ""'>
+		AND    P.PAY_MEANS = #{payMeans}
+		</if>
+		<if test='orderNm != null and orderNm != ""'>
+		AND    O.ORD_NM = #{orderNm}
+		</if>
+		<if test='custId != null and custId != ""'>
+		AND    O.CUST_NO = #{custId}
+		</if>
+		<if test='orderPhnno != null and orderPhnno != ""'>
+		AND    O.ORD_PHNNO = #{orderPhnno}
+		</if>
+		<if test='goodsCd != null and goodsCd != ""'>
+		AND    G2.GOODS_CD = #{goodsCd}
+		</if>
+		<if test='sizeCd != null and sizeCd != ""'>
+		AND    ODI.OPT_CD2 = #{sizeCd}
+		</if>
+		<if test='goodsNm != null and goodsNm != ""'>
+		AND    G2.GOODS_NM = #{goodsNm}
 		</if>
 		<if test='recipNm != null and recipNm != ""'>
 		AND    DA.RECIP_NM = #{recipNm}
@@ -142,7 +167,216 @@
         		#{item}
             </foreach>
         </if>
-        ORDER  BY O.REG_DT DESC
+	</select>
+
+	<!-- 주문목록 -->
+	<select id="getOrderList" parameterType="Order" resultType="Order">
+		/* order.getOrderList */
+		SELECT Z.*
+		FROM (
+			SELECT @rownum := @rownum + 1 AS RNUM
+			     , A.*
+			FROM (
+				SELECT O.ORD_NO
+				     , O.ORD_NM
+				     , O.CUST_NO
+				     , OD.VENDOR_ID
+				     , O.FRONT_GB
+				     , DATE_FORMAT(O.ORD_DT,'%Y%m%d%H%i%S') AS ORD_DT
+				     , OD.ORD_EXCH_GB
+				     , OD.ORD_DTL_STAT
+				     , OD.DELV_LOC_CD
+				     , G1.GOODS_CD 
+				     , G1.GOODS_NM
+				     , G1.GOODS_TYPE
+				     , FN_GET_CODE_NM('G056', G1.GOODS_TYPE) AS GOODS_TYPE_NM
+				     , GI.IMG_PATH1
+				     , G2.BRAND_CD
+				     , (SELECT Z.BRAND_ENM
+				        FROM   TB_BRAND Z
+				        WHERE  Z.BRAND_CD = G2.BRAND_CD) AS BRAND_ENM
+				     , G2.GOODS_CD AS ITEM_CD
+				     , G2.GOODS_NM AS ITEM_NM
+				     , ODI.OPT_CD1
+				     , ODI.OPT_CD2
+				     , OD.EXTMALL_ORDER_ID
+				     , OD.AGENT_ORDER_ID 
+				     , OD.ORD_QTY
+				     , OD.CNCL_RTN_QTY
+				     , ODI.ORD_AMT
+				     , ODI.CNCL_RTN_AMT
+				     , ODI.CPN1_DC_AMT + ODI.TMTB1_DC_AMT + ODI.TMTB2_DC_AMT +  ODI.GOODS_CPN_DC_AMT + ODI.CART_CPN_DC_AMT + ODI.PNT_DC_AMT + ODI.PRE_PNT_DC_AMT AS TOT_DC_AMT
+				     , ODI.REAL_ORD_AMT
+				     , G2.SUPPLY_GOODS_CD
+				     , OD.FORMAL_GB
+				     , DATE_FORMAT(OD.DELV_ASSIGN_DT,'%Y%m%d%H%i%S') AS DELV_ASSIGN_DT 
+				     , OD.INVOICE_NO
+				     , OD.DELV_STDT
+				     , OD.SOLDOUT_YN
+				     , OD.SOLDOUT_MEMO
+				     , DATE_FORMAT(OD.SOLDOUT_REG_DT,'%Y%m%d%H%i%S') AS SOLDOUT_REG_DT 
+				     , OD.SOLDOUT_REG_NO     
+				FROM   TB_ORDER O
+				INNER  JOIN TB_ORDER_DETAIL OD
+				ON     O.ORD_NO = OD.ORD_NO
+				INNER  JOIN TB_GOODS G1
+				ON     OD.GOODS_CD = G1.GOODS_CD
+				INNER  JOIN TB_ORDER_DETAIL_ITEM ODI
+				ON     OD.ORD_NO = ODI.ORD_NO
+				AND    OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+				INNER  JOIN TB_GOODS G2
+				ON     ODI.ITEM_CD = G2.GOODS_CD
+				INNER  JOIN TB_GOODS_IMG GI
+				ON     ODI.ITEM_CD = GI.GOODS_CD
+				AND    ODI.OPT_CD1 = GI.COLOR_CD
+				INNER  JOIN TB_PAYMENT P
+				ON     O.ORD_NO = P.ORD_NO
+				AND    P.PAY_GB = 'O'
+				INNER  JOIN TB_DELIVERY_ADDR DA
+				ON     OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
+				LEFT   OUTER JOIN (
+					SELECT OC.WD_INVOICE_NO
+					     , OC.WD_INVOICE_SEND_YN
+					     , OC.SHIP_COMP_CD
+					     , OCD.ORD_DTL_NO 
+					     , OCD.CHG_QTY
+					     , OCD.CHG_STAT
+					FROM   TB_ORDER_CHANGE OC
+					INNER  JOIN TB_ORDER_CHANGE_DETAIL OCD
+					ON     OC.ORD_CHG_SQ  = OCD.ORD_CHG_SQ 
+				) OCD
+				ON    OD.ORD_DTL_NO = OCD.ORD_DTL_NO
+				WHERE  1=1
+				<if test='siteCd != null and siteCd != ""'>
+				AND    O.SITE_CD = #{siteCd}
+				</if>
+				<if test='mallCd != null and mallCd != ""'>
+				AND    O.MALL_GB = #{mallCd}
+				</if>
+				<if test='supplyCompCd != null and supplyCompCd != ""'>
+				AND    OD.SUPPLY_COMP_CD = #{supplyCompCd}
+				</if>
+				<if test="multiBrand != null and multiBrand != ''">
+		        AND    G1.BRAND_CD IN
+					<foreach collection="multiBrand" item="item" index="index"  open="(" close=")" separator=",">
+		        		#{item}
+		            </foreach>
+		        </if>
+		        <if test="multiOrdDtlStat != null and multiOrdDtlStat != ''">
+		        AND    OD.ORD_DTL_STAT IN
+					<foreach collection="multiOrdDtlStat" item="item" index="index"  open="(" close=")" separator=",">
+		        		#{item}
+		            </foreach>
+		        </if>
+		        <if test="multiOrdDtlStat == null or multiOrdDtlStat == ''">
+		        	<if test="multiOrdStat != null and multiOrdStat != ''">
+		        AND    OD.ORD_DTL_STAT IN
+						<foreach collection="multiOrdStat" item="item" index="index"  open="(" close=")" separator=",">
+			        		#{item}
+			            </foreach>
+		            </if>
+		        </if>
+				<if test="chgStat != null and chgStat != ''">
+		        AND    OCD.CHG_STAT = #{chgStat}
+		        </if>
+		        <if test="chgStat == null or chgStat == ''">
+		        	<if test="chgGb != null and chgGb != ''">
+		        AND    OCD.CHG_STAT = #{chgGb}
+		        	</if>
+		        </if>
+		        <if test='search != null and search == "searchOrdNo"'>
+		        	<if test="condition != null and condition != ''">
+				AND    O.ORD_NO = #{condition}
+					</if>
+				</if>
+				<if test='search != null and search == "searchExtmallOrderId"'>
+		        	<if test="condition != null and condition != ''">
+				AND    OD.EXTMALL_ORDER_ID = #{condition}
+					</if>
+				</if>
+				<if test='search != null and search == "searchAgentOrderId"'>
+		        	<if test="condition != null and condition != ''">
+				AND    OD.AGENT_ORDER_ID = #{condition}
+					</if>
+				</if>
+				<if test='payMeans != null and payMeans != ""'>
+				AND    P.PAY_MEANS = #{payMeans}
+				</if>
+				<if test='orderNm != null and orderNm != ""'>
+				AND    O.ORD_NM = #{orderNm}
+				</if>
+				<if test='custId != null and custId != ""'>
+				AND    O.CUST_NO = #{custId}
+				</if>
+				<if test='orderPhnno != null and orderPhnno != ""'>
+				AND    O.ORD_PHNNO = #{orderPhnno}
+				</if>
+				<if test='goodsCd != null and goodsCd != ""'>
+				AND    G1.GOODS_CD = #{goodsCd}
+				</if>
+				<if test='sizeCd != null and sizeCd != ""'>
+				AND    ODI.OPT_CD2 = #{sizeCd}
+				</if>
+				<if test='goodsNm != null and goodsNm != ""'>
+				AND    G1.GOODS_NM = #{goodsNm}
+				</if>
+				<if test='payMeans != null and payMeans != ""'>
+				AND    P.PAY_MEANS = #{payMeans}
+				</if>
+				<if test='orderNm != null and orderNm != ""'>
+				AND    O.ORD_NM = #{orderNm}
+				</if>
+				<if test='custId != null and custId != ""'>
+				AND    O.CUST_NO = #{custId}
+				</if>
+				<if test='orderPhnno != null and orderPhnno != ""'>
+				AND    O.ORD_PHNNO = #{orderPhnno}
+				</if>
+				<if test='goodsCd != null and goodsCd != ""'>
+				AND    G2.GOODS_CD = #{goodsCd}
+				</if>
+				<if test='sizeCd != null and sizeCd != ""'>
+				AND    ODI.OPT_CD2 = #{sizeCd}
+				</if>
+				<if test='goodsNm != null and goodsNm != ""'>
+				AND    G2.GOODS_NM = #{goodsNm}
+				</if>
+				<if test='recipNm != null and recipNm != ""'>
+				AND    DA.RECIP_NM = #{recipNm}
+				</if>
+				<if test='invoiceNo != null and invoiceNo != ""'>
+				AND    OD.INVOICE_NO = #{invoiceNo}
+				</if>
+				<if test='wdInvoiceSendYn != null and wdInvoiceSendYn == "Y"'>
+				AND    OD.INVOICE_SEND_YN = 'Y'
+				</if>
+				<if test='wdInvoiceSendYn != null and wdInvoiceSendYn == "N"'>
+				AND    OD.INVOICE_SEND_YN = 'N'
+				</if>
+				<if test='searchDateGb != null and searchDateGb == "ordDt"'>
+				AND    O.ORD_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+				AND    O.ORD_DT <![CDATA[<]]> DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+				</if>
+				<if test='searchDateGb != null and searchDateGb == "delvStdt"'>
+				AND    OD.DELV_STDT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+				AND    OD.DELV_STDT <![CDATA[<]]> DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+				</if>
+				<if test='searchDateGb != null and searchDateGb == "soldoutDt"'>
+				AND    OD.SOLDOUT_REG_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+				AND    OD.SOLDOUT_REG_DT <![CDATA[<]]> DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+				</if>
+				<if test="ordNoList != null and ordNoList != ''">
+		        AND    OD.ORD_NO IN
+					<foreach collection="ordNoList" item="item" index="index"  open="(" close=")" separator=",">
+		        		#{item}
+		            </foreach>
+		        </if>
+		        ORDER  BY O.REG_DT DESC
+	        ) A
+			JOIN (SELECT @rownum := 0) R
+		) Z
+		WHERE  1=1
+        AND    Z.RNUM BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
 	</select>
 	
 	<!-- 주문 목록 금액, 수량 정보-->
@@ -277,15 +511,24 @@
 		     , O.ORD_EMAIL
 		     , O.ORD_PHNNO
 		     , C.CUST_GB 
-		     , FN_GET_CODE_NM('G100', C.CUST_GB) AS CUST_GB_NM
+		     , CASE WHEN C.CUST_GB IS NULL 
+		            THEN '비회원'
+		            ELSE FN_GET_CODE_NM('G100', C.CUST_GB) 
+		             END CUST_GB_NM
 		     , C.MANAGED_RSN
-		     , FN_GET_CODE_NM('G120', C.MANAGED_RSN) AS MANAGED_RSN_NM
+		     , CASE WHEN C.MANAGED_RSN IS NULL 
+		            THEN '부'
+		            ELSE FN_GET_CODE_NM('G120', C.MANAGED_RSN) 
+		             END MANAGED_RSN_NM
 		     , C.CUST_GRADE
-		     , FN_GET_CODE_NM('G110', C.CUST_GRADE) AS CUST_GRADE_NM
+		     , CASE WHEN C.CUST_GRADE IS NULL 
+		            THEN '등급없음'
+		            ELSE FN_GET_CODE_NM('G110', C.CUST_GRADE) 
+		             END CUST_GRADE_NM
 		FROM   TB_ORDER O
 		INNER  JOIN TB_ORDER_DETAIL OD
 		ON     O.ORD_NO = OD.ORD_NO
-		INNER  JOIN TB_CUSTOMER C
+		LEFT   OUTER JOIN TB_CUSTOMER C
 		ON     O.CUST_NO = C.CUST_NO
 		WHERE  1=1
 		AND    O.ORD_NO = #{ordNo}
@@ -294,40 +537,60 @@
 	<!-- 주문상세 목록 -->
 	<select id="getOrderDetailList" parameterType="Order" resultType="Order">
 		/* order.getOrderDetailList */
-		SELECT OD.GOODS_CD
-		     , G.GOODS_NM
+		SELECT G1.GOODS_CD 
+		     , G1.GOODS_NM
+		     , G1.GOODS_TYPE
+		     , FN_GET_CODE_NM('G056', G1.GOODS_TYPE) AS GOODS_TYPE_NM
+		     , GI.IMG_PATH1
+		     , G2.BRAND_CD
+		     , (SELECT Z.BRAND_ENM
+		        FROM   TB_BRAND Z
+		        WHERE  Z.BRAND_CD = G2.BRAND_CD) AS BRAND_ENM
+		     , G2.GOODS_CD AS ITEM_CD
+		     , G2.GOODS_NM AS ITEM_NM
 		     , ODI.OPT_CD1
 		     , ODI.OPT_CD2
-		     , OD.ORD_QTY
-		     , OD.CNCL_RTN_QTY
-		     , OD.CPN1_DC_AMT
-		     , OD.GOODS_CPN_DC_AMT
-		     , OD.CART_CPN_DC_AMT
-		     , OD.TMTB1_DC_AMT
-		     , OD.TMTB2_DC_AMT
-			 , OD.PNT_DC_AMT
-		     , OD.PRE_PNT_DC_AMT
-		     , OD.SAVE_PNT_AMT
-		     , OD.ORD_AMT
-		     , OD.REAL_ORD_AMT
-		     , OD.CNCL_RTN_AMT
-		     , OD.ORD_DTL_STAT
-		     , FN_GET_CODE_NM('G013', OD.ORD_DTL_STAT) AS ORD_DTL_STAT_NM
-		     , OD.SOLDOUT_YN
-		     , OD.INVOICE_NO
-		     , OD.DELV_LOC_CD
-		     , OD.DELV_ADDR_SQ 
-		     , OD.DSTRBT_NOTE
-		     , ODI.ITEM_CD 
 		     , ODI.ITEM_QTY
 		     , ODI.ITEM_PRICE
-		     , ODI.OPT_ADD_PRICE
-		FROM   TB_ORDER_DETAIL OD
+		     , ODI.OPT_ADD_PRICE 
+		     , ODI.ITEM_ORD_QTY 
+		     , ODI.ITEM_CNCL_RTN_QTY
+		     , ODI.CPN1_DC_AMT
+		     , ODI.GOODS_CPN_DC_AMT
+		     , ODI.CART_CPN_DC_AMT
+		     , ODI.TMTB1_DC_AMT
+		     , ODI.TMTB2_DC_AMT
+		     , ODI.PNT_DC_AMT
+		     , ODI.PRE_PNT_DC_AMT
+		     , ODI.SAVE_PNT_AMT
+		     , ODI.GFCD_USE_AMT
+			 , ODI.ORD_AMT
+		     , ODI.REAL_ORD_AMT
+		     , ODI.CNCL_RTN_AMT
+		     , FN_GET_CODE_NM('G013', OD.ORD_DTL_STAT) AS ORD_DTL_STAT_NM 
+		     , OD.SOLDOUT_YN
+		     , OD.SOLDOUT_REG_NO
+		     , OD.SOLDOUT_MEMO
+		     , OD.INVOICE_NO
+		     , OD.DELV_LOC_CD 
+		FROM   TB_ORDER O
+		INNER  JOIN TB_ORDER_DETAIL OD
+		ON     O.ORD_NO = OD.ORD_NO
+		INNER  JOIN TB_GOODS G1
+		ON     OD.GOODS_CD = G1.GOODS_CD
 		INNER  JOIN TB_ORDER_DETAIL_ITEM ODI
-		ON     OD.ORD_NO = ODI.ORD_NO 
-		AND    OD.ORD_DTL_NO = OD.ORD_DTL_NO
-		INNER  JOIN TB_GOODS G
-		ON     OD.GOODS_CD = G.GOODS_CD
+		ON     OD.ORD_NO = ODI.ORD_NO
+		AND    OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		INNER  JOIN TB_GOODS G2
+		ON     ODI.ITEM_CD = G2.GOODS_CD
+		INNER  JOIN TB_GOODS_IMG GI
+		ON     ODI.ITEM_CD = GI.GOODS_CD
+		AND    ODI.OPT_CD1 = GI.COLOR_CD
+		INNER  JOIN TB_PAYMENT P
+		ON     O.ORD_NO = P.ORD_NO
+		AND    P.PAY_GB = 'O'
+		INNER  JOIN TB_DELIVERY_ADDR DA
+		ON     OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
 		WHERE  1=1
 		AND    OD.ORD_NO = #{ordNo}
 	</select>
@@ -398,6 +661,7 @@
 		/* order.getDeliveryFeeList */
 		SELECT DF.DELV_FEE_GB 
 		     , FN_GET_CODE_NM('G018', DF.DELV_FEE_GB) AS DELV_FEE_GB_NM
+		     , DF.DELV_FEE
 		     , DF.DELV_USAC_YN 
 		     , DATE_FORMAT(DF.DELV_USAC_DT,'%Y%m%d%H%i%S') AS DELV_USAC_DT 
 		     , DF.SUPPLY_COMP_CD 

+ 488 - 0
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsAdKeywordForm.html

@@ -0,0 +1,488 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsAdkeywordForm.html
+ * @desc    : 광고키워드 관리
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.12.14   eskim     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<!-- TITLE -->
+			<div class="panelTitle">
+				<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 하나를 꼭 입력해 주세요.</h3>
+			</div>
+			<!-- //TITLE -->
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/goods/ad/keyword/list'}" >
+				<input type="hidden" id="searchGb" name="searchGb" />
+			<div class="panelContent">	
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col width="10%"/>
+						<col width="30%"/>
+						<col width="10%"/>
+						<col width="20%"/>
+						<col width="10%"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>광고키워드</th>
+						<td>
+							<input type="text" class="w200" name="adKeyword" id="adKeyword" maxlength="20"/>
+						</td>
+						<th>상품코드</th>
+						<td>
+							<input type="text" class="w200" name="goodsCd" id="goodsCd" maxlength="20"/>
+						</td>
+						<th>사용여부</th>
+						<td>
+							<select name="useYn">
+								<option value="">[전체]</option>
+								<option value="Y">[Y] Yes</option>
+								<option value="N">[N] No</option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>기간</th>
+						<td colspan="5" id="sellTerms">
+						</td>
+					</tr>
+				</table>
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+					</li>
+				</ul>
+			</div>	
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<div id="gridKeywordList" style="width: 100%; height: 400px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+		<form id="goodsAdkeywordForm" name="goodsAdkeywordForm" action="#" th:action="@{'/goods/ad/keyword/save'}">
+		<input type="hidden" name="goodsList" />
+		<!-- 등록/수정 -->
+		<div class="panelStyle" >
+			<ul>
+				<li>
+					<table class="w100p">
+						<colgroup>
+							<col style="width:49%;"/>
+							<col style="width:1%;"/>
+							<col/>
+						</colgroup>
+						<tr>
+							<td class="vaT">
+								<table class="frmStyle" aria-describedby="등록/수정 폼">
+									<colgroup>
+										<col style="width:15%;"/>
+										<col style="width:35%;"/>
+										<col style="width:15%;"/>
+										<col/>
+									</colgroup>
+									<tr>
+										<th>일련번호</th>
+										<td>
+											<input type="text" class="w100" name="adKeywordSq" placeholder="자동부여" readonly="readonly"/>
+										</td>
+										<th>사용여부</th>
+										<td>
+											<input type="hidden" name="useYn"/>
+											<label class="chkBox checked"><input type="checkbox" name="chkUseYn" checked="checked" value="Y"/>사용</label>
+										</td>
+									</tr>
+									<tr>
+										<th>광고키워드<i class="required" title="필수"></i></th>
+										<td colspan="3">
+											<input type="text"  class="w50p"  name="adKeyword" required="required" data-valid-name="광고키워드"  maxlength="20"/>
+										</td>
+									</tr>
+									
+									<tr>	
+										<th>기간<i class="required" title="필수"></i></th>
+										<td colspan="3">
+											<input type="text" class="schDate w100" name="adKeywordStdt" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
+											~
+											<input type="text" class="schDate w100" name="adKeywordEddt" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
+										</td>
+									</tr>
+								</table>
+							</td>
+							<td>&nbsp;</td>
+							<td>
+							<ul class="panelBar">
+								<li class="left">
+									<button type="button" class="btn btn-danger btn-lg" id="btnDeleteadKeywordGoods">삭제</button>
+								</li>
+								<li class="right">
+									<button type="button" class="btn btn-base btn-lg" id="btnSearchExcel">엑셀조회</button>
+									<button type="button" class="btn btn-info btn-lg" id="btnSearchGoods">상품조회</button>
+								</li>
+							</ul>
+							<ul>
+								<li id="gridKeywordGoodsList" style="width: 100%; height: 450px;" class="ag-theme-balham"></li>
+							</ul>
+							</td>
+						</tr>
+					</table>
+				</li>
+			</ul>
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
+					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+		</div>
+		<!-- 등록/수정 -->
+		</form>
+	</div>
+<script th:inline="javascript">
+/*<![CDATA[*/
+
+	var columnKeywordDefs = [
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{headerName: "광고키워드일련번호", field: "adKeywordSq", width: 150, cellClass: 'text-center'},
+		{headerName: "광고키워드", field: "adKeyword", width: 300, cellClass: 'text-center', 
+			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
+		{headerName: "시작일", field: "adKeywordStdt", width:150, cellClass: 'text-center',
+			cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
+		},
+		{headerName: "종료일", field: "adKeywordEddt", width:150, cellClass: 'text-center',
+			cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
+		},
+		{headerName: "사용여부", field: "useYn", width:90, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regNm", width:90, cellClass: 'text-center'},
+		{headerName: "등록일자", field: "regDt", width:150, cellClass: 'text-center',
+			cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
+		},
+		{headerName: "수정자", field: "updNm", width:90, cellClass: 'text-center'},
+		{headerName: "수정일자", field: "updDt", width:150, cellClass: 'text-center',
+			cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
+		}
+	];
+	
+	var columnKeywordeGoodsDefs = [
+		{width: 40, cellClass: 'text-center', filter: false, rowDrag: true},
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{headerName: "CRUD", field: "crud", width: 75, minWidth: 75, hide: true},
+		{headerName: "상품코드", field: "goodsCd", width: 140, cellClass: 'text-center'},
+		{headerName: "상품명", field: "goodsNm", width: 350, cellClass: 'text-left'}
+	];
+
+	var gridKeywordOptions = gagaAgGrid.getGridOptions(columnKeywordDefs);
+	var gridKeywordGoodsOptions = gagaAgGrid.getGridOptions(columnKeywordeGoodsDefs);
+
+	gridKeywordGoodsOptions.rowSelection = 'multiple';
+	gridKeywordGoodsOptions.suppressRowClickSelection = true;
+	
+	// 드래그
+	gridKeywordGoodsOptions.rowDragManaged = true;
+	gridKeywordGoodsOptions.stopEditingWhenGridLosesFocus = true;
+	
+	// Cell click
+	gridKeywordOptions.onCellClicked = function(event) {
+		if (event.colDef.field != 'adKeyword')
+			return;
+		
+		$('#goodsAdkeywordForm input[name=adKeywordSq]').val(event.data.adKeywordSq);
+		if (event.data.useYn == 'Y') {
+			$('#goodsAdkeywordForm input:checkbox[name=chkUseYn]').prop('checked', true);
+			$('#goodsAdkeywordForm input:checkbox[name=chkUseYn]').parent("label").addClass("checked");
+		} else {
+			$('#goodsAdkeywordForm input:checkbox[name=chkUseYn]').prop('checked', false);
+			$('#goodsAdkeywordForm input:checkbox[name=chkUseYn]').parent("label").removeClass("checked");
+		}
+		
+		$('#goodsAdkeywordForm input[name=adKeywordStdt]').val(event.data.adKeywordStdt);
+		$('#goodsAdkeywordForm input[name=adKeywordEddt]').val(event.data.adKeywordEddt);
+		$('#goodsAdkeywordForm input[name=adKeyword]').val(event.data.adKeyword);
+
+		// 상품 목록
+		fnGetadKeywordGoodsList(event.data.adKeywordSq);
+	}
+
+	// 검색
+	$('#btnSearch').on('click', function() {
+		if(!fnConditionCheck()) return;
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridKeywordOptions, '#searchForm');
+	});
+	
+	//검색 조건 확인
+	var fnConditionCheck = function(){
+		var formId = '#searchForm';
+		var form = document.searchForm;
+
+		var searchFlag = false;
+		var cnt = 0;
+
+		for (i = 0; i < form.elements.length; i++ ) {
+			var el = form.elements[i];
+
+			if ($(el).prop("type") == "text" || ($(el).prop("type") == "select-one" && el.name != "search" && el.name != "pageSize")) {
+				if (!(el.value == null || el.value == "")) {
+					cnt++;
+				}
+			}
+		}
+			
+		if(cnt > 0) searchFlag = true;
+
+		if(searchFlag == false){
+			mcxDialog.alert("검색조건을 입력하세요.");
+			return false;
+		}
+		
+		var fromDate = $('#searchForm input[name=stDate]').val();
+		var toDate = $('#searchForm input[name=edDate]').val();
+		
+		if (!gagajf.isNull(fromDate) || !gagajf.isNull(toDate)) {
+			
+			if (gagajf.isNull(fromDate) || gagajf.isNull(toDate)) {
+				mcxDialog.alertC("기간 조회시 시작일자와 종료일자를 입력하세요.", {
+					sureBtnText: "확인",
+					sureBtnClick: function(){
+						$('#searchForm input[name=stDate]').focus();
+					}
+				});
+				return false;
+			}
+
+			if (fromDate > toDate) {
+				mcxDialog.alertC("기간 시작일자는 종료일자 보다 클 수 없습니다.", {
+					sureBtnText: "확인",
+					sureBtnClick: function(){
+						$('#goodsAdkeywordForm input[name=stDate]').focus();
+					}
+				});
+				return false;
+			} 
+		}
+
+		return true;
+	}
+	
+	// 상품 목록 조회
+	var fnGetadKeywordGoodsList = function(adKeywordSq) {
+		var actionUrl = '/goods/ad/keyword/goods/list/' + adKeywordSq;
+		gagaAgGrid.fetch(actionUrl, gridKeywordGoodsOptions);
+	}
+	
+	//엑셀 상품 조회
+	$('#btnSearchExcel').on('click', function() {
+		cfnExcelUploadPopup('goodsAdKeywordExcelUpload', 'goodsAdKeywordExcelUpload');
+	});
+
+	var goodsAdKeywordExcelUpload = function(result){
+		var data = {procJob : result.procJob
+			,excelFileNm : result.excelFileNm
+		};
+		var jsonData = JSON.stringify(data);
+		gagajf.ajaxJsonSubmit('/goods/search/excelupload/save', jsonData, fnGoodsAdKeywordExcelUploadCallBack);
+	}
+	
+	var fnGoodsAdKeywordExcelUploadCallBack = function(result){
+		gagajf.ajaxJsonSubmit('/goods/excel/upload/goods/list', '', fnExcelSearchCallBack);
+	}
+	
+	// 상품 엑셀 조회 콜백함수
+	var fnExcelSearchCallBack = function(result) {
+		if (result.goodsExcelList.length < 1) return;
+		var oldData = gagaAgGrid.getAllRowData(gridKeywordGoodsOptions);
+		$.each(result.goodsExcelList, function(idx, item) {
+			var isInvalid = false;
+			if (oldData != null && oldData.length != 0){
+				oldData.forEach(function(oneData){
+					if(oneData.goodsCd == item.goodsCd){
+						isInvalid = true;
+						return true;
+					}
+				});
+				if(isInvalid){
+					return isInvalid;
+				}
+			}
+			gagaAgGrid.addRowData(gridKeywordGoodsOptions, {"goodsCd" : item.goodsCd, "goodsNm" : item.goodsNm, "crud" : "C"});
+		});
+		return;
+	};
+	
+	// 상품 조회 클릭 시
+	$('#btnSearchGoods').on('click', function() {
+		cfnOpenGoodsPopup('fnSearchCallBack');
+	});
+
+	// 상품 조회 콜백함수
+	var fnSearchCallBack = function(result) {
+		if (result.length < 1) return;
+		var oldData = gagaAgGrid.getAllRowData(gridKeywordGoodsOptions);
+		$.each(result, function(idx, item) {
+			var isInvalid = false;
+			if (oldData != null && oldData.length != 0){
+				oldData.forEach(function(oneData){
+					if(oneData.goodsCd == item.goodsCd){
+						isInvalid = true;
+						return true;
+					}
+				});
+				if(isInvalid){
+					return isInvalid;
+				}
+			}
+			gagaAgGrid.addRowData(gridKeywordGoodsOptions, {"goodsCd" : item.goodsCd, "goodsNm" : item.goodsNm, "crud" : "C"});
+		});
+		return;
+	};
+	
+	// 상품 삭제
+	$('#btnDeleteadKeywordGoods').on('click', function() {
+		
+		var selectedData = gridKeywordGoodsOptions.api.getSelectedRows();
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		var removedData = gagaAgGrid.removeRowData(gridKeywordGoodsOptions, false);
+		
+		// 신규일 경우 화면에서만 삭제
+		if (gagajf.isNull($('#goodsAdkeywordForm input[name=adKeywordSq]').val())){
+			return;
+		}
+		
+		var arrGoodsCd = [];
+		$.each(selectedData, function(idx, item) {
+			arrGoodsCd.push(item.goodsCd);
+		});
+		
+		mcxDialog.confirm('삭제하시겠습니까?',  {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var data = {arrGoodsCd : arrGoodsCd
+							,adKeywordSq : $('#goodsAdkeywordForm input[name=adKeywordSq]').val()
+			};
+			
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit('/goods/ad/keyword/goods/delete', jsonData);
+			}
+		});
+	});
+	
+	// 신규 버튼 클릭
+	$("#btnNew").on("click", function(){
+		$('#goodsAdkeywordForm')[0].reset();
+
+		// 그리드 초기화
+		gridKeywordGoodsOptions.api.setRowData(null);
+		 
+		$('#goodsAdkeywordForm input[name=adKeywordSq]').val('');
+		$('#goodsAdkeywordForm input[name=adKeywordStdt]').val(_today);
+		$('#goodsAdkeywordForm input[name=adKeywordEddt]').val(_today);
+		
+		$('#goodsAdkeywordForm input[name=chkUseYn]').prop("checked", true);
+		$('#goodsAdkeywordForm input[name=chkUseYn]').parent("label").addClass("checked");
+		
+	});
+	
+	// 저장
+	$("#btnSave").on("click", function() {
+		// 날짜 체크
+		if (gagajf.isNull($('#goodsAdkeywordForm input[name=adKeywordStdt]').val())) {
+			mcxDialog.alertC('시작일자를 입력해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#goodsAdkeywordForm input[name=adKeywordStdt]').focus();
+				}
+			});
+			return;
+		}
+
+		if (gagajf.isNull($('#goodsAdkeywordForm input[name=adKeywordEddt]').val())) {
+			mcxDialog.alertC('종료일자를 입력해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#goodsAdkeywordForm input[name=adKeywordEddt]').focus();
+				}
+			});
+			return;
+		}
+		var stDate = $('#goodsAdkeywordForm input[name=adKeywordStdt]').val().toDate('YYYY-MM-DD');
+		var edDate = $('#goodsAdkeywordForm input[name=adKeywordEddt]').val().toDate('YYYY-MM-DD');
+
+		if (stDate > edDate) {
+			mcxDialog.alert("기간 종료일자는 시작일자 보다 클 수 없습니다.");
+			return;
+		}
+
+		// validation
+		if (!gagajf.validation('#goodsAdkeywordForm'))
+			return false;
+
+		$('#goodsAdkeywordForm input[name=useYn]').val($('#goodsAdkeywordForm input:checkbox[name=chkUseYn]').is(":checked") ? 'Y' : 'N');
+
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var idx = 0;
+				var goodsAllData = gagaAgGrid.getAllRowData(gridKeywordGoodsOptions);
+				$.each(goodsAllData, function(idx, item) {
+					item.dispOrd = idx+1;
+				});
+				
+				var jsonGoodsData = JSON.stringify(goodsAllData);
+				$('#goodsAdkeywordForm input[name=goodsList]').val(jsonGoodsData);
+				
+				var jsonData = JSON.stringify($('#goodsAdkeywordForm').serializeObject());
+				gagajf.ajaxJsonSubmit($('#goodsAdkeywordForm').prop('action'), jsonData, function() {
+					$('#btnSearch').trigger('click');
+					$('#btnNew').trigger('click');
+					
+				});
+			}
+		});
+	});
+	
+	$(document).ready(function() {
+		
+		cfnCreateCalendar('#sellTerms', 'stDate', 'edDate', true, '기간', 'X');
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridKeywordList', gridKeywordOptions);
+		gagaAgGrid.createGrid('gridKeywordGoodsList', gridKeywordGoodsOptions);
+		
+	});
+	
+/*]]>*/
+</script>
+
+</html>

+ 103 - 30
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html

@@ -76,9 +76,8 @@
 							<li><a href="#goodstab2">옵션/재고정보</a></li>
 							<li><a href="#goodstab3">상품상세정보</a></li>
 							<li id="goodsNotiTab"><a href="#goodstab4">고시정보</a></li>
-							<!-- <li id="goodsColorTab"><a href="#goodstab5">대표색상</a></li> -->
-							<li id="GoodsComposeTab" style="display:none;"><a href="#goodstab6">구성상품</a></li>
-							<li><a href="#goodstab7">변경이력</a></li>
+							<li id="goodsComposeTab" style="display:none;"><a href="#goodstab5">구성상품</a></li>
+							<li><a href="#goodstab6">변경이력</a></li>
 						</ul>
 					</div>
 					<!-- //TABS NAVI -->
@@ -158,7 +157,7 @@
 										</td>
 									</tr>
 									<tr>
-										<td rowspan="9">&nbsp;</td>
+										<td rowspan="12">&nbsp;</td>
 										<th>시즌<em class="required" title="필수"></em></th>
 										<td >
 											<select  name="seasonCd" id="seasonCd">
@@ -234,16 +233,18 @@
 										<td><input type="text" class="w80p aR" id="sellFeeRate" name="sellFeeRate" maxlength="10" data-valid-type="numeric"/> %
 											<input type="hidden" id="sellFeeRateOrg" name="sellFeeRateOrg"/>
 										</td>
-										<th>반품여부<em class="required" title="필수"></em></th>
+										<th>과세구분</th>
 										<td>
-											<label class="rdoBtn"><input type="radio" name="returnableYn" id="returnableYnY" value="Y" />Y</label>
-											<label class="rdoBtn"><input type="radio" name="returnableYn" id="returnableYnN" value="N"/>N</label>
-											<input type="hidden" id="returnableYnOrg" name="returnableYnOrg"/>
+											<select name="taxGb"  disabled="disabled">
+												<option value="">[선택]</option>
+												<option value="10">과세</option>
+												<option value="20">비과세</option>
+											</select>
 										</td>
 									</tr>
 									<tr>
 										<th>품목코드<em class="required" title="필수"></em></th>
-										<td colspan="3">
+										<td colspan="5">
 											<select  name="itemkindCd" id="itemkindCd" th:disabled="${sessionInfo.roleCd != 'G001_0000' AND sessionInfo.roleCd != 'G001_A000' AND sessionInfo.roleCd != 'G001_A101' AND sessionInfo.roleCd != 'G001_A100' AND sessionInfo.roleCd != 'G001_A001'}">
 												<option th:if="${itemkindList}" th:each="oneData, status : ${itemkindList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 											</select>
@@ -252,13 +253,26 @@
 											<button type="button" class="btn btn-success btn-lg" id="btnGoodsItemkindChange">품목변경</button>
 											</th:block>
 										</td>
-										<th>과세구분</th>
+										
+									</tr>
+									<tr>
+										<th>반품여부<em class="required" title="필수"></em></th>
 										<td>
-											<select name="taxGb"  disabled="disabled">
-												<option value="">[선택]</option>
-												<option value="10">과세</option>
-												<option value="20">비과세</option>
-											</select>
+											<label class="rdoBtn"><input type="radio" name="returnableYn" id="returnableYnY" value="Y" />Y</label>
+											<label class="rdoBtn"><input type="radio" name="returnableYn" id="returnableYnN" value="N"/>N</label>
+											<input type="hidden" id="returnableYnOrg" name="returnableYnOrg"/>
+										</td>
+										<th>교환여부<em class="required" title="필수"></em></th>
+										<td>
+											<label class="rdoBtn"><input type="radio" name="changeableYn" id="changeableYnY" value="Y" />Y</label>
+											<label class="rdoBtn"><input type="radio" name="changeableYn" id="changeableYnN" value="N"/>N</label>
+											<input type="hidden" id="changeableYnOrg" name="changeableYnOrg"/>
+										</td>
+										<th>신규가입구매가입여부<em class="required" title="필수"></em></th>
+										<td>
+											<label class="rdoBtn"><input type="radio" name="newCustOrdYn" id="newCustOrdYnY" value="Y" />Y</label>
+											<label class="rdoBtn"><input type="radio" name="newCustOrdYn" id="newCustOrdYnN" value="N"/>N</label>
+											<input type="hidden" id="newCustOrdYnOrg" name="newCustOrdYnOrg"/>
 										</td>
 									</tr>
 									<tr>
@@ -315,14 +329,18 @@
 										</td>
 									</tr>
 									<tr>
-										<td></td>
+										<th>구매등급</th>
+										<td colspan="5">
+											<div id="goodsCustGradeList"></div>
+										</td>
+									</tr>
+									<tr>
 										<th>안전인증번호</th>
 										<td colspan="5">
 											<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>
-										
 									</tr>
 									</tbody>
 								</table>
@@ -431,15 +449,8 @@
 							<!-- //TAB4 CONTENTS AREA -->
 						</li>
 						<!-- //TAB4 : 고시정보 -->
-
-<!-- 					<li class="tab" id="goodstab5">
-						<div class="panelStyle">
-							<div id="gridGoodsNumList" style="height: 480px;" class="ag-theme-balham lh60"></div>
-						</div>
-					</li> -->
-
-						<!-- TAB6 : 구성상품 -->
-						<li class="tab" id="goodstab6">
+						<!-- 구성상품 -->
+						<li class="tab" id="goodstab5">
 							<!-- TAB6 CONTENTS AREA -->
 							<div class="panelStyle">
 								<!-- 내용 삽입 -->
@@ -455,9 +466,8 @@
 							</div>
 							<!-- //TAB6 CONTENTS AREA -->
 						</li>
-						<!-- //TAB7 : 추가정보 -->
 						<!-- TAB5 : 이력정보 -->
-						<li class="tab" id="goodstab7">
+						<li class="tab" id="goodstab6">
 							<!-- TAB8 CONTENTS AREA -->
 							<div class="panelStyle">
 								<!-- 내용 삽입 -->
@@ -749,6 +759,16 @@
 			}else{
 				$("#goodsDetailForm input:radio[name=returnableYn]:input[value='N']").trigger('click');
 			}
+			if (result.changeableYn == "Y"){
+				$("#goodsDetailForm input:radio[name=changeableYn]:input[value='Y']").trigger('click');
+			}else{
+				$("#goodsDetailForm input:radio[name=changeableYn]:input[value='N']").trigger('click');
+			}
+			if (result.newCustOrdYn == "Y"){
+				$("#goodsDetailForm input:radio[name=newCustOrdYn]:input[value='Y']").trigger('click');
+			}else{
+				$("#goodsDetailForm input:radio[name=newCustOrdYn]:input[value='N']").trigger('click');
+			}
 			
 			$('#goodsDetailForm input[name=sellFeeRate]').val(result.sellFeeRate);
 			$("#goodsDetailForm input[name=sellFeeRateOrg]").val(result.sellFeeRate);
@@ -777,6 +797,7 @@
 			$("#goodsDetailForm input[name=preMpntUsableYnOrg]").val(result.preMpntUsableYn);
 			$("#goodsDetailForm input[name=changeableYnOrg]").val(result.changeableYn);
 			$("#goodsDetailForm input[name=returnableYnOrg]").val(result.returnableYn);
+			$("#goodsDetailForm input[name=newCustOrdYnOrg]").val(result.newCustOrdYn);
 
 			$("#goodsDetailForm input[type=radio][checked]").addClass("checked");
 			//$("#goodsDetailForm input[type=radio][checked]").parent("label").addClass("checked");
@@ -873,13 +894,13 @@
 			//세트
 			if ("G056_S" == result.goodsType){
 				//$('#goodsDetailForm #erplinkarea').addClass('off');
-				if (result.selfGoodsYn == "Y") $('#goodsDetailForm #GoodsComposeTab').css('display','block');
+				if (result.selfGoodsYn == "Y") $('#goodsDetailForm #goodsComposeTab').css('display','block');
 				$('#goodsDetailForm #goodsNotiTab').css('display','none');
 				$('#goodsDetailForm input[name=sellFeeRate]').attr('readonly', true);
 				$('#goodsDetailForm input[name=currPrice]').attr('readonly', true);
 			}else if ("G056_D" == result.goodsType){
 				//$('#goodsDetailForm #erplinkarea').addClass('off');
-				if (result.selfGoodsYn == "Y") $('#goodsDetailForm #GoodsComposeTab').css('display','block');
+				if (result.selfGoodsYn == "Y") $('#goodsDetailForm #goodsComposeTab').css('display','block');
 				$('#goodsDetailForm #goodsNotiTab').css('display','none');
 				$('#goodsDetailForm input[name=sellFeeRate]').attr('readonly', true);
 			}
@@ -899,6 +920,8 @@
 			fnGoodsDetailSizeStockSearch(params);
 			//정보고시
 			fnGoodsDetailNotiInfoSearch(params);
+			//구매등급
+			fnGoodsDetailOrderGradeSearch(params);
 			
 			//구성상품
 			if ("G056_S" == result.goodsType || "G056_D" == result.goodsType){
@@ -925,6 +948,11 @@
 		cfnAjaxSubmit("/goods/detail/notiInfo/list", "json", fnGoodsDetailNotiInfoSearchCallback, params);
 	}
 	
+	//구매등급
+	var fnGoodsDetailOrderGradeSearch = function(params) {
+		cfnAjaxSubmit("/goods/detail/order/grade/list", "json", fnGoodsDetailOrderGradeSearchCallback, params);
+	}
+	
 	//구성상품
 	var fnGoodsComposeListSearch = function(params) {
 		if ("G056_S" == params.goodsType){	//세트
@@ -973,6 +1001,21 @@
 			$('#goodsDetailForm').find('.tabs .tabsNav li:eq(3) a').attr("style", "color:red;");
 		});
 	}
+	
+	//구매등급 콜백
+	var fnGoodsDetailOrderGradeSearchCallback = function(result) {
+		if (result == null) return;
+
+		result.forEach(function(info){
+			
+			$("#goodsDetailForm #goodsCustGradeList").find("input").each(function() {
+				if (info.custGrade == $(this).val() ){
+					$(this).prop("checked", true);
+					$(this).parent("label").addClass("checked");
+				}
+			});
+		});
+	}
 
 	//상품명 길이표시
 	$("#goodsDetailForm input[name=goodsNm]").bind('focus focusout input keyup keydown paste change', function () {
@@ -1848,6 +1891,14 @@
 		if ($("#goodsDetailForm input[name=delvFeeCdOrg]").val() != $("#goodsDetailForm select[name=delvFeeCd]").val()){
 			return true;
 		}
+		// 교환가능여부
+		if ($("#goodsDetailForm input[name=changeableYnOrg]").val() != $("input[name=changeableYn]:checked").val()){
+			return true;
+		}
+		// 신규가입구매가능여부
+		if ($("#goodsDetailForm input[name=newCustOrdYnOrg]").val() != $("input[name=newCustOrdYn]:checked").val()){
+			return true;
+		}
 		
 		return false;
 	}
@@ -1927,6 +1978,26 @@
 		});
 	});
 	
+	// 상품구매등급 
+	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;
+			}
+		});
+		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;");
+		}
+	}
+	
 	// 구성상품 조회 팝업
 	var fnOpenGoodsDetailPopup = function() {
 		cfnOpenGoodsPopup('fnGoodsDetailGoodsDeal');
@@ -2010,6 +2081,8 @@
 	});
 	
 	$(document).ready(function() {
+		
+		cfnCreateCheckbox("/renderer/avail/commonCode/list/G101", $('#goodsCustGradeList'), "goodsOrderGrade");
 
 		gagaAgGrid.createGrid('gridGoodsHstoryList', gridGoodsHstoryOptions);
 		gagaAgGrid.createGrid('gridGoodsComposeList', gridGoodsComposeOptions);

+ 25 - 5
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsListForm.html

@@ -313,10 +313,14 @@
 								<label class="chkBox"><input type="checkbox" name="blankFlag" value="Y"/>BLANK 적용<span></span></label>
 								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('goodsTnm')" >적용</button>
 							</td>
-							<th>무료배송기준</th>
+							<th>교환가능여부</th>
 							<td>
-								<input id="minOrdAmtC" name="minOrdAmtC" type="text" class="w100"  data-valid-type="numeric" maxlength="10"/>이상 구매시 무료
-								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('minOrdAmt')" >적용</button>
+								<select id="changeableYnC" name="changeableYnC">
+									<option value="">[선택]</option>
+									<option value="Y">가능</option>
+									<option value="N">불가</option>
+								</select>
+								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('changeableYn')" >적용</button>
 							</td>
 							<th>ID당1일최대구매수량</th>
 							<td>
@@ -356,7 +360,7 @@
 								</select>
 								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('giftPackYn')" >적용</button>
 							</td>
-							<th>배송정책</th>
+							<th>배송정책</th>
 							<td colspan="3">
 								<label class="rdoBtn"><input type="radio" name="statSelfYn" id="statSelfYnY" value="Y"  checked/>자사</label>
 								<label class="rdoBtn"><input type="radio" name="statSelfYn" id="statSelfYnN" value="N"/>입점</label>
@@ -369,7 +373,15 @@
 								</select>
 								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('delvFeeCd')" >적용</button>
 							</td>
-							<td colspan="2">
+							<th>신규고객 주문가능</th>
+							<td>
+								<select id="newCustOrdYnC" name="newCustOrdYnC">
+									<option value="">[선택]</option>
+									<option value="Y">가능</option>
+									<option value="N">불가</option>
+								</select>
+								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('newCustOrdYn')" >적용</button>
+							</td>
 						</tr>
 					</table>
 				</li>
@@ -760,6 +772,7 @@
 		var erpStockLinkYnVal= '';
 		var formalGbVal= '';
 		var returnableYnVal= '';
+		var changeableYnVal= '';
 		var goodsTnmVal  = '';
 		var blankFlagVal = '';
 		var minOrdAmtVal = '';
@@ -770,6 +783,7 @@
 		var pntMrateVal = '';
 		var giftPackYnVal = '';
 		var delvFeeCdVal = '';
+		var newCustOrdYnVal = '';
 
 		if (proc == "goodsStat") {
 			goodsStatVal = $(objId).val();
@@ -779,6 +793,8 @@
 			formalGbVal = $(objId).val();
 		}else if (proc == "returnableYn") {
 			returnableYnVal = $(objId).val();
+		}else if (proc == "changeableYn") {
+			changeableYnVal = $(objId).val();	
 		}else if (proc == "goodsTnm"){
 			if($("#searchForm input:checkbox[name=blankFlag]").is(':checked')){
 				blankFlagVal = "Y";
@@ -844,6 +860,8 @@
 			pntMrateVal = $(objId).val();
 		}else if (proc == "giftPackYn") {
 			giftPackYnVal = $(objId).val();
+		}else if (proc == "newCustOrdYn") {
+			newCustOrdYnVal = $(objId).val();	
 		}else if (proc == "delvFeeCd") {
 			if (!fnGoodsDelFeeCdCheck(selectedData)){
 				return;
@@ -868,6 +886,7 @@
 							,erpStockLinkYn : erpStockLinkYnVal
 							,formalGb : formalGbVal
 							,returnableYn : returnableYnVal
+							,changeableYn : changeableYnVal
 							,goodsTnm : goodsTnmVal
 							,blankFlag : blankFlagVal
 							,minOrdAmt : minOrdAmtVal
@@ -877,6 +896,7 @@
 							,pntMrate : pntMrateVal
 							,giftPackYn : giftPackYnVal
 							,delvFeeCd : delvFeeCdVal
+							,newCustOrdYn : newCustOrdYnVal
 							,procJob : proc
 							};
 

+ 147 - 161
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsNaverPriceForm.html

@@ -23,13 +23,16 @@
 		<!-- 메뉴 설명 -->
 		<div class="infoBox menu-desc">
 		</div>
-		<form id="searchForm" name="searchForm" action="#" th:action="@{'/goods/list'}">
+		<form id="searchForm" name="searchForm" action="#" th:action="@{'/goods/naver/price/list'}">
 		<input type="hidden" id="searchGb" name="searchGb" />
  		<!-- 패널 영역1 -->
 		<div class="panelStyle" >
 			<!-- TITLE -->
 			<div class="panelTitle">
 				<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 하나를 꼭 입력해 주세요.</h3>
+				<span class="panelControl">
+					<i class="fa fa-chevron-up"></i>
+				</span>
 			</div>
 			<!-- //TITLE -->
 			<div class="panelContent">
@@ -41,8 +44,8 @@
 						<col/>
 					</colgroup>
 					<tr>
-						<th rowspan="3">브랜드</th>
-						<td rowspan="3">
+						<th>브랜드</th>
+						<td>
 							<select name="supplyCompCd" id="supplyCompCd">
 								<option value="" th:if="${sessionInfo.roleCd} != 'G001_B000'">[전체]</option>
 								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
@@ -51,21 +54,40 @@
 								<option value="">[전체]</option>
 							</select>
 						</td>
-						<th rowspan="3">키워드<em class="required" title="필수"></em></th>
+						<th rowspan="3">키워드</th>
 						<td rowspan="3">
 							<select name="search" id="search">
 								<option value="searchGoodsCd">상품코드</option>
-								<option value="searchGoodsNm">상품명</option>
-								<option value="searchGoodsNum">품번</option>
 							</select>
 							<textarea class="textareaR3 w150" name="condition" id="condition"></textarea>
 						</td>
 					</tr>
+					<tr>
+						<th rowspan="2">년도/시즌</th>
+						<td rowspan="2">
+							<div class="multiCheckBox" style="width:140px;">
+								<button type="button" class="sltBtn">[전체]</button>
+								<ul style="overflow:auto; height:140px">
+									<li><label class="chkBox"><input type="checkbox" name="전체선택" id="multiStyleYear" onclick="uifnAllCheck('multiStyleYear')">전체선택</label></li>
+									<li th:if="${styleYearList}" th:each="oneData, status : ${styleYearList}"><label class="chkBox"><input type="checkbox" name="multiStyleYear" th:id="${'styleYear' + oneData.cd}" th:value="${oneData.cd}" ><th:block th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></th:block></label></li>
+								</ul>
+							</div>
+							<div class="multiCheckBox" style="width:170px;">
+								<button type="button" class="sltBtn">[전체]</button>
+								<ul style="overflow:auto; height:170px">
+									<li><label class="chkBox"><input type="checkbox" name="전체선택" id="multiSeasonCd" onclick="uifnAllCheck('multiSeasonCd')">전체선택</label></li>
+									<li th:if="${seasonList}" th:each="oneData, status : ${seasonList}"><label class="chkBox"><input type="checkbox" name="multiSeasonCd" th:id="${'seasonCd' + oneData.cd}" th:value="${oneData.cd}" ><th:block th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></th:block></label></li>
+								</ul>
+							</div>		
+						</td>
+					</tr>
 				</table>
 				<ul class="panelBar">
 					<li class="center">
 						<button type="button" class="btn btn-gray btn-lg" id="btnInit" >초기화</button>
 						<button type="button" class="btn btn-info btn-lg" id="btnSearch" >조회</button>
+						&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+						<button type="button" class="btn btn-primary btn-lg" id="btnNaverPriceSearch" >네이버 최저가 조회</button>
 					</li>
 				</ul>
 			</div>
@@ -79,25 +101,10 @@
 				<li>
 					<button type="button" class="btn btn-default btn-lg" onclick="fnGoodsExcelDownLoad('');">엑셀다운로드</button>
 				</li>
-				<li class="aR">
-					검색결과 : <strong><span id="gridRowTotalCount">0</span> 건</strong>&nbsp;
-					쪽번호 <span id="pgNo">0</span>/ <strong id="endPgNo">0</strong>&nbsp;&nbsp;
-					<select id="pageSize" name="pageSize">
-						<option value="50" selected="selected">50개씩 보기</option>
-						<option value="100">100개씩 보기</option>
-						<option value="500">500개씩 보기</option>
-						<option value="1000">1000개씩 보기</option>
-					</select>
-					<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
-				</li>
 			</ul>
 			<!-- //상단버튼 영역  -->
-			<div id="gridList" style="width: 100%; height: 500px;" class="ag-theme-balham lh60"></div>
-			<ul class="panelBar">
-				<li class="center">
-					<div class="tablePaging" id="goodsListPagination"></div>
-				</li>
-			</ul>
+			<div id="gridList" style="width: 100%; height: 500px;" class="ag-theme-balham"></div>
+			
 			<label class="off">
 				<a href="javascript:void(0);" id="GoodsExcelList" style="display: none;">상품목록 엑셀다운로드</a>
 			</label>
@@ -107,13 +114,12 @@
 <script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=2019072202"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
-
+	
+	var sessRoleCd = [[${sessionInfo.roleCd}]];
 	var columnDefs = [];
 	columnDefs = [
 		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
-		{headerName: 'No', width: 50, cellClass: 'text-center',
-			valueGetter: function(params) { return cfnGridNumner('searchForm',params.node.rowIndex, 'A');}
-		},
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
 		{headerName: "브랜드", field: "brandCd", width: 80, cellClass: 'text-center'},
 		{headerName: "브랜드명", field: "brandEnm", width: 130, cellClass: 'text-center'},
 		{headerName: "상품코드", field: "goodsCd", width: 140, cellClass: 'text-center'},
@@ -132,23 +138,50 @@
 			cellEditor: 'textCellEditor',
 			cellEditorParams: { maxlength: 14, validType: 'numeric'}
 		},
-		{headerName: "자사즉시할인가", field: "currPrice" , width: 120, cellClass: 'text-right'
+		{headerName: "자사즉시할인가", field: "benefitPrice" , width: 120, cellClass: 'text-right'
 			,valueFormatter: function(params) {return params.value.addComma();},
 			cellEditor: 'textCellEditor',
 			cellEditorParams: { maxlength: 14, validType: 'integer'}
 		},
-		{headerName: "네이버최저가", field: "currPrice" , width: 120, cellClass: 'text-right'
+		{headerName: "네이버최저가", field: "lowestPrice" , width: 120, cellClass: 'text-right'
 			,valueFormatter: function(params) {return params.value.addComma();},
 			cellEditor: 'textCellEditor',
 			cellEditorParams: { maxlength: 14, validType: 'numeric'}
 		},
-		{headerName: "차액", field: "currPrice" , width: 100, cellClass: 'text-right'
-			,valueFormatter: function(params) {return params.value.addComma();},
-			cellEditor: 'textCellEditor',
-			cellEditorParams: { maxlength: 14, validType: 'numeric'}
+		{headerName: "차액", field: "currPrice" , width: 100, cellClass: 'text-right',
+			valueFormatter: function(params) {
+				var priceVal =  params.data.benefitPrice - params.data.lowestPrice;
+				return priceVal.addComma();
+			},
+			cellStyle : function(params){
+				var color = "";
+				var priceVal =  params.data.benefitPrice - params.data.lowestPrice;
+				if (priceVal > 0){
+					//color = '#ff96689c';
+					color = "red";
+					//background-color
+				}
+				return { 'color': color};
+			}
+		},
+		{headerName: "최저가몰명", field: "mallNm", width: 140, cellClass: 'text-center'},
+		{headerName: "최저가몰링크", field: "mallLink", width: 200, cellClass: 'text-center'
+			,cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "등록자", field: "regNm" , width: 100, cellClass: 'text-center'},
+		{headerName: "수정일시", field: "updDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
 		},
-		{headerName: "최저가몰명", field: "goodsCd", width: 140, cellClass: 'text-center'},
-		{headerName: "최저가몰링크", field: "goodsCd", width: 200, cellClass: 'text-center'}
+		{headerName: "수정자", field: "updNm" , width: 100, cellClass: 'text-center'}
 	];
 
 	// Get GridOptions
@@ -157,7 +190,6 @@
 	// 중복 선택 가능
 	gridOptions.rowSelection = 'multiple';
 	gridOptions.suppressRowClickSelection = true;
-	gridOptions.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
 
 	gridOptions.stopEditingWhenGridLosesFocus = true;
 
@@ -167,152 +199,93 @@
 		if (event.colDef.field == "goodsCd"){
 			cfnOpenGoodsDetailPopup('U',goodsCd);
 			//cfnOpenFrontGoodsPopup(goodsCd, event.data.siteCd);
+		}else if (event.colDef.field == "mallLink"){
+			window.open(event.data.mallLink, "_blank, scrollbars=yes");
+			
 		}
 	}
 
-	var fnChangeSelect = function(val, selLvl){
-		$("#cateCd").val('');
-		$('#tcateCd').val('');
-		$('#mcateCd').val('');
-		$('#scateCd').val('');
-		$('#dcateCd').val('');
-		if(val==''){
-			if(selLvl>1){
-				selLvl = selLvl - 1;
-				if(selLvl>2){
-					$("#cateCd").val($("#selCate"+(selLvl-1)).val());
-				}
-			}else{
-				selLvl = '';
-			}
-		}else{
-			if(selLvl>2){
-				$("#cateCd").val(val);
-			}
-		}
-		$("#searchForm input[name=selLvl]").val(selLvl);
-		$("#searchForm input[name=searchGb]").val("BASIC");
-		gagajf.ajaxFormSubmit('/display/category/list', "#searchForm", fnChangeCategory);
-	}
+	// 초기화 클릭시
+	$('#btnInit').on('click', function() {
 
-	var fnChangeCategory = function(data){
-		var selLvl = $("#searchForm input[name=selLvl]").val();
-		var html = '<option value="">[선택]</option>';
-		for(var i=1; i<6; i++){
-			if(i>selLvl){
-				$("#selCate"+i).html(html);
-			}
-		}
-		for(var i=0; i<data.length; i++){
-			var cd = '';
-			var nm = '';
-			if(data[i].useYn=='Y'){
-				if(selLvl=='1'){
-					cd = data[i].cateGb;
-					nm = gagaAgGrid.lookupValue(cateGbList, cd);
-				}else{
-					cd = data[i].cateCd;
-					nm = data[i].cateNm;
-					$("#cateType").val(data[i].cateType);
-				}
-				html += '<option value="'+cd+'">['+cd+'] '+nm+'</option>';
-			}
-		}
-		$("#selCate"+selLvl).html(html);
-	}
+		$('#searchForm')[0].reset();
+		//$("#searchForm input[type=radio]").removeClass("checked");
+		$("#searchForm input[type=checkbox]").removeClass("checked");
+		//$("#searchForm input[type=radio]").parent("label").removeClass("checked");
+		$("#searchForm input[type=checkbox]").parent("label").removeClass("checked");
+		$("#searchForm input[type=radio][checked]").parent("label").addClass("checked");
 
-	// 조회
-	$('#btnSearch').on('click', function() {
-		if($("#selCate2").val()=='' && $("#condition").val()=='' && $("#brandGrpNm").val()=='' && $("#itemkindCdSearch").val()==''
-			&& $("#styleYear").val()=='' && $("#formalGb").val()=='' && $("#mdId").val()==''){
-			mcxDialog.alert('검색조건을 입력해 주세요.');
-			return;
-		}
-		$("#searchForm input[name=searchGb]").val("BASIC");
-		fnSearch();
 	});
 
-	$("#pageSize").on("change", function(){
-		var rowCnt = gridOptions.api.getDisplayedRowCount();
-		if(rowCnt > 0){
-			fnSearch();
-		}
+	// 조회클릭시
+	$('#btnSearch').on('click', function() {
+		fnGoodsListSearch('BASIC');
 	});
 
-	var fnSearch = function(){
-		gagaPaging.init('searchForm', fnSearchCallBack, 'goodsListPagination', $('#searchForm').find('#pageSize').val());
-		gagaPaging.load(1);
-	};
+	// 조회
+	var fnGoodsListSearch = function(gbn) {
+		
+		if (typeof(gbn) != 'undefined' &&  gbn == 'EXCEL'){
+			$("#searchForm input[name=searchGb]").val("EXCEL");
+		}else{
+			$("#searchForm input[name=searchGb]").val("BASIC");
+		}
 
-	var fnSearchCallBack = function(result){
+		if(!fnConditionCheck()) return;
+ 		
+ 		var formId = "#searchForm";
+ 		gagaAgGrid.fetch($(formId).prop('action'), gridOptions, formId);
 
-		$('#searchForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
-		$('#searchForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
-		$('#searchForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
-		$('#searchForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
-		gridOptions.api.setRowData(result.goodsList);
-		gagaPaging.createPagination(result.pageing.pageable);
 	}
 
-	//엑셀 상품 조회
-	$('#btnGoodsExcelUpLoad').on('click', function() {
-		cfnExcelUploadPopup('goodsExcelUpload', 'goodsExcelUpload');
-	});
+	//검색 조건 확인
+	var fnConditionCheck = function(){
+		var formId = '#searchForm';
+		var form = document.searchForm;
 
-	var goodsExcelUpload = function(result){
-		var data = {procJob : result.procJob
-					,excelFileNm : result.excelFileNm
-					};
-		var jsonData = JSON.stringify(data);
-		gagajf.ajaxJsonSubmit('/goods/search/excelupload/save', jsonData, fnGoodsExcelUploadCallBack);
-	}
+		if($("#searchForm input[name=searchGb]").val() == "EXCEL") return true;
 
-	var fnGoodsExcelUploadCallBack = function(result){
-		$("#searchForm input[name=searchGb]").val("EXCEL");
-		fnSearch();
-	}
+		var searchFlag = false;
+		var cnt = 0;
 
-	$("#btnInit").on("click", function(){
-		$("#searchForm")[0].reset();
-	});
+		for (i = 0; i < form.elements.length; i++ ) {
+			var el = form.elements[i];
 
-	$("#btnChangeItemKindCd").on("click", function(){
-		if($("#itemKindCd").val()==''){
-			mcxDialog.alert('품목코드를 입력해 주세요.');
-			return;
-		}
-		var selectedData = gagaAgGrid.selectedRowData(gridOptions);
-		selectedData.forEach(function(data){
-			data.itemkindCdNew = $("#itemKindCd").val();
-		});
-		gridOptions.api.refreshCells();
-	});
-
-	$("#btnSave").on("click", function(){
-		var rowData = gagaAgGrid.getAllRowData(gridOptions);
-		var dataArr = [];
-		rowData.forEach(function(row){
-			if(typeof row.itemkindCdNew!='undefined' && row.itemkindCdNew!=''){
-				var data = {  goodsCd : row.goodsCd
-							, itemkindCd : row.itemkindCdNew
+			if ($(el).prop("type") == "text" || ($(el).prop("type") == "select-one" && el.name != "search" && el.name != "pageSize")) {
+				if (!(el.value == null || el.value == "")) {
+					cnt++;
 				}
-				dataArr.push(data);
 			}
-		});
-		if(dataArr.length==0){
-			mcxDialog.alert('변경된 데이터가 없습니다.');
+		}
+		
+		var mulYearSize = $('input:checkbox[name="multiStyleYear"]:checked').length;
+		var mulSeasonSize = $('input:checkbox[name="multiSeasonCd"]:checked').length;
+
+		if (mulYearSize > 0 || mulSeasonSize > 0){
+			cnt++;
+		}
+
+		if(cnt > 0) searchFlag = true;
+		
+		if(searchFlag == false){
+			mcxDialog.alert("검색조건을 입력하세요.");
+			return false;
+		}
+
+		return true;
+	}
+
+	//엑셀다운로드
+	var fnGoodsExcelDownLoad = function(flag){
+		var formId = '#searchForm';
+		if (gridOptions.api.getDisplayedRowCount() <= 0){
+			mcxDialog.alert("조회된 데이터가 없습니다.<br/>다시 조회 후 다운로드 받으세요.");
 			return;
 		}
-		mcxDialog.confirm('저장하시겠습니까?',{
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function(){
-				var jsonData = JSON.stringify(dataArr);
-				console.log(jsonData);
-				gagajf.ajaxJsonSubmit('/goods/itemKind/change/save', jsonData, fnSearch);
-			}
-		});
-	});
+
+		var params =  $(formId).serialize();
+		$('#GoodsExcelList').attr({ href : '/goods/info/excel/list?' + params }).get(0).click();
+	}
 	
 	// 업체변경시
 	$('#searchForm select[name=supplyCompCd]').on('change', function() {
@@ -324,6 +297,19 @@
 
 		cfnCreateCombo(actionUrl, $('#searchForm select[name=brandCd]'), "[전체]", "");
 	});
+	
+	// 네이버 최저가 조회 클릭시
+	$('#btnNaverPriceSearch').on('click', function() {
+		if (gagajf.isNull($("#searchForm textarea[name=condition]").val())) {
+			mcxDialog.alert("상품코드 입력 후 네이버최저가 조회를 해주세요.");
+			return;
+		}
+		
+		var formId = "#searchForm";
+ 		gagaAgGrid.fetch('/goods/naver/lowest/price/save', gridOptions, formId);
+		
+	});
+
 
 	$(document).ready(function() {
 

+ 274 - 100
style24.admin/src/main/webapp/WEB-INF/views/order/OrderDetailForm.html

@@ -27,10 +27,36 @@
 					<input type="hidden" name="orderEmail"/>
 					
 					<h4>기본정보</h4>
-					<div id="gridOrderInfo" style="width:100%; height:140px;" class="ag-theme-balham"></div>
-					
+					<div id="gridOrderInfo" style="width:100%; height:100px;" class="ag-theme-balham"></div>
+										
 					<h4>주문상품정보</h4>
+					<button type="button" style="margin-left:10px;" class="btn btnRight btn-base btn-sm" id="btnExchange">교환요청</button>
+					<button type="button" class="btn btnRight btn-base btn-sm" id="btnReturn">반품요청</button>
+					<button type="button" class="btn btnRight btn-base btn-sm" id="btnCancel">취소요청</button>
 					<div id="gridOrderGoodsInfo" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+					
+					<h4>배송정보</h4>
+					<button type="button" style="margin-left:10px;" class="btn btnRight btn-base btn-sm" id="btnUpdateOrderAddr">수정</button>
+					<div id="gridDeliveryAddrInfo" style="width:100%; height:100px;" class="ag-theme-balham"></div>
+					
+					<table style="width:100%;">
+						<colgroup>
+							<col style="width:65%;"/>
+							<col/>
+						</colgroup>
+						<tbody>
+							<tr>
+								<td style="">
+									<h4>결제정보</h4>
+									<div id="gridPaymentInfo" style="width:100%; height: 100px;" class="ag-theme-balham"></div>
+								</td>
+								<td style="">
+									<h4>배송비정보</h4>
+									<div id="gridDeliveryFeeInfo" style="width:100%; height: 100px;" class="ag-theme-balham"></div>
+								</td>
+							<tr>
+						</tbody>
+					</table>
 				</form>
 			</div>
 		</div>
@@ -42,10 +68,10 @@
 var ordNo 					= [[${ordNo}]];						// 주문번호
 var orderInfo 				= [[${orderInfo}]];					// 기본정보
 var orderGoodsInfo 			= [[${orderGoodsInfo}]];			// 주문상세정보
-var orderGoodsItemInfo 		= [[${orderGoodsItemInfo}]];		// 주문상세단품정보
+var orderDeliveryAddrInfo	= [[${orderDeliveryAddrInfo}]];		// 배송정보
+var orderPaymentInfo 		= [[${orderPaymentInfo}]];			// 결제정보
+var orderDeliveryFeeInfo 	= [[${orderDeliveryFeeInfo}]];		// 배송비정보
 
-//var orderPaymentInfo 		= [[${orderPaymentInfo}]];			// 결제정보
-//var orderDeliveryFeeInfo = [[${orderDeliveryFeeInfo}]];		// 배송비정보
 //var orderChangeInfo = [[${orderChangeInfo}]];				// 취소/반품/교환요청 정보
 //var orderRefundInfo = [[${orderRefundInfo}]];				// 환불정보
 //var orderCounselInfo = [[${orderCounselInfo}]];				// 상담내역
@@ -68,6 +94,41 @@ var orderGoodsItemInfo 		= [[${orderGoodsItemInfo}]];		// 주문상세단품정
 
 <!-- AgGrid 컬럼 세팅 -->
 <script>
+// 공통1. 주문상세 그리드 옵션 정보 적용
+var orderAgGrid = {
+	getGridOptions : function(colDefs) {
+		return {
+			columnDefs					: colDefs
+			, detailCellRendererParams	: {
+				detailGridOptions	: {
+					columnDefs				: []
+					, defaultColDef			: {
+						resizable: true
+					}
+					, suppressLoadingOverlay: false
+					, onGridReady			: function (params) {
+						params.api.setDomLayout('autoHeight');
+					}
+					, onFirstDataRendered	: function (params) {
+						params.api.sizeColumnsToFit();
+					}
+				}
+				, getDetailRowData: function (params) {
+					params.successCallback(params.data.orderDetailList);
+				}
+			}
+			, defaultColDef: {
+				resizable: true
+			}
+			, isRowMaster: function (dataItem) {
+				return dataItem ? dataItem.orderDetailList.length > 1 : false;
+			}
+			, suppressRowTransform: true
+			, enableRangeSelection: true
+		};
+	}
+}
+
 // 1.주문기본정보 그리드 바인딩
 var columnDefsOrderInfo = [
 	{
@@ -108,7 +169,7 @@ var columnDefsOrderInfo = [
 		, width				: 240
 		, cellClass			: 'text-center'
 		, cellRenderer		: function (params) {
-			return params.value ? params.value + '&nbsp&nbsp<button type="button" class="btn btn-success" onclick="fnOpenEmailForm(\'' + params.data.orderEmail + '\',\'' + params.data.orderNm + '\',\'' + params.data.custNo + '\');"> 메일발송 </button>' : '';
+			return params.value ? params.value + '&nbsp&nbsp<button type="button" class="btn btn-base btn-sm" onclick="fnOpenEmailForm(\'' + params.data.orderEmail + '\',\'' + params.data.orderNm + '\',\'' + params.data.custNo + '\');"> 메일발송 </button>' : '';
 		}
 	},
 	{
@@ -117,21 +178,21 @@ var columnDefsOrderInfo = [
 		, width				: 220
 		, cellClass			: 'text-center'
 		, cellRenderer		: function (params) {
-			return params.value + '&nbsp&nbsp<button type="button" class="btn btn-success" onclick="fnOpenLmsForm(\'' + params.data.orderPhnno + '\',\'' + params.data.custNo + '\');"> LMS발송 </button>';
+			return params.value + '&nbsp&nbsp<button type="button" class="btn btn-base btn-sm" onclick="fnOpenLmsForm(\'' + params.data.orderPhnno + '\',\'' + params.data.custNo + '\');"> LMS발송 </button>';
 		}
 	},
 	{headerName: "회원구분"	, field: "custGbNm"		, width: 80		, cellClass: 'text-center'},
 	{headerName: "관리대상"	, field: "managedRsnNm"	, width: 80		, cellClass: 'text-center'},
 	{headerName: "등급"		, field: "custGradeNm"	, width: 80		, cellClass: 'text-center'}
 ];
-var gridOptionsOrderInfo = gagaAgGrid.getGridOptions(columnDefsOrderInfo);
+var gridOptionsOrderInfo = orderAgGrid.getGridOptions(columnDefsOrderInfo);
 
 // 2.상품별 상세정보
 var columnDefsGoodsInfo = [
 	{
 		headerName	: "상품정보",
 		children	: [
-			{headerName: "상품코드"	, field: "goodsCd"		, width: 130, cellClass: 'text-center'},
+			{headerName: "상품코드"	, field: "goodsCd"		, width: 110, cellClass: 'text-center'},
 			{
 				headerName		: "상품명"
 				, field			: "goodsNm"
@@ -141,51 +202,25 @@ var columnDefsGoodsInfo = [
 					return '<a href="javascript:void(0);" onclick="cfnOpenFrontGoodsPopup(\'' + params.data.goodsCd + '\',\'' + params.data.siteCd + '\');">' + params.value + '</a>';
 				}
 			},
-			{headerName: "사이즈"		, field: "optCd2"		, width: 60, cellClass: 'text-center'},
-			{headerName: "칼라"		, field: "optCd1"		, width: 90, cellClass: 'text-center'},
-			{headerName: "단품코드"	, field: "itemCd"		, width: 90, cellClass: 'text-center'},
-			{headerName: "단품수량"	, field: "itemQty"		, width: 90, cellClass: 'text-center'},
+			{headerName: "상품타입"	, field: "goodsTypeNm"	, width: 100, cellClass: 'text-center'},
+			{headerName: "브랜드"		, field: "brandEnm"		, width: 100, cellClass: 'text-center'},
+			{headerName: "단품코드"	, field: "itemCd"		, width: 100, cellClass: 'text-center'},
 			{
-				headerName		: "단품금액"
-				, field			: "itemPrice"
-				, width			: 60
-				, cellClass		: 'text-right' //cartCpnDcAmtClass
-				, cellRenderer	: function (params) {
-					return params.value.addComma();
-				}
-			},
-			{
-				headerName		: "옵션추가금액"
-				, field			: "optAddPrice"
-				, width			: 100
-				, cellClass		: 'text-right' //cartCpnDcAmtClass
-				, cellRenderer	: function (params) {
-					return params.value.addComma();
-				}
-			},
-		]
-	},
-	{
-		headerName	: "단품정보",
-		children	: [
-			{headerName: "상품코드"	, field: "itemCd"		, width: 130, cellClass: 'text-center'},
-			{
-				headerName		: "상품명"
-				, field			: "goodsNm"
+				headerName		: "단품명"
+				, field			: "itemNm"
 				, width			: 180
 				, cellClass		: 'text-left'
 				, cellRenderer: function (params) {
-					return '<a href="javascript:void(0);" onclick="cfnOpenFrontGoodsPopup(\'' + params.data.goodsCd + '\',\'' + params.data.siteCd + '\');">' + params.value + '</a>';
+					return '<a href="javascript:void(0);" onclick="cfnOpenFrontGoodsPopup(\'' + params.data.itemCd + '\',\'' + params.data.siteCd + '\');">' + params.value + '</a>';
 				}
 			},
-			{headerName: "사이즈"		, field: "optCd2"		, width: 60, cellClass: 'text-center'},
-			{headerName: "칼라"		, field: "optCd1"		, width: 90, cellClass: 'text-center'},
-			{headerName: "단품코드"	, field: "itemCd"		, width: 90, cellClass: 'text-center'},
-			{headerName: "단품수량"	, field: "itemQty"		, width: 90, cellClass: 'text-center'},
+			{headerName: "칼라"		, field: "optCd1"		, width: 80, cellClass: 'text-center'},
+			{headerName: "사이즈"		, field: "optCd2"		, width: 80, cellClass: 'text-center'},
+			{headerName: "단품수량"	, field: "itemQty"		, width: 80, cellClass: 'text-center'},
 			{
 				headerName		: "단품금액"
 				, field			: "itemPrice"
-				, width			: 60
+				, width			: 100
 				, cellClass		: 'text-right' //cartCpnDcAmtClass
 				, cellRenderer	: function (params) {
 					return params.value.addComma();
@@ -202,16 +237,40 @@ var columnDefsGoodsInfo = [
 			},
 		]
 	},
+	{
+		headerName		: "주문상세상태"
+		, field			: "ordDtlStatNm"
+		, width			: 120
+		, cellClass		: 'text-left'
+		, cellRenderer	: function (params) {
+			var retVal = "";
+			retVal += (params.data.cancelRequestQty > 0) ? " 취" + params.data.cancelRequestQty : "";
+			retVal += (params.data.returnRequestQty > 0) ? " 반" + params.data.returnRequestQty : "";
+			retVal += (params.data.exchangeRequestQty > 0) ? " 교" + params.data.exchangeRequestQty : "";
+			
+			if (!gagajf.isNull(retVal)) retVal = "-" + retVal;
+				return "<a href=\"javascript:void(0);\" onclick=\"fnOrderDetailChangeHst('" + params.data.ordDtlNo + "');\">" + params.value + retVal + "</a>";
+		}
+	},
 	{
 		headerName	: "수량",
 		children	: [
-			{headerName: "주문"		, field: "ordQty"		, width: 60, cellClass: 'text-center'},
-			{headerName: "취소"		, field: "cnclRtnQty"	, width: 60, cellClass: 'text-center'}
+			{headerName: "주문"		, field: "itemOrdQty"		, width: 60, cellClass: 'text-center'},
+			{headerName: "취소"		, field: "itemCnclRtnQty"	, width: 60, cellClass: 'text-center'}
 		]
 	},
 	{
 		headerName	: "쿠폰",
 		children	: [
+			{
+				headerName		: "즉시할인"
+				, field			: "cpn1DcAmt"
+				, width			: 70
+				, cellClass		: 'text-right' //goodsCpnDcAmtClass
+				, cellRenderer: function (params) {
+					return "<a href=\"javascript:void(0);\" onclick=\"fnOrderCouponHst('" + params.data.ordNo + "');\">" + params.value.addComma() + "</a>";
+				}
+			},
 			{
 				headerName		: "상품"
 				, field			: "goodsCpnDcAmt"
@@ -232,6 +291,29 @@ var columnDefsGoodsInfo = [
 			}
 		]
 	},
+	{
+		headerName	: "다다익선",
+		children	: [
+			{
+				headerName		: "수량"
+				, field			: "tmtb1DcAmt"
+				, width			: 70
+				, cellClass		: 'text-right'
+				, cellRenderer: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "금액"
+				, field			: "tmtb2DcAmt"
+				, width			: 70
+				, cellClass		: 'text-right'
+				, cellRenderer: function (params) {
+					return params.value.addComma();
+				}
+			}
+		]
+	},
 	{
 		headerName	: "포인트",
 		children	: [
@@ -264,6 +346,15 @@ var columnDefsGoodsInfo = [
 			}
 		]
 	},
+	{
+		headerName		: "상품권"
+		, field			: "gfcdUseAmt"
+		, width			: 80
+		, cellClass		: 'text-right'
+		, cellRenderer	: function (params) {
+			return params.value.addComma();
+		}
+	},
 	{
 		headerName	: "금액(원/단위)",
 		children	: [
@@ -296,21 +387,6 @@ var columnDefsGoodsInfo = [
 			},
 		]
 	},
-	{
-		headerName		: "주문상세상태"
-		, field			: "ordDtlStatNm"
-		, width			: 150
-		, cellClass		: 'text-left'
-		, cellRenderer	: function (params) {
-			var retVal = "";
-			retVal += (params.data.cancelRequestQty > 0) ? " 취" + params.data.cancelRequestQty : "";
-			retVal += (params.data.returnRequestQty > 0) ? " 반" + params.data.returnRequestQty : "";
-			retVal += (params.data.exchangeRequestQty > 0) ? " 교" + params.data.exchangeRequestQty : "";
-			
-			if (!gagajf.isNull(retVal)) retVal = "-" + retVal;
-				return "<a href=\"javascript:void(0);\" onclick=\"fnOrderDetailChangeHst('" + params.data.ordDtlNo + "');\">" + params.value + retVal + "</a>";
-		}
-	},
 	{headerName: "결품", field: "soldoutYn", width: 60, cellClass: 'text-center'},
 	{
 		headerName	: "배송",
@@ -326,36 +402,129 @@ var columnDefsGoodsInfo = [
 					return retStr;
 				}
 			},
-			{headerName: "출고처", field: "delvLocNm", width: 120, cellClass: 'text-center'},
-			{
-				headerName		: "배송지번호"
-				, field			: "delvAddrSq"
-				, width			: 70
-				, cellClass		: 'text-center'
-				, cellRenderer	: function (params) {
-					return "<a href=\"javascript:void(0);\" onclick=\"fnBindDeliveryAddr('" + params.value + "');\">" + params.value + "</a>";
-				}
-			},
-			{headerName: "물류비고", field: "dstrbtNote", width: 180, cellClass: 'text-center'},
-			{
-				headerName: "구매확정철회"
-				, field: "ordDtlNo"
-				, width: 180
-				, cellClass: 'text-center'
-				, cellRenderer: function (params) {
-					var retVal = "";
-					
-					if ('70' === params.data.ordDtlStat) {
-						retVal = '<button type=\"button\" class=\"btn btn-danger\" onclick=\"fnChangedCompleteDelivery(\'' + params.data.ordNo + '\',\'' + params.data.ordDtlNo + '\',\'' + params.data.ordDtlStat + '\');\">구매확정철회</button>';
-					}
-					return retVal;
-				}
-			}
+			{headerName: "출고처", field: "delvLocNm", width: 120, cellClass: 'text-center'}
 		]
 	}
 ];
-var gridOptionsGoodsInfo = gagaAgGrid.getGridOptions(columnDefsGoodsInfo);
+var gridOptionsGoodsInfo = orderAgGrid.getGridOptions(columnDefsGoodsInfo);
+
+// 3.배송정보
+var columnDefsDeliveryInfo = [
+	{headerName: "배송지번호"		, field: "delvAddrSq"	, width: 100, cellClass: 'text-center'},
+	{headerName: "받는분"			, field: "recipNm"		, width: 80, cellClass: 'text-left', editable: true},
+	{headerName: "핸드폰번호"		, field: "recipPhnno"	, width: 120, cellClass: 'text-left', editable: true},
+	{headerName: "전화번호"		, field: "recipTelno"	, width: 120, cellClass: 'text-left', editable: true},
+	{
+		headerName		: "우편번호"		
+		, field			: "recipZipNo"
+		, width			: 200
+		, cellClass		: 'text-left'
+		, cellRenderer	: function (params) {
+			return params.value + "<button type=\"button\" style=\"margin-left:10px\" class=\"btn btn-info\" onclick=\"cfnOpenPostFindPopup('grid');\">우편번호찾기</button>";
+		}
+	},
+	{headerName: "주소(기본)"		, field: "recipBaseAddr"	, width: 350, cellClass: 'text-left'},
+	{headerName: "주소(상세)"		, field: "recipDtlAddr"		, width: 200, cellClass: 'text-left', editable: true},
+	{headerName: "배송메모"		, field: "delvMemo"			, width: 280, cellClass: 'text-left', editable: true}
+];
+var gridOptionsDeliveryInfo = orderAgGrid.getGridOptions(columnDefsDeliveryInfo);
 
+// 4.결제정보
+var columnDefsPaymentInfo = [
+	{headerName: "에스크로여부"		, field: "escrowYn"		, width: 80		, cellClass: 'text-center'},
+	{headerName: "결제수단"		, field: "payMeansNm"	, width: 100	, cellClass: 'text-center'},
+	{
+		headerName		: "카드(은행)"
+		, field			: "cardNm"
+		, width			: 100
+		, cellClass		: 'text-center'
+		, cellRenderer	: function (params) {
+			if (params.data.payMeans == '20') {
+				return params.data.vaNm;
+			} else if (params.data.payMeans == '10' || params.data.payMeans == '30') {
+				return params.data.cardNm;
+			}
+		}
+	},
+	{
+		headerName		: "할부(입금계좌)"
+		, field			: "cardMips"
+		, width			: 120
+		, cellClass		: 'text-center'
+		, cellRenderer	: function (params) {
+			if (params.data.payMeans == '20') {
+				return params.data.vaNo;
+			} else if (params.data.payMeans == '10') {
+				return params.value;
+			}
+		}
+	},
+	{
+		headerName		: "승인번호"
+		, field			: "pgTradeNo"
+		, width			: 80
+		, cellClass		: 'text-center'
+		, cellRenderer	: function (params) {
+			var retStr = '';
+
+			if (!gagajf.isNull(params.value)) {
+				retStr = '<a href="javascript:void(0);" onclick="fnReceiptPage(\'' + params.data.pgTid + '\');">' + params.value + '</a>';
+			}
+
+			if (gagajf.isNull(params.value) && !gagajf.isNull(params.data.pgTid)) {
+				retStr = '<a href="javascript:void(0);" onclick="fnReceiptPage(\'' + params.data.pgTid + '\');">' + '거래내역' + '</a>';
+			}
+
+			return retStr;
+		}
+	},
+	{
+		headerName			: "결제일시"	
+		, field				: "payDt"
+		, width				: 130
+		, cellClass			: 'text-center' 
+		, cellRenderer: function(params) {
+			return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmm").format("YYYY-MM-DD HH:mm") : '';
+		}
+	},
+	{headerName: "결제상태"	, field: "payStatNm"	, width: 80		, cellClass: 'text-center'},
+	{
+		headerName			: "결제금액"
+		, field				: "payAmt"
+		, width				: 80
+		, cellClass			: 'text-right'
+		, valueFormatter	: function (params) {
+			return params.value.addComma();
+		}
+	},
+	{headerName: "계좌만료일"	, field: "vaDeadline"	, width: 150	, cellClass: 'text-center'}
+];
+var gridOptionsPaymentInfo = orderAgGrid.getGridOptions(columnDefsPaymentInfo);
+
+// 5.배송비
+var columnDefsDeliveryFeeInfo = [
+	{headerName: "배송비종류"		, field: "delvFeeGbNm", width: 120, cellClass: 'text-center'},
+	{
+		headerName			: "배송비"
+		, field				: "delvFee"
+		, width				: 100
+		, cellClass			: 'text-right'
+		, valueFormatter	: function (params) {
+			return params.value.addComma();
+		}
+	},
+	{headerName: "배송비정산여부"	, field: "delvUsacYn", width: 120, cellClass: 'text-center'},
+	{
+		headerName			: "배송비정산일시"	
+		, field				: "delvUsacDt"
+		, width				: 180
+		, cellClass			: 'text-center' 
+		, cellRenderer: function(params) {
+			return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmm").format("YYYY-MM-DD HH:mm") : '';
+		}
+	}
+];
+var gridOptionsDeliveryFeeInfo = orderAgGrid.getGridOptions(columnDefsDeliveryFeeInfo);
 </script>
 
 <script>
@@ -370,7 +539,6 @@ var fnSetGridHeightInit = function () {
 	
 	//$('#gridOrderInfo').css('height', _girdRowH1 + _girdRowH);					//기본정보
 	//$('#gridDeliveryInfo').css('height', _girdRowH1 + _girdRowH);					//배송정보
-	
 	//if (orderGoodsInfo != null && orderGoodsInfo.length > 0) $('#gridOrderGoodsInfo').css('height', _girdRowH2 + _girdRowH * orderGoodsInfo.length);
 	//if (orderPaymentInfo != null && orderPaymentInfo.length > 0) $('#gridPaymentInfo').css('height', _girdRowH1 + _girdRowH * orderPaymentInfo.length);
 	//if (orderDeliveryFeeInfo != null && orderDeliveryFeeInfo.length > 0) $('#gridDeliveryFeeInfo').css('height', _girdRowH1 + _girdRowH * orderDeliveryFeeInfo.length);
@@ -384,11 +552,11 @@ var fnSetGridHeightInit = function () {
 
 <!-- 버튼 이벤트 바인딩 -->
 <script>
-var _windowWidth = $(window).width();		/* 위도우창 넓이 */
-var _girdRowH = 33;							/* 그리드 Row 줄 높이 */
-var _girdRowH1 = 33;						/* 그리드 타이틀 1줄 짜리 높이*/
-var _girdRowH2 = 62;						/* 그리드 타이틀 2줄 짜리 높이*/
-var _scrollH = 27;							/* 가로스크롤bar 높이 */
+var _windowWidth 	= $(window).width();		/* 위도우창 넓이 */
+var _girdRowH 		= 33;						/* 그리드 Row 줄 높이 */
+var _girdRowH1 		= 33;						/* 그리드 타이틀 1줄 짜리 높이*/
+var _girdRowH2 		= 62;						/* 그리드 타이틀 2줄 짜리 높이*/
+var _scrollH 		= 27;						/* 가로스크롤bar 높이 */
 
 $(window).resize(function () {
 	_windowWidth = $(window).width();
@@ -404,14 +572,20 @@ var fnOrderDetailClose = function(){
 }
 
 $(document).ready(function () {
-	gagaAgGrid.createGrid('gridOrderInfo'			, gridOptionsOrderInfo);
-	gagaAgGrid.createGrid('gridOrderGoodsInfo'		, gridOptionsGoodsInfo);
+	// 그리드 그리기
+	gagaAgGrid.createGrid('gridOrderInfo'			, gridOptionsOrderInfo);		// 기본정보
+	gagaAgGrid.createGrid('gridOrderGoodsInfo'		, gridOptionsGoodsInfo);		// 상품정보
+	gagaAgGrid.createGrid('gridDeliveryAddrInfo'	, gridOptionsDeliveryInfo);		// 배송정보
+	gagaAgGrid.createGrid('gridPaymentInfo'			, gridOptionsPaymentInfo);		// 결제정보
+	gagaAgGrid.createGrid('gridDeliveryFeeInfo'		, gridOptionsDeliveryFeeInfo);	// 배송비정보
 	
 	// 그리드 데이터 바인딩
-	gridOptionsOrderInfo.api.setRowData(orderInfo);							// 기본정보
-	gridOptionsGoodsInfo.api.setRowData(orderGoodsInfo);					// 상품정보
-	//gridOptionsPaymentInfo.api.setRowData(orderPaymentInfo);				// 결제정보
-	//gridOptionsDeliveryFeeInfo.api.setRowData(orderDeliveryFeeInfo);		// 배송비정보
+	gridOptionsOrderInfo.api.setRowData(orderInfo);									// 기본정보
+	gridOptionsGoodsInfo.api.setRowData(orderGoodsInfo);							// 상품정보
+	gridOptionsDeliveryInfo.api.setRowData(orderDeliveryAddrInfo);					// 배송정보
+	gridOptionsPaymentInfo.api.setRowData(orderPaymentInfo);						// 결제정보
+	gridOptionsDeliveryFeeInfo.api.setRowData(orderDeliveryFeeInfo);				// 배송비정보
+	
 	//gridOptionsOrderChangeInfo.api.setRowData(orderChangeInfo);				// 취소/반품/교환요청 정보
 	//gridOptionsRefundInfo.api.setRowData(orderRefundInfo);					// 환불정보
 	//gridOptionsOrderCounselInfo.api.setRowData(orderCounselInfo);			// 상담내역

+ 102 - 57
style24.admin/src/main/webapp/WEB-INF/views/order/OrderListForm.html

@@ -13,6 +13,15 @@
  * 1.0  2020.11.16   jsh77b       최초 작성
  *******************************************************************************
  -->
+ <style>
+ .ag-neo .ag-cell.top-row-span {
+     border-bottom: 0px;
+}
+.ag-neo .ag-cell.bottom-row-span {
+     border-top: 0px;
+     text-indent: -100em;
+}
+ </style>
  
 <div id="main">
 	<!-- 메인타이틀 영역 -->
@@ -26,7 +35,6 @@
 	
 	<form id="searchForm" name="searchForm" action="#" th:action="@{'/order/list'}">
 		<input type="hidden" id="searchGb" name="searchGb" />
-		<input type="hidden" id="imageViewYn" name="imageViewYn" />
 		
 		<!-- 패널 영역1 -->
 		<div class="panelStyle" >
@@ -82,10 +90,9 @@
 						</td>
 					</tr>
 					<tr>
-						<!-- 
 						<th>주문상태</th>
 						<td>
-							<div class="multiCheckBox" style="width:200px">
+							<div class="multiCheckBox" style="width:270px">
 								<button type="button" class="sltBtn" style="overflow-x: hidden; padding-right:5px;">[전체]</button>
 								<ul style="display: none; box-shadow: 3px 3px 3px; overflow-y: scroll; height: 112px;">
 									<li th:if="${ordStatList}" th:each="oneData, status : ${ordStatList}">
@@ -96,9 +103,8 @@
 								</ul>
 							</div>
 						</td>
-						 -->
 						<th>주문상세상태</th>
-						<td colspan="5">
+						<td colspan="3">
 							<div class="multiCheckBox" style="width:270px">
 								<button type="button" class="sltBtn" style="overflow-x: hidden; padding-right:5px;">[전체]</button>
 								<ul style="display: none; box-shadow: 3px 3px 3px; overflow-y: scroll; height: 112px;">
@@ -115,12 +121,13 @@
 							<select name="search" id="search">
 								<option value="searchOrdNo">주문번호</option>
 								<option value="searchExtmallOrderId">외부몰주문번호</option>
+								<option value="searchAgentOrderId">에이전트주문번호</option>
 							</select>
 							<textarea class="textareaR3 w70p" name="condition" id="condition"></textarea>
 						</td>
 					</tr>
 					<tr>
-						<th>@변경구분</th>
+						<th>변경구분</th>
 						<td>
 							<select name="chgGb">
 								<option value="">[전체]</option>
@@ -211,7 +218,7 @@
 				<ul class="panelBar">
 					<li class="center">
 						<button type="button" class="btn btn-info btn-lg" id="btnOrderSearch">조회</button>
-						<button type="button" class="btn btn-base btn-lg" id="btnSearchExcel">엑셀조회</button>
+						<!-- <button type="button" class="btn btn-base btn-lg" id="btnSearchExcel">엑셀조회</button> -->
 						<button type="button" class="btn btn-gray btn-lg" id="btnInit">초기화</button>
 					</li>
 				</ul>
@@ -223,23 +230,29 @@
 			<ul class="panelBar">
 				<li>
 					<button type="button" class="btn btn-info btn-lg" onclick="fnOrderExcelList();">엑셀다운로드</button>
-					<span style="margin-left:10px;">
-						주문금액 : <strong><span id="sumOrdAmt">0</span></strong>&nbsp;
-						판매금액 : <strong><span id="sumOrdCnclAmt">0</span></strong>&nbsp;
-						실결제금액 : <strong><span id="sumRealPayAmt">0</span></strong>&nbsp;
-						주문건수  : <strong><span id="ordNoCnt">0</span></strong>&nbsp;
-						주문수량  : <strong><span id="sumOrdQty">0</span></strong>&nbsp;
-						판매수량  : <strong><span id="sumOrdCnclQty">0</span></strong>&nbsp;
-					</span>
 				</li>
 				<li class="aR">
 					검색결과 : <strong><span id="rowCntOrderList">0</span> 건</strong>&nbsp;
+					쪽번호 <span id="pgNo">0</span>/ <strong id="endPgNo">0</strong>&nbsp;&nbsp;
+					<select id="pageSize" name="pageSize">
+						<option value="100" selected="selected">100개씩 보기</option>
+						<option value="500">500개씩 보기</option>
+						<option value="1000">1000개씩 보기</option>
+						<option value="5000">5000개씩 보기</option>
+					</select>
+					<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
 				</li>
 			</ul>
 			
 			<div class="panelContent" style="overflow: hidden;">
 				<div id="gridOrderList" style="width: 100%; height: 700px;" class="ag-theme-balham lh60"></div>
 			</div>
+			
+			<ul class="panelBar">
+				<li class="center">
+					<div class="tablePaging" id="orderListPagination"></div>
+				</li>
+			</ul>
 		</div>
 
 	</form>
@@ -248,8 +261,9 @@
 <label class="off">
 	<a href="javascript:void(0);" id="hdOrderExcelList" style="display: none;">엑셀다운로드</a>
 </label>
-	
+
 <script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=2019072202"></script>
+
 <script th:inline="javascript">
 /*<![CDATA[*/
 var sessRoleCd 		= [[${sessionInfo.roleCd}]];
@@ -257,14 +271,13 @@ var siteCdList 		= gagajf.convertToArray([[${siteCdList}]]);
 var mallGbList 		= gagajf.convertToArray([[${mallGbList}]]);
 var ordDtlStatList 	= gagajf.convertToArray([[${ordDtlStatList}]]);
 var payMeansList 	= gagajf.convertToArray([[${payMeansList}]]);
-//var vendorList 		= gagajf.convertToArray([[${vendorList}]]);
-//var goodsTypeList 	= gagajf.convertToArray([[${goodsTypeList}]]);
 var chgStatList 	= gagajf.convertToArray([[${chgStatList}]]);
 var chgGbList 		= gagajf.convertToArray([[${chgGbList}]]);
 var formalGbList 	= gagajf.convertToArray([[${formalGbList}]]);
 var frontGbList 	= {'P': 'PC', 'M': 'MO'};
 var uploadGoodsUrl 	= [[${@environment.getProperty('upload.goods.view')}]];
 
+// 1. 주문기본정보
 var columnDefsOrderList = [
 	{
 		headerName	: "주문기본정보"
@@ -309,7 +322,7 @@ var columnDefsOrderList = [
 			{headerName: "외부몰"		, field: "extmallNm"	, width: 100, cellClass: 'text-center', sortable: true},
 			{headerName: "휴대폰번호"	, field: "orderPhnno"	, width: 120, cellClass: 'text-center', hide: true},
 			{
-				headerName		: "사이트"
+				headerName		: "사이트"
 				, field			: "siteCd"
 				, width			: 80
 				, cellClass		: 'text-center'
@@ -396,6 +409,28 @@ var columnDefsOrderList = [
 	{
 		headerName	: "주문상품정보"
 		, cellClass	: 'text-center'
+		, children	: [
+			{headerName: "상품코드"	, field: "goodsCd"		, width: 100	, cellClass: 'text-center'	, sortable: true},
+			{
+				headerName		: "상품명"
+				, field			: 'goodsNm'
+				, width			: 75
+				, cellClass		: 'text-center'
+				, sortable		: true
+				, cellRenderer	: function (params) {
+					var roleCd = [[${sessionInfo.roleCd}]];
+					if (!roleCd.startsWith("C")) {
+						return "<a href=\"javascript:void(0);\" onclick=\"fnOpenOrderDetailPopup('" + params.value + "');\">" + params.value + "</a>";
+					} else {
+						return params.value;
+					}
+				}
+			}
+		]
+	},
+	{
+		headerName	: "주문상품단품정보"
+		, cellClass	: 'text-center'
 		, children	: [
 			{
 				headerName		: "이미지"
@@ -421,8 +456,8 @@ var columnDefsOrderList = [
 			},
 			{headerName: "브랜드"		, field: "brandEnm"		, width: 130, cellClass: 'text-center', sortable: true},
 			{
-				headerName		: "품코드"
-				, field			: "goodsCd"
+				headerName		: "품코드"
+				, field			: "itemCd"
 				, width			: 130
 				, cellClass		: 'text-center'
 				, sortable		: true
@@ -437,7 +472,7 @@ var columnDefsOrderList = [
 			},
 			{headerName: "색상"		, field: "optCd1"		, width: 100	, cellClass: 'text-center'	, sortable: true},
 			{headerName: "사이즈"		, field: "optCd2"		, width: 60		, cellClass: 'text-center'	, sortable: true},
-			{headerName: "단품명"		, field: "goodsNm"		, width: 200	, cellClass: 'text-left'	, sortable: true},
+			{headerName: "단품명"		, field: "itemNm"		, width: 200	, cellClass: 'text-left'	, sortable: true},
 			{headerName: "구성유형"	, field: "goodsTypeNm"	, width: 200	, cellClass: 'text-left'	, sortable: true},
 			{
 				headerName		: "외부몰벤더"
@@ -505,7 +540,6 @@ var columnDefsOrderList = [
 					return params.data.realOrdAmt.addComma(); 
 				}
 			},
-			{headerName: "단품코드"	, field: "itemCd"			, width: 130, cellClass: 'text-center', sortable: true},
 			{headerName: "원코드"		, field: "supplyGoodsCd"	, width: 130, cellClass: 'text-center', sortable: true},
 			{
 				headerName		: "정상/이월"
@@ -640,19 +674,26 @@ var gridOptionsOrderList = {
 };
 
 // 상품이미지 노출을 위해 높이 조정
-gridOptionsOrderList.rowHeight = 60;
-gridOptionsOrderList.rowSelection = 'multiple';
-gridOptionsOrderList.suppressRowClickSelection = true;
+gridOptionsOrderList.rowHeight 					= 60;
+gridOptionsOrderList.rowSelection 				= 'multiple';
+gridOptionsOrderList.suppressRowClickSelection 	= true;
 gridOptionsOrderList.getRowStyle = function (params) {
 	if (params.data.ordExchGb === 'E') {
 		return {background: 'orange'}
 	}
 }
 
+//Rowspan
+gridOptionsOrderList.defaultColDef.resizable = true;
+gridOptionsOrderList.suppressRowTransform = true;
+
 function onFirstDataRendered(params) {
 	
 }
 
+// 최근상세보기한 주문번호
+var currOrdNo = '';
+
 // 조회
 $('#btnOrderSearch').on('click', function () {
 	fnSearchList();
@@ -675,24 +716,36 @@ var fnSearchList = function () {
 		}
 	}
 	
-	gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptionsOrderList, '#searchForm', function () {
-		$("#rowCntOrderList").text(gridOptionsOrderList.api.getDisplayedRowCount());
-		
+	gagaPaging.init('searchForm', fnSearchCallBack, 'orderListPagination', $('#searchForm').find('#pageSize').val());
+	gagaPaging.load($("#searchForm input[name=pageNo]").val());
+	
+	// 2020.12.08 페이징 처리 때문에 주석 처리
+	//gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptionsOrderList, '#searchForm', function (result) {
+		//$("#rowCntOrderList").text(gridOptionsOrderList.api.getDisplayedRowCount());
 		// 주문리스트 합계 정보
-		gagajf.ajaxFormSubmit('/order/list/sum/info', '#searchForm', fnOrderListSumInfoCallback);
-	});
+		//gagajf.ajaxFormSubmit('/order/list/sum/info', '#searchForm', fnOrderListSumInfoCallback);
+	//});
 };
 
+var fnSearchCallBack = function(result){
+	$('#searchForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
+	$('#searchForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
+	$('#searchForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
+	$('#searchForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
+	
+	gridOptionsOrderList.api.setRowData(result.orderList);
+	gagaPaging.createPagination(result.pageing.pageable);
+}
+
 // 주문리스트 합계 정보
 var fnOrderListSumInfoCallback = function(result) {
 	if (!gagajf.isNull(result)) {
-		var sumOrdAmt = 0
-		  , sumOrdCnclAmt = 0
-		  , sumRealPayAmt = 0
-		  , ordNoCnt = 0
-		  , sumOrdQty = 0
-		  , sumOrdCnclQty = 0
-		 ;
+		var sumOrdAmt 		= 0;
+		var sumOrdCnclAmt 	= 0;
+		var sumRealPayAmt 	= 0;
+		var ordNoCnt 		= 0;
+		var sumOrdQty 		= 0;
+		var sumOrdCnclQty 	= 0;
 
 		if (!gagajf.isNull(result.sumOrdAmt)) {
 			sumOrdAmt = result.sumOrdAmt.addComma();
@@ -721,26 +774,12 @@ var fnOrderListSumInfoCallback = function(result) {
 		$('#sumOrdCnclQty').text(sumOrdCnclQty);
 	}
 };
-	
-// 엑셀조회
-$("#btnSearchExcel").on('click', function () {
-	cfnExcelUploadPopup('', 'fnExcelUpoadCallback');
-});
-
-var currOrdNo = '';		//최근상세보기한 주문번호
-var fnExcelUpoadCallback = function (data) {
-	$("#excelFileNm").val(data.excelFileNm);
-	gagaAgGrid.fetch('/order/excel/search', gridOptionsOrderList, '#searchForm', function () {
-		$("#rowCntOrderList").text(gridOptionsOrderList.api.getDisplayedRowCount());
-	});
-};
 
 // 엑셀조회
 $("#btnSearchExcel").on('click', function () {
 	cfnExcelUploadPopup('', 'fnExcelUpoadCallback');
 });
 
-var currOrdNo = '';		// 최근상세보기한 주문번호
 var fnExcelUpoadCallback = function (data) {
 	$("#excelFileNm").val(data.excelFileNm);
 	gagaAgGrid.fetch('/order/excel/search', gridOptionsOrderList, '#searchForm', function () {
@@ -755,12 +794,12 @@ $('#btnInit').on('click', function() {
 });
 
 // 엑셀 다운로드
+// 2020.12.11 현재는 그리드의 조회 목록을 엑셀 다운로드 하고 있지만 추후 에는 조건의 엑셀 조회 후 다운로드 기능으로 변경 해야 할듯함
+// 기존의 주문목록은 페이징 기능이 없었지만 페이징 기능을 추가 하면서 엑셀다운로드시 조회 후 파일다운 기능 필요  
 var fnOrderExcelList = function () {
-	gagaAgGrid.showOrHideColumn(gridOptionsOrderList, "custNo", true);
-	
-	// 엑셀다운로드
-	gagaAgGrid.exportToExcel('주문목록', gridOptionsOrderList);
-	gagaAgGrid.showOrHideColumn(gridOptionsOrderList, "custNo", false);
+	gagaAgGrid.showOrHideColumn(gridOptionsOrderList	, "custNo", true);
+	gagaAgGrid.exportToExcel('주문목록'					, gridOptionsOrderList);
+	gagaAgGrid.showOrHideColumn(gridOptionsOrderList	, "custNo", false);
 };
 
 var fnOpenOrderDetailPopup = function (ordNo) {
@@ -799,6 +838,12 @@ $('#searchForm select[name=supplyCompCd]').on('change', function() {
 	cfnCreateMultiCombo(actionUrl,"multiBrand",  "[전체]",null, 'Y');
 });
 
+//페이징
+$('#searchForm select[name=pageSize]').on('change', function() {
+	$("#searchForm input[name=pageNo]").val('1');
+	fnGoodsListSearch($("#searchForm input[name=searchGb]").val());
+});
+
 // 초기설정
 $(document).ready(function() {
 	// 달력기능 활성화

+ 88 - 73
style24.admin/src/main/webapp/ux/css/admin.ui.css

@@ -1,5 +1,5 @@
 @import url("https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700"); @import url("https://fonts.googleapis.com/css?family=Roboto:400,300,500,700"); html,body {position:relative; height:100%;}
-html, body, header, div, ul, ol, li, dl, dt, dd, h1, h2, h3, h4, h5, h6, label, a, p, form, input, textarea, table, hr, span, em {margin:0; padding:0; box-sizing: border-box;}
+html, body, header, div, ul, ol, li, dl, dt, dd, h1, h2, h3, h4, h5, h6, label, a, p, form, input, textarea, table, hr, span, em {margin:0; padding:0; box-sizing:border-box;}
 /* { } */
 body {overflow-x:hidden; font-family:"open sans", "Roboto", "Malgun Gothic", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size:12px; background-color:#f3f3f4;}
 h1, h2, h3, h4, h5, h6 {display:inline-block;}
@@ -13,7 +13,7 @@ th {text-align:inherit;}
 label {position:relative; margin-right:20px; display:inline-block; -webkit-touch-callout:none; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none;}
 label:last-child {margin-right:0 !important;}
 input,button,select,textarea {font-family:inherit; font-size:inherit;}
-input.btn-sm {padding: 1px 6px;}
+input.btn-sm {padding:1px 6px;}
 input[type=text] {width:100%;}
 input[type=text], input[type=file], input[type=date], [type=password], textarea {padding:4px 3px 4px 5px; color:inherit; border-radius:1px; vertical-align:middle; margin:1px 3px 2px 0;}
 input[type=date],input[type=time],input[type=datetime-local],input[type=month] {-webkit-appearance:listbox;}
@@ -38,7 +38,7 @@ html,body,#wrapper,#container {min-height:100%; height:100%;}
 #wrapper {position:relative; min-width:1240px;}
 
 /* 로그인 --------------- */
-.loginBg {background:#f3f3f4; overflow:hidden;}
+.loginBg {background:#f3f3f4;}
 .loginWrap {width:500px; box-shadow:0 7px 7px -5px rgba(0, 0, 0, 0.1);}
 .loginWrap .loginBox input[type=text],
 .loginWrap .loginBox input[type=password]{padding:10px; width:100%; border:1px solid #ced4da; border-radius:.25rem;}
@@ -56,7 +56,7 @@ html,body,#wrapper,#container {min-height:100%; height:100%;}
 .loginWrap .loginInfo p:first-child{margin-bottom:15px;}
 .loginWrap .loginInfo p span {display:inline-block; margin-bottom:15px; line-height:40px; font-size:16px; font-weight:bold; border-bottom:1px solid #000;}
 
-/* 로그인 style : black */
+/* 로그인 style :black */
 .login_black {position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); -ms-transform:translate(-50%, -50%); background:#fff;}
 .login_black .logo { padding:25px 0; text-align:center; background:#000;}
 .login_black .loginInfo em {color:#555; font-weight:bold;}
@@ -64,9 +64,24 @@ html,body,#wrapper,#container {min-height:100%; height:100%;}
 .login_black .loginBox li:nth-of-type(5) {border-top:1px solid #e4e4e4; border-bottom:1px solid #e4e4e4;}
 .login_black .loginBox a {color:#555}
 
-/* 로그인 : alert */
+/* 보안 인증 */
+.loginWrap .certiFrm {padding:40px 60px 70px;}
+.loginWrap .certiFrm h2{margin:10px 0 30px;}
+.loginWrap .certiFrm h2 i{margin-right:10px;}
+.loginWrap .certiFrm .alertBox{margin-bottom:15px}
+.loginWrap .certiFrm .input{height:45px; position:relative;}
+.loginWrap .certiFrm .input input[type=text]{position:relative; padding:10px; width:45px; height:45px; line-height:45px; font-size:16px; border:1px solid #ced4da; border-radius:.25rem; text-align:center;}
+.loginWrap .certiFrm .input input[type=text]:focus{color:#4D90FE;font-weight:bold;}
+.loginWrap .certiFrm .input .countdown{display:inline-block; position:relative; padding-left:20px; line-height:45px; height:45px;color:red; text-align:center;vertical-align:top; font-size:14px}
+.loginWrap .certiFrm .info{margin-top:20px; line-height:22px; color:#555;}
+.loginWrap .certiFrm .button{margin:25px 0 50px;}
+.loginWrap .certiFrm .button button{margin:0 5px !important; padding:5px 20px; height:32px; float:right}
+.loginWrap .certiFrm .button button:focus{outline:2px auto #4D90FE !important; }
+.loginWrap .certiFrm .button .btn-black{width:100px !important;}
+
+/* 로그인 :alert */
 .alertBox {position:relative; padding:10px 40px 10px 10px; margin-bottom:10px; border:1px solid; border-radius:.25rem; line-height:22px;}
-.alertBox .alertClose {position:absolute; top:0; right:0; padding:0 10px; height:40px; text-indent:-9999px; background:url('/image/btn_sltClose.png') no-repeat 50% 50%;}
+.alertBox .alertClose {position:absolute; top:0; right:5px; padding:0 10px; height:40px; text-indent:-9999px; background:url('/image/btn_sltClose.png') no-repeat 50% 50%;}
 .alertBox .alertClose:hover {background:url('/image/btn_sltCloseOn.png') no-repeat 50% 50%;}
 .alert-success {color:#155724; background-color:#d4edda; border-color:#c3e6cb;}
 .alert-info {color:#0c5460; background-color:#d1ecf1; border-color:#bee5eb;}
@@ -101,10 +116,10 @@ header a, header button {color:#fff;}
 .tooltip:hover .tooltiptext {visibility:visible;}
 
 /* LNB--------------- */
-#lnb-wrapper {position:fixed; top:60px; left:-260px; width:260px; height:100%; vertical-align:top; overflow-y:auto; transition:left .3s; -webkit-transition:left .3s;}
-#lnb-wrapper:after{content:''; position:absolute; top:0; left:0; z-index:-1; width:100%; height:100%; background-color:#2f4050;}
+#lnb-wrapper {position:fixed; top:60px; left:-260px; width:260px; height:100%; vertical-align:top; overflow-y:auto; transition:left .3s; -webkit-transition:left .3s; background-color:#2f4050;}
+#lnb-wrapper:after{content:''; position:absolute; top:0; left:0; z-index:-1; width:100%; height:100%;}
 #lnb-wrapper.on {left:0;}
-#lnb {margin-bottom:60px; width:260px;}
+#lnb {margin-bottom:100px; width:260px;}
 #lnb a {display:block; color:#a7b1c2;}
 #lnb a:hover {color:#fff;}
 #lnb a.on {color:#fff;}
@@ -182,7 +197,7 @@ header a, header button {color:#fff;}
 /* Add TABS 영역 --------------- */
 .btn-add-tab {position:absolute; top:5px; right:0; z-index:2; padding:0 10px;}
 .tabsNav .ui-tabs-active a {background-color:#fff; color:#222; border:1px solid #ccc; border-bottom:2px solid #fff;}
-.tab-del {position:absolute; top:1px; right:1px; padding:4px 6px; color:gray; cursor:pointer; border-top-right-radius: .25rem;}
+.tab-del {position:absolute; top:1px; right:1px; padding:4px 6px; color:gray; cursor:pointer; border-top-right-radius:.25rem;}
 .tab-del:hover {color:#f40552;}
 a, button, .ui-state-active, .ui-state-focus, .ui-state-hover {outline:0 !important;}
 .tabsNav .ui-corner-top a {padding:0 35px 0 20px}
@@ -260,10 +275,10 @@ input[type=radio]:checked::after {position:absolute; top:5px; left:5px; content:
 input[type=radio].formControl::before {background:#eee;}
 
 /* 토글 스위치--------------- */
-.switchBox{ display:inline-block;position: relative; width:60px; height:28px; vertical-align: middle;border-radius:25px;overflow: hidden;}
+.switchBox{ display:inline-block;position:relative; width:60px; height:28px; vertical-align:middle;border-radius:25px;overflow:hidden;}
 .switchBox input[type="checkbox"]{position:absolute;visibility:hidden;}
 .switchBox label{display:block;position:absolute;top:0;width:60px;height:28px;background-color:#aaa;transition-duration:0.2s;}
-.switchBox label span{position:absolute;left:0;top:50%;z-index:1;width:26px;height:23px;border-radius:25px;transform: translate(3px, -50%);transition-duration:0.2s;background-color:#fff;text-indent:-9999px;}
+.switchBox label span{position:absolute;left:0;top:50%;z-index:1;width:26px;height:23px;border-radius:25px;transform:translate(3px, -50%);transition-duration:0.2s;background-color:#fff;text-indent:-9999px;}
 .switchBox label:before,label:after{position:absolute;top:0;width:52%;font-size:11px;line-height:27px;color:#fff;text-align:center;}
 .switchBox label:before{left:0;content:'ON';}
 .switchBox label:after{right:0;content:'OFF';}
@@ -276,7 +291,7 @@ input[type=radio].formControl::before {background:#eee;}
 .switch-warning input:checked + label{color:#fff; background-color:#f8ac59;}
 .switch-danger input:checked + label{color:#fff; background-color:#ed5565;}
 .switch-black input:checked + label{color:#fff; background-color:#222;}
-.switchBox + .switchBox {margin-left: 6px;}
+.switchBox + .switchBox {margin-left:6px;}
 
 /* 테이블 스타일--------------- */
 .tableStyle {width:100%; max-width:100%; margin-bottom:15px;}
@@ -333,7 +348,7 @@ td[rowspan] {border-bottom:1px solid #eee;}
 .subTable dl:last-child dd {border-bottom:none;}
 
 /* button --------------- */
-.btn {border-radius:3px; vertical-align:middle; white-space:nowrap;font-size:12px;user-select: none;}
+.btn {border-radius:3px; vertical-align:middle; white-space:nowrap;font-size:12px;user-select:none;}
 .btn-lg {padding:4px 20px 5px; height:28px; overflow-y:hidden;}
 .btn-sm {margin-top:-2px; line-height:100%; height:28px; overflow-y:hidden;}
 .btn-ssm {margin-top:-2px; line-height:100%; height:22px; overflow-y:hidden;}
@@ -356,7 +371,7 @@ td[rowspan] {border-bottom:1px solid #eee;}
 .btn.icn i {padding-top:6px; width:12px; vertical-align:top; font-size:14px; text-align:center;}
 
 /* 페이징 --------------- */
-.tablePaging {position:relative; 	display:inline-block; vertical-align: middle;}
+.tablePaging {position:relative; 	display:inline-block; vertical-align:middle;}
 .tablePaging a {display:inline-block; float:left; margin:0 5px; width:28px; height:28px; line-height:28px; text-align:center; border:1px solid #ccc; border-radius:50px; cursor:pointer;}
 .tablePaging a.arrow {background-color:rgba(0, 0, 0, 0.03); 	border-color:#ebebeb;}
 .tablePaging .num.on {background:#8597eb; color:#fff; border-color:#8597eb;}
@@ -384,7 +399,7 @@ td[rowspan] {border-bottom:1px solid #eee;}
 .uFile {overflow:hidden; position:relative; display:inline-block; margin:-2px 5px 0 0; width:80%; height:28px; vertical-align:middle; border:1px solid #dbdbdb;}
 .lrStyle .uFile {margin-top:2px;}
 .uFileInput {position:absolute; top:0; width:100%; margin:0 !important; padding:0 !important; line-height:28px; border:none !important;}
-.uFileLabel {position:absolute; top:0; right:0; left:0; z-index:1; margin:0; padding:0 7px; width: cals(100% - 7px); line-height:28px; height:28px; background-color:#fff; border-radius:1px; overflow:hidden; white-space:nowrap;}
+.uFileLabel {position:absolute; top:0; right:0; left:0; z-index:1; margin:0; padding:0 7px; width:cals(100% - 7px); line-height:28px; height:28px; background-color:#fff; border-radius:1px; overflow:hidden; white-space:nowrap;}
 .uFileLabel::after {position:absolute; top:0; right:0; bottom:0; width:30px; z-index:3; line-height:28px; content:" "; border-left:1px solid #dbdbdb; background:#eee url('/image/icon_upload.png') no-repeat 50% 50%;}
 
 /* badge --------------- */
@@ -421,8 +436,8 @@ footer .f-right {float:right; padding-right:20px; line-height:38px;}
 .imgCard img {margin-right:15px;}
 .imgCard li:nth-of-type(2) {padding-top:20px; max-width:150px; line-height:24px}
 .imgCard p {font-size:12px;}
-.imgCard .cardClose {position:absolute; top:0; right:0; background:url('/image/btn_sltClose.png') no-repeat 50% 50%; text-indent:-9999px;}
-.imgCard .cardClose:hover {background:#f1f1f1 url('/image/btn_sltCloseOn.png') no-repeat 10px 50%;}
+.imgCard .cardClose {position:absolute; top:0; right:0; width:24px; background:url('/image/btn_sltClose.png') no-repeat 50% 50%; text-indent:-9999px;}
+.imgCard .cardClose:hover {background:#f1f1f1 url('/image/btn_sltCloseOn.png') no-repeat 50% 50%;}
 .verticalTop {vertical-align:top;}
 
 /* 조회용 이미지 카드 */
@@ -437,7 +452,7 @@ footer .f-right {float:right; padding-right:20px; line-height:38px;}
 .panelStyle > .notice {margin:0 0 15px ;}
 .panelContent > .notice {margin:15px 0;}
 .notice em {color:red;}
-.notice li, p.dot {padding-left:20px; background:url('/image/dot_bk.png') no-repeat 5px 50%; line-height:24px;}
+.notice li, p.dot {padding-left:20px; background:url('/image/dot_bk.png') no-repeat 5px 10px; line-height:24px;}
 p.dot .btn {margin-left:10px !important;}
 p.dot em {color:red;}
 
@@ -515,21 +530,21 @@ p.dot em {color:red;}
 .color-mPink .tabsJrNav li.on a,
 .color-pink .tabsJrNav li.on a {color:#333;}
 
-/*Color : wivis ---*/
-.color-wivis header, span.color-wivis{background:#3E3E3E !important;}
-.color-wivis .header-logo{background:#000 !important;}
-.color-wivis .header-menu .menu a{background:#000 !important;}
-.color-wivis .header-menu .menu a.on{background:#fff !important; color:#000 !important;}
-.color-wivis #lnb-wrapper{background-color:#b2b2b2 !important;}
-.color-wivis #lnb .dep2{background-color:#545454 !important;}
-.color-wivis #lnb .dep3{border-color:#000 !important;}
-.color-wivis #lnb .dep3{background:#fdfdfd !important;  }
-.color-wivis #lnb .dep3 a{color:#111111 !important;}
-.color-wivis #lnb a{color:#fff !important;}
-.color-wivis .frmStyle th, .color-wivis .tableStyle th, .color-wivis .frmStyle th, .color-wivis .tableStyle th{background:#eee !important; 	border-top:1px solid #ddd; border-bottom:1px solid #ddd;}
-.color-wivis .tablePaging .num.on, .color-wivis .tablePaging .num.on{background:#888 !important; 	border-color:#888 !important;}
-.color-wivis .tabsJrNav li.on a, .color-wivis .tabsJrNav li.on a{color:#333; background:#eee !important}
-.color-wivis .tabJr.on, .color-wivis .tabJr.on { border-top: 4px solid #eee;}
+/*Color :black ---*/
+.color-black header, span.color-black{background:#3E3E3E !important;}
+.color-black .header-logo{background:#000 !important;}
+.color-black .header-menu .menu a{background:#000 !important;}
+.color-black .header-menu .menu a.on{background:#fff !important; color:#000 !important;}
+.color-black #lnb-wrapper{background-color:#b2b2b2 !important;}
+.color-black #lnb .dep2{background-color:#545454 !important;}
+.color-black #lnb .dep3{border-color:#000 !important;}
+.color-black #lnb .dep3{background:#fdfdfd !important;  }
+.color-black #lnb .dep3 a{color:#111111 !important;}
+.color-black #lnb a{color:#fff !important;}
+.color-black .frmStyle th, .color-black .tableStyle th, .color-black .frmStyle th, .color-black .tableStyle th{background:#eee !important; 	border-top:1px solid #ddd; border-bottom:1px solid #ddd;}
+.color-black .tablePaging .num.on, .color-black .tablePaging .num.on{background:#888 !important; 	border-color:#888 !important;}
+.color-black .tabsJrNav li.on a, .color-black .tabsJrNav li.on a{color:#333; background:#eee !important}
+.color-black .tabJr.on, .color-black .tabJr.on { border-top:4px solid #eee;}
 
 /* 폰트 컬러, 폰트 두께 */
 .cBlue {color:#127fdc !important;}
@@ -664,13 +679,13 @@ table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
 .prograss-txt.bg-base {color:#8597eb; font-weight:bold;}
 
 /* Multi CheckBox */
-.multiCheckBox {position:relative; display:inline-block; width:auto; height:27px; line-height:27px; margin:3px 3px 3px 0; border:1px solid #dbdbdb}
-.multiCheckBox .sltBtn {width:99%; padding-left:5px; color:#555; text-align:left; -webkit-touch-callout:none; -webkit-user-select: none; -ms-user-select: none; user-select: none;}
+.multiCheckBox {position:relative; display:inline-block; width:auto; line-height:27px; margin:3px 3px 3px 0;}
+.multiCheckBox .sltBtn {padding-left:5px; width:100%; height:27px; color:#555; text-align:left; border:1px solid #dbdbdb; box-sizing:border-box; -webkit-touch-callout:none; -webkit-user-select:none; -ms-user-select:none; user-select:none;}
 .multiCheckBox .sltBtn::after {position:absolute; top:6px; right:10px; content:''; width:7px; height:7px; border-bottom:1px solid #555; border-left:1px solid #555; -webkit-transform:rotate(-45deg); transform:rotate(-45deg);}
 .multiCheckBox .sltBtn.on::after {top:10px; -webkit-transform:rotate(135deg); transform:rotate(135deg);}
-.multiCheckBox ul {display:none; position:absolute; top:26px; left:-1px; z-index:1; width:100%; height:auto; border:1px solid #dbdbdb; background:#fff;}
+.multiCheckBox ul {display:none; position:absolute; top:26px; left:0; z-index:1; width:100%; height:auto; border:1px solid #dbdbdb; background:#fff;}
 .multiCheckBox li {padding:3px 10px;}
-.multiCheckBox li:hover {background-color: Highlight; color: HighlightText;}
+.multiCheckBox li:hover {background-color:Highlight; color:HighlightText;}
 .multiCheckBox label {display:flex;}
 
 /* checkBox More */
@@ -712,7 +727,7 @@ table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
 .itemMove .item input {width:30px; height:14px !important; line-height:14px}
 .itemMove .item li:nth-of-type(2) div {line-height:20px}
 
-/* 상품 Dragable : 20200129 */
+/* 상품 Dragable :20200129 */
 .sortableWrap #sortable { overflow-y:auto }
 .sortableWrap {margin:20px 0; width:100%; max-height:675px;}
 .sortableWrap .itemWrap {display:inline-block;}
@@ -733,13 +748,13 @@ table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
 .sortableWrap .item .cont input {margin-left:5px; width:37px;}
 
 
-.ag-theme-balham.lh60 .ag-cell {line-height: 60px !important; height:60px;}
-.ag-theme-balham.lh70 .ag-cell {line-height: 70px !important; height:70px;}
-.ag-theme-balham.lh80 .ag-cell {line-height: 80px !important; height:80px;}
-.ag-theme-balham.lh90 .ag-cell {line-height: 90px !important; height:90px;}
-.ag-theme-balham.lh100 .ag-cell {line-height: 100px !important; height:100px;}
-.ag-theme-balham.lh110 .ag-cell {line-height: 110px !important; height:110px;}
-.ag-theme-balham.lh120 .ag-cell {line-height: 120px !important; height:120px;}
+.ag-theme-balham.lh60 .ag-cell {line-height:60px !important; height:60px;}
+.ag-theme-balham.lh70 .ag-cell {line-height:70px !important; height:70px;}
+.ag-theme-balham.lh80 .ag-cell {line-height:80px !important; height:80px;}
+.ag-theme-balham.lh90 .ag-cell {line-height:90px !important; height:90px;}
+.ag-theme-balham.lh100 .ag-cell {line-height:100px !important; height:100px;}
+.ag-theme-balham.lh110 .ag-cell {line-height:110px !important; height:110px;}
+.ag-theme-balham.lh120 .ag-cell {line-height:120px !important; height:120px;}
 
 
 /* 테이블 상품명 클릭시 이미지 레이어 활성화 */
@@ -749,19 +764,19 @@ table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
 
 /* dashboard */
 .flexWrap{display:-ms-flexbox; display:flex; -ms-flex-wrap:wrap; flex-wrap:wrap; color:#676a6c;}
-.flexWrap li{padding:0 20px 20px; width: calc(33.3%);}
-.flexWrap.unit4 li{width: calc(25%);}
-.flexWrap.unit5 li{width: calc(20%);}
-.flexWrap.unit6 li{width: calc(16.6%);}
-.flexWrap .title{padding: 15px; font-weight: 600; border:1px solid #e7eaec; border-top:2px solid #e7eaec;}
-.flexWrap .title h5{font-size:15px; font-weight: bold;}
-.flexWrap .title span{float:right; padding:1px 8px; font-size: 10px; border-radius: 0.25em;}
-.flexWrap .content{padding: 15px; border:1px solid #e7eaec; border-top:none;}
-.flexWrap .content em{font-size:30px; font-weight: 200;}
+.flexWrap li{padding:0 20px 20px; width:calc(33.3%);}
+.flexWrap.unit4 li{width:calc(25%);}
+.flexWrap.unit5 li{width:calc(20%);}
+.flexWrap.unit6 li{width:calc(16.6%);}
+.flexWrap .title{padding:15px; font-weight:600; border:1px solid #e7eaec; border-top:2px solid #e7eaec;}
+.flexWrap .title h5{font-size:15px; font-weight:bold;}
+.flexWrap .title span{float:right; padding:1px 8px; font-size:10px; border-radius:0.25em;}
+.flexWrap .content{padding:15px; border:1px solid #e7eaec; border-top:none;}
+.flexWrap .content em{font-size:30px; font-weight:200;}
 .statText {margin-top:5px}
 .statText::after{display:block; clear:both; content:''}
 .statText span:nth-of-type(1){float:left; font-size:11px;}
-.statText span:nth-of-type(2){float:right; font-size:13px; font-weight: 600;}
+.statText span:nth-of-type(2){float:right; font-size:13px; font-weight:600;}
 .txt-success{color:#1c84c6;}
 .txt-info{color:#23c6c8;}
 .flexWrap .txt-danger{color:#ed5565;}
@@ -773,7 +788,7 @@ table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
 .dbChart .btn-group button{margin:0; height:23px;}
 .dbChart .boxleft{float:left; margin:20px 15px 20px 15px; width:calc(100% - 490px);}
 .dbChart .boxRight{float:left; margin:20px 20px 20px 40px; width:400px;}
-.dbChart .boxRight em{font-size: 24px; font-weight: 200;}
+.dbChart .boxRight em{font-size:24px; font-weight:200;}
 .dbChart .boxRight > div{margin-bottom:25px;}
 .dbChart .boxRight .statText .c1 {color:#FF7043}
 .dbChart .boxRight .progress .c1 {background:#FF7043}
@@ -781,9 +796,9 @@ table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
 .dbChart .boxRight .progress .c2 {background:#48C9B0}
 .dbChart .boxRight .statText .c3 {color:#ca9900}
 .dbChart .boxRight .progress .c3 {background:#FFD54F}
-.progress{display: -ms-flexbox; display: flex; margin-top: 5px; height: 1rem; overflow: hidden; font-size: .75rem; background-color: #e9ecef; border-radius: .25rem;}
-.progress-mini{height: 5px; margin-bottom: 0;}
-.progress > div{height: 5px; margin-bottom: 0; transition:width 0.3s;}
+.progress{display:-ms-flexbox; display:flex; margin-top:5px; height:1rem; overflow:hidden; font-size:.75rem; background-color:#e9ecef; border-radius:.25rem;}
+.progress-mini{height:5px; margin-bottom:0;}
+.progress > div{height:5px; margin-bottom:0; transition:width 0.3s;}
 
 
 /* 카테고리 Sort */
@@ -794,7 +809,7 @@ table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
 .categoryOrder li:before{position:relative; content:''; width:1px; height:100%; background:#ddd;}
 .categoryOrder li ol{display:none}
 /* .categoryOrder ol:last-child li {background-image:none !important} */
-.categoryOrder button{position: relative; z-index:200; padding:0 15px 0; margin:0; line-height:40px; cursor:pointer; background-image:url(/image/icon_cate_plus.png); background-repeat:no-repeat; background-position:0 0;}
+.categoryOrder button{position:relative; z-index:200; padding:0 15px 0; margin:0; line-height:40px; cursor:pointer; background-image:url(/image/icon_cate_plus.png); background-repeat:no-repeat; background-position:0 0;}
 
 
 
@@ -804,14 +819,14 @@ table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
  .header-info-sm { display:inline-block;}
 }
 
-/* 반응형 : dashboard(20200522) --------------- */
+/* 반응형 :dashboard(20200522) --------------- */
 @media ( max-width:1023px ) {
  /* 대시보드 */
  #wrapper.dashboard{width:100%; min-width:100%;}
  .dashboard .header-logo{width:100%}
  .dashboard #lnb-wrapper{display:none;}
  .dashboard .header-menu{display:none;}
- .dashboard .tabs{margin-left:0; margin-right: 0;}
+ .dashboard .tabs{margin-left:0; margin-right:0;}
  .dashboard .tabs h2{position:relative; margin:10px 15px}
  .dashboard .tabsNav li:first-child{margin-left:0}
  .dashboard .tabsNav li:last-child{margin-right:0}
@@ -820,43 +835,43 @@ table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
  .dashboard .flexWrap.unit4 li{width:100%}
  .dashboard .flexWrap.unit5 li{width:100%}
  .dashboard .flexWrap.unit6 li{width:100%}
- .dashboard .boxStyle{margin-left:0; margin-right: 0;}
+ .dashboard .boxStyle{margin-left:0; margin-right:0;}
  .dashboard .dbChart .boxleft{clear:left; margin:30px 15px 0 0; width:100%;}
  .dashboard .dbChart .boxRight{clear:right; width:100%; margin:30px 20px 20px;}
 }
 
-/* Fix Input Zoom on devices older than iPhone 5: */
-@media screen and (device-aspect-ratio: 2/3) {
+/* Fix Input Zoom on devices older than iPhone 5:*/
+@media screen and (device-aspect-ratio:2/3) {
   select, textarea, input[type="text"], input[type="password"],
   input[type="datetime"], input[type="datetime-local"],
   input[type="date"], input[type="month"], input[type="time"],
   input[type="week"], input[type="number"], input[type="email"],
-  input[type="url"]{ font-size: 16px;}
+  input[type="url"]{ font-size:16px;}
 }
 
 /* Fix Input Zoom on iPhone 5, 5C, 5S, iPod Touch 5g */
-@media screen and (device-aspect-ratio: 40/71) {
+@media screen and (device-aspect-ratio:40/71) {
   select, textarea, input[type="text"], input[type="password"],
   input[type="datetime"], input[type="datetime-local"],
   input[type="date"], input[type="month"], input[type="time"],
   input[type="week"], input[type="number"], input[type="email"],
-  input[type="url"]{ font-size: 16px;}
+  input[type="url"]{ font-size:16px;}
 }
 
 /* Fix Input Zoom on iPhone 6, iPhone 6s, iPhone 7 */
-@media screen and (device-aspect-ratio: 375/667) {
+@media screen and (device-aspect-ratio:375/667) {
   select, textarea, input[type="text"], input[type="password"],
   input[type="datetime"], input[type="datetime-local"],
   input[type="date"], input[type="month"], input[type="time"],
   input[type="week"], input[type="number"], input[type="email"],
-  input[type="url"]{ font-size: 16px;}
+  input[type="url"]{ font-size:16px;}
 }
 
 /* Fix Input Zoom on iPhone 6 Plus, iPhone 6s Plus, iPhone 7 Plus, iPhone 8, iPhone X, XS, XS Max */
-@media screen and (device-aspect-ratio: 9/16) {
+@media screen and (device-aspect-ratio:9/16) {
   select, textarea, input[type="text"], input[type="password"],
   input[type="datetime"], input[type="datetime-local"],
   input[type="date"], input[type="month"], input[type="time"],
   input[type="week"], input[type="number"], input[type="email"],
-  input[type="url"]{ font-size: 16px;}
+  input[type="url"]{ font-size:16px;}
 }

+ 0 - 13
style24.batch/.classpath

@@ -11,19 +11,6 @@
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
-		<attributes>
-			<attribute name="test" value="true"/>
-			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
-		<attributes>
-			<attribute name="test" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>

+ 2 - 0
style24.batch/src/main/java/com/style24/batch/biz/service/TsbGoodsService.java

@@ -301,6 +301,8 @@ public class TsbGoodsService {
 				if (result != null || !StringUtil.isNullOrEmpty(result.get("certNum").toString())) {
 					goodsSafeNo.setCertDt(result.get("certDt").toString());
 					goodsSafeNo.setCertNum(result.get("certNum").toString());
+					goodsSafeNo.setCertDiv(result.get("certDiv").toString());
+					goodsSafeNo.setCertState(result.get("certState").toString());
 					goodsSafeNo.setRegNo(TsbConstants.REG_NO);
 					goodsSafeNo.setUpdNo(TsbConstants.REG_NO);
 					goodsDao.saveGoodsSafeNo(goodsSafeNo);

+ 1 - 1
style24.batch/src/main/java/com/style24/batch/biz/task/TsbGoodsTask.java

@@ -148,7 +148,7 @@ public class TsbGoodsTask {
 	 * @throws Exception
 	 */
 	@Scheduled(cron = "${cron.goods.infants.safe}")
-	//@Scheduled(fixedDelay = 3500000)
+	@Scheduled(fixedDelay = 3500000)
 	@Async
 	public void tsbGoodsInfantsSafeNoJob() throws Exception {
 		goodsInfantsSafeNoJob.run("cron.goods.infants.safe");

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

@@ -17,6 +17,8 @@ public class GoodsSafeNo extends TscBaseDomain {
 	private String goodsCd;
 	private String goodsNum;
 	private String certNum;
+	private String certState;
+	private String certDiv;
 	private String certDt;
 
 }

+ 9 - 0
style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml

@@ -1008,6 +1008,8 @@
 		     , B.GOODS_NUM
 		     , A.ITEMKIND_CD 
 		     , C.CERT_NUM 
+		     , C.CERT_STATE
+		     , C.CERT_DIV
 		     , C.CERT_DT 
 		FROM TB_ITEMKIND A
 		INNER JOIN TB_GOODS B ON A.ITEMKIND_CD = B.ITEMKIND_CD AND B.SELF_GOODS_YN = 'Y'  /* 자사상품 */
@@ -1016,6 +1018,7 @@
 		                                   AND (CERT_NUM IS NULL
 		                                        <![CDATA[
 		                                        OR CERT_DT < DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -5 YEAR), '%Y%m%d')  /*인증유효 5년 경과*/
+		                                        OR CERT_STATE <> '적합'
 		                                        ]]>
 		                                       )
 		WHERE A.NI_CLSF_CD = 'G004_23'  /*고시 유아용품*/
@@ -1027,6 +1030,8 @@
 		INSERT INTO TB_GOODS_SAFE_NO (
 		    GOODS_CD
 		  , CERT_NUM
+		  , CERT_STATE
+		  , CERT_DIV
 		  , CERT_DT
 		  , REG_NO
 		  , REG_DT
@@ -1036,6 +1041,8 @@
 		VALUES (
 		    #{goodsCd}
 		  , #{certNum}
+		  , #{certState}
+		  , #{certDiv}
 		  , #{certDt}
 		  , #{regNo}
 		  , NOW()
@@ -1044,6 +1051,8 @@
 		)
 		ON DUPLICATE KEY UPDATE
 		       CERT_NUM = #{certNum}
+		     , CERT_DIV = #{certDiv}
+		     , CERT_STATE = #{certState}
 		     , CERT_DT = #{certDt}
 		     , UPD_NO = #{updNo}
 		     , UPD_DT = NOW()

+ 6 - 2
style24.core/src/main/java/com/style24/core/biz/thirdparty/SafetyKoreaApi.java

@@ -74,7 +74,9 @@ public class SafetyKoreaApi {
 
 		if (kcNo.getResultCode() != null && "2000".equals(kcNo.getResultCode())) { // 성공
 			result.set("certNum", kcNo.getResultData().iterator().next().getCertNum());
-			result.set("certDt", kcNo.getResultData().iterator().next().getCertDate() );
+			result.set("certDiv", kcNo.getResultData().iterator().next().getCertDiv());
+			result.set("certState", kcNo.getResultData().iterator().next().getCertState());
+			result.set("certDt", kcNo.getResultData().iterator().next().getCertDate());
 			return result;
 		}
 
@@ -104,7 +106,9 @@ public class SafetyKoreaApi {
 
 		if (kcNo.getResultCode() != null && "2000".equals(kcNo.getResultCode())) { // 성공
 			result.set("certNum", kcNo.getResultData().getCertNum());
-			result.set("certDt", kcNo.getResultData().getCertDate() );
+			result.set("certDiv", kcNo.getResultData().getCertDiv());
+			result.set("certState", kcNo.getResultData().getCertState());
+			result.set("certDt", kcNo.getResultData().getCertDate());
 			return result;
 		}
 

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

@@ -68,6 +68,7 @@ public class Goods extends TscBaseDomain {
 	private String taxGb;		//과세구분(10:과세, 20:비과세)
 	private String erpPriceLinkYn;		//ERP가격연계여부(자사상품만 사용. Y:연계)
 	private String erpStockLinkYn;		//ERP재고연계여부(자사상품만 사용. Y:연계)
+	private String newCustOrdYn;		//신규고객 구매가능여부(Y:신규고객만 구매가능)
 
 	private String brandEnm;		//브랜드영문명
 	private String brandGrpNm;		//브랜드그룹명
@@ -103,6 +104,8 @@ public class Goods extends TscBaseDomain {
 	private String niClsfNm;
 	private String goodsTypeNm;
 	private String goodTnmInit;
+	private String custGrade;
+	private String custGradeName;
 //
 //	private String goodsRegMsg;
 	private String procJob;
@@ -156,6 +159,9 @@ public class Goods extends TscBaseDomain {
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] dispYn; // 전시여부
 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] goodsOrderGrade; // 구매 등급
+
 	private Collection<GoodsNotiInfo> notiListNew; // 고시항목
 
 	private String notiList; // 고시항목

+ 85 - 2
style24.scm/src/main/java/com/style24/persistence/mybatis/shop/TssGoods.xml

@@ -662,7 +662,7 @@
 	
 	<!-- 상품 기본정보 이력 생성 -->
 	<insert id="createGoodsHst" parameterType="Goods">
-		/* TssGoods.createGoodsHst */
+		/* TsaGoods.createGoodsHst */
 		INSERT INTO TB_GOODS_HST 
 		(       GOODS_CD
 		      , BRAND_CD
@@ -711,6 +711,7 @@
 		      , TAX_GB
 		      , ERP_PRICE_LINK_YN
 		      , ERP_STOCK_LINK_YN
+		      , NEW_CUST_ORD_YN
 		      , REG_NO
 		      , REG_DT
 		      , UPD_NO
@@ -742,7 +743,7 @@
 		     , SUPPLY_COMP_CD      
 		     , SUPPLY_GOODS_CD     
 		     , AGE_GRP_CD          
-		     , DELV_FEE_CD
+		     , DELV_FEE_CD            
 		     , PNT_PRATE           
 		     , PNT_MRATE           
 		     , SELL_FEE_RATE       
@@ -763,6 +764,7 @@
 		     , TAX_GB              
 		     , ERP_PRICE_LINK_YN   
 		     , ERP_STOCK_LINK_YN   
+		     , NEW_CUST_ORD_YN
 		     , #{regNo}              
 		     , NOW()              
 		     , UPD_NO              
@@ -810,6 +812,9 @@
 		<if test="preMpntUsableYn != null and preMpntUsableYn != ''" >
 		    , PRE_MPNT_USABLE_YN = #{preMpntUsableYn}
 		</if>
+		<if test="newCustOrdYn != null and newCustOrdYn != ''" >
+		    , NEW_CUST_ORD_YN = #{newCustOrdYn}
+		</if>
 		<if test='procJob == "minOrdAmt"  and minOrdAmt != null and minOrdAmt != ""' >
 		    , MIN_ORD_AMT = #{minOrdAmt}
 		</if>
@@ -1230,10 +1235,14 @@
 		  , PRE_PPNT_USABLE_YN = #{prePpntUsableYn}
 		  , PRE_MPNT_USABLE_YN = #{preMpntUsableYn}
 		  , DISTRIBUTION_GB = #{distributionGb}
+		  , RETURNABLE_YN = #{returnableYn}
+		  , CHANGEABLE_YN = #{changeableYn}
+		  , NEW_CUST_ORD_YN = #{newCustOrdYn}
 		  , AGE_GRP_CD = #{ageGrpCd}
 		  , SELL_FEE_RATE = #{sellFeeRate}
 		  , GIFT_PACK_YN = #{giftPackYn}
 		  , MAIN_COLOR_CD = #{mainColorCd}
+		  , GIFT_PACK_YN = #{giftPackYn}
 		  , UPD_NO = #{updNo}
 		  , UPD_DT = NOW()
 		WHERE GOODS_CD = #{goodsCd}
@@ -1652,4 +1661,78 @@
 		AND GOODS_CD = #{goodsCd}
 	</delete>
 	
+	<!-- 상품 가격예약 등록 -->
+	<insert id="createGoodPriceRes" parameterType="GoodsPriceRes">
+		/* TsaGoods.createGoodPriceRes */
+		INSERT INTO TB_GOODS_PRICE_RES (
+		  GOODS_PRICE_RES_SQ
+		, GOODS_CD
+		, RES_GOODS_PRICE
+		, END_GOODS_PRICE
+		, SELL_FEE_RATE
+		, APPLY_STDT
+		, APPLY_EDDT
+		, CFRM_YN
+		, CFRM_NO
+		, CFRM_DT
+		, APPLY_YN
+		, REG_NO
+		, REG_DT
+		, UPD_NO
+		, UPD_DT
+		)
+		VALUES(
+		  NULL
+		, #{goodsCd}
+		, #{resGoodsPrice}
+		, #{endGoodsPrice}
+		, #{sellFeeRate}
+		, STR_TO_DATE(#{applyStdt},'%Y%m%d%H%i%S')
+		, STR_TO_DATE(#{applyEddt},'%Y%m%d%H%i%S')
+		, NVL(#{cfrmYn},'N')
+		, #{cfrmNo}
+		, #{cfrmDt}
+		, NVL(#{applyYn},'N')
+		, #{regNo}
+		, NOW()
+		, #{updNo}
+		, NOW()
+		)
+	</insert>
+	
+	<!-- 상품 구매등급 목록 -->
+	<select id="getGoodsDetailOrderGradeList" parameterType="Goods" resultType="Goods">
+		/* TsaGoods.getGoodsDetailOrderGradeList */
+		SELECT  G.GOODS_CD
+		      , A.CUST_GRADE
+		      , FN_GET_CODE_NM('G101', A.CUST_GRADE) AS CUST_GRADE_NAME
+		 FROM TB_GOODS_ORDER_GRADE A 
+		 INNER JOIN TB_GOODS G ON A.GOODS_CD = G.GOODS_CD
+		 WHERE A.GOODS_CD = #{goodsCd}
+		 ORDER BY G.GOODS_CD, A.CUST_GRADE
+	</select>
+	
+	<!-- 상품 구매등급 삭제 -->
+	<delete id="deleteGoodsCustGrade" parameterType="Goods" >
+		/* TsaGoods.saveGoodsNaverLowestPrice */
+		DELETE FROM TB_GOODS_ORDER_GRADE
+		WHERE GOODS_CD = #{goodsCd}
+	</delete>
+	
+	<!-- 상품 구매등급 저장 -->
+	<insert id="createGoodsCustGrade"  parameterType="Goods" >
+		/* TsaGoods.createGoodsCustGrade */
+		INSERT INTO TB_GOODS_ORDER_GRADE (
+		    GOODS_CD
+		  , CUST_GRADE
+		  , REG_NO
+		  , REG_DT
+		)
+		VALUES(
+		    #{goodsCd}
+		  , #{custGrade}
+		  , #{regNo}
+		  , NOW()
+		)
+	</insert>
 </mapper>

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

@@ -327,4 +327,33 @@ public interface TssGoodsDao {
 	 */
 	void deleteNoticeGoods(NoticeGoods noticeGoods);
 
+	/**
+	 * 상품 구매등급 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 11
+	 */
+	Collection<Goods> getGoodsDetailOrderGradeList(Goods goods);
+
+	/**
+	 * 상품 구매등급 삭제
+	 *
+	 * @param map
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 11
+	 */
+	void deleteGoodsCustGrade(Goods goods);
+
+	/**
+	 * 상품 구매등급 저장
+	 *
+	 * @param map
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 11
+	 */
+	void createGoodsCustGrade(Goods goods);
 }

+ 29 - 0
style24.scm/src/main/java/com/style24/scm/biz/service/TssGoodsService.java

@@ -409,6 +409,18 @@ public class TssGoodsService {
 		return goodsDao.getGoodsNotiInfoList(goodsNotiInfo);
 	}
 
+	/**
+	 * 상품 구매등급 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 18
+	 */
+	public Collection<Goods> getGoodsDetailOrderGradeList(Goods goods) {
+		return goodsDao.getGoodsDetailOrderGradeList(goods);
+	}
+
 	/**
 	 * 상품의 정보고시 항목 목록
 	 *
@@ -618,6 +630,23 @@ public class TssGoodsService {
 		// 상품 정보고시 변경
 		this.saveGoodsNotiInfo(goods);
 
+		// 상품 구매등급 적용
+		if (goods.getGoodsOrderGrade() != null && goods.getGoodsOrderGrade().length > 0) {
+			Goods goodsOrderGrade = new Goods();
+			goodsOrderGrade.setGoodsCd(goods.getGoodsCd());
+			goodsOrderGrade.setRegNo(TssSession.getInfo().getUserNo());
+			goodsDao.deleteGoodsCustGrade(goodsOrderGrade);
+			for(String custGrade : goods.getGoodsOrderGrade()) {
+				goodsOrderGrade.setCustGrade(custGrade);
+				goodsDao.createGoodsCustGrade(goodsOrderGrade);
+			}
+		}else {
+			Goods goodsOrderGrade = new Goods();
+			goodsOrderGrade.setGoodsCd(goods.getGoodsCd());
+			goodsOrderGrade.setRegNo(TssSession.getInfo().getUserNo());
+			goodsDao.deleteGoodsCustGrade(goodsOrderGrade);
+		}
+
 	}
 
 	/**

+ 16 - 3
style24.scm/src/main/java/com/style24/scm/biz/web/TssGoodsController.java

@@ -421,9 +421,8 @@ public class TssGoodsController extends TssBaseController {
 		// 년도
 		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
 		mav.addObject("styleYearList", rendererService.getYearList(toYear, 0, 5));
-		// 색상
-//		Color color = new Color();
-//		mav.addObject("colorList", rendererService.getColorList(color));
+		// 회원등급
+		//mav.addObject("custGradeList", rendererService.getAvailCommonCodeList("G101"));
 
 		mav.addObject("params", goods);
 
@@ -503,6 +502,20 @@ public class TssGoodsController extends TssBaseController {
 		return goodsService.getGoodsNotiInfoList(goodsInfo);
 	}
 
+	/**
+	 * 상품 구매등급 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 11
+	 */
+	@PostMapping("/detail/order/grade/list")
+	@ResponseBody
+	public Collection<Goods> getGoodsDetailOrderGradeList(Goods goods) {
+		return goodsService.getGoodsDetailOrderGradeList(goods);
+	}
+
 	/**
 	 * 상품의 정보고시 항목 목록
 	 *

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

@@ -111,19 +111,19 @@ public class TssRendererController extends TssBaseController {
 //		return rendererService.getVendorExtmallSellStoreList(vendorId);
 //	}
 //
-//	/**
-//	 * 현재 유효한 공통코드 목록
-//	 * @param cdGb - 공통그룹코드
-//	 * @return
-//	 * @author eskim
-//	 * @since 2020. 01. 22
-//	 */
-//	@GetMapping("/avail/commonCode/list/{cdGb}")
-//	@ResponseBody
-//	public Collection<AdmCommonCode> getAvailCommonCodeList(@PathVariable String cdGb) {
-//		return rendererService.getAvailCommonCodeList(cdGb);
-//	}
-//
+	/**
+	 * 현재 유효한 공통코드 목록
+	 * @param cdGb - 공통그룹코드
+	 * @return
+	 * @author eskim
+	 * @since 2020. 01. 22
+	 */
+	@GetMapping("/avail/commonCode/list/{cdGb}")
+	@ResponseBody
+	public Collection<CommonCode> getAvailCommonCodeList(@PathVariable String cdGb) {
+		return rendererService.getAvailCommonCodeList(cdGb);
+	}
+
 	/**
 	 * 업체별 색상 목록
 	 * @param cdGb - 공통그룹코드

+ 119 - 32
style24.scm/src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html

@@ -77,9 +77,8 @@
 							<li><a href="#goodstab2">옵션/재고정보</a></li>
 							<li><a href="#goodstab3">상품상세정보</a></li>
 							<li id="goodsNotiTab"><a href="#goodstab4">고시정보</a></li>
-							<!-- <li id="goodsColorTab"><a href="#goodstab5">대표색상</a></li> -->
-							<li id="GoodsComposeTab" style="display:none;"><a href="#goodstab6">구성상품</a></li>
-							<li><a href="#goodstab7">변경이력</a></li>
+							<li id="goodsComposeTab" style="display:none;"><a href="#goodstab5">구성상품</a></li>
+							<li><a href="#goodstab6">변경이력</a></li>
 						</ul>
 					</div>
 					<!-- //TABS NAVI -->
@@ -159,7 +158,7 @@
 										</td>
 									</tr>
 									<tr>
-										<td rowspan="9">&nbsp;</td>
+										<td rowspan="11">&nbsp;</td>
 										<th>시즌<em class="required" title="필수"></em></th>
 										<td >
 											<select  name="seasonCd" id="seasonCd">
@@ -207,9 +206,14 @@
 											</select>
 											<input type="hidden" id="ageGrpCdOrg" name="ageGrpCdOrg"/>
 										</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"/>N</label>
+											<input type="hidden" id="giftPackYnOrg" name="giftPackYnOrg"/>
+										</td>
 										<th>가격변경일</th>
 										<td><span id="priceUpdDtTxt"></span></td>
-										<td colspan="2"></td>
 									</tr>
 									<tr>
 										<th>정상가</th>
@@ -230,16 +234,18 @@
 										<td><input type="text" class="w80p aR" id="sellFeeRate" name="sellFeeRate" maxlength="10" data-valid-type="numeric"/> %
 											<input type="hidden" id="sellFeeRateOrg" name="sellFeeRateOrg"/>
 										</td>
-										<th>반품여부<em class="required" title="필수"></em></th>
+										<th>과세구분</th>
 										<td>
-											<label class="rdoBtn"><input type="radio" name="returnableYn" id="returnableYnY" value="Y" />Y</label>
-											<label class="rdoBtn"><input type="radio" name="returnableYn" id="returnableYnN" value="N"/>N</label>
-											<input type="hidden" id="returnableYnOrg" name="returnableYnOrg"/>
+											<select name="taxGb"  disabled="disabled">
+												<option value="">[선택]</option>
+												<option value="10">과세</option>
+												<option value="20">비과세</option>
+											</select>
 										</td>
 									</tr>
 									<tr>
 										<th>품목코드<em class="required" title="필수"></em></th>
-										<td colspan="3">
+										<td colspan="5">
 											<select  name="itemkindCd" id="itemkindCd" th:disabled="${sessionInfo.roleCd != 'G001_B000'}">
 												<option th:if="${itemkindList}" th:each="oneData, status : ${itemkindList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 											</select>
@@ -248,13 +254,26 @@
 											<button type="button" class="btn btn-success btn-lg" id="btnGoodsItemkindChange">품목변경</button>
 											</th:block>
 										</td>
-										<th>과세구분</th>
+										
+									</tr>
+									<tr>
+										<th>반품여부<em class="required" title="필수"></em></th>
 										<td>
-											<select name="taxGb"  disabled="disabled">
-												<option value="">[선택]</option>
-												<option value="10">과세</option>
-												<option value="20">비과세</option>
-											</select>
+											<label class="rdoBtn"><input type="radio" name="returnableYn" id="returnableYnY" value="Y" />Y</label>
+											<label class="rdoBtn"><input type="radio" name="returnableYn" id="returnableYnN" value="N"/>N</label>
+											<input type="hidden" id="returnableYnOrg" name="returnableYnOrg"/>
+										</td>
+										<th>교환여부<em class="required" title="필수"></em></th>
+										<td>
+											<label class="rdoBtn"><input type="radio" name="changeableYn" id="changeableYnY" value="Y" />Y</label>
+											<label class="rdoBtn"><input type="radio" name="changeableYn" id="changeableYnN" value="N"/>N</label>
+											<input type="hidden" id="changeableYnOrg" name="changeableYnOrg"/>
+										</td>
+										<th>신규가입구매가입여부<em class="required" title="필수"></em></th>
+										<td>
+											<label class="rdoBtn"><input type="radio" name="newCustOrdYn" id="newCustOrdYnY" value="Y" />Y</label>
+											<label class="rdoBtn"><input type="radio" name="newCustOrdYn" id="newCustOrdYnN" value="N"/>N</label>
+											<input type="hidden" id="newCustOrdYnOrg" name="newCustOrdYnOrg"/>
 										</td>
 									</tr>
 									<tr>
@@ -310,6 +329,12 @@
 											<input type="hidden" id="dayMaxOrdQtyOrg" name="dayMaxOrdQtyOrg"/>
 										</td>
 									</tr>
+									<tr>
+										<th>구매등급</th>
+										<td colspan="5">
+											<div id="goodsCustGradeList"></div>
+										</td>
+									</tr>
 									</tbody>
 								</table>
 							</div>
@@ -417,15 +442,8 @@
 							<!-- //TAB4 CONTENTS AREA -->
 						</li>
 						<!-- //TAB4 : 고시정보 -->
-
-<!-- 					<li class="tab" id="goodstab5">
-						<div class="panelStyle">
-							<div id="gridGoodsNumList" style="height: 480px;" class="ag-theme-balham lh60"></div>
-						</div>
-					</li> -->
-
 						<!-- TAB6 : 구성상품 -->
-						<li class="tab" id="goodstab6">
+						<li class="tab" id="goodstab5">
 							<!-- TAB6 CONTENTS AREA -->
 							<div class="panelStyle">
 								<!-- 내용 삽입 -->
@@ -443,7 +461,7 @@
 						</li>
 						<!-- //TAB7 : 추가정보 -->
 						<!-- TAB5 : 이력정보 -->
-						<li class="tab" id="goodstab7">
+						<li class="tab" id="goodstab6">
 							<!-- TAB8 CONTENTS AREA -->
 							<div class="panelStyle">
 								<!-- 내용 삽입 -->
@@ -639,7 +657,6 @@
 			}else{
 				$("#goodsDetailForm input:radio[name=returnableYn]:input[value='N']").trigger('click');
 			}
-			
 			$('#goodsDetailForm input[name=sellFeeRate]').val(result.sellFeeRate);
 			$("#goodsDetailForm input[name=sellFeeRateOrg]").val(result.sellFeeRate);
 			
@@ -658,14 +675,26 @@
 			}else{
 				$("#goodsDetailForm input:radio[name=changeableYn]:input[value='N']").trigger('click');
 			}
-
+			if (result.giftPackYn == "Y"){
+				$("#goodsDetailForm input:radio[name=giftPackYn]:input[value='Y']").trigger('click');
+			}else{
+				$("#goodsDetailForm input:radio[name=giftPackYn]:input[value='N']").trigger('click');
+			}
+			if (result.newCustOrdYn == "Y"){
+				$("#goodsDetailForm input:radio[name=newCustOrdYn]:input[value='Y']").trigger('click');
+			}else{
+				$("#goodsDetailForm input:radio[name=newCustOrdYn]:input[value='N']").trigger('click');
+			}
+			
 			$("#goodsDetailForm input[name=formalGbOrg]").val(result.formalGb);
 			$("#goodsDetailForm input[name=erpPriceLinkYnOrg]").val(result.erpPriceLinkYn);
 			$("#goodsDetailForm input[name=selfMallYnOrg]").val(result.selfMallYn);
+			$("#goodsDetailForm input[name=giftPackYnOrg]").val(result.giftPackYn);
 			$("#goodsDetailForm input[name=prePpntUsableYnOrg]").val(result.prePpntUsableYn);
 			$("#goodsDetailForm input[name=preMpntUsableYnOrg]").val(result.preMpntUsableYn);
 			$("#goodsDetailForm input[name=changeableYnOrg]").val(result.changeableYn);
 			$("#goodsDetailForm input[name=returnableYnOrg]").val(result.returnableYn);
+			$("#goodsDetailForm input[name=newCustOrdYnOrg]").val(result.newCustOrdYn);
 
 			$("#goodsDetailForm input[type=radio][checked]").addClass("checked");
 			//$("#goodsDetailForm input[type=radio][checked]").parent("label").addClass("checked");
@@ -759,13 +788,13 @@
 			//세트
 			if ("G056_S" == result.goodsType){
 				//$('#goodsDetailForm #erplinkarea').addClass('off');
-				if (result.selfGoodsYn == "Y") $('#goodsDetailForm #GoodsComposeTab').css('display','block');
+				if (result.selfGoodsYn == "Y") $('#goodsDetailForm #goodsComposeTab').css('display','block');
 				$('#goodsDetailForm #goodsNotiTab').css('display','none');
 				$('#goodsDetailForm input[name=sellFeeRate]').attr('readonly', true);
 				$('#goodsDetailForm input[name=currPrice]').attr('readonly', true);
 			}else if ("G056_D" == result.goodsType){
 				//$('#goodsDetailForm #erplinkarea').addClass('off');
-				if (result.selfGoodsYn == "Y") $('#goodsDetailForm #GoodsComposeTab').css('display','block');
+				if (result.selfGoodsYn == "Y") $('#goodsDetailForm #goodsComposeTab').css('display','block');
 				$('#goodsDetailForm #goodsNotiTab').css('display','none');
 				$('#goodsDetailForm input[name=sellFeeRate]').attr('readonly', true);
 			}
@@ -785,6 +814,8 @@
 			fnGoodsDetailSizeStockSearch(params);
 			//정보고시
 			fnGoodsDetailNotiInfoSearch(params);
+			//구매등급
+			fnGoodsDetailOrderGradeSearch(params);
 			
 			//구성상품
 			if ("G056_S" == result.goodsType || "G056_D" == result.goodsType){
@@ -811,6 +842,11 @@
 		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);
@@ -843,7 +879,27 @@
 			$('#goodsDetailForm').find('.tabs .tabsNav li:eq(3) a').attr("style", "color:red;");
 		});
 	}
+	
+	//구매등급 콜백
+	var fnGoodsDetailOrderGradeSearchCallback = function(result) {
+		if (result == null) return;
 
+		result.forEach(function(info){
+			
+			$("#goodsDetailForm #goodsCustGradeList").find("input").each(function() {
+				if (info.custGrade == $(this).val() ){
+					$(this).prop("checked", true);
+					$(this).parent("label").addClass("checked");
+				}
+			});
+		});
+	}
+
+	//구매등급 변경여부
+	$('#goodsDetailForm').find('#goodstab5').find("input, select, textarea").on('change', function() {
+		$('#goodsDetailForm').find('.tabs .tabsNav li:eq(4) a').attr("style", "color:red;");
+	});
+	
 	//상품명 길이표시
 	$("#goodsDetailForm input[name=goodsNm]").bind('focus focusout input keyup keydown paste change', function () {
 		fnDataLengthCheck('goodsNm',200);
@@ -1561,7 +1617,6 @@
 		if ($("#goodsDetailForm input[name=currPriceOrg]").val() != $("#goodsDetailForm input[name=currPrice]").val().removeComma()){
 			return true;
 		}
-		
 		//자사 일반상품만 
 		if($("#goodsDetailForm input[name=selfGoodsYn]").val() == 'Y' && $("#goodsDetailForm input[name=goodType]").val() == 'G056_N'){
 			//ERP재고연동여부
@@ -1569,7 +1624,6 @@
 				return true;
 			}
 		}
-		
 		//자사몰 노출여부
 		if ($("#goodsDetailForm input[name=selfMallYnOrg]").val() != $("input[name=selfMallYn]:checked").val()){
 			return true;
@@ -1626,6 +1680,19 @@
 		if ($("#goodsDetailForm input[name=delvFeeCdOrg]").val() != $("#goodsDetailForm select[name=delvFeeCd]").val()){
 			return true;
 		}
+		//선물주문여부
+		if ($("#goodsDetailForm input[name=giftPackYnOrg]").val() != $("input[name=giftPackYn]:checked").val()){
+			return true;
+		}
+		// 교환가능여부
+		if ($("#goodsDetailForm input[name=changeableYnOrg]").val() != $("input[name=changeableYn]:checked").val()){
+			return true;
+		}
+		// 신규가입구매가능여부
+		if ($("#goodsDetailForm input[name=newCustOrdYnOrg]").val() != $("input[name=newCustOrdYn]:checked").val()){
+			return true;
+		}
+		
 		return false;
 	}
 
@@ -1672,7 +1739,25 @@
 		});
 	});
 	
-	
+	// 상품구매등급 
+	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;
+			}
+		});
+		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() {
@@ -1700,6 +1785,8 @@
 	});
 	
 	$(document).ready(function() {
+		
+		cfnCreateCheckbox("/renderer/avail/commonCode/list/G101", $('#goodsCustGradeList'), "goodsOrderGrade");
 
 		gagaAgGrid.createGrid('gridGoodsHstoryList', gridGoodsHstoryOptions);
 		//gagaAgGrid.createGrid('gridGoodsComposeList', gridGoodsComposeOptions);

+ 25 - 3
style24.scm/src/main/webapp/WEB-INF/views/goods/GoodsListForm.html

@@ -277,7 +277,7 @@
 								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('formalGb')" >적용</button>
 							</td>
 							<th>반품가능여부</th>
-							<td colspan="3">
+							<td>
 								<select id="returnableYnC" name="returnableYnC">
 									<option value="">[선택]</option>
 									<option value="Y">가능</option>
@@ -285,6 +285,15 @@
 								</select>
 								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('returnableYn')" >적용</button>
 							</td>
+							<th>교환가능여부</th>
+							<td>
+								<select id="changeableYnC" name="changeableYnC">
+									<option value="">[선택]</option>
+									<option value="Y">가능</option>
+									<option value="N">불가</option>
+								</select>
+								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('changeableYn')" >적용</button>
+							</td>
 						</tr>
 						<tr>
 							<th>상품타이틀</th>
@@ -327,7 +336,7 @@
 							</td>
 						</tr>
 						<tr>
-							<th>배송정책</th>
+							<th>배송정책</th>
 							<td colspan="3">
 								<select name="statSupplyCompCd" id="statSupplyCompCd">
 									<option value="" >[선택]</option>
@@ -338,7 +347,16 @@
 								</select>
 								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('delvFeeCd')" >적용</button>
 							</td>
-							<td colspan="4">
+							<th>선물 주문가능</th>
+							<td>
+								<select id="giftPackYnC" name="giftPackYnC">
+									<option value="">[선택]</option>
+									<option value="Y">가능</option>
+									<option value="N">불가</option>
+								</select>
+								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('giftPackYn')" >적용</button>
+							</td>
+							<td colspan="2">
 						</tr>
 					</table>
 				</li>
@@ -699,6 +717,7 @@
 		var erpStockLinkYnVal= '';
 		var formalGbVal= '';
 		var returnableYnVal= '';
+		var changeableYnVal = '';
 		var goodsTnmVal  = '';
 		var blankFlagVal = '';
 		var minOrdAmtVal = '';
@@ -718,6 +737,8 @@
 			formalGbVal = $(objId).val();
 		}else if (proc == "returnableYn") {
 			returnableYnVal = $(objId).val();
+		}else if (proc == "changeableYn") {
+			changeableYnVal = $(objId).val();	
 		}else if (proc == "goodsTnm"){
 			if($("#searchForm input:checkbox[name=blankFlag]").is(':checked')){
 				blankFlagVal = "Y";
@@ -807,6 +828,7 @@
 							,erpStockLinkYn : erpStockLinkYnVal
 							,formalGb : formalGbVal
 							,returnableYn : returnableYnVal
+							,changeableYn : changeableYnVal
 							,goodsTnm : goodsTnmVal
 							,blankFlag : blankFlagVal
 							,minOrdAmt : minOrdAmtVal

+ 876 - 876
style24.scm/src/main/webapp/ux/css/admin.ui.css

@@ -1,877 +1,877 @@
-@import url("https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700"); @import url("https://fonts.googleapis.com/css?family=Roboto:400,300,500,700"); html,body {position:relative; height:100%;}
-html, body, header, div, ul, ol, li, dl, dt, dd, h1, h2, h3, h4, h5, h6, label, a, p, form, input, textarea, table, hr, span, em {margin:0; padding:0; box-sizing:border-box;}
-/* { } */
-body {overflow-x:hidden; font-family:"open sans", "Roboto", "Malgun Gothic", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size:12px; background-color:#f3f3f4;}
-h1, h2, h3, h4, h5, h6 {display:inline-block;}
-ul, ol {list-style:none;}
-ul::after, ol::after {display:block; clear:both; content:'';}
-img {vertical-align:middle; border-style:none;}
-a {text-decoration:none;}
-em, i {font-style:normal;}
-table {border-collapse:collapse;}
-th {text-align:inherit;}
-label {position:relative; margin-right:20px; display:inline-block; -webkit-touch-callout:none; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none;}
-label:last-child {margin-right:0 !important;}
-input,button,select,textarea {font-family:inherit; font-size:inherit;}
-input.btn-sm {padding:1px 6px;}
-input[type=text] {width:100%;}
-input[type=text], input[type=file], input[type=date], [type=password], textarea {padding:4px 3px 4px 5px; color:inherit; border-radius:1px; vertical-align:middle; margin:1px 3px 2px 0;}
-input[type=date],input[type=time],input[type=datetime-local],input[type=month] {-webkit-appearance:listbox;}
-input[readonly="readonly"], input[disabled="disabled"], input[readonly="readonly"]:before, input[disabled="disabled"]:before, select[readonly="readonly"], select[disabled="disabled"] {background-color:#eee !important;}
-button, select {text-transform:none;}
-button,[type=button],[type=reset],[type=submit] {margin:0; -webkit-appearance:button; border-radius:0; cursor:pointer; background-color:transparent; border-color:transparent;}
-button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner {padding:0; border-style:none;}
-textarea {overflow:auto; resize:vertical; width:100%; margin:4px 0; vertical-align:middle; line-height:22px; height:32px;}
-.textareaR2 {min-height:60px; line-height:26px;}
-.textareaR3 {min-height:96px; line-height:26px;}
-.textareaR4 {min-height:134px; line-height:26px;}
-.byteChk {line-height:20px; padding-left:20px; display:inline-block; vertical-align:middle;}
-select {margin:0 3px 1px 0; padding:3px 10px 3px 3px; color:inherit; border-radius:1px; vertical-align:middle;}
-select, input[type=text], input[type=file], input[type=date], input[type=password], textarea {border:1px solid #dbdbdb;}
-select:focus, input:focus, textarea:focus, button:focus, .outline {outline:2px auto #4D90FE;}
-.formControl {background:#eee;}
-.off {display:none !important;}
-.scrollOff {overflow:hidden;}
-.f25 {font-size:25px;}
-
-html,body,#wrapper,#container {min-height:100%; height:100%;}
-#wrapper {position:relative; min-width:1240px;}
-
-/* 로그인 --------------- */
-.loginBg {background:#f3f3f4;}
-.loginWrap {width:500px; box-shadow:0 7px 7px -5px rgba(0, 0, 0, 0.1);}
-.loginWrap .loginBox input[type=text],
-.loginWrap .loginBox input[type=password]{padding:10px; width:100%; border:1px solid #ced4da; border-radius:.25rem;}
-.loginWrap .loginBox li:nth-of-type(2), .loginBox li:nth-of-type(3) {padding-bottom:10px;}
-.loginWrap .loginBox li:nth-of-type(4) {padding:10px 0 50px 0; line-height:30px; text-align:left;}
-.loginWrap .loginBox li:nth-of-type(5) {margin-bottom:30px; text-align:center;}
-.loginWrap .loginBox a {display:inline-block; padding:10px;}
-.loginWrap .loginBox .dot {color:#ccc;}
-.loginWrap .btn-black {background-color:#555; color:#fff; font-weight:bold; float:right; margin:0 !important;}
-.loginWrap .btn-black:hover{background-color:#000; box-shadow:none;}
-.loginWrap .btn-purple {background-color:#667eea; color:#fff; font-weight:bold; float:right; margin:0 !important;}
-.loginWrap .btn-purple:hover{background-color:#2e38cb; box-shadow:none;}
-.loginWrap .loginInfo {color:#888; line-height:23px; text-align:left;}
-.loginWrap .loginInfo em i {margin-right:7px;}
-.loginWrap .loginInfo p:first-child{margin-bottom:15px;}
-.loginWrap .loginInfo p span {display:inline-block; margin-bottom:15px; line-height:40px; font-size:16px; font-weight:bold; border-bottom:1px solid #000;}
-
-/* 로그인 style :black */
-.login_black {position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); -ms-transform:translate(-50%, -50%); background:#fff;}
-.login_black .logo { padding:25px 0; text-align:center; background:#000;}
-.login_black .loginInfo em {color:#555; font-weight:bold;}
-.login_black .loginCont > ul {padding:60px 60px 70px;}
-.login_black .loginBox li:nth-of-type(5) {border-top:1px solid #e4e4e4; border-bottom:1px solid #e4e4e4;}
-.login_black .loginBox a {color:#555}
-
-/* 보안 인증 */
-.loginWrap .certiFrm {padding:40px 60px 70px;}
-.loginWrap .certiFrm h2{margin:10px 0 30px;}
-.loginWrap .certiFrm h2 i{margin-right:10px;}
-.loginWrap .certiFrm .alertBox{margin-bottom:15px}
-.loginWrap .certiFrm .input{height:45px; position:relative;}
-.loginWrap .certiFrm .input input[type=text]{position:relative; padding:10px; width:45px; height:45px; line-height:45px; font-size:16px; border:1px solid #ced4da; border-radius:.25rem; text-align:center;}
-.loginWrap .certiFrm .input input[type=text]:focus{color:#4D90FE;font-weight:bold;}
-.loginWrap .certiFrm .input .countdown{display:inline-block; position:relative; padding-left:20px; line-height:45px; height:45px;color:red; text-align:center;vertical-align:top; font-size:14px}
-.loginWrap .certiFrm .info{margin-top:20px; line-height:22px; color:#555;}
-.loginWrap .certiFrm .button{margin:25px 0 50px;}
-.loginWrap .certiFrm .button button{margin:0 5px !important; padding:5px 20px; height:32px; float:right}
-.loginWrap .certiFrm .button button:focus{outline:2px auto #4D90FE !important; }
-.loginWrap .certiFrm .button .btn-black{width:100px !important;}
-
-/* 로그인 :alert */
-.alertBox {position:relative; padding:10px 40px 10px 10px; margin-bottom:10px; border:1px solid; border-radius:.25rem; line-height:22px;}
-.alertBox .alertClose {position:absolute; top:0; right:5px; padding:0 10px; height:40px; text-indent:-9999px; background:url('../../image/btn_sltClose.png') no-repeat 50% 50%;}
-.alertBox .alertClose:hover {background:url('../../image/btn_sltCloseOn.png') no-repeat 50% 50%;}
-.alert-success {color:#155724; background-color:#d4edda; border-color:#c3e6cb;}
-.alert-info {color:#0c5460; background-color:#d1ecf1; border-color:#bee5eb;}
-.alert-warning {color:#856404; background-color:#fff3cd; border-color:#ffeeba;}
-.alert-danger {color:#721c24; background-color:#f8d7da; border-color:#f5c6cb;}
-
-/* header--------------- */
-header {position:fixed; top:0; left:0; right:0; z-index:10; min-width:1240px; width:100%; height:60px; line-height:60px; color:#fff; background:linear-gradient(135deg,#667eea 0,#764ba2 100%);}
-header a, header button {color:#fff;}
-.header-logo {float:left; width:260px; line-height:60px; background:rgba(250, 251, 252, 0.1); overflow:hidden;}
-.header-logo a {display:inline-block; margin:0 10px 0 20px; width:184px; height:60px;}
-.header-logo .lnbClose {width:30px; line-height:30px; display:inline-block !important;}
-.header-logo .lnbClose:hover {color:rgba(255, 255, 255, 0.8);}
-.header-menu {position:absolute; left:260px; padding:0 0 0 30px; font-weight:bold;}
-.header-menu .menu {display:inline-block; -ms-user-select:none; -webkit-user-select:none; user-select:none;}
-.header-menu .menu a {display:inline-block; margin-right:7px; padding:0 14px; line-height:34px; border-radius:50px; background:rgba(0, 0, 0, 0.07);}
-.header-menu .menu a:hover {color:rgba(255, 255, 255, 0.8);}
-.header-menu .menu a.on {background:rgba(0, 0, 0, 0.3);}
-.header-info {display:inline-block; float:right; margin-right:20px;}
-.header-info a {color:rgba(255, 255, 255, 0.8);}
-.header-info a:hover {color:#fff;}
-.header-info i.heart {font-size:6px; color:rgba(255, 255, 255, 0.4); margin-right:3px;}
-.header-info i.dot {font-size:13px; color:rgba(255, 255, 255, 0.4); margin:0 3px;}
-.header-info-sm {display:none; float:right; margin-right:20px;}
-.header-info-sm a {display:inline-block; padding:0 7px; color:rgba(255, 255, 255, 0.8);}
-.header-info-sm a:hover {color:#fff;}
-
-/* GNB:툴팁--------------- */
-.tooltip .tooltiptext {visibility:hidden; position:absolute; top:48px; right:20px; z-index:1; padding:0 15px; line-height:30px; color:#fff; font-size:13px; text-align:center; background-color:#233646; border-radius:3px;}
-.tooltip .tooltiptext::after {content:""; position:absolute; bottom:100%; right:38px; border-width:5px; border-style:solid; border-color:transparent transparent #233646 transparent;}
-.tooltip .tooltiptext.logout::after {right:10px;}
-.tooltip:hover .tooltiptext {visibility:visible;}
-
-/* LNB--------------- */
-#lnb-wrapper {position:fixed; top:60px; left:-260px; width:260px; height:100%; vertical-align:top; overflow-y:auto; transition:left .3s; -webkit-transition:left .3s;}
-#lnb-wrapper:after{content:''; position:absolute; top:0; left:0; z-index:-1; width:100%; height:100%; background-color:#2f4050;}
-#lnb-wrapper.on {left:0;}
-#lnb {margin-bottom:60px; width:260px;}
-#lnb a {display:block; color:#a7b1c2;}
-#lnb a:hover {color:#fff;}
-#lnb a.on {color:#fff;}
-#lnb .dep2 {padding:14px 20px 14px 35px; background:url('../../image/icon_dep2.png') 10px 50% no-repeat, url('../../image/icon_depArr2.png') 222px 50% no-repeat; background-color:#233646; cursor:pointer;}
-#lnb .dep2.on {display:block; background:url('../../image/icon_dep2On.png') 10px 50% no-repeat, url('../../image/icon_depArr2On.png') 222px 50% no-repeat; background-color:#233646;}
-#lnb .dep3 {padding:5px 0 10px 10px; border-left:4px solid #8597eb; cursor:pointer;}
-#lnb .dep3 a {padding:10px; cursor:pointer;}
-#lnb .dep4 {padding:5px 0 10px 20px; cursor:pointer;}
-#lnb .dep4 a {padding:10px; cursor:pointer;}
-
-/* main--------------- */
-#main-wrapper {position:relative; left:0; top:0; margin-left:0; min-height:100%; padding-bottom:60px; vertical-align:top; color:#222; transition:margin-left .3s; -webkit-transition:margin-left .3s;}
-#main-wrapper.on {margin-left:260px;}
-#main {padding-top:60px; position:relative;}
-#main .main-title {height:60px; margin-left:20px; margin-right:20px;}
-#main .main-title h1 {padding-top:15px; font-size:20px; color:#333; font-weight:700;}
-#main .main-title ol {margin-top:25px; float:right; color:#666;}
-#main .main-title li {float:left;}
-#main .main-title li::before {padding:0 5px; content:"/"; color:#999;}
-#main .main-title li:nth-of-type(1)::before {content:none !important;}
-#main .main-title i {padding-right:3px; color:#999;}
-#main .sub-title {margin:0 20px 10px; font-size:14px; color:#6c7dda; font-weight:bold;}
-#main .sub-title i {margin-right:10px;}
-
-/* 패널영역 스타일--------------- */
-.panelStyle {position:relative; margin:0 20px 30px 20px; padding:15px 15px 0; background-color:#fff; border-top:2px solid #dfe2e3; box-shadow:0 7px 7px -5px rgba(0, 0, 0, 0.04);}
-.panelStyle::after, .frmStyle::after{position:relative; bottom:-5px; content:''; display:block; border:1px solid rgba(255,255,255,0);}
-.panelStyle .panelTitle {margin:-15px -15px 0; padding:0 20px; line-height:40px; border-bottom:1px solid #e7eaec;}
-.panelStyle .panelControl {position:absolute; top:0; right:15px; color:#c4c4c4;}
-.panelStyle .panelControl i {padding:10px 10px; cursor:pointer;}
-.panelStyle .panelContent {margin-top:10px;}
-.panelStyle h2 {margin-right:10px; font-size:14px; font-weight:bold;}
-.panelStyle h3 {margin-right:10px; font-size:12px; font-weight:normal; line-height:25px;}
-.panelStyle h3 i {padding-right:5px}
-.panelStyle h4 {padding-left:23px; height:31px; line-height:31px; background:url('../../image/icon_h4.png') no-repeat 3px 50%; color:#666;}
-.panelStyle .panelBar {display:table; width:100%; padding-bottom:10px;}
-.panelStyle .panelBar h4 {margin-bottom:0;}
-.panelStyle .panelBar > li {display:table-cell;}
-.panelStyle .panelBar > .center {text-align:center;}
-.panelStyle .panelBar > .right {text-align:right;}
-
-/* 패널 내부 테이블 여러개 배치 */
-.panelStyle .division + .panelBar {padding-bottom:15px;}
-.panelStyle .division {display:table; width:100%;}
-.panelStyle .division > li, .panelStyle .division > div {display:table-cell; padding-right:40px;}
-.panelStyle .division > li:last-child, .panelStyle .division > div:last-child {padding-right:0;}
-/* table, grid, button 상하 여백 */
-.ag-theme-balham{margin-bottom:15px !important;}
-.frmStyle + .panelBar {padding-bottom:15px;}
-.ag-theme-balham {margin:10px 0 15px;}
-.ag-theme-balham + .panelBar{padding-bottom:15px;}
-.panelBar + .ag-theme-balham {margin:0 0 15px;}
-.panelBar + .frmStyle {margin-top:0;}
-
-/* TABS 영역 --------------- */
-.tabs {position:relative; margin-bottom:30px; margin-left:20px; margin-right:20px;}
-.tabs h2 {position:absolute; top:0; z-index:2; margin-left:10px; font-size:14px; line-height:34px;}
-.tabs h2 i {margin-right:12px;}
-.tabsNav {overflow:hidden; position:relative; top:0; z-index:2; padding:0 30px 0 20px; height:35px;}
-.tabsNav ul {display:inline-block;}
-.tabsNav li {float:left; position:relative;}
-.tabsNav li a {padding:0 20px; line-height:35px; height:35px; display:block; color:#888; font-weight:bold; background-color:#f9f9f9; border:1px solid #dfe2e3; border-bottom:2px solid #dfe2e3; border-top-left-radius:.25rem; border-top-right-radius:.25rem;}
-.tabsNav li.on a {background-color:#fff; color:#222; border:1px solid #ccc; border-bottom:2px solid #fff;}
-.tabsCont {position:relative; top:-2px; z-index:1;}
-.tabsCont::after {display:block}
-.tab {display:none;}
-.tab > .panelStyle{margin:0;}
-.tab.on {display:block;}
-.popupTabs {padding-top:10px;}
-.tabContArea {overflow-x:hidden; overflow-y:auto;}
-.tabBtnArea {padding:15px 0 20px 0;}
-.popup .tabsCont {box-shadow:none;}
-.popup .tabs {margin-bottom:0;}
-
-/* Add TABS 영역 --------------- */
-.btn-add-tab {position:absolute; top:5px; right:0; z-index:2; padding:0 10px;}
-.tabsNav .ui-tabs-active a {background-color:#fff; color:#222; border:1px solid #ccc; border-bottom:2px solid #fff;}
-.tab-del {position:absolute; top:1px; right:1px; padding:4px 6px; color:gray; cursor:pointer; border-top-right-radius:.25rem;}
-.tab-del:hover {color:#f40552;}
-a, button, .ui-state-active, .ui-state-focus, .ui-state-hover {outline:0 !important;}
-.tabsNav .ui-corner-top a {padding:0 35px 0 20px}
-
-/* tabsJr 영역 --------------- */
-.tabsJr {position:relative;}
-.tabsJrNav {overflow:hidden; position:relative; top:0; z-index:2; height:31px; margin:0 30px 0 20px;}
-.tabsJrNav > ul {display:inline-block;}
-.tabsJrNav li {float:left;}
-.tabsJrNav li a {padding:0 20px; line-height:30px; height:30px; display:block; color:#888; /*font-weight:bold; */ background-color:#f9f9f9; border:1px solid #ccc; border-top-left-radius:.25rem; border-top-right-radius:.25rem;}
-.tabsJrNav li.on a {padding-bottom:2px; font-weight:bold; color:#555; background-color:#fff; border-top:1px solid #ccc; border-right:1px solid #ccc; border-bottom:1px solid #fff;}
-.tabsJrCont {position:relative; top:-2px; z-index:1;}
-.tabsJrCont::after {display:block}
-.tabJr {display:none;}
-.tabJr .panelStyle{margin:0; border-top:1px solid #ddd; min-height:20px; padding:20px 15px 0; box-shadow:0 -5px 7px -5px rgba(0, 0, 0, 0.05);}
-.tabJr.on {display:block;}
-.tabJrContArea {vertical-align:middle;}
-
-/* modal, modeless popup --------------- */
-.modalPopup{display:none; position:fixed; left:0; top:0; z-index:11; width:100%; height:100%; background:rgba(0,0,0,0.5);}
-.modalPopup > .panelStyle{position:absolute; top:50%; left:50%; z-index:11; -ms-transform:translate(-50%, -50%); transform:translate(-50%, -50%); margin:0; border:1px solid #79797a; border-radius:3px;}
-.modalPopup > .panelStyle .close {position:absolute; top:0; right:0; font-size:18px; padding:5px 15px 8px;}
-.modalPopup .tabs{ margin:0;}
-.modalPopup .tabs .panelStyle{box-shadow:none}
-.modalPopup .tab > .panelStyle{overflow-y:auto;}
-
-/*MODELESS POPUP --------------- */
-.modelessPopup{display:none; position:absolute; z-index:11; top:50%; left:50%;}
-.modelessPopup.draggable {cursor:move;}
-.modelessPopup .panelStyle{margin:0; border:1px solid #ccc; border-radius:3px;}
-.modelessPopup .panelStyle .close {position:absolute; top:0; right:0; font-size:18px; padding:5px 15px 8px;}
-.modelessPopup .tabs{ margin:0;}
-.modelessPopup .tabs .panelStyle{box-shadow:none}
-.modelessPopup .tab > .panelStyle{overflow-y:auto;}
-
-/*VIDEO POPUP --------------- */
-.videoPopup {display:none; position:fixed; top:50%; left:50%; z-index:11; -ms-transform:translate(-50%, -50%); transform:translate(-50%, -50%); margin:0; border:1px solid #79797a; border-radius:3px;}
-.modalPopup::before{position:fixed; left:0; top:0; z-index:11; width:100%; height:100%; background:rgba(0,0,0,0.5);}
-.videoPopup .close {position:absolute; top:-20px; right:-20px; z-index:1; width:40px; height:40px; line-height:20px; font-size:20px; border:1px solid #666; border-radius:50px; background-color:#fff;}
-.videoPopup iframe{width:100%; height:100%}
-
-
-#btnTop {display:none; position:fixed; right:0; bottom:50px; width:40px; line-height:10px; font-size:10px; background:#fff; border:1px solid #ddd; border-right:none; padding:3px 0 5px 0; box-shadow:5px 5px 5px -4px rgba(0, 0, 0, 0.07); color:#1c84c6;}
-#btnTop i {width:100%; font-size:12px;}
-#btnTop:hover {padding-right:30px; width:70px; font-weight:bold;}
-
-
-/* 컨텐트 스크롤--------------- */
-.xScroll {overflow-x:auto;}
-.yScroll {overflow-y:auto;}
-
-/* 폼테이블 스타일 --------------- */
-.frmStyle {width:100%; margin-bottom:15px;}
-.frmStyle th {border-top:1px solid #dae0fd;}
-.frmStyle tr:last-child th {border-bottom:1px solid #dae0fd;}
-.frmStyle tr:last-child td {border-bottom:1px solid #eee;}
-.frmStyle th {padding:0 15px; height:36px; line-height:24px; white-space:nowrap; text-align:center; background:#e9ecfb;}
-.frmStyle td {padding:0 10px 0 10px; line-height:36px; position:relative; border-top:1px solid #eee; border-right:1px solid #eee;}
-
-/* 체크박스&라디오박스 공통--------------- */
-input[type=radio] {position:absolute; top:50%; left:0; width:18px; height:18px; transform:translate(0,-50%); -ms-transform:translate(0,-50%);}
-label.chkBox, label.rdoBtn {position:relative; display:inline-block; padding-left:26px; height:22px; line-height:22px; vertical-align:middle; cursor:pointer;}
-/* 체크박스 :전체선택 버튼--------------- */
-input[type=checkbox] {position:absolute; top:0; left:0; width:0; height:0;}
-input[type=button].chkBox {margin-left:-2px; padding-left:24px; height:22px; vertical-align:middle; background:url('../../image/icon_checkN.png') no-repeat 0 50%;}
-
-/* 체크박스--------------- */
-label.chkBox::before {position:absolute; top:2px; left:0; content:''; width:16px; height:16px; border:1px solid #dbdbdb; background:#fff;}
-label.chkBox.checked::after {position:absolute; top:6px; left:3px; content:''; width:8px; height:4px; border-bottom:3px solid #676a6c; border-left:3px solid #676a6c; -webkit-transform:rotate(-45deg); transform:rotate(-45deg);}
-label.chkBox .formControl::before {background:#eee;}
-
-/* 라디오버튼--------------- */
-input[type=radio]::before {position:absolute; top:0; left:0; content:''; width:16px; height:16px; border:1px solid #dbdbdb; border-radius:50%; background:#fff;}
-input[type=radio]:checked::after {position:absolute; top:5px; left:5px; content:''; width:8px; height:8px; border-radius:50%; background:#676a6c;}
-input[type=radio].formControl::before {background:#eee;}
-
-/* 토글 스위치--------------- */
-.switchBox{ display:inline-block;position:relative; width:60px; height:28px; vertical-align:middle;border-radius:25px;overflow:hidden;}
-.switchBox input[type="checkbox"]{position:absolute;visibility:hidden;}
-.switchBox label{display:block;position:absolute;top:0;width:60px;height:28px;background-color:#aaa;transition-duration:0.2s;}
-.switchBox label span{position:absolute;left:0;top:50%;z-index:1;width:26px;height:23px;border-radius:25px;transform:translate(3px, -50%);transition-duration:0.2s;background-color:#fff;text-indent:-9999px;}
-.switchBox label:before,label:after{position:absolute;top:0;width:52%;font-size:11px;line-height:27px;color:#fff;text-align:center;}
-.switchBox label:before{left:0;content:'ON';}
-.switchBox label:after{right:0;content:'OFF';}
-.switchBox input:checked + label span{transform:translate(31px, -50%);}
-.switchBox input:checked::before, .switchBox input:checked::after{border:none}
-.switch-base input:checked + label{color:#fff; background-color:#8597eb;}
-.switch-primary input:checked + label{color:#fff; background-color:#1ab394;}
-.switch-success input:checked + label{color:#fff; background-color:#1c84c6;}
-.switch-info input:checked + label{color:#fff; background-color:#23c6c8; }
-.switch-warning input:checked + label{color:#fff; background-color:#f8ac59;}
-.switch-danger input:checked + label{color:#fff; background-color:#ed5565;}
-.switch-black input:checked + label{color:#fff; background-color:#222;}
-.switchBox + .switchBox {margin-left:6px;}
-
-/* 테이블 스타일--------------- */
-.tableStyle {width:100%; max-width:100%; margin-bottom:15px;}
-.tableStyle th {position:relative; padding:7px 0; color:#333; border-top:1px solid #dae0fd; border-bottom:1px solid #dae0fd; border-right:1px solid #dae0fd; background-color:#e9ecfb; text-align:center;}
-.tableStyle th:last-child {border-right:none;}
-.tableStyle td {position:relative; padding:7px 0; border-right:1px solid #ebebeb; border-bottom:1px solid #ebebeb; text-align:center;}
-.tableStyle td:last-child {border-right:none;}
-.tableStyle tbody tr:nth-of-type(2n) {background-color:rgba(0, 0, 0, 0.02);}
-.tableStyle tbody tr:hover {background-color:rgba(224,243,255,0.6);}
-.tableStyle + .panelBar {padding-bottom:15px;}
-/* 스캔 */
-.scanTbl th {font-size:25px; line-height:80px;}
-.scanTbl td {line-height:80px;}
-.scanTbl input[type=text] {line-height:50px; font-size:32px;}
-.scanTbl .btn {overflow-y:hidden; margin-bottom:1px; padding:12px 30px; font-size:25px;}
-table.noPad tr > td, td.noPad {padding:0 !important;}
-th[rowspan] {border-bottom:1px solid #dae0fd;}
-td[rowspan] {border-bottom:1px solid #eee;}
-.nowrap {white-space:nowrap;}
-.solidR {border-right:1px solid #eee; vertical-align:middle;}
-.solidL {border-left:1px solid #eee; vertical-align:middle;}
-.solidT {border-top:1px solid #eee;}
-.solidB {border-bottom:1px solid #eee;}
-.dashR {border-right:1px solid #dae0fd;}
-.dashL {border-left:1px solid #dae0fd;}
-.noPad table.frmStyle > tr:first-child th {border-top:0 !important;}
-.noPad table.frmStyle > tr:first-child td {border-top:0 !important;}
-.noPad table.frmStyle > tr:last-child th {border-bottom:0 !important;}
-.noPad table.frmStyle > tr:last-child td {border-bottom:0 !important;}
-
-
-/* Q&A 스타일--------------- */
-.qnaStyle {width:100%; max-width:100%;}
-.qnaStyle th {position:relative; padding:7px 0; color:#333; border-top:1px solid #dae0fd; border-bottom:1px solid #dae0fd; border-right:1px solid #dae0fd; background-color:#e9ecfb; text-align:center;}
-.qnaStyle th:last-child {border-right:none;}
-.qnaStyle td {position:relative; padding:7px 0; text-align:center;}
-.qnaStyle tr td {border-bottom:1px solid #ecf5f7;}
-.qnaStyle tbody tr:nth-of-type(3n+1) td {background-color:rgba(224,243,255,0.6);}
-.qnaStyle tbody tr:nth-of-type(3n) td {border-bottom:1px solid #ddd;}
-.qnaClaim { text-align:left !important; padding-left:10px !important;}
-.qnaClaim .goods {font-weight:bold; line-height:26px;}
-.qnaClaim .cont {line-height:22px; padding:10px 0; color:#1d3e9d;}
-.qnaClaim .email {line-height:26px;}
-.qnaClaim .email em {border-bottom:1px solid #aaa;}
-.lineRound {border:2px solid #ccc; border-radius:15px; padding:4px 14px; font-weight:bold;}
-
-/* 내부 테이블 디자인 */
-.subTable {display:table; width:100%;}
-.subTable dl {display:table; width:100%;}
-.subTable dt, .subTable dd {display:table-cell;}
-.subTable dt {vertical-align:middle; white-space:nowrap; width:8%; padding:0 15px; background:#e9ecfb; text-align:center; border-bottom:1px solid #dae0fd;}
-.subTable dl:last-child dt {border-bottom:none;}
-.subTable dd {border-bottom:1px solid #eee; padding:3px 20px 3px 10px;}
-.subTable dl:last-child dd {border-bottom:none;}
-
-/* button --------------- */
-.btn {border-radius:3px; vertical-align:middle; white-space:nowrap;font-size:12px;user-select:none;}
-.btn-lg {padding:4px 20px 5px; height:28px; overflow-y:hidden;}
-.btn-sm {margin-top:-2px; line-height:100%; height:28px; overflow-y:hidden;}
-.btn-ssm {margin-top:-2px; line-height:100%; height:22px; overflow-y:hidden;}
-.btn + .btn {margin-left:6px;}
-.btn:first-child {margin-left:0;}
-
-/* 버튼 색상 */
-.btn-white {color:#555 !important; background-color:#fff !important; border:1px solid #ccc !important;}
-.btn-default {color:#555; background-color:#eee; border:1px solid #dcdcdc;}
-.btn-gray {color:#fff; background-color:#aaa; border:1px solid #aaa;}
-.btn-base {color:#fff; background-color:#8597eb; border:1px solid #8597eb;}
-.btn-primary {color:#fff; background-color:#1ab394; border:1px solid #1ab394;}
-.btn-success {color:#fff; background-color:#1c84c6; border:1px solid #1c84c6;}
-.btn-info {color:#fff; background-color:#23c6c8; border:1px solid #23c6c8;}
-.btn-pink {color:#fff; background-color:#feada6; border:1px solid #feada6;}
-.btn-warning {color:#fff; background-color:#f8ac59; border:1px solid #f8ac59;}
-.btn-danger {color:#fff; background-color:#ed5565; border:1px solid #ed5565;}
-.btn-dark {color:#fff; background-color:#6c757d; border:1px solid #6c757d;}
-.btn.icn {line-height:28px; height:28px; padding:0 8px; background-color:#eee; border:1px solid #dbdbdb;}
-.btn.icn i {padding-top:6px; width:12px; vertical-align:top; font-size:14px; text-align:center;}
-
-/* 페이징 --------------- */
-.tablePaging {position:relative; 	display:inline-block; vertical-align:middle;}
-.tablePaging a {display:inline-block; float:left; margin:0 5px; width:28px; height:28px; line-height:28px; text-align:center; border:1px solid #ccc; border-radius:50px; cursor:pointer;}
-.tablePaging a.arrow {background-color:rgba(0, 0, 0, 0.03); 	border-color:#ebebeb;}
-.tablePaging .num.on {background:#8597eb; color:#fff; border-color:#8597eb;}
-
-/* 다중 Select Box */
-.mSelectWrap select {display:none;}
-.mSelectBox {display:inline-block; position:relative; top:-1px; margin:2px 0 2px 0; padding:0 7px 0 0; width:100%; height:auto !important; min-height:29px; border:1px solid #e5e6e7; vertical-align:middle;}
-.mSelected {overflow:auto;}
-.mSelected li {float:left; margin:2px 5px 3px; line-height:24px; padding:0 7px; background:#dbedf9; -ms-user-select:none; -moz-user-select:-moz-none; -webkit-user-select:none; user-select:none;}
-.mSelected li.srchFld {margin:0; padding:0; background:none;}
-.mSelected .srchFld input {width:25px; margin:0; padding:0; border:none; outline:none;}
-.mSelected a {border:none !important; float:right; margin-left:3px; padding:0 3px; width:15px; line-height:22px; text-indent:-9999px; background:url('../../image/btn_sltClose.png') no-repeat 100% 50%;}
-.mSelected a:hover {background:url('../../image/btn_sltCloseOn.png') no-repeat 100% 50%;}
-.mSelecting {display:none; overflow-y:auto; overflow-x:hidden; position:absolute; top:100%; left:-1px; z-index:1; width:100%; max-height:156px; line-height:30px; border:1px solid #e5e6e7; background:#fff;}
-.mSelecting li {margin:0 10px; cursor:pointer;}
-
-/* 멀티 Select Box */
-.mSelWrap {display:inline-block;}
-.mSelWrap select {height:100px; padding:7px 0;}
-.mSelWrap .mSelBtn {margin:0 0 0 5px; float:right; width:33px; vertical-align:top;}
-.mSelWrap .mSelBtn .btn {margin:0; vertical-align:top;}
-.mSelWrap option {padding:4px 100px 4px 10px;}
-
-/* 파일첨부 --------------- */
-.uFile {overflow:hidden; position:relative; display:inline-block; margin:-2px 5px 0 0; width:80%; height:28px; vertical-align:middle; border:1px solid #dbdbdb;}
-.lrStyle .uFile {margin-top:2px;}
-.uFileInput {position:absolute; top:0; width:100%; margin:0 !important; padding:0 !important; line-height:28px; border:none !important;}
-.uFileLabel {position:absolute; top:0; right:0; left:0; z-index:1; margin:0; padding:0 7px; width:cals(100% - 7px); line-height:28px; height:28px; background-color:#fff; border-radius:1px; overflow:hidden; white-space:nowrap;}
-.uFileLabel::after {position:absolute; top:0; right:0; bottom:0; width:30px; z-index:3; line-height:28px; content:" "; border-left:1px solid #dbdbdb; background:#eee url('../../image/icon_upload.png') no-repeat 50% 50%;}
-
-/* badge --------------- */
-.badge {float:right; margin-top:2px; padding:0 5px; min-width:9px; line-height:18px; color:#fff; font-size:12px; font-weight:600; border-radius:3px; text-align:center; text-shadow:1px 1px 1px rgba(0,0,0,0.4); letter-spacing:-0.5px;}
-.badge-warning {background-color:#ed7908;}
-.badge-primary {background-color:#1ab394;}
-.badge-danger {background-color:#ed5565;}
-.badge-success {background-color:#2fa4e7;}
-.badge-info {background-color:#23c6c8;}
-.badge.circle {border-radius:50px;}
-.dep3 .badge {position:relative; top:-28px; right:20px;}
-
-/* tag */
-.tagNum {display:inline-block; margin-left:5px; padding:0 3px 0 2px; min-width:13px; line-height:16px; font-weight:normal; color:#fc5555; background:#fff; border-radius:5px;}
-
-/* footer --------------- */
-footer {position:absolute; bottom:0; left:0; width:100%; height:40px; background-color:#fff; border-top:1px solid #e7eaec; line-height:39px; font-size:13px;}
-footer .f-left {float:left; padding-left:20px; line-height:38px;}
-footer .f-right {float:right; padding-right:20px; line-height:38px;}
-
-/* 이미지 카드 */
-.dexterArea {min-width:350px; min-height:180px; padding:0 !important; vertical-align:top; background:#f1f1f1; vertical-align:top;}
-.dexterTable {display:table; width:100%; overflow-y:auto;}
-.dexterTable > li {display:table-cell; vertical-align:top; line-height:30px;}
-.dexterNo div {padding:0 10px; border-top:1px solid #ddd; border-right:1px solid #ddd; background:#fff;}
-.dexterNo div:first-child {margin-top:36px;}
-.dexterNo div:last-child {border-bottom:1px solid #ddd;}
-
-/* 수정용 이미지 카드 */
-.cardArea {width:100%; padding:0 0 20px; overflow-y:auto;}
-.imgCard {vertical-align:top; position:relative; display:inline-block; margin:20px 20px 0 0; padding:10px 10px 0 10px; border:1px solid #dbdbdb;}
-.imgCard ul {display:table;}
-.imgCard li {display:table-cell;}
-.imgCard img {margin-right:15px;}
-.imgCard li:nth-of-type(2) {padding-top:20px; max-width:150px; line-height:24px}
-.imgCard p {font-size:12px;}
-.imgCard .cardClose {position:absolute; top:0; right:0; background:url('../../image/btn_sltClose.png') no-repeat 50% 50%; text-indent:-9999px;}
-.imgCard .cardClose:hover {background:#f1f1f1 url('../../image/btn_sltCloseOn.png') no-repeat 10px 50%;}
-.verticalTop {vertical-align:top;}
-
-/* 조회용 이미지 카드 */
-.cardArea2 {padding:10px 0;}
-.cardArea2 ul, .cardArea2 .box {vertical-align:top; position:relative; display:inline-block; margin:10px; border:1px solid #dbdbdb; max-width:300px;}
-.cardArea2 li {display:table-cell; line-height:26px; vertical-align:middle;}
-.cardArea2 li:nth-of-type(2) {padding:0 10px;}
-.cardArea2 .cardDel {position:absolute; top:0; right:0; background:url('../../image/btn_sltClose.png') no-repeat 50% 50%; text-indent:-9999px;}
-.cardArea2 .cardDel:hover {background:#f1f1f1 url('../../image/btn_sltCloseOn.png') no-repeat 50% 50%;}
-
-/* 테이블 외부 안내문구 */
-.panelStyle > .notice {margin:0 0 15px ;}
-.panelContent > .notice {margin:15px 0;}
-.notice em {color:red;}
-.notice li, p.dot {padding-left:20px; background:url('../../image/dot_bk.png') no-repeat 5px 10px; line-height:24px;}
-p.dot .btn {margin-left:10px !important;}
-p.dot em {color:red;}
-
-/* 정렬 */
-.txt {line-height:36px;}
-.aC {text-align:center !important;}
-.aR {text-align:right !important;}
-.aL {text-align:left !important;}
-.vaT {vertical-align:top !important;}
-.vaM {vertical-align:middle !important;}
-.vaB {vertical-align:bottom !important;}
-
-/* 테이블 내부 안내문구 */
-.infoTxt {line-height:26px; padding:5px 0;}
-.infoTxt i {margin-right:7px;}
-.infoTxt em {color:red;}
-.infoTxtTh {display:inline-block; text-align:left; font-weight:normal; font-size:12px;}
-.infoTxtTh li {padding-top:3px;}
-.infoTxtTh i {padding-right:5px;}
-.srchOption {overflow:auto; padding:10px 0; line-height:36px;}
-
-/* 유의사항 안내 */
-.infoBox {margin:0 20px 20px; padding:7px 10px; border-top:2px solid #dfe2e3; border-bottom:2px solid #dfe2e3; background:#fff}
-.infoBox p {padding-left:25px; line-height:20px; font-size:12px; background:url('../../image/dot_bk.png') no-repeat 10px 50%; background-size:3px auto;}
-
-/* 검색결과 안내문 */
-.srchNotice {padding-bottom:7px; font-weight:normal; font-size:14px;}
-.srchNotice em {color:red;}
-
-/* 필수입력항목 */
-.required {display:inline-block; position:relative; top:-3px; width:12px; height:7px; background:url('../../image/icon_required.png') no-repeat 0 50%;}
-
-
-/* COLOR DESIGN -------------------------------------*/
-/*Color :Base ---*/
-.color-mPurple header,span.color-mPurple {background:linear-gradient(135deg,#667eea 0,#764ba2 100%) !important;}
-.color-purple header,span.color-purple {background:#667eea !important;}
-
-/*Color :Gray ---*/
-.color-mGray header,span.color-mGray {background:linear-gradient(to right,#6c757d 0%,#555 100%) !important;}
-.color-gray header,span.color-gray {background:#666 !important;}
-.color-mGray .frmStyle th,.color-mGray .tableStyle th,.color-gray .frmStyle th,.color-gray .tableStyle th {background:#eee !important; 	border-top:1px solid #ddd; 	border-bottom:1px solid #ddd;}
-.color-mGray .tablePaging .num.on,.color-gray .tablePaging .num.on {background:#888 !important; 	border-color:#888 !important;}
-.color-mGray #lnb .dep3,.color-gray #lnb .dep3 {border-color:#777 !important;}
-.color-mGray .tabsJrNav li.on a,.color-gray .tabsJrNav li.on a {color:#333;}
-
-/*Color :Blue ---*/
-.color-mBlue header,span.color-mBlue {background:linear-gradient(to right,#4481eb 0%,#04befe 100%) !important;}
-.color-blue header,span.color-blue {background:#0042a5 !important;}
-.color-mBlue .frmStyle th,.color-mBlue .tableStyle th,.color-blue .frmStyle th,.color-blue .tableStyle th {background:#d8eafc !important; 	border-top:1px solid #ddd; 	border-bottom:1px solid #ddd;}
-.color-mBlue .tablePaging .num.on,.color-blue .tablePaging .num.on {background:#3e91de !important; 	border-color:#3e91de !important;}
-.color-mBlue #lnb .dep3,.color-blue #lnb .dep3 {border-color:#3e91de !important;}
-.color-mBlue .tabsJrNav li.on a,.color-blue .tabsJrNav li.on a {background:#d8eafc;}
-.color-mBlue .tabJr.on,.color-blue .tabJr.on {border-top:4px solid #d8eafc;}
-.color-mBlue .tabsJrNav li.on a,.color-blue .tabsJrNav li.on a {color:#333;}
-
-/*Color :Green ---*/
-.color-mGreen header,span.color-mGreen {background:linear-gradient(135deg,#00b09b 0,#96c93d 100%) !important;}
-.color-green header,span.color-green {background:#00b09b !important;}
-.color-mGreen .frmStyle th,.color-mGreen .tableStyle th,.color-green .frmStyle th,.color-green .tableStyle th {background:#e5f7f5 !important; 	border-top:1px solid #ddd; 	border-bottom:1px solid #ddd;}
-.color-mGreen .tablePaging .num.on,.color-green .tablePaging .num.on {background:rgba(0,176,155,0.8); 	border-color:rgba(0,176,155,0.8) !important;}
-.color-mGreen #lnb .dep3,.color-green #lnb .dep3 {border-color:#00b09b !important;}
-.color-mGreen .tabsJrNav li.on a,.color-green .tabsJrNav li.on a {background:#e5f7f5;}
-.color-mGreen .tabJr.on,.color-green .tabJr.on {border-top:4px solid #e5f7f5;}
-.color-mGreen .tabsJrNav li.on a,.color-green .tabsJrNav li.on a {color:#333;}
-
-/*Color :Pink ---*/
-.color-mPink header,span.color-mPink {background:linear-gradient(to right, rgb(242, 112, 156), rgb(255, 148, 114)) !important;}
-.color-pink header,span.color-pink {background:#feada6 !important;}
-.color-mPink .frmStyle th,.color-mPink .tableStyle th,.color-pink .frmStyle th,.color-pink .tableStyle th {background:#fff7f6 !important; border-top:1px solid #ddd; border-bottom:1px solid #ddd;}
-.color-mPink .tablePaging .num.on,.color-pink .tablePaging .num.on {background:#feada6; 	border-color:#feada6 !important;}
-.color-mPink #lnb .dep3,.color-pink #lnb .dep3 {border-color:#feada6 !important;}
-.color-mPink .tabsJrNav li.on a,.color-pink .tabsJrNav li.on a {background:#fff7f6;}
-.color-mPink .tabJr.on,.color-pink .tabJr.on {border-top:4px solid #fff7f6;}
-.color-mPink .tabsJrNav li.on a,
-.color-pink .tabsJrNav li.on a {color:#333;}
-
-/*Color :black ---*/
-.color-black header, span.color-black{background:#3E3E3E !important;}
-.color-black .header-logo{background:#000 !important;}
-.color-black .header-menu .menu a{background:#000 !important;}
-.color-black .header-menu .menu a.on{background:#fff !important; color:#000 !important;}
-.color-black #lnb-wrapper{background-color:#b2b2b2 !important;}
-.color-black #lnb .dep2{background-color:#545454 !important;}
-.color-black #lnb .dep3{border-color:#000 !important;}
-.color-black #lnb .dep3{background:#fdfdfd !important;  }
-.color-black #lnb .dep3 a{color:#111111 !important;}
-.color-black #lnb a{color:#fff !important;}
-.color-black .frmStyle th, .color-black .tableStyle th, .color-black .frmStyle th, .color-black .tableStyle th{background:#eee !important; 	border-top:1px solid #ddd; border-bottom:1px solid #ddd;}
-.color-black .tablePaging .num.on, .color-black .tablePaging .num.on{background:#888 !important; 	border-color:#888 !important;}
-.color-black .tabsJrNav li.on a, .color-black .tabsJrNav li.on a{color:#333; background:#eee !important}
-.color-black .tabJr.on, .color-black .tabJr.on { border-top:4px solid #eee;}
-
-/* 폰트 컬러, 폰트 두께 */
-.cBlue {color:#127fdc !important;}
-.cGray {color:#666 !important;}
-.cRed {color:red !important;}
-.bold {font-weight:bold !important;}
-
-/* 배경 투명도 */
-.bgOp6 {opacity:0.6; color:#000 !important;}
-
-/* 여백 지정 */
-hr {border:0; padding-bottom:10px;}/* 기본 여백 :10px */
-.pad10 {padding:10px 0 !important;}
-.pad15 {padding:15px 0 !important;}
-.pad20 {padding:20px 0 !important;}
-.padT3 {padding-top:3px !important;}
-.padT5 {padding-top:5px !important;}
-.padT10 {padding-top:10px !important;}
-.padT15 {padding-top:15px !important;}
-.padT20 {padding-top:20px !important;}
-.padT30 {padding-top:30px !important;}
-.padT40 {padding-top:40px !important;}
-.padR20 {padding-right:20px !important;}
-.padL10 {padding-left:10px !important;}
-.padB5 {padding-bottom:5px !important;}
-.padB10 {padding-bottom:10px !important;}
-.padB15 {padding-bottom:15px !important;}
-.padB20 {padding-bottom:20px !important;}
-.padB30 {padding-bottom:30px !important;}
-.padB40 {padding-bottom:40px !important;}
-.marT5 {margin-top:5px !important;}
-.marT10 {margin-top:10px !important;}
-.marT15 {margin-top:15px !important;}
-.marT20 {margin-top:20px !important;}
-.marR3 {margin-right:3px !important;}
-.marL5 {margin-left:5px !important;}
-.marL10 {margin-left:10px !important;}
-.marL20 {margin-left:20px !important;}
-.marR10 {margin-right:10px !important;}
-.marR20 {margin-right:20px !important;}
-
-/* 넓이 지정 --------------- */
-.w20 {width:20px !important;}
-.w50 {width:50px !important;}
-.w60 {width:60px !important;}
-.w70 {width:60px !important;}
-.w80 {width:80px !important;}
-.w90 {width:80px !important;}
-.w100 {width:100px !important;}
-.w130 {width:130px !important;}
-.w150 {width:150px !important;}
-.w200 {width:200px !important;}
-.w300 {width:300px !important;}
-.w400 {width:400px !important;}
-.w500 {width:500px !important;}
-.w600 {width:600px !important;}
-.w800 {width:800px !important;}
-.w100p {width:100% !important;}
-.w90p {width:90% !important;}
-.w80p {width:80% !important;}
-.w70p {width:70% !important;}
-.w60p {width:60% !important;}
-.w50p {width:50% !important;}
-.w40p {width:40% !important;}
-.w30p {width:30% !important;}
-.w20p {width:20% !important;}
-.h100 {height:100px !important;} /*alert, confirm 컨텐츠 높이에 사용*/
-
-
-/*-- 캘린더 --------------*/
-#calendar {max-width:900px; margin:20px 0 50px 20px;}
-
-/*-- error page --------------*/
-#errPage {padding-top:40px; width:650px; background:#fff; position:relative; top:48%; left:50%; transform:translate(-50%,-50%); -ms-transform:translate(-50%,-50%); border-radius:9px; vertical-align:middle; overflow:hidden; box-shadow:0 0 2px 0 rgba(0,0,0,0.12), 0 2px 2px 0 rgba(0,0,0,0.24);}
-#errPage .errImg {padding-left:50px; display:table-cell; vertical-align:middle; padding-bottom:30px;}
-#errPage .errImg div {border-radius:50%; position:relative; display:inline-block; width:140px; height:140px; color:#fff; background:#d196e4; box-shadow:2px 2px 6px 0 rgba(0,0,0,0.2) inset;}
-#errPage .fa-television {position:absolute; top:30px; left:28px; font-weight:bold; font-size:80px;}
-#errPage .fa-info {position:absolute; top:49px; left:66px; font-size:34px;}
-#errPage .errTxt {padding:0 50px; display:table-cell; padding-bottom:40px;}
-#errPage .errTxt .ttl {font-size:16px; font-weight:bold; padding-bottom:20px;}
-#errPage .errTxt .cont { padding-bottom:20px; line-height:26px;}
-#errPage .errTxt .tel {color:#777;}
-#errPage .errBtn {width:100%; background:#f9f9fa; line-height:70px; text-align:right;}
-#errPage .errBtn .btn {margin-right:30px; border-radius:33px; background:#858b90; color:#fff; padding:5px 30px; line-height:24px; font-weight:bold; -webkit-transition:0.2s; transition:0.2s;}
-#errPage .errBtn .btn:hover {background:#555;}
-
-/*-- DEXTER --------------*/
-.dexterNo { width:43px;}
-.dexterNo div { padding:0 10px; border-top:1px solid #ddd; border-right:1px solid #ddd; background:#fff; text-align:right;}
-.dexterNo div:first-child {margin-top:28px;}
-
-/*-- 회원추가 --------------*/
-.memAddWrap {line-height:26px; padding:3px 0;}
-.memAdd {margin-right:15px; padding:2px 27px 2px 0; position:relative; line-height:24px; height:24px; white-space:nowrap;}
-.memAdd button {position:absolute; top:3px; right:0; bottom:0; width:18px; height:18px; border:1px solid #dbdbdb; border-radius:3px; text-indent:-9999px; background:#eee url('../../image/btn_sltClose.png') no-repeat 50% 50%;}
-.memAdd button:hover {background:#eee url('../../image/btn_sltCloseOn.png') no-repeat 50% 50%;}
-
-/*-- Date Picker --------------*/ /* 20200521 수정 */
-table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
-.mtz-monthpicker-month {padding:7px; cursor:pointer;}
-.ui-datepicker-trigger {padding:0;}
-.ui-datepicker {z-index:800 !important; text-align:center; background:#fff;}
-.ui-datepicker .ui-datepicker-today,
-.ui-datepicker .ui-state-highlight {background:#fff7cf !important;}
-.ui-datepicker .ui-state-active {border:1px solid red !important;}
-.ui-datepicker .ui-datepicker-prev {position:absolute; top:3px; left:3px; width:30px; line-height:30px; text-indent:-9999px; background:url('../../image/icon_prev.png') no-repeat 50% 50%;}
-.ui-datepicker .ui-datepicker-next {position:absolute; top:3px; right:3px; width:30px; line-height:30px; text-indent:-9999px; background:url('../../image/icon_next.png') no-repeat 50% 50%;}
-.ui-datepicker .ui-datepicker-calendar {padding:5px; border:1px solid #ddd; border-top:none; text-align:center;}
-.ui-datepicker .ui-datepicker-calendar th{padding:5px 0}
-.ui-datepicker-week-end {text-align:center;}
-.ui-datepicker-calendar .ui-state-default {display:inline-block; text-align:center; width:32px; line-height:24px; border:none;}
-.ui-datepicker-header {position:relative; background:#d0e9ff; text-align:center; padding:5px; border:1px solid #ddd; border-bottom:none;}
-.ui-datepicker-buttonpane button {background-color:#eee; border:1px solid #dcdcdc; line-height:24px; border-radius:3px; margin:0 5px 5px 5px;}
-.ui-datepicker-current {float:left;}
-.ui-datepicker-close {float:right;}
-
-/* prograss bar */
-.prograssWrap {display:flex; flex-direction:row;}
-.prograssWrap > li {display:flex; align-items:center;}
-.prograssWrap > li:nth-of-type(1) {width:96%}
-.prograssWrap > li:nth-of-type(2) {margin-left:1.5rem !important}
-.prograss-lg {display:flex; width:100%; height:1rem; background-color:#f4f5fd; border-radius:.65rem; overflow:hidden; box-shadow:inset 0 1px 2px rgba(0,0,0,.1);}
-.prograss-sm {display:flex; width:100%; height:.5rem; background-color:#f4f5fd; border-radius:.65rem; overflow:hidden; box-shadow:inset 0 1px 2px rgba(0,0,0,.1);}
-.prograss-bar {display:flex; border-top-right-radius:.65rem; border-bottom-right-radius:.65rem; transition:width .6s ease;}
-.prograss-bar.bg-info {background-color:#11c5db;}
-.prograss-txt.bg-info {color:#11c5db; font-weight:bold;}
-.prograss-bar.bg-success {background-color:#1bc943;}
-.prograss-txt.bg-success {color:#1bc943; font-weight:bold;}
-.prograss-bar.bg-danger {background-color:#f83245;}
-.prograss-txt.bg-danger {color:#f83245; font-weight:bold;}
-.prograss-bar.bg-base {background:linear-gradient(135deg,#667eea 0,#764ba2 100%);}
-.prograss-txt.bg-base {color:#8597eb; font-weight:bold;}
-
-/* Multi CheckBox */
-.multiCheckBox {position:relative; display:inline-block; width:auto; line-height:27px; margin:3px 3px 3px 0;}
-.multiCheckBox .sltBtn {padding-left:5px; width:100%; height:27px; color:#555; text-align:left; border:1px solid #dbdbdb; box-sizing:border-box; -webkit-touch-callout:none; -webkit-user-select:none; -ms-user-select:none; user-select:none;}
-.multiCheckBox .sltBtn::after {position:absolute; top:6px; right:10px; content:''; width:7px; height:7px; border-bottom:1px solid #555; border-left:1px solid #555; -webkit-transform:rotate(-45deg); transform:rotate(-45deg);}
-.multiCheckBox .sltBtn.on::after {top:10px; -webkit-transform:rotate(135deg); transform:rotate(135deg);}
-.multiCheckBox ul {display:none; position:absolute; top:26px; left:0; z-index:1; width:100%; height:auto; border:1px solid #dbdbdb; background:#fff;}
-.multiCheckBox li {padding:3px 10px;}
-.multiCheckBox li:hover {background-color:Highlight; color:HighlightText;}
-.multiCheckBox label {display:flex;}
-
-/* checkBox More */
-.checkBoxList {overflow:hidden; padding-right:36px; height:36px;}
-.checkBoxList.on {overflow:visible; height:auto;}
-.checkBoxList .more {position:absolute; top:-1px; right:0; width:36px; height:38px; border:1px solid #eee; background:#f7f7f7;}
-.checkBoxList ul {display:flex; flex-wrap:wrap;}
-.checkBoxList li {justify-content:flex-start; line-height:36px;}
-.checkBoxList[data-unit='1'] li {flex-basis:100%;}
-.checkBoxList[data-unit='2'] li {flex-basis:50%;}
-.checkBoxList[data-unit='3'] li {flex-basis:33%;}
-.checkBoxList[data-unit='4'] li {flex-basis:25%;}
-.checkBoxList[data-unit='5'] li {flex-basis:20%;}
-.checkBoxList[data-unit='6'] li {flex-basis:16.6%;}
-.checkBoxList[data-unit='7'] li {flex-basis:14.2%;}
-.checkBoxList[data-unit='8'] li {flex-basis:12.5%;}
-
-/* 아이콘 툴팁 버튼 */
-.iconTooltip {display:inline-block; position:relative; margin-right:10px;}
-.iconTooltip i {position:relative; color:#46a1ff; width:15px; height:15px; line-height:16px; border-radius:50%; border:1px solid #46a1ff; cursor:pointer; text-align:center;}
-.iconTooltip:hover i {box-shadow:0px 3px 7px 0px rgba(0,0,0,0.4);}
-.iconTooltip span {display:none; position:absolute; top:36px; z-index:5; padding:10px 15px; line-height:24px; color:#fff; background:#6d6d6d; box-shadow:0px 3px 7px 0px rgba(0,0,0,0.2); border-radius:5px;}
-.iconTooltip span:after {position:absolute; top:-4px; content:''; background:#6d6d6d; width:8px; height:8px; -ms-transform:rotate(-45deg); -webkit-transform:rotate(-45deg); transform:rotate(-45deg);}
-.iconTooltip span.left {left:-10px}
-.iconTooltip span.left:after {left:15px;}
-.iconTooltip span.right {right:-10px}
-.iconTooltip span.right:after {right:15px;}
-.iconTooltip span.center {left:50%;}
-.iconTooltip span.center:after {right:5px;}
-.iconTooltip:hover span{display:block;}
-
-/* 상품이동 */
-.itemMove {display:inline-block; width:800px; border:1px solid #eee;}
-.itemMove .item {float:left; display:table; margin:0 10px 20px 0; width:220px; border:1px solid #eee;}
-.itemMove .item li {display:table-cell; vertical-align:top;}
-.itemMove .item li:nth-of-type(1) {width:80px;}
-.itemMove .item li:nth-of-type(1) img {width:80px; height:80px;}
-.itemMove .item button {width:16px; height:16px; text-indent:-9999px;}
-.itemMove .item input {width:30px; height:14px !important; line-height:14px}
-.itemMove .item li:nth-of-type(2) div {line-height:20px}
-
-/* 상품 Dragable :20200129 */
-.sortableWrap #sortable { overflow-y:auto }
-.sortableWrap {margin:20px 0; width:100%; max-height:675px;}
-.sortableWrap .itemWrap {display:inline-block;}
-.sortableWrap .item {float:left; margin-right:12px; margin-bottom:12px; padding:5px 8px; line-height:20px; border:1px solid #ddd; vertical-align:top; background:#fff;}
-.sortableWrap .item > li {float:left; vertical-align:middle;}
-.sortableWrap .item .img {margin-top:3px; margin-right:10px; width:80px;}
-.sortableWrap .item .img img {width:80px; height:80px; cursor:move;}
-.sortableWrap .btnArea {text-align:center; margin-top:15px; padding:0 10px;}
-.sortableWrap button.icnSm {overflow:hidden; position:relative; width:24px; height:20px; background-color:#fff;}
-.sortableWrap button.icnSm i {position:absolute; top:-4px; left:-3px; width:24px; line-height:24px; font-size:15px; color:#888;}
-.sortableWrap button.icnSm:hover i {color:#111;}
-.sortableWrap button.icnSm:last-child {margin-right:0;}
-.sortableWrap .item .cont {width:114px;}
-.sortableWrap .item .cont li em {margin:0 3px 0 7px;}
-.sortableWrap .item .cont .no {font-weight:bold; padding-bottom:3px;}
-.sortableWrap .item .cont .title {padding-bottom:3px; border-bottom:1px solid #eee;}
-.sortableWrap .item .cont .price {padding-top:3px; padding-bottom:3px;}
-.sortableWrap .item .cont input {margin-left:5px; width:37px;}
-
-
-.ag-theme-balham.lh60 .ag-cell {line-height:60px !important; height:60px;}
-.ag-theme-balham.lh70 .ag-cell {line-height:70px !important; height:70px;}
-.ag-theme-balham.lh80 .ag-cell {line-height:80px !important; height:80px;}
-.ag-theme-balham.lh90 .ag-cell {line-height:90px !important; height:90px;}
-.ag-theme-balham.lh100 .ag-cell {line-height:100px !important; height:100px;}
-.ag-theme-balham.lh110 .ag-cell {line-height:110px !important; height:110px;}
-.ag-theme-balham.lh120 .ag-cell {line-height:120px !important; height:120px;}
-
-
-/* 테이블 상품명 클릭시 이미지 레이어 활성화 */
-.viewImg {position:relative; color:blue; cursor:pointer}
-.thumbLayer {display:inline-block; position:absolute; top:0; right:0; z-index:5; border:1px solid #ddd}
-.thumbLayer img {width:100%; height:auto;}
-
-/* dashboard */
-.flexWrap{display:-ms-flexbox; display:flex; -ms-flex-wrap:wrap; flex-wrap:wrap; color:#676a6c;}
-.flexWrap li{padding:0 20px 20px; width:calc(33.3%);}
-.flexWrap.unit4 li{width:calc(25%);}
-.flexWrap.unit5 li{width:calc(20%);}
-.flexWrap.unit6 li{width:calc(16.6%);}
-.flexWrap .title{padding:15px; font-weight:600; border:1px solid #e7eaec; border-top:2px solid #e7eaec;}
-.flexWrap .title h5{font-size:15px; font-weight:bold;}
-.flexWrap .title span{float:right; padding:1px 8px; font-size:10px; border-radius:0.25em;}
-.flexWrap .content{padding:15px; border:1px solid #e7eaec; border-top:none;}
-.flexWrap .content em{font-size:30px; font-weight:200;}
-.statText {margin-top:5px}
-.statText::after{display:block; clear:both; content:''}
-.statText span:nth-of-type(1){float:left; font-size:11px;}
-.statText span:nth-of-type(2){float:right; font-size:13px; font-weight:600;}
-.txt-success{color:#1c84c6;}
-.txt-info{color:#23c6c8;}
-.flexWrap .txt-danger{color:#ed5565;}
-.flexWrap .bg-success{background:#1c84c6;}
-.flexWrap .bg-info{background:#23c6c8;}
-.flexWrap .bg-danger{background:#ed5565;}
-.btn.on{-webkit-box-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);}
-.dbChart .btn-group{float:right; line-height:37px;}
-.dbChart .btn-group button{margin:0; height:23px;}
-.dbChart .boxleft{float:left; margin:20px 15px 20px 15px; width:calc(100% - 490px);}
-.dbChart .boxRight{float:left; margin:20px 20px 20px 40px; width:400px;}
-.dbChart .boxRight em{font-size:24px; font-weight:200;}
-.dbChart .boxRight > div{margin-bottom:25px;}
-.dbChart .boxRight .statText .c1 {color:#FF7043}
-.dbChart .boxRight .progress .c1 {background:#FF7043}
-.dbChart .boxRight .statText .c2 {color:#48C9B0}
-.dbChart .boxRight .progress .c2 {background:#48C9B0}
-.dbChart .boxRight .statText .c3 {color:#ca9900}
-.dbChart .boxRight .progress .c3 {background:#FFD54F}
-.progress{display:-ms-flexbox; display:flex; margin-top:5px; height:1rem; overflow:hidden; font-size:.75rem; background-color:#e9ecef; border-radius:.25rem;}
-.progress-mini{height:5px; margin-bottom:0;}
-.progress > div{height:5px; margin-bottom:0; transition:width 0.3s;}
-
-
-/* 카테고리 Sort */
-.categoryOrder {margin-bottom:15px; background:#fcfcfc;}
-.categoryOrder li {clear:both; padding-left:15px; line-height:40px; cursor:move; border-top:1px dashed red; }
-.categoryOrder li button.on {background-image:url(../../image/icon_cate_minus.png);}
-/* .categoryOrder li:after {content:''; position:absolute; top:8px; left:-10px; width:21px; height:21px; background:url(../../image/line_cate.png)} */
-.categoryOrder li:before{position:relative; content:''; width:1px; height:100%; background:#ddd;}
-.categoryOrder li ol{display:none}
-/* .categoryOrder ol:last-child li {background-image:none !important} */
-.categoryOrder button{position:relative; z-index:200; padding:0 15px 0; margin:0; line-height:40px; cursor:pointer; background-image:url(../../image/icon_cate_plus.png); background-repeat:no-repeat; background-position:0 0;}
-
-
-
-/* 반응형:GNB 유저명,등급,로그아웃 --------------- */
-@media ( max-width:1370px ) {
- .header-info { display:none;}
- .header-info-sm { display:inline-block;}
-}
-
-/* 반응형 :dashboard(20200522) --------------- */
-@media ( max-width:1023px ) {
- /* 대시보드 */
- #wrapper.dashboard{width:100%; min-width:100%;}
- .dashboard .header-logo{width:100%}
- .dashboard #lnb-wrapper{display:none;}
- .dashboard .header-menu{display:none;}
- .dashboard .tabs{margin-left:0; margin-right:0;}
- .dashboard .tabs h2{position:relative; margin:10px 15px}
- .dashboard .tabsNav li:first-child{margin-left:0}
- .dashboard .tabsNav li:last-child{margin-right:0}
- .dashboard .tabsNav li a{font-size:16px}
- .dashboard .flexWrap li{width:100%}
- .dashboard .flexWrap.unit4 li{width:100%}
- .dashboard .flexWrap.unit5 li{width:100%}
- .dashboard .flexWrap.unit6 li{width:100%}
- .dashboard .boxStyle{margin-left:0; margin-right:0;}
- .dashboard .dbChart .boxleft{clear:left; margin:30px 15px 0 0; width:100%;}
- .dashboard .dbChart .boxRight{clear:right; width:100%; margin:30px 20px 20px;}
-}
-
-/* Fix Input Zoom on devices older than iPhone 5:*/
-@media screen and (device-aspect-ratio:2/3) {
-  select, textarea, input[type="text"], input[type="password"],
-  input[type="datetime"], input[type="datetime-local"],
-  input[type="date"], input[type="month"], input[type="time"],
-  input[type="week"], input[type="number"], input[type="email"],
-  input[type="url"]{ font-size:16px;}
-}
-
-/* Fix Input Zoom on iPhone 5, 5C, 5S, iPod Touch 5g */
-@media screen and (device-aspect-ratio:40/71) {
-  select, textarea, input[type="text"], input[type="password"],
-  input[type="datetime"], input[type="datetime-local"],
-  input[type="date"], input[type="month"], input[type="time"],
-  input[type="week"], input[type="number"], input[type="email"],
-  input[type="url"]{ font-size:16px;}
-}
-
-/* Fix Input Zoom on iPhone 6, iPhone 6s, iPhone 7 */
-@media screen and (device-aspect-ratio:375/667) {
-  select, textarea, input[type="text"], input[type="password"],
-  input[type="datetime"], input[type="datetime-local"],
-  input[type="date"], input[type="month"], input[type="time"],
-  input[type="week"], input[type="number"], input[type="email"],
-  input[type="url"]{ font-size:16px;}
-}
-
-/* Fix Input Zoom on iPhone 6 Plus, iPhone 6s Plus, iPhone 7 Plus, iPhone 8, iPhone X, XS, XS Max */
-@media screen and (device-aspect-ratio:9/16) {
-  select, textarea, input[type="text"], input[type="password"],
-  input[type="datetime"], input[type="datetime-local"],
-  input[type="date"], input[type="month"], input[type="time"],
-  input[type="week"], input[type="number"], input[type="email"],
-  input[type="url"]{ font-size:16px;}
+@import url("https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700"); @import url("https://fonts.googleapis.com/css?family=Roboto:400,300,500,700"); html,body {position:relative; height:100%;}
+html, body, header, div, ul, ol, li, dl, dt, dd, h1, h2, h3, h4, h5, h6, label, a, p, form, input, textarea, table, hr, span, em {margin:0; padding:0; box-sizing:border-box;}
+/* { } */
+body {overflow-x:hidden; font-family:"open sans", "Roboto", "Malgun Gothic", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size:12px; background-color:#f3f3f4;}
+h1, h2, h3, h4, h5, h6 {display:inline-block;}
+ul, ol {list-style:none;}
+ul::after, ol::after {display:block; clear:both; content:'';}
+img {vertical-align:middle; border-style:none;}
+a {text-decoration:none;}
+em, i {font-style:normal;}
+table {border-collapse:collapse;}
+th {text-align:inherit;}
+label {position:relative; margin-right:20px; display:inline-block; -webkit-touch-callout:none; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none;}
+label:last-child {margin-right:0 !important;}
+input,button,select,textarea {font-family:inherit; font-size:inherit;}
+input.btn-sm {padding:1px 6px;}
+input[type=text] {width:100%;}
+input[type=text], input[type=file], input[type=date], [type=password], textarea {padding:4px 3px 4px 5px; color:inherit; border-radius:1px; vertical-align:middle; margin:1px 3px 2px 0;}
+input[type=date],input[type=time],input[type=datetime-local],input[type=month] {-webkit-appearance:listbox;}
+input[readonly="readonly"], input[disabled="disabled"], input[readonly="readonly"]:before, input[disabled="disabled"]:before, select[readonly="readonly"], select[disabled="disabled"] {background-color:#eee !important;}
+button, select {text-transform:none;}
+button,[type=button],[type=reset],[type=submit] {margin:0; -webkit-appearance:button; border-radius:0; cursor:pointer; background-color:transparent; border-color:transparent;}
+button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner {padding:0; border-style:none;}
+textarea {overflow:auto; resize:vertical; width:100%; margin:4px 0; vertical-align:middle; line-height:22px; height:32px;}
+.textareaR2 {min-height:60px; line-height:26px;}
+.textareaR3 {min-height:96px; line-height:26px;}
+.textareaR4 {min-height:134px; line-height:26px;}
+.byteChk {line-height:20px; padding-left:20px; display:inline-block; vertical-align:middle;}
+select {margin:0 3px 1px 0; padding:3px 10px 3px 3px; color:inherit; border-radius:1px; vertical-align:middle;}
+select, input[type=text], input[type=file], input[type=date], input[type=password], textarea {border:1px solid #dbdbdb;}
+select:focus, input:focus, textarea:focus, button:focus, .outline {outline:2px auto #4D90FE;}
+.formControl {background:#eee;}
+.off {display:none !important;}
+.scrollOff {overflow:hidden;}
+.f25 {font-size:25px;}
+
+html,body,#wrapper,#container {min-height:100%; height:100%;}
+#wrapper {position:relative; min-width:1240px;}
+
+/* 로그인 --------------- */
+.loginBg {background:#f3f3f4;}
+.loginWrap {width:500px; box-shadow:0 7px 7px -5px rgba(0, 0, 0, 0.1);}
+.loginWrap .loginBox input[type=text],
+.loginWrap .loginBox input[type=password]{padding:10px; width:100%; border:1px solid #ced4da; border-radius:.25rem;}
+.loginWrap .loginBox li:nth-of-type(2), .loginBox li:nth-of-type(3) {padding-bottom:10px;}
+.loginWrap .loginBox li:nth-of-type(4) {padding:10px 0 50px 0; line-height:30px; text-align:left;}
+.loginWrap .loginBox li:nth-of-type(5) {margin-bottom:30px; text-align:center;}
+.loginWrap .loginBox a {display:inline-block; padding:10px;}
+.loginWrap .loginBox .dot {color:#ccc;}
+.loginWrap .btn-black {background-color:#555; color:#fff; font-weight:bold; float:right; margin:0 !important;}
+.loginWrap .btn-black:hover{background-color:#000; box-shadow:none;}
+.loginWrap .btn-purple {background-color:#667eea; color:#fff; font-weight:bold; float:right; margin:0 !important;}
+.loginWrap .btn-purple:hover{background-color:#2e38cb; box-shadow:none;}
+.loginWrap .loginInfo {color:#888; line-height:23px; text-align:left;}
+.loginWrap .loginInfo em i {margin-right:7px;}
+.loginWrap .loginInfo p:first-child{margin-bottom:15px;}
+.loginWrap .loginInfo p span {display:inline-block; margin-bottom:15px; line-height:40px; font-size:16px; font-weight:bold; border-bottom:1px solid #000;}
+
+/* 로그인 style :black */
+.login_black {position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); -ms-transform:translate(-50%, -50%); background:#fff;}
+.login_black .logo { padding:25px 0; text-align:center; background:#000;}
+.login_black .loginInfo em {color:#555; font-weight:bold;}
+.login_black .loginCont > ul {padding:60px 60px 70px;}
+.login_black .loginBox li:nth-of-type(5) {border-top:1px solid #e4e4e4; border-bottom:1px solid #e4e4e4;}
+.login_black .loginBox a {color:#555}
+
+/* 보안 인증 */
+.loginWrap .certiFrm {padding:40px 60px 70px;}
+.loginWrap .certiFrm h2{margin:10px 0 30px;}
+.loginWrap .certiFrm h2 i{margin-right:10px;}
+.loginWrap .certiFrm .alertBox{margin-bottom:15px}
+.loginWrap .certiFrm .input{height:45px; position:relative;}
+.loginWrap .certiFrm .input input[type=text]{position:relative; padding:10px; width:45px; height:45px; line-height:45px; font-size:16px; border:1px solid #ced4da; border-radius:.25rem; text-align:center;}
+.loginWrap .certiFrm .input input[type=text]:focus{color:#4D90FE;font-weight:bold;}
+.loginWrap .certiFrm .input .countdown{display:inline-block; position:relative; padding-left:20px; line-height:45px; height:45px;color:red; text-align:center;vertical-align:top; font-size:14px}
+.loginWrap .certiFrm .info{margin-top:20px; line-height:22px; color:#555;}
+.loginWrap .certiFrm .button{margin:25px 0 50px;}
+.loginWrap .certiFrm .button button{margin:0 5px !important; padding:5px 20px; height:32px; float:right}
+.loginWrap .certiFrm .button button:focus{outline:2px auto #4D90FE !important; }
+.loginWrap .certiFrm .button .btn-black{width:100px !important;}
+
+/* 로그인 :alert */
+.alertBox {position:relative; padding:10px 40px 10px 10px; margin-bottom:10px; border:1px solid; border-radius:.25rem; line-height:22px;}
+.alertBox .alertClose {position:absolute; top:0; right:5px; padding:0 10px; height:40px; text-indent:-9999px; background:url('/image/btn_sltClose.png') no-repeat 50% 50%;}
+.alertBox .alertClose:hover {background:url('/image/btn_sltCloseOn.png') no-repeat 50% 50%;}
+.alert-success {color:#155724; background-color:#d4edda; border-color:#c3e6cb;}
+.alert-info {color:#0c5460; background-color:#d1ecf1; border-color:#bee5eb;}
+.alert-warning {color:#856404; background-color:#fff3cd; border-color:#ffeeba;}
+.alert-danger {color:#721c24; background-color:#f8d7da; border-color:#f5c6cb;}
+
+/* header--------------- */
+header {position:fixed; top:0; left:0; right:0; z-index:10; min-width:1240px; width:100%; height:60px; line-height:60px; color:#fff; background:linear-gradient(135deg,#667eea 0,#764ba2 100%);}
+header a, header button {color:#fff;}
+.header-logo {float:left; width:260px; line-height:60px; background:rgba(250, 251, 252, 0.1); overflow:hidden;}
+.header-logo a {display:inline-block; margin:0 10px 0 20px; width:184px; height:60px;}
+.header-logo .lnbClose {width:30px; line-height:30px; display:inline-block !important;}
+.header-logo .lnbClose:hover {color:rgba(255, 255, 255, 0.8);}
+.header-menu {position:absolute; left:260px; padding:0 0 0 30px; font-weight:bold;}
+.header-menu .menu {display:inline-block; -ms-user-select:none; -webkit-user-select:none; user-select:none;}
+.header-menu .menu a {display:inline-block; margin-right:7px; padding:0 14px; line-height:34px; border-radius:50px; background:rgba(0, 0, 0, 0.07);}
+.header-menu .menu a:hover {color:rgba(255, 255, 255, 0.8);}
+.header-menu .menu a.on {background:rgba(0, 0, 0, 0.3);}
+.header-info {display:inline-block; float:right; margin-right:20px;}
+.header-info a {color:rgba(255, 255, 255, 0.8);}
+.header-info a:hover {color:#fff;}
+.header-info i.heart {font-size:6px; color:rgba(255, 255, 255, 0.4); margin-right:3px;}
+.header-info i.dot {font-size:13px; color:rgba(255, 255, 255, 0.4); margin:0 3px;}
+.header-info-sm {display:none; float:right; margin-right:20px;}
+.header-info-sm a {display:inline-block; padding:0 7px; color:rgba(255, 255, 255, 0.8);}
+.header-info-sm a:hover {color:#fff;}
+
+/* GNB:툴팁--------------- */
+.tooltip .tooltiptext {visibility:hidden; position:absolute; top:48px; right:20px; z-index:1; padding:0 15px; line-height:30px; color:#fff; font-size:13px; text-align:center; background-color:#233646; border-radius:3px;}
+.tooltip .tooltiptext::after {content:""; position:absolute; bottom:100%; right:38px; border-width:5px; border-style:solid; border-color:transparent transparent #233646 transparent;}
+.tooltip .tooltiptext.logout::after {right:10px;}
+.tooltip:hover .tooltiptext {visibility:visible;}
+
+/* LNB--------------- */
+#lnb-wrapper {position:fixed; top:60px; left:-260px; width:260px; height:100%; vertical-align:top; overflow-y:auto; transition:left .3s; -webkit-transition:left .3s; background-color:#2f4050;}
+#lnb-wrapper:after{content:''; position:absolute; top:0; left:0; z-index:-1; width:100%; height:100%;}
+#lnb-wrapper.on {left:0;}
+#lnb {margin-bottom:100px; width:260px;}
+#lnb a {display:block; color:#a7b1c2;}
+#lnb a:hover {color:#fff;}
+#lnb a.on {color:#fff;}
+#lnb .dep2 {padding:14px 20px 14px 35px; background:url('/image/icon_dep2.png') 10px 50% no-repeat, url('/image/icon_depArr2.png') 222px 50% no-repeat; background-color:#233646; cursor:pointer;}
+#lnb .dep2.on {display:block; background:url('/image/icon_dep2On.png') 10px 50% no-repeat, url('/image/icon_depArr2On.png') 222px 50% no-repeat; background-color:#233646;}
+#lnb .dep3 {padding:5px 0 10px 10px; border-left:4px solid #8597eb; cursor:pointer;}
+#lnb .dep3 a {padding:10px; cursor:pointer;}
+#lnb .dep4 {padding:5px 0 10px 20px; cursor:pointer;}
+#lnb .dep4 a {padding:10px; cursor:pointer;}
+
+/* main--------------- */
+#main-wrapper {position:relative; left:0; top:0; margin-left:0; min-height:100%; padding-bottom:60px; vertical-align:top; color:#222; transition:margin-left .3s; -webkit-transition:margin-left .3s;}
+#main-wrapper.on {margin-left:260px;}
+#main {padding-top:60px; position:relative;}
+#main .main-title {height:60px; margin-left:20px; margin-right:20px;}
+#main .main-title h1 {padding-top:15px; font-size:20px; color:#333; font-weight:700;}
+#main .main-title ol {margin-top:25px; float:right; color:#666;}
+#main .main-title li {float:left;}
+#main .main-title li::before {padding:0 5px; content:"/"; color:#999;}
+#main .main-title li:nth-of-type(1)::before {content:none !important;}
+#main .main-title i {padding-right:3px; color:#999;}
+#main .sub-title {margin:0 20px 10px; font-size:14px; color:#6c7dda; font-weight:bold;}
+#main .sub-title i {margin-right:10px;}
+
+/* 패널영역 스타일--------------- */
+.panelStyle {position:relative; margin:0 20px 30px 20px; padding:15px 15px 0; background-color:#fff; border-top:2px solid #dfe2e3; box-shadow:0 7px 7px -5px rgba(0, 0, 0, 0.04);}
+.panelStyle::after, .frmStyle::after{position:relative; bottom:-5px; content:''; display:block; border:1px solid rgba(255,255,255,0);}
+.panelStyle .panelTitle {margin:-15px -15px 0; padding:0 20px; line-height:40px; border-bottom:1px solid #e7eaec;}
+.panelStyle .panelControl {position:absolute; top:0; right:15px; color:#c4c4c4;}
+.panelStyle .panelControl i {padding:10px 10px; cursor:pointer;}
+.panelStyle .panelContent {margin-top:10px;}
+.panelStyle h2 {margin-right:10px; font-size:14px; font-weight:bold;}
+.panelStyle h3 {margin-right:10px; font-size:12px; font-weight:normal; line-height:25px;}
+.panelStyle h3 i {padding-right:5px}
+.panelStyle h4 {padding-left:23px; height:31px; line-height:31px; background:url('/image/icon_h4.png') no-repeat 3px 50%; color:#666;}
+.panelStyle .panelBar {display:table; width:100%; padding-bottom:10px;}
+.panelStyle .panelBar h4 {margin-bottom:0;}
+.panelStyle .panelBar > li {display:table-cell;}
+.panelStyle .panelBar > .center {text-align:center;}
+.panelStyle .panelBar > .right {text-align:right;}
+
+/* 패널 내부 테이블 여러개 배치 */
+.panelStyle .division + .panelBar {padding-bottom:15px;}
+.panelStyle .division {display:table; width:100%;}
+.panelStyle .division > li, .panelStyle .division > div {display:table-cell; padding-right:40px;}
+.panelStyle .division > li:last-child, .panelStyle .division > div:last-child {padding-right:0;}
+/* table, grid, button 상하 여백 */
+.ag-theme-balham{margin-bottom:15px !important;}
+.frmStyle + .panelBar {padding-bottom:15px;}
+.ag-theme-balham {margin:10px 0 15px;}
+.ag-theme-balham + .panelBar{padding-bottom:15px;}
+.panelBar + .ag-theme-balham {margin:0 0 15px;}
+.panelBar + .frmStyle {margin-top:0;}
+
+/* TABS 영역 --------------- */
+.tabs {position:relative; margin-bottom:30px; margin-left:20px; margin-right:20px;}
+.tabs h2 {position:absolute; top:0; z-index:2; margin-left:10px; font-size:14px; line-height:34px;}
+.tabs h2 i {margin-right:12px;}
+.tabsNav {overflow:hidden; position:relative; top:0; z-index:2; padding:0 30px 0 20px; height:35px;}
+.tabsNav ul {display:inline-block;}
+.tabsNav li {float:left; position:relative;}
+.tabsNav li a {padding:0 20px; line-height:35px; height:35px; display:block; color:#888; font-weight:bold; background-color:#f9f9f9; border:1px solid #dfe2e3; border-bottom:2px solid #dfe2e3; border-top-left-radius:.25rem; border-top-right-radius:.25rem;}
+.tabsNav li.on a {background-color:#fff; color:#222; border:1px solid #ccc; border-bottom:2px solid #fff;}
+.tabsCont {position:relative; top:-2px; z-index:1;}
+.tabsCont::after {display:block}
+.tab {display:none;}
+.tab > .panelStyle{margin:0;}
+.tab.on {display:block;}
+.popupTabs {padding-top:10px;}
+.tabContArea {overflow-x:hidden; overflow-y:auto;}
+.tabBtnArea {padding:15px 0 20px 0;}
+.popup .tabsCont {box-shadow:none;}
+.popup .tabs {margin-bottom:0;}
+
+/* Add TABS 영역 --------------- */
+.btn-add-tab {position:absolute; top:5px; right:0; z-index:2; padding:0 10px;}
+.tabsNav .ui-tabs-active a {background-color:#fff; color:#222; border:1px solid #ccc; border-bottom:2px solid #fff;}
+.tab-del {position:absolute; top:1px; right:1px; padding:4px 6px; color:gray; cursor:pointer; border-top-right-radius:.25rem;}
+.tab-del:hover {color:#f40552;}
+a, button, .ui-state-active, .ui-state-focus, .ui-state-hover {outline:0 !important;}
+.tabsNav .ui-corner-top a {padding:0 35px 0 20px}
+
+/* tabsJr 영역 --------------- */
+.tabsJr {position:relative;}
+.tabsJrNav {overflow:hidden; position:relative; top:0; z-index:2; height:31px; margin:0 30px 0 20px;}
+.tabsJrNav > ul {display:inline-block;}
+.tabsJrNav li {float:left;}
+.tabsJrNav li a {padding:0 20px; line-height:30px; height:30px; display:block; color:#888; /*font-weight:bold; */ background-color:#f9f9f9; border:1px solid #ccc; border-top-left-radius:.25rem; border-top-right-radius:.25rem;}
+.tabsJrNav li.on a {padding-bottom:2px; font-weight:bold; color:#555; background-color:#fff; border-top:1px solid #ccc; border-right:1px solid #ccc; border-bottom:1px solid #fff;}
+.tabsJrCont {position:relative; top:-2px; z-index:1;}
+.tabsJrCont::after {display:block}
+.tabJr {display:none;}
+.tabJr .panelStyle{margin:0; border-top:1px solid #ddd; min-height:20px; padding:20px 15px 0; box-shadow:0 -5px 7px -5px rgba(0, 0, 0, 0.05);}
+.tabJr.on {display:block;}
+.tabJrContArea {vertical-align:middle;}
+
+/* modal, modeless popup --------------- */
+.modalPopup{display:none; position:fixed; left:0; top:0; z-index:11; width:100%; height:100%; background:rgba(0,0,0,0.5);}
+.modalPopup > .panelStyle{position:absolute; top:50%; left:50%; z-index:11; -ms-transform:translate(-50%, -50%); transform:translate(-50%, -50%); margin:0; border:1px solid #79797a; border-radius:3px;}
+.modalPopup > .panelStyle .close {position:absolute; top:0; right:0; font-size:18px; padding:5px 15px 8px;}
+.modalPopup .tabs{ margin:0;}
+.modalPopup .tabs .panelStyle{box-shadow:none}
+.modalPopup .tab > .panelStyle{overflow-y:auto;}
+
+/*MODELESS POPUP --------------- */
+.modelessPopup{display:none; position:absolute; z-index:11; top:50%; left:50%;}
+.modelessPopup.draggable {cursor:move;}
+.modelessPopup .panelStyle{margin:0; border:1px solid #ccc; border-radius:3px;}
+.modelessPopup .panelStyle .close {position:absolute; top:0; right:0; font-size:18px; padding:5px 15px 8px;}
+.modelessPopup .tabs{ margin:0;}
+.modelessPopup .tabs .panelStyle{box-shadow:none}
+.modelessPopup .tab > .panelStyle{overflow-y:auto;}
+
+/*VIDEO POPUP --------------- */
+.videoPopup {display:none; position:fixed; top:50%; left:50%; z-index:11; -ms-transform:translate(-50%, -50%); transform:translate(-50%, -50%); margin:0; border:1px solid #79797a; border-radius:3px;}
+.modalPopup::before{position:fixed; left:0; top:0; z-index:11; width:100%; height:100%; background:rgba(0,0,0,0.5);}
+.videoPopup .close {position:absolute; top:-20px; right:-20px; z-index:1; width:40px; height:40px; line-height:20px; font-size:20px; border:1px solid #666; border-radius:50px; background-color:#fff;}
+.videoPopup iframe{width:100%; height:100%}
+
+
+#btnTop {display:none; position:fixed; right:0; bottom:50px; width:40px; line-height:10px; font-size:10px; background:#fff; border:1px solid #ddd; border-right:none; padding:3px 0 5px 0; box-shadow:5px 5px 5px -4px rgba(0, 0, 0, 0.07); color:#1c84c6;}
+#btnTop i {width:100%; font-size:12px;}
+#btnTop:hover {padding-right:30px; width:70px; font-weight:bold;}
+
+
+/* 컨텐트 스크롤--------------- */
+.xScroll {overflow-x:auto;}
+.yScroll {overflow-y:auto;}
+
+/* 폼테이블 스타일 --------------- */
+.frmStyle {width:100%; margin-bottom:15px;}
+.frmStyle th {border-top:1px solid #dae0fd;}
+.frmStyle tr:last-child th {border-bottom:1px solid #dae0fd;}
+.frmStyle tr:last-child td {border-bottom:1px solid #eee;}
+.frmStyle th {padding:0 15px; height:36px; line-height:24px; white-space:nowrap; text-align:center; background:#e9ecfb;}
+.frmStyle td {padding:0 10px 0 10px; line-height:36px; position:relative; border-top:1px solid #eee; border-right:1px solid #eee;}
+
+/* 체크박스&라디오박스 공통--------------- */
+input[type=radio] {position:absolute; top:50%; left:0; width:18px; height:18px; transform:translate(0,-50%); -ms-transform:translate(0,-50%);}
+label.chkBox, label.rdoBtn {position:relative; display:inline-block; padding-left:26px; height:22px; line-height:22px; vertical-align:middle; cursor:pointer;}
+/* 체크박스 :전체선택 버튼--------------- */
+input[type=checkbox] {position:absolute; top:0; left:0; width:0; height:0;}
+input[type=button].chkBox {margin-left:-2px; padding-left:24px; height:22px; vertical-align:middle; background:url('/image/icon_checkN.png') no-repeat 0 50%;}
+
+/* 체크박스--------------- */
+label.chkBox::before {position:absolute; top:2px; left:0; content:''; width:16px; height:16px; border:1px solid #dbdbdb; background:#fff;}
+label.chkBox.checked::after {position:absolute; top:6px; left:3px; content:''; width:8px; height:4px; border-bottom:3px solid #676a6c; border-left:3px solid #676a6c; -webkit-transform:rotate(-45deg); transform:rotate(-45deg);}
+label.chkBox .formControl::before {background:#eee;}
+
+/* 라디오버튼--------------- */
+input[type=radio]::before {position:absolute; top:0; left:0; content:''; width:16px; height:16px; border:1px solid #dbdbdb; border-radius:50%; background:#fff;}
+input[type=radio]:checked::after {position:absolute; top:5px; left:5px; content:''; width:8px; height:8px; border-radius:50%; background:#676a6c;}
+input[type=radio].formControl::before {background:#eee;}
+
+/* 토글 스위치--------------- */
+.switchBox{ display:inline-block;position:relative; width:60px; height:28px; vertical-align:middle;border-radius:25px;overflow:hidden;}
+.switchBox input[type="checkbox"]{position:absolute;visibility:hidden;}
+.switchBox label{display:block;position:absolute;top:0;width:60px;height:28px;background-color:#aaa;transition-duration:0.2s;}
+.switchBox label span{position:absolute;left:0;top:50%;z-index:1;width:26px;height:23px;border-radius:25px;transform:translate(3px, -50%);transition-duration:0.2s;background-color:#fff;text-indent:-9999px;}
+.switchBox label:before,label:after{position:absolute;top:0;width:52%;font-size:11px;line-height:27px;color:#fff;text-align:center;}
+.switchBox label:before{left:0;content:'ON';}
+.switchBox label:after{right:0;content:'OFF';}
+.switchBox input:checked + label span{transform:translate(31px, -50%);}
+.switchBox input:checked::before, .switchBox input:checked::after{border:none}
+.switch-base input:checked + label{color:#fff; background-color:#8597eb;}
+.switch-primary input:checked + label{color:#fff; background-color:#1ab394;}
+.switch-success input:checked + label{color:#fff; background-color:#1c84c6;}
+.switch-info input:checked + label{color:#fff; background-color:#23c6c8; }
+.switch-warning input:checked + label{color:#fff; background-color:#f8ac59;}
+.switch-danger input:checked + label{color:#fff; background-color:#ed5565;}
+.switch-black input:checked + label{color:#fff; background-color:#222;}
+.switchBox + .switchBox {margin-left:6px;}
+
+/* 테이블 스타일--------------- */
+.tableStyle {width:100%; max-width:100%; margin-bottom:15px;}
+.tableStyle th {position:relative; padding:7px 0; color:#333; border-top:1px solid #dae0fd; border-bottom:1px solid #dae0fd; border-right:1px solid #dae0fd; background-color:#e9ecfb; text-align:center;}
+.tableStyle th:last-child {border-right:none;}
+.tableStyle td {position:relative; padding:7px 0; border-right:1px solid #ebebeb; border-bottom:1px solid #ebebeb; text-align:center;}
+.tableStyle td:last-child {border-right:none;}
+.tableStyle tbody tr:nth-of-type(2n) {background-color:rgba(0, 0, 0, 0.02);}
+.tableStyle tbody tr:hover {background-color:rgba(224,243,255,0.6);}
+.tableStyle + .panelBar {padding-bottom:15px;}
+/* 스캔 */
+.scanTbl th {font-size:25px; line-height:80px;}
+.scanTbl td {line-height:80px;}
+.scanTbl input[type=text] {line-height:50px; font-size:32px;}
+.scanTbl .btn {overflow-y:hidden; margin-bottom:1px; padding:12px 30px; font-size:25px;}
+table.noPad tr > td, td.noPad {padding:0 !important;}
+th[rowspan] {border-bottom:1px solid #dae0fd;}
+td[rowspan] {border-bottom:1px solid #eee;}
+.nowrap {white-space:nowrap;}
+.solidR {border-right:1px solid #eee; vertical-align:middle;}
+.solidL {border-left:1px solid #eee; vertical-align:middle;}
+.solidT {border-top:1px solid #eee;}
+.solidB {border-bottom:1px solid #eee;}
+.dashR {border-right:1px solid #dae0fd;}
+.dashL {border-left:1px solid #dae0fd;}
+.noPad table.frmStyle > tr:first-child th {border-top:0 !important;}
+.noPad table.frmStyle > tr:first-child td {border-top:0 !important;}
+.noPad table.frmStyle > tr:last-child th {border-bottom:0 !important;}
+.noPad table.frmStyle > tr:last-child td {border-bottom:0 !important;}
+
+
+/* Q&A 스타일--------------- */
+.qnaStyle {width:100%; max-width:100%;}
+.qnaStyle th {position:relative; padding:7px 0; color:#333; border-top:1px solid #dae0fd; border-bottom:1px solid #dae0fd; border-right:1px solid #dae0fd; background-color:#e9ecfb; text-align:center;}
+.qnaStyle th:last-child {border-right:none;}
+.qnaStyle td {position:relative; padding:7px 0; text-align:center;}
+.qnaStyle tr td {border-bottom:1px solid #ecf5f7;}
+.qnaStyle tbody tr:nth-of-type(3n+1) td {background-color:rgba(224,243,255,0.6);}
+.qnaStyle tbody tr:nth-of-type(3n) td {border-bottom:1px solid #ddd;}
+.qnaClaim { text-align:left !important; padding-left:10px !important;}
+.qnaClaim .goods {font-weight:bold; line-height:26px;}
+.qnaClaim .cont {line-height:22px; padding:10px 0; color:#1d3e9d;}
+.qnaClaim .email {line-height:26px;}
+.qnaClaim .email em {border-bottom:1px solid #aaa;}
+.lineRound {border:2px solid #ccc; border-radius:15px; padding:4px 14px; font-weight:bold;}
+
+/* 내부 테이블 디자인 */
+.subTable {display:table; width:100%;}
+.subTable dl {display:table; width:100%;}
+.subTable dt, .subTable dd {display:table-cell;}
+.subTable dt {vertical-align:middle; white-space:nowrap; width:8%; padding:0 15px; background:#e9ecfb; text-align:center; border-bottom:1px solid #dae0fd;}
+.subTable dl:last-child dt {border-bottom:none;}
+.subTable dd {border-bottom:1px solid #eee; padding:3px 20px 3px 10px;}
+.subTable dl:last-child dd {border-bottom:none;}
+
+/* button --------------- */
+.btn {border-radius:3px; vertical-align:middle; white-space:nowrap;font-size:12px;user-select:none;}
+.btn-lg {padding:4px 20px 5px; height:28px; overflow-y:hidden;}
+.btn-sm {margin-top:-2px; line-height:100%; height:28px; overflow-y:hidden;}
+.btn-ssm {margin-top:-2px; line-height:100%; height:22px; overflow-y:hidden;}
+.btn + .btn {margin-left:6px;}
+.btn:first-child {margin-left:0;}
+
+/* 버튼 색상 */
+.btn-white {color:#555 !important; background-color:#fff !important; border:1px solid #ccc !important;}
+.btn-default {color:#555; background-color:#eee; border:1px solid #dcdcdc;}
+.btn-gray {color:#fff; background-color:#aaa; border:1px solid #aaa;}
+.btn-base {color:#fff; background-color:#8597eb; border:1px solid #8597eb;}
+.btn-primary {color:#fff; background-color:#1ab394; border:1px solid #1ab394;}
+.btn-success {color:#fff; background-color:#1c84c6; border:1px solid #1c84c6;}
+.btn-info {color:#fff; background-color:#23c6c8; border:1px solid #23c6c8;}
+.btn-pink {color:#fff; background-color:#feada6; border:1px solid #feada6;}
+.btn-warning {color:#fff; background-color:#f8ac59; border:1px solid #f8ac59;}
+.btn-danger {color:#fff; background-color:#ed5565; border:1px solid #ed5565;}
+.btn-dark {color:#fff; background-color:#6c757d; border:1px solid #6c757d;}
+.btn.icn {line-height:28px; height:28px; padding:0 8px; background-color:#eee; border:1px solid #dbdbdb;}
+.btn.icn i {padding-top:6px; width:12px; vertical-align:top; font-size:14px; text-align:center;}
+
+/* 페이징 --------------- */
+.tablePaging {position:relative; 	display:inline-block; vertical-align:middle;}
+.tablePaging a {display:inline-block; float:left; margin:0 5px; width:28px; height:28px; line-height:28px; text-align:center; border:1px solid #ccc; border-radius:50px; cursor:pointer;}
+.tablePaging a.arrow {background-color:rgba(0, 0, 0, 0.03); 	border-color:#ebebeb;}
+.tablePaging .num.on {background:#8597eb; color:#fff; border-color:#8597eb;}
+
+/* 다중 Select Box */
+.mSelectWrap select {display:none;}
+.mSelectBox {display:inline-block; position:relative; top:-1px; margin:2px 0 2px 0; padding:0 7px 0 0; width:100%; height:auto !important; min-height:29px; border:1px solid #e5e6e7; vertical-align:middle;}
+.mSelected {overflow:auto;}
+.mSelected li {float:left; margin:2px 5px 3px; line-height:24px; padding:0 7px; background:#dbedf9; -ms-user-select:none; -moz-user-select:-moz-none; -webkit-user-select:none; user-select:none;}
+.mSelected li.srchFld {margin:0; padding:0; background:none;}
+.mSelected .srchFld input {width:25px; margin:0; padding:0; border:none; outline:none;}
+.mSelected a {border:none !important; float:right; margin-left:3px; padding:0 3px; width:15px; line-height:22px; text-indent:-9999px; background:url('/image/btn_sltClose.png') no-repeat 100% 50%;}
+.mSelected a:hover {background:url('/image/btn_sltCloseOn.png') no-repeat 100% 50%;}
+.mSelecting {display:none; overflow-y:auto; overflow-x:hidden; position:absolute; top:100%; left:-1px; z-index:1; width:100%; max-height:156px; line-height:30px; border:1px solid #e5e6e7; background:#fff;}
+.mSelecting li {margin:0 10px; cursor:pointer;}
+
+/* 멀티 Select Box */
+.mSelWrap {display:inline-block;}
+.mSelWrap select {height:100px; padding:7px 0;}
+.mSelWrap .mSelBtn {margin:0 0 0 5px; float:right; width:33px; vertical-align:top;}
+.mSelWrap .mSelBtn .btn {margin:0; vertical-align:top;}
+.mSelWrap option {padding:4px 100px 4px 10px;}
+
+/* 파일첨부 --------------- */
+.uFile {overflow:hidden; position:relative; display:inline-block; margin:-2px 5px 0 0; width:80%; height:28px; vertical-align:middle; border:1px solid #dbdbdb;}
+.lrStyle .uFile {margin-top:2px;}
+.uFileInput {position:absolute; top:0; width:100%; margin:0 !important; padding:0 !important; line-height:28px; border:none !important;}
+.uFileLabel {position:absolute; top:0; right:0; left:0; z-index:1; margin:0; padding:0 7px; width:cals(100% - 7px); line-height:28px; height:28px; background-color:#fff; border-radius:1px; overflow:hidden; white-space:nowrap;}
+.uFileLabel::after {position:absolute; top:0; right:0; bottom:0; width:30px; z-index:3; line-height:28px; content:" "; border-left:1px solid #dbdbdb; background:#eee url('/image/icon_upload.png') no-repeat 50% 50%;}
+
+/* badge --------------- */
+.badge {float:right; margin-top:2px; padding:0 5px; min-width:9px; line-height:18px; color:#fff; font-size:12px; font-weight:600; border-radius:3px; text-align:center; text-shadow:1px 1px 1px rgba(0,0,0,0.4); letter-spacing:-0.5px;}
+.badge-warning {background-color:#ed7908;}
+.badge-primary {background-color:#1ab394;}
+.badge-danger {background-color:#ed5565;}
+.badge-success {background-color:#2fa4e7;}
+.badge-info {background-color:#23c6c8;}
+.badge.circle {border-radius:50px;}
+.dep3 .badge {position:relative; top:-28px; right:20px;}
+
+/* tag */
+.tagNum {display:inline-block; margin-left:5px; padding:0 3px 0 2px; min-width:13px; line-height:16px; font-weight:normal; color:#fc5555; background:#fff; border-radius:5px;}
+
+/* footer --------------- */
+footer {position:absolute; bottom:0; left:0; width:100%; height:40px; background-color:#fff; border-top:1px solid #e7eaec; line-height:39px; font-size:13px;}
+footer .f-left {float:left; padding-left:20px; line-height:38px;}
+footer .f-right {float:right; padding-right:20px; line-height:38px;}
+
+/* 이미지 카드 */
+.dexterArea {min-width:350px; min-height:180px; padding:0 !important; vertical-align:top; background:#f1f1f1; vertical-align:top;}
+.dexterTable {display:table; width:100%; overflow-y:auto;}
+.dexterTable > li {display:table-cell; vertical-align:top; line-height:30px;}
+.dexterNo div {padding:0 10px; border-top:1px solid #ddd; border-right:1px solid #ddd; background:#fff;}
+.dexterNo div:first-child {margin-top:36px;}
+.dexterNo div:last-child {border-bottom:1px solid #ddd;}
+
+/* 수정용 이미지 카드 */
+.cardArea {width:100%; padding:0 0 20px; overflow-y:auto;}
+.imgCard {vertical-align:top; position:relative; display:inline-block; margin:20px 20px 0 0; padding:10px 10px 0 10px; border:1px solid #dbdbdb;}
+.imgCard ul {display:table;}
+.imgCard li {display:table-cell;}
+.imgCard img {margin-right:15px;}
+.imgCard li:nth-of-type(2) {padding-top:20px; max-width:150px; line-height:24px}
+.imgCard p {font-size:12px;}
+.imgCard .cardClose {position:absolute; top:0; right:0; width:24px; background:url('/image/btn_sltClose.png') no-repeat 50% 50%; text-indent:-9999px;}
+.imgCard .cardClose:hover {background:#f1f1f1 url('/image/btn_sltCloseOn.png') no-repeat 50% 50%;}
+.verticalTop {vertical-align:top;}
+
+/* 조회용 이미지 카드 */
+.cardArea2 {padding:10px 0;}
+.cardArea2 ul, .cardArea2 .box {vertical-align:top; position:relative; display:inline-block; margin:10px; border:1px solid #dbdbdb; max-width:300px;}
+.cardArea2 li {display:table-cell; line-height:26px; vertical-align:middle;}
+.cardArea2 li:nth-of-type(2) {padding:0 10px;}
+.cardArea2 .cardDel {position:absolute; top:0; right:0; background:url('/image/btn_sltClose.png') no-repeat 50% 50%; text-indent:-9999px;}
+.cardArea2 .cardDel:hover {background:#f1f1f1 url('/image/btn_sltCloseOn.png') no-repeat 50% 50%;}
+
+/* 테이블 외부 안내문구 */
+.panelStyle > .notice {margin:0 0 15px ;}
+.panelContent > .notice {margin:15px 0;}
+.notice em {color:red;}
+.notice li, p.dot {padding-left:20px; background:url('/image/dot_bk.png') no-repeat 5px 10px; line-height:24px;}
+p.dot .btn {margin-left:10px !important;}
+p.dot em {color:red;}
+
+/* 정렬 */
+.txt {line-height:36px;}
+.aC {text-align:center !important;}
+.aR {text-align:right !important;}
+.aL {text-align:left !important;}
+.vaT {vertical-align:top !important;}
+.vaM {vertical-align:middle !important;}
+.vaB {vertical-align:bottom !important;}
+
+/* 테이블 내부 안내문구 */
+.infoTxt {line-height:26px; padding:5px 0;}
+.infoTxt i {margin-right:7px;}
+.infoTxt em {color:red;}
+.infoTxtTh {display:inline-block; text-align:left; font-weight:normal; font-size:12px;}
+.infoTxtTh li {padding-top:3px;}
+.infoTxtTh i {padding-right:5px;}
+.srchOption {overflow:auto; padding:10px 0; line-height:36px;}
+
+/* 유의사항 안내 */
+.infoBox {margin:0 20px 20px; padding:7px 10px; border-top:2px solid #dfe2e3; border-bottom:2px solid #dfe2e3; background:#fff}
+.infoBox p {padding-left:25px; line-height:20px; font-size:12px; background:url('/image/dot_bk.png') no-repeat 10px 50%; background-size:3px auto;}
+
+/* 검색결과 안내문 */
+.srchNotice {padding-bottom:7px; font-weight:normal; font-size:14px;}
+.srchNotice em {color:red;}
+
+/* 필수입력항목 */
+.required {display:inline-block; position:relative; top:-3px; width:12px; height:7px; background:url('/image/icon_required.png') no-repeat 0 50%;}
+
+
+/* COLOR DESIGN -------------------------------------*/
+/*Color :Base ---*/
+.color-mPurple header,span.color-mPurple {background:linear-gradient(135deg,#667eea 0,#764ba2 100%) !important;}
+.color-purple header,span.color-purple {background:#667eea !important;}
+
+/*Color :Gray ---*/
+.color-mGray header,span.color-mGray {background:linear-gradient(to right,#6c757d 0%,#555 100%) !important;}
+.color-gray header,span.color-gray {background:#666 !important;}
+.color-mGray .frmStyle th,.color-mGray .tableStyle th,.color-gray .frmStyle th,.color-gray .tableStyle th {background:#eee !important; 	border-top:1px solid #ddd; 	border-bottom:1px solid #ddd;}
+.color-mGray .tablePaging .num.on,.color-gray .tablePaging .num.on {background:#888 !important; 	border-color:#888 !important;}
+.color-mGray #lnb .dep3,.color-gray #lnb .dep3 {border-color:#777 !important;}
+.color-mGray .tabsJrNav li.on a,.color-gray .tabsJrNav li.on a {color:#333;}
+
+/*Color :Blue ---*/
+.color-mBlue header,span.color-mBlue {background:linear-gradient(to right,#4481eb 0%,#04befe 100%) !important;}
+.color-blue header,span.color-blue {background:#0042a5 !important;}
+.color-mBlue .frmStyle th,.color-mBlue .tableStyle th,.color-blue .frmStyle th,.color-blue .tableStyle th {background:#d8eafc !important; 	border-top:1px solid #ddd; 	border-bottom:1px solid #ddd;}
+.color-mBlue .tablePaging .num.on,.color-blue .tablePaging .num.on {background:#3e91de !important; 	border-color:#3e91de !important;}
+.color-mBlue #lnb .dep3,.color-blue #lnb .dep3 {border-color:#3e91de !important;}
+.color-mBlue .tabsJrNav li.on a,.color-blue .tabsJrNav li.on a {background:#d8eafc;}
+.color-mBlue .tabJr.on,.color-blue .tabJr.on {border-top:4px solid #d8eafc;}
+.color-mBlue .tabsJrNav li.on a,.color-blue .tabsJrNav li.on a {color:#333;}
+
+/*Color :Green ---*/
+.color-mGreen header,span.color-mGreen {background:linear-gradient(135deg,#00b09b 0,#96c93d 100%) !important;}
+.color-green header,span.color-green {background:#00b09b !important;}
+.color-mGreen .frmStyle th,.color-mGreen .tableStyle th,.color-green .frmStyle th,.color-green .tableStyle th {background:#e5f7f5 !important; 	border-top:1px solid #ddd; 	border-bottom:1px solid #ddd;}
+.color-mGreen .tablePaging .num.on,.color-green .tablePaging .num.on {background:rgba(0,176,155,0.8); 	border-color:rgba(0,176,155,0.8) !important;}
+.color-mGreen #lnb .dep3,.color-green #lnb .dep3 {border-color:#00b09b !important;}
+.color-mGreen .tabsJrNav li.on a,.color-green .tabsJrNav li.on a {background:#e5f7f5;}
+.color-mGreen .tabJr.on,.color-green .tabJr.on {border-top:4px solid #e5f7f5;}
+.color-mGreen .tabsJrNav li.on a,.color-green .tabsJrNav li.on a {color:#333;}
+
+/*Color :Pink ---*/
+.color-mPink header,span.color-mPink {background:linear-gradient(to right, rgb(242, 112, 156), rgb(255, 148, 114)) !important;}
+.color-pink header,span.color-pink {background:#feada6 !important;}
+.color-mPink .frmStyle th,.color-mPink .tableStyle th,.color-pink .frmStyle th,.color-pink .tableStyle th {background:#fff7f6 !important; border-top:1px solid #ddd; border-bottom:1px solid #ddd;}
+.color-mPink .tablePaging .num.on,.color-pink .tablePaging .num.on {background:#feada6; 	border-color:#feada6 !important;}
+.color-mPink #lnb .dep3,.color-pink #lnb .dep3 {border-color:#feada6 !important;}
+.color-mPink .tabsJrNav li.on a,.color-pink .tabsJrNav li.on a {background:#fff7f6;}
+.color-mPink .tabJr.on,.color-pink .tabJr.on {border-top:4px solid #fff7f6;}
+.color-mPink .tabsJrNav li.on a,
+.color-pink .tabsJrNav li.on a {color:#333;}
+
+/*Color :black ---*/
+.color-black header, span.color-black{background:#3E3E3E !important;}
+.color-black .header-logo{background:#000 !important;}
+.color-black .header-menu .menu a{background:#000 !important;}
+.color-black .header-menu .menu a.on{background:#fff !important; color:#000 !important;}
+.color-black #lnb-wrapper{background-color:#b2b2b2 !important;}
+.color-black #lnb .dep2{background-color:#545454 !important;}
+.color-black #lnb .dep3{border-color:#000 !important;}
+.color-black #lnb .dep3{background:#fdfdfd !important;  }
+.color-black #lnb .dep3 a{color:#111111 !important;}
+.color-black #lnb a{color:#fff !important;}
+.color-black .frmStyle th, .color-black .tableStyle th, .color-black .frmStyle th, .color-black .tableStyle th{background:#eee !important; 	border-top:1px solid #ddd; border-bottom:1px solid #ddd;}
+.color-black .tablePaging .num.on, .color-black .tablePaging .num.on{background:#888 !important; 	border-color:#888 !important;}
+.color-black .tabsJrNav li.on a, .color-black .tabsJrNav li.on a{color:#333; background:#eee !important}
+.color-black .tabJr.on, .color-black .tabJr.on { border-top:4px solid #eee;}
+
+/* 폰트 컬러, 폰트 두께 */
+.cBlue {color:#127fdc !important;}
+.cGray {color:#666 !important;}
+.cRed {color:red !important;}
+.bold {font-weight:bold !important;}
+
+/* 배경 투명도 */
+.bgOp6 {opacity:0.6; color:#000 !important;}
+
+/* 여백 지정 */
+hr {border:0; padding-bottom:10px;}/* 기본 여백 :10px */
+.pad10 {padding:10px 0 !important;}
+.pad15 {padding:15px 0 !important;}
+.pad20 {padding:20px 0 !important;}
+.padT3 {padding-top:3px !important;}
+.padT5 {padding-top:5px !important;}
+.padT10 {padding-top:10px !important;}
+.padT15 {padding-top:15px !important;}
+.padT20 {padding-top:20px !important;}
+.padT30 {padding-top:30px !important;}
+.padT40 {padding-top:40px !important;}
+.padR20 {padding-right:20px !important;}
+.padL10 {padding-left:10px !important;}
+.padB5 {padding-bottom:5px !important;}
+.padB10 {padding-bottom:10px !important;}
+.padB15 {padding-bottom:15px !important;}
+.padB20 {padding-bottom:20px !important;}
+.padB30 {padding-bottom:30px !important;}
+.padB40 {padding-bottom:40px !important;}
+.marT5 {margin-top:5px !important;}
+.marT10 {margin-top:10px !important;}
+.marT15 {margin-top:15px !important;}
+.marT20 {margin-top:20px !important;}
+.marR3 {margin-right:3px !important;}
+.marL5 {margin-left:5px !important;}
+.marL10 {margin-left:10px !important;}
+.marL20 {margin-left:20px !important;}
+.marR10 {margin-right:10px !important;}
+.marR20 {margin-right:20px !important;}
+
+/* 넓이 지정 --------------- */
+.w20 {width:20px !important;}
+.w50 {width:50px !important;}
+.w60 {width:60px !important;}
+.w70 {width:60px !important;}
+.w80 {width:80px !important;}
+.w90 {width:80px !important;}
+.w100 {width:100px !important;}
+.w130 {width:130px !important;}
+.w150 {width:150px !important;}
+.w200 {width:200px !important;}
+.w300 {width:300px !important;}
+.w400 {width:400px !important;}
+.w500 {width:500px !important;}
+.w600 {width:600px !important;}
+.w800 {width:800px !important;}
+.w100p {width:100% !important;}
+.w90p {width:90% !important;}
+.w80p {width:80% !important;}
+.w70p {width:70% !important;}
+.w60p {width:60% !important;}
+.w50p {width:50% !important;}
+.w40p {width:40% !important;}
+.w30p {width:30% !important;}
+.w20p {width:20% !important;}
+.h100 {height:100px !important;} /*alert, confirm 컨텐츠 높이에 사용*/
+
+
+/*-- 캘린더 --------------*/
+#calendar {max-width:900px; margin:20px 0 50px 20px;}
+
+/*-- error page --------------*/
+#errPage {padding-top:40px; width:650px; background:#fff; position:relative; top:48%; left:50%; transform:translate(-50%,-50%); -ms-transform:translate(-50%,-50%); border-radius:9px; vertical-align:middle; overflow:hidden; box-shadow:0 0 2px 0 rgba(0,0,0,0.12), 0 2px 2px 0 rgba(0,0,0,0.24);}
+#errPage .errImg {padding-left:50px; display:table-cell; vertical-align:middle; padding-bottom:30px;}
+#errPage .errImg div {border-radius:50%; position:relative; display:inline-block; width:140px; height:140px; color:#fff; background:#d196e4; box-shadow:2px 2px 6px 0 rgba(0,0,0,0.2) inset;}
+#errPage .fa-television {position:absolute; top:30px; left:28px; font-weight:bold; font-size:80px;}
+#errPage .fa-info {position:absolute; top:49px; left:66px; font-size:34px;}
+#errPage .errTxt {padding:0 50px; display:table-cell; padding-bottom:40px;}
+#errPage .errTxt .ttl {font-size:16px; font-weight:bold; padding-bottom:20px;}
+#errPage .errTxt .cont { padding-bottom:20px; line-height:26px;}
+#errPage .errTxt .tel {color:#777;}
+#errPage .errBtn {width:100%; background:#f9f9fa; line-height:70px; text-align:right;}
+#errPage .errBtn .btn {margin-right:30px; border-radius:33px; background:#858b90; color:#fff; padding:5px 30px; line-height:24px; font-weight:bold; -webkit-transition:0.2s; transition:0.2s;}
+#errPage .errBtn .btn:hover {background:#555;}
+
+/*-- DEXTER --------------*/
+.dexterNo { width:43px;}
+.dexterNo div { padding:0 10px; border-top:1px solid #ddd; border-right:1px solid #ddd; background:#fff; text-align:right;}
+.dexterNo div:first-child {margin-top:28px;}
+
+/*-- 회원추가 --------------*/
+.memAddWrap {line-height:26px; padding:3px 0;}
+.memAdd {margin-right:15px; padding:2px 27px 2px 0; position:relative; line-height:24px; height:24px; white-space:nowrap;}
+.memAdd button {position:absolute; top:3px; right:0; bottom:0; width:18px; height:18px; border:1px solid #dbdbdb; border-radius:3px; text-indent:-9999px; background:#eee url('/image/btn_sltClose.png') no-repeat 50% 50%;}
+.memAdd button:hover {background:#eee url('/image/btn_sltCloseOn.png') no-repeat 50% 50%;}
+
+/*-- Date Picker --------------*/ /* 20200521 수정 */
+table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
+.mtz-monthpicker-month {padding:7px; cursor:pointer;}
+.ui-datepicker-trigger {padding:0;}
+.ui-datepicker {z-index:800 !important; text-align:center; background:#fff;}
+.ui-datepicker .ui-datepicker-today,
+.ui-datepicker .ui-state-highlight {background:#fff7cf !important;}
+.ui-datepicker .ui-state-active {border:1px solid red !important;}
+.ui-datepicker .ui-datepicker-prev {position:absolute; top:3px; left:3px; width:30px; line-height:30px; text-indent:-9999px; background:url('/image/icon_prev.png') no-repeat 50% 50%;}
+.ui-datepicker .ui-datepicker-next {position:absolute; top:3px; right:3px; width:30px; line-height:30px; text-indent:-9999px; background:url('/image/icon_next.png') no-repeat 50% 50%;}
+.ui-datepicker .ui-datepicker-calendar {padding:5px; border:1px solid #ddd; border-top:none; text-align:center;}
+.ui-datepicker .ui-datepicker-calendar th{padding:5px 0}
+.ui-datepicker-week-end {text-align:center;}
+.ui-datepicker-calendar .ui-state-default {display:inline-block; text-align:center; width:32px; line-height:24px; border:none;}
+.ui-datepicker-header {position:relative; background:#d0e9ff; text-align:center; padding:5px; border:1px solid #ddd; border-bottom:none;}
+.ui-datepicker-buttonpane button {background-color:#eee; border:1px solid #dcdcdc; line-height:24px; border-radius:3px; margin:0 5px 5px 5px;}
+.ui-datepicker-current {float:left;}
+.ui-datepicker-close {float:right;}
+
+/* prograss bar */
+.prograssWrap {display:flex; flex-direction:row;}
+.prograssWrap > li {display:flex; align-items:center;}
+.prograssWrap > li:nth-of-type(1) {width:96%}
+.prograssWrap > li:nth-of-type(2) {margin-left:1.5rem !important}
+.prograss-lg {display:flex; width:100%; height:1rem; background-color:#f4f5fd; border-radius:.65rem; overflow:hidden; box-shadow:inset 0 1px 2px rgba(0,0,0,.1);}
+.prograss-sm {display:flex; width:100%; height:.5rem; background-color:#f4f5fd; border-radius:.65rem; overflow:hidden; box-shadow:inset 0 1px 2px rgba(0,0,0,.1);}
+.prograss-bar {display:flex; border-top-right-radius:.65rem; border-bottom-right-radius:.65rem; transition:width .6s ease;}
+.prograss-bar.bg-info {background-color:#11c5db;}
+.prograss-txt.bg-info {color:#11c5db; font-weight:bold;}
+.prograss-bar.bg-success {background-color:#1bc943;}
+.prograss-txt.bg-success {color:#1bc943; font-weight:bold;}
+.prograss-bar.bg-danger {background-color:#f83245;}
+.prograss-txt.bg-danger {color:#f83245; font-weight:bold;}
+.prograss-bar.bg-base {background:linear-gradient(135deg,#667eea 0,#764ba2 100%);}
+.prograss-txt.bg-base {color:#8597eb; font-weight:bold;}
+
+/* Multi CheckBox */
+.multiCheckBox {position:relative; display:inline-block; width:auto; line-height:27px; margin:3px 3px 3px 0;}
+.multiCheckBox .sltBtn {padding-left:5px; width:100%; height:27px; color:#555; text-align:left; border:1px solid #dbdbdb; box-sizing:border-box; -webkit-touch-callout:none; -webkit-user-select:none; -ms-user-select:none; user-select:none;}
+.multiCheckBox .sltBtn::after {position:absolute; top:6px; right:10px; content:''; width:7px; height:7px; border-bottom:1px solid #555; border-left:1px solid #555; -webkit-transform:rotate(-45deg); transform:rotate(-45deg);}
+.multiCheckBox .sltBtn.on::after {top:10px; -webkit-transform:rotate(135deg); transform:rotate(135deg);}
+.multiCheckBox ul {display:none; position:absolute; top:26px; left:0; z-index:1; width:100%; height:auto; border:1px solid #dbdbdb; background:#fff;}
+.multiCheckBox li {padding:3px 10px;}
+.multiCheckBox li:hover {background-color:Highlight; color:HighlightText;}
+.multiCheckBox label {display:flex;}
+
+/* checkBox More */
+.checkBoxList {overflow:hidden; padding-right:36px; height:36px;}
+.checkBoxList.on {overflow:visible; height:auto;}
+.checkBoxList .more {position:absolute; top:-1px; right:0; width:36px; height:38px; border:1px solid #eee; background:#f7f7f7;}
+.checkBoxList ul {display:flex; flex-wrap:wrap;}
+.checkBoxList li {justify-content:flex-start; line-height:36px;}
+.checkBoxList[data-unit='1'] li {flex-basis:100%;}
+.checkBoxList[data-unit='2'] li {flex-basis:50%;}
+.checkBoxList[data-unit='3'] li {flex-basis:33%;}
+.checkBoxList[data-unit='4'] li {flex-basis:25%;}
+.checkBoxList[data-unit='5'] li {flex-basis:20%;}
+.checkBoxList[data-unit='6'] li {flex-basis:16.6%;}
+.checkBoxList[data-unit='7'] li {flex-basis:14.2%;}
+.checkBoxList[data-unit='8'] li {flex-basis:12.5%;}
+
+/* 아이콘 툴팁 버튼 */
+.iconTooltip {display:inline-block; position:relative; margin-right:10px;}
+.iconTooltip i {position:relative; color:#46a1ff; width:15px; height:15px; line-height:16px; border-radius:50%; border:1px solid #46a1ff; cursor:pointer; text-align:center;}
+.iconTooltip:hover i {box-shadow:0px 3px 7px 0px rgba(0,0,0,0.4);}
+.iconTooltip span {display:none; position:absolute; top:36px; z-index:5; padding:10px 15px; line-height:24px; color:#fff; background:#6d6d6d; box-shadow:0px 3px 7px 0px rgba(0,0,0,0.2); border-radius:5px;}
+.iconTooltip span:after {position:absolute; top:-4px; content:''; background:#6d6d6d; width:8px; height:8px; -ms-transform:rotate(-45deg); -webkit-transform:rotate(-45deg); transform:rotate(-45deg);}
+.iconTooltip span.left {left:-10px}
+.iconTooltip span.left:after {left:15px;}
+.iconTooltip span.right {right:-10px}
+.iconTooltip span.right:after {right:15px;}
+.iconTooltip span.center {left:50%;}
+.iconTooltip span.center:after {right:5px;}
+.iconTooltip:hover span{display:block;}
+
+/* 상품이동 */
+.itemMove {display:inline-block; width:800px; border:1px solid #eee;}
+.itemMove .item {float:left; display:table; margin:0 10px 20px 0; width:220px; border:1px solid #eee;}
+.itemMove .item li {display:table-cell; vertical-align:top;}
+.itemMove .item li:nth-of-type(1) {width:80px;}
+.itemMove .item li:nth-of-type(1) img {width:80px; height:80px;}
+.itemMove .item button {width:16px; height:16px; text-indent:-9999px;}
+.itemMove .item input {width:30px; height:14px !important; line-height:14px}
+.itemMove .item li:nth-of-type(2) div {line-height:20px}
+
+/* 상품 Dragable :20200129 */
+.sortableWrap #sortable { overflow-y:auto }
+.sortableWrap {margin:20px 0; width:100%; max-height:675px;}
+.sortableWrap .itemWrap {display:inline-block;}
+.sortableWrap .item {float:left; margin-right:12px; margin-bottom:12px; padding:5px 8px; line-height:20px; border:1px solid #ddd; vertical-align:top; background:#fff;}
+.sortableWrap .item > li {float:left; vertical-align:middle;}
+.sortableWrap .item .img {margin-top:3px; margin-right:10px; width:80px;}
+.sortableWrap .item .img img {width:80px; height:80px; cursor:move;}
+.sortableWrap .btnArea {text-align:center; margin-top:15px; padding:0 10px;}
+.sortableWrap button.icnSm {overflow:hidden; position:relative; width:24px; height:20px; background-color:#fff;}
+.sortableWrap button.icnSm i {position:absolute; top:-4px; left:-3px; width:24px; line-height:24px; font-size:15px; color:#888;}
+.sortableWrap button.icnSm:hover i {color:#111;}
+.sortableWrap button.icnSm:last-child {margin-right:0;}
+.sortableWrap .item .cont {width:114px;}
+.sortableWrap .item .cont li em {margin:0 3px 0 7px;}
+.sortableWrap .item .cont .no {font-weight:bold; padding-bottom:3px;}
+.sortableWrap .item .cont .title {padding-bottom:3px; border-bottom:1px solid #eee;}
+.sortableWrap .item .cont .price {padding-top:3px; padding-bottom:3px;}
+.sortableWrap .item .cont input {margin-left:5px; width:37px;}
+
+
+.ag-theme-balham.lh60 .ag-cell {line-height:60px !important; height:60px;}
+.ag-theme-balham.lh70 .ag-cell {line-height:70px !important; height:70px;}
+.ag-theme-balham.lh80 .ag-cell {line-height:80px !important; height:80px;}
+.ag-theme-balham.lh90 .ag-cell {line-height:90px !important; height:90px;}
+.ag-theme-balham.lh100 .ag-cell {line-height:100px !important; height:100px;}
+.ag-theme-balham.lh110 .ag-cell {line-height:110px !important; height:110px;}
+.ag-theme-balham.lh120 .ag-cell {line-height:120px !important; height:120px;}
+
+
+/* 테이블 상품명 클릭시 이미지 레이어 활성화 */
+.viewImg {position:relative; color:blue; cursor:pointer}
+.thumbLayer {display:inline-block; position:absolute; top:0; right:0; z-index:5; border:1px solid #ddd}
+.thumbLayer img {width:100%; height:auto;}
+
+/* dashboard */
+.flexWrap{display:-ms-flexbox; display:flex; -ms-flex-wrap:wrap; flex-wrap:wrap; color:#676a6c;}
+.flexWrap li{padding:0 20px 20px; width:calc(33.3%);}
+.flexWrap.unit4 li{width:calc(25%);}
+.flexWrap.unit5 li{width:calc(20%);}
+.flexWrap.unit6 li{width:calc(16.6%);}
+.flexWrap .title{padding:15px; font-weight:600; border:1px solid #e7eaec; border-top:2px solid #e7eaec;}
+.flexWrap .title h5{font-size:15px; font-weight:bold;}
+.flexWrap .title span{float:right; padding:1px 8px; font-size:10px; border-radius:0.25em;}
+.flexWrap .content{padding:15px; border:1px solid #e7eaec; border-top:none;}
+.flexWrap .content em{font-size:30px; font-weight:200;}
+.statText {margin-top:5px}
+.statText::after{display:block; clear:both; content:''}
+.statText span:nth-of-type(1){float:left; font-size:11px;}
+.statText span:nth-of-type(2){float:right; font-size:13px; font-weight:600;}
+.txt-success{color:#1c84c6;}
+.txt-info{color:#23c6c8;}
+.flexWrap .txt-danger{color:#ed5565;}
+.flexWrap .bg-success{background:#1c84c6;}
+.flexWrap .bg-info{background:#23c6c8;}
+.flexWrap .bg-danger{background:#ed5565;}
+.btn.on{-webkit-box-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);}
+.dbChart .btn-group{float:right; line-height:37px;}
+.dbChart .btn-group button{margin:0; height:23px;}
+.dbChart .boxleft{float:left; margin:20px 15px 20px 15px; width:calc(100% - 490px);}
+.dbChart .boxRight{float:left; margin:20px 20px 20px 40px; width:400px;}
+.dbChart .boxRight em{font-size:24px; font-weight:200;}
+.dbChart .boxRight > div{margin-bottom:25px;}
+.dbChart .boxRight .statText .c1 {color:#FF7043}
+.dbChart .boxRight .progress .c1 {background:#FF7043}
+.dbChart .boxRight .statText .c2 {color:#48C9B0}
+.dbChart .boxRight .progress .c2 {background:#48C9B0}
+.dbChart .boxRight .statText .c3 {color:#ca9900}
+.dbChart .boxRight .progress .c3 {background:#FFD54F}
+.progress{display:-ms-flexbox; display:flex; margin-top:5px; height:1rem; overflow:hidden; font-size:.75rem; background-color:#e9ecef; border-radius:.25rem;}
+.progress-mini{height:5px; margin-bottom:0;}
+.progress > div{height:5px; margin-bottom:0; transition:width 0.3s;}
+
+
+/* 카테고리 Sort */
+.categoryOrder {margin-bottom:15px; background:#fcfcfc;}
+.categoryOrder li {clear:both; padding-left:15px; line-height:40px; cursor:move; border-top:1px dashed red; }
+.categoryOrder li button.on {background-image:url(/image/icon_cate_minus.png);}
+/* .categoryOrder li:after {content:''; position:absolute; top:8px; left:-10px; width:21px; height:21px; background:url(/image/line_cate.png)} */
+.categoryOrder li:before{position:relative; content:''; width:1px; height:100%; background:#ddd;}
+.categoryOrder li ol{display:none}
+/* .categoryOrder ol:last-child li {background-image:none !important} */
+.categoryOrder button{position:relative; z-index:200; padding:0 15px 0; margin:0; line-height:40px; cursor:pointer; background-image:url(/image/icon_cate_plus.png); background-repeat:no-repeat; background-position:0 0;}
+
+
+
+/* 반응형:GNB 유저명,등급,로그아웃 --------------- */
+@media ( max-width:1370px ) {
+ .header-info { display:none;}
+ .header-info-sm { display:inline-block;}
+}
+
+/* 반응형 :dashboard(20200522) --------------- */
+@media ( max-width:1023px ) {
+ /* 대시보드 */
+ #wrapper.dashboard{width:100%; min-width:100%;}
+ .dashboard .header-logo{width:100%}
+ .dashboard #lnb-wrapper{display:none;}
+ .dashboard .header-menu{display:none;}
+ .dashboard .tabs{margin-left:0; margin-right:0;}
+ .dashboard .tabs h2{position:relative; margin:10px 15px}
+ .dashboard .tabsNav li:first-child{margin-left:0}
+ .dashboard .tabsNav li:last-child{margin-right:0}
+ .dashboard .tabsNav li a{font-size:16px}
+ .dashboard .flexWrap li{width:100%}
+ .dashboard .flexWrap.unit4 li{width:100%}
+ .dashboard .flexWrap.unit5 li{width:100%}
+ .dashboard .flexWrap.unit6 li{width:100%}
+ .dashboard .boxStyle{margin-left:0; margin-right:0;}
+ .dashboard .dbChart .boxleft{clear:left; margin:30px 15px 0 0; width:100%;}
+ .dashboard .dbChart .boxRight{clear:right; width:100%; margin:30px 20px 20px;}
+}
+
+/* Fix Input Zoom on devices older than iPhone 5:*/
+@media screen and (device-aspect-ratio:2/3) {
+  select, textarea, input[type="text"], input[type="password"],
+  input[type="datetime"], input[type="datetime-local"],
+  input[type="date"], input[type="month"], input[type="time"],
+  input[type="week"], input[type="number"], input[type="email"],
+  input[type="url"]{ font-size:16px;}
+}
+
+/* Fix Input Zoom on iPhone 5, 5C, 5S, iPod Touch 5g */
+@media screen and (device-aspect-ratio:40/71) {
+  select, textarea, input[type="text"], input[type="password"],
+  input[type="datetime"], input[type="datetime-local"],
+  input[type="date"], input[type="month"], input[type="time"],
+  input[type="week"], input[type="number"], input[type="email"],
+  input[type="url"]{ font-size:16px;}
+}
+
+/* Fix Input Zoom on iPhone 6, iPhone 6s, iPhone 7 */
+@media screen and (device-aspect-ratio:375/667) {
+  select, textarea, input[type="text"], input[type="password"],
+  input[type="datetime"], input[type="datetime-local"],
+  input[type="date"], input[type="month"], input[type="time"],
+  input[type="week"], input[type="number"], input[type="email"],
+  input[type="url"]{ font-size:16px;}
+}
+
+/* Fix Input Zoom on iPhone 6 Plus, iPhone 6s Plus, iPhone 7 Plus, iPhone 8, iPhone X, XS, XS Max */
+@media screen and (device-aspect-ratio:9/16) {
+  select, textarea, input[type="text"], input[type="password"],
+  input[type="datetime"], input[type="datetime-local"],
+  input[type="date"], input[type="month"], input[type="time"],
+  input[type="week"], input[type="number"], input[type="email"],
+  input[type="url"]{ font-size:16px;}
 }