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

어드민 대량 수정 개발중

eskim 5 лет назад
Родитель
Сommit
52d6bbf6dd

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

@@ -13,6 +13,7 @@ import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsEpSkip;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsImg;
+import com.style24.persistence.domain.GoodsMass;
 import com.style24.persistence.domain.GoodsNaverLowestPrice;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
@@ -1129,4 +1130,31 @@ public interface TsaGoodsDao {
 	 */
 	void createCategoryGoods(Goods goods);
 
+	/**
+	 * 상품 등록 로그 생성
+	 *
+	 * @param goodsMass
+	 * @author eskim
+	 * @since 2021. 01. 25
+	 */
+	void createGoodsRegLog(GoodsMass goodsMass);
+
+	/**
+	 * 상품 기본 정보 수정 - 대량엑셀
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2021. 1. 25
+	 */
+	void updateGoodsMass(Goods goods);
+
+	/**
+	 * 상품등록로그 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 25
+	 */
+	Collection<GoodsMass> getGoodsRegLogList(GoodsSearch goodsSearch);
 }

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

@@ -2,6 +2,7 @@ package com.style24.admin.biz.service;
 
 import java.io.IOException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Collection;
 
 import org.apache.commons.lang3.StringUtils;
@@ -22,6 +23,7 @@ import com.style24.persistence.domain.AdKeyword;
 import com.style24.persistence.domain.AdKeywordGoods;
 import com.style24.persistence.domain.Brand;
 import com.style24.persistence.domain.Color;
+import com.style24.persistence.domain.CommonCode;
 import com.style24.persistence.domain.DelvFeePolicy;
 import com.style24.persistence.domain.FreeGoods;
 import com.style24.persistence.domain.Goods;
@@ -31,6 +33,7 @@ import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsEpSkip;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsImg;
+import com.style24.persistence.domain.GoodsMass;
 import com.style24.persistence.domain.GoodsNaverLowestPrice;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
@@ -96,6 +99,9 @@ public class TsaGoodsService {
 	@Autowired
 	private TsaDisplayService displayService;
 
+	@Autowired
+	private TsaRendererService rendererService;
+
 	@Autowired
 	private SafetyKoreaApi safetyKoreaApi;
 
@@ -107,6 +113,8 @@ public class TsaGoodsService {
 
 	private static final String NUMBER_PATTERN = "^[0-9]+$";
 
+	private static final String UPDATE_NO_PATTERN = "X";
+
 	private static final String SELF_GOOODS_AFTER = "STY";
 
 	/**
@@ -2717,4 +2725,794 @@ public class TsaGoodsService {
 		return goodsDao.getNotiClsfColumnInfo(niClsfCd);
 	}
 
+	/**
+	 * 상품대량수정 엑셀 저장
+	 *
+	 * @param ecxelGoodsList, procJob(updateGoods)
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 25
+	 */
+	@Transactional("shopTxnManager")
+	public String updateMassExceluploadGoods(GagaMap gagaMap, String procJob) {
+
+		GoodsMass goodsMass = mapper.convertValue(gagaMap, GoodsMass.class);
+
+		if (StringUtils.isBlank(goodsMass.getGoodsCd())) {
+			throw new IllegalStateException("상품코드가 없습니다.");
+		}
+
+		// 상품기본정보
+		Goods goodsData = new Goods();
+		goodsData.setGoodsCd(goodsMass.getGoodsCd().trim().toUpperCase());
+		Goods goodsOrigin = goodsDao.getGoods(goodsData);
+		if (goodsOrigin == null) {
+			goodsData.setGoodsRegMsg("미등록 상품코드");
+			goodsData.setGoodsStat("10");
+			this.setGoodsRegResult(goodsData, goodsMass, procJob);
+			return goodsData.getGoodsStat();
+		}
+		Goods goods = this.updateMassGoodsInfo(goodsMass, procJob, goodsOrigin);
+
+		if ("10".equals(goods.getGoodsStat())) { // 정보 오류
+			this.setGoodsRegResult(goods, goodsMass, procJob);
+			return goods.getGoodsStat();
+		}
+
+		// 상품 고시
+		Collection<GoodsNotiInfo> newGoodsNotiList = new ArrayList<>(); //적용할 고시 정보
+		goods = this.getUpdateMassGoodsNotiCheck(goods, gagaMap, goodsOrigin, newGoodsNotiList);
+		if ("10".equals(goods.getGoodsStat())) { // 정보 오류
+			this.setGoodsRegResult(goods, goodsMass, procJob);
+			return goods.getGoodsStat();
+		}
+
+		// 상품상세 (html, as-is/입점)
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getGoodsContent().trim())) {
+			if (goodsMass.getGoodsContent().toLowerCase().indexOf("script") >= 0) {
+				goods.setGoodsRegMsg("상품상세 html script 선언 오류");
+				goods.setGoodsStat("10");
+				this.setGoodsRegResult(goods, goodsMass, procJob);
+				return goods.getGoodsStat();
+			}
+			goods.setChkDescKeep("Y");
+		}
+
+		if ("N".equals(goods.getChDataYn()) && "N".equals(goods.getChkDescKeep()) && "N".equals(goods.getChNotiYn())) {
+			goods.setGoodsRegMsg("변경정보 없음");
+			goods.setGoodsStat("10");
+			this.setGoodsRegResult(goods, goodsMass, procJob);
+			return goods.getGoodsStat();
+		}
+
+		//상품 기본정보 변경여부 와 촬영업체가 아닌경우
+		if ("Y".equals(goods.getChDataYn()) && !"G001_E000".equals(TsaSession.getInfo().getRoleCd())) {
+
+			goodsDao.createGoodsHst(goods); // 이력생성
+			goodsDao.updateGoodsMass(goods); // 상품기본 저장
+
+			if (!StringUtils.isBlank(goods.getGoodsSnm1()) && !UPDATE_NO_PATTERN.equals(goods.getGoodsSnm1())) {
+				// 사용자 검색어를 검색어에 적용
+				String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
+
+				String[] arrGoodsSnm = goods.getGoodsSnm1().split(";");
+				StringBuilder tempGoodsSnm = new StringBuilder();
+				for (String loopGoodsSnm : arrGoodsSnm) {
+					if (goodsSnm.toUpperCase().indexOf(loopGoodsSnm.toUpperCase()) <= -1) {
+						tempGoodsSnm.append(loopGoodsSnm).append(";");
+					}
+				}
+				goods.setGoodsSnm(tempGoodsSnm.toString() + goodsSnm);
+				goodsDao.updateGoodsSnm(goods);
+			}
+		}
+
+		//상품 상세 변경여부 와 촬영업체가 아닌경우
+		if ("Y".equals(goods.getChkDescKeep()) && !"G001_E000".equals(TsaSession.getInfo().getRoleCd())) {
+			GoodsDesc goodsDesc = new GoodsDesc();
+			goodsDesc.setGoodsCd(goods.getGoodsCd());
+			goodsDesc.setRegNo(goods.getRegNo());
+			goodsDesc.setUpdNo(goods.getUpdNo());
+
+			goodsDesc.setDescGb("80");
+			goodsDesc.setGoodsDesc(goodsMass.getGoodsContent().trim());
+			this.saveGoodsDesc(goodsDesc);
+		}
+
+		// 상품고시정보 적용
+		if ("Y".equals(goods.getChNotiYn()) && newGoodsNotiList != null && !newGoodsNotiList.isEmpty()) {
+
+			int index = 0;
+			for (GoodsNotiInfo goodsNotiInfo : newGoodsNotiList) {
+
+				if (index == 0) {
+					goodsDao.deleteGoodsNotiInfo(goods);
+				}
+				goodsDao.saveGoodsNotiInfo(goodsNotiInfo);
+				index++;
+			}
+		}
+
+		// 품목변경시 카테고리 자동 전시
+		if (!UPDATE_NO_PATTERN.equals(goods.getItemkindCd().trim())) {
+			GoodsCategory goodsCategory = new GoodsCategory();
+			goodsCategory.setRegNo(TsaSession.getInfo().getUserNo());
+			goodsCategory.setUpdNo(TsaSession.getInfo().getUserNo());
+			goodsCategory.setGoodsCd(goods.getGoodsCd());
+			goodsCategory.setCateType("G031_10");	//상품분류카테고리
+			displayService.deleteGoodsCategory(goodsCategory);
+			goodsDao.createCategoryGoods(goods);
+
+		}
+
+		this.setGoodsRegResult(goods, goodsMass, procJob);
+
+		return goods.getGoodsStat();
+	}
+
+	/**
+	 * 상품 대량 등록 결과 정보
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2021. 01. 25
+	 */
+	private void setGoodsRegResult(Goods goods, GoodsMass goodsMass, String procJob) {
+		// 결과 저장
+		goodsMass.setBrandCd(goods.getBrandCd());
+		goodsMass.setGoodsStat(goods.getGoodsStat());
+		goodsMass.setRegSuccYn("Y");
+		goodsMass.setRegFailRsn(goods.getGoodsRegMsg());
+		goodsMass.setRegNo(TsaSession.getInfo().getUserNo());
+		//model은 string 테이블은 number 형이라 ,,,
+//		if (StringUtils.isBlank(goodsMass.getListPrice())) {
+//			goodsMass.setListPrice("0");
+//		}
+//		if (UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice()) || StringUtils.isBlank(goodsMass.getCurrPrice())) {
+//			goodsMass.setCurrPrice("0");
+//		}
+//		if (StringUtils.isBlank(goodsMass.getCostPrice())) {
+//			goodsMass.setCostPrice("0");
+//		}
+//		if ("10".equals(goods.getGoodsStat())) {
+//			goodsMass.setRegSuccYn("N");
+//		}
+		goodsMass.setProcGb("C");
+		if ("updateGoods".equals(procJob)) {
+			goodsMass.setProcGb("U");
+		}
+		goodsDao.createGoodsRegLog(goodsMass);
+	}
+
+	/**
+	 * 상품대량수정 - 상품기본정보
+	 *
+	 * @param goodsMass
+	 * @param excelFilename
+	 * @author eskim
+	 * @since 2021. 1. 20
+	 */
+	private Goods updateMassGoodsInfo(GoodsMass goodsMass, String procJob, Goods goodsOrigin) {
+
+		Goods goods = new Goods();
+		goods.setChDataYn("N"); // 데이터 변경여부
+		goods.setGoodsRegMsg("상품정보 변경");
+		goods.setRegNo(TsaSession.getInfo().getUserNo());
+		goods.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		goods.setGoodsCd(goodsMass.getGoodsCd().toUpperCase().trim().toUpperCase()); // 상품코드
+
+		if (StringUtils.isBlank(goodsMass.getGoodsNm())) {
+			goods.setGoodsRegMsg("상품명 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setGoodsNm(goodsMass.getGoodsNm().trim()); // 상품명
+		if (!UPDATE_NO_PATTERN.equals(goods.getGoodsNm())) {
+			goods.setGoodsNm(goods.getGoodsNm().replaceAll("(\\r\\n|\\r|\\n|\\n\\r)", "")); // 상품명
+			goods.setChDataYn("Y");
+		}
+		goods.setGoodsTnm(goodsMass.getGoodsTnm().trim()); // 상품 타이틀
+		if (!UPDATE_NO_PATTERN.equals(goods.getGoodsTnm())) {
+			goods.setChDataYn("Y");
+			if (!StringUtils.isBlank(goods.getGoodsTnm())) {
+				goods.setGoodsTnm(goods.getGoodsTnm().replaceAll("(\\r\\n|\\r|\\n|\\n\\r)", "")); // 상품 타이틀
+			}
+		}
+		goods.setGoodsSnm1(goodsMass.getGoodsSnm1().trim()); // 상품 사용자 검색어
+		if (!UPDATE_NO_PATTERN.equals(goods.getGoodsSnm1())) {
+			goods.setChDataYn("Y");
+			if (!StringUtils.isBlank(goods.getGoodsSnm1())) {
+				goods.setGoodsSnm1(goods.getGoodsSnm1().replaceAll("(\\r\\n|\\r|\\n|\\n\\r|\\s)", "")); // 상품 사용자 검색어
+			}
+		}
+		// 품목확인
+		if (StringUtils.isBlank(goodsMass.getItemkindCd())) {
+			goods.setGoodsRegMsg("품목코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setItemkindCd(goodsMass.getItemkindCd().trim().toUpperCase()); // 품목
+
+		if (!UPDATE_NO_PATTERN.equals(goods.getItemkindCd())) {
+			Itemkind itemkind = new Itemkind();
+			itemkind.setItemkindCd(goods.getItemkindCd());
+			itemkind.setUseYn("Y");
+			Collection<Itemkind> itemkindList = goodsDao.getItemkindList(itemkind);
+			if (itemkindList == null || itemkindList.isEmpty()) {
+				goods.setGoodsRegMsg("품목 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		CommonCode commonCode = new CommonCode();
+		commonCode.setUseYn("Y");
+		// 시즌코드
+		if (StringUtils.isBlank(goodsMass.getSeasonCd())) {
+			goods.setGoodsRegMsg("시즌코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setSeasonCd(goodsMass.getSeasonCd().trim().toUpperCase());
+		if (!UPDATE_NO_PATTERN.equals(goods.getSeasonCd())) {
+			commonCode.setCdGb("G006"); // 시즌
+			commonCode.setCd(goods.getSeasonCd());
+			Collection<CommonCode> seassonList = rendererService.getCommonCodeList(commonCode);
+			if (seassonList == null || seassonList.isEmpty()) {
+				goods.setGoodsRegMsg("시즌 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+		// 성별
+		if (StringUtils.isBlank(goodsMass.getSexGb())) {
+			goods.setGoodsRegMsg("성별코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setSexGb(goodsMass.getSexGb().trim().toUpperCase());
+		// 성별
+		if (!UPDATE_NO_PATTERN.equals(goods.getSexGb())) {
+			commonCode.setCdGb("G007"); // 성별
+			commonCode.setCd(goods.getSexGb());
+			Collection<CommonCode> genderList = rendererService.getCommonCodeList(commonCode);
+			if (genderList == null || genderList.isEmpty()) {
+				goods.setGoodsRegMsg("성별 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+		//판매가
+		if (StringUtils.isBlank(goodsMass.getCurrPrice())) {
+			goods.setGoodsRegMsg("판매가 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice().trim())) {
+			goods.setCurrPrice(0);
+		} else {
+
+			if (!GagaStringUtil.replace(goodsMass.getCurrPrice().trim(), ",", "").matches(NUMBER_PATTERN)) {
+				goods.setGoodsRegMsg("판매가 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			if (Integer.parseInt(goodsMass.getCurrPrice().trim()) == 0) {
+				goods.setGoodsRegMsg("판매가 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+		//판매수수료율
+		if (StringUtils.isBlank(goodsMass.getSellFeeRate())) {
+			goods.setGoodsRegMsg("판매수수료율 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		float sellFeeRate = 0f;
+		if (UPDATE_NO_PATTERN.equals(goodsMass.getSellFeeRate().trim())) {
+			goods.setSellFeeRate(0);
+		} else {
+			try {
+				sellFeeRate = Float.valueOf(goodsMass.getSellFeeRate().trim());
+				//goods.setSellFeeRate(sellFeeRate);
+			} catch (Exception e) {
+				goods.setGoodsRegMsg("판매수수료율 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+
+			//비교값 크면 1, 같으면 0, 작은면 -1 리턴
+			if (Float.compare(sellFeeRate, 0) == 0) {
+				goods.setGoodsRegMsg("판매수수료율 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+
+			if (Float.compare(sellFeeRate, 100) >= 0) {
+				goods.setGoodsRegMsg("판매수수료율 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+
+		//판매가나 판매수수료율이 변경되었을 때
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice().trim()) || !UPDATE_NO_PATTERN.equals(goodsMass.getSellFeeRate().trim())) {
+			//자사
+			if ("Y".equals(goodsOrigin.getSelfGoodsYn())) {
+				//판매가 변경시
+				if (!UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice().trim())) {
+					goods.setCurrPrice(Integer.parseInt(GagaStringUtil.replace(goodsMass.getCurrPrice().trim(), ",", ""))); // 판매가
+					goods.setCurrBprice(goodsOrigin.getCurrPrice());
+					goods.setDcRate((int)(this.getDcRate(goodsOrigin.getListPrice(), goods.getCurrPrice())));
+					goods.setChDataYn("Y");
+				}
+				//판매수수료율 변경시
+				if (!UPDATE_NO_PATTERN.equals(goodsMass.getSellFeeRate().trim())) {
+					goods.setSellFeeRate(sellFeeRate); // 판매수수료율
+					goods.setChDataYn("Y");
+				}
+			} else {
+				//입점
+				GoodsPriceRes goodsPriceRes = new GoodsPriceRes();
+				goodsPriceRes.setGoodsCd(goods.getGoodsCd());
+				if (goods.getCurrPrice() != goodsOrigin.getCurrPrice()) {
+					goodsPriceRes.setResGoodsPrice(goods.getCurrPrice());
+					goodsPriceRes.setEndGoodsPrice(goods.getCurrPrice());
+				}
+				if (goods.getSellFeeRate() != goodsOrigin.getSellFeeRate()) {
+					goodsPriceRes.setSellFeeRate(sellFeeRate);
+				}
+				goodsPriceRes.setApplyStdt(GagaDateUtil.getTodayDateTime());	//yyyymmddhhmiss
+				int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) + 4;
+				goodsPriceRes.setApplyEddt(Integer.toString(toYear) + "1231235959");	//yyyymmddhhmiss
+				goodsPriceRes.setCfrmYn("N");
+				goodsPriceRes.setApplyYn("N");
+				goodsPriceRes.setRegNo(goods.getRegNo());
+				goodsPriceRes.setUpdNo(goods.getUpdNo());
+				goodsDao.createGoodPriceRes(goodsPriceRes);
+
+				// 상품테이블에 바로 변경하지 않고 입점상품가격관리에서 승인해야함
+				goods.setCurrPrice(goodsOrigin.getCurrPrice());
+				goods.setSellFeeRate(goodsOrigin.getSellFeeRate());
+			}
+		}
+
+		// 상품구분
+		if (StringUtils.isBlank(goodsMass.getGoodsGb())) {
+			goods.setGoodsRegMsg("상품구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setSexGb(goodsMass.getGoodsGb().trim().toUpperCase());
+		// 상품구분
+		if (!UPDATE_NO_PATTERN.equals(goods.getGoodsGb())) {
+			commonCode.setCdGb("G073"); // 상품구분
+			commonCode.setCd(goods.getGoodsGb());
+			Collection<CommonCode> goodsGbList = rendererService.getCommonCodeList(commonCode);
+			if (goodsGbList == null || goodsGbList.isEmpty()) {
+				goods.setGoodsRegMsg("상품구분 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//정상이월구분
+		if (StringUtils.isBlank(goodsMass.getFormalGb())) {
+			goods.setGoodsRegMsg("정상이월구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setFormalGb(goodsMass.getFormalGb().trim().toUpperCase()); // 정상이월
+		if (!UPDATE_NO_PATTERN.equals(goods.getFormalGb())
+			&& !"G009_10".equals(goods.getFormalGb())
+			&& !"G009_20".equals(goods.getFormalGb())) {
+			goods.setGoodsRegMsg("정상이월구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		if (!UPDATE_NO_PATTERN.equals(goods.getFormalGb())) {
+			goods.setPntPrate(goodsOrigin.getPntPrate()); // 포인트적립율(PC)
+			goods.setPntMrate(goodsOrigin.getPntMrate()); // 포인트적립율(MOBILE)
+			Brand brand = new Brand();
+			brand.setBrandCd(goodsOrigin.getBrandCd());
+			Collection<Brand> brandList = businessService.getBrandList(brand);
+			if (brandList != null && !brandList.isEmpty()) {
+				// 브랜드 확인
+				float pntPrate = 0f;
+				float pntMrate = 0f;
+				for (Brand tmpBrand : brandList) {
+					if ("G009_10".equals(goods.getFormalGb())) {
+						pntPrate = tmpBrand.getPntPrate10();
+						pntMrate = tmpBrand.getPntMrate10();
+					} else {
+						pntPrate = tmpBrand.getPntPrate20();
+						pntMrate = tmpBrand.getPntMrate20();
+					}
+				}
+				goods.setPntPrate(pntPrate); // 포인트적립율(PC)
+				goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//최소주문수량
+		if (UPDATE_NO_PATTERN.equals(goodsMass.getMinOrdQty().trim())) {
+			goods.setMinOrdQty(0);
+		} else {
+			if (!goodsMass.getMinOrdQty().trim().matches(NUMBER_PATTERN) || Integer.parseInt(goodsMass.getMinOrdQty().trim()) == 0) {
+				goods.setGoodsRegMsg("최소주문수량 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setMinOrdQty(Integer.parseInt(goodsMass.getMinOrdQty().trim()));
+			goods.setChDataYn("Y");
+		}
+		//최대주문수량
+		if (UPDATE_NO_PATTERN.equals(goodsMass.getMaxOrdQty().trim())) {
+			goods.setMaxOrdQty(0);
+		} else {
+			if (!goodsMass.getMaxOrdQty().trim().matches(NUMBER_PATTERN) || Integer.parseInt(goodsMass.getMaxOrdQty().trim()) == 0) {
+				goods.setGoodsRegMsg("최대주문수량 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setMaxOrdQty(Integer.parseInt(goodsMass.getMaxOrdQty().trim()));
+			goods.setChDataYn("Y");
+		}
+		//ID당1일최대주문수량
+		if (UPDATE_NO_PATTERN.equals(goodsMass.getDayMaxOrdQty().trim())) {
+			goods.setMaxOrdQty(0);
+		} else {
+			if (!goodsMass.getDayMaxOrdQty().trim().matches(NUMBER_PATTERN) || Integer.parseInt(goodsMass.getDayMaxOrdQty().trim()) == 0) {
+				goods.setGoodsRegMsg("ID당1일최대주문수량 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setDayMaxOrdQty(Integer.parseInt(goodsMass.getDayMaxOrdQty().trim()));
+			goods.setChDataYn("Y");
+		}
+
+		if (goods.getMinOrdQty() > goods.getMaxOrdQty()) {
+			goods.setGoodsRegMsg("최소주문수량 오류(최대주문수량보다 클 수 없음)");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		if (goods.getMaxOrdQty() > goods.getDayMaxOrdQty()) {
+			goods.setGoodsRegMsg("최대주문수량 오류(ID당1일최대구매수량보다 클 수 없음)");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		//선물주문가능여부
+		if (StringUtils.isBlank(goodsMass.getGiftPackYn())) {
+			goods.setGoodsRegMsg("선물주문가능여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if ("Y".equals(goodsOrigin.getSelfGoodsYn())) {
+			if (!UPDATE_NO_PATTERN.equals(goodsMass.getGiftPackYn().trim().toUpperCase())) {
+				goods.setGiftPackYn(goodsMass.getGiftPackYn().trim().toUpperCase());
+				if (!"Y".equals(goods.getGiftPackYn()) && !"N".equals(goods.getGiftPackYn())) {
+					goods.setGoodsRegMsg("선물주문가능여부 오류");
+					goods.setGoodsStat("10");
+					return goods;
+				}
+				goods.setChDataYn("Y");
+			}
+		} else {
+			goods.setGiftPackYn(goodsOrigin.getGiftPackYn().trim().toUpperCase());
+		}
+
+		//신규가입구매가능여부
+		if (StringUtils.isBlank(goodsMass.getNewCustOrdYn())) {
+			goods.setGoodsRegMsg("신규가입구매가능여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if ("Y".equals(goodsOrigin.getSelfGoodsYn())) {
+			if (!UPDATE_NO_PATTERN.equals(goodsMass.getNewCustOrdYn().trim().toUpperCase())) {
+				goods.setNewCustOrdYn(goodsMass.getNewCustOrdYn().trim().toUpperCase());
+				if (!"Y".equals(goods.getNewCustOrdYn()) && !"N".equals(goods.getNewCustOrdYn())) {
+					goods.setGoodsRegMsg("신규가입구매가능여부 오류");
+					goods.setGoodsStat("10");
+					return goods;
+				}
+				goods.setChDataYn("Y");
+			}
+		} else {
+			goods.setNewCustOrdYn(goodsOrigin.getNewCustOrdYn().toUpperCase());
+		}
+
+		//반품여부
+		if (StringUtils.isBlank(goodsMass.getReturnableYn())) {
+			goods.setGoodsRegMsg("반품여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setReturnableYn(goodsMass.getReturnableYn().trim().toUpperCase());
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getReturnableYn().trim())) {
+			if (!"Y".equals(goods.getReturnableYn()) && !"N".equals(goods.getReturnableYn())) {
+				goods.setGoodsRegMsg("반품여부 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//교환여부
+		if (StringUtils.isBlank(goodsMass.getChangeableYn())) {
+			goods.setGoodsRegMsg("교환여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setChangeableYn(goodsMass.getChangeableYn().trim().toUpperCase());
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getChangeableYn().trim())) {
+			if (!"Y".equals(goods.getChangeableYn()) && !"N".equals(goods.getChangeableYn())) {
+				goods.setGoodsRegMsg("교환여부 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//과세구분
+		if (StringUtils.isBlank(goodsMass.getTaxGb())) {
+			goods.setGoodsRegMsg("과세구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setTaxGb(goodsMass.getTaxGb().trim().toUpperCase());
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getTaxGb().trim())) {
+			if (!"Y".equals(goods.getTaxGb()) && !"N".equals(goods.getTaxGb())) {
+				goods.setGoodsRegMsg("과세구분 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//상품연령
+		if (StringUtils.isBlank(goodsMass.getAgeGrpCd())) {
+			goods.setGoodsRegMsg("상품연령 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setAgeGrpCd(goodsMass.getAgeGrpCd().trim().toUpperCase());
+		if (!UPDATE_NO_PATTERN.equals(goods.getAgeGrpCd())) {
+			commonCode.setCdGb("G023");
+			commonCode.setCd(goods.getAgeGrpCd());
+			Collection<CommonCode> ageGrpCdList = rendererService.getCommonCodeList(commonCode);
+			if (ageGrpCdList == null || ageGrpCdList.isEmpty()) {
+				goods.setGoodsRegMsg("상품연령 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//성인용품여부
+		if (StringUtils.isBlank(goodsMass.getAdultYn())) {
+			goods.setGoodsRegMsg("성인용품여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setAdultYn(goodsMass.getAdultYn().trim().toUpperCase());
+		if (!UPDATE_NO_PATTERN.equals(goods.getAdultYn())) {
+			if (!"Y".equals(goods.getAdultYn()) && !"N".equals(goods.getAdultYn())) {
+				goods.setGoodsRegMsg("성인용품여부 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//PC포인트적립율
+		if (StringUtils.isBlank(goodsMass.getPntPrate())) {
+			goods.setGoodsRegMsg("PC포인트적립율 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getPntPrate().trim())) {
+			try {
+				float pntPrate = Float.valueOf(goodsMass.getPntPrate().trim());
+				goods.setPntPrate(pntPrate);
+			} catch (Exception e) {
+				goods.setGoodsRegMsg("PC포인트적립율 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		if (StringUtils.isBlank(goodsMass.getPrePpntUsableYn())) {
+			goods.setGoodsRegMsg("PC선포인트 사용여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getPrePpntUsableYn().trim())) {
+			if ("Y".equals(goodsMass.getPrePpntUsableYn().trim()) || "N".equals(goodsMass.getPrePpntUsableYn().trim())) {
+				goods.setPrePpntUsableYn(goodsMass.getPrePpntUsableYn().trim());
+				goods.setChDataYn("Y");
+			} else {
+				goods.setGoodsRegMsg("PC선포인트 사용여부 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+
+		if (StringUtils.isBlank(goodsMass.getPntMrate())) {
+			goods.setGoodsRegMsg("모바일포인트적립율 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getPntMrate().trim())) {
+			try {
+				int pntMrate = Integer.parseInt(goodsMass.getPntMrate().trim());
+				goods.setPntMrate(pntMrate);
+			} catch (Exception e) {
+				goods.setGoodsRegMsg("모바일포인트적립율 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		if (StringUtils.isBlank(goodsMass.getPreMpntUsableYn())) {
+			goods.setGoodsRegMsg("모바일선포인트 사용여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getPreMpntUsableYn().trim())) {
+			if ("Y".equals(goodsMass.getPreMpntUsableYn().trim()) || "N".equals(goodsMass.getPreMpntUsableYn().trim())) {
+				goods.setPreMpntUsableYn(goodsMass.getPreMpntUsableYn().trim());
+				goods.setChDataYn("Y");
+			} else {
+				goods.setGoodsRegMsg("모바일선포인트 사용여부 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+
+		// 배송비 정책 확인
+		if (StringUtils.isBlank(goodsMass.getDelvFeeCd())) {
+			goods.setGoodsRegMsg("배송비정책코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setDelvFeeCd(goodsMass.getDelvFeeCd().trim().toUpperCase());
+		if (!UPDATE_NO_PATTERN.equals(goods.getDelvFeeCd())) {
+
+			DelvFeePolicy delvFeePolicy = new DelvFeePolicy();
+			delvFeePolicy.setSupplyCompCd(goods.getSupplyCompCd());
+			delvFeePolicy.setDelvFeeCd(goods.getDelvFeeCd());
+			delvFeePolicy.setUseYn("Y");
+			Collection<DelvFeePolicy> deliveryFeePolicyList =  businessService.getDeliveryFeePolicyList(delvFeePolicy);
+			if (deliveryFeePolicyList != null && !deliveryFeePolicyList.isEmpty()) {
+				goods.setGoodsRegMsg("배송비정책코드 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+
+		return goods;
+	}
+
+	/**
+	 * 상품대량수정 - 상품고시정보 check
+	 *
+	 * @param goods
+	 * @param excelMap
+	 * @param goodsOrigin
+	 * @param newGoodsNotiList
+	 * @return Goods
+	 * @author eskim
+	 * @since 2021. 01. 25
+	 */
+	private Goods getUpdateMassGoodsNotiCheck(Goods goods, GagaMap excelMap, Goods goodsOrigin, Collection<GoodsNotiInfo> newGoodsNotiList) {
+
+		goods.setChNotiYn("N");
+		String oldNiClsfCd = "";
+		String newNiClsfCd = "";
+
+		newNiClsfCd = excelMap.getString("niClsfCd").trim();
+		for (int i = 0; i < 28; i++) {
+			if (StringUtils.isBlank(excelMap.getString("niContent" + (i + 1)))) {
+				goods.setGoodsRegMsg("고시항목정보 없음 (" + (i + 1) + "번째 항목)");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			if (!UPDATE_NO_PATTERN.equals(excelMap.getString("niContent" + (i + 1)).trim())) {
+				goods.setChNotiYn("Y");
+			}
+		}
+		// 변경사항이 있는지 확인
+		if (UPDATE_NO_PATTERN.equals(newNiClsfCd) && "N".equals(goods.getChNotiYn())) {
+			return goods;
+		}
+
+		Collection<GoodsNotiInfo> goodsNotiList = new ArrayList<>();
+		//고시분류 코드의 고시항목 조회
+		NotiInfo notiInfo = new NotiInfo();
+		notiInfo.setSupplyVendorCd(goodsOrigin.getSupplyVendorCd());
+		if (!UPDATE_NO_PATTERN.equals(newNiClsfCd)) {
+			notiInfo.setNiClsfCd(newNiClsfCd);
+		} else {
+			GoodsNotiInfo goodsNotiInfo = new GoodsNotiInfo();
+			goodsNotiInfo.setGoodsCd(goods.getGoodsCd());
+			goodsNotiList = goodsDao.getGoodsNotiInfoList(goodsNotiInfo);
+			if (goodsNotiList != null && !goodsNotiList.isEmpty()) {
+				oldNiClsfCd = goodsNotiList.iterator().next().getNiClsfCd();
+			}
+			notiInfo.setNiClsfCd(oldNiClsfCd);
+			newNiClsfCd = oldNiClsfCd;
+		}
+		Collection<NotiInfo> notiInfolist = goodsDao.getNotiInfoItemList(notiInfo);  // 항목별 기본값 조회
+		// 상품의 고시 분류코드 조회
+		if (notiInfolist == null || notiInfolist.isEmpty()) {
+			goods.setGoodsRegMsg("고시분류정보 없음");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		int index = 0;
+		// 같은 고시분류 일경우 기존 고시항목 정보 적용
+		if (oldNiClsfCd.equals(newNiClsfCd)) {
+			for (NotiInfo notiInfoData : notiInfolist) {
+				for (GoodsNotiInfo goodsNotiInfoTemp : goodsNotiList) {
+					if (notiInfoData.getNiItemCd().equals(goodsNotiInfoTemp.getNiItemCd())) {
+						notiInfoData.setNiContent(goodsNotiInfoTemp.getNiContent());
+						break;
+					}
+				}
+				index++;
+			}
+		}
+
+		index = 0;
+		for (NotiInfo notiInfoTmp : notiInfolist) {
+			GoodsNotiInfo goodsNotiInfoTmp = new GoodsNotiInfo();
+			goodsNotiInfoTmp.setGoodsCd(goods.getGoodsCd());
+			goodsNotiInfoTmp.setNiClsfCd(notiInfoTmp.getNiClsfCd());
+			goodsNotiInfoTmp.setNiItemCd(notiInfoTmp.getNiItemCd());
+			goodsNotiInfoTmp.setDispOrd(index + 1);
+			goodsNotiInfoTmp.setRegNo(TsaSession.getInfo().getUserNo());
+			goodsNotiInfoTmp.setUpdNo(TsaSession.getInfo().getUserNo());
+			if (UPDATE_NO_PATTERN.equals(excelMap.getString("niContent" + (index + 1)))) {
+				goodsNotiInfoTmp.setNiContent(notiInfoTmp.getNiContent());
+			} else {
+				goodsNotiInfoTmp.setNiContent(excelMap.getString("niContent" + (index + 1)));
+			}
+
+			newGoodsNotiList.add(goodsNotiInfoTmp);
+			index++;
+		}
+
+		return goods;
+	}
+
+	/**
+	 * 상품등록로그 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 01. 25
+	 */
+	public Collection<GoodsMass> getGoodsRegLogList(GoodsSearch goodsSearch) {
+
+		// 입점업체담당자는 업체코드 설정
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd()) || "G001_E000".equals(TsaSession.getInfo().getRoleCd())) {
+			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
+			goodsSearch.setRegNo(TsaSession.getInfo().getUserNo());
+		}
+		return goodsDao.getGoodsRegLogList(goodsSearch);
+	}
 }

+ 63 - 0
src/main/java/com/style24/admin/biz/web/TsaGoodsController.java

@@ -41,6 +41,7 @@ import com.style24.persistence.domain.GoodsCompose;
 import com.style24.persistence.domain.GoodsEpSkip;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsImg;
+import com.style24.persistence.domain.GoodsMass;
 import com.style24.persistence.domain.GoodsNaverLowestPrice;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
@@ -2540,4 +2541,66 @@ public class TsaGoodsController extends TsaBaseController {
 		goodsService.updateFreeGoods(freeGoods);
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
+
+	/**
+	 * 상품대량수정 엑셀 저장
+	 *
+	 * @param goodsMass
+	 * @return
+	 * @throws Exception
+	 * @author eskim
+	 * @since 2021. 1. 25
+	 */
+	@PostMapping("/mass/excelupload/update")
+	@ResponseBody
+	public GagaResponse updateMassExceluploadGoods(@RequestBody GoodsMass goodsMass) throws Exception {
+
+		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
+		Collection<GagaMap> ecxelGoodsList = new ArrayList<>();
+
+		// 상품수장
+		// DB 처리 시 사용되는 파라미터명(셀명) 설정 -
+		String[] goodsNames = {"goodsCd", "goodsNm", "goodsTnm", "goodsSnm1", "itemkindCd", "seasonCd",
+			"sexGb", "currPrice", "sellFeeRate", "goodsGb", "formalGb", "minOrdQty", "maxOrdQty", "dayMaxOrdQty",
+			"giftPackYn", "newCustOrdYn","pntPrate","prePpntUsableYn", "pntMrate","preMpntUsableYn",
+			"returnableYn", "changeableYn","taxGb", "ageGrpCd", "adultYn", "delvFeeCd", "goodsContent",
+			"niClsfCd", "niContent1", "niContent2",
+			"niContent3", "niContent4", "niContent5", "niContent6", "niContent7", "niContent8", "niContent9",
+			"niContent10", "niContent11", "niContent12", "niContent13", "niContent14", "niContent15", "niContent16",
+			"niContent17", "niContent18", "niContent19", "niContent20", "niContent21", "niContent22", "niContent23",
+			"niContent24", "niContent25", "niContent26", "niContent27", "niContent28"};
+
+		ecxelGoodsList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, goodsMass.getExcelFileNm()), 0, goodsNames, 0);
+
+		// 입점담당자, 촬영업체
+		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()) &&
+			!"G001_A101".equals(TsaSession.getInfo().getRoleCd()) ) {
+			throw new IllegalStateException("권한이 없습니다.");
+		}
+
+		for (GagaMap gagaMap : ecxelGoodsList) {
+			goodsService.updateMassExceluploadGoods(gagaMap, goodsMass.getProcJob());
+		}
+
+		// 파일 삭제
+		GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, goodsMass.getExcelFileNm()));
+
+		return super.ok("");
+	}
+
+	/**
+	 * 상품 대량등록 결과 조회
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 01. 25
+	 */
+	@PostMapping("/reg/log/list")
+	@ResponseBody
+	public Collection<GoodsMass> getGoodsRegLogList(@RequestBody GoodsSearch goodsSearch) {
+		return goodsService.getGoodsRegLogList(goodsSearch);
+	}
+
 }

+ 102 - 0
src/main/java/com/style24/persistence/domain/GoodsMass.java

@@ -0,0 +1,102 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 대량등록 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 12
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsMass extends TscBaseDomain {
+
+	private String goodsCd;
+	private String goodsNum;
+	private String brandCd;		//브랜드코드
+	private String itemkindCd;	//품목코드
+	private String goodsNm;		//상품명
+	private String styleYear;	//스타일연도
+	private String seasonCd;	//시즌코드(공통코드G006)
+	private String sexGb;		//성별구분(공통코드G007)
+	private String listPrice;	//정상가(최초판매가)
+	private String currPrice;	//현재판매가
+	private String costPrice;	//원가
+	private String delvFeeCd;	//배송비정책코드
+	private String originCd;	//제조국(원산지)
+	private String makeYmd;		//제조연월일
+
+	private String supplyCompCd;	//공급업체코드
+	private String supplyGoodsCd;	//공급업체상품코드(원코드)
+	private String goodsTnm;		//상품타이틀명
+	private String goodsSnm1;		//상품검색명1(사용자등록용)
+	private String goodsGb;			//상품구분(공콩코드 G073)
+	private String formalGb; 		//정상이월구분(공통코드G009)
+//	private String distributionGb;	//유통구분(공콩코드 G065)
+	private String taxGb;			//과세구분(10:과세, 20:비과세)
+	private String ageGrpCd;		//상품연령코드(공통코드G023)
+	private String adultYn;			//성인용품여부 'Y', 'N'
+
+	private String pntPrate;		//포인트적립율(PC)
+	private String pntMrate;		//포인트적립율(모바일)
+	private String prePpntUsableYn;	//선포인트사용가능여부(PC)
+	private String preMpntUsableYn;	//선포인트사용가능여부(모바일)
+	private String sellFeeRate;		//판매수수료율
+	private String changeableYn;	//교환가능여부
+	private String returnableYn;	//반품가능여부
+	private String minOrdQty;		//최소주문수량
+	private String maxOrdQty;		//최대주문수량
+	private String dayMaxOrdQty;	//ID당1일최대구매수량
+	private String giftPackYn;		//선물포장여부
+	private String newCustOrdYn;	//신규고객 구매가능여부(Y:신규고객만 구매가능)
+
+	private String optStr;			//옵션(입점용)
+	private String opt1Str;			//옵션1
+	private String opt2Str;			//옵션2
+	private String goodsContent;	//상품상세 html(입점용)
+
+	private String niClsfCd;
+	private String niContent1;
+	private String niContent2;
+	private String niContent3;
+	private String niContent4;
+	private String niContent5;
+	private String niContent6;
+	private String niContent7;
+	private String niContent8;
+	private String niContent9;
+	private String niContent10;
+	private String niContent11;
+	private String niContent12;
+	private String niContent13;
+	private String niContent14;
+	private String niContent15;
+	private String niContent16;
+	private String niContent17;
+	private String niContent18;
+	private String niContent19;
+	private String niContent20;
+	private String niContent21;
+	private String niContent22;
+	private String niContent23;
+	private String niContent24;
+	private String niContent25;
+	private String niContent26;
+	private String niContent27;
+	private String niContent28;
+
+	private String excelFileNm;
+	private String procJob;
+	private String procGb;
+
+	private int goodsRegSq;
+	private String regSuccYn;
+	private String regFailRsn;
+	private String goodsStat;		//상품상태(공통코드G008)
+
+	private String mainColorCd;
+
+}

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

@@ -3947,4 +3947,337 @@
 		                AND GOODS_CD = A.GOODS_CD
 		                )
 	</insert>
+	
+	<!-- 상품  등록 로그 생성 -->
+	<insert id="createGoodsRegLog" parameterType="GoodsMass">
+		/* TsaGoods.createGoodsRegLog */
+		INSERT INTO TB_GOODS_REG_LOG (
+		    PROC_GB
+		  , GOODS_CD
+		  , SUPPLY_COMP_CD
+		  , GOODS_NM
+		  , GOODS_TNM
+		  , GOODS_SNM1
+		  , ORIGIN_CD
+		  , MAKE_YMD
+		  , BRAND_CD
+		  , ITEMKIND_CD
+		  , STYLE_YEAR
+		  , SEASON_CD
+		  , SEX_GB
+		  , GOODS_NUM
+		  , LIST_PRICE
+		  , CURR_PRICE
+		  , COST_PRICE
+		  , SUPPLY_GOODS_CD
+		  , FORMAL_GB
+		  , SELL_FEE_RATE
+		  , GOODS_GB
+		  , TAX_GB
+		  , ADULT_YN
+		  , MIN_ORD_QTY
+		  , MAX_ORD_QTY
+		  , DAY_MAX_ORD_QTY
+		  , PNT_PRATE
+		  , PNT_MRATE
+		  , PRE_PPNT_USABLE_YN
+		  , PRE_MPNT_USABLE_YN
+		  , CHANGEABLE_YN
+		  , RETURNABLE_YN
+		  , GIFT_PACK_YN
+		  , NEW_CUST_ORD_YN
+		  , OPT_STR
+		  , GOODS_CONTENT
+		  , NI_CLSF_CD
+		  , NI_CONTENT1
+		  , NI_CONTENT2
+		  , NI_CONTENT3
+		  , NI_CONTENT4
+		  , NI_CONTENT5
+		  , NI_CONTENT6
+		  , NI_CONTENT7
+		  , NI_CONTENT8
+		  , NI_CONTENT9
+		  , NI_CONTENT10
+		  , NI_CONTENT11
+		  , NI_CONTENT12
+		  , NI_CONTENT13
+		  , NI_CONTENT14
+		  , NI_CONTENT15
+		  , NI_CONTENT16
+		  , NI_CONTENT17
+		  , NI_CONTENT18
+		  , NI_CONTENT19
+		  , NI_CONTENT20
+		  , NI_CONTENT21
+		  , NI_CONTENT22
+		  , NI_CONTENT23
+		  , NI_CONTENT24
+		  , NI_CONTENT25
+		  , NI_CONTENT26
+		  , NI_CONTENT27
+		  , NI_CONTENT28
+		  , REG_SUCC_YN
+		  , REG_FAIL_RSN
+		  , REG_NO
+		  , REG_DT
+		)
+		VALUES(
+		    #{procGb}
+		  , #{goodsCd}
+		  , #{supplyCompCd}
+		  , #{goodsNm}
+		  , #{goodsTnm}
+		  , #{goodsSnm1}
+		  , #{originCd}
+		  , #{makeYmd}
+		  , #{brandCd}
+		  , #{itemkindCd}
+		  , #{styleYear}
+		  , #{seasonCd}
+		  , #{sexGb}
+		  , #{goodsNum}
+		  , #{listPrice}
+		  , #{currPrice}
+		  , #{costPrice}
+		  , #{supplyGoodsCd}
+		  , #{formalGb}
+		  , #{sellFeeRate}
+		  , #{goodsGb}
+		  , #{taxGb}
+		  , #{adultYn}
+		  , #{minOrdQty}
+		  , #{maxOrdQty}
+		  , #{dayMaxOrdQty}
+		  , #{pntPrate}
+		  , #{pntMrate}
+		  , #{prePpntUsableYn}
+		  , #{preMpntUsableYn}
+		  , #{changeableYn}
+		  , #{returnableYn}
+		  , #{giftPackYn}
+		  , #{newCustOrdYn}
+		  , #{optStr}
+		  , #{goodsContent}
+		  , #{niClsfCd}
+		  , #{niContent1}
+		  , #{niContent2}
+		  , #{niContent3}
+		  , #{niContent4}
+		  , #{niContent5}
+		  , #{niContent6}
+		  , #{niContent7}
+		  , #{niContent8}
+		  , #{niContent9}
+		  , #{niContent10}
+		  , #{niContent11}
+		  , #{niContent12}
+		  , #{niContent13}
+		  , #{niContent14}
+		  , #{niContent15}
+		  , #{niContent16}
+		  , #{niContent17}
+		  , #{niContent18}
+		  , #{niContent19}
+		  , #{niContent20}
+		  , #{niContent21}
+		  , #{niContent22}
+		  , #{niContent23}
+		  , #{niContent24}
+		  , #{niContent25}
+		  , #{niContent26}
+		  , #{niContent27}
+		  , #{niContent28}
+		  , #{regSuccYn}
+		  , #{regFailRsn}
+		  , #{regNo}
+		  , NOW()
+		)
+	</insert>
+	
+	<!-- 상품 기본 정보 수정  - 대량엑셀 -->
+	<update id="updateGoodsMass" parameterType="Goods">
+		/* TsaGoods.updateGoodsMass */
+		UPDATE TB_GOODS
+		SET UPD_NO = #{updNo}
+		  , UPD_DT = NOW()
+		<if test='goodsNm != null and goodsNm != "X"'>
+		  , GOODS_NM = #{goodsNm} 
+		</if>
+		<if test='goodsTnm != null and goodsTnm != "X"'>
+		  , GOODS_TNM = #{goodsTnm}
+		</if>
+		<if test='goodsSnm1 != null and goodsSnm1 != "X"'>
+		  , GOODS_SNM1 = #{goodsSnm1}
+		</if>
+		<if test='itemkindCd != null and itemkindCd != "X"'>
+		  , ITEMKIND_CD = #{itemkindCd}
+		</if>
+		<if test='seasonCd != null and seasonCd != "X"'>
+		  , SEASON_CD = #{seasonCd}
+		</if>
+		<if test='sexGb != null and sexGb != "X"'>
+		  , SEX_GB = #{sexGb}
+		</if>
+		<if test="currPrice != null and currPrice > 0">
+		  , CURR_PRICE = #{currPrice}
+		  , CURR_BPRICE = #{currBprice}
+		  , PRICE_UPD_DT = NOW()
+		  , DC_RATE = #{dcRate}
+		</if>
+		<if test="sellFeeRate != null and sellFeeRate > 0">
+		  , SELL_FEE_RATE = #{sellFeeRate}
+		</if>
+		<if test='goodsGb != null and goodsGb != "X"'>
+		  , GOODS_GB = #{goodsGb}
+		</if>
+		<if test='formalGb != null and formalGb != "X"'>
+		  , FORMAL_GB = #{formalGb}
+		  , PNT_PRATE = NVL(#{pntPrate}, PNT_PRATE)
+		  , PNT_MRATE = NVL(#{pntMrate}, PNT_MRATE)
+		</if>
+		<if test="minOrdQty != null and minOrdQty > 0">
+		  , MIN_ORD_QTY = #{minOrdQty}
+		</if>
+		<if test="maxOrdQty != null and maxOrdQty > 0">
+		  , MAX_ORD_QTY = #{maxOrdQty}
+		</if>
+		<if test="dayMaxOrdQty != null and dayMaxOrdQty > 0">
+		  , DAY_MAX_ORD_QTY = #{dayMaxOrdQty}
+		</if>
+		<if test='giftPackYn != null and giftPackYn != "X"'>
+		  , GIFT_PACK_YN = #{giftPackYn}
+		</if>
+		<if test='newCustOrdYn != null and newCustOrdYn != "X"'>
+		  , NEW_CUST_ORD_YN = #{newCustOrdYn}
+		</if>
+		<if test='returnableYn != null and returnableYn != "X"'>
+		  , RETURNABLE_YN = #{returnableYn}
+		</if>
+		<if test='changeableYn != null and changeableYn != "X"'>
+		  , CHANGEABLE_YN = #{changeableYn}
+		</if>
+		<if test='taxGb != null and taxGb != "X"'>
+		  , TAX_GB = #{taxGb}
+		</if>
+		<if test='ageGrpCd != null and ageGrpCd != "X"'>
+		  , AGE_GRP_CD = #{ageGrpCd}
+		</if>
+		<if test='adultYn != null and adultYn != "X"'>
+		  , ADULT_YN = #{adultYn}
+		</if>
+		<if test='pntPrate != null and pntPrate >= 0'>
+		  , PNT_PRATE = #{pntPrate}
+		</if>
+		<if test='prePpntUsableYn != null and prePpntUsableYn != "X"'>
+		  , PRE_PPNT_USABLE_YN = DECODE(#{prePpntUsableYn}, 'Y', 'Y', 'N', 'N', PRE_PPNT_USABLE_YN)
+		</if>
+		<if test='pntMrate != null and pntMrate >= 0'>
+		  , PNT_MRATE = #{pntMrate}
+		</if>
+		<if test='makeYmd != preMpntUsableYn and preMpntUsableYn != "X"'>
+		  , PRE_MPNT_USABLE_YN = DECODE(#{preMpntUsableYn}, 'Y', 'Y', 'N', 'N', PRE_MPNT_USABLE_YN)
+		</if>
+		WHERE GOODS_CD = #{goodsCd}
+	</update>
+	
+	<!-- 상품등록로그 목록 조회 -->
+	<select id="getGoodsRegLogList" parameterType="GoodsSearch" resultType="GoodsMass">
+		/* TsaGoods.getGoodsRegLogList */
+		SELECT A.GOODS_REG_SQ
+		     , A.PROC_GB
+		     , A.GOODS_CD
+		     , A.SUPPLY_COMP_CD
+		     , A.GOODS_NM
+		     , A.GOODS_TNM
+		     , A.GOODS_SNM1
+		     , A.ORIGIN_CD
+		     , A.MAKE_YMD
+		     , A.BRAND_CD
+		     , A.ITEMKIND_CD
+		     , A.STYLE_YEAR
+		     , A.SEASON_CD
+		     , A.SEX_GB
+		     , A.GOODS_NUM
+		     , A.LIST_PRICE
+		     , A.CURR_PRICE
+		     , A.COST_PRICE
+		     , A.SUPPLY_GOODS_CD
+		     , A.FORMAL_GB
+		     , A.GOODS_GB
+		     , A.TAX_GB
+		     , A.ADULT_YN
+		     , A.SELL_FEE_RATE
+		     , A.MIN_ORD_QTY
+		     , A.MAX_ORD_QTY
+		     , A.DAY_MAX_ORD_QTY
+		     , A.PNT_PRATE
+		     , A.PNT_MRATE
+		     , A.PRE_PPNT_USABLE_YN
+		     , A.PRE_MPNT_USABLE_YN
+		     , A.CHANGEABLE_YN
+		     , A.RETURNABLE_YN
+		     , A.GIFT_PACK_YN
+		     , A.NEW_CUST_ORD_YN
+		     , A.OPT_STR
+		     , A.GOODS_CONTENT
+		     , A.NI_CLSF_CD
+		     , A.NI_CONTENT1
+		     , A.NI_CONTENT2
+		     , A.NI_CONTENT3
+		     , A.NI_CONTENT4
+		     , A.NI_CONTENT5
+		     , A.NI_CONTENT6
+		     , A.NI_CONTENT7
+		     , A.NI_CONTENT8
+		     , A.NI_CONTENT9
+		     , A.NI_CONTENT10
+		     , A.NI_CONTENT11
+		     , A.NI_CONTENT12
+		     , A.NI_CONTENT13
+		     , A.NI_CONTENT14
+		     , A.NI_CONTENT15
+		     , A.NI_CONTENT16
+		     , A.NI_CONTENT17
+		     , A.NI_CONTENT18
+		     , A.NI_CONTENT19
+		     , A.NI_CONTENT20
+		     , A.NI_CONTENT21
+		     , A.NI_CONTENT22
+		     , A.NI_CONTENT23
+		     , A.NI_CONTENT24
+		     , A.NI_CONTENT25
+		     , A.NI_CONTENT26
+		     , A.NI_CONTENT27
+		     , A.NI_CONTENT28
+		     , A.REG_SUCC_YN
+		     , A.REG_FAIL_RSN
+		     , A.REG_NO
+		     , FN_GET_USER_NM(A.REG_NO) AS REG_NM 
+		     , DATE_FORMAT(A.REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		FROM TB_GOODS_REG_LOG A
+		-- LEFT OUTER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
+		WHERE 1 = 1 
+		<if test='condition != null and condition != "" '>
+		AND (UPPER(A.GOODS_NUM) LIKE CONCAT('%',UPPER(#{condition}),'%')
+		     OR 
+		     UPPER(A.SUPPLY_GOODS_CD) LIKE CONCAT('%',UPPER(#{condition}),'%')
+		    )
+		</if>
+		<if test='regSuccYn != null and regSuccYn != "" '>
+		AND A.REG_SUCC_YN  = #{regSuccYn}
+		</if>
+		<if test='regNo != null and regNo != "" '>
+		AND A.REG_No = #{regNo}
+		</if>
+		<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 edDate != ''">
+		<![CDATA[
+		AND A.REG_DT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S') 
+		]]>
+		</if>
+		ORDER BY A.REG_DT DESC, A.GOODS_CD
+	</select>
 </mapper>

+ 32 - 98
src/main/webapp/WEB-INF/views/goods/GoodsMassRegisterForm.html

@@ -32,24 +32,6 @@
 			</ul>
 			<ul class="panelBar">
 				<li class="center">
-					<!-- <th:block th:if="${sessionInfo.roleCd == 'G001_0000' 
-									or sessionInfo.roleCd == 'G001_A000' 
-									or sessionInfo.roleCd == 'G001_A001' 
-									or sessionInfo.roleCd == 'G001_A100' 
-									or sessionInfo.roleCd == 'G001_A101'
-									}">
-						<button type="button" class="btn btn-default btn-lg" id="btnInit" onclick="cfnDownloadSampleFile('SF001');">자사상품 등록양식 다운로드</button>
-						<button th:if="${wmsSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsSelfCreate" >자사상품 등록</button>
-					</th:block>
-					<th:block th:if="${sessionInfo.roleCd == 'G001_0000' 
-									or sessionInfo.roleCd == 'G001_A000' 
-									or sessionInfo.roleCd == 'G001_A001' 
-									or sessionInfo.roleCd == 'G001_A100' 
-									or sessionInfo.roleCd == 'G001_A101'
-									}">
-						<button type="button" class="btn btn-default btn-lg" id="btnInit" onclick="cfnDownloadSampleFile('SF005');">입점상품 등록양식 다운로드</button>
-						<button th:if="${wmsSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsCreate" >입점상품 등록</button> -->
-					</th:block>
 					<label class="off"><a href="javascript:void(0);" id="excelList" style="display: none;">엑셀다운로드</a></label>
 					<!--  추후 대량 수정 권한-->
 					<span th:if="${sessionInfo.roleCd == 'G001_0000' 
@@ -113,22 +95,22 @@
 						<i class="fa fa-info" aria-hidden="true"></i>
 						<span class="left aL" style="width:580px;">
 						<!-- class="left" 또는 class="right" -->
-							<em>상품미등록</em><br/>
-							- 상품코드 오류 : 빈값, 온라인상품코드 미존재<br/>
-							- 업체 오류 : 빈값, 'S0001'나 'S0002' 가 아닌경우<br/>
-							- 상품명 오류 : 빈값<br/>
-							- 스타일 연도 오류 : 온라인에서 관리되지 않는 스타일 연도<br/>
-							- 성별 오류 : 온라인에서 관리되지 않는 성별<br/>
-							- 컬러 오류 : 온라인에서 관리되지 않는 컬러<br/>
-							- 품목 오류 : 온라인에서 관리되지 않는 품목<br/>
+							<em>* 상품미등록 *</em><br/>
+							- 품번 오류(자사) : 빈값, 길이 10이 아닐경우, FRJ는 '-'제외한 길이<br/>
+							- 제조년월일 오류 : 빈값, 날짜형식이 맞는지<br/>
+							- WMS 미존재 품번코드(자사) : 온라인 입고테이블에 품번이 없는 경우<br/>
+							- 상품코드 중복등록요청 : 등록된 상품코드 등록요청<br/>
+							- 항목별 오류 : 온라인에서 관리되지 않는 공통코드<br/>
 							- 품목의 고시정보 없음 : 품목의 고시분류 매핑이 안되어 있는 경우<br/>
+							- 고시분류 오류 : 등록요청 고시분류 와 온라인에서 품목과 매핑된 고시분류가 다른 경우<br/>
+							<br/>
+							<em>* 상품등록 *</em><br/>
+							- WMS 상품 사이즈 정보 없음 : WMS에 상품코드의 사이즈가 없을 경우<br/>
+							- 고시항목 필수 항목 오류 : 필수 고시항목의 값이 없을 경우<br/>
 						</span>
 					</div>
 					<!-- //아이콘 툴팁 -->
 				</li>
-				<li class="right">
-					<button type="button" class="btn btn-default btn-lg" id="btnGoodsRegExcelDownLoad">엑셀다운로드</button>
-				</li>
 			</ul>
 			<!-- //상단버튼 영역  -->
 			<div id="gridList" style="width: 100%; height: 500px;" class="ag-theme-balham"></div>
@@ -144,42 +126,33 @@
 	var columnDefs = [
 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
 		{headerName: "작업일시", field: "regDt", width: 150, cellClass: 'text-center'},
+		{headerName: "작업자", field: "regNm", width: 120, cellClass: 'text-center'},
 		{headerName: "상품등록여부", field: "regSuccYn", width: 100, cellClass: 'text-center'},
 		{headerName: "등록결과메세지", field: "regFailRsn", width: 200, cellClass: 'text-left'},
-		{headerName: "등록브랜드코드", field: "brandCd", width: 120, cellClass: 'text-center'},
-		{headerName: "업체코드", field: "supplyCompCd", width: 130, cellClass: 'text-center'},
+		{headerName: "품번", field: "goodsNum", width: 100, cellClass: 'text-center'},
+		{headerName: "브랜드코드", field: "brandCd", width: 100, cellClass: 'text-center'},
+		{headerName: "공급업체상품코드", field: "supplyGoodsCd", width: 130, cellClass: 'text-center'},
+		{headerName: "공급업체코드", field: "supplyCompCd", width: 100, cellClass: 'text-center'},
 		{headerName: "상품코드", field: "goodsCd", width: 130, cellClass: 'text-center'},
 		{headerName: "상품명", field: "goodsNm", width: 150, cellClass: 'text-left'},
 		{headerName: "상품타이틀", field: "goodsTnm", width: 150, cellClass: 'text-left'},
 		{headerName: "검색어", field: "goodsSnm1", width: 150, cellClass: 'text-left'},
-		{headerName: "제조국", field: "makeNm", width: 100, cellClass: 'text-center'},
+		{headerName: "원산지", field: "originCd", width: 100, cellClass: 'text-center'},
 		{headerName: "제조일", field: "makeYmd", width: 100, cellClass: 'text-center'},
-		{headerName: "이지미타입", field: "imgType", width: 100, cellClass: 'text-center'},
-		{headerName: "이미지경로1", field: "imgPath1", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로2", field: "imgPath2", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로3", field: "imgPath3", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로4", field: "imgPath4", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로5", field: "imgPath5", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로6", field: "imgPath6", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로7", field: "imgPath7", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로8", field: "imgPath8", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로9", field: "imgPath9", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로10", field: "imgPath10", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로11", field: "imgPath11", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로12", field: "imgPath12", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로13", field: "imgPath13", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로14", field: "imgPath14", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로15", field: "imgPath15", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로16", field: "imgPath16", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로17", field: "imgPath17", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로18", field: "imgPath18", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로19", field: "imgPath19", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로20", field: "imgPath20", width: 200, cellClass: 'text-left'},
-		{headerName: "고시분류코드", field: "niClsfCd", width: 200, cellClass: 'text-center',
-			cellEditorParams: { values: gagaAgGrid.extractValues(niClsfCdList) },
-			valueFormatter: function (params) { return gagaAgGrid.lookupValue(niClsfCdList, params.value); },
-			valueParser: function (params) { return gagaAgGrid.lookupKey(niClsfCdList, params.newValue); }
-		},
+		{headerName: "품목", field: "itemkindCd", width: 100, cellClass: 'text-center'},
+		{headerName: "스타일연도", field: "styleYear", width: 100, cellClass: 'text-center'},
+		{headerName: "시즌", field: "seasonCd", width: 100, cellClass: 'text-center'},
+		{headerName: "성별", field: "sexGb", width: 100, cellClass: 'text-center'},
+		{headerName: "정상가", field: "listPrice", width: 100, cellClass: 'text-center'},
+		{headerName: "판매가", field: "currPrice", width: 100, cellClass: 'text-center'},
+		{headerName: "원가", field: "costPrice", width: 100, cellClass: 'text-center'},
+		{headerName: "정상이월", field: "formalGb", width: 100, cellClass: 'text-center'},
+		{headerName: "상품구분", field: "goodsGb", width: 100, cellClass: 'text-center'},
+		{headerName: "과세구분", field: "taxGb", width: 100, cellClass: 'text-center'},
+		{headerName: "성인용품여부", field: "adultYn", width: 100, cellClass: 'text-center'},
+		{headerName: "옵션정보", field: "optStr", width: 150, cellClass: 'text-center'},
+		{headerName: "상품상세 html", field: "goodsContent", width: 150, cellClass: 'text-center'},
+		{headerName: "고시분류코드", field: "niClsfCd", width: 100, cellClass: 'text-center'},
 		{headerName: "고시내용1", field: "niContent1", width: 200, cellClass: 'text-left'},
 		{headerName: "고시내용2", field: "niContent2", width: 200, cellClass: 'text-left'},
 		{headerName: "고시내용3", field: "niContent3", width: 200, cellClass: 'text-left'},
@@ -207,21 +180,7 @@
 		{headerName: "고시내용25", field: "niContent25", width: 200, cellClass: 'text-left'},
 		{headerName: "고시내용26", field: "niContent26", width: 200, cellClass: 'text-left'},
 		{headerName: "고시내용27", field: "niContent27", width: 200, cellClass: 'text-left'},
-		{headerName: "고시내용28", field: "niContent28", width: 200, cellClass: 'text-left'},
-		{headerName: "브랜드", field: "brandCd", width: 100, cellClass: 'text-center'},
-		{headerName: "품목", field: "itemkindCd", width: 100, cellClass: 'text-center'},
-		{headerName: "스타일연도", field: "styleYear", width: 100, cellClass: 'text-center'},
-		{headerName: "시즌", field: "seasonCd", width: 80, cellClass: 'text-center'},
-		{headerName: "성별", field: "sexGb", width: 80, cellClass: 'text-center'},
-		{headerName: "품번", field: "goodsNum", width: 100, cellClass: 'text-center'},
-		{headerName: "정상가", field: "listPrice", width: 100, cellClass: 'text-center'},
-		{headerName: "판매가", field: "currPrice", width: 100, cellClass: 'text-center'},
-		{headerName: "공급업체상품코드", field: "supplyGoodsCd", width: 130, cellClass: 'text-center'},
-		{headerName: "정상이월", field: "formalGb", width: 100, cellClass: 'text-center'},
-		/* {headerName: "옵션문자열", field: "optStr", width: 200, cellClass: 'text-center'},
-		{headerName: "안전재고문자열", field: "baseStockStr", width: 200, cellClass: 'text-center'},
-		{headerName: "현재고문자열", field: "currStockStr", width: 200, cellClass: 'text-center'}, */
-		{headerName: "매입유형", field: "buyingType", width: 80, cellClass: 'text-center'}
+		{headerName: "고시내용28", field: "niContent28", width: 200, cellClass: 'text-left'}
 	];
 
 	// Get GridOptions
@@ -297,31 +256,6 @@
 		fnGoodsListSearch();
 	}
 	
-	$('#btnGoodsRegExcelDownLoad').on('click', function() {
-		
-		var date = new Date().format("YYYYMMDDHHmmss");
-		var params = {
-			
-			fileName : "상품대량등록결과_"+ date,
-			sheetName: "DATA"
-		}
-		gridOptions.excelStyles = [
-			{
-				id: 'text-center',
-				dataType: 'string',
-				font: {size : 10, bold: false}
-			},
-			{
-				id: 'text-left',
-				dataType: 'string',
-				font: {size : 10, bold: false}
-			}
-		]
-		
-		gridOptions.api.exportDataAsExcel(params);
-		
-	});
-	
 	// 초기화 클릭시
 	$('#btnInit').on('click', function() {
 		$('#massForm')[0].reset();