Bladeren bron

주문 취소 메일 발송 개발 임시 커밋

card007 5 jaren geleden
bovenliggende
commit
1d0e58154a

+ 11 - 1
src/main/java/com/style24/core/biz/dao/TscDeliveryDao.java

@@ -1,9 +1,9 @@
 package com.style24.core.biz.dao;
 
 import java.util.Collection;
-import java.util.List;
 
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.DeliveryFee;
 import com.style24.persistence.domain.WmsDelivery;
 
 /**
@@ -25,4 +25,14 @@ public interface TscDeliveryDao {
 	 */
 	Collection<WmsDelivery> getOrderDetailItemList(WmsDelivery wmsDelivery);
 
+	/**
+	 * 배송비 정책 코드 별 배송비 조회
+	 * 
+	 * @param DeliveryFee
+	 * @return Collection<DeliveryFee>
+	 * @author card007
+	 * @since 2021. 06. 09
+	 */
+	Collection<DeliveryFee> getDeliveryFee(DeliveryFee deliveryFee);
+
 }

+ 59 - 0
src/main/java/com/style24/core/biz/dao/TscOrderChangeDao.java

@@ -751,4 +751,63 @@ public interface TscOrderChangeDao {
 	 * @since 2021. 06. 08
 	 */
 	OrderChange getKakaoOrderReturnInfo(Integer ordChgSq);
+
+	/**
+	 * 마이페이지 취소 상세 정보 조회
+	 *
+	 * @param OrderChange
+	 * @return Collection<OrderChange>
+	 * @author card007
+	 * @since 2021. 04. 08
+	 */
+	Collection<OrderChange> getCreCancelDetailInfo(OrderChange orderChange);
+
+	/**
+	 * 마이페이지 반품 상세 정보 조회
+	 *
+	 * @param OrderChange
+	 * @return Collection<OrderChange>
+	 * @author card007
+	 * @since 2021. 04. 13
+	 */
+	Collection<OrderChange> getCreReturnDetailInfo(OrderChange orderChange);
+
+	/**
+	 * 마이페이지 교환 상세 정보 조회
+	 *
+	 * @param OrderChange
+	 * @return Collection<OrderChange>
+	 * @author card007
+	 * @since 2021. 04. 13
+	 */
+	Collection<OrderChange> getCreExchangeDetailInfo(OrderChange orderChange);
+
+	/**
+	 * 마이페이지 교환 상품 옵션 정보 조회
+	 *
+	 * @param OrderChange
+	 * @return OrderChange
+	 * @author card007
+	 * @since 2021. 04. 08
+	 */
+	OrderChange getExchangeGoodsOptionInfoList(OrderChange orderChange);
+
+	/**
+	 * 전체취소 배송비 취소 처리
+	 *
+	 * @param OrderChange
+	 * @return int
+	 * @author card007
+	 * @since 2021. 06. 09
+	 */
+	int createDeliveryFeeForAllCancel(OrderChange orderChange);
+
+	/**
+	 * 취소 사은품 조회
+	 * 
+	 * @param OrderChange
+	 * @return Collection<OrderChange>
+	 *     
+	 */
+	Collection<OrderChange> getCancelFreeGiftList(OrderChange orderChange);
 }

+ 17 - 7
src/main/java/com/style24/core/biz/service/TscDeliveryService.java

@@ -1,6 +1,5 @@
 package com.style24.core.biz.service;
 
-import java.text.NumberFormat;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -12,19 +11,17 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.gagaframework.excel.env.GagaExcelConstants;
-import com.gagaframework.excel.xssf.GagaExcelResultHandler;
 import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.rest.server.GagaResponseStatus;
+import com.style24.core.biz.dao.TscDeliveryDao;
 import com.style24.core.biz.dao.TscOrderChangeDao;
 import com.style24.core.biz.dao.TscOrderDao;
 import com.style24.core.biz.dao.TscScmDao;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.core.support.util.CryptoUtils;
+import com.style24.persistence.domain.DeliveryFee;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.OrderChange;
-import com.style24.persistence.domain.Point;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -62,6 +59,8 @@ public class TscDeliveryService {
 	@Autowired
 	private ObjectMapper mapper;
 
+	@Autowired
+	private TscDeliveryDao deliveryDao;
 	
 	/**
 	 * 품절취소
@@ -129,9 +128,20 @@ public class TscDeliveryService {
 			}
 		}
 		
-	}	
-	
+	}
+
 
+	/**
+	 * 배송비 정책 코드 별 배송비 조회
+	 *
+	 * @param DeliveryFee
+	 * @return Collection<DeliveryFee>
+	 * @author card007
+	 * @since 2021. 06. 09
+	 */
+	public Collection<DeliveryFee> getDeliveryFee(DeliveryFee deliveryFee) {
+		return deliveryDao.getDeliveryFee(deliveryFee);
+	}
 }
 
 

+ 469 - 4
src/main/java/com/style24/core/biz/service/TscOrderChangeService.java

@@ -8,6 +8,7 @@ import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -17,6 +18,7 @@ import com.style24.core.biz.dao.TscOrderChangeDao;
 import com.style24.core.biz.dao.TscOrderDao;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.DeliveryFee;
 import com.style24.persistence.domain.GiftCard;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.OrderChange;
@@ -33,6 +35,8 @@ import lombok.extern.slf4j.Slf4j;
 @Service
 @Slf4j
 public class TscOrderChangeService {
+	@Autowired
+	private Environment env;
 
 	@Autowired
 	private TscMessageByLocale message;
@@ -60,6 +64,9 @@ public class TscOrderChangeService {
 	
 	@Autowired
 	private TscWmsService wmsService;
+	
+	@Autowired
+	private TscDeliveryService deliveryService;
 
 	/**
 	 * 주문변경정보 (상세번호배열, 취소수량배열) 취소 목록으로 변환 (사용안함)
@@ -2688,8 +2695,17 @@ public class TscOrderChangeService {
 				wmsService.updateWmsCancel(wmsList);
 			}
 		}
+		
+		// 11. 배송비 취소 처리
+		OrderChange cancelDelvFee = new OrderChange();
+		cancelDelvFee.setOrdNo(ordNo);
+		cancelDelvFee.setOrdChgSq(ordChgSq);
+		cancelDelvFee.setRegNo(regNo);
+		cancelDelvFee.setUpdNo(updNo);
 
-		// 11. PG 연동
+		orderChangeDao.createDeliveryFeeForAllCancel(cancelDelvFee);
+
+		// 12. PG 연동
 		Payment pg = new Payment();
 		pg.setOrdNo(ordNo);
 		pg.setOrdChgSq(ordChgSq);
@@ -2728,13 +2744,13 @@ public class TscOrderChangeService {
 				kakaoPayService.cancelKakaoPayment(pg);
 			}
 
-			// 11. 환불금액 정보 수정
+			// 13. 환불금액 정보 수정
 			refundOrder.setPaySq(pg.getPaySq());
 
 			orderChangeDao.updateRefundInfo(refundOrder);
 		}
 
-		// 12. 보증보험 취소 처리 (무통장입금 전 전체취소 시 처리)
+		// 14. 보증보험 취소 처리 (무통장입금 전 전체취소 시 처리)
 		if (TscConstants.OrderChangeStat.PAYMENT_BEFORE_CANCEL.value().equals(chgStat)) {
 			Order guarantee = new Order();
 			guarantee.setOrdNo(ordNo);
@@ -2742,7 +2758,7 @@ public class TscOrderChangeService {
 			orderService.uSafeGuaranteePayedBeforeCancel(guarantee);
 		}
 
-		// 13. 상품권 현금영수증 취소 처리
+		// 15. 상품권 현금영수증 취소 처리
 		GiftCard giftCardCashReceipts = orderDao.getGiftCardReceiptInfo(ordNo);
 
 		if (giftCardCashReceipts != null && StringUtils.isNotBlank(giftCardCashReceipts.getTradeNo())) {
@@ -3972,4 +3988,453 @@ public class TscOrderChangeService {
 	public OrderChange getKakaoOrderReturnInfo(Integer ordChgSq) {
 		return orderChangeDao.getKakaoOrderReturnInfo(ordChgSq);
 	}
+
+	/**
+	 * 마이페이지 취소 상세 정보 조회
+	 *
+	 * @param OrderChange
+	 * @return Collection<OrderChange>
+	 * @author card007
+	 * @since 2021. 04. 08
+	 */
+	public GagaMap getCreCancelDetailInfo(OrderChange orderChange) {
+		GagaMap map = new GagaMap();
+		Collection<OrderChange> result = new ArrayList<>();
+		String refundYn = "N";
+
+		for (OrderChange tmpOrderChange : orderChangeDao.getCreCancelDetailInfo(orderChange)) {
+			// 세트상품 옵션별 배열로 담기
+			if (tmpOrderChange.getItemNm().contains("!@!")) {
+				tmpOrderChange.setItemNmArr(tmpOrderChange.getItemNm().split("!@!"));
+				tmpOrderChange.setColorNmArr(tmpOrderChange.getColorNm().split(","));
+				tmpOrderChange.setOptCd1Arr(tmpOrderChange.getOptCd1().split(","));
+				tmpOrderChange.setOptCd2Arr(tmpOrderChange.getOptCd2().split(","));
+			} else {
+				String[] arr = {tmpOrderChange.getItemNm()}, arr2 = {tmpOrderChange.getColorNm()}, arr3 = {tmpOrderChange.getOptCd1()}, arr4 = {tmpOrderChange.getOptCd2()};
+				tmpOrderChange.setItemNmArr(arr);
+				tmpOrderChange.setColorNmArr(arr2);
+				tmpOrderChange.setOptCd1Arr(arr3);
+				tmpOrderChange.setOptCd2Arr(arr4);
+			}
+
+			// 취소 전표 확인 용 환불 여부 설정
+			String chgStat = tmpOrderChange.getChgStat();
+			if ("N".equals(refundYn) && (TscConstants.OrderChangeStat.PAYMENT_BEFORE_CANCEL.value().equals(chgStat) || TscConstants.OrderChangeStat.PAYMENT_AFTER_CANCEL.value().equals(chgStat))) {
+				refundYn = "Y";
+			}
+
+			result.add(tmpOrderChange);
+		}
+
+		OrderChange oneData = new OrderChange();
+		if (result.size() > 0) {
+			oneData = result.iterator().next();
+		}
+
+		map.set("refundYn", refundYn);
+		map.set("oneData", oneData);
+		map.set("cancelDetailList", result);
+
+		return map;
+	}
+
+	/**
+	 * 마이페이지 반품 상세 정보 조회
+	 *
+	 * @param OrderChange
+	 * @return Collection<OrderChange>
+	 * @author card007
+	 * @since 2021. 04. 13
+	 */
+	public GagaMap getCreReturnDetailInfo(OrderChange orderChange) {
+		GagaMap map = new GagaMap();
+		Collection<OrderChange> result = new ArrayList<>();
+		String refundYn = "N";
+
+		for (OrderChange tmpOrderChange : orderChangeDao.getCreReturnDetailInfo(orderChange)) {
+			// 세트상품 옵션별 배열로 담기
+			if (tmpOrderChange.getItemNm().contains("!@!")) {
+				tmpOrderChange.setItemNmArr(tmpOrderChange.getItemNm().split("!@!"));
+				tmpOrderChange.setColorNmArr(tmpOrderChange.getColorNm().split(","));
+				tmpOrderChange.setOptCd1Arr(tmpOrderChange.getOptCd1().split(","));
+				tmpOrderChange.setOptCd2Arr(tmpOrderChange.getOptCd2().split(","));
+			} else {
+				String[] arr = {tmpOrderChange.getItemNm()}, arr2 = {tmpOrderChange.getColorNm()}, arr3 = {tmpOrderChange.getOptCd1()}, arr4 = {tmpOrderChange.getOptCd2()};
+				tmpOrderChange.setItemNmArr(arr);
+				tmpOrderChange.setColorNmArr(arr2);
+				tmpOrderChange.setOptCd1Arr(arr3);
+				tmpOrderChange.setOptCd2Arr(arr4);
+			}
+
+			// 취소 전표 확인 용 환불 여부 설정
+			String chgStat = tmpOrderChange.getChgStat();
+			if ("N".equals(refundYn) && TscConstants.OrderChangeStat.RETURN_COMPLETE.value().equals(chgStat)) {
+				refundYn = "Y";
+			}
+
+			result.add(tmpOrderChange);
+		}
+
+		OrderChange oneData = new OrderChange();
+		if (result.size() > 0) {
+			oneData = result.iterator().next();
+		}
+
+		map.set("refundYn", refundYn);
+		map.set("oneData", oneData);
+		map.set("returnDetailList", result);
+
+		return map;
+	}
+
+	/**
+	 * 마이페이지 교환 상세 정보 조회
+	 *
+	 * @param OrderChange
+	 * @return Collection<OrderChange>
+	 * @author card007
+	 * @since 2021. 04. 13
+	 */
+	public GagaMap getCreExchangeDetailInfo(OrderChange orderChange) {
+		GagaMap map = new GagaMap();
+		Collection<OrderChange> result = new ArrayList<>();
+
+		for (OrderChange tmpOrderChange : orderChangeDao.getCreExchangeDetailInfo(orderChange)) {
+			// 세트상품 옵션별 배열로 담기
+			if (tmpOrderChange.getItemNm().contains("!@!")) {
+				tmpOrderChange.setItemNmArr(tmpOrderChange.getItemNm().split("!@!"));
+				tmpOrderChange.setColorNmArr(tmpOrderChange.getColorNm().split(","));
+				tmpOrderChange.setOptCd1Arr(tmpOrderChange.getOptCd1().split(","));
+				tmpOrderChange.setOptCd2Arr(tmpOrderChange.getOptCd2().split(","));
+			} else {
+				String[] arr = {tmpOrderChange.getItemNm()}, arr2 = {tmpOrderChange.getColorNm()}, arr3 = {tmpOrderChange.getOptCd1()}, arr4 = {tmpOrderChange.getOptCd2()};
+				tmpOrderChange.setItemNmArr(arr);
+				tmpOrderChange.setColorNmArr(arr2);
+				tmpOrderChange.setOptCd1Arr(arr3);
+				tmpOrderChange.setOptCd2Arr(arr4);
+			}
+
+			// 교환상품 옵션 정보 조회 및 설정
+			OrderChange changeOptionInfo = orderChangeDao.getExchangeGoodsOptionInfoList(tmpOrderChange);
+			if (changeOptionInfo.getItemNm().contains("!@!")) {
+				tmpOrderChange.setChgItemNmArr(changeOptionInfo.getItemNm().split("!@!"));
+				tmpOrderChange.setChgColorNmArr(changeOptionInfo.getColorNm().split(","));
+				tmpOrderChange.setChgOptCd1Arr(changeOptionInfo.getOptCd1().split(","));
+				tmpOrderChange.setChgOptCd2Arr(changeOptionInfo.getOptCd2().split(","));
+			} else {
+				tmpOrderChange.setChgItemNm(changeOptionInfo.getItemNm());
+				tmpOrderChange.setChgColorNm(changeOptionInfo.getColorNm());
+				tmpOrderChange.setChgOptCd1(changeOptionInfo.getOptCd1());
+				tmpOrderChange.setChgOptCd2(changeOptionInfo.getOptCd2());
+			}
+
+			result.add(tmpOrderChange);
+		}
+
+		OrderChange oneData = new OrderChange();
+		if (result.size() > 0) {
+			oneData = result.iterator().next();
+		}
+
+		map.set("oneData", oneData);
+		map.set("exchangeDetailList", result);
+
+		return map;
+	}
+	
+	public GagaMap getMailOrderCancelReplaceInfo(OrderChange orderChange) {
+		GagaMap result = new GagaMap();
+		
+		
+		// 취소 상세 정보 조회
+		Collection<OrderChange> cancelList = orderChangeDao.getCreCancelDetailInfo(orderChange);
+
+		if (cancelList.size() == 0) {
+			throw new IllegalStateException(message.getMessage("FAIL_0005"));
+		}
+
+		OrderChange oneData = cancelList.iterator().next();
+
+		// 주문 정보 설정
+		result.setString("ordNm", oneData.getOrdNm());
+		result.setInt("ordNo", oneData.getOrdNo());
+		result.setString("ordDate", oneData.getOrdDate());
+		result.setString("ordDt", oneData.getOrdDt());
+		
+		// 취소 정보 설정
+		
+		
+		String cancelInfo = this.getMailOrderCancelInfo(cancelList);
+		result.setString("cancelInfo", cancelInfo);
+		
+		// 사은품 정보 조회
+		String freeGiftInfo = this.getMailFreeGiftCancelInfo(orderChange);
+		result.setString("freeGiftInfo", freeGiftInfo);
+		
+		// 결제 정보 조회
+		int dcAmt = oneData.getRfCpn1Amt() + oneData.getRfTmtb1Amt() + oneData.getRfTmtb2Amt() + oneData.getRfGoodsCpnAmt() + oneData.getRfCartCpnAmt() + oneData.getRfDelvCpnAmt() + oneData.getRfPrePntAmt();
+		
+		result.setInt("cnclRtnAmt", oneData.getRfCnclAmt());
+		result.setInt("delvFee", oneData.getRfDeliveryFee());
+		result.setInt("dcAmt", dcAmt);
+		
+		// 버튼 URL 설정
+		String hasSsl = env.getProperty("has-ssl");
+		String protocol;
+
+		if ("true".equals(hasSsl)) {
+			protocol = "https:";
+		} else {
+			protocol = "http:";
+		}
+
+		String url = protocol + env.getProperty("domain.front");
+		if (orderChange.getCustNo() > 0) {
+			url += "/mypage/cre/list/form";
+		} else {
+			url += "/customer/noncust/order/confirm/form";
+		}
+		
+		result.setString("creButtonUrl", url);
+		return result;
+	}
+
+	@SuppressWarnings("unchecked")
+	public String getMailOrderCancelInfo(Collection<OrderChange> cancelList) {
+		List<GagaMap> cancelDelvList = new ArrayList<>();
+		List<OrderChange> cancelDetailList = new ArrayList<>();
+		GagaMap cancelMap = new GagaMap();
+
+		OrderChange oneData = cancelList.iterator().next();
+		Integer ordNo = oneData.getOrdNo();
+
+		String delvFeeCd = oneData.getDelvFeeCd();
+		for (OrderChange cancelInfo : cancelList) {
+			if (!delvFeeCd.equals(cancelInfo.getDelvFeeCd())) {
+				// 취소 배송비 정보 조회
+				DeliveryFee deliveryFee = new DeliveryFee();
+				deliveryFee.setOrdNo(ordNo);
+				deliveryFee.setDelvFeeCd(delvFeeCd);
+
+				Collection<DeliveryFee> deliveryFeeList = deliveryService.getDeliveryFee(deliveryFee);
+
+				// 취소 배송비 설정
+				int delvFee = 0;
+				if (deliveryFeeList != null && deliveryFeeList.size() > 0) {
+					delvFee = deliveryFeeList.iterator().next().getRealDelvAmt();
+				}
+
+				cancelMap.setInt("delvFee", delvFee);
+				cancelMap.set("cancelDetailList", cancelDetailList);
+				cancelMap.setString("delvFeeCd", delvFeeCd);
+				cancelDelvList.add(cancelMap);
+
+				cancelDetailList = new ArrayList<>();
+				cancelMap = new GagaMap();
+				delvFeeCd = cancelInfo.getDelvFeeCd();
+			}
+
+			// 세트상품 옵션별 배열로 담기
+			if (cancelInfo.getItemNm().contains("!@!")) {
+				cancelInfo.setItemNmArr(cancelInfo.getItemNm().split("!@!"));
+				cancelInfo.setColorNmArr(cancelInfo.getColorNm().split(","));
+				cancelInfo.setOptCd1Arr(cancelInfo.getOptCd1().split(","));
+				cancelInfo.setOptCd2Arr(cancelInfo.getOptCd2().split(","));
+			} else {
+				String[] arr = {cancelInfo.getItemNm()}, arr2 = {cancelInfo.getColorNm()}, arr3 = {cancelInfo.getOptCd1()}, arr4 = {cancelInfo.getOptCd2()};
+				cancelInfo.setItemNmArr(arr);
+				cancelInfo.setColorNmArr(arr2);
+				cancelInfo.setOptCd1Arr(arr3);
+				cancelInfo.setOptCd2Arr(arr4);
+			}
+
+			cancelDetailList.add(cancelInfo);
+		}
+
+		DeliveryFee deliveryFee = new DeliveryFee();
+		deliveryFee.setOrdNo(ordNo);
+		deliveryFee.setDelvFeeCd(delvFeeCd);
+
+		Collection<DeliveryFee> deliveryFeeList = deliveryService.getDeliveryFee(deliveryFee);
+
+		int delvFee = 0;
+		if (deliveryFeeList != null && deliveryFeeList.size() > 0) {
+			delvFee = deliveryFeeList.iterator().next().getRealDelvAmt();
+		}
+
+		cancelMap.setInt("delvFee", delvFee);
+		cancelMap.set("cancelDetailList", cancelDetailList);
+		cancelMap.setString("delvFeeCd", delvFeeCd);
+		cancelDelvList.add(cancelMap);
+		
+		StringBuilder sb = new StringBuilder();
+		
+		sb.append("											<table style=\"width:100%;margin:0;padding:0;font-size: 14px;\" cellspacing=\"0\" cellpadding=\"0\">");
+        sb.append("												<tbody>");
+        sb.append("													<tr>");
+        sb.append("													    <td height=\"50px;\" style=\"height: 50px;\"></td>");
+        sb.append("													</tr>");
+        sb.append("													<tr>");
+        sb.append("													    <th colspan=\"2\" style=\"text-align: left;font-size: 18px;color: #222222;\" align=\"left\">");
+		sb.append("															주문취소 상품정보");
+		sb.append("														</th>");
+        sb.append("													</tr>");
+        sb.append("													<tr>");
+        sb.append("													    <td height=\"20px;\" style=\"height: 20px;\"></td>");
+        sb.append("													</tr>");
+        // for문 시작
+		for (GagaMap map : cancelDelvList) {
+			sb.append("													<tr>");
+			sb.append("														<td>");
+			sb.append("															<table style=\"border: 1px; border-color: #dddddd; border-style: solid; box-sizing: border-box; width:100%;margin:0;padding:0\" cellspacing=\"0\" cellpadding=\"0\">");
+			sb.append("																<tbody>");
+			sb.append("																	<tr>");
+			sb.append("																		<td colspan=\"5\" height=\"20px;\" style=\"height: 20px;\"></td>");
+			sb.append("																	</tr>");
+			sb.append("																	<tr>");
+			sb.append("																		<td width=\"40px;\"></td>");
+			sb.append("																		<td colspan=\"3\" style=\"text-align: left;font-size: 18px;font-family:'Apple SD Gothic Neo','나눔고딕',NanumGothic,'맑은고딕',Malgun Gothic, Helvetica, sans-serif;font-weight:600;color: #222222;\" align=\"left\">");
+			sb.append("																			STYLE24 총알배송");
+			sb.append("																		</td>");
+			sb.append("																	    <td width=\"40px;\"></td>");
+			sb.append("																	</tr>");
+			sb.append("																	<tr>");
+			sb.append("																	    <td colspan=\"5\" height=\"20px;\" style=\"height: 20px;border:0; border-bottom: 1px; border-color: #dddddd; border-style: solid; box-sizing: border-box;\"></td>");
+			sb.append("																	</tr>");
+			sb.append("																	<tr>");
+			sb.append("																	    <td height=\"30px;\" style=\"height: 30px;\"></td>");
+			sb.append("																	</tr>");
+			for (OrderChange cancelDetail : (List<OrderChange>) map.get("cancelDetailList")) {
+				sb.append("																	<tr>");
+				sb.append("																	    <td width=\"40px;\" rowspan=\"9\"></td>");
+				sb.append("																	    <td width=\"100px;\" height=\"150px;\" rowspan=\"9\" style=\"margin:0;padding:0\">");
+				sb.append("																	        <a href=\"#none\" target=\"_blank\" style=\"margin:0;padding:0\">"); // 
+				sb.append("																	            <span style=\"background: #f5f5f5;width: 100px;height: 150px;margin:0;padding:0\">");
+				sb.append("																	                <img src=\"/images/mo/thumb/tmp_pdLookbook2.jpg\" alt=\"이미지\" style=\"width: 100px;height: 150px;margin:0;padding:0\">"); // sysImgNm
+				sb.append("																	            </span>");
+				sb.append("																	        </a>");
+				sb.append("																	    </td>");
+				sb.append("																	    <td width=\"30px;\" rowspan=\"9\"></td>");
+				sb.append("																	    <td width=\"370px;\" height=\"10px;\"></td>");
+				sb.append("																	    <td width=\"40px;\" rowspan=\"9\"></td>");
+				sb.append("																	</tr>");
+				sb.append("																	<tr>");
+				sb.append("																	    <td style=\"font-family:'Apple SD Gothic Neo',verdana,Arial,'나눔고딕',NanumGothic,'맑은고딕',Malgun Gothic, Helvetica, sans-serif;\">");
+				sb.append("																			NBA"); // brandNm
+				sb.append("																		</td>");
+				sb.append("																	</tr>");
+				sb.append("																	<tr>");
+				sb.append("																	    <td height=\"5px;\" style=\"height: 5px;\"></td>");
+				sb.append("																	</tr>");
+				sb.append("																	<tr>");
+				sb.append("																	    <td style=\"color: #222222;font-size: 16px;font-weight: bold;letter-spacing: -0.05em;\">");
+				sb.append("																	        <a href=\"#none\" target=\"_blank\" style=\"display: block; color: #222222; font-size: 16px; font-weight: bold; letter-spacing: -0.025em; text-decoration: none;\">");
+				sb.append("																				남성 라그란 소매배색 싸이로 티셔츠"); // goodsNm
+				sb.append("																			</a>");
+				sb.append("																	    </td>");
+				sb.append("																	</tr>");
+				sb.append("																	<tr>");
+				sb.append("																	    <td height=\"20px;\" style=\"height: 20px;\"></td>");
+				sb.append("																	</tr>");
+				sb.append("																	<tr>");
+				sb.append("																	    <td>옵션1</td>"); // option
+				sb.append("																	</tr>");
+				sb.append("																	<tr>");
+				sb.append("																	    <td height=\"20px;\" style=\"height: 20px;\"></td>");
+				sb.append("																	</tr>");
+				sb.append("																	<tr>");
+				sb.append("																	    <td>");
+				sb.append("																	        <span>1개</span>"); // chgQty
+				sb.append("																	        <span style=\"width: 12px;padding-left:12px;\"></span>");
+				sb.append("																	        <span style=\"width: 2px; height: 14px; background: #f5f5f5;\"></span>");
+				sb.append("																	        <span style=\"width: 12px;padding-right:12px;\"></span>");
+				// sb.append("																	        <span style=\"text-decoration: line-through;color: #888888;\"><span>19,990</span>원</span>");
+				// sb.append("																	        <span style=\"font-weight: 500;\"><span>19,990</span>원</span>");
+				sb.append("																	    </td>");
+				sb.append("																	</tr>");
+				sb.append("																	<tr>");
+				sb.append("																	    <td height=\"35px;\" style=\"height: 35px;\"></td>");
+				sb.append("																	</tr>");
+				sb.append("																	<tr>");
+				sb.append("																	    <td height=\"20px;\" style=\"height: 20px;\"></td>");
+				sb.append("																	</tr>");
+				// delvFee 존재할 시 처리
+				sb.append("																	<tr>");
+				sb.append("																	    <td width=\"40px;\"></td>");
+				sb.append("																	    <td colspan=\"3\" height=\"20px;\" style=\"height: 45px; background: #f5f5f5;\" bgcolor=\"#f5f5f5\">");
+				sb.append("																	        <span style=\"width: 12px;padding-left:12px;\"></span>");
+				sb.append("																	        <span>배송비</span>");
+				sb.append("																	        <span style=\"width: 12px;padding-right:12px;\"></span>");
+				sb.append("																	        <span>");
+				sb.append("																	            <span>2,500</span>원"); // delvFee
+				sb.append("																			</span>");
+				sb.append("														                </td>");
+				sb.append("														                <td width=\"40px;\"></td>");
+				sb.append("														            </tr>");
+				// //delvFee 존재할 시 처리
+				sb.append("														            <tr>");
+				sb.append("														                <td height=\"20px;\" style=\"height: 20px;\"></td>");
+				sb.append("														            </tr>");
+			}
+			sb.append("														        </tbody>");
+			sb.append("														    </table>");
+			sb.append("														</td>");
+			sb.append("													</tr>");
+		}
+		// for문 끝
+		sb.append("												</tbody>");
+		sb.append("											</table>");
+		
+		return sb.toString();
+	}
+	
+	public String getMailFreeGiftCancelInfo(OrderChange orderChange) {
+		Collection<OrderChange> freeGiftList = orderChangeDao.getCancelFreeGiftList(orderChange);
+
+		StringBuilder sb = new StringBuilder();
+		
+		sb.append("											<table style=\"width:100%;margin:0;padding:0;font-size: 14px;\" cellspacing=\"0\" cellpadding=\"0\">");
+        sb.append("												<tbody>");
+        sb.append("													<tr>");
+        sb.append("														<td height=\"50px;\" style=\"height: 50px;\"></td>");
+        sb.append("													</tr>");
+        sb.append("													<tr>");
+        sb.append("														<th colspan=\"4\" style=\"text-align: left;font-size: 18px;color: #222222;\" align=\"left\">");
+		sb.append("															사은품 정보");
+		sb.append("														</th>");
+        sb.append("													</tr>");
+        sb.append("													<tr>");
+        sb.append("														<td height=\"20px;\" style=\"height: 20px;\"></td>");
+        sb.append("													</tr>");
+        sb.append("													<tr>");
+        sb.append("													    <td colspan=\"4\" height=\"1\" bgcolor=\"#000000\" style=\"height: 1px; background: #000000;\"></td>");
+        sb.append("													</tr>");
+        sb.append("													<tr>");
+        sb.append("													    <td height=\"20px;\" style=\"height: 20px;\"></td>");
+        sb.append("													</tr>");
+        // for문 시작
+        sb.append("													<tr>");
+        sb.append("													    <td width=\"40px;\"></td>");
+        sb.append("													    <td width=\"250px;\" align=\"left\" style=\"text-align: left;\">");
+		sb.append("														TBJ 굿즈 인형");
+        sb.append("														</td>");
+        sb.append("														<td width=\"250px;\" align=\"left\" style=\"text-align: left;\">");
+        sb.append("														    <span style=\"color:#fd4802;font-family:verdana,Arial, Helvetica, sans-serif;\">");
+        sb.append("														        <span>-9,999,999</span>P");
+		sb.append("															</span>");
+        sb.append("														</td>");
+        sb.append("														<td width=\"40px;\"></td>");
+        sb.append("													</tr>");
+        sb.append("													<tr>");
+        sb.append("														<td height=\"20px;\" style=\"height: 20px;\"></td>");
+        sb.append("													</tr>");
+        // for문 종료
+        sb.append("													<tr>");
+        sb.append("														<td colspan=\"4\" height=\"1\" bgcolor=\"#dddddd\" style=\"height: 1px; background: #dddddd;\"></td>");
+        sb.append("													</tr>");
+        sb.append("												</tbody>");
+        sb.append("											</table>");
+		
+		return sb.toString();
+	}
 }

+ 3 - 0
src/main/java/com/style24/persistence/domain/OrderChange.java

@@ -136,6 +136,8 @@ public class OrderChange extends TscBaseDomain {
 
 	// 취반교 리스트
 	private String ordDt;							// 주문일시
+	private String ordDate;							// 주문시간
+	private String ordTime;							// 주문시간
 	private String chgDate;							// 변경일시
 	private String chgTime;							// 변경시간
 	private String giftPackYn;						// 선물하기여부
@@ -185,6 +187,7 @@ public class OrderChange extends TscBaseDomain {
 	private String payMeansNm;						// 결제수단명
 	private int priceOrg;							// 원가격
 	private int priceSale;							// 할인가격
+	private int usePoint;							// 사은품 사용 포인트
 
 	// 교환 상세
 	private String[] chgItemNmArr;					// 교환상품구성상품명 배열

+ 18 - 0
src/main/java/com/style24/persistence/mybatis/shop/TscDelivery.xml

@@ -19,5 +19,23 @@
 		   AND B.ORD_DTL_NO = #{ordDtlNo}		
 		
 	</select>
+	
+	<!-- 배송비 정책 코드 별 배송비 조회 -->
+	<select id="getDeliveryFee" parameterType="DeliveryFee" resultType="DeliveryFee">
+		/* TscDelivery.getDeliveryFee */
+		SELECT DELV_FEE_CD
+		     , SUM(DELV_FEE) AS DELV_FEE
+		     , SUM(DELV_CPN_DC_AMT) AS DELV_CPN_DC_AMT
+		     , SUM(REAL_DELV_AMT) AS REAL_DELV_AMT
+		  FROM TB_DELIVERY_FEE
+		 WHERE ORD_NO = #{ordNo}
+		<if test="delvFeeCd != null and delvFeeCd != ''">
+		   AND DELV_FEE_CD = #{delvFeeCd}
+		</if>
+		<if test="paySq != null and paySq != ''">
+		   AND PAY_SQ = #{paySq}
+		</if>
+		 GROUP BY DELV_FEE_CD
+	</select>
 
 </mapper>

+ 651 - 1
src/main/java/com/style24/persistence/mybatis/shop/TscOrderChange.xml

@@ -2953,12 +2953,13 @@
 			 , SUM(OD.PNT_DC_AMT)       AS RF_PNT_AMT
 			 , SUM(OD.PRE_PNT_DC_AMT)   AS RF_PRE_PNT_AMT
 			 , SUM(OD.GFCD_USE_AMT)     AS RF_GFCD_USE_AMT
-			 , DF.DELV_FEE              AS RF_DELIVERY_FEE
+			 , DF.REAL_DELV_AMT         AS RF_DELIVERY_FEE
 			 , SUM(OD.REAL_ORD_AMT)     AS REAL_ORD_AMT
 		  FROM TB_ORDER_DETAIL OD
 		 INNER JOIN (SELECT ORD_NO
 		                  , SUM(DELV_FEE) AS DELV_FEE
 		                  , SUM(DELV_CPN_DC_AMT) AS DELV_CPN_DC_AMT
+		                  , SUM(REAL_DELV_AMT) AS REAL_DELV_AMT
 		               FROM TB_DELIVERY_FEE
 		              WHERE DELV_FEE_GB = 'G018_10'
 		              GROUP BY ORD_NO) DF
@@ -3829,6 +3830,655 @@ WHERE WD_INVOICE_NO  = #{wdInvoiceNo}
 		       ) Z
 		 WHERE Z.RNUM = 1
 	</select>
+
+	<!-- 마이페이지 취소 상세 정보 조회 -->
+	<select id="getCreCancelDetailInfo" parameterType="OrderChange" resultType="OrderChange">
+		/* TsfOrderChange.getCreCancelDetailInfo */
+		SELECT GROUP_CONCAT(Z.ITEM_NM ORDER BY Z.ORD_DTL_ITEM_SQ SEPARATOR '!@!')       AS ITEM_NM
+		, GROUP_CONCAT(Z.COLOR_NM ORDER BY Z.ORD_DTL_ITEM_SQ)                      AS COLOR_NM
+		, GROUP_CONCAT(Z.OPT_CD1 ORDER BY Z.ORD_DTL_ITEM_SQ)                       AS OPT_CD1
+		, GROUP_CONCAT(Z.OPT_CD2 ORDER BY Z.ORD_DTL_ITEM_SQ)                       AS OPT_CD2
+		, Z.ORD_CHG_SQ
+		, Z.CHG_GB
+		, Z.CHG_QTY
+		, Z.ORD_DT
+		, Z.ORD_DATE
+		, Z.CHG_DATE
+		, Z.CHG_TIME
+		, Z.CHG_DT
+		, Z.COMPLETE_DT
+		, Z.CHG_STAT
+		, Z.CHG_STAT_NM
+		, Z.ORD_NO
+		, Z.ORD_AMT
+		, Z.ORD_QTY
+		, Z.CNCL_RTN_QTY
+		, Z.CNCL_RTN_AMT
+		, Z.CPN1_DC_AMT
+		, Z.REAL_ORD_AMT
+		, Z.PNT_DC_AMT
+		, Z.GFCD_USE_AMT
+		, Z.ORD_DTL_NO
+		, Z.GOODS_CD
+		, Z.BRAND_NM
+		, Z.SHOT_DELV_YN
+		, Z.SELF_GOODS_YN
+		, Z.GOODS_NM
+		, Z.GOODS_TYPE
+		, Z.PRICE_ORG
+		, Z.PRICE_SALE
+		, Z.ADD_PAY_COST
+		, Z.SYS_IMG_NM
+		, Z.GIFT_PACK_YN
+		, Z.DELV_FEE_CD
+		, Z.REFUND_AMT
+		, Z.RF_CPN1_AMT
+		, Z.RF_TMTB1_AMT
+		, Z.RF_TMTB2_AMT
+		, Z.RF_GOODS_CPN_AMT
+		, Z.RF_CART_CPN_AMT
+		, Z.RF_DELV_CPN_AMT
+		, Z.RF_PNT_AMT
+		, Z.RF_PRE_PNT_AMT
+		, Z.RF_GFCD_USE_AMT
+		, Z.RF_CNCL_AMT
+		, Z.RF_DELIVERY_FEE
+		, Z.RF_REAL_CNCL_AMT
+		, Z.PG_TID
+		, Z.PG_GB
+		, Z.PAY_MEANS
+		, Z.PAY_MEANS_NM
+		FROM (SELECT OC.ORD_CHG_SQ
+		, OC.CHG_GB
+		, OCD.CHG_QTY
+		, DATE_FORMAT(O.ORD_DT, '%Y.%m.%d')                                AS ORD_DT
+		, DATE_FORMAT(O.ORD_DT, '%Y.%m.%d %H:%i')                          AS ORD_DATE
+		, DATE_FORMAT(OCDH.REG_DT, '%Y.%m.%d')                             AS CHG_DATE
+		, DATE_FORMAT(OCDH.REG_DT,'%H:%i:%S')                              AS CHG_TIME
+		, DATE_FORMAT(OCD.REG_DT, '%Y.%m.%d')                              AS CHG_DT
+		, DATE_FORMAT(OCD.COMPLETE_DT, '%Y.%m.%d')                         AS COMPLETE_DT
+		, OCD.CHG_STAT
+		, FN_GET_CODE_NM('G685', OCD.CHG_STAT)                             AS CHG_STAT_NM
+		, OD.ORD_NO
+		, OD.ORD_AMT
+		, OD.ORD_QTY
+		, OD.CNCL_RTN_QTY
+		, OD.CNCL_RTN_AMT
+		, OD.CPN1_DC_AMT
+		, OD.REAL_ORD_AMT
+		, OD.PNT_DC_AMT
+		, OD.GFCD_USE_AMT
+		, OCD.ORD_DTL_NO
+		, G1.GOODS_CD
+		, CASE BG.DISP_NM_LANG WHEN 'EN' THEN BG.BRAND_GROUP_ENM
+		ELSE BG.BRAND_GROUP_KNM
+		END                                                             AS BRAND_NM
+		, OD.SHOT_DELV_YN
+		, G1.SELF_GOODS_YN
+		, G1.GOODS_NM
+		, IFNULL((SELECT COLOR_KNM FROM TB_COLOR WHERE COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G1.MAIN_COLOR_CD ) AND USE_YN  = 'Y'), ODI.OPT_CD1) AS COLOR_NM
+		, G2.GOODS_NM                                                      AS ITEM_NM
+		, G1.GOODS_TYPE
+		, ODI.ORD_DTL_ITEM_SQ
+		, ODI.OPT_CD1
+		, ODI.OPT_CD2
+		, ROUND((ODH.ORD_AMT - ODH.CPN1_DC_AMT) * (OCD.CHG_QTY / ODH.ORD_QTY)) AS PRICE_ORG
+		, ROUND((ODH.REAL_ORD_AMT + ODH.PNT_DC_AMT + ODH.GFCD_USE_AMT) * (OCD.CHG_QTY / OD.ORD_QTY)) AS PRICE_SALE
+		, OC.ADD_PAY_COST
+		, CASE WHEN G1.GOODS_TYPE != 'G056_S' AND G1.SELF_GOODS_YN = 'Y' THEN (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G1.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y')
+		ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G1.GOODS_CD AND COLOR_CD = IFNULL(G1.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') END AS SYS_IMG_NM
+		, OD.GIFT_PACK_YN
+		, OD.DELV_FEE_CD
+		, R.REFUND_AMT
+		, R.RF_CPN1_AMT
+		, R.RF_TMTB1_AMT
+		, R.RF_TMTB2_AMT
+		, R.RF_GOODS_CPN_AMT
+		, R.RF_CART_CPN_AMT
+		, R.RF_DELV_CPN_AMT
+		, R.RF_PNT_AMT
+		, R.RF_PRE_PNT_AMT
+		, R.RF_GFCD_USE_AMT
+		, R.RF_CNCL_AMT
+		, R.RF_DELIVERY_FEE
+		, R.RF_REAL_CNCL_AMT
+		, P.PG_TID
+		, P.PG_GB
+		, P.PAY_MEANS
+		, FN_GET_CODE_NM('G014', P.PAY_MEANS)                              AS PAY_MEANS_NM
+		FROM TB_ORDER_CHANGE OC
+		INNER JOIN TB_ORDER_CHANGE_DETAIL OCD
+		ON OC.ORD_CHG_SQ = OCD.ORD_CHG_SQ
+		INNER JOIN TB_ORDER_CHANGE_DETAIL_HST OCDH
+		ON OCD.ORD_CHG_SQ = OCDH.ORD_CHG_SQ
+		AND OCD.ORD_DTL_NO = OCDH.ORD_DTL_NO
+		AND OCD.CHG_STAT = OCDH.CHG_STAT
+		INNER JOIN TB_ORDER_DETAIL OD
+		ON OCD.ORD_DTL_NO = OD.ORD_DTL_NO
+		AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		INNER JOIN TB_ORDER O
+		ON OD.ORD_NO = O.ORD_NO
+		INNER JOIN TB_ORDER_DETAIL_ITEM ODI
+		ON OD.ORD_NO = ODI.ORD_NO
+		AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		INNER JOIN TB_ORDER_DETAIL_HST ODH
+		ON OD.ORD_DTL_NO = ODH.ORD_DTL_NO
+		AND ODH.ORD_DTL_STAT = 'G013_00'
+		INNER JOIN TB_GOODS G1
+		ON OD.GOODS_CD = G1.GOODS_CD
+		INNER JOIN TB_GOODS G2
+		ON ODI.ITEM_CD = G2.GOODS_CD
+		INNER JOIN TB_BRAND B
+		ON G1.BRAND_CD = B.BRAND_CD
+		AND B.USE_YN = 'Y'
+		INNER JOIN TB_BRAND_GROUP BG
+		ON B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+		AND BG.USE_YN = 'Y'
+		LEFT OUTER JOIN TB_REFUND R
+		ON R.ORD_CHG_SQ = OC.ORD_CHG_SQ
+		INNER JOIN TB_PAYMENT P
+		ON P.ORD_NO = O.ORD_NO
+		AND P.PAY_GB = 'O'
+		AND P.PAY_STAT IN ('G016_10', 'G016_30')
+		WHERE OCD.DEL_YN = 'N'
+		AND O.DISP_YN = 'Y'
+		<choose>
+			<when test="custNo > 0">
+				AND O.CUST_NO = #{custNo}
+			</when>
+			<otherwise>
+				AND O.ORD_NO = #{ordNo}
+				AND O.ORD_NM = #{ordNm}
+				AND O.ORD_PHNNO = #{ordPhnno}
+			</otherwise>
+		</choose>
+		<if test="ordChgSq != null and ordChgSq != ''">
+			AND OC.ORD_CHG_SQ = #{ordChgSq}
+		</if>
+		) Z
+		GROUP BY Z.ORD_CHG_SQ, Z.CHG_GB, Z.CHG_QTY, Z.ORD_DT, Z.ORD_DATE, Z.CHG_DATE, Z.CHG_TIME, Z.CHG_DT, Z.COMPLETE_DT, Z.CHG_STAT
+		, Z.CHG_STAT_NM, Z.ORD_NO, Z.ORD_AMT, Z.ORD_QTY, Z.CNCL_RTN_QTY, Z.CNCL_RTN_AMT, Z.CPN1_DC_AMT, Z.REAL_ORD_AMT, Z.PNT_DC_AMT
+		, Z.GFCD_USE_AMT, Z.ORD_DTL_NO, Z.GOODS_CD, Z.BRAND_NM, Z.SHOT_DELV_YN, Z.SELF_GOODS_YN, Z.GOODS_NM, Z.GOODS_TYPE
+		, Z.PRICE_ORG, Z.PRICE_SALE, Z.ADD_PAY_COST, Z.SYS_IMG_NM, Z.GIFT_PACK_YN, Z.DELV_FEE_CD, Z.REFUND_AMT, Z.RF_CPN1_AMT, Z.RF_TMTB1_AMT
+		, Z.RF_TMTB2_AMT, Z.RF_GOODS_CPN_AMT, Z.RF_CART_CPN_AMT, Z.RF_DELV_CPN_AMT, Z.RF_PNT_AMT, Z.RF_PRE_PNT_AMT, Z.RF_GFCD_USE_AMT
+		, Z.RF_CNCL_AMT, Z.RF_DELIVERY_FEE, Z.RF_REAL_CNCL_AMT, Z.PG_TID, Z.PG_GB, Z.PAY_MEANS, Z.PAY_MEANS_NM
+		ORDER BY Z.ORD_CHG_SQ DESC
+	</select>
+
+	<!-- 마이페이지 반품 상세 정보 조회 -->
+	<select id="getCreReturnDetailInfo" parameterType="OrderChange" resultType="OrderChange">
+		/* TsfOrderChange.getCreReturnDetailInfo */
+		SELECT GROUP_CONCAT(Z.ITEM_NM ORDER BY Z.ORD_DTL_ITEM_SQ SEPARATOR '!@!')       AS ITEM_NM
+		, GROUP_CONCAT(Z.COLOR_NM ORDER BY Z.ORD_DTL_ITEM_SQ)                      AS COLOR_NM
+		, GROUP_CONCAT(Z.OPT_CD1 ORDER BY Z.ORD_DTL_ITEM_SQ)                       AS OPT_CD1
+		, GROUP_CONCAT(Z.OPT_CD2 ORDER BY Z.ORD_DTL_ITEM_SQ)                       AS OPT_CD2
+		, Z.ORD_CHG_SQ
+		, Z.CHG_GB
+		, Z.CHG_QTY
+		, Z.ORD_DT
+		, Z.CHG_DATE
+		, Z.CHG_TIME
+		, Z.CHG_DT
+		, Z.COMPLETE_DT
+		, Z.CHG_STAT
+		, Z.CHG_STAT_NM
+		, Z.ORD_NO
+		, Z.ORD_AMT
+		, Z.ORD_QTY
+		, Z.CNCL_RTN_QTY
+		, Z.CNCL_RTN_AMT
+		, Z.CPN1_DC_AMT
+		, Z.REAL_ORD_AMT
+		, Z.PNT_DC_AMT
+		, Z.GFCD_USE_AMT
+		, Z.ORD_DTL_NO
+		, Z.GOODS_CD
+		, Z.BRAND_NM
+		, Z.SHOT_DELV_YN
+		, Z.SELF_GOODS_YN
+		, Z.GOODS_NM
+		, Z.GOODS_TYPE
+		, Z.PRICE_ORG
+		, Z.PRICE_SALE
+		, Z.ADD_PAY_COST
+		, Z.SYS_IMG_NM
+		, Z.GIFT_PACK_YN
+		, Z.REFUND_AMT
+		, Z.RF_CPN1_AMT
+		, Z.RF_TMTB1_AMT
+		, Z.RF_TMTB2_AMT
+		, Z.RF_GOODS_CPN_AMT
+		, Z.RF_CART_CPN_AMT
+		, Z.RF_DELV_CPN_AMT
+		, Z.RF_PNT_AMT
+		, Z.RF_PRE_PNT_AMT
+		, Z.RF_GFCD_USE_AMT
+		, Z.RF_CNCL_AMT
+		, Z.RF_DELIVERY_FEE
+		, Z.RF_REAL_CNCL_AMT
+		, Z.PG_GB
+		, Z.PAY_MEANS
+		, Z.PAY_MEANS_NM
+		, Z.WD_GB
+		, Z.CHGER_NM
+		, Z.CHGER_PHNNO
+		, Z.CHGER_BASE_ADDR
+		, Z.CHGER_DTL_ADDR
+		, Z.CHGER_RTN_MEMO
+		, Z.WD_INVOICE_NO
+		, Z.SHIP_COMP_CD
+		, Z.SHIP_COMP_NM
+		FROM (SELECT OC.ORD_CHG_SQ
+		, OC.CHG_GB
+		, OCD.CHG_QTY
+		, DATE_FORMAT(O.ORD_DT, '%Y.%m.%d')                                AS ORD_DT
+		, DATE_FORMAT(OCDH.REG_DT, '%Y.%m.%d')                             AS CHG_DATE
+		, DATE_FORMAT(OCDH.REG_DT,'%H:%i:%S')                              AS CHG_TIME
+		, DATE_FORMAT(OCD.REG_DT, '%Y.%m.%d')                              AS CHG_DT
+		, DATE_FORMAT(OCD.COMPLETE_DT, '%Y.%m.%d')                         AS COMPLETE_DT
+		, OCD.CHG_STAT
+		, FN_GET_CODE_NM('G685', OCD.CHG_STAT)                             AS CHG_STAT_NM
+		, OD.ORD_NO
+		, OD.ORD_AMT
+		, OD.ORD_QTY
+		, OD.CNCL_RTN_QTY
+		, OD.CNCL_RTN_AMT
+		, OD.CPN1_DC_AMT
+		, OD.REAL_ORD_AMT
+		, OD.PNT_DC_AMT
+		, OD.GFCD_USE_AMT
+		, OCD.ORD_DTL_NO
+		, G1.GOODS_CD
+		, CASE BG.DISP_NM_LANG WHEN 'EN' THEN BG.BRAND_GROUP_ENM
+		ELSE BG.BRAND_GROUP_KNM
+		END                                                             AS BRAND_NM
+		, OD.SHOT_DELV_YN
+		, G1.SELF_GOODS_YN
+		, G1.GOODS_NM
+		, IFNULL((SELECT COLOR_KNM FROM TB_COLOR WHERE COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G1.MAIN_COLOR_CD ) AND USE_YN  = 'Y'), ODI.OPT_CD1) AS COLOR_NM
+		, G2.GOODS_NM                                                      AS ITEM_NM
+		, G1.GOODS_TYPE
+		, ODI.ORD_DTL_ITEM_SQ
+		, ODI.OPT_CD1
+		, ODI.OPT_CD2
+		, ((OD.ORD_AMT - OD.CNCL_RTN_AMT - OD.CPN1_DC_AMT) * (OCD.CHG_QTY / (OD.ORD_QTY - OD.CNCL_RTN_QTY))) AS PRICE_ORG
+		, ((OD.REAL_ORD_AMT + OD.PNT_DC_AMT + OD.GFCD_USE_AMT) * (OCD.CHG_QTY / (OD.ORD_QTY - OD.CNCL_RTN_QTY))) AS PRICE_SALE
+		, OC.ADD_PAY_COST
+		, CASE WHEN G1.GOODS_TYPE != 'G056_S' AND G1.SELF_GOODS_YN = 'Y' THEN (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G1.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y')
+		ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G1.GOODS_CD AND COLOR_CD = IFNULL(G1.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') END AS SYS_IMG_NM
+		, OD.GIFT_PACK_YN
+		, R.REFUND_AMT
+		, R.RF_CPN1_AMT
+		, R.RF_TMTB1_AMT
+		, R.RF_TMTB2_AMT
+		, R.RF_GOODS_CPN_AMT
+		, R.RF_CART_CPN_AMT
+		, R.RF_DELV_CPN_AMT
+		, R.RF_PNT_AMT
+		, R.RF_PRE_PNT_AMT
+		, R.RF_GFCD_USE_AMT
+		, R.RF_CNCL_AMT
+		, R.RF_DELIVERY_FEE
+		, R.RF_REAL_CNCL_AMT
+		, P.PG_GB
+		, P.PAY_MEANS
+		, FN_GET_CODE_NM('G014', P.PAY_MEANS)                              AS PAY_MEANS_NM
+		, OC.WD_GB
+		, OC.CHGER_NM
+		, OC.CHGER_PHNNO
+		, OC.CHGER_BASE_ADDR
+		, OC.CHGER_DTL_ADDR
+		, OC.CHGER_RTN_MEMO
+		, OC.WD_INVOICE_NO
+		, OC.SHIP_COMP_CD
+		, (SELECT SHIP_COMP_NM
+		FROM TB_SHIP_COMPANY SC
+		WHERE SC.SHIP_COMP_CD = OC.SHIP_COMP_CD)                       AS SHIP_COMP_NM
+		FROM TB_ORDER_CHANGE OC
+		INNER JOIN TB_ORDER_CHANGE_DETAIL OCD
+		ON OC.ORD_CHG_SQ = OCD.ORD_CHG_SQ
+		INNER JOIN TB_ORDER_CHANGE_DETAIL_HST OCDH
+		ON OCD.ORD_CHG_SQ = OCDH.ORD_CHG_SQ
+		AND OCD.ORD_DTL_NO = OCDH.ORD_DTL_NO
+		AND OCD.CHG_STAT = OCDH.CHG_STAT
+		INNER JOIN TB_ORDER_DETAIL OD
+		ON OCD.ORD_DTL_NO = OD.ORD_DTL_NO
+		AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		INNER JOIN TB_ORDER O
+		ON OD.ORD_NO = O.ORD_NO
+		INNER JOIN TB_ORDER_DETAIL_ITEM ODI
+		ON OD.ORD_NO = ODI.ORD_NO
+		AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		INNER JOIN TB_GOODS G1
+		ON OD.GOODS_CD = G1.GOODS_CD
+		INNER JOIN TB_GOODS G2
+		ON ODI.ITEM_CD = G2.GOODS_CD
+		INNER JOIN TB_BRAND B
+		ON G1.BRAND_CD = B.BRAND_CD
+		AND B.USE_YN = 'Y'
+		INNER JOIN TB_BRAND_GROUP BG
+		ON B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+		AND BG.USE_YN = 'Y'
+		LEFT OUTER JOIN TB_REFUND R
+		ON R.ORD_CHG_SQ = OC.ORD_CHG_SQ
+		INNER JOIN TB_PAYMENT P
+		ON P.ORD_NO = O.ORD_NO
+		AND P.PAY_GB = 'O'
+		AND P.PAY_STAT = 'G016_30'
+		WHERE O.DISP_YN = 'Y'
+		<choose>
+			<when test="custNo > 0">
+				AND O.CUST_NO = #{custNo}
+			</when>
+			<otherwise>
+				AND O.ORD_NO = #{ordNo}
+				AND O.ORD_NM = #{ordNm}
+				AND O.ORD_PHNNO = #{ordPhnno}
+			</otherwise>
+		</choose>
+		<if test="ordChgSq != null and ordChgSq != ''">
+			AND OC.ORD_CHG_SQ = #{ordChgSq}
+		</if>
+		) Z
+		GROUP BY Z.ORD_CHG_SQ, Z.CHG_GB, Z.CHG_QTY, Z.ORD_DT, Z.CHG_DATE, Z.CHG_TIME, Z.CHG_DT, Z.COMPLETE_DT, Z.CHG_STAT
+		, Z.CHG_STAT_NM, Z.ORD_NO, Z.ORD_AMT, Z.ORD_QTY, Z.CNCL_RTN_QTY, Z.CNCL_RTN_AMT, Z.CPN1_DC_AMT, Z.REAL_ORD_AMT, Z.PNT_DC_AMT
+		, Z.GFCD_USE_AMT, Z.ORD_DTL_NO, Z.GOODS_CD, Z.BRAND_NM, Z.SHOT_DELV_YN, Z.SELF_GOODS_YN, Z.GOODS_NM
+		, Z.GOODS_TYPE, Z.PRICE_ORG, Z.PRICE_SALE, Z.ADD_PAY_COST, Z.SYS_IMG_NM, Z.GIFT_PACK_YN, Z.REFUND_AMT, Z.RF_CPN1_AMT, Z.RF_TMTB1_AMT
+		, Z.RF_TMTB2_AMT, Z.RF_GOODS_CPN_AMT, Z.RF_CART_CPN_AMT, Z.RF_DELV_CPN_AMT, Z.RF_PNT_AMT, Z.RF_PRE_PNT_AMT, Z.RF_GFCD_USE_AMT, Z.RF_CNCL_AMT
+		, Z.RF_DELIVERY_FEE, Z.RF_REAL_CNCL_AMT, Z.PG_GB, Z.PAY_MEANS, Z.PAY_MEANS_NM, Z.WD_GB, Z.CHGER_NM, Z.CHGER_PHNNO, Z.CHGER_BASE_ADDR
+		, Z.CHGER_DTL_ADDR, Z.CHGER_RTN_MEMO, Z.WD_INVOICE_NO, Z.SHIP_COMP_CD, Z.SHIP_COMP_NM
+		ORDER BY Z.ORD_CHG_SQ DESC
+	</select>
+
+	<!-- 마이페이지 교환 상세 정보 조회 -->
+	<select id="getCreExchangeDetailInfo" parameterType="OrderChange" resultType="OrderChange">
+		/* TsfOrderChange.getCreExchangeDetailInfo */
+		SELECT GROUP_CONCAT(Z.ITEM_NM ORDER BY Z.ORD_DTL_ITEM_SQ SEPARATOR '!@!')       AS ITEM_NM
+		, GROUP_CONCAT(Z.COLOR_NM ORDER BY Z.ORD_DTL_ITEM_SQ)                      AS COLOR_NM
+		, GROUP_CONCAT(Z.OPT_CD1 ORDER BY Z.ORD_DTL_ITEM_SQ)                       AS OPT_CD1
+		, GROUP_CONCAT(Z.OPT_CD2 ORDER BY Z.ORD_DTL_ITEM_SQ)                       AS OPT_CD2
+		, Z.ORD_CHG_SQ
+		, Z.CHG_GB
+		, Z.CHG_QTY
+		, Z.ORD_DT
+		, Z.CHG_DATE
+		, Z.CHG_TIME
+		, Z.CHG_DT
+		, Z.COMPLETE_DT
+		, Z.CHG_STAT
+		, Z.CHG_STAT_NM
+		, Z.ORD_DTL_STAT
+		, Z.EXCHANGE_SHIP_COMP_CD
+		, Z.EXCHANGE_INVOICE_NO
+		, Z.ORD_NO
+		, Z.ORD_AMT
+		, Z.ORD_QTY
+		, Z.CNCL_RTN_QTY
+		, Z.CNCL_RTN_AMT
+		, Z.CPN1_DC_AMT
+		, Z.REAL_ORD_AMT
+		, Z.PNT_DC_AMT
+		, Z.GFCD_USE_AMT
+		, Z.ORD_DTL_NO
+		, Z.GOODS_CD
+		, Z.BRAND_NM
+		, Z.SHOT_DELV_YN
+		, Z.SELF_GOODS_YN
+		, Z.GOODS_NM
+		, Z.GOODS_TYPE
+		, Z.PRICE_ORG
+		, Z.PRICE_SALE
+		, Z.ADD_PAY_COST
+		, Z.SYS_IMG_NM
+		, Z.GIFT_PACK_YN
+		, Z.WD_GB
+		, Z.CHGER_NM
+		, Z.CHGER_PHNNO
+		, Z.CHGER_BASE_ADDR
+		, Z.CHGER_DTL_ADDR
+		, Z.CHGER_RTN_MEMO
+		, Z.CHG_MEMO
+		, Z.WD_INVOICE_NO
+		, Z.SHIP_COMP_CD
+		, Z.SHIP_COMP_NM
+		, Z.DELV_ADDR_SQ
+		, Z.RECIP_NM
+		, Z.RECIP_PHNNO
+		, Z.RECIP_BASE_ADDR
+		, Z.RECIP_DTL_ADDR
+		, Z.DELV_MEMO
+		, Z.PG_TID
+		, Z.PAY_MEANS
+		, Z.PAY_MEANS_NM
+		, Z.CARD_NM
+		, Z.CARD_MIPS
+		, Z.CHG_ORD_DTL_STAT
+		FROM (SELECT OC.ORD_CHG_SQ
+		, OC.CHG_GB
+		, OCD.CHG_QTY
+		, DATE_FORMAT(O.ORD_DT, '%Y.%m.%d')                                AS ORD_DT
+		, DATE_FORMAT(OCDH.REG_DT, '%Y.%m.%d')                             AS CHG_DATE
+		, DATE_FORMAT(OCDH.REG_DT,'%H:%i:%S')                              AS CHG_TIME
+		, DATE_FORMAT(OCD.REG_DT, '%Y.%m.%d')                              AS CHG_DT
+		, DATE_FORMAT(OCD.COMPLETE_DT, '%Y.%m.%d')                         AS COMPLETE_DT
+		, OCD.CHG_STAT
+		, FN_GET_CODE_NM('G685', OCD.CHG_STAT)                             AS CHG_STAT_NM
+		, OD2.ORD_DTL_STAT                                                 AS ORD_DTL_STAT
+		, OD2.INVOICE_NO                                                   AS EXCHANGE_INVOICE_NO
+		, OD2.SHIP_COMP_CD                                                 AS EXCHANGE_SHIP_COMP_CD
+		, OD.ORD_NO
+		, OD.ORD_AMT
+		, OD.ORD_QTY
+		, OD.CNCL_RTN_QTY
+		, OD.CNCL_RTN_AMT
+		, OD.CPN1_DC_AMT
+		, OD.REAL_ORD_AMT
+		, OD.PNT_DC_AMT
+		, OD.GFCD_USE_AMT
+		, OCD.ORD_DTL_NO
+		, G1.GOODS_CD
+		, CASE BG.DISP_NM_LANG WHEN 'EN' THEN BG.BRAND_GROUP_ENM
+		ELSE BG.BRAND_GROUP_KNM
+		END                                                             AS BRAND_NM
+		, OD.SHOT_DELV_YN
+		, G1.SELF_GOODS_YN
+		, G1.GOODS_NM
+		, IFNULL((SELECT COLOR_KNM FROM TB_COLOR WHERE COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G1.MAIN_COLOR_CD ) AND USE_YN  = 'Y'), ODI.OPT_CD1) AS COLOR_NM
+		, G2.GOODS_NM                                                      AS ITEM_NM
+		, G1.GOODS_TYPE
+		, ODI.ORD_DTL_ITEM_SQ
+		, ODI.OPT_CD1
+		, ODI.OPT_CD2
+		, ((OD.ORD_AMT - OD.CNCL_RTN_AMT - OD.CPN1_DC_AMT) * (OCD.CHG_QTY / (OD.ORD_QTY - OD.CNCL_RTN_QTY))) AS PRICE_ORG
+		, ((OD.REAL_ORD_AMT + OD.PNT_DC_AMT + OD.GFCD_USE_AMT) * (OCD.CHG_QTY / (OD.ORD_QTY - OD.CNCL_RTN_QTY))) AS PRICE_SALE
+		, OC.ADD_PAY_COST
+		, CASE WHEN G1.GOODS_TYPE != 'G056_S' AND G1.SELF_GOODS_YN = 'Y' THEN (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G1.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y')
+		ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G1.GOODS_CD AND COLOR_CD = IFNULL(G1.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') END AS SYS_IMG_NM
+		, OD.GIFT_PACK_YN
+		, OC.WD_GB
+		, OC.CHGER_NM
+		, OC.CHGER_PHNNO
+		, OC.CHGER_BASE_ADDR
+		, OC.CHGER_DTL_ADDR
+		, OC.CHGER_RTN_MEMO
+		, OC.CHG_MEMO
+		, OC.WD_INVOICE_NO
+		, OC.SHIP_COMP_CD
+		, (SELECT SHIP_COMP_NM
+		FROM TB_SHIP_COMPANY SC
+		WHERE SC.SHIP_COMP_CD = OC.SHIP_COMP_CD)                       AS SHIP_COMP_NM
+		, DA.DELV_ADDR_SQ
+		, DA.RECIP_NM
+		, DA.RECIP_PHNNO
+		, DA.RECIP_BASE_ADDR
+		, DA.RECIP_DTL_ADDR
+		, DA.DELV_MEMO
+		, P.PG_TID
+		, P.PAY_MEANS
+		, FN_GET_CODE_NM('G014', P.PAY_MEANS)                              AS PAY_MEANS_NM
+		, P.CARD_NM
+		, IF(P.CARD_MIPS = 0, '일시불', CONCAT(P.CARD_MIPS, '개월'))          AS CARD_MIPS
+		, OD2.ORD_DTL_STAT                                                 AS CHG_ORD_DTL_STAT
+		FROM TB_ORDER_CHANGE OC
+		INNER JOIN TB_ORDER_CHANGE_DETAIL OCD
+		ON OC.ORD_CHG_SQ = OCD.ORD_CHG_SQ
+		INNER JOIN TB_ORDER_CHANGE_DETAIL_HST OCDH
+		ON OCD.ORD_CHG_SQ = OCDH.ORD_CHG_SQ
+		AND OCD.ORD_DTL_NO = OCDH.ORD_DTL_NO
+		AND OCD.CHG_STAT = OCDH.CHG_STAT
+		INNER JOIN TB_ORDER_DETAIL OD
+		ON OCD.ORD_DTL_NO = OD.ORD_DTL_NO
+		AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		INNER JOIN TB_ORDER_DETAIL OD2
+		ON OCD.CHG_ORD_DTL_NO = OD2.ORD_DTL_NO
+		AND OD2.ORD_EXCH_GB = 'E'
+		LEFT OUTER JOIN TB_DELIVERY_ADDR DA
+		ON OD2.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
+		INNER JOIN TB_ORDER O
+		ON OD.ORD_NO = O.ORD_NO
+		INNER JOIN TB_ORDER_DETAIL_ITEM ODI
+		ON OD.ORD_NO = ODI.ORD_NO
+		AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		INNER JOIN TB_GOODS G1
+		ON OD.GOODS_CD = G1.GOODS_CD
+		INNER JOIN TB_GOODS G2
+		ON ODI.ITEM_CD = G2.GOODS_CD
+		INNER JOIN TB_BRAND B
+		ON G1.BRAND_CD = B.BRAND_CD
+		AND B.USE_YN = 'Y'
+		INNER JOIN TB_BRAND_GROUP BG
+		ON B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+		AND BG.USE_YN = 'Y'
+		LEFT OUTER JOIN TB_PAYMENT P
+		ON P.ORD_CHG_SQ = OC.ORD_CHG_SQ
+		AND P.PAY_GB = 'D'
+		AND P.PAY_STAT = 'G016_30'
+		WHERE O.DISP_YN = 'Y'
+		<choose>
+			<when test="custNo > 0">
+				AND O.CUST_NO = #{custNo}
+			</when>
+			<otherwise>
+				AND O.ORD_NO = #{ordNo}
+				AND O.ORD_NM = #{ordNm}
+				AND O.ORD_PHNNO = #{ordPhnno}
+			</otherwise>
+		</choose>
+		<if test="ordChgSq != null and ordChgSq != ''">
+			AND OC.ORD_CHG_SQ = #{ordChgSq}
+		</if>
+		) Z
+		GROUP BY Z.ORD_CHG_SQ, Z.CHG_GB, Z.CHG_QTY, Z.ORD_DT, Z.CHG_DATE, Z.CHG_TIME, Z.CHG_DT, Z.COMPLETE_DT, Z.CHG_STAT
+		, Z.CHG_STAT_NM, Z.ORD_DTL_STAT, Z.EXCHANGE_SHIP_COMP_CD, Z.EXCHANGE_INVOICE_NO, Z.ORD_NO, Z.ORD_AMT, Z.ORD_QTY, Z.CNCL_RTN_QTY, Z.CNCL_RTN_AMT
+		, Z.CPN1_DC_AMT, Z.REAL_ORD_AMT, Z.PNT_DC_AMT, Z.GFCD_USE_AMT, Z.ORD_DTL_NO, Z.GOODS_CD, Z.BRAND_NM, Z.SHOT_DELV_YN, Z.SELF_GOODS_YN, Z.GOODS_NM
+		, Z.GOODS_TYPE, Z.PRICE_ORG, Z.PRICE_SALE, Z.ADD_PAY_COST, Z.SYS_IMG_NM, Z.GIFT_PACK_YN, Z.WD_GB, Z.CHGER_NM, Z.CHGER_PHNNO, Z.CHGER_BASE_ADDR
+		, Z.CHGER_DTL_ADDR, Z.CHGER_RTN_MEMO, Z.CHG_MEMO, Z.WD_INVOICE_NO, Z.SHIP_COMP_CD, Z.SHIP_COMP_NM, Z.DELV_ADDR_SQ, Z.RECIP_NM, Z.RECIP_PHNNO
+		, Z.RECIP_BASE_ADDR, Z.RECIP_DTL_ADDR, Z.DELV_MEMO, Z.PG_TID, Z.PAY_MEANS, Z.PAY_MEANS_NM, Z.CARD_NM, Z.CARD_MIPS, Z.CHG_ORD_DTL_STAT
+		ORDER BY Z.ORD_CHG_SQ DESC
+	</select>
+
+	<!-- 마이페이지 교환 상품 옵션 정보 조회 -->
+	<select id="getExchangeGoodsOptionInfoList" parameterType="OrderChange" resultType="OrderChange">
+		/* TscOrderChange.getExchangeGoodsOptionInfoList */
+		SELECT Z.ORD_CHG_SQ
+			 , Z.CHG_GB
+			 , Z.ORD_DTL_NO
+			 , Z.ORG_ORD_DTL_NO
+			 , Z.ORD_DTL_STAT
+			 , Z.SHIP_COMP_CD
+			 , Z.INVOICE_NO
+			 , GROUP_CONCAT(Z.ITEM_NM ORDER BY Z.ORD_DTL_ITEM_SQ SEPARATOR '!@!')       AS ITEM_NM
+			 , GROUP_CONCAT(Z.COLOR_NM ORDER BY Z.ORD_DTL_ITEM_SQ)                      AS COLOR_NM
+			 , GROUP_CONCAT(Z.OPT_CD1 ORDER BY Z.ORD_DTL_ITEM_SQ)                       AS OPT_CD1
+			 , GROUP_CONCAT(Z.OPT_CD2 ORDER BY Z.ORD_DTL_ITEM_SQ)                       AS OPT_CD2
+		  FROM (SELECT OC.ORD_CHG_SQ
+					 , OC.CHG_GB
+					 , OD.ORD_DTL_NO
+					 , OD.ORG_ORD_DTL_NO
+					 , OD.ORD_DTL_STAT
+					 , OD.SHIP_COMP_CD
+					 , OD.INVOICE_NO
+					 , IFNULL((SELECT COLOR_KNM FROM TB_COLOR WHERE COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G1.MAIN_COLOR_CD ) AND USE_YN  = 'Y'), ODI.OPT_CD1) AS COLOR_NM
+					 , G2.GOODS_NM                      AS ITEM_NM
+					 , ODI.OPT_CD1
+					 , ODI.OPT_CD2
+					 , ODI.ORD_DTL_ITEM_SQ
+				  FROM TB_ORDER_CHANGE OC
+				  INNER JOIN TB_ORDER_CHANGE_DETAIL OCD
+				  ON OC.ORD_CHG_SQ = OCD.ORD_CHG_SQ
+				  INNER JOIN TB_ORDER_DETAIL OD
+				  ON OCD.CHG_ORD_DTL_NO = OD.ORD_DTL_NO
+				  INNER JOIN TB_ORDER_DETAIL_ITEM ODI
+				  ON OD.ORD_NO = ODI.ORD_NO
+					  AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+				  INNER JOIN TB_GOODS G1
+				  ON OD.GOODS_CD = G1.GOODS_CD
+				  INNER JOIN TB_GOODS G2
+				  ON ODI.ITEM_CD = G2.GOODS_CD
+				 WHERE OC.ORD_CHG_SQ = #{ordChgSq}
+				   AND OCD.ORD_DTL_NO = #{ordDtlNo}
+		  ) Z
+		 GROUP BY Z.ORD_CHG_SQ, Z.CHG_GB, Z.ORD_DTL_NO, Z.ORG_ORD_DTL_NO, Z.ORD_DTL_STAT, Z.SHIP_COMP_CD, Z.INVOICE_NO
+	</select>
+	
+	<!-- 전체취소 배송비 취소 처리 -->
+	<insert id="createDeliveryFeeForAllCancel" parameterType="OrderChange">
+		/* TscOrderChange.createDeliveryFeeForAllCancel */
+		INSERT INTO TB_DELIVERY_FEE (
+		       PAY_SQ
+		     , ORD_NO
+		     , DELV_FEE_GB
+		     , DELV_FEE_CD
+		     , DELV_FEE
+		     , DELV_CPN_SQ
+		     , DELV_CPN_DC_AMT
+		     , REAL_DELV_AMT
+		     , ORD_CHG_SQ
+		     , SUPPLY_COMP_CD
+		     , DELV_USAC_YN
+		     , DELV_USAC_DT
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT PAY_SQ
+		     , ORD_NO
+		     , DELV_FEE_GB
+		     , DELV_FEE_CD
+		     , DELV_FEE
+		     , DELV_CPN_SQ
+		     , DELV_CPN_DC_AMT
+		     , REAL_DELV_AMT
+		     , #{ordChgSq}
+		     , SUPPLY_COMP_CD
+		     , DELV_USAC_YN
+		     , DELV_USAC_DT
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		  FROM TB_DELIVERY_FEE
+		 WHERE ORD_NO = #{ordNo}
+	</insert>
+
+	<!-- 취소 사은품 조회 -->
+	<select id="getCancelFreeGiftList" parameterType="OrderChange" resultType="Freegift">
+		/* TsfOrder.getCancelFreeGiftList */
+		SELECT FG.GOODS_NM
+		     , OFV.USE_POINT
+		  FROM TB_ORD_FREEGIFT OFG
+		 INNER JOIN TB_ORD_FREEGIFT_VAL OFV
+		    ON OFG.ORD_FREEGIFT_SQ = OFV.ORD_FREEGIFT_SQ
+		 INNER JOIN TB_FREE_GOODS FG
+		    ON OFV.PRODUCT_NO = FG.PRODUCT_NO
+		   AND OFV.PRODUCT_CODE = FG.PRODUCT_CODE
+		 WHERE OFG.ORD_NO = #{ordNo}
+		   AND OFG.DEL_YN = 'Y'
+	</select>
 </mapper>