Просмотр исходного кода

Merge branch 'develop' into bin2107

bin2107 5 лет назад
Родитель
Сommit
21e19448e6
28 измененных файлов с 1428 добавлено и 436 удалено
  1. 40 0
      src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java
  2. 141 1
      src/main/java/com/style24/admin/biz/service/TsaGoodsService.java
  3. 34 8
      src/main/java/com/style24/admin/biz/service/TsaPlanService.java
  4. 7 0
      src/main/java/com/style24/admin/biz/service/TsaStockService.java
  5. 3 2
      src/main/java/com/style24/admin/biz/web/TsaCommonController.java
  6. 20 2
      src/main/java/com/style24/admin/biz/web/TsaEnvsetController.java
  7. 158 10
      src/main/java/com/style24/admin/biz/web/TsaGoodsController.java
  8. 7 0
      src/main/java/com/style24/admin/biz/web/TsaStockController.java
  9. 2 1
      src/main/java/com/style24/persistence/domain/Goods.java
  10. 3 0
      src/main/java/com/style24/persistence/domain/GoodsSearch.java
  11. 14 2
      src/main/java/com/style24/persistence/domain/Plan.java
  12. 144 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  13. 2 2
      src/main/java/com/style24/persistence/mybatis/shop/TsaMailTemplate.xml
  14. 6 7
      src/main/java/com/style24/persistence/mybatis/shop/TsaPlan.xml
  15. 1 1
      src/main/resources/config/application-locd.yml
  16. 1 1
      src/main/resources/config/application-locp.yml
  17. 5 6
      src/main/webapp/WEB-INF/views/envset/BasicEnvsetForm.html
  18. 128 290
      src/main/webapp/WEB-INF/views/envset/BenefitEnvsetForm.html
  19. 55 51
      src/main/webapp/WEB-INF/views/envset/EnvsetHistoryForm.html
  20. 14 0
      src/main/webapp/WEB-INF/views/goods/GoodsFreeGoodsForm.html
  21. 26 0
      src/main/webapp/WEB-INF/views/goods/GoodsListForm.html
  22. 13 0
      src/main/webapp/WEB-INF/views/goods/GoodsNaverPriceForm.html
  23. 13 0
      src/main/webapp/WEB-INF/views/goods/GoodsNotiInfoForm.html
  24. 433 0
      src/main/webapp/WEB-INF/views/goods/GoodsQuikDeliverySkipForm.html
  25. 13 0
      src/main/webapp/WEB-INF/views/goods/GoodsTitleReserveForm.html
  26. 18 6
      src/main/webapp/WEB-INF/views/marketing/MktmailmanagementDetailForm.html
  27. 1 1
      src/main/webapp/WEB-INF/views/marketing/MktmailmanagementPreviewForm.html
  28. 126 45
      src/main/webapp/WEB-INF/views/marketing/PlanTemplatePopupForm.html

+ 40 - 0
src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java

@@ -1178,5 +1178,45 @@ public interface TsaGoodsDao {
 	 * @since 2021. 01. 27
 	 */
 	void saveSizeInfo(SizeInfo sizeInfo);
+	
+	/**
+	 * 총알배송 제외 상품 목록
+	 *
+	 * @param sizeInfo
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 25
+	 */
+	Collection<Goods> getGoodsQuikDeleverySkipList(GoodsSearch goodsSearch);
+	
+	/**
+	 * 총알배송 제외 상품 건수
+	 *
+	 * @param sizeInfo
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 25
+	 */
+	int getGoodsQuikDeleverySkipCount(GoodsSearch goodsSearch);
+	
+	/**
+	 * 총알배송 제외 상품 저장
+	 *
+	 * @param sizeInfo
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 25
+	 */
+	void createGoodsQuikDeleverySkip(Goods goods);
+	
+	/**
+	 * 총알배송 제외 상품 삭제
+	 *
+	 * @param sizeInfo
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 25
+	 */
+	void deleteGoodsQuikDeleverySkip(Goods goods);
 
 }

+ 141 - 1
src/main/java/com/style24/admin/biz/service/TsaGoodsService.java

@@ -117,6 +117,8 @@ public class TsaGoodsService {
 	private static final String UPDATE_NO_PATTERN = "X";
 
 	private static final String SELF_GOOODS_AFTER = "STY";
+	
+	private static final int EXCEL_ROW_COUNT = 1000;
 
 	/**
 	 * 상품 할인율 계산
@@ -795,6 +797,12 @@ public class TsaGoodsService {
 			throw new IllegalStateException(message.getMessage("FAIL_1001"));
 		}
 
+		//건수
+		if (goodsList != null && goodsList.size() > EXCEL_ROW_COUNT) {
+			throw new IllegalStateException("엑셀 파일의 건수를 " +EXCEL_ROW_COUNT + "건 이하로 사용하세요.");
+		}
+
+				
 		int index = 0;
 		String goodsCdFlag = "";
 		String goodsNumFlag = "";
@@ -2031,7 +2039,12 @@ public class TsaGoodsService {
 			this.deleteExceluploadFile(targetPath, excelFilename);
 			throw new IllegalStateException(message.getMessage("FAIL_1001"));
 		}
+		//건수
+		if (goodsPriceList != null && goodsPriceList.size() > EXCEL_ROW_COUNT) {
+			throw new IllegalStateException("엑셀 파일의 건수를 " +EXCEL_ROW_COUNT + "건 이하로 사용하세요.");
+		}
 
+		
 		// 입력값 확인
 		String goodsPriceResvCheck = getGoodsPriceResvCheck(goodsPriceList);
 		if (!"SUCC".equals(goodsPriceResvCheck)) {
@@ -2375,7 +2388,7 @@ public class TsaGoodsService {
 				//log.info("saveGoodsNaverLowestPrice  22 =  {}", GagaDateUtil.getTodayDateTime());
 				NaverLowestPrice naverLowestPrice = naverLowestPriceApi.getLowestPrice(goodsCd);
 
-				log.info("[saveGoodsNaverLowestPrice] naverLowestPrice= {}", naverLowestPrice);
+				//log.info("[saveGoodsNaverLowestPrice] naverLowestPrice= {}", naverLowestPrice);
 				if (naverLowestPrice != null && naverLowestPrice.getTotal() > 0) {
 					GoodsNaverLowestPrice goodsNaverLowestPrice = new GoodsNaverLowestPrice();
 					goodsNaverLowestPrice.setReqYmd(GagaDateUtil.getToday());
@@ -3580,4 +3593,131 @@ public class TsaGoodsService {
 		goodsDao.saveSizeInfo(sizeInfo);
 	}
 
+	/**
+	 * 총알배송 제외 상품 건수
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 25
+	 */
+	public int getGoodsQuikDeleverySkipCount(GoodsSearch goodsSearch) {
+		return goodsDao.getGoodsQuikDeleverySkipCount(goodsSearch);
+	}
+
+	/**
+	 * 총알배송 제외 상품 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 25
+	 */
+	public Collection<Goods> getGoodsQuikDeleverySkipList(GoodsSearch goodsSearch) {
+		return goodsDao.getGoodsQuikDeleverySkipList(goodsSearch);
+	}
+
+	/**
+	 * 총알배송 제외 상품 저장
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2021. 02. 25
+	 */
+	@Transactional("shopTxnManager")
+	public void createGoodsQuikDeleverySkip(Goods goods) {
+		if (goods.getArrGoodsCd().length <= 0) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+		
+		GoodsSearch search = new GoodsSearch();
+		search.setConditionList(goods.getArrGoodsCd());
+		search.setSearch("searchGoodsCd");
+		int cnt = getGoodsListCount(search);
+		if (cnt < goods.getArrGoodsCd().length ) {
+			throw new IllegalStateException("상품코드를 확인해주세요.");
+		}
+
+		goods.setRegNo(TsaSession.getInfo().getUserNo());
+		goods.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		for (String goodsCd : goods.getArrGoodsCd()) {
+
+			goods.setGoodsCd(goodsCd);
+
+			goodsDao.createGoodsQuikDeleverySkip(goods);
+
+		}
+	}
+
+	/**
+	 * 총알배송 제외 상품 삭제
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2021. 02. 25
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteGoodsQuikDeleverySkip(Goods goods) {
+		if (goods.getArrGoodsCd().length <= 0) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+		goodsDao.deleteGoodsQuikDeleverySkip(goods);
+	}
+
+	/**
+	 * 상품 입출고 엑셀조회용 상품 저장
+	 *
+	 * @param procJob : goodsExcelUpload
+	 * @param goodsSizeList
+	 * @return
+	 * @author eskim
+	 * @since 2020. 02. 13
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsSizeSoldoutExcelupload(Collection<Goods> goodsList, String excelFilename) {
+
+		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
+		if (goodsList == null || goodsList.isEmpty()) {
+			this.deleteExceluploadFile(targetPath, excelFilename);
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+		
+		//건수
+		if (goodsList != null && goodsList.size() > EXCEL_ROW_COUNT) {
+			throw new IllegalStateException("엑셀 파일의 건수를 " +EXCEL_ROW_COUNT + "건 이하로 사용하세요.");
+		}
+		
+		// 검증
+		GoodsSearch search = new GoodsSearch();
+		search.setSearch("searchGoodsCd");
+		
+		int index = 0;
+		for (Goods goods : goodsList) {
+			
+			search.setGoodsCd(goods.getGoodsCd());
+			int cnt = getGoodsListCount(search);
+			if (cnt == 0 ) {
+				throw new IllegalStateException("상품코드를 확인해주세요.");
+			}
+			
+			goods.setRegNo(TsaSession.getInfo().getUserNo());
+
+			// 엑셀조회를 위한 SEARCH 테이블 생성
+			SearchData searchData = new SearchData();
+			searchData.setRegNo(goods.getRegNo());
+			searchData.setSearchCd(goods.getGoodsCd());
+			searchData.setDispOrd(index);
+			if (index == 0) {
+				commonService.deleteExceluploadSearCh(searchData);
+			}
+
+			commonService.createExceluploadSearch(searchData);
+
+			goodsDao.createGoodsQuikDeleverySkip(goods);
+			
+			index++;
+		}
+		
+	}
 }

+ 34 - 8
src/main/java/com/style24/admin/biz/service/TsaPlanService.java

@@ -3,8 +3,12 @@ package com.style24.admin.biz.service;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.session.SqlSession;
+import org.mybatis.spring.SqlSessionTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
@@ -858,16 +862,38 @@ public class TsaPlanService {
 		Integer regNo = TsaSession.getInfo().getUserNo();
 		// 리뷰 등록
 		Plan rePlan = new Plan();
-		String[] reviewData = param.getAllReviewData();
-		
+		System.out.println("====="+param.getReTitle());
+		System.out.println("====="+param.getReDispYn());
+		System.out.println("====="+param.getMultiPlanReview().length);
 		//리뷰 등록 - tb_plan_contents
-		rePlan.setRegNo(regNo);
-		rePlan.setUpdNo(regNo);
-		rePlan.setTmplType("G082_20");
-		rePlan.setTitle(param.getReTitle());
-		rePlan.setDispYn(param.getReDispYn());
-		rePlan.setDispOrd(param.getReDispOrd());
+		if(!param.getReTitle().equals(null) || param.getMultiPlanReview().length>0) {
+			rePlan.setRegNo(regNo);
+			rePlan.setUpdNo(regNo);
+			rePlan.setTmplType("G082_20");
+			rePlan.setPlanSq(param.getPlanSq());
+			rePlan.setTitle(param.getReTitle());
+			rePlan.setDispYn(param.getReDispYn());
+			rePlan.setDispOrd(param.getReDispOrd());
+			planDao.createPlanContents(rePlan);
+
+			//리뷰 아이템 등록
+			if(param.getMultiPlanReview().length>0) {
+				String[] reItemVal = param.getMultiPlanReview();
+				String[] startDate = param.getMultiPlanReviewStartD();
+				String[] startTime = param.getMultiPlanReviewStartT();
+				String[] endDate = param.getMultiPlanReviewEndD();
+				String[] endTime = param.getMultiPlanReviewEndT();
+				// 기획전 브랜드 insert
+				for (int j = 0; j < reItemVal.length; j++) {
+					rePlan.setItemVal(reItemVal[j]);
+					rePlan.setReviewDispStdt(startDate[j] + ' ' +startTime[j]);
+					rePlan.setReviewDispEddt(endDate[j] + ' ' +endTime[j]);
+				}
+				planDao.createPlanContentsItem(rePlan);
+			}
+		}
 		
+		// 쿠폰등록
 		
 		
 	}

+ 7 - 0
src/main/java/com/style24/admin/biz/service/TsaStockService.java

@@ -50,6 +50,8 @@ public class TsaStockService {
 	@Autowired
 	private TsaGoodsService goodsService;
 
+	private static final int EXCEL_ROW_COUNT = 1000;
+	
 	/**
 	 * 상품 사이즈별 재고 현황 목록 건수
 	 *
@@ -128,6 +130,11 @@ public class TsaStockService {
 			this.deleteExceluploadFile(targetPath, excelFilename);
 			throw new IllegalStateException(message.getMessage("FAIL_1001"));
 		}
+		
+		//건수
+		if (goodsSizeList != null && goodsSizeList.size() > EXCEL_ROW_COUNT) {
+			throw new IllegalStateException("엑셀 파일의 건수를 " +EXCEL_ROW_COUNT + "건 이하로 사용하세요.");
+		}
 
 		// 입력값 확인
 		String goodsSizeSoldoutCheck = getGoodsSizeSoldoutCheck(goodsSizeList);

+ 3 - 2
src/main/java/com/style24/admin/biz/web/TsaCommonController.java

@@ -91,12 +91,13 @@ public class TsaCommonController extends TsaBaseController {
 	@PostMapping("/file/upload")
 	@ResponseBody
 	public GagaUploadedFileInfo uploadFile(@RequestParam(value = "subDir") String subDir, @RequestParam(value = "policy", required = false) String policy, MultipartFile file) throws IOException {
+		log.info("policy111 ={}", policy);
 		if (StringUtils.isEmpty(policy)) {
 			policy = "default";
 		}
-
+		log.info("policy ={}", policy);
 		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload." + policy + ".target.path"), subDir);
-
+		log.info("targetPath ={}", targetPath);
 		GagaFileUploadUtil fuUtil = new GagaFileUploadUtil(targetPath, Long.parseLong(env.getProperty("upload." + policy + ".max.size")), env.getProperty("upload." + policy + ".allow.extension"), env.getProperty("upload." + policy + ".view"));
 
 		GagaUploadedFileInfo ufInfo = fuUtil.uploadFile(file);

+ 20 - 2
src/main/java/com/style24/admin/biz/web/TsaEnvsetController.java

@@ -65,7 +65,7 @@ public class TsaEnvsetController extends TsaBaseController {
 	 * @since 2020. 10. 21
 	 */
 	@GetMapping("/basic/form")
-	public ModelAndView basicSetForm() {
+	public ModelAndView basicEnvsetForm() {
 		ModelAndView mav = new ModelAndView();
 
 		// 사이트 목록
@@ -123,7 +123,7 @@ public class TsaEnvsetController extends TsaBaseController {
 	 * @since 2020. 10. 21
 	 */
 	@GetMapping("/history/form")
-	public ModelAndView basicSetForm(@RequestParam(value = "siteCd", required = true) String siteCd, @RequestParam(value = "envsetType", required = true) String envsetType, @RequestParam(value = "envsetTypeNm", required = true) String envsetTypeNm) {
+	public ModelAndView envsetHistoryForm(@RequestParam(value = "siteCd", required = true) String siteCd, @RequestParam(value = "envsetType", required = true) String envsetType, @RequestParam(value = "envsetTypeNm", required = true) String envsetTypeNm) {
 		ModelAndView mav = new ModelAndView();
 
 		mav.addObject("siteCd", siteCd);
@@ -149,6 +149,24 @@ public class TsaEnvsetController extends TsaBaseController {
 		return envsetService.getEnvsetHistoryList(siteCd, envsetType);
 	}
 
+	/**
+	 * 회원혜택설정 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 2. 25
+	 */
+	@GetMapping("/benefit/form")
+	public ModelAndView benefitEnvsetForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트 목록
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+
+		mav.setViewName("envset/BenefitEnvsetForm");
+
+		return mav;
+	}
+
 	/**
 	 * 회원등급정책관리 화면
 	 * @return

+ 158 - 10
src/main/java/com/style24/admin/biz/web/TsaGoodsController.java

@@ -106,6 +106,8 @@ public class TsaGoodsController extends TsaBaseController {
 	@Autowired
 	private ObjectMapper mapper;
 
+	private static final int EXCEL_ROW_COUNT = 1000;
+	
 	/**
 	 * 품목관리 화면
 	 *
@@ -494,7 +496,7 @@ public class TsaGoodsController extends TsaBaseController {
 	@ResponseBody
 	public GagaMap getGoodsList(@RequestBody GoodsSearch goodsSearch) {
 
-		log.info("[getGoodsList] goodsSearch = {}", goodsSearch);
+		//log.info("[getGoodsList] goodsSearch = {}", goodsSearch);
 		GagaMap result = new GagaMap();
 
 		// 입점업체담당자는 업체코드 설정
@@ -519,7 +521,7 @@ public class TsaGoodsController extends TsaBaseController {
 				goodsSearch.setMultiBrand(arrBrandCd);
 			} catch (Exception e) {
 				e.printStackTrace();
-				throw new IllegalStateException(message.getMessage("브랜드코드 검색중 오류로 인해 조회되지 않았습니다."));
+				throw new IllegalStateException("브랜드코드 검색중 오류로 인해 조회되지 않았습니다.");
 			}
 		}
 
@@ -529,7 +531,7 @@ public class TsaGoodsController extends TsaBaseController {
 				goodsSearch.setMultiSupplyCompCd(arrSupplyComp);
 			} catch (Exception e) {
 				e.printStackTrace();
-				throw new IllegalStateException(message.getMessage("업체코드 검색중 오류로 인해 조회되지 않았습니다."));
+				throw new IllegalStateException("업체코드 검색중 오류로 인해 조회되지 않았습니다.");
 			}
 		}
 
@@ -701,7 +703,12 @@ public class TsaGoodsController extends TsaBaseController {
 		String[] cellName = {"goodsCd", "supplyGoodsCd"};
 
 		Collection<GagaMap> ecxelGoodsList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, goods.getExcelFileNm()), 0, cellName, 0);
-
+		
+		//건수
+		if (ecxelGoodsList != null && ecxelGoodsList.size() > EXCEL_ROW_COUNT) {
+			throw new IllegalStateException("엑셀 파일의 건수를 " +EXCEL_ROW_COUNT + "건 이하로 사용하세요.");
+		}
+		
 		Collection<Goods> goodsList = new ArrayList<>();
 		for (GagaMap map : ecxelGoodsList) {
 			Goods tmpGoods = mapper.convertValue(map, Goods.class);
@@ -1430,7 +1437,7 @@ public class TsaGoodsController extends TsaBaseController {
 				goodsPriceRes.setMultiBrand(arrBrandCd);
 			} catch (Exception e) {
 				e.printStackTrace();
-				throw new IllegalStateException(message.getMessage("브랜드코드 검색중 오류로 인해 조회되지 않았습니다."));
+				throw new IllegalStateException("브랜드코드 검색중 오류로 인해 조회되지 않았습니다.");
 			}
 		}
 
@@ -1440,7 +1447,7 @@ public class TsaGoodsController extends TsaBaseController {
 				goodsPriceRes.setMultiSupplyComp(arrSupplyComp);
 			} catch (Exception e) {
 				e.printStackTrace();
-				throw new IllegalStateException(message.getMessage("업체코드 검색중 오류로 인해 조회되지 않았습니다."));
+				throw new IllegalStateException("업체코드 검색중 오류로 인해 조회되지 않았습니다.");
 			}
 		}
 		return goodsService.getGoodsSupplyPriceList(goodsPriceRes);
@@ -1739,7 +1746,7 @@ public class TsaGoodsController extends TsaBaseController {
 				goodsSearch.setMultiBrand(arrBrandCd);
 			} catch (Exception e) {
 				e.printStackTrace();
-				throw new IllegalStateException(message.getMessage("브랜드코드 검색중 오류로 인해 조회되지 않았습니다."));
+				throw new IllegalStateException("브랜드코드 검색중 오류로 인해 조회되지 않았습니다.");
 			}
 		}
 
@@ -1749,7 +1756,7 @@ public class TsaGoodsController extends TsaBaseController {
 				goodsSearch.setMultiSupplyCompCd(arrSupplyComp);
 			} catch (Exception e) {
 				e.printStackTrace();
-				throw new IllegalStateException(message.getMessage("업체코드 검색중 오류로 인해 조회되지 않았습니다."));
+				throw new IllegalStateException("업체코드 검색중 오류로 인해 조회되지 않았습니다.");
 			}
 		}
 
@@ -2159,7 +2166,7 @@ public class TsaGoodsController extends TsaBaseController {
 				goodsSearch.setMultiBrand(arrBrandCd);
 			} catch (Exception e) {
 				e.printStackTrace();
-				throw new IllegalStateException(message.getMessage("브랜드코드 검색중 오류로 인해 조회되지 않았습니다."));
+				throw new IllegalStateException("브랜드코드 검색중 오류로 인해 조회되지 않았습니다.");
 			}
 		}
 
@@ -2169,7 +2176,7 @@ public class TsaGoodsController extends TsaBaseController {
 				goodsSearch.setMultiSupplyCompCd(arrSupplyComp);
 			} catch (Exception e) {
 				e.printStackTrace();
-				throw new IllegalStateException(message.getMessage("업체코드 검색중 오류로 인해 조회되지 않았습니다."));
+				throw new IllegalStateException("업체코드 검색중 오류로 인해 조회되지 않았습니다.");
 			}
 		}
 		//log.info("[getPopupGoodsList] goodsSearch=>{}", goodsSearch);
@@ -2317,6 +2324,11 @@ public class TsaGoodsController extends TsaBaseController {
 
 		Collection<GagaMap> ecxelGoodsList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, goods.getExcelFileNm()), 0, cellName, 0);
 
+		//건수
+		if (ecxelGoodsList != null && ecxelGoodsList.size() > EXCEL_ROW_COUNT) {
+			throw new IllegalStateException("엑셀 파일의 건수를 " +EXCEL_ROW_COUNT + "건 이하로 사용하세요.");
+		}
+		
 		Collection<GoodsPriceRes> goodsPriceList = new ArrayList<>();
 		for (GagaMap map : ecxelGoodsList) {
 			GoodsPriceRes goodsPriceRes = mapper.convertValue(map, GoodsPriceRes.class);
@@ -2659,6 +2671,11 @@ public class TsaGoodsController extends TsaBaseController {
 
 		ecxelGoodsList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, goodsMass.getExcelFileNm()), 0, goodsNames, 0);
 
+		//건수
+		if (ecxelGoodsList != null && ecxelGoodsList.size() > EXCEL_ROW_COUNT) {
+			throw new IllegalStateException("엑셀 파일의 건수를 " +EXCEL_ROW_COUNT + "건 이하로 사용하세요.");
+		}
+		
 		// 입점담당자, 촬영업체
 		if (!"G001_0000".equals(TsaSession.getInfo().getRoleCd()) && !"G001_A000".equals(TsaSession.getInfo().getRoleCd()) &&
 			!"G001_A001".equals(TsaSession.getInfo().getRoleCd()) && !"G001_A100".equals(TsaSession.getInfo().getRoleCd()) &&
@@ -2739,4 +2756,135 @@ public class TsaGoodsController extends TsaBaseController {
 		goodsService.saveSizeInfo(sizeInfo);
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
+	
+	/**
+	 * 총알배송 제외상품 관리
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 25
+	 */
+	@GetMapping("/quik/delivery/skip/form")
+	@ResponseBody
+	public ModelAndView quikDeliveryForm() {
+
+		ModelAndView mav = new ModelAndView();
+		// 시즌
+		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
+		// 년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear, 0, 5));
+		// 상품상태
+		String[] exceptCds = {"G008_00"};
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
+		
+		mav.setViewName("goods/GoodsQuikDeliverySkipForm");
+		return mav;
+	}
+	
+	/**
+	 * 총알배송 제외상품 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 25
+	 */
+	@PostMapping("/quik/delivery/list")
+	@ResponseBody
+	public GagaMap goodsQuikDeliveryList(@RequestBody GoodsSearch goodsSearch) {
+
+		GagaMap result = new GagaMap();
+
+		// multi row 검색관련 처리
+		if (!StringUtils.isBlank(goodsSearch.getCondition())) {
+			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
+		}
+
+		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
+		goodsSearch.setPageable(new TscPageRequest(goodsSearch.getPageNo() - 1, goodsSearch.getPageSize()));
+		goodsSearch.getPageable().setTotalCount(goodsService.getGoodsQuikDeleverySkipCount(goodsSearch));
+
+		result.set("pageing", goodsSearch);
+		result.set("goodsList", goodsService.getGoodsQuikDeleverySkipList(goodsSearch));
+
+		return result;
+	}
+	
+	/**
+	 * 총알배송 제외상품 저장
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 25
+	 */
+	@PostMapping("/quik/delivery/create")
+	@ResponseBody
+	public GagaResponse createGoodsQuikDeleverySkip(@RequestBody GoodsSearch goodsSearch) {
+		
+		Goods goods = new Goods();
+		// multi row 검색관련 처리
+		if (!StringUtils.isBlank(goodsSearch.getCondition())) {
+			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
+			goods.setArrGoodsCd(goodsSearch.getConditionList());
+		}
+		
+		goodsService.createGoodsQuikDeleverySkip(goods);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+	
+
+	/**
+	 * 총알배송 제외상품 삭제
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 25
+	 */
+	@PostMapping("/quik/delivery/delete")
+	@ResponseBody
+	public GagaResponse deleteGoodsQuikDeleverySkip(@RequestBody Goods goods) {
+		goodsService.deleteGoodsQuikDeleverySkip(goods);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
+	/**
+	 * 총알배송 제외상품 엑셀 적용
+	 *
+	 * @param goods
+	 * @return
+	 * @throws Exception
+	 * @author eskim
+	 * @since 2020. 02. 20
+	 */
+	@PostMapping("/quik/delivery/excelupload/save")
+	@ResponseBody
+	public GagaResponse saveGoodsSizeSoldoutExcelupload(@RequestBody Goods goods) throws Exception {
+
+		ObjectMapper mapper = new ObjectMapper();
+
+		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
+		// DB 처리 시 사용되는 파라미터명(셀명) 설정
+		String[] cellName = { "goodsCd"};
+
+		Collection<GagaMap> ecxelGoodsList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, goods.getExcelFileNm()), 0, cellName, 0);
+		
+		//건수
+		if (ecxelGoodsList != null && ecxelGoodsList.size() > EXCEL_ROW_COUNT) {
+			throw new IllegalStateException("엑셀 파일의 건수를 " +EXCEL_ROW_COUNT + "건 이하로 사용하세요.");
+		}
+
+		Collection<Goods> goodsList = new ArrayList<>();
+		for (GagaMap map : ecxelGoodsList) {
+			Goods tmpGoods = mapper.convertValue(map, Goods.class);
+			goodsList.add(tmpGoods);
+		}
+
+		goodsService.saveGoodsSizeSoldoutExcelupload(goodsList, goods.getExcelFileNm());
+
+		// 파일 삭제
+		GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, goods.getExcelFileNm()));
+
+		return super.ok("");
+	}
 }

+ 7 - 0
src/main/java/com/style24/admin/biz/web/TsaStockController.java

@@ -63,6 +63,8 @@ public class TsaStockController extends TsaBaseController {
 
 	@Autowired
 	private ObjectMapper mapper;
+	
+	private static final int EXCEL_ROW_COUNT = 1000;
 
 	/**
 	 * 사이즈별재고현황 화면
@@ -207,6 +209,11 @@ public class TsaStockController extends TsaBaseController {
 
 		Collection<GagaMap> ecxelGoodsList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, goods.getExcelFileNm()), 0, cellName, 0);
 
+		//건수
+		if (ecxelGoodsList != null && ecxelGoodsList.size() > EXCEL_ROW_COUNT) {
+			throw new IllegalStateException("엑셀 파일의 건수를 " +EXCEL_ROW_COUNT + "건 이하로 사용하세요.");
+		}
+		
 		Collection<Option> goodsSizeList = new ArrayList<>();
 		for (GagaMap map : ecxelGoodsList) {
 			Option tmpGoods = mapper.convertValue(map, Option.class);

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

@@ -78,8 +78,9 @@ public class Goods extends TscBaseDomain {
 	private String adultYn;		//성인용품여부
 
 	private String brandEnm;		//브랜드영문명
-	private String brandGrpNm;		//브랜드그룹명
+	private String brandGroupNm;	//브랜드그룹명
 	private int brandNo;			//브랜드번호
+	private String supplyCompNm;	//업체명
 	private String supplyVendorCd;	//벤더코드
 
 	private String goodsDesc;		//상품상세(as-is, 입점)

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

@@ -112,6 +112,9 @@ public class GoodsSearch extends TscBaseDomain {
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] conditionList;
 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrGoodsCd;
+	
 	/* 다다익선 Multi 추가 */
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] multiSupplyCompCd;

+ 14 - 2
src/main/java/com/style24/persistence/domain/Plan.java

@@ -1,7 +1,10 @@
 package com.style24.persistence.domain;
 
 
+import java.util.Collection;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.admin.biz.dao.TsaPlanDao;
 import com.style24.persistence.TscBaseDomain;
 import com.style24.persistence.TscPageRequest;
 
@@ -166,14 +169,23 @@ public class Plan extends TscBaseDomain{
 		private String reviewDispStdt;		//리뷰노출시작일시
 		private String reviewDispEddt;		//리뷰노툴종료일시
 		
-		private String[] allReviewData;		//리뷰상품목록
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanReview;		//리뷰상품목록
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanReviewStartD;		//리뷰상품목록
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanReviewStartT;		//리뷰상품목록
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanReviewEndD;		//리뷰상품목록
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiPlanReviewEndT;		//리뷰상품목록
+		
 		private String reTitle;				//리뷰타이틀
 		private String mode;				//모드
 		private long reDispOrd;				//리뷰전시순서
 		private String reItemVal;			//리뷰아이템
 		private String reDispYn;			//리뷰전시여부
 		
-				
 		
 		
 		// Pagination

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

@@ -550,6 +550,12 @@
 		        </if>
 		        <if test="goodsCd != null and goodsCd != ''">
 		        AND UPPER(G.GOODS_CD) LIKE CONCAT('%',UPPER(#{goodsCd}),'%')
+		        </if>
+		        <if test="arrGoodsCd != null and arrGoodsCd.length>0">
+		        AND UPPER(G.GOODS_CD) IN
+		            <foreach collection="arrGoodsCd" item="item" index="index"  open="(" close=")" separator=",">
+		        UPPER(#{item})
+		            </foreach>
 		        </if>
 		         <if test="goodsNm != null and goodsNm != ''">
 		        AND UPPER(G.GOODS_NM) LIKE CONCAT('%',UPPER(#{goodsNm}),'%')
@@ -4442,4 +4448,142 @@
 		      ,UPD_DT = NOW()
 	</insert>
 	
+	<!-- 총알배송 제외 상품 건수 -->
+	<select id="getGoodsQuikDeleverySkipCount" parameterType="GoodsSearch" resultType="int">
+		/* TsaGoods.getGoodsQuikDeleverySkipCount */
+		SELECT COUNT(*)
+		FROM TB_GOODS_QUICK_DELEVERY_SKIP A
+		INNER JOIN TB_GOODS G ON A.GOODS_CD = G.GOODS_CD
+		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		INNER JOIN TB_BRAND_GROUP D ON B.BRAND_GROUP_NO  = D.BRAND_GROUP_NO
+		INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
+		<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_CD LIKE CONCAT(SD.SEARCH_CD,'%')
+		               OR G.SUPPLY_GOODS_CD 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="searchGb == null or searchGb =='BASIC'" >
+		    <if test="stDate != null and stDate != ''">
+		AND A.REG_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		    </if>
+		    <if test="edDate != null and stDate != ''">
+		    <![CDATA[
+		AND A.REG_DT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		    ]]>
+		    </if>
+		<include refid="getGoodsListCondition_sql"/>
+		</if>
+	</select>
+	
+	<!-- 총알배송 제외 상품 목록 -->
+	<select id="getGoodsQuikDeleverySkipList" parameterType="GoodsSearch" resultType="Goods">
+		/* TsaGoods.getGoodsQuikDeleverySkipList */
+		SELECT Q.* 
+		FROM (
+		SELECT Z.*
+		FROM (
+		    SELECT A.*, @rownum := @rownum + 1 AS RNUM 
+		    FROM (
+		SELECT G.GOODS_CD
+		     , G.GOODS_NM
+		     , G.GOODS_STAT
+		     , G.SUPPLY_COMP_CD
+		     , S.SUPPLY_COMP_NM
+		     , G.BRAND_CD
+		     , (CASE WHEN D.DISP_NM_LANG = 'EN' THEN D.BRAND_GROUP_ENM ELSE D.BRAND_GROUP_KNM END) AS BRAND_GROUP_NM
+		     , FN_GET_USER_NM(A.REG_NO) AS REG_NM 
+		     , DATE_FORMAT(A.REG_DT, '%Y%m%d%H%i%S') AS REG_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_QUICK_DELEVERY_SKIP A
+		JOIN ( SELECT @rownum := 0) R
+		INNER JOIN TB_GOODS G ON A.GOODS_CD = G.GOODS_CD
+		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		INNER JOIN TB_BRAND_GROUP D ON B.BRAND_GROUP_NO  = D.BRAND_GROUP_NO
+		INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
+		<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_CD LIKE CONCAT(SD.SEARCH_CD,'%')
+		</if>
+		WHERE 1=1
+		        <if test="searchGb == null or searchGb =='BASIC'" >
+		            <if test="stDate != null and stDate != ''">
+		AND A.REG_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		            </if>
+		            <if test="edDate != null and stDate != ''">
+		            <![CDATA[
+		AND A.REG_DT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		            ]]>
+		            </if>
+		        <include refid="getGoodsListCondition_sql"/>
+		</if>
+		<include refid="getListPagingCondition_sql"/>
+	</select>
+	
+	<!-- 총알배송 제외 상품 저장 -->
+	<insert id="createGoodsQuikDeleverySkip" parameterType="Goods">
+		/* TsaGoods.createGoodsQuikDeleverySkip */
+		INSERT INTO TB_GOODS_QUICK_DELEVERY_SKIP (
+		       GOODS_CD
+		     , REG_NO
+		     , REG_DT
+		)
+		VALUES (
+		       #{goodsCd}
+		     , #{regNo}
+		     , NOW()
+		)
+	</insert>
+	
+	<!-- 총알배송 제외 상품 삭제 -->
+	<delete id="deleteGoodsQuikDeleverySkip" parameterType="Goods">
+		/* TsaGoods.createGoodsQuikDeleverySkip */
+		DELETE FROM TB_GOODS_QUICK_DELEVERY_SKIP 
+		WHERE 1 = 1
+		<choose>
+		<when test="goodsCd != null and goodsCd != ''">
+		AND GOODS_CD  = #{goodsCd}
+		</when>
+		<otherwise>
+		AND GOODS_CD IN
+		    <foreach collection="arrGoodsCd" item="item" index="index"  open="(" close=")" separator=",">
+		#{item}
+		    </foreach>
+		</otherwise>
+		</choose>
+	</delete>
+	
 </mapper>

+ 2 - 2
src/main/java/com/style24/persistence/mybatis/shop/TsaMailTemplate.xml

@@ -24,7 +24,7 @@
 		<if test="searchTxt !=null and searchTxt !='' ">
 		AND    FN_GET_USER_NM(REG_NO) LIKE CONCAT('%',LOWER(#{searchTxt}), '%')
 		</if>
-		ORDER  BY MAILHF_SQ
+		ORDER  BY MAILHF_SQ DESC
 		</select>
 	
 		<insert id="saveMailHF" parameterType="MailTemplate">
@@ -254,7 +254,7 @@
 				AND TM.MAILT_NM LIKE CONCAT('%',LOWER(#{searchTxt}), '%')
 			</if>
 		</if>
-		ORDER BY TM.MAILT_SQ
+		ORDER BY TM.MAILT_SQ DESC
 		</select>
 		
 		<select id="getMktmailManagementDetail" parameterType="Integer" resultType="MktmailManagement">

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

@@ -920,11 +920,12 @@
 		WHERE PLAN_SQ = #{planSq}
 	</select>
 	
-	<insert id="createPlanContents" parameterType="Plan">
+	<insert id="createPlanContents" parameterType="Plan" useGeneratedKeys="true" keyProperty="planContSq">
 		/* TsaMarketing.createPlanContents */
 		INSERT INTO 
 			TB_PLAN_CONTENTS(
-							  PLAN_SQ
+							 PLAN_CONT_SQ
+							, PLAN_SQ
 							, TMPL_TYPE
 							, TITLE
 							, LINK_URL
@@ -936,9 +937,10 @@
 							, UPD_DT
 						)
 			  VALUES(
-						#{planSq}
+			  		   #{planContSq}
+					 , #{planSq}
 					 , #{tmplType}
-					 , #[title}
+					 , #{title}
 					 , #{linkUrl}
 					 , #{dispYn}
 					 , #{dispOrd}
@@ -972,7 +974,6 @@
 			TB_PLAN_CONTENTS_ITEM(
 						PLAN_CONT_SQ
 					  , ITEM_VAL
-					  , DISP_ORD
 					  , REVIEW_DISP_STDT
 					  , REVIEW_DISP_EDDT
 					  , REG_NO
@@ -981,7 +982,6 @@
 			VALUES(
 					#{planContSq}
 				  , #{itemVal}
-				  , #{dispOrd}
 				  , #{reviewDispStdt}
 				  , #{reviewDispEddt}
 				  , #{regNo}
@@ -991,7 +991,6 @@
 			     DUPLICATE KEY 
 			 UPDATE 
 			 	 ITEM_VAL= #{itemVal}
-			   , DISP_ORD= #{dispOrd}
 			   , REVIEW_DISP_STDT= #{reviewDispStdt}
 			   , REVIEW_DISP_EDDT= #{reviewDispEddt}
 			   , REG_NO= #{regNo}

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

@@ -40,7 +40,7 @@ upload:
         allow.extension: jpg|gif|jpeg|png
         view: //ldimage.style24.com
     excel:
-        target.path: /WIDE/workspace/files/data/style24/excel
+        target.path: /WIDE/workspace/files/data/style24
         max.size: 10
         allow.extension: xls|xlsx
         view: //ldimage.style24.com/excel

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

@@ -40,7 +40,7 @@ upload:
         allow.extension: jpg|gif|jpeg|png
         view: //lpimage.style24.com
     excel:
-        target.path: /WIDE/workspace/files/data/style24/excel
+        target.path: /WIDE/workspace/files/data/style24
         max.size: 10
         allow.extension: xls|xlsx
         view: //lpimage.style24.com/excel

+ 5 - 6
src/main/webapp/WEB-INF/views/envset/BasicEnvsetForm.html

@@ -48,7 +48,6 @@
 			<h4>[B10] 쇼핑몰Meta정보</h4>
 			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B10');">저장</button>
 			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B10', '쇼핑몰Meta정보');">이력보기</button>
-			
 			<table class="frmStyle" aria-describedby="쇼핑몰Meta정보">
 				<colgroup>
 					<col style="width: 15%;"/>
@@ -146,7 +145,7 @@
 			<table class="frmStyle" aria-describedby="상품노출">
 				<colgroup>
 					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
+					<col/>
 				</colgroup>
 				<tbody>
 					<tr>
@@ -180,7 +179,7 @@
 			<table class="frmStyle" aria-describedby="상품보관">
 				<colgroup>
 					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
+					<col/>
 				</colgroup>
 				<tbody>
 					<tr>
@@ -252,7 +251,7 @@
 			<table class="frmStyle" aria-describedby="품절안내">
 				<colgroup>
 					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
+					<col/>
 				</colgroup>
 				<tbody>
 					<tr>
@@ -283,7 +282,7 @@
 			<table class="frmStyle" aria-describedby="배송/구매확정/반품">
 				<colgroup>
 					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
+					<col/>
 				</colgroup>
 				<tbody>
 					<tr>
@@ -485,7 +484,7 @@
 			params.envsetNm = '상품노출';
 			params.strSetVal1 = $('input:radio[name=g10StrSetVal1]:checked').val();
 			params.strSetVal2 = $('input:radio[name=g10StrSetVal2]:checked').val();
-			params.strSetVal3 = $('input[name=g10StrSetVal1]').val();
+			params.strSetVal3 = $('input[name=g10StrSetVal3]').val();
 		} else if (envsetType == 'G11') { // 상품보관
 			params.envsetNm = '상품보관';
 			params.strSetVal1 = $('input[name=g11StrSetVal1]').val();

+ 128 - 290
src/main/webapp/WEB-INF/views/envset/BenefitEnvsetForm.html

@@ -45,238 +45,175 @@
 		<!-- 검색조건 영역 -->
 
 		<div class="panelStyle">
-			<h4>[C14] 포인트적립-회원포인트</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('C14');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('C14', '포인트적립-회원포인트');">이력보기</button>
+			<h4>[C11] 회원쿠폰</h4>
+			<p class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i><a href="javascript:void(0);" onclick="fnClickLnb('S1003');"><span class="cRed">"운영관리 > 환경설정 > 회원등급정책관리"</span></a> 화면에서 등급별로 설정합니다.</p>
 			
-			<table class="frmStyle" aria-describedby="포인트적립-회원포인트">
+			<h4>[C12] 포인트소멸</h4>
+			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('C12');">저장</button>
+			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('C12', '포인트소멸');">이력보기</button>
+			<table class="frmStyle" aria-describedby="포인트 소멸">
 				<colgroup>
 					<col style="width: 15%;"/>
 					<col/>
 				</colgroup>
 				<tbody>
 					<tr>
-						<th>가입축하포인트</th>
-						<td>
-							<input name="c14StrSetVal1" type="text" class="w100 aR" maxlength="6" data-valid-type="integer" data-valid-name="가입축하포인트"/>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>회원가입 시 적립해 줄 기본 포인트입니다.</span>
-							<span class="cRed">단, 성별, 생년월일을 입력하고 SMS 및 E-MAIL 수신동의 시 </span><input name="c14StrSetVal2" type="text" class="w100 aR" maxlength="6" data-valid-type="integer" data-valid-name="가입축하추가포인트"/><span class="cRed">포인트를 추가로 적립해 줍니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>생일축하포인트</th>
+						<th>구매포인트소멸기한(일)</th>
 						<td>
-							<input name="p10NumSetVal2" type="text" class="w100 aR" maxlength="6" data-valid-type="integer" data-valid-name="생일축하포인트"/>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>회원의 생일 도래 </span><input name="p10NumSetVal3" type="text" class="w20 aR" maxlength="2" data-valid-type="integer" data-valid-name="생일도래시점"/><span class="cRed">일</span><span class="cBlue">전 적립해 줄 포인트입니다.</span>
+							적립일로부터 <input name="c12StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="구매포인트소멸기한(년)"/><span class="cRed">일</span> 경과 시 소멸합니다.
 						</td>
 					</tr>
 					<tr>
-						<th>앱설치후최초로그인포인트</th>
+						<th>상품평포인트소멸기한(일)</th>
 						<td>
-							<input name="p10NumSetVal4" type="text" class="w100 aR" maxlength="6" data-valid-type="integer" data-valid-name="앱설치후최초로그인포인트"/>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>앱 설치 후 앱을 통해서 로그인을 했을 때 최초 한 번만 적립해 줄 포인트입니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>출석체크1일포인트</th>
-						<td>
-							<input name="p10NumSetVal5" type="text" class="w100 aR" maxlength="6" data-valid-type="integer" data-valid-name="출석체크1일포인트"/>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>출석체크 이벤트 하루 체크 시 적립해 줄 포인트입니다.</span>
+							적립일로부터 <input name="c12StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="상품평포인트소멸기한(년)"/><span class="cRed">일</span> 경과 시 소멸합니다.
 						</td>
 					</tr>
 				</tbody>
 			</table>
 			
-			<h4>[C10] 회원기본설정</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('C10');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('C10', '회원기본설정');">이력보기</button>
-			<table class="frmStyle" aria-describedby="회원기본설정">
+			<h4>[C14] 구매포인트</h4>
+			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('C14');">저장</button>
+			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('C14', '구매포인트');">이력보기</button>
+			<table class="frmStyle" aria-describedby="구매포인트">
 				<colgroup>
 					<col style="width: 15%;"/>
 					<col/>
 				</colgroup>
 				<tbody>
 					<tr>
-						<th>탈퇴후재가입불가기간(일)</th>
-						<td><input name="c10StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="탈퇴후재가입불가기간"/><span class="cRed">일</span> 동안 탈퇴 후 재가입 불가합니다.</td>
-					</tr>
-					<tr>
-						<th>휴면회선정기간(일)</th>
-						<td><input name="c10StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="휴면회원선정기간"/><span class="cRed">일</span> 동안 사이트에 로그인 하지 않은 회원을 휴면회원으로 선정합니다.</td>
-					</tr>
-					<tr>
-						<th>휴면회원전환기간(일)</th>
-						<td><input name="c10StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="휴면회원전환기간"/><span class="cRed">일</span> 동안 사이트에 로그인 하지 않은 회원을 휴면회원으로 전환합니다.</td>
+						<th>자사상품정상포인트적립율(PC)</th>
+						<td>
+							<input name="c14StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="real" data-valid-name="자사상품정상포인트적립율(PC)"/><span class="cRed">%</span>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>자사 정상상품을 PC웹에서 구매 시 적립해 줄 포인트율입니다.</span>
+						</td>
 					</tr>
 					<tr>
-						<th>회원등급산정기간</th>
-						<td>전월 기준 최근 <input name="c10StrSetVal4" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="회원등급산정기간"/><span class="cRed">개월</span> 기간 동안의 구매금액(실결제금액)과 구매건수를 기준으로 월초에 산정합니다. <span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>자세한 사항은 "<span class="cRed">운영관리 > 환경설정 > 회원등급정책관리</span>" 화면을 참조해 주세요.</span></td>
+						<th>자사상품정상포인트적립율(모바일)</th>
+						<td>
+							<input name="c14StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="real" data-valid-name="자사상품정상포인트적립율(모바일)"/><span class="cRed">%</span>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>자사 정상상품을 모바일에서 구매 시 적립해 줄 포인트율입니다.</span>
+						</td>
 					</tr>
-				</tbody>
-			</table>
-			
-			<h4>[G10] 상품노출</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('G10');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('G10', '상품노출');">이력보기</button>
-			<table class="frmStyle" aria-describedby="상품노출">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
-				</colgroup>
-				<tbody>
 					<tr>
-						<th>상품평노출여부</th>
+						<th>자사상품이월포인트적립율(PC)</th>
 						<td>
-							<label class="rdoBtn"><input type="radio" name="g10StrSetVal1" value="Y" checked="checked"/>노출</label>
-							<label class="rdoBtn"><input type="radio" name="g10StrSetVal1" value="N">미노출</label>
-							<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>미노출로 설정 시 상품상세의 상품평 영역이 노출되지 않습니다.</span>
+							<input name="c14StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="real" data-valid-name="자사상품이월포인트적립율(PC)"/><span class="cRed">%</span>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>자사 이월상품을 PC웹에서 구매 시 적립해 줄 포인트율입니다.</span>
 						</td>
 					</tr>
 					<tr>
-						<th>품절상품노출여부</th>
+						<th>자사상품이월포인트적립율(모바일)</th>
 						<td>
-							<label class="rdoBtn"><input type="radio" name="g10StrSetVal2" value="Y"/>노출</label>
-							<label class="rdoBtn"><input type="radio" name="g10StrSetVal2" value="N" checked="checked">미노출</label>
-							<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>품절된 상품을 사이트에 노출할지 말지를 설정합니다.</span>
+							<input name="c14StrSetVal4" type="text" class="w50 aR" maxlength="3" data-valid-type="real" data-valid-name="자사상품이월포인트적립율(모바일)"/><span class="cRed">%</span>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>자사 이월상품을 모바일에서 구매 시 적립해 줄 포인트율입니다.</span>
 						</td>
 					</tr>
 					<tr>
-						<th>베스트상품노출개수</th>
+						<th>입점상품정상포인트적립율(PC)</th>
 						<td>
-							카테고리와 아울렛의 베스트 영역에 상품이 <input name="g10StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer"/> 개 만큼만 노출됩니다.
+							<input name="c14StrSetVal5" type="text" class="w50 aR" maxlength="3" data-valid-type="real" data-valid-name="입점상품정상포인트적립율(PC)"/><span class="cRed">%</span>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>입점 정상상품을 PC웹에서 구매 시 적립해 줄 포인트율입니다.</span>
 						</td>
 					</tr>
-				</tbody>
-			</table>
-
-			<h4>[G11] 상품보관</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('G11');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('G11', '상품보관');">이력보기</button>
-			<table class="frmStyle" aria-describedby="상품보관">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
-				</colgroup>
-				<tbody>
 					<tr>
-						<th>장바구니보관기간(일)</th>
+						<th>입점상품정상포인트적립율(모바일)</th>
 						<td>
-							장바구니 보관기간은 <input name="g11StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="장바구니보관기간"/><span class="cRed">일</span> 입니다. 보관기간 경과 시 자동 삭제됩니다.
-							<span class="infoTxt cBlue"><i class="fa fa-info-circle marL20" aria-hidden="true"></i>0으로 설정하면 자동으로 삭제 처리를 하지 않습니다.</span>
+							<input name="c14StrSetVal6" type="text" class="w50 aR" maxlength="3" data-valid-type="real" data-valid-name="입점상품정상포인트적립율(모바일)"/><span class="cRed">%</span>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>입점 정상상품을 모바일에서 구매 시 적립해 줄 포인트율입니다.</span>
 						</td>
 					</tr>
 					<tr>
-						<th>장바구니담기최대상품수</th>
+						<th>입점상품이월포인트적립율(PC)</th>
 						<td>
-							장바구니에 담을 수 있는 최대 상품 개수는 <input name="g11StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="장바구니보관기간"/><span class="cRed">개</span> 입니다.
+							<input name="c14StrSetVal7" type="text" class="w50 aR" maxlength="3" data-valid-type="real" data-valid-name="입점상품이월포인트적립율(PC)"/><span class="cRed">%</span>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>입점 이월상품을 PC웹에서 구매 시 적립해 줄 포인트율입니다.</span>
 						</td>
 					</tr>
 					<tr>
-						<th>위시리스트보관기간(일)</th>
+						<th>입점상품이월포인트적립율(모바일)</th>
 						<td>
-							위시리스트 보관기간은 <input name="g11StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="위시리스트보관기간"/><span class="cRed">일</span> 입니다. 보관기간 경과 시 자동 삭제됩니다.
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>0으로 설정하면 자동으로 삭제 처리를 하지 않습니다.</span>
+							<input name="c14StrSetVal8" type="text" class="w50 aR" maxlength="3" data-valid-type="real" data-valid-name="입점상품이월포인트적립율(모바일)"/><span class="cRed">%</span>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>입점 이월상품을 모바일에서 구매 시 적립해 줄 포인트율입니다.</span>
 						</td>
 					</tr>
 				</tbody>
 			</table>
 			
-			<h4>[O10] 주문/결제</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('O10');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('O10', '주문/결제');">이력보기</button>
-			<table class="frmStyle" aria-describedby="주문/결제">
+			<h4>[C15] 상품평포인트</h4>
+			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('C15');">저장</button>
+			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('C15', '상품평포인트');">이력보기</button>
+			<table class="frmStyle" aria-describedby="상품평포인트">
 				<colgroup>
 					<col style="width: 15%;"/>
 					<col/>
 				</colgroup>
 				<tbody>
 					<tr>
-						<th>결제단위</th>
-						<td>
-							<select name="o10StrSetVal1">
-								<option value="">[선택]</option>
-								<option value="1">일원 단위</option>
-								<option value="10">십원 단위</option>
-								<option value="100">백원 단위</option>
-							</select>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>주문 시의 결제단위 입니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>최소결제금액</th>
+						<th>상품평등록가능기간(일)</th>
 						<td>
-							한 번의 결제 시 상품의 실결제금액이 <input name="o10StrSetVal2" type="text" class="w100 aR" maxlength="7" data-valid-type="integer" data-valid-name="최소결제금액"/> <span class="cRed">원</span> 보다 적을 경우 결제가 불가합니다.
+							상품평 등록가능 기간은 <span class="cRed">구매일</span>로부터 <input name="c15StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="상품평등록가능기간(일)"/><span class="cRed">일</span> 입니다. 등록가능기간 경과 시 등록 불가합니다.
 						</td>
 					</tr>
 					<tr>
-						<th>무료배송비최소주문금액</th>
-						<td>최소주문금액이 <input name="o10StrSetVal3" type="text" class="w100 aR" maxlength="6" data-valid-type="integer" data-valid-name="무료배송비최소주문금액"/> 원 이상이면 배송비가 무료입니다. <span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>이 값은 기본값이며 공급업체별로 다르게 설정할 수도 있습니다.</span></td>
-					</tr>
-					<tr>
-						<th>총알배송주문가능시간</th>
+						<th>텍스트/포토상품평 포인트지급방법</th>
 						<td>
-							오전 <input name="o10StrSetVal4" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="총알배송주문가능시간"/> <span class="cRed">시</span> 까지 주문한 자사상품은 총알배송이 가능합니다.
+							<label class="rdoBtn"><input type="radio" name="c15StrSetVal2" value="A" checked="checked"/>승인후지급</label>
+							<label class="rdoBtn"><input type="radio" name="c15StrSetVal2" value="D">즉시지급</label>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>승인후지급 선택 시 <a href="javascript:void(0);" onclick="fnClickLnb('D3002');"><span class="cRed">"회원/마케팅 > 마케팅 > 상품평관리"</span></a> 메뉴에서 승인 시 지급됩니다.</span>
 						</td>
 					</tr>
-				</tbody>
-			</table>
-			
-			<h4>[O11] 품절안내</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('O11');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('O11', '품절안내');">이력보기</button>
-			<table class="frmStyle" aria-describedby="품절안내">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
-				</colgroup>
-				<tbody>
 					<tr>
-						<th>품절안내방법</th>
+						<th>텍스트상품평포인트</th>
 						<td>
-							<label class="rdoBtn"><input type="radio" name="o11StrSetVal1" value="A"/>자동</label>
-							<label class="rdoBtn"><input type="radio" name="o11StrSetVal1" value="M" checked="checked"/>수동</label>
+							<input name="c15StrSetVal3" type="text" class="w100 aR" maxlength="5" data-valid-type="integer" data-valid-name="텍스트상품평포인트"/>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>작성한 상품평이 텍스트일 경우 적립해 줄 포인트입니다.</span>
 						</td>
 					</tr>
 					<tr>
-						<th>품절안내메시지자동발송기간(일)</th>
+						<th>포토상품평포인트</th>
 						<td>
-							품절안내방법이 "자동"일 경우 결제완료 후 <input name="o11StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="자동품절안내메시지발송기간(일)"/><span class="cRed">일</span> 동안 출고되지 않으면 품절안내 메시지를 자동으로 발송합니다.
+							<input name="c15StrSetVal4" type="text" class="w100 aR" maxlength="5" data-valid-type="integer" data-valid-name="포토상품평포인트"/>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>작성한 상품평이 포토일 경우 적립해 줄 포인트입니다.</span>
 						</td>
 					</tr>
 					<tr>
-						<th>품절메시지자동발송기간(일)</th>
+						<th>베스트상품평포인트</th>
 						<td>
-							품절안내방법이 "자동"일 경우 결제완료 후 <input name="o11StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="자동품절메시지발송기간(일)"/><span class="cRed">일</span> 동안 출고되지 않으면 품절 메시지를 자동으로 발송합니다.
+							<input name="c15StrSetVal5" type="text" class="w100 aR" maxlength="5" data-valid-type="integer" data-valid-name="베스트상품평포인트"/>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>작성한 상품평이 베스트로 선정될 경우 적립해 줄 포인트입니다.</span>
 						</td>
 					</tr>
 				</tbody>
 			</table>
 			
-			<h4>[D10] 배송/구매확정/반품</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('D10');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('D10', '배송/구매확정/반품');">이력보기</button>
-			<table class="frmStyle" aria-describedby="배송/구매확정/반품">
+			<h4>[C17] 포인트사용</h4>
+			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('C17');">저장</button>
+			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('C17', '포인트사용');">이력보기</button>
+			<table class="frmStyle" aria-describedby="포인트사용">
 				<colgroup>
 					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
+					<col/>
 				</colgroup>
 				<tbody>
 					<tr>
-						<th>배송완료자동처리기간(일)</th>
+						<th>포인트사용기준</th>
 						<td>
-							<span class="cRed">배송중</span> 상태를 기준으로 <input name="d10StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="배송완료자동처리일수"/><span class="cRed">일</span> 경과 시 자동으로 배송완료로 처리합니다.
+							실결제액 기준 <input name="c17StrSetVal1" type="text" class="w100 aR" maxlength="7" data-valid-type="integer" data-valid-name="포인트사용기준"/> <span class="cRed">원</span> 이상일 때 포인트 사용이 가능합니다.
 						</td>
 					</tr>
 					<tr>
-						<th>구매확정자동처리기간(일)</th>
+						<th>최대사용가능포인트율(%)</th>
 						<td>
-							배송완료일 기준으로 <input name="d10StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="구매확정자동처리일수"/><span class="cRed">일</span> 경과 시 자동으로 구매확정 처리합니다.
+							실결제액의 <input name="c17StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="최대사용가능포인트율"/> <span class="cRed">%</span> 까지 포인트 사용이 가능합니다.
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>한 번의 결제 시 <span class="cRed">실결제액 기준</span>으로 사용할 수 있는 최대 포인트율을 설정합니다.</span>
 						</td>
 					</tr>
 					<tr>
-						<th>반품가능기간(일)</th>
+						<th>최대즉시사용포인트율(%)</th>
 						<td>
-							배송완료 후 <input name="d10StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="반품가능기간"/><span class="cRed">일</span> 내에 반품 신청 및 접수가 가능합니다.
+							포인트를 <input name="c17StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="최대즉시사용포인트율"/> <span class="cRed">%</span> 이하로 즉시 사용할 수 있습니다.
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>한 번의 결제 시 <span class="cRed">적립금액 기준</span>으로 즉시 사용할 수 있는 최대 포인트율을 설정합니다.</span>
 						</td>
 					</tr>
 				</tbody>
@@ -291,197 +228,98 @@
 		var siteCd = $('select[name=siteCd]').val();
 		var actionUrl = '/envset/' + siteCd;
 
-		// 쇼핑몰Meta정보
-		$.getJSON(actionUrl + '/B10'
+		// 포인트소멸
+		$.getJSON(actionUrl + '/C12'
 				, function(result, status) {
 					if (status === 'success') {
 						if (!gagajf.isNull(result)) {
-							$('input[name=b10StrSetVal1]').val(result.strSetVal1);
-							$('input[name=b10StrSetVal2]').val(result.strSetVal2);
-							$('input[name=b10StrSetVal3]').val(result.strSetVal3);
-							
-							if (!gagajf.isNull(result.strSetVal4)) {
-								$('input[name=b10StrSetVal4SysFileNm]').val(result.strSetVal4);
-								$('#b10StrSetVal4FileDownload').html(result.strSetVal4);
-								$('#b10StrSetVal4FileDownload').show();
-							}
-							
-							$('input[name=b10StrSetVal5]').val(result.strSetVal5);
-							
-							if (!gagajf.isNull(result.strSetVal6)) {
-								$('input[name=b10StrSetVal6SysFileNm]').val(result.strSetVal6);
-								$('#b10StrSetVal6FileDownload').html(result.strSetVal6);
-								$('#b10StrSetVal6FileDownload').show();
-							}
+							$('input[name=c12StrSetVal1]').val(result.strSetVal1);
+							$('input[name=c12StrSetVal2]').val(result.strSetVal2);
 						}
 					}
 				});
 
-		// 회원기본설정
-		$.getJSON(actionUrl + '/C10'
+		// 구매포인트
+		$.getJSON(actionUrl + '/C14'
 				, function(result, status) {
 					if (status === 'success') {
 						if (!gagajf.isNull(result)) {
-							$('input[name=c10StrSetVal1]').val(result.strSetVal1);
-							$('input[name=c10StrSetVal2]').val(result.strSetVal2);
-							$('input[name=c10StrSetVal3]').val(result.strSetVal3);
-							$('input[name=c10StrSetVal4]').val(result.strSetVal4);
+							$('input[name=c14StrSetVal1]').val(result.strSetVal1);
+							$('input[name=c14StrSetVal2]').val(result.strSetVal2);
+							$('input[name=c14StrSetVal3]').val(result.strSetVal3);
+							$('input[name=c14StrSetVal4]').val(result.strSetVal4);
+							$('input[name=c14StrSetVal5]').val(result.strSetVal5);
+							$('input[name=c14StrSetVal6]').val(result.strSetVal6);
+							$('input[name=c14StrSetVal7]').val(result.strSetVal7);
+							$('input[name=c14StrSetVal8]').val(result.strSetVal8);
 						}
 					}
 				});
 		
-		// 상품노출
-		$.getJSON(actionUrl + '/G10'
+		// 상품평포인트
+		$.getJSON(actionUrl + '/C15'
 				, function(result, status) {
 					if (status === 'success') {
 						if (!gagajf.isNull(result)) {
-							$("input:radio[name=g10StrSetVal1]").parents('td').find('label').removeClass('checked');
-							if (result.strSetVal1 == 'Y') {
-								$("input:radio[name=g10StrSetVal1]").eq(0).prop('checked', true);
-							} else {
-								$("input:radio[name=g10StrSetVal1]").eq(1).prop('checked', true);
-							}
-
-							$("input:radio[name=g10StrSetVal2]").parents('td').find('label').removeClass('checked');
+							$('input[name=c15StrSetVal1]').val(result.strSetVal1);
+							$("input:radio[name=c15StrSetVal2]").parents('td').find('label').removeClass('checked');
 							if (result.strSetVal2 == 'Y') {
-								$("input:radio[name=g10StrSetVal2]").eq(0).prop('checked', true);
+								$("input:radio[name=c15StrSetVal2]").eq(0).prop('checked', true);
 							} else {
-								$("input:radio[name=g10StrSetVal2]").eq(1).prop('checked', true);
+								$("input:radio[name=c15StrSetVal2]").eq(1).prop('checked', true);
 							}
-							
-							$('input[name=g10StrSetVal3]').val(result.strSetVal3);
+							$('input[name=c15StrSetVal3]').val(result.strSetVal3.addComma());
+							$('input[name=c15StrSetVal4]').val(result.strSetVal4.addComma());
+							$('input[name=c15StrSetVal5]').val(result.strSetVal5.addComma());
 						}
 					}
 				});
 
-		// 상품보관
-		$.getJSON(actionUrl + '/G11'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$('input[name=g11StrSetVal1]').val(result.strSetVal1);
-							$('input[name=g11StrSetVal2]').val(result.strSetVal2);
-							$('input[name=g11StrSetVal3]').val(result.strSetVal3);
-						}
-					}
-				});
-		
-		// 주문/결제
-		$.getJSON(actionUrl + '/O10'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$('select[name=o10StrSetVal1]').val(result.strSetVal1);
-							$('input[name=o10StrSetVal2]').val(gagajf.isNull(result.strSetVal2) ? result.strSetVal2 : result.strSetVal2.addComma());
-							$('input[name=o10StrSetVal3]').val(gagajf.isNull(result.strSetVal3) ? result.strSetVal3 : result.strSetVal3.addComma());
-							$('input[name=o10StrSetVal4]').val(result.strSetVal4);
-						}
-					}
-				});
-		
-		// 품절안내
-		$.getJSON(actionUrl + '/O11'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$("input:radio[name=o11StrSetVal1]").parents('td').find('label').removeClass('checked');
-							if (result.strSetVal1 == 'Y') {
-								$("input:radio[name=o11StrSetVal1]").eq(0).prop('checked', true);
-							} else {
-								$("input:radio[name=o11StrSetVal1]").eq(1).prop('checked', true);
-							}
-							$('input[name=o11StrSetVal2]').val(result.strSetVal2);
-							$('input[name=o11StrSetVal3]').val(result.strSetVal3);
-						}
-					}
-				});
-		
-		// 배송/구매확정/반품
-		$.getJSON(actionUrl + '/D10'
+		// 포인트사용
+		$.getJSON(actionUrl + '/C17'
 				, function(result, status) {
 					if (status === 'success') {
 						if (!gagajf.isNull(result)) {
-							$('input[name=d10StrSetVal1]').val(result.strSetVal1);
-							$('input[name=d10StrSetVal2]').val(result.strSetVal2);
-							$('input[name=d10StrSetVal3]').val(result.strSetVal3);
+							$('input[name=c17StrSetVal1]').val(result.strSetVal1.addComma());
+							$('input[name=c17StrSetVal2]').val(result.strSetVal2);
+							$('input[name=c17StrSetVal3]').val(result.strSetVal3);
 						}
 					}
 				});
 	}
 
-	// 파일첨부 선택 시
-	$('#b10StrSetVal4').on('change', function() { fnChooseFile(this); });
-	$('#b10StrSetVal6').on('change', function() { fnChooseFile(this); });
-
-	var fnChooseFile = function(obj) {
-		// multiple 속성이 있으면 files에는 다수의 객체가 할당됨
-		var file = obj.files[0];
-
-		// 파일 업로드
-		gagajf.ajaxFileUpload('/common/file/upload?subDir=/envset'
-				, file
-				, function(result) {
-					// 업로드한 파일명 설정
-					$('input[name=' + obj.name + 'OrgFileNm]').val(result.oldFileName);
-					$('input[name=' + obj.name + 'SysFileNm]').val(result.newFileName);
-				}
-		);
-	}
-
-	// 파일다운로드
-	var fnDownloadFile = function(id) {
-		$('#' + id + 'FileDownload').attr({
-			href : _uploadDefaultUrl + '/envset/' + $('input[name=' + id + 'SysFileNm]').val(),
-			target: '_blank'
-		}).get(0).click();
-	}
-
 	// 저장 처리
 	var fnSave = function(envsetType) {
 		var params = new Object();
 		params.siteCd = $('select[name=siteCd]').val();
 		params.envsetType = envsetType;
 
-		if (envsetType == 'B10') { // 쇼핑몰Meta정보
-			params.envsetNm = '쇼핑몰Meta정보';
-			params.strSetVal1 = $('input[name=b10StrSetVal1]').val();
-			params.strSetVal2 = $('input[name=b10StrSetVal2]').val();
-			params.strSetVal3 = $('input[name=b10StrSetVal3]').val();
-			params.strSetVal4 = $('input[name=b10StrSetVal4SysFileNm]').val();
-			params.strSetVal5 = $('input[name=b10StrSetVal5]').val();
-			params.strSetVal6 = $('input[name=b10StrSetVal6SysFileNm]').val();
-		} else if (envsetType == 'C10') { // 회원기본설정
-			params.envsetNm = '회원기본설정';
-			params.strSetVal1 = $('input[name=c10StrSetVal1]').val();
-			params.strSetVal2 = $('input[name=c10StrSetVal2]').val();
-			params.strSetVal3 = $('input[name=c10StrSetVal3]').val();
-			params.strSetVal4 = $('input[name=c10StrSetVal4]').val();
-		} else if (envsetType == 'G10') { // 상품노출
-			params.envsetNm = '상품노출';
-			params.strSetVal1 = $('input:radio[name=g10StrSetVal1]:checked').val();
-			params.strSetVal2 = $('input:radio[name=g10StrSetVal2]:checked').val();
-			params.strSetVal3 = $('input[name=g10StrSetVal1]').val();
-		} else if (envsetType == 'G11') { // 상품보관
-			params.envsetNm = '상품보관';
-			params.strSetVal1 = $('input[name=g11StrSetVal1]').val();
-			params.strSetVal2 = $('input[name=g11StrSetVal2]').val();
-			params.strSetVal3 = $('input[name=g11StrSetVal3]').val();
-		} else if (envsetType == 'O10') { // 주문/결제
-			params.envsetNm = '주문/결제';
-			params.strSetVal1 = $('select[name=o10StrSetVal1]').val();
-			params.strSetVal2 = $('input[name=o10StrSetVal2]').val().removeComma();
-			params.strSetVal3 = $('input[name=o10StrSetVal3]').val().removeComma();
-			params.strSetVal4 = $('input[name=o10StrSetVal4]').val();
-		} else if (envsetType == 'O11') { // 품절안내
-			params.envsetNm = '품절안내';
-			params.strSetVal1 = $('input:radio[name=o11StrSetVal1]:checked').val();
-			params.strSetVal2 = $('input[name=o11StrSetVal2]').val();
-			params.strSetVal3 = $('input[name=o11StrSetVal3]').val();
-		} else if (envsetType == 'D10') { // 배송/구매확정/반품
-			params.envsetNm = '배송/구매확정/반품';
-			params.strSetVal1 = $('input[name=d10StrSetVal1]').val();
-			params.strSetVal2 = $('input[name=d10StrSetVal2]').val();
-			params.strSetVal3 = $('input[name=d10StrSetVal3]').val();
+		if (envsetType == 'C12') { // 포인트소멸
+			params.envsetNm = '포인트소멸';
+			params.strSetVal1 = $('input[name=c12StrSetVal1]').val();
+			params.strSetVal2 = $('input[name=c12StrSetVal2]').val();
+		} else if (envsetType == 'C14') { // 구매포인트
+			params.envsetNm = '구매포인트';
+			params.strSetVal1 = $('input[name=c14StrSetVal1]').val();
+			params.strSetVal2 = $('input[name=c14StrSetVal2]').val();
+			params.strSetVal3 = $('input[name=c14StrSetVal3]').val();
+			params.strSetVal4 = $('input[name=c14StrSetVal4]').val();
+			params.strSetVal5 = $('input[name=c14StrSetVal5]').val();
+			params.strSetVal6 = $('input[name=c14StrSetVal6]').val();
+			params.strSetVal7 = $('input[name=c14StrSetVal7]').val();
+			params.strSetVal8 = $('input[name=c14StrSetVal8]').val();
+		} else if (envsetType == 'C15') { // 상품평포인트
+			params.envsetNm = '상품평포인트';
+			params.strSetVal1 = $('input[name=c15StrSetVal1]').val();
+			params.strSetVal2 = $('input:radio[name=c15StrSetVal2]:checked').val();
+			params.strSetVal3 = $('input[name=c15StrSetVal3]').val().removeComma();
+			params.strSetVal4 = $('input[name=c15StrSetVal4]').val().removeComma();
+			params.strSetVal5 = $('input[name=c15StrSetVal5]').val().removeComma();
+		} else if (envsetType == 'C17') { // 포인트사용
+			params.envsetNm = '포인트사용';
+			params.strSetVal1 = $('input[name=c17StrSetVal1]').val().removeComma();
+			params.strSetVal2 = $('input[name=c17StrSetVal2]').val();
+			params.strSetVal3 = $('input[name=c17StrSetVal3]').val();
 		}
 
 		var jsonData = JSON.stringify(params);

+ 55 - 51
src/main/webapp/WEB-INF/views/envset/EnvsetHistoryForm.html

@@ -114,7 +114,7 @@
 	];
 
 // 	// 회원쿠폰
-// 	var columnDefsC10 = [
+// 	var columnDefsC11 = [
 // 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
 // 		{headerName: "가입축하쿠폰", field: "strSetVal1", width: 150, cellClass: 'text-center'},
 // 		{headerName: "앱푸쉬수신동의쿠폰", field: "strSetVal2", width: 150, cellClass: 'text-center'},
@@ -124,8 +124,17 @@
 // 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
 // 	];
 
+	// 포인트소멸
+	var columnDefsC12 = [
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{headerName: "구매포인트소멸기한(일)", field: "strSetVal1", width: 200, cellClass: 'text-center', cellRenderer: function(params) { return params.value + '일'; }},
+		{headerName: "상품평포인트소멸기한(일)", field: "strSetVal2", width: 200, cellClass: 'text-center', cellRenderer: function(params) { return params.value + '일'; }},
+		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+	];
+
 // 	// 회원포인트
-// 	var columnDefsP10 = [
+// 	var columnDefsC13 = [
 // 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
 // 		{headerName: "가입축하기본포인트", field: "strSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
 // 		{headerName: "가입축하추가포인트", field: "strSetVal6", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
@@ -136,34 +145,42 @@
 // 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
 // 	];
 
-// 	// 구매포인트
-// 	var columnDefsP11 = [
-// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-// 		{headerName: "자사상품정상포인트(PC)", field: "strSetVal1", width: 150, cellClass: 'text-center'},
-// 		{headerName: "자사상품정상포인트(모바일)", field: "strSetVal2", width: 150, cellClass: 'text-center'},
-// 		{headerName: "자사상품이월포인트(PC)", field: "strSetVal3", width: 150, cellClass: 'text-center'},
-// 		{headerName: "자사상품이월포인트(모바일)", field: "strSetVal4", width: 150, cellClass: 'text-center'},
-// 		{headerName: "입점상품정상포인트(PC)", field: "strSetVal5", width: 150, cellClass: 'text-center'},
-// 		{headerName: "입점상품정상포인트(모바일)", field: "strSetVal6", width: 150, cellClass: 'text-center'},
-// 		{headerName: "입점상품이월포인트(PC)", field: "strSetVal7", width: 150, cellClass: 'text-center'},
-// 		{headerName: "입점상품이월포인트(모바일)", field: "strSetVal8", width: 150, cellClass: 'text-center'},
-// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-// 	];
+	// 구매포인트
+	var columnDefsC14 = [
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{
+			headerName: "자사상품포인트적립율(%)",
+			children : [
+				{headerName: "정상(PC)", field: "strSetVal1", width: 100, cellClass: 'text-center'},
+				{headerName: "정상(모바일)", field: "strSetVal2", width: 100, cellClass: 'text-center'},
+				{headerName: "이월(PC)", field: "strSetVal3", width: 100, cellClass: 'text-center'},
+				{headerName: "이월(모바일)", field: "strSetVal4", width: 100, cellClass: 'text-center'}
+			]
+		},
+		{
+			headerName: "입점상품포인트적립율(%)",
+			children : [
+				{headerName: "정상(PC)", field: "strSetVal5", width: 100, cellClass: 'text-center'},
+				{headerName: "정상(모바일)", field: "strSetVal6", width: 100, cellClass: 'text-center'},
+				{headerName: "이월(PC)", field: "strSetVal7", width: 100, cellClass: 'text-center'},
+				{headerName: "이월(모바일)", field: "strSetVal8", width: 100, cellClass: 'text-center'}
+			]
+		},
+		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+	];
 
-// 	// 상품평포인트
-// 	var columnDefsP12 = [
-// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-// 		{headerName: "포인트지급방법", field: "strSetVal1", width: 150, cellClass: 'text-center',
-// 			valueFormatter: function (params) { return gagaAgGrid.lookupValue(pointGiveType, params.value); }
-// 		},
-// 		{headerName: "텍스트상품평포인트", field: "strSetVal1", width: 150, cellClass: 'text-center'},
-// 		{headerName: "포토상품평포인트", field: "strSetVal2", width: 150, cellClass: 'text-center'},
-// 		{headerName: "최초텍스트상품평배율", field: "strSetVal3", width: 150, cellClass: 'text-center'},
-// 		{headerName: "최초포토상품평포인트배율", field: "strSetVal4", width: 150, cellClass: 'text-center'},
-// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-// 	];
+	// 상품평포인트
+	var columnDefsC15 = [
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{headerName: "상품평등록가능기간", field: "strSetVal1", width: 180, cellClass: 'text-center', cellRenderer: function(params) { return params.value + '일'; }},
+		{headerName: "텍스트/포토상품평 포인트지급방법", field: "strSetVal2", width: 250, cellClass: 'text-center', valueFormatter: function (params) { return gagaAgGrid.lookupValue(pointGiveType, params.value); }},
+		{headerName: "텍스트상품평포인트", field: "strSetVal3", width: 150, cellClass: 'text-center'},
+		{headerName: "포토상품평포인트", field: "strSetVal4", width: 150, cellClass: 'text-center'},
+		{headerName: "베스트상품평포인트", field: "strSetVal5", width: 150, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+	];
 
 // 	// 클레임포인트
 // 	var columnDefsP13 = [
@@ -185,28 +202,15 @@
 // 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
 // 	];
 
-// 	// 포인트사용
-// 	var columnDefsP30 = [
-// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-// 		{headerName: "사용방법", field: "strSetVal1", width: 80, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(pointUseType, params.value); }},
-// 		{
-// 			headerName: "사용단위", field: "strSetVal2", width: 100, cellClass: 'text-center',
-// 			cellRenderer: function (params) {
-// 				var value = '';
-// 				if (params.value == '10') { value = '일원'; }
-// 				else if (params.value == '100') { value = '십원'; }
-// 				else if (params.value == '1000') { value = '백원'; }
-// 				return value + '단위절사';
-// 			}
-// 		},
-// 		{headerName: "사용가능보유포인트금액", field: "strSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-// 		{headerName: "사용가능최소포인트금액", field: "strSetVal2", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-// 		{headerName: "사용가능최대포인트율", field: "strSetVal3", width: 150, cellClass: 'text-center'},
-// 		{headerName: "즉시사용최대포인트금액", field: "strSetVal5", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-// 		{headerName: "최소주문제한금액", field: "strSetVal4", width: 120, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-// 	];
+	// 포인트사용
+	var columnDefsC17 = [
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{headerName: "포인트사용기준(원)", field: "strSetVal1", width: 200, cellClass: 'text-center'},
+		{headerName: "최대사용가능포인트율(%)", field: "strSetVal2", width: 200, cellClass: 'text-center'},
+		{headerName: "최대즉시사용포인트율(%)", field: "strSetVal3", width: 200, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+	];
 
 // 	// 모바일앱
 // 	var columnDefsM10 = [

+ 14 - 0
src/main/webapp/WEB-INF/views/goods/GoodsFreeGoodsForm.html

@@ -264,6 +264,20 @@
 		if (!fnCalendarDateValidation('#sellTerms', 'stDate', 'edDate')){
 			return false;
 		}
+		
+		if (!gagajf.isNull($('#searchForm textarea[name=condition]').val())){
+			var arrData = $('#searchForm textarea[name=condition]').val().replace(/\r\n/g,"\n").split("\n"); 
+			if (arrData.length > 500){
+				mcxDialog.alertC("키워드 조회값을 500 이하로 조회 하세요.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#searchForm textarea[name=condition]').focus();
+					}
+				});
+				return false;
+			}
+		}
+		
 		// Fetch data
 		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
 	});

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

@@ -669,6 +669,32 @@
 			}
 		}
 
+/* 		if (!gagajf.isNull($('#searchForm input[name=supplyCompList]').val())){
+			var jsonData = JSON.parse($('#searchForm input[name=supplyCompList]').val()); 
+			if (jsonData.length > 500){
+				mcxDialog.alertC("키워드 조회값을 500 이하로 조회 하세요.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#searchForm textarea[name=condition]').focus();
+					}
+				});
+				return false;
+			}
+		}
+ */		
+		if (!gagajf.isNull($('#searchForm textarea[name=condition]').val())){
+			var arrData = $('#searchForm textarea[name=condition]').val().replace(/\r\n/g,"\n").split("\n"); 
+			if (arrData.length > 500){
+				mcxDialog.alertC("키워드 조회값을 500 이하로 조회 하세요.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#searchForm textarea[name=condition]').focus();
+					}
+				});
+				return false;
+			}
+		}
+		
 		return true;
 	}
 

+ 13 - 0
src/main/webapp/WEB-INF/views/goods/GoodsNaverPriceForm.html

@@ -306,6 +306,19 @@
 			return;
 		}
 		
+		if (!gagajf.isNull($('#searchForm textarea[name=condition]').val())){
+			var arrData = $('#searchForm textarea[name=condition]').val().replace(/\r\n/g,"\n").split("\n"); 
+			if (arrData.length > 1000){
+				mcxDialog.alertC("키워드 조회값을 1000 이하로 조회 하세요.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#searchForm textarea[name=condition]').focus();
+					}
+				});
+				return false;
+			}
+		}
+		
 		var formId = "#searchForm";
  		gagaAgGrid.fetch('/goods/naver/lowest/price/save', gridOptions, formId);
 		

+ 13 - 0
src/main/webapp/WEB-INF/views/goods/GoodsNotiInfoForm.html

@@ -139,6 +139,19 @@
 		if (!gagajf.validation($('#searchForm')))
 			return false;
 		
+		if (!gagajf.isNull($('#searchForm textarea[name=goodsCd]').val())){
+			var arrData = $('#searchForm textarea[name=goodsCd]').val().replace(/\r\n/g,"\n").split("\n"); 
+			if (arrData.length > 500){
+				mcxDialog.alertC("상품코드 조회값을 500 이하로 조회 하세요.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#searchForm textarea[name=goodsCd]').focus();
+					}
+				});
+				return false;
+			}
+		}
+		
 		// Fetch data
 		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm', function() {
 			// 업로드의 칼럼정보 가져오기

+ 433 - 0
src/main/webapp/WEB-INF/views/goods/GoodsQuikDeliverySkipForm.html

@@ -0,0 +1,433 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsQuikDeliverySkipForm.html
+ * @desc    : 총알배송제외 상품관리 조회
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.25   eskim       최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<form id="searchForm" name="searchForm" action="#" th:action="@{'/goods/quik/delivery/list'}">
+		<input type="hidden" id="searchGb" name="searchGb" />
+		<input type="hidden" id="search" name="search" value="searchGoodsCd"/>
+ 		<!-- 패널 영역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">
+				<table class="frmStyle">
+					<colgroup>
+						<col width="10%"/>
+						<col width="15%"/>
+						<col width="10%"/>
+						<col width="15%"/>
+						<col width="10%"/>
+						<col width="15%"/>
+						<col width="10%"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>업체<em class="required" title="필수"></em></th>
+						<td>
+							<input type="text" class="w100" name="supplyCompSearchTxt" id="supplyCompSearchTxt" maxlength="20" />
+							<button type="button" class="btn icn" id="btnSearchSupplyComp"><i class="fa fa-search"></i></button>
+							<span id="supplyCompText"></span>
+							<input type="hidden" name="supplyCompList"/>
+						</td>
+						<th>브랜드<em class="required" title="필수"></em></th>
+						<td  colspan="3">
+							<input type="text" class="w100" name="searchTxt" id="searchTxt" maxlength="20" />
+							<button type="button" class="btn icn" id="btnSearchBrand"><i class="fa fa-search"></i></button>
+							<span id="brandText"></span>
+							<input type="hidden" name="brandList"/>
+						</td>
+						<th rowspan="3" >상품코드<em class="required" title="필수"></em></th>
+						<td rowspan="3">
+							<textarea class="textareaR3 w150" name="condition" id="condition"></textarea>
+						</td>
+					</tr>
+					<tr>
+						<th >년도/시즌</th>
+						<td colspan="5">
+							<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>
+					<tr>
+						<th>등록일<em class="required" title="필수"></em></th>
+						<td colspan="5" id="sellTerms"></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="btnGoodsQuikDeliverySkipCreate" >상품저장</button>
+					</li>
+				</ul>
+			</div>
+			<!-- //검색조건 영역 -->
+		</div>
+		<!-- 패널 영역1 -->
+		<div class="panelStyle">
+			<ul class="panelBar">
+				<li>
+					<button type="button" class="btn btn-danger btn-lg" id="btnGoodsQuikDeliverySkipDelete">상품삭제</button>
+				</li>
+				<li class="right">
+					<button type="button" class="btn btn-default btn-lg" onclick="cfnDownloadSampleFile('SF019');">상품등록 양식 다운로드</button>
+					<button type="button" class="btn btn-base btn-lg" id="btnGoodsExcelUpLoad">엑셀상품저장</button>
+					검색결과 : <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"></div>
+			<ul class="panelBar">
+				<li class="center">
+					<div class="tablePaging" id="goodsListPagination"></div>
+				</li>
+			</ul>
+		</div>
+		</form>
+		<!-- //패널 영역2 -->
+<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: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{headerName: "업체", field: "supplyCompCd", width: 100, cellClass: 'text-center'},
+		{headerName: "업체명", field: "supplyCompNm", width: 200, cellClass: 'text-center'},
+		{headerName: "브랜드", field: "brandCd", width: 100, cellClass: 'text-center'},
+		{headerName: "브랜드명", field: "brandGroupNm", width: 200, cellClass: 'text-center'},
+		{headerName: "상품코드", field: "goodsCd", width: 150, cellClass: 'text-center'},
+		{headerName: "상품명", field: "goodsNm", width: 200, cellClass: 'text-left'
+			,cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "상품상태", field: "goodsStat" , width: 100, cellClass: 'text-center',
+			cellEditorParams: { values: gagaAgGrid.extractValues(goodsStatList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(goodsStatList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(goodsStatList, params.newValue); }
+		},
+		{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'}
+	];
+
+	// Get GridOptions
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 중복 선택 가능
+	gridOptions.rowSelection = 'multiple';
+	gridOptions.suppressRowClickSelection = true;
+
+	gridOptions.stopEditingWhenGridLosesFocus = true;
+
+	// Row Click
+	gridOptions.onCellClicked = function(event) {
+		var goodsCd = event.data.goodsCd;
+		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");
+			
+		}
+	}
+
+	// 초기화 클릭시
+	$('#btnInit').on('click', function() {
+
+		$('#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() {
+		fnGoodsListSearch('BASIC');
+	});
+
+	// 조회
+	var fnGoodsListSearch = function(gbn) {
+		
+		if (typeof(gbn) != 'undefined' &&  gbn == 'EXCEL'){
+			$("#searchForm input[name=searchGb]").val("EXCEL");
+		}else{
+			$("#searchForm input[name=searchGb]").val("BASIC");
+		}
+
+		if(!fnConditionCheck()) return;
+
+		gagaPaging.init('searchForm', fnSearchCallBack, 'goodsListPagination', $('#searchForm').find('#pageSize').val());
+		gagaPaging.load($("#searchForm input[name=pageNo]").val());
+
+	}
+	
+	//검색 조건 확인
+	var fnConditionCheck = function(){
+		var formId = '#searchForm';
+		var form = document.searchForm;
+		
+		if (event.keyCode === 13) return false;
+
+		if($("#searchForm input[name=searchGb]").val() == "EXCEL") return true;
+
+		var searchFlag = false;
+		var cnt = 0;
+
+		if( !gagajf.isNull($("#searchForm input[name=supplyCompList]").val()) 
+				|| !gagajf.isNull($("#searchForm textarea[name=condition]").val())
+				|| !gagajf.isNull($("#searchForm input[name=brandList]").val())
+				|| !gagajf.isNull($("#searchForm input[name=stDate]").val())
+				|| !gagajf.isNull($("#searchForm input[name=stDate]").val())
+			){
+			searchFlag = true;
+		}else{
+			/* 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;
+		}
+		
+		if (!gagajf.isNull($('#searchForm textarea[name=condition]').val())){
+			var arrData = $('#searchForm textarea[name=condition]').val().replace(/\r\n/g,"\n").split("\n"); 
+			if (arrData.length > 500){
+				mcxDialog.alertC("키워드 조회값을 500 이하로 조회 하세요.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#searchForm textarea[name=condition]').focus();
+					}
+				});
+				return false;
+			}
+		}
+		return true;
+	}
+	
+	// 업체 조회 선택시
+	$('#btnSearchSupplyComp').on('click', function() {
+		cfnOpenCompanyListPopup('fnSetSupplyCompInfo', 'M');
+	});
+	
+	// 업체 조회 팝업에서 호출
+	var fnSetSupplyCompInfo = function(result) {
+		var arrSupplyComp = [];
+		var supplyCompText = "";
+		var sIndex = 0;
+		$('#searchForm').find('#supplyCompText').html('');
+		$('#searchForm input[name=supplyCompSearchTxt]').val('');
+		result.forEach(function(supplyComp){
+			sIndex++; 
+			arrSupplyComp.push(supplyComp.supplyCompCd);
+		});
+
+		// 조회값이 하나일 경우 화면에 코드 노출 그외는 갯수 처리 
+		if (sIndex == 1) {
+			$('#searchForm input[name=supplyCompSearchTxt]').val(arrSupplyComp[0]);
+		}else{
+			supplyCompText = sIndex + " 개";
+			$('#searchForm').find('#supplyCompText').html(supplyCompText);	
+		}
+		var jsonData = JSON.stringify(arrSupplyComp);
+		$("#searchForm input[name=supplyCompList]").val(jsonData);
+	}
+	
+	// 브랜드 조회 선택시
+	$('#btnSearchBrand').on('click', function() {
+		cfnOpenBrandListPopup('fnSetBrandInfo', 'M');
+	});
+	
+	// 브랜드 조회 팝업에서 호출
+	var fnSetBrandInfo = function(result) {
+		var arrbrandCd = [];
+		var brandText = "";
+		var bIndex = 0;
+		$('#searchForm').find('#brandText').html('');
+		$('#searchForm input[name=searchTxt]').val('');
+		result.forEach(function(brand){
+			bIndex++; 
+			arrbrandCd.push(brand.brandCd);
+		});
+
+		// 조회값이 하나일 경우 화면에 코드 노출 그외는 갯수 처리 
+		if (bIndex == 1) {
+			$('#searchForm input[name=searchTxt]').val(arrbrandCd[0]);
+		}else{
+			brandText = bIndex + " 개";
+			$('#searchForm').find('#brandText').html(brandText);	
+		}
+		var jsonData = JSON.stringify(arrbrandCd);
+		$("#searchForm input[name=brandList]").val(jsonData);
+	}
+	
+	// 초기화 클릭시
+	$('#btnInit').on('click', function() {
+
+		$('#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");
+		$('#searchForm input[name=brandList]').val('');
+		$('#searchForm input[name=supplyCompList]').val('');
+		$('#searchForm').find('#brandText').html('');
+		$('#searchForm').find('#supplyCompText').html('');
+	});
+
+	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());
+		gridOptions.api.setRowData(result.goodsList);
+		gagaPaging.createPagination(result.pageing.pageable);
+		
+	}
+
+	//페이징
+	$('#searchForm select[name=pageSize]').on('change', function() {
+		$("#searchForm input[name=pageNo]").val('1');
+		fnGoodsListSearch($("#searchForm input[name=searchGb]").val());
+	});
+	
+	// 상품삭제
+	$('#btnGoodsQuikDeliverySkipDelete').click(function(e) {
+		//상품선택여부 확인처리 추가
+		var selectedData = gridOptions.api.getSelectedRows();
+
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return false;
+		}
+		
+		var arrGoodsCd = [];
+		$.each(selectedData, function(idx, item) {
+			arrGoodsCd.push(item.goodsCd);
+		});
+
+		mcxDialog.confirm('삭제하시겠습니까?',  {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var data = {arrGoodsCd : arrGoodsCd
+			};
+			
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit('/goods/quik/delivery/delete', jsonData, fnGoodsQuikDeliverySkipDeleteCollBack);
+			}
+		});
+	});
+	
+	var fnGoodsQuikDeliverySkipDeleteCollBack = function(){
+		fnGoodsListSearch($("#searchForm input[name=searchGb]").val());
+	}
+	
+	// 상품저장 클릭시
+	$('#btnGoodsQuikDeliverySkipCreate').on('click', function() {
+		if (gagajf.isNull($("#searchForm textarea[name=condition]").val())) {
+			mcxDialog.alert("상품코드 입력 후 상품 저장을 선택해 주세요.");
+			return;
+		}
+	
+		gagajf.ajaxFormSubmit("/goods/quik/delivery/create", "#searchForm");
+		
+	});
+
+	// 엑셀등록
+	$("#btnGoodsExcelUpLoad").on('click', function() {
+		cfnExcelUploadPopup('','fnExcelUpoadCallback');
+	});
+	
+	var fnExcelUpoadCallback = function(data){
+		
+		var jsonData = JSON.stringify(data);
+		gagajf.ajaxJsonSubmit('/goods/quik/delivery/excelupload/save', jsonData, fnGoodsExcelUpLoadCallBack);
+		
+	}
+	
+	var fnGoodsExcelUpLoadCallBack = function(result){
+		fnGoodsListSearch("EXCEL");
+	}
+	
+	
+	$(document).ready(function() {
+
+		cfnCreateCalendar('#sellTerms', 'stDate', 'edDate', true, '등록일', 'X');
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+
+/*]]>*/
+</script>
+ 	</div>
+
+</html>

+ 13 - 0
src/main/webapp/WEB-INF/views/goods/GoodsTitleReserveForm.html

@@ -308,6 +308,19 @@
 				return false;
 			} 
 		}
+		
+		if (!gagajf.isNull($('#goodsTnmListForm textarea[name=condition]').val())){
+			var arrData = $('#goodsTnmListForm textarea[name=condition]').val().replace(/\r\n/g,"\n").split("\n"); 
+			if (arrData.length > 500){
+				mcxDialog.alertC("키워드 조회값을 500 이하로 조회 하세요.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#goodsTnmListForm textarea[name=condition]').focus();
+					}
+				});
+				return false;
+			}
+		}
 
 		return true;
 	}

+ 18 - 6
src/main/webapp/WEB-INF/views/marketing/MktmailmanagementDetailForm.html

@@ -110,7 +110,6 @@
 						<!-- 구분 1 -->
 						<div class="inner-panelContent" id="btnAddGridNum" style="display:none;">
 							<input type="hidden" name="mailtcSq" th:value="${mailtcSq}">
-							<input type="hidden" name="mailtSq" th:value="${mailtSq}">
 							<div class="panelContent">
 								<table class="frmStyle">
 									<colgroup>
@@ -174,7 +173,6 @@
 						<!-- 구분2 -->
 						<div class="inner-panelContent" id="btnAddGridNum2" style="display:none;">
 							<input type="hidden" name="mailtSq" th:value="${mailtSq}">
-							<input type="hidden" name="mailtcSq2" th:value="${mailtcSq}">
 							<div class="panelContent">
 								<table class="frmStyle">
 									<colgroup>
@@ -432,7 +430,7 @@
 
 		<!-- 버튼 배치 영역 -->
 		<ul class="panelBar">
-			<li class="left"  th:if="${mode  == 'N' }">
+			<li class="left"  th:if="${mode  == 'U' }">
 				<button type="button" class="btn btn-danger btn-lg" id="btndeleteMktmail">삭제</button>
 			</li>
 			<li class="right">
@@ -461,7 +459,22 @@
 				cancelBtnText: "취소",
 				sureBtnText: "확인",
 				sureBtnClick: function() {
-					uifnPopupClose('popupMktMail');
+					
+					var deleteData = [];
+					var corner = {};
+					
+					corner.mailtSq = $('#mailManagementForm input[name=mailtSq]').val();
+					corner.useYn = 'N';
+					deleteData.push(corner);
+					
+					console.log(deleteData);
+					
+					var jsonData = JSON.stringify(deleteData);
+					
+					gagajf.ajaxJsonSubmit('/marketing/mktmailManagement/delete', jsonData, function() {
+						uifnPopupClose('popupMktMail');
+						$('#btnSearch').trigger('click');
+					});
 				}
 			});
 		});
@@ -479,7 +492,7 @@
 			},
 			{headerName: "정상가", field: "listPrice" , width: 120, cellClass: 'text-center'},
 			{headerName: "판매가", field: "listPrice" , width: 120, cellClass: 'text-center'},
-			{headerName: "순번", field: "dispOrd" , width: 120, cellClass: 'text-center'}
+			{headerName: "순번", field: "dispOrd" , width: 120, cellClass: 'text-center',cellEditor: 'numericCellEditor'}
 		];
 		
 		
@@ -565,7 +578,6 @@
 				mailTc.mailtcNm = $('#mailManagementForm input[name=mailtcNm]').val();
 				mailTc.mailtcLink = $('#mailManagementForm input[name=mailtcLink]').val();
 				mailTc.goodsCpr = $('#mailManagementForm input:radio[name=goodsCpr]:checked').val();
-				mailTc.mailtSq = $('#mailManagementForm input[name=mailtSq]').val();
 				mailTc.mailtcSq = $('#mailManagementForm input[name=mailtcSq]').val();
 			} if(check2 != null && check2 != '') {
 				mailTc2.mailtcNm = $('#mailManagementForm input[name=mailtcNm2]').val();

+ 1 - 1
src/main/webapp/WEB-INF/views/marketing/MktmailmanagementPreviewForm.html

@@ -37,7 +37,7 @@
 					
 				<!-- 상품이미지 -->
 				<th:block th:each="goodsData, status : ${oneData.goodsList}">
-					<img th:src="${goodsData.sysImgNm}"/>
+					<img th:src="@{/image/imgoodsData.sysImgNm}"/>
 					<!-- goodsCpr -->
 					<th:block th:if="${status.count  % oneData.tc.goodsCpr == 0}">
 						<br>

+ 126 - 45
src/main/webapp/WEB-INF/views/marketing/PlanTemplatePopupForm.html

@@ -18,8 +18,7 @@
 	<div class="panelStyle" style="height: 750px;">
 		<div class="panelTitle">
 			<strong>기획전 템플릿</strong>
-			<button type="button" class="close"
-				onclick="uifnPopupClose('popupPlanTemplate')">
+			<button type="button" class="close"	onclick="uifnPopupClose('popupPlanTemplate')">
 				<i class="fa fa-times"></i>
 			</button>
 		</div>
@@ -47,7 +46,7 @@
 										<col width="90%" />
 									</colgroup>
 									<tr>
-										<th>리뷰<br/>[전시여부<label class="chkBox"><input type="checkbox" name="reDispYn" onclick="fnAttachYnClick('reDispYn')"/></label>]</th>
+										<th>리뷰<br/>[전시여부<label class="chkBox"><input type="checkbox" name="reDispYn" onclick="fnAttachYnClick('reDispYn')" value="N"/></label>]</th>
 										<td>
 											<table class="frmStyle">
 												<tr>
@@ -57,7 +56,7 @@
 												</tr>
 												<tr>
 													<th>전시순서</th>
-													<td><input type="text" name="reDispOrd" placeholder="1" class="w100 aR" data-valid-type="numeric"></td>
+													<td><input type="text" name="reDispOrd" class="w100 aR" data-valid-type="numeric"></td>
 												</tr>
 											</table>
 											<div class="padding10">
@@ -65,7 +64,7 @@
 													<button type="button"
 														class="btn btnRight btn-success btn-lg" onclick="cfnOpenGoodsPopup('reviewGoodsList')">상품 조회</button>
 													<button type="button"
-														class="btn btnRight btn-success btn-lg" id="">행삭제</button>
+														class="btn btnRight btn-success btn-lg" id="btnReviewDelete">행 삭제</button>
 												</span> <br />
 												<div id="gridListPlanReview"
 													style="width: 100%; height: 200px;" class="ag-theme-balham"></div>
@@ -96,30 +95,34 @@
 										<col width="90%" />
 									</colgroup>
 									<tr>
-										<th>쿠폰<br/>[사용여부<label class="chkBox"><input type="checkbox" name="" id="tempYn" value="Y"/></label>]</th>
+										<th>쿠폰<br/>[사용여부<label class="chkBox"><input type="checkbox" name="cuDsipYn" id="cuDsipYn" value="N"/></label>]</th>
 										<td>
 											<table class="frmStyle">
 												<tr>
 													<th>쿠폰 타이틀</th>
-													<td><input type="text" value="" class="w300 aR">
+													<td><input type="text" name="cuTitle" class="w300 aR">
 													</td>
 												</tr>
 												<tr>
 													<th>전시순서</th>
-													<td><input type="text" value="" placeholder="2"	class="w100 aR"></td>
+													<td><input type="text" name="cuDispOrd" placeholder="2" class="w100 aR" data-valid-type="numeric"></td>
 												</tr>
 											</table>
 											<div class="padding10">
 												<span class="buttonSpan">
-													<button type="button"
-														class="btn btnRight btn-success btn-lg" id="">쿠폰
-														조회</button>
-													<button type="button"
-														class="btn btnRight btn-success btn-lg" id="">행
-														삭제</button>
+													<button type="button" class="btn btnRight btn-success btn-lg" onclick="fnAddCoupone()">쿠폰 추가</button>
 												</span> <br />
-												<div id="gridListPlanCoupon"
-													style="width: 100%; height: 200px;" class="ag-theme-balham"></div>
+											<table class="frmStyle" id="couponTable">
+												<!-- <tr>
+													<td colspan="3">
+														<input type="checkbox">
+														<input type="text" class="w300" name="cuItemVal1" onkeypress="if (window.event.keyCode == 13) { fnOpenCouponRetrievePopup('input[name=cuItemVal1]', 'input[name=cuItemNm1]'); }"/>
+														<button type="button" class="btn icn" onclick="fnOpenCouponRetrievePopup('input[name=cuItemVal1]', 'input[name=cuItemNm1]');"><i class="fa fa-search cpn" aria-hidden="true"></i></button>
+														<input name="cuItemVal1" type="text" class="w100" maxlength="20" readonly="readonly"/>
+														<button type="button" class="btn icn" onclick="$('input[name=cuItemVal1], input[name=cuItemNm1]').val('');"><i class="fa fa-eraser" aria-hidden="true"></i></button>
+													</td>
+												</tr> -->
+											</table>
 											</div>
 										</td>
 									</tr>
@@ -414,7 +417,7 @@
 															<button type="button" class="btn btnRight btn-success btn-lg"
 																onclick="fnOpenGoodsPopup('gridOptions_c1');">상품 조회</button>
 															<button type="button" class="btn btnRight btn-success btn-lg"
-																onclick="fnGoodsDeleteRow('gridOptions_c1');">행삭제</button>
+																onclick="fnGoodsDeleteRow('gridOptions_c1');">행 삭제</button>
 														</li>
 													</ul>
 													<!-- Agrid -->
@@ -960,9 +963,8 @@
 			</ul>
 			<!-- //버튼 배치 영역 -->
 		</form>
+	</div>
 </div>
-</div>
-
 <script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020103001"></script>
 <script type="text/javascript" src="/ux/plugins/gaga/gaga.summernote.js?v=2020103001"></script>
 <script th:inline="javascript">
@@ -971,7 +973,7 @@
 	var columnReviewList = [
 		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
 		{headerName: "상품ID", field: "reItemVal", width: 110, cellClass: 'text-center'},
-		{headerName: "상품명", field: "reItemName", width: 120, cellClass: 'text-center'},
+		{headerName: "상품명", field: "reItemNm", width: 120, cellClass: 'text-center'},
 		{headerName: "시작일"			, field:'startSearchDate'	, width:110, cellClass: 'text-center',
 			cellEditor: 'datePicker',
 			cellEditorParams: { maxlength: 10, required: true },
@@ -990,13 +992,6 @@
 		},
 	];  
 	
-	// 쿠폰 리스트 설정
-	var columnCouponList = [
-		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
-		{headerName: "쿠폰ID", field: "", width: 110, cellClass: 'text-center'},
-		{headerName: "쿠폰명", field: "", width: 120, cellClass: 'text-center'},
-	];
-
 	//상품 전시 그리드 그리기
 	var columnDefs = [
 		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
@@ -1053,11 +1048,8 @@
 	gridOptionsPlanReviewList.rowSelection = "multiple";
 	gridOptionsPlanReviewList.suppressRowClickSelection = true;
 	
-	// 쿠폰 그리드 설정
-	var gridOptionsPlanCouponeList = gagaAgGrid.getGridOptions(columnCouponList);
-	gridOptionsPlanCouponeList.rowSelection = "multiple";
-	gridOptionsPlanCouponeList.suppressRowClickSelection = true;
 	
+
 	
 	//팝업창 닫기버튼
 	$('#btndeleteTemplate').on('click', function() {
@@ -1070,14 +1062,6 @@
 		});
 	});
 	
-	
-	
-	var fnDetailFormSearch = function() {
-		uifnPopupClose('planTemplateForm');		
-	}
-	
-	
-	
 	// 첨부파일 삭제
 	var fnDeleteFile = function(obj, noticeSq, seq, sysFileNm) {
 		mcxDialog.confirm('정말 삭제하시겠습니까?', {
@@ -1325,16 +1309,66 @@
 			}
 			// 중복되지 않은 데이터 리스트에 추가
 			if(addChk) {
-				gagaAgGrid.addRowData(gridOptionsPlanReviewList, {"reItemVal":result[i].goodsCd , "reItemName":result[i].goodsNm, "startSearchDate": _today, "startSearchTime": '00:00:00', "endSearchDate":_today, endSearchTime: '23:59:59' });
+				gagaAgGrid.addRowData(gridOptionsPlanReviewList, {"reItemVal":result[i].goodsCd , "reItemNm":result[i].goodsNm, "startSearchDate": _today, "startSearchTime": '00:00:00', "endSearchDate":_today, endSearchTime: '23:59:59' });
 			}
 		}
 		
 		uifnPopupClose("popupGoods");
 	}
 	
+	// 리뷰 선택삭제 버튼 클릭시
+    $('#btnReviewDelete').on('click', function() {
+    	gridOptionsPlanReviewList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsPlanReviewList)});
+    });
+	
+	
+	// 쿠폰조회 팝업
+	var fnOpenCouponRetrievePopup = function(strReturnCode, strReturnName) {
+		var oParam = new Object();
+		oParam.returnCode = strReturnCode;
+		oParam.returnName = strReturnName;
+		cfnOpenCouponRetrievePopup($(strReturnName).val(), oParam);
+	}
+	
+	// 쿠폰 추가
+	var fnAddCoupone = function() {
+		var len =  $('#planTemplateForm').find('#couponTable tr').length;
+		
+		var html =  '<tr>';
+		html += '<td colspan="3">';
+		html += '<input type="text" class="w300" id="cuItemNm" name="cuItemNm'+(len+1)+'"/>';
+		html += '<button type="button" class="btn icn" id="couponPlusBtn'+(len+1)+'"><i class="fa fa-search cpn" aria-hidden="true"></i></button>';
+		html += '<input id="cuItemVal" name="cuItemVal'+(len+1)+'" type="text" class="w100" maxlength="20" readonly="readonly"/>';
+		html += '<button type="button" class="btn icn" id="deleteCoupon'+(len+1)+'"><i class="fa fa-eraser" aria-hidden="true"></i></button>';
+		html += '</td>';
+		html += '</tr>';
+			
+			
+			
+		$("#couponTable").append(html);
+		
+		$('#couponPlusBtn'+(len+1)).attr("onclick","fnOpenCouponRetrievePopup('input[name=cuItemVal"+(len+1)+"]', 'input[name=cuItemNm"+(len+1)+"]');")
+		$('#deleteCoupon'+(len+1)).attr("onclick","deleteRowCoupon("+(len+1)+")");
+	}
+	
+
+	 //삭제 버튼
+	var deleteRowCoupon = function(len) {  
+		var cnt = len;
+		console.log(cnt);
+	    var html = $("#deleteCoupon"+len).closest('tr');
+	    html.remove(); //tr 테그 삭제
+	} 
+		
 	
 	// 팝업창 저장
 	$('#btnSaveTemplate').on('click', function() {
+		var len =  $('#planTemplateForm').find('#couponTable tr').length;
+		for (var i = 0; i < len; i++) {
+			console.log($('#planTemplateForm').find('#couponTable tr').children().eq(i).find("#cuItemVal").val());
+		}
+		
+		// 리뷰 전시 클릭했을 경우
 		if($("input:checkbox[name=reDispYn]").prop("checked")){
 			$("input:checkbox[name=reDispYn]").val('Y');
 			if($("input[name=reTitle]").val()==''){
@@ -1350,6 +1384,22 @@
 			$("input:checkbox[name=reDispYn]").val('N');
 		}
 		
+		// 쿠폰 전시 클랙했을 경우
+		if($("input:checkbox[name=cuDispYn]").prop("checked")){
+			$("input:checkbox[name=cuDispYn]").val('Y');
+			if($("input[name=cuTitle]").val()==''){
+				mcxDialog.alert('쿠폰 타이틀을 입력하세요.');
+				return;
+			}
+			if($("input[name=cuDispOrd]").val()==''){
+				mcxDialog.alert('쿠폰 전시순서를 입력하세요.');
+				return;
+			}
+			
+		}else{
+			$("input:checkbox[name=cuDispYn]").val('N');
+		}
+		
 		mcxDialog.confirm('기획전 템플릿을 등록 하시겠습니까?', {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
@@ -1357,16 +1407,44 @@
 				
 				let allReviewData = gagaAgGrid.getAllRowData(gridOptionsPlanReviewList);
 				var multiPlanReview = [];
+				
 				$.each(allReviewData, function(idx, item) {
 					multiPlanReview.push(item.reItemVal);
 				});
 				
+				var multiPlanReviewStartD = [];
+				$.each(allReviewData, function(idx, item) {
+					multiPlanReviewStartD.push(item.startSearchDate);
+				});
+				
+				var multiPlanReviewStartT = [];
+				$.each(allReviewData, function(idx, item) {
+					multiPlanReviewStartT.push(item.startSearchTime);
+				});
+				
+				var multiPlanReviewEndD = [];
+				$.each(allReviewData, function(idx, item) {
+					multiPlanReviewEndD.push(item.endSearchDate);
+				});
+				
+				var multiPlanReviewEndT = [];
+				$.each(allReviewData, function(idx, item) {
+					multiPlanReviewEndT.push(item.endSearchTime);
+				});
+				
+				
 				let data = {
-							allReviewData : allReviewData
+							multiPlanReview : multiPlanReview
+						   ,allReviewData : allReviewData
+						   ,multiPlanReviewStartD : multiPlanReviewStartD
+						   ,multiPlanReviewStartT : multiPlanReviewStartT
+						   ,multiPlanReviewEndD : multiPlanReviewEndD
+						   ,multiPlanReviewEndT : multiPlanReviewEndT
 						   ,reTitle : $('#planTemplateForm input[name=reTitle]').val()
 						   ,reDispOrd : $('#planTemplateForm input[name=reDispOrd]').val()
 						   ,reDispYn :  $('#planTemplateForm input:checkbox[name=reDispYn]').val()
 						   ,mode :  $('#planTemplateForm input[name=mode]').val()
+						   ,planSq : $('#planTemplateForm input[name=planSq]').val()
 				}
 				var jsonData = JSON.stringify(data);
 				gagajf.ajaxJsonSubmit('/marketing/planning/detail/template/save', jsonData, fnDetailFormSearch);
@@ -1382,11 +1460,15 @@
 		
 		
 	});
-
+	
+	
+	// 콜백
+	var fnDetailFormSearch = function() {
+		uifnPopupClose('popupPlanTemplate');		
+	}
+	
 	
 $(document).ready(function() {
-		
-		
 		// 썸머노트 그리기
 		gagaSn.createSummernote(snOptions, '#fsrcPcDetail1');
 		gagaSn.createSummernote(snOptions, '#fsrcMobileDetail1');
@@ -1395,7 +1477,6 @@ $(document).ready(function() {
 		
 		// 그리드 그리기
 		gagaAgGrid.createGrid("gridListPlanReview", gridOptionsPlanReviewList);
-		gagaAgGrid.createGrid("gridListPlanCoupon", gridOptionsPlanCouponeList);
 		gagaAgGrid.createGrid("gridSectionGbList1", gridOptions_c1);
 		gagaAgGrid.createGrid("gridSectionGbList2", gridOptions_c2);
 		gagaAgGrid.createGrid("gridSectionGbList3", gridOptions_c3);