Sfoglia il codice sorgente

마이페이지 반품 임시 커밋

card007 5 anni fa
parent
commit
bd9859cec6

+ 9 - 13
src/main/java/com/style24/core/biz/service/TscKakaoPayService.java

@@ -124,25 +124,21 @@ public class TscKakaoPayService {
 				payment.setCardNm(kakaoPay.getCard_info().getIssuer_corp());
 				payment.setCardType("신용".equals(kakaoPay.getCard_info().getCard_type()) ? "N" : "Y");
 				payment.setCardMips(kakaoPay.getCard_info().getInstall_month());
+				payment.setPayMeans(TscConstants.PayMeans.CREDIT_CARD.value());
+			} else if ("MONEY".equals(kakaoPay.getPayment_method_type())) {
+				payment.setPayMeans(TscConstants.PayMeans.KAKAO_MONEY.value());
 			}
-			
-			// TODO
-			// payMeans 처리 해야됨
-			// "CARD".equals(kakaoPay.getPayment_method_type())
-			// "MONEY".equals(kakaoPay.getPayment_method_type())
-			// kakaoPay.getAmount().getPoint() == kakaoPay.getAmount().getTotal() 포인트결제
-			
+
+			// 결제금액과 사용포인트금액이 같으면 카카오포인트 결제 처리
+			if (kakaoPay.getAmount().getPoint() == kakaoPay.getAmount().getTotal()) {
+				payment.setPayMeans(TscConstants.PayMeans.KAKAO_POINT.value());
+			}
+
 			payment.setResCd(String.valueOf(statusCode));
 			payment.setResMsg(message.getMessage("SUCC_0004"));
 		} else {
-			// int code = Integer.parseInt(kakaoPay.getCode());
-			// String msg = kakaoPay.getMsg();
-			// String resultCode = kakaoPay.getExtras().getMethod_result_code();
 			String resultMessage = kakaoPay.getExtras().getMethod_result_message();
-
 			throw new IllegalStateException(resultMessage);
-			// payment.setResCd(String.valueOf(code));
-			// payment.setResMsg(resultMessage);
 		}
 
 		return payment;

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

@@ -57,7 +57,7 @@ public class TscNaverPayService {
 		String paymentReadyUrl = env.getProperty("naverPay.apiUrl") + env.getProperty("naverPay.partnerId") + env.getProperty("naverPay.paymentReadyUrl");
 
 		// Redirect URL 설정
-		String redirectUrl = "http://" + env.getProperty("domain.front") + env.getProperty("naverPay.paymentRedirectUrl");
+		String redirectUrl = "http:" + env.getProperty("domain.front") + env.getProperty("naverPay.paymentRedirectUrl");
 
 		// API 파라메터 설정
 		NaverPay naverPay = new NaverPay();
@@ -117,13 +117,15 @@ public class TscNaverPayService {
 				payment.setCardNm(getCardNm(naverPay.getBody().getDetail().getCardCorpCode()));
 				payment.setCardType("N");	// 신용카드 결제
 				payment.setCardMips(String.valueOf(naverPay.getBody().getDetail().getCardInstCount()));
+				payment.setPayMeans(TscConstants.PayMeans.CREDIT_CARD.value());
+			} else if ("BANK".equals(naverPay.getBody().getDetail().getPrimaryPayMeans())) {
+				payment.setPayMeans(TscConstants.PayMeans.ACCOUNT_TRANSFER.value());
 			}
 
-			// TODO
-			// payMeans 처리 해야됨
-			// "CARD".equals(naverPay.getBody().getDetail().getPrimaryPayMeans())
-			// "BANK".equals(naverPay.getBody().getDetail().getPrimaryPayMeans())
-			// naverPay.getBody().getDetail().getTotalPayAmount() == naverPay.getBody().getDetail().getNpointPayAmount() 포인트결제
+			// 결제금액과 사용포인트금액이 같으면 카카오포인트 결제 처리
+			if (naverPay.getBody().getDetail().getTotalPayAmount() == naverPay.getBody().getDetail().getNpointPayAmount()) {
+				payment.setPayMeans(TscConstants.PayMeans.NAVER_POINT.value());
+			}
 		}
 
 		payment.setResCd(naverPay.getCode());

+ 1372 - 1528
src/main/java/com/style24/core/biz/service/TscOrderChangeService.java

@@ -173,7 +173,6 @@ public class TscOrderChangeService {
 		String chgReasonNm 					= "고객변심";														// 변경사유명
 		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");									// 결제수단
@@ -185,7 +184,6 @@ public class TscOrderChangeService {
 		String ordDtlStat					= TscConstants.OrderDetailStat.PAYMENT_AFTER_CANCEL.value();	// 주문상세상태
 		String chgStat						= TscConstants.OrderChangeStat.PAYMENT_AFTER_CANCEL.value();	// 주문변경상태
 		int realOrdAmt						= map.getInt("spanSumRealOrdAmt");								// 부분취소 전 결제금액
-		int pgCancelAmt						= 0;															// PG취소금액
 		String modType;
 
 		// 무통장입금 결제 주문 전체취소 상태값 처리
@@ -337,32 +335,18 @@ public class TscOrderChangeService {
 				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(custNo);
-				// paymentOrder.setUpdNo(custNo);
-				//
-				// orderChangeDao.createPayment(paymentOrder);
-
 				// 3-4. PG 결제 취소 처리 (상품권으로만 결제 시 PG점프)
 				int spanRealCnclRtnAmt = obj.getRealOrdAmt();			// 취소금액합계
 				int sumDeliveryFee = obj.getDelvFee();					// 배송비합계
 				int spanRefundAmt = spanRealCnclRtnAmt + sumDeliveryFee;
-				
+
 				Payment pg = new Payment();
 				pg.setOrdNo(ordNo);
 				pg.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
 				pg.setPayGb("O");
 				pg.setPgTid(pgTid);
-				pg.setPayAmt(spanRefundAmt);
+				pg.setPayMeans(payMeans);
+				pg.setPartCancelAmt(spanRefundAmt);
 				pg.setLeftAmt(realOrdAmt);
 				pg.setRegNo(custNo);
 				pg.setUpdNo(custNo);
@@ -427,8 +411,6 @@ public class TscOrderChangeService {
 
 					orderChangeDao.createDeliveryFee(delvFeeOrder);
 				}
-
-				pgCancelAmt += spanRefundAmt;
 			}
 
 			// 4. 장바구니, 배송비 쿠폰 원복 및 사은품 전체 취소 처리 (마지막 취소 시)
@@ -448,1697 +430,1559 @@ public class TscOrderChangeService {
 			}
 		}
 
-		// TODO
-		// 14. 취소 완료 알림톡 발송 에정
-
 		return map;
 	}
 
 
-		/**
-		 * 취소완료 (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);
-				}
+	/**
+	 * 취소완료 (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<>();
 
-				// 4.1 취소수량이 존재하면 주문상세단품정보 수정 및 주문상세단품이력정보 등록
-				if (cancelOrderRefundPo.getOrdCanChgQty() > 0) {
+		for (int i=0 ; i<cancelOrderRefundList.size() ; i++) {
+			Order cancelOrderRefundPo = cancelOrderRefundList.get(i);
+			cancelOrderRefundPo.setRegNo(userNo);
+			cancelOrderRefundPo.setUpdNo(userNo);
 
-					// 2021.01.26 취소완료, 취소신청완료(취소승인) 일때실행
-					// 4.2 주문상세단품정보수정 (TB_ORDER_DETAIL_ITEM)
-					if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
-						orderChangeDao.updateOrderDetailItem(cancelOrderRefundPo);
+			// 2020.01.05 추후 무통장입금전 전체 취소시 분기 로직 추가 예정
+			// 2021.01.26 취소완료, 취소신청완료(취소승인) 일때실행
+			if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
+				cancelOrderRefundPo.setOrdDtlStat(ordDtlStat);
+			}
 
+			// 4.1 취소수량이 존재하면 주문상세단품정보 수정 및 주문상세단품이력정보 등록
+			if (cancelOrderRefundPo.getOrdCanChgQty() > 0) {
 
-						// 4.3 주문상세단품정보이력등록 (TB_ORDER_DETAIL_ITEM_HST) 
-						orderChangeDao.createOrderDetailItemHst(cancelOrderRefundPo);
-					}
+				// 2021.01.26 취소완료, 취소신청완료(취소승인) 일때실행
+				// 4.2 주문상세단품정보수정 (TB_ORDER_DETAIL_ITEM)
+				if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
+					orderChangeDao.updateOrderDetailItem(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.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);
-					}
+				// 4.5 주문상세단위 데이타 저장(주문상세 단위)
+				if (!temp) {
+					cancelOrderDetailList.add(cancelOrderRefundPo);
 				}
 			}
+		}
 
 
-			// 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);
-					}
-
-					// 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();
+		// 2021.01.21 DELV_FEE 배송번호 단위로 TB_ORDER_CHANGE 생성
+		// 5. 주문변경정보, 주문정보, 환불정보 (업체코드 & 배송정책코드)
+		for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
 
-						// 5.3.0 DEVL_FEE_CD 단위로 주문상세 정보 처리
-						if (obj.getDelvFeeCd().equals(vo.getDelvFeeCd())) {
+			Order obj = cancelDelvRefundList.get(i);
 
-							// 2021.01.26 취소완료, 취소신청완료 일때실행
-							// 2020.01.05 추후 무통장입금전 전체 취소시 분기로직 추가 예정
-							if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
-								vo.setOrdDtlStat(ordDtlStat);
-							} else {
-								vo.setOrdDtlStat(TscConstants.OrderChangeStat.CANCEL.value()); 						// 취소신청
-							}
+			// 취소금액이 있을때 처리
+			if (obj.getCnclRtnAmt() > 0) {
 
-							// 5.3.1 주문변경상세정보 이력등록
-							orderChangeDao.createOrderDetailHstCnclRtn(vo);
+				// 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);
+				}
 
-							// 2021.01.26 취소완료, 취소신청완료 일때실행
-							// 5.3.2 주문변경상세정보 수정
-							if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
-								orderChangeDao.updateOrderDetail(vo);
-							}
+				// 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.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.0 DEVL_FEE_CD 단위로 주문상세 정보 처리
+					if (obj.getDelvFeeCd().equals(vo.getDelvFeeCd())) {
 
-							// 5.3.4 적립예정포인트 수정
-							int savePntAmt = vo.getSavePntAmt();
-							vo.setOccurGb(TscConstants.PointOccurGb.EXPECT_POINT.value());
+						// 2021.01.26 취소완료, 취소신청완료 일때실행
+						// 2020.01.05 추후 무통장입금전 전체 취소시 분기로직 추가 예정
+						if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
+							vo.setOrdDtlStat(ordDtlStat);
+						} else {
+							vo.setOrdDtlStat(TscConstants.OrderChangeStat.CANCEL.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);
+						// 5.3.1 주문변경상세정보 이력등록
+						orderChangeDao.createOrderDetailHstCnclRtn(vo);
 
-								// 적립예정포인트 취소 이력 생성
-								orderChangeDao.createCustPointHstRollback(point);
-							}
+						// 2021.01.26 취소완료, 취소신청완료 일때실행
+						// 5.3.2 주문변경상세정보 수정
+						if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
+							orderChangeDao.updateOrderDetail(vo);
+						}
 
-							// 5.3.5 상품쿠폰원복
-							if (leftQty == 0) {
-								orderChangeDao.updateGoodsCpnRollback(vo);
-							}
+						// 5.3.3 사용포인트원복
+						int pntDcAmt = vo.getPntDcAmt();
+						vo.setOccurGb(TscConstants.PointOccurGb.USE_POINT.value());
 
-							// 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);
+						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.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);
+								point.setOccurGb(TscConstants.PointOccurGb.USE_POINT_CANCEL.value());
+								point.setOccurDtlDesc("포인트사용취소");
+								point.setRegNo(userNo);
+								point.setUpdNo(userNo);
+
+								// 포인트 사용 취소 이력 생성 및 포인트 수정
+								orderChangeDao.createCustPointHstRollback(point);
+								orderChangeDao.updateCustPointRollback(point);
 							}
 						}
-					}
-
-					// 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.3.4 적립예정포인트 수정
+						int savePntAmt = vo.getSavePntAmt();
+						vo.setOccurGb(TscConstants.PointOccurGb.EXPECT_POINT.value());
 
-					// 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);
-					}
+						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);
 
-					// 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);
+							// 적립예정포인트 취소 이력 생성
+							orderChangeDao.createCustPointHstRollback(point);
 						}
-					}
-
-					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);
-				}
-			}
 
-			// TODO
-			// 14. 취소 완료 알림톡 발송 에정
+						// 5.3.5 상품쿠폰원복
+						if (leftQty == 0) {
+							orderChangeDao.updateGoodsCpnRollback(vo);
+						}
 
-			//int a = 100/0;
+						// 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();
+								}
 
-			return mav;
-		}
+								giftCard.setOccurGb(TscConstants.GiftCardOccurGb.USE_GIFTCARD_CANCEL.value());
+								giftCard.setOccurDtlDesc("상품권사용취소");
+								giftCard.setRegNo(userNo);
+								giftCard.setUpdNo(userNo);
 
-		/**
-		 * 반품신청 (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;
+								// 포인트 사용 취소 이력 생성 및 포인트 수정
+								orderChangeDao.createCustGiftCardHstRollback(giftCard);
+								orderChangeDao.updateCustGiftCardRollback(giftCard);
 							}
 						}
-					}
 
-					// 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.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 주문변경상세정보 등록
+						OrderChange changeDetailPo = new OrderChange();
+						changeDetailPo.setOrdChgSq(orderChange.getOrdChgSq());
+						changeDetailPo.setOrdDtlNo(vo.getOrdDtlNo());
+						changeDetailPo.setChgQty(vo.getOrdCanChgQty());
+						changeDetailPo.setRegNo(userNo);
+						changeDetailPo.setUpdNo(userNo);
 
-					// 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);
+						// 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);
 						}
 					}
-
-					// 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();
-			}
-
-			// 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 생성
+				// 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);
 				}
 
-				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);
+				// 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);
+				}
 
-					orderChangeDao.createOrderChangeDetail(orderChangeDetail);
+				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);
 
-					preOrdDtlNo = ordDtlNo;
+				// 2021.01.26 취소완료, 취소신청완료 일때실행
+				if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
+					orderChangeDao.createPayment(paymentOrder);
 				}
 
-				// 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);
+				// 5.5 환불금액 등록
+				Order refundOrder = new Order();
+				refundOrder.setOrdNo(ordNo);
+				refundOrder.setPaySq(paymentOrder.getPaySq());
+				refundOrder.setOrdChgSq(orderChange.getOrdChgSq());
+				refundOrder.setRegNo(userNo);
 
-				// 9. TB_ORDER_DETAIL_ITEM_HST 등록
-				orderChangeDao.createOrderDetailItemHstForExchange(ordDtlItem);
-			}
+				// 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());
 
-			// 10. TB_SELL_QTY 등록
-			OrderChange sellQty = new OrderChange();
-			sellQty.setSellGb(TscConstants.SellGb.EXCHANGE.value());
-			sellQty.setRegNo(regNo);
-			sellQty.setOrdChgSq(ordChgSq);
+				refundOrder.setRaNo(mav.get("accountNo").toString());
+				refundOrder.setRaNm(mav.get("accountNm").toString());
+				refundOrder.setRaBank(mav.get("bankCd").toString());
 
-			orderChangeDao.createSellQtyForExchange(sellQty);
+				// 2021.01.26 취소완료, 취소신청 일때실행
+				if ("cnclComplete".equals(reqGbn) || "cnclReq".equals(reqGbn)) {
+					orderChangeDao.createRefund(refundOrder);
+				}
 
-			result.set("status", GagaResponseStatus.SUCCESS.getCode());
+				// 5.6 결제금액이 무료배송금액보다 작으면 배송비 신규 등록
+				if (obj.getAddDelvFee() > 0) {
+					Order delvFeeOrder = new Order();
 
-			return result;
-		}
+					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);
 
-		/**
-		 * 교환 추가배송비 조회
-		 *
-		 * @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();
+					// 2021.01.26 취소완료, 취소신청완료일때실행
+					if ("cnclComplete".equals(reqGbn) || "cnclReqComplete".equals(reqGbn)) {
+						orderChangeDao.createDeliveryFee(delvFeeOrder);
 					}
-
-					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();					// 수정자번호
-
-			// 추가배송비 조회
-			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);
-
-				// TODO
-				// PG취소처리
+				pgCancelAmt += spanRefundAmt;
 			}
-
-			// 교환철회 처리
-			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);
-
-			// TB_ORDER_CHANGE_DETAIL 상태값 변경 및 DEL_YN Y로 업데이트
-			orderChangeDao.updateOrderChangeDtlCancel(exchangeCancel);
-
-			// 결과값 처리
-			result.set("status", GagaResponseStatus.SUCCESS.getCode());
-
-			return result;
 		}
 
-		/**
-		 * 교환회수
-		 * @param Order
-		 * @return Order
-		 * @author jsh77b
-		 * @since 2021. 01. 19
-		 */
-		public GagaMap exchRtn(List<Order> cnclRtnList) {
-			GagaMap mav = new GagaMap();
-
+		// 마지막 취소 시
+		if ("Y".equals(allLastCanYn)) {
+			// 장바구니, 배송비 쿠폰 원복처리
+			Order coupon = new Order();
+			coupon.setOrdNo(ordNo);
+			coupon.setUpdNo(userNo);
+			orderChangeDao.updateCartCpnRollback(coupon);
+			orderChangeDao.updateDeliveryCpnRollback(coupon);
 
-			return mav;
+			// 12. 사은품 전체 취소 (전체취소시 적용) 추후 사은품 관련 취소 로직 개발 예정
+			Order freegiftOrder = new Order();
+			freegiftOrder.setOrdNo(ordNo);
+			freegiftOrder.setUpdNo(userNo);
+			orderChangeDao.updateOrdFreegiftDel(freegiftOrder);
 		}
 
-		/**
-		 * 교환발송완료
-		 * @param Order
-		 * @return Order
-		 * @author jsh77b
-		 * @since 2021. 01. 19
-		 */
-		public GagaMap exchComplete(List<Order> cnclRtnList) {
-			GagaMap mav = new GagaMap();
 
 
-			return mav;
+		// 상품권으로만 결제 시 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);
+			}
 		}
 
+		// TODO
+		// 14. 취소 완료 알림톡 발송 에정
 
+		//int a = 100/0;
 
 
+		return mav;
+	}
 
+	/**
+	 * 마이페이지 반품 처리
+	 * 
+	 * @param GagaMap
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 04. 19
+	 */
+	@SuppressWarnings("unchecked")
+	@Transactional("shopTxnManager")
+	public GagaMap returnRequest(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 chgReasonNm 					= "고객변심";														// 변경사유명
+		String chgMemo 						= map.getString("chgMemo");										// 변경메모
+		String chgerNm 						= map.getString("chgerNm");										// 변경자
+		String chgerPhnno 					= map.getString("chgerPhnno");									// 변경핸드폰번호
+		String chgerTelno 					= map.getString("chgerTelno");									// 변경전화번호
+		String chgerEmail 					= map.getString("chgerEmail");									// 변경이메일
+		String chgerZipcode 				= map.getString("chgerZipcode");								// 변경우편번호
+		String chgerBaseAddr 				= map.getString("chgerBaseAddr");								// 변경기본주소
+		String chgerDtlAddr 				= map.getString("chgerDtlAddr");								// 변경상세주소
+		String chgerRtnMemo					= map.getString("chgerRtnMemo");								// 반품메모
+		String isCustomer					= map.getString("isCustomer");									// 귀책사유 (고객, 회사)
+		String accountNo					= map.getString("accountNo");									// 환불계좌번호
+		String accountNm					= map.getString("accountNm");									// 환불계좌주명
+		String bankCd						= map.getString("bankCd");										// 환불계좌은행코드
+		String chgGb						= TscConstants.OrderChangeGb.RETURN.value(); 					// 취소요청 (공톹코드:G680)
+		String chgStat						= TscConstants.OrderChangeStat.RETURN.value();					// 주문변경상태
+		String wdGb							= map.getString("wdGb");										// 회수방법
+		String wdInvoiceNo					= map.getString("wdInvoiceNo");									// 회수송장번호
 
+		// 2. 주문상세단품정보등록, 변경 (단품단위)
+		List<Order> cancelOrderDetailList = new ArrayList<>();
+		List<Integer> ordDtlNoList = new ArrayList<>();
 
+		for (Order cancelOrderRefundPo : cancelOrderRefundList) {
+			cancelOrderRefundPo.setRegNo(custNo);
+			cancelOrderRefundPo.setUpdNo(custNo);
 
+			// 2-2. 주문상세단위로 데이터 설정
+			Integer ordDtlNo = cancelOrderRefundPo.getOrdDtlNo();
+			if (!ordDtlNoList.contains(ordDtlNo)) {
+				cancelOrderDetailList.add(cancelOrderRefundPo);
+				ordDtlNoList.add(ordDtlNo);
+			}
+		}
 
+		// 3. 주문변경정보, 주문정보, 환불정보 (배송정책코드 별)
+		for (Order obj : cancelDelvRefundList) {
+			// 취소금액 있을 시 처리
+			if (obj.getCnclRtnAmt() > 0) {
+				// 3-1. 주문변경정보 생성
+				OrderChange orderChange = new OrderChange();
+				orderChange.setOrdNo(ordNo);
+				orderChange.setChgGb(chgGb);
+				orderChange.setChgReason(chgReason);
+				orderChange.setChgMemo(chgMemo);
+				orderChange.setChgerNm(chgerNm);
+				orderChange.setChgerPhnno(chgerPhnno);
+				orderChange.setChgerTelno(chgerTelno);
+				orderChange.setChgerEmail(chgerEmail);
+				orderChange.setChgerRtnMemo(chgerRtnMemo);
+				orderChange.setChgerZipcode(chgerZipcode);
+				orderChange.setChgerBaseAddr(chgerBaseAddr);
+				orderChange.setChgerDtlAddr(chgerDtlAddr);
+				orderChange.setWdGb(wdGb);
+				orderChange.setWdInvoiceNo(wdInvoiceNo);
+				orderChange.setAddPayCost(0);
+				orderChange.setAddPayAmt(0);
+				orderChange.setRegNo(custNo);
+				orderChange.setUpdNo(custNo);
 
+				orderChangeDao.createOrderChange(orderChange);
 
+				// 3-2. 주문상세정보 수정
+				for (Order vo : cancelOrderDetailList) {
+					// 배송정책코드 별 주문상세 처리
+					if (obj.getDelvFeeCd().equals(vo.getDelvFeeCd())) {
+						// 3-2-1. 주문상세정보 이력등록
+						// orderChangeDao.createOrderDetailHstCnclRtn(vo);
 
+						// 3-2-2. 주문변경상세정보 및 이력 등록
+						OrderChange changeDetailPo = new OrderChange();
+						changeDetailPo.setOrdChgSq(orderChange.getOrdChgSq());
+						changeDetailPo.setOrdDtlNo(vo.getOrdDtlNo());
+						changeDetailPo.setChgQty(vo.getOrdCanChgQty());
+						changeDetailPo.setChgStat(chgStat);
+						changeDetailPo.setRegNo(custNo);
+						changeDetailPo.setUpdNo(custNo);
 
+						orderChangeDao.createOrderChangeDetail(changeDetailPo);
+						orderChangeDao.createOrderChangeDetailHst(changeDetailPo);
+					}
+				}
 
+				// 3-3. 상품재고원복
+				orderChange.setSellGb(TscConstants.SellGb.ORDER_CANCEL.value());
+				orderChangeDao.createSellQty(orderChange);
 
+				// 3-4. PG 결제 취소 처리 (상품권으로만 결제 시 PG점프)
+				int spanRealCnclRtnAmt 		= obj.getRealOrdAmt();		// 취소금액합계
+				int sumDeliveryFee 			= obj.getDelvFee();			// 배송비합계
+				int spanTotDeliveryFee 		= obj.getAddDelvFee();		// 추가배송비합계
+				int spanTotRtnDelvFee 		= obj.getRtnDelvFee();		// 반품배송비합계
+				int spanRefundAmt;
+
+				// 고객사유 : 환불금액계산 = (취소금액 + 배송비) - 추가배송비
+				if ("true".equals(isCustomer)) {
+					spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee) - spanTotDeliveryFee - spanTotRtnDelvFee;
+				}
+				// 회사사유 : 환불금액계산 = (취소금액 + 배송비)
+				else {
+					spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee);
+				}
 
+				// 3-5. 환불정보 등록
+				Order refundOrder = new Order();
+				refundOrder.setOrdNo(ordNo);
+				refundOrder.setPaySq(0);
+				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.getPntDcAmt());
+				refundOrder.setRfPrePntAmt(obj.getPrePntDcAmt());
+				refundOrder.setRfGfcdUseAmt(obj.getGfcdAmt());
+				refundOrder.setRfCnclAmt(obj.getCnclRtnAmt());
+				refundOrder.setRfDeliveryFee(obj.getAddDelvFee());
+				refundOrder.setRfRealCnclAmt(spanRefundAmt + obj.getAddDelvFee());
+				refundOrder.setRaNo(accountNo);
+				refundOrder.setRaNm(accountNm);
+				refundOrder.setRaBank(bankCd);
+				refundOrder.setRegNo(custNo);
 
+				orderChangeDao.createRefund(refundOrder);
+			}
+		}
 
+		return map;
+	}
 
+	/**
+	 * 반품신청 (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);
+				}
+			}
+		}
 
+		// 2021.01.21 DELV_FEE 배송번호 단위로 TB_ORDER_CHANGE 생성
+		// 4. 주문변경정보, 주문정보, 환불정보 (업체코드 & 배송정책코드)
+		for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
 
-		/**
-		 * 취소신청 (admin, npay, extmall) (사용안함)
-		 * @param Order
-		 * @return Order
-		 * @author jsh77b
-		 * @since 2021. 01. 19
-		 */
-		@SuppressWarnings("unchecked")
-		@Transactional("shopTxnManager")
-		public GagaMap cnclReq(GagaMap mav, int userNo) {
+			Order obj = cancelDelvRefundList.get(i);
 
-			// 1. 세션회원조회
-			//userNo = userNo;
+			// 취소금액이 있을때 처리
+			if (obj.getCnclRtnAmt() > 0) {
 
-			// 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 단위)
+				// 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);
 
-			// 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();										// 신청구분
+				orderChangeDao.createOrderChange(orderChange);
 
-			// 4. 주문상세단품정보등록,변경 (단품단위)
-			List<Order> cancelOrderDetailList = new ArrayList<Order>();
+				// 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()); 					// 반품신청
 
-			for (int i=0 ; i<cancelOrderRefundList.size() ; i++) {
-				Order cancelOrderRefundPo = cancelOrderRefundList.get(i);
-				cancelOrderRefundPo.setRegNo(userNo);
-				cancelOrderRefundPo.setUpdNo(userNo);
+					// 5.3.0 DEVL_FEE_CD 단위로 주문상세 정보 처리
+					if (obj.getDelvFeeCd().equals(vo.getDelvFeeCd())) {
 
-				// 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;
-							}
-						}
-					}
+						// 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);
 
-					// 4.5 주문상세단위 데이타 저장(주문상세 단위)
-					if (!temp) {
-						cancelOrderDetailList.add(cancelOrderRefundPo);
+						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);
 			}
+		}
 
-			// 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("");
+		return mav;
+	}
 
-					orderChangeDao.createOrderChange(orderChange);
+	/**
+	 * 반품신청철회 (admin)
+	 * @param Order
+	 * @return Order
+	 * @author jsh77b
+	 * @since 2021. 01. 19
+	 */
+	@Transactional("shopTxnManager")
+	public GagaMap rtnReqCancel(GagaMap mav, int userNo) {
 
-					// 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);
+		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");
 
-							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);
-					}
+		// 1. 주문변경정보 (TB_ORDER_CHANGE_DTL(수정))
+		orderChangeDao.updateOrderChangeDtlCancel(order);
+
+		// 2. 주문정보 이력 등록 (TB_ORDER_DETAIL_HST(등록))
+		orderChangeDao.createOrderDtlHstCancel(order);
 
-					// 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());
+		// TODO
+		// 3. PG 실행 (취소시 추가결제금액 취소처리)
 
-					orderChangeDao.createRefund(refundOrder);
-				}
-			}
+		return mav;
+	}
+
+	/**
+	 * 반품완료
+	 * @param Order
+	 * @return Order
+	 * @author jsh77b
+	 * @since 2021. 01. 19
+	 */
+	public GagaMap rtnComplete(List<Order> cnclRtnList) {
+		GagaMap mav = new GagaMap();
 
-			return mav;
+
+		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. 재고 체크 (세트아이템 포함)
 
-		/**
-		 * 취소신청승인 (admin) (사용안함)
-		 * @param Order
-		 * @return Order
-		 * @author jsh77b
-		 * @since 2021. 01. 19
-		 */
-		@Transactional("shopTxnManager")
-		public GagaMap cnclcnclComplete(GagaMap mav, int userNo) {
 
-			// 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);
 
-			// 2. 사용포인트원복 (TB_CUST_POINT(수정), TB_CUST_POINT_HST(등록))
+		orderChangeDao.createDeliveryAddr(deliveryAddr);
 
-			// 3. 사용쿠폰원복 (TB_CUST_COUPON(수정))
+		// 생성된 delvAddrSq 등록
+		int delvAddrSq = deliveryAddr.getDelvAddrSq();
 
-			// 4. 상품권금액원복 (TB_CUST_GIFTCARD(수정), TB_CUST_GIFTCARD_HST(등록))
+		// 교환대상 정보 등록
+		int preOrdDtlNo = 0;
+		String preDelvFeeCd = "";
+		int ordChgSq = 0;
+		int exchangeOrdDtlNo = 0;
 
-			// 5. 사은품취소 (TB_ORD_FREEGIFT(수정), TB_ORD_FREEGIFT(등록), TB_ORD_FREEGIFT_VAL(수정))
+		for (Order order : excReqList) {
+			String delvFeeCd = order.getDelvFeeCd();
+			int chgQty = order.getChgQty();
+			String ordChgOpt = order.getOrdChgOpt();
+			int ordDtlNo = order.getOrdDtlNo();
 
-			// 6. 주문정보 수정 (TB_ORDER_DETAIL(수정), TB_ORDER_DETAIL_HST(등록), TB_ORDER_DETAIL_ITEM(수정), TB_ORDER_DETAIL_ITEM_HST(등록))
+			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);
 
-			// 7. 재고정보 (TB_SELL_QTY(등록))
+				orderChangeDao.createOrderChange(orderChange);
 
-			// 8. 주문변경정보 (TB_ORDER_CHANGE(수정), TB_ORDER_CHANGE_DTL(수정), TB_REFUND(수정))
+				preDelvFeeCd = delvFeeCd;
 
-			// PG 결제 금액 체크
-			// 9. PG 실행
+				// 생성된 ordChgSq 설정
+				ordChgSq = orderChange.getOrdChgSq();
 
-			// 10. 결제정보 (TB_PAYMENT(등록))
+				log.info("############# ordChgSq >>> {} ##############", ordChgSq);
 
-			// 11. 추가배송비발생 (TB_PAYMENT(등록))
+				// 4. TB_DELIVERY_FEE 추가배송비 등록
+				int delvFee = 0;
 
-			return mav;
-		}
+				if ("true".equals(excReq.getIsCustomer())) {
+					delvFee = "W".equals(wdGb) ? order.getExcDelvFee() : order.getRtnDelvFee();
+				}
 
-		/**
-		 * 주문 환불계좌
-		 *
-		 * @param order - 주문정보
-		 * @return Order
-		 * @author jsh77b
-		 * @since 2021. 01. 04.
-		 */
-		public Collection<Order> getRefundAccount(Order order) {
-			return orderChangeDao.getRefundAccount(order);
-		}
+				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);
 
-		/**
-		 * 환불계좌 저장
-		 *
-		 * @param order - 주문정보
-		 * @return TsaOrder
-		 * @author jsh77b
-		 * @since 2021. 01. 05.
-		 */
-		public int saveRefundAccount(Order order) {
-
-			// 환불계좌 유무 체크 후 등록
-			if (orderChangeDao.getRefundAccountCheck(order) < 1) {
-				orderChangeDao.saveRefundAccount(order);
+				// TODO
+				// 추가배송비 결제 여부 확인 후 TB_PAYMENT 생성
 			}
 
-			return 1;
-		}
+			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);
 
-		/**
-		 * 교환 정보 조회
-		 *
-		 * @param OrderChange - 주문 변경 정보
-		 * @return Collection<OrderChange>
-		 * @author card007
-		 * @since 2021. 02. 01
-		 */
-		public Collection<Order> getExchangeInfo(Order order) {
-			return orderChangeDao.getExchangeInfo(order);
-		}
+				orderChangeDao.createOrderDetailForExchange(ordDtl);
 
-		/**
-		 * 전체취소 요청
-		 *
-		 * @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);
+				// 생성된 ordDtlNo 설정
+				exchangeOrdDtlNo = ordDtl.getExchangeOrdDtlNo();
 
-			// 환불금액 설정
-			int refundAmt = payment.getPayAmt();
+				log.info("############# exchangeOrdDtlNo >>> {} ##############", exchangeOrdDtlNo);
 
-			// 상태값 설정
-			String ordDtlStat = TscConstants.OrderDetailStat.PAYMENT_AFTER_CANCEL.value();	// 주문상세상태
-			String chgStat = TscConstants.OrderChangeStat.PAYMENT_AFTER_CANCEL.value();		// 주문변경상태
-			String modType = "STSC";														// KCP 전체취소
+				// 6. TB_ORDER_DETAIL_HST 등록
+				orderChangeDao.createOrderDetailHstForExchange(ordDtl);
 
-			// 무통장입금 결제 주문 전체취소 상태값 처리
-			if (TscConstants.PgGb.KCP.value().equals(payment.getPgGb())
-				&& TscConstants.PayMeans.BANK_DEPOSIT.value().equals(payment.getPayMeans())
-				&& TscConstants.PaymentStat.PAYMENT_WAIT.value().equals(payment.getPayStat())) {
+				// 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);
 
-				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())){
+				orderChangeDao.createOrderChangeDetail(orderChangeDetail);
 
-				modType = "STHD";															// KCP 무통장입금 전체취소
+				preOrdDtlNo = ordDtlNo;
 			}
 
-			// 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);
-			}
+			// 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);
 
-			// 3. 적립예정포인트 취소
-			vo.setOccurGb(TscConstants.PointOccurGb.EXPECT_POINT.value());
+			orderChangeDao.createOrderDetailItemForExchange(ordDtlItem);
 
-			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);
+			// 9. TB_ORDER_DETAIL_ITEM_HST 등록
+			orderChangeDao.createOrderDetailItemHstForExchange(ordDtlItem);
+		}
 
-				// 적립예정포인트 취소 이력 생성
-				orderChangeDao.createCustPointHstRollback(point);
-			}
+		// 10. TB_SELL_QTY 등록
+		OrderChange sellQty = new OrderChange();
+		sellQty.setSellGb(TscConstants.SellGb.EXCHANGE.value());
+		sellQty.setRegNo(regNo);
+		sellQty.setOrdChgSq(ordChgSq);
 
-			// 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);
-			}
+		orderChangeDao.createSellQtyForExchange(sellQty);
 
-			// 5. 상품재고원복
-			OrderChange sellQty = new OrderChange();
-			sellQty.setOrdChgSq(orderChangeDetail.getOrdChgSq());
-			sellQty.setSellGb("11");
-			sellQty.setRegNo(regNo);
-			orderChangeDao.createSellQty(sellQty);
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
 
-			// 6. 쿠폰 원복처리
-			Order coupon = new Order();
-			coupon.setOrdNo(ordNo);
-			coupon.setUpdNo(updNo);
-			orderChangeDao.updateGoodsCpnRollback(coupon);
-			orderChangeDao.updateCartCpnRollback(coupon);
-			orderChangeDao.updateDeliveryCpnRollback(coupon);
+		return result;
+	}
 
-			// 7. 사은품 전체 취소 (전체취소시 적용) 추후 사은품 관련 취소 로직 개발 예정
-			Order freegiftOrder = new Order();
-			freegiftOrder.setOrdNo(ordNo);
-			freegiftOrder.setUpdNo(updNo);
-			orderChangeDao.updateOrdFreegiftDel(freegiftOrder);
+	/**
+	 * 교환 추가배송비 조회
+	 *
+	 * @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();
 
-			// 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);
+		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;
 			}
+		}
+
+		result.set("totalDelvFee", totalDelvFee);
+		result.set("deliveryFeeList", deliveryFeeList);
+
+		return result;
+	}
 
-			// 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);
+	/**
+	 * 교환철회
+	 *
+	 * @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);
 
 			// TODO
-			// 11. 취소 완료 알림톡 발송 에정
+			// PG취소처리
 		}
 
-		/**
-		 * 전체취소 요청
-		 *
-		 * @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();
-			}
+		// 교환철회 처리
+		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);
 
-			// 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);
+		// TB_ORDER_DETAIL 상태값 변경
+		orderChangeDao.updateOrderDetailForExchangeCancel(exchangeCancel);
 
-					// 4-3. 주문상세단위 취소정보
-					for (Order vo : cancelOrderRefundList) {
-						if (obj.getDelvFeeCd().equals(vo.getDelvFeeCd())) {
-							vo.setOrdDtlStat(ordDtlStat);
-							vo.setRegNo(userNo);
-							vo.setUpdNo(userNo);
+		// TB_ORDER_DETAIL_HST 생성
+		orderChangeDao.createOrderDtlHstCancel(exchangeCancel);
 
-							// 4-3-1. 주문상세정보 수정 및 주문상세이력정보 등록
-							orderChangeDao.updateOrderDetail(vo);
-							orderChangeDao.createOrderDetailHstCnclRtn(vo);
+		// TB_ORDER_DETAIL_ITEM 상태값 변경
+		orderChangeDao.updateOrderDetailItemForExchangeCancel(exchangeCancel);
 
-							// 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);
+		// TB_ORDER_DETAIL_ITEM_HST 생성
+		orderChangeDao.createOrderDetailItemHstForExchangeCancel(exchangeCancel);
 
-							orderChangeDao.createOrderChangeDetail(changeDetailPo);
-							orderChangeDao.createOrderChangeDetailHst(changeDetailPo);
+		// TB_ORDER_CHANGE_DETAIL 상태값 변경 및 DEL_YN Y로 업데이트
+		orderChangeDao.updateOrderChangeDtlCancel(exchangeCancel);
 
-							// 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);
-								}
-							}
+		// 결과값 처리
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
 
-							// 4-3-5. 적립예정포인트 수정
-							int savePntAmt = vo.getSavePntAmt();
-							vo.setOccurGb(TscConstants.PointOccurGb.EXPECT_POINT.value());
+		return result;
+	}
 
-							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);
+	/**
+	 * 교환회수
+	 * @param Order
+	 * @return Order
+	 * @author jsh77b
+	 * @since 2021. 01. 19
+	 */
+	public GagaMap exchRtn(List<Order> cnclRtnList) {
+		GagaMap mav = new GagaMap();
 
-								// 적립예정포인트 취소 이력 생성
-								orderChangeDao.createCustPointHstRollback(point);
-							}
 
-							// 4-3-6. 상품쿠폰원복
-							orderChangeDao.updateGoodsCpnRollback(vo);
+		return mav;
+	}
 
-							// 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);
-								}
-							}
-						}
-					}
+	/**
+	 * 교환발송완료
+	 * @param Order
+	 * @return Order
+	 * @author jsh77b
+	 * @since 2021. 01. 19
+	 */
+	public GagaMap exchComplete(List<Order> cnclRtnList) {
+		GagaMap mav = new GagaMap();
 
-					// 4-4. 상품재고원복
-					orderChange.setSellGb("11");
-					orderChangeDao.createSellQty(orderChange);
 
-					// 4-5. 환불결제정보 등록 (배송정책별)
-					int spanRefundAmt = obj.getRealOrdAmt() + obj.getDelvFee();
+		return mav;
+	}
 
-					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);
 
-					orderChangeDao.createRefund(refundOrder);
 
-					pgCancelAmt += spanRefundAmt;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+	/**
+	 * 취소신청 (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);
 				}
 			}
+		}
 
-			// 장바구니, 배송비 쿠폰 원복처리
-			Order coupon = new Order();
-			coupon.setOrdNo(ordNo);
-			coupon.setUpdNo(userNo);
-			orderChangeDao.updateCartCpnRollback(coupon);
-			orderChangeDao.updateDeliveryCpnRollback(coupon);
+		// 2021.01.21 DELV_FEE 배송번호 단위로 TB_ORDER_CHANGE 생성
+		// 4. 주문변경정보, 주문정보, 환불정보 (업체코드 & 배송정책코드)
+		for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
 
-			// 12. 사은품 전체 취소 (전체취소시 적용) 추후 사은품 관련 취소 로직 개발 예정
-			Order freegiftOrder = new Order();
-			freegiftOrder.setOrdNo(ordNo);
-			freegiftOrder.setUpdNo(userNo);
-			orderChangeDao.updateOrdFreegiftDel(freegiftOrder);
+			Order obj = cancelDelvRefundList.get(i);
 
-			// TODO
-			// 13. PG 연동
-			// 네이버페이, 카카오페이 취소 시 취소 포인트 금액 TB_PAYMENT에 업데이트 처야함
-			// 상품권 100% 결제 시 PG 점프 해야 됨
+			// 취소금액이 있을때 처리
+			if (obj.getCnclRtnAmt() > 0) {
 
-			// 원주문 결제 정보 조회
-			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);
+				// 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);
+					}
+				}
+				// 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);
 			}
+		}
 
-			// TODO
-			// 14. 취소 완료 알림톡 발송 에정
+		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(등록))
 
-			return map;
+		// 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);
 	}
+}

+ 5 - 0
src/main/java/com/style24/core/support/env/TscConstants.java

@@ -329,6 +329,11 @@ public class TscConstants {
 		POINT("G014_40"),					// 포인트
 		COUPON("G014_50"),					// 쿠폰
 		CELL_PHONE("G014_60"),				// 휴대전화
+		GIFTCARD("G014_70"),				// 상품권
+		NAVER_POINT("G014_80"),				// 네이버포인트
+		KAKAO_POINT("G014_81"),				// 카카오포인트
+		PAYCO_POINT("G014_82"),				// PAYCO포인트
+		KAKAO_MONEY("G014_83"),				// 카카오머니
 		EXTMALL("G014_90");					// 외부몰입금
 
 		private String value;

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

@@ -95,7 +95,7 @@
 			  ) DF
 				ON OD.DELV_FEE_CD = DF.DELV_FEE_CD
 			  LEFT OUTER JOIN TB_DELV_FEE_POLICY DFP
-				ON DF.DELV_FEE_CD = DFP.DELV_FEE_CD
+				ON OD.DELV_FEE_CD = DFP.DELV_FEE_CD
 			   AND DFP.USE_YN = 'Y'
 			  LEFT OUTER JOIN (
 				  SELECT TDL.DELV_LOC_CD