Переглянути джерело

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

gagamel 5 роки тому
батько
коміт
908c777f34
17 змінених файлів з 1969 додано та 304 видалено
  1. 24 14
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaOrderDao.java
  2. 118 99
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaOrderService.java
  3. 10 10
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaOrderController.java
  4. 2 0
      style24.admin/src/main/java/com/style24/persistence/domain/Order.java
  5. 1 1
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  6. 72 74
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml
  7. 107 15
      style24.admin/src/main/webapp/WEB-INF/views/order/CancelRequestForm.html
  8. 29 24
      style24.admin/src/main/webapp/WEB-INF/views/order/OrderDetailForm.html
  9. 3 2
      style24.admin/src/main/webapp/WEB-INF/views/order/RefundAccountRegistForm.html
  10. 1054 0
      style24.admin/src/main/webapp/WEB-INF/views/order/ReturnRequestForm.html
  11. 101 0
      style24.batch/src/main/java/com/style24/batch/biz/dao/TsbGoodsDao.java
  12. 1 1
      style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsProductStockJob.java
  13. 68 19
      style24.batch/src/main/java/com/style24/batch/biz/service/TsbGoodsService.java
  14. 1 1
      style24.batch/src/main/java/com/style24/persistence/domain/Goods.java
  15. 48 0
      style24.batch/src/main/java/com/style24/persistence/domain/Option.java
  16. 329 36
      style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml
  17. 1 8
      style24.front/target/m2e-wtp/web-resources/META-INF/maven/com.style24.front/style24.front/pom.properties

+ 24 - 14
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaOrderDao.java

@@ -113,7 +113,7 @@ public interface TsaOrderDao {
 	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
-	Collection<Order> orderRefundInfo(Order order);
+	Collection<Order> getOrderRefundInfo(Order order);
 	
 	/**
 	 * 상담내역
@@ -123,7 +123,7 @@ public interface TsaOrderDao {
 	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
-	Collection<Order> orderCounselInfo(Order order);
+	Collection<Order> getOrderCounselInfo(Order order);
 	
 	/**
 	 * 변경내역 > 주문요청 관리자 메모
@@ -133,7 +133,7 @@ public interface TsaOrderDao {
 	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
-	Collection<Order> getOrderTsainMemoList(Order order);
+	Collection<Order> getOrderMemoList(Order order);
 	
 	/**
 	 * 입점업체미발주 주문목록
@@ -329,16 +329,6 @@ public interface TsaOrderDao {
 	 * @since 2020. 12. 22
 	 */
 	int changedOrdDtlStat(Order order);
-	
-	/**
-	 * 주문정보조회
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 22
-	 */
-	Order getOrderInfo(Order order);
 
 	/**
 	 * 주문상세 > 주문취소대상목록
@@ -363,13 +353,23 @@ public interface TsaOrderDao {
 	/**
 	 * 주문상세 > 주문취소신청 > 주문변경정보 상세 등록
 	 *
-	 * @param Order - 주문 정보
+	 * @param OrderChange - 주문 변경 정보
 	 * @return
 	 * @author jsh77b
 	 * @since 2020. 12. 22
 	 */
 	int createOrderChangeDetail(OrderChange orderChange);
 	
+	/**
+	 * 주문상세 > 주문취소신청 > 상품옵션 재고 원복
+	 *
+	 * @param Order - 주문 정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 01. 08
+	 */
+	int updateOptionQty(Order order);
+	
 	/**
 	 * 주문상세 > 주문취소신청 > 주문상세단품정보 수정
 	 *
@@ -470,6 +470,16 @@ public interface TsaOrderDao {
 	 */
 	int saveRefundAccount(Order order);
 	
+	/**
+	 * 주문상세 > 주문취소신청 > 주문사은품전체취소
+	 *
+	 * @param Order - 주문 정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2020. 12. 22
+	 */
+	int updateOrdFreegiftDel(Order order);
+	
 	
 }
 

+ 118 - 99
style24.admin/src/main/java/com/style24/admin/biz/service/TsaOrderService.java

@@ -78,29 +78,29 @@ public class TsaOrderService {
 	public Collection<Order> getOrderInfoList(Order order) {
 		return orderDao.getOrderInfoList(order);
 	}
-	
+
 	/**
-	 * 주문상세 > 사은품목록
+	 * 주문상품정보 목록
 	 *
 	 * @param order - 주문 정보
 	 * @return Collection<Order>
 	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
-	public Collection<Order> getOrderFreeGiftList(Order order) {
-		return orderDao.getOrderFreeGiftList(order);
+	public Collection<Order> getOrderDetailList(Order order) {
+		return orderDao.getOrderDetailList(order);
 	}
 	
 	/**
-	 * 주문상품정보 목록
+	 * 주문상세 > 사은품목록
 	 *
 	 * @param order - 주문 정보
 	 * @return Collection<Order>
 	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
-	public Collection<Order> getOrderDetailList(Order order) {
-		return orderDao.getOrderDetailList(order);
+	public Collection<Order> getOrderFreeGiftList(Order order) {
+		return orderDao.getOrderFreeGiftList(order);
 	}
 	
 	/**
@@ -116,7 +116,7 @@ public class TsaOrderService {
 	}
 	
 	/**
-	 * 결제내역 > 결제 기본정보
+	 * 결제내역 > 결제정보
 	 *
 	 * @param order - 주문 정보
 	 * @return Collection<Order>
@@ -159,8 +159,8 @@ public class TsaOrderService {
 	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
-	public Collection<Order> orderRefundInfo(Order order) {
-		return orderDao.orderRefundInfo(order);
+	public Collection<Order> getOrderRefundInfo(Order order) {
+		return orderDao.getOrderRefundInfo(order);
 	}
 	
 	/**
@@ -171,21 +171,21 @@ public class TsaOrderService {
 	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
-	public Collection<Order> orderCounselInfo(Order order) {
-		return orderDao.orderCounselInfo(order);
+	public Collection<Order> getOrderCounselInfo(Order order) {
+		return orderDao.getOrderCounselInfo(order);
 	}
 	
 	/**
-	 * 변경내역 > 주문요청 관리자 메모
+	 * 변경내역 > 주문요청 관리자 메모 목록 조회
 	 *
 	 * @param order - 주문 정보
 	 * @return Collection<Order>
 	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
-	public Collection<Order> getOrderTsainMemoList(Order order) {
+	public Collection<Order> getOrderMemoList(Order order) {
 		order.setDelYn("N");
-		return orderDao.getOrderTsainMemoList(order);
+		return orderDao.getOrderMemoList(order);
 	}
 	
 	/**
@@ -544,17 +544,6 @@ public class TsaOrderService {
 		}
 	}
 	
-	/**
-	 * 주문정보조회
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	public Order getOrderInfo(Order order) {
-		return orderDao.getOrderInfo(order);
-	}
-	
 	/**
 	 * 주문상세 > 주문취소대상목록
 	 * @param Order
@@ -577,25 +566,29 @@ public class TsaOrderService {
 		GagaMap mav = new GagaMap();
 		
 		// 1. 변수설정
-		int spanPayAmt			= 0; // 총 결제 금액
-		int spanSumRealOrdAmt	= 0; // 상품 실결제 금액
-		int spanSumDeliveryFee	= 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 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>();	// 주문환불배송금액목록
@@ -611,6 +604,8 @@ public class TsaOrderService {
 		delvObj.setDelvFee(cancelReqList.get(k).getDelvFee());
 		delvObj.setMinOrdAmt(cancelReqList.get(k).getMinOrdAmt());
 		delvObj.setOrgDelvFee(cancelReqList.get(k).getOrgDelvFee());
+		delvObj.setRtnDelvFee(cancelReqList.get(k).getRtnDelvFee());
+		delvObj.setExcDelvFee(cancelReqList.get(k).getExcDelvFee());
 		delvObj.setSupplyCompCd(cancelReqList.get(k).getSupplyCompCd());
 		delvObj.setDelvFeeCd(cancelReqList.get(k).getDelvFeeCd());
 		delvObj.setAllCanYn(cancelReqList.get(k).getAllCanYn());
@@ -681,6 +676,8 @@ public class TsaOrderService {
 			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());
@@ -712,6 +709,8 @@ public class TsaOrderService {
 				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());
@@ -736,41 +735,54 @@ public class TsaOrderService {
 		for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
 			Order obj = cancelDelvRefundList.get(i);
 			
-			// 4.1 무료배송비용 > (주문금액 - 취소금액)
-			if (obj.getMinOrdAmt() > (obj.getOrdAmt() - obj.getCnclRtnAmt())) {
-				
-				// 4.2 주문시 배송비가 존재하면 추가 배송비 없음
-				if (obj.getDelvFee() > 0) {
-					obj.setAddDelvFeeYn("N");
-					obj.setAddDelvFee(0);
-				} else {
-					// 4.3 주문금액 - 취소금액 == 0 이면 전체취소 이므로 배송비 발생 안함
-					// * 2020.12.28 
-					// * case : 배송정책 기준으로 1,2 상품 주문 후 1번 출고 후 1번반품 2번취소 할 경우 전체 취소 가 아니므로 배송비 부과 있을지 모르겠음 주문업체 단위로 배송되기 때문에 발생하지 않을것 같음
-					if ((obj.getOrdAmt() - obj.getCnclRtnAmt()) == 0) {
-						if ("N".equals(obj.getAllCanYn())) {
+			// 취소금액이 있을때 처리
+			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 {
-							// 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);
 				}
-			} else {
-				obj.setAddDelvFeeYn("N");
-				obj.setAddDelvFee(0);
 			}
-			
-			spanSumDeliveryFee	+= obj.getDelvFee();
-			spanOrdAmt			+= obj.getOrdAmt();
-			spanCnclRtnAmt		+= obj.getCnclRtnAmt();
-			spanTotDeliveryFee  += obj.getAddDelvFee();
+				
+			spanSumDeliveryFee		+= obj.getDelvFee();
+			spanRtnSumDeliveryFee	+= obj.getRtnDelvFee();
+			spanExcSumDeliveryFee	+= obj.getExcDelvFee();
+			spanOrdAmt				+= obj.getOrdAmt();
+			spanCnclRtnAmt			+= obj.getCnclRtnAmt();
+			spanTotDeliveryFee  	+= obj.getAddDelvFee();
 			
 			cancelDelvRefundList.set(i, obj);
 		}
@@ -783,7 +795,7 @@ public class TsaOrderService {
 		spanTotPntDcAmt 	= spanPntDcAmt + spanPrePntDcAmt;
 		spanCpnDcAmt 		= spanCpn1DcAmt + spanGoodsCpnDcAmt + spanCartCpnDcAmt;
 		spanTmtbDcAmt 		= spanTmtb1DcAmt + spanTmtb2DcAmt;
-		spanRefundAmt 		= spanRealCnclRtnAmt - spanTotDeliveryFee;
+		spanRefundAmt 		= (spanRealCnclRtnAmt + sumDeliveryFee) - spanTotDeliveryFee;
 
 		mav.set("cancelReqList"			, cancelReqList);			//주문 취소 신청 목록
 		mav.set("cancelOrderRefundList"	, cancelOrderRefundList);	//주문 환불 금액 목록
@@ -805,7 +817,9 @@ public class TsaOrderService {
 		mav.set("spanTmtb2DcAmt"		, spanTmtb2DcAmt);			//금액할인
 		mav.set("spanGfcdUseAmt"		, spanGfcdUseAmt);			//취소 고객 상품권 금액
 		mav.set("spanRealCnclRtnAmt"	, spanRealCnclRtnAmt);		//취소 상품 실결제 금액
-		mav.set("spanTotDeliveryFee"	, spanTotDeliveryFee);		//환불 배송 금액
+		mav.set("spanTotDeliveryFee"	, spanTotDeliveryFee);		//추가 배송 금액
+		mav.set("spanTotRtnDelvFee"		, spanRtnSumDeliveryFee);	//추가 반품 배송 금액
+		mav.set("spanTotExcDelvFee"		, spanExcSumDeliveryFee);	//추가 교환 배송 금액
 		mav.set("spanRefundAmt"			, spanRefundAmt);			//환불 금액 합계
 		
 		return mav;
@@ -853,31 +867,31 @@ public class TsaOrderService {
 		
 		// 4.2 주문변경 상세 단품 정보 등록 (단품단위)
 		for (int i=0 ; i<cancelOrderRefundList.size() ; i++) {
-			Order vo = cancelOrderRefundList.get(i);
-			vo.setRegNo(userNo);
-			vo.setUpdNo(userNo);
+			Order cancelOrderRefundPo = cancelOrderRefundList.get(i);
+			cancelOrderRefundPo.setRegNo(userNo);
+			cancelOrderRefundPo.setUpdNo(userNo);
 			
 			// 2020.01.05 추후 무통장입금전 전체 취소시 분기로직 추가 예정
 			if ("Y".equals(allCanYn)) {
-				vo.setOrdDtlStat("G013_98"); // 결제전주문취소 : 공통코드로관리예정
+				cancelOrderRefundPo.setOrdDtlStat("G013_98"); // 결제전주문취소 : 공통코드로관리예정
 			} else {
-				vo.setOrdDtlStat("G013_99"); // 결제후주문취소 : 공통코드로관리예정
+				cancelOrderRefundPo.setOrdDtlStat("G013_99"); // 결제후주문취소 : 공통코드로관리예정
 			}
 
 			// 4.2.1 취소수량이 존재하면 주문정보 수정 및 주문변경정보 등록
-			if (vo.getOrdCanChgQty() > 0) {
+			if (cancelOrderRefundPo.getOrdCanChgQty() > 0) {
 				// 4.2.3 주문상세단품정보 수정
-				orderDao.updateOrderDetailItem(vo);
+				orderDao.updateOrderDetailItem(cancelOrderRefundPo);
 				
 				// 4.2.4 주문상세단품정보 이력 등록
-				orderDao.createOrderDetailItemHst(vo);
+				orderDao.createOrderDetailItemHst(cancelOrderRefundPo);
 				
 				// 4.3 주문변경 상세 단위로 데이타 등록 (ORD_DTL_NO)
 				Boolean temp = false;
 				
 				if (cancelOrderDetailList.size() > 0) {
 					for (int j=0 ; j<cancelOrderDetailList.size() ; j++) {
-						if (vo.getOrdDtlNo() == cancelOrderDetailList.get(j).getOrdDtlNo()) {
+						if (cancelOrderRefundPo.getOrdDtlNo() == cancelOrderDetailList.get(j).getOrdDtlNo()) {
 							temp = true;
 						}
 					}
@@ -885,8 +899,11 @@ public class TsaOrderService {
 				
 				// 4.4 주문상세단위 데이타 저장
 				if (!temp) {
-					cancelOrderDetailList.add(vo);
+					cancelOrderDetailList.add(cancelOrderRefundPo);
 				}
+				
+				// 4.5 상품옵션 재고 원복
+				orderDao.updateOptionQty(cancelOrderRefundPo);
 			}
 		}
 		
@@ -911,15 +928,15 @@ public class TsaOrderService {
 			
 			// * 주문상세단위가 아닌 주문상세단품단위로 데이타가 처리되고 있었음
 			// 5.3 주문변경상세정보 등록
-			OrderChange po = new OrderChange();
-			po.setOrdChgSq(orderChange.getOrdChgSq());
-			po.setOrdDtlNo(vo.getOrdDtlNo());
-			po.setChgQty(vo.getOrdCanChgQty());
-			po.setChgStat("G685_21"); // 취소완료 : 공통코드로관리예정
-			po.setRegNo(userNo);
-			po.setUpdNo(userNo);
+			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);
 			
-			orderDao.createOrderChangeDetail(po);
+			orderDao.createOrderChangeDetail(changeDetailPo);
 		}
 		
 		// 6. 환불결제 정보 등록
@@ -978,13 +995,15 @@ public class TsaOrderService {
 			}
 		}
 
-		// 9. 포인트원복
-		
-		// 10. 쿠폰원복 (상품쿠폰)
+		// 9. 포인트원복 (사용포인트, 주문상세단위)
 		
-		// 11. 사은품 취소
+		// 10. 쿠폰원복 (상품쿠폰, 주문상세단위) (전체취소시 장바구니쿠폰, 배송비쿠폰)
 		
-		// 12. 재고원복
+		// 11. 사은품 전체 취소 (전체취소시 적용)
+		Order freegiftOrder = new Order();
+		freegiftOrder.setOrdNo(ordNo);
+		freegiftOrder.setUpdNo(userNo);
+		orderDao.updateOrdFreegiftDel(freegiftOrder);
 		
 		// 13. PG 연동
 		

+ 10 - 10
style24.admin/src/main/java/com/style24/admin/biz/web/TsaOrderController.java

@@ -66,7 +66,7 @@ public class TsaOrderController extends TsaBaseController {
 	//private TsaMessageByLocale message;
 	
 	/**
-	 * 주문 조회 화면
+	 * 주문목록조회
 	 *
 	 * @return ModelAndView
 	 * @author jsh77b
@@ -94,7 +94,7 @@ public class TsaOrderController extends TsaBaseController {
 	}
 	
 	/**
-	 * 주문 목록
+	 * 주문목록
 	 *
 	 * @param order - 주문정보
 	 * @return Collection<Order>
@@ -137,7 +137,7 @@ public class TsaOrderController extends TsaBaseController {
 	}
 	
 	/**
-	 * 주문 목록 엑셀 조회
+	 * 주문목록엑셀조회
 	 *
 	 * @param order - 주문정보
 	 * @return Collection<Order>
@@ -206,11 +206,11 @@ public class TsaOrderController extends TsaBaseController {
 		
 		// 2. 클레임정보
 		mav.addObject("orderChangeInfo"			, orderService.getOrderChangeList(order));				// 취소/반품/교환요청 정보
-		mav.addObject("orderRefundInfo"			, orderService.orderRefundInfo(order));					// 환불정보
+		mav.addObject("orderRefundInfo"			, orderService.getOrderRefundInfo(order));				// 환불정보
 		
 		// 3. 주문메모정보
-		mav.addObject("orderCounselInfo"		, orderService.orderCounselInfo(order));				// 상담내역
-		mav.addObject("orderAdminMemoInfo"		, orderService.getOrderTsainMemoList(order));			// 관리자메모
+		mav.addObject("orderCounselInfo"		, orderService.getOrderCounselInfo(order));				// 상담내역
+		mav.addObject("orderAdminMemoInfo"		, orderService.getOrderMemoList(order));				// 관리자메모목록
 
 		mav.setViewName("order/OrderDetailForm");
 		
@@ -467,7 +467,7 @@ public class TsaOrderController extends TsaBaseController {
 	public Collection<Order> getOrderTsainMemoList(@PathVariable(value = "ordNo") int ordNo) {
 		Order order = new Order();
 		order.setOrdNo(ordNo);
-		return orderService.getOrderTsainMemoList(order);
+		return orderService.getOrderMemoList(order);
 	}
 	
 	/**
@@ -629,12 +629,12 @@ public class TsaOrderController extends TsaBaseController {
 		
 		Collection<Order> cancelRequestTargetList = orderService.getCancelRequestTargetList(order);
 
-		Order orderInfo = orderService.getOrderInfo(order);
+		Collection<Order> orderInfoList = orderService.getOrderInfoList(order);
 
 		//mav.addObject("nicePay", nicePay);
 		mav.addObject("chgReasonList"				, rendererService.getAvailCommonCodeList("G686"));	// 취소사유
 		mav.addObject("cancelRequestTargetList"		, cancelRequestTargetList);							// 취소요청대상 목록
-		mav.addObject("orderInfo"					, orderInfo);										// 주문정보
+		mav.addObject("orderInfoList"				, orderInfoList);										// 주문정보
 		mav.addObject("ordNo"						, ordNo);
 		mav.addObject("cncWait"						, cncWait);
 
@@ -720,7 +720,7 @@ public class TsaOrderController extends TsaBaseController {
 		Order order = new Order();
 		order.setOrdNo(ordNo);
 
-		Order orderBasic 						= orderService.getOrderInfo(order);
+		Collection<Order> orderBasic 			= orderService.getOrderInfoList(order);
 		Collection<Order> orderRfAccountInfo 	= orderService.getRefundAccount(order);
 
 		mav.addObject("bankList"				, rendererService.getCommonCodeList("G940"));

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

@@ -355,6 +355,8 @@ public class Order extends TscBaseDomain {
 	private int delvCpnDcAmt;
 	
 	private int chgQty;
+	private int rtnDelvFee;
+	private int excDelvFee;
 	
 
 }

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

@@ -1737,7 +1737,7 @@
 	
 	<!-- 상품 옵션/재고 정보 이력생성 -->
 	<insert id="createStockHst" parameterType="Option">
-	/* TsaGoods.createStockHst */
+		/* TsaGoods.createStockHst */
 		INSERT INTO TB_OPTION_HST 
 		(     OPTION_HST_SQ
 		    , GOODS_CD

+ 72 - 74
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml

@@ -419,11 +419,30 @@
 		            THEN '등급없음'
 		            ELSE FN_GET_CODE_NM('G110', C.CUST_GRADE) 
 		             END CUST_GRADE_NM
+			 , P.ESCROW_YN
+		     , P.PAY_MEANS
+		     , FN_GET_CODE_NM('G014', P.PAY_MEANS) AS PAY_MEANS_NM
+		     , P.CARD_NM
+		     , P.VA_BANK
+		     , CASE WHEN P.PAY_MEANS = 'G014_20' || P.PAY_MEANS = 'G014_10'
+		            THEN FN_GET_CODE_NM('G940', P.VA_BANK)
+		            ELSE P.CARD_NM
+		            END  CARD_NM
+		     , P.PG_TRADE_NO
+		     , DATE_FORMAT(P.PAY_DT,'%Y%m%d%H%i%S') AS PAY_DT  
+		     , P.PAY_STAT 
+		     , FN_GET_CODE_NM('G016', P.PAY_STAT) AS PAY_STAT_NM
+		     , P.PAY_AMT 
+		     , DATE_FORMAT(P.VA_DEADLINE,'%Y%m%d%H%i%S') AS VA_DEADLINE 
 		FROM   TB_ORDER O
 		INNER  JOIN TB_ORDER_DETAIL OD
 		ON     O.ORD_NO = OD.ORD_NO
 		LEFT   OUTER JOIN TB_CUSTOMER C
 		ON     O.CUST_NO = C.CUST_NO
+		INNER  JOIN TB_PAYMENT P
+		ON     O.ORD_NO = P.ORD_NO
+		AND    P.PAY_GB = 'O'
+		AND    P.PAY_STAT = 'G016_30'
 		WHERE  1=1
 		AND    O.ORD_NO = #{ordNo}
 		LIMIT  1
@@ -680,8 +699,8 @@
 	</select>
 	
 	<!-- 주문상세 > 환불정보 -->
-	<select id="orderRefundInfo" parameterType="Order" resultType="Order">
-		/* order.orderRefundInfo */
+	<select id="getOrderRefundInfo" parameterType="Order" resultType="Order">
+		/* order.getOrderRefundInfo */
 		SELECT P.PAY_MEANS
 		     , FN_GET_CODE_NM('G014', P.PAY_MEANS) AS PAY_MEANS_NM
 		     , P.CARD_NM
@@ -702,11 +721,12 @@
 		ON     R.ORD_CHG_SQ = P.ORD_CHG_SQ 
 		WHERE  1=1
 		AND    R.ORD_NO = #{ordNo}
+		ORDER  BY R.REG_DT DESC
 	</select>
 	
 	<!-- 주문상세 > 상담내역 -->
-	<select id="orderCounselInfo" parameterType="Order" resultType="Order">
-		/* order.orderCounselInfo */
+	<select id="getOrderCounselInfo" parameterType="Order" resultType="Order">
+		/* order.getOrderCounselInfo */
 		SELECT CS.COUNSEL_CLSF
 			 , FN_GET_CODE_NM('G059', CS.COUNSEL_CLSF) AS COUNSEL_CLSF_NM
 		     , CS.REL_GOODS_CD
@@ -793,7 +813,7 @@
 		AND    OD.ORD_DTL_NO = ODI.ORD_DTL_NO 
 		INNER  JOIN TB_GOODS G2
 		ON     ODI.ITEM_CD = G2.GOODS_CD
-		INNER  JOIN TB_GOODS_IMG GI
+		LEFT   OUTER JOIN TB_GOODS_IMG GI
 		ON     ODI.ITEM_CD = GI.GOODS_CD
 		AND    ODI.OPT_CD1 = GI.COLOR_CD
 		INNER  JOIN TB_PAYMENT P
@@ -1076,7 +1096,7 @@
 		AND    OD.ORD_DTL_NO = ODI.ORD_DTL_NO
 		INNER  JOIN TB_GOODS G2
 		ON     ODI.ITEM_CD = G2.GOODS_CD
-		INNER  JOIN TB_GOODS_IMG GI
+		LEFT   OUTER JOIN TB_GOODS_IMG GI
 		ON     ODI.ITEM_CD = GI.GOODS_CD
 		AND    ODI.OPT_CD1 = GI.COLOR_CD 
 		INNER  JOIN TB_PAYMENT P
@@ -1477,71 +1497,6 @@
 		AND    ORD_DTL_NO = #{ordDtlNo}
 	</update>
 	
-	<!-- 주문정보 -->
-	<select id="getOrderInfo" parameterType="Order" resultType="Order">
-		/* order.getOrderInfo */
-		SELECT O.ORD_NO
-		     , O.MALL_GB
-		     , FN_GET_CODE_NM('G011', O.MALL_GB) AS MALL_GB_NM
-		     , DATE_FORMAT(O.ORD_DT,'%Y%m%d%H%i%S') AS ORD_DT
-		     , O.CUST_NO
-		     , O.ORD_NM
-		     , O.ORD_PHNNO
-		     , O.ORD_TELNO
-		     , O.ORD_EMAIL
-		     , O.SITE_CD
-		     , FN_GET_CODE_NM('G000', O.SITE_CD) AS SITE_NM
-		     , O.FRONT_GB
-		     , O.REG_NO
-		     , DATE_FORMAT(O.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
-		     , O.UPD_NO
-		     , DATE_FORMAT(O.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
-		     , P.PAY_MEANS
-		     , FN_GET_CODE_NM('G014', P.PAY_MEANS) AS PAY_MEANS_NM
-		     , DATE_FORMAT(O.PAY_DT,'%Y%m%d%H%i%S') AS PAY_DT
-		     , P.PAY_AMT
-		     , P.PAY_SQ
-		     , P.PAY_STAT
-		     , P.PG_GB
-		     , P.PG_TID
-		     , P.ESCROW_YN
-		     , C.CUST_GB
-		     , C.CUST_GRADE
-		     , S.SUM_ORD_QTY
-		     , S.SUM_CNCL_RTN_QTY
-		     , S.SUM_REAL_ORD_AMT
-		     , S.SUM_CNCL_RTN_AMT
-		     , S.SUM_CART_CPN_DC_AMT
-		FROM   TB_ORDER O
-		INNER  JOIN TB_PAYMENT P
-		ON     O.ORD_NO = P.ORD_NO
-		INNER  JOIN (
-			SELECT MAX(PAY_SQ) AS PAY_SQ 
-			FROM   TB_PAYMENT 
-			WHERE  ORD_NO = #{ordNo}
-		) PS
-		ON     P.PAY_SQ = PS.PAY_SQ
-		LEFT   OUTER JOIN TB_CUSTOMER C
-		ON     O.CUST_NO = C.CUST_NO
-		INNER  JOIN (
-			SELECT ORD_NO
-			     , NVL(MIN(CART_CPN_SQ),0) AS CART_CPN_SQ
-			     , SUM(OD.ORD_QTY)         AS SUM_ORD_QTY
-			     , SUM(OD.CNCL_RTN_QTY)    AS SUM_CNCL_RTN_QTY
-			     , SUM(OD.REAL_ORD_AMT)    AS SUM_REAL_ORD_AMT
-			     , SUM(OD.CNCL_RTN_AMT)    AS SUM_CNCL_RTN_AMT
-			     , SUM(OD.CART_CPN_DC_AMT) AS SUM_CART_CPN_DC_AMT
-			FROM  TB_ORDER_DETAIL OD
-			WHERE ORD_NO = #{ordNo}
-			GROUP BY ORD_NO
-		) S
-		ON    1=1
-		LEFT  OUTER JOIN TB_CUST_COUPON CC
-		ON    S.CART_CPN_SQ = CC.CUST_CPN_SQ 
-		WHERE O.ORD_NO = P.ORD_NO
-		AND   O.ORD_NO = #{ordNo}
-	</select>
-	
 	<!-- 주문상세 > 주문취소대상목록 -->
 	<select id="getCancelRequestTargetList" parameterType="Order" resultType="Order">
 		/* order.getCancelRequestTargetList */
@@ -1588,6 +1543,8 @@
 		     , DF.DELV_FEE_CD 
 		     , DFP.MIN_ORD_AMT 
 		     , DFP.DELV_FEE AS ORG_DELV_FEE
+		     , DFP.RTN_DELV_FEE
+		     , DFP.DELV_FEE + DFP.RTN_DELV_FEE AS EXC_DELV_FEE
 		     , 0			AS ORD_CAN_CHG_QTY
 		FROM   TB_ORDER_DETAIL OD
 		INNER  JOIN TB_GOODS G1
@@ -1627,6 +1584,7 @@
 		INNER  JOIN TB_DELV_FEE_POLICY DFP
 		ON     DF.SUPPLY_COMP_CD  = DFP.SUPPLY_COMP_CD 
 		AND    DF.DELV_FEE_CD = DFP.DELV_FEE_CD 
+		AND    DFP.USE_YN = 'Y'
 		WHERE  1=1
 		AND    OD.ORD_DTL_STAT IN (
 			'G013_10', 'G013_20', 'G013_30', 'G013_40'
@@ -1707,6 +1665,23 @@
 		)
 	</insert>
 	
+	<!-- 주문상세 > 주문취소신청 > 주문상세단품정보 수정 -->
+	<update id="updateOptionQty" parameterType="OrderChange">
+		/* Order.updateOptionQty */
+		UPDATE TB_OPTION OP
+		INNER  JOIN TB_ORDER_DETAIL_ITEM ODI
+		ON     OP.GOODS_CD = ODI.ITEM_CD
+		AND    OP.OPT_CD1 = ODI.OPT_CD1
+		AND    OP.OPT_CD2 = ODI.OPT_CD2
+		SET    OP.CURR_STOCK_QTY = OP.CURR_STOCK_QTY + (ODI.ITEM_QTY * #{ordCanChgQty})
+		     , OP.UPD_NO = 1
+		     , OP.UPD_DT = SYSDATE()
+		WHERE  1=1
+		AND    ODI.ORD_NO 			= #{ordNo} 
+		AND    ODI.ORD_DTL_NO 		= #{ordDtlNo} 
+		AND    ODI.ORD_DTL_ITEM_SQ 	= #{ordDtlItemSq}
+	</update>
+	
 	<!-- 주문상세 > 주문취소신청 > 주문상세단품정보 수정 -->
 	<update id="updateOrderDetailItem" parameterType="Order">
 		/* Order.updateOrderDetailItem */
@@ -1904,10 +1879,10 @@
 			 , OD.CURR_PRICE
 			 , OD.DC_RATE
 			 , OD.OPT_ADD_PRICE
-			 , OD.ORD_QTY - #{ordCanChgQty}
-			 , OD.ORD_AMT - Z.ORD_AMT
+			 , OD.ORD_QTY
+			 , Z.ORD_AMT
 			 , #{ordCanChgQty}
-			 , OD.ORD_AMT - Z.CNCL_RTN_AMT
+			 , OD.ORD_AMT
 			 , OD.CPN1_CPN_SQ
 			 , OD.CPN1_DC_AMT - Z.CPN1_DC_AMT
 			 , OD.TMTB1_SQ
@@ -2251,6 +2226,29 @@
 			, SYSDATE()
 		)
 	</insert>
+	
+	<!-- 주문사은품취소 -->
+	<update id="updateOrdFreegiftDel" parameterType="Order">
+		/* Order.updateOrdFreegiftDel */
+		UPDATE TB_ORD_FREEGIFT_VAL
+		SET    DEL_YN= 'N'
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = SYSDATE()
+		WHERE  FREEGIFT_VAL_SQ IN (
+			SELECT OFRV.FREEGIFT_VAL_SQ 
+			FROM   TB_ORD_FREEGIFT OFR
+			INNER  JOIN TB_ORD_FREEGIFT_VAL OFRV
+			ON     OFR.ORD_FREEGIFT_SQ  = OFRV.ORD_FREEGIFT_SQ 
+			WHERE  1=1
+			AND    OFR.ORD_NO = (SELECT CASE WHEN SUM(X.ORD_QTY) > SUM(X.CNCL_RTN_QTY)
+								             THEN 0
+								             ELSE X.ORD_NO
+								             END 
+								 FROM   TB_ORDER_DETAIL X
+								 WHERE  1=1
+								 AND    X.ORD_NO = #{ordNo})
+		)
+	</update>
 	
 </mapper>
 

+ 107 - 15
style24.admin/src/main/webapp/WEB-INF/views/order/CancelRequestForm.html

@@ -36,10 +36,12 @@
 				<div id="gridDelvCdList" style="width:100%; height: 140px;" class="ag-theme-balham"></div>
 				
 				<div style="text-align:right; padding-bottom:5px; padding-top:5px;">
+					<!-- 
 					<button type="button" class="btn btn-success" id="btnCancelRequestEscrow" onclick="fnCancelRequestEscrow();" style="display:none;">에스크로 결제생성</button>
 					<label th:if="${sessionInfo.userId == 'jsh77b'}">
 						<input type="checkbox" name="pgStats" value="N">PG 전문 미전송
 					</label>
+					 -->
 					<button type="button" class="btn btn-success" id="btnCancelRequestPartOk" onclick="fnCancelRequestPartOk();">요청</button>
 				</div>
 				
@@ -114,6 +116,14 @@
 							<th>추가 배송 금액</th>
 							<td><span id="spanTotDeliveryFee"></span>원 </td>
 						</tr>
+						
+						<tr>
+							<th>추가 반품배송 금액</th>
+							<td><span id="spanTotRtnDelvFee"></span>원</td>
+							<th>추가 교환배송 금액</th>
+							<td><span id="spanTotExcDelvFee"></span>원 </td>
+						</tr>
+						
 						<tr>
 							<th>환불 금액 합계</th>
 							<td colspan="3"><span id="spanRefundAmt"></span>원</td>
@@ -137,7 +147,8 @@
 /*<![CDATA[*/
 var cancelRequestTargetList = [[${cancelRequestTargetList}]];				// 취소대상목록
 var ordNo 					= [[${ordNo}]];									// 주문번호
-var orderInfo 				= [[${orderInfo}]];								// 주문기본정보
+var orderInfoList 			= [[${orderInfoList}]];							// 주문기본정보
+var payMeans 				= orderInfoList[0].payMeans;					// 결제수단
 
 var temp1 = true;
 var temp2 = false;
@@ -162,8 +173,8 @@ var columnCancelReqList = [
 			{headerName: "단품번호"		, field: "ordDtlItemSq"		, width: 100	, cellClass: 'text-center', hide: temp2},
 			{headerName: "단품코드"		, field: "itemCd"			, width: 100	, cellClass: 'text-center', hide: temp2},
 			{headerName: "단품명"			, field: "itemNm"			, width: 200	, cellClass: 'text-center', hide: temp2},
-			{headerName: "칼라코드"		, field: "optCd1"			, width: 80		, cellClass: 'text-center', hide: temp1},
-			{headerName: "사이즈코드"		, field: "optCd2"			, width: 80		, cellClass: 'text-center', hide: temp2},
+			{headerName: "옵션1"			, field: "optCd1"			, width: 80		, cellClass: 'text-center', hide: temp1},
+			{headerName: "옵션2"			, field: "optCd2"			, width: 80		, cellClass: 'text-center', hide: temp2},
 			{
 				headerName		: "단품수량"		
 				, field			: "itemQty"			
@@ -382,6 +393,26 @@ var columnCancelReqList = [
 				}
 				, hide			: temp2
 			},
+			{
+				headerName		: "반품배송비"		
+				, field			: "rtnDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "교환배송비"		
+				, field			: "excDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
 			{headerName: "전체취소가능"		, field: "allCanYn"			, width: 100	, cellClass: 'text-center', hide: temp2},
 		]
 	}
@@ -615,6 +646,26 @@ var columnCancelReqToBeList = [
 				}
 				, hide			: temp2
 			},
+			{
+				headerName		: "반품배송비"		
+				, field			: "rtnDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "교환배송비"		
+				, field			: "excDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
 			{headerName: "전체취소가능"		, field: "allCanYn"			, width: 100	, cellClass: 'text-center', hide: temp2},
 		]
 	}
@@ -690,6 +741,26 @@ var columnDelvCdList = [
 				}
 				, hide			: temp2
 			},
+			{
+				headerName		: "반품배송비"		
+				, field			: "rtnDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "교환배송비"		
+				, field			: "excDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
 			{headerName: "추가배송비여부"		, field: "addDelvFeeYn"		, width: 140	, cellClass: 'text-center', hide: temp2},
 			{
 				headerName		: "추가배송비"		
@@ -811,6 +882,9 @@ var fnCalculateRefundAmt = function (obj) {
 			$("#spanRealCnclRtnAmt").text(result.spanRealCnclRtnAmt.addComma());	//취소 상품 실결제 금액
 			$("#spanTotDeliveryFee").text(result.spanTotDeliveryFee.addComma());	//환불 배송 금액
 			
+			$("#spanTotRtnDelvFee").text(result.spanTotRtnDelvFee.addComma());		//환불 배송 금액
+			$("#spanTotExcDelvFee").text(result.spanTotExcDelvFee.addComma());		//환불 배송 금액
+			
 			$("#spanRefundAmt").text(result.spanRefundAmt.addComma());				//환불 금액 합계
 		}
 	);
@@ -872,12 +946,22 @@ var fnCancelRequestPartOk = function () {
 		mcxDialog.alert("취소사유를 입력하세요."); return ;
 	}
 	
-	// 4. 환불계좌 체크 
-	var refundAccount = gridOptionsRefundAccountInfo.api.getSelectedRows();
+	// 4. 환불계좌 체크
+	var accountNo 	= "";
+	var accountNm 	= "";
+	var bankCd 		= "";
 	
-	if (refundAccount.length == 0) {
-		mcxDialog.alert('선택된 행이 없습니다.');
-		return;
+	if (payMeans == 'G014_20') {
+		var refundAccount = gridOptionsRefundAccountInfo.api.getSelectedRows();
+		
+		if (refundAccount.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		accountNo 	= refundAccount[0].accountNo;
+		accountNm 	= refundAccount[0].accountNm;
+		bankCd 		= refundAccount[0].bankCd;
 	}
 
 	// 5. PG 전송 여부
@@ -885,6 +969,7 @@ var fnCancelRequestPartOk = function () {
 	if ($('#cancelRequestFrm input:checkbox[name=pgStats]').is(":checked")) {
 		pgStat = "Y";
 	}
+	
 	$("#cancelRequestFrm input[name=pgStat]").val(pgStat);
 	
 	var jsonObj = {
@@ -892,9 +977,9 @@ var fnCancelRequestPartOk = function () {
 		,"chgReason" 		: $('#cancelRequestFrm input[name=chgReason]').val()
 		,"chgMemo"			: $('#chgMemo').val()
 		,"cancelReqList" 	: cancelRequestTargetList
-		,"accountNo" 		: refundAccount[0].accountNo
-		,"accountNm" 		: refundAccount[0].accountNm
-		,"bankCd" 			: refundAccount[0].bankCd
+		,"accountNo" 		: accountNo
+		,"accountNm" 		: accountNm
+		,"bankCd" 			: bankCd
 		,"allCanYn" 		: allCanYn
 	}
 
@@ -936,7 +1021,7 @@ var fnBindOrderRfAccountInfo = function () {
 };
 
 $(document).ready(function() {
-	// Create a agGrid
+	// 1. Create a agGrid
 	gagaAgGrid.createGrid('gridOrderCancelRequestList'		, gridOptionsCancelReqList);			// 주문정보
 	gridOptionsCancelReqList.api.setRowData(cancelRequestTargetList);
 	
@@ -947,11 +1032,18 @@ $(document).ready(function() {
 	gagaAgGrid.createGrid('gridRefundAccountInfo'			, gridOptionsRefundAccountInfo);		// 환불계좌정보
 	//gridOptionsRefundAccountInfo.api.setRowData(orderRfAccountInfo);
 	
-	// 환불계좌정보
-	fnBindOrderRfAccountInfo();
-	
 	// 취소정보계산
 	fnCalculateRefundAmt(null);
+	
+	// 그리드 숨김처리
+	if (payMeans !== 'G014_20') {
+		$('#wrapRefundAccount').addClass("off");
+	}
+	
+	if (payMeans === 'G014_20' && mallGb === 'G011_10' ) {
+		// 환불계좌정보
+		fnBindOrderRfAccountInfo();
+	}
 });
 </script>
 </html>

+ 29 - 24
style24.admin/src/main/webapp/WEB-INF/views/order/OrderDetailForm.html

@@ -123,7 +123,6 @@ var orderAdminMemoInfo 		= [[${orderAdminMemoInfo}]];			// 관리자메모
 //var savePntAmtClass 		= (orderGoodsInfo[0].savePntAmt > 0) 		? 'bgSky' : 'text-right';
 
 //var custNo 				= orderInfo[0].custNo;
-//var payMeans 				= orderInfo[0].payMeans;
 //var mallGb 				= orderInfo[0].mallGb;
 </script>
 
@@ -569,11 +568,11 @@ var columnDefsPaymentInfo = [
 	{headerName: "에스크로여부"		, field: "escrowYn"		, width: 100	, cellClass: 'text-center'},
 	{headerName: "결제수단"		, field: "payMeansNm"	, width: 100	, cellClass: 'text-center'},
 	{headerName: "카드(은행)"		, field: "cardNm"		, width: 100	, cellClass: 'text-center'},
-	{headerName: "할부(입금계좌)"	, field: "cardMips"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "할부(입금계좌)"	, field: "cardMips"		, width: 150	, cellClass: 'text-center'},
 	{
 		headerName		: "승인번호"
 		, field			: "pgTradeNo"
-		, width			: 80
+		, width			: 100
 		, cellClass		: 'text-center'
 		, cellRenderer	: function (params) {
 			var retStr = '';
@@ -656,7 +655,7 @@ var columnDefsOrderChangeInfo = [
 		}
 	},
 	{headerName: "변경사유"		, field: "chgReasonNm"	, width: 100	, cellClass: 'text-center'},
-	{headerName: "요청메모"		, field: "chgMemo"		, width: 120	, cellClass: 'text-center'},
+	{headerName: "요청메모"		, field: "chgMemo"		, width: 150	, cellClass: 'text-center'},
 	{headerName: "변경자명"		, field: "chgerNm"		, width: 100	, cellClass: 'text-center'},
 	{headerName: "변경자핸드폰"		, field: "chgerPhnno"	, width: 120	, cellClass: 'text-center', editable: true},
 	{headerName: "우편번호"		, field: "chgerPostNo"	, width: 120	, cellClass: 'text-center'},
@@ -667,21 +666,24 @@ var columnDefsOrderChangeInfo = [
 		, cellClass		: 'text-center'
 		, cellRenderer	: function (params) {
 			var retStr = "";
-
-			if (params.data.wdInvoiceSendYn == 'N') {
-				retStr += "<button type=\"button\" class=\"btn btn-info\" onclick=\"fnOpenPostFindPopup('" + params.node.rowIndex + "');\">POST</button>";
-				retStr += "<button type=\"button\" class=\"btn btn-info\" onclick=\"fnSaveChgerAddr('" + params.node.rowIndex + "');\">저장</button>";
+			
+			// 교환요청, 반품요청일때만 버튼 활성화
+			if (chgStat == 'G685_30' || chgStat == 'G685_40' ) {
+				if (params.data.wdInvoiceSendYn == 'N') {
+					retStr += "<button type=\"button\" class=\"btn btn-info\" onclick=\"fnOpenPostFindPopup('" + params.node.rowIndex + "');\">POST</button>";
+					retStr += "<button type=\"button\" class=\"btn btn-info\" onclick=\"fnSaveChgerAddr('" + params.node.rowIndex + "');\">저장</button>";
+				}
 			}
 
 			retStr += (gagajf.isNull(params.value)) ? '' : (gagajf.isNull(params.data.chgerDtlAddr)) ? params.value : params.value + params.data.chgerDtlAddr;
 			return retStr;
 		}
 	},
-	{headerName: "주소(상세)"		, field: "chgerDtlAddr"	, width: 105	, cellClass: 'text-center'	, editable: true},
+	{headerName: "주소(상세)"		, field: "chgerDtlAddr"	, width: 150	, cellClass: 'text-center'	, editable: true},
 	{
 		headerName		: "택배사전송"
 		, field			: "wdInvoiceSendYn"
-		, width			: 70
+		, width			: 120
 		, cellClass		: 'text-center'
 		, cellRenderer	: function (params) {
 			return (params.value == 'N') ? '미전송' : '전송';
@@ -719,8 +721,8 @@ var gridOptionsOrderChangeInfo = orderAgGrid.getGridOptions(columnDefsOrderChang
 // 7.환불정보
 var columnDefsRefundInfo = [
 	{headerName: "환불수단"		, field: "payMeansNm"	, width: 80		, cellClass: 'text-center'},
-	{headerName: "환불은행(카드)"	, field: "cardNm"		, width: 100	, cellClass: 'text-center'},
-	{headerName: "환불은행계좌번호"	, field: "raNo"			, width: 100	, cellClass: 'text-center'},
+	{headerName: "환불은행(카드)"	, field: "cardNm"		, width: 120	, cellClass: 'text-center'},
+	{headerName: "환불은행계좌번호"	, field: "raNo"			, width: 150	, cellClass: 'text-center'},
 	{headerName: "예금주"			, field: "raNm"			, width: 80		, cellClass: 'text-center'},
 	{
 		headerName			: "환불금액"
@@ -740,7 +742,7 @@ var columnDefsRefundInfo = [
 			return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmm").format("YYYY-MM-DD HH:mm") : '';
 		}
 	},
-	{headerName: "환불처리자"		, field: "updNm"		, width: 80		, cellClass: 'text-center'}
+	{headerName: "환불처리자"		, field: "updNm"		, width: 120		, cellClass: 'text-center'}
 ];
 var gridOptionsRefundInfo = orderAgGrid.getGridOptions(columnDefsRefundInfo);
 
@@ -894,7 +896,16 @@ $(document).ready(function () {
 	// 3. 그리드 높이 설정
 	fnSetGridHeightInit();
 	
-	// 4. 버튼처리
+	// 4. 그리드 숨김 처리
+	if (orderChangeInfo == null || orderChangeInfo.length === 0) {
+		$("#wrapOrderChange").addClass("off");
+	}
+	
+	if (orderRefundInfo == null || orderRefundInfo.length === 0) {
+		$("#wrapRefund").addClass("off");
+	}
+	
+	// 5. 버튼처리
 	// G013_00	주문접수
 	// G013_10	입금대기
 	// G013_18	발주대기-가격차이
@@ -946,13 +957,6 @@ $(document).ready(function () {
 				|| rowNode.data.ordDtlStat == 'G013_40') {
 			addrBtnChkCnt++;
 		}
-		
-		//if (rowNode.data.ordDtlStat !== '10' 
-		//		&& rowNode.data.ordDtlStat !== '17' 
-		//		&& rowNode.data.ordDtlStat !== '20' 
-		//		&& rowNode.data.ordDtlStat !== '34') {
-		//	addrBtnChkCnt++;
-		//}
 	});
 
 	// 주소변경 버튼 히든처리
@@ -1426,10 +1430,11 @@ $(document).ready(function () {
 				);
 			}
 		});
-		
-		
-		
 	};
+	
+	
+	
+	
 </script>
 
 </html>

+ 3 - 2
style24.admin/src/main/webapp/WEB-INF/views/order/RefundAccountRegistForm.html

@@ -60,8 +60,9 @@
 <script th:inline="javascript">
 /*<![CDATA[*/
 /* 이벤트 바인딩 관련 */
-	var ordNo 	= [[${orderBasic.ordNo}]];
-	var custNo 	= [[${orderBasic.custNo}]];
+	var orderInfoList 			= [[${orderInfoList}]];							// 주문기본정보
+	var ordNo 					= orderInfoList[0].ordNo;
+	var custNo 					= orderInfoList[0].custNo;
 
 	/* 환불계좌번호 저장 */
 	var fnSaveAccount = function(){

+ 1054 - 0
style24.admin/src/main/webapp/WEB-INF/views/order/ReturnRequestForm.html

@@ -0,0 +1,1054 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CancelRequestForm.html
+ * @desc    : 반품요청 화면
+ *============================================================================
+ * Pastelmall
+ * Copyright(C) 2019 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.12.12   jsh77b       최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1400" data-height="600">
+	<div class="panelStyle">
+		<div class="panelTitle">
+			<h2>반품요청</h2>
+			<button type="button" class="close" onclick="uifnPopupClose('popupReturnRequestForm');"><i class="fa fa-times"></i></button>
+		</div>
+			
+		<div class="panelContent" style="height:90%; overflow-y:auto; padding:0px 20px !important; ">
+			<form id="cancelRequestFrm" name="cancelRequestFrm" action="/order/cancel" method="post" target="hdFrameForOrderCancel">
+				<input type="hidden" name="ordNo" th:value="${ordNo}"/>
+				<input type="hidden" name="chgReason" value=""/>
+				<input type="hidden" name="chgReasonDesc" value=""/>
+				
+				<h3>주문정보</h3>
+				<div id="gridOrderCancelRequestList" style="width:100%; height: 200px;" class="ag-theme-balham"></div>
+
+				<h3>취소정보</h3>
+				<div id="gridOrderCancelRequestToBeList" style="width:100%; height: 200px;" class="ag-theme-balham"></div>
+				
+				<h3>배송비정보</h3>
+				<div id="gridDelvCdList" style="width:100%; height: 140px;" class="ag-theme-balham"></div>
+				
+				<div style="text-align:right; padding-bottom:5px; padding-top:5px;">
+					<!-- 
+					<button type="button" class="btn btn-success" id="btnCancelRequestEscrow" onclick="fnCancelRequestEscrow();" style="display:none;">에스크로 결제생성</button>
+					<label th:if="${sessionInfo.userId == 'jsh77b'}">
+						<input type="checkbox" name="pgStats" value="N">PG 전문 미전송
+					</label>
+					 -->
+					<button type="button" class="btn btn-success" id="btnCancelRequestPartOk" onclick="fnCancelRequestPartOk();">요청</button>
+				</div>
+				
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:160px;" />
+						<col style="width:320px;" />
+						<col style="width:160px;" />
+						<col />
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>취소사유 <i class="star"></i></th>
+							<td>
+								<select name="selectChgReason" onchange="fnChangeChgReason($(this).val());">
+									<option value="">[선택하세요]</option>
+									<option th:if="${chgReasonList}" th:each="oneData, status : ${chgReasonList}" th:value="|${oneData.cd}:${oneData.cdNm}|" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+								</select>
+							</td>
+							<th>귀책사유</th>
+							<td><span id="imputeReason"></span></td>
+						</tr>
+						<tr>
+							<th>요청메모</th>
+							<td colspan="3">
+								<textarea id="chgMemo" name="chgMemo" style="height:80px;" placeholder="취소사유를 300자내외로 작성해 주세요"></textarea>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+				
+				<h4>환불예정금액</h4>
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:20%;"/>
+						<col style="width:30%;"/>
+						<col style="width:20%;"/>
+						<col style="width:30%;"/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>총 결제 금액</th>
+							<td colspan="3"><span id="spanPayAmt"></span>원 (상품 실결제 금액 : <span id="spanSumRealOrdAmt"></span>원, 배송금액 : <span id="spanSumDeliveryFee"></span>원) </td>
+						</tr>
+						<tr>
+							<th>주문 상품 금액</th>
+							<td><span id="spanOrdAmt"></span>원</td>
+							<th>취소 상품 금액</th>
+							<td><span id="spanCnclRtnAmt"></span>원</td>
+						</tr>
+						<tr>
+							<th>취소 사용 포인트</th>
+							<td colspan="3"><span id="spanTotPntDcAmt"></span>원 (고객 포인트 : <span id="spanPntDcAmt"></span>원 + 상품 선포인트 : <span id="spanPrePntDcAmt"></span>원) </td>
+						</tr>
+						<tr>
+							<th>취소 사용 쿠폰금액</th>
+							<td colspan="3"><span id="spanCpnDcAmt"></span>원 (즉시할인쿠폰 : <span id="spanCpn1DcAmt"></span>원 + 상품쿠폰 : <span id="spanGoodsCpnDcAmt"></span>원 + 장바구니쿠폰 : <span id="spanCartCpnDcAmt"></span>원)</td>
+						</tr>
+						<tr>
+							<th>취소 다다익선 금액</th>
+							<td colspan="3"><span id="spanTmtbDcAmt"></span>원 (수량할인 : <span id="spanTmtb1DcAmt"></span>원 + 금액할인 : <span id="spanTmtb2DcAmt"></span>원)</td>
+						</tr>
+						
+						<tr>
+							<th>취소 고객 상품권 금액</th>
+							<td colspan="3"><span id="spanGfcdUseAmt"></span>원</td>
+						</tr>
+						
+						<tr>
+							<th>취소 상품 실결제 금액</th>
+							<td><span id="spanRealCnclRtnAmt"></span>원</td>
+							<th>추가 배송 금액</th>
+							<td><span id="spanTotDeliveryFee"></span>원 </td>
+						</tr>
+						
+						<tr>
+							<th>추가 반품배송 금액</th>
+							<td><span id="spanTotRtnDelvFee"></span>원</td>
+							<th>추가 교환배송 금액</th>
+							<td><span id="spanTotExcDelvFee"></span>원 </td>
+						</tr>
+						
+						<tr>
+							<th>환불 금액 합계</th>
+							<td colspan="3"><span id="spanRefundAmt"></span>원</td>
+						</tr>
+					</tbody>
+				</table>
+				
+				<div id="wrapRefundAccount" style="width:50%;">
+					<h4>환불계좌정보</h4>
+					<button type="button" id="btnSaveAccount" class="btn btnRight btn-base btn-sm" style="margin-left:10px;" onclick="fnCreateOrderRfAccount();">등록</button>
+					<div id="gridRefundAccountInfo" style="height: 150px;" class="ag-theme-balham"></div>
+				</div>
+				
+			</form>
+		</div>
+	</div>
+</div>
+
+<!-- data -->
+<script th:inline="javascript">
+/*<![CDATA[*/
+var cancelRequestTargetList = [[${cancelRequestTargetList}]];				// 취소대상목록
+var ordNo 					= [[${ordNo}]];									// 주문번호
+var orderInfoList 			= [[${orderInfoList}]];							// 주문기본정보
+var payMeans 				= orderInfoList[0].payMeans;					// 결제수단
+
+var temp1 = true;
+var temp2 = false;
+
+// specify the columns
+var columnCancelReqList = [
+	{
+		headerName	: "주문상세정보",
+		children	: [
+			{headerName: "주문번호"		, field: "ordNo"			, width: 80		, cellClass: 'text-center', hide: temp1},
+			{headerName: "주문상세"		, field: "ordDtlNo"			, width: 80		, cellClass: 'text-center'},
+			{headerName: "주문상세"		, field: "ordDtlStat"		, width: 80		, cellClass: 'text-center', hide: temp1},
+			{headerName: "주문상세상태"		, field: "ordDtlStatNm"		, width: 100	, cellClass: 'text-center', hide: temp1},
+			{headerName: "상품코드"		, field: "goodsCd"			, width: 100	, cellClass: 'text-center', hide: temp1},
+			{headerName: "상품명"			, field: "goodsNm"			, width: 200	, cellClass: 'text-center', hide: temp1},
+			{headerName: "상품타입"		, field: "goodsTypeNm"		, width: 100	, cellClass: 'text-center', hide: temp2}
+		]
+	},
+	{
+		headerName	: "주문상세단품정보",
+		children	: [
+			{headerName: "단품번호"		, field: "ordDtlItemSq"		, width: 100	, cellClass: 'text-center', hide: temp2},
+			{headerName: "단품코드"		, field: "itemCd"			, width: 100	, cellClass: 'text-center', hide: temp2},
+			{headerName: "단품명"			, field: "itemNm"			, width: 200	, cellClass: 'text-center', hide: temp2},
+			{headerName: "옵션1"			, field: "optCd1"			, width: 80		, cellClass: 'text-center', hide: temp1},
+			{headerName: "옵션2"			, field: "optCd2"			, width: 80		, cellClass: 'text-center', hide: temp2},
+			{
+				headerName		: "단품수량"		
+				, field			: "itemQty"			
+				, width			: 80		
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "단품금액"		
+				, field			: "itemPrice"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "단품옵션금액"		
+				, field			: "optAddPrice"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			}
+		]
+	},
+	{
+		headerName	: "주문상세수량",
+		children	: [
+			{
+				headerName		: "주문"		
+				, field			: "ordQty"			
+				, width			: 80		
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "취소/요청"		
+				, field			: "cnclRtnQty"			
+				, width			: 80		
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					var cnclRtnReqQty = parseInt(params.data.cnclRtnQty) + parseInt(params.data.ordReqChgQty);
+					return cnclRtnReqQty;
+				}
+			},
+			{
+				headerName		: "취소"		
+				, field			: "ordCanChgQty"			
+				, width			: 100		
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					var ordQty 			= parseInt(params.data.ordQty);
+					var cnclRtnQty 		= parseInt(params.data.cnclRtnQty);
+					var ordReqChgQty 	= parseInt(params.data.ordReqChgQty);
+					var ordCanChgQty 	= ordQty - (cnclRtnQty +  ordReqChgQty);
+					
+					var strVal 			= "";
+					strVal += "<select class='ordCanChgQty' name='ordCanChgQty' ordDtlNo='"+params.data.ordDtlNo+"' onChange='fnCalculateRefundAmt(this);'>";
+					
+					for (i=0 ; i<=ordCanChgQty ; i++) {
+						if (i == params.data.ordCanChgQty) {
+							strVal += "	<option value='"+i+"' selected>"+i+"</option>";
+						} else {
+							strVal += "	<option value='"+i+"'>"+i+"</option>";
+						}
+					}
+				
+					strVal += "</select>";
+					return strVal;
+				}
+			}
+		]
+	},
+	{
+		headerName	: "주문단품금액",
+		children	: [
+			{
+				headerName		: "주문"
+				, field			: "ordAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "취소"		
+				, field			: "cnclRtnAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "즉시할인"		
+				, field			: "cpn1DcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "다다익선1"		
+				, field			: "tmtb1DcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "다다익선2"		
+				, field			: "tmtb2DcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "상품쿠폰"		
+				, field			: "goodsCpnDcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "장바구니쿠폰"		
+				, field			: "cartCpnDcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "포인트"		
+				, field			: "pntDcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "선포인트"		
+				, field			: "prePntDcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "상품권"		
+				, field			: "gfcdUseAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "실결제금액"		
+				, field			: "realOrdAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			}
+		]
+	},
+	{
+		headerName	: "주문배송비정보",
+		children	: [
+			{
+				headerName		: "배송비"		
+				, field			: "delvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{headerName: "업체"			, field: "supplyCompCd"		, width: 100	, cellClass: 'text-center', hide: temp2},
+			{headerName: "배송비코드"		, field: "delvFeeCd"		, width: 100	, cellClass: 'text-center', hide: temp2},
+			{
+				headerName		: "무료배송비"		
+				, field			: "minOrdAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "기본배송비"		
+				, field			: "orgDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "반품배송비"		
+				, field			: "rtnDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "교환배송비"		
+				, field			: "excDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{headerName: "전체취소가능"		, field: "allCanYn"			, width: 100	, cellClass: 'text-center', hide: temp2},
+		]
+	}
+];
+var gridOptionsCancelReqList = orderAgGrid.getGridOptions(columnCancelReqList);
+
+// Add on options
+gridOptionsCancelReqList.suppressRowClickSelection = true;
+gridOptionsCancelReqList.rowSelection = 'multiple';
+
+//specify the columns
+var columnCancelReqToBeList = [
+	{
+		headerName	: "주문상세정보",
+		children	: [
+			{headerName: "주문번호"		, field: "ordNo"			, width: 80		, cellClass: 'text-center', hide: temp1},
+			{headerName: "주문상세"		, field: "ordDtlNo"			, width: 80		, cellClass: 'text-center'},
+			{headerName: "주문상세"		, field: "ordDtlStat"		, width: 80		, cellClass: 'text-center', hide: temp1},
+			{headerName: "주문상세상태"		, field: "ordDtlStatNm"		, width: 100	, cellClass: 'text-center', hide: temp1},
+			{headerName: "상품코드"		, field: "goodsCd"			, width: 100	, cellClass: 'text-center', hide: temp1},
+			{headerName: "상품명"			, field: "goodsNm"			, width: 200	, cellClass: 'text-center', hide: temp1},
+			{headerName: "상품타입"		, field: "goodsTypeNm"		, width: 100	, cellClass: 'text-center', hide: temp2}
+		]
+	},
+	{
+		headerName	: "주문상세단품정보",
+		children	: [
+			{headerName: "단품번호"		, field: "ordDtlItemSq"		, width: 100	, cellClass: 'text-center', hide: temp2},
+			{headerName: "단품코드"		, field: "itemCd"			, width: 100	, cellClass: 'text-center', hide: temp2},
+			{headerName: "단품명"			, field: "itemNm"			, width: 200	, cellClass: 'text-center', hide: temp2},
+			{headerName: "칼라코드"		, field: "optCd1"			, width: 80		, cellClass: 'text-center', hide: temp1},
+			{headerName: "사이즈코드"		, field: "optCd2"			, width: 80		, cellClass: 'text-center', hide: temp2},
+			{
+				headerName		: "단품수량"		
+				, field			: "itemQty"			
+				, width			: 80		
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "단품금액"		
+				, field			: "itemPrice"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "단품옵션금액"		
+				, field			: "optAddPrice"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			}
+		]
+	},
+	{
+		headerName	: "주문상세수량",
+		children	: [
+			{
+				headerName		: "주문"		
+				, field			: "ordQty"			
+				, width			: 80		
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "취소/요청"		
+				, field			: "cnclRtnQty"			
+				, width			: 80		
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					var cnclRtnReqQty = parseInt(params.data.cnclRtnQty) + parseInt(params.data.ordReqChgQty);
+					return cnclRtnReqQty;
+				}
+			},
+			{
+				headerName		: "취소"		
+				, field			: "ordCanChgQty"			
+				, width			: 100		
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			}
+		]
+	},
+	{
+		headerName	: "주문단품금액",
+		children	: [
+			{
+				headerName		: "주문"
+				, field			: "ordAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "취소"		
+				, field			: "cnclRtnAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "즉시할인"		
+				, field			: "cpn1DcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "다다익선1"		
+				, field			: "tmtb1DcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "다다익선2"		
+				, field			: "tmtb2DcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "상품쿠폰"		
+				, field			: "goodsCpnDcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "장바구니쿠폰"		
+				, field			: "cartCpnDcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "포인트"		
+				, field			: "pntDcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "선포인트"		
+				, field			: "prePntDcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "상품권"		
+				, field			: "gfcdUseAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "환불금액"		
+				, field			: "realOrdAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			}
+		]
+	},
+	{
+		headerName	: "주문배송비정보",
+		children	: [
+			{
+				headerName		: "배송비"		
+				, field			: "delvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{headerName: "업체"			, field: "supplyCompCd"		, width: 100	, cellClass: 'text-center', hide: temp2},
+			{headerName: "배송비코드"		, field: "delvFeeCd"		, width: 100	, cellClass: 'text-center', hide: temp2},
+			{
+				headerName		: "무료배송비"		
+				, field			: "minOrdAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "기본배송비"		
+				, field			: "orgDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "반품배송비"		
+				, field			: "rtnDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "교환배송비"		
+				, field			: "excDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{headerName: "전체취소가능"		, field: "allCanYn"			, width: 100	, cellClass: 'text-center', hide: temp2},
+		]
+	}
+];
+var gridOptionsCancelReqToBeList = orderAgGrid.getGridOptions(columnCancelReqToBeList);
+
+//specify the columns
+var columnDelvCdList = [
+	{
+		headerName	: "배송코드기준금액",
+		children	: [
+			{headerName: "업체"			, field: "supplyCompCd"		, width: 100	, cellClass: 'text-center', hide: temp2},
+			{headerName: "배송비코드"		, field: "delvFeeCd"		, width: 100	, cellClass: 'text-center', hide: temp2},
+			{
+				headerName		: "주문"
+				, field			: "ordAmt"			
+				, width			: 100		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "취소"		
+				, field			: "cnclRtnAmt"			
+				, width			: 100		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "환불"		
+				, field			: "realOrdAmt"			
+				, width			: 100		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			}
+		]
+	},
+	{
+		headerName	: "배송비정보",
+		children	: [
+			{
+				headerName		: "배송비"		
+				, field			: "delvFee"			
+				, width			: 100		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "무료배송비"		
+				, field			: "minOrdAmt"			
+				, width			: 100		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "기본배송비"		
+				, field			: "orgDelvFee"			
+				, width			: 100		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "반품배송비"		
+				, field			: "rtnDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "교환배송비"		
+				, field			: "excDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{headerName: "추가배송비여부"		, field: "addDelvFeeYn"		, width: 140	, cellClass: 'text-center', hide: temp2},
+			{
+				headerName		: "추가배송비"		
+				, field			: "addDelvFee"			
+				, width			: 100		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{headerName: "전체취소가능"		, field: "allCanYn"			, width: 100	, cellClass: 'text-center', hide: temp2},
+		]
+	}
+];
+var gridOptionsDelvCdList = orderAgGrid.getGridOptions(columnDelvCdList);
+
+// 10. 무통장 환불정보
+var columnDefsRefundAccountInfo = [
+	{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: false, checkboxSelection: true, filter: false},
+	{headerName: "은행명"		, field: "bankNm"		, width: 140	, cellClass: 'text-center'},
+	{headerName: "은행코드"	, field: "bankCd"		, width: 120	, cellClass: 'text-center', hidden:true},
+	{headerName: "계좌번호"	, field: "accountNo"	, width: 150	, cellClass: 'text-center'},
+	{headerName: "예금주"		, field: "accountNm"	, width: 120	, cellClass: 'text-center'},
+	{headerName: "기본"		, field: "defaultYn"	, width: 100	, cellClass: 'text-center'}
+];
+
+var gridOptionsRefundAccountInfo = orderAgGrid.getGridOptions(columnDefsRefundAccountInfo);
+</script>
+
+<!-- AgGrid 컬럼 세팅 -->
+<script>
+// 공통1. 주문상세 그리드 옵션 정보 적용
+var orderAgGrid = {
+	getGridOptions : function(colDefs) {
+		return {
+			columnDefs					: colDefs
+			, detailCellRendererParams	: {
+				detailGridOptions	: {
+					columnDefs				: []
+					, defaultColDef			: {
+						resizable: true
+					}
+					, suppressLoadingOverlay: false
+					, onGridReady			: function (params) {
+						params.api.setDomLayout('autoHeight');
+					}
+					, onFirstDataRendered	: function (params) {
+						params.api.sizeColumnsToFit();
+					}
+				}
+				, getDetailRowData: function (params) {
+					params.successCallback(params.data.orderDetailList);
+				}
+			}
+			, defaultColDef: {
+				resizable: true
+			}
+			, isRowMaster: function (dataItem) {
+				return dataItem ? dataItem.orderDetailList.length > 1 : false;
+			}
+			, suppressRowTransform: true
+			, enableRangeSelection: true
+		};
+	}
+}
+</script>
+
+<script>
+// 취소정보계산
+var fnCalculateRefundAmt = function (obj) {
+	// 취소정보담은목록
+	var cancelRequestTargetToBeList = [];
+
+	if (obj != null) {
+		for (i=0 ; i<cancelRequestTargetList.length ; i++) {
+			var orDtlNo 		= $(obj).attr("ordDtlNo");
+			var ordCanChgQty 	= $(obj).val();
+			
+			if (cancelRequestTargetList[i].ordDtlNo == orDtlNo) {
+				cancelRequestTargetList[i].ordCanChgQty = ordCanChgQty;
+			}
+		}
+		// 주문정보 다시 셋팅 (체크해봐야할문제)
+		gridOptionsCancelReqList.api.setRowData(cancelRequestTargetList);
+	}
+	
+	// 환불금액계산호출
+	var jsonData = JSON.stringify(cancelRequestTargetList);
+	gagajf.ajaxJsonSubmit(
+		'/order/cancel/refundAmt'
+		, jsonData
+		, function(result) {
+			gridOptionsCancelReqToBeList.api.setRowData(result.cancelOrderRefundList);
+			gridOptionsDelvCdList.api.setRowData(result.cancelDelvRefundList);
+			
+			$("#spanPayAmt").text(result.spanPayAmt.addComma());					//총 결제 금액
+			$("#spanSumRealOrdAmt").text(result.spanSumRealOrdAmt.addComma());		//상품 실결제 금액
+			$("#spanSumDeliveryFee").text(result.spanSumDeliveryFee.addComma());	//배송금액
+			
+			$("#spanOrdAmt").text(result.spanOrdAmt.addComma());					//주문 상품 금액
+			$("#spanCnclRtnAmt").text(result.spanCnclRtnAmt.addComma());			//취소 상품 금액
+			
+			$("#spanTotPntDcAmt").text(result.spanTotPntDcAmt.addComma());			//취소 사용 포인트
+			$("#spanPntDcAmt").text(result.spanPntDcAmt.addComma());				//고객 포인트
+			$("#spanPrePntDcAmt").text(result.spanPrePntDcAmt.addComma());			//상품 선포인트
+			
+			$("#spanCpnDcAmt").text(result.spanCpnDcAmt.addComma());				//취소 사용 쿠폰금액
+			$("#spanCpn1DcAmt").text(result.spanCpn1DcAmt.addComma());				//즉시할인쿠폰
+			$("#spanGoodsCpnDcAmt").text(result.spanGoodsCpnDcAmt.addComma());		//상품쿠폰
+			$("#spanCartCpnDcAmt").text(result.spanCartCpnDcAmt.addComma());		//장바구니쿠폰
+			
+			$("#spanTmtbDcAmt").text(result.spanTmtbDcAmt.addComma());				//취소 다다익선 금액
+			$("#spanTmtb1DcAmt").text(result.spanTmtb1DcAmt.addComma());			//수량할인
+			$("#spanTmtb2DcAmt").text(result.spanTmtb2DcAmt.addComma());			//금액할인
+			
+			$("#spanGfcdUseAmt").text(result.spanGfcdUseAmt.addComma());			//취소 고객 상품권 금액
+			
+			$("#spanRealCnclRtnAmt").text(result.spanRealCnclRtnAmt.addComma());	//취소 상품 실결제 금액
+			$("#spanTotDeliveryFee").text(result.spanTotDeliveryFee.addComma());	//환불 배송 금액
+			
+			$("#spanTotRtnDelvFee").text(result.spanTotRtnDelvFee.addComma());		//환불 배송 금액
+			$("#spanTotExcDelvFee").text(result.spanTotExcDelvFee.addComma());		//환불 배송 금액
+			
+			$("#spanRefundAmt").text(result.spanRefundAmt.addComma());				//환불 금액 합계
+		}
+	);
+}
+
+//  사유
+var fnChangeChgReason = function(reasonCd){
+	var arrREasonCd = reasonCd.split(":");
+	
+	// 취소, 반품, 교환 사유 판단
+	if (arrREasonCd[0] == 'G686_10') {
+		$("#imputeReason").text("고객");
+		isImputationCustomers = true;
+	} else {
+		$("#imputeReason").text("회사");
+		isImputationCustomers = false;
+	}
+
+	$('#cancelRequestFrm input[name=chgReason]').val(arrREasonCd[0]);
+	$('#cancelRequestFrm input[name=chgReasonDesc]').val(arrREasonCd[1]);
+
+	//fnCalculateRefundAmt();			//환불예정금액 계산.
+}
+
+// 취소요청
+var fnCancelRequestPartOk = function () {
+	
+	var temp 		= false;
+	var ordDtlStat	= cancelRequestTargetList[0].ordDtlStat; 
+	var allCanYn 	= "N";
+	
+	// 1. 취소수량 체크
+	for (i=0 ; i<cancelRequestTargetList.length ; i++) {		
+		if (cancelRequestTargetList[i].ordCanChgQty > 0) {
+			temp = true;
+		}
+	}
+	
+	if (temp == false) {
+		mcxDialog.alert('취소 할 수량을 입력하세요.');
+		return;
+	}
+	
+	// 2. 입금대기건 && 전체취소 체크
+	if (ordDtlStat == "G013_10" && $("#spanPayAmt").text() != $("#spanRefundAmt").text()) {
+		alert("입금대기건은 전체 취소만 가능합니다.");
+		return;
+	}
+	
+	// 2.1 전체취소 여부 적용
+	if (ordDtlStat == "G013_10" && $("#spanPayAmt").text() == $("#spanRefundAmt").text()) {
+		allCanYn = "Y";	
+	}
+	
+	// 3. 취소사유 체크
+	var chgReason = $("#cancelRequestFrm select[name=selectChgReason]").val();
+	
+	if (gagajf.isNull(chgReason)) {
+		mcxDialog.alert("취소사유를 입력하세요."); return ;
+	}
+	
+	// 4. 환불계좌 체크
+	var accountNo 	= "";
+	var accountNm 	= "";
+	var bankCd 		= "";
+	
+	if (payMeans == 'G014_20') {
+		var refundAccount = gridOptionsRefundAccountInfo.api.getSelectedRows();
+		
+		if (refundAccount.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		accountNo 	= refundAccount[0].accountNo;
+		accountNm 	= refundAccount[0].accountNm;
+		bankCd 		= refundAccount[0].bankCd;
+	}
+
+	// 5. PG 전송 여부
+	var pgStat = "N";
+	if ($('#cancelRequestFrm input:checkbox[name=pgStats]').is(":checked")) {
+		pgStat = "Y";
+	}
+	
+	$("#cancelRequestFrm input[name=pgStat]").val(pgStat);
+	
+	var jsonObj = {
+		"ordNo"				: $('#cancelRequestFrm input[name=ordNo]').val()
+		,"chgReason" 		: $('#cancelRequestFrm input[name=chgReason]').val()
+		,"chgMemo"			: $('#chgMemo').val()
+		,"cancelReqList" 	: cancelRequestTargetList
+		,"accountNo" 		: accountNo
+		,"accountNm" 		: accountNm
+		,"bankCd" 			: bankCd
+		,"allCanYn" 		: allCanYn
+	}
+
+	// 주문번호, 취소사유, 취소메모, (취소, 반품, 교환 신청 정보 목록), 환불계좌
+	var jsonData = JSON.stringify(jsonObj);
+	
+	mcxDialog.confirm('취소요청하시겠습니까?', {
+		cancelBtnText		: "취소",
+		sureBtnClick		: function(){
+			// 취소 실행
+			gagajf.ajaxJsonSubmit(
+				'/order/cancel/'
+				, jsonData
+				, function() {
+					uifnPopupClose('popupOrderDetail');
+					fnReOpenOrderDetailPopup();
+					uifnPopupClose('popupCancelRequestForm');
+				}
+			);
+		}
+	});
+}
+
+// 환불계좌 등록
+var fnCreateOrderRfAccount = function () {	
+	var actionUrl = "/order/refund/account/create/form?ordNo=" + ordNo ;
+	cfnOpenModalPopup(actionUrl, 'popupCreateRefundAccount');
+};
+
+// 환불계좌 정보
+var fnBindOrderRfAccountInfo = function () {
+	gagaAgGrid.fetch(
+		"/order/refund/account/info/list?ordNo=" + ordNo
+		, gridOptionsRefundAccountInfo
+		, null
+		, function (result) {
+		}
+	)
+};
+
+$(document).ready(function() {
+	// 1. Create a agGrid
+	gagaAgGrid.createGrid('gridOrderCancelRequestList'		, gridOptionsCancelReqList);			// 주문정보
+	gridOptionsCancelReqList.api.setRowData(cancelRequestTargetList);
+	
+	gagaAgGrid.createGrid('gridOrderCancelRequestToBeList'	, gridOptionsCancelReqToBeList);		// 취소정보
+	
+	gagaAgGrid.createGrid('gridDelvCdList'					, gridOptionsDelvCdList);				// 배송비 정보
+	
+	gagaAgGrid.createGrid('gridRefundAccountInfo'			, gridOptionsRefundAccountInfo);		// 환불계좌정보
+	//gridOptionsRefundAccountInfo.api.setRowData(orderRfAccountInfo);
+	
+	// 취소정보계산
+	fnCalculateRefundAmt(null);
+	
+	// 그리드 숨김처리
+	if (payMeans !== 'G014_20') {
+		$('#wrapRefundAccount').addClass("off");
+	}
+	
+	if (payMeans === 'G014_20' && mallGb === 'G011_10' ) {
+		// 환불계좌정보
+		fnBindOrderRfAccountInfo();
+	}
+});
+</script>
+</html>
+
+
+
+
+

+ 101 - 0
style24.batch/src/main/java/com/style24/batch/biz/dao/TsbGoodsDao.java

@@ -14,6 +14,7 @@ import com.style24.persistence.domain.IfBrand;
 import com.style24.persistence.domain.IfProduct;
 import com.style24.persistence.domain.IfProductSku;
 import com.style24.persistence.domain.IfProvider;
+import com.style24.persistence.domain.Option;
 
 /**
  * 상품 Dao
@@ -368,4 +369,104 @@ public interface TsbGoodsDao {
 	 */
 	void createTbOptionSyncTemp();
 
+	/**
+	 * 입점상품 SELL_QTY 목록 조회
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	Collection<Option> getGoodsSelfNoStockList();
+
+	/**
+	 * 상품 옵션/재고 정보 이력생성
+	 *
+	 * @param option
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void createStockHst(Option option);
+
+	/**
+	 * 상품 옵션/재고 변경
+	 *
+	 * @param option
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void updateStock(Option option);
+
+	/**
+	 * WMS 재고 임시 테이블 삭제
+	 *
+	 * @param
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void deleteGoodsOptionSync();
+
+	/**
+	 * TB_OPTION = > TB_OPTION_SYNC 적용
+	 *
+	 * @param
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void createGoodsOptionSync();
+
+	/**
+	 * TB_OPTION_SYNC_TEMP => TB_OPTION_SYNC 변경적용
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void saveGoodsOptionSyncSync();
+
+	/**
+	 * WMS 임시 테이블에서 실테이블로 이관(재고가 상이한것만 수정)
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void saveGoodsOptionNew();
+
+	/**
+	 * TB_SELL_QTY_TEMP 테이블 삭제
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void deleteTtbSellQtyTemp();
+
+	/**
+	 * TB_SELL_QTY_TEMP 생성
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void createTtbSellQtyTemp();
+
+	/**
+	 * WMS 재고 테이블 이관 후 TB_SELL_QTY 데이터 삭제
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void deleteSellQty();
+
+	/**
+	 * TB_SELL_QTY_TEMP => TB_SELL_QTY 생성
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void createTtbSellQty();
+
+	/**
+	 * TB_ORDER_DETAIL => TB_SELL_QTY 생성
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void createTtbSellQtyByOrderDetail();
+
 }

+ 1 - 1
style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsProductStockJob.java

@@ -57,7 +57,7 @@ public class TsbGoodsWmsProductStockJob extends TsbAbstractJob<IfProductSku, IfP
 			return null;
 		}else {
 			//wms상품재고이력 생성
-			goodsService.createWmsProductSkuHst(jobdate);
+			//goodsService.createWmsProductSkuHst(jobdate);
 			//온라인 상품 재고 적용
 			goodsService.saveGoodsStock();
 		}

+ 68 - 19
style24.batch/src/main/java/com/style24/batch/biz/service/TsbGoodsService.java

@@ -22,6 +22,7 @@ import com.style24.persistence.domain.IfBrand;
 import com.style24.persistence.domain.IfProduct;
 import com.style24.persistence.domain.IfProductSku;
 import com.style24.persistence.domain.IfProvider;
+import com.style24.persistence.domain.Option;
 
 import io.netty.util.internal.StringUtil;
 
@@ -486,28 +487,76 @@ public class TsbGoodsService {
 		goodsDao.deleteTbOptionSyncTemp();
 		// wms 재고 임시 테이블(TB_OPTION_SYNC_TEMP) 적용 - 출고처별 판매비율 적용
 		goodsDao.createTbOptionSyncTemp();
-////
-//			// 입점 상품 재고 동기화 후 SELL_QTY 삭제
-//			updateOptionByOfSellQty();
-//
-//			// TB_OPTION = > TB_OPTION_SYNC 적용
-//			tsbGoodsDao.deleteGoodsOptionSync();
-//			tsbGoodsDao.createGoodsOptionSync();
-//
-//			// TB_OPTION_SYNC_TEMP => TB_OPTION_SYNC 변경적용
-//			tsbGoodsDao.saveGoodsOptionSyncSync();
-//
-//			// TB_OPTION_SYNC => TB_OPTION 적용
-//			tsbGoodsDao.saveGoodsOptionNew();
-//
-//			// TB_OPTION_SYNC에 없는 상품,  재고 초기화
-//			tsbGoodsDao.updateOptionZero();
-//
-//			// 자사상품중 주문상세상태가 입금대기, 결제완료, 교환대기 건은 TB_SELL_QTY 생성
-//			createSellQtySelfGoods();
+
+			// 입점 상품 재고 동기화 후 SELL_QTY 삭제
+			updateOptionByOfSellQty();
+
+			// TB_OPTION = > TB_OPTION_SYNC 적용
+			goodsDao.deleteGoodsOptionSync();
+			goodsDao.createGoodsOptionSync();
+
+			// TB_OPTION_SYNC_TEMP => TB_OPTION_SYNC 변경적용
+			goodsDao.saveGoodsOptionSyncSync();
+
+			// TB_OPTION_SYNC => TB_OPTION 적용
+			goodsDao.saveGoodsOptionNew();
+
+			// 자사상품중 주문상세상태가 입금대기, 결제완료, 교환대기 건은 TB_SELL_QTY 생성
+			createSellQtySelfGoods();
 
 	}
 
+	/**
+	 * 입점상품 SELL_QTY 만큼 재고 차감
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	private void updateOptionByOfSellQty() {
+		Collection<Option> goodsSelfNoStockList = goodsDao.getGoodsSelfNoStockList();
+		if (goodsSelfNoStockList != null && !goodsSelfNoStockList.isEmpty()) {
+
+			for (Option option : goodsSelfNoStockList) {
+
+				option.setRegNo(TsbConstants.REG_NO);
+				option.setUpdNo(TsbConstants.REG_NO);
+				// 이력생성
+				goodsDao.createStockHst(option);
+
+				// 재고 변경
+				goodsDao.updateStock(option);
+			}
+		}
+	}
+
+	/**
+	 * 자사상품, TB_SELL_QTY 생성
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	private void createSellQtySelfGoods() {
+
+		// TB_SELL_QTY_TEMP 삭제
+		goodsDao.deleteTtbSellQtyTemp();
+
+		// TB_SELL_QTY_TEMP 생성
+		goodsDao.createTtbSellQtyTemp();
+
+		// 초기화
+		goodsDao.deleteSellQty();
+
+		// TB_SELL_QTY_TEMP => TB_SELL_QTY 생성
+		goodsDao.createTtbSellQty();
+
+		// TB_ORDER_DETAIL => TB_SELL_QTY 생성
+		goodsDao.createTtbSellQtyByOrderDetail();
+
+	}
 	/**
 	 * 상품 전시재고 생성
 	 *

+ 1 - 1
style24.batch/src/main/java/com/style24/persistence/domain/Goods.java

@@ -17,7 +17,7 @@ public class Goods extends TscBaseDomain {
 
 	private String goodsCd;		//상품코드
 	private int productNo;		//ProductNo(WMS)
-	private int productCode;		//ProductCode(WMS)
+	private String productCode;		//ProductCode(WMS)
 	private String brandCd;		//브랜드코드
 	private String itemkindCd;		//품목코드
 	private String goodsNm;		//상품명

+ 48 - 0
style24.batch/src/main/java/com/style24/persistence/domain/Option.java

@@ -0,0 +1,48 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 재고 Domain
+ *
+ * @author eskim
+ * @since 2020. 10. 26
+ */
+@SuppressWarnings("serial")
+@Data
+public class Option extends TscBaseDomain {
+
+	private String goodsCd;
+	private String optCd;
+	private String optNm;
+	private String optCd1;
+	private String optCd2;
+	private String skuModelNo;
+	private int productNo;
+	private String productCode;
+	private int baseStockQty;
+	private int currStockQty;
+	private int addPrice;
+	private String soldoutYn;
+	private String dispOrd;
+	private String dispYn;
+
+	private int rnum;
+	private int rcount;
+	private int saleStockQty;
+	private int ableStockQty;
+	private String goodsNm;
+	private String goodsStat;
+	private String goodsStatNm;
+	private String compsGoodsCd;
+	private String selfGoodsYn;
+	private String itemkindNm;
+	private String brandEnm;
+	private String brandCd;
+	private String itemkindCd;
+	private String supplyCompCd;
+	private String supplyGoodsCd;
+
+}

+ 329 - 36
style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml

@@ -1496,9 +1496,9 @@
 		     , DISP_ORD
 		     , DISP_YN
 		     , ERP_STOCK_LINK_YN
-		     , REG_ID
+		     , REG_NO
 		     , REG_DT
-		     , UPD_ID
+		     , UPD_NO
 		     , UPD_DT
 		)
 		SELECT GOODS_CD
@@ -1510,52 +1510,345 @@
 		     , PRODUCT_CODE
 		     , 0 AS BASE_STOCK_QTY
 		     , CURR_STOCK_QTY
+		     , 0 AS ADD_PRICE
 		     , 'N' AS SOLDOUT_YN
 		     , DISP_ORD
 		     , 'Y' AS DISP_YN
 		     , ERP_STOCK_LINK_YN
-		     , 'batch' AS REG_ID
-		     , SYSDATE AS REG_DT
-		     , 'batch' AS UPD_ID
-		     , SYSDATE AS UPD_DT
+		     , 0 AS REG_NO
+		     , NOW() AS REG_DT
+		     , 0 AS UPD_NO
+		     , NOW() AS UPD_DT
 		FROM (
 		      SELECT GOODS_CD
-		           , SIZE_CD
-		           , SIZE_NM
-		           , SUM(CURR_ON_STOCK_QTY) AS CURR_ON_STOCK_QTY
-		           , SUM(CURR_OFF_STOCK_QTY) AS CURR_OFF_STOCK_QTY
-		           , SUM(CURR_SHOP_STOCK_QTY) AS CURR_SHOP_STOCK_QTY
-		           , NVL((SELECT (MAX(DISP_ORD) + 1) AS DISP_ORD FROM TB_STOCK WHERE GOODS_CD = Z.GOODS_CD)
-		           , ROW_NUMBER() OVER(PARTITION BY GOODS_CD ORDER BY SIZE_CD)) AS DISP_ORD
+		           , OPT_CD
+		           , OPT_CD1
+		           , OPT_CD2
+		           , SKU_MODEL_NO
+		           , PRODUCT_NO
+		           , PRODUCT_CODE
+		           , SUM(CURR_STOCK_QTY) AS CURR_STOCK_QTY
+		           , NVL((SELECT (MAX(DISP_ORD) + 1) AS DISP_ORD 
+		                  FROM TB_OPTION WHERE GOODS_CD = Z.GOODS_CD) , ROW_NUMBER() OVER(PARTITION BY GOODS_CD ORDER BY OPT_CD)) AS DISP_ORD
 		           , ERP_STOCK_LINK_YN
 		       FROM (
 		           SELECT B.GOODS_CD
 		                , A.SKUCODE AS OPT_CD
-		                , A.OPTION1 AS OPT_CD1
-		                , A.OPTION2 ASOPT_CD2
-		                , A.SKUMODELNO AS SKU_MODEL_NO
-		                , B.PRODUCT_NO
-		                , B.PRODUCT_CODE
-		                , SUM(GREATEST(A.SELLINGSTOCKAMOUNT, 0)) AS CURR_STOCK_QTY
-		                , B.ERP_STOCK_LINK_YN
-		                , A.CD_LOC
+		                , MAX(A.OPTION1) AS OPT_CD1
+		                , MAX(A.OPTION2) AS OPT_CD2
+		                , MAX(A.SKUMODELNO) AS SKU_MODEL_NO
+		                , MAX(B.PRODUCT_NO) AS PRODUCT_NO
+		                , MAX(B.PRODUCT_CODE) AS PRODUCT_CODE
+		                , ROUND(GREATEST(A.SELLINGSTOCKAMOUNT, 0) * (NVL(D.STOCK_APPL_RATE, 0)/100)) AS CURR_STOCK_QTY
+		                , MAX(B.ERP_STOCK_LINK_YN) AS ERP_STOCK_LINK_YN
+		                , D.DELV_LOC_CD
 		                , D.STOCK_APPL_RATE
-		           FROM TB_IF_PRODUCTSKU_TEMP A, TB_GOODS B, TB_STOCK_LINK_BASE C, TB_DELIVERY_LOC D
-		           WHERE B.SELF_GOODS_YN = 'Y'
-		           AND B.GOODS_TYPE = 'N'
-		           AND B.GOODS_NUM = A.CD_STYLE
-		           AND B.COLOR_CD = A.CD_COLOR
-		           AND B.BRAND_CD = C.BRAND_CD
-		           AND B.FORMAL_GB = C.FORMAL_GB
-		           AND B.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
-		           AND C.STOCK_LINK_YN = 'Y'
-		           AND D.USE_YN = 'Y'
-		           AND A.CD_LOC = C.DELV_LOC_CD
-		           AND A.CD_LOC = D.DELV_LOC_CD
-		           GROUP BY B.GOODS_CD, A.CD_SIZE, B.ERP_STOCK_LINK_YN, A.CD_LOC, D.STOCK_APPL_RATE
+		           FROM TB_IF_PRODUCTSKU A 
+		           INNER JOIN TB_GOODS B ON A.PRODUCTCODE = B.PRODUCT_CODE 
+		                                 AND B.SELF_GOODS_YN = 'Y'
+		                                 AND B.GOODS_TYPE = 'N'
+		           INNER JOIN TB_OPTION E ON A.SKUCODE = E.OPT_CD
+		                                  AND A.PRODUCTCODE = E.PRODUCT_CODE
+		           INNER JOIN TB_STOCK_SYNC_BASE C ON B.BRAND_CD = C.BRAND_CD
+		                                           AND C.STOCK_SYNC_YN = 'Y'
+		           INNER JOIN TB_DELIVERY_LOC D ON B.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
+		                                        AND C.DELV_LOC_CD = D.DELV_LOC_CD
+		                                        AND D.USE_YN = 'Y'
+		           WHERE 1 = 1
+		           GROUP BY B.GOODS_CD, A.SKUCODE, D.DELV_LOC_CD, D.STOCK_APPL_RATE
 		           ) Z
-		       GROUP BY GOODS_CD, SIZE_CD, ERP_STOCK_LINK_YN
-		      )
+		       GROUP BY GOODS_CD, OPT_CD, ERP_STOCK_LINK_YN
+		      ) Y
 	</insert>
 	
+	<!-- 입점상품 SELL_QTY 목록 조회 -->
+	<select id="getGoodsSelfNoStockList" resultType="Option">
+		/* TsbGoods.getGoodsSelfNoStockList */
+		SELECT A.GOODS_CD
+		     , A.OPT_CD
+		     , SUM(
+		           (CASE A.SELL_GB WHEN '10' THEN 1
+		                          WHEN '20' THEN 1
+		                          ELSE -1 END) * A.SELL_QTY
+		           ) AS SALE_STOCK_QTY
+		FROM TB_SELL_QTY A
+		   , TB_GOODS B
+		WHERE A.GOODS_CD = B.GOODS_CD
+		AND B.SELF_GOODS_YN = 'N'  -- 입점상품
+		GROUP BY A.GOODS_CD, A.OPT_CD
+	</select>
+	
+	<!-- 상품 옵션/재고 정보 이력생성 -->
+	<insert id="createStockHst" parameterType="Option">
+		/* TsaGoods.createStockHst */
+		INSERT INTO TB_OPTION_HST 
+		(     OPTION_HST_SQ
+		    , GOODS_CD
+		    , OPT_CD
+		    , OPT_CD1
+		    , OPT_CD2
+		    , SKU_MODEL_NO
+		    , PRODUCT_NO
+		    , PRODUCT_CODE
+		    , BASE_STOCK_QTY
+		    , CURR_STOCK_QTY
+		    , ADD_PRICE
+		    , SOLDOUT_YN
+		    , DISP_ORD
+		    , DISP_YN
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		)
+		SELECT NULL
+		     , GOODS_CD
+		     , OPT_CD
+		     , OPT_CD1
+		     , OPT_CD2
+		     , SKU_MODEL_NO
+		     , PRODUCT_NO
+		     , PRODUCT_CODE
+		     , BASE_STOCK_QTY
+		     , CURR_STOCK_QTY
+		     , ADD_PRICE
+		     , SOLDOUT_YN
+		     , DISP_ORD
+		     , DISP_YN
+		     , #{regNo}
+		     , NOW()
+		     , UPD_NO
+		     , UPD_DT
+		FROM TB_OPTION
+		WHERE GOODS_CD = #{goodsCd}
+		AND OPT_CD = #{optCd}
+	</insert>
+	
+	<!-- 상품 재고 정보 저장 -->
+	<update id="updateStock" parameterType="Option">
+		/* TsbGoods.updateStock */
+		UPDATE TB_STOCK
+		SET CURR_ON_STOCK_QTY = GREATEST(CURR_ON_STOCK_QTY - #{saleStockQty},0)
+		  , UPD_NO = #{updNo}
+		  , UPD_DT = NOW()
+		WHERE GOODS_CD = #{goodsCd}
+		AND OPT_CD = #{optCd}
+	</update>
+	
+	<!-- WMS 재고 임시 테이블 삭제 -->
+	<delete id="deleteGoodsOptionSync">
+		/* TsbGoods.deleteGoodsOptionSync */
+		TRUNCATE TABLE TB_OPTION_SYNC
+	</delete>
+	
+	<!--TB_OPTION = > TB_OPTION_SYNC 적용 -->
+	<insert id="createGoodsOptionSync">
+		/* TsbGoods.createGoodsOptionSync */
+		INSERT INTO TB_OPTION_SYNC
+		(
+		       GOODS_CD
+		     , OPT_CD
+		     , OPT_CD1
+		     , OPT_CD2
+		     , SKU_MODEL_NO
+		     , PRODUCT_NO
+		     , PRODUCT_CODE
+		     , BASE_STOCK_QTY
+		     , CURR_STOCK_QTY
+		     , ADD_PRICE
+		     , SOLDOUT_YN
+		     , DISP_ORD
+		     , DISP_YN
+		     , ERP_STOCK_LINK_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT B.GOODS_CD
+		     , B.OPT_CD
+		     , B.OPT_CD1
+		     , B.OPT_CD2
+		     , B.SKU_MODEL_NO
+		     , B.PRODUCT_NO
+		     , B.PRODUCT_CODE
+		     , B.BASE_STOCK_QTY
+		     , B.CURR_STOCK_QTY
+		     , B.ADD_PRICE
+		     , B.SOLDOUT_YN
+		     , B.DISP_ORD
+		     , B.DISP_YN
+		     , A.ERP_STOCK_LINK_YN
+		     , B.REG_NO
+		     , B.REG_DT
+		     , B.UPD_NO
+		     , B.UPD_DT
+		FROM   TB_GOODS A, TB_OPTION B
+		WHERE  A.GOODS_CD = B.GOODS_CD
+	</insert>
+	
+	<!-- TB_OPTION_SYNC_TEMP => TB_OPTION_SYNC 변경적용-->
+	<insert id="saveGoodsOptionSyncSync">
+		/* TsbGoods.saveGoodsOptionSyncSync */
+		UPDATE TB_OPTION_SYNC A, (SELECT GOODS_CD
+		                               , OPT_CD
+		                               , CURR_STOCK_QTY
+		                               , ERP_STOCK_LINK_YN
+		                          FROM TB_OPTION_SYNC_TEMP
+		                          WHERE ERP_STOCK_LINK_YN = 'Y'
+		                          ) B
+		SET A.CURR_STOCK_QTY = B.CURR_STOCK_QTY
+		  , A.UPD_NO = 0
+		  , A.UPD_DT = NOW()
+		WHERE A.GOODS_CD = B.GOODS_CD
+		AND A.OPT_CD = B.OPT_CD
+		<![CDATA[
+		AND A.CURR_STOCK_QTY <> B.CURR_STOCK_QTY
+		]]>
+	</insert>
+	
+	<!-- WMS 임시 테이블에서 실테이블로 변경 -->
+	<insert id="saveGoodsOptionNew">
+		/* TsbGoods.saveGoodsOptionNew */
+		UPDATE TB_OPTION A, (SELECT GOODS_CD
+		                          , OPT_CD
+		                          , CURR_STOCK_QTY
+		                          , ERP_STOCK_LINK_YN
+		                      FROM TB_OPTION_SYNC
+		                      WHERE ERP_STOCK_LINK_YN = 'Y'
+		                      ) B
+		SET A.CURR_STOCK_QTY = B.CURR_STOCK_QTY
+		  , A.UPD_NO = 0
+		  , A.UPD_DT = NOW()
+		WHERE A.GOODS_CD = B.GOODS_CD
+		AND A.OPT_CD = B.OPT_CD
+		<![CDATA[
+		AND A.CURR_STOCK_QTY <> B.CURR_STOCK_QTY
+		]]>
+	</insert>
+		
+	<!-- TB_SELL_QTY_TEMP 테이블 삭제 -->
+	<delete id="deleteTtbSellQtyTemp">
+		/* TsbGoods.deleteTtbSellQtyTemp */
+		TRUNCATE TABLE TB_SELL_QTY_TEMP
+	</delete>
+	
+	<!-- TB_SELL_QTY_TEMP 테이블 삭제 -->
+	<insert id="createTtbSellQtyTemp">
+		/* TsbGoods.createTtbSellQtyTemp */
+		INSERT INTO TB_SELL_QTY_TEMP (
+		      GOODS_CD
+		    , OPT_CD
+		    , SELL_GB
+		    , ORD_DTL_NO
+		    , ORD_CHG_SQ
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , SELL_QTY
+		    , REG_NO
+		    , REG_DT
+		)
+		SELECT GOODS_CD
+		    , OPT_CD
+		    , SELL_GB
+		    , ORD_DTL_NO
+		    , ORD_CHG_SQ
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , SELL_QTY
+		    , REG_NO
+		    , REG_DT
+		FROM TB_SELL_QTY
+	</insert>
+
+	<!-- 주문적재 테이블 삭제 -->
+	<delete id="deleteSellQty">
+		/* TsbGoods.deleteSellQty */
+		DELETE FROM TB_SELL_QTY
+	</delete>
+	
+	<!-- TB_SELL_QTY 테이블 생성 -->
+	<insert id="createTtbSellQty">
+		/* TsbGoods.createTtbSellQty */
+		INSERT INTO TB_SELL_QTY (
+		      GOODS_CD
+		    , OPT_CD
+		    , SELL_GB
+		    , ORD_DTL_NO
+		    , ORD_CHG_SQ
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , SELL_QTY
+		    , REG_NO
+		    , REG_DT
+		)
+		SELECT  GOODS_CD
+		    , OPT_CD
+		    , SELL_GB
+		    , ORD_DTL_NO
+		    , ORD_CHG_SQ
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , SELL_QTY
+		    , REG_NO
+		    , REG_DT
+		FROM TB_SELL_QTY_TEMP
+		WHERE ORD_DTL_NO IN (
+		                     SELECT OD.ORD_DTL_NO
+		                     FROM TB_ORDER_DETAIL OD
+		                        , TB_ORDER_DETAIL_ITEM ODI
+		                        , TB_GOODS G
+		                     WHERE OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		                     AND OD.ORD_DTL_STAT IN ('G013_10','G013_20') -- 입금대기, 결제완료
+		                     AND ODI.ITEM_CD = G.GOODS_CD
+		                     AND G.SELF_GOODS_YN ='Y'
+		                    )
+	</insert>
+	
+	<!-- TB_SELL_QTY 테이블 생성 -->
+	<insert id="createTtbSellQtyByOrderDetail">
+		/* TsbGoods.createTtbSellQtyByOrderDetail */
+		INSERT INTO TB_SELL_QTY (
+		      GOODS_CD
+		    , OPT_CD
+		    , SELL_GB
+		    , ORD_DTL_NO
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , SELL_QTY
+		    , REG_NO
+		    , REG_DT
+		)
+		SELECT ITEM_CD
+		     , OPT_CD
+		     , SELL_GB
+		     , ORD_DTL_NO
+		     , AGENT_ORDER_ID
+		     , EXTMALL_ORDER_ID
+		     , SELL_QTY
+		     , 0
+		     , NOW()
+		FROM (
+		      SELECT ODI.ITEM_CD
+		           , ODI.OPT_CD
+		           , '10' AS SELL_GB -- 주문건
+		           , OD.ORD_DTL_NO
+		           , OD.AGENT_ORDER_ID
+		           , OD.EXTMALL_ORDER_ID
+		           , SUM((OD.ORD_QTY - OD.CNCL_RTN_QTY) * ODI.ITEM_QTY) AS SELL_QTY
+		      FROM TB_ORDER_DETAIL OD
+		         , TB_ORDER_DETAIL_ITEM ODI
+		      WHERE OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		      AND OD.ORD_DTL_STAT IN ('G013_10','G013_20') -- 입금대기, 결제완료
+		      AND EXISTS (SELECT 1 FROM TB_OPTION X WHERE X.GOODS_CD = ODI.ITEM_CD AND X.OPT_CD = ODI.OPT_CD)
+		      GROUP BY ODI.ITEM_CD, ODI.OPT_CD, OD.ORD_DTL_NO, OD.AGENT_ORDER_ID, OD.EXTMALL_ORDER_ID
+		     ) A
+		WHERE NOT EXISTS (SELECT 1 
+		                  FROM TB_SELL_QTY Y 
+		                  WHERE Y.GOODS_CD = A.ITEM_CD 
+		                  AND Y.OPT_CD = A.OPT_CD
+		                  AND Y.SELL_GB = A.SELL_GB
+		                  AND Y.ORD_DTL_NO = A.ORD_DTL_NO
+		                  )
+	</insert>
 </mapper>

+ 1 - 8
style24.front/target/m2e-wtp/web-resources/META-INF/maven/com.style24.front/style24.front/pom.properties

@@ -1,14 +1,7 @@
 #Generated by Maven Integration for Eclipse
-<<<<<<< HEAD
-#Wed Jan 06 14:17:20 KST 2021
-=======
-#Wed Jan 06 15:15:11 KST 2021
+#Fri Jan 08 18:59:52 KST 2021
 version=0.0.1-SNAPSHOT
 groupId=com.style24.front
 m2e.projectName=style24.front
->>>>>>> branch 'develop' of http://112.172.147.34:4936/style24/STYLE24.git
 m2e.projectLocation=D\:\\WIDE\\workspace\\webapps\\style24\\STYLE24\\style24.front
-m2e.projectName=style24.front
-groupId=com.style24.front
 artifactId=style24.front
-version=0.0.1-SNAPSHOT