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

상품 상세 저장 개발중

eskim 5 лет назад
Родитель
Сommit
9b9044f782

+ 63 - 9
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java

@@ -6,6 +6,7 @@ import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.CodiGoods;
 import com.style24.persistence.domain.Color;
 import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsCompose;
 import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsNotiInfo;
@@ -185,15 +186,15 @@ public interface TsaGoodsDao {
 	 */
 	Collection<GoodsNotiInfo> getGoodsNotiInfoList(GoodsNotiInfo goodsNotiInfo);
 
-//	/**
-//	 * 구성상품 목록
-//	 *
-//	 * @param goodsNotiInfo
-//	 * @return
-//	 * @author eskim
-//	 * @since 2020. 06. 16
-//	 */
-//	Collection<GoodsExtend> getGoodsDetailExtendList(Goods goods);
+	/**
+	 * 구성상품 목록
+	 *
+	 * @param goodsNotiInfo
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	Collection<GoodsCompose> getGoodsDetailComposeList(Goods goods);
 
 	/**
 	 * 상품 기본 정보 이력 생성
@@ -279,5 +280,58 @@ public interface TsaGoodsDao {
 	 */
 	Collection<CodiGoods> getCodiGoodsList(CodiGoods codiGoods);
 
+	/**
+	 * 상품 기본 정보 수정
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	void updateGoods(Goods goods);
+
+	/**
+	 * 상품 상세정보 삭제
+	 *
+	 * @param godsDesc
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	void deleteGoodsDesc(GoodsDesc godsDesc);
+
+	/**
+	 * 상품 상세정보 등록
+	 *
+	 * @param godsDesc
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	void createGoodsDesc(GoodsDesc godsDesc);
+
+	/**
+	 * 구성상품 저장
+	 *
+	 * @param goodsCompose
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	void saveGoodsCompose(GoodsCompose goodsCompose);
+
+	/**
+	 * 상품 옵션/재고 정보 이력생성
+	 *
+	 * @param option
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	void createStockHst(Option option);
+
+	/**
+	 * 상품 옵션/재고 정보 수정
+	 *
+	 * @param stock
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	void saveStock(Option option);
 
 }

+ 323 - 11
style24.admin/src/main/java/com/style24/admin/biz/service/TsaGoodsService.java

@@ -17,6 +17,7 @@ import com.style24.persistence.domain.Brand;
 import com.style24.persistence.domain.CodiGoods;
 import com.style24.persistence.domain.Color;
 import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsCompose;
 import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsNotiInfo;
@@ -414,17 +415,17 @@ public class TsaGoodsService {
 		return goodsDao.getGoodsNotiInfoList(goodsNotiInfo);
 	}
 
-//	/**
-//	 * 구성상품 목록
-//	 *
-//	 * @param goods
-//	 * @return
-//	 * @author eskim
-//	 * @since 2020. 06. 16
-//	 */
-//	public Collection<GoodsExtend> getGoodsDetailExtendList(Goods goods) {
-//		return goodsDao.getGoodsDetailExtendList(goods);
-//	}
+	/**
+	 * 구성상품 목록
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	public Collection<GoodsCompose> getGoodsDetailComposeList(Goods goods) {
+		return goodsDao.getGoodsDetailComposeList(goods);
+	}
 
 
 	/**
@@ -705,4 +706,315 @@ public class TsaGoodsService {
 	public Collection<CodiGoods> getCodiGoodsList(CodiGoods codiGoods) {
 		return goodsDao.getCodiGoodsList(codiGoods);
 	}
+
+	/**
+	 * 상품 저장
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsDetail(Goods goods) {
+
+		// <,> replace 처리
+		goods.setRegNo(TsaSession.getInfo().getUserNo());
+		goods.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		goods.setGoodsPcTopDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsPcTopDesc(), "&lt;", "<"), "&gt;", ">"));
+		goods.setGoodsMobileTopDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsMobileTopDesc(), "&lt;", "<"), "&gt;", ">"));
+		goods.setGoodsPcDownDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsPcDownDesc(), "&lt;", "<"), "&gt;", ">"));
+		goods.setGoodsMobileDownDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsMobileDownDesc(), "&lt;", "<"), "&gt;", ">"));
+
+		goods.setGoodsNm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsNm(), "&lt;", "<"), "&gt;", ">"));
+		goods.setGoodsTnm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsTnm(), "&lt;", "<"), "&gt;", ">"));
+		goods.setGoodsSnm1(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsSnm1(), "&lt;", "<"), "&gt;", ">"));
+
+		// 가격변경일
+		if (goods.getCurrPrice() != goods.getCurrPriceOrg()) {
+			goods.setCurrBprice(goods.getCurrPriceOrg());
+		} else {
+			goods.setCurrPrice(goods.getCurrPriceOrg());
+		}
+
+		// 승인일
+		if (!goods.getGoodsStat().equals(goods.getGoodsStatOrg()) && "G008_90".equals(goods.getGoodsStat())) {
+			goods.setChGoodsStatYn("Y");
+		}
+		// 사용자 검색어를 검색어에 적용
+		String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
+		if (!StringUtils.isEmpty(goods.getGoodsSnm1())) {
+			goods.setGoodsSnm1(GagaStringUtil.replace(goods.getGoodsSnm1(), " ", "")); // 빈값 삭제
+			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);
+
+		} else if (!goodsSnm.equals(goods.getGoodsSnm())) {
+			goods.setGoodsSnm(goodsSnm);
+		}
+
+		// 브랜드 확인
+		if (!"G056_N".equals(goods.getGoodsType())) {
+			if (!goods.getFormalGb().equals(goods.getFormalGbOrg())) {
+				Brand brand = new Brand();
+				brand.setBrandCd(goods.getBrandCd());
+				Collection<Brand> brandList = businessService.getBrandList(brand);
+				if (brandList != null && !brandList.isEmpty()) {
+					float pntPrate = 0.0f;
+					float pntMrate = 0.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)
+				}
+			}
+		} else {
+			if ("N".equals(goods.getSelfGoodsYn())) {
+				goods.setFormalGb(goods.getFormalGb());
+			} else {
+				goods.setFormalGb(goods.getFormalGbOrg());
+			}
+		}
+
+		// 기본정보 변경
+		if ("Y".equals(goods.getChDataYn())) {
+			goodsDao.createGoodsHst(goods);
+			goodsDao.updateGoods(goods);
+		}
+
+		// 상품상세정보 변경
+		if (!"Y".equals(goods.getChkDescKeep())) {
+			this.saveGoodsDetailDesc(goods);
+		}
+
+		// 구성상품 변경
+		if (!"G056_N".equals(goods.getGoodsType())) {
+			int idx = 1;
+			Collection<GoodsCompose> goodsExtendList = goods.getGoodsComposeListNew();
+			for (GoodsCompose regGoodsExtend : goodsExtendList) {
+				regGoodsExtend.setDispOrd(idx);
+				regGoodsExtend.setRegNo(TsaSession.getInfo().getUserNo());
+				regGoodsExtend.setUpdNo(TsaSession.getInfo().getUserNo());
+				goodsDao.saveGoodsCompose(regGoodsExtend); // 구성상품기본 저장
+
+				idx++;
+			}
+		}
+
+		// 옵션/재고 변경
+		if (goods.getOptCd() != null && goods.getOptCd().length > 0 && "Y".equals(goods.getChStockDataYn())) {
+			this.saveStock(goods);
+		}
+
+		// 상품 정보고시 변경
+		this.saveGoodsNotiInfo(goods);
+	}
+
+	/**
+	 * 상품상세정보 변경 - 상품상세
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 27.
+	 */
+	private void saveGoodsDetailDesc(Goods goods) {
+		// 상품상세 구분(10:상품설명, 20:상위컨텐츠, 30:하위컨텐츠, 40:하위컨텐츠-모바일, 50:상위컨텐츠-모바일)
+		GoodsDesc goodsDesc = new GoodsDesc();
+		goodsDesc.setGoodsCd(goods.getGoodsCd());
+		goodsDesc.setRegNo(goods.getRegNo());
+		goodsDesc.setUpdNo(goods.getUpdNo());
+
+		// PC 상단
+		goodsDesc.setDescGb("20");
+		goodsDesc.setGoodsDesc(goods.getGoodsPcTopDesc());
+		this.saveGoodsDesc(goodsDesc);
+
+		// 공용 하단
+		goodsDesc.setDescGb("30");
+		goodsDesc.setGoodsDesc(goods.getGoodsPcDownDesc());
+		this.saveGoodsDesc(goodsDesc);
+
+		// MO 상단
+		goodsDesc.setDescGb("40");
+		goodsDesc.setGoodsDesc(goods.getGoodsMobileTopDesc());
+		this.saveGoodsDesc(goodsDesc);
+
+		//		// 상품상세 저장
+		//		goodsDesc.setDescGb("10");
+		//		goodsDesc.setGoodsDesc(this.setGoodsDescSb(goods).toString());
+		//		this.saveGoodsDesc(goodsDesc);
+		//
+		//		// 세트상품의 구서상품으로 있을경우 처리
+		//		this.saveGoodsSetDesc(goodsDesc);
+
+		// MO 하단
+		goodsDesc.setDescGb("50");
+		goodsDesc.setGoodsDesc(goods.getGoodsMobileDownDesc());
+		this.saveGoodsDesc(goodsDesc);
+	}
+
+	/**
+	 * 상품 상세 저장
+	 *
+	 * @param goodsDesc
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	private void saveGoodsDesc(GoodsDesc goodsDesc) {
+
+		goodsDao.deleteGoodsDesc(goodsDesc);
+
+		String[] arrProdHtml = null;
+		arrProdHtml = makeArrayToString(goodsDesc.getGoodsDesc(), 3800);
+		if (arrProdHtml.length > 0) {
+			for (int i = 0; i < arrProdHtml.length; i++) {
+				if (!arrProdHtml[i].isEmpty()) {
+					goodsDesc.setSeq(i + 1);
+					goodsDesc.setGoodsDesc(arrProdHtml[i]);
+					goodsDao.createGoodsDesc(goodsDesc);
+				}
+			}
+		}
+	}
+
+	/**
+	 * String => byte array
+	 *
+	 * @param raw
+	 * @param len
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	public static String[] makeArrayToString(String raw, int len) {
+
+		String[] ary = null;
+
+		if (raw == null) {
+			return ary;
+		}
+
+		try {
+
+			// raw 의 byte
+			byte[] rawBytes = raw.getBytes("UTF-8"); // MS949
+			int rawLength = rawBytes.length;
+
+			if (rawLength > len) {
+				int aryLength = (rawLength / len) + (rawLength % len != 0 ? 1 : 0);
+				ary = new String[aryLength];
+
+				int endCharIndex = 0; // 문자열이 끝나는 위치
+				String tmp;
+				for (int i = 0; i < aryLength; i++) {
+
+					if (i == (aryLength - 1)) {
+						tmp = raw.substring(endCharIndex);
+					} else {
+
+						int useByteLength = 0;
+						int rSize = 0;
+						for (; endCharIndex < raw.length(); endCharIndex++) {
+
+							if (raw.charAt(endCharIndex) > 0x007F) {
+								useByteLength += 3;
+							} else {
+								useByteLength++;
+							}
+							if (useByteLength > len) {
+								break;
+							}
+							rSize++;
+						}
+						tmp = raw.substring((endCharIndex - rSize), endCharIndex);
+					}
+
+					ary[i] = tmp;
+				}
+
+			} else {
+				ary = new String[] {raw};
+			}
+
+		} catch (java.io.UnsupportedEncodingException e) {
+		}
+
+		return ary;
+	}
+
+	/**
+	 * 옵션/재고 변경 - 상품상세
+	 *
+	 * @param goods
+	 * @param index
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	private void saveStock(Goods goods) {
+		int index = 0;
+		Option stock = new Option();
+		stock.setGoodsCd(goods.getGoodsCd());
+		stock.setUpdNo(goods.getUpdNo());
+		stock.setRegNo(goods.getRegNo());
+		goodsDao.createStockHst(stock);
+		log.info("[saveStock] goods=>{}",goods);
+		for (String optCd : goods.getOptCd()) {
+			Option goodsStock = new Option();
+			goodsStock.setGoodsCd(goods.getCompsGoodsCd()[index]); // 구성상품 코드
+			goodsStock.setOptCd(optCd);
+			goodsStock.setOptNm1(goods.getOptNm1()[index]);
+			goodsStock.setOptNm2(goods.getOptNm2()[index]);
+			goodsStock.setBaseStockQty(Integer.parseInt(goods.getBaseStockQty()[index]));
+			goodsStock.setSoldoutYn(goods.getSoldoutYn()[index]);
+			goodsStock.setDispOrd(goods.getDispOrd()[index]);
+			goodsStock.setDispYn(goods.getDispYn()[index]);
+			goodsStock.setRegNo(goods.getRegNo());
+			goodsStock.setUpdNo(goods.getUpdNo());
+
+			if ("N".equals(goods.getSelfGoodsYn())) {
+				goodsStock.setSelfGoodsYn(goods.getSelfGoodsYn());
+				goodsStock.setCurrStockQty(Integer.parseInt(goods.getEditCurrStockQty()[index]));
+			}
+			goodsDao.saveStock(goodsStock);
+			index++;
+		}
+	}
+
+	/**
+	 * 상품 정보고시 변경 - 상품상세
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	private void saveGoodsNotiInfo(Goods goods) {
+		int index;
+		if (goods.getNotiListNew() != null && !goods.getNotiListNew().isEmpty()) {
+			index = 0;
+			for (GoodsNotiInfo goodsNotiInfo : goods.getNotiListNew()) {
+				if (index == 0) {
+					goodsDao.deleteGoodsNotiInfo(goods);
+				}
+				goodsNotiInfo.setNiContent(GagaStringUtil.replace(GagaStringUtil.replace(goodsNotiInfo.getNiContent(), "&lt;", "<"), "&gt;", ">"));
+				goodsNotiInfo.setRegNo(goods.getRegNo());
+				goodsNotiInfo.setUpdNo(goods.getUpdNo());
+				goodsDao.saveGoodsNotiInfo(goodsNotiInfo);
+				index++;
+			}
+		}
+	}
 }

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

@@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
+import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.style24.admin.biz.service.TsaGoodsService;
 import com.style24.admin.biz.service.TsaRendererService;
@@ -28,6 +29,7 @@ import com.style24.persistence.TsaPageRequest;
 import com.style24.persistence.domain.CodiGoods;
 import com.style24.persistence.domain.Color;
 import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsCompose;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsSearch;
@@ -636,19 +638,19 @@ public class TsaGoodsController extends TsaBaseController {
 		return goodsService.getGoodsNotiInfoList(goodsInfo);
 	}
 
-//	/**
-//	 * 구성상품 목록
-//	 *
-//	 * @param goods
-//	 * @return
-//	 * @author eskim
-//	 * @since 2020. 06. 16
-//	 */
-//	@GetMapping("/detail/extend/list")
-//	@ResponseBody
-//	public Collection<GoodsExtend> getGoodsDetailExtendList(Goods goods) {
-//		return goodsService.getGoodsDetailExtendList(goods);
-//	}
+	/**
+	 * 구성상품 목록
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	@GetMapping("/detail/compose/list")
+	@ResponseBody
+	public Collection<GoodsCompose> getGoodsDetailComposeList(Goods goods) {
+		return goodsService.getGoodsDetailComposeList(goods);
+	}
 
 	/**
 	 * 코디 상품 목록 조회
@@ -925,5 +927,47 @@ public class TsaGoodsController extends TsaBaseController {
 		return result;
 	}
 
+	/**
+	 * 상품 상세 저장
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	@PostMapping("/detail/save")
+	@ResponseBody
+	public GagaResponse saveGoodsDetail(@RequestBody Goods goods) {
+
+		// 상품상태에 따른 이미지 정보 확인 - 상품상태가 승인대기나 승인 완료일 경우
+		if ("G008_40".equals(goods.getGoodsStat()) || "G008_90".equals(goods.getGoodsStat())) {
+			Collection<Goods> goodsList = goodsService.getGoodsImgsYn(goods);
+			String goodsImageYn = "N";
+			for (Goods tmpGoods : goodsList) {
+				goodsImageYn = tmpGoods.getGoodsImageYn();
+			}
+			if ("N".equals(goodsImageYn)) {
+				throw new IllegalStateException("필수 이미지나 고시정보가 등록되지 않은 상품은 <br/>'승인대기'나 '승인완료' 상태로 변경할 수 없습니다.");
+			}
+		}
+
+		Collection<GoodsNotiInfo> notiList = null;
+		Collection<GoodsCompose> goodComposeList = null;
+		ObjectMapper mapper = new ObjectMapper();
+		try {
+			notiList = mapper.readValue(goods.getNotiList(), new TypeReference<Collection<GoodsNotiInfo>>() {
+			});
+			goodComposeList = mapper.readValue(goods.getGoodsComposeList(), new TypeReference<Collection<GoodsCompose>>() {
+			});
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		goods.setNotiListNew(notiList);
+		goods.setGoodsComposeListNew(goodComposeList);
+		goodsService.saveGoodsDetail(goods);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
 
 }

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

@@ -38,7 +38,7 @@ public class Goods extends TscBaseDomain {
 	private float dcRate;		//할인율
 
 	private String goodsStat;		//상품상태(공통코드G008)
-	private String dispYn;		//노출여부
+	private String selfMallYn;		//자사몰노출여부
 	private String goodsGb;		//해외구매대행/병행수입 상품일 경우 주문 시 통관부호 입력 란이 추가되어야 한다
 	private String distributionGb;		//유통구분(공콩코드 G065)
 	private String selfGoodsYn;		//자사상품여부
@@ -86,8 +86,11 @@ public class Goods extends TscBaseDomain {
 	private String goodsImageYn;
 	private String itemkindNm;
 	private String niClsfCd;
-//	private Integer currPriceOrg;
-//
+
+	private int currPriceOrg;
+	private String goodsStatOrg;
+	private String formalGbOrg;
+
 	private String imgType;
 	private String imgPath1;
 	private String imgPath6;
@@ -107,7 +110,7 @@ public class Goods extends TscBaseDomain {
 //	private Integer sizeStockQty;
 //	private String goodsSizeCd;
 //	private String sizeSoldoutYn;
-//	private String siteCd;
+	private String siteCd;
 	private int sellDay15Qty;
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
@@ -115,7 +118,16 @@ public class Goods extends TscBaseDomain {
 
 	// 상품옵션/재고
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] sizeCd; // 상품 사이즈
+	private String[] compsGoodsCd; // 상품 사이즈
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] optCd; // 상품 사이즈
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] optNm1; // 상품 옵션1
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] optNm2; // 상품 옵션2
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] baseStockQty; // 안전재고
@@ -132,10 +144,17 @@ public class Goods extends TscBaseDomain {
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] dispOrd; // 우선순위
 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] dispYn; // 전시여부
+
 	private Collection<GoodsNotiInfo> notiListNew; // 고시항목
 
 	private String notiList; // 고시항목
-	private String delvLocCd; // 고시항목
+//	private String delvLocCd;
+
+	private Collection<GoodsCompose> goodsComposeListNew; // 상품 구성상품
+
+	private String goodsComposeList; // 상품 구성상품
 
 	// Pagination
 	private TsaPageRequest pageable;

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

@@ -31,7 +31,7 @@ public class GoodsCompose extends TscBaseDomain {
 	private String imgPath6;
 	private String imgType;
 	private String crud;
-	private String compsGoodsCdNm;
+	private String compsGoodsNm;
 
 //	private String optionTitle;
 //	private String optionNm;

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

@@ -71,7 +71,7 @@ public class GoodsSearch extends TscBaseDomain {
 	private String dateGbn;
 
 	private String goodsType;
-	private String dispYn;
+	private String selfMallYn;
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] siteCd;

+ 1 - 0
style24.admin/src/main/java/com/style24/persistence/domain/Option.java

@@ -31,5 +31,6 @@ public class Option extends TscBaseDomain {
 	private int saleStockQty;
 	private int ableStockQty;
 	private String compsGoodsCd;
+	private String selfGoodsYn;
 
 }

+ 268 - 42
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -275,7 +275,7 @@
 		              , G.CURR_PRICE
 		              , G.DC_RATE
 		              , G.SELF_GOODS_YN
-		              , G.DISP_YN
+		              , G.SELF_MALL_YN
 		              , G.FORMAL_GB
 		              , G.STYLE_YEAR
 		              , G.SEASON_CD
@@ -420,8 +420,8 @@
 		        <if test="goodsType != null and goodsType != ''">
 		        AND G.GOODS_TYPE = #{goodsType}
 		        </if>
-		        <if test="dispYn != null and dispYn != ''">
-		        AND G.DISP_YN = #{dispYn}
+		        <if test="selfMallYn != null and selfMallYn != ''">
+		        AND G.SELF_MALL_YN = #{selfMallYn}
 		        </if>
 		        <if test="itemkindCd != null and itemkindCd != ''">
 		        AND G.ITEMKIND_CD = #{itemkindCd}
@@ -701,7 +701,7 @@
 		     , G.DC_RATE
 		     , G.GOODS_STAT
 		     , G.SELF_GOODS_YN
-		     , G.DISP_YN
+		     , G.SELF_MALL_YN
 		     , G.GOODS_GB
 		     , G.DISTRIBUTION_GB
 		     /*, (SELECT COLOR_GRP_FILE 
@@ -820,7 +820,7 @@
 		      , PRICE_UPD_DT
 		      , DC_RATE
 		      , GOODS_STAT
-		      , DISP_YN
+		      , SELF_MALL_YN
 		      , GOODS_GB
 		      , DISTRIBUTION_GB
 		      , SELF_GOODS_YN
@@ -872,7 +872,7 @@
 		     , PRICE_UPD_DT        
 		     , DC_RATE             
 		     , GOODS_STAT          
-		     , DISP_YN             
+		     , SELF_MALL_YN             
 		     , GOODS_GB            
 		     , DISTRIBUTION_GB     
 		     , SELF_GOODS_YN       
@@ -1011,7 +1011,7 @@
 		     , PRE_MPNT_USABLE_YN
 		     , GOODS_SNM1
 		     , ITEMKIND_CD
-		     , DISP_YN
+		     , SELF_MALL_YN
 		     , DATE_FORMAT(FRST_CFRM_DT, '%Y%m%d%H%i%S') AS FRST_CFRM_DT
 		     , UPD_NO
 		     , FN_GET_USER_NM(UPD_NO) AS UPD_NM
@@ -1106,41 +1106,32 @@
 	<!-- 상품 고시 정보  저장 -->
 	<update id="saveGoodsNotiInfo" parameterType="GoodsNotiInfo">
 		/* TsaGoods.saveGoodsNotiInfo */
-		MERGE INTO TB_GOODS_NOTI_INFO
-		USING DUAL
-		ON    (
-		       GOODS_CD = #{goodsCd}
-		   AND NI_CLSF_CD = #{niClsfCd}
-		   AND NI_ITEM_CD = #{niItemCd}
-		      )
-		WHEN MATCHED THEN
-		    UPDATE
-		    SET NI_CONTENT = #{niContent}
-		      , UPD_ID = #{updId}
-		      , UPD_DT = SYSDATE
-		WHEN NOT MATCHED THEN
-		    INSERT (
-		           GOODS_CD
-		         , NI_CLSF_CD
-		         , NI_ITEM_CD
-		         , NI_CONTENT
-		         , DISP_ORD
-		         , REG_ID
-		         , REG_DT
-		         , UPD_ID
-		         , UPD_DT
-		    )
-		    VALUES (
-		           #{goodsCd}
-		         , #{niClsfCd}
-		         , #{niItemCd}
-		         , #{niContent}
-		         , #{dispOrd}
-		         , #{regId}
-		         , SYSDATE
-		         , #{updId}
-		         , SYSDATE
-		    )
+		INSERT INTO TB_GOODS_NOTI_INFO(
+		       GOODS_CD
+		     , NI_CLSF_CD
+		     , NI_ITEM_CD
+		     , NI_CONTENT
+		     , DISP_ORD
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{goodsCd}
+		     , #{niClsfCd}
+		     , #{niItemCd}
+		     , #{niContent}
+		     , #{dispOrd}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       NI_CONTENT = #{niContent}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
 	</update>
 	
 	<!-- 코디 상품 목록 조회  -->
@@ -1184,6 +1175,7 @@
 		SELECT #{goodsCd} AS GOODS_CD
 		     , A.GOODS_CD AS COMPS_GOODS_CD
 		     , A.OPT_CD
+		     , CONCAT(A.OPT_NM1,  NVL2(A.OPT_NM2, CONCAT('/', A.OPT_NM2), '')) AS OPT_NM 
 		     , A.OPT_NM1
 		     , A.OPT_NM2
 		     , A.BASE_STOCK_QTY
@@ -1192,6 +1184,7 @@
 		     , GREATEST(GREATEST(A.CURR_STOCK_QTY - A.BASE_STOCK_QTY, 0) - IFNULL(B.STOCK_QTY, 0), 0) AS ABLE_STOCK_QTY
 		     , A.SOLDOUT_YN
 		     , A.DISP_ORD
+		     , A.DISP_YN
 		     , COUNT(*) OVER(PARTITION BY A.GOODS_CD ) AS RCOUNT
 		     , ROW_NUMBER() OVER(PARTITION BY A.GOODS_CD ORDER BY A.DISP_ORD) AS RNUM
 		FROM  TMP_GOODS C 
@@ -1213,4 +1206,237 @@
 		ORDER BY C.DISP_ORD, A.DISP_ORD
 	</select>
 	
+	<!-- 구성상품 목록 -->
+	<select id="getGoodsDetailComposeList" parameterType="Goods" resultType="GoodsCompose">
+		/* TsaGoods.getGoodsDetailComposeList */
+		SELECT A.GOODS_CD
+		     , A.GOODS_TYPE
+		     , FN_GET_CODE_NM('G056', A.GOODS_TYPE) AS GOODS_TYPE_NM
+		     , A.COMPS_GOODS_CD
+		     , B.GOODS_NM AS COMPS_GOODS_NM
+		     , A.DISP_ORD
+		     , A.QTY
+		     , A.COMPS_CURR_PRICE
+		     , A.COMPS_GOODS_OPT_NM
+		     , A.BASE_YN
+		     , A.USE_YN
+		     , B.CURR_PRICE
+		     , B.GOODS_STAT
+		     , B.SELF_GOODS_YN
+		     , B.SUPPLY_COMP_CD
+		     , I.IMG_PATH1
+		     , I.IMG_PATH6
+		     , I.IMG_TYPE
+		     , A.REG_NO
+		     , FN_GET_USER_NM(A.REG_NO) AS UPD_NM
+		     , DATE_FORMAT(A.REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		     , A.UPD_NO
+		     , FN_GET_USER_NM(A.UPD_NO) AS UPD_NM
+		     , DATE_FORMAT(A.UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
+		FROM TB_GOODS_COMPOSE A
+		INNER JOIN  TB_GOODS B ON A.COMPS_GOODS_CD = B.GOODS_CD
+		LEFT OUTER JOIN TB_GOODS_IMG I ON A.COMPS_GOODS_CD = I.GOODS_CD
+		WHERE A.GOODS_CD = #{goodsCd}
+		ORDER BY A.DISP_ORD 
+	</select>
+	
+	<!-- 상품 기본 정보 수정 -->
+	<update id="updateGoods" parameterType="Goods">
+		/* TsaGoods.updateGoods */
+		UPDATE TB_GOODS
+		SET GOODS_TNM = #{goodsTnm}
+		  , GOODS_NM = #{goodsNm}
+		  , SEASON_CD = #{seasonCd}
+		  , SEX_GB = #{sexGb}
+		  , CURR_PRICE = #{currPrice}
+		  <if test="currBprice != null and currBprice != ''">
+		  , CURR_BPRICE = #{currBprice}
+		  , PRICE_UPD_DT = NOW()
+		  </if>
+		  , DC_RATE = #{dcRate}
+		  , GOODS_STAT = #{goodsStat}
+		  , GOODS_GB = #{goodsGb}
+		  , MIN_ORD_AMT = #{minOrdAmt}
+		  , PNT_PRATE = #{pntPrate}
+		  , PNT_MRATE = #{pntMrate}
+		  , FORMAL_GB = #{formalGb}
+		  , MIN_ORD_QTY = #{minOrdQty}
+		  , MAX_ORD_QTY = #{maxOrdQty}
+		  , DAY_MAX_ORD_QTY = #{dayMaxOrdQty}
+		  , ERP_STOCK_LINK_YN = #{erpStockLinkYn}
+		  , GOODS_SNM1 = #{goodsSnm1}
+		  , SELF_MALL_YN = #{selfMallYn}
+		  , GOODS_SNM = #{goodsSnm}
+		  , FRST_CFRM_DT = (CASE #{chGoodsStatYn} WHEN 'Y' THEN NVL2(FRST_CFRM_DT, NOW(), FRST_CFRM_DT)
+		                                          ELSE FRST_CFRM_DT END)
+		  , PRE_PPNT_USABLE_YN = #{prePpntUsableYn}
+		  , PRE_MPNT_USABLE_YN = #{preMpntUsableYn}
+		  , UPD_NO = #{updNo}
+		  , UPD_DT = NOW()
+		WHERE GOODS_CD = #{goodsCd}
+	</update>
+	
+	<!-- 상품 상세정보 삭제 -->
+	<delete id="deleteGoodsDesc" parameterType="GoodsDesc">
+		/* TsaGoods.deleteGoodsDesc */
+		DELETE TB_GOODS_DESC
+		WHERE GOODS_CD = #{goodsCd}
+		AND DESC_GB = #{descGb}
+	</delete>
+	
+	<!-- 상품 상세정보 등록 -->
+	<insert id="createGoodsDesc" parameterType="GoodsDesc">
+		/* TsaGoods.createGoodsDesc */
+		INSERT INTO TB_GOODS_DESC (
+		    GOODS_CD
+		  , DESC_GB
+		  , SEQ
+		  , GOODS_DESC
+		  , REG_NO
+		  , REG_DT
+		)
+		VALUES(
+		    #{goodsCd}
+		  , #{descGb}
+		  , #{seq}
+		  , REPLACE(#{goodsDesc},'char(13)', CONCAT(char(13),char(10))
+		  , #{regNo}
+		  , NOW()
+		)
+	</insert>
+	
+	<!-- 구상 상품등록/저장 -->
+	<insert id="saveGoodsCompose" parameterType="GoodsCompose">
+		/* TsaGoods.saveGoodsCompose */
+		INSERT INTO TB_GOODS_COMPOSE (
+		           GOODS_CD
+		         , COMPS_GOODS_CD
+		         , GOODS_TYPE
+		         , DISP_ORD
+		         , QTY
+		         , COMPS_CURR_PRICE
+		         , COMPS_GOODS_OPT_NM
+		         , BASE_YN
+		         , USE_YN
+		         , REG_NO
+		         , REG_DT
+		         , UPD_NO
+		         , UPD_DT
+		    )
+		    VALUES (
+		           #{goodsCd}
+		         , #{compsGoodsCd}
+		         , #{goodsType}
+		         , #{dispOrd}
+		         , #{qty}
+		         , (CASE WHEN #{goodsType} = 'S' THEN #{compsCurrPrice}
+		                ELSE 0 END)
+		         , #{compsGoodsOptNm}
+		         , #{baseYn}
+		         , #{useYn}
+		         , #{regNo}
+		         , NOW()
+		         , #{updNo}
+		         , NOW()
+		    )
+		ON DUPLICATE KEY UPDATE 
+		           DISP_ORD = #{dispOrd}
+		         , COMPS_GOODS_OPT_NM = #{compsGoodsOptNm}
+		         , USE_YN = #{useYn}
+		         , UPD_NO = #{updNo}
+		         , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 상품 옵션/재고 정보 이력생성 -->
+	<insert id="createStockHst" parameterType="Option">
+	/* TsaGoods.createStockHst */
+		INSERT INTO TB_OPTION_HST 
+		(     OPTION_HST_SQ
+		    , GOODS_CD
+		    , OPT_CD
+		    , OPT_NM1
+		    , OPT_NM2
+		    , BASE_STOCK_QTY
+		    , CURR_STOCK_QTY
+		    , ADD_PRICE
+		    , SOLDOUT_YN
+		    , DISP_ORD
+		    , DISP_YN
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		)
+		SELECT NULL
+		     , GOODS_CD
+		     , OPT_CD
+		     , OPT_NM1
+		     , OPT_NM2
+		     , BASE_STOCK_QTY
+		     , CURR_STOCK_QTY
+		     , ADD_PRICE
+		     , SOLDOUT_YN
+		     , DISP_ORD
+		     , DISP_YN
+		     , #{regNo}
+		     , NOW()
+		     , UPD_NO
+		     , UPD_DT
+		FROM TB_OPTION
+		WHERE GOODS_CD = #{goodsCd}
+		<if test='optCd != null and optCd != ""'>
+		AND OPT_CD = #{optCd}
+		</if>
+	</insert>
+	
+	<!-- 상품 옵션/재고 정보 저장 -->
+	<update id="saveStock" parameterType="Option">
+		/* TsaGoods.saveStock */
+		INSERT INTO TB_OPTION(
+		       GOODS_CD
+		     , OPT_CD
+		     , OPT_NM1
+		     , OPT_NM2
+		     , BASE_STOCK_QTY
+		     , CURR_STOCK_QTY
+		     , ADD_PRICE
+		     , SOLDOUT_YN
+		     , DISP_ORD
+		     , DISP_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{goodsCd}
+		     , #{optCd}
+		     , #{optNm1}
+		     , #{optNm2}
+		     , #{baseStockQty}
+		     , #{currStockQty}
+		     , #{addPrice}
+		     , #{soldoutYn}
+		     , #{dispOrd}
+		     , #{dispYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE 
+		        BASE_STOCK_QTY = #{baseStockQty}
+		      , OPT_NM1 = #{optNm1}
+		      , OPT_NM2 = #{optNm2}
+		      , ADD_PRICE = #{addPrice}
+		      , SOLDOUT_YN = #{soldoutYn}
+		      , DISP_ORD = #{dispOrd}
+		      , DISP_YN = #{dispYn}
+		      , UPD_NO = #{updNo}
+		      , UPD_DT = NOW()
+		      <if test='selfGoodsYn != null and selfGoodsYn == "N"'>
+		      , CURR_ON_STOCK_QTY = #{currOnStockQty}
+		      </if>
+	</update>
+	
 </mapper>

+ 155 - 209
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html

@@ -34,7 +34,7 @@
 				<input type="hidden" id="uploadGoodsUrl" name="uploadGoodsUrl" th:value="${@environment.getProperty('upload.goods.view')}"/>
 				<input type="hidden" id="goodsType" name="goodsType" />
 				<input type="hidden" id="extmallGoodsPriceList" name="extmallGoodsPriceList" />
-				<input type="hidden" id="goodsExtendList" name="goodsExtendList" />
+				<input type="hidden" id="GoodsComposeList" name="GoodsComposeList" />
 				<table class="frmStyle">
 					<colgroup>
 						<col width="11%"/>
@@ -77,7 +77,7 @@
 							<li><a href="#goodstab3">상품상세정보</a></li>
 							<li id="goodsNotiTab"><a href="#goodstab4">고시정보</a></li>
 							<li id="goodsCodiTab"><a href="#goodstab5">코디상품</a></li>
-							<li id="goodsExtendTab" style="display:none;"><a href="#goodstab6">구성상품</a></li>
+							<li id="GoodsComposeTab" style="display:none;"><a href="#goodstab6">구성상품</a></li>
 							<li><a href="#goodstab7">변경이력</a></li>
 						</ul>
 					</div>
@@ -212,9 +212,9 @@
 										<td><span id="sellFeeRateTxt"></span> %</td>
 										<th>자사몰 노출여부<em class="required" title="필수"></em></th>
 										<td>
-											<label class="rdoBtn"><input type="radio" name="dispYn" id="dispYnY" value="Y"  checked/>Y</label>
-											<label class="rdoBtn"><input type="radio" name="dispYn" id="dispYnn" value="N"/>N</label>
-											<input type="hidden" id="dispYnOrg" name="dispYnOrg"/>
+											<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>
+											<input type="hidden" id="selfMallYnOrg" name="selfMallYnOrg"/>
 										</td>
 									</tr>
 									<tr>
@@ -312,13 +312,6 @@
 												<td><label class="chkBox"><input type="checkbox" name="chkDescKeep" checked="checked" value="Y">정보유지<span></span></label>
 												</td>
 											</tr>
-											<!-- <tr>
-												<th>상세</th>
-												<td><div class="tabJrContArea">
-													<textarea name="goodsDesc" id="goodsDesc" rows="5" cols="50"  style="width:1050px; height: 180px;"></textarea>
-													</div>
-												</td>
-											</tr> -->
 											<tr>
 												<th>상위(PC)</th>
 												<td><div class="tabJrContArea">
@@ -410,12 +403,12 @@
 							<!-- TAB6 CONTENTS AREA -->
 							<div class="panelStyle">
 								<!-- 내용 삽입 -->
-								<div class="padB20 aR" id="goodsExtendBtnArea">
+								<div class="padB20 aR" id="GoodsComposeBtnArea">
 									<button type="button" class="btn btn-default btn-lg" onclick="cfnDownloadSampleFile('SF003');">양식다운로드</button>
 									<button type="button" class="btn btn-success btn-lg" id="btnGoodsDealSearchExcel">엑셀조회</button>
 									<button type="button" class="btn btn-base btn-lg" onclick="fnOpenGoodsDetailPopup()">상품조회</button>
 								</div>
-								<div id="gridGoodsExtendList" style="height: 550px;" class="ag-theme-balham lh60"></div>
+								<div id="gridGoodsComposeList" style="height: 550px;" class="ag-theme-balham lh60"></div>
 								<!-- 내용 삽입 -->
 							</div>
 							<!-- //TAB6 CONTENTS AREA -->
@@ -508,13 +501,13 @@
 			}
 		},
 		{headerName: "재고연동여부", field: "erpStockLinkYn" , width: 100, cellClass: 'text-center'},
-		{headerName: "자사몰노출여부", field: "dispYn" , width: 120, cellClass: 'text-center'},
+		{headerName: "자사몰노출여부", field: "selfMallYn" , width: 120, cellClass: 'text-center'},
 		{headerName: "사용자검색어", field: "goodsSnm1" , width: 150, cellClass: 'text-left'},
 		{headerName: "검색어", field: "goodsSnm" , width: 450, cellClass: 'text-left', tooltipField: "goodsSnm"}
 	];
 	
 	// specify the columns - 구성상품
-	var columnGoodsExtendDefs = [
+	var columnGoodsComposeDefs = [
 		{headerName: "정렬", field: "dispOrd", width: 70 ,hide: false, cellClass: 'text-center',  rowDrag: true },
 		{headerName: "CRUD", field: "crud", width: 75, minWidth: 75, hide: true},
 		//{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
@@ -550,7 +543,7 @@
 		{headerName: "판매가", field: "currPrice" , width: 100, cellClass: 'text-right'
 			,valueFormatter: function(params) { return Number(params.value).addComma();}
 		},
-		{headerName: "상품판매가", field: "extendCurrPrice" , width: 150, cellClass: 'text-right'
+		{headerName: "상품판매가", field: "compsCurrPrice" , width: 150, cellClass: 'text-right'
 			,valueFormatter: function(params) { return Number(params.value).addComma();}
 		},
 		{headerName: "기준여부(품목-카테고리)", field: "baseYn", width: 180, cellClass: 'text-center'},
@@ -634,22 +627,22 @@
 	gridGoodsHstoryOptions.enableBrowserTooltips = true;
 	var gridCodiGoodsOptions = gagaAgGrid.getGridOptions(columnCodiGoodsDefs);
 	gridCodiGoodsOptions.enableBrowserTooltips = true;
-	var gridGoodsExtendOptions = gagaAgGrid.getGridOptions(columnGoodsExtendDefs);
-	gridGoodsExtendOptions.enableBrowserTooltips = true;
+	var gridGoodsComposeOptions = gagaAgGrid.getGridOptions(columnGoodsComposeDefs);
+	gridGoodsComposeOptions.enableBrowserTooltips = true;
 	// 드래그
-	gridGoodsExtendOptions.suppressRowClickSelection = true;
-	gridGoodsExtendOptions.rowDragManaged = true;
-	//gridGoodsExtendOptions.rowDeselection = true;
-	//gridGoodsExtendOptions.enableMultiRowDragging = true;
-	//gridGoodsExtendOptions.rowSelection = 'multiple';
+	gridGoodsComposeOptions.suppressRowClickSelection = true;
+	gridGoodsComposeOptions.rowDragManaged = true;
+	//gridGoodsComposeOptions.rowDeselection = true;
+	//gridGoodsComposeOptions.enableMultiRowDragging = true;
+	//gridGoodsComposeOptions.rowSelection = 'multiple';
 	gridCodiGoodsOptions.suppressRowClickSelection = true;
 	gridCodiGoodsOptions.rowDragManaged = true;
 	
-	gridGoodsExtendOptions.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
+	gridGoodsComposeOptions.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
 	gridCodiGoodsOptions.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
 	
 	//기준여부 표시
-	gridGoodsExtendOptions.getRowStyle = function(params) {
+	gridGoodsComposeOptions.getRowStyle = function(params) {
 		if ("Y" == params.data.baseYn) {
 			return { background: '#1ab394' };
 		}
@@ -741,10 +734,10 @@
 			}else{
 				$("#goodsDetailForm input:radio[name=erpPriceLinkYn]:input[value='N']").trigger('click');
 			}
-			if (result.dispYn == "Y"){
-				$("#goodsDetailForm input:radio[name=dispYn]:input[value='Y']").trigger('click');
+			if (result.selfMallYn == "Y"){
+				$("#goodsDetailForm input:radio[name=selfMallYn]:input[value='Y']").trigger('click');
 			}else{
-				$("#goodsDetailForm input:radio[name=dispYn]:input[value='N']").trigger('click');
+				$("#goodsDetailForm input:radio[name=selfMallYn]:input[value='N']").trigger('click');
 			}
 			$('#goodsDetailForm').find('#sellFeeRateTxt').html(result.sellFeeRate);
 			
@@ -766,7 +759,7 @@
 
 			$("#goodsDetailForm input[name=formalGbOrg]").val(result.formalGb);
 			$("#goodsDetailForm input[name=erpPriceLinkYnOrg]").val(result.erpPriceLinkYn);
-			$("#goodsDetailForm input[name=dispYnOrg]").val(result.dispYn);
+			$("#goodsDetailForm input[name=selfMallYnOrg]").val(result.selfMallYn);
 			$("#goodsDetailForm input[name=prePpntUsableYnOrg]").val(result.prePpntUsableYn);
 			$("#goodsDetailForm input[name=preMpntUsableYnOrg]").val(result.preMpntUsableYn);
 			$("#goodsDetailForm input[name=changeableYnOrg]").val(result.changeableYn);
@@ -859,12 +852,12 @@
 			//세트
 			if ("G056_S" == result.goodsType){
 				$('#goodsDetailForm #erplinkarea').addClass('off');
-				if (result.selfGoodsYn == "Y") $('#goodsDetailForm #goodsExtendTab').css('display','block');
+				if (result.selfGoodsYn == "Y") $('#goodsDetailForm #GoodsComposeTab').css('display','block');
 				$('#goodsDetailForm #goodsNotiTab').css('display','none');
 			}else if ("G056_D" == result.goodsType){
 				$('#goodsDetailForm #erplinkarea').addClass('off');
 				$('#goodsDetailForm #erplinkarea').addClass('off');
-				if (result.selfGoodsYn == "Y") $('#goodsDetailForm #goodsExtendTab').css('display','block');
+				if (result.selfGoodsYn == "Y") $('#goodsDetailForm #GoodsComposeTab').css('display','block');
 				$('#goodsDetailForm #goodsNotiTab').css('display','none');
 			}
 			
@@ -888,7 +881,7 @@
 			
 			//구성상품
 			if ("G056_S" == result.goodsType || "G056_D" == result.goodsType){
-				fnGoodsExtendListSearch(params);
+				fnGoodsComposeListSearch(params);
 			}
 			//이력
 			fnGoodsDetailHstSearch();
@@ -907,18 +900,18 @@
 	}
 	
 	//구성상품
-	var fnGoodsExtendListSearch = function(params) {
+	var fnGoodsComposeListSearch = function(params) {
 		if ("G056_S" == params.goodsType){	//세트
-			gagaAgGrid.showOrHideColumn(gridGoodsExtendOptions, 'currPrice', false);
-			gagaAgGrid.showOrHideColumn(gridGoodsExtendOptions, 'useYn', false);
-			gagaAgGrid.showOrHideColumn(gridGoodsExtendOptions, 'extendGoodsOptNm', false);
+			gagaAgGrid.showOrHideColumn(gridGoodsComposeOptions, 'currPrice', false);
+			gagaAgGrid.showOrHideColumn(gridGoodsComposeOptions, 'useYn', false);
+			gagaAgGrid.showOrHideColumn(gridGoodsComposeOptions, 'extendGoodsOptNm', false);
 			
-			$('#goodsExtendBtnArea').addClass("off");
+			$('#GoodsComposeBtnArea').addClass("off");
 		}else{	//딜
-			gagaAgGrid.showOrHideColumn(gridGoodsExtendOptions, 'qty', false);
-			gagaAgGrid.showOrHideColumn(gridGoodsExtendOptions, 'extendCurrPrice', false);
+			gagaAgGrid.showOrHideColumn(gridGoodsComposeOptions, 'qty', false);
+			gagaAgGrid.showOrHideColumn(gridGoodsComposeOptions, 'extendcompsCurrPrice', false);
 		}
-		gagaAgGrid.fetch("/goods/detail/extend/list?goodsCd=" + params.goodsCd , gridGoodsExtendOptions);
+		gagaAgGrid.fetch("/goods/detail/compose/list?goodsCd=" + params.goodsCd , gridGoodsComposeOptions);
 	}	
 	
 	//이력
@@ -983,10 +976,10 @@
 	var fnCurrPriceCheck = function(){
 		var dcRate = 0;
 
-		var tagPrice = $("#goodsDetailForm input[name=tagPrice]").val().removeComma();
+		var listPrice = $("#goodsDetailForm input[name=listPrice]").val().removeComma();
 		var currPrice = $("#goodsDetailForm input[name=currPrice]").val().removeComma();
-		//dcRate = Math.round(100 - Math.floor((Number(currPrice) / Number(tagPrice) * 100)*100)/100);
-		dcRate = 100 - (Number((Number(currPrice) / Number(tagPrice)).toFixed(2)) *100)
+		//dcRate = Math.round(100 - Math.floor((Number(currPrice) / Number(listPrice) * 100)*100)/100);
+		dcRate = 100 - (Number((Number(currPrice) / Number(listPrice)).toFixed(2)) *100)
 
 		$("#goodsDetailForm").find("#dcRateTxt").html(dcRate);
 		$("#goodsDetailForm input[name=dcRate]").val(dcRate);
@@ -997,10 +990,10 @@
 	/* var fnCurrPriceCheck_org = function(){
 		var dcRate = 0;
 
-		var tagPrice = $("#goodsDetailForm input[name=tagPrice]").val().removeComma();
+		var listPrice = $("#goodsDetailForm input[name=listPrice]").val().removeComma();
 		var currPrice = $("#goodsDetailForm input[name=currPrice]").val().removeComma();
-		//dcRate = Math.round(100 - Math.floor((Number(currPrice) / Number(tagPrice) * 100)*100)/100);
-		dcRate = 100 - (Number((Number(currPrice) / Number(tagPrice)).toFixed(2)) *100)
+		//dcRate = Math.round(100 - Math.floor((Number(currPrice) / Number(listPrice) * 100)*100)/100);
+		dcRate = 100 - (Number((Number(currPrice) / Number(listPrice)).toFixed(2)) *100)
 
 		if (dcRate < 0){
 			mcxDialog.alert('할인율이 0보다 작습니다.\n판매가를 확인해주세요.', function(){
@@ -1105,8 +1098,8 @@
 				}
 				
 			}
-			//teg가 등록되지 않은 상품은 상태변경 불가
-			if(Number($("#goodsDetailForm input[name=tagPrice]").val()) == 0){
+			//list가 등록되지 않은 상품은 상태변경 불가
+			if(Number($("#goodsDetailForm input[name=listPrice]").val()) == 0){
 				mcxDialog.alertC("TAG가 등록되지 않은 상품은 '승인대기'나 '승인완료' 상태로 변경할 수 없습니다.", {
 					sureBtnText: "확인",
 					sureBtnClick: function() {
@@ -1150,7 +1143,7 @@
 			}
 
 			//고시정보가 등록되지 않은 상품은 상태변경 불가 - 일반상품만 체크
-			if ("N" == $("#goodsDetailForm input[name=goodsType]").val()){
+			if ("G056_N" == $("#goodsDetailForm input[name=goodsType]").val()){
 				if($("#goodsDetailForm #notiArea").find("#infoContents tr").length == 0){
 					mcxDialog.alertC("고시정보가 등록되지 않은 상품은 '승인대기'나 '승인완료' 상태로 변경할 수 없습니다.", {
 						sureBtnText: "확인",
@@ -1245,6 +1238,17 @@
 			});
 		} */
 
+		//정상가와 판매가 비교
+		if(Number($("#goodsDetailForm input[name=listPrice]").val().removeComma()) < Number($("#goodsDetailForm input[name=currPrice]").val().removeComma())) {
+			mcxDialog.alertC("판매가를 올바르게 입력해주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=currPrice]").focus();
+				}
+			});
+			return false;
+		}
+		
 		// 포인트
 		if ( gagajf.isNull($("#goodsDetailForm input[name=pntPrate]").val())) {
 			mcxDialog.alertC("PC 포인트를 입력해 주세요.", {
@@ -1302,6 +1306,24 @@
 			});
 			return false;
 		}
+		if ( gagajf.isNull($("#goodsDetailForm input[name=dayMaxOrdQty]").val())) {
+			mcxDialog.alertC("ID당1일최대구매 수량을 입력해 주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=dayMaxOrdQty]").focus();
+				}
+			});
+			return false;
+		}
+		if (Number($("#goodsDetailForm input[name=dayMaxOrdQty]").val()) <= 0) {
+			mcxDialog.alertC("ID당1일최대구매 수량을 입력해 주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=dayMaxOrdQty]").focus();
+				}
+			});
+			return false;
+		}
 
 		if(Number($("#goodsDetailForm input[name=minOrdQty]").val()) > Number($("#goodsDetailForm input[name=maxOrdQty]").val())){
 			mcxDialog.alertC("최소주문수량은 최대주문수량보다 클 수 없습니다.", {
@@ -1312,6 +1334,16 @@
 			});
 			return false;
 		}
+		
+		if(Number($("#goodsDetailForm input[name=maxOrdQty]").val()) > Number($("#goodsDetailForm input[name=dayMaxOrdQty]").val())){
+			mcxDialog.alertC("최대주문수량이 ID당1일최대구매수량보다 클 수 없습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm input[name=maxOrdQty]").focus();
+				}
+			});
+			return false;
+		}
 
 		// 무료배송비
 		if ( gagajf.isNull($("#goodsDetailForm input[name=minOrdAmt]").val())) {
@@ -1341,29 +1373,21 @@
 		$("#goodsDetailForm input[name=chStockDataYn]").val('N');
 
 		$("#optionList tr").each(function() {
-			var sizeNm = $(this).find("input[name=sizeNm]").val();
-			var hidSizeNm = $(this).find("input[name=hidSizeNm]").val();
-			var baseOnStockQty = $(this).find("input[name=baseOnStockQty]").val();
-			var hidBaseOnStockQty = $(this).find("input[name=hidBaseOnStockQty]").val();
-			var baseOffStockQty = $(this).find("input[name=baseOffStockQty]").val();
-			var hidBaseOffStockQty = $(this).find("input[name=hidBaseOfftockQty]").val();
-			var baseShopStockQty = $(this).find("input[name=baseShopStockQty]").val();
-			var hidBaseShopStockQty = $(this).find("input[name=hidBaseShopStockQty]").val();
-			var basePcStockQty = $(this).find("input[name=basePcStockQty]").val();
-			var hidBasePcStockQty = $(this).find("input[name=hidBasePcStockQty]").val();
-			var baseMoStockQty = $(this).find("input[name=baseMoStockQty]").val();
-			var hidBaseMoStockQty = $(this).find("input[name=hidBaseMotockQty]").val();
-			var baseAppStockQty = $(this).find("input[name=baseAppStockQty]").val();
-			var hidBaseAppStockQty = $(this).find("input[name=hidBaseAppStockQty]").val();
+			var optNm1 = $(this).find("input[name=optNm1]").val();
+			var optNm2 = $(this).find("input[name=optNm2]").val();
+			var hidOptNm1 = $(this).find("input[name=hidOptNm1]").val();
+			var hidOptNm2 = $(this).find("input[name=hidOptNm2]").val();
+			var baseStockQty = $(this).find("input[name=baseStockQty]").val();
+			var hidBaseStockQty = $(this).find("input[name=hidBaseStockQty]").val();
 			var dispOrd = $(this).find("input[name=dispOrd]").val();
 			var hidDispOrd = $(this).find("input[name=hidDispOrd]").val();
+			var dispYn = $(this).find("select[name=dispYn]").val();
+			var hidDispYn = $(this).find("input[name=hidDispYn]").val();
 			var soldoutYn = $(this).find("select[name=soldoutYn]").val();
 			var hidSoldoutYn = $(this).find("input[name=hidSoldoutYn]").val();
-			var hidSoldoutDt = $(this).find("input[name=hidSoldoutDt]").val();
-			var hidSoldoutDt3day = $(this).find("input[name=hidSoldoutDt3day]").val();
 
-			var editCurrOnStockQty = $(this).find("input[name=editCurrOnStockQty]").val();	// 입점 확인용
-			var currOnStockQty = $(this).find("input[name=currOnStockQty]").val();	// 입점 확인용 (hidden)
+			var editCurrStockQty = $(this).find("input[name=editCurrStockQty]").val();	// 입점 확인용
+			var currStockQty = $(this).find("input[name=currStockQty]").val();	// 입점 확인용 (hidden)
 			
 			if(gagajf.isNull(dispOrd)){
 				optCheck = true;
@@ -1393,141 +1417,57 @@
 			// 입점만 체크
 			if ("N" == $('#goodsDetailForm input[name=selfGoodsYn]').val()){
 				
-				if(gagajf.isNull(editCurrOnStockQty)){
+				if(gagajf.isNull(editCurrStockQty)){
 					optCheck = true;
-					mcxDialog.alertC("온라인 재고를 입력해주세요", {
+					mcxDialog.alertC("가용재고를 입력해주세요", {
 						sureBtnText: "확인",
 						sureBtnClick: function() {
-							$("#optionList tr").find("input[name=editCurrOnStockQty]").eq(idx).focus();
+							$("#optionList tr").find("input[name=editCurrStockQty]").eq(idx).focus();
 						}
 					});
 					return false;
 				}
 			}
 			
-			if(gagajf.isNull(baseOnStockQty)){
-				optCheck = true;
-				mcxDialog.alertC("온라인 안전재고를 입력해주세요", {
-					sureBtnText: "확인",
-					sureBtnClick: function() {
-						$("#optionList tr").find("input[name=baseOnStockQty]").eq(idx).focus();
-					}
-				});
-				return false;
-			}
-			
-			if(gagajf.isNull(baseOffStockQty)){
-				optCheck = true;
-				mcxDialog.alertC("오프라인 안전재고를 입력해주세요", {
-					sureBtnText: "확인",
-					sureBtnClick: function() {
-						$("#optionList tr").find("input[name=baseOffStockQty]").eq(idx).focus();
-					}
-				});
-				return false;
-			}
-			
-			if(gagajf.isNull(baseShopStockQty)){
-				optCheck = true;
-				mcxDialog.alertC("직송 안전재고를 입력해주세요", {
-					sureBtnText: "확인",
-					sureBtnClick: function() {
-						$("#optionList tr").find("input[name=baseShopStockQty]").eq(idx).focus();
-					}
-				});
-				return false;
-			}
-			
-			if(gagajf.isNull(basePcStockQty)){
-				optCheck = true;
-				mcxDialog.alertC("PC 안전재고를 입력해주세요", {
-					sureBtnText: "확인",
-					sureBtnClick: function() {
-						$("#optionList tr").find("input[name=basePcStockQty]").eq(idx).focus();
-					}
-				});
-				return false;
-			}
-			
-			if(gagajf.isNull(baseMoStockQty)){
+			if(gagajf.isNull(baseStockQty)){
 				optCheck = true;
-				mcxDialog.alertC("모바일 안전재고를 입력해주세요", {
+				mcxDialog.alertC("안전재고를 입력해주세요", {
 					sureBtnText: "확인",
 					sureBtnClick: function() {
-						$("#optionList tr").find("input[name=baseMoStockQty]").eq(idx).focus();
+						$("#optionList tr").find("input[name=baseStockQty]").eq(idx).focus();
 					}
 				});
 				return false;
 			}
 			
-			if(gagajf.isNull(baseAppStockQty)){
-				optCheck = true;
-				mcxDialog.alertC("APP 안전재고를 입력해주세요", {
-					sureBtnText: "확인",
-					sureBtnClick: function() {
-						$("#optionList tr").find("input[name=baseAppStockQty]").eq(idx).focus();
-					}
-				});
-				return false;
-			}
-
-			// 품절로 인한 soldout은 3일(당일 포함)동안 품절 풀 수 없음
-			if (soldoutYn != hidSoldoutYn && hidSoldoutYn == "Y" && !gagajf.isNull(hidSoldoutDt)){
-				var date = new Date();
-				var after3Day = date.before(0, 0, 3).format("YYYYMMDD");
-				if (hidSoldoutDt > after3Day) {
-					optCheck = true;
-					mcxDialog.alertC("주문품절로 인한 품절건은 "+hidSoldoutDt3day+" 에 수정할 수 있습니다.", {
-						sureBtnText: "확인",
-						sureBtnClick: function() {
-							$("#optionList tr").find("select[name=soldoutYn]").eq(idx).focus();
-						}
-					});
-					return false;
-				}
-			}
-
-			if (sizeNm != hidSizeNm){
-				$("#goodsDetailForm input[name=chStockDataYn]").val('Y');
-			}
-			
-			if (editCurrOnStockQty != currOnStockQty){
-				$("#goodsDetailForm input[name=chStockDataYn]").val('Y');
-			}
-			
-			if (baseOnStockQty != hidBaseOnStockQty){
+			if (optNm1 != hidOptNm1){
 				$("#goodsDetailForm input[name=chStockDataYn]").val('Y');
 			}
 			
-			if (baseOffStockQty != hidBaseOffStockQty){
+			if (optNm2 != hidOptNm2){
 				$("#goodsDetailForm input[name=chStockDataYn]").val('Y');
 			}
 			
-			if (baseShopStockQty != hidBaseShopStockQty){
+			if (editCurrStockQty != currStockQty){
 				$("#goodsDetailForm input[name=chStockDataYn]").val('Y');
 			}
 			
-			if (basePcStockQty != hidBasePcStockQty){
+			if (baseStockQty != hidBaseStockQty){
 				$("#goodsDetailForm input[name=chStockDataYn]").val('Y');
 			}
 			
-			if (baseMoStockQty != hidBaseMoStockQty){
-				$("#goodsDetailForm input[name=chStockDataYn]").val('Y');
-			}
-			
-			if (baseAppStockQty != hidBaseAppStockQty){
+			if (dispOrd != hidDispOrd){
 				$("#goodsDetailForm input[name=chStockDataYn]").val('Y');
 			}
 
-			if (dispOrd != hidDispOrd){
+			if (dispYn != hidDispYn){
 				$("#goodsDetailForm input[name=chStockDataYn]").val('Y');
 			}
-
+			
 			if (soldoutYn != hidSoldoutYn){
 				$("#goodsDetailForm input[name=chStockDataYn]").val('Y');
 			}
 
-			//$(this).find("input[name=currStockQty]").val(editCurrStockQty);	//DB 저장을 위해
 			idx++;
 		});
 
@@ -1536,11 +1476,9 @@
 		}
 
 		var dcRate = 0;
-		var tagPrice = $("#goodsDetailForm input[name=tagPrice]").val().removeComma();
+		var listPrice = $("#goodsDetailForm input[name=listPrice]").val().removeComma();
 		var currPrice = $("#goodsDetailForm input[name=currPrice]").val().removeComma();
-		dcRate =  100 - Math.floor(Number(currPrice) / Number(tagPrice) * 100);	//절사
-		//dcRate = 100 - Math.floor(Number((Number(currPrice) / Number(tagPrice)).toFixed(2)) *100);
- 
+		dcRate =  100 - Math.floor(Number(currPrice) / Number(listPrice) * 100);	//절사
 			
 		if (dcRate < 0){
 			mcxDialog.alertC('할인율이 0보다 작습니다.\n판매가를 확인해주세요.', {
@@ -1551,11 +1489,15 @@
 			});
 			return false;
 		}else if (dcRate >= 90){
-			gagaAlert.confirm("할인율이 90%이상입니다. 계속하시겠습니까?", function(){
-				fnNoticheck();
-			},
-			function(){
-				optCheck = true;
+			mcxDialog.confirmC("할인율이 90%이상입니다. 계속하시겠습니까?", {
+				btn: ["아니요","예"],
+				btnClick: function(index){
+					if (index == 1){
+						optCheck = true;
+					} else {
+						fnNoticheck();
+					}
+				}
 			});
 
 		}else{
@@ -1567,16 +1509,20 @@
 		
 		if (optCheck) return false;
 		
-		if (!fnExtendGoodsCheck()) return false;
+		if (!fnGoodsComposeCheck()) return false;
 		
 		//fnNoticheck();
 
 		if($("#goodsDetailForm input:checkbox[name=chkDescKeep]").is(':checked')){
-			gagaAlert.confirm("'정보유지' 체크박스가 선택되어 있어 '상품상세설명' 항목이 저장되지 않습니다. 저장을 원하시면 체크를 해제하세요. 계속하시겠습니까?", function(){
-				fnGoodsSave();
-			},
-			function(){
-				optCheck = true;
+			mcxDialog.confirmC("'정보유지' 체크박스가 선택되어 있어 '상품상세설명' 항목이 저장되지 않습니다.<br/>저장을 원하시면 체크를 해제하세요. 계속하시겠습니까?", {
+				btn: ["아니요","예"],
+				btnClick: function(index){
+					if (index == 1){
+						optCheck = true;
+					} else {
+						fnGoodsSave();
+					}
+				}
 			});
 		}else{
 			fnGoodsSave();
@@ -1587,13 +1533,13 @@
 		
 	});
 
-	//고시정보 관련 체크
-	var fnExtendGoodsCheck = function(){
+	// 구성 정보 관련 체크
+	var fnGoodsComposeCheck = function(){
 		if ($("#goodsDetailForm input[name=goodsType]").val() == "G056_N"){
 			return true;	
 		}
 		
-		var allData = gagaAgGrid.getAllRowData(gridGoodsExtendOptions);
+		var allData = gagaAgGrid.getAllRowData(gridGoodsComposeOptions);
 		var comSupplyCompCd = '';
 		var comSelfGoodsYn = '';
 		//기준여부 Y  존재하는지 확인
@@ -1611,20 +1557,20 @@
 			
 			if (comSelfGoodsYn != item.selfGoodsYn){
 				optCheck = true;
-				mcxDialog.alertC("구상상품중 자사/입점상품 구분값이 다릅니다.\n확인해 주세요", {
+				mcxDialog.alertC("구상상품중 자사/입점상품 구분값이 다릅니다.<br/>확인해 주세요", {
 					sureBtnText: "확인",
 					sureBtnClick: function() {
-						gridGoodsExtendOptions.api.setFocusedCell(index, "goodsCd", null);
+						gridGoodsComposeOptions.api.setFocusedCell(index, "goodsCd", null);
 					}
 				});	
 				return false;
 			}else{
 				if (comSelfGoodsYn == "N" && (comSupplyCompCd != item.supplyCompCd)){
 					optCheck = true;
-					mcxDialog.alertC("구상상품중 입점은 같은 업체 상품만 가능합니다.\n확인해 주세요", {
+					mcxDialog.alertC("구상상품중 입점은 같은 업체 상품만 가능합니다.<br/>확인해 주세요", {
 						sureBtnText: "확인",
 						sureBtnClick: function() {
-							gridGoodsExtendOptions.api.setFocusedCell(index, "goodsCd", null);
+							gridGoodsComposeOptions.api.setFocusedCell(index, "goodsCd", null);
 						}
 					});	
 					return false;
@@ -1670,8 +1616,8 @@
 				$('#goodsDetailForm input[name=extmallGoodsPriceList]').val(jsonDataPrice); */
 				
 				//구성상품
-				var allData = gagaAgGrid.getAllRowData(gridGoodsExtendOptions);
-				//var allData = gagaAgGrid.getChangedData(gridGoodsExtendOptions);
+				var allData = gagaAgGrid.getAllRowData(gridGoodsComposeOptions);
+				//var allData = gagaAgGrid.getChangedData(gridGoodsComposeOptions);
 				/* var changedData = [];
 
 				$.each(allData, function(idx, item) {
@@ -1680,14 +1626,13 @@
 				}); */
 				
 				var jsonData = JSON.stringify(allData);
-				$('#goodsDetailForm input[name=goodsExtendList]').val(jsonData);
-				
+				$('#goodsDetailForm input[name=GoodsComposeList]').val(jsonData);
 				
 				$('#goodsDetailForm input[name=goodsNm]').val($('#goodsDetailForm input[name=goodsNm]').val().trim().replace(/\n|\r/g, "<br/>").replace(/\"/gi, "&quot;").replace(/\'/gi, "&#39;"));
 				$('#goodsDetailForm input[name=goodsTnm]').val($('#goodsDetailForm input[name=goodsTnm]').val().trim().replace(/\n|\r/g, "<br/>").replace(/\"/gi, "&quot;").replace(/\'/gi, "&#39;"));
 				$('#goodsDetailForm input[name=goodsSnm1]').val($('#goodsDetailForm input[name=goodsSnm1]').val().trim().replace(/\n|\r/g, "<br/>").replace(/\"/gi, "&quot;").replace(/\'/gi, "&#39;"));
 
-				gagajf.ajaxFormSubmit("/goods/detail/save", "#goodsDetailForm", fnGoodsSaveCallBack);  //fnGoodsDeailSearch   fnGoodsDeailNotiSave
+				gagajf.ajaxFormSubmit("/goods/detail/save", "#goodsDetailForm", fnGoodsSaveCallBack); 
 			}
 		});
 	}
@@ -1753,12 +1698,13 @@
 			return true;
 		}
 		//상품정상이월구분
-		if ($("#goodsDetailForm input[name=goodsType]").val() != 'N' || $("#goodsDetailForm input[name=selfGoodsYn]").val() == 'N'){
-			if ($("#goodsDetailForm input[name=formalGbOrg]").val() != $("input:radio[name=formalGb]:checked").val()){
-				return true;
-			}
+		if ($("#goodsDetailForm input[name=formalGbOrg]").val() != $("input:radio[name=formalGb]:checked").val()){
+			return true;
+		}
+		//상품구분
+		if ($("#goodsDetailForm input[name=goodsGbOrg]").val() != $("input:radio[name=goodsGb]:checked").val()){
+			return true;
 		}
-		
 		//상품상태
 		if ($("#goodsDetailForm input[name=goodsStatOrg]").val() != $("#goodsDetailForm select[name=goodsStat]").val()){
 			return true;
@@ -1782,13 +1728,9 @@
 			if ($("#goodsDetailForm input[name=erpStockLinkYnOrg]").val() != $("input[name=erpStockLinkYn]:checked").val()){
 				return true;
 			}
-			//ERP가격연동여부
-			if ($("#goodsDetailForm input[name=erpPriceLinkYnOrg]").val() != $("input[name=erpPriceLinkYn]:checked").val()){
-				return true;
-			}
 		}
 		//자사몰 노출여부
-		if ($("#goodsDetailForm input[name=dispYnOrg]").val() != $("input[name=dispYn]:checked").val()){
+		if ($("#goodsDetailForm input[name=selfMallYnOrg]").val() != $("input[name=selfMallYn]:checked").val()){
 			return true;
 		}
 		//PC포인트 
@@ -1815,6 +1757,10 @@
 		if ($("#goodsDetailForm input[name=maxOrdQtyOrg]").val() != $("#goodsDetailForm input[name=maxOrdQty]").val()){
 			return true;
 		}
+		//ID당1일최대구매수량
+		if ($("#goodsDetailForm input[name=dayMaxOrdQtyOrg]").val() != $("#goodsDetailForm input[name=dayMaxOrdQty]").val()){
+			return true;
+		}
 		//무료배송기준
 		if ($("#goodsDetailForm input[name=minOrdAmtOrg]").val() != $("#goodsDetailForm input[name=minOrdAmt]").val().removeComma()){
 			return true;
@@ -1887,14 +1833,14 @@
 		if (goodsData.length < 1) return;
 		
 		// 기존상품
-		var oldGoodsDealList = gagaAgGrid.getAllRowData(gridGoodsExtendOptions);
+		var oldGoodsDealList = gagaAgGrid.getAllRowData(gridGoodsComposeOptions);
 		var idx = oldGoodsDealList.length+1; 
 		
 		var isExist = false;
 		goodsData.forEach(function(goods){
 			isExist = false;
 
-			gridGoodsExtendOptions.api.forEachNode(function(rowNode, index) {
+			gridGoodsComposeOptions.api.forEachNode(function(rowNode, index) {
 
 				if (goods.goodsCd == rowNode.data.extendGoodsCd){
 					isExist = true;
@@ -1912,7 +1858,7 @@
 						, goodsType: $('#goodsDetailForm input[name=goodsType]').val()
 						, dispOrd: idx
 						, qty: 1
-						, extendCurrPrice: goods.currPrice
+						, compsCurrPrice: goods.currPrice
 						, extendStaffCurrPrice: goods.currPrice
 						, baseYn: 'N'
 						, goodsStat : goods.goodsStat
@@ -1925,13 +1871,13 @@
 						, imgPath1 : goods.imgPath1
 						, imgPath6 : goods.imgPath6
 						};
-				gridGoodsExtendOptions.api.updateRowData({add: [data], addIndex: idx});
+				gridGoodsComposeOptions.api.updateRowData({add: [data], addIndex: idx});
 				
 				idx++;
 			
 			}
 		});
-		gridGoodsExtendOptions.api.refreshCells();
+		gridGoodsComposeOptions.api.refreshCells();
 	}
 	
 	// 코디상품 조회 팝업
@@ -1984,7 +1930,7 @@
 			
 			}
 		});
-		gridGoodsExtendOptions.api.refreshCells();
+		gridGoodsComposeOptions.api.refreshCells();
 	}
 
 	//엑셀 상품 조회
@@ -2022,7 +1968,7 @@
 
 		gagaAgGrid.createGrid('gridGoodsHstoryList', gridGoodsHstoryOptions);
 		gagaAgGrid.createGrid('gridGoodsCodiList', gridCodiGoodsOptions);
-		gagaAgGrid.createGrid('gridGoodsExtendList', gridGoodsExtendOptions);
+		gagaAgGrid.createGrid('gridGoodsComposeList', gridGoodsComposeOptions);
 
 		fnGoodsDeailSearch();
 

+ 4 - 4
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsDetailSizeStockForm.html

@@ -44,8 +44,8 @@
 		</th:block>
 		<tr>
 			<th>상품코드</th>
-			<th>사이즈</th>
-			<th>사이즈명</th>
+			<th>옵션</th>
+			<th>옵션명</th>
 			<th>옵션1</th>
 			<th>옵션2</th>
 			<th>노출순서</th>
@@ -66,10 +66,10 @@
 			<td><th:block th:text="${goodsSize.optNm}"></th:block>
 				<input type="hidden" name="hidOptNm" th:value="${goodsSize.optNm}" />
 			</td>
-			<td><input type="text" class="w100p aL" name="optNm1" th:value="${goodsSize.optNm1}"  maxlength="70" th:disabled="${goods.selfGoodsYn == 'Y'}"/>
+			<td><input type="text" class="w100p aL" name="optNm1" th:value="${goodsSize.optNm1}"  maxlength="70" th:readonly="${goods.selfGoodsYn == 'Y'}"/>
 				<input type="hidden" name="hidOptNm1" th:value="${goodsSize.optNm1}" />
 			</td>
-			<td><input type="text" class="w100p aL" name="optNm2" th:value="${goodsSize.optNm2}"  maxlength="70" th:disabled="${goods.selfGoodsYn == 'Y'}"/>
+			<td><input type="text" class="w100p aL" name="optNm2" th:value="${goodsSize.optNm2}"  maxlength="70" th:readonly="${goods.selfGoodsYn == 'Y'}"/>
 				<input type="hidden" name="hidOptNm2" th:value="${goodsSize.optNm2}" />
 			</td>
 			<td><input type="text" class="w100p aC" name="dispOrd" th:value="${goodsSize.dispOrd}"  maxlength="10" data-valid-type="integer"/>

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

@@ -147,7 +147,7 @@
 						</td>
 						<th>자사몰노출여부</th>
 						<td>
-							<select  name="dispYn" id="dispYn">
+							<select  name="selfMallYn" id="selfMallYn">
 								<option value="">[전체]</option>
 								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
@@ -364,7 +364,7 @@
 				}
 			}
 		},
-		{headerName: "브랜드", field: "brandCd", width: 100, cellClass: 'text-center'},
+		{headerName: "브랜드", field: "brandCd", width: 80, cellClass: 'text-center'},
 		{headerName: "브랜드명", field: "brandEnm", width: 130, cellClass: 'text-center'},
 		{headerName: "상품코드", field: "goodsCd", width: 140, cellClass: 'text-center'},
 		{headerName: "상품명", field: "goodsNm", width: 200, cellClass: 'text-left'