Selaa lähdekoodia

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

gagamel 5 vuotta sitten
vanhempi
commit
7294689950

+ 47 - 2
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java

@@ -335,7 +335,7 @@ public interface TsaGoodsDao {
 	void saveStock(Option option);
 
 	/**
-	 * 코상품 저장
+	 * 코상품 저장
 	 * @param codiGoods
 	 * @author eskim
 	 * @since 2020. 10. 28
@@ -343,11 +343,56 @@ public interface TsaGoodsDao {
 	void saveCodiGoods(CodiGoods codiGoods);
 
 	/**
-	 * 코상품 삭제
+	 * 코상품 삭제
 	 * @param codiGoods
 	 * @author eskim
 	 * @since 2020. 10. 28
 	 */
 	void deleteCodiGoods(CodiGoods codiGoods);
 
+	/**
+	 * 상품 기본 정보 등록
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	void createGoods(Goods goods);
+
+	/**
+	 * 상품통계 생성
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	void createGoodsSmmary(Goods goods);
+
+//	/**
+//	 * 상품 품목별 매핑 카테고리 저장
+//	 *
+//	 * @param goods
+//	 * @author eskim
+//	 * @since 2020. 10. 30
+//	 */
+//	void createCategoryGoods(Goods goods);
+
+//	/**
+//	 * 상품 이미지 저장
+//	 *
+//	 * @param goodsImg
+//	 * @author eskim
+//	 * @since 2020. 10. 30
+//	 */
+//	void saveGoodsImgInfo(GoodsImg goodsImg);
+
+	/**
+	 * 상품코드 생성
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	void createGoodsSequence(Goods goods);
+
 }

+ 230 - 2
style24.admin/src/main/java/com/style24/admin/biz/service/TsaGoodsService.java

@@ -9,6 +9,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.style24.admin.biz.dao.TsaGoodsDao;
 import com.style24.admin.support.env.TsaConstants;
 import com.style24.admin.support.security.session.TsaSession;
@@ -16,7 +18,9 @@ import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.Brand;
 import com.style24.persistence.domain.CodiGoods;
 import com.style24.persistence.domain.Color;
+import com.style24.persistence.domain.CommonCode;
 import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsCategory;
 import com.style24.persistence.domain.GoodsCompose;
 import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsHst;
@@ -60,6 +64,29 @@ public class TsaGoodsService {
 	@Autowired
 	private TsaCommonService commonService;
 
+	@Autowired
+	private TsaRendererService rendererService;
+
+	@Autowired
+	private ObjectMapper mapper;
+
+	private static final String NUMBER_PATTERN = "^[0-9]+$";
+
+	private static final String SELF_GOOODS_AFTER = "STY";
+
+	/**
+	 * 상품 할인율 계산
+	 *
+	 * @param value
+	 * @param len
+	 * @param pad
+	 * @return
+	 */
+	private long getDcRate(int listPrice, int currPrice) {
+		double rate = (double)(currPrice) / (double)(listPrice);
+		return 100 - (long)((Math.round(rate * 100) / 100.0) * 100);
+	}
+
 	/**
 	 * 품목 목록
 	 * @param itemkind
@@ -653,8 +680,8 @@ public class TsaGoodsService {
 	private void saveGoodsCategory(Goods goods) {
 
 //		GoodsCategory goodsCategory = new GoodsCategory();
-//		goodsCategory.setRegId(TsaSession.getInfo().getUserId());
-//		goodsCategory.setUpdId(TsaSession.getInfo().getUserId());
+//		goodsCategory.setRegNo(TsaSession.getInfo().getUserNo());
+//		goodsCategory.setUpdNo(TsaSession.getInfo().getUserNo());
 //		goodsCategory.setGoodsCd(goods.getGoodsCd());
 //		displayService.deleteGoodsCategory(goodsCategory);
 //
@@ -1046,4 +1073,205 @@ public class TsaGoodsService {
 		}
 	}
 
+	/**
+	 * 딜상품 저장
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsDeal(Goods goods) {
+
+		Goods regGoods = new Goods();
+
+		// <,> replace 처리
+		regGoods.setRegNo(TsaSession.getInfo().getUserNo());
+		regGoods.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		String goodsCd = this.getGoodsCodeSeq("D", "D");
+		regGoods.setGoodsCd(goodsCd);
+		regGoods.setSupplyGoodsCd(goodsCd);
+		regGoods.setGoodsType("D");
+		regGoods.setSupplyCompCd(goods.getSupplyCompCd());
+		regGoods.setBrandCd(goods.getBrandCd());
+		regGoods.setItemkindCd(goods.getItemkindCd());
+		regGoods.setGoodsNm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsNm(), "&lt;", "<"), "&gt;", ">"));
+		regGoods.setStyleYear(goods.getStyleYear()); // createGoodsExtend 에서 코드 변경 작업
+		regGoods.setSeasonCd(goods.getSeasonCd());
+		regGoods.setSexGb(goods.getSexGb());
+		regGoods.setColorCd(goods.getColorCd());
+		regGoods.setMakeNm(goods.getMakeNm());
+		regGoods.setMakeYmd(goods.getMakeYmd());
+		regGoods.setSelfMallYn(goods.getSelfMallYn());
+		regGoods.setGoodsStat("20"); // 정보부족
+		regGoods.setFormalGb("10"); // 정상 기본값 처리
+
+		regGoods.setListPrice(goods.getCurrPrice());
+		regGoods.setCurrPrice(goods.getCurrPrice());
+		regGoods.setDcRate((int)(this.getDcRate(goods.getCurrPrice(), goods.getCurrPrice())));
+
+		Collection<GoodsCompose> goodsExtendList = null;
+		try {
+			goodsExtendList = mapper.readValue(goods.getGoodsComposeList(), new TypeReference<Collection<GoodsCompose>>() {
+			});
+		} catch (Exception e) {
+			throw new IllegalStateException(message.getMessage("딜상품 저장 중 오류로 인해 저장되지 않았습니다."));
+		}
+
+		for (GoodsCompose goodsExtend : goodsExtendList) {
+			goodsExtend.setGoodsCd(regGoods.getGoodsCd());
+			goodsExtend.setGoodsType(regGoods.getGoodsType());
+			goodsExtend.setRegNo(TsaSession.getInfo().getUserNo());
+			goodsExtend.setUpdNo(TsaSession.getInfo().getUserNo());
+
+			Goods extendGoods = new Goods();
+			extendGoods.setGoodsCd(goodsExtend.getCompsGoodsCd());
+			extendGoods = goodsDao.getGoods(extendGoods);
+			if (StringUtils.isEmpty(extendGoods.getBrandCd())) {
+				throw new IllegalStateException(message.getMessage("구성상품 중 " + goodsExtend.getCompsGoodsCd() + " 상품 정보를 확인해 주세요."));
+			}
+
+			if ("Y".equals(goodsExtend.getBaseYn())) {
+				regGoods.setBrandCd(extendGoods.getBrandCd());
+				regGoods.setItemkindCd(extendGoods.getItemkindCd());
+				regGoods.setGoodsNum(extendGoods.getGoodsNum());
+				regGoods.setSupplyCompCd(extendGoods.getSupplyCompCd());
+				regGoods.setFormalGb(extendGoods.getFormalGb());
+			}
+		}
+
+		this.createGoodsExtend(regGoods, goodsExtendList); // 딜상품 관련 정보 저장
+	}
+
+
+
+	/**
+	 * 세트/딜 상품 관련 저장
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	private void createGoodsExtend(Goods regGoods, Collection<GoodsCompose> goodsExtendList) {
+		// 브랜드 확인
+		Brand brand = new Brand();
+		brand.setBrandCd(regGoods.getBrandCd());
+		brand.setSupplyCompCd(regGoods.getSupplyCompCd());
+		Collection<Brand> brandList = businessService.getBrandList(brand);
+		if (brandList == null || brandList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("구성상품 중 기준 상품의 브랜드를 확인해 주세요."));
+		}
+
+		int delvFee = 0;
+		int minOrdAmt = 0;
+		float pntPrate = 0.0f;
+		float pntMrate = 0.0f;
+		float sellFeeRate = 0.0f;
+		for (Brand tmpBrand : brandList) {
+
+			delvFee = tmpBrand.getDelvFee();
+			minOrdAmt = tmpBrand.getMinOrdAmt();
+			if ("10".equals(regGoods.getFormalGb())) {
+				pntPrate = tmpBrand.getPntPrate10();
+				pntMrate = tmpBrand.getPntMrate10();
+			} else {
+				pntPrate = tmpBrand.getPntPrate20();
+				pntMrate = tmpBrand.getPntMrate20();
+			}
+			sellFeeRate = tmpBrand.getSellFeeRate();
+		}
+		regGoods.setDelvFee(delvFee); // 배송비
+		regGoods.setMinOrdAmt(minOrdAmt); // 무료배송비최소구매금액
+		regGoods.setPntPrate(pntPrate); // 포인트적립율(PC)
+		regGoods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
+		regGoods.setSellFeeRate(sellFeeRate); // 판매수수료율
+		regGoods.setSelfGoodsYn("Y");
+
+		// 스타일 연도
+		CommonCode commonCode = new CommonCode();
+		commonCode.setUseYn("Y");
+		commonCode.setCdGb("G023"); // 스타일년도
+		commonCode.setCd(regGoods.getStyleYear());
+		Collection<CommonCode> styleYearList = rendererService.getCommonCodeList(commonCode);
+		if (styleYearList == null || styleYearList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("스타일 연도를 확인해 주세요."));
+		}
+		String styleYear = "";
+		for (CommonCode styleCode : styleYearList) {
+			styleYear = styleCode.getCdNm();
+		}
+		regGoods.setStyleYear(styleYear);
+
+		goodsDao.createGoods(regGoods); // 상품기본 저장
+		goodsDao.createGoodsSmmary(regGoods); // 상품통계 생성
+
+		StringBuilder goodsDescSb = new StringBuilder(); // 상품상세
+
+		int dispOrd = 1;
+		for (GoodsCompose regGoodsExtend : goodsExtendList) {
+			regGoodsExtend.setDispOrd(dispOrd);
+			goodsDao.saveGoodsCompose(regGoodsExtend); // 구성상품기본 저장
+			dispOrd++;
+		}
+
+		// 사용자 검색어를 검색어에 적용
+		String goodsSnm = goodsDao.getGoodsSnm(regGoods.getGoodsCd());
+		regGoods.setGoodsSnm(goodsSnm);
+		goodsDao.updateGoodsSnm(regGoods);
+		// 카테고리 전시
+		// 추후 작업 해야함 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+		//goodsDao.createCategoryGoods(regGoods);
+
+		// 추후 작업 해야함 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+		// 대표 이미지만 생성
+//		GoodsImg goodsImg = new GoodsImg();
+//		goodsImg.setGoodsCd(regGoods.getGoodsCd());
+//		goodsImg.setImgType("A");
+//		// 이미지 경로 확인하자!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+//		goodsImg.setImgPath1(this.getGoodsImgPath(regGoods.getGoodsCd(), regGoods.getBrandCd()) + "01.jpg");
+//		goodsImg.setRegNo(TsaSession.getInfo().getUserNo());
+//		goodsImg.setUpdNo(TsaSession.getInfo().getUserNo());
+//		goodsDao.saveGoodsImgInfo(goodsImg);
+	}
+
+	/**
+	 * 품 이미지 경로생성
+	 *
+	 * @param goodsCd
+	 * @param brandCd
+	 * @return String
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	private String getGoodsImgPath(String goodsCd, String brandCd) {
+		return "/" + goodsCd.substring(0, 1) + "/" + goodsCd.substring(0, 3) + "/" + goodsCd + "/1000/" + goodsCd + "_";
+	}
+
+	/**
+	 * 상품 코드 생성
+	 *
+	 * @param goodsType - 상품타입
+	 * @param goodsCdAfter - 상품시퀀스 앞에 붙는명
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	public String getGoodsCodeSeq(String goodsType, String goodsCdAfter) {
+
+		//상품코드 12자리
+		String goodsCd = "";
+		Goods goods = new Goods();
+		goodsDao.createGoodsSequence(goods);
+		String goodsSeq = GagaStringUtil.getLPadding(Integer.toString(goods.getGoodsSq()), 9, "0");
+		if ("S".equals(goodsType) || "D".equals(goodsType)) {
+			goodsCd = SELF_GOOODS_AFTER + goodsCdAfter + goodsSeq;
+
+		} else {
+			goodsCd = goodsCdAfter + goodsSeq; // 입점 : 브랜드코드
+		}
+		return goodsCd;
+	}
 }

+ 65 - 33
style24.admin/src/main/java/com/style24/admin/biz/web/TsaGoodsController.java

@@ -287,7 +287,8 @@ public class TsaGoodsController extends TsaBaseController {
 		// 시즌
 		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
 		// 년도
-		//mav.addObject("styleYearList", rendererService.getAvailCommonCodeList("G006"));
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
 		// 연령대
 		mav.addObject("ageGrpCdList", rendererService.getAvailCommonCodeList("G023"));
 		// 사용여부
@@ -562,6 +563,9 @@ public class TsaGoodsController extends TsaBaseController {
 		mav.addObject("distributionGbList", rendererService.getCommonCodeList("G065", "Y", distributionGbExceptCds));
 		// 상품연령대
 		mav.addObject("ageGrpCdList", rendererService.getAvailCommonCodeList("G023"));
+		// 년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
 		// 색상
 		Color color = new Color();
 		mav.addObject("colorList", rendererService.getColorList(color));
@@ -675,20 +679,6 @@ public class TsaGoodsController extends TsaBaseController {
 		return goodsService.getCodiGoodsList(codiGoods);
 	}
 
-	/**
-	 * 상품 품목 변경 저장
-	 *
-	 * @param goodsList
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 23
-	 */
-	@PostMapping("/itemKind/change/save")
-	@ResponseBody
-	public GagaResponse saveItemKindChange(@RequestBody Collection<Goods> goodsList) {
-		goodsService.saveItemKindChange(goodsList);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
 
 	/**
 	 * 상품 상세 저장
@@ -823,7 +813,7 @@ public class TsaGoodsController extends TsaBaseController {
 	 * @param
 	 * @return
 	 * @author eskim
-	 * @since 2020. 05. 26
+	 * @since 2020. 10. 29
 	 */
 	@GetMapping("/deal/form")
 	@ResponseBody
@@ -842,10 +832,13 @@ public class TsaGoodsController extends TsaBaseController {
 		mav.addObject("styleYearList", rendererService.getAvailCommonCodeList("G023"));
 		// 매입유형
 		mav.addObject("buyingTypeList", rendererService.getAvailCommonCodeList("G035"));
+		// 색상
+		Color color = new Color();
+		mav.addObject("colorCdList", rendererService.getColorList(color));
 		// 상품상태
 		// mav.addObject("goodsStatList",
 		// rendererService.getAvailCommonCodeList("G008"));
-		String[] exceptCds = {"00"};
+		String[] exceptCds = {"G008_00"};
 		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
 
 		mav.addObject("params", goods);
@@ -853,20 +846,20 @@ public class TsaGoodsController extends TsaBaseController {
 		return mav;
 	}
 
-//	/**
-//	 * 딜 상품 등록
-//	 *
-//	 * @param goods
-//	 * @return
-//	 * @author eskim
-//	 * @since 2020. 06. 14
-//	 */
-//	@PostMapping("/deal/save")
-//	@ResponseBody
-//	public GagaResponse saveGoodsDeal(@RequestBody Goods goods) {
-//		goodsService.saveGoodsDeal(goods);
-//		return super.ok(message.getMessage("SUCC_0001"));
-//	}
+	/**
+	 * 딜 상품 등록
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	@PostMapping("/deal/save")
+	@ResponseBody
+	public GagaResponse saveGoodsDeal(@RequestBody Goods goods) {
+		goodsService.saveGoodsDeal(goods);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
 
 	/**
 	 * 상품 대량 등록 화면
@@ -901,21 +894,57 @@ public class TsaGoodsController extends TsaBaseController {
 	}
 
 	/**
-	 * 상품품목관리 화면
+	 * 상품품목변경관리 화면
 	 *
 	 * @return
 	 * @author eskim
-	 * @since 2020. 10. 16
+	 * @since 2020. 10. 30
 	 */
 	@GetMapping("/itemkind/form")
 	public ModelAndView itemkindForm() {
 		ModelAndView mav = new ModelAndView();
 
+		String supplyCompCd = "";
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
+			supplyCompCd = TsaSession.getInfo().getSupplyCompCd();
+		}
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd));
+		// 시즌
+		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
+		// 년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
+		// 품목
+		mav.addObject("itemkindList", rendererService.getAllItemkindList());
+		// 카테고리 구분
+		mav.addObject("cateGbList", rendererService.getAvailCommonCodeList("G032"));
+		// MD
+		mav.addObject("brandMdList", rendererService.getBrandMdList());
+		// 정상이월
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+
 		mav.setViewName("goods/GoodsItemkindForm");
 
 		return mav;
 	}
 
+	/**
+	 * 상품 품목 변경 저장
+	 *
+	 * @param goodsList
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 23
+	 */
+	@PostMapping("/itemKind/change/save")
+	@ResponseBody
+	public GagaResponse saveItemKindChange(@RequestBody Collection<Goods> goodsList) {
+		goodsService.saveItemKindChange(goodsList);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+
 	/**
 	 * 상품 가격예약 관리 화면
 	 *
@@ -1062,6 +1091,9 @@ public class TsaGoodsController extends TsaBaseController {
 		mav.addObject("goodsTypeList", rendererService.getAvailCommonCodeList("G056"));
 		// MD
 		mav.addObject("brandMdList", rendererService.getBrandMdList());
+		// 년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
 
 		mav.addObject("params", goodsSearch);
 

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

@@ -113,6 +113,8 @@ public class Goods extends TscBaseDomain {
 	private String siteCd;
 	private int sellDay15Qty;
 
+	private int goodsSq;
+
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] arrGoodsCd;
 

+ 93 - 0
style24.admin/src/main/java/com/style24/persistence/domain/GoodsCategory.java

@@ -0,0 +1,93 @@
+package com.style24.persistence.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품별 카테고리 Domain
+ * @author eskim
+ * @since 2020. 10. 30
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsCategory extends TscBaseDomain {
+
+	private int startRow;
+	private int endRow;
+	private String fullCateNm;
+	private String imgPath1;
+	private String imgPath4;
+	private String imgPath6;
+	private String imgType;
+	private String goodsCd;
+	private String goodsNm;
+	private int currStockQty;
+	private int baseStockQty;
+	private int dcRate;
+	private String dcRateSt;
+	private String dcRateEd;
+	private int listPrice;
+	private int currPrice;
+	private String currPriceSt;
+	private String currPriceEd;
+	private int pntPrate;
+	private String prePpntUsableYn;
+	private int pntMrate;
+	private String preMpntUsableYn;
+	private String soldoutYn;
+	private String erpStockLinkYn;
+	private String formalGb;
+	private String selfGoodsYn;
+	private String mdId;
+	private String supplyGoodsCd;
+	private String supplyCompCd;
+	private String brandEnm;
+	private String brandGrpNm;
+	private String brandCd;
+	private String itemkindCd;
+	private String colorEnm;
+	private String goodsStat;
+	private String siteCd;
+	private String styleYear;
+	private String seasonCd;
+	private String changeableYn;
+	private String returnableYn;
+	private String returnFeeFreeYn;
+	private String changeFeeFreeYn;
+	private String stDate;
+	private String edDate;
+	private String dispYn;
+	private String searchGb;
+	private String cateCd;
+	private String cateGb;
+	private String cateType;
+	private String cateCd1;
+	private String cateCd2;
+	private String cateCd3;
+	private String cateCd4;
+	private String cateCd5;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCdArr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCd1Arr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCd2Arr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCd3Arr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCd4Arr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCd5Arr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateGbArr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateTypeArr;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] goodsCdList;
+
+	private String goodsCds;
+}

+ 122 - 4
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -402,7 +402,7 @@
 		         <if test="goodsNm != null and goodsNm != ''">
 		        AND UPPER(G.GOODS_NM) LIKE CONCAT('%',UPPER(#{goodsNm}),'%')
 		        </if>
-		         <if test="goodsType != null and goodsType != ''">
+		        <if test="goodsType != null and goodsType != ''">
 		        AND G.GOODS_TYPE = #{goodsType}
 		        </if>
 		        <if test="supplyCompCd != null and supplyCompCd != ''">
@@ -417,9 +417,6 @@
 		        #{item}
 		            </foreach>
 		        </if>
-		        <if test="goodsType != null and goodsType != ''">
-		        AND G.GOODS_TYPE = #{goodsType}
-		        </if>
 		        <if test="selfMallYn != null and selfMallYn != ''">
 		        AND G.SELF_MALL_YN = #{selfMallYn}
 		        </if>
@@ -567,6 +564,13 @@
 		        <if test="ageGrpCd != null and ageGrpCd != ''">
 		        AND G.AGE_GRP_CD = #{ageGrpCd}
 		        </if>
+		        <if test="cateCd != null and cateCd != ''">
+		        AND G.GOODS_CD IN (
+		            SELECT GOODS_CD
+		            FROM   TB_CATEGORY_GOODS
+		            WHERE  CATE_CD = #{cateCd}
+		        )
+		        </if>
 	</sql>
 	
 	<!-- 목록 페이징 정보 -->
@@ -1242,6 +1246,110 @@
 		ORDER BY A.DISP_ORD 
 	</select>
 	
+	<!-- 상품 기본 정보 등록 -->
+	<insert id="createGoods" parameterType="Goods">
+		/* TsaGoods.createGoods */
+		INSERT INTO TB_GOODS (
+		    GOODS_CD
+		  , BRAND_CD
+		  , ITEMKIND_CD
+		  , GOODS_NM
+		  , GOODS_TNM
+		  , GOODS_SNM
+		  , GOODS_SNM1
+		  , COLOR_CD
+		  , STYLE_YEAR
+		  , SEASON_CD
+		  , SEX_GB
+		  , GOODS_NUM
+		  , GOODS_TYPE
+		  , LIST_PRICE
+		  , CURR_PRICE
+		  , DC_RATE
+		  , GOODS_STAT
+		  , SELF_MALL_YN
+		  , GOODS_GB
+		  , DISTRIBUTION_GB
+		  , SELF_GOODS_YN
+		  , SUPPLY_COMP_CD
+		  , SUPPLY_GOODS_CD
+		  , AGE_GRP_CD
+		  , DELV_FEE
+		  , MIN_ORD_AMT
+		  , PNT_PRATE
+		  , PNT_MRATE
+		  , SELL_FEE_RATE
+		  , FORMAL_GB
+		  , MAKE_NM
+		  , MAKE_YMD
+		  , TAX_GB
+		  , ERP_STOCK_LINK_YN
+		  , REG_NO
+		  , REG_DT
+		  , UPD_NO
+		  , UPD_DT
+		)
+		VALUES(
+		    #{goodsCd}
+		  , #{brandCd}
+		  , #{itemkindCd}
+		  , NVL(#{goodsNm},'상품명없음')
+		  , #{goodsTnm}
+		  , #{goodsSnm}
+		  , #{goodsSnm1}
+		  , #{colorCd}
+		  , #{styleYear}
+		  , #{seasonCd}
+		  , #{sexGb}
+		  , #{goodsNum}
+		  , NVL(#{goodsType},'N')
+		  , #{listPrice}
+		  , #{currPrice}
+		  , #{dcRate}
+		  , #{goodsStat}
+		  , NVL(#{selfMallYn},'Y') 
+		  , #{goodsGb}
+		  , #{distributionGb}
+		  , #{selfGoodsYn}
+		  , #{supplyCompCd}
+		  , #{supplyGoodsCd}
+		  , #{ageGrpCd}
+		  , #{delvFee}
+		  , #{minOrdAmt}
+		  , #{pntPrate}
+		  , #{pntMrate}
+		  , #{sellFeeRate}
+		  , #{formalGb}
+		  , #{makeNm}
+		  , #{makeYmd}
+		  , #{taxGb}
+		  , NVL(#{erpStockLinkYn},'N')
+		  , #{regNo}
+		  , NOW()
+		  , #{updNo}
+		  , NOW()
+		)
+	</insert>
+	
+	<!-- 상품 기본 정보 등록 -->
+	<insert id="createGoodsSmmary" parameterType="Goods">
+		/* TsaGoods.createGoodsSmmary */
+		INSERT INTO TB_GOODS_SUMMARY (
+		    GOODS_CD
+		  , REG_NO
+		  , REG_DT
+		  , UPD_NO
+		  , UPD_DT
+		)
+		VALUES(
+		    #{goodsCd}
+		  , #{regNo}
+		  , NOW()
+		  , #{updNo}
+		  , NOW()
+		)
+	</insert>
+	
 	<!-- 상품 기본 정보 수정 -->
 	<update id="updateGoods" parameterType="Goods">
 		/* TsaGoods.updateGoods */
@@ -1482,4 +1590,14 @@
 		WHERE GOODS_CD = #{goodsCd}
 		AND CODI_GOODS_CD = #{codiGoodsCd}
 	</delete>
+
+	<!-- 상품코드 생성 -->
+	<insert id="createGoodsSequence" parameterType="Goods">
+		/* TsaGoods.createGoodsSequence */
+		<selectKey keyProperty="goodsSq" resultType="int" order="BEFORE">
+		SELECT GOODS_SQ FROM TB_GOODS_SEQUENCE
+		</selectKey>
+		INSERT INTO TB_GOODS_SEQUENCE (GOODS_SQ) VALUES (NULL) ;
+	</insert>
+
 </mapper>

+ 544 - 0
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsDealForm.html

@@ -0,0 +1,544 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : goodsDealForm.html
+ * @desc    : 딜상상품 구성 관리
+ *============================================================================
+ * SISUN
+ * Copyright(C) 2019 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.29   eskim       최초 작성
+ *******************************************************************************
+ -->	
+	<div class="modalPopup" data-width="1100" >
+		<div class="panelStyle">
+			<div class="panelTitle">
+				<h2>딜 상품 구성</h2>
+				<button type="button" class="close" onclick="fngoodsDealFormClose()"><i class="fa fa-times"></i></button>
+			</div>
+			<div class="panelContent">
+				<ul class="notice">
+					<li>구성상품 등록시 기본값&nbsp;
+						<!-- 아이콘 툴팁 -->
+						<div class="iconTooltip">
+							<i class="fa fa-info" aria-hidden="true"></i>
+							<span class="left" style="width:400px; text-align:left;">
+								- 상품상태 : 정보부족<br/>
+								- 정상가 : 판매가 입력값<br/>
+								- 브랜드코드 : 구성상품의 기준여부 'Y'상품의 브랜드코드<br/>
+								- 품목코드 : 구성상품의 기준여부 'Y'상품의 품목코드<br/>
+								- 포인트 : 구성상품의 기준여부 'Y'상품의 브랜드 포인트<br/>
+								- 기본배송비 : 구성상품의 기준여부 'Y'상품의 브랜드 기본배송비<br/>
+								- 무료배송비기준 : 구성상품의 기준여부 'Y'상품의 브랜드 무료배송비기준<br/>
+							</span>
+						</div>
+						<!-- //아이콘 툴팁 --> 
+					</li>
+				</ul>
+				<form id="goodsDealForm" name="goodsDealForm" th:method="post">
+				<input type="hidden" id="compsGoodsList" name="compsGoodsList" />
+				<table class="frmStyle">
+					<colgroup>
+						<col width="10%"/>
+						<col/>
+						<col width="10%"/>
+						<col width="23%"/>
+						<col width="10%"/>
+						<col width="23%"/>
+					</colgroup>
+					<tr>
+						<th>상품명<i class="star"></i></th>
+						<td><input type="text" id="goodsNm" name="goodsNm" maxlength="60"/></td>
+						<th>판매가<i class="star"></i></th>
+						<td><input type="text" class="w100" id="currPrice" name="currPrice" maxlength="8" data-valid-type="numeric"/></td>
+						<th>자사노출여부<i class="star"></i></th>
+						<td><label class="rdoBtn"><input type="radio" name="selfMallYn" id="selfMallYnY" value="Y" checked/>Y</label>
+							<label class="rdoBtn"><input type="radio" name="selfMallYn" id="selfMallYnN" value="N"/>N</label>
+						</td>
+					</tr>
+					<tr>
+						<th>년도/시즌<i class="star"></i></th>
+						<td colspan="3"><select  name="styleYear" id="styleYear">
+								<option value="">[전체]</option>
+								<option th:if="${styleYearList}" th:each="oneData, status : ${styleYearList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<select  name="seasonCd" id="seasonCd">
+								<option value="">[전체]</option>
+								<option th:if="${seasonList}" th:each="oneData, status : ${seasonList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>성별<i class="star"></i></th>
+						<td><select  name="sexGb" id="sexGb">
+								<option value="">[전체]</option>
+								<option th:if="${sexGbList}" th:each="oneData, status : ${sexGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>색상<i class="star"></i></th>
+						<td >
+							<select name="colorCd" id="colorCd">
+								<option value="">[전체]</option>
+								<option th:if="${colorCdList}" th:each="oneData, status : ${colorCdList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>원산지<i class="star"></i></th>
+						<td><input type="text" class="w100" id="makeNm" name="makeNm" maxlength="20" /></td>
+						<th>제조년월일<i class="star"></i></th>
+						<td><input type="text" class="w100" id="makeYmd" name="makeYmd" maxlength="8" data-valid-type="date"/></td>
+					</tr>
+					<tr>
+						<th>제조년월일<i class="star"></i></th>
+						<td colspan="5"><input type="text" class="w100" id="makeYmd" name="makeYmd" maxlength="8" data-valid-type="date"/></td>
+					</tr>
+					
+				</table>
+				<div class="padT15 padB15">
+					<button type="button" class="btn btn-danger btn-lg" onclick="fnGoodsDealDeleteRow();">행삭제</button>
+					<button type="button" class="btn btnRight btn-base btn-lg" onclick="fnOpenGoodsDealPopup();">구상상품추가</button>
+					<button type="button" class="btn btnRight btn-success btn-lg" id="btnGoodsDealSearchExcel" >엑셀조회</button>
+					<button type="button" class="btn btnRight btn-default btn-lg" onclick="cfnDownloadSampleFile('SF003');">상품엑셀조회 양식 다운로드</button>
+				</div>
+				<div id="gridGoodsDealList" style="height: 450px;" class="ag-theme-balham lh60"></div>
+			</form>	
+			</div>
+			<ul class="panelBar">
+				<th:block th:if="${sessionInfo.roleCd == '0000' OR sessionInfo.roleCd == 'A000' OR sessionInfo.roleCd == 'A101' OR sessionInfo.roleCd == 'A100' OR sessionInfo.roleCd == 'A001'}">
+				<button type="button" class="btn btnRight btn-success btn-lg" id="btnGoodsDealSave">저장</button>
+				</th:block>
+			</ul>
+		</div>
+	</div>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var useYnList = gagajf.convertToArray([[${useYnList}]]);
+	var goodsStatList = gagajf.convertToArray([[${goodsStatList}]]);
+	// specify the columns
+	var columnGoodsDealDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "정렬", field: "dispOrd", width: 70 ,hide: false, cellClass: 'text-center',  rowDrag: true },
+		//{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{headerName: "이미지", field: "imgPath1", width: 100, height: 60, cellClass: 'text-center'
+			,cellRenderer: function(params) {
+				if (params.data.imgType == "A"){
+					if(!gagajf.isNull(params.data.imgPath6)){
+						return '<img width="60" src="'+ uploadGoodsUrl+params.data.imgPath6.replace("/1000/","/100/") + '" alt=""  onerror="this.src=\'/image/no.gif\';"/>';
+					}else{
+						return '<img width="60" src="'+ uploadGoodsUrl+params.value.replace("/1000/","/100/") + '" alt=""  onerror="this.src=\'/image/no.gif\';"/>';
+					}	
+				}else{
+					if(!gagajf.isNull(params.data.imgPath6)){
+						return '<img width="60" src="'+ params.data.imgPath1 + '" alt="" onerror="this.src=\'/image/no.gif\';"/>';
+					}else{
+						return '<img width="60" src="'+ params.value + '" alt="" onerror="this.src=\'/image/no.gif\';"/>';
+					}
+				}
+			}
+		},
+		{headerName: "구성상품코드", field: "compsGoodsCd" , width: 130, cellClass: 'text-center'},
+		{headerName: "옵션명", field: "compsGoodsOptNm" , width: 250, cellClass: 'text-left',editable: true, required: true},
+		{headerName: "판매가", field: "currPrice" , width: 100, cellClass: 'text-center'},
+		{headerName: "기준여부(품목/전시카테)", field: "baseYn" , width: 180, cellClass: 'text-center',editable: true, required: true,
+			cellEditor: 'agRichSelectCellEditor',
+			cellEditorParams: { values: gagaAgGrid.extractValues(useYnList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(useYnList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(useYnList, params.newValue); }
+		},
+		{headerName: "전시여부", field: "useYn" , width: 90, cellClass: 'text-center',editable: true, required: true,
+			cellEditor: 'agRichSelectCellEditor',
+			cellEditorParams: { values: gagaAgGrid.extractValues(useYnList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(useYnList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(useYnList, params.newValue); }
+		},
+		{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: "qty" , width: 80, cellClass: 'text-right',hide:true}
+		/* {headerName: "등록일자", field: "regDt", width: 150, cellClass: 'text-center' ,
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmm").format("YYYY-MM-DD HH:mm") : '';
+			}
+		},
+		{headerName: "등록자", field: "regId", width: 100, cellClass: 'text-center'},
+		{headerName: "수정일자", field: "regDt", width: 150, cellClass: 'text-center' ,
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmm").format("YYYY-MM-DD HH:mm") : '';
+			}
+		},
+		{headerName: "수정자", field: "regId", width: 100, cellClass: 'text-center'} */
+	];
+
+	// Get GridOptions
+	var gridGoodsDealOptions = gagaAgGrid.getGridOptions(columnGoodsDealDefs);
+	gridGoodsDealOptions.rowSelection = 'multiple';
+	gridGoodsDealOptions.suppressRowClickSelection = true;
+	
+	// 드래그
+	gridGoodsDealOptions.rowDragManaged = true;
+	gridGoodsDealOptions.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
+	
+	//기준여부 표시
+	gridGoodsDealOptions.getRowStyle = function(params) {
+		if ("Y" == params.data.baseYn) {
+			return { background: '#1ab394' };
+		}
+	}
+	
+	// Row 
+	gridGoodsDealOptions.onCellValueChanged = function(event) {
+		var rowIdx = null;
+		var isChangColor = true;
+		if (event.colDef.field == "baseYn"){
+			if (event.data.baseYn == "Y"){
+				rowIdx = event.rowIndex;
+				
+				//다른 기준여부 'Y'가 존재하는지 확인
+				gridGoodsDealOptions.api.forEachNode(function(rowNode, index) {
+					if (rowNode.data.baseYn == "Y" && index != rowIdx){
+						event.data.baseYn = event.oldValue;
+						gridGoodsDealOptions.api.updateRowData({update: [event.data]});
+						isChangColor = false;
+						return;
+					}
+				});
+				
+				if (!isChangColor){ 
+					mcxDialog.alert('다른 구성상품에 기준여부가 선택되어 있습니다.');
+					return;
+				}
+			}	
+		}
+	}
+	
+	//창종료
+	var fngoodsDealFormClose = function(){
+		uifnPopupClose('popupGoodsDeal');
+	}
+	
+	$(document).ready(function() {
+		gagaAgGrid.createGrid('gridGoodsDealList', gridGoodsDealOptions);
+
+	});
+	
+	var fnOpenGoodsDealPopup = function() {
+		cfnOpenGoodsPopup('fnCreateGoodsDeal');
+	}
+
+	// 상품추가
+	var fnCreateGoodsDeal = function(goodsData) {
+		if (goodsData.length < 1) return;
+		
+		// 기존상품
+		var oldGoodsDealList = gagaAgGrid.getAllRowData(gridGoodsDealOptions);
+		var idx = oldGoodsDealList.length+1; 
+		
+		var isExist = false;
+		goodsData.forEach(function(goods){
+			isExist = false;
+
+			gridGoodsDealOptions.api.forEachNode(function(rowNode, index) {
+				if (goods.goodsCd == rowNode.data.compsGoodsCd){
+					isExist = true;
+				}
+			});
+			if (goods.goodsType != 'N'){
+				isExist = true;
+			}
+
+			if(!isExist){
+				var data = { 
+						  compsGoodsCd: goods.goodsCd
+						, goodsType: 'D'
+						, dispOrd: idx
+						, qty: 1
+						, compsCurrPrice: goods.currPrice
+						, compsStaffCurrPrice: goods.currPrice
+						, baseYn: 'N'
+						, goodsStat : goods.goodsStat
+						, useYn: 'Y'
+						, compsGoodsOptNm : goods.goodsNm
+						, currPrice : goods.currPrice
+						, selfGoodsYn : goods.selfGoodsYn
+						, imgType : goods.imgType
+						, imgPath1 : goods.imgPath1
+						, imgPath6 : goods.imgPath6
+						};
+				//그리드 마지막에 추가해야함
+				gridGoodsDealOptions.api.updateRowData({add: [data], addIndex: idx});
+				
+				idx++;
+			
+			}
+		});
+		gridGoodsDealOptions.api.refreshCells();
+	}
+	
+	//엑셀 상품 조회
+	$('#btnGoodsDealSearchExcel').on('click', function() {
+		cfnExcelUploadPopup('goodsDealExcelUpload', 'goodsDealExcelUpload');
+	});
+
+	var goodsDealExcelUpload = function(result){
+		var data = {procJob : result.procJob
+			,excelFileNm : result.excelFileNm
+		};
+		var jsonData = JSON.stringify(data);
+		gagajf.ajaxJsonSubmit('/goods/search/excelupload/save', jsonData, fnGoodsDealExcelUploadCallBack);
+	}
+
+	var fnGoodsDealExcelUploadCallBack = function(result){
+		gagajf.ajaxJsonSubmit('/goods/excel/upload/goods/list', '', fnExcelSearchCallBack);
+	}
+	
+	var fnExcelSearchCallBack = function(result){
+		fnCreateGoodsDeal(result.goodsExcelList);
+	}
+	// 저장클릭시
+	$('#btnGoodsDealSave').on('click', function() {
+
+		if(!fnGoodsDealConditionCheck()) return;
+		
+		mcxDialog.confirm('딜상품을 등록 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var compsGoodsList = gagaAgGrid.getAllRowData(gridGoodsDealOptions);
+				$("#goodsDealForm input[name=compsGoodsList]").val(JSON.stringify(compsGoodsList));
+				gagajf.ajaxFormSubmit("/goods/deal/save", "#goodsDealForm", fngoodsDealFormClose);
+			}
+		});
+	});
+
+	//저장 조건 확인
+	var fnGoodsDealConditionCheck = function(){
+		var optCheck = false;
+		
+		if(gagajf.isNull($("#goodsDealForm input[name=goodsNm]").val())){
+			mcxDialog.alertC('상품명을 입력해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDealForm input[name=goodsNm]").focus();
+				}
+			});	
+			return false;
+		}
+		
+		if(gagajf.isNull($("#goodsDealForm input[name=currPrice]").val())){
+			mcxDialog.alertC('판매가를 입력해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDealForm input[name=currPrice]").focus();
+				}
+			});	
+			return false;
+		}
+		
+		if(Number($("#goodsDealForm input[name=currPrice]").val()) <= 0){
+			mcxDialog.alertC('판매가를 바르게 입력해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDealForm input[name=currPrice]").focus();
+				}
+			});	
+			return false;
+		}
+		
+		if(gagajf.isNull($("#goodsDealForm select[name=colorCd]").val())){
+			mcxDialog.alertC('색상을 입력해 주세요.<br/>기준여부를 선택하시면<br/>해당브랜드의 색상을 노출합니다.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDealForm select[name=colorCd]").focus();
+				}
+			});	
+			return false;
+		}
+		
+		if (gagajf.isNull($("#goodsDealForm input[name=selfMallYn]").val())){
+			mcxDialog.alertC('자사노출여부를 선택해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDealForm input[name=selfMallYn]").focus();
+				}
+			});	
+			return false;
+		}
+		
+		if(gagajf.isNull($("#goodsDealForm select[name=styleYear]").val())){
+			mcxDialog.alertC('년도을 선택해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDealForm select[name=styleYear]").focus();
+				}
+			});	
+			return false;
+		}
+		
+		if(gagajf.isNull($("#goodsDealForm select[name=seasonCd]").val())){
+			mcxDialog.alertC('시즌을 선택해주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDealForm select[name=seasonCd]").focus();
+				}
+			});	
+			return false;
+		}
+		
+		if(gagajf.isNull($("#goodsDealForm select[name=sexGb]").val())){
+			mcxDialog.alertC('성별을 선택해주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDealForm select[name=sexGb]").focus();
+				}
+			});	
+			return false;
+		}
+		
+		if(gagajf.isNull($("#goodsDealForm input[name=makeNm]").val())){
+			mcxDialog.alertC('원산지를 입력해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDealForm input[name=makeNm]").focus();
+				}
+			});	
+			return false;
+		}
+		
+		var makeYmd = $("#goodsDealForm input[name=makeYmd]").val();
+		
+		if(gagajf.isNull(makeYmd)){
+			mcxDialog.alertC('제조년월일를 입력해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDealForm input[name=makeYmd]").focus();
+				}
+			});	
+			return;
+		}
+		
+		if(makeYmd.length < 8){
+			mcxDialog.alertC('제조년월일를 바르게 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDealForm input[name=makeYmd]").focus();
+				}
+			});	
+			return false;
+		}
+		
+		if(isNaN(Date.parse(makeYmd.substr(0, 4) +'-'+ makeYmd.substr(4, 2) +'-'+ makeYmd.substr(6, 2)))){
+			mcxDialog.alertC('날짜형식이 아닙니다.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDealForm input[name=makeYmd]").focus();
+				}
+			});	
+			return false;
+		}
+		
+		var allData = gagaAgGrid.getAllRowData(gridGoodsDealOptions);
+		// Validation
+		if (!gagaAgGrid.validation(gridGoodsDealOptions, allData))
+			return false;
+		
+		var comSupplyCompCd = '';
+		var comSelfGoodsYn = '';
+		//기준여부 Y  존재하는지 확인
+		var checkBaseYn = false;
+		optCheck = false;
+		$.each(allData, function(index, item) {
+			if (index == 0){
+				comSelfGoodsYn = item.selfGoodsYn;
+				comSupplyCompCd = item.supplyCompCd;
+			}
+			
+			if (item.baseYn == "Y"){
+				checkBaseYn = true;
+			}
+			
+			if(item.goodsStat != "90"){
+				optCheck = true;
+				mcxDialog.alertC("상품상태를 확인해 주세요.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						gridGoodsDealOptions.api.setFocusedCell(index, "goodsStat", null);
+					}
+				});	
+				return false;
+			}
+			
+			if(Number(item.qty)  <=  0){
+				optCheck = true;
+				mcxDialog.alertC("수량을 입력해 주세요.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						gridGoodsDealOptions.api.setFocusedCell(index, "qty", null);
+					}
+				});	
+				return false;
+			}
+			
+			if (comSelfGoodsYn != item.selfGoodsYn){
+				optCheck = true;
+				mcxDialog.alertC("구상상품중 자사/입점상품 구분값이 다릅니다.\n확인해 주세요", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						gridGoodsDealOptions.api.setFocusedCell(index, "goodsCd", null);
+					}
+				});	
+				return false;
+			}else{
+				if (comSelfGoodsYn == "N" && (comSupplyCompCd != item.supplyCompCd)){
+					optCheck = true;
+					mcxDialog.alertC("구상상품중 입점은 같은 업체 상품만 가능합니다.\n확인해 주세요", {
+						sureBtnText: "확인",
+						sureBtnClick: function() {
+							gridGoodsDealOptions.api.setFocusedCell(index, "goodsCd", null);
+						}
+					});	
+					return false;
+				}
+			}
+			
+		});
+		
+		if(optCheck) {
+			return false;
+		}
+		
+		if (!checkBaseYn){
+			mcxDialog.alert('구성상품중 기준여부를 선택해 주세요.');
+			return false;
+		}
+		
+		return true;
+	}
+	
+	//상품삭제
+	var fnGoodsDealDeleteRow = function() {
+		var selectedData = gagaAgGrid.selectedRowData(gridGoodsDealOptions);
+		
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		var iTotalCnt = 0;
+		var iCnt = 0;
+		$.each(selectedData, function(index, item) {	
+			iTotalCnt ++;
+			if (item.crud == "C"){
+				gridGoodsDealOptions.api.updateRowData({remove: [item]});	
+				iCnt ++;
+			}
+		});
+	}
+	
+/*]]>*/
+</script>
+</html>

+ 400 - 0
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsItemkindForm.html

@@ -0,0 +1,400 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsItemkindForm.html
+ * @desc    : 품목변경관리 목록
+ *============================================================================
+ * Pastelmall
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.30   eskim       최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<form id="searchForm" name="searchForm" action="#" th:action="@{'/goods/list'}">
+		<input type="hidden" id="searchGb" name="searchGb" />
+ 		<!-- 패널 영역1 -->
+		<div class="panelStyle" >
+			<!-- TITLE -->
+			<div class="panelTitle">
+				<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 하나를 꼭 입력해 주세요.</h3>
+			</div>
+			<!-- //TITLE -->
+			<div class="panelContent">
+				<table class="frmStyle">
+					<colgroup>
+						<col width="10%"/>
+						<col width="25%"/>
+						<col width="10%"/>
+						<col width="25%"/>
+						<col width="10%"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>카테고리</th>
+						<td colspan="5">
+							<input name="siteCd" id="siteCd" type="hidden" value="10"/>
+							<input name="selLvl" id="selLvl" type="hidden"/>
+							<input name="cateCd" id="cateCd" type="hidden"/>
+							<input name="cateType" id="cateType" type="hidden"/>
+							<select name="cateGb" id="cateGb" onchange="fnChangeSelect($(this).val(), 1);">
+								<option value="">[카테고리구분]</option>
+								<option th:if="${cateGbList}" th:each="oneData, status : ${cateGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<select id="selCate1" name="cate1No" onchange="fnChangeSelect($(this).val(), 2);">
+								<option value="">[카테고리1]</option>
+							</select>
+							<select id="selCate2" name="cate2No" onchange="fnChangeSelect($(this).val(), 3);">
+								<option value="">[카테고리2]</option>
+							</select>
+							<select id="selCate3" name="cate3No" onchange="fnChangeSelect($(this).val(), 4);">
+								<option value="">[카테고리3]</option>
+							</select>
+							<select id="selCate4" name="cate4No" onchange="fnChangeSelect($(this).val(), 5);">
+								<option value="">[카테고리4]</option>
+							</select>
+							<select id="selCate5" name="cate5No" >
+								<option value="">[카테고리5]</option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>브랜드</th>
+						<td>
+							<select name="supplyCompCd" id="supplyCompCd">
+								<option value="" th:if="${sessionInfo.roleCd} != 'G001_B000'">[전체]</option>
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<select name="brandCd" id="brandCd">
+								<option value="">[전체]</option>
+							</select>
+						</td>
+						<th>키워드</th>
+						<td>
+							<select name="search" id="search">
+								<option value="searchGoodsCd">상품코드</option>
+								<option value="searchGoodsNm">상품명</option>
+								<option value="searchGoodsNum">품번</option>
+								<option value="searchSupplyGoodsCd">업체상품코드</option>
+							</select>
+							<input type="text" class="w40p" name="condition" id="condition" maxlength="50"/>
+						</td>
+						<th>품목</th>
+						<td>
+							<select name="itemkindCd" id="itemkindCdSearch">
+								<option value="">[전체]</option>
+								<option th:if="${itemkindList}" th:each="oneData, status : ${itemkindList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>년도/시즌</th>
+						<td>
+							<select  name="styleYear" id="styleYear">
+								<option value="">[전체]</option>
+								<option th:if="${styleYearList}" th:each="oneData, status : ${styleYearList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<select  name="seasonCd" id="seasonCd">
+								<option value="">[전체]</option>
+								<option th:if="${seasonList}" th:each="oneData, status : ${seasonList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>정상/이월 구분</th>
+						<td>
+							<select  name="formalGb" id="formalGb">
+								<option value="">[전체]</option>
+								<option th:if="${formalGbList}" th:each="oneData, status : ${formalGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>담당MD</th>
+						<td>
+							<select  name="mdId" id="mdId">
+								<option value="">[전체]</option>
+								<option th:if="${brandMdList}" th:each="oneData, status : ${brandMdList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+							</select>
+						</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>
+					</li>
+				</ul>
+			</div>
+			<!-- //검색조건 영역 -->
+		</div>
+		<!-- 패널 영역1 -->
+		<div class="panelStyle">
+			<!-- 검색결과 영역 -->
+			<!-- 상단버튼 영역  -->
+			<ul class="panelBar">
+				<li>
+					<button type="button" class="btn btn-default btn-lg" onclick="cfnDownloadSampleFile('SF003');">상품엑셀조회 양식 다운로드</button>
+					<button type="button" class="btn btn-base btn-lg" id="btnGoodsExcelUpLoad">엑셀조회</button>
+					<input class="w100" type="text" id="itemKindCd" placeholder="변경할 품목코드" onkeyup="$(this).val($(this).val().replace(/[^a-zA-Z0-9]/gi, '').toUpperCase());" />
+					<button type="button" class="btn btn-dark btn-sm" id="btnChangeItemKindCd" >선택 상품 품목코드 변경</button>
+					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+					<strong class="cBlue">* 저장 버튼을 눌러 저장해야 실제로 변경 됩니다.</strong>
+				</li>
+				<li class="aR">
+					검색결과 : <strong><span id="gridRowTotalCount">0</span> 건</strong>&nbsp;
+					쪽번호 <span id="pgNo">0</span>/ <strong id="endPgNo">0</strong>&nbsp;&nbsp;
+					<select id="pageSize" name="pageSize">
+						<option value="50" selected="selected">50개씩 보기</option>
+						<option value="100">100개씩 보기</option>
+						<option value="500">500개씩 보기</option>
+						<option value="1000">1000개씩 보기</option>
+					</select>
+					<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
+				</li>
+			</ul>
+			<!-- //상단버튼 영역  -->
+			<div id="gridList" style="width: 100%; height: 500px;" class="ag-theme-balham lh60"></div>
+			<ul class="panelBar">
+				<li class="center">
+					<div class="tablePaging" id="goodsListPagination"></div>
+				</li>
+			</ul>
+		</div>
+		</form>
+		<!-- //패널 영역2 -->
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=2019072202"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var uploadGoodsUrl = [[${@environment.getProperty('upload.goods.view')}]];
+	var goodsImgParam = "?width=60&height=60";
+	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 cfnGridNumner('searchForm',params.node.rowIndex, 'A');}
+		},
+		{headerName: "이미지", field: "imgPath1", width: 100, height: 60, cellClass: 'text-center'
+			,cellRenderer: function(params) {
+				if (params.data.imgType == "G030_A"){
+					if(!gagajf.isNull(params.data.imgPath6)){
+						return '<img width="60" src="'+ params.data.imgPath1 + '" alt="" onerror="this.src=\'/image/no.gif\';"/>';
+					}else{
+						return '<img width="60" src="'+ params.value + '" alt="" onerror="this.src=\'/image/no.gif\';"/>';
+					}
+				}else{
+					if(!gagajf.isNull(params.data.imgPath6)){
+						return '<img width="60" src="'+ uploadGoodsUrl+params.data.imgPath6 + '" alt=""  onerror="this.src=\'/image/no.gif\';"/>';
+					}else{
+						return '<img width="60" src="'+ uploadGoodsUrl+params.value + '" alt=""  onerror="this.src=\'/image/no.gif\';"/>';
+					}	
+				}
+			}
+		},
+		{headerName: "상품코드", field: "goodsCd", width: 140, cellClass: 'text-center'
+			,cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "상품명", field: "goodsNm", width: 200, cellClass: 'text-left'},
+		{headerName: "품목명", field: "itemkindNm", width: 250, cellClass: 'text-left'},
+		{headerName: "기존품목코드", field: "itemkindCd", width: 150, cellClass: 'text-center' },
+		{headerName: "변경품목코드", field: "itemkindCdNew", width: 150, cellClass: 'text-center', editable : true,
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 5, required: true, onblur: '$(this).val($(this).val().toUpperCase())' }
+		}
+	];
+
+	// Get GridOptions
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 중복 선택 가능
+	gridOptions.rowSelection = 'multiple';
+	gridOptions.suppressRowClickSelection = true;
+	gridOptions.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
+
+	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);
+		}
+	}
+
+	var fnChangeSelect = function(val, selLvl){
+		$("#cateCd").val('');
+		$('#tcateCd').val('');
+		$('#mcateCd').val('');
+		$('#scateCd').val('');
+		$('#dcateCd').val('');
+		if(val==''){
+			if(selLvl>1){
+				selLvl = selLvl - 1;
+				if(selLvl>2){
+					$("#cateCd").val($("#selCate"+(selLvl-1)).val());
+				}
+			}else{
+				selLvl = '';
+			}
+		}else{
+			if(selLvl>2){
+				$("#cateCd").val(val);
+			}
+		}
+		$("#searchForm input[name=selLvl]").val(selLvl);
+		$("#searchForm input[name=searchGb]").val("BASIC");
+		gagajf.ajaxFormSubmit('/display/category/list', "#searchForm", fnChangeCategory);
+	}
+
+	var fnChangeCategory = function(data){
+		var selLvl = $("#searchForm input[name=selLvl]").val();
+		var html = '<option value="">[선택]</option>';
+		for(var i=1; i<6; i++){
+			if(i>selLvl){
+				$("#selCate"+i).html(html);
+			}
+		}
+		for(var i=0; i<data.length; i++){
+			var cd = '';
+			var nm = '';
+			if(data[i].useYn=='Y'){
+				if(selLvl=='1'){
+					cd = data[i].cateGb;
+					nm = gagaAgGrid.lookupValue(cateGbList, cd);
+				}else{
+					cd = data[i].cateCd;
+					nm = data[i].cateNm;
+					$("#cateType").val(data[i].cateType);
+				}
+				html += '<option value="'+cd+'">['+cd+'] '+nm+'</option>';
+			}
+		}
+		$("#selCate"+selLvl).html(html);
+	}
+
+	// 조회
+	$('#btnSearch').on('click', function() {
+		if($("#selCate2").val()=='' && $("#condition").val()=='' && $("#brandGrpNm").val()=='' && $("#itemkindCdSearch").val()==''
+			&& $("#styleYear").val()=='' && $("#formalGb").val()=='' && $("#mdId").val()==''){
+			mcxDialog.alert('검색조건을 입력해 주세요.');
+			return;
+		}
+		$("#searchForm input[name=searchGb]").val("BASIC");
+		fnSearch();
+	});
+
+	$("#pageSize").on("change", function(){
+		var rowCnt = gridOptions.api.getDisplayedRowCount();
+		if(rowCnt > 0){
+			fnSearch();
+		}
+	});
+
+	var fnSearch = function(){
+		gagaPaging.init('searchForm', fnSearchCallBack, 'goodsListPagination', $('#searchForm').find('#pageSize').val());
+		gagaPaging.load(1);
+	};
+
+	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);
+	}
+
+	//엑셀 상품 조회
+	$('#btnGoodsExcelUpLoad').on('click', function() {
+		cfnExcelUploadPopup('goodsExcelUpload', 'goodsExcelUpload');
+	});
+
+	var goodsExcelUpload = function(result){
+		var data = {procJob : result.procJob
+					,excelFileNm : result.excelFileNm
+					};
+		var jsonData = JSON.stringify(data);
+		gagajf.ajaxJsonSubmit('/goods/search/excelupload/save', jsonData, fnGoodsExcelUploadCallBack);
+	}
+
+	var fnGoodsExcelUploadCallBack = function(result){
+		$("#searchForm input[name=searchGb]").val("EXCEL");
+		fnSearch();
+	}
+
+	$("#btnInit").on("click", function(){
+		$("#searchForm")[0].reset();
+	});
+
+	$("#btnChangeItemKindCd").on("click", function(){
+		if($("#itemKindCd").val()==''){
+			mcxDialog.alert('품목코드를 입력해 주세요.');
+			return;
+		}
+		var selectedData = gagaAgGrid.selectedRowData(gridOptions);
+		selectedData.forEach(function(data){
+			data.itemkindCdNew = $("#itemKindCd").val();
+		});
+		gridOptions.api.refreshCells();
+	});
+
+	$("#btnSave").on("click", function(){
+		var rowData = gagaAgGrid.getAllRowData(gridOptions);
+		var dataArr = [];
+		rowData.forEach(function(row){
+			if(typeof row.itemkindCdNew!='undefined' && row.itemkindCdNew!=''){
+				var data = {  goodsCd : row.goodsCd
+							, itemkindCd : row.itemkindCdNew
+				}
+				dataArr.push(data);
+			}
+		});
+		if(dataArr.length==0){
+			mcxDialog.alert('변경된 데이터가 없습니다.');
+			return;
+		}
+		mcxDialog.confirm('저장하시겠습니까?',{
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var jsonData = JSON.stringify(dataArr);
+				console.log(jsonData);
+				gagajf.ajaxJsonSubmit('/goods/itemKind/change/save', jsonData, fnSearch);
+			}
+		});
+	});
+	
+	// 업체변경시
+	$('#searchForm select[name=supplyCompCd]').on('change', function() {
+		var actionUrl = '/renderer/supplyCompany/brand/list/' + $(this).val();
+		if(sessRoleCd == "G001_B000"){
+			actionUrl = '/renderer/brand/AuthBrandlist';
+		}
+		$("#searchForm select[name=brandCd] option:gt(0)").remove();
+
+		cfnCreateCombo(actionUrl, $('#searchForm select[name=brandCd]'), "[전체]", "");
+	});
+
+	$(document).ready(function() {
+
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+
+/*]]>*/
+</script>
+ 	</div>
+
+</html>

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

@@ -102,11 +102,7 @@
 						<td>
 							<select  name="styleYear" id="styleYear">
 								<option value="">[전체]</option>
-								<option value="2017">[2017] 2017</option>
-								<option value="2018">[2018] 2018</option>
-								<option value="2019">[2019] 2019</option>
-								<option value="2020">[2020] 2020</option>
-								<option value="2021">[2021] 2021</option>
+								<option th:if="${styleYearList}" th:each="oneData, status : ${styleYearList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
 							<select  name="seasonCd" id="seasonCd">
 								<option value="">[전체]</option>
@@ -214,6 +210,8 @@
 					<button type="button" class="btn btn-base btn-lg" id="btnGoodsExcelUpLoad">엑셀조회</button>
 				</li>
 				<li class="right">
+					<button type="button" class="btn btn-primary btn-lg"  id="btnGoodsSetMake">세트상품구성</button>
+					<button type="button" class="btn btn-primary btn-lg" id="btnGoodsSetDeal">딜상품구성</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">
@@ -820,6 +818,16 @@
 			$("#searchForm").find("#goodsStatArea").addClass('off');
 		}
 	}
+	
+	//세트상품구성 클릭 시
+	$('#btnGoodsSetMake').click(function(e) {
+		cfnOpenGoodsSetPopup();
+	});
+	
+	//딜상품구성 클릭 시
+	$('#btnGoodsSetDeal').click(function(e) {
+		cfnOpenGoodsDealPopup();
+	});
 
 	$(document).ready(function() {
 

+ 8 - 13
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsPopupListForm.html

@@ -91,11 +91,7 @@
 					<td>
 						<select  name="styleYear" id="styleYear">
 							<option value="">[전체]</option>
-							<option value="2017">[2017] 2017</option>
-							<option value="2018">[2018] 2018</option>
-							<option value="2019">[2019] 2019</option>
-							<option value="2020">[2020] 2020</option>
-							<option value="2021">[2021] 2021</option>
+							<option th:if="${styleYearList}" th:each="oneData, status : ${styleYearList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 						</select>
 						<select  name="seasonCd" id="seasonCd">
 							<option value="">[전체]</option>
@@ -233,19 +229,18 @@
 		},
 		{headerName: "이미지", field: "imgPath1", width: 100, height: 60, cellClass: 'text-center'
 			,cellRenderer: function(params) {
-				if (params.data.imgType == "A"){
-					if(!gagajf.isNull(params.data.imgPath6)){
-						return '<img width="60" src="'+ uploadGoodsUrl+params.data.imgPath6 + '" alt=""  onerror="this.src=\'/image/no.gif\';"/>';
-					}else{
-						return '<img width="60" src="'+ uploadGoodsUrl+params.value + '" alt=""  onerror="this.src=\'/image/no.gif\';"/>';
-					}	
-				}else{
+				if (params.data.imgType == "G030_A"){
 					if(!gagajf.isNull(params.data.imgPath6)){
 						return '<img width="60" src="'+ params.data.imgPath1 + '" alt="" onerror="this.src=\'/image/no.gif\';"/>';
 					}else{
 						return '<img width="60" src="'+ params.value + '" alt="" onerror="this.src=\'/image/no.gif\';"/>';
 					}
-					
+				}else{
+					if(!gagajf.isNull(params.data.imgPath6)){
+						return '<img width="60" src="'+ uploadGoodsUrl+params.data.imgPath6 + '" alt=""  onerror="this.src=\'/image/no.gif\';"/>';
+					}else{
+						return '<img width="60" src="'+ uploadGoodsUrl+params.value + '" alt=""  onerror="this.src=\'/image/no.gif\';"/>';
+					}	
 				}
 			}
 		},