Przeglądaj źródła

이태영 - 20210128 임시커밋

xodud1202 5 lat temu
rodzic
commit
22389f8409

+ 27 - 0
src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java

@@ -1,6 +1,8 @@
 package com.style24.front.biz.dao;
 package com.style24.front.biz.dao;
 
 
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsStock;
 
 
 /**
 /**
  * 상품 Dao
  * 상품 Dao
@@ -10,5 +12,30 @@ import com.style24.core.support.annotation.ShopDs;
  */
  */
 @ShopDs
 @ShopDs
 public interface TsfGoodsDao {
 public interface TsfGoodsDao {
+    /**
+     * 상품 정보 조회
+     * @param goods
+     * @return
+     * @author xodud1202
+     * @since 2021. 01. 28
+     */
+    Goods getGoodsInfo(Goods goods);
 
 
+    /**
+     * 사은품 구성 상품 정보 조회
+     * @param goods
+     * @return
+     * @author xodud1202
+     * @since 2021. 01. 28
+     */
+    Goods getGoodsCompsInfo(Goods goods);
+
+    /**
+     * 상품 재고 조회
+     * @param goodsStock
+     * @return
+     * @author xodud1202
+     * @since 2021. 01. 28
+     */
+    GoodsStock getGoodsStockInfo(GoodsStock goodsStock);
 }
 }

+ 82 - 0
src/main/java/com/style24/front/biz/service/TsfCartService.java

@@ -1,11 +1,17 @@
 package com.style24.front.biz.service;
 package com.style24.front.biz.service;
 
 
+import com.style24.core.support.session.TscSession;
+import com.style24.front.support.env.TsfConstants;
+import com.style24.persistence.domain.Cart;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsStock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import com.style24.front.biz.dao.TsfCartDao;
 import com.style24.front.biz.dao.TsfCartDao;
 
 
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.transaction.annotation.Transactional;
 
 
 /**
 /**
  * 장바구니 Service
  * 장바구니 Service
@@ -20,4 +26,80 @@ public class TsfCartService {
 	@Autowired
 	@Autowired
 	private TsfCartDao cartDao;
 	private TsfCartDao cartDao;
 
 
+	@Autowired
+	private TsfGoodsService goodsService;
+
+	/**
+	 * 장바구니 저장
+	 * 단품 : goodsCd, optCd, optCd1, optCd2
+	 * 세트 : goodsCd,
+	 * @param cart
+	 */
+	@Transactional("shopTxnManager")
+	public void saveCartInfo(Cart param) {
+		Cart cart = new Cart();			// 최종 정보가 담길 cart 객체
+		// JSESSION_ID 저장
+		param.setJsessionId(TscSession.getSessionId());
+
+		// 로그인 유무 확인 (로그인이 되어 있지 않으면 regNo 를 0으로 장바구니에 저장한다.)
+
+		// 상품 정보 확인
+		Goods goods = new Goods();		// 상품 마스터 정보
+		goods.setGoodsCd(param.getGoodsCd());
+		goods = goodsService.getGoodsInfo(goods);
+		if(goods == null) {
+			throw new IllegalArgumentException("상품 정보가 존재하지 않습니다.");
+		}
+
+		cart.setGoodsCd(goods.getGoodsCd());
+		cart.setProductNo(goods.getProductNo());
+		cart.setProductCode(goods.getProductCode());
+
+		// 재고 정보 확인
+		if(TsfConstants.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.getGoodsCd());
+					stock.setOptCd(tCart.getOptCd());
+					stock = goodsService.getGoodsStockInfo(stock);
+
+					if("Y".equals(stock.getSoldoutYn()) || stock.getCurrStockQty() < 1) {
+						throw new IllegalArgumentException("세트 구성 상품 중 품절 상품이 있습니다.");
+					}
+
+					// 세트상품 요청 수량 * 구성상품 필요 수량이 해당 구성수량의 재고보다 많으면
+					if(param.getItemQty() * 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.getSKU_MODEL_NO());
+					tCart.setProductNo(compsGoodsInfo.getProductNo());
+					tCart.setProductCode(compsGoodsInfo.getProductCode());
+					tCart.setItemQty(param.getItemQty() * compsGoodsInfo.getQty());
+				}
+			} else {
+				throw new IllegalArgumentException("세트 상품 정보가 존재하지 않습니다.");
+			}
+		} else {		// 딜상품이거나 일반 상품일 경우
+
+		}
+
+		// 현재 장바구니에 존재하는지 확인
+
+		// 존재하면 update 없으면 insert
+	}
 }
 }

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

@@ -1,5 +1,7 @@
 package com.style24.front.biz.service;
 package com.style24.front.biz.service;
 
 
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsStock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
@@ -20,4 +22,36 @@ public class TsfGoodsService {
 	@Autowired
 	@Autowired
 	private TsfGoodsDao goodsDao;
 	private TsfGoodsDao goodsDao;
 
 
+	/**
+	 * 상품 정보 조회
+	 * @param goods
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 01. 28
+	 */
+	public Goods getGoodsInfo(Goods goods) {
+		return goodsDao.getGoodsInfo(goods);
+	}
+
+	/**
+	 * 구성 상품 정보 조회
+	 * @param goods
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 01. 28
+	 */
+	public Goods getGoodsCompsInfo(Goods goods) {
+		return goodsDao.getGoodsCompsInfo(goods);
+	}
+
+	/**
+	 * 상품 재고 정보
+	 * @param goodsStock
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 01. 28
+	 */
+	public GoodsStock getGoodsStockInfo(GoodsStock goodsStock) {
+		return goodsDao.getGoodsStockInfo(goodsStock);
+	}
 }
 }

+ 42 - 5
src/main/java/com/style24/front/biz/web/TsfCartController.java

@@ -1,14 +1,16 @@
 package com.style24.front.biz.web;
 package com.style24.front.biz.web;
 
 
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-
+import com.gagaframework.web.rest.server.GagaResponse;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.core.support.session.TscSession;
 import com.style24.front.biz.service.TsfCartService;
 import com.style24.front.biz.service.TsfCartService;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.controller.TsfBaseController;
-
+import com.style24.persistence.domain.Cart;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
 
 
 /**
 /**
  * 장바구니 Controller
  * 장바구니 Controller
@@ -27,4 +29,39 @@ public class TsfCartController extends TsfBaseController {
 	@Autowired
 	@Autowired
 	private TsfCartService cartService;
 	private TsfCartService cartService;
 
 
+	/**
+	 * 장바구니 화면
+	 *
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 01. 28
+	 */
+	@GetMapping("/list/form")
+	public ModelAndView cartListForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("web/cart/cartListForm");
+
+		return mav;
+	}
+
+	/**
+	 * 장바구니 등록
+	 * @param param
+	 * @return ModelAndView
+	 * @author xodud1202
+	 * @since 2021. 01. 28
+	 */
+	@ResponseBody
+	@PostMapping("/save")
+	public GagaResponse freeGoodsPromotionSave(@RequestBody Cart param) {
+		try {
+			cartService.saveCartInfo(param);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return super.error(message.getMessage("FAIL_0001"));
+		}
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
 }
 }

+ 12 - 0
src/main/java/com/style24/front/support/env/TsfConstants.java

@@ -49,4 +49,16 @@ public class TsfConstants {
 //		}
 //		}
 //	}
 //	}
 
 
+	public enum GOODS_TYPE {
+		NORMAL("G056_N"), DEAL("G056_D"), SET("G056_S");
+
+		private String value;
+		private GOODS_TYPE(String value) {
+			this.value = value;
+		}
+
+		public String value() {
+			return value;
+		}
+	}
 }
 }

+ 14 - 0
src/main/java/com/style24/persistence/domain/Cart.java

@@ -5,6 +5,8 @@ import com.style24.persistence.TscBaseDomain;
 import com.style24.persistence.TsfPageRequest;
 import com.style24.persistence.TsfPageRequest;
 import lombok.Data;
 import lombok.Data;
 
 
+import java.util.List;
+
 /**
 /**
  * 장바구니
  * 장바구니
  *
  *
@@ -27,7 +29,19 @@ public class Cart extends TscBaseDomain {
 	private String ithrCd;		// 유입경로(공통코드 G027)
 	private String ithrCd;		// 유입경로(공통코드 G027)
 	private String contentsLoc;	// 컨텐츠위치(공통코드G028)
 	private String contentsLoc;	// 컨텐츠위치(공통코드G028)
 
 
+	// 장바구니 상세 정보
+	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 compsGoodsCd;	// 세트 구성상품 코드
+	private List<Cart> compsList;	// 구성 세트상품 리스트
 
 
 	// 다다익선 정보
 	// 다다익선 정보
 
 

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

@@ -0,0 +1,25 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+import lombok.Data;
+
+/**
+ * 장바구니
+ *
+ * @author xodud1202
+ * @since 2021.01.22
+ */
+@SuppressWarnings("serial")
+@Data
+public class Goods extends TscBaseDomain {
+	// 상품 정보
+	private String goodsCd;			// 상품번호
+	private String productNo;		// ProductNo(WMS)
+	private String productCode;		// ProductCode(WMS)
+	private String skuModelNo;		// SKUModelNo(WMS)
+	private String goodsType;		// 상품타입(공통코드G056)
+	private String compsGoodsCd;	// 세트 구성품 상품번호
+	private String optCd;			// 옵션코드
+	private String optCd1;			// 옵션코드1
+	private int qty;				// 세트 상품 구성 수량
+}

+ 24 - 0
src/main/java/com/style24/persistence/domain/GoodsStock.java

@@ -0,0 +1,24 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+import lombok.Data;
+
+/**
+ * 장바구니
+ *
+ * @author xodud1202
+ * @since 2021.01.22
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsStock extends TscBaseDomain {
+	// 재고 정보
+	private int currStockQty;		// 가용재고
+	private int baseStockQty;		// 안전재고
+	private String goodsCd;			// 상품번호
+	private String optCd;			// 옵션코드
+	private String optCd1;			// 옵션코드1(자사 : 컬러, 입점 : 옵션명1)
+	private String optCd2;			// 옵션코드1(자사 : 사이즈, 입점 : 옵션명2)
+	private String soldoutYn;		// 품절여부
+	private String SKU_MODEL_NO;	// SKUModelNo(WMS)
+}

+ 70 - 2
src/main/java/com/style24/persistence/mybatis/TsfGoods.xml

@@ -7,7 +7,75 @@
 		LIMIT #{pageable.startRow}, #{pageable.pageSize}
 		LIMIT #{pageable.startRow}, #{pageable.pageSize}
 	</sql>
 	</sql>
 	<!--// Paging -->
 	<!--// Paging -->
-	
-	
 
 
+	<!-- 상품 정보 -->
+	<select id="getGoodsInfo" parameterType="Goods" resultType="Goods">
+		/* TsfGoods.getGoods */
+		SELECT G.GOODS_CD
+		     , 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}
+	</select>
+
+	<!-- 구성 상품 정보 -->
+	<select id="getGoodsComposeInfo" parameterType="Goods" resultType="Goods">
+		/* TsfGoods.getGoodsComposeInfo */
+		SELECT GC.GOODS_CD
+			 , GC.COMPS_GOODS_CD
+			 , GC.GOODS_TYPE
+			 , 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}
+	</select>
+
+	<!-- 구성 상품 정보 -->
+	<select id="getGoodsComposeInfo" parameterType="Goods" resultType="Goods">
+		/* TsfGoods.getGoodsComposeInfo */
+		SELECT GC.GOODS_CD
+		, GC.COMPS_GOODS_CD
+		, GC.GOODS_TYPE
+		, 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}
+	</select>
+
+	<!-- 상품 재고 조회 -->
+	<select id="getGoodsComposeInfo" parameterType="Goods" resultType="Goods">
+		/* TsfGoods.getGoodsComposeInfo */
+		SELECT VS.GOODS_CD
+			 , VS.OPT_CD
+			 , VS.OPT_CD1
+			 , VS.OPT_CD2
+			 , 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}
+	</select>
 </mapper>
 </mapper>

+ 24 - 2
src/main/webapp/WEB-INF/views/web/cart/cartListForm.html

@@ -3,6 +3,8 @@
 <head>
 <head>
     <meta charset="UTF-8">
     <meta charset="UTF-8">
     <title>Title</title>
     <title>Title</title>
+    <link rel="stylesheet" href="/ux/plugins/mcxdialog/mcxdialog_ui.css"/>
+
     <!-- Include JS library -->
     <!-- Include JS library -->
     <script type="text/javascript" src="/ux/plugins/jquery/jquery-1.12.4.min.js"></script>
     <script type="text/javascript" src="/ux/plugins/jquery/jquery-1.12.4.min.js"></script>
     <script type="text/javascript" src="/ux/plugins/jquery/jquery-ui.min.js"></script>
     <script type="text/javascript" src="/ux/plugins/jquery/jquery-ui.min.js"></script>
@@ -14,6 +16,8 @@
     <script type="text/javascript" src="/ux/plugins/gaga/gaga.validation.js"></script>
     <script type="text/javascript" src="/ux/plugins/gaga/gaga.validation.js"></script>
     <script type="text/javascript" src="/ux/plugins/gaga/gaga.agGrid.js"></script>
     <script type="text/javascript" src="/ux/plugins/gaga/gaga.agGrid.js"></script>
     <script type="text/javascript" src="/ux/plugins/gaga/gaga.alert.js"></script>
     <script type="text/javascript" src="/ux/plugins/gaga/gaga.alert.js"></script>
+
+    <script type="text/javascript" src="/ux/plugins/mcxdialog/mcxdialog_ui.js"></script>
 </head>
 </head>
 <body>
 <body>
     <form id="cartInfo" name="searchForm" action="/cart/createCart">
     <form id="cartInfo" name="searchForm" action="/cart/createCart">
@@ -31,11 +35,29 @@
             alert(result.result);
             alert(result.result);
         }
         }
         $("#save").click(function() {
         $("#save").click(function() {
+            let goodsCd = "STYS000000016";
+            let i = 2;      // 구성상품 length만큼
+            let compsList = new Object;
+            for(let j = 0 ; j < i ; j++) {
+                let temp = new Object;
+                if(j == 0) {
+                    temp.compsGoodsCd = '14373757';
+                    temp.optCd = "핑크120";
+                    compList.push(temp);
+                } else {
+                    temp.compsGoodsCd = '14373758';
+                    temp.optCd = "블랙130";
+                    compsList.push(temp);
+                }
+            }
+
             let data = {
             let data = {
-                goodsCd : $("#cartInfo input[name=goodsCd]").val()
+                goodsCd : goodsCd,
+                itemQty : 2,
+                compsList : compsList
             };
             };
             let jsonData = JSON.stringify(data);
             let jsonData = JSON.stringify(data);
-            gagajf.ajaxJsonSubmit('/cart/createCartInfo', jsonData, saveFinish);
+            gagajf.ajaxJsonSubmit('/cart/save', jsonData, saveFinish);
         });
         });
     </script>
     </script>
 </body>
 </body>