jsh77b преди 5 години
родител
ревизия
4633144aca

+ 189 - 442
src/main/java/com/style24/core/biz/service/TscOrderChangeService.java

@@ -36,21 +36,39 @@ public class TscOrderChangeService {
 	 * @author jsh77b
 	 * @since 2020. 12. 16
 	 */
-	public List<Order> getCnclReqList(OrderChange cnclReq) {
+	public List<Order> getCnclReqList(OrderChange cnclReq, String chgGbn) {
 		
 		// 1. 주문번호설정
 		Order order = new Order();
 		order.setOrdNo(cnclReq.getOrdNo());
 		
 		// 2. 취소가능 주문상세상태값 설정
-		String[] ordDtlStatArr = new String[4];
-		ordDtlStatArr[0] = TscConstants.OrderDetailStat.DEPOSIT_WAIT.value();
-		ordDtlStatArr[1] = TscConstants.OrderDetailStat.PAYMENT_COMPLETE.value();
-		ordDtlStatArr[2] = TscConstants.OrderDetailStat.GOODS_PREPARE.value();
-		ordDtlStatArr[3] = TscConstants.OrderDetailStat.DELIVERY_PREPARE.value();
+		if (chgGbn == null) {
+			chgGbn = "";
+		}
+		
+		// 2.1 신청구분으로 
+		String[] ordDtlStatArr;
+			
+		// 취소가능 주문상세 상태값 설정
+		if (TscConstants.OrderChangeStat.CANCEL.value().equals(chgGbn)) {
+			ordDtlStatArr = new String[4];
+			ordDtlStatArr[0] = TscConstants.OrderDetailStat.DEPOSIT_WAIT.value();
+			ordDtlStatArr[1] = TscConstants.OrderDetailStat.PAYMENT_COMPLETE.value();
+			ordDtlStatArr[2] = TscConstants.OrderDetailStat.GOODS_PREPARE.value();
+			ordDtlStatArr[3] = TscConstants.OrderDetailStat.DELIVERY_PREPARE.value();
+		} 
+		// 반품, 교환가능 주문상세 상태값 설정
+		else {
+			ordDtlStatArr = new String[3];
+			ordDtlStatArr[0] = TscConstants.OrderDetailStat.SHIPPING.value();
+			ordDtlStatArr[1] = TscConstants.OrderDetailStat.SHIP_COMPLETE.value();
+			ordDtlStatArr[2] = TscConstants.OrderDetailStat.DELIVERY_COMPLETE.value();
+		}
+		
 		order.setOrdDtlStatArr(ordDtlStatArr);
 		
-		// 3. 취소가능 주문목록을 조회 후 취소신청을 수량을 셋팅
+		// 3. 취소,교환,반품 가능 주문목록 조회 후 취소/교환/반품 신청수량을 셋팅
 		List<Order> cnclReqList = getCancelRequestTargetList(order);
 		int[] ordDtlNoArr 		= cnclReq.getOrdDtlNoArr();
 		int[] cnclRtnReqQtyArr 	= cnclReq.getCnclRtnReqQtyArr();
@@ -68,7 +86,7 @@ public class TscOrderChangeService {
 	}
 	
 	/**
-	 * 주문상세 > 주문취소신청 > 주문취소,반품,교환 대상목록
+	 * 주문변경 대상목록 조회
 	 * @param Order
 	 * @return Order
 	 * @author jsh77b
@@ -77,277 +95,6 @@ public class TscOrderChangeService {
 	public List<Order> getCancelRequestTargetList(Order order) {
 		return orderChangeDao.getCancelRequestTargetList(order);
 	}
-		
-	/**
-	 * 취소,반품 환불금액 계산 (admin, front)
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2021. 01. 19
-	 */
-	public GagaMap cnclRtnRefundAmt(List<Order> cnclRtnList) {
-		GagaMap mav = new GagaMap();
-				
-		// 1. 변수설정
-		int spanPayAmt				= 0; // 총 결제 금액
-		int spanSumRealOrdAmt		= 0; // 상품 실결제 금액
-		int spanSumDeliveryFee		= 0; // 배송금액
-		int spanRtnSumDeliveryFee 	= 0; // 반품배송금액
-		int spanExcSumDeliveryFee 	= 0; // 교환배송금액
-		int spanOrdAmt				= 0; // 주문 상품 금액
-		int spanCnclRtnAmt			= 0; // 취소 상품 금액
-		int spanTotPntDcAmt			= 0; // 취소 사용 포인트
-		int spanPntDcAmt			= 0; // 고객 포인트
-		int spanPrePntDcAmt			= 0; // 상품 선포인트
-		int spanCpnDcAmt			= 0; // 취소 사용 쿠폰금액
-		int spanCpn1DcAmt			= 0; // 즉시할인쿠폰
-		int spanGoodsCpnDcAmt		= 0; // 상품쿠폰
-		int spanCartCpnDcAmt		= 0; // 장바구니쿠폰
-		int spanTmtbDcAmt			= 0; // 취소 다다익선 금액
-		int spanTmtb1DcAmt			= 0; // 수량할인
-		int spanTmtb2DcAmt			= 0; // 금액할인
-		int spanGfcdUseAmt			= 0; // 취소 고객 상품권 금액
-		int spanRealCnclRtnAmt		= 0; // 취소 상품 실결제 금액
-		int spanTotDeliveryFee		= 0; // 환불 배송 금액
-		int spanRefundAmt			= 0; // 환불 금액 합계
-		
-		int sumDeliveryFee			= 0; // 배송금액 (전체 취소시에 배송금액도 같이 환불)
-		
-		List<Order> cancelOrderRefundList 	= new ArrayList<Order>();	// 주문환불금액목록
-		List<Order> cancelDelvRefundList 	= new ArrayList<Order>();	// 주문환불배송금액목록
-		
-		Order orderObj	= new Order();
-		Order delvObj	= new Order();
-		int k 			= 0 ;
-		
-		// 2. 초기 배송정보 설정
-		delvObj.setOrdAmt(0);
-		delvObj.setCnclRtnAmt(0);
-		delvObj.setRealOrdAmt(0);
-		delvObj.setDelvFee(cnclRtnList.get(k).getDelvFee());
-		delvObj.setMinOrdAmt(cnclRtnList.get(k).getMinOrdAmt());
-		delvObj.setOrgDelvFee(cnclRtnList.get(k).getOrgDelvFee());
-		delvObj.setRtnDelvFee(cnclRtnList.get(k).getRtnDelvFee());
-		delvObj.setExcDelvFee(cnclRtnList.get(k).getExcDelvFee());
-		delvObj.setSupplyCompCd(cnclRtnList.get(k).getSupplyCompCd());
-		delvObj.setDelvFeeCd(cnclRtnList.get(k).getDelvFeeCd());
-		delvObj.setAllCanYn(cnclRtnList.get(k).getAllCanYn());
-		cancelDelvRefundList.add(delvObj);
-		
-		// 3. 취소신청수량 정보를 취소 환불 금액 계산
-		for (Order oneData : cnclRtnList) {
-			orderObj	= new Order();
-			
-			// 3.1 주문기본정보 설정
-			orderObj.setItemQty(oneData.getItemQty());
-			orderObj.setOrdQty(oneData.getOrdQty());
-			orderObj.setCnclRtnQty(oneData.getCnclRtnQty());
-			orderObj.setOrdReqChgQty(oneData.getOrdReqChgQty());
-			orderObj.setOrdCanChgQty(oneData.getOrdCanChgQty());
-			orderObj.setItemPrice(oneData.getItemPrice());
-			orderObj.setOptAddPrice	(oneData.getOptAddPrice());
-			orderObj.setOrdAmt(oneData.getOrdAmt());
-			
-			orderObj.setOrdNo(oneData.getOrdNo());
-			orderObj.setOrdDtlNo(oneData.getOrdDtlNo());
-			orderObj.setGoodsCd(oneData.getGoodsCd());
-			orderObj.setGoodsNm(oneData.getGoodsNm());
-			orderObj.setOrdDtlItemSq(oneData.getOrdDtlItemSq());
-			orderObj.setItemCd(oneData.getItemCd());
-			orderObj.setItemNm(oneData.getItemNm());
-			orderObj.setOptCd1(oneData.getOptCd1());
-			orderObj.setOptCd2(oneData.getOptCd2());
-			
-			// 3.2 주문취소수량으로 취소율 정보 설정
-			int ordQty 			= oneData.getOrdQty();
-			int itemQty 		= oneData.getItemQty();
-			int ordCanChgQty 	= oneData.getOrdCanChgQty();
-			
-			float _appQty		= (float)ordCanChgQty / (float)ordQty;
-			
-			// 3.3 주문취소금액 & 취소할인금액 계산
-			orderObj.setCnclRtnAmt(((oneData.getItemPrice() + oneData.getOptAddPrice()) * itemQty) * ordCanChgQty);
-			orderObj.setCpn1DcAmt((int)(oneData.getCpn1DcAmt() 				* _appQty));
-			orderObj.setTmtb1DcAmt((int)(oneData.getTmtb1DcAmt() 			* _appQty));
-			orderObj.setTmtb2DcAmt((int)(oneData.getTmtb2DcAmt() 			* _appQty));
-			orderObj.setGoodsCpnDcAmt((int)(oneData.getGoodsCpnDcAmt() 		* _appQty));
-			orderObj.setCartCpnDcAmt((int)(oneData.getCartCpnDcAmt() 		* _appQty));
-			orderObj.setPntDcAmt((int)(oneData.getPntDcAmt() 				* _appQty));
-			orderObj.setPrePntDcAmt((int)(oneData.getPrePntDcAmt() 			* _appQty));
-			orderObj.setSavePntAmt((int)(oneData.getSavePntAmt() 			* _appQty));
-			orderObj.setGfcdUseAmt((int)(oneData.getGfcdUseAmt() 			* _appQty));
-			
-			// 3.4 취소할인합계금액 적용
-			int dcTotAmt		= 0;
-			dcTotAmt			+= orderObj.getTmtb1DcAmt();
-			dcTotAmt			+= orderObj.getTmtb2DcAmt();
-			dcTotAmt			+= orderObj.getGoodsCpnDcAmt();
-			dcTotAmt			+= orderObj.getCartCpnDcAmt();
-			dcTotAmt			+= orderObj.getPntDcAmt();
-			dcTotAmt			+= orderObj.getPrePntDcAmt();
-			dcTotAmt			+= orderObj.getCpn1DcAmt();
-			dcTotAmt			+= orderObj.getGfcdUseAmt();
-			
-			// 3.5 주문취소환불금액 계산
-			orderObj.setRealOrdAmt(orderObj.getCnclRtnAmt() - dcTotAmt);
-			
-			// 3.6 배송정보 관련 설정		
-			orderObj.setOrdDtlNo(oneData.getOrdDtlNo());
-			orderObj.setGoodsTypeNm(oneData.getGoodsTypeNm());
-			orderObj.setDelvFee(oneData.getDelvFee());
-			orderObj.setSupplyCompCd(oneData.getSupplyCompCd());
-			orderObj.setDelvFeeCd(oneData.getDelvFeeCd());
-			orderObj.setMinOrdAmt(oneData.getMinOrdAmt());
-			orderObj.setOrgDelvFee(oneData.getOrgDelvFee());
-			orderObj.setRtnDelvFee(oneData.getRtnDelvFee());
-			orderObj.setExcDelvFee(oneData.getExcDelvFee());
-			
-			// 3.7 주문상세상태체크
-			orderObj.setOrdDtlStat(oneData.getOrdDtlStat());
-			orderObj.setOrdDtlStatNm(oneData.getOrdDtlStatNm());
-			orderObj.setAllCanYn(oneData.getAllCanYn()); // 전체취소 여부 (기존의 취소 또는 출고, 반품, 교환 의 경우에는 전체취소 불가능)
-			
-			cancelOrderRefundList.add(orderObj);
-			
-			// 3.8 배송업체 & 배송비정책 조건으로 추가 배송비 금액 설정
-			if (cancelDelvRefundList.get(k).getSupplyCompCd().equals(orderObj.getSupplyCompCd()) && cancelDelvRefundList.get(k).getDelvFeeCd().equals(orderObj.getDelvFeeCd())) {
-				// 공급업체 와 배송정책코드가 같으면 주문금액, 취소금액 SUM
-				cancelDelvRefundList.get(k).setOrdAmt(cancelDelvRefundList.get(k).getOrdAmt() + orderObj.getOrdAmt());
-				cancelDelvRefundList.get(k).setCnclRtnAmt(cancelDelvRefundList.get(k).getCnclRtnAmt() + orderObj.getCnclRtnAmt());
-				cancelDelvRefundList.get(k).setRealOrdAmt(cancelDelvRefundList.get(k).getRealOrdAmt() + orderObj.getRealOrdAmt());
-				
-				if ("N".equals(orderObj.getAllCanYn())) {
-					cancelDelvRefundList.get(k).setAllCanYn("N");
-				}
-			} else {			
-				k++;
-				
-				delvObj	= new Order();
-				
-				// 공급업체 와 배송정책코드가 같지안으면 주문금액, 취소금액 RESET
-				delvObj.setOrdAmt(orderObj.getOrdAmt());
-				delvObj.setCnclRtnAmt(orderObj.getCnclRtnAmt());
-				delvObj.setRealOrdAmt(orderObj.getRealOrdAmt());
-				
-				delvObj.setDelvFee(orderObj.getDelvFee());
-				delvObj.setMinOrdAmt(orderObj.getMinOrdAmt());		
-				delvObj.setOrgDelvFee(orderObj.getOrgDelvFee());
-				delvObj.setRtnDelvFee(orderObj.getRtnDelvFee());
-				delvObj.setExcDelvFee(orderObj.getExcDelvFee());
-				delvObj.setSupplyCompCd(orderObj.getSupplyCompCd());
-				delvObj.setDelvFeeCd(orderObj.getDelvFeeCd());
-				delvObj.setAllCanYn(orderObj.getAllCanYn());
-				
-				cancelDelvRefundList.add(delvObj);
-			}
-			
-			// 3.9 FRONT 화면에서 사용 하는 변수 값 설정 & 계산
-			spanSumRealOrdAmt	+= oneData.getRealOrdAmt();
-			spanPntDcAmt		+= orderObj.getPntDcAmt();
-			spanPrePntDcAmt		+= orderObj.getPrePntDcAmt();
-			spanCpn1DcAmt		+= orderObj.getCpn1DcAmt();
-			spanGoodsCpnDcAmt	+= orderObj.getGoodsCpnDcAmt();
-			spanCartCpnDcAmt	+= orderObj.getCartCpnDcAmt();
-			spanTmtb1DcAmt		+= orderObj.getTmtb1DcAmt();
-			spanTmtb2DcAmt		+= orderObj.getTmtb2DcAmt();
-			spanGfcdUseAmt		+= orderObj.getGfcdUseAmt();
-			spanRealCnclRtnAmt	+= orderObj.getRealOrdAmt();
-		}
-		
-		// 4. 추가배송비 발생여부, 추가배송비, 배송비정책단위 전체취소 여부 체크
-		for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
-			Order obj = cancelDelvRefundList.get(i);
-			
-			// 취소금액이 있을때 처리
-			if (obj.getCnclRtnAmt() > 0) {
-			
-				// 4.1 무료배송비용 > (주문금액 - 취소금액)
-				if (obj.getMinOrdAmt() > (obj.getOrdAmt() - obj.getCnclRtnAmt())) {
-					
-					// 4.2 주문시 배송비가 존재하면 추가 배송비 없음
-					if (obj.getDelvFee() > 0) {
-						obj.setAddDelvFeeYn("N");
-						obj.setAddDelvFee(0);
-						
-						// 4.2.1 전체취소시 배송비 환불
-						if ((obj.getOrdAmt() - obj.getCnclRtnAmt()) == 0) {
-							if ("Y".equals(obj.getAllCanYn())) {
-								sumDeliveryFee += obj.getDelvFee(); // 전체취소시 배송금액도 같이 환불
-							}
-						}
-					} else {
-						// 4.3 주문금액 - 취소금액 == 0 이면 전체취소 이므로 배송비 발생 안함
-						// * 2020.12.28 
-						// * case : 배송정책 기준으로 1,2 상품 주문 후 1번 출고 후 1번반품 2번취소 할 경우 전체 취소 가 아니므로 배송비 부과 있을지 모르겠음 주문업체 단위로 배송되기 때문에 발생하지 않을것 같음
-						if ((obj.getOrdAmt() - obj.getCnclRtnAmt()) == 0) {
-							if ("N".equals(obj.getAllCanYn())) {
-								obj.setAddDelvFeeYn("Y");
-								obj.setAddDelvFee(obj.getOrgDelvFee());
-							} else {
-								// 4.4 전체취소의 경우에 해당
-								obj.setAddDelvFeeYn("N");
-								obj.setAddDelvFee(0);
-							}
-						} else {
-							// 4.5 추가배송비 발생 (취소신청화면에서 대부분 아래의 조건에 해당)
-							obj.setAddDelvFeeYn("Y");
-							obj.setAddDelvFee(obj.getOrgDelvFee());
-						}
-					}
-				} else {
-					obj.setAddDelvFeeYn("N");
-					obj.setAddDelvFee(0);
-				}
-			}
-				
-			spanSumDeliveryFee		+= obj.getDelvFee();
-			spanRtnSumDeliveryFee	+= obj.getRtnDelvFee();
-			spanExcSumDeliveryFee	+= obj.getExcDelvFee();
-			spanOrdAmt				+= obj.getOrdAmt();
-			spanCnclRtnAmt			+= obj.getCnclRtnAmt();
-			spanTotDeliveryFee  	+= obj.getAddDelvFee();
-			
-			cancelDelvRefundList.set(i, obj);
-		}
-		
-		// 5. FRONT 화면엣 필요한 금액 설정
-		// 2020.12.30 프론트에서 필요한 부분 작업 필여
-		// 관리자 화면에서 사용하는 환불 칼럼 정보
-		// 환불금액표시
-		spanPayAmt 			= spanSumRealOrdAmt + spanSumDeliveryFee;
-		spanTotPntDcAmt 	= spanPntDcAmt + spanPrePntDcAmt;
-		spanCpnDcAmt 		= spanCpn1DcAmt + spanGoodsCpnDcAmt + spanCartCpnDcAmt;
-		spanTmtbDcAmt 		= spanTmtb1DcAmt + spanTmtb2DcAmt;
-		spanRefundAmt 		= (spanRealCnclRtnAmt + sumDeliveryFee) - spanTotDeliveryFee;
-
-		mav.set("cnclRtnList"			, cnclRtnList);				//주문 취소 신청 목록
-		mav.set("cancelOrderRefundList"	, cancelOrderRefundList);	//주문 환불 금액 목록
-		mav.set("cancelDelvRefundList"	, cancelDelvRefundList);	//주문 환불 배송 금액 목록
-		mav.set("spanPayAmt"			, spanPayAmt);				//총 결제 금액
-		mav.set("spanSumRealOrdAmt"		, spanSumRealOrdAmt);		//상품 실결제 금액
-		mav.set("spanSumDeliveryFee"	, spanSumDeliveryFee);		//배송금액
-		mav.set("spanOrdAmt"			, spanOrdAmt);				//주문 상품 금액
-		mav.set("spanCnclRtnAmt"		, spanCnclRtnAmt);			//취소 상품 금액
-		mav.set("spanTotPntDcAmt"		, spanTotPntDcAmt);			//취소 사용 포인트
-		mav.set("spanPntDcAmt"			, spanPntDcAmt);			//고객 포인트
-		mav.set("spanPrePntDcAmt"		, spanPrePntDcAmt);			//상품 선포인트
-		mav.set("spanCpnDcAmt"			, spanCpnDcAmt);			//취소 사용 쿠폰금액
-		mav.set("spanCpn1DcAmt"			, spanCpn1DcAmt);			//즉시할인쿠폰
-		mav.set("spanGoodsCpnDcAmt"		, spanGoodsCpnDcAmt);		//상품쿠폰
-		mav.set("spanCartCpnDcAmt"		, spanCartCpnDcAmt);		//장바구니쿠폰
-		mav.set("spanTmtbDcAmt"			, spanTmtbDcAmt);			//취소 다다익선 금액
-		mav.set("spanTmtb1DcAmt"		, spanTmtb1DcAmt);			//수량할인
-		mav.set("spanTmtb2DcAmt"		, spanTmtb2DcAmt);			//금액할인
-		mav.set("spanGfcdUseAmt"		, spanGfcdUseAmt);			//취소 고객 상품권 금액
-		mav.set("spanRealCnclRtnAmt"	, spanRealCnclRtnAmt);		//취소 상품 실결제 금액
-		mav.set("sumDeliveryFee"		, sumDeliveryFee);			//배송비 합계 금액
-		mav.set("spanTotDeliveryFee"	, spanTotDeliveryFee);		//추가 배송 금액
-		mav.set("spanTotRtnDelvFee"		, spanRtnSumDeliveryFee);	//추가 반품 배송 금액
-		mav.set("spanTotExcDelvFee"		, spanExcSumDeliveryFee);	//추가 교환 배송 금액
-		mav.set("spanRefundAmt"			, spanRefundAmt);			//환불 금액 합계
-		
-		return mav;
-	}
 	
 	/**
 	 * 취소신청 (batch(napy), batch(extmall))
@@ -364,10 +111,8 @@ public class TscOrderChangeService {
 		
 		// 2. 취소요정정보목록
 		//List<Order> cancelReqList		 	= (List<Order>) mav.get("cancelReqList");			//주문 취소 신청 목록
-		List<Order> cancelOrderRefundList 	= (List<Order>) mav.get("cancelOrderRefundList");	//주문 환불 금액 목록
-		List<Order> cancelDelvRefundList 	= (List<Order>) mav.get("cancelDelvRefundList");	//주문 환불 배송 금액 목록
-				
-		// 1. 주문정보등록 (TB_ORDER_DETAIL_HST) (등록)
+		//List<Order> cancelOrderRefundList 	= (List<Order>) mav.get("cancelOrderRefundList");	//주문 환불 금액 목록
+		//List<Order> cancelDelvRefundList 	= (List<Order>) mav.get("cancelDelvRefundList");	//주문 환불 배송 금액 목록
 		
 		// 2. 주문변경정보등록 (TB_ORDER_CHAGNE) (등록)
 		
@@ -419,6 +164,7 @@ public class TscOrderChangeService {
 	 * @author jsh77b
 	 * @since 2021. 01. 19
 	 */
+	@SuppressWarnings("unchecked")
 	@Transactional("shopTxnManager")
 	public GagaMap cnclComplete(GagaMap mav, int userNo) {
 		
@@ -426,70 +172,44 @@ public class TscOrderChangeService {
 		//userNo = userNo;
 		
 		// 2. 취소요정정보목록
-		List<Order> cancelReqList		 	= (List<Order>) mav.get("cancelReqList");			//주문 취소 신청 목록
-		List<Order> cancelOrderRefundList 	= (List<Order>) mav.get("cancelOrderRefundList");	//주문 환불 금액 목록
-		List<Order> cancelDelvRefundList 	= (List<Order>) mav.get("cancelDelvRefundList");	//주문 환불 배송 금액 목록
+		//List<Order> cancelReqList		 	= (List<Order>) mav.get("cancelReqList");			// 주문 취소 신청 목록
+		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		= "G680_20"; // 취소요청
-		
-		// 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.setRegNo(userNo);
-		orderChange.setUpdNo(userNo);
-		
-		// 4.2 주문변경 추가정조 등록하기
-		// 4.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);
-		
+		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.OrderChangeStat.CANCEL.value(); 						// 취소요청
+		
+		// 4. 주문상세단품정보등록,변경 (단품단위)
 		List<Order> cancelOrderDetailList = new ArrayList<Order>();
 		
-		// 4.2 주문변경 상세 단품 정보 등록 (단품단위)
 		for (int i=0 ; i<cancelOrderRefundList.size() ; i++) {
 			Order cancelOrderRefundPo = cancelOrderRefundList.get(i);
 			cancelOrderRefundPo.setRegNo(userNo);
 			cancelOrderRefundPo.setUpdNo(userNo);
 			
-			// 2020.01.05 추후 무통장입금전 전체 취소시 분기로직 추가 예정
+			// 2020.01.05 추후 무통장입금전 전체 취소시 분기 로직 추가 예정
 			if ("Y".equals(allCanYn)) {
-				cancelOrderRefundPo.setOrdDtlStat("G013_98"); // 결제전주문취소 : 공통코드로관리예정
+				cancelOrderRefundPo.setOrdDtlStat(TscConstants.OrderDetailStat.PAYMENT_BEFORE_CANCEL.value()); 	// 결제전주문취소
 			} else {
-				cancelOrderRefundPo.setOrdDtlStat("G013_99"); // 결제후주문취소 : 공통코드로관리예정
+				cancelOrderRefundPo.setOrdDtlStat(TscConstants.OrderDetailStat.PAYMENT_AFTER_CANCEL.value());	// 결제후주문취소
 			}
 
-			// 4.2.1 취소수량이 존재하면 주문정보 수정 및 주문변경정보 등록
+			// 4.1 취소수량이 존재하면 주문정보 수정 및 주문변경정보 등록
 			if (cancelOrderRefundPo.getOrdCanChgQty() > 0) {
-				// 4.2.3 주문상세단품정보 수정
+				
+				// 4.2 주문상세단품정보수정 (TB_ORDER_DETAIL_ITEM)
 				orderChangeDao.updateOrderDetailItem(cancelOrderRefundPo);
 				
-				// 4.2.4 주문상세단품정보 이력 등록
+				// 4.3 주문상세단품정보이력등록 (TB_ORDER_DETAIL_ITEM_HST) 
 				orderChangeDao.createOrderDetailItemHst(cancelOrderRefundPo);
 				
-				// 4.3 주문변경 상세 단위로 데이타 등록 (ORD_DTL_NO)
+				// 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()) {
@@ -498,120 +218,155 @@ public class TscOrderChangeService {
 					}
 				}
 				
-				// 4.4 주문상세단위 데이타 저장
+				// 4.5 주문상세단위 데이타 저장(주문상세 단위)
 				if (!temp) {
 					cancelOrderDetailList.add(cancelOrderRefundPo);
 				}
 				
-				// 4.5 상품옵션 재고 원복
-				orderChangeDao.updateOptionQty(cancelOrderRefundPo);
-			}
-		}
-		
-		// 5. 주문상세단위 취소 데이타 처리
-		for (int i=0 ; i<cancelOrderDetailList.size() ; i++) {			
-			Order vo = cancelOrderRefundList.get(i);
-			vo.setRegNo(userNo);
-			vo.setUpdNo(userNo);
-			
-			// 2020.01.05 추후 무통장입금전 전체 취소시 분기로직 추가 예정
-			if ("Y".equals(allCanYn)) {
-				vo.setOrdDtlStat("G013_98"); // 결제전주문취소 : 공통코드로관리예정
-			} else {
-				vo.setOrdDtlStat("G013_99"); // 결제후주문취소 : 공통코드로관리예정
+				// TO DO LIST
+				// 4.6 상품옵션재고등록 (추가개발 TB_SELL_QTY)
+				//orderChangeDao.updateOptionQty(cancelOrderRefundPo);
 			}
-			
-			// 5.1 주문변경상세정보 이력 등록
-			orderChangeDao.createOrderDetailHstCnclRtn(vo);
-			
-			// 4.2 주문변경상세정보 수정
-			orderChangeDao.updateOrderDetail(vo);
-			
-			// * 주문상세단위가 아닌 주문상세단품단위로 데이타가 처리되고 있었음
-			// 5.3 주문변경상세정보 등록
-			OrderChange changeDetailPo = new OrderChange();
-			changeDetailPo.setOrdChgSq(orderChange.getOrdChgSq());
-			changeDetailPo.setOrdDtlNo(vo.getOrdDtlNo());
-			changeDetailPo.setChgQty(vo.getOrdCanChgQty());
-			changeDetailPo.setChgStat("G685_21"); // 취소완료 : 공통코드로관리예정
-			changeDetailPo.setRegNo(userNo);
-			changeDetailPo.setUpdNo(userNo);
-			
-			orderChangeDao.createOrderChangeDetail(changeDetailPo);
-		}
-		
-		// To Do List
-		// 취소, 반품 사유에 따른 추가배송비, 반품배송비를 환불금액에서 추가, 제외 할 수 있다.
-		int spanRealCnclRtnAmt 		= Integer.parseInt(mav.get("spanRealCnclRtnAmt").toString());		// 취소금액합계
-		int sumDeliveryFee 			= Integer.parseInt(mav.get("sumDeliveryFee").toString());			// 배송비합계
-		int spanTotDeliveryFee 		= Integer.parseInt(mav.get("spanTotDeliveryFee").toString());		// 추가배송비합계
-		int spanTotRtnDelvFee 		= Integer.parseInt(mav.get("spanTotRtnDelvFee").toString());		// 반품배송비합계
-		int spanRefundAmt			= 0;
-		
-		// 고객사유 : 환불금액계산 = (취소금액 + 배송비) - 추가배송비
-		if ("true".equals(isCustomer)) {
-			spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee) - spanTotDeliveryFee - spanTotRtnDelvFee;
-			//Integer.parseInt(mav.get("spanRefundAmt").toString());
 		}
-		// 회사사유 : 환불금액계산 = (취소금액 + 배송비)
-		else {
-			spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee);
-		}
-		mav.set("spanRefundAmt", spanRefundAmt);
-		
-		// 6. 환불결제 정보 등록
-		Order paymentOrder = new Order();
-		paymentOrder.setOrdNo(ordNo);
-		paymentOrder.setPayAmt(Integer.parseInt(mav.get("spanRefundAmt").toString()) * -1);
-		paymentOrder.setPayStat("G016_99");
-		paymentOrder.setOrdChgSq(orderChange.getOrdChgSq());
-		paymentOrder.setRegNo(userNo);
-		paymentOrder.setUpdNo(userNo);
-		
-		orderChangeDao.createPayment(paymentOrder);
-		
-		// 7. 환불금액 등록
-		Order refundOrder = new Order();
-		refundOrder.setOrdNo(ordNo);
-		refundOrder.setPaySq(paymentOrder.getPaySq());
-		refundOrder.setOrdChgSq(orderChange.getOrdChgSq());
-		refundOrder.setRegNo(userNo);
-		
-		refundOrder.setRefundAmt(Integer.parseInt(mav.get("spanRefundAmt").toString()));
-		refundOrder.setRfCpn1Amt(Integer.parseInt(mav.get("spanCpn1DcAmt").toString()));
-		refundOrder.setRfTmtb1Amt(Integer.parseInt(mav.get("spanTmtb1DcAmt").toString()));
-		refundOrder.setRfTmtb2Amt(Integer.parseInt(mav.get("spanTmtb2DcAmt").toString()));
-		refundOrder.setRfGoodsCpnAmt(Integer.parseInt(mav.get("spanGoodsCpnDcAmt").toString()));
-		refundOrder.setRfCartCpnAmt(Integer.parseInt(mav.get("spanCartCpnDcAmt").toString()));
-		refundOrder.setRfPntAmt(Integer.parseInt(mav.get("spanPntDcAmt").toString()));
-		refundOrder.setRfPrePntAmt(Integer.parseInt(mav.get("spanPrePntDcAmt").toString()));
-		refundOrder.setRfGfcdUseAmt(Integer.parseInt(mav.get("spanGfcdUseAmt").toString()));
-		
-		refundOrder.setRaNo(mav.get("accountNo").toString());
-		refundOrder.setRaNm(mav.get("accountNm").toString());
-		refundOrder.setRaBank(mav.get("bankCd").toString());
 		
-		orderChangeDao.createRefund(refundOrder);
 		
-		// 8. 결제금액이 무료배송금액보다 작으면 배송비 신규 등록
+		// 2021.01.21 DELV_FEE 배송번호 단위로 TB_ORDER_CHANGE 생성
+		// 5. 주문변경정보, 주문정보, 환불정보 (업체코드 & 배송정책코드)
 		for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
-			Order vo = cancelDelvRefundList.get(i);
 			
-			if (vo.getAddDelvFee() > 0) {
-				Order delvFeeOrder = new Order();
+			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);
 				
-				delvFeeOrder.setPaySq(paymentOrder.getPaySq());
-				delvFeeOrder.setOrdNo(ordNo);
-				delvFeeOrder.setDelvFeeGb("G018_10");
-				delvFeeOrder.setDelvFeeCd(vo.getDelvFeeCd());
-				delvFeeOrder.setDelvFee(vo.getAddDelvFee());
-				delvFeeOrder.setRealDelvAmt(vo.getDelvFee());
-				delvFeeOrder.setOrdChgSq(orderChange.getOrdChgSq());
-				delvFeeOrder.setSupplyCompCd(vo.getSupplyCompCd());
-				delvFeeOrder.setRegNo(userNo);
-				delvFeeOrder.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.createDeliveryFee(delvFeeOrder);
+				orderChangeDao.createOrderChange(orderChange);
+				
+				// 5.3 주문상세단위 취소정보
+				for (int j=0 ; j<cancelOrderDetailList.size() ; j++) {
+					Order vo = cancelOrderRefundList.get(j);
+					vo.setRegNo(userNo);
+					vo.setUpdNo(userNo);
+					
+					// 5.3.0 DEVL_FEE_CD 단위로 주문상세 정보 처리
+					if (obj.getDelvFeeCd().equals(vo.getDelvFeeCd())) {
+						
+						// 2020.01.05 추후 무통장입금전 전체 취소시 분기로직 추가 예정
+						if ("Y".equals(allCanYn)) {
+							vo.setOrdDtlStat(TscConstants.OrderDetailStat.PAYMENT_BEFORE_CANCEL.value()); 	// 결제전주문취소
+						} else {
+							vo.setOrdDtlStat(TscConstants.OrderDetailStat.PAYMENT_AFTER_CANCEL.value()); 	// 결제후주문취소
+						}
+						
+						// 5.3.1 주문변경상세정보 이력등록
+						orderChangeDao.createOrderDetailHstCnclRtn(vo);
+						
+						// 5.3.2 주문변경상세정보 수정
+						orderChangeDao.updateOrderDetail(vo);
+						
+						// * 주문상세단위가 아닌 주문상세단품단위로 데이타가 처리되고 있었음
+						// 5.3 주문변경상세정보 등록
+						OrderChange changeDetailPo = new OrderChange();
+						changeDetailPo.setOrdChgSq(orderChange.getOrdChgSq());
+						changeDetailPo.setOrdDtlNo(vo.getOrdDtlNo());
+						changeDetailPo.setChgQty(vo.getOrdCanChgQty());
+						changeDetailPo.setChgStat(TscConstants.OrderChangeStat.CANCEL_COMPLETE.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);
+				}
+				
+				Order paymentOrder = new Order();
+				paymentOrder.setOrdNo(ordNo);
+				paymentOrder.setPayAmt(spanRefundAmt * -1);
+				paymentOrder.setPayStat(TscConstants.OrderDetailStat.PAYMENT_AFTER_CANCEL.value());
+				paymentOrder.setOrdChgSq(orderChange.getOrdChgSq());
+				paymentOrder.setRegNo(userNo);
+				paymentOrder.setUpdNo(userNo);
+				
+				orderChangeDao.createPayment(paymentOrder);
+				
+				// 5.5 환불금액 등록
+				Order refundOrder = new Order();
+				refundOrder.setOrdNo(ordNo);
+				refundOrder.setPaySq(paymentOrder.getPaySq());
+				refundOrder.setOrdChgSq(orderChange.getOrdChgSq());
+				refundOrder.setRegNo(userNo);
+				
+				refundOrder.setRefundAmt(Integer.parseInt(mav.get("spanRefundAmt").toString()));
+				refundOrder.setRfCpn1Amt(Integer.parseInt(mav.get("spanCpn1DcAmt").toString()));
+				refundOrder.setRfTmtb1Amt(Integer.parseInt(mav.get("spanTmtb1DcAmt").toString()));
+				refundOrder.setRfTmtb2Amt(Integer.parseInt(mav.get("spanTmtb2DcAmt").toString()));
+				refundOrder.setRfGoodsCpnAmt(Integer.parseInt(mav.get("spanGoodsCpnDcAmt").toString()));
+				refundOrder.setRfCartCpnAmt(Integer.parseInt(mav.get("spanCartCpnDcAmt").toString()));
+				refundOrder.setRfPntAmt(Integer.parseInt(mav.get("spanPntDcAmt").toString()));
+				refundOrder.setRfPrePntAmt(Integer.parseInt(mav.get("spanPrePntDcAmt").toString()));
+				refundOrder.setRfGfcdUseAmt(Integer.parseInt(mav.get("spanGfcdUseAmt").toString()));
+				
+				refundOrder.setRaNo(mav.get("accountNo").toString());
+				refundOrder.setRaNm(mav.get("accountNm").toString());
+				refundOrder.setRaBank(mav.get("bankCd").toString());
+				
+				orderChangeDao.createRefund(refundOrder);
+				
+				// 5.6 결제금액이 무료배송금액보다 작으면 배송비 신규 등록
+				if (obj.getAddDelvFee() > 0) {
+					Order delvFeeOrder = new Order();
+					
+					delvFeeOrder.setPaySq(paymentOrder.getPaySq());
+					delvFeeOrder.setOrdNo(ordNo);
+					delvFeeOrder.setDelvFeeGb("G018_10");
+					delvFeeOrder.setDelvFeeCd(obj.getDelvFeeCd());
+					delvFeeOrder.setDelvFee(obj.getAddDelvFee());
+					delvFeeOrder.setRealDelvAmt(obj.getDelvFee());
+					delvFeeOrder.setOrdChgSq(orderChange.getOrdChgSq());
+					delvFeeOrder.setSupplyCompCd(obj.getSupplyCompCd());
+					delvFeeOrder.setRegNo(userNo);
+					delvFeeOrder.setUpdNo(userNo);
+					
+					orderChangeDao.createDeliveryFee(delvFeeOrder);
+				}
 			}
 		}
 		
@@ -625,10 +380,10 @@ public class TscOrderChangeService {
 		// 11. 상품권원복
 		
 		// 12. 사은품 전체 취소 (전체취소시 적용) 추후 사은품 관련 취소 로직 개발 예정
-		Order freegiftOrder = new Order();
-		freegiftOrder.setOrdNo(ordNo);
-		freegiftOrder.setUpdNo(userNo);
-		orderChangeDao.updateOrdFreegiftDel(freegiftOrder);
+		//Order freegiftOrder = new Order();
+		//freegiftOrder.setOrdNo(ordNo);
+		//freegiftOrder.setUpdNo(userNo);
+		//orderChangeDao.updateOrdFreegiftDel(freegiftOrder);
 		
 		// To Do List
 		// 13. PG 연동
@@ -715,11 +470,6 @@ public class TscOrderChangeService {
 
 			// 4.2.1 취소수량이 존재하면 주문정보 수정 및 주문변경정보 등록
 			if (cancelOrderRefundPo.getOrdCanChgQty() > 0) {
-				// 4.2.3 주문상세단품정보 수정
-				//orderChangeDao.updateOrderDetailItem(cancelOrderRefundPo);
-				
-				// 4.2.4 주문상세단품정보 이력 등록
-				//orderChangeDao.createOrderDetailItemHst(cancelOrderRefundPo);
 				
 				// 4.3 주문변경 상세 단위로 데이타 등록 (ORD_DTL_NO)
 				Boolean temp = false;
@@ -736,9 +486,6 @@ public class TscOrderChangeService {
 				if (!temp) {
 					cancelOrderDetailList.add(cancelOrderRefundPo);
 				}
-				
-				// 4.5 상품옵션 재고 원복
-				//orderChangeDao.updateOptionQty(cancelOrderRefundPo);
 			}
 		}
 		

+ 302 - 0
src/main/java/com/style24/core/biz/service/TscOrderRefundService.java

@@ -0,0 +1,302 @@
+package com.style24.core.biz.service;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.gagaframework.web.parameter.GagaMap;
+import com.style24.core.biz.dao.TscOrderChangeDao;
+import com.style24.core.support.env.TscConstants;
+import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.OrderChange;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 취소, 반품, 교환 Service
+ * 
+ * @author jsh77b
+ * @since 2021. 01. 18
+ */
+@Service
+@Slf4j
+public class TscOrderRefundService {
+
+	@Autowired
+	private TscOrderChangeDao orderChangeDao;
+		
+	/**
+	 * 취소,반품 환불금액 계산 (admin, front)
+	 * @param Order
+	 * @return Order
+	 * @author jsh77b
+	 * @since 2021. 01. 19
+	 */
+	public GagaMap cnclRtnRefundAmt(List<Order> cnclRtnList) {
+		GagaMap mav = new GagaMap();
+				
+		// 1. 변수설정
+		int spanPayAmt				= 0; // 총 결제 금액
+		int spanSumRealOrdAmt		= 0; // 상품 실결제 금액
+		int spanSumDeliveryFee		= 0; // 배송금액
+		int spanRtnSumDeliveryFee 	= 0; // 반품배송금액
+		int spanExcSumDeliveryFee 	= 0; // 교환배송금액
+		int spanOrdAmt				= 0; // 주문 상품 금액
+		int spanCnclRtnAmt			= 0; // 취소 상품 금액
+		int spanTotPntDcAmt			= 0; // 취소 사용 포인트
+		int spanPntDcAmt			= 0; // 고객 포인트
+		int spanPrePntDcAmt			= 0; // 상품 선포인트
+		int spanCpnDcAmt			= 0; // 취소 사용 쿠폰금액
+		int spanCpn1DcAmt			= 0; // 즉시할인쿠폰
+		int spanGoodsCpnDcAmt		= 0; // 상품쿠폰
+		int spanCartCpnDcAmt		= 0; // 장바구니쿠폰
+		int spanTmtbDcAmt			= 0; // 취소 다다익선 금액
+		int spanTmtb1DcAmt			= 0; // 수량할인
+		int spanTmtb2DcAmt			= 0; // 금액할인
+		int spanGfcdUseAmt			= 0; // 취소 고객 상품권 금액
+		int spanRealCnclRtnAmt		= 0; // 취소 상품 실결제 금액
+		int spanTotDeliveryFee		= 0; // 환불 배송 금액
+		int spanRefundAmt			= 0; // 환불 금액 합계
+		
+		int sumDeliveryFee			= 0; // 배송금액 (전체 취소시에 배송금액도 같이 환불)
+		
+		List<Order> cancelOrderRefundList 	= new ArrayList<Order>();	// 주문환불금액목록
+		List<Order> cancelDelvRefundList 	= new ArrayList<Order>();	// 주문환불배송금액목록
+		
+		Order orderObj	= new Order();
+		Order delvObj	= new Order();
+		int k 			= 0 ;
+		
+		// 2. 초기 배송정보 설정
+		delvObj.setOrdAmt(0);
+		delvObj.setCnclRtnAmt(0);
+		delvObj.setRealOrdAmt(0);
+		delvObj.setDelvFee(cnclRtnList.get(k).getDelvFee());
+		delvObj.setMinOrdAmt(cnclRtnList.get(k).getMinOrdAmt());
+		delvObj.setOrgDelvFee(cnclRtnList.get(k).getOrgDelvFee());
+		delvObj.setRtnDelvFee(cnclRtnList.get(k).getRtnDelvFee());
+		delvObj.setExcDelvFee(cnclRtnList.get(k).getExcDelvFee());
+		delvObj.setSupplyCompCd(cnclRtnList.get(k).getSupplyCompCd());
+		delvObj.setDelvFeeCd(cnclRtnList.get(k).getDelvFeeCd());
+		delvObj.setAllCanYn(cnclRtnList.get(k).getAllCanYn());
+		cancelDelvRefundList.add(delvObj);
+		
+		// 3. 취소신청수량 정보를 취소 환불 금액 계산
+		for (Order oneData : cnclRtnList) {
+			orderObj	= new Order();
+			
+			// 3.1 주문기본정보 설정
+			orderObj.setItemQty(oneData.getItemQty());
+			orderObj.setOrdQty(oneData.getOrdQty());
+			orderObj.setCnclRtnQty(oneData.getCnclRtnQty());
+			orderObj.setOrdReqChgQty(oneData.getOrdReqChgQty());
+			orderObj.setOrdCanChgQty(oneData.getOrdCanChgQty());
+			orderObj.setItemPrice(oneData.getItemPrice());
+			orderObj.setOptAddPrice	(oneData.getOptAddPrice());
+			orderObj.setOrdAmt(oneData.getOrdAmt());
+			
+			orderObj.setOrdNo(oneData.getOrdNo());
+			orderObj.setOrdDtlNo(oneData.getOrdDtlNo());
+			orderObj.setGoodsCd(oneData.getGoodsCd());
+			orderObj.setGoodsNm(oneData.getGoodsNm());
+			orderObj.setOrdDtlItemSq(oneData.getOrdDtlItemSq());
+			orderObj.setItemCd(oneData.getItemCd());
+			orderObj.setItemNm(oneData.getItemNm());
+			orderObj.setOptCd1(oneData.getOptCd1());
+			orderObj.setOptCd2(oneData.getOptCd2());
+			
+			// 3.2 주문취소수량으로 취소율 정보 설정
+			int ordQty 			= oneData.getOrdQty();
+			int itemQty 		= oneData.getItemQty();
+			int ordCanChgQty 	= oneData.getOrdCanChgQty();
+			
+			float _appQty		= (float)ordCanChgQty / (float)ordQty;
+			
+			// 3.3 주문취소금액 & 취소할인금액 계산
+			orderObj.setCnclRtnAmt(((oneData.getItemPrice() + oneData.getOptAddPrice()) * itemQty) * ordCanChgQty);
+			orderObj.setCpn1DcAmt((int)(oneData.getCpn1DcAmt() 				* _appQty));
+			orderObj.setTmtb1DcAmt((int)(oneData.getTmtb1DcAmt() 			* _appQty));
+			orderObj.setTmtb2DcAmt((int)(oneData.getTmtb2DcAmt() 			* _appQty));
+			orderObj.setGoodsCpnDcAmt((int)(oneData.getGoodsCpnDcAmt() 		* _appQty));
+			orderObj.setCartCpnDcAmt((int)(oneData.getCartCpnDcAmt() 		* _appQty));
+			orderObj.setPntDcAmt((int)(oneData.getPntDcAmt() 				* _appQty));
+			orderObj.setPrePntDcAmt((int)(oneData.getPrePntDcAmt() 			* _appQty));
+			orderObj.setSavePntAmt((int)(oneData.getSavePntAmt() 			* _appQty));
+			orderObj.setGfcdUseAmt((int)(oneData.getGfcdUseAmt() 			* _appQty));
+			
+			// 3.4 취소할인합계금액 적용
+			int dcTotAmt		= 0;
+			dcTotAmt			+= orderObj.getTmtb1DcAmt();
+			dcTotAmt			+= orderObj.getTmtb2DcAmt();
+			dcTotAmt			+= orderObj.getGoodsCpnDcAmt();
+			dcTotAmt			+= orderObj.getCartCpnDcAmt();
+			dcTotAmt			+= orderObj.getPntDcAmt();
+			dcTotAmt			+= orderObj.getPrePntDcAmt();
+			dcTotAmt			+= orderObj.getCpn1DcAmt();
+			dcTotAmt			+= orderObj.getGfcdUseAmt();
+			
+			// 3.5 주문취소환불금액 계산
+			orderObj.setRealOrdAmt(orderObj.getCnclRtnAmt() - dcTotAmt);
+			
+			// 3.6 배송정보 관련 설정		
+			orderObj.setOrdDtlNo(oneData.getOrdDtlNo());
+			orderObj.setGoodsTypeNm(oneData.getGoodsTypeNm());
+			orderObj.setDelvFee(oneData.getDelvFee());
+			orderObj.setSupplyCompCd(oneData.getSupplyCompCd());
+			orderObj.setDelvFeeCd(oneData.getDelvFeeCd());
+			orderObj.setMinOrdAmt(oneData.getMinOrdAmt());
+			orderObj.setOrgDelvFee(oneData.getOrgDelvFee());
+			orderObj.setRtnDelvFee(oneData.getRtnDelvFee());
+			orderObj.setExcDelvFee(oneData.getExcDelvFee());
+			
+			// 3.7 주문상세상태체크
+			orderObj.setOrdDtlStat(oneData.getOrdDtlStat());
+			orderObj.setOrdDtlStatNm(oneData.getOrdDtlStatNm());
+			orderObj.setAllCanYn(oneData.getAllCanYn()); // 전체취소 여부 (기존의 취소 또는 출고, 반품, 교환 의 경우에는 전체취소 불가능)
+			
+			cancelOrderRefundList.add(orderObj);
+			
+			// 3.8 배송비정책 조건으로 추가 배송비 금액 설정
+			if (cancelDelvRefundList.get(k).getDelvFeeCd().equals(orderObj.getDelvFeeCd())) {
+				// 공급업체 와 배송정책코드가 같으면 주문금액, 취소금액 SUM
+				cancelDelvRefundList.get(k).setOrdAmt(cancelDelvRefundList.get(k).getOrdAmt() + orderObj.getOrdAmt());
+				cancelDelvRefundList.get(k).setCnclRtnAmt(cancelDelvRefundList.get(k).getCnclRtnAmt() + orderObj.getCnclRtnAmt());
+				cancelDelvRefundList.get(k).setRealOrdAmt(cancelDelvRefundList.get(k).getRealOrdAmt() + orderObj.getRealOrdAmt());
+				
+				if ("N".equals(orderObj.getAllCanYn())) {
+					cancelDelvRefundList.get(k).setAllCanYn("N");
+				}
+			} else {			
+				k++;
+				
+				delvObj	= new Order();
+				
+				// 공급업체 와 배송정책코드가 같지안으면 주문금액, 취소금액 RESET
+				delvObj.setOrdAmt(orderObj.getOrdAmt());
+				delvObj.setCnclRtnAmt(orderObj.getCnclRtnAmt());
+				delvObj.setRealOrdAmt(orderObj.getRealOrdAmt());
+				
+				delvObj.setDelvFee(orderObj.getDelvFee());
+				delvObj.setMinOrdAmt(orderObj.getMinOrdAmt());		
+				delvObj.setOrgDelvFee(orderObj.getOrgDelvFee());
+				delvObj.setRtnDelvFee(orderObj.getRtnDelvFee());
+				delvObj.setExcDelvFee(orderObj.getExcDelvFee());
+				delvObj.setSupplyCompCd(orderObj.getSupplyCompCd());
+				delvObj.setDelvFeeCd(orderObj.getDelvFeeCd());
+				delvObj.setAllCanYn(orderObj.getAllCanYn());
+				
+				cancelDelvRefundList.add(delvObj);
+			}
+			
+			// 3.9 FRONT 화면에서 사용 하는 변수 값 설정 & 계산
+			spanSumRealOrdAmt	+= oneData.getRealOrdAmt();
+			spanPntDcAmt		+= orderObj.getPntDcAmt();
+			spanPrePntDcAmt		+= orderObj.getPrePntDcAmt();
+			spanCpn1DcAmt		+= orderObj.getCpn1DcAmt();
+			spanGoodsCpnDcAmt	+= orderObj.getGoodsCpnDcAmt();
+			spanCartCpnDcAmt	+= orderObj.getCartCpnDcAmt();
+			spanTmtb1DcAmt		+= orderObj.getTmtb1DcAmt();
+			spanTmtb2DcAmt		+= orderObj.getTmtb2DcAmt();
+			spanGfcdUseAmt		+= orderObj.getGfcdUseAmt();
+			spanRealCnclRtnAmt	+= orderObj.getRealOrdAmt();
+		}
+		
+		// 4. 추가배송비 발생여부, 추가배송비, 배송비정책단위 전체취소 여부 체크
+		for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
+			Order obj = cancelDelvRefundList.get(i);
+			
+			// 취소금액이 있을때 처리
+			if (obj.getCnclRtnAmt() > 0) {
+			
+				// 4.1 무료배송비용 > (주문금액 - 취소금액)
+				if (obj.getMinOrdAmt() > (obj.getOrdAmt() - obj.getCnclRtnAmt())) {
+					
+					// 4.2 주문시 배송비가 존재하면 추가 배송비 없음
+					if (obj.getDelvFee() > 0) {
+						obj.setAddDelvFeeYn("N");
+						obj.setAddDelvFee(0);
+						
+						// 4.2.1 전체취소시 배송비 환불
+						if ((obj.getOrdAmt() - obj.getCnclRtnAmt()) == 0) {
+							if ("Y".equals(obj.getAllCanYn())) {
+								sumDeliveryFee += obj.getDelvFee(); // 전체취소시 배송금액도 같이 환불
+							}
+						}
+					} else {
+						// 4.3 주문금액 - 취소금액 == 0 이면 전체취소 이므로 배송비 발생 안함
+						// * 2020.12.28 
+						// * case : 배송정책 기준으로 1,2 상품 주문 후 1번 출고 후 1번반품 2번취소 할 경우 전체 취소 가 아니므로 배송비 부과 있을지 모르겠음 주문업체 단위로 배송되기 때문에 발생하지 않을것 같음
+						if ((obj.getOrdAmt() - obj.getCnclRtnAmt()) == 0) {
+							if ("N".equals(obj.getAllCanYn())) {
+								obj.setAddDelvFeeYn("Y");
+								obj.setAddDelvFee(obj.getOrgDelvFee());
+							} else {
+								// 4.4 전체취소의 경우에 해당
+								obj.setAddDelvFeeYn("N");
+								obj.setAddDelvFee(0);
+							}
+						} else {
+							// 4.5 추가배송비 발생 (취소신청화면에서 대부분 아래의 조건에 해당)
+							obj.setAddDelvFeeYn("Y");
+							obj.setAddDelvFee(obj.getOrgDelvFee());
+						}
+					}
+				} else {
+					obj.setAddDelvFeeYn("N");
+					obj.setAddDelvFee(0);
+				}
+			}
+				
+			spanSumDeliveryFee		+= obj.getDelvFee();
+			spanRtnSumDeliveryFee	+= obj.getRtnDelvFee();
+			spanExcSumDeliveryFee	+= obj.getExcDelvFee();
+			spanOrdAmt				+= obj.getOrdAmt();
+			spanCnclRtnAmt			+= obj.getCnclRtnAmt();
+			spanTotDeliveryFee  	+= obj.getAddDelvFee();
+			
+			cancelDelvRefundList.set(i, obj);
+		}
+		
+		// 5. FRONT 화면엣 필요한 금액 설정
+		// 2020.12.30 프론트에서 필요한 부분 작업 필여
+		// 관리자 화면에서 사용하는 환불 칼럼 정보
+		// 환불금액표시
+		spanPayAmt 			= spanSumRealOrdAmt + spanSumDeliveryFee;
+		spanTotPntDcAmt 	= spanPntDcAmt + spanPrePntDcAmt;
+		spanCpnDcAmt 		= spanCpn1DcAmt + spanGoodsCpnDcAmt + spanCartCpnDcAmt;
+		spanTmtbDcAmt 		= spanTmtb1DcAmt + spanTmtb2DcAmt;
+		spanRefundAmt 		= (spanRealCnclRtnAmt + sumDeliveryFee) - spanTotDeliveryFee;
+
+		mav.set("cnclRtnList"			, cnclRtnList);				//주문 취소 신청 목록
+		mav.set("cancelOrderRefundList"	, cancelOrderRefundList);	//주문 환불 금액 목록
+		mav.set("cancelDelvRefundList"	, cancelDelvRefundList);	//주문 환불 배송 금액 목록
+		mav.set("spanPayAmt"			, spanPayAmt);				//총 결제 금액
+		mav.set("spanSumRealOrdAmt"		, spanSumRealOrdAmt);		//상품 실결제 금액
+		mav.set("spanSumDeliveryFee"	, spanSumDeliveryFee);		//배송금액
+		mav.set("spanOrdAmt"			, spanOrdAmt);				//주문 상품 금액
+		mav.set("spanCnclRtnAmt"		, spanCnclRtnAmt);			//취소 상품 금액
+		mav.set("spanTotPntDcAmt"		, spanTotPntDcAmt);			//취소 사용 포인트
+		mav.set("spanPntDcAmt"			, spanPntDcAmt);			//고객 포인트
+		mav.set("spanPrePntDcAmt"		, spanPrePntDcAmt);			//상품 선포인트
+		mav.set("spanCpnDcAmt"			, spanCpnDcAmt);			//취소 사용 쿠폰금액
+		mav.set("spanCpn1DcAmt"			, spanCpn1DcAmt);			//즉시할인쿠폰
+		mav.set("spanGoodsCpnDcAmt"		, spanGoodsCpnDcAmt);		//상품쿠폰
+		mav.set("spanCartCpnDcAmt"		, spanCartCpnDcAmt);		//장바구니쿠폰
+		mav.set("spanTmtbDcAmt"			, spanTmtbDcAmt);			//취소 다다익선 금액
+		mav.set("spanTmtb1DcAmt"		, spanTmtb1DcAmt);			//수량할인
+		mav.set("spanTmtb2DcAmt"		, spanTmtb2DcAmt);			//금액할인
+		mav.set("spanGfcdUseAmt"		, spanGfcdUseAmt);			//취소 고객 상품권 금액
+		mav.set("spanRealCnclRtnAmt"	, spanRealCnclRtnAmt);		//취소 상품 실결제 금액
+		mav.set("sumDeliveryFee"		, sumDeliveryFee);			//배송비 합계 금액
+		mav.set("spanTotDeliveryFee"	, spanTotDeliveryFee);		//추가 배송 금액
+		mav.set("spanTotRtnDelvFee"		, spanRtnSumDeliveryFee);	//추가 반품 배송 금액
+		mav.set("spanTotExcDelvFee"		, spanExcSumDeliveryFee);	//추가 교환 배송 금액
+		mav.set("spanRefundAmt"			, spanRefundAmt);			//환불 금액 합계
+		
+		return mav;
+	}
+}

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

@@ -100,7 +100,8 @@
 		AND    OD.ORD_NO = #{ordNo}
 		GROUP  BY OD.ORD_NO
 		     , OD.ORD_DTL_NO
-	    ORDER  BY OD.ORD_NO
+	    ORDER  BY OD.DELV_FEE_CD 
+	         , OD.ORD_NO
 	         , OD.ORD_DTL_NO
 	</select>