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

이태영 - 20210129 장바구니 등록 임시 커밋

xodud1202 5 лет назад
Родитель
Сommit
70ac7b95b9

+ 43 - 6
src/main/java/com/style24/front/biz/dao/TsfCartDao.java

@@ -4,6 +4,7 @@ import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Cart;
 import com.style24.persistence.domain.GoodsStock;
 
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -15,20 +16,56 @@ import java.util.List;
 @ShopDs
 public interface TsfCartDao {
     /**
-     * 대상상품 존재 장바구니 List 조회
+     * 장바구니 대상 상품 수량 조회
      * @param Cart
      * @return
      * @author xodud1202
-     * @since 2021. 01. 28
+     * @since 2021. 02. 01
      */
-    List<Cart> getHasGoodsCartList(Cart cart);
+   int getHasGoodsCartCnt(Cart cart);
 
     /**
-     * 대상 세트 구성 상품 존재 여부 확인
+     * 장바구니 등록 상품 확인
      * @param Cart
      * @return
      * @author xodud1202
-     * @since 2021. 01. 28
+     * @since 2021. 02. 01
      */
-    int getCartDetailCnt(Cart cart);
+    Collection<Integer> selectHasSetItemCartList(Cart param);
+
+    /**
+     * 장바구니 등록 상품 확인
+     * @param Cart
+     * @return
+     * @author xodud1202
+     * @since 2021. 02. 01
+     */
+    Collection<Integer> selectHasNormalDealItemCartList(Cart param);
+
+    /**
+     * 장바구니 신규 등록
+     * @param Cart
+     * @return void
+     * @author xodud1202
+     * @since 2021. 02. 01
+     */
+    void insertCartInfo(Cart param);
+
+    /**
+     * 장바구니 상세 신규 등록
+     * @param Cart
+     * @return void
+     * @author xodud1202
+     * @since 2021. 02. 01
+     */
+    void insertCartDetailInfo(Cart param);
+
+    /**
+     * 장바구니 상세 신규 등록
+     * @param Cart
+     * @return void
+     * @author xodud1202
+     * @since 2021. 02. 01
+     */
+    void updateCartInfo(Cart param);
 }

+ 135 - 88
src/main/java/com/style24/front/biz/service/TsfCartService.java

@@ -3,6 +3,8 @@ package com.style24.front.biz.service;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.session.TscSession;
 import com.style24.front.biz.dao.TsfCartDao;
+import com.style24.front.support.env.TsfConstants;
+import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Cart;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsStock;
@@ -12,7 +14,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Collection;
-import java.util.List;
 
 /**
  * 장바구니 Service
@@ -40,106 +41,152 @@ public class TsfCartService {
 	public void saveCartInfo(Collection<Cart> params) {
 		Cart cart = new Cart();
 		// JSESSION_ID 저장
-		cart.setJsessionId(TscSession.getSessionId());
+
 
 		// 로그인 유무 확인 (로그인이 되어 있지 않으면 regNo 를 0으로 장바구니에 저장한다.)
+		// TODO 로그인여부체크
+
+		// 장바구니 상품 및 재고 가능 여부 체크
+		for(Cart param : params) {
+			cart.setJsessionId(TscSession.getSessionId());
+			cart.setRegNo(0);
+			cart.setUpdNo(0);
+
+			// 상품 마스터 정보 확인
+			Goods goods = new Goods();
+			goods.setGoodsCd(param.getGoodsCd());
+			goods = goodsService.getGoodsInfo(goods);
+			if (goods == null) {
+				throw new IllegalArgumentException("상품 정보가 존재하지 않습니다.");
+			}
+
+			cart.setGoodsCd(param.getGoodsCd());
+			int goodsCartCnt = cartDao.getHasGoodsCartCnt(param);
+			if(param.getGoodsQty() + goodsCartCnt > goods.getDayMaxOrdQty()) {
+				throw new IllegalArgumentException("1일 구매한도 수량이 초과되었습니다.");
+			}
+
+			// 상품 재고 확인
+			GoodsStock checkParam = new GoodsStock();
+			checkParam.setGoodsCd(param.getGoodsCd());
+			checkParam.setItemCd(param.getItemCd());
+			checkParam.setOptCd(param.getOptCd());
+			checkParam.setGoodsQty(param.getGoodsQty());
+			checkParam.setGoodsType(param.getGoodsType());
+			String stockResult = goodsService.getCheckStock(checkParam);
+
+			if(!"SUCCESS".equals(stockResult)) {
+				throw new IllegalArgumentException(stockResult);
+			}
+
+			cart = param;
+		}
+
+		// 장바구니 정보 수정
+		if(cart.getGoodsType().equals(TscConstants.GOODS_TYPE.SET.value())) {
+			// 세트상품일 경우
+			saveSetTypeCartInfo(params);
+		} else {
+			// 세트 상품이 아닐 경우
+			saveNormalDealCartInfo(params.iterator().next());
+		}
+	}
+
+	@Transactional("shopTxnManager")
+	public void saveSetTypeCartInfo(Collection<Cart> params) {
+		Cart cart = new Cart();
+		StringBuilder sb = new StringBuilder();
+
+		// TODO 로그인 정보 세팅
 		cart.setRegNo(0);
+		cart.setCustNo(0);
 		cart.setUpdNo(0);
 
-		// 상품 정보 확인
-		/*Goods goods = new Goods();		// 상품 마스터 정보
-		goods.setGoodsCd(param.getGoodsCd());
-		goods = goodsService.getGoodsInfo(goods);
-		if(goods == null) {
-			throw new IllegalArgumentException("상품 정보가 존재하지 않습니다.");
+		for(Cart param : params) {
+			sb.append("UNION ALL SELECT '").append(param.getGoodsCd()).append("' AS GOODS_CD, '")
+					.append(param.getItemCd()).append("' AS ITEM_CD, '")
+					.append(param.getOptCd()).append("' AS OPT_CD\n");
 		}
 
-		cart.setGoodsCd(goods.getGoodsCd());
-		cart.setProductNo(goods.getProductNo());
-		cart.setProductCode(goods.getProductCode());*/
-
-		// 재고 정보 확인
-
-
-		// 재고 정보 확인
-		/*if(TscConstants.GOODS_TYPE.SET.value().equals(goods.getGoodsType())) {		// 장바구니 상품이 세트상품이라면
-			if(param.getCompsList() != null && param.getCompsList().size() > 0) {
-				for(int i = 0 ; i < param.getCompsList().size() ; i++) {
-					Cart tCart = param.getCompsList().get(i);
-					// 구성상품 구성정보
-					Goods compsGoodsInfo = new Goods();
-					compsGoodsInfo.setGoodsCd(param.getGoodsCd());
-					compsGoodsInfo.setCompsGoodsCd(tCart.getCompsGoodsCd());
-					compsGoodsInfo.setGoodsType(goods.getGoodsType());
-					compsGoodsInfo = goodsService.getGoodsCompsInfo(compsGoodsInfo);
-
-					// 구성상품 재고 정보
-					GoodsStock stock = new GoodsStock();
-					stock.setGoodsCd(compsGoodsInfo.getCompsGoodsCd());
-					stock.setOptCd(tCart.getOptCd());
-					stock = goodsService.getGoodsStockInfo(stock);
-
-					if("Y".equals(stock.getSoldoutYn()) || stock.getCurrStockQty() < 1) {
-						throw new IllegalArgumentException("세트 구성 상품 중 품절 상품이 있습니다.");
-					}
-
-					// 세트상품 요청 수량 * 구성상품 필요 수량이 해당 구성수량의 재고보다 많으면
-					if(param.getGoodsQty() * compsGoodsInfo.getQty() > stock.getCurrStockQty()) {
-						throw new IllegalArgumentException("요청하신 수량만큼의 재고가 존재하지 않습니다.");
-					}
-
-					tCart.setItemCd(stock.getGoodsCd());
-					tCart.setOptCd(stock.getOptCd());
-					tCart.setOptCd1(stock.getOptCd1());
-					tCart.setOptCd2(stock.getOptCd2());
-					tCart.setSkuModelNo(stock.getSkuModelNo());
-					tCart.setProductNo(compsGoodsInfo.getProductNo());
-					tCart.setProductCode(compsGoodsInfo.getProductCode());
-					tCart.setItemQty(compsGoodsInfo.getQty());
-				}
+		// cart 정보 세팅
+		cart.setJsessionId(TscSession.getSessionId());
+		cart.setContentsLoc(params.iterator().next().getContentsLoc());
+		cart.setAfLinkCd(params.iterator().next().getAfLinkCd());
+		cart.setIthrCd(params.iterator().next().getIthrCd());
+		cart.setPlanDtlSq(params.iterator().next().getPlanDtlSq());
+		cart.setGoodsCd(params.iterator().next().getGoodsCd());
+		cart.setGoodsQty(params.iterator().next().getGoodsQty());
+		cart.setGoodsType(params.iterator().next().getGoodsType());
+		cart.setItemCdSql(sb.toString());
+
+		if("C".equals(params.iterator().next().getCartGb())) {
+			cart.setCartGb(TscConstants.CartGb.CART.value());
+		} else if("O".equals(params.iterator().next().getCartGb())) {
+			if("P".equals(TsfSession.getFrontGb())) {
+				cart.setCartGb(TscConstants.CartGb.PC_ORDER.value());
 			} else {
-				throw new IllegalArgumentException("세트 상품 정보가 존재하지 않습니다.");
-			}
-		} else {		// 딜상품이거나 일반 상품일 경우
-
-		}*/
-
-		// 현재 장바구니에 존재하는지 확인 후 정보 저장
-		/*if(param.getCompsList() != null && param.getCompsList().size() > 0) {		// 세트상품
-			int haveCartSq = 0, ifHaveSq = 0;
-			for(int i = 0 ; i < param.getCompsList().size() ; i++) {				// 세트상품 전체 옵션이 같은지 확인
-				int cnt = 0;														// 맞는 수량 체크
-				List<Cart> goodsCartList = cartDao.getHasGoodsCartList(param);		// 해당 세트 상품이 있는 cart_sq 검색
-
-				// cart_sq마다 같은 옵션의 세트상품이 있는지 검색
-				for (Cart value : goodsCartList) {
-					Cart searchParam = new Cart();
-					searchParam.setCartSq(value.getCartSq());
-					searchParam.setItemCd(param.getCompsList().get(i).getCompsGoodsCd());
-					searchParam.setOptCd(param.getCompsList().get(i).getOptCd());
-
-					if (cartDao.getCartDetailCnt(searchParam) > 0) {
-						cnt++;
-						ifHaveSq = searchParam.getCartSq();
-					} else {
-						continue;
-					}
-				}
-
-				if(param.getCompsList().size() == cnt) {
-					haveCartSq = ifHaveSq;
-				}
+				cart.setCartGb(TscConstants.CartGb.MOB_ORDER.value());
 			}
+		} else {
+			cart.setCartGb(TscConstants.CartGb.CREATE_ORDER.value());
+		}
 
-			if(haveCartSq != 0) {	// 세트상품 전체 옵션이 같은 장바구니가 있다면
-				// update (추가)
-				Cart updateInfo = new Cart();
+		// 같은 장바구니 상품 확인
+		Collection<Integer> cartSqList = cartDao.selectHasSetItemCartList(cart);
 
+		if(cartSqList != null && cartSqList.size() > 0) {		// 장바구니 기존재
+			if(cartSqList.size() > 1) {							// 장바구니 조회 결과 이상시 insert or select 수정 필요
+				throw new IllegalArgumentException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
 			} else {
-				// insert (추가)
+				cart.setCartSq(cartSqList.iterator().next());
+				cartDao.updateCartInfo(cart);
+			}
+		} else {
+			cartDao.insertCartInfo(cart);					// 장바구니 마스터 정보 저장
+
+			for(Cart param : params) {
+				param.setCartSq(cart.getCartSq());
+				param.setRegNo(cart.getRegNo());
+				param.setCustNo(cart.getCustNo());
+				param.setUpdNo(cart.getUpdNo());
+				cartDao.insertCartDetailInfo(param);		// 장바구니 상세 저장
 			}
-		} else {	// 세트상품이 아닐 경우
+		}
+	}
 
-		}*/
+	@Transactional("shopTxnManager")
+	public void saveNormalDealCartInfo(Cart param) {
+		// TODO 로그인 정보 세팅
+		param.setJsessionId(TscSession.getSessionId());
+		param.setRegNo(0);
+		param.setCustNo(0);
+		param.setUpdNo(0);
+
+		if("C".equals(param.getCartGb())) {
+			param.setCartGb(TscConstants.CartGb.CART.value());
+		} else if("O".equals(param.getCartGb())) {
+			if("P".equals(TsfSession.getFrontGb())) {
+				param.setCartGb(TscConstants.CartGb.PC_ORDER.value());
+			} else {
+				param.setCartGb(TscConstants.CartGb.MOB_ORDER.value());
+			}
+		} else {
+			param.setCartGb(TscConstants.CartGb.CREATE_ORDER.value());
+		}
+
+		// 같은 장바구니 상품 확인
+		Collection<Integer> cartSqList = cartDao.selectHasNormalDealItemCartList(param);
+
+		if(cartSqList != null && cartSqList.size() > 0) {		// 장바구니 기존재
+			if(cartSqList.size() > 1) {							// 장바구니 조회 결과 이상시 insert or select 수정 필요
+				throw new IllegalArgumentException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
+			} else {
+				param.setCartSq(cartSqList.iterator().next());
+				cartDao.updateCartInfo(param);
+			}
+		} else {
+			cartDao.insertCartInfo(param);					// 장바구니 마스터 정보 저장
+			cartDao.insertCartDetailInfo(param);			// 장바구니 상세 저장
+		}
 	}
 }

+ 51 - 0
src/main/java/com/style24/front/biz/service/TsfGoodsService.java

@@ -1,5 +1,6 @@
 package com.style24.front.biz.service;
 
+import com.style24.core.support.env.TscConstants;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsStock;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -54,4 +55,54 @@ public class TsfGoodsService {
 	public GoodsStock getGoodsStockInfo(GoodsStock goodsStock) {
 		return goodsDao.getGoodsStockInfo(goodsStock);
 	}
+
+	/**
+	 * 상품 재고 체크
+	 * @param goodsStock
+	 * goodsCd   (원상품코드) 필수
+	 * goodsType (상품타입) 필수
+	 * optCd     (옵션코드) 필수
+	 * goodsQty  (확인 재고 수량) 필수
+	 * itemCd    (세트 구성 상품코드) 세트
+	 * @return String
+	 * @author xodud1202
+	 * @since 2021. 01. 28
+	 */
+	public String getCheckStock(GoodsStock param) {
+		if(param.getGoodsType().equals(TscConstants.GOODS_TYPE.SET.value())) {		// 세트상품이면 구성 상품코드로 조회
+			GoodsStock stockCheck = new GoodsStock();		// 재고 조회 결과
+			stockCheck.setGoodsCd(param.getItemCd());
+			stockCheck.setOptCd(param.getOptCd());
+
+			stockCheck = goodsDao.getGoodsStockInfo(stockCheck);					// 구성 상품 재고 조회
+
+			Goods compsInfo = new Goods();
+			compsInfo.setGoodsCd(param.getGoodsCd());
+			compsInfo.setCompsGoodsCd(param.getItemCd());
+			compsInfo.setGoodsType(param.getGoodsType());
+
+			compsInfo = goodsDao.getGoodsCompsInfo(compsInfo);						// 구성상품 정보 조회
+
+			log.info("CHECK param.getGoodsQty() INFO >> " + param.getGoodsQty());
+			log.info("CHECK compsInfo.getQty() INFO >> " + compsInfo.getQty());
+			log.info("CHECK stockCheck.getCurrStockQty() INFO >> " + stockCheck.getCurrStockQty());
+
+			// 재고 체크
+			if(param.getGoodsQty() * compsInfo.getQty() > stockCheck.getCurrStockQty()) {
+				return param.getItemCd() + "의 재고가 충분하지 않습니다.";
+			}
+		} else {
+			GoodsStock stockCheck = new GoodsStock();		// 재고 조회 결과
+			stockCheck.setGoodsCd(param.getGoodsCd());
+			stockCheck.setOptCd(param.getOptCd());
+
+			stockCheck = goodsDao.getGoodsStockInfo(stockCheck);					// 구성 상품 재고 조회
+
+			if(param.getGoodsQty() > stockCheck.getCurrStockQty()) {
+				return param.getGoodsCd() + "의 재고가 충분하지 않습니다.";
+			}
+		}
+
+		return "SUCCESS";
+	}
 }

+ 12 - 0
src/main/java/com/style24/front/biz/web/TsfCartController.java

@@ -1,5 +1,6 @@
 package com.style24.front.biz.web;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.gagaframework.web.rest.server.GagaResponse;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.core.support.session.TscSession;
@@ -47,6 +48,17 @@ public class TsfCartController extends TsfBaseController {
 	/**
 	 * 장바구니 등록
 	 * @param param
+	 * goodsCd : 상품코드 (세트 : 세트상품코드, 딜상품 : 원상품코드, 일반상품 : 상품코드)
+	 * itemCd : 구성상품코드 (세트. 세트 아닐 경우 입력X)
+	 * optCd : 옵션코드
+	 * goodsType : 상품타입 (공통코드 G026)
+	 * goodsQty : 장바구니 등록 수량
+	 * cartGb : O = 바로주문, C = 장바구니
+	 * afLinkCd : 제휴링크코드
+	 * ithr_cd : 유입경고
+	 * contents_loc : 컨텐츠 위치
+	 * planDtlSq : 기획전상세번호
+	 * dealGoodsCd : 딜상품코드 (딜상품코드)
 	 * @return ModelAndView
 	 * @author xodud1202
 	 * @since 2021. 01. 28

+ 22 - 19
src/main/java/com/style24/persistence/domain/Cart.java

@@ -17,31 +17,34 @@ import java.util.List;
 @Data
 public class Cart extends TscBaseDomain {
 	// 장바구니 정보
-	private int cartSq;			// 장바구니 번호
-	private int custNo;			// 고객번호
-	private int planDtlSq;		// 기획전상세번호
-	private int goodsQty;		// 장바구니 등록 수량
-	private String cartGb;		// 장바구니 구분 (공통코드G026)
-	private String goodsCd;		// 상품번호
-	private String productNo;	// ProductNo(WMS)
-	private String productCode;	// ProductCode(WMS)
-	private String jsessionId;	// JSESSIONID
-	private String afLinkCd;	// 제휴링크코드
-	private String ithrCd;		// 유입경로(공통코드 G027)
-	private String contentsLoc;	// 컨텐츠위치(공통코드G028)
+	private int cartSq;				// 장바구니 번호
+	private int custNo;				// 고객번호
+	private int planDtlSq;			// 기획전상세번호
+	private int goodsQty;			// 장바구니 등록 수량
+	private String cartGb;			// 장바구니 구분 (공통코드G026)
+	private String goodsCd;			// 상품번호
+	private String productNo;		// ProductNo(WMS)
+	private String productCode;		// ProductCode(WMS)
+	private String jsessionId;		// JSESSIONID
+	private String afLinkCd;		// 제휴링크코드
+	private String ithrCd;			// 유입경로(공통코드 G027)
+	private String contentsLoc;		// 컨텐츠위치(공통코드G028)
+	private String dealGoodsCd;		// 딜상품코드
 
 	// 장바구니 상세 정보
-	private String itemCd;		// 단품코드(상품). 일반상품과 딜상품은 상품코드와 동일
-	private String optCd;		// 옵션코드
-	private String optCd1;		// 옵션코드1
-	private String optCd2;		// 옵션코드2
-	private String skuModelNo;	// SKUModelNo(WMS)
-	private int itemQty;		// 장바구니 등록된 상품의 기준재고
+	private String itemCd;			// 단품코드(상품). 일반상품과 딜상품은 상품코드와 동일
+	private String optCd;			// 옵션코드
+	private String optCd1;			// 옵션코드1
+	private String optCd2;			// 옵션코드2
+	private String skuModelNo;		// SKUModelNo(WMS)
+	private int itemQty;			// 장바구니 등록된 상품의 기준재고
 
 	// 상품 정보
 	private int currStockQty;		// 기준 재고
+	private int qty;				// 구성 상품 기준 재고 수량
+	private String goodsType;		// 상품 타입
 	private String compsGoodsCd;	// 세트 구성상품 코드
-	private List<Cart> compsList;	// 구성 세트상품 리스트
+	private String itemCdSql;		// 상품 조회 쿼리문
 
 	// 다다익선 정보
 

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

@@ -21,5 +21,6 @@ public class Goods extends TscBaseDomain {
 	private String compsGoodsCd;	// 세트 구성품 상품번호
 	private String optCd;			// 옵션코드
 	private String optCd1;			// 옵션코드1
+	private int dayMaxOrdQty;		// 일일 최대 구매 수량
 	private int qty;				// 세트 상품 구성 수량
 }

+ 3 - 1
src/main/java/com/style24/persistence/domain/GoodsStock.java

@@ -14,8 +14,10 @@ import lombok.Data;
 public class GoodsStock extends TscBaseDomain {
 	// 재고 정보
 	private int currStockQty;		// 가용재고
-	private int baseStockQty;		// 안전재고
+	private int goodsQty;			// 안전재고
 	private String goodsCd;			// 상품번호
+	private String itemCd;			// 구성상품코드
+	private String goodsType;		// 상품구분
 	private String optCd;			// 옵션코드
 	private String optCd1;			// 옵션코드1(자사 : 컬러, 입점 : 옵션명1)
 	private String optCd2;			// 옵션코드1(자사 : 사이즈, 입점 : 옵션명2)

+ 168 - 21
src/main/java/com/style24/persistence/mybatis/TsfCart.xml

@@ -8,33 +8,180 @@
 	</sql>
 	<!--// Paging -->
 
-	<!--대상상품 존재 장바구니 List 조회 -->
-	<select id="getHasGoodsCartList" parameterType="Cart" resultType="Cart">
-		/* TsfGoods.getHasGoodsCartList : 대상상품 존재 장바구니 List 조회 */
-		SELECT CART_SQ
-			 , GOODS_CD
-		FROM  TB_CART C
-		WHERE 1=1
-		AND   GOODS_CD = #{goodsCd}
+	<!-- 등록 상품 장바구니 수량 조회 -->
+	<select id="getHasGoodsCartCnt" parameterType="Cart" resultType="int">
+		/* TsfCart.getHasGoodsCartCnt : 등록 상품 장바구니 수량 조회 */
+		SELECT IFNULL(SUM(C.GOODS_QTY), 0) AS CNT
+		  FROM TB_CART C
+		 WHERE 1=1
+		   AND GOODS_CD = #{goodsCd}
 		<choose>
-			<when test="regNo == 0">
-				AND C.JSESSION_ID = #{jsessionId}
-		  		AND C.REG_NO = 0
+			<when test="custNo == 0">
+		   AND C.JSESSION_ID = #{jsessionId}
+		   AND C.CUST_NO = 0
 			</when>
 			<otherwise>
-				AND C.REG_NO = #{regNo}
+		   AND C.CUST_NO = #{custNo}
 			</otherwise>
 		</choose>
 	</select>
 
-	<!-- 장바구니 상세 존재 유무 확인 -->
-	<select id="getCartDetailCnt" parameterType="Cart" resultType="Cart">
-		/* TsfGoods.getCartDetailCnt : 장바구니 상세 존재 유무 확인 */
-		SELECT COUNT(1) AS CNT
-		FROM  TB_CART_DETAIL C
-		WHERE 1=1
-		  AND ITEM_CD = #{itemCd}
-		  AND OPT_CD = #{optCd}
-		  AND CART_SQ = #{cartSq}
+	<!-- 장바구니 등록 세트 상품 확인 -->
+	<select id="selectHasSetItemCartList" parameterType="Cart" resultType="int">
+		/* TsfCart.selectHasSetItemCartList : 장바구니 등록 세트 상품 확인 */
+		SELECT C.CART_SQ
+		  FROM (SELECT GROUP_CONCAT(C.GOODS_CD, CD.ITEM_CD, CD.OPT_CD) AS SIZE_OPTION
+				     , C.CART_SQ
+			      FROM TB_CART C
+				 INNER JOIN (SELECT CD.ITEM_CD, CD.OPT_CD, CD.CART_SQ
+				    		   FROM TB_GOODS_COMPOSE GC
+				     		  INNER JOIN TB_CART_DETAIL CD
+				    			 ON GC.COMPS_GOODS_CD = CD.ITEM_CD
+				 				AND GC.GOODS_CD = #{goodsCd}
+				     		  ORDER BY CD.CART_SQ, GC.DISP_ORD) CD
+					ON C.CART_SQ = CD.CART_SQ
+			     WHERE 1=1
+				   AND C.CUST_NO = #{custNo}
+				   AND C.JSESSION_ID = #{jsessionId}
+			<choose>
+				<when test="regNo == 0">
+					AND C.JSESSION_ID = #{jsessionId}
+					AND C.CUST_NO = 0
+				</when>
+				<otherwise>
+					AND C.REG_NO = #{regNo}
+				</otherwise>
+			</choose>
+				   AND C.CART_GB = 'G026_BC'
+				   AND C.GOODS_CD = #{goodsCd}
+			     GROUP BY C.CART_SQ) C
+		 WHERE 1=1
+		   AND C.SIZE_OPTION = (SELECT GROUP_CONCAT(A.GOODS_CD, A.ITEM_CD, A.OPT_CD)
+							      FROM (SELECT NULL AS GOODS_CD, NULL AS ITEM_CD, NULL AS OPT_CD
+										${itemCdSql}
+							           ) A
+							     WHERE A.ITEM_CD IS NOT NULL)
+	</select>
+
+	<!-- 장바구니 등록 일반 or 딜 상품 확인 -->
+	<select id="selectHasNormalDealItemCartList" parameterType="Cart" resultType="int">
+		/* TsfCart.selectHasNormalDealItemCartList : 장바구니 등록 일반 or 딜 상품 확인 */
+		SELECT C.CART_SQ
+		  FROM TB_CART C
+		 WHERE 1=1
+		   AND C.CUST_NO = #{custNo}
+		   AND C.JSESSION_ID = #{jsessionId}
+		   AND C.GOODS_CD = #{goodsCd}
 	</select>
+
+	<!-- 장바구니 신규 등록 -->
+	<insert id="insertCartInfo" parameterType="Cart" keyProperty="cartSq">
+		/* TsfCart.insertCartInfo : 장바구니 신규 등록 */
+		INSERT INTO TB_CART (
+		          CART_GB
+		        , GOODS_CD
+		        , PRODUCT_NO
+		        , PRODUCT_CODE
+		        , GOODS_QTY
+		        , DEAL_GOODS_CD
+		        , JSESSION_ID
+		        , CUST_NO
+		        , AF_LINK_CD
+		        , ITHR_CD
+		        , CONTENTS_LOC
+		        , PLAN_DTL_SQ
+		        , REG_NO
+		        , REG_DT
+		        , UPD_NO
+		        , UPD_DT)
+		SELECT #{cartGb}
+			 , GOODS_CD
+			 , PRODUCT_NO
+			 , PRODUCT_CODE
+		     , #{goodsQty}
+		     , #{dealGoodsCd}
+			 , #{jsessionId}
+			 , #{custNo}
+			 , #{afLinkCd}
+			 , #{ithrCd}
+			 , #{contentsLoc}
+			 , #{planDtlSq}
+			 , REG_NO
+		     , CURRENT_TIMESTAMP
+			 , UPD_NO
+			 , CURRENT_TIMESTAMP
+		  FROM TB_GOODS
+		 WHERE GOODS_CD = #{goodsCd}
+	</insert>
+
+	<!-- 장바구니 상세 신규 등록 -->
+	<insert id="insertCartDetailInfo" parameterType="Cart" keyProperty="cartSq">
+		/* TsfCart.insertCartDetailInfo : 장바구니 상세 신규 등록 */
+		INSERT INTO TB_CART_DETAIL (
+		          CART_SQ
+		        , ITEM_CD
+		        , OPT_CD
+		        , OPT_CD1
+		        , OPT_CD2
+		        , SKU_MODEL_NO
+		        , PRODUCT_NO
+		        , PRODUCT_CODE
+		        , ITEM_QTY
+		        , DISP_ORD
+		        , REG_NO
+		        , REG_DT
+		        , UPD_NO
+		        , UPD_DT
+		)
+		SELECT #{cartSq}
+			 , IFNULL(GC.COMPS_GOODS_CD, G.GOODS_CD)		 <!-- 세트 상품이 아니면 원상품코드 -->
+		     , O.OPT_CD
+		     , O.OPT_CD1
+		     , O.OPT_CD2
+		     , O.SKU_MODEL_NO
+		     , G.PRODUCT_NO
+		     , G.PRODUCT_CODE
+		     , IFNULL(GC.QTY, 1)
+			 , IFNULL(GC.DISP_ORD, 1)						<!-- TB_GOODS_COMPOSE DISP_ORD 따라 CART_DETAIL도 동일하게 진행 -->
+			 , #{regNo}
+			 , CURRENT_TIMESTAMP
+			 , #{updNo}
+			 , CURRENT_TIMESTAMP
+		  FROM TB_GOODS G
+		 INNER JOIN TB_OPTION O
+		    ON G.GOODS_CD = O.GOODS_CD
+		  LEFT OUTER JOIN TB_GOODS_COMPOSE GC		<!-- 일반 상품 제외 확인 필요하여 join -->
+		    ON GC.COMPS_GOODS_CD = G.GOODS_CD
+		   AND GC.GOODS_CD = #{goodsCd}
+		   AND GC.COMPS_GOODS_CD = #{itemCd}
+		   AND GC.GOODS_TYPE = 'G056_S'				<!-- 세트 상품만 구성 상품 코드로 올림. deal 상품은 원상품코드로 올려야함 -->
+		 WHERE 1=1
+		<choose>
+			<when test="goodsType == 'G056_S'">
+		   AND O.GOODS_CD = #{itemCd}				<!-- 세트상품은 itemCd으로 조회 -->
+			</when>
+			<otherwise>
+		   AND O.GOODS_CD = #{goodsCd}
+			</otherwise>
+		</choose>
+		   AND O.OPT_CD = #{optCd}
+		 ORDER BY GC.DISP_ORD
+	</insert>
+
+	<!-- 장바구니 상세 UPDATE -->
+	<insert id="updateCartInfo" parameterType="Cart" keyProperty="cartSq">
+		/* TsfCart.updateCartInfo : 장바구니 상세 UPDATE */
+		UPDATE TB_CART SET
+			  GOODS_QTY = GOODS_QTY + #{goodsQty}
+		    , DEAL_GOODS_CD = #{dealGoodsCd}
+		    , AF_LINK_CD = #{afLinkCd}
+		    , ITHR_CD = #{ithrCd}
+		    , CONTENTS_LOC = #{contentsLoc}
+		    , PLAN_DTL_SQ = #{planDtlSq}
+			, UPD_NO = #{updNo}
+			, UPD_DT = CURRENT_TIMESTAMP
+		WHERE CART_SQ = #{cartSq}
+		  AND GOODS_CD = #{goodsCd}
+		  AND CUST_NO = #{custNo}
+	</insert>
 </mapper>

+ 20 - 19
src/main/java/com/style24/persistence/mybatis/TsfGoods.xml

@@ -15,10 +15,11 @@
 		     , G.PRODUCT_NO
 		     , G.PRODUCT_CODE
 			 , G.GOODS_TYPE
-		FROM TB_GOODS G
-		WHERE G.SELF_MALL_YN = 'Y'			<!-- 자사몰 노출 여부 -->
-		AND G.GOODS_STAT = 'G008_90'		<!-- 상품 승인완료 -->
-		AND G.GOODS_CD = #{goodsCd}
+			 , G.DAY_MAX_ORD_QTY
+		  FROM TB_GOODS G
+		 WHERE G.SELF_MALL_YN = 'Y'			<!-- 자사몰 노출 여부 -->
+		   AND G.GOODS_STAT = 'G008_90'		<!-- 상품 승인완료 -->
+		   AND G.GOODS_CD = #{goodsCd}
 	</select>
 
 	<!-- 구성 상품 정보 -->
@@ -30,15 +31,15 @@
 			 , GC.QTY
 		     , G.PRODUCT_NO
 			 , G.PRODUCT_CODE
-		FROM TB_GOODS_COMPOSE GC
-		INNER JOIN TB_GOODS G
-		ON GC.COMPS_GOODS_CD = G.GOODS_CD
-		WHERE GC.USE_YN = 'Y'
-		AND G.SELF_MALL_YN = 'Y'			<!-- 자사몰 노출 여부 -->
-		AND G.GOODS_STAT = 'G008_90'		<!-- 상품 승인완료 -->
-		AND GC.GOODS_TYPE = #{goodsType}
-		AND GC.GOODS_CD = #{goodsCd}
-		AND GC.COMPS_GOODS_CD = #{compsGoodsCd}
+		  FROM TB_GOODS_COMPOSE GC
+		 INNER JOIN TB_GOODS G
+		    ON GC.COMPS_GOODS_CD = G.GOODS_CD
+		 WHERE GC.USE_YN = 'Y'
+		   AND G.SELF_MALL_YN = 'Y'			<!-- 자사몰 노출 여부 -->
+		   AND G.GOODS_STAT = 'G008_90'		<!-- 상품 승인완료 -->
+		   AND GC.GOODS_TYPE = #{goodsType}
+		   AND GC.GOODS_CD = #{goodsCd}
+		   AND GC.COMPS_GOODS_CD = #{compsGoodsCd}
 	</select>
 
 	<!-- 상품 재고 조회 -->
@@ -51,11 +52,11 @@
 			 , VS.SOLDOUT_YN
 			 , VS.CURR_STOCK_QTY
 			 , O.SKU_MODEL_NO
-		FROM  VW_STOCK VS
-		INNER JOIN TB_OPTION O
-		ON    VS.GOODS_CD = O.GOODS_CD
-		AND   VS.OPT_CD = O.OPT_CD
-		WHERE VS.GOODS_CD = #{goodsCd}
-		AND   VS.OPT_CD = #{optCd}
+		  FROM VW_STOCK VS
+		 INNER JOIN TB_OPTION O
+		    ON VS.GOODS_CD = O.GOODS_CD
+		   AND VS.OPT_CD = O.OPT_CD
+		 WHERE VS.GOODS_CD = #{goodsCd}
+		   AND VS.OPT_CD = #{optCd}
 	</select>
 </mapper>

+ 38 - 54
src/main/webapp/WEB-INF/views/web/cart/cartListFormWeb.html

@@ -34,75 +34,59 @@
             alert(result.result);
         }
         $("#save").click(function() {
-            let goodsCd = "STYS000000016";
-            let i = 2;      // 구성상품 length만큼
             let compsList = [];
+            let temp = new Object;
+            temp.goodsCd = "14373687";
+            temp.dealGoodsCd = 'STYD000000025';
+            temp.optCd = "퍼플140";
+            temp.goodsQty = 2;
+            temp.goodsType = "G056_D";
+            temp.cartGb = "C";
+            temp.afLinkCd = "afLinkCd1";
+            temp.ithrCd = "G027_ZZZ1";
+            temp.contentsLoc = "G028_YYY1";
+            temp.planDtlSq = "123";
+            compsList.push(temp);
+            /*let i = 2;      // 구성상품 length만큼
             for(let j = 0 ; j < i ; j++) {
                 let temp = new Object;
-                if(j == 0) {
-                    temp.compsGoodsCd = '14373757';
+                if(j == 1) {
+                    temp.goodsCd = "STYS000000016";
+                    temp.itemCd = '14373757';
                     temp.optCd = "핑크120";
+                    temp.goodsQty = 1;
+                    temp.goodsType = "G056_S";
+                    temp.cartGb = "C";
+                    temp.afLinkCd = "afLinkCd";
+                    temp.ithrCd = "G027_ZZZ";
+                    temp.contentsLoc = "G028_YYY";
+                    temp.planDtlSq = "123";
                     compsList.push(temp);
                 } else {
-                    temp.compsGoodsCd = '14373758';
+                    temp.goodsCd = "STYS000000016";
+                    temp.itemCd = '14373758';
                     temp.optCd = "블랙130";
+                    temp.goodsQty = 1;
+                    temp.goodsType = "G056_S";
+                    temp.cartGb = "C";
+                    temp.afLinkCd = "afLinkCd";
+                    temp.ithrCd = "G027_ZZZ";
+                    temp.contentsLoc = "G028_YYY";
+                    temp.planDtlSq = "123";
                     compsList.push(temp);
                 }
-            }
+            }*/
 
-            let data = {
-                goodsCd : goodsCd,
-                goodsQty : 2,
-                compsList : compsList
-            };
-            let jsonData = JSON.stringify(data);
+            let jsonData = JSON.stringify(compsList);
 
-
-            $.ajax({
-                type : 'POST',
+            $.ajax( {
+                type: "POST",
                 url : '/cart/save',
                 data : jsonData,
+                contentType: 'application/json',
                 dataType : 'json',
-                beforeSend : function(xhr, settings) {
-                    // AJAX call
-                    xhr.setRequestHeader("AJAX", "true");
-
-                    // dataType: "json"일 때
-                    xhr.setRequestHeader('Accept', 'application/json');
-                    xhr.setRequestHeader('Content-Type', 'application/json');
-
-                    // Button disabled & progressBar creation
-                    //gagajf.showProgressbar(true);
-                },
-                complete : function(xhr) {
-                    // Button abled & progressBar remove
-                    //gagajf.showProgressbar(false);
-
-                    // 세션이 없다. 로그인 페이지로 이동
-                    if (xhr.status == 901) {
-
-                    }
-                },
                 success : function(result) {
-                    if (typeof(result.status) == 'undefined' || result.status == 200) { // 성공
-                        if (!result.message) {
-                            saveFinish.call(this, result);
-                        } else {
-                            if (typeof(saveFinish) == "function") {
-                                saveFinish.call(this, result);
-                            }
-                        }
-                    } else { // 실패
-                        if (!result.error.message) {
-                            alert(result.error.message);
-                        }
-
-                        return;
-                    }
-                },
-                error : function(result) {
-                    console.log(result);
-                    alert('오류로 인해 처리되지 않았습니다.');
+                    alert(result.message);
                 }
             });
         });