Browse Source

상품상세 개발중

eskim 5 years ago
parent
commit
438f8d401d

+ 11 - 1
src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java

@@ -53,7 +53,7 @@ public interface TsfGoodsDao {
 	 * @author eskim
 	 * @date 2021. 2. 9
 	 */
-	Collection<GoodsImg> getGoodsImgList(String goodsCd);
+	Collection<GoodsImg> getGoodsImgList(Goods goods);
 
 	/**
 	 * 상품 동영상정보
@@ -193,4 +193,14 @@ public interface TsfGoodsDao {
 	 */
 	Collection<LookbookGoods> getLookbookBannerGoodsList(Lookbook lookbook);
 
+	/**
+	 * 상품 사이즈 선택 시 재고수량 가져오기
+	 *
+	 * @param goodsStock
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 3
+	 */
+	int getGoodsStockQty(GoodsStock goodsStock);
+	
 }

+ 23 - 3
src/main/java/com/style24/front/biz/service/TsfGoodsService.java

@@ -181,9 +181,8 @@ public class TsfGoodsService {
 	 * @author eskim
 	 * @since 2021. 2. 9
 	 */
-	public Collection<GoodsImg> getGoodsImgList(String goodsCd) {
-		log.info("aa\\ {}  ", goodsDao.getGoodsImgList(goodsCd));
-		return goodsDao.getGoodsImgList(goodsCd);
+	public Collection<GoodsImg> getGoodsImgList(Goods goods) {
+		return goodsDao.getGoodsImgList(goods);
 	}
 
 	/**
@@ -383,5 +382,26 @@ public class TsfGoodsService {
 		return lookbookBannerList;
 	}
 
+	/**
+	 * 상품 사이즈 선택 시 재고수량 가져오기
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 7. 9
+	 */
+	public int getGoodsStockQty(GoodsStock goodsStock) {
+		int result = 0;
+		// 예약상품 여부 확인
+		//int goodsResSellCount = goodsDao.getGoodsResSellCount(stock.getGoodsCd());
+
+		//if ("N".equals(stock.getSelfGoodsYn()) || goodsResSellCount > 0) {
+			result = goodsDao.getGoodsStockQty(goodsStock);
+		//} else {
+		//	result = goodsDao.getGoodsStoreStockQty(stock);
+		//}
 
+		return result;
+
+	}
 }

+ 36 - 9
src/main/java/com/style24/front/biz/web/TsfGoodsController.java

@@ -7,6 +7,7 @@ import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.style24.core.biz.service.TscEnvsetService;
@@ -18,6 +19,7 @@ import com.style24.front.support.env.TsfConstants;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.CardPromotion;
 import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsStock;
 import com.style24.persistence.domain.Lookbook;
 
 import lombok.extern.slf4j.Slf4j;
@@ -72,13 +74,18 @@ public class TsfGoodsController extends TsfBaseController {
 
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
 		setGoods(paramsGoods);
-
+		
+		
 		String mobileYn = paramsGoods.getMobileYn();
 		if ("Y".equals(mobileYn)) {
 			paramsGoods.setFrontGb("M");
 		}
 
 		Goods goods = goodsService.getGoodsInfo(paramsGoods);
+		// 조회색상이 없으면 메인컬러 설정
+		if(StringUtils.isEmpty(paramsGoods.getColorCd())) {
+			paramsGoods.setColorCd(goods.getMainColorCd());
+		}
 
 		if (goods == null || goods.getGoodsCd().isEmpty()) {
 			if (StringUtils.isBlank(afLinkCd)) {
@@ -108,25 +115,29 @@ public class TsfGoodsController extends TsfBaseController {
 		paramsGoods.setCateGb("G032_101"); 		//by item
 		mav.addObject("goodsNavigation", goodsService.getGoodsNavigation(paramsGoods));
 		// 상품 이미지정보
-		mav.addObject("goodsImgList", goodsService.getGoodsImgList(paramsGoods.getGoodsCd()));
+		mav.addObject("goodsImgList", goodsService.getGoodsImgList(paramsGoods));
 		// 상품 동영상정보
 		mav.addObject("goodsVideoList", goodsService.getVideoList(paramsGoods.getGoodsCd()));
 
-		if ("D".equals(goods.getGoodsType())) {	// 딜상품
+		if ("G056_D".equals(goods.getGoodsType())) {	// 딜상품
 			// 딜 구성상품 정보
 			paramsGoods.setGoodsComposeSearchYn("Y");
 			mav.addObject("goodsExtendList", goodsService.getGoodsDealComposeList(paramsGoods));
 		} else {
-			if ("N".equals(goods.getGoodsType())) {	// 일반상품
-				// 상품 옵션1(색상) 정보
-				mav.addObject("goodsOption1List", goodsService.getGoodsOption1List(paramsGoods));
-				// 상품 옵션2(사이즈) 정보
-				mav.addObject("goodsOption2List", goodsService.getGoodsOption2List(paramsGoods));
+			if ("G056_N".equals(goods.getGoodsType())) {	// 일반상품
+				if ("Y".equals(goods.getSelfGoodsYn()) ) {  // 자사상품
+					// 상품 옵션1(색상) 정보
+					mav.addObject("goodsOption1List", goodsService.getGoodsOption1List(paramsGoods));
+					// 상품 옵션2(사이즈) 정보
+					mav.addObject("goodsOption2List", goodsService.getGoodsOption2List(paramsGoods));
+				}else {
+					//mav.addObject("goodsOptionList", goodsService.getGoodsOptionList(paramsGoods));
+				}
 
 //				// 상품 고시정보
 				mav.addObject("goodsNotiList", goodsService.getGoodsNotiList(goods));
 
-			} else if ("S".equals(goods.getGoodsType())) {		// 셋트상품
+			} else if ("G056_S".equals(goods.getGoodsType())) {		// 셋트상품
 //				mav.addObject("goodsExtendList", goodsService.getGoodsSetExtendList(paramsGoods));
 			}
 			// 상품쿠폰
@@ -164,6 +175,7 @@ public class TsfGoodsController extends TsfBaseController {
 		//기존쿠키 가져오기
 		setTodayGoodsCd(paramsGoods);
 
+		
 		mav.addObject("params", paramsGoods);
 
 		if ("D".equals(goods.getGoodsType())) {
@@ -270,4 +282,19 @@ public class TsfGoodsController extends TsfBaseController {
 		mav.setViewName(super.getDeviceViewName("goods/CardPrmtForm"));
 		return mav;
 	}
+	
+	/**
+	 * 상품 사이즈 선택 시 재고수량 가져오기
+	 * 
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 4
+	 */
+	@GetMapping("/detail/ajaxGoodsStockQty")
+	@ResponseBody
+	public int getAjaxGoodsStockQty(GoodsStock goodsStock) {
+		int stockQty = 0;
+		stockQty = goodsService.getGoodsStockQty(goodsStock);
+		return stockQty;
+	}
 }

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

@@ -72,7 +72,7 @@ public class Goods extends TscBaseDomain {
 	private String adultYn;		//성인용품여부
 
 	private String colorCd;		//색상코드
-	private String colorNM;		//색상코드명
+	private String colorNm;		//색상코드명
 	private String brandnm;		//브랜드명
 	private Integer brandGroupNo;	//브랜드그룹번호
 	private String brandGroupNm;	//브랜드그룹명

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

@@ -31,5 +31,6 @@ public class GoodsStock extends TscBaseDomain {
 	private String sysImgNm;		// 상품이미지 명
 	private int goodsQty;			// 안전재고
 	private int stockQty;			// 상품 재고
-
+	private String selfGoodsYn;		// 자사상품구분
+	
 }

+ 83 - 21
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -122,9 +122,8 @@
 		     , G.GOODS_TYPE
 		     , G.CHANGEABLE_YN
 		     , G.RETURNABLE_YN
-		     , (SELECT CATE1_NO FROM TB_SITE_BRAND WHERE  BRAND_CD = G.BRAND_CD AND SITE_CD = #{siteCd} AND USE_YN = 'Y') AS BRAND_CATE1_NO
 		     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(#{colorCd}, IFNULL(G.MAIN_COLOR_CD,'XX')) AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
-		     /*, (SELECT ) AS COLOR_NM*/
+		     , (SELECT COLOR_KNM FROM tb_color C WHERE COLOR_CD = IFNULL(NULLIF(#{colorCd},'') , G.MAIN_COLOR_CD ) AND USE_YN  = 'Y') AS COLOR_NM
 		     , BP.CURR_PRICE AS BENEFIT_PRICE
 		     , (CASE WHEN W.GOODS_CD IS NULL THEN 'N' ELSE 'Y' END) AS WISH_YN
 		     , (CASE WHEN G.GOODS_TYPE = 'G056_N' THEN (SELECT IFNULL(MAX(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
@@ -205,8 +204,8 @@
 		LIMIT 1
 	</select>
 	
-	<!-- 상품 옵션1 목록 -->
-	<select id="getGoodsOption1List" parameterType="Goods" resultType="GoodsStock">
+	<!-- 상품 옵션1 목록  - 자사용 -->
+	<select id="getGoodsOption1List_ORG" parameterType="Goods" resultType="GoodsStock">
 		/* TsfGoods.getGoodsOption1List */
 		SELECT GOODS_CD
 		     , OPT_CD1
@@ -239,7 +238,7 @@
 		                      WHERE DISP_YN = 'Y'
 		                      GROUP BY GOODS_CD, OPT_CD1) S ON G.GOODS_CD = S.GOODS_CD 
 		                                                    AND O.OPT_CD1 = S.OPT_CD1
-		     WHERE G.GOODS_CD = #{goodsCd})
+		     WHERE G.GOODS_CD = #{goodsCd}
 		     AND G.GOODS_TYPE = 'G056_N' -- 일반상품
 		     ORDER BY O.DISP_ORD
 		) Z
@@ -257,8 +256,61 @@
 		ORDER BY DISP_ORD
 	</select>
 	
-	<!-- 상품 옵션2 목록-->
+	<!-- 상품 옵션1 목록 - 자사용 -->
+	<select id="getGoodsOption1List" parameterType="Goods" resultType="GoodsStock">
+		/* TsfGoods.getGoodsOption1List */
+		SELECT *
+		FROM (
+		      SELECT G.GOODS_CD
+		           , G.SELF_GOODS_YN
+		           , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IF(G.SELF_GOODS_YN ='Y', O.OPT_CD1, 'XX') AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
+		           , O.OPT_CD1
+		           , O.DISP_ORD
+		           , RANK() OVER(PARTITION BY O.GOODS_CD , O.OPT_CD1 ORDER BY O.DISP_ORD) ROWNUM
+		      FROM TB_GOODS G
+		      INNER JOIN TB_OPTION O ON G.GOODS_CD = O.GOODS_CD
+		                             AND O.DISP_YN = 'Y' 
+		      WHERE G.GOODS_CD =  #{goodsCd}
+		      AND G.GOODS_TYPE = 'G056_N' -- 일반상품
+		) A
+		WHERE ROWNUM = 1
+	</select>
+		
+	<!-- 상품 옵션2 목록  - 자사용-->
 	<select id="getGoodsOption2List" parameterType="Goods" resultType="GoodsStock">
+		/* TsfGoods.getGoodsOption2List */
+		SELECT GOODS_CD
+		     , OPT_CD
+		     , OPT_CD1
+		     , OPT_CD2
+		     , ADD_PRICE 
+		     , (CASE WHEN STOCK_QTY - MIN_ORD_QTY >= 0 THEN STOCK_QTY
+		             ELSE 0
+		        END ) AS STOCK_QTY
+		     , SOLDOUT_YN
+		     , DISP_ORD
+		FROM (
+		      SELECT O.GOODS_CD
+		           , O.OPT_CD
+		           , O.OPT_CD1
+		           , O.OPT_CD2
+		           , O.ADD_PRICE 
+		           , VS.CURR_STOCK_QTY AS STOCK_QTY
+		           , O.SOLDOUT_YN
+		           , O.DISP_ORD
+		           , (SELECT MIN_ORD_QTY FROM TB_GOODS WHERE GOODS_CD = O.GOODS_CD ) AS MIN_ORD_QTY
+		      FROM TB_OPTION O 
+		      INNER JOIN VW_STOCK VS ON O.GOODS_CD = VS.GOODS_CD
+		                          AND O.OPT_CD = VS.OPT_CD
+		      WHERE O.GOODS_CD = #{goodsCd}
+		      AND O.OPT_CD1 = #{colorCd}
+		      AND O.DISP_YN = 'Y'
+		     ) B
+		ORDER BY DISP_ORD
+	</select>
+	
+	<!-- 상품 옵션2 목록  - 자사용-->
+	<select id="getGoodsOption2List_ORG" parameterType="Goods" resultType="GoodsStock">
 		/* TsfGoods.getGoodsOption2List */
 		SELECT GOODS_CD
 		     , OPT_CD
@@ -282,23 +334,14 @@
 		               , OPT_CD
 		               , OPT_CD1
 		               , OPT_CD2
-		               , STOCK_QTY
+		               , CURR_STOCK_QTY AS STOCK_QTY
 		               , SOLDOUT_YN
 		               , DISP_ORD
 		               , (SELECT MIN_ORD_QTY FROM TB_GOODS WHERE GOODS_CD = A.GOODS_CD ) AS MIN_ORD_QTY
-		          FROM (
-		                SELECT GOODS_CD
-		                     , OPT_CD
-		                     , OPT_CD1
-		                     , OPT_CD2
-		                     , CURR_STOCK_QTY AS STOCK_QTY
-		                     , SOLDOUT_YN
-		                     , DISP_ORD
-		                FROM VW_STOCK
-		                WHERE GOODS_CD = #{goodsCd}
-		                AND DISP_YN ='Y'
-		                AND OPT_CD2 IS NOT NULL
-		               ) A
+		          FROM VW_STOCK A
+		          WHERE GOODS_CD = #{goodsCd}
+		          AND COLOR = #{colorCd}
+		          AND DISP_YN = 'Y'
 		        ) B
 		     ) Z
 		WHERE 1 = 1
@@ -346,7 +389,7 @@
 	</select>
 		
 	<!-- 상품 이미지 정보 -->
-	<select id="getGoodsImgList" parameterType="String" resultType="GoodsImg">
+	<select id="getGoodsImgList" parameterType="Goods" resultType="GoodsImg">
 		/* TsfGoods.getGoodsImgList */
 		SELECT GOODS_CD
 		     , COLOR_CD
@@ -356,6 +399,7 @@
 		     , MOUSEOVER_IMG_YN
 		FROM TB_GOODS_IMG
 		WHERE GOODS_CD = #{goodsCd}
+		AND COLOR_CD = #{colorCd}
 		ORDER BY DISP_ORD
 	</select>
 	
@@ -603,4 +647,22 @@
 		) Z
 	</select>
 	
+	<!-- 상품 사이즈 선택 시 재고수량 가져오기 -->
+	<select id="getGoodsStockQty"  parameterType="GoodsStock" resultType="int">
+		/* TsfGoods.getGoodsStockQty */
+		SELECT (CASE WHEN STOCK_QTY - MIN_ORD_QTY >= 0 THEN STOCK_QTY
+		             ELSE 0
+		        END ) AS STOCK_QTY
+		FROM ( 
+		    SELECT CASE WHEN A.SOLDOUT_YN = 'Y' THEN 0
+		                ELSE A.CURR_STOCK_QTY
+		           END AS STOCK_QTY
+		           , B.MIN_ORD_QTY
+		    FROM  VW_STOCK A
+		    INNER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
+		    WHERE A.GOODS_CD = #{goodsCd}
+		    AND A.OPT_CD = #{optCd}
+		) Z
+	</select>
+	
 </mapper>

+ 2 - 1
src/main/webapp/WEB-INF/views/web/goods/CardPrmtFormWeb.html

@@ -17,7 +17,7 @@
 <div class="modal-dialog" role="document">
 	<div class="modal-content">
 		<div class="modal-header">
-			<h5 class="modal-title" id="bnfCardLabel">카드혜택111111</h5>
+			<h5 class="modal-title" id="bnfCardLabel">카드혜택</h5>
 		</div>
 		<div class="modal-body" th:if="${cardInfoList != null and !cardInfoList.empty}">
 			<div class="pop_cont">
@@ -94,4 +94,5 @@
 		</div>
 	</div>
 </div>	
+<a href="#close-modal" rel="modal:close" onclick="cfCloseLayer('layer_card_benefit')" class="close-modal">Close</a>
 </html>

+ 233 - 101
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -60,7 +60,10 @@
 					<input type="hidden" name="contentsLoc" th:value="${params.contentsLoc}" />
 					<input type="hidden" name="ithrCd"  th:value="${params.ithrCd}" />
 					<input type="hidden" name="planDtlSq" th:value="${params.planDtlSq}" />
-					<input type="hidden" name="sizeCd" />
+					<input type="hidden" name="optCd" />
+					<input type="hidden" name="optCd1" />
+					<input type="hidden" name="optCd2" />
+					<input type="hidden" name="addPrice" />
 					<input type="hidden" name="ordQty" />
 					<input type="hidden" name="stock" />
 					<input type="hidden" name="minOrdQty"/>
@@ -102,11 +105,11 @@
 										<span class="sale_percent" th:if="${goodsInfo.dcRate > 0}" th:text="|${goodsInfo.dcRate}%|">
 											5%
 										</span>
-										<span class="sale_price" th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}">
-											<em>134,100</em>원
+										<span class="sale_price" >
+											<em th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}">134,100</em>원
 										</span>
-										<del class="org_price" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">
-											149,000원
+										<del class="org_price" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" >
+											<em th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</em>
 										</del>
 										<span class="save_point">
 											스타일포인트 <th:block th:text="${#numbers.formatInteger(goodsInfo.pntAmt, 0,'COMMA')}"></th:block>P 적립예정
@@ -144,92 +147,43 @@
 								</dl>
 							</div>
 							<div class="option_box">
-								<div class="opt_color">
+								<th:block th:if="${goodsInfo.selfGoodsYn =='Y' }">
+								<div class="opt_color"  th:if="${goodsOption1List != null and !goodsOption1List.empty}" >
 									<div class="opt_header">
 										<span class="title">컬러</span>
-										<span class="color">그레이</span>
+										<span class="color" th:text="${goodsInfo.colorNm}">그레이</span>
 									</div>
-									<ul>
-										<li>
-											<a href="" class="on">  <!-- 해당 컬러 상품페이지로 이동 -->
-												<img src="/images/pc/thumb/tmp_cartColor1.jpg" alt="그레이">
-											</a>
-										</li>
-										<li>
-											<a href="">
-												<img src="/images/pc/thumb/tmp_cartColor1.jpg" alt="베이지">
-											</a>
-										</li>
-										<li>
-											<a href="">
-												<img src="/images/pc/thumb/tmp_cartColor1.jpg" alt="그린">
-											</a>
-										</li>
-										<li>
-											<a href="">
-												<img src="/images/pc/thumb/tmp_cartColor1.jpg" alt="핑크">
-											</a>
-										</li>
-										<li>
-											<a href="">
-												<img src="/images/pc/thumb/tmp_cartColor1.jpg" alt="민트">
-											</a>
-										</li>
-										<li>
-											<a href="">
-												<img src="/images/pc/thumb/tmp_cartColor1.jpg" alt="블랙">
+									<ul >
+										<li th:each="goodsOption1, status : ${goodsOption1List}">
+											<a href="javascript:void(0);" th:class="${params.colorCd == goodsOption1.optCd1}? 'on':''" th:onclick="cfnGoToGoodsDetail([[${goodsInfo.goodsCd}]], [[${goodsOption1.optCd1}]])">  <!-- 해당 컬러 상품페이지로 이동 -->
+												<img th:src="${imgGoodsUrl+'/'+goodsOption1.sysImgNm}" alt="">
 											</a>
 										</li>
 									</ul>
 								</div>
-								<div class="opt_size">
+								<div class="opt_size"  th:if="${goodsOption2List != null and !goodsOption2List.empty}" >
 									<div class="opt_header">
 										<span class="title">사이즈</span>
 										<span class="size">
-											<em>95</em>
-											<em>(+1,000원)</em>
+											<em id="selectOptCd1"></em>
+											<em id="selectOptCd1addPrice"></em>
 										</span>
 										<button type="button" id="btn_infoSize_pop" class="btn_popup"><span>사이즈정보</span></button>
 									</div>
 									<div class="form_field">
-										<div>
+										<!-- <div>
 											<input type="radio" name="rdi-optsize" id="rdi-optsize1" value="" checked="">
 											<label for="rdi-optsize1"><span>90</span></label>
-										</div>
-										<div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize2" value="" disabled="">
-											<label for="rdi-optsize2"><span>95</span></label>
-										</div>
-										<div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize3" value="">
-											<label for="rdi-optsize3"><span>100</span></label>
-										</div>
-										<div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize4" value="">
-											<label for="rdi-optsize4"><span>105</span></label>
-										</div>
-										<div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize5" value="">
-											<label for="rdi-optsize5"><span>110</span></label>
-										</div>
-										<div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize6" value="">
-											<label for="rdi-optsize6"><span>115</span></label>
-										</div>
-										<div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize7" value="">
-											<label for="rdi-optsize7"><span>free</span></label>
-										</div>
-										<div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize8" value="">
-											<label for="rdi-optsize8"><span>size1</span></label>
-										</div>
-										<div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize9" value="">
-											<label for="rdi-optsize9"><span>size2</span></label>
+										</div> -->
+										<div  th:each="goodsOption2, status : ${goodsOption2List}">
+											<input type="radio" name="rdi-optsize"  th:disabled="${goodsOption2.soldoutYn == 'Y' or goodsOption2.stockQty <= 0}" 
+													th:attr="addPrice=${goodsOption2.addPrice}, optCd1=${goodsOption2.optCd1}, optCd=${goodsOption2.optCd}">
+											<label th:for="${goodsInfo.goodsCd + '-'+ goodsInfo.colorCd + '-' +goodsOption2.optCd2}"><span th:text="${goodsOption2.optCd2}" th:onclick="jfViewStock(this, [[${goodsInfo.goodsCd}]],[[${goodsOption2.optCd1}]],[[${goodsOption2.optCd2}]],[[${goodsInfo.minOrdQty}]], [[${goodsInfo.maxOrdQty}]] )">100</span></label>
 										</div>
 									</div>
 								</div>
+								</th:block>
+								<th:block th:if="${goodsInfo.selfGoodsYn =='N' }">
 								<div class="opt_select">
 									<form class="form_wrap">
 										<div class="form_field">
@@ -255,12 +209,12 @@
 												</div>
 											</div>
 										</div>
-										<div class="form_field">
+										<!-- <div class="form_field">
 											<div class="select_custom item_opt2" disabled="">
 												<div class="combo">
 													<div class="select">선택</div>
 													<ul class="list">
-														<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
+														선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가 
 														<li class="selected">선택</li> 
 														<li>상품옵션11</li>
 														<li>상품옵션12</li>
@@ -277,15 +231,16 @@
 													</ul>
 												</div>
 											</div>
-										</div>
+										</div> -->
 									</form>
-								</div>					  
+								</div>
+								</th:block>
 								<!-- 해당 상품 품절시 노출 -->
 								<div class="info_restock">
 									<a href="" id="btn_pushRestock_pop" class="btn_popup">재입고 시 알림을 받아보세요</a>
 								</div>
 								<!-- //해당 상품 품절시 노출 -->
-								<div class="opt_result">
+								<!-- <div class="opt_result">
 									<div class="result_item">
 										<div class="opt_header">
 											<span class="item_name">[상품1] 남성 테이퍼드핏 기모면 올밴딩 팬트</span>
@@ -316,41 +271,44 @@
 										</div>
 										<button type="button" class="btn_delete_item"><span>삭제</span></button>
 									</div>
-								</div>
+								</div> -->
 								<div class="opt_count">
 									<div class="opt_header">
 										<span class="title">수량</span>
 									</div>
 									<div class="number_count">
-										<span class="minus"><em class="sr-only">감소</em></span>
-										<input type="text" name="" maxlength="3" style="ime-mode:disabled" value="1">
-										<span class="plus"><em class="sr-only">추가</em></span>
+										<span class="minus" onclick="jfAdjustOrderEa(this);" adjust="-"><em class="sr-only">감소</em></a></span>
+										<input type="text" name="cea" maxlength="3" style="ime-mode:disabled" th:value="${goodsInfo.minOrdQty}" onblur="jfChangeOrderEa(this)" data-valid-type="numeric">
+										<input type="hidden" name="coption" value=""   th:attr="price=${goodsInfo.currPrice}">
+										<span class="plus" onclick="jfAdjustOrderEa(this);" adjust="+"><em class="sr-only">추가</em></span>
 									</div>
 								</div>
 							</div>
 							<div class="price_box">
 								<p class="number">
-									총&nbsp;<span>99</span>개
+									총&nbsp;<span id="goodsTotalQty">0</span>개
 								</p>
 								<p class="price">
 									<span>
-										99,999,999<em>원</em>
+										<b id="goodsTotalPrice">0</b><em>원</em>
 									</span>
 								</p>
 							</div>
 							<div class="btn_box">
 								<div class="btn_group_block ui_row">
+								<th:block  th:if="${goodsInfo.stockQty > 0}">
 									<div class="ui_col_6">
-										<button id="btn_add_cart" class="btn btn_dark btn_block"><span>쇼핑백</span></button>
+										<button id="btn_add_cart" class="btn btn_dark btn_block" onclick="jfAddCart('C');"><span>쇼핑백</span></button>
 									</div>
 									<div class="ui_col_6">
-										<button class="btn btn_primary btn_block" id=""><span>바로구매</span></button>
+										<button class="btn btn_primary btn_block" onclick="jfAddCart('O');"><span>바로구매</span></button>
 									</div>
-								</div>
-								<div class="btn_group_block ui_row">
+								</th:block>
+								<th:block  th:unless="${goodsInfo.stockQty > 0}">
 									<div class="ui_col_12">
 										<button class="btn btn_dark btn_block" id="" disabled=""><span>SOLD OUT</span></button>
 									</div>
+								</th:block>
 								</div>
 							</div>
 							<div class="npay_box">
@@ -3455,20 +3413,8 @@
 		setInterval(function() { promotionTimer(); }, 1000);
 
 		/* 상품옵션변경 팝업 > 수량조절 */
-		$(document).on('click','.option_box .opt_count .number_count .minus',function(e){
-			var $input = $(this).parent().find('input');
-			var count = parseInt($input.val()) - 1;
-			count = count < 1 ? 1 : count;
-			$input.val(count);
-			$input.change();
-			return false;
-		}).on('click','.option_box .opt_count .number_count .plus',function(e){
-			var $input = $(this).parent().find('input');
-			$input.val(parseInt($input.val()) + 1);
-			$input.change();
-			return false;
-		});
-
+//		
+		
 		//스타일링 추천 picker	
 		$(document).on('mouseenter','.pd_recommend .area_slider .item_picker button',function(e){
 			$(this).parents('.item_picker').find('.pick_descr').show();
@@ -3746,6 +3692,192 @@
 		});
 
 	});
+	
+	//사이즈 클릭시
+	var jfViewStock = function(obj, goodsCd, optCd1, optCd2,  minOrdQty, maxOrdQty) {
+		let $obj = $(obj);
+
+		var $target = $obj.parent().parent().children('input[name="rdi-optsize"]');
+		$target.prop("checked",true);
+		var addPrice  = $target.attr("addPrice");
+		var optCd  = $target.attr("optCd");
+		$("#selectOptCd1").html(optCd2);
+		if (Number(addPrice) > 0) $("#selectOptCd1addPrice").html("(+" + addPrice.addComma() + ")");
+		$("#cartForm  input[name=optCd]").val(optCd);
+		$("#cartForm  input[name=optCd1]").val(optCd1);
+		$("#cartForm  input[name=optCd2]").val(optCd2);
+		$("#cartForm  input[name=addPrice]").val(addPrice);
+		$("#cartForm  input[name=ordQty]").val("");
+		var selfGoodsYn = $("#cartForm  input[name=selfGoodsYn]").val();
+
+		var maxCnt = maxOrdQty;
+		var params = new Object();
+		params.goodsCd = goodsCd;
+		params.optCd = optCd;
+		params.optCd1 = optCd1;
+		params.optCd2 = optCd2;
+		params.selfGoodsYn = selfGoodsYn;
+
+		$.get("/goods/detail/ajaxGoodsStockQty", $.param(params), function(result) {
+			var itemCnt = eval(result); //해당 아이템에 선택되어진 사이즈의 수량
+
+			if (maxCnt > itemCnt) {
+				maxCnt = itemCnt;
+			}
+
+			if (minOrdQty > itemCnt) {
+				$target.prop("disabled", true);
+			}else{
+				$("#cartForm  input[name=ordQty]").val(minOrdQty);
+				$("#cartForm  input[name=maxOrdQty]").val(maxCnt);
+				$("#cartForm  input[name=minOrdQty]").val(minOrdQty);
+				$("#cartForm  input[name=cea]").val(minOrdQty);
+				$("#cartForm  input[name=cea]").attr("readonly",false);
+				$("#cartForm  input[name=stock]").val(itemCnt);
+
+				jfSetTotalPrice();
+			}
+
+		}, "text");
+	}
+	
+	// 수량 변경 클릭
+	var jfAdjustOrderEa = function(obj) {
+
+		if("G056_N" == $("#cartForm  input[name=goodsType]").val()){
+			if(gagajf.isNull($("#cartForm  input[name=optCd2]").val())){
+				mcxDialog.alert("사이즈를 선택하세요.");
+				return false;
+			}
+		}else{
+			// 세트작업시 작업요망 eskim
+			/* var targetSize=$('.sizelist').length;	//구성품 갯수;
+			var itemSize = $('.option').find('.item').find('input[type=radio]:checked').length;	//사이즈 선택 상품수
+			if (targetSize > itemSize){
+				mcxDialog.alert("구성상품들의 사이즈를 선택하세요.");
+				return false;
+			} */
+		}
+
+		var $obj = $(obj);
+		var $target = $obj.parent().children('input[name="cea"]');
+		var minOrdQty = parseInt($("#cartForm  input[name=minOrdQty]").val());
+		var ea =parseInt($target.val());
+
+		if ($obj.attr('adjust') == '-') --ea;
+		else ++ea;
+
+		//var maxOrdQty = $("#cartForm  input[name=maxOrdQty]").val();
+
+		//if (maxOrdQty && ea > maxOrdQty) ea = maxOrdQty;
+		if (ea.toString().length > parseInt($target.attr('maxlength'))) --ea;
+		if (ea < 1) ea = minOrdQty;
+
+		$target.val(ea);
+
+		jfChangeOrderEa();
+	}
+
+	//옵션 갯수 변경
+	var jfChangeOrderEa = function() {
+
+		if("G056_N" == $("#cartForm  input[name=goodsType]").val()){
+			if(gagajf.isNull($("#cartForm  input[name=optCd2]").val())){
+				mcxDialog.alert("사이즈를 선택하세요.");
+				return false;
+			}
+		}else{
+			// 세트작업시 작업요망 eskim
+			/* var targetSize=$('.sizelist').length;	//구성품 갯수;
+			var itemSize = $('.option').find('.item').find('input[type=radio]:checked').length;	//사이즈 선택 상품수
+			if (targetSize > itemSize){
+				mcxDialog.alert("구성상품들의 사이즈를 선택하세요.");
+				return false;
+			} */
+		}
+
+		var f = document.cartForm;
+		var ea = parseInt($("#cartForm  input[name=cea]").val());
+		var buymin = parseInt($("#cartForm  input[name=minOrdQty]").val());
+		var buymax = parseInt($("#cartForm  input[name=maxOrdQty]").val());
+		var alertMsg = '';
+		if (ea < buymin) {
+			alertMsg ="최소 주문 가능 수량은 "+buymin+"개 입니다.";
+			ea = buymin;
+		}
+
+		if (ea > buymax) {
+			alertMsg = "최대 주문 가능 수량은 "+buymax+"개 입니다.";
+			ea = buymax;
+		}
+
+		$("#cartForm  input[name=cea]").val(ea);
+		$("#cartForm  input[name=ordQty]").val(ea);
+
+		if (alertMsg != ''){
+			mcxDialog.alert(alertMsg);
+			//return;
+		}
+
+		jfSetTotalPrice();
+
+	}
+	
+	//합계 계산
+	var jfSetTotalPrice = function() {
+		var f = document.cartForm;
+
+		var totalEa = 0;
+		var totalPrice = 0;
+
+		$('input[name="cea"]').each(function() {
+			var ea = parseInt($(this).val());
+			var addPrice = parseInt($("#cartForm  input[name=addPrice]").val());
+			var goodsPrice = parseInt($(this).parent().find('input[name="coption"]').attr('price'));
+
+			totalEa += ea;
+			if (goodsPrice > 0) {
+				totalPrice += ((goodsPrice+addPrice) * ea);
+			}
+		});
+
+		$('#goodsTotalQty').html(totalEa.addComma());
+		$('#goodsTotalPrice').html(totalPrice.addComma());
+		
+	}
+	
+	//장바구니담기
+	var jfAddCart = function(btnType){
+		var params = [];
+		var goodsType = $("#cartForm  input[name=goodsType]").val();
+
+		if (goodsType == 'G056_N'){
+			if (gagajf.isNull($("#cartForm  input[name=optCd2]").val())) {
+				
+				return;
+			}
+		
+			var obj = new Object();
+			obj.goodsCd = $("#cartForm  input[name=goodsCd]").val();
+			obj.optCd = $("#cartForm  input[name=optCd]").val();
+			obj.goodsQty = $("#cartForm  input[name=ordQty]").val();
+			obj.goodsType = $("#cartForm  input[name=goodsType]").val();
+			//obj.dealGoodsCd = $("#cartForm  input[name=goodsType]").val();
+			obj.cartGb = btnType;
+			obj.afLinkCd =$("#cartForm  input[name=afLinkCd]").val();
+			obj.ithrCd =$("#cartForm  input[name=ithrCd]").val();
+			obj.contentsLoc =$("#cartForm  input[name=contentsLoc]").val();
+			obj.planDtlSq =$("#cartForm  input[name=planDtlSq]").val();
+			params.push(obj);
+
+		}else if (goodsType == 'G056_S'){  //수정요
+			alert("작업필요");
+		}
+		// 장바구니담기
+		cfnAddCart(params);
+	}
+
+	
 /*]]>*/
 </script>
 </th:block>

+ 24 - 4
src/main/webapp/ux/style24_link.js

@@ -145,9 +145,9 @@ var cfnOpenIpinCertify = function (redirectUrl) {
 /**
  * @type   : function
  * @access : public
- * @desc   : 장바구니 등록
+ * @desc   : 장바구니 등록  temp.cartGb :C 장바구니, O:바로구매
  * <pre>
- *		cfnOpenIpinCertify(cartList);
+ *		cfnAddCart(cartList);
  *		cartList는 Array로 등록해주셔야합니다.
  *		ex) 일반 & deal 상품 장바구니 등록 (일반&딜 상품도 배열에 담아서 전송해주세요.)
  *			let compsList = [];
@@ -293,8 +293,9 @@ var cfnLoginYes24 = function (requestGb, chkRememberMe) {
  * @since  : 2021/03/02
  * @author : eskim
  */
-var cfnGoToGoodsDetail = function (goodsCd, ithrCd, contentsLoc, planDtlSq) {
+var cfnGoToGoodsDetail = function (goodsCd, colorCd, ithrCd, contentsLoc, planDtlSq) {
 	var params = goodsCd;
+	params += "&colorCd=" + colorCd;
 	if (typeof (ithrCd) != 'undefined') params += "&ithrCd=" + ithrCd;
 	if (typeof (contentsLoc) != 'undefined' && contentsLoc != "") params += "&contentsLoc=" + contentsLoc;
 	if (typeof (planDtlSq) != 'undefined') params += "&planDtlSq=" + planDtlSq;
@@ -323,7 +324,7 @@ function cfOpenLayer(page, tgt, oParam, callbackFnc) {
             $('#' + tgt).html(result);
             $('#' + tgt).modal("show");
             //$('#' + tgt).show();
-            layerPop_resize(tgt);
+            //layerPop_resize(tgt);
             if (callbackFnc && $.isFunction(callbackFnc))
                 callbackFnc();
         }
@@ -346,6 +347,25 @@ function layerPop_resize(tgt) {
     $("#" + tgt).find(".modal").css('top', thisT + 'px');
 }
 
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 공통 레이어 닫기(레이어 숨기기)
+ * <pre>
+ *     cfCloseLayer("layer_card_benefit");
+ * </pre>
+ * @param  : tgt - 숨길 레이어 ID(예, div 태크의 ID). 필수
+ */
+function cfCloseLayer(tgt) {
+	if (_frontGb == "M"){
+		btnClose(tgt);
+	}else{
+		$('#' + tgt).hide();
+		$('#' + tgt).remove();
+	}
+	return false;
+}
+
 /**
 * @type   : function
 * @access : public