浏览代码

수정 중

xyzp1539 5 年之前
父节点
当前提交
ec174a14f2
共有 30 个文件被更改,包括 2821 次插入317 次删除
  1. 18 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaEnvsetDao.java
  2. 9 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java
  3. 62 11
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaOrderDao.java
  4. 24 0
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaEnvsetService.java
  5. 12 0
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaGoodsService.java
  6. 209 90
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaOrderService.java
  7. 23 0
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaDisplayController.java
  8. 49 0
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaEnvsetController.java
  9. 10 2
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaGoodsController.java
  10. 91 17
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaOrderController.java
  11. 33 0
      style24.admin/src/main/java/com/style24/persistence/domain/CustGradePolicy.java
  12. 46 1
      style24.admin/src/main/java/com/style24/persistence/domain/MoreBetter.java
  13. 29 0
      style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterBurden.java
  14. 37 0
      style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterGoods.java
  15. 32 0
      style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterSection.java
  16. 38 3
      style24.admin/src/main/java/com/style24/persistence/domain/Order.java
  17. 7 0
      style24.admin/src/main/java/com/style24/persistence/domain/OrderChange.java
  18. 10 4
      style24.admin/src/main/java/com/style24/persistence/domain/WmsGoods.java
  19. 82 0
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaEnvset.xml
  20. 35 5
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  21. 525 180
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml
  22. 296 0
      style24.admin/src/main/webapp/WEB-INF/views/envset/CustomerGradePolicyForm.html
  23. 4 4
      style24.admin/src/main/webapp/WEB-INF/views/marketing/MorebetterListForm.html
  24. 762 0
      style24.admin/src/main/webapp/WEB-INF/views/marketing/MorebetterRegForm.html
  25. 126 0
      style24.admin/src/main/webapp/WEB-INF/views/order/RefundAccountRegistForm.html
  26. 69 0
      style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsProductJob.java
  27. 76 0
      style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsProductStockJob.java
  28. 31 0
      style24.batch/src/main/java/com/style24/persistence/domain/IfProduct.java
  29. 33 0
      style24.batch/src/main/java/com/style24/persistence/domain/IfProductSku.java
  30. 43 0
      style24.core/src/main/java/META-INF/MANIFEST.MF

+ 18 - 0
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaEnvsetDao.java

@@ -3,6 +3,7 @@ package com.style24.admin.biz.dao;
 import java.util.Collection;
 
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.CustGradePolicy;
 import com.style24.persistence.domain.Envset;
 
 /**
@@ -31,4 +32,21 @@ public interface TsaEnvsetDao {
 	 */
 	Collection<Envset> getEnvsetList(Envset envset);
 
+	/**
+	 * 회원등급정책 저장
+	 * @param policy - 회원등급정책 정보
+	 * @author gagamel
+	 * @since 2021. 1. 7
+	 */
+	void createCustomerGradePolicy(CustGradePolicy policy);
+
+	/**
+	 * 회원등급정책 목록
+	 * @param policy - 회원등급정책 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 7
+	 */
+	Collection<CustGradePolicy> getCustomerGradePolicyList(CustGradePolicy policy);
+
 }

+ 9 - 0
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java

@@ -1068,6 +1068,15 @@ public interface TsaGoodsDao {
 	 */
 	public void updateFreeGoods(FreeGoods freeGoods);
 
+	/**
+	 * WMS입고상품관리 목록 건수
+	 * @param goodsSearch
+	 * @return Collection<WmsGoods>
+	 * @author eskim
+	 * @since 2021. 01. 04
+	 */
+	int getGoodsWmsIncomelotListCount(WmsGoods wmsGoods);
+
 	/**
 	 * WMS입고상품관리 목록 조회
 	 * @param goodsSearch

+ 62 - 11
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaOrderDao.java

@@ -35,15 +35,6 @@ public interface TsaOrderDao {
 	 */
 	Collection<Order> getOrderList(Order order);
 	
-	/**
-	 * 주문리스트 합계
-	 *
-	 * @param Order
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	Order getOrderListSumInfo(Order order);
-	
 	/**
 	 * 주문기본정보
 	 *
@@ -399,6 +390,16 @@ public interface TsaOrderDao {
 	 */
 	int createOrderDetailItemHst(Order order);
 	
+	/**
+	 * 주문상세 > 주문취소신청 > 주문상세정보(취소,반품) 이력 등록
+	 *
+	 * @param Order - 주문 정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2020. 12. 22
+	 */
+	int createOrderDetailHstCnclRtn(Order order);
+
 	/**
 	 * 주문상세 > 주문취소신청 > 주문상세정보 수정
 	 *
@@ -410,14 +411,64 @@ public interface TsaOrderDao {
 	int updateOrderDetail(Order order);
 	
 	/**
-	 * 주문상세 > 주문취소신청 > 주문상세정보 수정
+	 * 주문상세 > 주문취소신청 > 주문 환불 정보 등록
+	 *
+	 * @param Order - 주문 정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2020. 12. 22
+	 */
+	int createRefund(Order order);
+	
+	/**
+	 * 주문상세 > 주문취소신청 > 주문 환불 금액 정보 등록
 	 *
 	 * @param Order - 주문 정보
 	 * @return
 	 * @author jsh77b
 	 * @since 2020. 12. 22
 	 */
-	int createOrderDetailhst(Order order);
+	int createPayment(Order order);
+	
+	/**
+	 * 주문상세 > 주문취소신청 > 주문 추가 배송 금액 등록
+	 *
+	 * @param Order - 주문 정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 01. 06
+	 */
+	int createDeliveryFee(Order order);
+	
+	/**
+	 * 고객환불계좌 정보 조회
+	 *
+	 * @param order - 주문 정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 01. 04
+	 */
+	Collection<Order> getRefundAccount(Order order);
+	
+	/**
+	 * 환불계좌 존재 유무 체크
+	 *
+	 * @param order
+	 * @return int
+	 * @author jsh77b
+	 * @since 2021. 01. 05
+	 */
+	int getRefundAccountCheck(Order order);
+	
+	/**
+	 * 환불계좌 저정
+	 *
+	 * @param order
+	 * @return int
+	 * @author jsh77b
+	 * @since 2021. 01. 05
+	 */
+	int saveRefundAccount(Order order);
 	
 	
 }

+ 24 - 0
style24.admin/src/main/java/com/style24/admin/biz/service/TsaEnvsetService.java

@@ -10,6 +10,7 @@ import org.springframework.transaction.annotation.Transactional;
 import com.style24.admin.biz.dao.TsaEnvsetDao;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.biz.dao.TscEnvsetDao;
+import com.style24.persistence.domain.CustGradePolicy;
 import com.style24.persistence.domain.Envset;
 
 import lombok.extern.slf4j.Slf4j;
@@ -71,4 +72,27 @@ public class TsaEnvsetService {
 		return envsetDao.getEnvsetList(envset);
 	}
 
+	/**
+	 * 회원등급정책 저장
+	 * @param policy - 회원등급정책 정보
+	 * @author gagamel
+	 * @since 2021. 1. 7
+	 */
+	public void createCustomerGradePolicy(CustGradePolicy policy) {
+		policy.setRegNo(TsaSession.getInfo().getUserNo());
+		policy.setUpdNo(TsaSession.getInfo().getUserNo());
+		envsetDao.createCustomerGradePolicy(policy);
+	}
+
+	/**
+	 * 회원등급정책 목록
+	 * @param policy - 회원등급정책 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 7
+	 */
+	public Collection<CustGradePolicy> getCustomerGradePolicyList(CustGradePolicy policy) {
+		return envsetDao.getCustomerGradePolicyList(policy);
+	}
+
 }

+ 12 - 0
style24.admin/src/main/java/com/style24/admin/biz/service/TsaGoodsService.java

@@ -2654,6 +2654,18 @@ public class TsaGoodsService {
 		goodsDao.updateFreeGoods(freeGoods);
 	}
 
+	/**
+	 * WMS입고상품관리 목록 건수
+	 *
+	 * @param goodsSearch
+	 * @return Collection<WmsGoods>
+	 * @author eskim
+	 * @since 2021. 01. 04
+	 */
+	public int getGoodsWmsIncomelotListCount(WmsGoods wmsGoods) {
+		return goodsDao.getGoodsWmsIncomelotListCount(wmsGoods);
+	}
+
 	/**
 	 * WMS입고상품관리 목록 조회
 	 *

+ 209 - 90
style24.admin/src/main/java/com/style24/admin/biz/service/TsaOrderService.java

@@ -66,32 +66,7 @@ public class TsaOrderService {
 	public Collection<Order> getOrderList(Order order) {
 		return orderDao.getOrderList(order);
 	}
-	
-	/**
-	 * 주문리스트 합계
-	 *
-	 * @param order
-	 * @return Order - 합계정보
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	public Order getOrderListSumInfo(Order order) {
-		// multi row 검색관련 처리
-		if (StringUtils.isNotBlank(order.getCondition())) {
-			TsitUtil tsitUtil = new TsitUtil();
-			String searchCondition = tsitUtil.replaceMultiSelectParamsArr(order.getCondition());
-			order.setConditions(searchCondition.split(","));
-		}
 
-		// 외부몰권한일 때 외부몰벤더ID 설정
-		//if (TsaSession.getInfo().getRoleCd().startsWith("C")) {
-			//order.setMallGb(TsaConstants.MallGb.EXTMALL.value());
-			//order.setVendorId(TsaSession.getInfo().getVendorId());
-		//}
-		
-		return orderDao.getOrderListSumInfo(order);
-	}
-	
 	/**
 	 * 주문기본정보
 	 *
@@ -592,7 +567,7 @@ public class TsaOrderService {
 	}
 	
 	/**
-	 * 주문상세 > 주문취소대상목록
+	 * 주문상세 > 주문취소 환불 금액 계산
 	 * @param Order
 	 * @return Order
 	 * @author jsh77b
@@ -601,6 +576,7 @@ public class TsaOrderService {
 	public GagaMap orderCancelRefundAmt(List<Order> cancelReqList) {
 		GagaMap mav = new GagaMap();
 		
+		// 1. 변수설정
 		int spanPayAmt			= 0; // 총 결제 금액
 		int spanSumRealOrdAmt	= 0; // 상품 실결제 금액
 		int spanSumDeliveryFee	= 0; // 배송금액
@@ -621,14 +597,14 @@ public class TsaOrderService {
 		int spanTotDeliveryFee	= 0; // 환불 배송 금액
 		int spanRefundAmt		= 0; // 환불 금액 합계
 		
-		List<Order> cancelOrderRefundList = new ArrayList<Order>();		// 주문환불금액목록
+		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);
@@ -639,11 +615,12 @@ public class TsaOrderService {
 		delvObj.setDelvFeeCd(cancelReqList.get(k).getDelvFeeCd());
 		delvObj.setAllCanYn(cancelReqList.get(k).getAllCanYn());
 		cancelDelvRefundList.add(delvObj);
-
+		
+		// 3. 취소신청수량 정보를 취소 환불 금액 계산
 		for (Order oneData : cancelReqList) {
 			orderObj	= new Order();
 			
-			// 주문정보설정
+			// 3.1 주문기본정보 설정
 			orderObj.setItemQty(oneData.getItemQty());
 			orderObj.setOrdQty(oneData.getOrdQty());
 			orderObj.setCnclRtnQty(oneData.getCnclRtnQty());
@@ -663,22 +640,26 @@ public class TsaOrderService {
 			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(oneData.getCpn1DcAmt() 			* (ordCanChgQty/ordQty));
-			orderObj.setTmtb1DcAmt(oneData.getTmtb1DcAmt() 			* (ordCanChgQty/ordQty));
-			orderObj.setTmtb2DcAmt(oneData.getTmtb2DcAmt() 			* (ordCanChgQty/ordQty));
-			orderObj.setGoodsCpnDcAmt(oneData.getGoodsCpnDcAmt() 	* (ordCanChgQty/ordQty));
-			orderObj.setCartCpnDcAmt(oneData.getCartCpnDcAmt() 		* (ordCanChgQty/ordQty));
-			orderObj.setPntDcAmt(oneData.getPntDcAmt() 				* (ordCanChgQty/ordQty));
-			orderObj.setPrePntDcAmt(oneData.getPrePntDcAmt() 		* (ordCanChgQty/ordQty));
-			orderObj.setGfcdUseAmt(oneData.getGfcdUseAmt() 			* (ordCanChgQty/ordQty));
+			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();
@@ -689,10 +670,10 @@ public class TsaOrderService {
 			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());
@@ -701,14 +682,14 @@ public class TsaOrderService {
 			orderObj.setMinOrdAmt(oneData.getMinOrdAmt());
 			orderObj.setOrgDelvFee(oneData.getOrgDelvFee());
 			
-			// 주문상세상태
+			// 3.7 주문상세상태체크
 			orderObj.setOrdDtlStat(oneData.getOrdDtlStat());
 			orderObj.setOrdDtlStatNm(oneData.getOrdDtlStatNm());
-			orderObj.setAllCanYn(oneData.getAllCanYn());
+			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());
@@ -738,6 +719,7 @@ public class TsaOrderService {
 				cancelDelvRefundList.add(delvObj);
 			}
 			
+			// 3.9 FRONT 화면에서 상용 하는 변수 값 설정 & 계산
 			spanSumRealOrdAmt	+= oneData.getRealOrdAmt();
 			spanPntDcAmt		+= orderObj.getPntDcAmt();
 			spanPrePntDcAmt		+= orderObj.getPrePntDcAmt();
@@ -750,27 +732,35 @@ public class TsaOrderService {
 			spanRealCnclRtnAmt	+= orderObj.getRealOrdAmt();
 		}
 		
-		// 추가배송비 발생여부 , 추가배송비, 배송비정책단위 전체취소 여부
+		// 4. 추가배송비 발생여부, 추가배송비, 배송비정책단위 전체취소 여부 체크
 		for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
 			Order obj = cancelDelvRefundList.get(i);
 			
-			// 무료배송비용 > (주문금액 - 취소금액)
+			// 4.1 무료배송비용 > (주문금액 - 취소금액)
 			if (obj.getMinOrdAmt() > (obj.getOrdAmt() - obj.getCnclRtnAmt())) {
-				// 2020.12.28 
-				// case : 배송정책 기준으로 1,2 상품 주문 후 1번 출고 후 1번반품 2번취소 할 경우 전체 취소 가 아니므로 배송비 부과 있을지 모르겠음 주문업체 단위로 배송되기 때문에 발생하지 않을것 같음
-				if ((obj.getOrdAmt() - obj.getCnclRtnAmt()) == 0) {
-					if ("N".equals(obj.getAllCanYn())) {
+				
+				// 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())) {
+							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("Y");
-					obj.setAddDelvFee(obj.getOrgDelvFee());
 				}
 			} else {
 				obj.setAddDelvFeeYn("N");
@@ -785,6 +775,7 @@ public class TsaOrderService {
 			cancelDelvRefundList.set(i, obj);
 		}
 		
+		// 5. FRONT 화면엣 필요한 금액 설정
 		// 2020.12.30 프론트에서 필요한 부분 작업 필여
 		// 관리자 화면에서 사용하는 환불 칼럼 정보
 		// 환불금액표시
@@ -794,6 +785,7 @@ public class TsaOrderService {
 		spanTmtbDcAmt 		= spanTmtb1DcAmt + spanTmtb2DcAmt;
 		spanRefundAmt 		= spanRealCnclRtnAmt - spanTotDeliveryFee;
 
+		mav.set("cancelReqList"			, cancelReqList);			//주문 취소 신청 목록
 		mav.set("cancelOrderRefundList"	, cancelOrderRefundList);	//주문 환불 금액 목록
 		mav.set("cancelDelvRefundList"	, cancelDelvRefundList);	//주문 환불 배송 금액 목록
 		mav.set("spanPayAmt"			, spanPayAmt);				//총 결제 금액
@@ -819,16 +811,6 @@ public class TsaOrderService {
 		return mav;
 	}
 	
-	// 문자의 오른쪽으로 숫자만큼 공백 삽인
-	private static String padRight(String s, int n) {
-		return String.format("%-" + n + "s", s);
-	}
-	
-	// 문자의 왼쪽으로 숫자만큼 공백 삽인
-	private static String padLeft(String s, int n) {
-		return String.format("%" + n + "s", s);
-	}
-	
 	/**
 	 * 주문상세 > 주문취소
 	 * @param Order
@@ -843,12 +825,15 @@ public class TsaOrderService {
 		int userNo = TsaSession.getInfo().getUserNo();
 		
 		// 2. 취소요정정보목록
-		List<Order> cancelOrderRefundList = (List<Order>) mav.get("cancelOrderRefundList");
-		
+		List<Order> cancelReqList		 	= (List<Order>) mav.get("cancelReqList");			//주문 취소 신청 목록
+		List<Order> cancelOrderRefundList 	= (List<Order>) mav.get("cancelOrderRefundList");	//주문 환불 금액 목록
+		List<Order> cancelDelvRefundList 	= (List<Order>) mav.get("cancelDelvRefundList");	//주문 환불 배송 금액 목록
+				
 		// 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 chgGb		= "G680_20";
 		
 		// 4.1 주문변경 기본정보 등록
@@ -864,42 +849,176 @@ public class TsaOrderService {
 		
 		orderDao.createOrderChange(orderChange);
 		
-		// 4.2 주문변경 상세 정보 등록
+		List<Order> cancelOrderDetailList = new ArrayList<Order>();
+		
+		// 4.2 주문변경 상세 단품 정보 등록 (단품단위)
 		for (int i=0 ; i<cancelOrderRefundList.size() ; i++) {
 			Order vo = cancelOrderRefundList.get(i);
 			vo.setRegNo(userNo);
 			vo.setUpdNo(userNo);
-			vo.setOrdDtlStat("G685_21");
 			
+			// 2020.01.05 추후 무통장입금전 전체 취소시 분기로직 추가 예정
+			if ("Y".equals(allCanYn)) {
+				vo.setOrdDtlStat("G013_98"); // 결제전주문취소 : 공통코드로관리예정
+			} else {
+				vo.setOrdDtlStat("G013_99"); // 결제후주문취소 : 공통코드로관리예정
+			}
+
 			// 4.2.1 취소수량이 존재하면 주문정보 수정 및 주문변경정보 등록
 			if (vo.getOrdCanChgQty() > 0) {
-				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);
-				
-				// 4.2.2 주문변경상세정보 등록
-				orderDao.createOrderChangeDetail(po);
-				
 				// 4.2.3 주문상세단품정보 수정
 				orderDao.updateOrderDetailItem(vo);
 				
 				// 4.2.4 주문상세단품정보 이력 등록
 				orderDao.createOrderDetailItemHst(vo);
 				
-				// 4.2.5 주문변경상세정보 수정
-				orderDao.updateOrderDetail(vo);
+				// 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()) {
+							temp = true;
+						}
+					}
+				}
+				
+				// 4.4 주문상세단위 데이타 저장
+				if (!temp) {
+					cancelOrderDetailList.add(vo);
+				}
+			}
+		}
+		
+		// 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"); // 결제후주문취소 : 공통코드로관리예정
+			}
+			
+			// 5.1 주문변경상세정보 이력 등록
+			orderDao.createOrderDetailHstCnclRtn(vo);
+			
+			// 4.2 주문변경상세정보 수정
+			orderDao.updateOrderDetail(vo);
+			
+			// * 주문상세단위가 아닌 주문상세단품단위로 데이타가 처리되고 있었음
+			// 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);
+			
+			orderDao.createOrderChangeDetail(po);
+		}
+		
+		// 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);
+		
+		orderDao.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());
+		
+		orderDao.createRefund(refundOrder);
+		
+		// 8. 결제금액이 무료배송금액보다 작으면 배송비 신규 등록
+		for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
+			Order vo = cancelDelvRefundList.get(i);
+			
+			if (vo.getAddDelvFee() > 0) {
+				Order delvFeeOrder = new Order();
 				
-				// 4.2.6 주문변경상세정보 이력 등록
-				orderDao.createOrderDetailhst(vo);
+				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);
 				
-				int a = 100/0;
+				orderDao.createDeliveryFee(delvFeeOrder);
 			}
 		}
+
+		// 9. 포인트원복
+		
+		// 10. 쿠폰원복 (상품쿠폰)
+		
+		// 11. 사은품 취소
+		
+		// 12. 재고원복
+		
+		// 13. PG 연동
+		
+		//int a = 100/0;
+	}
+	
+	/**
+	 * 주문 환불계좌
+	 *
+	 * @param order - 주문정보
+	 * @return Order
+	 * @author jsh77b
+	 * @since 2021. 01. 04.
+	 */
+	public Collection<Order> getRefundAccount(Order order) {
+		return orderDao.getRefundAccount(order);
+	}
+	
+	/**
+	 * 환불계좌 저장
+	 *
+	 * @param order - 주문정보
+	 * @return TsaOrder
+	 * @author jsh77b
+	 * @since 2021. 01. 05.
+	 */
+	public int saveRefundAccount(Order order) {
+		
+		// 환불계좌 유무 체크 후 등록
+		if (orderDao.getRefundAccountCheck(order) < 1) {
+			orderDao.saveRefundAccount(order);
+		}
+		
+		return 1;
 	}
 	
 }

+ 23 - 0
style24.admin/src/main/java/com/style24/admin/biz/web/TsaDisplayController.java

@@ -2,6 +2,7 @@ package com.style24.admin.biz.web;
 
 import java.util.Collection;
 
+import com.style24.persistence.domain.Brand;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -185,4 +186,26 @@ public class TsaDisplayController extends TsaBaseController {
 		return displayService.getItemkindCategoryMappingList(itemkindCd);
 	}
 
+	/**
+	 * 카테고리 목록 화면(팝업)
+	 * @param Category
+	 * @return
+	 * @author xyzp1539
+	 * @since 2021. 01. 11
+	 */
+	@GetMapping("/category/popup/form")
+	public ModelAndView categorySearchForm(Category category) {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+		mav.addObject("cateGbList", rendererService.getAvailCommonCodeList("G032"));
+		mav.addObject("cateTypeList", rendererService.getAvailCommonCodeList("G031"));
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+		mav.addObject("conentsLocList", rendererService.getAvailCommonCodeList("G028"));
+		mav.addObject("params", category);
+
+		mav.setViewName("display/CategorySearchForm");
+		return mav;
+	}
+
 }

+ 49 - 0
style24.admin/src/main/java/com/style24/admin/biz/web/TsaEnvsetController.java

@@ -22,6 +22,7 @@ import com.style24.core.biz.service.TscEnvsetService;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.AnswerPhase;
 import com.style24.persistence.domain.Clause;
+import com.style24.persistence.domain.CustGradePolicy;
 import com.style24.persistence.domain.Envset;
 
 import lombok.extern.slf4j.Slf4j;
@@ -148,6 +149,54 @@ public class TsaEnvsetController extends TsaBaseController {
 		return envsetService.getEnvsetHistoryList(siteCd, envsetType);
 	}
 
+	/**
+	 * 회원등급정책관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 6
+	 */
+	@GetMapping("/customer/grade/policy/form")
+	public ModelAndView customerGradePolicyForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+
+		// 회원등급
+		mav.addObject("custGradeList", rendererService.getAvailCommonCodeList("G110"));
+
+		mav.setViewName("envset/CustomerGradePolicyForm");
+
+		return mav;
+	}
+
+	/**
+	 * 회원등급정책 목록
+	 * @param policy - 회원등급정책 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 7
+	 */
+	@PostMapping("/customer/grade/policy/list")
+	@ResponseBody
+	public Collection<CustGradePolicy> getCustomerGradePolicyList(@RequestBody CustGradePolicy policy) {
+		return envsetService.getCustomerGradePolicyList(policy);
+	}
+
+	/**
+	 * 회원등급정책 저장
+	 * @param policy - 회원등급정책 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 7
+	 */
+	@PostMapping("/customer/grade/policy/create")
+	@ResponseBody
+	public GagaResponse createCustomerGradePolicy(@RequestBody CustGradePolicy policy) {
+		envsetService.createCustomerGradePolicy(policy);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
 	/**
 	 * 약관관리 화면
 	 * @return ModelAndView

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

@@ -1271,9 +1271,17 @@ public class TsaGoodsController extends TsaBaseController {
 	 */
 	@PostMapping("/wms/incomelot/list")
 	@ResponseBody
-	public Collection<WmsGoods> getGoodsWmsIncomelotList(@RequestBody WmsGoods wmsGoods) {
+	public GagaMap getGoodsWmsIncomelotList(@RequestBody WmsGoods wmsGoods) {
 
-		return goodsService.getGoodsWmsIncomelotList(wmsGoods);
+		GagaMap result = new GagaMap();
+
+		wmsGoods.setPageable(new TsaPageRequest(wmsGoods.getPageNo() - 1, wmsGoods.getPageSize()));
+		wmsGoods.getPageable().setTotalCount(goodsService.getGoodsWmsIncomelotListCount(wmsGoods));
+
+		result.set("pageing", wmsGoods);
+		result.set("goodsList", goodsService.getGoodsWmsIncomelotList(wmsGoods));
+
+		return result;
 	}
 
 	/**

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

@@ -34,7 +34,6 @@ import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.TsaPageRequest;
-import com.style24.persistence.domain.CommonCode;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.OrderChange;
 
@@ -176,20 +175,6 @@ public class TsaOrderController extends TsaBaseController {
  
 		return orderList;
 	}
-	
-	/**
-	 * 주문 목록 데이타 합산
-	 *
-	 * @param order - 주문정보
-	 * @return Collection<Order>
-	 * @author jsh77b
-	 * @since 2020. 11. 16
-	 */
-	@PostMapping("/list/sum/info")
-	@ResponseBody
-	public Order getOrderListSumInfo(@RequestBody Order order) {
-		return orderService.getOrderListSumInfo(order);
-	}
 
 	/**
 	 * 주문상세 화면
@@ -644,16 +629,17 @@ public class TsaOrderController extends TsaBaseController {
 		
 		Collection<Order> cancelRequestTargetList = orderService.getCancelRequestTargetList(order);
 
-		//Order orderInfo = orderService.getOrderInfo(order);
+		Order orderInfo = orderService.getOrderInfo(order);
 
 		//mav.addObject("nicePay", nicePay);
 		mav.addObject("chgReasonList"				, rendererService.getAvailCommonCodeList("G686"));	// 취소사유
 		mav.addObject("cancelRequestTargetList"		, cancelRequestTargetList);							// 취소요청대상 목록
-		//mav.addObject("orderInfo"					, orderInfo);										// 주문정보
+		mav.addObject("orderInfo"					, orderInfo);										// 주문정보
 		mav.addObject("ordNo"						, ordNo);
 		mav.addObject("cncWait"						, cncWait);
 
 		mav.setViewName("order/CancelRequestForm");
+		
 		return mav;
 	}
 	
@@ -707,11 +693,99 @@ public class TsaOrderController extends TsaBaseController {
 		mav.set("chgReason"		, cancelReq.getChgReason());
 		mav.set("chgMemo"		, cancelReq.getChgMemo());
 		
+		mav.set("accountNo"		, cancelReq.getAccountNo());
+		mav.set("accountNm"		, cancelReq.getAccountNm());
+		mav.set("bankCd"		, cancelReq.getBankCd());
+		
+		mav.set("allCanYn"		, cancelReq.getAllCanYn());
+		
 		// 3. 주문변경 DB 등록 (주문정보, 배송정보)
 		orderService.orderCancel(mav);
 		
 		return super.ok("성공");
 	}
+	
+	/**
+	 * 환불계좌등록 화면
+	 *
+	 * @param ordNo - 주문번호
+	 * @param custNo - 고객고유번호
+	 * @return ModelAndView
+	 * @author jsh77b
+	 * @since 2021. 01. 04.
+	 */
+	@GetMapping("/refund/account/create/form")
+	public ModelAndView refundAccountCreateForm(@RequestParam(value = "ordNo") int ordNo) {
+		ModelAndView mav = new ModelAndView();
+		Order order = new Order();
+		order.setOrdNo(ordNo);
+
+		Order orderBasic 						= orderService.getOrderInfo(order);
+		Collection<Order> orderRfAccountInfo 	= orderService.getRefundAccount(order);
+
+		mav.addObject("bankList"				, rendererService.getCommonCodeList("G940"));
+		mav.addObject("orderRfAccountInfo"		, orderRfAccountInfo);
+		mav.addObject("orderBasic"				, orderBasic);
+
+		mav.setViewName("order/RefundAccountRegistForm");
+		
+		return mav;
+	}
+	
+	/**
+	 * 환불계좌 저장
+	 *
+	 * @param order - 환불계좌정보
+	 * @return GagaResponse
+	 * @author jsh77b
+	 * @since 2021. 01. 04.
+	 */
+	@PostMapping("/account/save")
+	@ResponseBody
+	public GagaResponse saveRefundAccount(@RequestBody Order order) {
+		
+		int userNo = TsaSession.getInfo().getUserNo();
+		order.setUpdNo(userNo);
+		order.setRegNo(userNo);
+		
+		/*
+		NicePay nicePay = new NicePay();
+		nicePay.setInAccount(order.getRaNo());
+		nicePay.setInBankCode(order.getRaBnk());
+		nicePay.setRaNm(order.getRaNm());
+		String accountCheck = nicepay.checkBankAccount(nicePay);
+		*/
+		
+		String accountCheck = "Y";
+
+		if ("Y".equals(accountCheck)) {
+			orderService.saveRefundAccount(order);
+		} else {
+			throw new IllegalStateException("환불계좌정보가 맞지 않습니다!");
+		}
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+	
+	/**
+	 * 환불계좌정보
+	 *
+	 * @param ordNo - 주문번호
+	 * @param custNo - 고객고유번호
+	 * @return Collection<TsaOrder>
+	 * @author jsshin
+	 * @since 2020. 10. 16.
+	 */
+	@GetMapping("/refund/account/info/list")
+	@ResponseBody
+	public Collection<Order> getRefundAccountInfoList(@RequestParam(value = "ordNo") int ordNo) {
+		Order order = new Order();
+		order.setOrdNo(ordNo);
+
+		Collection<Order> orderRfAccountInfo = orderService.getRefundAccount(order);
+
+		return orderRfAccountInfo;
+	}
 }
 
 

+ 33 - 0
style24.admin/src/main/java/com/style24/persistence/domain/CustGradePolicy.java

@@ -0,0 +1,33 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 회원등급정책 Domain
+ *
+ * @author
+ * @since 2021. 1. 7
+ */
+@SuppressWarnings("serial")
+@Data
+public class CustGradePolicy extends TscBaseDomain {
+
+	private String siteCd;			// 사이트코드
+	private String gradeCd;			// 등급코드
+	private String iconNm;			// 아이콘명(프론트 표기 접두사)
+	private int calMonths;			// 등급산정월수
+	private int minBuyAmt;			// 등급산정최소구매금액
+	private int minBuyCnt;			// 등급산정최소구매건수
+	private int buyExceptAmt;		// 구매제외금액(최소구매건수제외조건)
+	private String gradeCpnId1;		// 혜택쿠폰1
+	private String gradeCpnNm1;		// 혜택쿠폰명1
+	private String gradeCpnId2;		// 혜택쿠폰2
+	private String gradeCpnNm2;		// 혜택쿠폰명2
+	private String gradeCpnId3;		// 혜택쿠폰3
+	private String gradeCpnNm3;		// 혜택쿠폰명3
+	private int dispOrd;			// 표시순서
+	private String useYn;			// 사용여부
+
+}

+ 46 - 1
style24.admin/src/main/java/com/style24/persistence/domain/MoreBetter.java

@@ -4,6 +4,8 @@ import com.style24.persistence.TsaPageRequest;
 import com.style24.persistence.TscBaseDomain;
 import lombok.Data;
 
+import java.util.Collection;
+
 /**
  * 품목 Domain
  *
@@ -13,12 +15,13 @@ import lombok.Data;
 @SuppressWarnings("serial")
 @Data
 public class MoreBetter extends TscBaseDomain {
-	// 사은품 프로모션
+	// 다다익선 마스터
 	private int tmtbSq;				// 프로모션ID
 	private String tmtbNm;			// 프로모션명
 	private String tmtbStat;		// 프로모션 상태
 	private String tmtbStdt;		// 프로모션 시작일
 	private String tmtbEddt;		// 프로모션 종료일
+	private String multiYn;			// 복수,단수설정
 	private String delYn;			// 삭제여부
 	private Integer regNo;			// 등록자
 	private String  regDt;			// 등록일시
@@ -28,6 +31,48 @@ public class MoreBetter extends TscBaseDomain {
 	private String searchTxt;		// 프로모션 검색 조건
 	private String gbn;				// 팝업 구분 : C=등록, U=수정
 
+	// 공급업체
+	private String supplyCompCd;
+	private String supplyCompNm;
+	private String targetGb;
+
+	// 브랜드
+	private String brandCd;
+	private String brandEnm;
+
+	// 상품
+
+	// 다다익선 할인구간설정 2차조건(TB_TMTB_SECTION)
+	private int tmtbSectionSq;		// 다다익선 할인구간 시퀀스
+	private String sectionGb;		// 구간설정 구분값(G810_10:수량,G810_11:금액)
+	private int sectionVal;		// 구간설정값, 구간할인시작(수량이상, 금액이상)
+
+	// 다다익선 조건에 따른 할인혜택(금액할인)(TB_TMTB_VAL)
+	private int tmtbValSq;			// 다다익선 할인값 시퀀스
+	private String dcWay;			// 할인방식(G240_10:할인금액,G240_11:할인율)
+	private int dcVal;				// 할인값
+
+	// 다다익선 업체분담율(TB_TMTB_BURDEN)
+	private int tmtbBurdenSq;		// 업체분담율Sq
+	private String tmtbSupplyCd;	// 업체코드
+	private String tmtbBurdenRate;	// 업체분담율
+	//private String burdenRate;	// 업체분담율
+	private String useYn;			// 사용여부
+
+	private Collection<MoreBetterGoods> supplyCompListNew;
+	private Collection<MoreBetterGoods> brandListNew;
+	private Collection<MoreBetterGoods> applyGoodsListNew;
+	private Collection<MoreBetterGoods> exceptGoodsListNew;
+	private Collection<MoreBetterBurden> burdenListNew;
+	private Collection<MoreBetterSection> sectionGbListNew;
+
+	private String supplyCompList;
+	private String brandList;
+	private String applyGoodsList;
+	private String exceptGoodsList;
+	private String burdenList;
+	private String sectionGbList;
+
 	// Pagination
 	private TsaPageRequest pageable;
 	private int pageNo = 1;

+ 29 - 0
style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterBurden.java

@@ -0,0 +1,29 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+import lombok.Data;
+
+/**
+ * 품목 Domain
+ *
+ * @author bin2107
+ * @since 2021. 1.
+ */
+@SuppressWarnings("serial")
+@Data
+public class MoreBetterBurden extends TscBaseDomain {
+	// 다다익선 업체 분담율
+	private Integer tmtbBurdenSq;		// 업체분담율Sq
+	private Integer tmtbSq;				// 프로모션Sq
+	private String tmtbSupplyCd;	// 업체코드
+	private String tmtbBurdenRate;	// 업체분담율
+	private String useYn;			// 사용여부
+	private Integer regNo;			// 등록자
+	private String  regDt;			// 등록일시
+	private Integer udpNo;			// 수정자
+	private String  udtDt;			// 수정일시
+
+	//private String supplyCompCd;
+	private String burdenRate;
+
+}

+ 37 - 0
style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterGoods.java

@@ -0,0 +1,37 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TsaPageRequest;
+import com.style24.persistence.TscBaseDomain;
+import lombok.Data;
+
+import java.util.Collection;
+
+/**
+ * 품목 Domain
+ *
+ * @author bin2107
+ * @since 2021. 1.
+ */
+@SuppressWarnings("serial")
+@Data
+public class MoreBetterGoods extends TscBaseDomain {
+	// 다다익선 적용대상
+	private int tmtbGoodsSq;		// 업체분담율Sq
+	private int tmtbSq;				// 프로모션Sq
+	private String goodsGb;			// 공통코드 (G800_10|기본상품, G800_20|적용상품, G800_30|제외상품, G800_40|ALL)
+	private String targetGb;		// 적용대상 (G260_10|상품, G260_12|브랜드, G260_13|공급처)
+	private String targetVal;		// 브랜드코드, 상품코드, 공급처코드
+	private String delYn;			// 삭제여부
+	private Integer regNo;			// 등록자
+	private String  regDt;			// 등록일시
+	private Integer udpNo;			// 수정자
+	private String  udtDt;			// 수정일시
+
+	private String supplyCompCd;
+	private String supplyCompNm;
+	private String brandCd;
+	private String brandEnm;
+	private String goodsCd;
+	private String goodsNm;
+
+}

+ 32 - 0
style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterSection.java

@@ -0,0 +1,32 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+import lombok.Data;
+
+/**
+ * 품목 Domain
+ *
+ * @author bin2107
+ * @since 2021. 1.
+ */
+@SuppressWarnings("serial")
+@Data
+public class MoreBetterSection extends TscBaseDomain {
+	// 다다익선 상품
+	private Integer tmtbSq;
+	private Integer tmtbSectionSq;	// 업체분담율Sq
+	private Integer tmtbValSq;		// 업체분담율Sq
+
+	private String  sectionGb;		// 구간설정구분값(G810_10:수량,G810_11:금액)
+	private Integer sectionVal;		// 구간설정값/구간할인시작(수량이상,금액이상)
+
+	private String  dcWay;			// 할인방식(G240_10:할인금액,G240_11:할인율)
+	private Integer dcVal;			// 할인값
+
+	private String  delYn;			// 삭제여부
+	private Integer regNo;			// 등록자
+	private String  regDt;			// 등록일시
+	private Integer udpNo;			// 수정자
+	private String  udtDt;			// 수정일시
+
+}

+ 38 - 3
style24.admin/src/main/java/com/style24/persistence/domain/Order.java

@@ -24,9 +24,7 @@ public class Order extends TscBaseDomain {
 	private String payDt;
 	private int custNo;
 	private String ordNm;
-	private String ord_phnno;
-	private String ord_telno;
-	private String ord_email;
+	private String ordTelno;
 	private String siteCd;
 	private int npayOrdNo;
 	private String frontGb;
@@ -321,6 +319,43 @@ public class Order extends TscBaseDomain {
 	private int addDelvFee;
 	private int ordDtlItemSq;
 	
+	private int paySq;
+	private int refundAmt;
+	private int rfCpn1Amt;
+	private int rfTmtb1Amt;
+	private int rfTmtb2Amt;
+	private int rfGoodsCpnAmt;
+	private int rfCartCpnAmt;
+	private int rfPntAmt;
+	private int rfPrePntAmt;
+	private int rfGfcdUseAmt;
+	
+	private int pgCpnAmt;
+	private int npayPntAmt;
+	private String payGb;
+	private String pgGb;
+	private String pgTid;
+	private String cardType;
+	private String cardKind;
+	private String cardBank;
+	private String cardMips;
+	private String cardPcableYn;
+	private String vaNo;
+	private String vaNm;
+	private String vaDeadline;
+	private String telecom;
+	
+	private String accountNo;
+	private String accountNm;
+	private String bankCd;
+	private String bankNm;
+	
+	private int realDelvAmt;
+	private int delvCpnSq;
+	private int delvCpnDcAmt;
+	
+	private int chgQty;
+	
 
 }
 

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

@@ -45,6 +45,13 @@ public class OrderChange extends TscBaseDomain {
 	private String chgStatNm;
 	private String whMemo;
 	
+	private String accountNo;
+	private String accountNm;
+	private String bankCd;
+	private String bankNm;
+	
+	private String allCanYn;
+	
 
 }
 

+ 10 - 4
style24.admin/src/main/java/com/style24/persistence/domain/WmsGoods.java

@@ -1,5 +1,6 @@
 package com.style24.persistence.domain;
 
+import com.style24.persistence.TsaPageRequest;
 import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
@@ -17,10 +18,6 @@ public class WmsGoods extends TscBaseDomain {
 	private Integer productNo;		//wms상품번호
 	private int productCode;		//wms상품코드
 	private String productName;		//상품명
-	private String skucode;			//옵션번호
-	private int normalQty;			//일반수량
-	private int brokenQty;			//불량수량
-	private int totalQty;			//총수량
 	private String modelNo;			//모델번호
 	private int providerNo;			//공급처번호
 	private String providerName;	//공급처명
@@ -35,4 +32,13 @@ public class WmsGoods extends TscBaseDomain {
 	private String stDate;
 	private String edDate;
 
+	private int startRow;
+	private int endRow;
+	private String goodsPriceYn;
+	// Pagination
+	private TsaPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
+
 }

+ 82 - 0
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaEnvset.xml

@@ -60,5 +60,87 @@
 		AND    ENVSET_TYPE = #{envsetType}
 		ORDER  BY ENVSET_SQ DESC
 	</select>
+	
+	<!-- 회원등급정책 생성 -->
+	<insert id="createCustomerGradePolicy" parameterType="CustGradePolicy">
+		/* TsaEnvset.createCustomerGradePolicy */
+		INSERT INTO TB_CUST_GRADE_POLICY (
+		       SITE_CD
+		     , GRADE_CD
+		     , ICON_NM
+		     , CAL_MONTHS
+		     , MIN_BUY_AMT
+		     , MIN_BUY_CNT
+		     , BUY_EXCEPT_AMT
+		     , GRADE_CPN_ID1
+		     , GRADE_CPN_ID2
+		     , GRADE_CPN_ID3
+		     , DISP_ORD
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{siteCd}
+		     , #{gradeCd}
+		     , #{iconNm}
+		     , #{calMonths}
+		     , #{minBuyAmt}
+		     , #{minBuyCnt}
+		     , #{buyExceptAmt}
+		     , #{gradeCpnId1}
+		     , #{gradeCpnId2}
+		     , #{gradeCpnId3}
+		     , #{dispOrd}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       ICON_NM = #{iconNm}
+		     , CAL_MONTHS = #{calMonths}
+		     , MIN_BUY_AMT = #{minBuyAmt}
+		     , MIN_BUY_CNT = #{minBuyCnt}
+		     , BUY_EXCEPT_AMT = #{buyExceptAmt}
+		     , GRADE_CPN_ID1 = #{gradeCpnId1}
+		     , GRADE_CPN_ID2 = #{gradeCpnId2}
+		     , GRADE_CPN_ID3 = #{gradeCpnId3}
+		     , DISP_ORD = #{dispOrd}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 회원등급정책 목록 -->
+	<select id="getCustomerGradePolicyList" parameterType="CustGradePolicy" resultType="CustGradePolicy">
+		/* TsaEnvset.getCustomerGradePolicyList */
+		SELECT SITE_CD
+		     , GRADE_CD
+		     , ICON_NM
+		     , CAL_MONTHS
+		     , MIN_BUY_AMT
+		     , MIN_BUY_CNT
+		     , BUY_EXCEPT_AMT
+		     , GRADE_CPN_ID1
+		     , FN_GET_COUPON_NM(GRADE_CPN_ID1)    AS GRADE_CPN_NM1
+		     , GRADE_CPN_ID2
+		     , FN_GET_COUPON_NM(GRADE_CPN_ID2)    AS GRADE_CPN_NM2
+		     , GRADE_CPN_ID3
+		     , FN_GET_COUPON_NM(GRADE_CPN_ID3)    AS GRADE_CPN_NM3
+		     , DISP_ORD
+		     , USE_YN
+		     , FN_GET_USER_NM(UPD_NO)             AS UPD_NM
+		     , DATE_FORMAT(UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
+		FROM   TB_CUST_GRADE_POLICY A
+		WHERE  SITE_CD = #{siteCd}
+		<if test="gradeCd != null and gradeCd != ''">
+		AND    GRADE_CD = #{gradeCd}
+		</if>
+		ORDER  BY SITE_CD, GRADE_CD
+	</select>
 
 </mapper>

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

@@ -3650,16 +3650,44 @@
 		WHERE PRODUCT_NO = #{productNo}
 	</update>
 	
+	<!-- WMS입고상품 목록 건수 -->
+	<select id="getGoodsWmsIncomelotListCount" parameterType="WmsGoods" resultType="int">
+		/* TsaGoods.getGoodsWmsIncomelotListCount */
+		SELECT COUNT(*)
+		FROM TB_WMS_GOODS A
+		LEFT OUTER JOIN TB_BRAND B ON A.BRAND_NO = B.BRAND_NO 
+		LEFT OUTER JOIN TB_SUPPLY_COMPANY S ON A.PROVIDER_NO = S.PROVIDER_NO
+		WHERE GOODS_REG_GB IS NULL   /* 온라인 미등록 상품 */
+		<if test="modelNo != null and modelNo != ''">
+		AND UPPER(A.MODEL_NO) LIKE CONCAT('%',UPPER(#{modelNo}),'%') 
+		</if>
+		<if test="stDate != null and stDate != ''">
+		AND A.REG_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		</if>
+		<if test="edDate != null and edDate != ''">
+		<![CDATA[
+		AND A.REG_DT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		]]>
+		</if>
+		<if test="supplyCompCd != null and supplyCompCd != ''">
+		AND UPPER(S.SUPPLY_COMP_CD) = UPPER(#{supplyCompCd}) 
+		</if>
+		<if test="brandCd != null and brandCd != ''">
+		AND UPPER(B.BRAND_CD) = UPPER(#{brandCd}) 
+		</if>
+		ORDER BY A.UPD_DT DESC
+	</select>
+	
 	<!-- WMS입고상품 목록 -->
 	<select id="getGoodsWmsIncomelotList" parameterType="WmsGoods" resultType="WmsGoods">
 		/* TsaGoods.getGoodsWmsIncomelotList */
+		SELECT Q.* FROM (
+		SELECT Z.* FROM (
+		SELECT A.*, @rownum := @rownum + 1 AS RNUM 
+		    FROM (
 		SELECT A.PRODUCT_NO
 		     , A.PRODUCT_CODE
 		     , A.PRODUCT_NAME
-		     , A.SKUCODE
-		     , A.NORMAL_QTY
-		     , A.BROKEN_QTY
-		     , A.TOTAL_QTY
 		     , A.MODEL_NO
 		     , A.PROVIDER_NO
 		     , A.PROVIDER_NAME
@@ -3676,11 +3704,12 @@
 		     , FN_GET_USER_NM(A.UPD_NO) AS UPD_NM
 		     , DATE_FORMAT(A.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
 		FROM TB_WMS_GOODS A
+		JOIN ( SELECT @rownum := 0) R
 		LEFT OUTER JOIN TB_BRAND B ON A.BRAND_NO = B.BRAND_NO 
 		LEFT OUTER JOIN TB_SUPPLY_COMPANY S ON A.PROVIDER_NO = S.PROVIDER_NO
 		WHERE GOODS_REG_GB IS NULL   /* 온라인 미등록 상품 */
 		<if test="modelNo != null and modelNo != ''">
-		AND UPPER(A.MODEL_NO) = CONCAT('%',UPPER(#{modelNo}),'%') 
+		AND UPPER(A.MODEL_NO) LIKE CONCAT('%',UPPER(#{modelNo}),'%') 
 		</if>
 		<if test="stDate != null and stDate != ''">
 		AND A.REG_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
@@ -3697,6 +3726,7 @@
 		AND UPPER(B.BRAND_CD) = UPPER(#{brandCd}) 
 		</if>
 		ORDER BY A.UPD_DT DESC
+		<include refid="getListPagingCondition_sql"/>
 	</select>
 	
 	<!-- 사은품 등록 -->

+ 525 - 180
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml

@@ -16,12 +16,13 @@
 		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
 		ON     O.ORD_NO = P.ORD_NO
 		AND    P.PAY_GB = 'O'
+		AND    P.PAY_STAT = 'G016_30'
 		INNER  JOIN TB_DELIVERY_ADDR DA
 		ON     OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
 		LEFT   OUTER JOIN (
@@ -75,12 +76,6 @@
         	<if test="chgGb != null and chgGb != ''">
         AND    OCD.CHG_STAT = #{chgGb}
         	</if>
-        </if>
-		<if test="chgStat != null and chgStat != ''">
-        AND    OCD.CHG_STAT = #{chgStat}
-        </if>
-        <if test="chgStat == null or chgStat == ''">
-        AND    OCD.CHG_STAT = #{chgGb}
         </if>
         <if test='search != null and search == "searchOrdNo"'>
         	<if test="condition != null and condition != ''">
@@ -230,12 +225,13 @@
 				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
 				ON     O.ORD_NO = P.ORD_NO
 				AND    P.PAY_GB = 'O'
+				AND    P.PAY_STAT = 'G016_30'
 				INNER  JOIN TB_DELIVERY_ADDR DA
 				ON     OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
 				LEFT   OUTER JOIN (
@@ -378,129 +374,16 @@
 		            </foreach>
 		        </if>
 		        ORDER  BY OD.ORD_NO DESC
-		                , OD.ORD_DTL_NO DESC
-		                , ODI.ORD_DTL_ITEM_SQ DESC
+		             , OD.ORD_DTL_NO DESC
+		             , ODI.ORD_DTL_ITEM_SQ DESC
 	        ) A
 			JOIN (SELECT @rownum := 0) R
 		) Z
 		WHERE  1=1
         AND    Z.RNUM BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
         ORDER  BY Z.ORD_NO DESC
-                , Z.ORD_DTL_NO DESC
-                , Z.ORD_DTL_ITEM_SQ DESC
-	</select>
-	
-	<!-- 주문 목록 금액, 수량 정보 : 사용안함 -->
-	<select id="getOrderListSumInfo" parameterType="Order" resultType="Order">
-		/* order.getOrderListSumInfo */
-		SELECT SUM(ORD_AMT)                   AS SUM_ORD_AMT
-		     , SUM(ORD_AMT - CNCL_RTN_AMT)    AS SUM_ORD_CNCL_AMT
-		     , SUM(REAL_ORD_AMT)              AS SUM_REAL_PAY_AMT
-		     , COUNT(DISTINCT ORD_NO)         AS ORD_NO_CNT
-		     , SUM(ORD_QTY)                   AS SUM_ORD_QTY
-		     , SUM(ORD_QTY - CNCL_RTN_QTY)    AS SUM_ORD_CNCL_QTY
-		FROM   (
-			SELECT O.ORD_NO
-			     , OD.GOODS_CD
-			     , OD.ORD_AMT
-			     , OD.CNCL_RTN_AMT
-			     , OD.CNCL_RTN_QTY
-			     , OD.ORD_QTY
-			     , OD.REAL_ORD_AMT
-			FROM   TB_ORDER O
-			INNER  JOIN TB_ORDER_DETAIL OD
-			ON     O.ORD_NO = OD.ORD_NO
-			INNER  JOIN TB_ORDER_DETAIL_ITEM ODI
-			ON     OD.ORD_NO = ODI.ORD_NO
-			AND    OD.ORD_DTL_NO = ODI.ORD_DTL_NO
-			INNER  JOIN TB_GOODS G
-			ON     OD.GOODS_CD = G.GOODS_CD
-			INNER  JOIN TB_GOODS_IMG GI
-			ON     OD.GOODS_CD = GI.GOODS_CD
-			AND    ODI.OPT_CD1 = GI.COLOR_CD
-			INNER  JOIN TB_PAYMENT P
-			ON     O.ORD_NO = P.ORD_NO
-			AND    P.PAY_GB = 'O'
-			INNER  JOIN TB_DELIVERY_ADDR DA
-			ON     OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
-			WHERE  1=1
-			<if test='siteCd != null and siteCd != ""'>
-			AND    O.SITE_CD = #{siteCd}
-			</if>
-			<if test='mallCd != null and mallCd != ""'>
-			AND    O.MALL_GB = #{mallCd}
-			</if>
-			<if test='supplyCompCd != null and supplyCompCd != ""'>
-			AND    OD.SUPPLY_COMP_CD = #{supplyCompCd}
-			</if>
-			<if test="multiBrand != null and multiBrand != ''">
-	        AND    G.BRAND_CD IN
-				<foreach collection="multiBrand" item="item" index="index"  open="(" close=")" separator=",">
-	        		#{item}
-	            </foreach>
-	        </if>
-	        <if test="multiOrdDtlStat != null and multiOrdDtlStat != ''">
-	        AND    OD.ORD_DTL_STAT IN
-				<foreach collection="multiOrdDtlStat" item="item" index="index"  open="(" close=")" separator=",">
-	        		#{item}
-	            </foreach>
-	        </if>
-	        <if test='search != null and search == "searchOrdNo"'>
-	        	<if test="condition != null and condition != ''">
-			AND    O.ORD_NO = #{condition}
-				</if>
-			</if>
-			<if test='search != null and search == "searchExtmallOrderId"'>
-	        	<if test="condition != null and condition != ''">
-			AND    O.ORD_NO = #{condition}
-				</if>
-			</if>
-			<if test='payMeans != null and payMeans != ""'>
-			AND    P.PAY_MEANS = #{payMeans}
-			</if>
-			<if test='orderNm != null and orderNm != ""'>
-			AND    O.ORD_NM = #{orderNm}
-			</if>
-			<if test='custId != null and custId != ""'>
-			AND    O.CUST_NO = #{custId}
-			</if>
-			<if test='orderPhnno != null and orderPhnno != ""'>
-			AND    O.ORD_PHNNO = #{orderPhnno}
-			</if>
-			<if test='goodsCd != null and goodsCd != ""'>
-			AND    G.GOODS_CD = #{goodsCd}
-			</if>
-			<if test='sizeCd != null and sizeCd != ""'>
-			AND    ODI.OPT_CD2 = #{sizeCd}
-			</if>
-			<if test='goodsNm != null and goodsNm != ""'>
-			AND    G.GOODS_NM = #{goodsNm}
-			</if>
-			<if test='recipNm != null and recipNm != ""'>
-			AND    DA.RECIP_NM = #{recipNm}
-			</if>
-			<if test='invoiceNo != null and invoiceNo != ""'>
-			AND    OD.INVOICE_NO = #{invoiceNo}
-			</if>
-			<if test='wdInvoiceSendYn != null and wdInvoiceSendYn == "Y"'>
-			AND    OD.INVOICE_SEND_YN = 'Y'
-			</if>
-			<if test='wdInvoiceSendYn != null and wdInvoiceSendYn == "N"'>
-			AND    OD.INVOICE_SEND_YN = 'N'
-			</if>
-			<if test='searchDateGb != null and searchDateGb == "ordDt"'>
-			AND    O.ORD_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
-			AND    O.ORD_DT <![CDATA[<]]> DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
-			</if>
-			<if test='searchDateGb != null and searchDateGb == "delvStdt"'>
-			AND    OD.DELV_STDT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
-			AND    OD.DELV_STDT <![CDATA[<]]> DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
-			</if>
-			<if test='searchDateGb != null and searchDateGb == "soldoutDt"'>
-			AND    OD.SOLDOUT_REG_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
-			AND    OD.SOLDOUT_REG_DT <![CDATA[<]]> DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
-			</if>
-		) X
+             , Z.ORD_DTL_NO DESC
+             , Z.ORD_DTL_ITEM_SQ DESC
 	</select>
 	
 	<!-- 주문상세 > 주문 정보 -->
@@ -604,12 +487,13 @@
 		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
 		ON     O.ORD_NO = P.ORD_NO
 		AND    P.PAY_GB = 'O'
+		AND    P.PAY_STAT = 'G016_30'
 		INNER  JOIN TB_DELIVERY_ADDR DA
 		ON     OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
 		LEFT   OUTER JOIN (
@@ -665,8 +549,9 @@
 		INNER  JOIN TB_GOODS G
 		ON     OFV.ITEM_CD = G.GOODS_CD 
 		WHERE 1=1
-		AND  OFV.ORD_NO = #{ordNo}
-		AND  OFV.DEL_YN = 'N'
+		AND    OFV.ORD_NO = #{ordNo}
+		AND    OFV.DEL_YN = 'N'
+		ORDER  BY OFV.REG_DT DESC
 	</select>
 	
 	<!-- 주문상세 > 배송정보 -->
@@ -711,6 +596,10 @@
 		     , 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 
@@ -720,6 +609,8 @@
 		FROM   TB_PAYMENT P
 		WHERE  1=1
 		AND    P.ORD_NO = #{ordNo}
+		AND    P.PAY_STAT = 'G016_30'
+		ORDER  BY P.REG_DT DESC
 	</select>
 	
 	<!-- 주문상세 > 배송비정보 -->
@@ -727,16 +618,16 @@
 		/* order.getDeliveryFeeList */
 		SELECT Z.*
 		FROM   (
-		SELECT DF.DELV_FEE_GB 
-		     , FN_GET_CODE_NM('G018', DF.DELV_FEE_GB) AS DELV_FEE_GB_NM
-		     , DF.DELV_FEE
-		     , DF.DELV_USAC_YN 
-		     , DATE_FORMAT(DF.DELV_USAC_DT,'%Y%m%d%H%i%S') AS DELV_USAC_DT 
-		     , DF.SUPPLY_COMP_CD 
-		     , DF.DELV_FEE_SQ 
-		FROM   TB_DELIVERY_FEE DF
-		WHERE  1=1
-		AND    DF.ORD_NO = #{ordNo}
+			SELECT DF.DELV_FEE_GB 
+			     , FN_GET_CODE_NM('G018', DF.DELV_FEE_GB) AS DELV_FEE_GB_NM
+			     , DF.DELV_FEE
+			     , DF.DELV_USAC_YN 
+			     , DATE_FORMAT(DF.DELV_USAC_DT,'%Y%m%d%H%i%S') AS DELV_USAC_DT 
+			     , DF.SUPPLY_COMP_CD 
+			     , DF.DELV_FEE_SQ 
+			FROM   TB_DELIVERY_FEE DF
+			WHERE  1=1
+			AND    DF.ORD_NO = #{ordNo}
 		) Z
 		GROUP  BY Z.DELV_FEE_GB 
 		     , Z.DELV_FEE_GB_NM
@@ -747,17 +638,18 @@
 		     , Z.DELV_FEE_SQ
 	</select>
 	
-	<!-- 주문상세 > 취소/반품/교환요청 정보 -->
+	<!-- 주문상세 > 취소 / 반품 / 교환 요청 정보 -->
 	<select id="getOrderChangeList" parameterType="Order" resultType="Order">
 		/* order.getOrderChangeList */
 		SELECT OCD.ORD_CHG_SQ
 		     , OC.CHG_GB
-		     , FN_GET_CODE_NM('G680', OC.CHG_GB) AS CHG_NM
+		     , FN_GET_CODE_NM('G680', OC.CHG_GB) AS CHG_GB_NM
 		     , OD.GOODS_CD
 		     , ODI.OPT_CD1
 		     , ODI.OPT_CD2
 		     , OCD.CHG_STAT 
 		     , FN_GET_CODE_NM('G685', OCD.CHG_STAT) AS CHG_STAT_NM
+		     , OCD.CHG_QTY
 		     , DATE_FORMAT(OCD.REG_DT,'%Y%m%d%H%i%S') AS REG_DT 
 		     , OC.CHG_REASON 
 		     , CASE WHEN OC.CHG_GB = 'G680_20' THEN FN_GET_CODE_NM('G686', OC.CHG_REASON)
@@ -782,6 +674,9 @@
 		ON     OD.ORD_DTL_NO = ODI.ORD_DTL_NO 
 		WHERE  1=1
 		AND    OD.ORD_NO = #{ordNo}
+		AND    OCD.DEL_YN = 'N'
+		ORDER  BY OC.REG_DT DESC
+		     , OCD.ORD_DTL_NO 
 	</select>
 	
 	<!-- 주문상세 > 환불정보 -->
@@ -790,12 +685,18 @@
 		SELECT P.PAY_MEANS
 		     , FN_GET_CODE_NM('G014', P.PAY_MEANS) AS PAY_MEANS_NM
 		     , P.CARD_NM
-		     , R.RA_BANK 
+		     , R.RA_BANK
+		     , CASE WHEN PAY_MEANS = 'G014_20' || PAY_MEANS = 'G014_10'
+		            THEN FN_GET_CODE_NM('G940', R.RA_BANK)
+		            ELSE P.CARD_NM
+		            END  CARD_NM
 		     , R.RA_NO
 		     , R.RA_NM 
 		     , R.REFUND_AMT 
-		     , P.UPD_DT
-		     , P.UPD_NO
+		     , DATE_FORMAT(P.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT 
+		     , (SELECT USER_NM
+		        FROM   TB_USER X
+		        WHERE  X.USER_NO = P.UPD_NO) AS UPD_NM
 		FROM   TB_REFUND R
 		INNER  JOIN TB_PAYMENT P
 		ON     R.ORD_CHG_SQ = P.ORD_CHG_SQ 
@@ -898,6 +799,7 @@
 		INNER  JOIN TB_PAYMENT P
 		ON     O.ORD_NO = P.ORD_NO 
 		AND    P.PAY_GB = 'O'
+		AND    P.PAY_STAT = 'G016_30'
 		INNER  JOIN TB_DELIVERY_ADDR DA
 		ON     OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ 
 		INNER  JOIN TB_DELIVERY_FEE DF		
@@ -962,6 +864,8 @@
 				, ORG_ORD_DTL_NO
 				, SUPPLY_COMP_CD
 				, GOODS_CD
+				, PRODUCT_NO
+				, PRODUCT_CODE
 				, FORMAL_GB
 				, GOODS_TYPE
 				, LIST_PRICE
@@ -1034,6 +938,8 @@
 				, ORG_ORD_DTL_NO
 				, SUPPLY_COMP_CD
 				, GOODS_CD
+				, PRODUCT_NO
+				, PRODUCT_CODE
 				, FORMAL_GB
 				, GOODS_TYPE
 				, LIST_PRICE
@@ -1705,7 +1611,17 @@
 			GROUP  BY OCD.ORD_DTL_NO
 		) OCD
 		ON     OD.ORD_DTL_NO = OCD.ORD_DTL_NO
-		INNER  JOIN TB_DELIVERY_FEE DF
+		INNER  JOIN (
+			SELECT X.SUPPLY_COMP_CD
+			     , X.DELV_FEE_CD
+			     , SUM(X.DELV_FEE) AS DELV_FEE
+			FROM   TB_DELIVERY_FEE X
+			WHERE  1=1
+			AND    X.ORD_NO = #{ordNo}
+			AND    X.DELV_FEE_GB = 'G018_10'
+			GROUP  BY X.SUPPLY_COMP_CD
+			        , X.DELV_FEE_CD
+		) DF
 		ON     OD.SUPPLY_COMP_CD = DF.SUPPLY_COMP_CD 
 		AND    OD.DELV_FEE_CD = DF.DELV_FEE_CD 
 		INNER  JOIN TB_DELV_FEE_POLICY DFP
@@ -1794,25 +1710,31 @@
 	<!-- 주문상세 > 주문취소신청 > 주문상세단품정보 수정 -->
 	<update id="updateOrderDetailItem" parameterType="Order">
 		/* Order.updateOrderDetailItem */
-		UPDATE TB_ORDER_DETAIL_ITEM
-		SET    ORD_AMT 				= ORD_AMT 				- #{cnclRtnAmt}
-		     , CNCL_RTN_AMT 		= CNCL_RTN_AMT 			+ #{cnclRtnAmt}
-		     , CPN1_DC_AMT 			= CPN1_DC_AMT 			- #{cpn1DcAmt}
-		     , TMTB1_DC_AMT 		= TMTB1_DC_AMT 			- #{tmtb1DcAmt}
-		     , TMTB2_DC_AMT 		= TMTB1_DC_AMT 			- #{tmtb2DcAmt}
-		     , GOODS_CPN_DC_AMT 	= GOODS_CPN_DC_AMT 		- #{goodsCpnDcAmt}
-		     , CART_CPN_DC_AMT 		= CART_CPN_DC_AMT 		- #{cartCpnDcAmt}
-		     , PNT_DC_AMT 			= PNT_DC_AMT 			- #{pntDcAmt}
-		     , PRE_PNT_DC_AMT 		= PRE_PNT_DC_AMT 		- #{prePntDcAmt}
-		     , SAVE_PNT_AMT 		= SAVE_PNT_AMT 			- #{savePntAmt}
-		     , REAL_ORD_AMT 		= REAL_ORD_AMT 			- #{realOrdAmt}
-		     , GFCD_USE_AMT 		= GFCD_USE_AMT 			- #{gfcdUseAmt}
-		     , UPD_NO 				= #{updNo}
-		     , UPD_DT 				= SYSDATE()
+		UPDATE TB_ORDER_DETAIL_ITEM ODI
+		INNER  JOIN TB_ORDER_DETAIL OD
+		ON     OD.ORD_DTL_NO = OD.ORD_DTL_NO
+		SET    ODI.ORD_DTL_STAT		= CASE WHEN OD.ORD_QTY > (OD.CNCL_RTN_QTY + #{ordCanChgQty})
+		                                   THEN ODI.ORD_DTL_STAT
+		                                   ELSE #{ordDtlStat}
+		                                    END
+		     , ODI.ORD_AMT 			= ODI.ORD_AMT 				- #{cnclRtnAmt}
+		     , ODI.CNCL_RTN_AMT 	= ODI.CNCL_RTN_AMT 			+ #{cnclRtnAmt}
+		     , ODI.CPN1_DC_AMT 		= ODI.CPN1_DC_AMT 			- #{cpn1DcAmt}
+		     , ODI.TMTB1_DC_AMT 	= ODI.TMTB1_DC_AMT 			- #{tmtb1DcAmt}
+		     , ODI.TMTB2_DC_AMT 	= ODI.TMTB1_DC_AMT 			- #{tmtb2DcAmt}
+		     , ODI.GOODS_CPN_DC_AMT = ODI.GOODS_CPN_DC_AMT 		- #{goodsCpnDcAmt}
+		     , ODI.CART_CPN_DC_AMT 	= ODI.CART_CPN_DC_AMT 		- #{cartCpnDcAmt}
+		     , ODI.PNT_DC_AMT 		= ODI.PNT_DC_AMT 			- #{pntDcAmt}
+		     , ODI.PRE_PNT_DC_AMT 	= ODI.PRE_PNT_DC_AMT 		- #{prePntDcAmt}
+		     , ODI.SAVE_PNT_AMT 	= ODI.SAVE_PNT_AMT 			- #{savePntAmt}
+		     , ODI.REAL_ORD_AMT 	= ODI.REAL_ORD_AMT 			- #{realOrdAmt}
+		     , ODI.GFCD_USE_AMT 	= ODI.GFCD_USE_AMT 			- #{gfcdUseAmt}
+		     , ODI.UPD_NO 			= #{updNo}
+		     , ODI.UPD_DT 			= SYSDATE()
 		WHERE  1=1
-		AND    ORD_NO 				= #{ordNo} 
-		AND    ORD_DTL_NO 			= #{ordDtlNo} 
-		AND    ORD_DTL_ITEM_SQ 		= #{ordDtlItemSq}
+		AND    ODI.ORD_NO 			= #{ordNo} 
+		AND    ODI.ORD_DTL_NO 		= #{ordDtlNo} 
+		AND    ODI.ORD_DTL_ITEM_SQ 	= #{ordDtlItemSq}
 	</update>
 	
 	<!-- 주문상세 > 주문취소신청 > 주문상세단품정보 이력 등록 -->
@@ -1889,29 +1811,446 @@
 		AND    ORD_DTL_ITEM_SQ = #{ordDtlItemSq}
 	</insert>
 	
+	<!-- 주문상세이력 생성-->
+	<insert id="createOrderDetailHstCnclRtn" parameterType="Order">
+		/* Order.createOrderDetailHstCnclRtn */
+		INSERT INTO TB_ORDER_DETAIL_HST (
+				ORD_DTL_NO
+				, ORD_NO
+				, ORD_EXCH_GB
+				, ORD_DTL_STAT
+				, ORG_ORD_DTL_NO
+				, SUPPLY_COMP_CD
+				, GOODS_CD
+				, PRODUCT_NO
+				, PRODUCT_CODE
+				, FORMAL_GB
+				, GOODS_TYPE
+				, LIST_PRICE
+				, CURR_PRICE
+				, DC_RATE
+				, OPT_ADD_PRICE
+				, ORD_QTY
+				, ORD_AMT
+				, CNCL_RTN_QTY
+				, CNCL_RTN_AMT
+				, CPN1_CPN_SQ
+				, CPN1_DC_AMT
+				, TMTB1_SQ
+				, TMTB1_DC_AMT
+				, TMTB2_SQ
+				, TMTB2_DC_AMT
+				, GOODS_CPN_SQ
+				, GOODS_CPN_DC_AMT
+				, CART_CPN_SQ
+				, CART_CPN_DC_AMT
+				, BURDEN_RATE
+				, PNT_DC_AMT
+				, PRE_PNT_DC_AMT
+				, SAVE_PNT_AMT
+				, REAL_ORD_AMT
+				, GFCD_USE_AMT
+				, VENDOR_ID
+				, EXTMALL_ID
+				, AGENT_ORDER_ID
+				, EXTMALL_ORDER_ID
+				, CHANGABLE_YN
+				, CHANGE_FEE_FREE_YN
+				, RETURNABLE_YN
+				, RETURN_FEE_FREE_YN
+				, SOLDOUT_YN
+				, SOLDOUT_MEMO
+				, SOLDOUT_REG_NO
+				, SOLDOUT_REG_DT
+				, DELV_ADDR_SQ
+				, DELV_FEE_CD
+				, SHOT_DELV_YN
+				, GIFT_PACK_YN
+				, MAKE_GOODS_YN
+				, ENTRY_NO
+				, DELV_LOC_CD
+				, DELV_ASSIGN_DT
+				, DELV_ASSIGN_STAT
+				, DSTRBT_NOTE
+				, DELV_STDT
+				, DELV_EDDT
+				, SHIP_COMP_CD
+				, INVOICE_NO
+				, INVOICE_SEND_YN
+				, SELL_STORE_CD
+				, SELL_FEE_RATE
+				, AF_LINK_CD
+				, ITHR_CD
+				, CONTENTS_LOC
+				, PLAN_DTL_SQ
+				, SOCIAL_SQ
+				, REG_NO
+				, REG_DT
+				, UPD_NO
+				, UPD_DT
+		)
+		SELECT OD.ORD_DTL_NO
+			 , OD.ORD_NO
+			 , OD.ORD_EXCH_GB
+			 , #{ordDtlStat}
+			 , OD.ORG_ORD_DTL_NO
+			 , OD.SUPPLY_COMP_CD
+			 , OD.GOODS_CD
+			 , OD.PRODUCT_NO
+			 , OD.PRODUCT_CODE
+			 , OD.FORMAL_GB
+			 , OD.GOODS_TYPE
+			 , OD.LIST_PRICE
+			 , OD.CURR_PRICE
+			 , OD.DC_RATE
+			 , OD.OPT_ADD_PRICE
+			 , OD.ORD_QTY - #{ordCanChgQty}
+			 , OD.ORD_AMT - Z.ORD_AMT
+			 , #{ordCanChgQty}
+			 , OD.ORD_AMT - Z.CNCL_RTN_AMT
+			 , OD.CPN1_CPN_SQ
+			 , OD.CPN1_DC_AMT - Z.CPN1_DC_AMT
+			 , OD.TMTB1_SQ
+			 , OD.TMTB1_DC_AMT - Z.TMTB1_DC_AMT
+			 , OD.TMTB2_SQ
+			 , OD.TMTB2_DC_AMT - Z.TMTB2_DC_AMT
+			 , OD.GOODS_CPN_SQ
+			 , OD.GOODS_CPN_DC_AMT - Z.GOODS_CPN_DC_AMT
+			 , OD.CART_CPN_SQ
+			 , OD.CART_CPN_DC_AMT - Z.CART_CPN_DC_AMT
+			 , OD.BURDEN_RATE
+			 , OD.PNT_DC_AMT - Z.PNT_DC_AMT
+			 , OD.PRE_PNT_DC_AMT - Z.PRE_PNT_DC_AMT
+			 , OD.SAVE_PNT_AMT - Z.SAVE_PNT_AMT
+			 , Z.REAL_ORD_AMT
+			 , OD.GFCD_USE_AMT - Z.GFCD_USE_AMT
+			 , OD.VENDOR_ID
+			 , OD.EXTMALL_ID
+			 , OD.AGENT_ORDER_ID
+			 , OD.EXTMALL_ORDER_ID
+			 , OD.CHANGABLE_YN
+			 , OD.CHANGE_FEE_FREE_YN
+			 , OD.RETURNABLE_YN
+			 , OD.RETURN_FEE_FREE_YN
+			 , OD.SOLDOUT_YN
+			 , OD.SOLDOUT_MEMO
+			 , OD.SOLDOUT_REG_NO
+			 , OD.SOLDOUT_REG_DT
+			 , OD.DELV_ADDR_SQ
+			 , OD.DELV_FEE_CD
+			 , OD.SHOT_DELV_YN
+			 , OD.GIFT_PACK_YN
+			 , OD.MAKE_GOODS_YN
+			 , OD.ENTRY_NO
+			 , OD.DELV_LOC_CD
+			 , OD.DELV_ASSIGN_DT
+			 , OD.DELV_ASSIGN_STAT
+			 , OD.DSTRBT_NOTE
+			 , OD.DELV_STDT
+			 , OD.DELV_EDDT
+			 , OD.SHIP_COMP_CD
+			 , OD.INVOICE_NO
+			 , OD.INVOICE_SEND_YN
+			 , OD.SELL_STORE_CD
+			 , OD.SELL_FEE_RATE
+			 , OD.AF_LINK_CD
+			 , OD.ITHR_CD
+			 , OD.CONTENTS_LOC
+			 , OD.PLAN_DTL_SQ
+			 , OD.SOCIAL_SQ
+			 , #{regNo} AS REG_ID
+			 , CURRENT_TIMESTAMP() AS REG_DT
+			 , #{regNo} AS REG_ID
+			 , CURRENT_TIMESTAMP() AS UPD_DT
+		FROM   TB_ORDER_DETAIL OD
+		INNER  JOIN (
+		SELECT ODI.ORD_DTL_NO
+		     , SUM(ODI.ORD_AMT) AS ORD_AMT
+		     , SUM(ODI.CNCL_RTN_AMT) AS CNCL_RTN_AMT
+		     , SUM(ODI.CPN1_DC_AMT) AS CPN1_DC_AMT
+		     , SUM(ODI.TMTB1_DC_AMT) AS TMTB1_DC_AMT
+		     , SUM(ODI.TMTB2_DC_AMT) AS TMTB2_DC_AMT
+		     , SUM(ODI.GOODS_CPN_DC_AMT) AS GOODS_CPN_DC_AMT
+		     , SUM(ODI.CART_CPN_DC_AMT) AS CART_CPN_DC_AMT
+		     , SUM(ODI.PNT_DC_AMT) AS PNT_DC_AMT
+		     , SUM(ODI.PRE_PNT_DC_AMT) AS PRE_PNT_DC_AMT
+		     , SUM(ODI.SAVE_PNT_AMT) AS SAVE_PNT_AMT
+		     , SUM(ODI.REAL_ORD_AMT) AS REAL_ORD_AMT
+		     , SUM(ODI.GFCD_USE_AMT) AS GFCD_USE_AMT
+		FROM   TB_ORDER_DETAIL_ITEM ODI
+		WHERE  ODI.ORD_DTL_NO = #{ordDtlNo}
+		GROUP  BY ODI.ORD_DTL_NO
+		) Z
+		ON    OD.ORD_DTL_NO = Z.ORD_DTL_NO
+		AND   OD.ORD_DTL_NO = #{ordDtlNo}
+	</insert>
+	
 	<!-- 주문상세 > 주문취소신청 > 주문상세정보 수정 -->
 	<update id="updateOrderDetail" parameterType="Order">
 		/* Order.updateOrderDetail */
-		UPDATE TB_ORDER_DETAIL
-		SET    ORD_AMT 				= ORD_AMT 				- #{cnclRtnAmt}
-		     , CNCL_RTN_AMT 		= CNCL_RTN_AMT 			+ #{cnclRtnAmt}
-		     , CPN1_DC_AMT 			= CPN1_DC_AMT 			- #{cpn1DcAmt}
-		     , TMTB1_DC_AMT 		= TMTB1_DC_AMT 			- #{tmtb1DcAmt}
-		     , TMTB2_DC_AMT 		= TMTB1_DC_AMT 			- #{tmtb2DcAmt}
-		     , GOODS_CPN_DC_AMT 	= GOODS_CPN_DC_AMT 		- #{goodsCpnDcAmt}
-		     , CART_CPN_DC_AMT 		= CART_CPN_DC_AMT 		- #{cartCpnDcAmt}
-		     , PNT_DC_AMT 			= PNT_DC_AMT 			- #{pntDcAmt}
-		     , PRE_PNT_DC_AMT 		= PRE_PNT_DC_AMT 		- #{prePntDcAmt}
-		     , SAVE_PNT_AMT 		= SAVE_PNT_AMT 			- #{savePntAmt}
-		     , REAL_ORD_AMT 		= REAL_ORD_AMT 			- #{realOrdAmt}
-		     , GFCD_USE_AMT 		= GFCD_USE_AMT 			- #{gfcdUseAmt}
-		     , UPD_NO 				= #{updNo}
-		     , UPD_DT 				= SYSDATE()
+		UPDATE TB_ORDER_DETAIL OD
+		INNER  JOIN (
+		SELECT ODI.ORD_DTL_NO
+		     , SUM(ODI.ORD_AMT) 			AS ORD_AMT
+		     , SUM(ODI.CNCL_RTN_AMT) 		AS CNCL_RTN_AMT
+		     , SUM(ODI.CPN1_DC_AMT) 		AS CPN1_DC_AMT
+		     , SUM(ODI.TMTB1_DC_AMT) 		AS TMTB1_DC_AMT
+		     , SUM(ODI.TMTB2_DC_AMT) 		AS TMTB2_DC_AMT 
+		     , SUM(ODI.GOODS_CPN_DC_AMT) 	AS GOODS_CPN_DC_AMT
+		     , SUM(ODI.CART_CPN_DC_AMT) 	AS CART_CPN_DC_AMT 
+		     , SUM(ODI.PNT_DC_AMT) 			AS PNT_DC_AMT 
+		     , SUM(ODI.PRE_PNT_DC_AMT) 		AS PRE_PNT_DC_AMT
+		     , SUM(ODI.SAVE_PNT_AMT) 		AS SAVE_PNT_AMT 
+		     , SUM(ODI.REAL_ORD_AMT) 		AS REAL_ORD_AMT 
+		     , SUM(ODI.GFCD_USE_AMT) 		AS GFCD_USE_AMT 
+		FROM   TB_ORDER_DETAIL_ITEM ODI
+		WHERE  ODI.ORD_NO = #{ordNo} 
+		AND    ODI.ORD_DTL_NO = #{ordDtlNo}
+		GROUP  BY ODI.ORD_DTL_NO
+		) Z
+		ON     OD.ORD_DTL_NO 			= Z.ORD_DTL_NO
+		SET    OD.ORD_DTL_STAT			= CASE WHEN OD.ORD_QTY > (OD.CNCL_RTN_QTY + #{ordCanChgQty})
+		                                       THEN OD.ORD_DTL_STAT
+		                                       ELSE #{ordDtlStat}
+		                                        END
+		     , OD.CNCL_RTN_QTY			= OD.CNCL_RTN_QTY + #{ordCanChgQty}
+		     , OD.ORD_AMT 				= Z.ORD_AMT
+		     , OD.CNCL_RTN_AMT  		= Z.CNCL_RTN_AMT
+		     , OD.CPN1_DC_AMT 			= Z.CPN1_DC_AMT
+		     , OD.TMTB1_DC_AMT 			= Z.TMTB1_DC_AMT
+		     , OD.TMTB2_DC_AMT 			= Z.TMTB2_DC_AMT
+		     , OD.GOODS_CPN_DC_AMT 		= Z.GOODS_CPN_DC_AMT
+		     , OD.CART_CPN_DC_AMT 		= Z.CART_CPN_DC_AMT
+		     , OD.PNT_DC_AMT 			= Z.PNT_DC_AMT
+		     , OD.PRE_PNT_DC_AMT 		= Z.PRE_PNT_DC_AMT
+		     , OD.SAVE_PNT_AMT 			= Z.SAVE_PNT_AMT
+		     , OD.REAL_ORD_AMT 			= Z.REAL_ORD_AMT
+		     , OD.GFCD_USE_AMT 			= Z.GFCD_USE_AMT
 		WHERE  1=1
-		AND    ORD_NO 				= #{ordNo} 
-		AND    ORD_DTL_NO 			= #{ordDtlNo} 
-		AND    ORD_DTL_ITEM_SQ 		= #{ordDtlItemSq}
+		AND    OD.ORD_NO = #{ordNo}
+		AND    OD.ORD_DTL_NO = #{ordDtlNo}
 	</update>
+		
+	<!-- 주문상세 > 주문취소신청 > 주문환불 결제 정보 등록 -->
+	<insert id="createPayment" parameterType="Order" keyProperty="paySq">
+		/* Order.createPayment */
+		INSERT INTO TB_PAYMENT (
+			ORD_NO
+			, PAY_DT
+			, PAY_MEANS
+			, PAY_AMT
+			, PG_CPN_AMT
+			, NPAY_PNT_AMT
+			, PAY_GB
+			, PAY_STAT
+			, PG_GB
+			, PG_TID
+			, PG_TRADE_NO
+			, PG_SHOP_ID
+			, CARD_TYPE
+			, CARD_KIND
+			, CARD_BANK
+			, CARD_NM
+			, CARD_MIPS
+			, CARD_PCABLE_YN
+			, VA_NO
+			, VA_NM
+			, VA_BANK
+			, VA_DEADLINE
+			, TELECOM
+			, ESCROW_YN
+			, ORD_CHG_SQ
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+		) 
+		SELECT ORD_NO
+		 	 , SYSDATE()
+			 , PAY_MEANS
+			 , #{payAmt}
+			 , #{pgCpnAmt}
+			 , #{npayPntAmt}
+			 , PAY_GB
+			 , #{payStat}
+			 , PG_GB
+			 , #{pgTid}
+			 , #{pgTradeNo}
+			 , PG_SHOP_ID
+			 , CARD_TYPE
+			 , CARD_KIND
+			 , CARD_BANK
+			 , CARD_NM
+			 , CARD_MIPS
+			 , CARD_PCABLE_YN
+			 , #{vaNo}
+			 , #{vaNm}
+			 , #{vaBank}
+			 , #{vaDeadline}
+			 , TELECOM
+			 , ESCROW_YN
+			 , #{ordChgSq}
+			 , #{regNo}
+			 , SYSDATE()
+			 , #{updNo}
+			 , SYSDATE()
+		FROM   TB_PAYMENT 
+		WHERE  1=1
+		AND    ORD_NO = #{ordNo}
+		AND    PAY_GB = 'O'
+		AND    PAY_STAT = 'G016_30'
+	</insert>
+	
+	<!-- 주문상세 > 주문취소신청 > 주문환불 금액 정보 등록 -->
+	<insert id="createRefund" parameterType="Order">
+		/* Order.createRefund */
+		INSERT INTO TB_REFUND (
+			ORD_NO
+			, PAY_SQ
+			, ORD_CHG_SQ
+			, REFUND_AMT
+			, RA_NO
+			, RA_BANK
+			, RA_NM
+			, RF_CPN1_AMT
+			, RF_TMTB1_AMT
+			, RF_TMTB2_AMT
+			, RF_GOODS_CPN_AMT
+			, RF_CART_CPN_AMT
+			, RF_PNT_AMT
+			, RF_PRE_PNT_AMT
+			, RF_GFCD_USE_AMT
+			, REG_NO
+			, REG_DT
+		) VALUES (
+			#{ordNo}
+			, #{paySq}
+			, #{ordChgSq}
+			, #{refundAmt}
+			, #{raNo}
+			, #{raBank}
+			, #{raNm}
+			, #{rfCpn1Amt}
+			, #{rfTmtb1Amt}
+			, #{rfTmtb2Amt}
+			, #{rfGoodsCpnAmt}
+			, #{rfCartCpnAmt}
+			, #{rfPntAmt}
+			, #{rfPrePntAmt}
+			, #{rfGfcdUseAmt}
+			, #{regNo}
+			, SYSDATE()
+		)
+	</insert>
+	
+	<!-- 주문상세 > 주문취소신청 > 주문 추가 배송 금액 등록-->
+	<insert id="createDeliveryFee" parameterType="Order">
+		/* Order.createDeliveryFee */
+		INSERT INTO TB_DELIVERY_FEE ( 
+			PAY_SQ
+			, ORD_NO
+			, DELV_FEE_GB
+			, DELV_FEE_CD
+			, DELV_FEE
+			, DELV_CPN_SQ
+			, DELV_CPN_DC_AMT
+			, REAL_DELV_AMT
+			, ORD_CHG_SQ
+			, SUPPLY_COMP_CD
+			, DELV_USAC_YN
+			, DELV_USAC_DT
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+		) VALUES (
+			#{paySq}
+			, #{ordNo}
+			, #{delvFeeGb}
+			, #{delvFeeCd}
+			, #{delvFee}
+			, #{delvCpnSq}
+			, #{delvCpnDcAmt}
+			, #{realDelvAmt}
+			, #{ordChgSq}
+			, #{supplyCompCd}
+			, 'N'
+			, null
+			, #{regNo}
+			, SYSDATE()
+			, #{updNo}
+			, SYSDATE()
+		)
+	</insert>
+	
+	<!-- 고객환불계좌정보 조회 -->
+	<select id="getRefundAccount" parameterType="Order" resultType="Order">
+		/* Order.getRefundAccount */
+		SELECT Z.ACCOUNT_NO
+		     , Z.ACCOUNT_NM
+		     , Z.BANK_CD
+		     , FN_GET_CODE_NM('G940', Z.BANK_CD) AS BANK_NM
+		     , Z.DEFAULT_YN
+		     , Z.REG_DT
+		FROM   (
+			SELECT CA.ACCOUNT_NO
+			     , CA.ACCOUNT_NM 
+			     , CA.BANK_CD
+			     , CA.DEFAULT_YN
+			     , CA.REG_DT
+			FROM   TB_ORDER O
+			LEFT   OUTER JOIN TB_CUST_ACCOUNT CA 
+			ON     O.CUST_NO = CA.CUST_NO
+			WHERE  1=1
+			AND    O.CUST_NO = 0
+			GROUP  BY CA.ACCOUNT_NO
+			     , CA.ACCOUNT_NM 
+			     , CA.BANK_CD
+			     , CA.DEFAULT_YN
+			ORDER  BY CA.DEFAULT_YN DESC
+			     , CA.REG_DT DESC
+		) Z
+	</select>
+	
+	<!-- 고객환불계좌정보 체크 -->
+	<select id="getRefundAccountCheck" parameterType="Order" resultType="int">
+		/* Order.getRefundAccountCheck */
+		SELECT COUNT(1)
+		FROM   TB_CUST_ACCOUNT CA
+		WHERE  1=1
+		AND    CA.ACCOUNT_NO = ${accountNo}
+		AND    CA.ACCOUNT_NM = #{accountNm}
+		AND    CA.BANK_CD = #{bankCd}
+		AND    CA.DEL_YN = 'N'
+	</select>
+	
+	<!-- 고객환불계좌정보 등록 -->
+	<insert id="saveRefundAccount" parameterType="Order">
+		/* Order.saveRefundAccount */
+		INSERT INTO TB_CUST_ACCOUNT (
+			CUST_NO
+			, BANK_CD
+			, ACCOUNT_NO
+			, ACCOUNT_NM
+			, DEFAULT_YN
+			, DEL_YN
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+		) VALUES (
+			#{custNo}
+			, #{bankCd}
+			, #{accountNo}
+			, #{accountNm}
+			, 'N'
+			, 'N'
+			, #{regNo}
+			, SYSDATE()
+			, #{updNo}
+			, SYSDATE()
+		)
+	</insert>
 	
 </mapper>
 
@@ -1923,3 +2262,9 @@
 
 
 
+
+
+
+
+
+

+ 296 - 0
style24.admin/src/main/webapp/WEB-INF/views/envset/CustomerGradePolicyForm.html

@@ -0,0 +1,296 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+	<!--
+ *******************************************************************************
+ * @source  : CustomerGradePolicyForm.html
+ * @desc    : 회원등급정책관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.06   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/envset/customer/grade/policy/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>사이트</th>
+						<td>
+							<select name="siteCd">
+								<option th:if="${siteList}" th:each="oneData, status : ${siteList}"th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+		
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham lh70"></div>
+		</div>
+		
+		<!-- 등록/수정 -->
+		<div class="panelStyle">
+			<form id="detailForm" name="detailForm" action="#" th:action="@{'/envset/customer/grade/policy/create'}">
+				<table class="frmStyle" aria-describedby="등록/상세폼">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>사이트<em class="required" title="필수"></em></th>
+						<td>
+							<select name="siteCd" required="required" data-valid-name="사이트">
+								<option value="">[선택]</option>
+								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>회원등급<em class="required" title="필수"></em></th>
+						<td>
+							<select name="gradeCd" required="required" data-valid-name="회원등급">
+								<option value="">[선택]</option>
+								<option th:if="${custGradeList}" th:each="oneData, status : ${custGradeList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th rowspan="2">아이콘명<em class="required" title="필수"></em></th>
+						<td colspan="3" rowspan="2">
+							<span class="badgeLevel black marR10" id="iconPrefix"></span>
+							<input type="text" name="iconNm" class="w50" maxlength="20" required="required" data-valid-type="alphaNumeric" data-valid-name="아이콘명" onkeyup="$(this).val($(this).val().toUpperCase());"/>
+							<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>프론트 표기 접두사</span>
+						</td>
+					</tr>
+					<tr>
+						<th>등급산정기간<em class="required" title="필수"></em></th>
+						<td colspan="5">
+							전월 기준 최근 <input type="text" name="calMonths" class="w50 aR" maxlength="2" value="3" required="required" data-valid-type="integer" data-valid-name="등급산정기간"/> 개월
+						</td>
+					</tr>
+					<tr>
+						<th>승급조건<em class="required" title="필수"></em></th>
+						<td colspan="7">
+							구매금액(<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>쿠폰할인, 포인트할인, 배송비, 취소/반품내역을 반영한 실결제금액</span>)
+							<input type="text" name="minBuyAmt" class="w100 aR" maxlength="10" value="0" required="required" data-valid-type="integer" data-valid-name="구매금액"/>원 <span class="cRed">이상</span>
+							<span class="infoTxt cRed"><strong>또는</strong></span>
+							주문당 <input type="text" name="buyExceptAmt" class="w100 aR" maxlength="10" value="0" required="required" data-valid-type="integer" data-valid-name="구매건수제외조건"/>원 <span class="cRed">미만 구매건을 제외</span>한 구매건수(<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>취소를 반영한 주문건수</span>)
+							<input type="text" name="minBuyCnt" class="w50 aR" maxlength="2" value="0" required="required" data-valid-type="integer" data-valid-name="구매건수"/>건 <span class="cRed">이상</span>
+						</td>
+					</tr>
+					<tr>
+						<th>혜택쿠폰1</th>
+						<td colspan="3">
+							<input type="text" class="w300" name="gradeCpnNm1" onkeypress="if (window.event.keyCode == 13) { fnOpenCouponRetrievePopup('input[name=gradeCpnId1]', 'input[name=gradeCpnNm1]'); }"/>
+							<button type="button" class="btn icn" onclick="fnOpenCouponRetrievePopup('input[name=gradeCpnId1]', 'input[name=gradeCpnNm1]');"><i class="fa fa-search cpn" aria-hidden="true"></i></button>
+							<input name="gradeCpnId1" type="text" class="w100" maxlength="20" readonly="readonly"/>
+							<button type="button" class="btn icn" onclick="$('input[name=gradeCpnId1], input[name=gradeCpnNm1]').val('');"><i class="fa fa-eraser" aria-hidden="true"></i></button>
+						</td>
+						<th>혜택쿠폰2</th>
+						<td colspan="3">
+							<input type="text" class="w300" name="gradeCpnNm2" onkeypress="if (window.event.keyCode == 13) { fnOpenCouponRetrievePopup('input[name=gradeCpnId2]', 'input[name=gradeCpnNm2]'); }"/>
+							<button type="button" class="btn icn" onclick="fnOpenCouponRetrievePopup('input[name=gradeCpnId2]', 'input[name=gradeCpnNm2]');"><i class="fa fa-search cpn" aria-hidden="true"></i></button>
+							<input name="gradeCpnId2" type="text" class="w100" maxlength="20"  readonly="readonly"/>
+							<button type="button" class="btn icn" onclick="$('input[name=gradeCpnId2], input[name=gradeCpnNm2]').val('');"><i class="fa fa-eraser" aria-hidden="true"></i></button>
+						</td>
+					</tr>
+					<tr>
+						<th>혜택쿠폰3</th>
+						<td colspan="3">
+							<input type="text" class="w300" name="gradeCpnNm3" onkeypress="if (window.event.keyCode == 13) { fnOpenCouponRetrievePopup('input[name=gradeCpnId3]', 'input[name=gradeCpnNm3]'); }"/>
+							<button type="button" class="btn icn" onclick="fnOpenCouponRetrievePopup('input[name=gradeCpnId3]', 'input[name=gradeCpnNm3]');"><i class="fa fa-search cpn" aria-hidden="true"></i></button>
+							<input name="gradeCpnId3" type="text" class="w100" maxlength="20"  readonly="readonly"/>
+							<button type="button" class="btn icn" onclick="$('input[name=gradeCpnId3], input[name=gradeCpnNm3]').val('');"><i class="fa fa-eraser" aria-hidden="true"></i></button>
+						</td>
+						<th>표시순서<i class="required" title="필수" aria-hidden="true"></i></th>
+						<td>
+							<input type="text" class="w100 aR" name="dispOrd" placeholder="" maxlength="5" required="required" data-valid-type="numeric" data-valid-name="표시순서" />
+						</td>
+						<th>사용여부</th>
+						<td>
+							<input type="hidden" name="useYn" value="Y"/>
+							<label class="chkBox checked"><input type="checkbox" name="chkUseYn" checked="checked"/>사용</label>
+						</td>
+					</tr>
+				</table>
+			</form>
+			
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
+					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+		</div>
+		<!-- 등록/수정 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var siteList = gagajf.convertToArray([[${siteList}]]);
+	var custGradeList = gagajf.convertToArray([[${custGradeList}]]);
+
+	var columnDefs = [
+		{
+			headerName: "사이트", field: "siteCd", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.lookupValue(siteList, params.value); }
+		},
+		{
+			headerName: "회원등급", field: "gradeCd", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { return '<a href="javascript:void(0);">' + gagaAgGrid.lookupValue(custGradeList, params.value) + '</a>'; }
+		},
+		{
+			headerName: "아이콘명", field: "iconNm", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) { return '<span class="badgeLevel black">' + params.value + '</span>' }
+		},
+		{
+			headerName: "등급산정기간", field: "calMonths", width: 180, cellClass: 'text-center',
+			cellRenderer: function(params) { return '전월 기준 최근 ' + gagaAgGrid.toAddComma(params.value) + '개월'; }
+		},
+		{
+			headerName: "승급조건", field: "upgradeCondition", width: 500, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				let condition = '';
+				if (params.data.minBuyAmt > 0) condition += '구매금액 <span class="cRed">' + gagaAgGrid.toAddComma(params.data.minBuyAmt) + '</span>원 이상';
+				if (params.data.minBuyAmt > 0) condition += ' 또는 ';
+				condition += '구매건수 <span class="cRed">' + gagaAgGrid.toAddComma(params.data.minBuyCnt) + '</span>건 이상';
+				if (params.data.minBuyCnt == 0) condition += ' (즉, 미구매)';
+				if (params.data.buyExceptAmt > 0) condition += ' (<span class="cRed">' + gagaAgGrid.toAddComma(params.data.buyExceptAmt) + '</span>원 미만 구매건 제외)';
+				return condition;
+			}
+		},
+		{headerName: "구매금액", field: "minBuyAmt", width: 150, cellClass: 'text-right', hide: true},
+		{headerName: "구매건수", field: "minBuyCnt", width: 150, cellClass: 'text-right', hide: true},
+		{headerName: "구매건수제외조건", field: "buyExceptAmt", width: 150, cellClass: 'text-right', hide: true},
+		{headerName: "등급쿠폰ID1", field: "gradeCpnId1", width: 120, cellClass: 'text-center', hide: true},
+		{headerName: "등급쿠폰명1", field: "gradeCpnNm1", width: 200, hide: true},
+		{headerName: "등급쿠폰ID2", field: "gradeCpnId2", width: 120, cellClass: 'text-center', hide: true},
+		{headerName: "등급쿠폰명2", field: "gradeCpnNm2", width: 200, hide: true},
+		{headerName: "등급쿠폰ID3", field: "gradeCpnId3", width: 120, cellClass: 'text-center', hide: true},
+		{headerName: "등급쿠폰명3", field: "gradeCpnNm3", width: 200, hide: true},
+		{headerName: "표시순서", field: "dispOrd", width: 80, cellClass: 'text-center'},
+		{headerName: "사용여부", field: "useYn", width: 80, cellClass: 'text-center'},
+		{headerName: "수정자", field: "updNm", width: 80, cellClass: 'text-center'},
+		{
+			headerName: '수정일시', field: 'updDt', width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		}
+	];
+
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 이미지가 있을 경우 높이 지정
+	gridOptions.rowHeight = 70;
+	
+	// 셀 클릭 이벤트
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field != 'gradeCd')
+			return;
+		
+		$('#detailForm select[name=siteCd]').val(event.data.siteCd);
+		$('#detailForm select[name=gradeCd]').val(event.data.gradeCd);
+		$('#detailForm input[name=iconNm]').val(event.data.iconNm);
+		$('#iconPrefix').html(event.data.iconNm);
+		$('#detailForm input[name=calMonths]').val(event.data.calMonths);
+		$('#detailForm input[name=minBuyAmt]').val(event.data.minBuyAmt.addComma());
+		$('#detailForm input[name=minBuyCnt]').val(event.data.minBuyCnt);
+		$('#detailForm input[name=buyExceptAmt]').val(event.data.buyExceptAmt.addComma());
+		$('#detailForm input[name=gradeCpnId1]').val(event.data.gradeCpnId1);
+		$('#detailForm input[name=gradeCpnNm1]').val(event.data.gradeCpnNm1);
+		$('#detailForm input[name=gradeCpnId2]').val(event.data.gradeCpnId2);
+		$('#detailForm input[name=gradeCpnNm2]').val(event.data.gradeCpnNm2);
+		$('#detailForm input[name=gradeCpnId3]').val(event.data.gradeCpnId3);
+		$('#detailForm input[name=gradeCpnNm3]').val(event.data.gradeCpnNm3);
+		$('#detailForm input[name=dispOrd]').val(event.data.dispOrd);
+		
+		if (event.data.useYn == 'Y') {
+			$("#detailForm input:checkbox[name=chkUseYn]").prop('checked', true);
+			$("#detailForm input:checkbox[name=chkUseYn]").parent().addClass('checked');
+		} else {
+			$("#detailForm input:checkbox[name=chkUseYn]").prop('checked', false);
+			$("#detailForm input:checkbox[name=chkUseYn]").parent().removeClass('checked');
+		}
+	}
+
+	// 검색
+	$('#btnSearch').on('click', function() {
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+	
+	// 쿠폰조회 팝업
+	var fnOpenCouponRetrievePopup = function(strReturnCode, strReturnName) {
+		var oParam = new Object();
+		oParam.returnCode = strReturnCode;
+		oParam.returnName = strReturnName;
+		cfnOpenCouponRetrievePopup($(strReturnName).val(), oParam);
+	}
+	
+	// 신규
+	$('#btnNew').on('click', function() {
+		$('#detailForm')[0].reset();
+		$('#iconPrefix').html('');
+		$('#detailForm select[name=siteCd]').focus();
+	});
+
+	// 저장
+	$("#btnSave").on("click", function() {
+		// 필수값 체크
+		if (!gagajf.validation('#detailForm'))
+			return false;
+
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				$('#detailForm input[name=useYn]').val($('#detailForm input:checkbox[name=chkUseYn]').is(':checked') ? 'Y' : 'N');
+				
+				gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {
+					$('btnNew').click();
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+
+	$(document).ready(function() {
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 4 - 4
style24.admin/src/main/webapp/WEB-INF/views/marketing/MorebetterListForm.html

@@ -89,7 +89,7 @@
 				</ul>
 				<div class="panelBar">
 					<div class="right">
-						<button type="button" class="btn btn-info btn-lg" id="btnFreeGoodsRegi" >프로모션등록</button>
+						<button type="button" class="btn btn-info btn-lg" id="btnMorebetterReg" >다다익선 등록</button>
 					</div>
 				</div>
 				<!-- 검색결과 영역 -->
@@ -103,7 +103,7 @@
 	var columnDefs = [];
 	columnDefs = [
 		{headerName: "프로모션ID", field: "tmtbSq", width: 80, cellClass: 'text-center'},
-		{headerName: "프로모션명", field: "tmtbNm", width: 130, cellClass: 'text-center'},
+		{headerName: "프로모션명", field: "tmtbNm", width: 200, cellClass: 'text-center'},
 		{headerName: "상태", field: "tmtbStat", width: 140, cellClass: 'text-center'},
 		{headerName: "시작일", field: "tmtbStdt", width: 140, cellClass: 'text-center'},
 		{headerName: "종료일", field: "tmtbEddt", width: 140, cellClass: 'text-center'},
@@ -205,8 +205,8 @@
 		
 	}
 
-	// 조회클릭시
-	$('#btnMorebetterRegi').on('click', function() {
+	// 등록클릭시
+	$('#btnMorebetterReg').on('click', function() {
 		cfnOpenMorebetterSetPopup();
 	});
 

+ 762 - 0
style24.admin/src/main/webapp/WEB-INF/views/marketing/MorebetterRegForm.html

@@ -0,0 +1,762 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : MorebetterRegForm.html
+ * @desc    : 다다익선 등록 화면
+ *============================================================================
+ * SISUN
+ * Copyright(C) 2019 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.12.29   bin2107     최초 작성
+ *******************************************************************************
+ -->	
+	<div class="modalPopup frGoodsPro" data-width="1100">
+		<div class="panelStyle" style="max-height:900px;overflow-y:scroll;">
+			<div class="panelTitle">
+				<h2>다다익선 등록</h2>
+				<button type="button" class="close" onclick="fnMorebetterFormClose()"><i class="fa fa-times"></i></button>
+			</div>
+
+			<form id="moreBetterForm" name="moreBetterForm" action="#" th:action="@{'/marketing/morebetter/save'}"> <!--th:method="post" >-->
+				<input type="hidden" name="gbn" th:value="${params.gbn}" />				<!-- 신규/수정 구분 -->
+				<input type="hidden" name="supplyCompList"/>			<!-- 공급업체 리스트 -->
+				<input type="hidden" name="brandList"/>					<!-- 브랜드 리스트 -->
+				<input type="hidden" name="applyGoodsList"/>			<!-- 적용상품 리스트 -->
+				<input type="hidden" name="exceptGoodsList"/>			<!-- 제외상품 리스트 -->
+				<input type="hidden" name="burdenList"/>				<!-- 업체 분담율 리스트 -->
+				<input type="hidden" name="sectionGbList"/>				<!-- 다다익선 구간/혜택 리스트 -->
+
+				<div class="panelContent">
+					<ul class="notice">
+						<li>구성상품 등록시 기본값&nbsp;
+							<!-- 아이콘 툴팁 -->
+							<div class="iconTooltip">
+								<i class="fa fa-info" aria-hidden="true"></i>
+								<span class="left" style="width:400px; text-align:left;">
+									<!-- class="left" 또는 class="right" -->
+									- 상품상태 : 정보부족<br/>
+									- 정상가 : 구성상품의 정상가 합<br/>
+									- 판매가 : 구성상품 판매가 입력값의 합<br/>
+									- 브랜드코드 : 구성상품의 기준여부 'Y'상품의 브랜드코드<br/>
+									- 품목코드 : 구성상품의 기준여부 'Y'상품의 품목코드<br/>
+									- 포인트 : 구성상품의 기준여부 'Y'상품의 브랜드 포인트<br/>
+									- 배송비정책 : 구성상품의 기준여부 'Y'상품의 브랜드 배송비정책<br/>
+								</span>
+							</div>
+							<!-- //아이콘 툴팁 -->
+						</li>
+					</ul>
+					<table class="frmStyle">
+						<colgroup>
+							<col width="10%"/>
+							<col width="40%"/>
+							<col width="10%"/>
+							<col width="40%"/>
+						</colgroup>
+						<tr>
+							<th>프로모션명<em class="required" title="필수"></em></th>
+							<td>
+								<!-- 수정시 프로모션명 입력 : before -->
+								<input class="w50p" type="text" id="tmtbNm" name="tmtbNm" maxlength="30" required="required" data-valid-name="프로모션명"/>
+							</td>
+							<th>프로모션ID</th>
+							<td>
+								<!-- 프로모션 ID 입력 : before -->
+								<input class="w50p" type="text" id="disTmtbSq" name="disTmtbSq" maxlength="30" th:value="${params.tmtbSq}"  disabled=""/>
+								<input type="hidden" id="tmtbSq" name="tmtbSq"/>
+							</td>
+						</tr>
+						<tr>
+							<th>행사 기간<em class="required" title="필수"></em></th>
+							<td>
+								<input type="text" class="schDate w100" name="tmtbStdt" maxlength="10" required="required" data-valid-name="시작일자"/>
+								~
+								<input type="text" class="schDate w100" name="tmtbEddt" maxlength="10" required="required" data-valid-name="종료일자"/>
+							</td>
+							<th>상태</th>
+							<td>
+								<!-- 상태 입력 : before -->
+								<input class="w50p" type="text" id="disTmtbStat" name="disTmtbStat" maxlength="30" th:value="${params.tmtbStat}" disabled=""/>
+								<input type="hidden" id="tmtbStat" name="tmtbStat"/>
+							</td>
+						</tr>
+						<tr>
+							<th>할인 구간<em class="required" title="필수"></em></th>
+							<td>
+								<label class="rdoBtn"><input type="radio" name="sectionGb" id="sectionGbQty" value="G810_10" checked="checked"/>수량</label>
+								<label class="rdoBtn"><input type="radio" name="sectionGb" id="sectionGbAmt" value="G810_11"/>금액</label>
+							</td>
+							<th>할인 구분<em class="required" title="필수"></em></th>
+							<td>
+								<label class="rdoBtn"><input type="radio" name="dcWay" id="dcWayQty" value="G240_10" checked="checked"/>할인금액</label>
+								<label class="rdoBtn"><input type="radio" name="dcWay" id="dcWayAmt" value="G240_11"/>할인율</label>
+							</td>
+						</tr>
+						<tr>
+							<th>상품여부<em class="required" title="필수"></em></th>
+							<td>
+								<label class="rdoBtn"><input type="radio" name="multiYn" id="multiYnY" value="Y" checked="checked"/>복합상품</label>
+								<label class="rdoBtn"><input type="radio" name="multiYn" id="multiYnN" value="N"/>단일상품</label>
+							</td>
+
+						</tr>
+
+					</table>
+				</div>
+
+				<div class="panelStyle" style="margin:unset;">
+					<!-- TITLE -->
+					<div class="panelTitle">
+						<h2>적용 대상 상품 등록</h2>
+						<span class="panelControl">
+							<i class="fa inner-fa-chevron-up"></i>    <!-- 열림/닫힘 화살표 -->
+						</span>
+					</div>
+					<!-- //TITLE -->
+					<div class="inner-panelContent">
+						<!--<div><i class="fa fa-info-circle"></i> 브랜드/공급업체/상품 중 1가지는 필수로 지정하셔야 합니다.</div>
+						<div><i class="fa fa-info-circle"></i> 브랜드와 공급업체는 지정 시, 해당 브랜드의 공급처와 같은 AND조건으로 적용됩니다.(예시:A브랜드 상품 중 B업체 상품만)</div>
+						<div><i class="fa fa-info-circle"></i> 공급업체와 브랜드를 적용하시더라도 적용상품은 별개로 등록된 상품을 기준으로 사은품 지급기준으로 적용하실 수 있습니다.</div>-->
+
+						<div class="panelContent">
+							<table class="frmStyle">
+								<colgroup>
+									<col width="10%"/>
+									<col width="90%"/>
+								</colgroup>
+								<tr>
+									<th>공급업체/브랜드</th>
+									<td>
+										<!-- 수정시 프로모션명 입력 : before -->
+										<div class="padding10 wid45">
+											<span>공급업체 설정</span>
+											<div class="padding10 inner-tb-solid">
+												<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddCompany">업체 추가</button>
+												<button type="button" class="btn btnRight btn-success btn-lg" id="btnDeleteCompany">선택삭제</button>
+												<span>선택 : 00개</span>
+												<br/>
+												<div id="gridFGPromotionCompanyList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+											</div>
+										</div>
+										<div class="padding10 wid45">
+											<span>브랜드 설정</span>
+											<div class="padding10 inner-tb-solid">
+												<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddBrand">브랜드 추가</button>
+												<button type="button" class="btn btnRight btn-success btn-lg" id="btnDeleteBrand">선택삭제</button>
+												<span>선택 : 00개</span>
+												<br/>
+												<!-- 브랜드 선택 팝업(단수 선택 팝업... 복수를 새로 만들어야하는지 ? 아니면 변수처리해야하는지 ? -->
+												<div id="gridFGBrandList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+											</div>
+										</div>
+									</td>
+								</tr>
+								<tr>
+									<th>적용상품</th>
+									<td>
+										<div class="padding10">
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddApplyGoods">상품 추가</button>
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnDeleteApplyGoods">선택삭제</button>
+											<span>선택 : 00개</span>
+											<br/>
+											<div id="gridFGApplyGoodsList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+										</div>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</div>
+				</div>
+
+				<div class="panelStyle" style="margin:unset;">
+					<!-- TITLE -->
+					<div class="panelTitle">
+						<h2>제외 대상 상품</h2>
+						<span class="panelControl">
+							<i class="fa inner-fa-chevron-up"></i>    <!-- 열림/닫힘 화살표 -->
+						</span>
+					</div>
+					<!-- //TITLE -->
+					<div class="inner-panelContent">
+						<div class="panelContent">
+							<table class="frmStyle">
+								<colgroup>
+									<col width="10%"/>
+									<col width="90%"/>
+								</colgroup>
+								<tr>
+									<th>제외 대상</th>
+									<td>
+										<div class="padding10">
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddExceptGoods">상품 추가</button>
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnDeleteExtGoods">선택삭제</button>
+											<span>선택 : 00개</span>
+											<br/>
+											<div id="gridFGExceptGoodsList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+										</div>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</div>
+				</div>
+
+				<div class="panelStyle" style="margin:unset;">
+					<!-- TITLE -->
+					<div class="panelTitle">
+						<h2>할인 구간</h2>
+						<span class="panelControl">
+						<i class="fa inner-fa-chevron-up"></i>    <!-- 열림/닫힘 화살표 -->
+					</span>
+					</div>
+					<!-- //TITLE -->
+					<div class="inner-panelContent">
+						<div class="panelContent">
+							<table class="frmStyle">
+								<colgroup>
+									<col width="10%"/>
+									<col width="90%"/>
+								</colgroup>
+								<tr>
+									<th>할인 구간</th>
+									<td>
+										<div class="padding10">
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddSectionRow">행추가</button>
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnDelSectionRow">행삭제</button>
+											<span>선택 : 00개</span>
+											<br/>
+											<div id="gridSectionGbList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+										</div>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</div>
+				</div>
+
+				<div class="panelStyle" style="margin:unset;">
+					<!-- TITLE -->
+					<div class="panelTitle">
+						<h2>업체 분담율</h2>
+						<span class="panelControl">
+						<i class="fa inner-fa-chevron-up"></i>    <!-- 열림/닫힘 화살표 -->
+					</span>
+					</div>
+					<!-- //TITLE -->
+					<div class="inner-panelContent">
+						<div class="panelContent">
+							<table class="frmStyle">
+								<colgroup>
+									<col width="10%"/>
+									<col width="90%"/>
+								</colgroup>
+								<tr>
+									<th>업체 분담율</th>
+									<td>
+										<div class="padding10">
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddApplyBurden">업체추가</button>
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnDelApplyBurden">선택삭제</button>
+											<span>선택 : 00개</span>
+											<br/>
+											<div id="gridApplyBurdenList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+										</div>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</div>
+				</div>
+			</form>
+
+			<ul class="panelBar">
+				<li  class="right">
+					<!-- <th:block th:if="${sessionInfo.roleCd == 'G001_0000' OR sessionInfo.roleCd == 'G001_A000' OR sessionInfo.roleCd == 'G001_A101' OR sessionInfo.roleCd == 'G001_A100' OR sessionInfo.roleCd == 'G001_A001'}"> -->
+						<!--<button type="button" class="btn btnRight btn-success btn-lg" id="btnSearchList">목록</button>-->
+						<button type="button" class="btn btnRight btn-success btn-lg" id="btnMorebetterSave">저장</button>
+					<!--<button type="button" class="btn btnRight btn-success btn-lg" id="btnChangeStatIng">진행</button>
+                    	<button type="button" class="btn btnRight btn-success btn-lg" id="btnPromotionDelete">삭제</button>
+                    	<button type="button" class="btn btnRight btn-success btn-lg" id="btnPromotionStop">중지</button>-->
+                	<!-- </th:block> -->
+				</li>
+			</ul>
+		</div>	
+	</div>
+
+	<script th:inline="javascript">
+		var FGAddGoodsStatList = gagajf.convertToArray([[${goodsStatList}]]);		// 상품 상태 리스트
+		var sectionGbList = gagajf.convertToArray([[${sectionGbList}]]);	// 할인구간 리스트
+		var dcWayList = gagajf.convertToArray([[${dcWayList}]]);	// 할인구분 리스트
+		var applyGoodsGbList = gagajf.convertToArray([[${applyGoodsGbList}]]);	// 적용 상품구분 목록
+		var exceptGoodsGbList = gagajf.convertToArray([[${exceptGoodsGbList}]]);	// 제외 상품구분 목록
+
+		// 공급업체 리스트 설정
+		var columnFGCompanyList = [
+			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{headerName: "공급처ID", field: "supplyCompCd", width: 120, cellClass: 'text-center'},
+			{headerName: "공급업체명", field: "supplyCompNm", width: 150, cellClass: 'text-center'},
+			{headerName: "적용대상", field: "targetGb", width: 150, cellClass: 'text-center'}
+		];
+		// 브랜드 리스트 설정
+		var columnBrandList = [
+			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{headerName: "브랜드ID", field: "brandCd", width: 120, cellClass: 'text-center'},
+			{headerName: "브랜드명", field: "brandEnm", width: 120, cellClass: 'text-center'},
+			{headerName: "공급업체명", field: "supplyCompNm", width: 150, cellClass: 'text-center'},
+			{headerName: "적용대상", field: "targetGb", width: 150, cellClass: 'text-center'}
+		];
+		// 적용상품 리스트 설정
+		var columnApplyGoodsList = [
+			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{headerName: "상품구분", field: "goodsGb", width: 100, cellClass: 'text-center',
+				cellEditor: 'agRichSelectCellEditor',
+				cellEditorParams: { values: gagaAgGrid.extractValues(applyGoodsGbList), required: true },
+				valueFormatter: function (params) { return gagaAgGrid.lookupValue(applyGoodsGbList, params.value); },
+				valueParser: function (params) { return gagaAgGrid.lookupKey(applyGoodsGbList, params.newValue); }
+			},
+			//{headerName: "상품구분", field: "goodsGb", width: 120, cellClass: 'text-center'},
+			{headerName: "Product ID", field: "goodsCd", width: 120, cellClass: 'text-center'},
+			{headerName: "상품명", field: "goodsNm", width: 120, cellClass: 'text-center'},
+			{headerName: "적용대상", field: "targetGb", width: 150, cellClass: 'text-center'}
+		];
+		// 제외상품 리스트 설정
+		var columnExceptGoodsList = [
+			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{headerName: "상품구분", field: "goodsGb", width: 100, cellClass: 'text-center',
+				cellEditor: 'agRichSelectCellEditor',
+				cellEditorParams: { values: gagaAgGrid.extractValues(exceptGoodsGbList), required: true },
+				valueFormatter: function (params) { return gagaAgGrid.lookupValue(exceptGoodsGbList, params.value); },
+				valueParser: function (params) { return gagaAgGrid.lookupKey(exceptGoodsGbList, params.newValue); }
+			},
+			{headerName: "Product ID", field: "goodsCd", width: 120, cellClass: 'text-center'},
+			{headerName: "상품명", field: "goodsNm", width: 120, cellClass: 'text-center'},
+			{headerName: "적용대상", field: "targetGb", width: 150, cellClass: 'text-center'}
+			/*{headerName: "Product ID", field: "goodsCd", width: 120, cellClass: 'text-center'},
+			{headerName: "브랜드명", field: "brandEnm", width: 150, cellClass: 'text-center'},
+			{headerName: "상품명", field: "goodsNm", width: 120, cellClass: 'text-center'},
+			{headerName: "판매상태", field: "goodsStat" , width: 120, cellClass: 'text-center',
+				cellEditorParams: { values: gagaAgGrid.extractValues(FGAddGoodsStatList) },
+				valueFormatter: function (params) { return gagaAgGrid.lookupValue(FGAddGoodsStatList, params.value); },
+				valueParser: function (params) { return gagaAgGrid.lookupKey(FGAddGoodsStatList, params.newValue); }
+			},
+			{headerName: "정상가", field: "listPrice", width: 120, cellClass: 'text-center',valueFormatter: function(params) {return params.value.addComma();}},
+			{headerName: "판매가", field: "currPrice", width: 120, cellClass: 'text-center',valueFormatter: function(params) {return params.value.addComma();}},
+			{headerName: "적용대상", field: "targetGb", width: 150, cellClass: 'text-center'}*/
+		];
+
+		// 업체분담율 리스트 설정
+		var columnApplyBurdenList = [
+			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{headerName: "업체ID", field: "tmtbSupplyCd" , width: 120, cellClass: 'text-center'},
+			{headerName: "분담율(%)", field: "tmtbBurdenRate" , width: 120, cellClass: 'text-center',editable: true, required: true},
+			{headerName: "사용여부", field: "useYn" , width: 120, cellClass: 'text-center'}
+		];
+
+		// 구간 할인/혜택 설정
+		var columnSectionGbList = [
+			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+			{headerName: "시퀀스", field: "tmtbSq", width: 100, cellClass: 'text-center'},
+			{headerName: "할인구간", field: "sectionGb", width: 100, cellClass: 'text-center',
+				cellEditor: 'agRichSelectCellEditor',
+				cellEditorParams: { values: gagaAgGrid.extractValues(sectionGbList), required: true },
+				valueFormatter: function (params) { return gagaAgGrid.lookupValue(sectionGbList, params.value); },
+				valueParser: function (params) { return gagaAgGrid.lookupKey(sectionGbList, params.newValue); }
+			},
+			{headerName: "구간값", field: "sectionVal", width: 100, cellClass: 'text-right',
+				cellEditor: 'textCellEditor',
+				cellEditorParams: { maxlength: 50, required: true }
+			},
+			{headerName: "할인구분", field: "dcWay", width: 100, cellClass: 'text-center',
+				cellEditor: 'agRichSelectCellEditor',
+				cellEditorParams: { values: gagaAgGrid.extractValues(dcWayList), required: true },
+				valueFormatter: function (params) { return gagaAgGrid.lookupValue(dcWayList, params.value); },
+				valueParser: function (params) { return gagaAgGrid.lookupKey(dcWayList, params.newValue); }
+			},
+			{headerName: "할인값", field: "dcVal", width: 100, cellClass: 'text-right',
+				cellEditor: 'textCellEditor',
+				cellEditorParams: { maxlength: 50, required: true }
+			}
+		];
+
+		// 공급업체 리스트 설정
+		var gridOptionsFGCompanyList = gagaAgGrid.getGridOptions(columnFGCompanyList);
+		gridOptionsFGCompanyList.rowSelection = "multiple";
+		// 브랜드 리스트 설정
+		var gridOptionsFGBrandList = gagaAgGrid.getGridOptions(columnBrandList);
+		gridOptionsFGBrandList.rowSelection = "multiple";
+		// 적용상품 리스트 설정
+		var gridOptionsFGApplyGoodsList = gagaAgGrid.getGridOptions(columnApplyGoodsList);
+		// Grid editable
+		gridOptionsFGApplyGoodsList.defaultColDef.editable = true;
+		gridOptionsFGApplyGoodsList.rowSelection = "multiple";
+		// 제외상품 리스트 설정
+		var gridOptionsFGExceptGoodsList = gagaAgGrid.getGridOptions(columnExceptGoodsList);
+		gridOptionsFGExceptGoodsList.rowSelection = "multiple";
+		// 업체분담율 리스트 설정
+		var gridOptionsApplyBurdenList = gagaAgGrid.getGridOptions(columnApplyBurdenList);
+		gridOptionsApplyBurdenList.rowSelection = "multiple";
+		// 구간 할인/혜택 설정
+		var gridOptionsSectionGbList = gagaAgGrid.getGridOptions(columnSectionGbList);
+		// Grid editable
+		gridOptionsSectionGbList.defaultColDef.editable = true;
+		// Add on options
+		gridOptionsSectionGbList.suppressRowClickSelection = true;
+		gridOptionsSectionGbList.rowSelection = "multiple";
+		gridOptionsSectionGbList.stopEditingWhenGridLosesFocus = true;
+
+		$(document).ready(function() {
+			gagaAgGrid.createGrid("gridFGPromotionCompanyList", gridOptionsFGCompanyList);
+			gagaAgGrid.createGrid("gridFGBrandList", gridOptionsFGBrandList);
+			gagaAgGrid.createGrid("gridFGApplyGoodsList", gridOptionsFGApplyGoodsList);
+			gagaAgGrid.createGrid("gridFGExceptGoodsList", gridOptionsFGExceptGoodsList);
+			gagaAgGrid.createGrid("gridApplyBurdenList", gridOptionsApplyBurdenList);
+			gagaAgGrid.createGrid("gridSectionGbList", gridOptionsSectionGbList);
+
+			cfnCreateCalendar('#tmtbTerms', 'tmtbStdt', 'tmtbEddt', true, '행사기간', 'X');
+		});
+
+		// 저장 버튼 클릭시
+		$('#btnMorebetterSave').on('click', function() {
+			// 각 ag-grid list 수량
+			let supplyCompCnt = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList).length;
+			let brandCnt = gagaAgGrid.getAllRowData(gridOptionsFGBrandList).length;
+			let applyGoodsCnt = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList).length;
+			let exceptGoodsCnt = gagaAgGrid.getAllRowData(gridOptionsFGExceptGoodsList).length;
+			let applyBurdenCnt = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList).length;
+			let sectionGbCnt = gagaAgGrid.getAllRowData(gridOptionsSectionGbList).length;
+			console.log('supplyCompCnt>>'+supplyCompCnt);
+			console.log('brandCnt>>'+brandCnt);
+			console.log('applyGoodsCnt>>'+applyGoodsCnt);
+			console.log('exceptGoodsCnt>>'+exceptGoodsCnt);
+			console.log('applyBurdenCnt>>'+applyBurdenCnt);
+			console.log('sectionGbCnt>>'+sectionGbCnt);
+
+			// 행사기간 확인
+			let fromDate = $('#moreBetterForm input[name=tmtbStdt]').val();
+			let toDate = $('#moreBetterForm input[name=tmtbEddt]').val();
+
+			if (gagajf.isNull(fromDate) || gagajf.isNull(toDate)) {
+				mcxDialog.alert("행사 기간 시작일자와 종료일자를 입력하세요.");
+				$('#moreBetterForm input[name=tmtbStdt]').focus();
+				return false;
+			}
+
+			if (fromDate > toDate) {
+				mcxDialog.alert("시작일자는 종료일자 보다 클 수 없습니다.");
+				$('#moreBetterForm input[name=tmtbStdt]').focus();
+				return false;
+			}
+
+
+			// validation
+			if (!gagajf.validation('#moreBetterForm'))
+				return false;
+
+			// disabled 값 넘겨주기
+			$('#moreBetterForm input[name=tmtbSq]').val($('#moreBetterForm input[name=disTmtbSq]').val());
+			$('#moreBetterForm input[name=tmtbStat]').val($('#moreBetterForm input[name=disTmtbStat]').val());
+
+
+			mcxDialog.confirm('저장하시겠습니까?', {
+				cancelBtnText: "취소",
+				sureBtnText: "확인",
+				sureBtnClick: function(){
+					var comp_idx = 0;
+					var brand_idx = 0;
+					var apply_idx = 0;
+					var except_idx = 0;
+					var burden_idx = 0;
+
+					var compAllData = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList);
+					/*$.each(compAllData, function(comp_idx, item) {
+						item.dispOrd = comp_idx+1;
+					});*/
+
+					var brandAllData = gagaAgGrid.getAllRowData(gridOptionsFGBrandList);
+					/*$.each(brandAllData, function(brand_idx, item) {
+						item.dispOrd = brand_idx+1;
+					});*/
+
+					var applyAllData = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList);
+					/*$.each(applyAllData, function(apply_idx, item) {
+						item.dispOrd = apply_idx+1;
+					});*/
+
+					var exceptAllData = gagaAgGrid.getAllRowData(gridOptionsFGExceptGoodsList);
+					/*$.each(exceptAllData, function(except_idx, item) {
+						item.dispOrd = except_idx+1;
+					});*/
+
+					var burdenAllData = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList);
+					/*$.each(burdenAllData, function(burden_idx, item) {
+						item.dispOrd = burden_idx+1;
+					});*/
+
+					var sectionGbAllData = gagaAgGrid.getAllRowData(gridOptionsSectionGbList);
+
+					var jsonSupplyCompData = JSON.stringify(compAllData);
+					$('#moreBetterForm input[name=supplyCompList]').val(jsonSupplyCompData);
+					var jsonBrandData = JSON.stringify(brandAllData);
+					$('#moreBetterForm input[name=brandList]').val(jsonBrandData);
+					var jsonApplyData = JSON.stringify(applyAllData);
+					$('#moreBetterForm input[name=applyGoodsList]').val(jsonApplyData);
+					var jsonExceptData = JSON.stringify(exceptAllData);
+					$('#moreBetterForm input[name=exceptGoodsList]').val(jsonExceptData);
+					var jsonBurdenData = JSON.stringify(burdenAllData);
+					$('#moreBetterForm input[name=burdenList]').val(jsonBurdenData);
+
+					var jsonSectionGbData = JSON.stringify(sectionGbAllData);
+					$('#moreBetterForm input[name=sectionGbList]').val(jsonSectionGbData);
+
+					var jsonData = JSON.stringify($('#moreBetterForm').serializeObject());
+					gagajf.ajaxJsonSubmit($('#moreBetterForm').prop('action'), jsonData, function() {
+						//$('#btnSearch').trigger('click');
+						//$('#btnNew').trigger('click');
+						console.log('save 11111');
+					});
+				}
+			});
+
+		});
+
+		// 공급업체 설정 / 업체 추가 콜백함수
+		var fnSetPopupComapnyInfo = function(result) {
+			// 기존 리스트 데이터 for
+			for(let i = 0 ; i < result.length ; i++) {
+				let addChk = true, gridListValue = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList);		// 받아온 모든 데이터
+
+				// 받아온 data for
+				for(let j = 0 ; j < gridListValue.length ; j++) {
+					// 동일한 data는 추가하지 않음
+					if(gridListValue[j].supplyCompCd == result[i].supplyCompCd) {	addChk = false;	}		// 중복체크
+				}
+
+				// 중복되지 않은 데이터 리스트에 추가
+				if(addChk) {
+					gagaAgGrid.addRowData(gridOptionsFGCompanyList, {"supplyCompCd" : result[i].supplyCompCd, "supplyCompNm" : result[i].supplyCompNm, "targetGb" : "G260_13"});
+				}
+			}
+		};
+
+		// 브랜드 설정 / 브랜드 추가 콜백함수 (단수로 가져오므로 복수일 경우에 수정 확인 필요)
+		var fnSetPopupBrandInfo = function(result) {
+			for(let i = 0 ; i < result.length ; i++) {
+				let addChk = true, gridListValue = gagaAgGrid.getAllRowData(gridOptionsFGBrandList);		// 받아온 모든 데이터
+
+				// 받아온 data for
+				for(let j = 0 ; j < gridListValue.length ; j++) {
+					if(gridListValue[j].brandCd == result[i].brandCd) {	addChk = false;	}					// 중복체크
+				}
+
+				// 중복되지 않은 데이터 리스트에 추가
+				if(addChk) {
+					gagaAgGrid.addRowData(gridOptionsFGBrandList, {"brandCd" : result[i].brandCd, "brandEnm" : result[i].brandEnm, "supplyCompNm" : result[i].supplyCompNm, "targetGb" : "G260_12"});
+				}
+			}
+		};
+
+		// 분담업체율 설정 / 업체 추가 콜백함수
+		var fnSetPopupApplyBurdenInfo = function(result) {
+			// 기존 리스트 데이터 for
+			for(let i = 0 ; i < result.length ; i++) {
+				//console.log('old i::'+i+"::"+result[i].supplyCompCd);
+				let addChk = true, gridListValue = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList);		// 받아온 모든 데이터
+
+				// 받아온 data for
+				for(let j = 0 ; j < gridListValue.length ; j++) {
+					//console.log('new add j::'+j+":supplyCompCd:"+gridListValue[j].tmtbSupplyCd);
+					// 동일한 data는 추가하지 않음
+					if(gridListValue[j].tmtbSupplyCd == result[i].supplyCompCd) {	addChk = false;	}		// 중복체크
+				}
+
+				// 중복되지 않은 데이터 리스트에 추가
+				if(addChk) {
+					//gagaAgGrid.addRowData(gridOptionsApplyBurdenList, result[i], "tmtbSupplyCd");
+					gagaAgGrid.addRowData(gridOptionsApplyBurdenList, {"tmtbSupplyCd" : result[i].supplyCompCd, "useYn" : result[i].useYn});
+				}
+			}
+		};
+
+		// 적용 상품 리스트 콜백함수
+		var fnSetPopupApplyGoodsInfo = function(result) {
+			gridAddGoodsList(gridOptionsFGApplyGoodsList, result , "apply");
+		};
+
+		// 제외 상품 리스트 콜백함수
+		var fnSetPopupExceptGoodsInfo = function(result) {
+			gridAddGoodsList(gridOptionsFGExceptGoodsList, result , "except");
+		};
+
+
+		// ag-grid 상품관련 list 콜백함수
+		function gridAddGoodsList(OriginGridListOption, result, gubun) {
+			var goodsGbVal = "G800_10";
+			if(gubun == 'except'){
+				goodsGbVal = "G800_30";
+			}
+
+			for(let i = 0 ; i < result.length ; i++) {
+				let addChk = true, gridListValue = gagaAgGrid.getAllRowData(OriginGridListOption);		// 받아온 모든 데이터
+
+				// 받아온 data for
+				for(let j = 0 ; j < gridListValue.length ; j++) {
+					if(gridListValue[j].goodsCd == result[i].goodsCd) {	addChk = false;	}				// 중복체크
+				}
+
+				// 중복되지 않은 데이터 리스트에 추가
+				if(addChk) {
+					//gagaAgGrid.addRowData(OriginGridListOption, result[i], "goodsCd");
+					gagaAgGrid.addRowData(OriginGridListOption, {"goodsGb": goodsGbVal, "goodsCd" : result[i].goodsCd, "goodsNm" : result[i].goodsNm, "targetGb" : "G260_10"});
+				}
+			}
+		}
+
+		// 공급업체 설정 업체 추가 버튼 클릭시
+		$('#moreBetterForm #btnAddCompany').on('click', function() {
+			cfnOpenCompanyListPopup("fnSetPopupComapnyInfo");
+		});
+
+		// 브랜드 추가 버튼 클릭시 (복수 브랜드때 수정 필요)
+		$('#moreBetterForm #btnAddBrand').on('click', function() {
+			cfnOpenBrandListPopup("fnSetPopupBrandInfo", "M");
+		});
+
+		// 적용 상품 추가 버튼 클릭시
+		$('#moreBetterForm #btnAddApplyGoods').on('click', function() {
+			cfnOpenGoodsPopup("fnSetPopupApplyGoodsInfo");
+		});
+		// 제외 상품 추가 버튼 클릭시
+		$('#moreBetterForm #btnAddExceptGoods').on('click', function() {
+			cfnOpenGoodsPopup("fnSetPopupExceptGoodsInfo");
+		});
+		// 업체분담율 추가 버튼 클릭시
+		$('#moreBetterForm #btnAddApplyBurden').on('click', function() {
+			//cfnOpenApplyBurdenPopup("fnSetPopupApplyBurdenInfo");
+			cfnOpenCompanyListPopup("fnSetPopupApplyBurdenInfo");
+		});
+
+		// 공급업체 설정 선택삭제 버튼 클릭시
+		$('#moreBetterForm #btnDeleteCompany').on('click', function() {
+			gridOptionsFGCompanyList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsFGCompanyList)});
+		});
+		// 브랜드 설정 선택삭제 버튼 클릭시
+		$('#moreBetterForm #btnDeleteBrand').on('click', function() {
+			gridOptionsFGBrandList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsFGBrandList)});
+		});
+		// 적용상품 선택삭제 버튼 클릭시
+		$('#moreBetterForm #btnDeleteApplyGoods').on('click', function() {
+			gridOptionsFGApplyGoodsList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsFGApplyGoodsList)});
+		});
+		// 제외상품 선택삭제 버튼 클릭시
+		$('#moreBetterForm #btnDeleteExtGoods').on('click', function() {
+			gridOptionsFGExceptGoodsList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsFGExceptGoodsList)});
+		});
+		// 업체분담율 선택삭제 버튼 클릭시
+		$('#moreBetterForm #btnDelApplyBurden').on('click', function() {
+			gridOptionsApplyBurdenList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsApplyBurdenList)});
+		});
+
+		//패널영역 줄이기
+		$(document).on("click",".panelControl .inner-fa-chevron-up", function() {
+			$(this).parent().parent().parent().find(".inner-panelContent").slideUp(100);
+			$(this).attr("class","fa inner-fa-chevron-down");
+		});
+		//패널영역 펼치기
+		$(document).on("click",".panelControl .inner-fa-chevron-down", function() {
+			$(this).parent().parent().parent().find(".inner-panelContent").slideDown(100);
+			$(this).attr("class","fa inner-fa-chevron-up");
+		});
+
+		// 창 닫기
+		var fnMorebetterFormClose = function(){
+			uifnPopupClose('popupMorebetterReg');
+		}
+
+		// 행추가
+		$('#btnAddSectionRow').on('click', function() {
+			var tmtbSq = $('#moreBetterForm input[name=disTmtbSq]').val();
+			var sectionGbValue = $('input:radio[name="sectionGb"]:checked').val();
+			var dcWayValue = $('input:radio[name="dcWay"]:checked').val();
+
+			var data = { tmtbSq: tmtbSq ,sectionGb: sectionGbValue, sectionVal: null, dcWay: dcWayValue, dcVal: null };
+			gagaAgGrid.addRowData(gridOptionsSectionGbList, data, "sectionVal");
+		});
+
+		// 행삭제
+		$('#btnDelSectionRow').on('click', function() {
+			var selectedData = gridOptionsSectionGbList.api.getSelectedRows();
+			var removedData = gagaAgGrid.removeRowData(gridOptionsSectionGbList);
+
+			if (selectedData.length == 0) {
+				mcxDialog.alert('선택된 행이 없습니다.');
+				return;
+			}
+
+			if (removedData.length > 0) {
+
+				mcxDialog.confirm('삭제하시겠습니까?', {
+					cancelBtnText: "취소",
+					sureBtnText: "확인",
+					sureBtnClick: function(){
+						var deleteData = [];
+
+						$.each(removedData, function(idx, item) {
+							deleteData.push(item);
+						});
+
+						var jsonData = JSON.stringify(deleteData);
+						gagajf.ajaxJsonSubmit('/morebetter/sectionVal/delete', jsonData, fnSearch);
+					}
+				});
+			}
+		});
+
+		// 할인구간 선택 시 기본 조건 변경
+		$("#moreBetterForm input[name=sectionGb]").bind('click change', function () {
+			var sectionGbValue = $(this).val();
+			var dcWayValue = $('input:radio[name="dcWay"]:checked').val();
+			var loopRowData = gagaAgGrid.getAllRowData(gridOptionsSectionGbList);
+
+			if (loopRowData.length == 0) {
+				mcxDialog.alert('ROW 데이터가 없습니다.');
+				return;
+			}
+
+			for(i=0; i<loopRowData.length; i++){
+				loopRowData[i].sectionGb = sectionGbValue;
+				loopRowData[i].sectionVal = "";
+				loopRowData[i].dcWay = dcWayValue;
+				loopRowData[i].dcVal = "";
+			}
+			gridOptionsSectionGbList.api.setRowData(loopRowData);
+		});
+
+		// 할인구분 선택 시 기본 조건 변경
+		$("#moreBetterForm input[name=dcWay]").bind('click change', function () {
+			var sectionGbValue = $('input:radio[name="sectionGb"]:checked').val();
+			var dcWayValue = $(this).val();
+			var loopRowData = gagaAgGrid.getAllRowData(gridOptionsSectionGbList);
+
+			if (loopRowData.length == 0) {
+				mcxDialog.alert('ROW 데이터가 없습니다.');
+				return;
+			}
+
+			for(i=0; i<loopRowData.length; i++){
+				loopRowData[i].sectionGb = sectionGbValue;
+				loopRowData[i].sectionVal = "";
+				loopRowData[i].dcWay = dcWayValue;
+				loopRowData[i].dcVal = "";
+			}
+			gridOptionsSectionGbList.api.setRowData(loopRowData);
+		});
+
+		$(document).ready(function() {
+
+		});
+	</script>
+</html>

+ 126 - 0
style24.admin/src/main/webapp/WEB-INF/views/order/RefundAccountRegistForm.html

@@ -0,0 +1,126 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OrderListForm.html
+ * @desc    : 주문목록 Page
+ *============================================================================
+ * SISUN
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.04   jsh77b       최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="900">
+	<div class="panelStyle">
+		<div class="panelTitle">
+			<h2>환불계좌정보</h2>
+			<button type="button" class="close" onclick="uifnPopupClose('popupCreateRefundAccount');"><i class="fa fa-times"></i></button>
+		</div>
+		
+		<div class="panelContent" style="height:90%; overflow-y:auto; padding:0px 20px !important; ">
+			<form id="orderRefundAccontForm">
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:160px;" />
+						<col />
+						<col />
+						<col />
+						<col />
+						<col />
+						<col />
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>은행</th>
+								<td>
+									<select name="bankCd">
+										<option value="">[선택하세요]</option>
+										<option th:if="${bankList}" th:each="oneData, status : ${bankList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+									</select>
+								</td>
+								<th>계좌번호</th>
+								<td><input type="text" name="accountNo" data-valid-type="numeric"></td>
+								<th>예금주</th>
+								<td><input type="text" name="accountNm"></td>
+							</th:block>
+							<td>
+								<button type="button" class="btn btn-success" id="saveAccountBtn" onclick="fnSaveAccount();">저장</button>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+			</form>
+		</div>
+	</div>
+</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+/* 이벤트 바인딩 관련 */
+	var ordNo 	= [[${orderBasic.ordNo}]];
+	var custNo 	= [[${orderBasic.custNo}]];
+
+	/* 환불계좌번호 저장 */
+	var fnSaveAccount = function(){
+		var bankCd 		= $("#orderRefundAccontForm select[name=bankCd]").val();
+		var accountNo 	= $("#orderRefundAccontForm input[name=accountNo]").val();
+		var accountNm 	= $("#orderRefundAccontForm input[name=accountNm]").val();
+
+		if (gagajf.isNull(bankCd)) {
+			mcxDialog.alert('은행을 선택하세요.');
+			return;
+		}
+
+		if (gagajf.isNull(accountNo)) {
+			mcxDialog.alert('계좌번호를 입력하세요.');
+			return;
+		}
+
+		if (gagajf.isNull(accountNm)) {
+			mcxDialog.alert('예금주를 입력하세요.');
+			return;
+		}
+
+		if (gagajf.isNull(ordNo) || gagajf.isNull(custNo)) {
+			mcxDialog.alert('주문정보를 다시 확인하시기 바랍니다..');
+			return;
+		}
+
+		mcxDialog.confirm("환불계좌를 저장하시겠습니까?", {
+			cancelBtnText	: "취소",
+			sureBtnText		: "확인",
+			sureBtnClick	: function(){
+				var data = {};
+				data.ordNo 			= ordNo;
+				data.custNo 		= custNo;
+				data.bankCd 		= bankCd;
+				data.accountNo 		= accountNo;
+				data.accountNm 		= accountNm;
+				
+				var jsonData = JSON.stringify(data);
+				
+				gagajf.ajaxJsonSubmit('/order/account/save', jsonData, function(result){
+					uifnPopupClose('popupCreateRefundAccount');
+					fnBindOrderRfAccountInfo();
+				});
+			}
+		});
+	};
+
+	$(document).ready(function() {
+
+
+	});
+
+/*]]>*/
+</script>
+
+</html>
+
+
+
+
+

+ 69 - 0
style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsProductJob.java

@@ -0,0 +1,69 @@
+package com.style24.batch.biz.job.goods;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbCommonService;
+import com.style24.batch.biz.service.TsbWmsGoodsService;
+import com.style24.persistence.domain.IfProduct;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.util.GagaDateUtil;
+
+/**
+ * WMS 상품정보 송신
+ *
+ * @author eskim
+ * @since 2021. 01. 01
+ */
+@Component
+@Slf4j
+public class TsbGoodsWmsProductJob extends TsbAbstractJob<IfProduct, IfProduct, IfProduct> {
+
+	@Autowired
+	private TsbWmsGoodsService wmsGoodsService;
+
+	@Autowired
+	private TsbCommonService commonService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+	private String jobdate = "";
+
+	@Override
+	public IfProduct read() throws Exception {
+
+		// WMS 동기화 옵션 여부 확인
+		String wmsSyncYn = commonService.getWmsSyncYn();
+		if ("N".equals(wmsSyncYn)) {
+			log.info("WMS 정보 동기화 미실행 {}, 연동여부 : {}", GagaDateUtil.getToday("yyyy-MM-dd HH:mm:ss"), wmsSyncYn);
+			return null;
+		}
+		IfProduct ifProduct = new IfProduct();
+		return ifProduct;
+	}
+
+	@Override
+	public IfProduct process(IfProduct ifProduct) throws Exception {
+		return ifProduct;
+	}
+
+	@Override
+	public IfProduct write(IfProduct ifProduct) throws Exception {
+
+		jobdate = GagaDateUtil.getOffsetDate(-1);	//전일자
+
+		//온라인 상품정보 조회 처리
+		wmsGoodsService.saveGoodsWmsProduct(jobdate);
+
+		return ifProduct;
+	}
+
+	@Override
+	public void notify(IfProduct ifProduct) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

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

@@ -0,0 +1,76 @@
+package com.style24.batch.biz.job.goods;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbCommonService;
+import com.style24.batch.biz.service.TsbGoodsService;
+import com.style24.persistence.domain.IfProductSku;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.util.GagaDateUtil;
+
+/**
+ * WMS 상품재고 수신
+ *
+ * @author eskim
+ * @since 2021. 01. 06
+ */
+@Component
+@Slf4j
+public class TsbGoodsWmsProductStockJob extends TsbAbstractJob<IfProductSku, IfProductSku, IfProductSku> {
+
+	@Autowired
+	private TsbGoodsService goodsService;
+
+	@Autowired
+	private TsbCommonService commonService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+	private String jobdate = "";
+
+	@Override
+	public IfProductSku read() throws Exception {
+
+
+		IfProductSku ifProductSku = new IfProductSku();
+		return ifProductSku;
+	}
+
+	@Override
+	public IfProductSku process(IfProductSku ifProductSku) throws Exception {
+		return ifProductSku;
+	}
+
+	@Override
+	public IfProductSku write(IfProductSku ifProductSku) throws Exception {
+
+		jobdate = GagaDateUtil.getToday("yyyyMMddHHmm");
+
+		// WMS 동기화 옵션 여부 확인
+		String wmsSyncYn = commonService.getWmsSyncYn();
+		if ("N".equals(wmsSyncYn)) {
+			log.info("WMS 정보 동기화 미실행 {}, 연동여부 : {}", GagaDateUtil.getToday("yyyy-MM-dd HH:mm:ss"), wmsSyncYn);
+			return null;
+		}else {
+			//wms상품재고이력 생성
+			goodsService.createWmsProductSkuHst(jobdate);
+			//온라인 상품 재고 적용
+			goodsService.saveGoodsStock();
+		}
+
+		//온라인 전시 재고 작업
+		goodsService.saveGoodsDispStock();
+
+		return ifProductSku;
+	}
+
+	@Override
+	public void notify(IfProductSku ifProductSku) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 31 - 0
style24.batch/src/main/java/com/style24/persistence/domain/IfProduct.java

@@ -0,0 +1,31 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * wms 연동 상품정보 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 05
+ */
+@SuppressWarnings("serial")
+@Data
+public class IfProduct extends TscBaseDomain {
+
+	private Integer productno;			//상품번호
+	private String productcode;			//상품코드
+	private String productname;			//상품명
+	private int brandno;				//브랜드번호
+	private String brandname;			//브랜드명
+	private int providerno;				//공급처번호
+	private String statuscd;			//관리상태
+	private String producttypecd;		//상품타입
+	private String vendorproductcode;	//업체상품코드
+	private String goodsCd;				//온라인상품코드
+	private String brandCd;				//온라인브랜드코드
+	private String supplyCompCd;		//온라인공급업체코드
+	private String sysImgNm;			//온라인상품이미지
+
+}

+ 33 - 0
style24.batch/src/main/java/com/style24/persistence/domain/IfProductSku.java

@@ -0,0 +1,33 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * wms 연동 상품재고정보 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 06
+ */
+@SuppressWarnings("serial")
+@Data
+public class IfProductSku extends TscBaseDomain {
+
+	private String skucode;				//옵션코드
+	private String skumodelno;			//옵션모델번호
+	private int productno;			//상품번호
+	private String productcode;			//상품코드
+	private String option1;				//옵션1(색상)
+	private String option2;				//옵션2(사이즈)
+	private String option3;				//옵션3(스타일)
+	private int sellingstockamount;	//판매재고수량
+	private String sellingstocktypecd;	//판매재고유형
+	private int limitstockamount;	//
+	private String vendorskumodelno;	//업체옵션모델번호
+	private String vendorskucode;		//업체옵션코드
+	private int isvirtualstock;		//
+	private String datevirtualstock;	//
+	private String skucode88;			//88코드
+
+}

+ 43 - 0
style24.core/src/main/java/META-INF/MANIFEST.MF

@@ -0,0 +1,43 @@
+Manifest-Version: 1.0
+Main-Class: 
+Class-Path: spring-data-redis-2.3.3.RELEASE.jar spring-boot-autoconfigur
+ e-2.3.3.RELEASE.jar spring-boot-starter-web-services-2.3.3.RELEASE.jar 
+ xmlbeans-2.6.0.jar logback-classic-1.2.3.jar stax-ex-1.8.3.jar spring-a
+ op-5.2.8.RELEASE.jar log4j-to-slf4j-2.13.3.jar saaj-impl-1.5.2.jar jack
+ son-databind-2.11.2.jar slf4j-api-1.7.30.jar netty-codec-4.1.51.Final.j
+ ar spring-boot-starter-web-2.3.3.RELEASE.jar spring-boot-starter-loggin
+ g-2.3.3.RELEASE.jar hibernate-validator-6.1.5.Final.jar spring-core-5.2
+ .8.RELEASE.jar poi-3.17.jar gagaframework-web-util-1.7-RELEASE.jar comm
+ ons-codec-1.14.jar jakarta.activation-1.2.2.jar jackson-module-paramete
+ r-names-2.11.2.jar spring-boot-starter-jdbc-2.3.3.RELEASE.jar lettuce-c
+ ore-5.3.3.RELEASE.jar gagaframework-web-rest-1.7-RELEASE.jar spring-boo
+ t-starter-2.3.3.RELEASE.jar jakarta.xml.soap-api-1.4.2.jar netty-buffer
+ -4.1.51.Final.jar curvesapi-1.04.jar jackson-annotations-2.11.2.jar jak
+ arta.annotation-api-1.3.5.jar poi-ooxml-schemas-3.17.jar httpcore-4.4.1
+ 3.jar mybatis-spring-boot-starter-2.1.3.jar gson-2.8.6.jar jackson-data
+ type-jsr310-2.11.2.jar spring-boot-starter-json-2.3.3.RELEASE.jar jakar
+ ta.activation-api-1.2.2.jar mybatis-3.5.5.jar spring-expression-5.2.8.R
+ ELEASE.jar spring-jcl-5.2.8.RELEASE.jar spring-ws-core-3.0.9.RELEASE.ja
+ r spring-data-commons-2.3.3.RELEASE.jar gagaframework-web-security-1.7.
+ 1-RELEASE.jar commons-lang3-3.10.jar snakeyaml-1.26.jar mybatis-spring-
+ 2.0.5.jar reactor-core-3.3.9.RELEASE.jar spring-boot-starter-validation
+ -2.3.3.RELEASE.jar commons-collections4-4.1.jar spring-session-data-red
+ is-2.3.0.RELEASE.jar spring-context-5.2.8.RELEASE.jar gagaframework-web
+ -parameter-1.7-RELEASE.jar spring-data-keyvalue-2.3.3.RELEASE.jar jacks
+ on-core-2.11.2.jar jakarta.xml.bind-api-2.3.3.jar reactive-streams-1.0.
+ 3.jar netty-resolver-4.1.51.Final.jar lombok-1.18.12.jar netty-transpor
+ t-4.1.51.Final.jar spring-context-support-5.2.8.RELEASE.jar jackson-dat
+ atype-jdk8-2.11.2.jar netty-handler-4.1.51.Final.jar stax-api-1.0.1.jar
+  mybatis-spring-boot-autoconfigure-2.1.3.jar httpclient-4.5.12.jar spri
+ ng-boot-starter-data-redis-2.3.3.RELEASE.jar spring-xml-3.0.9.RELEASE.j
+ ar HikariCP-3.4.5.jar spring-boot-starter-cache-2.3.3.RELEASE.jar log4j
+ -api-2.13.3.jar spring-beans-5.2.8.RELEASE.jar netty-common-4.1.51.Fina
+ l.jar commons-pool2-2.8.1.jar spring-webmvc-5.2.8.RELEASE.jar spring-we
+ b-5.2.8.RELEASE.jar gagaframework-web-core-1.7.1-RELEASE.jar spring-ses
+ sion-core-2.3.0.RELEASE.jar jakarta.validation-api-2.0.2.jar jboss-logg
+ ing-3.4.1.Final.jar spring-jdbc-5.2.8.RELEASE.jar spring-oxm-5.2.8.RELE
+ ASE.jar logback-core-1.2.3.jar spring-boot-2.3.3.RELEASE.jar jakarta.xm
+ l.ws-api-2.3.3.jar jul-to-slf4j-1.7.30.jar spring-tx-5.2.8.RELEASE.jar 
+ classmate-1.5.1.jar jakarta.el-3.0.3.jar poi-ooxml-3.17.jar jakarta.jws
+ -api-2.1.0.jar
+