Ver Fonte

Merge branch 'develop' of http://112.172.147.34:4936/style24/style24.core.git into develop

gagamel há 5 anos atrás
pai
commit
f10c13c8f7

+ 54 - 4
src/main/java/com/style24/core/biz/dao/TscOrderChangeDao.java

@@ -330,22 +330,42 @@ public interface TscOrderChangeDao {
 	/**
 	 * 전체취소 주문상세단품정보 수정
 	 *
-	 * @param Order
+	 * @param OrderChange
 	 * @return int
 	 * @author card007
 	 * @since 2021. 04. 15
 	 */
-	int updateOrderDetailItemForAllCancel(Order order);
+	int updateOrderDetailItemForAllCancel(OrderChange orderChange);
 
 	/**
 	 * 전체취소 주문상세단품이력정보 등록
 	 *
-	 * @param Order
+	 * @param OrderChange
 	 * @return int
 	 * @author card007
 	 * @since 2021. 04. 15
 	 */
-	int createOrderDetailItemHstForAllCancel(Order order);
+	int createOrderDetailItemHstForAllCancel(OrderChange orderChange);
+
+	/**
+	 * 전체취소 주문상세단품정보 수정
+	 *
+	 * @param OrderChange
+	 * @return int
+	 * @author card007
+	 * @since 2021. 04. 16
+	 */
+	int updateOrderDetailForAllCancel(OrderChange orderChange);
+
+	/**
+	 * 전체취소 주문상세단품이력정보 등록
+	 *
+	 * @param OrderChange
+	 * @return int
+	 * @author card007
+	 * @since 2021. 04. 16
+	 */
+	int createOrderDetailHstForAllCancel(OrderChange orderChange);
 
 	/**
 	 * 마이페이지 포인트 원복 사용포인트 조회
@@ -446,4 +466,34 @@ public interface TscOrderChangeDao {
 	 * @since 2021. 04. 15
 	 */
 	Payment getPaymentInfo(Payment payment);
+
+	/**
+	 * 마이페이지 전체취소 주문변경상세 등록
+	 * 
+	 * @param OrderChange
+	 * @return int
+	 * @author card007
+	 * @since 2021. 04. 16
+	 */
+	int createOrderChangeDetailForAllCancel(OrderChange orderChange);
+
+	/**
+	 * 마이페이지 전체취소 주문변경상세 이력 등록
+	 * 
+	 * @param OrderChange
+	 * @return int
+	 * @author card007
+	 * @since 2021. 04. 16
+	 */
+	int createOrderChangeDetailHstForAllCancel(OrderChange orderChange);
+
+	/**
+	 * 마이페이지 전체취소 환불정보 조회
+	 *
+	 * @param Order
+	 * @return Order
+	 * @author card007
+	 * @since 2021. 04. 16
+	 */
+	Order getRefundInfoForAllCancel(Order order);
 }

+ 18 - 0
src/main/java/com/style24/core/biz/dao/TscOrderDao.java

@@ -789,4 +789,22 @@ public interface TscOrderDao {
 	 */
 	int updateOrderDetailGiftAddrInpYn(Order order);
 	
+	/**
+	 * 추가결제 취소,반품,교환 대상 상품목록 조회
+	 * @param Order
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 04. 16
+	 */
+	Collection<Order> getAddPayGoodsList(Order order);
+	
+	/**
+	 * 추가결제 반품,교환 상태값 업데이트
+	 * @param Order
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 04. 15
+	 */
+	int updateOrderChangeDetailChgStat(Order order);
+	
 }

+ 2 - 3
src/main/java/com/style24/core/biz/service/TscKakaoPayService.java

@@ -220,11 +220,10 @@ public class TscKakaoPayService {
 			payment.setOrdNo(Integer.parseInt(kakaoPay.getPartner_order_id()));
 			payment.setCustNo(Integer.parseInt(kakaoPay.getPartner_user_id()));
 			payment.setKakaoMethodType(kakaoPay.getPayment_method_type());
-			payment.setPayAmt(kakaoPay.getApproved_cancel_amount().getTotal());
-			payment.setNpayPntAmt(kakaoPay.getApproved_cancel_amount().getPoint());
+			payment.setPayAmt(kakaoPay.getApproved_cancel_amount().getTotal() * -1);
+			payment.setNpayPntAmt(kakaoPay.getApproved_cancel_amount().getPoint() * -1);
 			payment.setResCd(String.valueOf(statusCode));
 			payment.setResMsg(message.getMessage("SUCC_0004"));
-			// 
 
 			orderDao.insertPayment(payment);
 		} else {

+ 64 - 42
src/main/java/com/style24/core/biz/service/TscKcpService.java

@@ -213,44 +213,45 @@ public class TscKcpService {
 	}
 
 	/**
-	 * KCP 결제 처리 후 로직 진행 중 에러 발생으로 인한 취소처리 (TB_PAYMENT에 insert되는 모든 데이터 필요)
-	 * @param param
-	 * @param request
-	 */
-	public void kcpPayRollBack(Payment param) {
-		param.setPayStat(TscConstants.PaymentStat.DB_FAIL.value());
-		param.setPayGb("E");
-		param.setModType("STSC");
-		param.setModDesc("가맹점 결과 처리 오류 - 가맹점에서 취소 요청");
-		kcpCancel(param);
-	}
-
-	/**
-	 * KCP 전체 취소 (pgTid, regNo, updNo 필수)
-	 * @param param
-	 * @param request
-	 */
-	public void kcpPayCancelAll(Payment param) {
-		param.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
-		param.setPayGb("O");
-		param.setModType("STSC");
-		param.setModDesc("가맹점 취소 - 전체 취소");
-		kcpCancel(param);
-	}
-
-	/**
-	 * KCP 부분 취소 (pgTid, regNo, updNo, leftAmt:취소 전 잔여금액, partCancelAmt:부분취소금액 필수)
+	 * KCP 취소 (pgTid, regNo, updNo)
+	 * ** 주문 로직 진행 중 에러로 인한 취소
+	 * result.setIpAddress(request.getRemoteAddr());
+	 * result.setPayStat(TscConstants.PaymentStat.DB_FAIL.value());
+	 * result.setPayGb("E");	// O:주문시결제, D:배송시결제, E:에러(강제 결제 태울 때 또는 에러일 때)
+	 * result.setModType("STSC");
+	 * result.setModDesc("가맹점 결과 처리 오류 - 가맹점에서 취소 요청");
+	 *
+	 * ** 전체취소 필요 정보
+	 * result.setIpAddress(request.getRemoteAddr());
+	 * param.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+	 * param.setPayGb("O");				// O:주문시결제, D:배송시결제, E:에러(강제 결제 태울 때 또는 에러일 때)
+	 * param.setModType("STSC");		// 전체취소
+	 * param.setModDesc("가맹점 취소 - 전체 취소");
+	 *
+	 * ** 부분취소 필요 정보
+	 * result.setIpAddress(request.getRemoteAddr());
+	 * param.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+	 * param.setPayGb("O");				// O:주문시결제, D:배송시결제, E:에러(강제 결제 태울 때 또는 에러일 때)
+	 * param.setModType("STPC");
+	 * param.setModDesc("가맹점 취소 - 부분 취소");
+	 * param.setLeftAmt(100000);		// 취소 전 잔여금액
+	 * param.setPartCancelAmt(30000);	// 부분취소금액
+	 *
+	 * ** 무통장입금 입금 후 전체 취소 (전체취소 필요 정보에서 아래 정보 추가)
+	 * param.setModType("STHD");			// 전체환불
+	 * param.setBankCd("88");				// 계좌은행(공통코드G940). 결제수단이 "20:무통장입금일" 때 사용
+	 * param.setAccountNm("테스터");		// 환불계좌 예금주명
+	 * param.setAccountNo("110111111111")	// 환불계좌번호
+	 *
+	 * ** 무통장입금 입금 전 부분 취소 (부분취소 필요 정보에서 아래 정보 추가)
+	 * param.setModType("STPD");			// 부분환불
+	 * param.setBankCd("88");				// 계좌은행(공통코드G940). 결제수단이 "20:무통장입금일" 때 사용
+	 * param.setAccountNm("테스터");		// 환불계좌 예금주명
+	 * param.setAccountNo("110111111111")	// 환불계좌번호
+	 *
 	 * @param param
 	 * @param request
 	 */
-	public void kcpPayCancelPart(Payment param) {
-		param.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
-		param.setPayGb("O");
-		param.setModType("STPC");
-		param.setModDesc("가맹점 취소 - 부분 취소");
-		kcpCancel(param);
-	}
-
 	@Transactional("shopTxnManager")
 	public void kcpCancel(Payment param) {
 		// try {	request.setCharacterEncoding("euc-kr");	} catch(Exception e) {e.printStackTrace();}
@@ -269,31 +270,48 @@ public class TscKcpService {
 
 		if("STPC".equals(param.getModType())) {
 			c_PayPlus.mf_set_us( mod_data_set_no, "mod_mny", param.getPartCancelAmt() + "");	// 취소요청금액
-			c_PayPlus.mf_set_us( mod_data_set_no, "rem_mny", param.getLeftAmt() + "");			// 취소가능잔액
+			c_PayPlus.mf_set_us( mod_data_set_no, "rem_mny", param.getLeftAmt() + "");		// 취소가능잔액
+		} else if("STHD".equals(param.getModType())) {
+			c_PayPlus.mf_set_us( mod_data_set_no, "mod_sub_type", "MDSC00");					// 변경 유형
+			c_PayPlus.mf_set_us( mod_data_set_no, "mod_comp_type", "MDCP01");				// 변경 유형
+			c_PayPlus.mf_set_us( mod_data_set_no, "mod_bankcode", "BK" + param.getBankCd());	// 환불 요청 은행 코드
+			c_PayPlus.mf_set_us( mod_data_set_no, "mod_account", param.getAccountNo());			// 환불 요청 계좌
+			c_PayPlus.mf_set_us( mod_data_set_no, "mod_depositor", param.getAccountNm());		// 환불 요청 계좌주명
+		} else if("STPD".equals(param.getModType())) {
+			c_PayPlus.mf_set_us( mod_data_set_no, "mod_sub_type", "MDSC03");					// 변경 유형
+			c_PayPlus.mf_set_us( mod_data_set_no, "mod_comp_type", "MDCP01");				// 변경 유형
+			c_PayPlus.mf_set_us( mod_data_set_no, "mod_mny", param.getPartCancelAmt() + "");	// 취소요청금액
+			c_PayPlus.mf_set_us( mod_data_set_no, "rem_mny", param.getLeftAmt() + "");		// 취소가능잔액
+			c_PayPlus.mf_set_us( mod_data_set_no, "mod_bankcode", "BK" + param.getBankCd());	// 환불 요청 은행 코드
+			c_PayPlus.mf_set_us( mod_data_set_no, "mod_account", param.getAccountNo());			// 환불 요청 계좌
+			c_PayPlus.mf_set_us( mod_data_set_no, "mod_depositor", param.getAccountNm());		// 환불 요청 계좌주명
+		}
+
+		String custIp = "";
+		if("STHD".equals(param.getModType()) || "STPD".equals(param.getModType())) {
+			custIp = f_get_parm(param.getIpAddress());
 		}
 
 		param.setTranCd("00200000");
-		c_PayPlus.mf_do_tx(env.getProperty("pg.kcp.site.cd"), env.getProperty("pg.kcp.site.key"), param.getTranCd(), "", "", env.getProperty("pg.kcp.log.level"), "0");
+		c_PayPlus.mf_do_tx(env.getProperty("pg.kcp.site.cd"), env.getProperty("pg.kcp.site.key"), param.getTranCd(), custIp, "", env.getProperty("pg.kcp.log.level"), "0");
 
 		if("0000".equals(c_PayPlus.m_res_cd)) {
 			try {
-				payment.setPgTid(c_PayPlus.mf_get_res("tno"));
-
 				// 주문 결제 정보 조회
-				payment = orderDao.getKcpOrderPaymentInfo(payment);
+				payment = orderDao.getKcpOrderPaymentInfo(param);
 
 				payment.setResCd(c_PayPlus.m_res_cd);			// 결과 코드
 				payment.setResMsg(c_PayPlus.m_res_msg);			// 결과 메시지
 				payment.setPgCpnAmt(c_PayPlus.mf_get_res("coupon_mny").isEmpty() ? 0 : Integer.parseInt(c_PayPlus.mf_get_res("coupon_mny")));
 
 				if ("STSC".equals(param.getModType())) {
-					payment.setPayAmt(-payment.getPayAmt());												// 전체 취소는 결제 금액 전체
+					payment.setPayAmt(-payment.getPayAmt());													// 전체 취소는 결제 금액 전체
 				} else {
 					payment.setPayAmt(-(Integer.parseInt(c_PayPlus.mf_get_res("panc_mod_mny"))));			// 부분 취소는 취소된 금액
 				}
 
 				if ("E".equals(param.getPayGb())) {			// 결제완료 로직 진행 중 에러 발생시
-					param.setPgTid(payment.getPgTid());
+					param.setPgTradeNo(c_PayPlus.mf_get_res("tno"));
 					param.setPayAmt(payment.getPayAmt());
 					orderDao.insertPayment(param);
 				} else {									// 일반 취소 작업
@@ -301,7 +319,11 @@ public class TscKcpService {
 					payment.setUpdNo(param.getUpdNo() == null ? 0 : param.getUpdNo());
 					payment.setPayGb(param.getPayGb());
 					payment.setPayStat(param.getPayStat());
+					payment.setOrdNo(param.getOrdNo());
+					payment.setPgTradeNo(c_PayPlus.mf_get_res("tno"));		// 환불 요청건의 KCP 거래번호
+
 					orderDao.insertPaymentCancel(payment);
+					param.setPaySq(payment.getPaySq());
 				}
 			} catch (Exception e) {
 				e.printStackTrace();

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

@@ -213,13 +213,13 @@ public class TscNaverPayService {
 
 		// 승인 성공일때 200
 		if (statusCode == 200) {
-			payment.setPgTradeNo(naverPay.getBody().getPayHistId());
+			payment.setNpayPntAmt(naverPay.getBody().getNpointCancelAmount() * -1);
 			payment.setPgTid(naverPay.getBody().getPaymentId());
-			payment.setOrdNo(payment.getOrdNo());
+			payment.setPgTradeNo(naverPay.getBody().getPayHistId());
 			payment.setCustNo(payment.getCustNo());
 			payment.setNaverMethodType(naverPay.getBody().getPrimaryPayMeans());
-			payment.setPayAmt(naverPay.getBody().getPrimaryPayCancelAmount() + naverPay.getBody().getNpointCancelAmount());
-			payment.setNpayPntAmt(naverPay.getBody().getNpointCancelAmount());
+			
+			
 			payment.setResCd(naverPay.getCode());
 			payment.setResMsg(naverPay.getMessage());
 

+ 1859 - 1249
src/main/java/com/style24/core/biz/service/TscOrderChangeService.java

@@ -22,7 +22,7 @@ import lombok.extern.slf4j.Slf4j;
 
 /**
  * 취소, 반품, 교환 Service
- * 
+ *
  * @author jsh77b
  * @since 2021. 01. 18
  */
@@ -44,7 +44,7 @@ public class TscOrderChangeService {
 
 	@Autowired
 	private TscNaverPayService naverPayService;
-	
+
 	/**
 	 * 주문변경정보 (상세번호배열, 취소수량배열) 취소 목록으로 변환 (사용안함)
 	 * @param Order
@@ -53,19 +53,19 @@ public class TscOrderChangeService {
 	 * @since 2020. 12. 16
 	 */
 	public List<Order> getCnclReqList(OrderChange cnclReq, String chgGbn) {
-		
+
 		// 1. 주문번호설정
 		Order order = new Order();
 		order.setOrdNo(cnclReq.getOrdNo());
-		
+
 		// 2. 취소가능 주문상세상태값 설정
 		if (chgGbn == null) {
 			chgGbn = "";
 		}
-		
+
 		// 2.1 신청구분으로 
 		String[] ordDtlStatArr;
-			
+
 		// 취소가능 주문상세 상태값 설정
 		if (TscConstants.OrderChangeStat.CANCEL.value().equals(chgGbn)) {
 			ordDtlStatArr = new String[4];
@@ -73,7 +73,7 @@ public class TscOrderChangeService {
 			ordDtlStatArr[1] = TscConstants.OrderDetailStat.PAYMENT_COMPLETE.value();
 			ordDtlStatArr[2] = TscConstants.OrderDetailStat.GOODS_PREPARE.value();
 			ordDtlStatArr[3] = TscConstants.OrderDetailStat.DELIVERY_PREPARE.value();
-		} 
+		}
 		// 반품, 교환가능 주문상세 상태값 설정
 		else {
 			ordDtlStatArr = new String[3];
@@ -81,26 +81,26 @@ public class TscOrderChangeService {
 			ordDtlStatArr[1] = TscConstants.OrderDetailStat.SHIP_COMPLETE.value();
 			ordDtlStatArr[2] = TscConstants.OrderDetailStat.DELIVERY_COMPLETE.value();
 		}
-		
+
 		order.setOrdDtlStatArr(ordDtlStatArr);
-		
+
 		// 3. 취소,교환,반품 가능 주문목록 조회 후 취소/교환/반품 신청수량을 셋팅
 		List<Order> cnclReqList = getCancelRequestTargetList(order);
 		int[] ordDtlNoArr 		= cnclReq.getOrdDtlNoArr();
 		int[] cnclRtnReqQtyArr 	= cnclReq.getCnclRtnReqQtyArr();
-		
+
 		for (int i=0 ; i<cnclReqList.size() ; i++) {
 			Order vo = cnclReqList.get(i);
-			
+
 			if (ordDtlNoArr[i] == vo.getOrdDtlNo()) {
 				vo.setOrdCanChgQty(cnclRtnReqQtyArr[i]);
 			}
 			cnclReqList.add(vo);
 		}
-		
+
 		return cnclReqList;
 	}
-	
+
 	/**
 	 * 주문변경 대상목록 조회 (취소, 반품, 교환)
 	 * @param Order
@@ -111,7 +111,7 @@ public class TscOrderChangeService {
 	public List<Order> getCancelRequestTargetList(Order order) {
 		return orderChangeDao.getCancelRequestTargetList(order);
 	}
-	
+
 	/**
 	 * 주문변경신청목록 조회 (취소, 반품, 교환)
 	 * @param Order
@@ -132,7 +132,7 @@ public class TscOrderChangeService {
 	 */
 	@Transactional("shopTxnManager")
 	public GagaMap cnclReqCancel(GagaMap mav, int userNo) {
-		
+
 		Order order = new Order();
 		order.setOrdNo(mav.getInt("ordNo"));
 		order.setOrdChgSq(mav.getInt("ordChgSq"));
@@ -140,112 +140,81 @@ public class TscOrderChangeService {
 		order.setRegNo(userNo);
 		order.setUpdNo(userNo);
 		order.setDelYn("Y");
-		
+
 		// 1. 주문변경정보 (TB_ORDER_CHANGE_DTL(수정))
 		orderChangeDao.updateOrderChangeDtlCancel(order);
-		
+
 		// 2. 주문정보 이력 등록 (TB_ORDER_DETAIL_HST(등록))
 		orderChangeDao.createOrderDtlHstCancel(order);
-		
+
 		// TODO
 		// 3. PG 실행 (취소시 추가결제금액 취소처리)
-		
+
 		return mav;
 	}
-	
+
 	/**
-	 * 취소완료 (admin, front, batch(soldout), batch(gift), batch(napy), batch(extmall))
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2021. 01. 19
+	 * 마이페이지 부분취소 처리
+	 *
+	 * @param GagaMap
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 04. 19
 	 */
 	@SuppressWarnings("unchecked")
 	@Transactional("shopTxnManager")
-	public GagaMap cnclComplete(GagaMap mav, int userNo) {
-		
-		// 1. 세션회원조회
-		//userNo = userNo;
-		
-		// 2. 취소요정정보목록
-		List<Order> cancelReqList		 	= (List<Order>) mav.get("cnclRtnList");				// 취소요청 목록
-		List<Order> cancelOrderRefundList 	= (List<Order>) mav.get("cancelOrderRefundList");	// 취소환불금액 목록 (주문상세단품 단위)
-		List<Order> cancelDelvRefundList 	= (List<Order>) mav.get("cancelDelvRefundList");	// 취소환불배송금액 목록 (DELV_FEE_CD 단위)
-				
-		// 3. 취소신청정보
-		int ordNo 							= Integer.parseInt(mav.getString("ordNo"));			// 주문번호
-		String chgReason 					= mav.getString("chgReason");						// 변경사유
-		String chgMemo 						= mav.getString("chgMemo");							// 변경메모
-		String allCanYnBeforePayment		= mav.getString("allCanYnBeforePayment");			// 무통장입금전 전체취소 여부
-		String isCustomer					= mav.getString("isCustomer");						// 귀책사유 (고객, 회사)
-		String chgGb						= TscConstants.OrderChangeGb.CANCEL.value(); 		// 취소요청 (공톹코드:G680)
-		String reqGbn						= mav.get("reqGbn").toString();						// 신청구분
-		String ordDtlStat;																		// 주문상세상태
-		String chgStat;																			// 주문변경상태
-		
-		if ("Y".equals(allCanYnBeforePayment)) {
-			ordDtlStat = TscConstants.OrderDetailStat.PAYMENT_BEFORE_CANCEL.value();
-			chgStat = TscConstants.OrderChangeStat.PAYMENT_BEFORE_CANCEL.value();
-		} else {
-			ordDtlStat = TscConstants.OrderDetailStat.PAYMENT_AFTER_CANCEL.value();
-			chgStat = TscConstants.OrderChangeStat.PAYMENT_AFTER_CANCEL.value();
-		}
-		
-		// 4. 주문상세단품정보등록,변경 (단품단위)
+	public GagaMap partialCancel(GagaMap map) {
+		// 1. 취소요청목록 및 정보 설정
+		List<Order> cancelOrderRefundList 	= (List<Order>) map.get("cancelOrderRefundList");				// 취소환불금액 목록 (주문상세단품 단위)
+		List<Order> cancelDelvRefundList 	= (List<Order>) map.get("cancelDelvRefundList");				// 취소환불배송금액 목록 (DELV_FEE_CD 단위)
+		int ordNo 							= map.getInt("ordNo");											// 주문번호
+		int custNo							= map.getInt("custNo");											// 고객번호
+		String chgReason 					= map.getString("chgReason");									// 변경사유
+		String chgMemo 						= map.getString("chgMemo");										// 변경메모
+		String allLastCanYn					= map.getString("allLastCanYn");								// 마지막 취소 여부
+		String isCustomer					= map.getString("isCustomer");									// 귀책사유 (고객, 회사)
+		String ipAddress					= map.getString("ipAddress");									// IP주소
+		String pgTid						= map.getString("pgTid");										// PG거래ID
+		String payMeans						= map.getString("payMeans");									// 결제수단
+		String pgGb							= map.getString("pgGb");										// PG구분
+		String accountNo					= map.getString("accountNo");									// 환불계좌번호
+		String accountNm					= map.getString("accountNm");									// 환불계좌주명
+		String bankCd						= map.getString("bankCd");										// 환불계좌은행코드
+		String chgGb						= TscConstants.OrderChangeGb.CANCEL.value(); 					// 취소요청 (공톹코드:G680)
+		String ordDtlStat					= TscConstants.OrderDetailStat.PAYMENT_AFTER_CANCEL.value();	// 주문상세상태
+		String chgStat						= TscConstants.OrderChangeStat.PAYMENT_AFTER_CANCEL.value();	// 주문변경상태
+		int pgCancelAmt						= 0;															// PG취소금액
+
+		// 2. 주문상세단품정보등록, 변경 (단품단위)
 		List<Order> cancelOrderDetailList = new ArrayList<>();
-		
-		for (int i=0 ; i<cancelOrderRefundList.size() ; i++) {
-			Order cancelOrderRefundPo = cancelOrderRefundList.get(i);
-			cancelOrderRefundPo.setRegNo(userNo);
-			cancelOrderRefundPo.setUpdNo(userNo);
-			
-			// 2020.01.05 추후 무통장입금전 전체 취소시 분기 로직 추가 예정
-			// 2021.01.26 취소완료, 취소신청완료(취소승인) 일때실행
-			if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
-				cancelOrderRefundPo.setOrdDtlStat(ordDtlStat);
-			}
+		List<Integer> ordDtlNoList = new ArrayList<>();
 
-			// 4.1 취소수량이 존재하면 주문상세단품정보 수정 및 주문상세단품이력정보 등록
+		for (Order cancelOrderRefundPo : cancelOrderRefundList) {
+			cancelOrderRefundPo.setOrdDtlStat(ordDtlStat);
+			cancelOrderRefundPo.setRegNo(custNo);
+			cancelOrderRefundPo.setUpdNo(custNo);
+
+			// 2-1. 취소수량이 존재하면 주문상세단품정보 수정 및 주문상세단품 이력 등록
 			if (cancelOrderRefundPo.getOrdCanChgQty() > 0) {
-				
-				// 2021.01.26 취소완료, 취소신청완료(취소승인) 일때실행
-				// 4.2 주문상세단품정보수정 (TB_ORDER_DETAIL_ITEM)
-				if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
-					orderChangeDao.updateOrderDetailItem(cancelOrderRefundPo);
-				
-				
-					// 4.3 주문상세단품정보이력등록 (TB_ORDER_DETAIL_ITEM_HST) 
-					orderChangeDao.createOrderDetailItemHst(cancelOrderRefundPo);
-				}
-				
-				// 4.4 주문변경 상세 단위로 데이타 등록 (ORD_DTL_NO)
-				Boolean temp = false;
-				if (cancelOrderDetailList.size() > 0) {
-					for (int j=0 ; j<cancelOrderDetailList.size() ; j++) {
-						if (cancelOrderRefundPo.getOrdDtlNo() == cancelOrderDetailList.get(j).getOrdDtlNo()) {
-							temp = true;
-						}
-					}
-				}
-				
-				// 4.5 주문상세단위 데이타 저장(주문상세 단위)
-				if (!temp) {
-					cancelOrderDetailList.add(cancelOrderRefundPo);
-				}
+				// 2-1-1. 주문상세단품정보 수정
+				orderChangeDao.updateOrderDetailItem(cancelOrderRefundPo);
+				// 2-1-2. 주문상세단품정보 이력 등록
+				orderChangeDao.createOrderDetailItemHst(cancelOrderRefundPo);
+			}
+
+			// 2-2. 주문상세단위로 데이터 설정
+			Integer ordDtlNo = cancelOrderRefundPo.getOrdDtlNo();
+			if (!ordDtlNoList.contains(ordDtlNo)) {
+				cancelOrderDetailList.add(cancelOrderRefundPo);
+				ordDtlNoList.add(ordDtlNo);
 			}
 		}
-		
-		
-		// 2021.01.21 DELV_FEE 배송번호 단위로 TB_ORDER_CHANGE 생성
-		// 5. 주문변경정보, 주문정보, 환불정보 (업체코드 & 배송정책코드)
-		for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
-			
-			Order obj = cancelDelvRefundList.get(i);
-			
-			// 취소금액이 있을때 처리
+
+		// 3. 주문변경정보, 주문정보, 환불정보 (배송정책코드 별)
+		for (Order obj : cancelDelvRefundList) {
+			// 취소금액 있을 시 처리
 			if (obj.getCnclRtnAmt() > 0) {
-			
-				// 5.1 주문변경 기본정보 등록 
+				// 3-1. 주문변경정보 생성
 				OrderChange orderChange = new OrderChange();
 				orderChange.setOrdNo(ordNo);
 				orderChange.setChgGb(chgGb);
@@ -253,139 +222,129 @@ public class TscOrderChangeService {
 				orderChange.setChgMemo(chgMemo);
 				orderChange.setAddPayCost(0);
 				orderChange.setAddPayAmt(0);
-				orderChange.setRegNo(userNo);
-				orderChange.setUpdNo(userNo);
-				
-				// 5.2 주문변경 추가정보 등록
-				String chgerNm 			= mav.getString("chgerNm");			// 변경자
-				String chgerPhnno 		= mav.getString("chgerPhnno");		// 변경핸드폰번호
-				String chgerTelno 		= mav.getString("chgerTelno");		// 변경전화번호
-				String chgerEmail 		= mav.getString("chgerEmail");		// 변경이메일
-				
-				orderChange.setChgerNm(chgerNm);
-				orderChange.setChgerPhnno(chgerPhnno);
-				orderChange.setChgerTelno(chgerTelno);
-				orderChange.setChgerEmail(chgerEmail);
-				orderChange.setChgerRtnMemo("");
-				
-				// 2021.01.26 취소완료, 취소신청 일때실행
-				if ("cnclComplete".equals(reqGbn) || "cnclReq".equals(reqGbn)) {
-					orderChangeDao.createOrderChange(orderChange);
-				}
-				
-				// 5.3 주문상세단위 취소정보
-				for (int j=0 ; j<cancelOrderDetailList.size() ; j++) {
-					Order vo = cancelOrderRefundList.get(j);
-					vo.setRegNo(userNo);
-					vo.setUpdNo(userNo);
-					
-					// 5.3.0 DEVL_FEE_CD 단위로 주문상세 정보 처리
+				orderChange.setRegNo(custNo);
+				orderChange.setUpdNo(custNo);
+
+				orderChangeDao.createOrderChange(orderChange);
+
+				// 3-2. 주문상세정보 수정
+				for (Order vo : cancelOrderDetailList) {
+					// 배송정책코드 별 주문상세 처리
 					if (obj.getDelvFeeCd().equals(vo.getDelvFeeCd())) {
-						
-						// 2021.01.26 취소완료, 취소신청완료 일때실행
-						// 2020.01.05 추후 무통장입금전 전체 취소시 분기로직 추가 예정
-						if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
-							vo.setOrdDtlStat(ordDtlStat);
-						} else {
-							vo.setOrdDtlStat(TscConstants.OrderChangeStat.CANCEL.value()); 						// 취소신청
-						}
-						
-						// 5.3.1 주문변경상세정보 이력등록
+						// 주문상세 별 전체취소여부 설정
+						int leftQty = vo.getOrdQty() - vo.getCnclRtnQty() - vo.getOrdCanChgQty();
+
+						// 3-2-1. 주문상세 이력 등록
 						orderChangeDao.createOrderDetailHstCnclRtn(vo);
-						
-						// 2021.01.26 취소완료, 취소신청완료 일때실행
-						// 5.3.2 주문변경상세정보 수정
-						if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
-							orderChangeDao.updateOrderDetail(vo);
+
+						// 3-2-2. 주문상세정보 수정
+						orderChangeDao.updateOrderDetail(vo);
+
+						// 3-2-3. 사용포인트원복
+						int pntDcAmt = vo.getPntDcAmt();
+						vo.setOccurGb(TscConstants.PointOccurGb.USE_POINT.value());
+
+						for (Order point : orderChangeDao.getCustPointHst(vo)) {
+							while (pntDcAmt > 0) {
+								if (pntDcAmt < point.getPntAmt()) {
+									point.setPntAmt(pntDcAmt);
+									pntDcAmt -= pntDcAmt;
+								} else {
+									pntDcAmt -= point.getPntAmt();
+								}
+
+								point.setOccurGb(TscConstants.PointOccurGb.USE_POINT_CANCEL.value());
+								point.setOccurDtlDesc("포인트사용취소");
+								point.setRegNo(custNo);
+								point.setUpdNo(custNo);
+
+								// 포인트 사용 취소 이력 생성 및 포인트 수정
+								orderChangeDao.createCustPointHstRollback(point);
+								orderChangeDao.updateCustPointRollback(point);
+							}
+						}
+
+						// 3-2-4. 적립예정포인트 수정
+						int savePntAmt = vo.getSavePntAmt();
+						vo.setOccurGb(TscConstants.PointOccurGb.EXPECT_POINT.value());
+
+						for (Order point : orderChangeDao.getCustPointHst(vo)) {
+							point.setOccurGb(TscConstants.PointOccurGb.EXPECT_POINT_CANCEL.value());
+							point.setOccurDtlDesc("예정포인트적립취소");
+							point.setPayAmt(savePntAmt * -1);
+							point.setRegNo(custNo);
+							point.setUpdNo(custNo);
+
+							// 적립예정포인트 취소 이력 생성
+							orderChangeDao.createCustPointHstRollback(point);
+						}
+
+						// 3-2-5. 상품쿠폰원복
+						if (leftQty == 0) {
+							orderChangeDao.updateGoodsCpnRollback(vo);
+						}
+
+						// 3-2-6. 사용상품권 원복
+						int gfcdUseAmt = vo.getGfcdUseAmt();
+
+						for (Order giftCard : orderChangeDao.getCustGiftCardHst(vo)) {
+							while (gfcdUseAmt > 0) {
+								if (gfcdUseAmt < giftCard.getGfcdAmt()) {
+									giftCard.setGfcdAmt(gfcdUseAmt);
+									gfcdUseAmt -= gfcdUseAmt;
+								} else {
+									gfcdUseAmt -= giftCard.getGfcdAmt();
+								}
+
+								giftCard.setOccurGb(TscConstants.GiftCardOccurGb.USE_GIFTCARD_CANCEL.value());
+								giftCard.setOccurDtlDesc("상품권사용취소");
+								giftCard.setRegNo(custNo);
+								giftCard.setUpdNo(custNo);
+
+								// 포인트 사용 취소 이력 생성 및 포인트 수정
+								orderChangeDao.createCustGiftCardHstRollback(giftCard);
+								orderChangeDao.updateCustGiftCardRollback(giftCard);
+							}
 						}
-						
-						// * 주문상세단위가 아닌 주문상세단품단위로 데이타가 처리되고 있었음 주문상세단위로 수정
-						// 5.3 주문변경상세정보 등록
+
+						// 3-2-7. 주문변경상세정보 및 이력 등록
 						OrderChange changeDetailPo = new OrderChange();
 						changeDetailPo.setOrdChgSq(orderChange.getOrdChgSq());
 						changeDetailPo.setOrdDtlNo(vo.getOrdDtlNo());
 						changeDetailPo.setChgQty(vo.getOrdCanChgQty());
-						changeDetailPo.setRegNo(userNo);
-						changeDetailPo.setUpdNo(userNo);
-						
-						// 2021.01.26 취소완료일때실행
-						if ("cnclComplete".equals(reqGbn)) {
-							changeDetailPo.setChgStat(chgStat);
+						changeDetailPo.setChgStat(chgStat);
+						changeDetailPo.setRegNo(custNo);
+						changeDetailPo.setUpdNo(custNo);
 
-							orderChangeDao.createOrderChangeDetail(changeDetailPo);
-							orderChangeDao.createOrderChangeDetailHst(changeDetailPo);
-						}
-						// 2021.01.26 취소신청완료일때실행
-						else if ("cnclReqComplete".equals(reqGbn)) {
-							Order order = new Order();
-							order.setOrdNo(mav.getInt("ordNo"));
-							order.setOrdChgSq(mav.getInt("ordChgSq"));
-							order.setChgStat(chgStat);
-							order.setUpdNo(userNo);
-							order.setDelYn("N");
-
-							orderChangeDao.updateOrderChangeDtlCancel(order);
-							orderChangeDao.createOrderChangeDetailHst(changeDetailPo);
-						}
-						// 2021.01.26 취소신청일때실행
-						else {
-							changeDetailPo.setChgStat(TscConstants.OrderChangeStat.CANCEL.value()); 			// 취소신청
-							orderChangeDao.createOrderChangeDetail(changeDetailPo);
-						}
+						orderChangeDao.createOrderChangeDetail(changeDetailPo);
+						orderChangeDao.createOrderChangeDetailHst(changeDetailPo);
 					}
 				}
-				
-				// 2021.01.26 취소완료, 취소신청완료 일때실행
-				// 5.31 상품재고원복 (TB_SELL_QTY 등록(취소,반품))
-				orderChange.setSellGb("11");
-				if ("cnclComplete".equals(reqGbn)) {
-					orderChangeDao.createSellQty(orderChange);
-				} else if ("cnclReqComplete".equals(reqGbn)) {
-					orderChange.setOrdNo(mav.getInt("ordNo"));
-					orderChange.setOrdChgSq(mav.getInt("ordChgSq"));
-					orderChangeDao.createSellQty(orderChange);
-				}
-				
-				// 5.4 환불결제정보 등록 (업체별 & 배송정책별) 단위
-				// 취소, 반품 사유에 따른 추가배송비, 반품배송비를 환불금액에서 추가, 제외 할 수 있다.
-				//int spanRealCnclRtnAmt 		= obj.getCnclRtnAmt();		// 취소금액합계
-				// 2021.04.12 취소,반품 환불금액 계산 칼럼 오류 수정 jsh77b
-				int spanRealCnclRtnAmt 		= obj.getRealOrdAmt();		// 취소금액합계
-				int sumDeliveryFee 			= obj.getDelvFee();			// 배송비합계
-				int spanTotDeliveryFee 		= obj.getAddDelvFee();		// 추가배송비합계
-				int spanTotRtnDelvFee 		= obj.getRtnDelvFee();		// 반품배송비합계
-				int spanRefundAmt			= 0;
-
-				// 고객사유 : 환불금액계산 = (취소금액 + 배송비) - 추가배송비
-				if ("true".equals(isCustomer)) {
-					spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee) - spanTotDeliveryFee - spanTotRtnDelvFee;
-				}
-				// 회사사유 : 환불금액계산 = (취소금액 + 배송비)
-				else {
-					spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee);
-				}
-				
+
+				// 3-3. 상품재고원복
+				orderChange.setSellGb(TscConstants.SellGb.ORDER_CANCEL.value());
+				orderChangeDao.createSellQty(orderChange);
+
+				// 3-4. 환불결제정보 등록 (배송정책 별)
+				int spanRealCnclRtnAmt = obj.getRealOrdAmt();        // 취소금액합계
+				int sumDeliveryFee = obj.getDelvFee();            // 배송비합계
+				int spanRefundAmt = spanRealCnclRtnAmt + sumDeliveryFee;
+
 				Order paymentOrder = new Order();
 				paymentOrder.setOrdNo(ordNo);
 				paymentOrder.setPayAmt(spanRefundAmt * -1);
 				paymentOrder.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
 				paymentOrder.setOrdChgSq(orderChange.getOrdChgSq());
-				paymentOrder.setRegNo(userNo);
-				paymentOrder.setUpdNo(userNo);
-				
-				// 2021.01.26 취소완료, 취소신청완료 일때실행
-				if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
-					orderChangeDao.createPayment(paymentOrder);
-				}
-				
-				// 5.5 환불금액 등록
+				paymentOrder.setRegNo(custNo);
+				paymentOrder.setUpdNo(custNo);
+
+				orderChangeDao.createPayment(paymentOrder);
+
+				// 3-5. 환불정보 등록
 				Order refundOrder = new Order();
 				refundOrder.setOrdNo(ordNo);
 				refundOrder.setPaySq(paymentOrder.getPaySq());
 				refundOrder.setOrdChgSq(orderChange.getOrdChgSq());
-				refundOrder.setRegNo(userNo);
-				
-				// 2021.01.25 TB_REFUND 정보 등록을 위해서 분리 작업
 				refundOrder.setRefundAmt(spanRefundAmt);
 				refundOrder.setRfCpn1Amt(obj.getCpn1DcAmt());
 				refundOrder.setRfTmtb1Amt(obj.getTmtb1DcAmt());
@@ -395,1128 +354,1779 @@ public class TscOrderChangeService {
 				refundOrder.setRfPntAmt(obj.getPntAmt());
 				refundOrder.setRfPrePntAmt(obj.getPrePntDcAmt());
 				refundOrder.setRfGfcdUseAmt(obj.getGfcdUseAmt());
-				
-				refundOrder.setRaNo(mav.get("accountNo").toString());
-				refundOrder.setRaNm(mav.get("accountNm").toString());
-				refundOrder.setRaBank(mav.get("bankCd").toString());
-				
-				// 2021.01.26 취소완료, 취소신청 일때실행
-				if ("cnclComplete".equals(reqGbn) || "cnclReq".equals(reqGbn)) {
-					orderChangeDao.createRefund(refundOrder);
-				}
-				
-				// 5.6 결제금액이 무료배송금액보다 작으면 배송비 신규 등록
+				refundOrder.setRfCnclAmt(obj.getRfCnclAmt());
+				refundOrder.setRfDeliveryFee(obj.getRfDeliveryFee());
+				refundOrder.setRfRealCnclAmt(obj.getRfRealCnclAmt());
+				refundOrder.setRaNo(accountNo);
+				refundOrder.setRaNm(accountNm);
+				refundOrder.setRaBank(bankCd);
+				refundOrder.setRegNo(custNo);
+
+				orderChangeDao.createRefund(refundOrder);
+
+				// 3-6. 결제금액이 무료배송금액보다 작으면 배송비 신규 등록
 				if (obj.getAddDelvFee() > 0) {
 					Order delvFeeOrder = new Order();
-					
 					delvFeeOrder.setPaySq(paymentOrder.getPaySq());
 					delvFeeOrder.setOrdNo(ordNo);
-					delvFeeOrder.setDelvFeeGb("G018_10");
+					delvFeeOrder.setDelvFeeGb(TscConstants.DeliveryFeeGb.ORIGIN_DELIVERY_FEE.value());
 					delvFeeOrder.setDelvFeeCd(obj.getDelvFeeCd());
 					delvFeeOrder.setDelvFee(obj.getAddDelvFee());
 					delvFeeOrder.setRealDelvAmt(obj.getDelvFee());
 					delvFeeOrder.setOrdChgSq(orderChange.getOrdChgSq());
 					delvFeeOrder.setSupplyCompCd(obj.getSupplyCompCd());
-					delvFeeOrder.setRegNo(userNo);
-					delvFeeOrder.setUpdNo(userNo);
-					
-					// 2021.01.26 취소완료, 취소신청완료일때실행
-					if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
-						orderChangeDao.createDeliveryFee(delvFeeOrder);
-					}
+					delvFeeOrder.setRegNo(custNo);
+					delvFeeOrder.setUpdNo(custNo);
+
+					orderChangeDao.createDeliveryFee(delvFeeOrder);
 				}
+
+				pgCancelAmt += spanRefundAmt;
 			}
-		}
-		
-		// TODO
-		// 9. 포인트원복 (사용포인트, 주문상세단위)
-		// 예정적립포인트 취소처리
-		
-		// TODO
-		// 10. 쿠폰원복 (상품쿠폰, 주문상세단위) (전체취소시 장바구니쿠폰, 배송비쿠폰)
-		
-		// TODO
-		// 11. 상품권원복
-		
-		// 12. 사은품 전체 취소 (전체취소시 적용) 추후 사은품 관련 취소 로직 개발 예정
-		//Order freegiftOrder = new Order();
-		//freegiftOrder.setOrdNo(ordNo);
-		//freegiftOrder.setUpdNo(userNo);
-		//orderChangeDao.updateOrdFreegiftDel(freegiftOrder);
-		
-		// TODO
-		// 13. PG 연동
-		// 네이버페이, 카카오페이 취소 시 취소 포인트 금액 TB_PAYMENT에 업데이트 처야함
-		
-		// TODO
-		// 14. 취소 완료 알림톡 발송 에정
-		
-		//int a = 100/0;
-		
-		
-		return mav;
-	}
-	
-	/**
-	 * 반품신청 (ADMIN, FRONT, NPAY, EXTMALL) 
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2021. 01. 19
-	 */
-	@SuppressWarnings("unchecked")
-	@Transactional("shopTxnManager")
-	public GagaMap rtnReq(GagaMap mav, int userNo) {
-		
-		// 1. 세션회원조회
-		//userNo = userNo;
-		
-		// 2. 변경요정정보목록
-		List<Order> cancelReqList		 	= (List<Order>) mav.get("cnclRtnList");				// 변경요청 목록
-		List<Order> cancelOrderRefundList 	= (List<Order>) mav.get("cancelOrderRefundList");	// 변경환불금액 목록 (주문상세단품 단위)
-		List<Order> cancelDelvRefundList 	= (List<Order>) mav.get("cancelDelvRefundList");	// 변경환불배송금액 목록 (DELV_FEE_CD 단위)
-				
-		// 3. 변경신청정보
-		int ordNo 			= Integer.parseInt(mav.getString("ordNo"));							// 주문번호
-		int ordChgSq		= Integer.parseInt(mav.getString("ordChgSq"));						// 주문변경번호
-		String chgReason 	= mav.getString("chgReason");										// 변경사유
-		String chgMemo 		= mav.getString("chgMemo");											// 변경메모
-		String allCanYn		= mav.getString("allCanYn");										// 무통장입금전 전체취소 여부
-		String isCustomer	= mav.getString("isCustomer");										// 귀책사유 (고객, 회사)
-		String chgGb		= TscConstants.OrderChangeGb.RETURN.value(); 						// 반품요청
-		String wdGb			= mav.getString("wdGb");											// 회수방법
-		String wdInvoiceNo	= mav.getString("wdInvoiceNo");										// 회수송장번호
-		
-		// 4. 주문상세단품정보등록,변경 (단품단위)
-		List<Order> cancelOrderDetailList = new ArrayList<>();
-		
-		for (int i=0 ; i<cancelOrderRefundList.size() ; i++) {
-			Order cancelOrderRefundPo = cancelOrderRefundList.get(i);
-			cancelOrderRefundPo.setRegNo(userNo);
-			cancelOrderRefundPo.setUpdNo(userNo);
 
-			// 4.1 취소수량이 존재하면 주문상세단품정보 수정 및 주문상세단품이력정보 등록
-			if (cancelOrderRefundPo.getOrdCanChgQty() > 0) {
-				// 4.4 주문변경 상세 단위로 데이타 등록 (ORD_DTL_NO)
-				Boolean temp = false;
-				if (cancelOrderDetailList.size() > 0) {
-					for (int j=0 ; j<cancelOrderDetailList.size() ; j++) {
-						if (cancelOrderRefundPo.getOrdDtlNo() == cancelOrderDetailList.get(j).getOrdDtlNo()) {
-							temp = true;
-						}
-					}
-				}
-				
-				// 4.5 주문상세단위 데이타 저장(주문상세 단위)
-				if (!temp) {
-					cancelOrderDetailList.add(cancelOrderRefundPo);
-				}
+			// 4. 장바구니, 배송비 쿠폰 원복 및 사은품 전체 취소 처리 (마지막 취소 시)
+			if ("Y".equals(allLastCanYn)) {
+				// 4-1. 장바구니, 배송비 쿠폰 원복처리
+				Order coupon = new Order();
+				coupon.setOrdNo(ordNo);
+				coupon.setUpdNo(custNo);
+				orderChangeDao.updateCartCpnRollback(coupon);
+				orderChangeDao.updateDeliveryCpnRollback(coupon);
+
+				// 4-2. 사은품 전체 취소 (전체취소시 적용) 추후 사은품 관련 취소 로직 개발 예정
+				Order freegiftOrder = new Order();
+				freegiftOrder.setOrdNo(ordNo);
+				freegiftOrder.setUpdNo(custNo);
+				orderChangeDao.updateOrdFreegiftDel(freegiftOrder);
 			}
-		}
 
-		// 2021.01.21 DELV_FEE 배송번호 단위로 TB_ORDER_CHANGE 생성
-		// 4. 주문변경정보, 주문정보, 환불정보 (업체코드 & 배송정책코드)
-		for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
-			
-			Order obj = cancelDelvRefundList.get(i);
-			
-			// 취소금액이 있을때 처리
-			if (obj.getCnclRtnAmt() > 0) {
-			
-				// 5.1 주문변경 기본정보 등록 
-				OrderChange orderChange = new OrderChange();
-				orderChange.setOrdNo(ordNo);
-				orderChange.setChgGb(chgGb);
-				orderChange.setChgReason(chgReason);
-				orderChange.setChgMemo(chgMemo);
-				orderChange.setAddPayCost(0);
-				orderChange.setAddPayAmt(0);
-				orderChange.setWdGb(wdGb);
-				orderChange.setWdInvoiceNo(wdInvoiceNo);
-				orderChange.setRegNo(userNo);
-				orderChange.setUpdNo(userNo);
-				
-				// 5.2 주문변경 추가정보 등록
-				String chgerNm 			= mav.getString("chgerNm");						// 변경자
-				String chgerPhnno 		= mav.getString("chgerPhnno");					// 변경핸드폰번호
-				String chgerTelno 		= mav.getString("chgerTelno");					// 변경전화번호
-				String chgerEmail 		= mav.getString("chgerEmail");					// 변경이메일
-				String chgerZipcode 	= mav.getString("chgerZipcode");				// 변경우편번호
-				String chgerBaseAddr 	= mav.getString("chgerBaseAddr");				// 변경기본주소
-				String chgerDtlAddr 	= mav.getString("chgerDtlAddr");				// 변경상세주소
-				String chgerRtnMemo		= mav.getString("chgerRtnMemo");				// 반품메모
-				
-				orderChange.setChgerNm(chgerNm);
-				orderChange.setChgerPhnno(chgerPhnno);
-				orderChange.setChgerTelno(chgerTelno);
-				orderChange.setChgerEmail(chgerEmail);
-				orderChange.setChgerRtnMemo(chgerRtnMemo);
-				orderChange.setChgerZipcode(chgerZipcode);
-				orderChange.setChgerBaseAddr(chgerBaseAddr);
-				orderChange.setChgerDtlAddr(chgerDtlAddr);
-				
-				orderChangeDao.createOrderChange(orderChange);
-				
-				// 5.3 주문상세단위 취소정보
-				for (int j=0 ; j<cancelOrderDetailList.size() ; j++) {
-					Order vo = cancelOrderRefundList.get(j);
-					vo.setRegNo(userNo);
-					vo.setUpdNo(userNo);
-					vo.setOrdDtlStat(TscConstants.OrderChangeStat.RETURN.value()); 					// 반품신청
-					
-					// 5.3.0 DEVL_FEE_CD 단위로 주문상세 정보 처리
-					if (obj.getDelvFeeCd().equals(vo.getDelvFeeCd())) {
-						
-						// 5.3.1 주문변경상세정보 이력등록
-						orderChangeDao.createOrderDetailHstCnclRtn(vo);
-						
-						// * 주문상세단위가 아닌 주문상세단품단위로 데이타가 처리되고 있었음 주문상세단위로 수정
-						// 5.3 주문변경상세정보 등록
-						OrderChange changeDetailPo = new OrderChange();
-						changeDetailPo.setOrdChgSq(orderChange.getOrdChgSq());
-						changeDetailPo.setOrdDtlNo(vo.getOrdDtlNo());
-						changeDetailPo.setChgQty(vo.getOrdCanChgQty());
-						changeDetailPo.setChgStat(TscConstants.OrderChangeStat.RETURN.value()); 	// 반품신청
-						changeDetailPo.setRegNo(userNo);
-						changeDetailPo.setUpdNo(userNo);
-						
-						orderChangeDao.createOrderChangeDetail(changeDetailPo);
-					}
+			// 5. PG 결제 취소 처리 (상품권으로만 결제 시 PG점프)
+			if (!TscConstants.PgGb.ISTYLE.value().equals(pgGb)) {
+				if (TscConstants.PgGb.KCP.value().equals(pgGb) || TscConstants.PgGb.PAYCO.value().equals(pgGb)) {
+					Payment kcp = new Payment();
+					kcp.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+					kcp.setPayGb("O");
+					kcp.setModType("STSC");
+					kcp.setModDesc("가맹점 취소 - 전체 취소");
+					kcp.setIpAddress(ipAddress);
+					kcp.setPgTid(pgTid);
+					kcp.setPayAmt(pgCancelAmt);
+					kcp.setRegNo(custNo);
+					kcp.setUpdNo(custNo);
+					kcpService.kcpCancel(kcp);
+				} else if (TscConstants.PgGb.NAVER.value().equals(pgGb)) {
+					Payment naverPay = new Payment();
+					naverPay.setOrdNo(ordNo);
+					naverPay.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+					naverPay.setPayGb("O");
+					naverPay.setPayMeans(payMeans);
+					naverPay.setChgReasonNm(chgReason);
+					naverPay.setPgTid(pgTid);
+					naverPay.setPayAmt(pgCancelAmt);
+					naverPay.setRegNo(custNo);
+					naverPay.setUpdNo(custNo);
+
+					naverPayService.cancelNaverPayment(naverPay);
+				} else if (TscConstants.PgGb.KAKAO.value().equals(pgGb)) {
+					Payment kakaoPay = new Payment();
+					kakaoPay.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+					kakaoPay.setPayGb("O");
+					kakaoPay.setPgTid(pgTid);
+					kakaoPay.setPayAmt(pgCancelAmt);
+
+					kakaoPayService.cancelKakaoPayment(kakaoPay);
 				}
-				
-				// 5.4 환불결제정보 등록 (업체별 & 배송정책별) 단위
-				// 취소, 반품 사유에 따른 추가배송비, 반품배송비를 환불금액에서 추가, 제외 할 수 있다.
-				int spanRealCnclRtnAmt 		= obj.getCnclRtnAmt();		// 취소금액합계
-				int sumDeliveryFee 			= obj.getDelvFee();			// 배송비합계
-				int spanTotDeliveryFee 		= obj.getAddDelvFee();		// 추가배송비합계
-				int spanTotRtnDelvFee 		= obj.getRtnDelvFee();		// 반품배송비합계
-				int spanRefundAmt			= 0;
-				
-				// 고객사유 : 환불금액계산 = (취소금액 + 배송비) - 추가배송비
-				if ("true".equals(isCustomer)) {
-					spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee) - spanTotDeliveryFee - spanTotRtnDelvFee;
-				}
-				// 회사사유 : 환불금액계산 = (취소금액 + 배송비)
-				else {
-					spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee);
-				}
-				
-				// 5.4 환불금액 등록
-				Order refundOrder = new Order();
-				refundOrder.setOrdNo(ordNo);
-				refundOrder.setPaySq(0);
-				refundOrder.setOrdChgSq(orderChange.getOrdChgSq());
-				refundOrder.setRegNo(userNo);
-				
-				// 2021.01.25 TB_REFUND 정보 등록을 위해서 분리 작업
-				refundOrder.setRefundAmt(spanRefundAmt);
-				refundOrder.setRfCpn1Amt(obj.getCpn1DcAmt());
-				refundOrder.setRfTmtb1Amt(obj.getTmtb1DcAmt());
-				refundOrder.setRfTmtb2Amt(obj.getTmtb2DcAmt());
-				refundOrder.setRfGoodsCpnAmt(obj.getGoodsCpnDcAmt());
-				refundOrder.setRfCartCpnAmt(obj.getCartCpnDcAmt());
-				refundOrder.setRfPntAmt(obj.getPntAmt());
-				refundOrder.setRfPrePntAmt(obj.getPrePntDcAmt());
-				refundOrder.setRfGfcdUseAmt(obj.getGfcdUseAmt());
-				
-				refundOrder.setRaNo(mav.get("accountNo").toString());
-				refundOrder.setRaNm(mav.get("accountNm").toString());
-				refundOrder.setRaBank(mav.get("bankCd").toString());
-				
-				orderChangeDao.createRefund(refundOrder);
 			}
+
 		}
-		
-		return mav;
-	}
-	
-	/**
-	 * 반품신청철회 (admin)
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2021. 01. 19
-	 */
-	@Transactional("shopTxnManager")
-	public GagaMap rtnReqCancel(GagaMap mav, int userNo) {
-		
-		Order order = new Order();
-		order.setOrdNo(mav.getInt("ordNo"));
-		order.setOrdChgSq(mav.getInt("ordChgSq"));
-		order.setChgStat(TscConstants.OrderChangeStat.RETURN_CANCEL.value());
-		order.setRegNo(userNo);
-		order.setUpdNo(userNo);
-		order.setDelYn("Y");
-		
-		// 1. 주문변경정보 (TB_ORDER_CHANGE_DTL(수정))
-		orderChangeDao.updateOrderChangeDtlCancel(order);
-		
-		// 2. 주문정보 이력 등록 (TB_ORDER_DETAIL_HST(등록))
-		orderChangeDao.createOrderDtlHstCancel(order);
-		
-		// TODO
-		// 3. PG 실행 (취소시 추가결제금액 취소처리)
-		
-		return mav;
-	}
-	
-	/**
-	 * 반품완료
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2021. 01. 19
-	 */
-	public GagaMap rtnComplete(List<Order> cnclRtnList) {
-		GagaMap mav = new GagaMap();
-		
-		
-		return mav;
-	}
-	
-	/**
-	 * 교환신청
-	 * 
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2021. 01. 19
-	 */
-	@Transactional("shopTxnManager")
-	public GagaMap exchReq(OrderChange excReq) {
-		GagaMap result = new GagaMap();
-		result.set("status", GagaResponseStatus.FAIL.getCode());
-		
-		// 교환 기본 정보
-		int addPayCost = excReq.getAddPayCost();			// 추가배송비
-		String wdGb = excReq.getWdGb();						// 회수구분
-		String wdInvoiceNo = excReq.getWdInvoiceNo();		// 회수송장번호
-		Integer regNo = excReq.getRegNo();					// 등록자번호
-		Integer updNo = excReq.getUpdNo();					// 수정자번호
-		
-		// 교환신청 목록 설정
-		Collection<Order> excReqList = excReq.getCancelReqList();
-
-		// 추가배송비 관련 상태값 설정
-		String orderChangeStat = TscConstants.OrderChangeStat.EXCHANGE.value();
-		String ordDtlStat = TscConstants.OrderDetailStat.REFUND_CONFIRM_WAIT.value();
-
-		if (addPayCost > 0) { // 프론트 결제 여부 체크 필요
-			orderChangeStat = TscConstants.OrderChangeStat.EXCHANGE_WAIT.value();
-			ordDtlStat = TscConstants.OrderDetailStat.PAYMENT_WAIT.value();
+			return map;
 		}
-		
-		// 1. 재고 체크 (세트아이템 포함)
-
-
-		// 2. TB_DELIVERY_ADDR 등록
-		Order deliveryAddr = new Order();
-		deliveryAddr.setRecipNm(excReq.getRecipNm());
-		deliveryAddr.setRecipPhnno(excReq.getRecipPhnno());
-		deliveryAddr.setRecipTelno(excReq.getRecipTelno());
-		deliveryAddr.setRecipZipcode(excReq.getRecipZipcode());
-		deliveryAddr.setRecipBaseAddr(excReq.getRecipBaseAddr());
-		deliveryAddr.setRecipDtlAddr(excReq.getRecipDtlAddr());
-		deliveryAddr.setDelvMemo(excReq.getDelvMemo());
-		deliveryAddr.setRegNo(regNo);
-		deliveryAddr.setUpdNo(updNo);
-		
-		orderChangeDao.createDeliveryAddr(deliveryAddr);
-		
-		// 생성된 delvAddrSq 등록
-		int delvAddrSq = deliveryAddr.getDelvAddrSq();
-		
-		// 교환대상 정보 등록
-		int preOrdDtlNo = 0;
-		String preDelvFeeCd = "";
-		int ordChgSq = 0;
-		int exchangeOrdDtlNo = 0;
-		
-		for (Order order : excReqList) {
-			String delvFeeCd = order.getDelvFeeCd();
-			int chgQty = order.getChgQty();
-			String ordChgOpt = order.getOrdChgOpt();
-			int ordDtlNo = order.getOrdDtlNo();
-			
-			if (!preDelvFeeCd.equals(delvFeeCd)) {
-				// 3. TB_ORDER_CHANGE 등록
-				OrderChange orderChange = new OrderChange();
-				orderChange.setChgGb(TscConstants.OrderChangeGb.EXCHANGE.value());
-				orderChange.setChgReason(excReq.getChgReason());
-				orderChange.setChgMemo(excReq.getChgMemo());
-				orderChange.setWdGb(wdGb);
-				orderChange.setWdInvoiceNo(wdInvoiceNo);
-				orderChange.setChgerNm(excReq.getChgerNm());
-				orderChange.setChgerPhnno(excReq.getChgerPhnno());
-				orderChange.setChgerTelno(excReq.getChgerTelno());
-				orderChange.setChgerEmail(excReq.getChgerEmail());
-				orderChange.setChgerZipcode(excReq.getChgerZipcode());
-				orderChange.setChgerBaseAddr(excReq.getChgerBaseAddr());
-				orderChange.setChgerDtlAddr(excReq.getChgerDtlAddr());
-				orderChange.setChgerRtnMemo(excReq.getChgerRtnMemo());
-				orderChange.setAddPayCost(addPayCost);
-				orderChange.setAddPayAmt(excReq.getAddPayAmt());
-				orderChange.setRegNo(regNo);
-				orderChange.setUpdNo(updNo);
 
-				orderChangeDao.createOrderChange(orderChange);
-				
-				preDelvFeeCd = delvFeeCd;
-				
-				// 생성된 ordChgSq 설정
-				ordChgSq = orderChange.getOrdChgSq();
-				
-				log.info("############# ordChgSq >>> {} ##############", ordChgSq);
-
-				// 4. TB_DELIVERY_FEE 추가배송비 등록
-				int delvFee = 0;
-
-				if ("true".equals(excReq.getIsCustomer())) {
-					delvFee = "W".equals(wdGb) ? order.getExcDelvFee() : order.getRtnDelvFee();
+
+		/**
+		 * 취소완료 (admin, front, batch(soldout), batch(gift), batch(napy), batch(extmall))
+		 * @param Order
+		 * @return Order
+		 * @author jsh77b
+		 * @since 2021. 01. 19
+		 */
+		@SuppressWarnings("unchecked")
+		@Transactional("shopTxnManager")
+		public GagaMap cnclComplete(GagaMap mav, int userNo) {
+
+			// 1. 세션회원조회
+			//userNo = userNo;
+
+			// 2. 취소요정정보목록
+			List<Order> cancelReqList		 	= (List<Order>) mav.get("cnclRtnList");							// 취소요청 목록
+			List<Order> cancelOrderRefundList 	= (List<Order>) mav.get("cancelOrderRefundList");				// 취소환불금액 목록 (주문상세단품 단위)
+			List<Order> cancelDelvRefundList 	= (List<Order>) mav.get("cancelDelvRefundList");				// 취소환불배송금액 목록 (DELV_FEE_CD 단위)
+
+			// 3. 취소신청정보
+			int ordNo 							= Integer.parseInt(mav.getString("ordNo"));						// 주문번호
+			String chgReason 					= mav.getString("chgReason");									// 변경사유
+			String chgMemo 						= mav.getString("chgMemo");										// 변경메모
+			String allLastCanYn					= mav.getString("allLastCanYn");								// 마지막 취소 여부
+			String isCustomer					= mav.getString("isCustomer");									// 귀책사유 (고객, 회사)
+			String chgGb						= TscConstants.OrderChangeGb.CANCEL.value(); 					// 취소요청 (공톹코드:G680)
+			String reqGbn						= mav.getString("reqGbn");										// 신청구분
+			String ordDtlStat					= TscConstants.OrderDetailStat.PAYMENT_AFTER_CANCEL.value();	// 주문상세상태
+			String chgStat						= TscConstants.OrderChangeStat.PAYMENT_AFTER_CANCEL.value();	// 주문변경상태
+			String ipAddress					= mav.getString("ipAddress");									// IP주소
+			String pgTid						= mav.getString("pgTid");										// PG거래ID
+			String payMeans						= mav.getString("payMeans");									// 결제수단
+			String pgGb							= mav.getString("pgGb");										// PG구분
+			int pgCancelAmt						= 0;															// PG취소금액
+
+			// 4. 주문상세단품정보등록,변경 (단품단위)
+			List<Order> cancelOrderDetailList = new ArrayList<>();
+
+			for (int i=0 ; i<cancelOrderRefundList.size() ; i++) {
+				Order cancelOrderRefundPo = cancelOrderRefundList.get(i);
+				cancelOrderRefundPo.setRegNo(userNo);
+				cancelOrderRefundPo.setUpdNo(userNo);
+
+				// 2020.01.05 추후 무통장입금전 전체 취소시 분기 로직 추가 예정
+				// 2021.01.26 취소완료, 취소신청완료(취소승인) 일때실행
+				if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
+					cancelOrderRefundPo.setOrdDtlStat(ordDtlStat);
 				}
-				
-				Order deliveryFee = new Order();
-				deliveryFee.setOrdNo(excReq.getOrdNo());
-				deliveryFee.setDelvFeeGb(TscConstants.DeliveryFeeGb.EXCHANGE_DELIVERY_FEE.value());
-				deliveryFee.setDelvFeeCd(delvFeeCd);
-				deliveryFee.setDelvFee(delvFee);
-				deliveryFee.setRealDelvAmt(delvFee);
-				deliveryFee.setOrdChgSq(ordChgSq);
-				deliveryFee.setSupplyCompCd(order.getSupplyCompCd());
-				deliveryFee.setRegNo(regNo);
-				deliveryFee.setUpdNo(updNo);
-				
-				orderChangeDao.createDeliveryFee(deliveryFee);
-				
-				// TODO
-				// 추가배송비 결제 여부 확인 후 TB_PAYMENT 생성
-			}
-			
-			if (preOrdDtlNo != ordDtlNo) {
-				// 5. TB_ORDER_DETAIL 등록
-				Order ordDtl = new Order();
-				ordDtl.setOrdDtlNo(ordDtlNo);
-				ordDtl.setOrdDtlStat(ordDtlStat);
-				ordDtl.setOptCd2(ordChgOpt);
-				ordDtl.setChgQty(chgQty);
-				ordDtl.setDelvAddrSq(delvAddrSq);
-				ordDtl.setRegNo(regNo);
-				ordDtl.setUpdNo(updNo);
-
-				orderChangeDao.createOrderDetailForExchange(ordDtl);
-
-				// 생성된 ordDtlNo 설정
-				exchangeOrdDtlNo = ordDtl.getExchangeOrdDtlNo();
-
-				log.info("############# exchangeOrdDtlNo >>> {} ##############", exchangeOrdDtlNo);
-
-				// 6. TB_ORDER_DETAIL_HST 등록
-				orderChangeDao.createOrderDetailHstForExchange(ordDtl);
-
-				// 7. TB_ORDER_CHANGE_DETAIL 등록
-				OrderChange orderChangeDetail = new OrderChange();
-				orderChangeDetail.setOrdChgSq(ordChgSq);
-				orderChangeDetail.setOrdDtlNo(ordDtlNo);
-				orderChangeDetail.setChgQty(chgQty);
-				orderChangeDetail.setChgStat(orderChangeStat);
-				orderChangeDetail.setChgOrdDtlNo(exchangeOrdDtlNo);
-				orderChangeDetail.setRegNo(regNo);
-				orderChangeDetail.setUpdNo(updNo);
-				
-				orderChangeDao.createOrderChangeDetail(orderChangeDetail);
-
-				preOrdDtlNo = ordDtlNo;
-			}
 
-			// 8. TB_ORDER_DETAIL_ITEM 등록
-			Order ordDtlItem = new Order();
-			ordDtlItem.setOrdDtlItemSq(order.getOrdDtlItemSq());
-			ordDtlItem.setOrdDtlNo(exchangeOrdDtlNo);
-			ordDtlItem.setOrdDtlStat(ordDtlStat);
-			ordDtlItem.setOrdChgOpt(ordChgOpt);
-			ordDtlItem.setRegNo(regNo);
-			ordDtlItem.setUpdNo(updNo);
+				// 4.1 취소수량이 존재하면 주문상세단품정보 수정 및 주문상세단품이력정보 등록
+				if (cancelOrderRefundPo.getOrdCanChgQty() > 0) {
 
-			orderChangeDao.createOrderDetailItemForExchange(ordDtlItem);
+					// 2021.01.26 취소완료, 취소신청완료(취소승인) 일때실행
+					// 4.2 주문상세단품정보수정 (TB_ORDER_DETAIL_ITEM)
+					if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
+						orderChangeDao.updateOrderDetailItem(cancelOrderRefundPo);
 
-			// 9. TB_ORDER_DETAIL_ITEM_HST 등록
-			orderChangeDao.createOrderDetailItemHstForExchange(ordDtlItem);
-		}
 
-		// 10. TB_SELL_QTY 등록
-		OrderChange sellQty = new OrderChange();
-		sellQty.setSellGb(TscConstants.SellGb.EXCHANGE.value());
-		sellQty.setRegNo(regNo);
-		sellQty.setOrdChgSq(ordChgSq);
-		
-		orderChangeDao.createSellQtyForExchange(sellQty);
-		
-		result.set("status", GagaResponseStatus.SUCCESS.getCode());
-		
-		return result;
-	}
+						// 4.3 주문상세단품정보이력등록 (TB_ORDER_DETAIL_ITEM_HST) 
+						orderChangeDao.createOrderDetailItemHst(cancelOrderRefundPo);
+					}
 
-	/**
-	 * 교환 추가배송비 조회
-	 * 
-	 * @param Collection<Order>
-	 * @return Collection<DeliveryFee>
-	 * @author card007
-	 * @since 2021. 01. 26
-	 */
-	public GagaMap getAddDeliveryFeeListForExchange(OrderChange orderChange) {
-		GagaMap result = new GagaMap();
-		Collection<DeliveryFee> deliveryFeeList = new ArrayList<>();
-		List<String> delvFeeCdList = new ArrayList<>();
-		int totalDelvFee = 0;
-
-		String wdGb = orderChange.getWdGb();
-		Collection<Order> excReqList = orderChange.getCancelReqList();
-		
-		for (Order order : excReqList) {
-			String delvFeeCd = order.getDelvFeeCd();
-			
-			if (!delvFeeCdList.contains(delvFeeCd)) {
-				int delvFee = 0;
-				
-				if ("true".equals(orderChange.getIsCustomer())) {
-					delvFee = "W".equals(wdGb) ? order.getExcDelvFee() : order.getRtnDelvFee();
+					// 4.4 주문변경 상세 단위로 데이타 등록 (ORD_DTL_NO)
+					Boolean temp = false;
+					if (cancelOrderDetailList.size() > 0) {
+						for (int j=0 ; j<cancelOrderDetailList.size() ; j++) {
+							if (cancelOrderRefundPo.getOrdDtlNo() == cancelOrderDetailList.get(j).getOrdDtlNo()) {
+								temp = true;
+							}
+						}
+					}
+
+					// 4.5 주문상세단위 데이타 저장(주문상세 단위)
+					if (!temp) {
+						cancelOrderDetailList.add(cancelOrderRefundPo);
+					}
 				}
-				
-				DeliveryFee deliveryFee = new DeliveryFee();
-				deliveryFee.setOrdNo(orderChange.getOrdNo());
-				deliveryFee.setDelvFeeGb(TscConstants.DeliveryFeeGb.EXCHANGE_DELIVERY_FEE.value());
-				deliveryFee.setDelvFeeCd(delvFeeCd);
-				deliveryFee.setDelvFee(delvFee);
-				deliveryFee.setRealDelvAmt(delvFee);
-				deliveryFee.setOrdChgSq(orderChange.getOrdChgSq());
-				deliveryFee.setSupplyCompCd(order.getSupplyCompCd());
-				
-				deliveryFeeList.add(deliveryFee);
-				totalDelvFee += delvFee;
 			}
-		}
-		
-		result.set("totalDelvFee", totalDelvFee);
-		result.set("deliveryFeeList", deliveryFeeList);
-		
-		return result;
-	}
 
-	/**
-	 * 교환철회
-	 * 
-	 * @param OrderChange
-	 * @return GagaMap
-	 * @author card007
-	 * @since 2021. 02. 01
-	 */
-	@Transactional("shopTxnManager")
-	public GagaMap exchangeCancel(OrderChange orderChange) {
-		GagaMap result = new GagaMap();
 
-		int ordNo = orderChange.getOrdNo();					// 주문번호
-		int ordChgSq = orderChange.getOrdChgSq();			// 주문변경번호
-		int regNo = orderChange.getRegNo();					// 등록자번호
-		int updNo = orderChange.getUpdNo();					// 수정자번호
+			// 2021.01.21 DELV_FEE 배송번호 단위로 TB_ORDER_CHANGE 생성
+			// 5. 주문변경정보, 주문정보, 환불정보 (업체코드 & 배송정책코드)
+			for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
+
+				Order obj = cancelDelvRefundList.get(i);
+
+				// 취소금액이 있을때 처리
+				if (obj.getCnclRtnAmt() > 0) {
+
+					// 5.1 주문변경 기본정보 등록 
+					OrderChange orderChange = new OrderChange();
+					orderChange.setOrdNo(ordNo);
+					orderChange.setChgGb(chgGb);
+					orderChange.setChgReason(chgReason);
+					orderChange.setChgMemo(chgMemo);
+					orderChange.setAddPayCost(0);
+					orderChange.setAddPayAmt(0);
+					orderChange.setRegNo(userNo);
+					orderChange.setUpdNo(userNo);
+
+					// 5.2 주문변경 추가정보 등록
+					String chgerNm 			= mav.getString("chgerNm");			// 변경자
+					String chgerPhnno 		= mav.getString("chgerPhnno");		// 변경핸드폰번호
+					String chgerTelno 		= mav.getString("chgerTelno");		// 변경전화번호
+					String chgerEmail 		= mav.getString("chgerEmail");		// 변경이메일
+
+					orderChange.setChgerNm(chgerNm);
+					orderChange.setChgerPhnno(chgerPhnno);
+					orderChange.setChgerTelno(chgerTelno);
+					orderChange.setChgerEmail(chgerEmail);
+					orderChange.setChgerRtnMemo("");
+
+					// 2021.01.26 취소완료, 취소신청 일때실행
+					if ("cnclComplete".equals(reqGbn) || "cnclReq".equals(reqGbn)) {
+						orderChangeDao.createOrderChange(orderChange);
+					}
 
-		// 추가배송비 조회
-		Order payment = orderChangeDao.getAddDeliveryFeePayment(orderChange);
+					// 5.3 주문상세단위 취소정보
+					for (int j=0 ; j<cancelOrderDetailList.size() ; j++) {
+						Order vo = cancelOrderRefundList.get(j);
+						vo.setRegNo(userNo);
+						vo.setUpdNo(userNo);
+						int leftQty = vo.getOrdQty() - vo.getCnclRtnQty() - vo.getOrdCanChgQty();
+
+						// 5.3.0 DEVL_FEE_CD 단위로 주문상세 정보 처리
+						if (obj.getDelvFeeCd().equals(vo.getDelvFeeCd())) {
+
+							// 2021.01.26 취소완료, 취소신청완료 일때실행
+							// 2020.01.05 추후 무통장입금전 전체 취소시 분기로직 추가 예정
+							if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
+								vo.setOrdDtlStat(ordDtlStat);
+							} else {
+								vo.setOrdDtlStat(TscConstants.OrderChangeStat.CANCEL.value()); 						// 취소신청
+							}
+
+							// 5.3.1 주문변경상세정보 이력등록
+							orderChangeDao.createOrderDetailHstCnclRtn(vo);
+
+							// 2021.01.26 취소완료, 취소신청완료 일때실행
+							// 5.3.2 주문변경상세정보 수정
+							if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
+								orderChangeDao.updateOrderDetail(vo);
+							}
+
+							// 5.3.3 사용포인트원복
+							int pntDcAmt = vo.getPntDcAmt();
+							vo.setOccurGb(TscConstants.PointOccurGb.USE_POINT.value());
+
+							for (Order point : orderChangeDao.getCustPointHst(vo)) {
+								while (pntDcAmt > 0) {
+									if (pntDcAmt < point.getPntAmt()) {
+										point.setPntAmt(pntDcAmt);
+										pntDcAmt -= pntDcAmt;
+									} else {
+										pntDcAmt -= point.getPntAmt();
+									}
+
+									point.setOccurGb(TscConstants.PointOccurGb.USE_POINT_CANCEL.value());
+									point.setOccurDtlDesc("포인트사용취소");
+									point.setRegNo(userNo);
+									point.setUpdNo(userNo);
+
+									// 포인트 사용 취소 이력 생성 및 포인트 수정
+									orderChangeDao.createCustPointHstRollback(point);
+									orderChangeDao.updateCustPointRollback(point);
+								}
+							}
+
+							// 5.3.4 적립예정포인트 수정
+							int savePntAmt = vo.getSavePntAmt();
+							vo.setOccurGb(TscConstants.PointOccurGb.EXPECT_POINT.value());
+
+							for (Order point : orderChangeDao.getCustPointHst(vo)) {
+								point.setOccurGb(TscConstants.PointOccurGb.EXPECT_POINT_CANCEL.value());
+								point.setOccurDtlDesc("예정포인트적립취소");
+								point.setPayAmt(savePntAmt * -1);
+								point.setRegNo(userNo);
+								point.setUpdNo(userNo);
+
+								// 적립예정포인트 취소 이력 생성
+								orderChangeDao.createCustPointHstRollback(point);
+							}
+
+							// 5.3.5 상품쿠폰원복
+							if (leftQty == 0) {
+								orderChangeDao.updateGoodsCpnRollback(vo);
+							}
+
+							// 5.3.6 사용상품권 원복
+							int gfcdUseAmt = vo.getGfcdUseAmt();
+
+							for (Order giftCard : orderChangeDao.getCustGiftCardHst(vo)) {
+								while (gfcdUseAmt > 0) {
+									if (gfcdUseAmt < giftCard.getGfcdAmt()) {
+										giftCard.setGfcdAmt(gfcdUseAmt);
+										gfcdUseAmt -= gfcdUseAmt;
+									} else {
+										gfcdUseAmt -= giftCard.getGfcdAmt();
+									}
+
+									giftCard.setOccurGb(TscConstants.GiftCardOccurGb.USE_GIFTCARD_CANCEL.value());
+									giftCard.setOccurDtlDesc("상품권사용취소");
+									giftCard.setRegNo(userNo);
+									giftCard.setUpdNo(userNo);
+
+									// 포인트 사용 취소 이력 생성 및 포인트 수정
+									orderChangeDao.createCustGiftCardHstRollback(giftCard);
+									orderChangeDao.updateCustGiftCardRollback(giftCard);
+								}
+							}
+
+							// * 주문상세단위가 아닌 주문상세단품단위로 데이타가 처리되고 있었음 주문상세단위로 수정
+							// 5.3 주문변경상세정보 등록
+							OrderChange changeDetailPo = new OrderChange();
+							changeDetailPo.setOrdChgSq(orderChange.getOrdChgSq());
+							changeDetailPo.setOrdDtlNo(vo.getOrdDtlNo());
+							changeDetailPo.setChgQty(vo.getOrdCanChgQty());
+							changeDetailPo.setRegNo(userNo);
+							changeDetailPo.setUpdNo(userNo);
+
+							// 2021.01.26 취소완료일때실행
+							if ("cnclComplete".equals(reqGbn)) {
+								changeDetailPo.setChgStat(chgStat);
+
+								orderChangeDao.createOrderChangeDetail(changeDetailPo);
+								orderChangeDao.createOrderChangeDetailHst(changeDetailPo);
+							}
+							// 2021.01.26 취소신청완료일때실행
+							else if ("cnclReqComplete".equals(reqGbn)) {
+								Order order = new Order();
+								order.setOrdNo(mav.getInt("ordNo"));
+								order.setOrdChgSq(mav.getInt("ordChgSq"));
+								order.setChgStat(chgStat);
+								order.setUpdNo(userNo);
+								order.setDelYn("N");
+
+								orderChangeDao.updateOrderChangeDtlCancel(order);
+								orderChangeDao.createOrderChangeDetailHst(changeDetailPo);
+							}
+							// 2021.01.26 취소신청일때실행
+							else {
+								changeDetailPo.setChgStat(TscConstants.OrderChangeStat.CANCEL.value()); 			// 취소신청
+								orderChangeDao.createOrderChangeDetail(changeDetailPo);
+							}
+						}
+					}
+
+					// 2021.01.26 취소완료, 취소신청완료 일때실행
+					// 5.31 상품재고원복 (TB_SELL_QTY 등록(취소,반품))
+					orderChange.setSellGb("11");
+					if ("cnclComplete".equals(reqGbn)) {
+						orderChangeDao.createSellQty(orderChange);
+					} else if ("cnclReqComplete".equals(reqGbn)) {
+						orderChange.setOrdNo(mav.getInt("ordNo"));
+						orderChange.setOrdChgSq(mav.getInt("ordChgSq"));
+						orderChangeDao.createSellQty(orderChange);
+					}
+
+					// 5.4 환불결제정보 등록 (업체별 & 배송정책별) 단위
+					// 취소, 반품 사유에 따른 추가배송비, 반품배송비를 환불금액에서 추가, 제외 할 수 있다.
+					//int spanRealCnclRtnAmt 		= obj.getCnclRtnAmt();		// 취소금액합계
+					// 2021.04.12 취소,반품 환불금액 계산 칼럼 오류 수정 jsh77b
+					int spanRealCnclRtnAmt 		= obj.getRealOrdAmt();		// 취소금액합계
+					int sumDeliveryFee 			= obj.getDelvFee();			// 배송비합계
+					int spanTotDeliveryFee 		= obj.getAddDelvFee();		// 추가배송비합계
+					int spanTotRtnDelvFee 		= obj.getRtnDelvFee();		// 반품배송비합계
+					int spanRefundAmt			= 0;
+
+					// 고객사유 : 환불금액계산 = (취소금액 + 배송비) - 추가배송비
+					if ("true".equals(isCustomer)) {
+						spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee) - spanTotDeliveryFee - spanTotRtnDelvFee;
+					}
+					// 회사사유 : 환불금액계산 = (취소금액 + 배송비)
+					else {
+						spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee);
+					}
+
+					Order paymentOrder = new Order();
+					paymentOrder.setOrdNo(ordNo);
+					paymentOrder.setPayAmt(spanRefundAmt * -1);
+					paymentOrder.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+					paymentOrder.setOrdChgSq(orderChange.getOrdChgSq());
+					paymentOrder.setRegNo(userNo);
+					paymentOrder.setUpdNo(userNo);
+
+					// 2021.01.26 취소완료, 취소신청완료 일때실행
+					if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
+						orderChangeDao.createPayment(paymentOrder);
+					}
+
+					// 5.5 환불금액 등록
+					Order refundOrder = new Order();
+					refundOrder.setOrdNo(ordNo);
+					refundOrder.setPaySq(paymentOrder.getPaySq());
+					refundOrder.setOrdChgSq(orderChange.getOrdChgSq());
+					refundOrder.setRegNo(userNo);
+
+					// 2021.01.25 TB_REFUND 정보 등록을 위해서 분리 작업
+					refundOrder.setRefundAmt(spanRefundAmt);
+					refundOrder.setRfCpn1Amt(obj.getCpn1DcAmt());
+					refundOrder.setRfTmtb1Amt(obj.getTmtb1DcAmt());
+					refundOrder.setRfTmtb2Amt(obj.getTmtb2DcAmt());
+					refundOrder.setRfGoodsCpnAmt(obj.getGoodsCpnDcAmt());
+					refundOrder.setRfCartCpnAmt(obj.getCartCpnDcAmt());
+					refundOrder.setRfPntAmt(obj.getPntAmt());
+					refundOrder.setRfPrePntAmt(obj.getPrePntDcAmt());
+					refundOrder.setRfGfcdUseAmt(obj.getGfcdUseAmt());
+
+					refundOrder.setRaNo(mav.get("accountNo").toString());
+					refundOrder.setRaNm(mav.get("accountNm").toString());
+					refundOrder.setRaBank(mav.get("bankCd").toString());
+
+					// 2021.01.26 취소완료, 취소신청 일때실행
+					if ("cnclComplete".equals(reqGbn) || "cnclReq".equals(reqGbn)) {
+						orderChangeDao.createRefund(refundOrder);
+					}
+
+					// 5.6 결제금액이 무료배송금액보다 작으면 배송비 신규 등록
+					if (obj.getAddDelvFee() > 0) {
+						Order delvFeeOrder = new Order();
+
+						delvFeeOrder.setPaySq(paymentOrder.getPaySq());
+						delvFeeOrder.setOrdNo(ordNo);
+						delvFeeOrder.setDelvFeeGb("G018_10");
+						delvFeeOrder.setDelvFeeCd(obj.getDelvFeeCd());
+						delvFeeOrder.setDelvFee(obj.getAddDelvFee());
+						delvFeeOrder.setRealDelvAmt(obj.getDelvFee());
+						delvFeeOrder.setOrdChgSq(orderChange.getOrdChgSq());
+						delvFeeOrder.setSupplyCompCd(obj.getSupplyCompCd());
+						delvFeeOrder.setRegNo(userNo);
+						delvFeeOrder.setUpdNo(userNo);
+
+						// 2021.01.26 취소완료, 취소신청완료일때실행
+						if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
+							orderChangeDao.createDeliveryFee(delvFeeOrder);
+						}
+					}
+
+					pgCancelAmt += spanRefundAmt;
+				}
+			}
+
+			// 마지막 취소 시
+			if ("Y".equals(allLastCanYn)) {
+				// 장바구니, 배송비 쿠폰 원복처리
+				Order coupon = new Order();
+				coupon.setOrdNo(ordNo);
+				coupon.setUpdNo(userNo);
+				orderChangeDao.updateCartCpnRollback(coupon);
+				orderChangeDao.updateDeliveryCpnRollback(coupon);
+
+				// 12. 사은품 전체 취소 (전체취소시 적용) 추후 사은품 관련 취소 로직 개발 예정
+				Order freegiftOrder = new Order();
+				freegiftOrder.setOrdNo(ordNo);
+				freegiftOrder.setUpdNo(userNo);
+				orderChangeDao.updateOrdFreegiftDel(freegiftOrder);
+			}
+
+
+
+			// 상품권으로만 결제 시 PG점프
+			if (!TscConstants.PgGb.ISTYLE.value().equals(pgGb)) {
+				if (TscConstants.PgGb.KCP.value().equals(pgGb) || TscConstants.PgGb.PAYCO.value().equals(pgGb)) {
+					Payment kcp = new Payment();
+					kcp.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+					kcp.setPayGb("O");
+					kcp.setModType("STSC");
+					kcp.setModDesc("가맹점 취소 - 전체 취소");
+					kcp.setIpAddress(ipAddress);
+					kcp.setPgTid(pgTid);
+					kcp.setPayAmt(pgCancelAmt);
+					kcp.setRegNo(userNo);
+					kcp.setUpdNo(userNo);
+					kcpService.kcpCancel(kcp);
+				} else if (TscConstants.PgGb.NAVER.value().equals(pgGb)) {
+					Payment naverPay = new Payment();
+					naverPay.setOrdNo(ordNo);
+					naverPay.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+					naverPay.setPayGb("O");
+					naverPay.setPayMeans(payMeans);
+					naverPay.setChgReasonNm(chgReason);
+					naverPay.setPgTid(pgTid);
+					naverPay.setPayAmt(pgCancelAmt);
+					naverPay.setRegNo(userNo);
+					naverPay.setUpdNo(userNo);
+
+					naverPayService.cancelNaverPayment(naverPay);
+				} else if (TscConstants.PgGb.KAKAO.value().equals(pgGb)) {
+					Payment kakaoPay = new Payment();
+					kakaoPay.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+					kakaoPay.setPayGb("O");
+					kakaoPay.setPgTid(pgTid);
+					kakaoPay.setPayAmt(pgCancelAmt);
+
+					kakaoPayService.cancelKakaoPayment(kakaoPay);
+				}
+			}
 
-		// 추가배송비 결제취소 처리
-		if (payment != null && payment.getPayAmt() > 0) {
-			payment.setOrdNo(ordNo);
-			payment.setOrdChgSq(ordChgSq);
-			payment.setPayAmt(payment.getPayAmt() * -1);
-			payment.setPayStat(TscConstants.PaymentStat.PAYMENT_WAIT.value());
-			payment.setPayGb(TscConstants.PaymentGb.DELIVERY.value());
-			payment.setRegNo(regNo);
-			payment.setUpdNo(updNo);
-			orderChangeDao.createAddDeliveryFeeCancelPayment(payment);
-			
 			// TODO
-			// PG취소처리
+			// 14. 취소 완료 알림톡 발송 에정
+
+			//int a = 100/0;
+
+
+			return mav;
 		}
 
-		// 교환철회 처리
-		Order exchangeCancel = new Order();
-		exchangeCancel.setOrdNo(ordNo);
-		exchangeCancel.setOrdChgSq(ordChgSq);
-		exchangeCancel.setOrdDtlStat(TscConstants.OrderDetailStat.EXCHANGE_CANCEL.value());
-		exchangeCancel.setChgStat(TscConstants.OrderChangeStat.EXCHANGE_CANCEL.value());
-		exchangeCancel.setDelYn("Y");
-		exchangeCancel.setRegNo(regNo);
-		exchangeCancel.setUpdNo(updNo);
+		/**
+		 * 반품신청 (ADMIN, FRONT, NPAY, EXTMALL) 
+		 * @param Order
+		 * @return Order
+		 * @author jsh77b
+		 * @since 2021. 01. 19
+		 */
+		@SuppressWarnings("unchecked")
+		@Transactional("shopTxnManager")
+		public GagaMap rtnReq(GagaMap mav, int userNo) {
+
+			// 1. 세션회원조회
+			//userNo = userNo;
+
+			// 2. 변경요정정보목록
+			List<Order> cancelReqList		 	= (List<Order>) mav.get("cnclRtnList");				// 변경요청 목록
+			List<Order> cancelOrderRefundList 	= (List<Order>) mav.get("cancelOrderRefundList");	// 변경환불금액 목록 (주문상세단품 단위)
+			List<Order> cancelDelvRefundList 	= (List<Order>) mav.get("cancelDelvRefundList");	// 변경환불배송금액 목록 (DELV_FEE_CD 단위)
+
+			// 3. 변경신청정보
+			int ordNo 			= Integer.parseInt(mav.getString("ordNo"));							// 주문번호
+			int ordChgSq		= Integer.parseInt(mav.getString("ordChgSq"));						// 주문변경번호
+			String chgReason 	= mav.getString("chgReason");										// 변경사유
+			String chgMemo 		= mav.getString("chgMemo");											// 변경메모
+			String allCanYn		= mav.getString("allCanYn");										// 무통장입금전 전체취소 여부
+			String isCustomer	= mav.getString("isCustomer");										// 귀책사유 (고객, 회사)
+			String chgGb		= TscConstants.OrderChangeGb.RETURN.value(); 						// 반품요청
+			String wdGb			= mav.getString("wdGb");											// 회수방법
+			String wdInvoiceNo	= mav.getString("wdInvoiceNo");										// 회수송장번호
+
+			// 4. 주문상세단품정보등록,변경 (단품단위)
+			List<Order> cancelOrderDetailList = new ArrayList<>();
+
+			for (int i=0 ; i<cancelOrderRefundList.size() ; i++) {
+				Order cancelOrderRefundPo = cancelOrderRefundList.get(i);
+				cancelOrderRefundPo.setRegNo(userNo);
+				cancelOrderRefundPo.setUpdNo(userNo);
+
+				// 4.1 취소수량이 존재하면 주문상세단품정보 수정 및 주문상세단품이력정보 등록
+				if (cancelOrderRefundPo.getOrdCanChgQty() > 0) {
+					// 4.4 주문변경 상세 단위로 데이타 등록 (ORD_DTL_NO)
+					Boolean temp = false;
+					if (cancelOrderDetailList.size() > 0) {
+						for (int j=0 ; j<cancelOrderDetailList.size() ; j++) {
+							if (cancelOrderRefundPo.getOrdDtlNo() == cancelOrderDetailList.get(j).getOrdDtlNo()) {
+								temp = true;
+							}
+						}
+					}
 
-		// TB_ORDER_DETAIL 상태값 변경
-		orderChangeDao.updateOrderDetailForExchangeCancel(exchangeCancel);
+					// 4.5 주문상세단위 데이타 저장(주문상세 단위)
+					if (!temp) {
+						cancelOrderDetailList.add(cancelOrderRefundPo);
+					}
+				}
+			}
 
-		// TB_ORDER_DETAIL_HST 생성
-		orderChangeDao.createOrderDtlHstCancel(exchangeCancel);
+			// 2021.01.21 DELV_FEE 배송번호 단위로 TB_ORDER_CHANGE 생성
+			// 4. 주문변경정보, 주문정보, 환불정보 (업체코드 & 배송정책코드)
+			for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
+
+				Order obj = cancelDelvRefundList.get(i);
+
+				// 취소금액이 있을때 처리
+				if (obj.getCnclRtnAmt() > 0) {
+
+					// 5.1 주문변경 기본정보 등록 
+					OrderChange orderChange = new OrderChange();
+					orderChange.setOrdNo(ordNo);
+					orderChange.setChgGb(chgGb);
+					orderChange.setChgReason(chgReason);
+					orderChange.setChgMemo(chgMemo);
+					orderChange.setAddPayCost(0);
+					orderChange.setAddPayAmt(0);
+					orderChange.setWdGb(wdGb);
+					orderChange.setWdInvoiceNo(wdInvoiceNo);
+					orderChange.setRegNo(userNo);
+					orderChange.setUpdNo(userNo);
+
+					// 5.2 주문변경 추가정보 등록
+					String chgerNm 			= mav.getString("chgerNm");						// 변경자
+					String chgerPhnno 		= mav.getString("chgerPhnno");					// 변경핸드폰번호
+					String chgerTelno 		= mav.getString("chgerTelno");					// 변경전화번호
+					String chgerEmail 		= mav.getString("chgerEmail");					// 변경이메일
+					String chgerZipcode 	= mav.getString("chgerZipcode");				// 변경우편번호
+					String chgerBaseAddr 	= mav.getString("chgerBaseAddr");				// 변경기본주소
+					String chgerDtlAddr 	= mav.getString("chgerDtlAddr");				// 변경상세주소
+					String chgerRtnMemo		= mav.getString("chgerRtnMemo");				// 반품메모
+
+					orderChange.setChgerNm(chgerNm);
+					orderChange.setChgerPhnno(chgerPhnno);
+					orderChange.setChgerTelno(chgerTelno);
+					orderChange.setChgerEmail(chgerEmail);
+					orderChange.setChgerRtnMemo(chgerRtnMemo);
+					orderChange.setChgerZipcode(chgerZipcode);
+					orderChange.setChgerBaseAddr(chgerBaseAddr);
+					orderChange.setChgerDtlAddr(chgerDtlAddr);
 
-		// TB_ORDER_DETAIL_ITEM 상태값 변경
-		orderChangeDao.updateOrderDetailItemForExchangeCancel(exchangeCancel);
+					orderChangeDao.createOrderChange(orderChange);
 
-		// TB_ORDER_DETAIL_ITEM_HST 생성
-		orderChangeDao.createOrderDetailItemHstForExchangeCancel(exchangeCancel);
+					// 5.3 주문상세단위 취소정보
+					for (int j=0 ; j<cancelOrderDetailList.size() ; j++) {
+						Order vo = cancelOrderRefundList.get(j);
+						vo.setRegNo(userNo);
+						vo.setUpdNo(userNo);
+						vo.setOrdDtlStat(TscConstants.OrderChangeStat.RETURN.value()); 					// 반품신청
 
-		// TB_ORDER_CHANGE_DETAIL 상태값 변경 및 DEL_YN Y로 업데이트
-		orderChangeDao.updateOrderChangeDtlCancel(exchangeCancel);
+						// 5.3.0 DEVL_FEE_CD 단위로 주문상세 정보 처리
+						if (obj.getDelvFeeCd().equals(vo.getDelvFeeCd())) {
 
-		// 결과값 처리
-		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+							// 5.3.1 주문변경상세정보 이력등록
+							orderChangeDao.createOrderDetailHstCnclRtn(vo);
 
-		return result;
-	}
+							// * 주문상세단위가 아닌 주문상세단품단위로 데이타가 처리되고 있었음 주문상세단위로 수정
+							// 5.3 주문변경상세정보 등록
+							OrderChange changeDetailPo = new OrderChange();
+							changeDetailPo.setOrdChgSq(orderChange.getOrdChgSq());
+							changeDetailPo.setOrdDtlNo(vo.getOrdDtlNo());
+							changeDetailPo.setChgQty(vo.getOrdCanChgQty());
+							changeDetailPo.setChgStat(TscConstants.OrderChangeStat.RETURN.value()); 	// 반품신청
+							changeDetailPo.setRegNo(userNo);
+							changeDetailPo.setUpdNo(userNo);
 
-	/**
-	 * 교환회수
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2021. 01. 19
-	 */
-	public GagaMap exchRtn(List<Order> cnclRtnList) {
-		GagaMap mav = new GagaMap();
-		
-		
-		return mav;
-	}
-	
-	/**
-	 * 교환발송완료
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2021. 01. 19
-	 */
-	public GagaMap exchComplete(List<Order> cnclRtnList) {
-		GagaMap mav = new GagaMap();
-		
-		
-		return mav;
-	}
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	/**
-	 * 취소신청 (admin, npay, extmall) (사용안함)
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2021. 01. 19
-	 */
-	@SuppressWarnings("unchecked")
-	@Transactional("shopTxnManager")
-	public GagaMap cnclReq(GagaMap mav, int userNo) {
-		
-		// 1. 세션회원조회
-		//userNo = userNo;
-		
-		// 2. 변경요정정보목록
-		List<Order> cancelReqList		 	= (List<Order>) mav.get("cnclRtnList");				// 변경요청 목록
-		List<Order> cancelOrderRefundList 	= (List<Order>) mav.get("cancelOrderRefundList");	// 변경환불금액 목록 (주문상세단품 단위)
-		List<Order> cancelDelvRefundList 	= (List<Order>) mav.get("cancelDelvRefundList");	// 변경환불배송금액 목록 (DELV_FEE_CD 단위)
-				
-		// 3. 변경신청정보
-		int ordNo 			= Integer.parseInt(mav.getString("ordNo").toString());				// 주문번호
-		String chgReason 	= mav.getString("chgReason").toString();							// 변경사유
-		String chgMemo 		= mav.getString("chgMemo").toString();								// 변경메모
-		String allCanYn		= mav.getString("allCanYn").toString();								// 무통장입금전 전체취소 여부
-		String isCustomer	= mav.getString("isCustomer").toString();							// 귀책사유 (고객, 회사)
-		String chgGb		= TscConstants.OrderChangeGb.CANCEL.value(); 						// 취소요청
-		String reqGbn		= mav.get("reqGbn").toString();										// 신청구분
-		
-		// 4. 주문상세단품정보등록,변경 (단품단위)
-		List<Order> cancelOrderDetailList = new ArrayList<Order>();
-		
-		for (int i=0 ; i<cancelOrderRefundList.size() ; i++) {
-			Order cancelOrderRefundPo = cancelOrderRefundList.get(i);
-			cancelOrderRefundPo.setRegNo(userNo);
-			cancelOrderRefundPo.setUpdNo(userNo);
-
-			// 4.1 취소수량이 존재하면 주문상세단품정보 수정 및 주문상세단품이력정보 등록
-			if (cancelOrderRefundPo.getOrdCanChgQty() > 0) {				
-				// 4.4 주문변경 상세 단위로 데이타 등록 (ORD_DTL_NO)
-				Boolean temp = false;
-				if (cancelOrderDetailList.size() > 0) {
-					for (int j=0 ; j<cancelOrderDetailList.size() ; j++) {
-						if (cancelOrderRefundPo.getOrdDtlNo() == cancelOrderDetailList.get(j).getOrdDtlNo()) {
-							temp = true;
+							orderChangeDao.createOrderChangeDetail(changeDetailPo);
 						}
 					}
-				}
-				
-				// 4.5 주문상세단위 데이타 저장(주문상세 단위)
-				if (!temp) {
-					cancelOrderDetailList.add(cancelOrderRefundPo);
+
+					// 5.4 환불결제정보 등록 (업체별 & 배송정책별) 단위
+					// 취소, 반품 사유에 따른 추가배송비, 반품배송비를 환불금액에서 추가, 제외 할 수 있다.
+					int spanRealCnclRtnAmt 		= obj.getCnclRtnAmt();		// 취소금액합계
+					int sumDeliveryFee 			= obj.getDelvFee();			// 배송비합계
+					int spanTotDeliveryFee 		= obj.getAddDelvFee();		// 추가배송비합계
+					int spanTotRtnDelvFee 		= obj.getRtnDelvFee();		// 반품배송비합계
+					int spanRefundAmt			= 0;
+
+					// 고객사유 : 환불금액계산 = (취소금액 + 배송비) - 추가배송비
+					if ("true".equals(isCustomer)) {
+						spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee) - spanTotDeliveryFee - spanTotRtnDelvFee;
+					}
+					// 회사사유 : 환불금액계산 = (취소금액 + 배송비)
+					else {
+						spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee);
+					}
+
+					// 5.4 환불금액 등록
+					Order refundOrder = new Order();
+					refundOrder.setOrdNo(ordNo);
+					refundOrder.setPaySq(0);
+					refundOrder.setOrdChgSq(orderChange.getOrdChgSq());
+					refundOrder.setRegNo(userNo);
+
+					// 2021.01.25 TB_REFUND 정보 등록을 위해서 분리 작업
+					refundOrder.setRefundAmt(spanRefundAmt);
+					refundOrder.setRfCpn1Amt(obj.getCpn1DcAmt());
+					refundOrder.setRfTmtb1Amt(obj.getTmtb1DcAmt());
+					refundOrder.setRfTmtb2Amt(obj.getTmtb2DcAmt());
+					refundOrder.setRfGoodsCpnAmt(obj.getGoodsCpnDcAmt());
+					refundOrder.setRfCartCpnAmt(obj.getCartCpnDcAmt());
+					refundOrder.setRfPntAmt(obj.getPntAmt());
+					refundOrder.setRfPrePntAmt(obj.getPrePntDcAmt());
+					refundOrder.setRfGfcdUseAmt(obj.getGfcdUseAmt());
+
+					refundOrder.setRaNo(mav.get("accountNo").toString());
+					refundOrder.setRaNm(mav.get("accountNm").toString());
+					refundOrder.setRaBank(mav.get("bankCd").toString());
+
+					orderChangeDao.createRefund(refundOrder);
 				}
 			}
+
+			return mav;
 		}
-		
-		// 2021.01.21 DELV_FEE 배송번호 단위로 TB_ORDER_CHANGE 생성
-		// 4. 주문변경정보, 주문정보, 환불정보 (업체코드 & 배송정책코드)
-		for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
-			
-			Order obj = cancelDelvRefundList.get(i);
-			
-			// 취소금액이 있을때 처리
-			if (obj.getCnclRtnAmt() > 0) {
-			
-				// 5.1 주문변경 기본정보 등록 
-				OrderChange orderChange = new OrderChange();
-				orderChange.setOrdNo(ordNo);
-				orderChange.setChgGb(chgGb);
-				orderChange.setChgReason(chgReason);
-				orderChange.setChgMemo(chgMemo);
-				orderChange.setAddPayCost(0);
-				orderChange.setAddPayAmt(0);
-				orderChange.setRegNo(userNo);
-				orderChange.setUpdNo(userNo);
-				
-				// 5.2 주문변경 추가정보 등록
-				String chgerNm 			= mav.getString("chgerNm").toString();		// 변경자
-				String chgerPhnno 		= mav.getString("chgerPhnno").toString();	// 변경핸드폰번호
-				String chgerTelno 		= mav.getString("chgerTelno").toString();	// 변경전화번호
-				String chgerEmail 		= mav.getString("chgerEmail").toString();	// 변경이메일
-				
-				orderChange.setChgerNm(chgerNm);
-				orderChange.setChgerPhnno(chgerPhnno);
-				orderChange.setChgerTelno(chgerTelno);
-				orderChange.setChgerEmail(chgerEmail);
-				orderChange.setChgerRtnMemo("");
-				
-				orderChangeDao.createOrderChange(orderChange);
-				
-				// 5.3 주문상세단위 취소정보
-				for (int j=0 ; j<cancelOrderDetailList.size() ; j++) {
-					Order vo = cancelOrderRefundList.get(j);
-					vo.setRegNo(userNo);
-					vo.setUpdNo(userNo);
-					vo.setOrdDtlStat(TscConstants.OrderChangeStat.CANCEL.value()); 					// 취소신청
-					
-					// 5.3.0 DEVL_FEE_CD 단위로 주문상세 정보 처리
-					if (obj.getDelvFeeCd().equals(vo.getDelvFeeCd())) {
-						
-						// 5.3.1 주문변경상세정보 이력등록
-						orderChangeDao.createOrderDetailHstCnclRtn(vo);
-						
-						// * 주문상세단위가 아닌 주문상세단품단위로 데이타가 처리되고 있었음 주문상세단위로 수정
-						// 5.3 주문변경상세정보 등록
-						OrderChange changeDetailPo = new OrderChange();
-						changeDetailPo.setOrdChgSq(orderChange.getOrdChgSq());
-						changeDetailPo.setOrdDtlNo(vo.getOrdDtlNo());
-						changeDetailPo.setChgQty(vo.getOrdCanChgQty());
-						changeDetailPo.setChgStat(TscConstants.OrderChangeStat.CANCEL.value()); 	// 취소신청
-						changeDetailPo.setRegNo(userNo);
-						changeDetailPo.setUpdNo(userNo);
-						
-						orderChangeDao.createOrderChangeDetail(changeDetailPo);
+
+		/**
+		 * 반품신청철회 (admin)
+		 * @param Order
+		 * @return Order
+		 * @author jsh77b
+		 * @since 2021. 01. 19
+		 */
+		@Transactional("shopTxnManager")
+		public GagaMap rtnReqCancel(GagaMap mav, int userNo) {
+
+			Order order = new Order();
+			order.setOrdNo(mav.getInt("ordNo"));
+			order.setOrdChgSq(mav.getInt("ordChgSq"));
+			order.setChgStat(TscConstants.OrderChangeStat.RETURN_CANCEL.value());
+			order.setRegNo(userNo);
+			order.setUpdNo(userNo);
+			order.setDelYn("Y");
+
+			// 1. 주문변경정보 (TB_ORDER_CHANGE_DTL(수정))
+			orderChangeDao.updateOrderChangeDtlCancel(order);
+
+			// 2. 주문정보 이력 등록 (TB_ORDER_DETAIL_HST(등록))
+			orderChangeDao.createOrderDtlHstCancel(order);
+
+			// TODO
+			// 3. PG 실행 (취소시 추가결제금액 취소처리)
+
+			return mav;
+		}
+
+		/**
+		 * 반품완료
+		 * @param Order
+		 * @return Order
+		 * @author jsh77b
+		 * @since 2021. 01. 19
+		 */
+		public GagaMap rtnComplete(List<Order> cnclRtnList) {
+			GagaMap mav = new GagaMap();
+
+
+			return mav;
+		}
+
+		/**
+		 * 교환신청
+		 *
+		 * @param Order
+		 * @return Order
+		 * @author jsh77b
+		 * @since 2021. 01. 19
+		 */
+		@Transactional("shopTxnManager")
+		public GagaMap exchReq(OrderChange excReq) {
+			GagaMap result = new GagaMap();
+			result.set("status", GagaResponseStatus.FAIL.getCode());
+
+			// 교환 기본 정보
+			int addPayCost = excReq.getAddPayCost();			// 추가배송비
+			String wdGb = excReq.getWdGb();						// 회수구분
+			String wdInvoiceNo = excReq.getWdInvoiceNo();		// 회수송장번호
+			Integer regNo = excReq.getRegNo();					// 등록자번호
+			Integer updNo = excReq.getUpdNo();					// 수정자번호
+
+			// 교환신청 목록 설정
+			Collection<Order> excReqList = excReq.getCancelReqList();
+
+			// 추가배송비 관련 상태값 설정
+			String orderChangeStat = TscConstants.OrderChangeStat.EXCHANGE.value();
+			String ordDtlStat = TscConstants.OrderDetailStat.REFUND_CONFIRM_WAIT.value();
+
+			if (addPayCost > 0) { // 프론트 결제 여부 체크 필요
+				orderChangeStat = TscConstants.OrderChangeStat.EXCHANGE_WAIT.value();
+				ordDtlStat = TscConstants.OrderDetailStat.PAYMENT_WAIT.value();
+			}
+
+			// 1. 재고 체크 (세트아이템 포함)
+
+
+			// 2. TB_DELIVERY_ADDR 등록
+			Order deliveryAddr = new Order();
+			deliveryAddr.setRecipNm(excReq.getRecipNm());
+			deliveryAddr.setRecipPhnno(excReq.getRecipPhnno());
+			deliveryAddr.setRecipTelno(excReq.getRecipTelno());
+			deliveryAddr.setRecipZipcode(excReq.getRecipZipcode());
+			deliveryAddr.setRecipBaseAddr(excReq.getRecipBaseAddr());
+			deliveryAddr.setRecipDtlAddr(excReq.getRecipDtlAddr());
+			deliveryAddr.setDelvMemo(excReq.getDelvMemo());
+			deliveryAddr.setRegNo(regNo);
+			deliveryAddr.setUpdNo(updNo);
+
+			orderChangeDao.createDeliveryAddr(deliveryAddr);
+
+			// 생성된 delvAddrSq 등록
+			int delvAddrSq = deliveryAddr.getDelvAddrSq();
+
+			// 교환대상 정보 등록
+			int preOrdDtlNo = 0;
+			String preDelvFeeCd = "";
+			int ordChgSq = 0;
+			int exchangeOrdDtlNo = 0;
+
+			for (Order order : excReqList) {
+				String delvFeeCd = order.getDelvFeeCd();
+				int chgQty = order.getChgQty();
+				String ordChgOpt = order.getOrdChgOpt();
+				int ordDtlNo = order.getOrdDtlNo();
+
+				if (!preDelvFeeCd.equals(delvFeeCd)) {
+					// 3. TB_ORDER_CHANGE 등록
+					OrderChange orderChange = new OrderChange();
+					orderChange.setChgGb(TscConstants.OrderChangeGb.EXCHANGE.value());
+					orderChange.setChgReason(excReq.getChgReason());
+					orderChange.setChgMemo(excReq.getChgMemo());
+					orderChange.setWdGb(wdGb);
+					orderChange.setWdInvoiceNo(wdInvoiceNo);
+					orderChange.setChgerNm(excReq.getChgerNm());
+					orderChange.setChgerPhnno(excReq.getChgerPhnno());
+					orderChange.setChgerTelno(excReq.getChgerTelno());
+					orderChange.setChgerEmail(excReq.getChgerEmail());
+					orderChange.setChgerZipcode(excReq.getChgerZipcode());
+					orderChange.setChgerBaseAddr(excReq.getChgerBaseAddr());
+					orderChange.setChgerDtlAddr(excReq.getChgerDtlAddr());
+					orderChange.setChgerRtnMemo(excReq.getChgerRtnMemo());
+					orderChange.setAddPayCost(addPayCost);
+					orderChange.setAddPayAmt(excReq.getAddPayAmt());
+					orderChange.setRegNo(regNo);
+					orderChange.setUpdNo(updNo);
+
+					orderChangeDao.createOrderChange(orderChange);
+
+					preDelvFeeCd = delvFeeCd;
+
+					// 생성된 ordChgSq 설정
+					ordChgSq = orderChange.getOrdChgSq();
+
+					log.info("############# ordChgSq >>> {} ##############", ordChgSq);
+
+					// 4. TB_DELIVERY_FEE 추가배송비 등록
+					int delvFee = 0;
+
+					if ("true".equals(excReq.getIsCustomer())) {
+						delvFee = "W".equals(wdGb) ? order.getExcDelvFee() : order.getRtnDelvFee();
 					}
+
+					Order deliveryFee = new Order();
+					deliveryFee.setOrdNo(excReq.getOrdNo());
+					deliveryFee.setDelvFeeGb(TscConstants.DeliveryFeeGb.EXCHANGE_DELIVERY_FEE.value());
+					deliveryFee.setDelvFeeCd(delvFeeCd);
+					deliveryFee.setDelvFee(delvFee);
+					deliveryFee.setRealDelvAmt(delvFee);
+					deliveryFee.setOrdChgSq(ordChgSq);
+					deliveryFee.setSupplyCompCd(order.getSupplyCompCd());
+					deliveryFee.setRegNo(regNo);
+					deliveryFee.setUpdNo(updNo);
+
+					orderChangeDao.createDeliveryFee(deliveryFee);
+
+					// TODO
+					// 추가배송비 결제 여부 확인 후 TB_PAYMENT 생성
 				}
-				// 5.4 환불결제정보 등록 (업체별 & 배송정책별) 단위
-				// 취소, 반품 사유에 따른 추가배송비, 반품배송비를 환불금액에서 추가, 제외 할 수 있다.
-				int spanRealCnclRtnAmt 		= obj.getCnclRtnAmt();		// 취소금액합계
-				int sumDeliveryFee 			= obj.getDelvFee();			// 배송비합계
-				int spanTotDeliveryFee 		= obj.getAddDelvFee();		// 추가배송비합계
-				int spanTotRtnDelvFee 		= obj.getRtnDelvFee();		// 반품배송비합계
-				int spanRefundAmt			= 0;
-
-				// 고객사유 : 환불금액계산 = (취소금액 + 배송비) - 추가배송비
-				if ("true".equals(isCustomer)) {
-					spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee) - spanTotDeliveryFee - spanTotRtnDelvFee;
+
+				if (preOrdDtlNo != ordDtlNo) {
+					// 5. TB_ORDER_DETAIL 등록
+					Order ordDtl = new Order();
+					ordDtl.setOrdDtlNo(ordDtlNo);
+					ordDtl.setOrdDtlStat(ordDtlStat);
+					ordDtl.setOptCd2(ordChgOpt);
+					ordDtl.setChgQty(chgQty);
+					ordDtl.setDelvAddrSq(delvAddrSq);
+					ordDtl.setRegNo(regNo);
+					ordDtl.setUpdNo(updNo);
+
+					orderChangeDao.createOrderDetailForExchange(ordDtl);
+
+					// 생성된 ordDtlNo 설정
+					exchangeOrdDtlNo = ordDtl.getExchangeOrdDtlNo();
+
+					log.info("############# exchangeOrdDtlNo >>> {} ##############", exchangeOrdDtlNo);
+
+					// 6. TB_ORDER_DETAIL_HST 등록
+					orderChangeDao.createOrderDetailHstForExchange(ordDtl);
+
+					// 7. TB_ORDER_CHANGE_DETAIL 등록
+					OrderChange orderChangeDetail = new OrderChange();
+					orderChangeDetail.setOrdChgSq(ordChgSq);
+					orderChangeDetail.setOrdDtlNo(ordDtlNo);
+					orderChangeDetail.setChgQty(chgQty);
+					orderChangeDetail.setChgStat(orderChangeStat);
+					orderChangeDetail.setChgOrdDtlNo(exchangeOrdDtlNo);
+					orderChangeDetail.setRegNo(regNo);
+					orderChangeDetail.setUpdNo(updNo);
+
+					orderChangeDao.createOrderChangeDetail(orderChangeDetail);
+
+					preOrdDtlNo = ordDtlNo;
 				}
-				// 회사사유 : 환불금액계산 = (취소금액 + 배송비)
-				else {
-					spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee);
+
+				// 8. TB_ORDER_DETAIL_ITEM 등록
+				Order ordDtlItem = new Order();
+				ordDtlItem.setOrdDtlItemSq(order.getOrdDtlItemSq());
+				ordDtlItem.setOrdDtlNo(exchangeOrdDtlNo);
+				ordDtlItem.setOrdDtlStat(ordDtlStat);
+				ordDtlItem.setOrdChgOpt(ordChgOpt);
+				ordDtlItem.setRegNo(regNo);
+				ordDtlItem.setUpdNo(updNo);
+
+				orderChangeDao.createOrderDetailItemForExchange(ordDtlItem);
+
+				// 9. TB_ORDER_DETAIL_ITEM_HST 등록
+				orderChangeDao.createOrderDetailItemHstForExchange(ordDtlItem);
+			}
+
+			// 10. TB_SELL_QTY 등록
+			OrderChange sellQty = new OrderChange();
+			sellQty.setSellGb(TscConstants.SellGb.EXCHANGE.value());
+			sellQty.setRegNo(regNo);
+			sellQty.setOrdChgSq(ordChgSq);
+
+			orderChangeDao.createSellQtyForExchange(sellQty);
+
+			result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+			return result;
+		}
+
+		/**
+		 * 교환 추가배송비 조회
+		 *
+		 * @param Collection<Order>
+		 * @return Collection<DeliveryFee>
+		 * @author card007
+		 * @since 2021. 01. 26
+		 */
+		public GagaMap getAddDeliveryFeeListForExchange(OrderChange orderChange) {
+			GagaMap result = new GagaMap();
+			Collection<DeliveryFee> deliveryFeeList = new ArrayList<>();
+			List<String> delvFeeCdList = new ArrayList<>();
+			int totalDelvFee = 0;
+
+			String wdGb = orderChange.getWdGb();
+			Collection<Order> excReqList = orderChange.getCancelReqList();
+
+			for (Order order : excReqList) {
+				String delvFeeCd = order.getDelvFeeCd();
+
+				if (!delvFeeCdList.contains(delvFeeCd)) {
+					int delvFee = 0;
+
+					if ("true".equals(orderChange.getIsCustomer())) {
+						delvFee = "W".equals(wdGb) ? order.getExcDelvFee() : order.getRtnDelvFee();
+					}
+
+					DeliveryFee deliveryFee = new DeliveryFee();
+					deliveryFee.setOrdNo(orderChange.getOrdNo());
+					deliveryFee.setDelvFeeGb(TscConstants.DeliveryFeeGb.EXCHANGE_DELIVERY_FEE.value());
+					deliveryFee.setDelvFeeCd(delvFeeCd);
+					deliveryFee.setDelvFee(delvFee);
+					deliveryFee.setRealDelvAmt(delvFee);
+					deliveryFee.setOrdChgSq(orderChange.getOrdChgSq());
+					deliveryFee.setSupplyCompCd(order.getSupplyCompCd());
+
+					deliveryFeeList.add(deliveryFee);
+					totalDelvFee += delvFee;
 				}
-				
-				// 5.4 환불금액 등록
-				Order refundOrder = new Order();
-				refundOrder.setOrdNo(ordNo);
-				refundOrder.setPaySq(0);
-				refundOrder.setOrdChgSq(orderChange.getOrdChgSq());
-				refundOrder.setRegNo(userNo);
-				
-				// 2021.01.25 TB_REFUND 정보 등록을 위해서 분리 작업
-				refundOrder.setRefundAmt(spanRefundAmt);
-				refundOrder.setRfCpn1Amt(obj.getCpn1DcAmt());
-				refundOrder.setRfTmtb1Amt(obj.getTmtb1DcAmt());
-				refundOrder.setRfTmtb2Amt(obj.getTmtb2DcAmt());
-				refundOrder.setRfGoodsCpnAmt(obj.getGoodsCpnDcAmt());
-				refundOrder.setRfCartCpnAmt(obj.getCartCpnDcAmt());
-				refundOrder.setRfPntAmt(obj.getPntAmt());
-				refundOrder.setRfPrePntAmt(obj.getPrePntDcAmt());
-				refundOrder.setRfGfcdUseAmt(obj.getGfcdUseAmt());
-				
-				refundOrder.setRaNo(mav.get("accountNo").toString());
-				refundOrder.setRaNm(mav.get("accountNm").toString());
-				refundOrder.setRaBank(mav.get("bankCd").toString());
-				
-				orderChangeDao.createRefund(refundOrder);
 			}
+
+			result.set("totalDelvFee", totalDelvFee);
+			result.set("deliveryFeeList", deliveryFeeList);
+
+			return result;
 		}
-		
-		return mav;
-	}
-	
-	
-	/**
-	 * 취소신청승인 (admin) (사용안함)
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2021. 01. 19
-	 */
-	@Transactional("shopTxnManager")
-	public GagaMap cnclcnclComplete(GagaMap mav, int userNo) {
-		
-		// 1. 환불금액계산
-		
-		// 2. 사용포인트원복 (TB_CUST_POINT(수정), TB_CUST_POINT_HST(등록))
-		
-		// 3. 사용쿠폰원복 (TB_CUST_COUPON(수정))
-		
-		// 4. 상품권금액원복 (TB_CUST_GIFTCARD(수정), TB_CUST_GIFTCARD_HST(등록))
-		
-		// 5. 사은품취소 (TB_ORD_FREEGIFT(수정), TB_ORD_FREEGIFT(등록), TB_ORD_FREEGIFT_VAL(수정))
-		
-		// 6. 주문정보 수정 (TB_ORDER_DETAIL(수정), TB_ORDER_DETAIL_HST(등록), TB_ORDER_DETAIL_ITEM(수정), TB_ORDER_DETAIL_ITEM_HST(등록))
-		
-		// 7. 재고정보 (TB_SELL_QTY(등록))
-		
-		// 8. 주문변경정보 (TB_ORDER_CHANGE(수정), TB_ORDER_CHANGE_DTL(수정), TB_REFUND(수정))
-		
-		// PG 결제 금액 체크
-		// 9. PG 실행
-		
-		// 10. 결제정보 (TB_PAYMENT(등록))
-		
-		// 11. 추가배송비발생 (TB_PAYMENT(등록))
-		
-		return mav;
-	}
 
-	/**
-	 * 주문 환불계좌
-	 *
-	 * @param order - 주문정보
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2021. 01. 04.
-	 */
-	public Collection<Order> getRefundAccount(Order order) {
-		return orderChangeDao.getRefundAccount(order);
-	}
+		/**
+		 * 교환철회
+		 *
+		 * @param OrderChange
+		 * @return GagaMap
+		 * @author card007
+		 * @since 2021. 02. 01
+		 */
+		@Transactional("shopTxnManager")
+		public GagaMap exchangeCancel(OrderChange orderChange) {
+			GagaMap result = new GagaMap();
+
+			int ordNo = orderChange.getOrdNo();					// 주문번호
+			int ordChgSq = orderChange.getOrdChgSq();			// 주문변경번호
+			int regNo = orderChange.getRegNo();					// 등록자번호
+			int updNo = orderChange.getUpdNo();					// 수정자번호
+
+			// 추가배송비 조회
+			Order payment = orderChangeDao.getAddDeliveryFeePayment(orderChange);
+
+			// 추가배송비 결제취소 처리
+			if (payment != null && payment.getPayAmt() > 0) {
+				payment.setOrdNo(ordNo);
+				payment.setOrdChgSq(ordChgSq);
+				payment.setPayAmt(payment.getPayAmt() * -1);
+				payment.setPayStat(TscConstants.PaymentStat.PAYMENT_WAIT.value());
+				payment.setPayGb(TscConstants.PaymentGb.DELIVERY.value());
+				payment.setRegNo(regNo);
+				payment.setUpdNo(updNo);
+				orderChangeDao.createAddDeliveryFeeCancelPayment(payment);
 
-	/**
-	 * 환불계좌 저장
-	 *
-	 * @param order - 주문정보
-	 * @return TsaOrder
-	 * @author jsh77b
-	 * @since 2021. 01. 05.
-	 */
-	public int saveRefundAccount(Order order) {
+				// TODO
+				// PG취소처리
+			}
+
+			// 교환철회 처리
+			Order exchangeCancel = new Order();
+			exchangeCancel.setOrdNo(ordNo);
+			exchangeCancel.setOrdChgSq(ordChgSq);
+			exchangeCancel.setOrdDtlStat(TscConstants.OrderDetailStat.EXCHANGE_CANCEL.value());
+			exchangeCancel.setChgStat(TscConstants.OrderChangeStat.EXCHANGE_CANCEL.value());
+			exchangeCancel.setDelYn("Y");
+			exchangeCancel.setRegNo(regNo);
+			exchangeCancel.setUpdNo(updNo);
+
+			// TB_ORDER_DETAIL 상태값 변경
+			orderChangeDao.updateOrderDetailForExchangeCancel(exchangeCancel);
+
+			// TB_ORDER_DETAIL_HST 생성
+			orderChangeDao.createOrderDtlHstCancel(exchangeCancel);
+
+			// TB_ORDER_DETAIL_ITEM 상태값 변경
+			orderChangeDao.updateOrderDetailItemForExchangeCancel(exchangeCancel);
+
+			// TB_ORDER_DETAIL_ITEM_HST 생성
+			orderChangeDao.createOrderDetailItemHstForExchangeCancel(exchangeCancel);
 
-		// 환불계좌 유무 체크 후 등록
-		if (orderChangeDao.getRefundAccountCheck(order) < 1) {
-			orderChangeDao.saveRefundAccount(order);
+			// TB_ORDER_CHANGE_DETAIL 상태값 변경 및 DEL_YN Y로 업데이트
+			orderChangeDao.updateOrderChangeDtlCancel(exchangeCancel);
+
+			// 결과값 처리
+			result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+			return result;
 		}
 
-		return 1;
-	}
+		/**
+		 * 교환회수
+		 * @param Order
+		 * @return Order
+		 * @author jsh77b
+		 * @since 2021. 01. 19
+		 */
+		public GagaMap exchRtn(List<Order> cnclRtnList) {
+			GagaMap mav = new GagaMap();
 
-	/**
-	 * 교환 정보 조회
-	 * 
-	 * @param OrderChange - 주문 변경 정보
-	 * @return Collection<OrderChange>
-	 * @author card007
-	 * @since 2021. 02. 01
-	 */
-	public Collection<Order> getExchangeInfo(Order order) {
-		return orderChangeDao.getExchangeInfo(order);
-	}
 
-	/**
-	 * 전체취소 요청
-	 * 
-	 * @param GagaMap, int
-	 * @return GagaMap
-	 * @author card007
-	 * @since 2021. 04. 15
-	 */
-	@SuppressWarnings("unchecked")
-	@Transactional("shopTxnManager")
-	public GagaMap allCnclComplete(GagaMap map, int userNo) {
-		// 1. 취소요청정보목록
-		List<Order> cancelOrderRefundList 	= (List<Order>) map.get("cancelOrderRefundList");	// 취소환불금액 목록 (주문상세단품 단위)
-		List<Order> cancelDelvRefundList 	= (List<Order>) map.get("cancelDelvRefundList");	// 취소환불배송금액 목록 (DELV_FEE_CD 단위)
-		
-		// 2. 취소신청정보
-		int ordNo 							= Integer.parseInt(map.getString("ordNo"));			// 주문번호
-		String chgReason 					= map.getString("chgReason");						// 변경사유
-		String chgMemo 						= map.getString("chgMemo");							// 변경메모
-		String allCanYnBeforePayment		= map.getString("allCanYnBeforePayment");			// 무통장입금전 전체취소 여부
-		String chgGb						= TscConstants.OrderChangeGb.CANCEL.value(); 		// 취소요청 (공톹코드:G680)
-		String accountNo 					= map.getString("accountNo");						// 환불계좌번호
-		String accountNm 					= map.getString("accountNm");						// 환불계좌주명
-		String bankCd 						= map.getString("bankCd");							// 환불은행
-		String ipAddress					= map.getString("ipAddress");						// IP주소
-		String isCustomer					= map.getString("isCustomer");						// 귀책사유 (고객, 회사)
-		String reqGbn						= map.getString("reqGbn");							// 신청구분
-		// String chgerNm 						= map.getString("chgerNm");							// 변경자
-		// String chgerPhnno 					= map.getString("chgerPhnno");						// 변경핸드폰번호
-		// String chgerTelno 					= map.getString("chgerTelno");						// 변경전화번호
-		// String chgerEmail 					= map.getString("chgerEmail");						// 변경이메일
-		String ordDtlStat;																		// 주문상세상태
-		String chgStat;																			// 주문변경상태
-
-		if ("Y".equals(allCanYnBeforePayment)) {
-			ordDtlStat = TscConstants.OrderDetailStat.PAYMENT_BEFORE_CANCEL.value();
-			chgStat = TscConstants.OrderChangeStat.PAYMENT_BEFORE_CANCEL.value();
-		} else {
-			ordDtlStat = TscConstants.OrderDetailStat.PAYMENT_AFTER_CANCEL.value();
-			chgStat = TscConstants.OrderChangeStat.PAYMENT_AFTER_CANCEL.value();
+			return mav;
 		}
 
-		// 3. 주문상세단품정보등록, 변경 (단품단위)
-		Order orderDetailItem = new Order();
-		orderDetailItem.setOrdNo(ordNo);
-		orderDetailItem.setOrdDtlStat(ordDtlStat);
-		orderDetailItem.setRegNo(userNo);
-		orderDetailItem.setUpdNo(userNo);
+		/**
+		 * 교환발송완료
+		 * @param Order
+		 * @return Order
+		 * @author jsh77b
+		 * @since 2021. 01. 19
+		 */
+		public GagaMap exchComplete(List<Order> cnclRtnList) {
+			GagaMap mav = new GagaMap();
 
-		orderChangeDao.updateOrderDetailItemForAllCancel(orderDetailItem);
-		orderChangeDao.createOrderDetailItemHstForAllCancel(orderDetailItem);
 
-		// 4. 주문변경정보, 주문정보, 환불정보 (배송정책코드별)
-		int pgCancelAmt = 0;
-		for (Order obj : cancelDelvRefundList) {
-			if (obj.getCnclRtnAmt() > 0) {
-				// 4-1. 주문변경 기본정보 설정
-				OrderChange orderChange = new OrderChange();
-				orderChange.setOrdNo(ordNo);
-				orderChange.setChgGb(chgGb);
-				orderChange.setChgReason(chgReason);
-				orderChange.setChgMemo(chgMemo);
-				orderChange.setAddPayCost(0);
-				orderChange.setAddPayAmt(0);
-				// 취소에 필요한 값인지 확인 필요
-				// orderChange.setChgerNm(chgerNm);
-				// orderChange.setChgerPhnno(chgerPhnno);
-				// orderChange.setChgerTelno(chgerTelno);
-				// orderChange.setChgerEmail(chgerEmail);
-				// orderChange.setChgerRtnMemo("");
-				orderChange.setRegNo(userNo);
-				orderChange.setUpdNo(userNo);
-
-				// 4-2. 주문변경 생성
-				orderChangeDao.createOrderChange(orderChange);
-				
-				// 4-3. 주문상세단위 취소정보
-				for (Order vo : cancelOrderRefundList) {
-					if (obj.getDelvFeeCd().equals(vo.getDelvFeeCd())) {
-						vo.setOrdDtlStat(ordDtlStat);
+			return mav;
+		}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		/**
+		 * 취소신청 (admin, npay, extmall) (사용안함)
+		 * @param Order
+		 * @return Order
+		 * @author jsh77b
+		 * @since 2021. 01. 19
+		 */
+		@SuppressWarnings("unchecked")
+		@Transactional("shopTxnManager")
+		public GagaMap cnclReq(GagaMap mav, int userNo) {
+
+			// 1. 세션회원조회
+			//userNo = userNo;
+
+			// 2. 변경요정정보목록
+			List<Order> cancelReqList		 	= (List<Order>) mav.get("cnclRtnList");				// 변경요청 목록
+			List<Order> cancelOrderRefundList 	= (List<Order>) mav.get("cancelOrderRefundList");	// 변경환불금액 목록 (주문상세단품 단위)
+			List<Order> cancelDelvRefundList 	= (List<Order>) mav.get("cancelDelvRefundList");	// 변경환불배송금액 목록 (DELV_FEE_CD 단위)
+
+			// 3. 변경신청정보
+			int ordNo 			= Integer.parseInt(mav.getString("ordNo").toString());				// 주문번호
+			String chgReason 	= mav.getString("chgReason").toString();							// 변경사유
+			String chgMemo 		= mav.getString("chgMemo").toString();								// 변경메모
+			String allCanYn		= mav.getString("allCanYn").toString();								// 무통장입금전 전체취소 여부
+			String isCustomer	= mav.getString("isCustomer").toString();							// 귀책사유 (고객, 회사)
+			String chgGb		= TscConstants.OrderChangeGb.CANCEL.value(); 						// 취소요청
+			String reqGbn		= mav.get("reqGbn").toString();										// 신청구분
+
+			// 4. 주문상세단품정보등록,변경 (단품단위)
+			List<Order> cancelOrderDetailList = new ArrayList<Order>();
+
+			for (int i=0 ; i<cancelOrderRefundList.size() ; i++) {
+				Order cancelOrderRefundPo = cancelOrderRefundList.get(i);
+				cancelOrderRefundPo.setRegNo(userNo);
+				cancelOrderRefundPo.setUpdNo(userNo);
+
+				// 4.1 취소수량이 존재하면 주문상세단품정보 수정 및 주문상세단품이력정보 등록
+				if (cancelOrderRefundPo.getOrdCanChgQty() > 0) {
+					// 4.4 주문변경 상세 단위로 데이타 등록 (ORD_DTL_NO)
+					Boolean temp = false;
+					if (cancelOrderDetailList.size() > 0) {
+						for (int j=0 ; j<cancelOrderDetailList.size() ; j++) {
+							if (cancelOrderRefundPo.getOrdDtlNo() == cancelOrderDetailList.get(j).getOrdDtlNo()) {
+								temp = true;
+							}
+						}
+					}
+
+					// 4.5 주문상세단위 데이타 저장(주문상세 단위)
+					if (!temp) {
+						cancelOrderDetailList.add(cancelOrderRefundPo);
+					}
+				}
+			}
+
+			// 2021.01.21 DELV_FEE 배송번호 단위로 TB_ORDER_CHANGE 생성
+			// 4. 주문변경정보, 주문정보, 환불정보 (업체코드 & 배송정책코드)
+			for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
+
+				Order obj = cancelDelvRefundList.get(i);
+
+				// 취소금액이 있을때 처리
+				if (obj.getCnclRtnAmt() > 0) {
+
+					// 5.1 주문변경 기본정보 등록 
+					OrderChange orderChange = new OrderChange();
+					orderChange.setOrdNo(ordNo);
+					orderChange.setChgGb(chgGb);
+					orderChange.setChgReason(chgReason);
+					orderChange.setChgMemo(chgMemo);
+					orderChange.setAddPayCost(0);
+					orderChange.setAddPayAmt(0);
+					orderChange.setRegNo(userNo);
+					orderChange.setUpdNo(userNo);
+
+					// 5.2 주문변경 추가정보 등록
+					String chgerNm 			= mav.getString("chgerNm").toString();		// 변경자
+					String chgerPhnno 		= mav.getString("chgerPhnno").toString();	// 변경핸드폰번호
+					String chgerTelno 		= mav.getString("chgerTelno").toString();	// 변경전화번호
+					String chgerEmail 		= mav.getString("chgerEmail").toString();	// 변경이메일
+
+					orderChange.setChgerNm(chgerNm);
+					orderChange.setChgerPhnno(chgerPhnno);
+					orderChange.setChgerTelno(chgerTelno);
+					orderChange.setChgerEmail(chgerEmail);
+					orderChange.setChgerRtnMemo("");
+
+					orderChangeDao.createOrderChange(orderChange);
+
+					// 5.3 주문상세단위 취소정보
+					for (int j=0 ; j<cancelOrderDetailList.size() ; j++) {
+						Order vo = cancelOrderRefundList.get(j);
 						vo.setRegNo(userNo);
 						vo.setUpdNo(userNo);
-						
-						// 4-3-1. 주문상세정보 수정 및 주문상세이력정보 등록
-						orderChangeDao.updateOrderDetail(vo);
-						orderChangeDao.createOrderDetailHstCnclRtn(vo);
-						
-						// 4-3-3. 주문변경상세 및 이력정보 등록
-						OrderChange changeDetailPo = new OrderChange();
-						changeDetailPo.setOrdChgSq(orderChange.getOrdChgSq());
-						changeDetailPo.setOrdDtlNo(vo.getOrdDtlNo());
-						changeDetailPo.setChgQty(vo.getOrdCanChgQty());
-						changeDetailPo.setChgStat(chgStat);
-						changeDetailPo.setRegNo(userNo);
-						changeDetailPo.setUpdNo(userNo);
+						vo.setOrdDtlStat(TscConstants.OrderChangeStat.CANCEL.value()); 					// 취소신청
 
-						orderChangeDao.createOrderChangeDetail(changeDetailPo);
-						orderChangeDao.createOrderChangeDetailHst(changeDetailPo);
+						// 5.3.0 DEVL_FEE_CD 단위로 주문상세 정보 처리
+						if (obj.getDelvFeeCd().equals(vo.getDelvFeeCd())) {
 
-						// 4-3-4. 사용포인트원복
-						int pntDcAmt = vo.getPntDcAmt();
-						vo.setOccurGb(TscConstants.PointOccurGb.USE_POINT.value());
+							// 5.3.1 주문변경상세정보 이력등록
+							orderChangeDao.createOrderDetailHstCnclRtn(vo);
 
-						for (Order point : orderChangeDao.getCustPointHst(vo)) {
-							while (pntDcAmt > 0) {
-								if (pntDcAmt < point.getPntAmt()) {
-									point.setPntAmt(pntDcAmt);
-									pntDcAmt -= pntDcAmt;
-								} else {
-									pntDcAmt -= point.getPntAmt();
+							// * 주문상세단위가 아닌 주문상세단품단위로 데이타가 처리되고 있었음 주문상세단위로 수정
+							// 5.3 주문변경상세정보 등록
+							OrderChange changeDetailPo = new OrderChange();
+							changeDetailPo.setOrdChgSq(orderChange.getOrdChgSq());
+							changeDetailPo.setOrdDtlNo(vo.getOrdDtlNo());
+							changeDetailPo.setChgQty(vo.getOrdCanChgQty());
+							changeDetailPo.setChgStat(TscConstants.OrderChangeStat.CANCEL.value()); 	// 취소신청
+							changeDetailPo.setRegNo(userNo);
+							changeDetailPo.setUpdNo(userNo);
+
+							orderChangeDao.createOrderChangeDetail(changeDetailPo);
+						}
+					}
+					// 5.4 환불결제정보 등록 (업체별 & 배송정책별) 단위
+					// 취소, 반품 사유에 따른 추가배송비, 반품배송비를 환불금액에서 추가, 제외 할 수 있다.
+					int spanRealCnclRtnAmt 		= obj.getCnclRtnAmt();		// 취소금액합계
+					int sumDeliveryFee 			= obj.getDelvFee();			// 배송비합계
+					int spanTotDeliveryFee 		= obj.getAddDelvFee();		// 추가배송비합계
+					int spanTotRtnDelvFee 		= obj.getRtnDelvFee();		// 반품배송비합계
+					int spanRefundAmt			= 0;
+
+					// 고객사유 : 환불금액계산 = (취소금액 + 배송비) - 추가배송비
+					if ("true".equals(isCustomer)) {
+						spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee) - spanTotDeliveryFee - spanTotRtnDelvFee;
+					}
+					// 회사사유 : 환불금액계산 = (취소금액 + 배송비)
+					else {
+						spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee);
+					}
+
+					// 5.4 환불금액 등록
+					Order refundOrder = new Order();
+					refundOrder.setOrdNo(ordNo);
+					refundOrder.setPaySq(0);
+					refundOrder.setOrdChgSq(orderChange.getOrdChgSq());
+					refundOrder.setRegNo(userNo);
+
+					// 2021.01.25 TB_REFUND 정보 등록을 위해서 분리 작업
+					refundOrder.setRefundAmt(spanRefundAmt);
+					refundOrder.setRfCpn1Amt(obj.getCpn1DcAmt());
+					refundOrder.setRfTmtb1Amt(obj.getTmtb1DcAmt());
+					refundOrder.setRfTmtb2Amt(obj.getTmtb2DcAmt());
+					refundOrder.setRfGoodsCpnAmt(obj.getGoodsCpnDcAmt());
+					refundOrder.setRfCartCpnAmt(obj.getCartCpnDcAmt());
+					refundOrder.setRfPntAmt(obj.getPntAmt());
+					refundOrder.setRfPrePntAmt(obj.getPrePntDcAmt());
+					refundOrder.setRfGfcdUseAmt(obj.getGfcdUseAmt());
+
+					refundOrder.setRaNo(mav.get("accountNo").toString());
+					refundOrder.setRaNm(mav.get("accountNm").toString());
+					refundOrder.setRaBank(mav.get("bankCd").toString());
+
+					orderChangeDao.createRefund(refundOrder);
+				}
+			}
+
+			return mav;
+		}
+
+
+		/**
+		 * 취소신청승인 (admin) (사용안함)
+		 * @param Order
+		 * @return Order
+		 * @author jsh77b
+		 * @since 2021. 01. 19
+		 */
+		@Transactional("shopTxnManager")
+		public GagaMap cnclcnclComplete(GagaMap mav, int userNo) {
+
+			// 1. 환불금액계산
+
+			// 2. 사용포인트원복 (TB_CUST_POINT(수정), TB_CUST_POINT_HST(등록))
+
+			// 3. 사용쿠폰원복 (TB_CUST_COUPON(수정))
+
+			// 4. 상품권금액원복 (TB_CUST_GIFTCARD(수정), TB_CUST_GIFTCARD_HST(등록))
+
+			// 5. 사은품취소 (TB_ORD_FREEGIFT(수정), TB_ORD_FREEGIFT(등록), TB_ORD_FREEGIFT_VAL(수정))
+
+			// 6. 주문정보 수정 (TB_ORDER_DETAIL(수정), TB_ORDER_DETAIL_HST(등록), TB_ORDER_DETAIL_ITEM(수정), TB_ORDER_DETAIL_ITEM_HST(등록))
+
+			// 7. 재고정보 (TB_SELL_QTY(등록))
+
+			// 8. 주문변경정보 (TB_ORDER_CHANGE(수정), TB_ORDER_CHANGE_DTL(수정), TB_REFUND(수정))
+
+			// PG 결제 금액 체크
+			// 9. PG 실행
+
+			// 10. 결제정보 (TB_PAYMENT(등록))
+
+			// 11. 추가배송비발생 (TB_PAYMENT(등록))
+
+			return mav;
+		}
+
+		/**
+		 * 주문 환불계좌
+		 *
+		 * @param order - 주문정보
+		 * @return Order
+		 * @author jsh77b
+		 * @since 2021. 01. 04.
+		 */
+		public Collection<Order> getRefundAccount(Order order) {
+			return orderChangeDao.getRefundAccount(order);
+		}
+
+		/**
+		 * 환불계좌 저장
+		 *
+		 * @param order - 주문정보
+		 * @return TsaOrder
+		 * @author jsh77b
+		 * @since 2021. 01. 05.
+		 */
+		public int saveRefundAccount(Order order) {
+
+			// 환불계좌 유무 체크 후 등록
+			if (orderChangeDao.getRefundAccountCheck(order) < 1) {
+				orderChangeDao.saveRefundAccount(order);
+			}
+
+			return 1;
+		}
+
+		/**
+		 * 교환 정보 조회
+		 *
+		 * @param OrderChange - 주문 변경 정보
+		 * @return Collection<OrderChange>
+		 * @author card007
+		 * @since 2021. 02. 01
+		 */
+		public Collection<Order> getExchangeInfo(Order order) {
+			return orderChangeDao.getExchangeInfo(order);
+		}
+
+		/**
+		 * 전체취소 요청
+		 *
+		 * @param GagaMap, int
+		 * @return GagaMap
+		 * @author card007
+		 * @since 2021. 04. 15
+		 */
+		@SuppressWarnings("unchecked")
+		@Transactional("shopTxnManager")
+		public void allCnclComplete(OrderChange orderChange) {
+			int ordNo = orderChange.getOrdNo();
+			String chgReason = orderChange.getChgReason();									// G686_10:고객변심, G686_20:관리자취소, G686_30:품절취소
+			String chgReasonNm = orderChange.getChgReasonNm();								// 고객변심, 관리자취소, 품절취소
+			String chgGb = TscConstants.OrderChangeGb.CANCEL.value();						// 변경구분
+			String accountNo = orderChange.getAccountNo();									// 환불계좌번호
+			String accountNm = orderChange.getAccountNm();									// 환불계좌주명
+			String bankCd = orderChange.getBankCd();										// 환불은행
+			String ipAddress = orderChange.getIpAddress();									// IP주소
+			int regNo = orderChange.getRegNo();												// 등록자번호
+			int updNo = orderChange.getUpdNo();												// 등록자번호
+
+			// 원주문 결제정보 조회
+			Payment payment = new Payment();
+			payment.setOrdNo(ordNo);
+			payment = orderChangeDao.getPaymentInfo(payment);
+
+			// 환불금액 설정
+			int refundAmt = payment.getPayAmt();
+
+			// 상태값 설정
+			String ordDtlStat = TscConstants.OrderDetailStat.PAYMENT_AFTER_CANCEL.value();	// 주문상세상태
+			String chgStat = TscConstants.OrderChangeStat.PAYMENT_AFTER_CANCEL.value();		// 주문변경상태
+			String modType = "STSC";														// KCP 전체취소
+
+			// 무통장입금 결제 주문 전체취소 상태값 처리
+			if (TscConstants.PgGb.KCP.value().equals(payment.getPgGb())
+				&& TscConstants.PayMeans.BANK_DEPOSIT.value().equals(payment.getPayMeans())
+				&& TscConstants.PaymentStat.PAYMENT_WAIT.value().equals(payment.getPayStat())) {
+
+				ordDtlStat = TscConstants.OrderDetailStat.PAYMENT_BEFORE_CANCEL.value();
+				chgStat = TscConstants.OrderChangeStat.PAYMENT_BEFORE_CANCEL.value();
+			} else if (TscConstants.PgGb.KCP.value().equals(payment.getPgGb())
+				&& TscConstants.PayMeans.BANK_DEPOSIT.value().equals(payment.getPayMeans())
+				&& TscConstants.PaymentStat.PAYMENT_COMPLETE.value().equals(payment.getPayStat())){
+
+				modType = "STHD";															// KCP 무통장입금 전체취소
+			}
+
+			// 1. 주문변경 및 변경상세 정보 설정
+			OrderChange orderChangeDetail = new OrderChange();
+			orderChangeDetail.setOrdNo(ordNo);
+			orderChangeDetail.setChgGb(chgGb);
+			orderChangeDetail.setChgReason(chgReason);
+			orderChangeDetail.setChgStat(chgStat);
+			orderChangeDetail.setRegNo(regNo);
+			orderChangeDetail.setUpdNo(updNo);
+
+			// 주문변경정보 등록
+			orderChangeDao.createOrderChange(orderChangeDetail);
+
+			// 주문변경상세 및 이력정보 등록
+			orderChangeDao.createOrderChangeDetailForAllCancel(orderChangeDetail);
+			orderChangeDao.createOrderChangeDetailHstForAllCancel(orderChangeDetail);
+
+			// 2. 사용포인트원복
+			Order vo = new Order();
+			vo.setOrdNo(ordNo);
+			vo.setOccurGb(TscConstants.PointOccurGb.USE_POINT.value());
+			vo.setUpdNo(updNo);
+
+			for (Order point : orderChangeDao.getCustPointHst(vo)) {
+				point.setOccurGb(TscConstants.PointOccurGb.USE_POINT_CANCEL.value());
+				point.setOccurDtlDesc("포인트사용취소");
+				point.setPayAmt(point.getPayAmt() * -1);
+				point.setRegNo(regNo);
+				point.setUpdNo(updNo);
+
+				// 포인트 사용 취소 이력 생성 및 포인트 수정
+				orderChangeDao.createCustPointHstRollback(point);
+				orderChangeDao.updateCustPointRollback(point);
+			}
+
+			// 3. 적립예정포인트 취소
+			vo.setOccurGb(TscConstants.PointOccurGb.EXPECT_POINT.value());
+
+			for (Order point : orderChangeDao.getCustPointHst(vo)) {
+				point.setOccurGb(TscConstants.PointOccurGb.EXPECT_POINT_CANCEL.value());
+				point.setOccurDtlDesc("예정포인트적립취소");
+				point.setPayAmt(point.getPayAmt() * -1);
+				point.setRegNo(regNo);
+				point.setUpdNo(updNo);
+
+				// 적립예정포인트 취소 이력 생성
+				orderChangeDao.createCustPointHstRollback(point);
+			}
+
+			// 4. 사용상품권 원복
+			for (Order giftCard : orderChangeDao.getCustGiftCardHst(vo)) {
+				giftCard.setOccurGb(TscConstants.GiftCardOccurGb.USE_GIFTCARD_CANCEL.value());
+				giftCard.setOccurDtlDesc("상품권사용취소");
+				giftCard.setGfcdAmt(giftCard.getGfcdAmt() * -1);
+				giftCard.setRegNo(regNo);
+				giftCard.setUpdNo(updNo);
+
+				// 포인트 사용 취소 이력 생성 및 포인트 수정
+				orderChangeDao.createCustGiftCardHstRollback(giftCard);
+				orderChangeDao.updateCustGiftCardRollback(giftCard);
+			}
+
+			// 5. 상품재고원복
+			OrderChange sellQty = new OrderChange();
+			sellQty.setOrdChgSq(orderChangeDetail.getOrdChgSq());
+			sellQty.setSellGb("11");
+			sellQty.setRegNo(regNo);
+			orderChangeDao.createSellQty(sellQty);
+
+			// 6. 쿠폰 원복처리
+			Order coupon = new Order();
+			coupon.setOrdNo(ordNo);
+			coupon.setUpdNo(updNo);
+			orderChangeDao.updateGoodsCpnRollback(coupon);
+			orderChangeDao.updateCartCpnRollback(coupon);
+			orderChangeDao.updateDeliveryCpnRollback(coupon);
+
+			// 7. 사은품 전체 취소 (전체취소시 적용) 추후 사은품 관련 취소 로직 개발 예정
+			Order freegiftOrder = new Order();
+			freegiftOrder.setOrdNo(ordNo);
+			freegiftOrder.setUpdNo(updNo);
+			orderChangeDao.updateOrdFreegiftDel(freegiftOrder);
+
+			// 8. PG 연동
+			Payment pg = new Payment();
+			pg.setOrdNo(ordNo);
+			pg.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+			pg.setPayGb("O");
+			pg.setPgTid(payment.getPgTid());
+			pg.setPayAmt(refundAmt);
+			pg.setRegNo(regNo);
+			pg.setUpdNo(updNo);
+
+			// 상품권으로만 결제 시 PG점프
+			String pgGb = payment.getPgGb();
+			if (!TscConstants.PgGb.ISTYLE.value().equals(pgGb)) {
+				if (TscConstants.PgGb.KCP.value().equals(pgGb) || TscConstants.PgGb.PAYCO.value().equals(pgGb)) {
+					pg.setModType(modType);
+					pg.setModDesc("가맹점 취소 - 전체 취소");
+					pg.setIpAddress(ipAddress);
+					pg.setAccountNm(accountNm);
+					pg.setAccountNo(accountNo);
+					pg.setBankCd(bankCd);
+
+					kcpService.kcpCancel(pg);
+				} else if (TscConstants.PgGb.NAVER.value().equals(pgGb)) {
+					pg.setPayMeans(payment.getPayMeans());
+					pg.setChgReasonNm(chgReasonNm);
+
+					naverPayService.cancelNaverPayment(pg);
+				} else if (TscConstants.PgGb.KAKAO.value().equals(pgGb)) {
+					kakaoPayService.cancelKakaoPayment(pg);
+				}
+			}
+
+			// 9. 환불금액 등록
+			Order refundOrder = orderChangeDao.getRefundInfoForAllCancel(vo);
+			refundOrder.setOrdNo(ordNo);
+			refundOrder.setPaySq(pg.getPaySq());
+			refundOrder.setOrdChgSq(orderChangeDetail.getOrdChgSq());
+			refundOrder.setRefundAmt(refundAmt);
+			refundOrder.setRfRealCnclAmt(refundOrder.getRealOrdAmt() - refundOrder.getRfDeliveryFee());
+			refundOrder.setRaNo(accountNo);
+			refundOrder.setRaNm(accountNm);
+			refundOrder.setRaBank(bankCd);
+			refundOrder.setRegNo(regNo);
+
+			orderChangeDao.createRefund(refundOrder);
+
+			// 10. 주문상세 및 주문상세단품 정보 설정
+			OrderChange orderDetail = new OrderChange();
+			orderDetail.setOrdNo(ordNo);
+			orderDetail.setOrdDtlStat(ordDtlStat);
+			orderDetail.setRegNo(regNo);
+			orderDetail.setUpdNo(updNo);
+
+			// 주문상세정보 수정 및 이력 등록
+			orderChangeDao.updateOrderDetailForAllCancel(orderDetail);
+			orderChangeDao.createOrderDetailHstForAllCancel(orderDetail);
+
+			// 주문상세단품정보 수정 및 이력 등록
+			orderChangeDao.updateOrderDetailItemForAllCancel(orderDetail);
+			orderChangeDao.createOrderDetailItemHstForAllCancel(orderDetail);
+
+			// TODO
+			// 11. 취소 완료 알림톡 발송 에정
+		}
+
+		/**
+		 * 전체취소 요청
+		 *
+		 * @param GagaMap, int
+		 * @return GagaMap
+		 * @author card007
+		 * @since 2021. 04. 15
+		 */
+		@SuppressWarnings("unchecked")
+		@Transactional("shopTxnManager")
+		public GagaMap allCnclCompleteBak(GagaMap map, int userNo) {
+			// 1. 취소요청정보목록
+			List<Order> cancelOrderRefundList 	= (List<Order>) map.get("cancelOrderRefundList");	// 취소환불금액 목록 (주문상세단품 단위)
+			List<Order> cancelDelvRefundList 	= (List<Order>) map.get("cancelDelvRefundList");	// 취소환불배송금액 목록 (DELV_FEE_CD 단위)
+
+			// 2. 취소신청정보
+			int ordNo 							= Integer.parseInt(map.getString("ordNo"));			// 주문번호
+			String chgReason 					= map.getString("chgReason");						// 변경사유
+			String chgMemo 						= map.getString("chgMemo");							// 변경메모
+			String allCanYnBeforePayment		= map.getString("allCanYnBeforePayment");			// 무통장입금전 전체취소 여부
+			String chgGb						= TscConstants.OrderChangeGb.CANCEL.value(); 		// 취소요청 (공톹코드:G680)
+			String accountNo 					= map.getString("accountNo");						// 환불계좌번호
+			String accountNm 					= map.getString("accountNm");						// 환불계좌주명
+			String bankCd 						= map.getString("bankCd");							// 환불은행
+			String ipAddress					= map.getString("ipAddress");						// IP주소
+			String isCustomer					= map.getString("isCustomer");						// 귀책사유 (고객, 회사)
+			String reqGbn						= map.getString("reqGbn");							// 신청구분
+			// String chgerNm 						= map.getString("chgerNm");							// 변경자
+			// String chgerPhnno 					= map.getString("chgerPhnno");						// 변경핸드폰번호
+			// String chgerTelno 					= map.getString("chgerTelno");						// 변경전화번호
+			// String chgerEmail 					= map.getString("chgerEmail");						// 변경이메일
+			String ordDtlStat;																		// 주문상세상태
+			String chgStat;																			// 주문변경상태
+
+			if ("Y".equals(allCanYnBeforePayment)) {
+				ordDtlStat = TscConstants.OrderDetailStat.PAYMENT_BEFORE_CANCEL.value();
+				chgStat = TscConstants.OrderChangeStat.PAYMENT_BEFORE_CANCEL.value();
+			} else {
+				ordDtlStat = TscConstants.OrderDetailStat.PAYMENT_AFTER_CANCEL.value();
+				chgStat = TscConstants.OrderChangeStat.PAYMENT_AFTER_CANCEL.value();
+			}
+
+			// 3. 주문상세단품정보등록, 변경 (단품단위)
+			OrderChange orderDetailItem = new OrderChange();
+			orderDetailItem.setOrdNo(ordNo);
+			orderDetailItem.setOrdDtlStat(ordDtlStat);
+			orderDetailItem.setRegNo(userNo);
+			orderDetailItem.setUpdNo(userNo);
+
+			orderChangeDao.updateOrderDetailItemForAllCancel(orderDetailItem);
+			orderChangeDao.createOrderDetailItemHstForAllCancel(orderDetailItem);
+
+			// 4. 주문변경정보, 주문정보, 환불정보 (배송정책코드별)
+			int pgCancelAmt = 0;
+			for (Order obj : cancelDelvRefundList) {
+				if (obj.getCnclRtnAmt() > 0) {
+					// 4-1. 주문변경 기본정보 설정
+					OrderChange orderChange = new OrderChange();
+					orderChange.setOrdNo(ordNo);
+					orderChange.setChgGb(chgGb);
+					orderChange.setChgReason(chgReason);
+					orderChange.setChgMemo(chgMemo);
+					orderChange.setAddPayCost(0);
+					orderChange.setAddPayAmt(0);
+					// 취소에 필요한 값인지 확인 필요
+					// orderChange.setChgerNm(chgerNm);
+					// orderChange.setChgerPhnno(chgerPhnno);
+					// orderChange.setChgerTelno(chgerTelno);
+					// orderChange.setChgerEmail(chgerEmail);
+					// orderChange.setChgerRtnMemo("");
+					orderChange.setRegNo(userNo);
+					orderChange.setUpdNo(userNo);
+
+					// 4-2. 주문변경 생성
+					orderChangeDao.createOrderChange(orderChange);
+
+					// 4-3. 주문상세단위 취소정보
+					for (Order vo : cancelOrderRefundList) {
+						if (obj.getDelvFeeCd().equals(vo.getDelvFeeCd())) {
+							vo.setOrdDtlStat(ordDtlStat);
+							vo.setRegNo(userNo);
+							vo.setUpdNo(userNo);
+
+							// 4-3-1. 주문상세정보 수정 및 주문상세이력정보 등록
+							orderChangeDao.updateOrderDetail(vo);
+							orderChangeDao.createOrderDetailHstCnclRtn(vo);
+
+							// 4-3-3. 주문변경상세 및 이력정보 등록
+							OrderChange changeDetailPo = new OrderChange();
+							changeDetailPo.setOrdChgSq(orderChange.getOrdChgSq());
+							changeDetailPo.setOrdDtlNo(vo.getOrdDtlNo());
+							changeDetailPo.setChgQty(vo.getOrdCanChgQty());
+							changeDetailPo.setChgStat(chgStat);
+							changeDetailPo.setRegNo(userNo);
+							changeDetailPo.setUpdNo(userNo);
+
+							orderChangeDao.createOrderChangeDetail(changeDetailPo);
+							orderChangeDao.createOrderChangeDetailHst(changeDetailPo);
+
+							// 4-3-4. 사용포인트원복
+							int pntDcAmt = vo.getPntDcAmt();
+							vo.setOccurGb(TscConstants.PointOccurGb.USE_POINT.value());
+
+							for (Order point : orderChangeDao.getCustPointHst(vo)) {
+								while (pntDcAmt > 0) {
+									if (pntDcAmt < point.getPntAmt()) {
+										point.setPntAmt(pntDcAmt);
+										pntDcAmt -= pntDcAmt;
+									} else {
+										pntDcAmt -= point.getPntAmt();
+									}
+
+									point.setOccurGb(TscConstants.PointOccurGb.USE_POINT_CANCEL.value());
+									point.setOccurDtlDesc("포인트사용취소");
+									point.setRegNo(userNo);
+									point.setUpdNo(userNo);
+
+									// 포인트 사용 취소 이력 생성 및 포인트 수정
+									orderChangeDao.createCustPointHstRollback(point);
+									orderChangeDao.updateCustPointRollback(point);
 								}
+							}
 
-								point.setOccurGb(TscConstants.PointOccurGb.USE_POINT_CANCEL.value());
-								point.setOccurDtlDesc("포인트사용취소");
+							// 4-3-5. 적립예정포인트 수정
+							int savePntAmt = vo.getSavePntAmt();
+							vo.setOccurGb(TscConstants.PointOccurGb.EXPECT_POINT.value());
+
+							for (Order point : orderChangeDao.getCustPointHst(vo)) {
+								point.setOccurGb(TscConstants.PointOccurGb.EXPECT_POINT_CANCEL.value());
+								point.setOccurDtlDesc("예정포인트적립취소");
+								point.setPayAmt(savePntAmt * -1);
 								point.setRegNo(userNo);
 								point.setUpdNo(userNo);
 
-								// 포인트 사용 취소 이력 생성 및 포인트 수정
+								// 적립예정포인트 취소 이력 생성
 								orderChangeDao.createCustPointHstRollback(point);
-								orderChangeDao.updateCustPointRollback(point);
+							}
+
+							// 4-3-6. 상품쿠폰원복
+							orderChangeDao.updateGoodsCpnRollback(vo);
+
+							// 4-3-7. 사용상품권 원복
+							int gfcdUseAmt = vo.getGfcdUseAmt();
+
+							for (Order giftCard : orderChangeDao.getCustGiftCardHst(vo)) {
+								while (gfcdUseAmt > 0) {
+									if (gfcdUseAmt < giftCard.getGfcdAmt()) {
+										giftCard.setGfcdAmt(gfcdUseAmt);
+										gfcdUseAmt -= gfcdUseAmt;
+									} else {
+										gfcdUseAmt -= giftCard.getGfcdAmt();
+									}
+
+									giftCard.setOccurGb(TscConstants.GiftCardOccurGb.USE_GIFTCARD_CANCEL.value());
+									giftCard.setOccurDtlDesc("상품권사용취소");
+									giftCard.setRegNo(userNo);
+									giftCard.setUpdNo(userNo);
+
+									// 포인트 사용 취소 이력 생성 및 포인트 수정
+									orderChangeDao.createCustGiftCardHstRollback(giftCard);
+									orderChangeDao.updateCustGiftCardRollback(giftCard);
+								}
 							}
 						}
-						
-						// 4-3-5. 적립예정포인트 수정
-						int savePntAmt = vo.getSavePntAmt();
-						vo.setOccurGb(TscConstants.PointOccurGb.EXPECT_POINT.value());
+					}
 
-						for (Order point : orderChangeDao.getCustPointHst(vo)) {
-							point.setOccurGb(TscConstants.PointOccurGb.EXPECT_POINT_CANCEL.value());
-							point.setOccurDtlDesc("예정포인트적립취소");
-							point.setPayAmt(savePntAmt * -1);
-							point.setRegNo(userNo);
-							point.setUpdNo(userNo);
+					// 4-4. 상품재고원복
+					orderChange.setSellGb("11");
+					orderChangeDao.createSellQty(orderChange);
 
-							// 적립예정포인트 취소 이력 생성
-							orderChangeDao.createCustPointHstRollback(point);
-						}
+					// 4-5. 환불결제정보 등록 (배송정책별)
+					int spanRefundAmt = obj.getRealOrdAmt() + obj.getDelvFee();
 
-						// 4-3-6. 상품쿠폰원복
-						orderChangeDao.updateGoodsCpnRollback(vo);
+					Order paymentOrder = new Order();
+					paymentOrder.setOrdNo(ordNo);
+					paymentOrder.setPayAmt(spanRefundAmt * -1);
+					paymentOrder.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+					paymentOrder.setOrdChgSq(orderChange.getOrdChgSq());
+					paymentOrder.setRegNo(userNo);
+					paymentOrder.setUpdNo(userNo);
 
-						// 4-3-7. 사용상품권 원복
-						int gfcdUseAmt = vo.getGfcdUseAmt();
+					orderChangeDao.createPayment(paymentOrder);
 
-						for (Order giftCard : orderChangeDao.getCustGiftCardHst(vo)) {
-							while (gfcdUseAmt > 0) {
-								if (gfcdUseAmt < giftCard.getGfcdAmt()) {
-									giftCard.setGfcdAmt(gfcdUseAmt);
-									gfcdUseAmt -= gfcdUseAmt;
-								} else {
-									gfcdUseAmt -= giftCard.getGfcdAmt();
-								}
+					// 4-6. 환불금액 등록
+					Order refundOrder = new Order();
+					refundOrder.setOrdNo(ordNo);
+					refundOrder.setPaySq(paymentOrder.getPaySq());
+					refundOrder.setOrdChgSq(orderChange.getOrdChgSq());
+					refundOrder.setRefundAmt(spanRefundAmt);
+					refundOrder.setRfCpn1Amt(obj.getCpn1DcAmt());
+					refundOrder.setRfTmtb1Amt(obj.getTmtb1DcAmt());
+					refundOrder.setRfTmtb2Amt(obj.getTmtb2DcAmt());
+					refundOrder.setRfGoodsCpnAmt(obj.getGoodsCpnDcAmt());
+					refundOrder.setRfCartCpnAmt(obj.getCartCpnDcAmt());
+					refundOrder.setRfPntAmt(obj.getPntAmt());
+					refundOrder.setRfPrePntAmt(obj.getPrePntDcAmt());
+					refundOrder.setRfGfcdUseAmt(obj.getGfcdUseAmt());
+					refundOrder.setRfDeliveryFee(obj.getRfDeliveryFee());
+					refundOrder.setRfCnclAmt(obj.getRfCnclAmt());
+					refundOrder.setRfRealCnclAmt(obj.getRfRealCnclAmt());
+					refundOrder.setRaNo(accountNo);
+					refundOrder.setRaNm(accountNm);
+					refundOrder.setRaBank(bankCd);
+					refundOrder.setRegNo(userNo);
 
-								giftCard.setOccurGb(TscConstants.GiftCardOccurGb.USE_GIFTCARD_CANCEL.value());
-								giftCard.setOccurDtlDesc("상품권사용취소");
-								giftCard.setRegNo(userNo);
-								giftCard.setUpdNo(userNo);
+					orderChangeDao.createRefund(refundOrder);
 
-								// 포인트 사용 취소 이력 생성 및 포인트 수정
-								orderChangeDao.createCustGiftCardHstRollback(giftCard);
-								orderChangeDao.updateCustGiftCardRollback(giftCard);
-							}
-						}
-					}
+					pgCancelAmt += spanRefundAmt;
 				}
-				
-				// 4-4. 상품재고원복
-				orderChange.setSellGb("11");
-				orderChangeDao.createSellQty(orderChange);
-				
-				// 4-5. 환불결제정보 등록 (배송정책별)
-				int spanRefundAmt = obj.getRealOrdAmt() + obj.getDelvFee();
-				
-				Order paymentOrder = new Order();
-				paymentOrder.setOrdNo(ordNo);
-				paymentOrder.setPayAmt(spanRefundAmt * -1);
-				paymentOrder.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
-				paymentOrder.setOrdChgSq(orderChange.getOrdChgSq());
-				paymentOrder.setRegNo(userNo);
-				paymentOrder.setUpdNo(userNo);
+			}
 
-				orderChangeDao.createPayment(paymentOrder);
-				
-				// 4-6. 환불금액 등록
-				Order refundOrder = new Order();
-				refundOrder.setOrdNo(ordNo);
-				refundOrder.setPaySq(paymentOrder.getPaySq());
-				refundOrder.setOrdChgSq(orderChange.getOrdChgSq());
-				refundOrder.setRefundAmt(spanRefundAmt);
-				refundOrder.setRfCpn1Amt(obj.getCpn1DcAmt());
-				refundOrder.setRfTmtb1Amt(obj.getTmtb1DcAmt());
-				refundOrder.setRfTmtb2Amt(obj.getTmtb2DcAmt());
-				refundOrder.setRfGoodsCpnAmt(obj.getGoodsCpnDcAmt());
-				refundOrder.setRfCartCpnAmt(obj.getCartCpnDcAmt());
-				refundOrder.setRfPntAmt(obj.getPntAmt());
-				refundOrder.setRfPrePntAmt(obj.getPrePntDcAmt());
-				refundOrder.setRfGfcdUseAmt(obj.getGfcdUseAmt());
-				refundOrder.setRfDeliveryFee(obj.getRfDeliveryFee());
-				refundOrder.setRfCnclAmt(obj.getRfCnclAmt());
-				refundOrder.setRfRealCnclAmt(obj.getRfRealCnclAmt());
-				refundOrder.setRaNo(accountNo);
-				refundOrder.setRaNm(accountNm);
-				refundOrder.setRaBank(bankCd);
-				refundOrder.setRegNo(userNo);
+			// 장바구니, 배송비 쿠폰 원복처리
+			Order coupon = new Order();
+			coupon.setOrdNo(ordNo);
+			coupon.setUpdNo(userNo);
+			orderChangeDao.updateCartCpnRollback(coupon);
+			orderChangeDao.updateDeliveryCpnRollback(coupon);
 
-				orderChangeDao.createRefund(refundOrder);
+			// 12. 사은품 전체 취소 (전체취소시 적용) 추후 사은품 관련 취소 로직 개발 예정
+			Order freegiftOrder = new Order();
+			freegiftOrder.setOrdNo(ordNo);
+			freegiftOrder.setUpdNo(userNo);
+			orderChangeDao.updateOrdFreegiftDel(freegiftOrder);
 
-				pgCancelAmt += spanRefundAmt;
+			// TODO
+			// 13. PG 연동
+			// 네이버페이, 카카오페이 취소 시 취소 포인트 금액 TB_PAYMENT에 업데이트 처야함
+			// 상품권 100% 결제 시 PG 점프 해야 됨
+
+			// 원주문 결제 정보 조회
+			Payment payment = new Payment();
+			payment.setOrdNo(ordNo);
+			payment = orderChangeDao.getPaymentInfo(payment);
+
+			// PG 별 취소 처리
+			String pgGb = payment.getPgGb();
+
+			// 상품권으로만 결제 시 PG점프
+			if (!TscConstants.PgGb.ISTYLE.value().equals(pgGb)) {
+				if (TscConstants.PgGb.KCP.value().equals(pgGb) || TscConstants.PgGb.PAYCO.value().equals(pgGb)) {
+					Payment kcp = new Payment();
+					kcp.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+					kcp.setPayGb("O");
+					kcp.setModType("STSC");
+					kcp.setModDesc("가맹점 취소 - 전체 취소");
+					kcp.setIpAddress(ipAddress);
+					kcp.setPgTid(payment.getPgTid());
+					kcp.setPayAmt(pgCancelAmt);
+					kcp.setRegNo(userNo);
+					kcp.setUpdNo(userNo);
+					kcpService.kcpCancel(kcp);
+				} else if (TscConstants.PgGb.NAVER.value().equals(pgGb)) {
+					Payment naverPay = new Payment();
+					naverPay.setOrdNo(ordNo);
+					naverPay.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+					naverPay.setPayGb("O");
+					naverPay.setPayMeans(payment.getPayMeans());
+					naverPay.setChgReasonNm(chgReason);
+					naverPay.setPgTid(payment.getPgTid());
+					naverPay.setPayAmt(pgCancelAmt);
+					naverPay.setRegNo(userNo);
+					naverPay.setUpdNo(userNo);
+
+					naverPayService.cancelNaverPayment(naverPay);
+				} else if (TscConstants.PgGb.KAKAO.value().equals(pgGb)) {
+					Payment kakaoPay = new Payment();
+					kakaoPay.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+					kakaoPay.setPayGb("O");
+					kakaoPay.setPgTid(payment.getPgTid());
+					kakaoPay.setPayAmt(pgCancelAmt);
+
+					kakaoPayService.cancelKakaoPayment(kakaoPay);
+				}
 			}
-		}
 
-		// 장바구니, 배송비 쿠폰 원복처리
-		Order coupon = new Order();
-		coupon.setOrdNo(ordNo);
-		coupon.setUpdNo(userNo);
-		orderChangeDao.updateCartCpnRollback(coupon);
-		orderChangeDao.updateDeliveryCpnRollback(coupon);
-		
-		// 12. 사은품 전체 취소 (전체취소시 적용) 추후 사은품 관련 취소 로직 개발 예정
-		Order freegiftOrder = new Order();
-		freegiftOrder.setOrdNo(ordNo);
-		freegiftOrder.setUpdNo(userNo);
-		orderChangeDao.updateOrdFreegiftDel(freegiftOrder);
+			// TODO
+			// 14. 취소 완료 알림톡 발송 에정
 
-		// TODO
-		// 13. PG 연동
-		// 네이버페이, 카카오페이 취소 시 취소 포인트 금액 TB_PAYMENT에 업데이트 처야함
-		// 상품권 100% 결제 시 PG 점프 해야 됨
-
-		// 원주문 결제 정보 조회
-		Payment payment = new Payment();
-		payment.setOrdNo(ordNo);
-		payment = orderChangeDao.getPaymentInfo(payment);
-
-		// PG 별 취소 처리
-		String pgGb = payment.getPgGb();
-		if (TscConstants.PgGb.KCP.value().equals(pgGb)) {
-			Payment kcp = new Payment();
-			kcp.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
-			kcp.setPayGb("O");
-			kcp.setModType("STSC");
-			kcp.setModDesc("가맹점 취소 - 전체 취소");
-			kcp.setIpAddress(ipAddress);
-			kcp.setPgTid("TODO");
-			kcp.setPayAmt(pgCancelAmt);
-			kcp.setRegNo(userNo);
-			kcp.setUpdNo(userNo);
-			kcpService.kcpCancel(kcp);
-			
+			return map;
 		}
-		
-		
-		
-
-		// TODO
-		// 14. 취소 완료 알림톡 발송 에정
-		
-		return map;
 	}
-}

+ 70 - 0
src/main/java/com/style24/core/biz/service/TscOrderService.java

@@ -1996,6 +1996,76 @@ public class TscOrderService {
 	public Collection<Order> getOrderGiftGoodsList(Order order) {
 		return orderDao.getOrderGiftGoodsList(order);
 	}
+	
+	
+	/**
+	 * 추가결제 취소,반품,교환 대상 상품목록 조회
+	 * @param Order
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 04. 15
+	 */
+	public GagaMap getAddPayOrderListInfo(Order order) {
+		GagaMap resultMap = new GagaMap();
+		
+		Collection<Order> orderAddPayGoodsList = orderDao.getAddPayGoodsList(order);
+		
+		int refundAmt 		= 0;
+		int addPayCost 		= 0;
+		int ordChgSq		= 0;
+		
+		String chgGb		= "";
+		String chgerNm		= "";
+		String chgerPhnno	= "";
+		String goodsNm		= "";
+		
+		int index = 0;
+		for (Order orderInfo : orderAddPayGoodsList) {
+			if (index == 0) {
+				refundAmt 	= orderInfo.getRefundAmt();
+				addPayCost 	= orderInfo.getAddPayCost();
+				ordChgSq	= orderInfo.getOrdChgSq();
+				
+				chgGb		= orderInfo.getChgGb();
+				chgerNm		= orderInfo.getChgerNm();
+				chgerPhnno	= orderInfo.getChgerPhnno();
+				goodsNm		= orderInfo.getGoodsNm();
+			}
+			index++;
+		}
+		
+		resultMap.set("orderAddPayGoodsList"	, orderAddPayGoodsList);	// 주문목록정보
+		resultMap.set("refundAmt"				, refundAmt);				// 상품환불금액
+		resultMap.set("addPayCost"				, addPayCost);				// 추가결제금액
+		resultMap.set("ordChgSq"				, ordChgSq);				// 주문취소신청번호
+		
+		resultMap.set("chgGb"					, chgGb);					// 변경구분
+		resultMap.set("chgerNm"					, chgerNm);					// 변경신청인
+		resultMap.set("chgerPhnno"				, chgerPhnno);				// 변경신청핸드폰번호
+		resultMap.set("goodsNm"					, goodsNm);					// 상품명
+		
+		return resultMap;
+	}
+	
+	/**
+	 * 주문정보(결제완료)
+	 * @param Order
+	 * @return Order
+	 * @author jsh77b
+	 * @since 2021. 03. 09
+	 */
+	@Transactional("shopTxnManager")
+	public void updateOrderChangeDetail(Order order) {
+		
+		// 1. 추가결제 반품,교환 상태값 업데이트
+		orderDao.updateOrderChangeDetailChgStat(order);
+		
+		// 2 주문상세이력정보 전체 등록
+		orderDao.createOrderDetailAllHst(order);
+		
+	}
+	
+	
 
 }
 

+ 3 - 4
src/main/java/com/style24/core/support/env/TscConstants.java

@@ -344,12 +344,11 @@ public class TscConstants {
 
 	// PG 구분
 	public enum PgGb {
-		INICIS("INICIS"),					// 이니시스
-		KAKAO("KAKAO"),						// 카카오페이
 		KCP("KCP"),							// KCP
+		KAKAO("KAKAO"),						// 카카오페이
 		NAVER("NAVER"),						// NAVERPAY
-		NICE("NICE"),						// NICEPAY
-		PAYCO("PAYCO");						// PAYCO
+		PAYCO("PAYCO"),						// PAYCO
+		ISTYLE("ISTYLE");					// 아이스타일 (상품권으로만결제시)
 
 		private String value;
 

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

@@ -78,6 +78,7 @@ public class Customer extends TscBaseDomain {
 	private String secedeDtlRsn;		// 탈퇴상세사유
 	private String secedeDt;			// 탈퇴일시
 	private String dormantDt;			// 휴면일시
+	private String rmDormantDt;			// 휴면해제일시
 	private String snsType;				// SNS 타입(NV:네이버, KK:카카오, YS:YES24)
 	private String snsId;				// SNS 아이디
 	private String memNo;				// YES24 가입시 사용

+ 2 - 0
src/main/java/com/style24/persistence/domain/Order.java

@@ -320,6 +320,7 @@ public class Order extends TscBaseDomain {
 	private Integer custCpnSq;
 	
 	// 주문포인트
+	private Integer pntHstSq;
 	private int pntPrate;
 	private int pntMrate;
 	private int pntAmt;
@@ -328,6 +329,7 @@ public class Order extends TscBaseDomain {
 	private String occurDtlDesc;
 	
 	// 주문상품권
+	private Integer gfcdHstSq;
 	private Integer custGfcdSq;
 	private String gfcdNm;
 	private String gfcdNo;

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

@@ -25,6 +25,7 @@ public class OrderChange extends TscBaseDomain {
 	private Integer ordChgSq;
 	private String chgGb;
 	private String chgReason;
+	private String chgReasonNm;
 	private String chgMemo;
 	private String chgerNm;
 	private String chgerPhnno;
@@ -103,6 +104,8 @@ public class OrderChange extends TscBaseDomain {
 	private String[] soldoutYnArr;
 	private int[] ordChgSqArr;
 
+	private String ipAddress;
+
 	// 교환 옵션 변경
 	private List<ChgOption> chgOptionList;
 
@@ -160,6 +163,7 @@ public class OrderChange extends TscBaseDomain {
 	private int rfDeliveryFee;						// 환불배송비
 	private int rfRealCnclAmt;						// 환불금액(배송비제외)
 	private String pgGb;							// PG구분
+	private String pgTid;							// PG거래ID
 	private String payStat;							// 결제상태
 	private String payMeans;						// 결제수단
 	private String payMeansNm;						// 결제수단명

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

@@ -47,6 +47,9 @@ public class Payment extends TscBaseDomain {
 	private String cashAuthNo;				// 현금영수증 승인번호
 	private String cashTradeNo;				// 현금영수증 거래번호
 	private String frontGb;					// 접근 디바이스 구분
+	private String accountNo;				// 환불계좌번호
+	private String accountNm;				// 환불계좌주명
+	private String bankCd;					// 환불계좌은행코드
 
 	// KCP
 	private int ordrIdxx;					// 가맹점 주문번호

+ 3 - 0
src/main/java/com/style24/persistence/mybatis/shop/TscCustomer.xml

@@ -160,6 +160,7 @@
 		     , SECEDE_RSN
 		     , SECEDE_DTL_RSN
 		     , SECEDE_DT
+		     , RM_DORMANT_DT
 		     , REG_NO
 		     , REG_DT
 		     , UPD_NO
@@ -204,6 +205,7 @@
 		     , SECEDE_RSN
 		     , SECEDE_DTL_RSN
 		     , SECEDE_DT
+		     , RM_DORMANT_DT
 		     , #{regNo}   AS REG_NO
 		     , NOW()      AS REG_DT
 		     , UPD_NO
@@ -428,6 +430,7 @@
 		     , C.HOME_BASE_ADDR = DC.HOME_BASE_ADDR
 		     , C.HOME_DTL_ADDR = DC.HOME_DTL_ADDR
 		     , C.CUST_STAT = 'G104_10'
+		     , C.RM_DORMANT_DT = NOW()
 		     , C.UPD_DT = NOW()
 		     , C.UPD_NO = #{updNo}
 		WHERE  C.CUST_NO = #{custNo}

+ 104 - 4
src/main/java/com/style24/persistence/mybatis/shop/TscOrder.xml

@@ -459,7 +459,7 @@
 		            THEN 'N'
 		            ELSE 'Y'
 		            END GIFT_PACK_CLOSE_YN
-		     , DATE_FORMAT(DATE_ADD(O.PAY_DT, INTERVAL 3 DAY), '%Y%m%d%H%i%S') AS GIFT_PACK_CLOSE_DT
+		     , DATE_ADD(O.PAY_DT, INTERVAL 3 DAY) AS GIFT_PACK_CLOSE_DT
 		  FROM TB_ORDER O
 		 INNER JOIN TB_ORDER_DETAIL OD
 		    ON O.ORD_NO = OD.ORD_NO
@@ -2277,7 +2277,6 @@
 			 , PG_GB
 		     , ORD_NO
 		     , PG_TID
-
 			 , PG_SHOP_ID
 			 , CARD_TYPE
 			 , CARD_KIND
@@ -2298,7 +2297,7 @@
 	</select>
 
 	<!-- 결제 취소 정보 생성 -->
-	<insert id="insertPaymentCancel" parameterType="Payment">
+	<insert id="insertPaymentCancel" parameterType="Payment" keyProperty="paySq">
 		/* TscOrder.insertPaymentCancel : 결제 취소 정보 생성 */
 		INSERT INTO TB_PAYMENT (
 			  ORD_NO
@@ -2311,6 +2310,7 @@
 			, PAY_STAT
 			, PG_GB
 			, PG_TID
+			, PG_TRADE_NO
 			, PG_SHOP_ID
 			, CARD_TYPE
 			, CARD_KIND
@@ -2338,6 +2338,7 @@
 			 , #{payStat}
 			 , PG_GB
 			 , #{pgTid}
+		     , #{pgTradeNo}
 			 , PG_SHOP_ID
 			 , CARD_TYPE
 			 , CARD_KIND
@@ -2360,7 +2361,7 @@
 	</insert>
 
 	<!-- PAYMENT INSERT -->
-	<insert id="insertPayment" parameterType="Payment">
+	<insert id="insertPayment" parameterType="Payment" keyProperty="paySq">
 		/* TscOrder.insertPayment : PAYMENT INSERT */
 		INSERT INTO TB_PAYMENT (
 			  ORD_NO
@@ -3669,6 +3670,105 @@
 		WHERE  ORD_NO = #{ordNo}
 	</update>
 	
+	<!-- 추가결제 취소,반품,교환 대상 상품목록 조회 -->
+	<select id="getAddPayGoodsList" parameterType="Order" resultType="Order">
+		/* TscOrder.getAddPayGoodsList */
+		SELECT Z.ORD_DTL_NO
+		     , Z.ORD_CHG_SQ
+		     , Z.CHG_STAT
+		     , Z.CHG_GB
+		     , Z.CHG_QTY
+		     , Z.ADD_PAY_COST
+		     , Z.REFUND_AMT
+		     , Z.BRAND_ENM
+		     , Z.BRAND_KNM
+		     , Z.GOODS_NM
+		     , Z.GOODS_CD
+		     , Z.CURR_PRICE
+		     , Z.CHGER_NM
+		     , Z.CHGER_PHNNO
+		     , SUM(Z.OPT_ADD_PRICE)                                                     AS OPT_ADD_PRICE
+		     , GROUP_CONCAT(Z.ITEM_NM    ORDER BY Z.ORD_DTL_ITEM_SQ SEPARATOR '!@!')    AS ITEM_NM
+		     , GROUP_CONCAT(Z.ITEM_CD    ORDER BY Z.ORD_DTL_ITEM_SQ)                    AS ITEM_CD
+		     , GROUP_CONCAT(Z.OPT_CD     ORDER BY Z.ORD_DTL_ITEM_SQ)                    AS OPT_CD
+		     , 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
+		     , GROUP_CONCAT(Z.ITEM_QTY   ORDER BY Z.ORD_DTL_ITEM_SQ)                    AS ITEM_QTYR
+		     , GROUP_CONCAT(Z.COLOR_NM   ORDER BY Z.ORD_DTL_ITEM_SQ)                    AS COLOR_NM
+		FROM (
+		    SELECT OCD.ORD_DTL_NO
+		         , OC.ORD_CHG_SQ
+		         , OCD.CHG_STAT
+		         , BR.BRAND_ENM
+		         , BR.BRAND_KNM
+		         , G.GOODS_NM 
+		         , G.GOODS_CD
+		         , OCD.CHG_QTY 
+		         , (SELECT GOODS_NM FROM TB_GOODS WHERE GOODS_CD = ODI.ITEM_CD) AS ITEM_NM
+		         , IFNULL((SELECT COLOR_KNM FROM TB_COLOR C WHERE COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G.MAIN_COLOR_CD ) AND USE_YN  = 'Y'), ODI.OPT_CD1) AS COLOR_NM
+		         , OD.CURR_PRICE
+		         , ODI.ORD_DTL_ITEM_SQ
+		         , ODI.OPT_ADD_PRICE
+		         , ODI.ITEM_CD
+		         , ODI.OPT_CD
+		         , ODI.OPT_CD1
+		         , ODI.OPT_CD2
+		         , ODI.ITEM_QTY
+		         , OC.ADD_PAY_COST
+		         , RF.REFUND_AMT
+		         , OC.CHG_GB
+		         , OC.CHGER_NM
+		         , OC.CHGER_PHNNO
+		    FROM   TB_ORDER_CHANGE_DETAIL OCD
+		    INNER  JOIN TB_ORDER_CHANGE OC
+		    ON     OCD.ORD_CHG_SQ = OC.ORD_CHG_SQ
+		    INNER  JOIN TB_ORDER_DETAIL OD
+		    ON     OCD.ORD_DTL_NO = OD.ORD_DTL_NO
+		    INNER  JOIN TB_ORDER_DETAIL_ITEM ODI
+		    ON     ODI.ORD_DTL_NO = OCD.ORD_DTL_NO
+		    INNER  JOIN TB_GOODS G
+		    ON     OD.GOODS_CD = G.GOODS_CD
+		    INNER  JOIN TB_BRAND BR
+		    ON     G.BRAND_CD = BR.BRAND_CD
+		    INNER  JOIN TB_REFUND RF
+		    ON     RF.ORD_CHG_SQ = OC.ORD_CHG_SQ
+		    WHERE  1=1
+		    AND    OC.ADD_PAY_COST <![CDATA[>]]> 0
+		    AND    OCD.ORD_CHG_SQ = #{ordChgSq}
+		    AND    OCD.CHG_STAT IN ('G685_11', 'G685_21', 'G685_32', 'G685_51')
+		    AND    OCD.DEL_YN = 'N'
+		) Z
+		GROUP  BY Z.ORD_DTL_NO
+		     , Z.ORD_CHG_SQ
+		     , Z.CHG_STAT
+		     , Z.CHG_GB
+		     , Z.CHG_QTY
+		     , Z.ADD_PAY_COST
+		     , Z.REFUND_AMT
+		     , Z.BRAND_ENM
+		     , Z.BRAND_KNM
+		     , Z.GOODS_NM
+		     , Z.GOODS_CD
+		     , Z.CURR_PRICE 
+		     , Z.CHGER_NM
+		     , Z.CHGER_PHNNO
+	</select>
+	
+	<!-- 추가결제 반품,교환 상태값 업데이트 -->
+	<update id="updateOrderChangeDetailChgStat" parameterType="Order">
+		/* TscOrder.updateOrderChangeDetailChgStat */
+		UPDATE TB_ORDER_CHANGE_DETAIL 
+		SET    CHG_STAT = CASE WHEN CHG_STAT = 'G685_51' THEN 'G685_50'
+		                       WHEN CHG_STAT = 'G685_21' THEN 'G685_20'
+		                       WHEN CHG_STAT = 'G685_32' THEN 'G685_31'
+		                       ELSE CHG_STAT
+		                       END 
+		     , UPD_NO = #{custNo}
+		     , UPD_DT = NOW()
+		WHERE  1=1
+		AND    ORD_CHG_SQ = #{ordChgSq}
+	</update>
+	
 </mapper>
 
 

+ 298 - 15
src/main/java/com/style24/persistence/mybatis/shop/TscOrderChange.xml

@@ -769,6 +769,9 @@
 			, RF_PNT_AMT
 			, RF_PRE_PNT_AMT
 			, RF_GFCD_USE_AMT
+			, RF_CNCL_AMT
+			, RF_DELIVERY_FEE
+			, RF_REAL_CNCL_AMT
 			, REG_NO
 			, REG_DT
 		) VALUES (
@@ -787,6 +790,9 @@
 			, #{rfPntAmt}
 			, #{rfPrePntAmt}
 			, #{rfGfcdUseAmt}
+			, #{rfCnclAmt}
+			, #{rfDeliveryFee}
+			, #{rfRealCnclAmt}
 			, #{regNo}
 			, NOW()
 		)
@@ -836,22 +842,25 @@
 	<update id="updateOrdFreegiftDel" parameterType="Order">
 		/* OrderChange.updateOrdFreegiftDel */
 		UPDATE TB_ORD_FREEGIFT_VAL
-		   SET DEL_YN= 'N'
+		   SET DEL_YN= 'Y'
 			 , UPD_NO = #{updNo}
 			 , UPD_DT = NOW()
 		 WHERE FREEGIFT_VAL_SQ IN (
-			 SELECT OFRV.FREEGIFT_VAL_SQ
-			   FROM TB_ORD_FREEGIFT OFR
-			   INNER JOIN TB_ORD_FREEGIFT_VAL OFRV
-			   ON OFR.ORD_FREEGIFT_SQ = OFRV.ORD_FREEGIFT_SQ
-			  WHERE 1 = 1
-				AND OFR.ORD_NO = (SELECT CASE WHEN SUM(X.ORD_QTY) > SUM(X.CNCL_RTN_QTY)
-												  THEN 0
-											  ELSE X.ORD_NO
-										 END
-									FROM TB_ORDER_DETAIL X
-								   WHERE 1 = 1
-									 AND X.ORD_NO = #{ordNo})
+			 SELECT Z.FREEGIFT_VAL_SQ
+			   FROM (
+				   SELECT OFRV.FREEGIFT_VAL_SQ
+					 FROM TB_ORD_FREEGIFT OFR
+					 INNER JOIN TB_ORD_FREEGIFT_VAL OFRV
+					 ON OFR.ORD_FREEGIFT_SQ = OFRV.ORD_FREEGIFT_SQ
+					WHERE 1 = 1
+					  AND OFR.ORD_NO = (SELECT CASE WHEN SUM(X.ORD_QTY) > SUM(X.CNCL_RTN_QTY)
+														THEN 0
+													ELSE X.ORD_NO
+											   END
+										  FROM TB_ORDER_DETAIL X
+										 WHERE 1 = 1
+										   AND X.ORD_NO = #{ordNo})
+			   ) Z
 		 )
 	</update>
 
@@ -1742,7 +1751,7 @@
 	<update id="updateOrderDetailItemForExchangeCancel" parameterType="Order">
 		/* OrderChange.updateOrderDetailItemForExchangeCancel */
 		UPDATE TB_ORDER_DETAIL_ITEM ODI
-			INNER JOIN TB_ORDER_CHANGE_DETAIL OCD
+		 INNER JOIN TB_ORDER_CHANGE_DETAIL OCD
 			ON ODI.ORD_DTL_NO = OCD.CHG_ORD_DTL_NO
 		   SET ODI.ORD_DTL_STAT = #{ordDtlStat}
 			 , ODI.UPD_NO = #{updNo}
@@ -1825,6 +1834,182 @@
 		   AND ODI.ORD_NO = #{ordNo}
 	</insert>
 
+	<!-- 전체취소 주문상세단품정보 수정 -->
+	<update id="updateOrderDetailForAllCancel" parameterType="Order">
+		/* TscOrderChange.updateOrderDetailForAllCancel */
+		UPDATE TB_ORDER_DETAIL
+		   SET ORD_DTL_STAT = #{ordDtlStat}
+			 , CNCL_RTN_AMT = ORD_AMT
+			 , CPN1_DC_AMT = 0
+			 , TMTB1_DC_AMT = 0
+			 , TMTB2_DC_AMT = 0
+			 , GOODS_CPN_DC_AMT = 0
+			 , CART_CPN_DC_AMT = 0
+			 , PNT_DC_AMT = 0
+			 , PRE_PNT_DC_AMT = 0
+			 , SAVE_PNT_AMT = 0
+			 , REAL_ORD_AMT = 0
+			 , GFCD_USE_AMT = 0
+			 , UPD_NO = #{updNo}
+			 , UPD_DT = NOW()
+		 WHERE ORD_NO = #{ordNo}
+	</update>
+
+	<!-- 전체취소 주문상세단품이력정보 등록 -->
+	<insert id="createOrderDetailHstForAllCancel" parameterType="Order">
+		/* TscOrderChange.createOrderDetailHstForAllCancel */
+		INSERT INTO TB_ORDER_DETAIL_HST (
+		       ORD_DTL_NO
+		     , ORD_NO
+		     , ORD_EXCH_GB
+		     , ORD_DTL_STAT
+		     , ORG_ORD_DTL_NO
+		     , SUPPLY_COMP_CD
+		     , GOODS_CD
+		     , DEAL_GOODS_CD
+		     , FORMAL_GB
+		     , GOODS_TYPE
+		     , LIST_PRICE
+		     , CURR_PRICE
+		     , DC_RATE
+		     , OPT_ADD_PRICE
+		     , ORD_QTY
+		     , ORD_AMT
+		     , CNCL_RTN_QTY
+		     , CNCL_RTN_AMT
+		     , CPN1_CPN_SQ
+		     , CPN1_DC_AMT
+		     , TMTB1_SQ
+		     , TMTB1_DC_AMT
+		     , TMTB2_SQ
+		     , TMTB2_DC_AMT
+		     , GOODS_CPN_SQ
+		     , GOODS_CPN_DC_AMT
+		     , CART_CPN_SQ
+		     , CART_CPN_DC_AMT
+		     , BURDEN_RATE
+		     , PNT_DC_AMT
+		     , PRE_PNT_DC_AMT
+		     , SAVE_PNT_AMT
+		     , REAL_ORD_AMT
+		     , GFCD_USE_AMT
+		     , VENDOR_ID
+		     , EXTMALL_ID
+		     , AGENT_ORDER_ID
+		     , EXTMALL_ORDER_ID
+		     , CHANGEABLE_YN
+		     , CHANGE_FEE_FREE_YN
+		     , RETURNABLE_YN
+		     , RETURN_FEE_FREE_YN
+		     , SOLDOUT_YN
+		     , SOLDOUT_MEMO
+		     , SOLDOUT_REG_NO
+		     , SOLDOUT_REG_DT
+		     , DELV_ADDR_SQ
+		     , DELV_FEE_CD
+		     , SHOT_DELV_YN
+		     , GIFT_PACK_YN
+		     , GIFT_ADDR_INP_YN
+		     , MAKE_GOODS_YN
+		     , ENTRY_NO
+		     , DELV_LOC_CD
+		     , DELV_ASSIGN_DT
+		     , DELV_ASSIGN_STAT
+		     , DSTRBT_NOTE
+		     , DELV_STDT
+		     , DELV_EDDT
+		     , SHIP_COMP_CD
+		     , INVOICE_NO
+		     , INVOICE_SEND_YN
+		     , SELL_STORE_CD
+		     , SELL_FEE_RATE
+		     , AF_LINK_CD
+		     , ITHR_CD
+		     , CONTENTS_LOC
+		     , PLAN_DTL_SQ
+		     , SOCIAL_SQ
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT ORD_DTL_NO
+			 , ORD_NO
+			 , ORD_EXCH_GB
+			 , #{ordDtlStat}
+			 , ORG_ORD_DTL_NO
+			 , SUPPLY_COMP_CD
+			 , GOODS_CD
+			 , DEAL_GOODS_CD
+			 , FORMAL_GB
+			 , GOODS_TYPE
+			 , LIST_PRICE
+			 , CURR_PRICE
+			 , DC_RATE
+			 , OPT_ADD_PRICE
+			 , ORD_QTY
+			 , ORD_AMT
+			 , ORD_QTY
+			 , ORD_AMT
+			 , CPN1_CPN_SQ
+			 , 0
+			 , TMTB1_SQ
+			 , 0
+			 , TMTB2_SQ
+			 , 0
+			 , GOODS_CPN_SQ
+			 , 0
+			 , CART_CPN_SQ
+			 , 0
+			 , BURDEN_RATE
+			 , 0
+			 , 0
+			 , 0
+			 , 0
+			 , 0
+			 , VENDOR_ID
+			 , EXTMALL_ID
+			 , AGENT_ORDER_ID
+			 , EXTMALL_ORDER_ID
+			 , CHANGEABLE_YN
+			 , CHANGE_FEE_FREE_YN
+			 , RETURNABLE_YN
+			 , RETURN_FEE_FREE_YN
+			 , SOLDOUT_YN
+			 , SOLDOUT_MEMO
+			 , SOLDOUT_REG_NO
+			 , SOLDOUT_REG_DT
+			 , DELV_ADDR_SQ
+			 , DELV_FEE_CD
+			 , SHOT_DELV_YN
+			 , GIFT_PACK_YN
+			 , GIFT_ADDR_INP_YN
+			 , MAKE_GOODS_YN
+			 , ENTRY_NO
+			 , DELV_LOC_CD
+			 , DELV_ASSIGN_DT
+			 , DELV_ASSIGN_STAT
+			 , DSTRBT_NOTE
+			 , DELV_STDT
+			 , DELV_EDDT
+			 , SHIP_COMP_CD
+			 , INVOICE_NO
+			 , INVOICE_SEND_YN
+			 , SELL_STORE_CD
+			 , SELL_FEE_RATE
+			 , AF_LINK_CD
+			 , ITHR_CD
+			 , CONTENTS_LOC
+			 , PLAN_DTL_SQ
+			 , SOCIAL_SQ
+			 , #{regNo}
+			 , NOW()
+			 , #{updNo}
+			 , NOW()
+		  FROM TB_ORDER_DETAIL
+		 WHERE ORD_NO = #{ordNo}
+	</insert>
+
 	<!-- 전체취소 주문상세단품정보 수정 -->
 	<update id="updateOrderDetailItemForAllCancel" parameterType="Order">
 		/* TscOrderChange.updateOrderDetailItemForAllCancel */
@@ -1938,7 +2123,9 @@
 		     , UPD_DT
 		  FROM TB_CUST_POINT_HST
 		 WHERE ORD_NO = #{ordNo}
+		<if test="ordDtlNo != null and ordDtlNo != ''">
 		   AND ORD_DTL_NO = #{ordDtlNo}
+		</if>
 		   AND OCCUR_GB = #{occurGb}
 		 ORDER BY CUST_PNT_SQ
 	</select>
@@ -1982,7 +2169,7 @@
 		 WHERE PNT_HST_SQ = #{pntHstSq}
 	</insert>
 	
-	<!-- 마이페이지 전체취소 사용포인트 원복 수정  -->
+	<!-- 마이페이지 사용포인트 원복 수정  -->
 	<update id="updateCustPointRollback" parameterType="Order">
 		/* TscOrderChange.createCustPointHstRollback */
 		UPDATE TB_CUST_POINT
@@ -2003,7 +2190,9 @@
 		     , CC.UPD_NO = #{updNo}
 		     , CC.UPD_DT = NOW()
 		 WHERE OD.ORD_NO = #{ordNo}
+		<if test="ordDtlNo != null and ordDtlNo != ''">
 		   AND OD.ORD_DTL_NO = #{ordDtlNo}
+		</if>
 	</update>
 
 	<!-- 마이페이지 장바구니쿠폰 원복 수정 -->
@@ -2054,7 +2243,9 @@
 		     , UPD_DT
 		  FROM TB_CUST_GIFTCARD_HST
 		 WHERE ORD_NO = #{ordNo}
+		<if test="ordDtlNo != null and ordDtlNo != ''">
 		   AND ORD_DTL_NO = #{ordDtlNo}
+		</if>
 		 ORDER BY CUST_GFCD_SQ
 	</select>
 
@@ -2141,6 +2332,98 @@
 		   AND PAY_GB = 'O'
 		   AND PAY_STAT IN ('G016_30', 'G016_00')
 	</select>
+	
+	<!-- 마이페이지 전체취소 주문변경상세 등록 -->
+	<insert id="createOrderChangeDetailForAllCancel" parameterType="OrderChange">
+		/* TscOrder.createOrderChangeDetailForAllCancel */
+		INSERT INTO TB_ORDER_CHANGE_DETAIL (
+		       ORD_CHG_SQ
+		     , ORD_DTL_NO
+		     , CHG_QTY
+		     , CHG_STAT
+		     , CHG_ORD_DTL_NO
+		     , WH_MEMO
+		     , COMPLETE_DT
+		     , DEL_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT #{ordChgSq}
+		     , ORD_DTL_NO
+		     , ORD_QTY
+		     , #{chgStat}
+		     , NULL
+		     , NULL
+		     , NOW()
+		     , 'N'
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		  FROM TB_ORDER_DETAIL
+		 WHERE ORD_NO = #{ordNo}
+	</insert>
+
+	<!-- 마이페이지 전체취소 주문변경상세 이력 등록-->
+	<insert id="createOrderChangeDetailHstForAllCancel" parameterType="OrderChange">
+		/* OrderChange.createOrderChangeDetailHstForAllCancel */
+		INSERT INTO TB_ORDER_CHANGE_DETAIL_HST (
+		       ORD_CHG_SQ
+		     , ORD_DTL_NO
+		     , CHG_QTY
+		     , CHG_STAT
+		     , CHG_ORD_DTL_NO
+		     , WH_MEMO
+		     , COMPLETE_DT
+		     , DEL_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT ORD_CHG_SQ
+			 , ORD_DTL_NO
+			 , CHG_QTY
+			 , #{chgStat}
+			 , CHG_ORD_DTL_NO
+			 , WH_MEMO
+			 , COMPLETE_DT
+			 , DEL_YN
+			 , #{regNo}
+			 , NOW()
+			 , #{updNo}
+			 , NOW()
+		  FROM TB_ORDER_CHANGE_DETAIL
+		 WHERE ORD_CHG_SQ = #{ordChgSq}
+	</insert>
+	
+	<!-- 마이페이지 전체취소 환불정보 조회 -->
+	<select id="getRefundInfoForAllCancel" parameterType="Order" resultType="Order">
+		/* TscOrderChange.getRefundInfoForAllCancel */
+		SELECT OD.ORD_NO
+			 , SUM(OD.ORD_AMT)          AS RF_CNCL_AMT
+			 , SUM(OD.CPN1_DC_AMT)      AS RF_CPN1_AMT
+			 , SUM(OD.TMTB1_DC_AMT)     AS RF_TMTB1_AMT
+			 , SUM(OD.TMTB2_DC_AMT)     AS RF_TMTB2_AMT
+			 , SUM(OD.GOODS_CPN_DC_AMT) AS RF_GOODS_CPN_AMT
+			 , SUM(OD.CART_CPN_DC_AMT)  AS RF_CART_CPN_AMT
+			 , 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
+			 , SUM(DF.DELV_FEE)         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
+		               FROM TB_DELIVERY_FEE
+		              WHERE DELV_FEE_GB = 'G018_10'
+		              GROUP BY ORD_NO) DF
+		    ON OD.ORD_NO = DF.ORD_NO
+		 WHERE OD.ORD_NO = #{ordNo}
+		 GROUP BY OD.ORD_NO
+	</select>
 </mapper>