Parcourir la source

상품상세 수정중

eskim il y a 5 ans
Parent
commit
9b74f1e97e

+ 19 - 9
src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java

@@ -135,7 +135,7 @@ public interface TsfGoodsDao {
 	 * @date 2021. 3. 18
 	 */
 	Collection<GoodsStock> getGoodsOptionList(Goods goods);
-	
+
 	/**
 	 * 상품 고시정보
 	 *
@@ -215,7 +215,7 @@ public interface TsfGoodsDao {
 	 * @since 2021. 3. 7
 	 */
 	GoodsSafeNo getGoodsSafeNo(Goods goods);
-	
+
 	/**
 	 * 상품  배송안내정보
 	 *
@@ -225,7 +225,7 @@ public interface TsfGoodsDao {
 	 * @since 2021. 03. 08
 	 */
 	Delivery getGoodsDeliveryInfo(String goodsCd);
-	
+
 	/**
 	 * 상품 다다익선 목록
 	 *
@@ -235,7 +235,7 @@ public interface TsfGoodsDao {
 	 * @date 2021. 3. 8
 	 */
 	Collection<Goods> getTmtbGoodsList(Goods goods);
-	
+
 	/**
 	 * 재입고 알림 미 알림 조회
 	 *
@@ -245,7 +245,7 @@ public interface TsfGoodsDao {
 	 * @date 2021. 3. 10
 	 */
 	ReinboundInform getNotReinboundInform(ReinboundInform reinboundInform);
-	
+
 	/**
 	 * 재입고알림 생성
 	 *
@@ -255,7 +255,7 @@ public interface TsfGoodsDao {
 	 * @date 2021. 3. 10
 	 */
 	void createReinboundInform(ReinboundInform reinboundInform);
-	
+
 	/**
 	 * 재입고알림 수정
 	 *
@@ -265,7 +265,7 @@ public interface TsfGoodsDao {
 	 * @date 2021. 3. 10
 	 */
 	void updateReinboundInform(ReinboundInform reinboundInform);
-	
+
 	/**
 	 * 실측사이즈 조회
 	 *
@@ -275,7 +275,7 @@ public interface TsfGoodsDao {
 	 * @date 2021. 3. 10
 	 */
 	Collection<Measurement> getMeasurementList(Goods goods);
-	
+
 	/**
 	 * 사이즈 정보 조회
 	 *
@@ -285,5 +285,15 @@ public interface TsfGoodsDao {
 	 * @date 2021. 3. 11
 	 */
 	Collection<SizeInfo> getSizeInfoList(SizeInfo sizeInfo);
-	
+
+	/**
+	 * 세트상품 구성상품정보 조회
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 21
+	 */
+	Collection<GoodsCompose> getGoodsSetComposeList(Goods goods);
+
 }

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

@@ -316,7 +316,7 @@ public class TsfGoodsService {
 	public Collection<GoodsStock> getGoodsOption2List(Goods goods) {
 		return goodsDao.getGoodsOption2List(goods);
 	}
-	
+
 	/**
 	 * 상품 옵션 목록 - 입점용
 	 *
@@ -329,8 +329,6 @@ public class TsfGoodsService {
 		return goodsDao.getGoodsOptionList(goods);
 	}
 
-	
-	
 	/**
 	 * 상품 고시정보
 	 *
@@ -553,4 +551,48 @@ public class TsfGoodsService {
 	public String createGoodsCoupon(Goods goods) {
 		return couponService.createGoodsCoupon(goods);
 	}
+
+	/**
+	 * 세트상품 구성상품정보 조회
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 21
+	 */
+	public Collection<GoodsCompose> getGoodsSetComposeList(Goods goods) {
+		Collection<GoodsCompose> getGoodsSetComposeList = goodsDao.getGoodsSetComposeList(goods);
+		for (GoodsCompose goodsExtend : getGoodsSetComposeList) {
+			Goods tmpGoods = new Goods();
+			tmpGoods.setGoodsCd(goodsExtend.getCompsGoodsCd());
+			tmpGoods.setSupplyCompCd(goods.getSupplyCompCd());
+			tmpGoods.setFrontGb(goods.getFrontGb());
+			tmpGoods.setIsApp(goods.getIsApp());
+			tmpGoods.setSiteCd(goods.getSiteCd());
+			tmpGoods.setCustGb(goods.getCustGb());
+			tmpGoods.setCustNo(goods.getCustNo());
+
+			// 상품상세
+			Goods resultGoods = this.getGoodsDesc(tmpGoods);
+			if (resultGoods != null) {
+				goodsExtend.setGoodsTitle(resultGoods.getGoodsTitle());
+				goodsExtend.setGoodsTitleDesc(resultGoods.getGoodsTitleDesc());
+				goodsExtend.setGoodsSpecialDesc(resultGoods.getGoodsSpecialDesc());
+				goodsExtend.setGoodsTopDesc(resultGoods.getGoodsTopDesc());
+				goodsExtend.setGoodsDownDesc(resultGoods.getGoodsDownDesc());
+				goodsExtend.setGoodsDesc(resultGoods.getGoodsDesc());
+			}
+
+			// 상품 옵션1(색상) 정보
+			goodsExtend.setGoodsOption1List(goodsDao.getGoodsOption1List(tmpGoods));
+			// 상품 옵션2(사이즈) 정보
+			//goodsExtend.setGoodsOption2List(goodsDao.getGoodsOption2List(tmpGoods));
+			// 고시 정보
+			goodsExtend.setGoodsNotiList(goodsDao.getGoodsNotiList(tmpGoods));
+			// 이미지 정보
+			goodsExtend.setGoodsImgList(goodsDao.getGoodsImgList(tmpGoods));
+
+		}
+		return getGoodsSetComposeList;
+	}
 }

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

@@ -130,6 +130,9 @@ public class TsfGoodsController extends TsfBaseController {
 			paramsGoods.setColorCd(goods.getMainColorCd());
 		}
 		paramsGoods.setSelfGoodsYn(goods.getSelfGoodsYn());
+		if (TscConstants.GoodsType.DEAL.value().equals(goods.getGoodsType()) || TscConstants.GoodsType.SET.value().equals(goods.getGoodsType())) {
+			paramsGoods.setColorCd("XX");
+		}
 
 		// 상품 상세
 		goods = goodsService.getGoodsDesc(goods);
@@ -156,12 +159,12 @@ public class TsfGoodsController extends TsfBaseController {
 		// 상품 공지
 		mav.addObject("goodsNoticeList", goodsService.getGoodsNoticeList(paramsGoods));
 
-		if ("G056_D".equals(goods.getGoodsType())) {	// 딜상품
+		if (TscConstants.GoodsType.DEAL.value().equals(goods.getGoodsType())) {	// 딜상품
 			// 딜 구성상품 정보
 			paramsGoods.setGoodsComposeSearchYn("Y");
-			mav.addObject("goodsExtendList", goodsService.getGoodsDealComposeList(paramsGoods));
+			mav.addObject("goodsDealComposeList", goodsService.getGoodsDealComposeList(paramsGoods));
 		} else {
-			if ("G056_N".equals(goods.getGoodsType())) {	// 일반상품
+			if (TscConstants.GoodsType.NORMAL.value().equals(goods.getGoodsType())) {	// 일반상품
 				if ("Y".equals(goods.getSelfGoodsYn())) {  // 자사상품
 					// 상품 옵션1(색상) 정보
 					mav.addObject("goodsOption1List", goodsService.getGoodsOption1List(paramsGoods));
@@ -180,8 +183,8 @@ public class TsfGoodsController extends TsfBaseController {
 				lookbook.setGoodsCd(paramsGoods.getGoodsCd());
 				mav.addObject("lookbookList", coreLookbookService.getLookbookListForGoods(lookbook));
 
-			} else if ("G056_S".equals(goods.getGoodsType())) {		// 셋트상품
-//				mav.addObject("goodsExtendList", goodsService.getGoodsSetExtendList(paramsGoods));
+			} else if (TscConstants.GoodsType.SET.value().equals(goods.getGoodsType())) {		// 셋트상품
+				mav.addObject("goodsComposeList", goodsService.getGoodsSetComposeList(paramsGoods));
 			}
 			// 상품쿠폰
 			paramsGoods.setMaxRownum(1);
@@ -228,7 +231,7 @@ public class TsfGoodsController extends TsfBaseController {
 
 		mav.addObject("params", paramsGoods);
 
-		if ("D".equals(goods.getGoodsType())) {
+		if (TscConstants.GoodsType.DEAL.value().equals(goods.getGoodsType())) {
 			if ("Y".equals(mobileYn)) {
 				mav.setViewName("mob/goods/GoodsDealFormMob");
 			} else {

+ 13 - 0
src/main/java/com/style24/persistence/domain/GoodsCompose.java

@@ -35,6 +35,8 @@ public class GoodsCompose extends TscBaseDomain {
 	private String sysImgNm;
 	private String crud;
 	private String compsGoodsNm;
+	private String compsGoodsFullNm;
+	private String colorCd;
 
 //	private String optionTitle;
 //	private String optionNm;
@@ -46,7 +48,18 @@ public class GoodsCompose extends TscBaseDomain {
 	private String supplyCompCd;
 
 	//private Collection<Coupon> goodsCouponList;
+	private Collection<GoodsStock> goodsOption1List;
+	private Collection<GoodsStock> goodsOption2List;
 	private Collection<GoodsNotiInfo> goodsNotiList;
 	private Collection<GoodsStock> goodsSizeList;
 	private Collection<GoodsImg> goodsImgList;
+
+	//상품상세 구분(10:상품타이틀,20:상품타이틀내용,30:상품특징,40:상위컨텐츠,50:하위컨텐츠,60:상위컨텐츠-모바일,70:하위컨텐츠-모바일,80:상품상세(as-is,입점))
+	private String goodsTitle; 			// 10:상품타이틀
+	private String goodsTitleDesc;		// 20:상품타이틀내용
+	private String goodsSpecialDesc;	// 30:상품특징
+	private String goodsTopDesc;		// 40:상위컨텐츠, 60:상위컨텐츠-모바일
+	private String goodsDownDesc;		// 50:하위컨텐츠, 70:하위컨텐츠-모바일
+	private String goodsDesc;			// 80:상품상세(as-is,입점)
+
 }

+ 60 - 110
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -179,6 +179,9 @@
 		INNER JOIN TB_GOODS_SUMMARY GS ON G.GOODS_CD = GS.GOODS_CD
 		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
 		                      AND B.USE_YN = 'Y'
+		INNER JOIN TB_SITE_BRAND SB ON B.BRAND_CD  = SB.BRAND_CD
+		                            AND SB.USE_YN = 'Y'
+		                            AND SB.SITE_CD = #{siteCd}
 		INNER JOIN TB_BRAND_GROUP D ON B.BRAND_GROUP_NO = D.BRAND_GROUP_NO
 		                            AND D.USE_YN = 'Y'
 		INNER JOIN TB_DELV_FEE_POLICY E ON G.SUPPLY_COMP_CD = E.SUPPLY_COMP_CD
@@ -232,63 +235,14 @@
 		    AND NOW() BETWEEN A.SOCIAL_STDT AND A.SOCIAL_EDDT
 		    AND A.FRONT_GB IN ('A', #{frontGb})
 		    AND A.APPLY_GB = 'A' -- 적용
+		    <if test='adminYn == null or adminYn != "Y"'>
+		    AND C.GOODS_STAT = 'G008_90'
+		    </if>
 		    ORDER BY A.SOCIAL_SQ DESC
 		) A
 		LIMIT 1
 	</select>
 	
-	<!-- 상품 옵션1 목록  - 자사용 -->
-	<select id="getGoodsOption1List_ORG" parameterType="Goods" resultType="GoodsStock">
-		/* TsfGoods.getGoodsOption1List */
-		SELECT GOODS_CD
-		     , OPT_CD1
-		     , STOCK_QTY
-		     , SOLDOUT_YN
-		     , DISP_ORD
-		     , SYS_IMG_NM
-		FROM (
-		     SELECT G.GOODS_CD
-		          , G.SELF_GOODS_YN
-		          , O.OPT_CD1 
-		          , (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
-		          , (CASE WHEN IFNULL(S.STOCK_QTY,0) - G.MIN_ORD_QTY >= 0 THEN STOCK_QTY
-		                 ELSE 0
-		            END ) AS STOCK_QTY
-		          , S.SOLDOUT_YN
-		          , S.DISP_ORD
-		     FROM TB_GOODS G
-		     INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
-		                           AND B.USE_YN = 'Y'
-		     INNER JOIN (SELECT GOODS_CD, OPT_CD1, MIN(DISP_ORD) AS DISP_ORD FROM TB_OPTION WHERE DISP_YN = 'Y' GROUP BY  GOODS_CD, OPT_CD1 ) O ON G.GOODS_CD = O.GOODS_CD
-		     LEFT OUTER JOIN (SELECT GOODS_CD
-		                           , OPT_CD1
-		                           , SUM(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
-		                                      ELSE CURR_STOCK_QTY
-		                                      END) AS STOCK_QTY
-		                           , MIN(SOLDOUT_YN) AS SOLDOUT_YN
-		                           , MIN(DISP_ORD) AS DISP_ORD
-		                      FROM VW_STOCK
-		                      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}
-		     AND G.GOODS_TYPE = 'G056_N' -- 일반상품
-		     ORDER BY O.DISP_ORD
-		) Z
-		WHERE 1 = 1
-		<if test='soldoutYn != null and soldoutYn == "Y"'>
-		AND (SOLDOUT_YN = 'Y'
-		     OR
-		     STOCK_QTY <![CDATA[<=]]> 0
-		    )
-		</if>
-		<if test='soldoutYn != null and soldoutYn == "N"'>
-		AND SOLDOUT_YN = 'N'
-		AND STOCK_QTY > 0
-		</if>
-		ORDER BY DISP_ORD
-	</select>
-	
 	<!-- 상품 옵션1 목록 - 자사용 -->
 	<select id="getGoodsOption1List" parameterType="Goods" resultType="GoodsStock">
 		/* TsfGoods.getGoodsOption1List */
@@ -305,6 +259,9 @@
 		                             AND O.DISP_YN = 'Y' 
 		      WHERE G.GOODS_CD =  #{goodsCd}
 		      AND G.GOODS_TYPE = 'G056_N' -- 일반상품
+		      <if test='adminYn == null or adminYn != "Y"'>
+		      AND G.GOODS_STAT = 'G008_90'
+		      </if>
 		) A
 		WHERE ROWNUM = 1
 	</select>
@@ -332,65 +289,20 @@
 		           , 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 
+		      FROM TB_GOODS G
+		      INNER JOIN TB_OPTION O ON G.GOODS_CD = O.GOODS_CD
+		                             AND O.OPT_CD1 = #{colorCd}
+		                             AND O.DISP_YN = 'Y' 
 		      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'
+		      WHERE G.GOODS_CD = #{goodsCd}
+		      <if test='adminYn == null or adminYn != "Y"'>
+		      AND G.GOODS_STAT = 'G008_90'
+		      </if>
 		     ) B
 		ORDER BY DISP_ORD
 	</select>
 	
-	<!-- 상품 옵션2 목록  - 자사용-->
-	<select id="getGoodsOption2List_ORG" parameterType="Goods" resultType="GoodsStock">
-		/* TsfGoods.getGoodsOption2List */
-		SELECT GOODS_CD
-		     , OPT_CD
-		     , OPT_CD1
-		     , OPT_CD2
-		     , STOCK_QTY
-		     , SOLDOUT_YN
-		     , DISP_ORD
-		FROM (
-		    SELECT GOODS_CD
-		         , OPT_CD
-		         , OPT_CD1
-		         , OPT_CD2
-		         , (CASE WHEN STOCK_QTY - MIN_ORD_QTY >= 0 THEN STOCK_QTY
-		                 ELSE 0
-		            END ) AS STOCK_QTY
-		         , SOLDOUT_YN
-		         , DISP_ORD
-		    FROM (
-		          SELECT GOODS_CD
-		               , OPT_CD
-		               , OPT_CD1
-		               , OPT_CD2
-		               , 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 VW_STOCK A
-		          WHERE GOODS_CD = #{goodsCd}
-		          AND COLOR = #{colorCd}
-		          AND DISP_YN = 'Y'
-		        ) B
-		     ) Z
-		WHERE 1 = 1
-		<if test='soldoutYn != null and soldoutYn == "Y"'>
-		AND (SOLDOUT_YN = 'Y'
-		     OR
-		     STOCK_QTY <![CDATA[<=]]> 0
-		    )
-		</if>
-		<if test='soldoutYn != null and soldoutYn == "N"'>
-		AND SOLDOUT_YN = 'N'
-		AND STOCK_QTY > 0
-		</if>
-		ORDER BY DISP_ORD
-	</select>
-	
 	<!-- 상품 옵션 목록  - 입점용-->
 	<select id="getGoodsOptionList" parameterType="Goods" resultType="GoodsStock">
 		/* TsfGoods.getGoodsOptionList */
@@ -415,11 +327,15 @@
 		           , 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 
+		      FROM TB_GOODS G
+		      INNER JOIN TB_OPTION O ON G.GOODS_CD = O.GOODS_CD
+		                             AND O.DISP_YN = 'Y' 
 		      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.DISP_YN = 'Y'
+		      WHERE G.GOODS_CD = #{goodsCd}
+		      <if test='adminYn == null or adminYn != "Y"'>
+		      AND G.GOODS_STAT = 'G008_90'
+		      </if>
 		     ) B
 		ORDER BY DISP_ORD
 	</select>
@@ -671,7 +587,7 @@
 		     , CERT_STATE
 		     , CERT_DIV
 		     , CERT_DT
-		FROM   TB_GOODS_SAFE_NO A
+		FROM TB_GOODS_SAFE_NO A
 		WHERE GOODS_CD = #{goodsCd}
 	</select>
 	
@@ -738,11 +654,16 @@
 		      INNER JOIN TB_GOODS G ON B.GOODS_CD = G.GOODS_CD
 		                            AND G.GOODS_STAT = 'G008_90'
 		                            AND G.SELF_MALL_YN = 'Y'
+		                            <if test='adminYn == null or adminYn != "Y"'>
+		                            AND G.GOODS_STAT = 'G008_90'
+		                            </if>
 		      INNER JOIN TB_BRAND D ON G.BRAND_CD = D.BRAND_CD
 		                    AND D.USE_YN = 'Y'
+		      INNER JOIN TB_SITE_BRAND SB ON B.BRAND_CD  = SB.BRAND_CD
+		                            AND SB.USE_YN = 'Y'
+		                            AND SB.SITE_CD = #{siteCd}
 		      INNER JOIN TB_BRAND_GROUP E ON D.BRAND_GROUP_NO = E.BRAND_GROUP_NO
 		                            AND E.USE_YN = 'Y'
-		      
 		      LEFT OUTER JOIN (SELECT GOODS_CD
 		                            , SUM(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
 		                                       ELSE CURR_STOCK_QTY END) AS STOCK_QTY
@@ -888,4 +809,33 @@
 		ORDER BY A.SIZE_GB, A.DISP_ORD
 	</select>
 	
+	<!-- 셋트 구성상품의 구성상품 -->
+	<select id="getGoodsSetComposeList"  parameterType="Goods" resultType="GoodsCompose">
+		/* TsfGoods.getGoodsSetComposeList */
+		SELECT A.GOODS_CD
+		     , A.COMPS_GOODS_CD
+		     , G.GOODS_NM AS COMPS_GOODS_NM
+		     , CONCAT(IF(IFNULL(G.GOODS_GB,'') IN ('G073_11','G073_15', ''), '',IFNULL(CONCAT('[',FN_GET_CODE_NM('G073',G.GOODS_GB),']'),'') )
+		             ,IF(G.FOREIGN_BUY_YN='Y','[해외구매대행]','' )
+		             ,IF(G.PARALLEL_IMPORT_YN = 'Y','[병행수입]','')
+		             ,IF(G.ORDER_MADE_YN='Y','[주문제작]','')
+		             ,G.GOODS_NM ) AS COMPS_GOODS_FULL_NM
+		     , A.QTY
+		     , G.BRAND_CD
+		     , G.MAIN_COLOR_CD AS COLOR_CD
+		     , G.ITEMKIND_CD
+		     , (SELECT TI.SIZE_GB FROM TB_ITEMKIND TI WHERE TI.ITEMKIND_CD = G.ITEMKIND_CD) AS SIZE_GB
+		FROM TB_GOODS_COMPOSE A
+		INNER JOIN TB_GOODS G ON A.COMPS_GOODS_CD = G.GOODS_CD
+		                      AND G.SELF_MALL_YN = 'Y' -- 자사몰 노출
+		INNER JOIN TB_BRAND B ON  G.BRAND_CD = B.BRAND_CD
+		                      AND B.USE_YN = 'Y'
+		INNER JOIN TB_SITE_BRAND SB ON B.BRAND_CD  = SB.BRAND_CD
+		                            AND SB.USE_YN = 'Y'
+		                            AND SB.SITE_CD = #{siteCd}
+		WHERE A.GOODS_CD = #{goodsCd}
+		AND A.USE_YN = 'Y'
+		ORDER BY A.DISP_ORD
+	</select>
+	
 </mapper>

+ 99 - 32
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -117,7 +117,7 @@
 										<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">
+										<span class="save_point" th:if="${goodsInfo.pntAmt > 0}">
 											스타일포인트 <th:block th:text="${#numbers.formatInteger(goodsInfo.pntAmt, 0,'COMMA')}"></th:block>P 적립예정
 										</span>
 										<button type="button" id="btn_saleCoupon_pop" class="btn btn_primary btn_sm btn_coupon"  th:if="${goodsCouponList != null and !goodsCouponList.empty}" th:onclick="cfGoodsCouponInfo([[${goodsInfo.goodsCd}]])"><span>쿠폰받기</span></button>
@@ -161,7 +161,8 @@
 								</dl>
 							</div>
 							<div class="option_box">
-								<th:block th:if="${goodsInfo.selfGoodsYn =='Y' }">
+								<th:block th:if="${goodsInfo.selfGoodsYn =='Y' }"> <!-- 자사상품 -->
+								<th:block th:if="${goodsInfo.goodsType =='G056_N' }">	<!-- 일반상품 -->
 								<div class="opt_color"  th:if="${goodsOption1List != null and !goodsOption1List.empty}" >
 									<div class="opt_header">
 										<span class="title">컬러</span>
@@ -188,12 +189,50 @@
 										<div  th:each="goodsOption2, status : ${goodsOption2List}">
 											<input type="radio" name="opt"  th:id="${goodsOption2.optCd}" th:disabled="${goodsOption2.soldoutYn == 'Y' or goodsOption2.stockQty <= 0}" 
 													th:attr="addPrice=${goodsOption2.addPrice}, optCd1=${goodsOption2.optCd1}, optCd2=${goodsOption2.optCd2}, optCd=${goodsOption2.optCd}">
-											<label th:for="${goodsOption2.optCd}"><span th:text="${goodsOption2.optCd2}" th:onclick="jfViewStock(this, [[${goodsInfo.goodsCd}]],[[${goodsOption2.optCd1}]],[[${goodsOption2.optCd2}]],[[${goodsInfo.minOrdQty}]], [[${goodsInfo.maxOrdQty}]] )">100</span></label>
+											<label th:for="${goodsOption2.optCd}"><span th:text="${goodsOption2.optCd2}" th:onclick="fnViewStock(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' }">
+								<th:block th:if="${goodsInfo.goodsType =='G056_S' }">	<!-- 세트상품 -->
+								<div class="opt_select"  th:if="${goodsComposeList != null and !goodsComposeList.empty}" >
+									<th:block th:each="goodsCompose, status : ${goodsComposeList}">
+									<div class="opt_header">
+										<span class="title" th:text="${goodsCompose.compsGoodsFullNm}">옵션</span>
+										<button type="button" id="btn_infoSize_pop" class="btn_popup" th:onclick="cfGoodsSizeInfo([[${goodsCompose.compsGoodsCd}]],[[${goodsCompose.colorCd}]] )"><span>사이즈정보</span></button>
+									</div>
+									<div class="form_field">
+										<div class="select_custom item_opt1" th:classappend="${goodsCompose.compsGoodsCd}" th:if="${goodsCompose.goodsOption1List != null and !goodsCompose.goodsOption1List.empty}" >
+											<div class="combo">
+												<div class="select">선택</div>
+												<ul class="list">
+													<th:block th:each="goodsOption, status : ${goodsCompose.goodsOption1List}" >
+													<li class="selected" th:id="|selfGoodsOpt1${goodsOption.goodsCd}|" th:if=${status.first}>선택</li> 
+													<li th:onclick="fnOption2(this, [[${goodsOption.goodsCd}]],[[${goodsOption.optCd1}]])">
+														<div th:text="${goodsOption.optCd1}">상품옵션</div>
+														<div th:if="${goodsOption.addPrice > 0}" th:text="|${#numbers.formatInteger(goodsOption.addPrice, 0,'COMMA')}원|">0원</div>
+														<input type="hidden" name="opt"  th:id="${goodsOption.optCd}" th:attr="addPrice=${goodsOption.addPrice}, optCd1=${goodsOption.optCd1},optCd2=${goodsOption.optCd2}, optCd=${goodsOption.optCd}"/>
+													</li>
+													</th:block>
+												</ul>
+											</div>
+										</div>
+									</div>
+									<div class="form_field">
+										<div class="select_custom item_opt2" disabled>
+											<div class="combo">
+												<div class="select">선택</div>
+												<ul class="list">
+													<li class="selected">선택</li> 
+												</ul>
+											</div>
+										</div>
+									</div>
+									</th:block>
+								</div>
+								</th:block>
+								</th:block>
+								<th:block th:if="${goodsInfo.selfGoodsYn =='N' }"> <!--  입점상품 -->
 								<div class="opt_select" th:if="${goodsOptionList != null and !goodsOptionList.empty}">
 									<div class="opt_header">
 											<span class="title">옵션</span>
@@ -206,7 +245,7 @@
 												<ul class="list">
 													<li class="selected" id="selfNoGoodsOpt">선택</li> 
 													<th:block th:each="goodsOption, status : ${goodsOptionList}" >
-													<li th:attr="aria-disabled=${(goodsOption.soldoutYn == 'Y' or goodsOption.stockQty <= 0)? 'true':''}, data-soldout=${(goodsOption.soldoutYn == 'Y' or goodsOption.stockQty <= 0)? 'true':''}" th:onclick="jfViewStock(this, [[${goodsInfo.goodsCd}]],[[${goodsOption.optCd1}]],[[${goodsOption.optCd}]],[[${goodsInfo.minOrdQty}]], [[${goodsInfo.maxOrdQty}]] )">
+													<li th:attr="aria-disabled=${(goodsOption.soldoutYn == 'Y' or goodsOption.stockQty <= 0)? 'true':''}, data-soldout=${(goodsOption.soldoutYn == 'Y' or goodsOption.stockQty <= 0)? 'true':''}" th:onclick="fnViewStock(this, [[${goodsInfo.goodsCd}]],[[${goodsOption.optCd1}]],[[${goodsOption.optCd}]],[[${goodsInfo.minOrdQty}]], [[${goodsInfo.maxOrdQty}]] )">
 														<div th:text="${goodsOption.optNm}">상품옵션</div>
 														<div th:if="${goodsOption.addPrice > 0}" th:text="|${#numbers.formatInteger(goodsOption.addPrice, 0,'COMMA')}원|">0원</div>
 														<input type="hidden" name="opt"  th:id="${goodsOption.optCd}" th:attr="addPrice=${goodsOption.addPrice}, optCd1=${goodsOption.optCd1},optCd2=${goodsOption.optCd2}, optCd=${goodsOption.optCd}"/>
@@ -228,10 +267,10 @@
 										<span class="title">수량</span>
 									</div>
 									<div class="number_count">
-										<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">
+										<span class="minus" onclick="fnAdjustOrderEa(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="fnChangeOrderEa(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>
+										<span class="plus" onclick="fnAdjustOrderEa(this);" adjust="+"><em class="sr-only">추가</em></span>
 									</div>
 								</div>
 							</div>
@@ -459,8 +498,8 @@
 				</div>
 				<!-- //브랜드 노출 -->
 				<!-- 상품필수정보 노출 -->
-				<div class="required_box" th:if="${goodsNotiList != null and !goodsNotiList.empty}">
-					<div class="area_infotbl">
+				<div class="required_box" >
+					<div class="area_infotbl" th:if="${goodsInfo.goodsType == 'G056_N' and goodsNotiList != null and !goodsNotiList.empty}">
 						<span class="title">상품고시정보</span>
 						<div class="tbl type1 mt30">
 							<table>
@@ -473,6 +512,21 @@
 							</table>
 						</div>
 					</div>
+					<div class="area_infotbl" th:if="${goodsInfo.goodsType == 'G056_S' and goodsComposeList != null and !goodsComposeList.empty}">
+						<span class="title">상품고시정보</span>
+						<th:block th:each="goodsCompose, status : ${goodsComposeList}">
+						<div class="tbl type1 mt30">
+							<table>
+								<tbody>
+									<tr  th:each="goodsNoti, status : ${goodsCompose.goodsNotiList}" >
+										<th th:text="${goodsNoti.niItemNm}">스타일</th>
+										<td th:text="${goodsNoti.niContent}">F94U-MD01XA60F0</td>
+									</tr>
+								</tbody>
+							</table>
+						</div>
+						</th:block>
+					</div>
 					<div class="area_kcl" th:if="${goodsSafeNo != null}">
 						<i class="ico ico_kcl"></i>
 						<p class="tit normal" th:text="${goodsSafeNo.certDiv}">
@@ -602,7 +656,7 @@
 														</li>
 													</ul>
 												</div>
-												<button type="button" class="btn btn_block btn_md" onclick="jfAddCartLookBookGoods(this);"><span>모두 쇼핑백 담기</span></button>
+												<button type="button" class="btn btn_block btn_md" onclick="fnAddCartLookBookGoods(this);"><span>모두 쇼핑백 담기</span></button>
 											</div>
 										</div>
 									</div>
@@ -628,6 +682,19 @@
 		</div>
 		<!-- // 이 상품과 비슷한 상품 -->
 	</div>
+	<!-- 상품썸네일 크게보기 팝업 -->
+	<div class="pd_pop full_pop pd_itemthumb_pop" id="pdItemThumbPop"> 
+		<div class="full_popup_wrap">
+			<h5 class="sr-only">상품썸네일 크게보기</h5>
+			<div class="btn_close">
+				<a href="" id="btn_close_itemThumbPop">닫기버튼</a>
+			</div>
+			<div class="full_pop_container">
+				<!-- 배송교환반품안내 리스트 내용 -->
+			</div>
+		</div>		
+	</div>
+	<!-- //상품썸네일 크게보기 팝업 -->
 </div>
 
 <!-- EP 제휴쿠폰 팝업 -->
@@ -681,27 +748,27 @@
 		
 	var cateNm = "";
 	// 다다익선 상품
-	var jfGoodsTmtbSearch = function(params) {
+	var fnGoodsTmtbSearch = function(params) {
 		gagajf.ajaxSubmit("/goods/detail/tmtb/frame", "html", "goodsTmtbArea", params);
 	}
 	
 	// 함께본 상품
-	var jfGoodsTogetherSearch = function(params) {
+	var fnGoodsTogetherSearch = function(params) {
 		gagajf.ajaxSubmit("/goods/detail/together/frame", "html", "goodsTogetherbArea", params);
 	}
 	
 	// 추천 상품
-	var jfGoodsRecommendSearch = function(params) {
+	var fnGoodsRecommendSearch = function(params) {
 		gagajf.ajaxSubmit("/goods/detail/recommend/frame", "html", "goodsRecommendbArea", params);
 	}
 	
 	// 비슷한 상품
-	var jfGoodsLikeSearch = function(params) {
+	var fnGoodsLikeSearch = function(params) {
 		gagajf.ajaxSubmit("/goods/detail/like/frame", "html", "goodsLikebArea", params);
 	}
 	
 	//사이즈 클릭시
-	var jfViewStock = function(obj, goodsCd, optCd1, optCd2,  minOrdQty, maxOrdQty) {
+	var fnViewStock = function(obj, goodsCd, optCd1, optCd2,  minOrdQty, maxOrdQty) {
 		let $obj = $(obj);
 		let selfGoodsYn = $("#cartForm  input[name=selfGoodsYn]").val();
 		let $target = null;
@@ -749,14 +816,14 @@
 				$("#cartForm  input[name=cea]").attr("readonly",false);
 				$("#cartForm  input[name=stock]").val(itemCnt);
 
-				jfSetTotalPrice();
+				fnSetTotalPrice();
 			}
 
 		}, "text");
 	}
 	
 	// 수량 변경 클릭
-	var jfAdjustOrderEa = function(obj) {
+	var fnAdjustOrderEa = function(obj) {
 
 		if("G056_N" == $("#cartForm  input[name=goodsType]").val()){
 			if(gagajf.isNull($("#cartForm  input[name=optCd2]").val())){
@@ -789,11 +856,11 @@
 
 		$target.val(ea);
 
-		jfChangeOrderEa();
+		fnChangeOrderEa();
 	}
 
 	//옵션 갯수 변경
-	var jfChangeOrderEa = function() {
+	var fnChangeOrderEa = function() {
 
 		if("G056_N" == $("#cartForm  input[name=goodsType]").val()){
 			if(gagajf.isNull($("#cartForm  input[name=optCd2]").val())){
@@ -833,11 +900,11 @@
 			//return;
 		}
 
-		jfSetTotalPrice();
+		fnSetTotalPrice();
 	}
 	
 	//합계 계산
-	var jfSetTotalPrice = function() {
+	var fnSetTotalPrice = function() {
 		//let f = document.cartForm;
 
 		let totalEa = 0;
@@ -935,7 +1002,7 @@
 	}
 
 	// 룩북속 상품 쇼핑백 담기
-	var jfAddCartLookBookGoods = function(obj){
+	var fnAddCartLookBookGoods = function(obj){
 		
 		let $obj = $(obj);
 		let $target = $obj.parent().find('.li_item').find('.item_prod');
@@ -981,7 +1048,7 @@
 		}
 
 		let goodsType = [[${goodsInfo.goodsType}]];
-		if (soldout && goodsType == 'G056_N') {
+		if (soldout && goodsType == 'G056_N'&& $("#cartForm  input[name=goodsGoodsYn]").val() == 'Y') {
 			$(".info_restock").show();
 		}
 	}
@@ -1005,25 +1072,25 @@
 		params.goodsOtherGb = "tmtb";
 		params.ithrCd = "tmtb";
 		params.contentsLoc = "tmtb";
-//		jfGoodsTmtbSearch(params);
+//		fnGoodsTmtbSearch(params);
 		
 		// 함께본 상품(ajax html)
 		params.goodsOtherGb = "together";
 		params.ithrCd = "tmtb";
 		params.contentsLoc = "tmtb";
-		//		jfGoodsTogetherSearch(params);
+		//		fnGoodsTogetherSearch(params);
 		
 		// 추천 상품(ajax html)
 		params.goodsOtherGb = "recommend";
 		params.ithrCd = "tmtb";
 		params.contentsLoc = "tmtb";
-		//		jfGoodsRecommendSearch(params);
+		//		fnGoodsRecommendSearch(params);
 		
 		// 비슷한 상품(ajax html)
 		params.goodsOtherGb = "like";
 		params.ithrCd = "tmtb";
 		params.contentsLoc = "tmtb";
-		//		jfGoodsLikeSearch(params);
+		//		fnGoodsLikeSearch(params);
 	
 		
 		// 상품 대표설명 > 좌측 상품썸네일 navi, 우측 상품정보 고정 
@@ -1107,10 +1174,10 @@
 		/* 1차 옵션선택 후 2차 옵션 활성화 */
 		var opt_selecter01 = new sCombo('.opt_select .select_custom.item_opt1');
 		var opt_selecter02 = new sCombo('.opt_select .select_custom.item_opt2');
-		$('.opt_select .select_custom .combo .list > li').click(function(e) {
-			$(this).parents('.form_field').next('.form_field').find('.select_custom').attr('disabled', false);
-			return false;
-		});
+		//$('.opt_select .select_custom .combo .list > li').click(function(e) {
+		//	$(this).parents('.form_field').next('.form_field').find('.select_custom').attr('disabled', false);
+		//	return false;
+		//});
 		
 		if (!gagajf.isNull([[${goodsInfo.socialSq}]])){
 			$('.timer_box').css('display', 'block');

+ 151 - 11
src/main/webapp/ux/pc/js/common-ui.js

@@ -394,17 +394,6 @@ $(document).ready( function() {
 		$("#rdi-paymethod-quick").trigger("click");
 		return false;
 	});
-
-	/* 상품상세 > 상품문의 _accordion */
-	$(document).on('click','.pd_qnalist .foldGroup .fold_head',function(e){
-		if($(this).parent().hasClass('secret_qna')){
-			alert('비밀글은 열람하실 수 없습니다.');
-		}else {
-			$(this).parents('.foldGroup li').find('.fold_cont').slideToggle(100);
-			$(this).toggleClass('on');
-		}
-	});
-	
 	
 	/* 아이디/비밀번호 찾기_accordion:open */
 	$(document).on('click','.mb .foldGroup.checkcase .fold_head',function(e){	
@@ -442,6 +431,7 @@ $(document).ready( function() {
 		return false;
 	});
 
+
 	/* 같은 데이터 노출시 동일 영역끼리 병합 */
 	$(".merge_row").each(function() {
 		var txtcont = $(this).text();
@@ -494,6 +484,156 @@ $(document).ready( function() {
 });
 
 
+/* * * * * * * * * * * * * * * * * * * * * * * 
+
+6. Content (상품상세)
+
+* * * * * * * * * * * * * * * * * * * * * */
+$(document).ready( function() {
+
+	//팝업 - 상품썸네일 크게보기
+	$(document).on('click','.pd_detail .area_pic .thumb_list_wrap ul li',function(e){
+		$('body').addClass('lock');
+		$("#pdItemThumbPop .full_pop_container").empty();
+		var thumbIndex = $(this).index() + 1;
+		var thumbImglength = $('.pd_detail .area_pic .thumb_list_wrap ul li').length;
+		var popThumbImgHtml = "";
+		for (i = 1; i <= thumbImglength; i++) {
+			//var thumbImg = $(this).find('img');
+			var thumbContentHtml = $('.pd_detail .area_pic .thumb_list_wrap ul li:nth-child('+i+') a .thumb').html();
+			popThumbImgHtml += "<div id=popThumb"+i+" class='scaleview'>" + thumbContentHtml + "</div>";
+		}
+		$("#pdItemThumbPop .full_pop_container").append(popThumbImgHtml);
+		$("#pdItemThumbPop").show(); 
+	
+		var scrollThumbPop = $('#popThumb'+thumbIndex).offset().top;
+		var currentTop = $(window).scrollTop();
+		$('#pdItemThumbPop').animate({scrollTop : scrollThumbPop - currentTop}, 1000);
+		return false;
+	}).on('click','#btn_close_itemThumbPop, .pd_itemthumb_pop .scaleview img',function(e){
+		$("#pdItemThumbPop").scrollTop(0);
+		$("#pdItemThumbPop").hide(); 
+		$('body').removeClass('lock');
+		return false;
+	});			                
+
+	// 상품 대표설명 > 좌측 상품썸네일 navi, 우측 상품정보 고정 
+	$(window).scroll(function(){
+		var scrollTop= $(window).scrollTop();
+		var headerH =  $('#header .hd_top_banner').outerHeight() + $('#header .area').outerHeight();
+		var miniGnbH = $('#header.minify .gnb').outerHeight();
+		var firstFixed =  headerH + miniGnbH;
+		var thumbListWrap_h = $('.pd_detail .thumb_list_wrap').outerHeight();
+		var descWrap_h = $('.pd_detail .desc_wrap').outerHeight();
+		var secondFixed_left =  firstFixed + $('.pd_detail').outerHeight() - $('.pd_detail .thumb_nav_wrap').outerHeight();
+		var secondFixed_right =  firstFixed + $('.pd_detail .desc_wrap').outerHeight() - $(window).outerHeight();
+		var secondFixed_right2 =  firstFixed + $('.pd_detail').outerHeight() - $(window).outerHeight();
+
+		var pdDetail_t = firstFixed + $('.pd_detail').outerHeight() + 100;
+		var pdDescWrap_t = pdDetail_t + $('.pd_desc_wrap').outerHeight();
+		var optionFixed_right =  pdDetail_t + $('.pd_desc_wrap').outerHeight() - $('.area_option .opt_wrap').outerHeight();
+
+		/* 좌측 상품썸네일 navi 고정 */
+		if (scrollTop > firstFixed){  
+			$('.pd_detail .area_pic .thumb_nav_wrap').removeClass('fixbottom').addClass('fixtop');
+		}
+		else if (scrollTop < firstFixed){
+			$('.pd_detail .area_pic .thumb_nav_wrap').removeClass('fixtop');
+		}
+		if (scrollTop > secondFixed_left){
+			$('.pd_detail .area_pic .thumb_nav_wrap').removeClass('fixtop').addClass('fixbottom');
+		} 
+		
+		/* 우측 상품정보 고정 */
+		if (thumbListWrap_h > descWrap_h && scrollTop > secondFixed_right) {
+			$('.pd_detail .area_desc .desc_wrap').removeClass('absbottom').addClass('fixbottom');
+		}
+		else if (thumbListWrap_h > descWrap_h && scrollTop < secondFixed_right) {
+			$('.pd_detail .area_desc .desc_wrap').removeClass('fixbottom');
+		}
+		if (thumbListWrap_h > descWrap_h && scrollTop > secondFixed_right2) {
+			$('.pd_detail .area_desc .desc_wrap').removeClass('fixbottom').addClass('absbottom');
+		}
+
+		/* 딜 - 상세정보 탭 고정 */
+		if (scrollTop > pdDetail_t && scrollTop < pdDescWrap_t){
+			$('.tab_detail_nav').addClass('fix');
+		} else {
+			$('.tab_detail_nav').removeClass('fix');
+		}
+
+		/* 딜 - 우측옵션 고정 */
+		if (scrollTop > pdDetail_t){
+			$('.area_option .opt_wrap').removeClass('absbottom').addClass('fixtop');
+		} else if (scrollTop < pdDetail_t) {
+			$('.area_option .opt_wrap').removeClass('fixtop');
+		}		
+		if (scrollTop > optionFixed_right){
+			$('.area_option .opt_wrap').removeClass('fixtop').addClass('absbottom');
+		}
+
+	});
+
+	//슬라이드 - 상품 대표설명 > 좌측 상품썸네일 navi
+	var thumbNavSwiper = new Swiper('.pd_detail .area_pic .thumb_nav_wrap .swiper-container', {
+		direction: 'vertical',
+		allowTouchMove: false,
+		slidesPerView: 6,
+		slidesPerGroup : 6,
+		spaceBetween: 10,
+		navigation: {
+			nextEl: '.area_pic .thumb_nav_wrap .swiper-button-next',
+			prevEl: '.area_pic .thumb_nav_wrap .swiper-button-prev',
+		},
+	});
+
+	//상품 대표설명 > 상품썸네일 1개일때
+	var thumblist = $('.pd_detail .area_pic .thumb_list_wrap li');    
+	var thumblistLength = thumblist.length;
+	if (thumblistLength == 1) {
+		thumblist.parents('.area_pic').addClass('onlyitem');
+	} else {
+		thumblist.parents('.area_pic').removeClass('onlyitem');
+	}
+
+	//상품 대표설명 > 좌측 상품썸네일 6개 이하일때
+	var thumbnavSlide = $('.pd_detail .area_pic .thumb_nav_wrap .swiper-container .swiper-slide');    
+	var thumbnavLength = thumbnavSlide.length;
+	if (thumbnavLength < 7) {
+		thumbnavSlide.parents('.thumbnav').addClass('disabled');
+	} else {
+		thumbnavSlide.parents('.thumbnav').removeClass('disabled');
+	}
+
+	//상품 대표설명 > 좌측 상품썸네일 navi 선택시 해당 대표 썸네일 위치로 이동
+	$(document).on('click','.pd_detail .area_pic .thumbnav .swiper-slide a',function(e){
+		e.preventDefault();
+		var hdHeight = $('#header').outerHeight();
+		var targetThumb = $($(this).attr('href'));
+		var topThumb = targetThumb.offset().top - hdHeight;
+		$(this).parents('.thumbnav').find('.swiper-slide').removeClass('on');
+		$(this).parent('.swiper-slide').addClass('on');
+		targetThumb.siblings('li').removeClass('on');
+		targetThumb.addClass('on');
+		$('html,body').animate({scrollTop : topThumb}, 500);
+		return false;
+	});
+
+
+	/* 상품상세 > 상품문의 _accordion */
+	$(document).on('click','.pd_qnalist .foldGroup .fold_head',function(e){
+		if($(this).parent().hasClass('secret_qna')){
+			alert('비밀글은 열람하실 수 없습니다.');
+		}else {
+			$(this).parents('.foldGroup li').find('.fold_cont').slideToggle(100);
+			$(this).toggleClass('on');
+		}
+	});
+	
+
+
+});
+
 /////////////////////////////////////////////////////// 
 // 이하  미사용 스크립트 정리예정
 //$( document ).ready(function() {