Browse Source

총알배송 제외상품관리, 엑셀 건수 체크

eskim 5 years ago
parent
commit
f925807c57

+ 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);
 
 }

+ 140 - 0
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)) {
@@ -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++;
+		}
+		
+	}
 }

+ 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);

+ 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;

+ 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_QUIK_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_QUIK_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_QUIK_DELEVERY_SKIP (
+		       GOODS_CD
+		     , REG_NO
+		     , REG_DT
+		)
+		VALUES (
+		       #{goodsCd}
+		     , #{regNo}
+		     , NOW()
+		)
+	</insert>
+	
+	<!-- 총알배송 제외 상품 삭제 -->
+	<delete id="deleteGoodsQuikDeleverySkip" parameterType="Goods">
+		/* TsaGoods.createGoodsQuikDeleverySkip */
+		DELETE FROM TB_GOODS_QUIK_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>

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

@@ -0,0 +1,421 @@
+<!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;
+		}
+		
+		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>