|
|
@@ -6,17 +6,14 @@ import java.io.InputStreamReader;
|
|
|
import java.io.OutputStreamWriter;
|
|
|
import java.io.Writer;
|
|
|
import java.net.URL;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Arrays;
|
|
|
-import java.util.Collection;
|
|
|
-import java.util.HashSet;
|
|
|
-import java.util.List;
|
|
|
+import java.util.*;
|
|
|
|
|
|
import javax.net.ssl.HttpsURLConnection;
|
|
|
import javax.servlet.http.Cookie;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
|
+import com.style24.persistence.domain.*;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.core.env.Environment;
|
|
|
@@ -38,16 +35,6 @@ import com.style24.front.biz.dao.TsfGoodsDao;
|
|
|
import com.style24.front.biz.dao.TsfOrderDao;
|
|
|
import com.style24.front.biz.dao.TsfRendererDao;
|
|
|
import com.style24.front.support.security.session.TsfSession;
|
|
|
-import com.style24.persistence.domain.Cart;
|
|
|
-import com.style24.persistence.domain.Coupon;
|
|
|
-import com.style24.persistence.domain.Delivery;
|
|
|
-import com.style24.persistence.domain.GiftCard;
|
|
|
-import com.style24.persistence.domain.Goods;
|
|
|
-import com.style24.persistence.domain.GoodsStock;
|
|
|
-import com.style24.persistence.domain.KakaoPay;
|
|
|
-import com.style24.persistence.domain.NaverPay;
|
|
|
-import com.style24.persistence.domain.Order;
|
|
|
-import com.style24.persistence.domain.Payment;
|
|
|
import com.usafe.guarantee.InsuranceInfo;
|
|
|
import com.usafe.guarantee.InsuranceManager;
|
|
|
|
|
|
@@ -1170,64 +1157,56 @@ public class TsfOrderService {
|
|
|
sb.append("\t\t<id>").append(item.getGoodsCd()).append("</id>\n"); //<!-- 상품코드 -->
|
|
|
sb.append("\t\t<ecMallProductId>").append(item.getGoodsCd()).append("</ecMallProductId>\n"); //<!-- 상품코드 -->
|
|
|
sb.append("\t\t<name>").append("<![CDATA[").append(item.getGoodsNm()).append("]]>").append("</name>\n"); //<!-- 상품명 -->
|
|
|
- sb.append("\t\t<basePrice>").append(item.getCurrPrice() + item.getOptAddPrice()).append("</basePrice>\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<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[] itemNms = item.getItemNm().split("!@!"); // 구성상품명
|
|
|
- String[] optCds = item.getOptCd().split(","); // 옵션코드
|
|
|
- String[] colorNms = item.getColorNm().split(","); // 컬러명
|
|
|
- String[] optCd1s = item.getOptCd1().split(","); // 칼라코드
|
|
|
- String[] optCd2s = item.getOptCd2().split(","); // 사이즈
|
|
|
- String[] itemCds = item.getItemCd().split(","); // 상품코드
|
|
|
-
|
|
|
- // 상품명, 컬러, 사이즈 확인 ==> 20200517 정지혜과장님 확인 :: 상품명=25,OPT1=13,OPT2=12 글자. 넘어갈경우 뒤에 ".." 붙여서 글자수 맞출것.
|
|
|
- // 상품명/컬러/사이즈 이므로 가운데 / 를 위해 24, 12, 12로 진행
|
|
|
- for(int i = 0 ; i < itemNms.length ; i++) {
|
|
|
- if(itemNms[i].length() > 50) {itemNms[i] = itemNms[i].substring(0, 47) + "..";}
|
|
|
- /*if(optCd2s[i].length() > 12) {optCd2s[i] = optCd2s[i].substring(0, 9) + "..";}
|
|
|
- if(colorNms[i].length() > 12) {colorNms[i] = colorNms[i].substring(0, 9) + "..";}*/
|
|
|
-
|
|
|
- // 옵션 정보
|
|
|
- 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(itemCds[i]).append("_").append(optCds[i]).append("</manageCode>\n"); //<!-- 옵션관리코드 -->
|
|
|
-
|
|
|
- // 구성상품코드
|
|
|
- sb.append("\t\t\t<selectedItem>\n");
|
|
|
- sb.append("\t\t\t\t<type>SELECT</type>\n");//<!-- 옵션유형 -->
|
|
|
- sb.append("\t\t\t\t<name>상품</name>\n");//<!-- 옵션명 -->
|
|
|
- sb.append("\t\t\t\t<value>\n");
|
|
|
- sb.append("\t\t\t\t\t<id>").append(itemCds[i]).append("</id>\n");//<!-- 옵션 -->
|
|
|
- sb.append("\t\t\t\t\t<text>").append(itemNms[i]).append("</text>\n");//<!-- 옵션명 -->
|
|
|
- sb.append("\t\t\t\t</value>\n");
|
|
|
- sb.append("\t\t\t</selectedItem>\n");
|
|
|
+ String[] optCds = item.getOptCd().split(","); // 옵션코드
|
|
|
+ String[] itemCds = item.getItemCd().split(","); // 상품코드
|
|
|
+
|
|
|
+ // 세트상품 manageCode 정렬 (optCd ASC)
|
|
|
+ Goods option = new Goods();
|
|
|
+ option.setArrGoodsCd(itemCds);
|
|
|
+ option.setSizeArr(optCds);
|
|
|
+ List<Goods> optionList = (ArrayList<Goods>) goodsDao.getOrderGoodsOptionList(option);
|
|
|
+
|
|
|
+ StringBuilder manageCode = new StringBuilder();
|
|
|
+ for(Goods opt : optionList) {
|
|
|
+ manageCode.append(opt.getOptCd());
|
|
|
+ }
|
|
|
|
|
|
- // 칼라코드
|
|
|
- sb.append("\t\t\t<selectedItem>\n");
|
|
|
- sb.append("\t\t\t\t<type>SELECT</type>\n");//<!-- 옵션유형 -->
|
|
|
- sb.append("\t\t\t\t<name>색상</name>\n");//<!-- 옵션명 -->
|
|
|
- sb.append("\t\t\t\t<value>\n");
|
|
|
- sb.append("\t\t\t\t\t<id>").append(optCd1s[i]).append("</id>\n");//<!-- 옵션 -->
|
|
|
- sb.append("\t\t\t\t\t<text>").append(colorNms[i]).append("</text>\n");//<!-- 옵션명 -->
|
|
|
- sb.append("\t\t\t\t</value>\n");
|
|
|
- sb.append("\t\t\t</selectedItem>\n");
|
|
|
+ // 옵션 정보
|
|
|
+ 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"); //<!-- 옵션관리코드 -->
|
|
|
+
|
|
|
+ // 칼라코드
|
|
|
+ /*for(int i = 0 ; i < itemNms.length ; i++) {
|
|
|
+ // 상품명, 컬러, 사이즈 확인 ==> 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) + "..";}
|
|
|
|
|
|
- // 사이즈
|
|
|
sb.append("\t\t\t<selectedItem>\n");
|
|
|
- sb.append("\t\t\t\t<type>SELECT</type>\n");//<!-- 옵션유형 -->
|
|
|
- sb.append("\t\t\t\t<name>사이즈</name>\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<value>\n");
|
|
|
- sb.append("\t\t\t\t\t<id>").append(optCd2s[i]).append("</id>\n");//<!-- 옵션 -->
|
|
|
- sb.append("\t\t\t\t\t<text>").append(optCd2s[i]).append("</text>\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</value>\n");
|
|
|
sb.append("\t\t\t</selectedItem>\n");
|
|
|
+ }*/
|
|
|
|
|
|
- sb.append("\t\t</option>\n");
|
|
|
- }
|
|
|
+ sb.append("\t\t</option>\n");
|
|
|
} else if("Y".equals(item.getSelfGoodsYn())) { // 세트상품 제외 자사상품
|
|
|
// 옵션 정보
|
|
|
sb.append("\t\t<option>\n");
|
|
|
@@ -1472,99 +1451,93 @@ public class TsfOrderService {
|
|
|
|
|
|
for (int i=0; i<goodsCdArr.length; i++) {
|
|
|
Order item = new Order();
|
|
|
-
|
|
|
- item.setGoodsCd(goodsCdArr[i]);
|
|
|
-
|
|
|
- // 9.상품 옵션
|
|
|
+ item.setGoodsCd(goodsCdArr[i]); // 상품코드
|
|
|
String optionManageCode = coreOrderService.simpleDecode(optionManageCodesArr[i]);
|
|
|
- item.setOptCd(optionManageCode);
|
|
|
-
|
|
|
- // 주문 상품 옵션 정보 조회
|
|
|
- GoodsStock opt = new GoodsStock();
|
|
|
- opt.setGoodsCd(item.getGoodsCd());
|
|
|
- opt.setOptCd(item.getOptCd());
|
|
|
- opt = goodsDao.getGoodsStockInfo(opt);
|
|
|
-
|
|
|
- // 주문 상품 정보 조회
|
|
|
- Goods goods = new Goods();
|
|
|
- goods.setGoodsCd(item.getGoodsCd());
|
|
|
- goods.setOptCd(item.getOptCd());
|
|
|
- goods.setColorCd(opt.getOptCd1());
|
|
|
- goods.setFrontGb(TsfSession.getFrontGb());
|
|
|
- goods.setSiteCd(TscConstants.Site.STYLE24.value());
|
|
|
- goods.setAdminYn("Y"); // 상품 상태에 관계 없이 조회하기 위함
|
|
|
- goods = goodsDao.getGoodsInfo(goods);
|
|
|
-
|
|
|
- // 상품 상태 확인
|
|
|
- String goodsStat = "";
|
|
|
- if(TscConstants.GoodsStat.APPR.value().equals(goods.getGoodsStat())) {
|
|
|
- goodsStat = "ON_SALE"; // 판매중
|
|
|
- } else if (TscConstants.GoodsStat.SOLDOUT.value().equals(goods.getGoodsStat())) {
|
|
|
- goodsStat = "SOLD_OUT"; // 품절
|
|
|
- } else {
|
|
|
- goodsStat = "NOT_SALE"; // 주매불가
|
|
|
- }
|
|
|
+ item.setOptCd(optionManageCode); // 상품 옵션
|
|
|
+
|
|
|
+ // 이 포인트에서 세트상품, 일반 상품 분리 조회 필요 (재고 파악 로직이 다름)
|
|
|
+ Goods simpleInfo = new Goods();
|
|
|
+ simpleInfo.setGoodsCd(item.getGoodsCd());
|
|
|
+ simpleInfo = goodsDao.getGoodsSimpleInfo(simpleInfo);
|
|
|
+
|
|
|
+ // 세트상품일 경우
|
|
|
+ if(TscConstants.GoodsType.SET.value().equals(simpleInfo.getGoodsType())) {
|
|
|
+ // 주문 상품 정보 조회
|
|
|
+ Goods goods = new Goods();
|
|
|
+ goods.setGoodsCd(item.getGoodsCd());
|
|
|
+ goods.setOptCd(item.getOptCd());
|
|
|
+ goods.setFrontGb(TsfSession.getFrontGb());
|
|
|
+ goods.setSiteCd(TscConstants.Site.STYLE24.value());
|
|
|
+ goods.setAdminYn("Y"); // 상품 상태에 관계 없이 조회하기 위함
|
|
|
+ goods = goodsDao.getGoodsInfo(goods);
|
|
|
+
|
|
|
+ // 상품 상태 확인
|
|
|
+ String goodsStat = "";
|
|
|
+ if(TscConstants.GoodsStat.APPR.value().equals(goods.getGoodsStat())) {
|
|
|
+ goodsStat = "ON_SALE"; // 판매중
|
|
|
+ } else if (TscConstants.GoodsStat.SOLDOUT.value().equals(goods.getGoodsStat())) {
|
|
|
+ goodsStat = "SOLD_OUT"; // 품절
|
|
|
+ } else {
|
|
|
+ goodsStat = "NOT_SALE"; // 구매불가
|
|
|
+ }
|
|
|
|
|
|
- // 반송지 정보
|
|
|
- Delivery rtnInfo = goodsDao.getGoodsDeliveryInfo(goods.getGoodsCd());
|
|
|
+ // 반송지 정보
|
|
|
+ Delivery rtnInfo = goodsDao.getGoodsDeliveryInfo(goods.getGoodsCd());
|
|
|
+
|
|
|
+ sb.append("\t<product>\n");
|
|
|
+ sb.append("\t\t<id>").append(item.getGoodsCd()).append("</id>\n");
|
|
|
+ sb.append("\t\t<merchantProductId>").append(item.getGoodsCd()).append("</merchantProductId>\n");
|
|
|
+ sb.append("\t\t<ecMallProductId>").append(item.getGoodsCd()).append("</ecMallProductId>\n");
|
|
|
+ sb.append("\t\t<name>").append(goods.getGoodsNm()).append("</name>\n");
|
|
|
+ sb.append("\t\t<status>").append(goodsStat).append("</status>\n");
|
|
|
+ sb.append("\t\t<basePrice>").append(goods.getCurrPrice()).append("</basePrice>\n");
|
|
|
+ // TODO http: 부분 운영 프로토콜 확인 후 수정 필요(운영 상품상세가 HTTPS일 경우 분기처리 필요(개발서버, 운영 구분))
|
|
|
+ sb.append("\t\t<infoUrl>").append("http:" + domain + "/goods/detail/form?goodsCd=" + goods.getGoodsCd()).append("</infoUrl>\n");
|
|
|
+ sb.append("\t\t<imageUrl>").append("http:" + goodsImgUrl + "/" + goods.getSysImgNm()).append("</imageUrl>\n");
|
|
|
+
|
|
|
+ // 12.반품주소
|
|
|
+ if (rtnInfo != null && rtnInfo.getRtnLocZipcode() != null && !"".equals(rtnInfo.getRtnLocZipcode())) {
|
|
|
+ // 2.1 반품정보
|
|
|
+ sb.append("\t\t<returnInfo>\n");
|
|
|
+ sb.append("\t\t\t<zipcode>").append(rtnInfo.getRtnLocZipcode()).append("</zipcode>\n");
|
|
|
+ sb.append("\t\t\t<address1>").append(rtnInfo.getRtnLocBaseAddr()).append("</address1>\n");
|
|
|
+ sb.append("\t\t\t<address2>").append(rtnInfo.getRtnLocDtlAddr()).append("</address2>\n");
|
|
|
+ sb.append("\t\t\t<sellername>").append(rtnInfo.getRtnLocNm()).append("</sellername>\n");
|
|
|
+ sb.append("\t\t\t<contact1>").append(rtnInfo.getRtnLocTelno()).append("</contact1>\n");
|
|
|
+ sb.append("\t\t</returnInfo>\n");
|
|
|
+
|
|
|
+ // 반품배송비, 교환배송비
|
|
|
+ sb.append("\t\t<returnShippingFee>").append(goods.getRtnDelvFee()).append("</returnShippingFee>\n");
|
|
|
+ sb.append("\t\t<exchangeShippingFee>").append(goods.getDelvFee() + goods.getRtnDelvFee()).append("</exchangeShippingFee>\n");
|
|
|
+ }
|
|
|
|
|
|
- sb.append("\t<product>\n");
|
|
|
- sb.append("\t\t<id>").append(goodsCdArr[i]).append("</id>\n");
|
|
|
- sb.append("\t\t<merchantProductId>").append(goodsCdArr[i]).append("</merchantProductId>\n");
|
|
|
- sb.append("\t\t<ecMallProductId>").append(goodsCdArr[i]).append("</ecMallProductId>\n");
|
|
|
- sb.append("\t\t<name>").append(goods.getGoodsNm()).append("</name>\n");
|
|
|
- sb.append("\t\t<status>").append(goodsStat).append("</status>\n");
|
|
|
- sb.append("\t\t<basePrice>").append(goods.getCurrPrice() + opt.getAddPrice()).append("</basePrice>\n");
|
|
|
- // TODO http: 부분 운영 프로토콜 확인 후 수정 필요(운영 상품상세가 HTTPS일 경우 분기처리 필요(개발서버, 운영 구분))
|
|
|
- sb.append("\t\t<infoUrl>").append("http:" + domain + "/goods/detail/form?goodsCd=" + goods.getGoodsCd()).append("</infoUrl>\n");
|
|
|
- sb.append("\t\t<imageUrl>").append("http:" + goodsImgUrl + "/" + goods.getSysImgNm()).append("</imageUrl>\n");
|
|
|
-
|
|
|
- // 12.반품주소
|
|
|
- if (rtnInfo != null && rtnInfo.getRtnLocZipcode() != null && !"".equals(rtnInfo.getRtnLocZipcode())) {
|
|
|
- // 2.1 반품정보
|
|
|
- sb.append("\t\t<returnInfo>\n");
|
|
|
- sb.append("\t\t\t<zipcode>").append(rtnInfo.getRtnLocZipcode()).append("</zipcode>\n");
|
|
|
- sb.append("\t\t\t<address1>").append(rtnInfo.getRtnLocBaseAddr()).append("</address1>\n");
|
|
|
- sb.append("\t\t\t<address2>").append(rtnInfo.getRtnLocDtlAddr()).append("</address2>\n");
|
|
|
- sb.append("\t\t\t<sellername>").append(rtnInfo.getRtnLocNm()).append("</sellername>\n");
|
|
|
- sb.append("\t\t\t<contact1>").append(rtnInfo.getRtnLocTelno()).append("</contact1>\n");
|
|
|
- sb.append("\t\t</returnInfo>\n");
|
|
|
-
|
|
|
- // 반품배송비, 교환배송비
|
|
|
- sb.append("\t\t<returnShippingFee>").append(goods.getRtnDelvFee()).append("</returnShippingFee>\n");
|
|
|
- sb.append("\t\t<exchangeShippingFee>").append(goods.getDelvFee() + goods.getRtnDelvFee()).append("</exchangeShippingFee>\n");
|
|
|
- }
|
|
|
+ // 옵션정보 지원여부 true
|
|
|
+ sb.append("\t\t<optionSupport>true</optionSupport>\n");
|
|
|
|
|
|
- // 옵션정보 지원여부 true
|
|
|
- sb.append("\t\t<optionSupport>true</optionSupport>\n");
|
|
|
-
|
|
|
- // 상품 옵션 전체 정보 조회
|
|
|
- Collection<GoodsStock> optList = goodsDao.getGoodsOptionInfoList(opt);
|
|
|
-
|
|
|
- String[] colorNmList = new String[optList.size()];
|
|
|
- String[] colorList = new String[optList.size()];
|
|
|
- String[] sizeList = new String[optList.size()];
|
|
|
- int count = 0;
|
|
|
- for(GoodsStock optInfo : optList) {
|
|
|
- colorNmList[count] = optInfo.getColorNm();
|
|
|
- colorList[count] = optInfo.getOptCd1();
|
|
|
- sizeList[count] = optInfo.getOptCd2();
|
|
|
- count++;
|
|
|
- }
|
|
|
+ // 옵션 정보
|
|
|
+ sb.append("\t\t<option>\n");
|
|
|
|
|
|
- colorNmList = new HashSet<String>(Arrays.asList(colorNmList)).toArray(new String[0]);
|
|
|
- colorList = new HashSet<String>(Arrays.asList(colorList)).toArray(new String[0]);
|
|
|
- sizeList = new HashSet<String>(Arrays.asList(sizeList)).toArray(new String[0]);
|
|
|
+ // 세트상품 정보 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>();
|
|
|
|
|
|
- // 옵션 정보
|
|
|
- sb.append("\t\t<option>\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 (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");
|
|
|
|
|
|
- if(TscConstants.GoodsType.SET.value().equals(goods.getGoodsType())) {
|
|
|
- // 세트상품 정보
|
|
|
- // 세트 구성 상품 조회 후 로직 작성 예정.
|
|
|
- } else if("Y".equals(goods.getSelfGoodsYn())) {
|
|
|
- // 자사 일반 상품 정보
|
|
|
- // 9.1 옵션 아이템정보 색상
|
|
|
+ // 옵션 아이템정보 색상
|
|
|
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");
|
|
|
@@ -1572,12 +1545,12 @@ public class TsfOrderService {
|
|
|
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[j++]).append("</text>\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");
|
|
|
|
|
|
- // 9.1 옵션 아이템정보 사이즈
|
|
|
+ // 옵션 아이템정보 사이즈
|
|
|
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");
|
|
|
@@ -1589,96 +1562,247 @@ public class TsfOrderService {
|
|
|
}
|
|
|
sb.append("\t\t\t</optionItem>\n");
|
|
|
|
|
|
- // 9.3 옵션 옵션조합정보
|
|
|
- for(GoodsStock optInfo : optList) {
|
|
|
- sb.append("\t\t\t<combination>\n");
|
|
|
- sb.append("\t\t\t\t<manageCode>").append(optInfo.getOptCd()).append("</manageCode>\n");
|
|
|
- sb.append("\t\t\t\t<price>").append(optInfo.getAddPrice()).append("</price>\n");
|
|
|
- sb.append("\t\t\t\t<stockQuantity>").append(optInfo.getStockQty()).append("</stockQuantity>\n");
|
|
|
- sb.append("\t\t\t\t<status>true</status>\n");
|
|
|
-
|
|
|
- // 9.3.1 옵션 옵션조합정보 색상
|
|
|
- sb.append("\t\t\t\t<options>\n");
|
|
|
- sb.append("\t\t\t\t\t<name>색상</name>\n");
|
|
|
- sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd1()).append("</id>\n");
|
|
|
- sb.append("\t\t\t\t</options>\n");
|
|
|
-
|
|
|
- // 9.3.2 옵션 옵션조합정보 사이즈
|
|
|
- sb.append("\t\t\t\t<options>\n");
|
|
|
- sb.append("\t\t\t\t\t<name>사이즈</name>\n");
|
|
|
- sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd2()).append("</id>\n");
|
|
|
- sb.append("\t\t\t\t</options>\n");
|
|
|
-
|
|
|
- sb.append("\t\t\t</combination>\n");
|
|
|
+ // 옵션 정보 전체 송부
|
|
|
+ for (GoodsCompose comps : compsInfoList) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ sb.append("\t\t</option>\n");
|
|
|
+
|
|
|
+ // 10. 배송정보조회
|
|
|
+ // 5.2.1 업체별 기본배송비, 무료배송비
|
|
|
+ String delvFeeCd = "";
|
|
|
+ if("Y".equals(goods.getSelfGoodsYn())) {
|
|
|
+ delvFeeCd = "WMS";
|
|
|
+ } else {
|
|
|
+ delvFeeCd = goods.getDelvFeeCd();
|
|
|
+ }
|
|
|
+ String delvFeeCrite = "CHARGE";
|
|
|
+ int delvFee = goods.getDelvFee();
|
|
|
+ String feePayType = "PREPAYED";
|
|
|
+ // 배송비 조건
|
|
|
+ if(TscConstants.DelvFeeCrite.NORMAL.value().equals(goods.getDelvFeeCrite())) {
|
|
|
+ delvFeeCrite = "CONDITIONAL_FREE"; // 조건부 무료(배송비 조건이 무료이거나 배송 방법이 착불일때만 배송비는 0원으로 변경)
|
|
|
+ } else if(TscConstants.DelvFeeCrite.FREE.value().equals(goods.getDelvFeeCrite())) {
|
|
|
+ delvFeeCrite = "FREE";
|
|
|
+ feePayType = "FREE";
|
|
|
+ delvFee = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ sb.append("\t\t<shippingPolicy>\n");
|
|
|
+ sb.append("\t\t\t<groupId>").append(delvFeeCd).append("</groupId>\n");
|
|
|
+ sb.append("\t\t\t<method>").append("DELIVERY").append("</method>\n");
|
|
|
+ sb.append("\t\t\t<feeType>").append(delvFeeCrite).append("</feeType>\n");
|
|
|
+ sb.append("\t\t\t<feePayType>").append(feePayType).append("</feePayType>\n");
|
|
|
+ sb.append("\t\t\t<feePrice>").append(delvFee).append("</feePrice>\n");
|
|
|
+ if(!"FREE".equals(delvFeeCrite)) {
|
|
|
+ sb.append("\t\t\t<conditionalFree>\n");
|
|
|
+ sb.append("\t\t\t\t<basePrice>").append(goods.getMinOrdAmt()).append("</basePrice>\n");
|
|
|
+ sb.append("\t\t\t</conditionalFree>\n");
|
|
|
}
|
|
|
+
|
|
|
+ sb.append("\t\t</shippingPolicy>\n");
|
|
|
+
|
|
|
+ sb.append("\t</product>\n");
|
|
|
} else {
|
|
|
- // 입점업체 상품 정보
|
|
|
- // 9.1 옵션 아이템정보 색상
|
|
|
- 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(GoodsStock optInfo : optList) {
|
|
|
- sb.append("\t\t\t\t<value>\n");
|
|
|
- sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd()).append("</id>\n");
|
|
|
- sb.append("\t\t\t\t\t<text>").append(optInfo.getOptCd1()).append("/").append(optInfo.getOptCd2()).append("</text>\n");
|
|
|
- sb.append("\t\t\t\t</value>\n");
|
|
|
+ // 주문 상품 옵션 정보 조회
|
|
|
+ GoodsStock opt = new GoodsStock();
|
|
|
+ opt.setGoodsCd(item.getGoodsCd());
|
|
|
+ opt.setOptCd(item.getOptCd());
|
|
|
+ opt = goodsDao.getGoodsStockInfo(opt);
|
|
|
+
|
|
|
+ // 주문 상품 정보 조회
|
|
|
+ Goods goods = new Goods();
|
|
|
+ goods.setGoodsCd(item.getGoodsCd());
|
|
|
+ goods.setOptCd(item.getOptCd());
|
|
|
+ goods.setColorCd(opt.getOptCd1());
|
|
|
+ goods.setFrontGb(TsfSession.getFrontGb());
|
|
|
+ goods.setSiteCd(TscConstants.Site.STYLE24.value());
|
|
|
+ goods.setAdminYn("Y"); // 상품 상태에 관계 없이 조회하기 위함
|
|
|
+ goods = goodsDao.getGoodsInfo(goods);
|
|
|
+
|
|
|
+ // 상품 상태 확인
|
|
|
+ String goodsStat = "";
|
|
|
+ if(TscConstants.GoodsStat.APPR.value().equals(goods.getGoodsStat())) {
|
|
|
+ goodsStat = "ON_SALE"; // 판매중
|
|
|
+ } else if (TscConstants.GoodsStat.SOLDOUT.value().equals(goods.getGoodsStat())) {
|
|
|
+ goodsStat = "SOLD_OUT"; // 품절
|
|
|
+ } else {
|
|
|
+ goodsStat = "NOT_SALE"; // 구매불가
|
|
|
}
|
|
|
- sb.append("\t\t\t</optionItem>\n");
|
|
|
|
|
|
- // 9.3 옵션 옵션조합정보
|
|
|
+ // 반송지 정보
|
|
|
+ Delivery rtnInfo = goodsDao.getGoodsDeliveryInfo(goods.getGoodsCd());
|
|
|
+
|
|
|
+ sb.append("\t<product>\n");
|
|
|
+ sb.append("\t\t<id>").append(goodsCdArr[i]).append("</id>\n");
|
|
|
+ sb.append("\t\t<merchantProductId>").append(goodsCdArr[i]).append("</merchantProductId>\n");
|
|
|
+ sb.append("\t\t<ecMallProductId>").append(goodsCdArr[i]).append("</ecMallProductId>\n");
|
|
|
+ sb.append("\t\t<name>").append(goods.getGoodsNm()).append("</name>\n");
|
|
|
+ sb.append("\t\t<status>").append(goodsStat).append("</status>\n");
|
|
|
+ sb.append("\t\t<basePrice>").append(goods.getCurrPrice()).append("</basePrice>\n");
|
|
|
+ // TODO http: 부분 운영 프로토콜 확인 후 수정 필요(운영 상품상세가 HTTPS일 경우 분기처리 필요(개발서버, 운영 구분))
|
|
|
+ sb.append("\t\t<infoUrl>").append("http:" + domain + "/goods/detail/form?goodsCd=" + goods.getGoodsCd()).append("</infoUrl>\n");
|
|
|
+ sb.append("\t\t<imageUrl>").append("http:" + goodsImgUrl + "/" + goods.getSysImgNm()).append("</imageUrl>\n");
|
|
|
+
|
|
|
+ // 12.반품주소
|
|
|
+ if (rtnInfo != null && rtnInfo.getRtnLocZipcode() != null && !"".equals(rtnInfo.getRtnLocZipcode())) {
|
|
|
+ // 2.1 반품정보
|
|
|
+ sb.append("\t\t<returnInfo>\n");
|
|
|
+ sb.append("\t\t\t<zipcode>").append(rtnInfo.getRtnLocZipcode()).append("</zipcode>\n");
|
|
|
+ sb.append("\t\t\t<address1>").append(rtnInfo.getRtnLocBaseAddr()).append("</address1>\n");
|
|
|
+ sb.append("\t\t\t<address2>").append(rtnInfo.getRtnLocDtlAddr()).append("</address2>\n");
|
|
|
+ sb.append("\t\t\t<sellername>").append(rtnInfo.getRtnLocNm()).append("</sellername>\n");
|
|
|
+ sb.append("\t\t\t<contact1>").append(rtnInfo.getRtnLocTelno()).append("</contact1>\n");
|
|
|
+ sb.append("\t\t</returnInfo>\n");
|
|
|
+
|
|
|
+ // 반품배송비, 교환배송비
|
|
|
+ sb.append("\t\t<returnShippingFee>").append(goods.getRtnDelvFee()).append("</returnShippingFee>\n");
|
|
|
+ sb.append("\t\t<exchangeShippingFee>").append(goods.getDelvFee() + goods.getRtnDelvFee()).append("</exchangeShippingFee>\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 옵션정보 지원여부 true
|
|
|
+ sb.append("\t\t<optionSupport>true</optionSupport>\n");
|
|
|
+
|
|
|
+ // 옵션 정보
|
|
|
+ sb.append("\t\t<option>\n");
|
|
|
+
|
|
|
+ // 상품 옵션 전체 정보 조회
|
|
|
+ Collection<GoodsStock> optList = goodsDao.getGoodsOptionInfoList(opt);
|
|
|
+
|
|
|
+ String[] colorNmList = new String[optList.size()];
|
|
|
+ String[] colorList = new String[optList.size()];
|
|
|
+ String[] sizeList = new String[optList.size()];
|
|
|
+ int count = 0;
|
|
|
+
|
|
|
+ // 중복제거
|
|
|
for(GoodsStock optInfo : optList) {
|
|
|
- sb.append("\t\t\t<combination>\n");
|
|
|
- sb.append("\t\t\t\t<manageCode>").append(optInfo.getOptCd()).append("</manageCode>\n");
|
|
|
- sb.append("\t\t\t\t<price>").append(optInfo.getAddPrice()).append("</price>\n");
|
|
|
- sb.append("\t\t\t\t<stockQuantity>").append(optInfo.getStockQty()).append("</stockQuantity>\n");
|
|
|
- sb.append("\t\t\t\t<status>true</status>\n");
|
|
|
-
|
|
|
- // 9.3.1 옵션 옵션조합정보 색상
|
|
|
- sb.append("\t\t\t\t<options>\n");
|
|
|
- sb.append("\t\t\t\t\t<name>옵션</name>\n");
|
|
|
- sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd()).append("</id>\n");
|
|
|
- sb.append("\t\t\t\t</options>\n");
|
|
|
- sb.append("\t\t\t</combination>\n");
|
|
|
+ colorNmList[count] = optInfo.getColorNm();
|
|
|
+ colorList[count] = optInfo.getOptCd1();
|
|
|
+ sizeList[count] = optInfo.getOptCd2();
|
|
|
+ count++;
|
|
|
+ }
|
|
|
+ colorNmList = new HashSet<String>(Arrays.asList(colorNmList)).toArray(new String[0]);
|
|
|
+ colorList = new HashSet<String>(Arrays.asList(colorList)).toArray(new String[0]);
|
|
|
+ sizeList = new HashSet<String>(Arrays.asList(sizeList)).toArray(new String[0]);
|
|
|
+
|
|
|
+ if("Y".equals(goods.getSelfGoodsYn())) {
|
|
|
+ // 자사 일반 상품 정보
|
|
|
+ // 옵션 아이템정보 색상
|
|
|
+ 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[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(GoodsStock optInfo : optList) {
|
|
|
+ sb.append("\t\t\t<combination>\n");
|
|
|
+ sb.append("\t\t\t\t<manageCode>").append(optInfo.getOptCd()).append("</manageCode>\n");
|
|
|
+ sb.append("\t\t\t\t<price>").append(optInfo.getAddPrice()).append("</price>\n");
|
|
|
+ sb.append("\t\t\t\t<stockQuantity>").append(optInfo.getStockQty()).append("</stockQuantity>\n");
|
|
|
+ sb.append("\t\t\t\t<status>true</status>\n");
|
|
|
+
|
|
|
+ // 옵션 옵션조합정보 색상
|
|
|
+ sb.append("\t\t\t\t<options>\n");
|
|
|
+ sb.append("\t\t\t\t\t<name>색상</name>\n");
|
|
|
+ sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd1()).append("</id>\n");
|
|
|
+ sb.append("\t\t\t\t</options>\n");
|
|
|
+
|
|
|
+ // 옵션 옵션조합정보 사이즈
|
|
|
+ sb.append("\t\t\t\t<options>\n");
|
|
|
+ sb.append("\t\t\t\t\t<name>사이즈</name>\n");
|
|
|
+ sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd2()).append("</id>\n");
|
|
|
+ sb.append("\t\t\t\t</options>\n");
|
|
|
+
|
|
|
+ sb.append("\t\t\t</combination>\n");
|
|
|
+ }
|
|
|
+ } else {// 입점업체 상품 정보
|
|
|
+ // 옵션 아이템정보 색상
|
|
|
+ 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(GoodsStock optInfo : optList) {
|
|
|
+ sb.append("\t\t\t\t<value>\n");
|
|
|
+ sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd()).append("</id>\n");
|
|
|
+ sb.append("\t\t\t\t\t<text>").append(optInfo.getOptCd1()).append("/").append(optInfo.getOptCd2()).append("</text>\n");
|
|
|
+ sb.append("\t\t\t\t</value>\n");
|
|
|
+ }
|
|
|
+ sb.append("\t\t\t</optionItem>\n");
|
|
|
+
|
|
|
+ // 옵션 옵션조합정보
|
|
|
+ for(GoodsStock optInfo : optList) {
|
|
|
+ sb.append("\t\t\t<combination>\n");
|
|
|
+ sb.append("\t\t\t\t<manageCode>").append(optInfo.getOptCd()).append("</manageCode>\n");
|
|
|
+ sb.append("\t\t\t\t<price>").append(optInfo.getAddPrice()).append("</price>\n");
|
|
|
+ sb.append("\t\t\t\t<stockQuantity>").append(optInfo.getStockQty()).append("</stockQuantity>\n");
|
|
|
+ sb.append("\t\t\t\t<status>true</status>\n");
|
|
|
+ sb.append("\t\t\t\t<options>\n");
|
|
|
+ sb.append("\t\t\t\t\t<name>옵션</name>\n");
|
|
|
+ sb.append("\t\t\t\t\t<id>").append(optInfo.getOptCd()).append("</id>\n");
|
|
|
+ sb.append("\t\t\t\t</options>\n");
|
|
|
+ sb.append("\t\t\t</combination>\n");
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- sb.append("\t\t</option>\n");
|
|
|
+ sb.append("\t\t</option>\n");
|
|
|
|
|
|
- // 10. 배송정보조회
|
|
|
- // 5.2.1 업체별 기본배송비, 무료배송비
|
|
|
- String delvFeeCd = "";
|
|
|
- if("Y".equals(goods.getSelfGoodsYn())) {
|
|
|
- delvFeeCd = "WMS";
|
|
|
- } else {
|
|
|
- delvFeeCd = goods.getDelvFeeCd();
|
|
|
- }
|
|
|
- String delvFeeCrite = "CHARGE";
|
|
|
- int delvFee = goods.getDelvFee();
|
|
|
- String feePayType = "PREPAYED";
|
|
|
- // 배송비 조건
|
|
|
- if(TscConstants.DelvFeeCrite.NORMAL.value().equals(goods.getDelvFeeCrite())) {
|
|
|
- delvFeeCrite = "CONDITIONAL_FREE"; // 조건부 무료(배송비 조건이 무료이거나 배송 방법이 착불일때만 배송비는 0원으로 변경)
|
|
|
- } else if(TscConstants.DelvFeeCrite.FREE.value().equals(goods.getDelvFeeCrite())) {
|
|
|
- delvFeeCrite = "FREE";
|
|
|
- feePayType = "FREE";
|
|
|
- delvFee = 0;
|
|
|
- }
|
|
|
+ // 10. 배송정보조회
|
|
|
+ // 5.2.1 업체별 기본배송비, 무료배송비
|
|
|
+ String delvFeeCd = "";
|
|
|
+ if("Y".equals(goods.getSelfGoodsYn())) {
|
|
|
+ delvFeeCd = "WMS";
|
|
|
+ } else {
|
|
|
+ delvFeeCd = goods.getDelvFeeCd();
|
|
|
+ }
|
|
|
+ String delvFeeCrite = "CHARGE";
|
|
|
+ int delvFee = goods.getDelvFee();
|
|
|
+ String feePayType = "PREPAYED";
|
|
|
+ // 배송비 조건
|
|
|
+ if(TscConstants.DelvFeeCrite.NORMAL.value().equals(goods.getDelvFeeCrite())) {
|
|
|
+ delvFeeCrite = "CONDITIONAL_FREE"; // 조건부 무료(배송비 조건이 무료이거나 배송 방법이 착불일때만 배송비는 0원으로 변경)
|
|
|
+ } else if(TscConstants.DelvFeeCrite.FREE.value().equals(goods.getDelvFeeCrite())) {
|
|
|
+ delvFeeCrite = "FREE";
|
|
|
+ feePayType = "FREE";
|
|
|
+ delvFee = 0;
|
|
|
+ }
|
|
|
|
|
|
- sb.append("\t\t<shippingPolicy>\n");
|
|
|
- sb.append("\t\t\t<groupId>").append(delvFeeCd).append("</groupId>\n");
|
|
|
- sb.append("\t\t\t<method>").append("DELIVERY").append("</method>\n");
|
|
|
- sb.append("\t\t\t<feeType>").append(delvFeeCrite).append("</feeType>\n");
|
|
|
- sb.append("\t\t\t<feePayType>").append(feePayType).append("</feePayType>\n");
|
|
|
- sb.append("\t\t\t<feePrice>").append(delvFee).append("</feePrice>\n");
|
|
|
- if(!"FREE".equals(delvFeeCrite)) {
|
|
|
- sb.append("\t\t\t<conditionalFree>\n");
|
|
|
- sb.append("\t\t\t\t<basePrice>").append(goods.getMinOrdAmt()).append("</basePrice>\n");
|
|
|
- sb.append("\t\t\t</conditionalFree>\n");
|
|
|
- }
|
|
|
+ sb.append("\t\t<shippingPolicy>\n");
|
|
|
+ sb.append("\t\t\t<groupId>").append(delvFeeCd).append("</groupId>\n");
|
|
|
+ sb.append("\t\t\t<method>").append("DELIVERY").append("</method>\n");
|
|
|
+ sb.append("\t\t\t<feeType>").append(delvFeeCrite).append("</feeType>\n");
|
|
|
+ sb.append("\t\t\t<feePayType>").append(feePayType).append("</feePayType>\n");
|
|
|
+ sb.append("\t\t\t<feePrice>").append(delvFee).append("</feePrice>\n");
|
|
|
+ if(!"FREE".equals(delvFeeCrite)) {
|
|
|
+ sb.append("\t\t\t<conditionalFree>\n");
|
|
|
+ sb.append("\t\t\t\t<basePrice>").append(goods.getMinOrdAmt()).append("</basePrice>\n");
|
|
|
+ sb.append("\t\t\t</conditionalFree>\n");
|
|
|
+ }
|
|
|
|
|
|
- sb.append("\t\t</shippingPolicy>\n");
|
|
|
+ sb.append("\t\t</shippingPolicy>\n");
|
|
|
|
|
|
- sb.append("\t</product>\n");
|
|
|
+ sb.append("\t</product>\n");
|
|
|
+ }
|
|
|
}
|
|
|
sb.append("</products>\n");
|
|
|
//for end
|