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

이태영 - 20210524 네이버페이 주문형 개발 중

xodud lee 5 лет назад
Родитель
Сommit
dfbf507dbb

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

@@ -428,4 +428,13 @@ public interface TsfGoodsDao {
 	 * @since 2020. 05. 20
 	 */
 	Collection<Goods> getGoodsDetailOrderGradeList(Goods goods);
+
+	/**
+	 * 구성 상품 목록
+	 * @param goods
+	 * @return
+	 * @author xodud1202
+	 * @since 2020. 05. 25
+	 */
+	Collection<Goods> getCompsGoodsList(Goods goods);
 }

+ 185 - 71
src/main/java/com/style24/front/biz/service/TsfOrderService.java

@@ -1159,52 +1159,47 @@ public class TsfOrderService {
 				sb.append("\t\t<name>").append("<![CDATA[").append(item.getGoodsNm()).append("]]>").append("</name>\n");	//<!-- 상품명 -->
 				sb.append("\t\t<basePrice>").append(item.getCurrPrice()).append("</basePrice>\n");				//<!-- 상품금액 -->
 				// TODO http: 부분 운영 프로토콜 확인 후 수정 필요(운영 상품상세가 HTTPS일 경우 분기처리 필요(개발서버, 운영 구분))
-				sb.append("\t\t<infoUrl>").append("<![CDATA[https:").append(param.getGoodsUrl()).append(item.getGoodsCd()).append("]]>").append("</infoUrl>\n");	//<!-- 상품상세페이지 URL -->
+				sb.append("\t\t<infoUrl>").append("<![CDATA[https:").append(param.getGoodsUrl()).append(item.getGoodsCd()).append("]]>").append("</infoUrl>\n");		//<!-- 상품상세페이지 URL -->
 				sb.append("\t\t<imageUrl>").append("<![CDATA[https:").append(goodsImgUrl).append("/").append(item.getSysImgNm()).append("]]>").append("</imageUrl>\n");	//<!-- 상품원본이미지 URL -->
 
-				// 세트상품은 single quantity를 입력해야한다
-				/*sb.append("\t\t<single>\n");
-				sb.append("\t\t\t<quantity>").append(item.getGoodsQty()).append("</quantity>\n");
-				sb.append("\t\t</single>\n");*/
 				if(TscConstants.GoodsType.SET.value().equals(item.getGoodsType())) {		// 세트상품
-					// 구성상품 옵션정보 split
-					String[] optCds        = item.getOptCd().split(",");			// 옵션코드
-					String[] itemCds       = item.getItemCd().split(",");			// 상품코드
-
 					// 세트상품 manageCode 정렬 (optCd ASC)
 					Goods option = new Goods();
-					option.setArrGoodsCd(itemCds);
-					option.setSizeArr(optCds);
+					option.setArrGoodsCd(item.getItemCd().split(","));
+					option.setSizeArr(item.getOptCd().split(","));
 					List<Goods> optionList = (ArrayList<Goods>) goodsDao.getOrderGoodsOptionList(option);
 
 					StringBuilder manageCode = new StringBuilder();
+					int k = 0;
 					for(Goods opt : optionList) {
+						if(k++ > 0) manageCode.append("/");
 						manageCode.append(opt.getOptCd());
 					}
 
 					// 옵션 정보
 					sb.append("\t\t<option>\n");
-					sb.append("\t\t\t<quantity>").append(item.getGoodsQty()).append("</quantity>\n");    //<!-- 옵션수량-->
-					sb.append("\t\t\t<price>").append(item.getOptAddPrice()).append("</price>\n");			//<!-- 옵션금액 -->
-					sb.append("\t\t\t<manageCode>").append(manageCode).append("</manageCode>\n");	//<!-- 옵션관리코드 -->
+					sb.append("\t\t\t<quantity>").append(item.getGoodsQty()).append("</quantity>\n");	//<!-- 옵션수량-->
+					sb.append("\t\t\t<price>").append(item.getOptAddPrice()).append("</price>\n");		//<!-- 옵션금액 -->
+					sb.append("\t\t\t<manageCode>").append(manageCode).append("</manageCode>\n");		//<!-- 옵션관리코드 -->
 
-					// 칼라코드
-					/*for(int i = 0 ; i < itemNms.length ; i++) {
-						// 상품명, 컬러, 사이즈 확인 ==> 20200517 정지혜과장님 확인 :: 상품명=25,OPT1=13,OPT2=12 글자. 넘어갈경우 뒤에 ".." 붙여서 글자수 맞출것.
+					// 구성상품별 옵션 세팅
+					int i = 1;
+					for(Goods opt : optionList) {
+						// 상품명, 컬러, 사이즈 확인(최대 50자) ==> 20200517 정지혜과장님 확인 :: 상품명=25,OPT1=13,OPT2=12 글자. 넘어갈경우 뒤에 ".." 붙여서 글자수 맞출것.
 						// 상품명/컬러/사이즈 이므로 가운데 / 를 위해 24, 12, 12로 진행
-						if(itemNms[i].length() > 24)	{itemNms[i]  = itemNms[i].substring(0, 21) + "..";}
-						if(optCd2s[i].length() > 12)	{optCd2s[i]  = optCd2s[i].substring(0, 9)  + "..";}
-						if(colorNms[i].length() > 12)	{colorNms[i] = colorNms[i].substring(0, 9) + "..";}
+						if(opt.getGoodsNm().length() > 24)	{opt.setGoodsNm(opt.getGoodsNm().substring(0, 21) + "..");}
+						if(opt.getOptCd2().length() > 12)	{opt.setOptCd2(opt.getOptCd2().substring(0, 9)  + "..");}
+						if(opt.getColorNm().length() > 12)	{opt.setColorNm(opt.getColorNm().substring(0, 9) + "..");}
 
 						sb.append("\t\t\t<selectedItem>\n");
-						sb.append("\t\t\t\t<type>SELECT</type>\n");		//<!-- 옵션유형 -->
-						sb.append("\t\t\t\t<name>구성상품").append(i + 1).append("</name>\n");	//<!-- 옵션명 -->
+						sb.append("\t\t\t\t<type>SELECT</type>\n");								//<!-- 옵션유형 -->
+						sb.append("\t\t\t\t<name>구성상품").append(i++).append("</name>\n");		//<!-- 옵션명 -->
 						sb.append("\t\t\t\t<value>\n");
-						sb.append("\t\t\t\t\t<id>").append(itemCds[i]).append("/").append(optCds[i]).append("</id>\n");//<!-- 옵션 -->
-						sb.append("\t\t\t\t\t<text>").append(itemNms[i]).append("/").append(colorNms[i]).append("/").append(optCd2s[i]).append("</text>\n");//<!-- 옵션명 -->
+						sb.append("\t\t\t\t\t<id>").append(opt.getOptCd()).append("</id>\n");	//<!-- 옵션 -->
+						sb.append("\t\t\t\t\t<text>").append(opt.getGoodsNm()).append("/").append(opt.getColorNm()).append("/").append(opt.getOptCd2()).append("</text>\n");//<!-- 옵션명 -->
 						sb.append("\t\t\t\t</value>\n");
 						sb.append("\t\t\t</selectedItem>\n");
-					}*/
+					}
 
 					sb.append("\t\t</option>\n");
 				} else if("Y".equals(item.getSelfGoodsYn())) {								// 세트상품 제외 자사상품
@@ -1315,6 +1310,28 @@ public class TsfOrderService {
 		return result;
 	}
 
+	private String getCombinationXml(String manageCode, int addPrice, int stockQty, int size) {
+		String[] optCd = manageCode.split("/");
+		StringBuilder sb = new StringBuilder();
+		sb.append("\t\t\t<combination>\n");
+		sb.append("\t\t\t\t<manageCode>").append(manageCode).append("</manageCode>\n");
+		sb.append("\t\t\t\t<price>").append(addPrice).append("</price>\n");
+		sb.append("\t\t\t\t<stockQuantity>").append(stockQty).append("</stockQuantity>\n");
+		sb.append("\t\t\t\t<status>true</status>\n");
+
+		// 옵션 옵션조합정보 색상
+		for(int i = 0 ; i < size ; i++) {
+			sb.append("\t\t\t\t<options>\n");
+			sb.append("\t\t\t\t\t<name>구성상품").append(i + 1).append("</name>\n");
+			sb.append("\t\t\t\t\t<id>").append(optCd[i]).append("</id>\n");
+			sb.append("\t\t\t\t</options>\n");
+		}
+
+		sb.append("\t\t\t</combination>\n");
+
+		return sb.toString();
+	}
+
 	/**
 	 * 네이버페이 주문 정보 송부
 	 * @param sb
@@ -1514,63 +1531,160 @@ public class TsfOrderService {
 					// 옵션정보 지원여부 true
 					sb.append("\t\t<optionSupport>true</optionSupport>\n");
 
-					// 옵션 정보
-					sb.append("\t\t<option>\n");
-
 					// 세트상품 정보  getGoodsSetComposeList
 					goods.setSiteCd(TscConstants.Site.STYLE24.value());
-					Collection<GoodsCompose> compsInfoList = goodsDao.getGoodsSetComposeList(goods);
-					List<String> colorNmList = new ArrayList<String>();
-					List<String> colorList = new ArrayList<String>();
-					List<String> sizeList = new ArrayList<String>();
+					Collection<Goods> compsInfoList = goodsDao.getCompsGoodsList(goods);
 
+					// 옵션 정보
+					sb.append("\t\t<option>\n");
+					int combCnt = 0;		// 옵션 조합 총 수량
 					// 옵션 아이템정보 구성상품
-					sb.append("\t\t\t<optionItem>\n");
-					sb.append("\t\t\t\t<type>SELECT</type>\n");
-					sb.append("\t\t\t\t<name>상품</name>\n");
-					for (GoodsCompose comps : compsInfoList) {
-						sb.append("\t\t\t\t<value>\n");
-						sb.append("\t\t\t\t\t<id>").append(comps.getGoodsCd()).append("</id>\n");
-						if(comps.getCompsGoodsNm().length() > 50)	{comps.setCompsGoodsNm(comps.getCompsGoodsNm().substring(0, 47) + "..");}
-						sb.append("\t\t\t\t\t<text>").append(comps.getCompsGoodsNm()).append("</text>\n");
-						sb.append("\t\t\t\t</value>\n");
-					}
-					sb.append("\t\t\t</optionItem>\n");
-
-					// 옵션 아이템정보 색상
-					sb.append("\t\t\t<optionItem>\n");
-					sb.append("\t\t\t\t<type>SELECT</type>\n");
-					sb.append("\t\t\t\t<name>색상</name>\n");
-					int j = 0;
-					for (String color : colorList) {
-						sb.append("\t\t\t\t<value>\n");
-						sb.append("\t\t\t\t\t<id>").append(color).append("</id>\n");
-						sb.append("\t\t\t\t\t<text>").append(colorNmList.get(j++)).append("</text>\n");
-						sb.append("\t\t\t\t</value>\n");
-					}
-					sb.append("\t\t\t</optionItem>\n");
-
-					// 옵션 아이템정보 사이즈
-					sb.append("\t\t\t<optionItem>\n");
-					sb.append("\t\t\t\t<type>SELECT</type>\n");
-					sb.append("\t\t\t\t<name>사이즈</name>\n");
-					for (String size : sizeList) {
-						sb.append("\t\t\t\t<value>\n");
-						sb.append("\t\t\t\t\t<id>").append(size).append("</id>\n");
-						sb.append("\t\t\t\t\t<text>").append(size).append("</text>\n");
-						sb.append("\t\t\t\t</value>\n");
-					}
-					sb.append("\t\t\t</optionItem>\n");
+					for (Goods comps : compsInfoList) {
+						sb.append("\t\t\t<optionItem>\n");
+						sb.append("\t\t\t\t<type>SELECT</type>\n");
+						sb.append("\t\t\t\t<name>구성상품").append(comps.getRnum()).append("</name>\n");
 
-					// 옵션 정보 전체 송부
-					for (GoodsCompose comps : compsInfoList) {
+						// 구성상품별 옵션 정보
+						String[] optCds = comps.getOptCd().split(",");
+						String[] optCd2s = comps.getOptCd2().split(",");
+						String[] colorNms = comps.getColorNm().split(",");
+						combCnt *= optCds.length;
 
-					}
+						for(int j = 0 ; j < optCds.length ; i++) {
+							if(comps.getGoodsNm().length() > 24)	{comps.setGoodsNm(comps.getGoodsNm().substring(0, 21) + "..");}
+							if(optCd2s[j].length() > 12)	{optCd2s[j] = optCd2s[j].substring(0, 9)  + "..";}
+							if(colorNms[j].length() > 12)	{colorNms[j] = colorNms[j].substring(0, 9) + "..";}
 
+							sb.append("\t\t\t\t<value>\n");
+							sb.append("\t\t\t\t\t<id>").append(optCds[j]).append("</id>\n");
+							sb.append("\t\t\t\t\t<text>").append(comps.getGoodsNm()).append("/").append(colorNms[j]).append("/").append(optCd2s[j]).append("</text>\n");//<!-- 옵션명 -->
+							sb.append("\t\t\t\t</value>\n");
+						}
 
+						sb.append("\t\t\t</optionItem>\n");
+					}
 
 					sb.append("\t\t</option>\n");
 
+					// 세트 구성상품 모든 옵션 경우의 수 조회 > 상품코드 오름차순, OPTCD 오름차순으로 정확히 보낼것 > 주문요청된 manageCode가 같아야함.
+					for (Goods comps1 : compsInfoList) {
+						if(comps1.getRnum() == 1) {
+							// 구성상품별 옵션 정보
+							String[] goods1optCds = comps1.getOptCd().split(",");
+							String[] goods1addPrices = comps1.getItemStockQty().split(",");
+							String[] goods1stockQty = comps1.getItemStockQty().split(",");
+
+							for(int g1 = 0 ; g1 < goods1optCds.length ; g1++) {
+								StringBuilder manageCode = new StringBuilder(goods1optCds[g1]);	// 옵션코드 조합
+								int addPrice = Integer.parseInt(goods1addPrices[g1]);		// 추가금액 합계
+								int stockQty = Integer.parseInt(goods1stockQty[g1]);		// 상품 주문 최소 재고(구성상품 최소)
+
+								if(compsInfoList.size() == 2) {		// 조합 상품 최대치 계산 (세트상품은 최대 5개까지 등록 가능)
+									for (Goods comps2 : compsInfoList) {
+										if(comps2.getRnum() == 2) {
+											// 구성상품별 옵션 정보
+											String[] goods2optCds = comps2.getOptCd().split(",");
+											String[] goods2addPrices = comps2.getItemStockQty().split(",");
+											String[] goods2stockQty = comps2.getItemStockQty().split(",");
+
+											// 기존 정보 저장 (다시 돌아올 경우 이전 번호까지의 정보로 리셋하기 위함)
+											String manageCodeSave2 = goods1optCds[g1];
+											int addPriceSave2 = Integer.parseInt(goods1addPrices[g1]);
+											int stockQtySave2 = Integer.parseInt(goods1stockQty[g1]);
+
+											for(int g2 = 0 ; g2 < goods2optCds.length ; g2++) {
+												manageCode = new StringBuilder(manageCodeSave2);		// String 참조변수 인식 방지(사라지지 않음)를 위한 객체 재생성
+												manageCode.append("/").append(goods2optCds[g2]);
+												addPrice = addPriceSave2 + Integer.parseInt(goods2addPrices[g2]);
+												if(stockQtySave2 < Integer.parseInt(goods2stockQty[g2])) stockQty = Integer.parseInt(goods2stockQty[g2]);
+
+												if(compsInfoList.size() == 3) {        // 조합 상품 최대치 계산 (세트상품은 최대 5개까지 등록 가능)
+													for (Goods comps3 : compsInfoList) {
+														if (comps3.getRnum() == 3) {
+															// 구성상품별 옵션 정보
+															String[] goods3optCds = comps3.getOptCd().split(",");
+															String[] goods3addPrices = comps3.getItemStockQty().split(",");
+															String[] goods3stockQty = comps3.getItemStockQty().split(",");
+
+															// 기존 정보 저장 (다시 돌아올 경우 이전 번호까지의 정보로 리셋하기 위함)
+															String manageCodeSave3 = manageCodeSave2;
+															int addPriceSave3 = addPriceSave2;
+															int stockQtySave3 = stockQtySave2;
+
+															for(int g3 = 0 ; g3 < goods3optCds.length ; g3++) {
+																manageCode = new StringBuilder(manageCodeSave3);		// String 참조변수 인식 방지(사라지지 않음)를 위한 객체 재생성
+																manageCode.append("/").append(goods3optCds[g3]);
+																addPrice = addPriceSave3 + Integer.parseInt(goods3addPrices[g3]);
+																if(stockQtySave3 < Integer.parseInt(goods3stockQty[g3])) stockQty = Integer.parseInt(goods3stockQty[g3]);
+
+																if(compsInfoList.size() == 4) {        // 조합 상품 최대치 계산 (세트상품은 최대 5개까지 등록 가능)
+																	for (Goods comps4 : compsInfoList) {
+																		if (comps4.getRnum() == 4) {
+																			// 구성상품별 옵션 정보
+																			String[] goods4optCds = comps4.getOptCd().split(",");
+																			String[] goods4addPrices = comps4.getItemStockQty().split(",");
+																			String[] goods4stockQty = comps4.getItemStockQty().split(",");
+
+																			// 기존 정보 저장 (다시 돌아올 경우 이전 번호까지의 정보로 리셋하기 위함)
+																			String manageCodeSave4 = manageCodeSave3;
+																			int addPriceSave4 = addPriceSave3;
+																			int stockQtySave4 = stockQtySave3;
+
+																			for(int g4 = 0 ; g4 < goods4optCds.length ; g4++) {
+																				manageCode = new StringBuilder(manageCodeSave4);		// String 참조변수 인식 방지(사라지지 않음)를 위한 객체 재생성
+																				manageCode.append("/").append(goods4optCds[g4]);
+																				addPrice = addPriceSave4 + Integer.parseInt(goods4addPrices[g4]);
+																				if(stockQtySave4 < Integer.parseInt(goods4stockQty[g4])) stockQty = Integer.parseInt(goods4stockQty[g4]);
+
+																				if(compsInfoList.size() == 5) {        // 조합 상품 최대치 계산 (세트상품은 최대 5개까지 등록 가능)
+																					for (Goods comps5 : compsInfoList) {
+																						if (comps5.getRnum() == 5) {
+																							// 구성상품별 옵션 정보
+																							String[] goods5optCds = comps5.getOptCd().split(",");
+																							String[] goods5addPrices = comps5.getItemStockQty().split(",");
+																							String[] goods5stockQty = comps5.getItemStockQty().split(",");
+
+																							// 기존 정보 저장 (다시 돌아올 경우 이전 번호까지의 정보로 리셋하기 위함)
+																							String manageCodeSave5 = manageCodeSave4;
+																							int addPriceSave5 = addPriceSave4;
+																							int stockQtySave5 = stockQtySave4;
+
+																							for(int g5 = 0 ; g5 < goods5optCds.length ; g5++) {
+																								manageCode = new StringBuilder(manageCodeSave5);        // String 참조변수 인식 방지(사라지지 않음)를 위한 객체 재생성
+																								manageCode.append("/").append(goods5optCds[g5]);
+																								addPrice = addPriceSave5 + Integer.parseInt(goods5addPrices[g5]);
+																								if (stockQtySave5 < Integer.parseInt(goods5stockQty[g5])) stockQty = Integer.parseInt(goods5stockQty[g5]);
+
+																								// 세트상품은 최대 5개이므로 마무리.
+																								sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
+																							}
+																						}
+																					}
+																				} else {
+																					sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
+																				}
+																			}
+																		}
+																	}
+																} else {
+																	sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
+																}
+															}
+														}
+													}
+												} else {
+													sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
+												}
+											}
+										}
+									}
+								} else {
+									sb.append(getCombinationXml(manageCode.toString(), addPrice, stockQty, compsInfoList.size()));
+								}
+							}
+						}
+					}
+
 					// 10. 배송정보조회
 					// 5.2.1 업체별 기본배송비, 무료배송비
 					String delvFeeCd = "";

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

@@ -364,7 +364,6 @@ public class TsfCartController extends TsfBaseController {
 
 		// 장바구니 상품목록
 		cart = cartService.getCartGoodsList(cart);
-		log.info("CHECK LENGTH :::: {}", cart.getDelvAllCartList().size());
 		cart.setImgPath1(env.getProperty("upload.goods.view"));
 
 		// 현재 주문 가능 수량순으로 정렬

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

@@ -185,6 +185,7 @@ public class Goods extends TscBaseDomain {
 	private String brandKnm;
 	private Integer ordNo;			// 주문번호
 	private Integer ordDtlNo;		// 주문상세번호
+	private Integer rnum;
 
 	//상품상세 구분(10:상품타이틀,20:상품타이틀내용,30:상품특징,40:상위컨텐츠,50:하위컨텐츠,60:상위컨텐츠-모바일,70:하위컨텐츠-모바일,80:상품상세(as-is,입점))
 	private String goodsTitle; 			// 10:상품타이틀

+ 35 - 3
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -575,7 +575,7 @@
 	</select>
 
 	<!-- 주문 상품 옵션 정보 조회 -->
-	<select id="getOrderGoodsOptionList" parameterType="GoodsStock" resultType="GoodsStock">
+	<select id="getOrderGoodsOptionList" parameterType="Goods" resultType="Goods">
 		/* TsfGoods.getOrderGoodsOptionList */
 		SELECT G.GOODS_CD
 		     , G.GOODS_STAT
@@ -583,7 +583,7 @@
 		     , VS.OPT_CD
 		     , VS.OPT_CD1
 		     , VS.OPT_CD2
-		     , CASE WHEN VS.SOLDOUT_YN = 'Y' THEN 0 ELSE VS.CURR_STOCK_QTY END AS STOCK_QTY
+		     , CASE WHEN VS.SOLDOUT_YN = 'Y' OR G.GOODS_STAT <![CDATA[ <> ]]> 'G008_90' THEN 0 ELSE VS.CURR_STOCK_QTY END AS STOCK_QTY
 		     , IFNULL((SELECT COLOR_KNM FROM TB_COLOR C WHERE COLOR_CD = IFNULL(NULLIF(VS.OPT_CD1,'') , G.MAIN_COLOR_CD ) AND USE_YN  = 'Y'), VS.OPT_CD1) AS COLOR_NM
 		FROM   TB_GOODS G
 		INNER  JOIN VW_STOCK VS
@@ -599,7 +599,7 @@
 				#{item}
 			</foreach>
 		</if>
-		ORDER  BY VS.OPT_CD ASC
+		ORDER  BY G.GOODS_CD ASC, VS.OPT_CD ASC
 	</select>
 	
 	<!-- 무이자 혜택안내 -->
@@ -3084,4 +3084,36 @@
 		WHERE A.GOODS_CD = #{goodsCd}
 		ORDER BY G.GOODS_CD, A.CUST_GRADE
 	</select>
+
+	<!-- 구성 상품 목록 -->
+	<select id="getCompsGoodsList" parameterType="Goods" resultType="Goods">
+		/* TsfGoods.getSimpleCompsGoodsList */
+		SELECT ROW_NUMBER() OVER() AS RNUM
+		     , A.GOODS_CD
+		     , A.COMPS_GOODS_CD
+		     , A.GOODS_NM
+		     , A.OPT_CD
+		     , A.OPT_CD2
+		     , A.ADD_PRICE
+		     , A.ITEM_STOCK_QTY
+		     , A.COLOR_NM
+		FROM (SELECT GC.GOODS_CD
+		           , GC.COMPS_GOODS_CD
+		           , G.GOODS_NM
+		           , GROUP_CONCAT(VS.OPT_CD ORDER BY VS.OPT_CD ASC) AS OPT_CD
+		           , GROUP_CONCAT(VS.OPT_CD2 ORDER BY VS.OPT_CD ASC) AS OPT_CD2
+		           , GROUP_CONCAT(VS.ADD_PRICE ORDER BY VS.OPT_CD ASC) AS ADD_PRICE
+		           , GROUP_CONCAT(TRUNCATE(VS.CURR_STOCK_QTY / GC.QTY, 0) ORDER BY VS.OPT_CD ASC) AS ITEM_STOCK_QTY
+		           , GROUP_CONCAT(IFNULL((SELECT COLOR_KNM FROM TB_COLOR C WHERE COLOR_CD = IFNULL(NULLIF(VS.OPT_CD1,'') , VS.OPT_CD1 ) AND USE_YN  = 'Y'), VS.OPT_CD1) ORDER BY VS.OPT_CD ASC) AS COLOR_NM
+		      FROM   TB_GOODS_COMPOSE GC
+		      INNER  JOIN VW_STOCK VS
+		      ON     GC.COMPS_GOODS_CD = VS.GOODS_CD
+		      INNER  JOIN TB_GOODS G
+		      ON     GC.COMPS_GOODS_CD = G.GOODS_CD
+		      WHERE  GC.GOODS_CD = #{goodsCd}
+		      GROUP  BY GC.GOODS_CD
+		              , G.GOODS_NM
+		              , GC.COMPS_GOODS_CD
+		      ORDER  BY GC.COMPS_GOODS_CD) A		<!-- 변경x > 네이버페이 KEY로 송부되는 순서 -->
+	</select>
 </mapper>