Sfoglia il codice sorgente

Merge branch 'develop' into csh9191

# Conflicts:
#	src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
ChoiSooHwan 5 anni fa
parent
commit
c83dbf6f32
75 ha cambiato i file con 4192 aggiunte e 4973 eliminazioni
  1. 45 0
      src/main/java/com/style24/admin/biz/dao/TsaCardPromotionDao.java
  2. 0 6
      src/main/java/com/style24/admin/biz/dao/TsaExchDao.java
  3. 30 0
      src/main/java/com/style24/admin/biz/dao/TsaMorebetterDao.java
  4. 0 188
      src/main/java/com/style24/admin/biz/dao/TsaOrderChangeDao.java
  5. 0 370
      src/main/java/com/style24/admin/biz/dao/TsaOrderDao.java
  6. 14 4
      src/main/java/com/style24/admin/biz/dao/TsaPgDao.java
  7. 0 6
      src/main/java/com/style24/admin/biz/dao/TsaRefundDao.java
  8. 0 6
      src/main/java/com/style24/admin/biz/dao/TsaReturnDao.java
  9. 65 0
      src/main/java/com/style24/admin/biz/service/TsaCardPromotionService.java
  10. 14 2
      src/main/java/com/style24/admin/biz/service/TsaCouponService.java
  11. 9 4
      src/main/java/com/style24/admin/biz/service/TsaGoodsService.java
  12. 35 11
      src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java
  13. 0 80
      src/main/java/com/style24/admin/biz/service/TsaOrderChangeService.java
  14. 0 568
      src/main/java/com/style24/admin/biz/service/TsaOrderService.java
  15. 114 10
      src/main/java/com/style24/admin/biz/service/TsaPgService.java
  16. 1 1
      src/main/java/com/style24/admin/biz/web/TsaBoardController.java
  17. 9 2
      src/main/java/com/style24/admin/biz/web/TsaCustomerController.java
  18. 1 0
      src/main/java/com/style24/admin/biz/web/TsaGoodsController.java
  19. 192 26
      src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
  20. 172 117
      src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java
  21. 83 8
      src/main/java/com/style24/admin/biz/web/TsaOrderController.java
  22. 2 2
      src/main/java/com/style24/admin/biz/web/TsaOrderRefundController.java
  23. 2 28
      src/main/java/com/style24/admin/biz/web/TsaPgController.java
  24. 0 31
      src/main/java/com/style24/admin/support/env/TsaConstants.java
  25. 55 0
      src/main/java/com/style24/persistence/domain/CardPromotion.java
  26. 26 0
      src/main/java/com/style24/persistence/domain/CardPromotionCondition.java
  27. 23 0
      src/main/java/com/style24/persistence/domain/CardPromotionTarget.java
  28. 3 3
      src/main/java/com/style24/persistence/domain/Coupon.java
  29. 2 0
      src/main/java/com/style24/persistence/domain/CustCoupon.java
  30. 1 1
      src/main/java/com/style24/persistence/domain/GoodsCategory.java
  31. 8 4
      src/main/java/com/style24/persistence/domain/GoodsSearch.java
  32. 3 0
      src/main/java/com/style24/persistence/domain/MoreBetter.java
  33. 6 0
      src/main/java/com/style24/persistence/domain/MoreBetterGoods.java
  34. 0 405
      src/main/java/com/style24/persistence/domain/Order.java
  35. 66 0
      src/main/java/com/style24/persistence/domain/OrderSample.java
  36. 43 0
      src/main/java/com/style24/persistence/domain/OrderSampleGoods.java
  37. 96 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaCardPromotion.xml
  38. 1 1
      src/main/java/com/style24/persistence/mybatis/shop/TsaCommon.xml
  39. 42 63
      src/main/java/com/style24/persistence/mybatis/shop/TsaCoupon.xml
  40. 37 42
      src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml
  41. 71 42
      src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  42. 1 1
      src/main/java/com/style24/persistence/mybatis/shop/TsaLogin.xml
  43. 53 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaMorebetter.xml
  44. 0 1604
      src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml
  45. 0 812
      src/main/java/com/style24/persistence/mybatis/shop/TsaOrderChange.xml
  46. 489 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaPg.xml
  47. 1 8
      src/main/java/com/style24/persistence/mybatis/shop/TsaStock.xml
  48. 2 3
      src/main/webapp/WEB-INF/views/customer/CellphoneChangePopupForm.html
  49. 23 32
      src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html
  50. 1 1
      src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html
  51. 1 1
      src/main/webapp/WEB-INF/views/goods/GoodsFreeGoodsForm.html
  52. 8 26
      src/main/webapp/WEB-INF/views/goods/GoodsItemkindForm.html
  53. 2 2
      src/main/webapp/WEB-INF/views/goods/GoodsNotiInfoForm.html
  54. 21 3
      src/main/webapp/WEB-INF/views/goods/GoodsSizeInfoForm.html
  55. 334 0
      src/main/webapp/WEB-INF/views/marketing/CardInterestForm.html
  56. 221 0
      src/main/webapp/WEB-INF/views/marketing/CardInterestPopupForm.html
  57. 85 0
      src/main/webapp/WEB-INF/views/marketing/CardListPopupForm.html
  58. 336 0
      src/main/webapp/WEB-INF/views/marketing/CouponIssuePopupForm.html
  59. 3 3
      src/main/webapp/WEB-INF/views/marketing/CouponListForm.html
  60. 336 78
      src/main/webapp/WEB-INF/views/marketing/CouponPopupForm.html
  61. 1 1
      src/main/webapp/WEB-INF/views/marketing/FreeGoodsPromotionForm.html
  62. 5 5
      src/main/webapp/WEB-INF/views/marketing/FreeGoodsPromotionRegiForm.html
  63. 17 4
      src/main/webapp/WEB-INF/views/marketing/MailHeaderFooterDetailForm.html
  64. 2 2
      src/main/webapp/WEB-INF/views/marketing/MailHeaderFooterForm.html
  65. 49 30
      src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html
  66. 19 8
      src/main/webapp/WEB-INF/views/marketing/PointGrantPopupForm.html
  67. 159 102
      src/main/webapp/WEB-INF/views/order/CnclReqForm.html
  68. 20 21
      src/main/webapp/WEB-INF/views/order/ExchangeRequestForm.html
  69. 79 85
      src/main/webapp/WEB-INF/views/order/OrderDetailForm.html
  70. 6 0
      src/main/webapp/WEB-INF/views/order/OrderListForm.html
  71. 437 0
      src/main/webapp/WEB-INF/views/order/OrderSamplePopupForm.html
  72. 189 107
      src/main/webapp/WEB-INF/views/order/RtnReqForm.html
  73. 1 1
      src/main/webapp/ux/css/admin.ui.css
  74. 19 1
      src/main/webapp/ux/js/admin.popup.js
  75. 1 1
      src/main/webapp/ux/plugins/gaga/gaga.paging.js

+ 45 - 0
src/main/java/com/style24/admin/biz/dao/TsaCardPromotionDao.java

@@ -0,0 +1,45 @@
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.CardPromotion;
+
+/**
+ * 카드프로모션 Dao
+ *
+ * @author eskim
+ * @since 2021. 01. 29
+ */
+@ShopDs
+public interface TsaCardPromotionDao {
+
+	/**
+	 * 카드무이자할부 목록  건수
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 1. 29
+	 */
+	int getCardInterestListCount(CardPromotion cardPromotion);
+
+	/**
+	 * 카드무이자할부 목록
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 1. 29
+	 */
+	Collection<CardPromotion> getCardInterestList(CardPromotion cardPromotion);
+
+	/**
+	 * 카드무이자할부저장
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 1
+	 */
+	void saveCardInterest(CardPromotion cardPromotion);
+
+
+}

+ 0 - 6
src/main/java/com/style24/admin/biz/dao/TsaExchDao.java

@@ -1,12 +1,6 @@
 package com.style24.admin.biz.dao;
 
-import java.util.Collection;
-
-import org.apache.ibatis.session.ResultHandler;
-
 import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.OrderChange;
 
 /**
  * 교환관리 Dao

+ 30 - 0
src/main/java/com/style24/admin/biz/dao/TsaMorebetterDao.java

@@ -7,6 +7,7 @@ import org.apache.ibatis.session.ResultHandler;
 import org.springframework.stereotype.Component;
 
 import java.util.Collection;
+import java.util.List;
 
 /**
  * 마케팅 다다익선 Dao
@@ -222,6 +223,15 @@ public interface TsaMorebetterDao {
      */
     void createTmtbGoodsTemp(MoreBetterGoods moreBetterGoods);
 
+    /**
+     * 다다익선 - 입력받은 다다익선 적용 상품 insert
+     * @param
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 22
+     */
+    void createTmtbApplyGoodsTemp(MoreBetterGoods moreBetterGoods);
+
     /**
      * 다다익선 중복 상품 조회
      * @param moreBetterGoods
@@ -239,5 +249,25 @@ public interface TsaMorebetterDao {
      * @since 2021. 1. 26
      */
     void updateMorebetterStat(MoreBetter moreBetter);
+
+    /**
+     * 다다익선 - 중복제거 적용 상품 리스트 delete
+     * @param
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 22
+     */
+    void deleteTmtbApplyGoodsTemp(MoreBetterGoods moreBetterGoods);
+
+    /**
+     * 다다익선 중복제거 적용 상품 리스트 조회
+     * @param
+     * @return
+     * @author bin2107
+     * @since 2021. 2. 1
+     */
+    List<MoreBetterGoods> getMorebetterRealApplyGoodsList(MoreBetter moreBetter);
+
+    List<MoreBetterGoods> getMorebetterCompBrandGoodsList(MoreBetterGoods moreBetterGoods);
     /* // CSB 진행 */
 }

+ 0 - 188
src/main/java/com/style24/admin/biz/dao/TsaOrderChangeDao.java

@@ -1,188 +0,0 @@
-package com.style24.admin.biz.dao;
-
-import java.util.Collection;
-
-import org.apache.ibatis.session.ResultHandler;
-
-import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.OrderChange;
-
-/**
- * 취소관리 Dao
- *
- * @author jsh77b
- * @since 2020. 11. 16
- */
-@ShopDs
-public interface TsaOrderChangeDao {
-	
-	/**
-	 * 주문상세 > 주문취소신청 > 주문취소,반품,교환 대상목록
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	Collection<Order> getCancelRequestTargetList(Order order);
-		
-	/**
-	 * 주문상세 > 주문취소신청 > 주문변경정보 등록
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 22
-	 */
-	int createOrderChange(OrderChange orderChange);
-	
-	/**
-	 * 주문상세 > 주문취소신청 > 주문상세단품정보 수정
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 22
-	 */
-	int updateOrderDetailItem(Order order);
-	
-	/**
-	 * 주문상세 > 주문취소신청 > 주문상세단품정보 이력 등록
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 22
-	 */
-	int createOrderDetailItemHst(Order order);
-	
-	/**
-	 * 주문상세 > 주문취소신청 > 상품옵션 재고 원복
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2021. 01. 08
-	 */
-	int updateOptionQty(Order order);
-	
-	/**
-	 * 주문상세 > 주문취소신청 > 주문상세정보(취소,반품) 이력 등록
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 22
-	 */
-	int createOrderDetailHstCnclRtn(Order order);
-	
-	/**
-	 * 주문상세 > 주문취소신청 > 주문상세정보 수정
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 22
-	 */
-	int updateOrderDetail(Order order);
-	
-	/**
-	 * 주문상세 > 주문취소신청 > 주문변경정보상세 등록
-	 *
-	 * @param OrderChange - 주문 변경 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 22
-	 */
-	int createOrderChangeDetail(OrderChange orderChange);
-	
-	/**
-	 * 주문상세 > 주문취소신청 > 주문환불금액정보 등록
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 22
-	 */
-	int createPayment(Order order);
-	
-	/**
-	 * 주문상세 > 주문취소신청 > 주문환불정보 등록
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 22
-	 */
-	int createRefund(Order order);
-	
-	/**
-	 * 주문상세 > 주문취소신청 > 주문추가배송금액 등록
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2021. 01. 06
-	 */
-	int createDeliveryFee(Order order);
-	
-	/**
-	 * 주문상세 > 주문취소신청 > 주문사은품전체취소
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 22
-	 */
-	int updateOrdFreegiftDel(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);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-

+ 0 - 370
src/main/java/com/style24/admin/biz/dao/TsaOrderDao.java

@@ -1,370 +0,0 @@
-package com.style24.admin.biz.dao;
-
-import java.util.Collection;
-
-import org.apache.ibatis.session.ResultHandler;
-
-import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.OrderChange;
-
-/**
- * 주문관리 Dao
- *
- * @author jsh77b
- * @since 2020. 11. 16
- */
-@ShopDs
-public interface TsaOrderDao {
-
-	/**
-	 * 주문 목록 카운트
-	 * @param Order
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	int getOrderListCount(Order order);
-
-	/**
-	 * 주문 목록
-	 * @param Order
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	Collection<Order> getOrderList(Order order);
-
-	/**
-	 * 주문기본정보
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	Collection<Order> getOrderInfoList(Order order);
-
-	/**
-	 * 주문상품정보 목록
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	Collection<Order> getOrderDetailList(Order order);
-
-	/**
-	 * 주문상세 > 사은품목록
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	Collection<Order> getOrderFreeGiftList(Order order);
-
-	/**
-	 * 배송정보
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	Collection<Order> getDeliveryAddrList(Order order);
-
-	/**
-	 * 결제내역 > 결제 기본정보
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	Collection<Order> getOrderPaymentBasicInfoList(Order order);
-
-	/**
-	 * 배송비 정보
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	Collection<Order> getDeliveryFeeList(Order order);
-
-	/**
-	 * 반품/교환 > 반품/교환 정보
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	Collection<Order> getOrderChangeList(Order order);
-
-	/**
-	 * 환불정보
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	Collection<Order> getOrderRefundInfo(Order order);
-
-	/**
-	 * 상담내역
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	Collection<Order> getOrderCounselInfo(Order order);
-
-	/**
-	 * 변경내역 > 주문요청 관리자 메모
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	Collection<Order> getOrderMemoList(Order order);
-
-	/**
-	 * 입점업체미발주 주문목록
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	Collection<Order> getOrderSellerUnorderList(Order order);
-
-	/**
-	 * 입점업체 엑셀다운용 임시테이블 삭제
-	 *
-	 * @param Order
-	 * @author jsh77b
-	 * @since 2020. 11. 30
-	 */
-	void deleteEntryExcelDownTmp(Order order);
-
-	/**
-	 * 주문상세상태 수정 - 입점
-	 *
-	 * @param Order
-	 * @author jsh77b
-	 * @since 2020. 11. 30
-	 */
-	int updateOrderDetailStat(Order order);
-
-	/**
-	 * 주문상세 이력 등록
-	 *
-	 * @param Order
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 30
-	 */
-	int createOrderDetailHst(Order order);
-
-	/**
-	 * 엑셀 다운로드용 임시테이블 데이타 체크
-	 *
-	 * @param Order
-	 * @author jsh77b
-	 * @since 2020. 11. 30
-	 */
-	int getEntryUploadExcelCheck(Order order);
-
-	/**
-	 * 입점업체 엑셀다운용 임시테이블 생성
-	 *
-	 * @param Order
-	 * @author jsh77b
-	 * @since 2020. 11. 30
-	 */
-	void createEntryExcelDownTmp(Order order);
-
-	/**
-	 * 입점업체미발주목록
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 30
-	 */
-	Collection<Order> getSellerUnorderList(Order order);
-
-	/**
-	 * 주문 엑셀다운로드
-	 *
-	 * @param Order
-	 * @param handler - ResultHandler
-	 * @author jsh77b
-	 * @since 2020. 11. 30
-	 */
-	void getSellerUnorderList(Order order, ResultHandler<Order> handler);
-
-	/**
-	 * 주문상세 정보
-	 *
-	 * @param ordDtlNo - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 30
-	 */
-	Order getOrderDetailInfo(Order order);
-
-	/**
-	 * 주문상세정보 변경 - 송장번호 적용(입점)
-	 *
-	 * @param Order
-	 * @author jsh77b
-	 * @since 2020. 11. 30
-	 */
-	int updateOrderDetailInvoice(Order order);
-
-	/**
-	 * 주문상세 > 주문메오 > 주문메모정보조회
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	Order getOrderMemoInfo(Order order);
-
-	/**
-	 * 주문상세 > 주문요청 관리자 메모 > 메모등록
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	int createOrderMemo(Order order);
-
-	/**
-	 * 주문상세 > 주문요청 관리자 메모 > 메모수정
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	int updateOrderMemo(Order order);
-
-	/**
-	 * 주문상세 > 주문요청 관리자 메모 > 메모삭제
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	int deleteOrderMemo(Order order);
-
-	/**
-	 * 주문상품 상세 변경 이력 화면
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	Collection<Order> getOrderDetailHistoryList(Order order);
-
-	/**
-	 * 쿠폰사용 내역 팝업 화면
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	Collection<Order> getOrderDiscountCouponList(Order order);
-
-	/**
-	 * 포인트사용 내역 팝업 화면
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	Collection<Order> getOrderDiscountPointList(Order order);
-
-	/**
-	 * 상품권사용 내역 팝업 화면
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	Collection<Order> getOrderGiftcardHstList(Order order);
-
-	/**
-	 * 다다익선적용 내역 팝업 화면
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	Collection<Order> getOrderTmtbHstList(Order order);
-
-	/**
-	 * 주문상세상태를 변경
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 22
-	 */
-	int changedOrdDtlStat(Order order);
-
-	/**
-	 * 배송 > 배송지 정보 수정
-	 *
-	 * @param Order
-	 * @author jsh77b
-	 * @since 2021. 01. 15
-	 */
-	void updateOrderAddr(Order order);
-
-	/**
-	 * 반품/교환 > 회수지 정보 수정
-	 *
-	 * @param Order
-	 * @author jsh77b
-	 * @since 2021. 01. 18
-	 */
-	void updateOrderChange(Order order);
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-

+ 14 - 4
src/main/java/com/style24/admin/biz/dao/TsaPgDao.java

@@ -2,11 +2,9 @@ package com.style24.admin.biz.dao;
 
 import java.util.Collection;
 
-import org.apache.ibatis.session.ResultHandler;
-
 import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.OrderChange;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.OrderSample;
 
 /**
  * 주문관리 Dao
@@ -17,6 +15,18 @@ import com.style24.persistence.domain.OrderChange;
 @ShopDs
 public interface TsaPgDao {
 
+	/* 주문 샘플 데이터 (추후 삭제 예정) */
+	Collection<Goods> getOrderSampleGoodsInfo(Goods goods);
+	Goods getOrderSampleGoodsStock(Goods goods);
+	int createOrderSample(OrderSample orderSample);
+	int createDelveryAddrSample(OrderSample orderSample);
+	int createDeliveryFeeSample(OrderSample orderSample);
+	int createOrderDetailSample(OrderSample orderSample);
+	int createOrderDetailItemSample(OrderSample orderSample);
+	int createPaymentSample(OrderSample orderSample);
+	int updateDeliveryFeeSample(OrderSample orderSample);
+	/* //주문 샘플 데이터 (추후 삭제 예정) */
+
 }
 
 

+ 0 - 6
src/main/java/com/style24/admin/biz/dao/TsaRefundDao.java

@@ -1,12 +1,6 @@
 package com.style24.admin.biz.dao;
 
-import java.util.Collection;
-
-import org.apache.ibatis.session.ResultHandler;
-
 import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.OrderChange;
 
 /**
  * 주문관리 Dao

+ 0 - 6
src/main/java/com/style24/admin/biz/dao/TsaReturnDao.java

@@ -1,12 +1,6 @@
 package com.style24.admin.biz.dao;
 
-import java.util.Collection;
-
-import org.apache.ibatis.session.ResultHandler;
-
 import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.OrderChange;
 
 /**
  * 반품관리 Dao

+ 65 - 0
src/main/java/com/style24/admin/biz/service/TsaCardPromotionService.java

@@ -0,0 +1,65 @@
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.admin.biz.dao.TsaCardPromotionDao;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.persistence.domain.CardPromotion;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 카드프로모션 Service
+ *
+ * @author eskim
+ * @since 2021. 01. 29
+ */
+@Service
+@Slf4j
+public class TsaCardPromotionService {
+
+	@Autowired
+	private TsaCardPromotionDao cardPromotionDao;
+
+	/**
+	 * 카드무이자할부 목록 건ㄴ수
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 29
+	 */
+	public int getCardInterestListCount(CardPromotion cardPromotion) {
+		return cardPromotionDao.getCardInterestListCount(cardPromotion);
+	}
+
+	/**
+	 * 카드무이자할부 목록
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 29
+	 */
+	public Collection<CardPromotion> getCardInterestList(CardPromotion cardPromotion) {
+		return cardPromotionDao.getCardInterestList(cardPromotion);
+	}
+
+	/**
+	 * 카드무이자할부 저장
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 02. 1
+	 */
+	public void saveCardInterest(CardPromotion cardPromotion) {
+
+		Integer userNo = TsaSession.getInfo().getUserNo();
+
+
+		cardPromotionDao.saveCardInterest(cardPromotion);
+	}
+
+
+}

+ 14 - 2
src/main/java/com/style24/admin/biz/service/TsaCouponService.java

@@ -5,6 +5,7 @@ import com.google.gson.reflect.TypeToken;
 import com.style24.admin.biz.dao.TsaCouponDao;
 import com.style24.admin.support.env.TsaConstants;
 import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.env.TscConstants;
 import com.style24.persistence.domain.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -166,7 +167,7 @@ public class TsaCouponService {
 		}
 
 		// 시리얼 쿠폰 생성(최초 쿠폰 생성일 경우에만)
-		if(cpnId == 0 && params.getCpnType().equals(TsaConstants.CpnType.PAY_CPN.value()) && params.getDcCdGb().equals(TsaConstants.DcCdGb.SERIAL.value())) {
+		if(cpnId == 0 && params.getCpnType().equals(TscConstants.CpnType.PAY_CPN.value()) && params.getDcCdGb().equals(TscConstants.DcCdGb.SERIAL.value())) {
 			// 시리얼 쿠폰명이 동일한 쿠폰이 일정 겹치는 부분이 있는지 확인
 			int overlapCheck = couponDao.getSerialOverlapCheck(params);
 			if(overlapCheck < 1) {
@@ -176,7 +177,7 @@ public class TsaCouponService {
 			} else {
 				throw new IllegalStateException("같은 시리얼명이 사용되는 쿠폰이 중복됩니다. 기간을 확인해주세요.");
 			}
-		} else if(cpnId == 0 && params.getCpnType().equals(TsaConstants.CpnType.PAY_CPN.value()) && params.getDcCdGb().equals(TsaConstants.DcCdGb.RANDOM.value())) {
+		} else if(cpnId == 0 && params.getCpnType().equals(TscConstants.CpnType.PAY_CPN.value()) && params.getDcCdGb().equals(TscConstants.DcCdGb.RANDOM.value())) {
 			Random random = new Random();
 			String prefixRandomCpn = "" + params.getCpnId();		// 랜덤 번호는 쿠폰번호 + 랜덤문자 = 12로 처리함
 			// 랜덤 문자 발급 수 만큼 진행
@@ -408,4 +409,15 @@ public class TsaCouponService {
 	public ArrayList<CustCoupon> getRandomCouponInfo(int cpnId) {
 		return couponDao.getRandomCouponInfo(cpnId);
 	}
+
+	/**
+	 * 회원상세 - 쿠폰발급
+	 * @param coupon - 쿠폰정보
+	 * @author jsshin
+	 * @since 2021. 1. 29
+	 */
+	@Transactional("shopTxnManager")
+	public void saveCouponIssue(CustCoupon coupon) {
+		couponDao.saveCouponCustPub(coupon);
+	}
 }

+ 9 - 4
src/main/java/com/style24/admin/biz/service/TsaGoodsService.java

@@ -3538,14 +3538,19 @@ public class TsaGoodsService {
 	 */
 	public void saveSizeInfo(SizeInfo sizeInfo) {
 
+		//log.info("[saveSizeInfo] sizeInfo {}", sizeInfo);
 		String sizeCate1Cd = "";
 		String sizeCate2Cd = "";
 		if ("1".equals(sizeInfo.getSizeGb()) ){
-			sizeCate1Cd = "00";
-			if ("Y".equals(sizeInfo.getSelfYn())){
-				sizeCate1Cd = sizeInfo.getBrandCd();
+
+			if (StringUtils.isBlank(sizeInfo.getSizeCate1Cd())) {
+				sizeCate1Cd = "00";
+				if ("Y".equals(sizeInfo.getSelfYn())){
+					sizeCate1Cd = sizeInfo.getBrandCd();
+				}
+				sizeInfo.setSizeCate1Cd(sizeCate1Cd);
 			}
-			sizeInfo.setSizeCate1Cd(sizeCate1Cd);
+
 			if (StringUtils.isBlank(sizeInfo.getSizeCate2Cd())) {
 				sizeCate2Cd = commonService.getNextSequence("SEQ_CATE").toString();
 				sizeInfo.setSizeCate2Cd(sizeCate2Cd);

+ 35 - 11
src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java

@@ -16,6 +16,7 @@ import com.style24.admin.biz.dao.TsaMorebetterDao;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
 /**
  *마케팅>다다익선 Service
@@ -143,8 +144,6 @@ public class TsaMorebetterService {
         moreBetter.setUpdNo(TsaSession.getInfo().getUserNo());
         Gson gson = new Gson();
         String jsonData = gson.toJson(moreBetter);
-        log.info("{ saveMoreBetterDetail jsonData}",jsonData);
-        log.info("{ saveMoreBetterDetail moreBetter}",moreBetter);
 
         // TMTB 마스터(TB_TMTB) 저장
         morebetterDao.saveMorebetterMst(moreBetter);
@@ -171,16 +170,21 @@ public class TsaMorebetterService {
             morebetterDao.saveMorebetterGoods(regBrand);
         }
 
+        List<MoreBetterGoods> realApplyGoodsList = morebetterDao.getMorebetterRealApplyGoodsList(moreBetter);
         // 적용상품
-        for(MoreBetterGoods regApplyGoods : moreBetter.getApplyGoodsList()){
-            // 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
-            regApplyGoods.setTmtbSq(moreBetter.getTmtbSq());
-            regApplyGoods.setTargetVal(regApplyGoods.getGoodsCd());
-            regApplyGoods.setRegNo(moreBetter.getRegNo());
-            regApplyGoods.setUpdNo(moreBetter.getUpdNo());
-
-            morebetterDao.saveMorebetterGoods(regApplyGoods);
-            morebetterDao.saveMorebetterApplyGoods(regApplyGoods);
+        for(MoreBetterGoods realApplyGoods : realApplyGoodsList){
+            for(MoreBetterGoods regApplyGoods : moreBetter.getApplyGoodsList()){
+                if(regApplyGoods.getGoodsCd().equals(realApplyGoods.getGoodsCd())){
+                    // 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
+                    regApplyGoods.setTmtbSq(moreBetter.getTmtbSq());
+                    regApplyGoods.setTargetVal(realApplyGoods.getGoodsCd());
+                    regApplyGoods.setRegNo(moreBetter.getRegNo());
+                    regApplyGoods.setUpdNo(moreBetter.getUpdNo());
+
+                    morebetterDao.saveMorebetterGoods(regApplyGoods);
+                    morebetterDao.saveMorebetterApplyGoods(regApplyGoods);
+                }
+            }
         }
 
         // 제외상품
@@ -338,6 +342,26 @@ public class TsaMorebetterService {
     public void createMorebetterGoodsTemp(MoreBetterGoods moreBetterGoods){
         moreBetterGoods.setRegNo(TsaSession.getInfo().getUserNo());
 
+        morebetterDao.deleteTmtbApplyGoodsTemp(moreBetterGoods);
+
+        List<MoreBetterGoods> applyGoodsList = moreBetterGoods.getApplyGoodsList();
+
+        if(moreBetterGoods.getMultiSupplyCompCd().length > 0 || moreBetterGoods.getMultiBrand().length > 0){
+            List<MoreBetterGoods> compBrandGoodsList = morebetterDao.getMorebetterCompBrandGoodsList(moreBetterGoods);
+            if(compBrandGoodsList.size() > 0){
+
+                for(int i=0; i<compBrandGoodsList.size(); i++){
+                    moreBetterGoods.setGoodsCd(compBrandGoodsList.get(i).getGoodsCd());
+                    morebetterDao.createTmtbApplyGoodsTemp(moreBetterGoods);
+                    applyGoodsList.add(compBrandGoodsList.get(i));
+                }
+            }
+        }
+
+        for(int i=0; i<moreBetterGoods.getMultiApplyGoods().length; i++){
+            moreBetterGoods.setGoodsCd(moreBetterGoods.getMultiApplyGoods()[i]);
+            morebetterDao.createTmtbApplyGoodsTemp(moreBetterGoods);
+        }
         morebetterDao.deleteTmtbGoodsTemp(moreBetterGoods);
         morebetterDao.createTmtbGoodsTemp(moreBetterGoods);
     }

+ 0 - 80
src/main/java/com/style24/admin/biz/service/TsaOrderChangeService.java

@@ -1,80 +0,0 @@
-package com.style24.admin.biz.service;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.env.Environment;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.gagaframework.web.parameter.GagaMap;
-import com.style24.admin.biz.dao.TsaOrderDao;
-import com.style24.admin.biz.dao.TsaOrderChangeDao;
-import com.style24.admin.biz.dao.TsaRefundDao;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.biz.dao.TscOrderChangeDao;
-import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.OrderChange;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 취소관리 Service
- *
- * @author jsh77b
- * @since 2020. 11. 16
- */
-@Service
-@Slf4j
-public class TsaOrderChangeService {
-
-	@Autowired
-	private TscMessageByLocale message;
-
-	@Autowired
-	private Environment env;
-
-	@Autowired
-	private TsaOrderDao orderDao;
-	
-	@Autowired
-	private TsaOrderChangeDao orderChangeDao;
-
-	@Autowired
-	private ObjectMapper mapper;
-		
-	/**
-	 * 주문 환불계좌
-	 *
-	 * @param order - 주문정보
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2021. 01. 04.
-	 */
-	public Collection<Order> getRefundAccount(Order order) {
-		return orderChangeDao.getRefundAccount(order);
-	}
-	
-	/**
-	 * 환불계좌 저장
-	 *
-	 * @param order - 주문정보
-	 * @return TsaOrder
-	 * @author jsh77b
-	 * @since 2021. 01. 05.
-	 */
-	public int saveRefundAccount(Order order) {
-		
-		// 환불계좌 유무 체크 후 등록
-		if (orderChangeDao.getRefundAccountCheck(order) < 1) {
-			orderChangeDao.saveRefundAccount(order);
-		}
-		
-		return 1;
-	}
-	
-}

+ 0 - 568
src/main/java/com/style24/admin/biz/service/TsaOrderService.java

@@ -1,568 +0,0 @@
-package com.style24.admin.biz.service;
-
-import java.util.Collection;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.env.Environment;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.gagaframework.excel.env.GagaExcelConstants;
-import com.gagaframework.excel.xssf.GagaExcelResultHandler;
-import com.style24.admin.biz.dao.TsaOrderDao;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.persistence.domain.Order;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 주문관리 Service
- *
- * @author jsh77b
- * @since 2020. 11. 16
- */
-@Service
-@Slf4j
-public class TsaOrderService {
-
-	@Autowired
-	private TscMessageByLocale message;
-
-	@Autowired
-	private Environment env;
-
-	@Autowired
-	private TsaOrderDao orderDao;
-
-	@Autowired
-	private ObjectMapper mapper;
-
-	/**
-	 * 주문목록 카운트
-	 * @param Order
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	public int getOrderListCount(Order order) {
-		return orderDao.getOrderListCount(order);
-	}
-
-	/**
-	 * 주문목록
-	 * @param Order
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	public Collection<Order> getOrderList(Order order) {
-		return orderDao.getOrderList(order);
-	}
-
-	/**
-	 * 주문기본정보
-	 *
-	 * @param order - 주문 정보
-	 * @return Collection<Order>
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	public Collection<Order> getOrderInfoList(Order order) {
-		return orderDao.getOrderInfoList(order);
-	}
-
-	/**
-	 * 주문상품정보 목록
-	 *
-	 * @param order - 주문 정보
-	 * @return Collection<Order>
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	public Collection<Order> getOrderDetailList(Order order) {
-		return orderDao.getOrderDetailList(order);
-	}
-
-	/**
-	 * 사은품목록
-	 *
-	 * @param order - 주문 정보
-	 * @return Collection<Order>
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	public Collection<Order> getOrderFreeGiftList(Order order) {
-		return orderDao.getOrderFreeGiftList(order);
-	}
-
-	/**
-	 * 배송정보
-	 *
-	 * @param order - 주문 정보
-	 * @return Collection<Order>
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	public Collection<Order> getDeliveryAddrList(Order order) {
-		return orderDao.getDeliveryAddrList(order);
-	}
-
-	/**
-	 * 결제정보
-	 *
-	 * @param order - 주문 정보
-	 * @return Collection<Order>
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	public Collection<Order> getOrderPaymentBasicInfoList(Order order) {
-		return orderDao.getOrderPaymentBasicInfoList(order);
-	}
-
-	/**
-	 * 배송비정보
-	 *
-	 * @param order - 주문 정보
-	 * @return Collection<Order>
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	public Collection<Order> getDeliveryFeeList(Order order) {
-		return orderDao.getDeliveryFeeList(order);
-	}
-
-	/**
-	 * 취소/반품/교환 요청 정보
-	 *
-	 * @param order - 주문 정보
-	 * @return Collection<Order>
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	public Collection<Order> getOrderChangeList(Order order) {
-		return orderDao.getOrderChangeList(order);
-	}
-
-	/**
-	 * 환불정보
-	 *
-	 * @param order - 주문 정보
-	 * @return Collection<Order>
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	public Collection<Order> getOrderRefundInfo(Order order) {
-		return orderDao.getOrderRefundInfo(order);
-	}
-
-	/**
-	 * 상담내역
-	 *
-	 * @param order - 주문 정보
-	 * @return Collection<Order>
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	public Collection<Order> getOrderCounselInfo(Order order) {
-		return orderDao.getOrderCounselInfo(order);
-	}
-
-	/**
-	 * 주문요청 관리자 메모 목록 조회
-	 *
-	 * @param order - 주문 정보
-	 * @return Collection<Order>
-	 * @author jsh77b
-	 * @since 2020. 11. 18
-	 */
-	public Collection<Order> getOrderMemoList(Order order) {
-		order.setDelYn("N");
-		return orderDao.getOrderMemoList(order);
-	}
-
-	/**
-	 * 입점업체미발주 주문목록
-	 * @param Order
-	 * @return Collection<Order>
-	 * @author jsh77b
-	 * @since 2020. 11. 30
-	 */
-	public Collection<Order> getOrderSellerUnorderList(Order order) {
-		return orderDao.getOrderSellerUnorderList(order);
-	}
-
-	/**
-	 * 입점업체미발주목록 - 엑셀다운로드시 주문상태값 변경(상품준비중)
-	 *
-	 * @param orderList - 주문 정보
-	 * @author jsh77b
-	 * @since 2020. 11. 30
-	 */
-	@Transactional("shopTxnManager")
-	public void saveUnorderStatus(Collection<Order> orderList) {
-
-		// 1. 임시테이블 삭제
-		Order deleteOrder = new Order();
-		deleteOrder.setRegNo(TsaSession.getInfo().getUserNo());
-		orderDao.deleteEntryExcelDownTmp(deleteOrder);
-
-		for (Order oneData : orderList) {
-
-			Order updateData = new Order();
-
-			updateData.setOrdNo(oneData.getOrdNo());
-			updateData.setOrdDtlNo(oneData.getOrdDtlNo());
-			updateData.setBrandCd(oneData.getBrandCd());
-			updateData.setSupplyCompCd(oneData.getSupplyCompCd());
-			updateData.setRegNo(TsaSession.getInfo().getUserNo());
-			updateData.setUpdNo(TsaSession.getInfo().getUserNo());
-
-			// 2. 주문상세상태값 변경
-			// 2.1 2020.12.15 주문상태체크추가 (결제완료 상태만 상품준비중 변경)
-			int result = orderDao.updateOrderDetailStat(updateData);
-
-			if (result > 0) {
-				// 3. 주문상세상태 변경 이력생성
-				orderDao.createOrderDetailHst(updateData);
-			}
-
-			// 4. 엑셀 다운로드용 임시테이블 데이타 체크
-			result = orderDao.getEntryUploadExcelCheck(updateData);
-			if (result < 1) {
-
-				// 5. 엑셀 다운로드용 임시테이블 저장
-				orderDao.createEntryExcelDownTmp(updateData);
-			}
-		}
-	}
-
-	/**
-	 * 입점업체미발주목록 엑셀다운로드
-	 *
-	 * @param order - 주문정보
-	 * @param excelFilenameWithPath - 경로를 포함한 엑셀파일명
-	 * @author jsh77b
-	 * @since 2020. 11. 30
-	 */
-	public void geSellerUnorderExcelList(Order order, String excelFilenameWithPath) {
-
-		// 헤더 title 설정 (23)
-		String[] listTitles = {
-				"입점업체"
-				, "브랜드"
-				, "상품타입"
-				, "상품코드"
-				, "상품명"
-				, "주문번호"
-				, "주문상세번호"
-				, "주문상세상태"
-				, "주문자명"
-				, "주문일시"
-				, "결제수단"
-				, "주문자휴대전화"
-				, "수령자명"
-				, "수령자휴대전화"
-				, "수령자우편번호"
-				, "수령자기본주소"
-				, "수령자상세주소"
-				, "업체상품코드"
-				, "단품코드"
-				, "단품상품명"
-				, "칼라"
-				, "사이즈"
-				, "주문수량"
-				, "주문금액"
-				, "할인금액"
-				, "실결제금액"
-				, "송장"
-		};
-
-		// DB 처리 시 사용되는 파라미터명(셀명) 설정 (23)
-		String[] cellNames = {
-				"supplyCompNm"
-				, "brandKnm"
-				, "goodsTypeNm"
-				, "goodsCd"
-				, "goodsNm"
-				, "ordNo"
-				, "ordDtlNo"
-				, "ordDtlStatNm"
-				, "ordNm"
-				, "ordDt"
-				, "payMeansNm"
-				, "ordPhnno"
-				, "recipNm"
-				, "recipPhnno"
-				, "recipZipNo"
-				, "recipBaseAddr"
-				, "recipDtlAddr"
-				, "supplyGoodsCd"
-				, "itemCd"
-				, "itemNm"
-				, "optCd1"
-				, "optCd2"
-				, "itemOrdQty"
-				, "ordAmt"
-				, "totDcAmt"
-				, "realOrdAmt"
-				, "invoiceNo"
-		};
-
-		String[] cellTypes = {
-				GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-				, GagaExcelConstants.CellType.CHAR_CENTER.name()
-		};
-
-		GagaExcelResultHandler<Order> handler = new GagaExcelResultHandler<>(excelFilenameWithPath, "출고배송목록(입점)", listTitles, cellNames, cellTypes);
-
-		orderDao.getSellerUnorderList(order, handler);
-
-		handler.close();
-	}
-
-	/**
-	 * 입점업체미발주목록 - 송장번호 입력(출고완료)
-	 *
-	 * @param orderList - 주문 정보
-	 * @return String - 결과메시지
-	 * @author jsh77b
-	 * @since 2020. 11. 30
-	 */
-	@Transactional("shopTxnManager")
-	public String saveUnorderInvoice(Collection<Order> orderList) {
-		String resultMsg;
-		int totalCount 			= 0;	// 전체 카운트
-		int failedCount 		= 0;	// 몰 실패 카운트
-		int successCount 		= 0;	// 몰 성공 카운트
-		String failedGoodCdStr 	= "";	// 실패 상품 리스트
-
-		// 1. 송장번호 등록 대상 목록 처리
-		for (Order oneData : orderList) {
-
-			// 2. 송장번호, 업체코드 체크
-			if (!StringUtils.isEmpty(oneData.getInvoiceNo()) && !StringUtils.isEmpty(oneData.getShipCompCd())) {
-				totalCount++;
-
-				Order updateData = new Order();
-				updateData.setOrdNo(oneData.getOrdNo());
-				updateData.setOrdDtlNo(oneData.getOrdDtlNo());
-				updateData.setBrandCd(oneData.getBrandCd());
-				updateData.setSupplyCompCd(oneData.getSupplyCompCd());
-				updateData.setRegNo(TsaSession.getInfo().getUserNo());
-				updateData.setUpdNo(TsaSession.getInfo().getUserNo());
-				updateData.setItemCd(oneData.getItemCd());
-				updateData.setOptCd2(oneData.getOptCd2());
-				updateData.setShipCompCd(oneData.getShipCompCd());
-				updateData.setInvoiceNo(oneData.getInvoiceNo().replace("-", ""));
-
-				// 3. 원주문 상세정보 조회
-				// 2020.12.15 세트상품의 경우에는 2개 이상의 row 가 표시됨 (주문상세번호 + 상풐코드로 + 사이즈코드) 변경
-				Order orgOrder = orderDao.getOrderDetailInfo(oneData);
-				if (orgOrder == null) {
-					failedGoodCdStr += updateData.getItemCd() + " /  " + updateData.getOptCd2() + "(Error1)<br/>"; // 상품정보 (상품명 + 칼라명) / 사이즈코드
-					failedCount++;
-					continue;
-				}
-
-				// 4. 상품코드, 사이즈, 주문수량 체크 (세트상품도 단품 단위로 업로드 요청)
-				// 2020.12.15 세트상품 때문에 단품단위로 비교
-				if (!orgOrder.getItemCd().equals(updateData.getItemCd())
-						|| !orgOrder.getOptCd2().equals(updateData.getOptCd2()) ) {
-					failedGoodCdStr += updateData.getItemCd() + " /  " + updateData.getOptCd2() + "(Error2)<br/>";
-					failedCount++;
-					continue;
-				}
-
-				// 5. 업체코드설정
-				updateData.setSupplyCompCd(orgOrder.getSupplyCompCd());
-
-				// 6. 송장번호등록
-				int result = orderDao.updateOrderDetailInvoice(updateData);
-
-				// 7. 주문상세상태 변경 이력 등록
-				if (result > 0) {
-					successCount++;
-					orderDao.createOrderDetailHst(updateData);
-				} else {
-					failedGoodCdStr += updateData.getItemCd() + " /  " + updateData.getOptCd2() + "(Error3)<br/>";
-					failedCount++;
-				}
-			}
-		}
-
-		resultMsg = "출고완료 : " + totalCount + "건 / 실패 : " + failedCount + "건 / 성공 : " + successCount + "건 <br/>" + "실패 목록 : " + failedGoodCdStr;
-
-		return resultMsg;
-	}
-
-	/**
-	 * 주문상세 > 주문요청 관리자 메모 > 메모정보조회
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	public Order getOrderMemoInfo(Order order) {
-		return orderDao.getOrderMemoInfo(order);
-	}
-
-	/**
-	 * 주문상세 > 주문요청 관리자 메모 > 메모등록
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	public void createOrderMemo(Order order) {
-		orderDao.createOrderMemo(order);
-	}
-
-	/**
-	 * 주문상세 > 주문요청 관리자 메모 > 메모수정
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	public void updateOrderMemo(Order order) {
-		orderDao.updateOrderMemo(order);
-	}
-
-	/**
-	 * 주문상세 > 주문요청 관리자 메모 > 메모삭제
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	public void deleteOrderMemo(Order order) {
-		orderDao.deleteOrderMemo(order);
-	}
-
-	/**
-	 * 주문상품 상세 변경 이력 화면
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	public Collection<Order> getOrderDetailHistoryList(Order order) {
-		return orderDao.getOrderDetailHistoryList(order);
-	}
-
-	/**
-	 * 쿠폰사용 내역 팝업 화면
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	public Collection<Order> getOrderDiscountCouponList(Order order) {
-		return orderDao.getOrderDiscountCouponList(order);
-	}
-
-	/**
-	 * 포인트사용 내역 팝업 화면
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	public Collection<Order> getOrderDiscountPointList(Order order) {
-		return orderDao.getOrderDiscountPointList(order);
-	}
-
-	/**
-	 * 상품권사용 내역 팝업 화면
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	public Collection<Order> getOrderGiftcardHstList(Order order) {
-		return orderDao.getOrderGiftcardHstList(order);
-	}
-
-	/**
-	 * 다다익선적용 내역 팝업 화면
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	public Collection<Order> getOrderTmtbHstList(Order order) {
-		return orderDao.getOrderTmtbHstList(order);
-	}
-
-	/**
-	 * 주문상세상태를 변경
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	public void changedOrdDtlStat(Order order) {
-		// 1. 주문상세상태변경
-		int resultInt = orderDao.changedOrdDtlStat(order);
-
-		// 2. 주문상세상태변경 성공 후 주문상세 이력을 등록
-		if (resultInt > 0) {
-			orderDao.createOrderDetailHst(order);
-		}
-	}
-	
-	/**
-	 * 배송 > 배송지 정보 수정
-	 *
-	 * @param Order - 배송지 정보
-	 * @author jsh77b
-	 * @since 2021. 01. 15
-	 */
-	@Transactional("shopTxnManager")
-	public void updateOrderAddr(Order order) {
-		order.setUpdNo(TsaSession.getInfo().getUserNo());
-		orderDao.updateOrderAddr(order);
-	}
-	
-	/**
-	 * 반품/교환 > 회수지 정보 수정
-	 *
-	 * @param Order - 배송지 정보
-	 * @author jsh77b
-	 * @since 2021. 01. 18
-	 */
-	@Transactional("shopTxnManager")
-	public void updateOrderChange(Order order) {
-		order.setUpdNo(TsaSession.getInfo().getUserNo());
-		orderDao.updateOrderChange(order);
-	}
-
-}

+ 114 - 10
src/main/java/com/style24/admin/biz/service/TsaPgService.java

@@ -1,25 +1,24 @@
 package com.style24.admin.biz.service;
 
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
+import org.springframework.data.redis.connection.SortParameters;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.gagaframework.excel.env.GagaExcelConstants;
-import com.gagaframework.excel.xssf.GagaExcelResultHandler;
 import com.gagaframework.web.parameter.GagaMap;
-import com.style24.admin.biz.dao.TsaOrderDao;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.admin.support.util.TsitUtil;
+import com.gagaframework.web.rest.server.GagaResponseStatus;
+import com.style24.admin.biz.dao.TsaPgDao;
+import com.style24.core.biz.dao.TscOrderDao;
+import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.OrderChange;
+import com.style24.persistence.domain.OrderSample;
+import com.style24.persistence.domain.OrderSampleGoods;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -40,9 +39,114 @@ public class TsaPgService {
 	private Environment env;
 
 	@Autowired
-	private TsaOrderDao orderDao;
+	private TscOrderDao orderDao;
 
 	@Autowired
 	private ObjectMapper mapper;
 	
+	@Autowired
+	private TsaPgDao pgDao;
+	
+	/* 주문 샘플 데이터 (추후 삭제 예정) */
+	public Collection<Goods> getOrderSampleGoodsInfo(Goods goods) {
+		return pgDao.getOrderSampleGoodsInfo(goods);
+	}
+	
+	public Goods getOrderSampleGoodsStock(Goods goods) {
+		return pgDao.getOrderSampleGoodsStock(goods);
+	}
+	
+	public GagaMap createOrderSample(OrderSample orderSample) {
+		GagaMap result = new GagaMap();
+		
+		int custNo = orderSample.getCustNo();
+		String ordNm = orderSample.getOrdNm();
+		String ordPhnno = orderSample.getOrdPhnno();
+		String ordEmail = orderSample.getOrdEmail();
+		String recipZipcode = orderSample.getRecipZipcode();
+		String recipBaseAddr = orderSample.getRecipBaseAddr();
+		String recipDtlAddr = orderSample.getRecipDtlAddr();
+		
+		
+		OrderSample order = new OrderSample();
+		order.setCustNo(custNo);
+		order.setOrdNm(ordNm);
+		order.setOrdPhnno(ordPhnno);
+		order.setOrdEmail(ordEmail);
+		pgDao.createOrderSample(order);
+		
+		int ordNo = order.getOrdNo();
+		
+		OrderSample deliveryAddr = new OrderSample();
+		deliveryAddr.setOrdNm(ordNm);
+		deliveryAddr.setOrdPhnno(ordPhnno);
+		deliveryAddr.setRecipZipcode(recipZipcode);
+		deliveryAddr.setRecipBaseAddr(recipBaseAddr);
+		deliveryAddr.setRecipDtlAddr(recipDtlAddr);
+		deliveryAddr.setCustNo(custNo);
+		pgDao.createDelveryAddrSample(deliveryAddr);
+		
+		int delvAddrSq = deliveryAddr.getDelvAddrSq();
+
+		int delvFeeSq = 0;
+		int ordDtlNo = 0;
+		for (OrderSampleGoods orderSampleGoods : orderSample.getGoods()) {
+			String goodsCd = orderSampleGoods.getGoodsCd();
+			String compsGoodsCd = orderSampleGoods.getCompsGoodsCd();
+			int ordQty = orderSampleGoods.getOrdQty();
+			String optCd = orderSampleGoods.getOptCd();
+			
+			
+			OrderSample deliveryFee = new OrderSample();
+			deliveryFee.setOrdNo(ordNo);
+			deliveryFee.setDelvFeeGb(TscConstants.DeliveryFeeGb.ORIGIN_DELIVERY_FEE.value());
+			deliveryFee.setCustNo(custNo);
+			deliveryFee.setGoodsCd(goodsCd);
+			pgDao.createDeliveryFeeSample(deliveryFee);
+			
+			if (deliveryFee.getDelvFeeSq() != 0) {
+				delvFeeSq = deliveryFee.getDelvFeeSq();
+			}
+			
+			OrderSample orderDetail = new OrderSample();
+			orderDetail.setOrdNo(ordNo);
+			orderDetail.setOrdDtlStat(TscConstants.OrderDetailStat.PAYMENT_COMPLETE.value());
+			orderDetail.setOrdQty(ordQty);
+			orderDetail.setDelvAddrSq(delvAddrSq);
+			orderDetail.setCustNo(custNo);
+			orderDetail.setGoodsCd(goodsCd);
+			pgDao.createOrderDetailSample(orderDetail);
+
+			if (orderDetail.getOrdDtlNo() != 0) {
+				ordDtlNo = orderDetail.getOrdDtlNo();
+			}
+			
+			OrderSample orderDetailItem = new OrderSample();
+			orderDetailItem.setOrdQty(ordQty);
+			orderDetailItem.setCustNo(custNo);
+			orderDetailItem.setCompsGoodsCd(compsGoodsCd);
+			orderDetailItem.setOptCd(optCd);
+			orderDetailItem.setOrdDtlNo(ordDtlNo);
+			pgDao.createOrderDetailItemSample(orderDetailItem);
+			
+			int ordDtlItemSq = orderDetailItem.getOrdDtlItemSq();
+		}
+		
+		OrderSample payment = new OrderSample();
+		payment.setCustNo(custNo);
+		payment.setOrdNo(ordNo);
+		pgDao.createPaymentSample(payment);
+		
+		int paySq = payment.getPaySq();
+		
+		OrderSample updateDeliveryFee = new OrderSample();
+		updateDeliveryFee.setPaySq(paySq);
+		updateDeliveryFee.setOrdNo(ordNo);
+		pgDao.updateDeliveryFeeSample(updateDeliveryFee);
+
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		return result;
+	}
+	/* //주문 샘플 데이터 (추후 삭제 예정) */
 }

+ 1 - 1
src/main/java/com/style24/admin/biz/web/TsaBoardController.java

@@ -58,7 +58,7 @@ public class TsaBoardController extends TsaBaseController {
 
 	/**
 	 * 공지사항 화면
-	 * @param noticeType - 공지유형(10:사이트공지, 20:내부공지)
+	 * @param noticeType - 공지유형(G047_10:사이트공지, G047_20:내부공지)
 	 * @return
 	 * @author gagamel
 	 * @since 2020. 10. 30

+ 9 - 2
src/main/java/com/style24/admin/biz/web/TsaCustomerController.java

@@ -4,6 +4,7 @@ import java.util.Collection;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.security.GagaPasswordEncoder;
+import com.gagaframework.web.util.GagaCryptoUtil;
 import com.gagaframework.web.util.GagaStringUtil;
 import com.style24.admin.biz.service.TsaCustomerService;
 import com.style24.admin.biz.service.TsaKakaoService;
@@ -18,7 +19,7 @@ import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.CustomerSearch;
 import com.style24.persistence.domain.Delivery;
 import com.style24.persistence.domain.GiftCard;
-import com.style24.persistence.domain.Order;
+
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -43,6 +44,7 @@ import com.style24.persistence.domain.Counsel;
 import lombok.extern.slf4j.Slf4j;
 
 import com.gagaframework.web.rest.server.GagaResponse;
+import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.Point;
 import com.style24.persistence.domain.Review;
 
@@ -372,7 +374,7 @@ public class TsaCustomerController extends TsaBaseController {
 		//mav.addObject("dcWayList", rendererService.getCommonCodeList("G240"));
 
 		// 쿠폰발행사유
-		mav.addObject("pubReasonList", rendererService.getCommonCodeList("G597"));
+		mav.addObject("pubReasonList", rendererService.getCommonCodeList("G068"));
 
 		// 포인트반영상태
 		mav.addObject("pntOccurGbList", rendererService.getCommonCodeList("G069"));
@@ -719,6 +721,11 @@ public class TsaCustomerController extends TsaBaseController {
 	@PostMapping("/delivery/addr/save")
 	@ResponseBody
 	public GagaResponse saveCustomerDeliveryAddr(@RequestBody Delivery delivery) {
+		delivery.setRecipNm(CryptoUtils.encryptAES(delivery.getRecipNm()));
+		delivery.setRecipTelno(CryptoUtils.encryptAES(delivery.getRecipTelno()));
+		delivery.setRecipPhnno(CryptoUtils.encryptAES(delivery.getRecipPhnno()));
+		delivery.setRecipDtlAddr(CryptoUtils.encryptAES(delivery.getRecipDtlAddr()));
+		delivery.setRecipBaseAddr(CryptoUtils.encryptAES(delivery.getRecipBaseAddr()));
 		customerService.saveCustomerDeliveryAddr(delivery);
 		return super.ok(message.getMessage("SUCC_0001"));
 	}

+ 1 - 0
src/main/java/com/style24/admin/biz/web/TsaGoodsController.java

@@ -491,6 +491,7 @@ public class TsaGoodsController extends TsaBaseController {
 	@ResponseBody
 	public GagaMap getGoodsList(@RequestBody GoodsSearch goodsSearch) {
 
+		log.info("[getGoodsList] goodsSearch = {}", goodsSearch);
 		GagaMap result = new GagaMap();
 
 		// 입점업체담당자는 업체코드 설정

+ 192 - 26
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -1,19 +1,17 @@
 package com.style24.admin.biz.web;
 
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Date;
 
-import com.gagaframework.web.util.GagaDateUtil;
-import com.style24.admin.biz.service.TsaSystemService;
-import com.style24.core.biz.service.TscPointService;
-import com.style24.core.support.env.TscConstants;
-import com.style24.persistence.domain.Point;
-import com.style24.persistence.domain.User;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -21,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
+import com.style24.admin.biz.service.TsaCardPromotionService;
 import com.style24.admin.biz.service.TsaCommonService;
 import com.style24.admin.biz.service.TsaCouponService;
 import com.style24.admin.biz.service.TsaFreegiftPromotionService;
@@ -28,11 +27,19 @@ import com.style24.admin.biz.service.TsaMailTemplateService;
 import com.style24.admin.biz.service.TsaMorebetterService;
 import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.biz.service.TsaReviewService;
+import com.style24.admin.biz.service.TsaSystemService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.biz.service.TscPointService;
+import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.TscPageRequest;
+
 import com.style24.persistence.domain.AnswerPhase;
+
+import com.style24.persistence.domain.CardPromotion;
+import com.style24.persistence.domain.CardPromotionTarget;
+
 import com.style24.persistence.domain.CommonCode;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.CouponRefval;
@@ -45,12 +52,15 @@ import com.style24.persistence.domain.MoreBetter;
 import com.style24.persistence.domain.MoreBetterBurden;
 import com.style24.persistence.domain.MoreBetterGoods;
 import com.style24.persistence.domain.MoreBetterSection;
+import com.style24.persistence.domain.Point;
 import com.style24.persistence.domain.Review;
+import com.style24.persistence.domain.User;
 
 import lombok.extern.slf4j.Slf4j;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.rest.server.GagaResponse;
+import com.gagaframework.web.util.GagaDateUtil;
 
 /**
  * 마케팅 Controller
@@ -91,10 +101,16 @@ public class TsaMarketingController extends TsaBaseController {
 
 	@Autowired
 	private TscPointService corePointService;
-	
+
 	@Autowired
 	private TsaMailTemplateService mailTemplateService;
 	
+
+
+	@Autowired
+	private TsaCardPromotionService cardPromotionService;
+
+
 	/**
 	 * 상품평관리 화면
 	 * @return
@@ -128,10 +144,10 @@ public class TsaMarketingController extends TsaBaseController {
 
 //		// 품목
 //		mav.addObject("itemkindList", rendererService.getAllItemkindList());
-//		
+//
 //		// 브랜드그룹
 //		mav.addObject("brandGrpNmList", rendererService.getBrandGroupList());
-//		
+//
 //		// MD
 //		mav.addObject("brandMdList", rendererService.getBrandMdList());
 //
@@ -179,7 +195,7 @@ public class TsaMarketingController extends TsaBaseController {
 	 * @author xodud1202
 	 * @since 2020. 12. 16
 	 */
-	@GetMapping("/freeGoods/promotion/form")
+	@GetMapping("/freegoods/promotion/form")
 	public ModelAndView freeGoodsPromotionForm() {
 		ModelAndView mav = new ModelAndView();
 		mav.setViewName("marketing/FreeGoodsPromotionForm");
@@ -191,7 +207,7 @@ public class TsaMarketingController extends TsaBaseController {
 	 * @author xodud1202
 	 * @since 2020. 12. 16
 	 */
-	@PostMapping("/freeGoodsPromotion/list")
+	@PostMapping("/freegoods/promotion/list")
 	@ResponseBody
 	public GagaMap getFreeGoodsPromotionList(@RequestBody FreeGoodsPromotion param) {
 		GagaMap result = new GagaMap();
@@ -214,7 +230,7 @@ public class TsaMarketingController extends TsaBaseController {
 	 * @since 2020. 12. 23
 	 */
 	@ResponseBody
-	@GetMapping("/freeGoodsRegiPopup/form")
+	@GetMapping("/freegoods/promotion/popup/form")
 	public ModelAndView freeGoodsRegiForm(FreeGoodsPromotion param) {
 		ModelAndView mav = new ModelAndView();
 
@@ -256,11 +272,11 @@ public class TsaMarketingController extends TsaBaseController {
 	}
 
 	/**
-	 * 사은품 프로모션 목록 조회
+	 * 사은품 프로모션 상세 조회
 	 * @author xodud1202
 	 * @since 2021. 01. 28
 	 */
-	@PostMapping("/freeGoodsPromotion/detail")
+	@PostMapping("/freegoods/promotion/detail")
 	@ResponseBody
 	public GagaMap getFreeGoodsPromotionDetail(FreeGoodsPromotion param) {
 		return freegiftService.getFreegiftDetailInfo(param);
@@ -274,7 +290,7 @@ public class TsaMarketingController extends TsaBaseController {
 	 * @since 2021. 01. 14
 	 */
 	@ResponseBody
-	@PostMapping("/freeGoodsPromotion/save")
+	@PostMapping("/freegoods/promotion/save")
 	public GagaResponse freeGoodsPromotionSave(@RequestBody FreeGoodsPromotion param) {
 		try {
 			freegiftService.saveFreegoodsPromotionInfo(param);
@@ -294,7 +310,7 @@ public class TsaMarketingController extends TsaBaseController {
 	 * @since 2021. 01. 14
 	 */
 	@ResponseBody
-	@PostMapping("/freeGoodsPromotion/changeStat")
+	@PostMapping("/freegoods/promotion/change/stat")
 	public GagaResponse freeGoodsPromotionChangeStat(@RequestBody FreeGoodsPromotion param) {
 		try {
 			freegiftService.updateFreegoodsPromotionStat(param);
@@ -682,8 +698,8 @@ public class TsaMarketingController extends TsaBaseController {
 
 			moreBetter1.setEventStdt(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
 			moreBetter1.setEventEdHH(new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime()));
-			moreBetter1.setEventEdHH("23");
-			moreBetter1.setEventEdMM("59");
+			moreBetter1.setEventEdHH("24");
+			moreBetter1.setEventEdMM("00");
 			mav.addObject("tmtbMstInfo", moreBetter1);
 		}
 
@@ -717,22 +733,23 @@ public class TsaMarketingController extends TsaBaseController {
 			moreBetterGoods.setMultiExceptGoods(moreBetter.getMultiExceptGoods());
 
 			// TMTB_GOODS_TEMP TABLE TRUNCATE -> 다른 다다에서 사용중인 상품 조회 -> INSERT
+			moreBetterGoods.setApplyGoodsList(moreBetter.getApplyGoodsList());
 			morebetterService.createMorebetterGoodsTemp(moreBetterGoods);
+
+			morebetterService.saveMoreBetterDetail(moreBetter);
+
 			// 다른 다다에서 사용중인 상품 조회
 			Collection<MoreBetterGoods> duplicateGoodsList = morebetterService.getMorebetterDuplicateList(moreBetterGoods);
-
 			// SELECT -> 지금 내가 선택한 업체&브랜드 + 적용상품에 해당하는 상품 조회 MINUS TMTB_GOODS_TEMP 상품
 			// 조회 건수 있으면 -> 해당 상품코드 엑셀로 던져주기
 			if(duplicateGoodsList.size() > 0){
 				map.set("duplicateYn","Y");
-				//map.set("message", result);
 				map.set("duplicateGoodsList",duplicateGoodsList);
 			}else{
 				// 조회 건수 없으면 -> 저장으로 넘어감
-				morebetterService.saveMoreBetterDetail(moreBetter);
 				map.set("duplicateYn","N");
-				map.set("message", message.getMessage("SUCC_0001"));
 			}
+			map.set("message", message.getMessage("SUCC_0001"));
 		} catch(Exception e) {
 			e.printStackTrace();
 			map.set("message", message.getMessage("FAIL_0001"));
@@ -985,6 +1002,7 @@ public class TsaMarketingController extends TsaBaseController {
 		ModelAndView mav = new ModelAndView();
 
 		mav.addObject("elementCustNo", elementCustNo);
+
 		// 사이트 목록
 		mav.addObject("siteCdList", rendererService.getAvailCommonCodeList("G000"));
 
@@ -1018,11 +1036,159 @@ public class TsaMarketingController extends TsaBaseController {
 		point.setPntUploadStat(TscConstants.PntUploadStat.APPLY_COMPLETE.value());
 		point.setGvPntAmt(point.getPntAmt());
 		point.setRmPntAmt(point.getPntAmt());
-		String expBedt = point.getExpBeDt().replace("-","");
-		String time = "235959";
-		point.setExpBeDt(expBedt+time);
 		corePointService.saveCustomerPoint(point);
 		return super.ok(message.getMessage("SUCC_0004"));
 	}
 
+	/**
+	 * 쿠폰발급 팝업
+	 * @param elementCustNo - 고객일련번호
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 1. 28
+	 */
+	@GetMapping("/coupon/issue/popup/form")
+	@ResponseBody
+	public ModelAndView couponIssuePopupForm(@RequestParam(value = "elementCustNo") String elementCustNo) {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("elementCustNo", elementCustNo);
+
+		// 사이트 목록
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+
+		// 사용가능고객구분 목록
+		mav.addObject("usableCustGbList", rendererService.getAvailCommonCodeList("G100"));
+
+		// 쿠폰유형 목록
+		mav.addObject("cpnTypeList", rendererService.getAvailCommonCodeList("G230"));
+
+		// 할인방식 목록
+		mav.addObject("dcWayList", rendererService.getAvailCommonCodeList("G240"));
+
+		// 쿠폰발행사유 조회
+		mav.addObject("cpnPubReasonList", rendererService.getCommonCodeList("G068"));
+
+		mav.setViewName("marketing/CouponIssuePopupForm");
+
+		return mav;
+	}
+
+	/**
+	 * 회원상세 - 쿠폰발급
+	 * @param custCoupon - 쿠폰정보
+	 * @return GagaResponse
+	 * @author jsshin
+	 * @since 2021. 1. 29
+	 */
+	@PostMapping("/coupon/issue/save")
+	@ResponseBody
+	public GagaResponse saveCouponIssue(@RequestBody CustCoupon custCoupon) {
+		Integer userNo = TsaSession.getInfo().getUserNo();
+		custCoupon.setRegNo(userNo);
+		custCoupon.setUpdNo(userNo);
+		couponService.saveCouponIssue(custCoupon);
+		return super.ok(message.getMessage("SUCC_0006"));
+	}
+
+	/**
+	 *   카드관련 작업 시작 - eskim
+	 */
+
+	/**
+	 * 카드무이자할부 관리
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2021. 1. 29
+	 */
+	@GetMapping("/card/interest/form")
+	@ResponseBody
+	public ModelAndView cardInterestForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("marketing/CardInterestForm");
+		return mav;
+	}
+
+	/**
+	 * 카드무이자할부 목록
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 1. 29
+	 */
+	@PostMapping("/card/interest/list")
+	@ResponseBody
+	public GagaMap getCardInterestList(@RequestBody CardPromotion cardPromotion) {
+
+		GagaMap result = new GagaMap();
+
+		cardPromotion.setPageable(new TscPageRequest(cardPromotion.getPageNo() - 1, cardPromotion.getPageSize()));
+		cardPromotion.getPageable().setTotalCount(cardPromotionService.getCardInterestListCount(cardPromotion));
+
+		result.set("pageing", cardPromotion);
+		result.set("cardPromotionList", cardPromotionService.getCardInterestList(cardPromotion));
+
+		return result;
+	}
+
+	/**
+	 * 카드무이자할부 팝업
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 1
+	 */
+	@GetMapping("/card/interest/popup/form/{cardPrmtSq}")
+	@ResponseBody
+	public ModelAndView cardInterestPopupForm(@PathVariable Integer cardPrmtSq) {
+
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("cardPrmtSq", cardPrmtSq);
+		mav.setViewName("marketing/CardInterestPopupForm");
+		return mav;
+	}
+
+	/**
+	 * 카드목록 팝업
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 1
+	 */
+	@GetMapping("/card/list/popup/form")
+	@ResponseBody
+	public ModelAndView cardListtPopupForm(CardPromotionTarget cardPromotionTarget) {
+
+		ModelAndView mav = new ModelAndView();
+
+		// 카드목록
+		mav.addObject("cardList", rendererService.getAvailCommonCodeList("G941"));
+
+		mav.addObject("params", cardPromotionTarget);
+
+		mav.setViewName("marketing/CardListPopupForm");
+		return mav;
+	}
+
+	/**
+	 * 카드무이자할부 저장
+	 * @param point - 포인트 정보
+	 * @return ModelAndView
+	 * @author eskim
+	 * @since 2021. 2. 1
+	 */
+	@PostMapping("/card/interest/save")
+	@ResponseBody
+	public GagaResponse saveCardInterest(@RequestBody CardPromotion cardPromotion) {
+		cardPromotionService.saveCardInterest(cardPromotion);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 *   카드관련 작업 종료 - eskim
+	 */
+
 }

+ 172 - 117
src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java

@@ -16,13 +16,12 @@ import org.springframework.web.servlet.ModelAndView;
 import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.rest.server.GagaResponse;
 import com.gagaframework.web.rest.server.GagaResponseStatus;
-import com.style24.admin.biz.service.TsaOrderChangeService;
-import com.style24.admin.biz.service.TsaOrderService;
 import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.biz.service.TscOrderChangeService;
 import com.style24.core.biz.service.TscOrderRefundService;
+import com.style24.core.biz.service.TscOrderService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.Order;
@@ -48,16 +47,13 @@ public class TsaOrderChangeController extends TsaBaseController {
 	private TsaRendererService rendererService;
 	
 	@Autowired
-	private TsaOrderService orderService;
+	private TscOrderService orderService;
 	
 	@Autowired
-	private TsaOrderChangeService orderChangeService;
+	private TscOrderChangeService orderChangeService;
 	
 	@Autowired
-	private TscOrderChangeService coreOrderChangeService;
-	
-	@Autowired
-	private TscOrderRefundService coreOrderRefundService;
+	private TscOrderRefundService orderRefundService;
 	
 	/**
 	 * 취소요청, 취소완료 통합 화면 (관리자)
@@ -74,13 +70,9 @@ public class TsaOrderChangeController extends TsaBaseController {
 		Order order = new Order();
 		ModelAndView mav = new ModelAndView();
 		order.setOrdNo(ordNo);
-		
-		// 2021.01.26 변경시퀀스가 있을때 담기
-		if (ordChgSq > 0) {
-			order.setOrdChgSq(ordChgSq);
-		}
+		order.setOrdChgSq(ordChgSq);
 				
-		// 취소가능 주문상세상탭값 설정
+		// 1. 취소가능 주문상세상탭값 설정
 		String[] ordDtlStatArr = new String[4];
 		ordDtlStatArr[0] = TscConstants.OrderDetailStat.DEPOSIT_WAIT.value();
 		ordDtlStatArr[1] = TscConstants.OrderDetailStat.PAYMENT_COMPLETE.value();
@@ -88,88 +80,39 @@ public class TsaOrderChangeController extends TsaBaseController {
 		ordDtlStatArr[3] = TscConstants.OrderDetailStat.DELIVERY_PREPARE.value();
 		order.setOrdDtlStatArr(ordDtlStatArr);
 		
-		// 2021.01.26 취소요청 화면, 취소요청정보확인 화면 합 
+		// 2. 변경신청된 주문상세번호를 체크 후 있으면 해당 취소가능수량값 업데이트 
+		List<Order> cancelRequestTargetList 		= orderChangeService.getCancelRequestTargetList(order);
+		List<Order> orderChangeDetailList 			= orderChangeService.getOrderChangeDetailList(order);
+		Collection<Order> orderInfoList 			= orderService.getOrderInfoList(order);
+		
+		// 3. 화면으로 데이타 전송
+		// 2021.01.26 취소요청 화면, 취소요청정보확인 화면 통합
 		mav.addObject("chgReasonList"				, rendererService.getAvailCommonCodeList("G686"));				// 취소사유
-		mav.addObject("cancelRequestTargetList"		, coreOrderChangeService.getCancelRequestTargetList(order));	// 취소요청대상목록
-		mav.addObject("orderInfoList"				, orderService.getOrderInfoList(order));						// 주문정보
+		mav.addObject("cancelRequestTargetList"		, cancelRequestTargetList);										// 변경신청대상목록 (취소/반품/교환)
+		mav.addObject("orderInfoList"				, orderInfoList);												// 주문정보
 		mav.addObject("ordNo"						, ordNo);														// 주문번호
 		mav.addObject("ordChgSq"					, ordChgSq);													// 주문변경번호
-		mav.addObject("orderChangeList"				, orderService.getOrderChangeList(order));						// 취소/반품/교환 요청 정보
+		mav.addObject("orderChangeDetailList"		, orderChangeDetailList);										// 변경신청목록 (취소/반품/교환)
 		
 		String viewName = "";
 		
+		/*
 		if (ordChgSq > 0) {
-			viewName = "order/CnclReqViewForm";	// 변경요청정보화면 (취소요청정보화면)
+			viewName = "order/CnclReqViewForm";		// 변경요청확인화면 (취소요청정보화면)
 		} else {
 			viewName = "order/CnclReqForm";		// 변경요청화면 (취소요청화면)
 		}
+		*/
+		
+		viewName = "order/CnclReqForm";		// 변경요청화면, 변경요청확인화면 (취소요청화면) (통합)
 
 		mav.setViewName(viewName);
 		
 		return mav;
 	}
-	
-	/**
-	 * 취소요청 (ADMIN, NAPY, 외부몰) (배치) (사용안함)
-	 * 
-	 * @param OrderChange - 주문취소신청정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2021. 01. 20
-	 */
-	@PostMapping("/cnclReq")
-	@ResponseBody
-	public GagaResponse cnclReq(@RequestBody OrderChange cnclReq) {
-		
-		GagaMap mav = new GagaMap();
-		
-		if (cnclReq== null) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-		
-		List<Order> cnclReqList = cnclReq.getCancelReqList(); // 취소요청정보목록
-		
-		// To Do List
-		// @ 결품취소로직 추가
-		// @ 주문취소시 상태값 체크
-		// @ 취소, 반품시 배송비 체크 로직 (선결제 로직)
-		
-		// 1. 세션회원조회
-		int userNo = TsaSession.getInfo().getUserNo();
-		
-		// 2. 환불금액계산
-		// 2021.01.19 취소신청정보를 목록 (주문상세번호, 취소/반품수량) 으로 표현
-		mav = coreOrderRefundService.cnclRtnRefundAmt(cnclReqList);
-		
-		// 3. 주문변경 기본정보 설정
-		mav.set("ordNo"			, cnclReq.getOrdNo());				// 주문번호
-		mav.set("chgReason"		, cnclReq.getChgReason());			// 변경사유
-		mav.set("chgMemo"		, cnclReq.getChgMemo());			// 변경메모
-		
-		mav.set("accountNo"		, cnclReq.getAccountNo());			// 환불계좌번호
-		mav.set("accountNm"		, cnclReq.getAccountNm());			// 환불계좌예금주명
-		mav.set("bankCd"		, cnclReq.getBankCd());				// 환불계좌은행코드
-		
-		mav.set("allCanYn"		, cnclReq.getAllCanYn());			// 무통장입금전 전체취소 여부
-		mav.set("isCustomer"	, cnclReq.getIsCustomer());			// 변경사유 (고객, 회사)
-		
-		// 4. 주문변경 회수지정보 추가
-		mav.set("chgerNm"		, cnclReq.getChgerNm());			// 변경자명
-		mav.set("chgerEmail"	, cnclReq.getChgerEmail());			// 변경자이메일주소
-		mav.set("chgerPhnno"	, cnclReq.getChgerPhnno());			// 변경자핸드폰번호
-		mav.set("chgerTelno"	, cnclReq.getChgerTelno());			// 변경자전화번호
-		
-		mav.set("reqGbn"		, cnclReq.getReqGbn());				// 신청구분
-						
-		// 5. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL, TB_REFUND)
-		//coreOrderChangeService.cnclReq(mav, userNo);
-		coreOrderChangeService.cnclComplete(mav, userNo);
-		
-		return super.ok("성공");
-	}
-	
+
 	/**
-	 * 취소요청철회 (NAPY, 외부몰) (관리자)
+	 * 취소요청철회 (관리자)
 	 * @param OrderChange - 주문취소신청정보
 	 * @return
 	 * @author jsh77b
@@ -191,31 +134,13 @@ public class TsaOrderChangeController extends TsaBaseController {
 		mav.set("ordChgSq"		, cnclReq.getOrdChgSq());
 		
 		// 2.취소요청철회 
-		mav = coreOrderChangeService.cnclReqCancel(mav, userNo);
-		
-		return super.ok("성공");
-	}
-	
-	/**
-	 * 취소요청승인 (NAPY, 외부몰) (관리자)
-	 * @param OrderChange - 주문취소신청정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2021. 01. 20
-	 */
-	@PostMapping("/cnclReqComplete")
-	@ResponseBody
-	public GagaResponse cnclReqComplete(@RequestBody OrderChange cnclReq) {
-		
-		if (cnclReq== null) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
+		mav = orderChangeService.cnclReqCancel(mav, userNo);
 		
 		return super.ok("성공");
 	}
 	
 	/**
-	 * 취소 요청, 완료 통합 (관리자)
+	 * 취소요청, 취소요청완료, 취소완료 기능 통합 (관리자)
 	 * @param Collection<Order> - 주문취소신청목록
 	 * @return
 	 * @author jsh77b
@@ -231,9 +156,9 @@ public class TsaOrderChangeController extends TsaBaseController {
 		
 		GagaMap mav = new GagaMap();
 		
-		List<Order> cnclReqList = cnclReq.getCancelReqList(); // 취소요청정보목록
+		List<Order> cnclReqList = cnclReq.getCancelReqList(); // 변경요청정보
 		
-		// To Do List
+		// TODO
 		// @ 결품취소로직 추가
 		// @ 주문취소시 상태값 체크
 		// @ 취소, 반품시 배송비 체크 로직 (선결제 로직)
@@ -243,10 +168,11 @@ public class TsaOrderChangeController extends TsaBaseController {
 		
 		// 2. 환불금액계산
 		// 2021.01.19 취소신청정보를 목록 (주문상세번호, 취소/반품수량) 으로 표현
-		mav = coreOrderRefundService.cnclRtnRefundAmt(cnclReqList);
+		mav = orderRefundService.cnclRtnRefundAmt(cnclReqList);
 		
 		// 3. 주문변경 기본정보 설정
 		mav.set("ordNo"			, cnclReq.getOrdNo());				// 주문번호
+		mav.set("ordChgSq"		, cnclReq.getOrdChgSq());			// 주문변경번호
 		mav.set("chgReason"		, cnclReq.getChgReason());			// 변경사유
 		mav.set("chgMemo"		, cnclReq.getChgMemo());			// 변경메모
 		
@@ -266,7 +192,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 		mav.set("reqGbn"		, cnclReq.getReqGbn());				// 신청구분
 				
 		// 5. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL)
-		coreOrderChangeService.cnclComplete(mav, userNo);
+		orderChangeService.cnclComplete(mav, userNo);
 		
 		return super.ok("성공");
 	}
@@ -281,12 +207,13 @@ public class TsaOrderChangeController extends TsaBaseController {
 	 * @since 2020. 12. 22
 	 */
 	@GetMapping("/rtn/req/form")
-	public ModelAndView returnRequestFrom(@RequestParam(value = "ordNo") int ordNo) {
+	public ModelAndView rtnReqForm(@RequestParam(value = "ordNo") int ordNo, @RequestParam(value = "ordChgSq") int ordChgSq) {
 
 		Order order = new Order();
 		ModelAndView mav = new ModelAndView();
 		
 		order.setOrdNo(ordNo);
+		order.setOrdChgSq(ordChgSq);
 		
 		// 반품가능 주문상세상탭값 설정
 		String[] ordDtlStatArr = new String[3];
@@ -295,16 +222,25 @@ public class TsaOrderChangeController extends TsaBaseController {
 		ordDtlStatArr[2] = TscConstants.OrderDetailStat.DELIVERY_COMPLETE.value();
 		order.setOrdDtlStatArr(ordDtlStatArr);
 		
+		// 2. 변경신청된 주문상세번호를 체크 후 있으면 해당 취소가능수량값 업데이트 
+		List<Order> cancelRequestTargetList 		= orderChangeService.getCancelRequestTargetList(order);
+		List<Order> orderChangeDetailList 			= orderChangeService.getOrderChangeDetailList(order);
+		Collection<Order> orderInfoList 			= orderService.getOrderInfoList(order);
+		
+		// 3. 화면으로 데이타 전송
+		// 2021.01.26 취소요청 화면, 취소요청정보확인 화면 통합
 		mav.addObject("chgReasonList"				, rendererService.getAvailCommonCodeList("G688"));				// 취소사유
-		mav.addObject("cancelRequestTargetList"		, coreOrderChangeService.getCancelRequestTargetList(order));	// 취소요청대상 목록
-		mav.addObject("orderInfoList"				, orderService.getOrderInfoList(order));						// 주문정보
+		mav.addObject("cancelRequestTargetList"		, cancelRequestTargetList);										// 취소요청대상 목록
+		mav.addObject("orderInfoList"				, orderInfoList);												// 주문정보
 		mav.addObject("ordNo"						, ordNo);														// 주문번호
+		mav.addObject("ordChgSq"					, ordChgSq);													// 주문변경번호
+		mav.addObject("orderChangeDetailList"		, orderChangeDetailList);										// 변경신청목록 (취소/반품/교환)
 		
 		mav.addObject("orderDelvRtnAddrInfo"		, orderService.getDeliveryAddrList(order));						// 배송정보
 		mav.addObject("TelExcNoList"				, rendererService.getAvailCommonCodeList("G095"));				// 전화번호국번
 		mav.addObject("PhnExcNoList"				, rendererService.getAvailCommonCodeList("G096"));				// (휴대전화)번호국번
 
-		mav.setViewName("order/ReturnRequestForm");
+		mav.setViewName("order/RtnReqForm");
 		
 		return mav;
 	}
@@ -316,9 +252,9 @@ public class TsaOrderChangeController extends TsaBaseController {
 	 * @author jsh77b
 	 * @since 2020. 12. 29
 	 */
-	@PostMapping("/returnRequest")
+	@PostMapping("/rtnReq")
 	@ResponseBody
-	public GagaResponse orderReturnRequest(@RequestBody OrderChange rtnReq) {
+	public GagaResponse rtnReq(@RequestBody OrderChange rtnReq) {
 		
 		GagaMap mav = new GagaMap();
 		
@@ -326,16 +262,21 @@ public class TsaOrderChangeController extends TsaBaseController {
 			throw new IllegalStateException(message.getMessage("FAIL_1001"));
 		}
 
-		List<Order> cancelReqList = rtnReq.getCancelReqList(); // 취소요청정보
+		List<Order> cancelReqList = rtnReq.getCancelReqList(); // 변경요청정보
+		
+		// TODO
+		// @ 주문취소시 상태값 체크
+		// @ 취소, 반품시 배송비 체크 로직 (선결제 로직)
 		
 		// 1. 세션회원조회
 		int userNo = TsaSession.getInfo().getUserNo();
 		
 		// 2. 환불금액계산
-		mav = coreOrderRefundService.cnclRtnRefundAmt(cancelReqList);
+		mav = orderRefundService.cnclRtnRefundAmt(cancelReqList);
 		
 		// 3. 주문변경 기본정보 설정
 		mav.set("ordNo"			, rtnReq.getOrdNo());				// 주문번호
+		mav.set("ordChgSq"		, rtnReq.getOrdChgSq());			// 주문변경번호
 		mav.set("chgReason"		, rtnReq.getChgReason());			// 변경사유
 		mav.set("chgMemo"		, rtnReq.getChgMemo());				// 변경메모
 			
@@ -356,7 +297,35 @@ public class TsaOrderChangeController extends TsaBaseController {
 		mav.set("chgerTelno"	, rtnReq.getChgerTelno());			// 변경자전화번호
 		
 		// 5. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL, TB_REFUND)
-		coreOrderChangeService.rtnReq(mav, userNo);
+		orderChangeService.rtnReq(mav, userNo);
+		
+		return super.ok("성공");
+	}
+	
+	/**
+	 * 취소요청철회 (관리자)
+	 * @param OrderChange - 주문취소신청정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 01. 20
+	 */
+	@PostMapping("/rtnReqCancel")
+	@ResponseBody
+	public GagaResponse rtnReqCancel(@RequestBody OrderChange cnclReq) {
+		
+		if (cnclReq== null) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+		
+		// 1. 세션회원조회
+		int userNo = TsaSession.getInfo().getUserNo();
+		
+		GagaMap mav = new GagaMap();
+		mav.set("ordNo"			, cnclReq.getOrdNo());
+		mav.set("ordChgSq"		, cnclReq.getOrdChgSq());
+		
+		// 2.취소요청철회 
+		mav = orderChangeService.rtnReqCancel(mav, userNo);
 		
 		return super.ok("성공");
 	}
@@ -379,7 +348,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 		}
 		
 		// 1. 환불금액정보 계산 & 조회
-		mav = coreOrderRefundService.cnclRtnRefundAmt(cancelReqList);
+		mav = orderRefundService.cnclRtnRefundAmt(cancelReqList);
 		
 		return mav;
 	}
@@ -464,7 +433,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 		
 		String accountCheck = "Y";
 		
-		// To Do List
+		// TODO
 		// @ 환불계좌인증
 		
 		if ("Y".equals(accountCheck)) {
@@ -499,7 +468,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 		ordDtlStatArr[2] = TscConstants.OrderDetailStat.DELIVERY_COMPLETE.value();
 		order.setOrdDtlStatArr(ordDtlStatArr);
 
-		Collection<Order> cancelRequestTargetList = coreOrderChangeService.getCancelRequestTargetList(order);
+		Collection<Order> cancelRequestTargetList = orderChangeService.getCancelRequestTargetList(order);
 
 		Collection<Order> orderInfoList = orderService.getOrderInfoList(order);
 
@@ -542,7 +511,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 		excReq.setRegNo(userNo);
 
 		// 교환처리
-		result = coreOrderChangeService.exchReq(excReq);
+		result = orderChangeService.exchReq(excReq);
 
 		// 처리 결과 코드에 따른 메세지 설정
 		if (result.get("status").equals(GagaResponseStatus.SUCCESS.getCode())) {
@@ -553,6 +522,92 @@ public class TsaOrderChangeController extends TsaBaseController {
 		
 		return result;
 	}
+
+	/**
+	 * 취소요청 (ADMIN, NAPY, 외부몰) (배치) (사용안함)
+	 * 
+	 * @param OrderChange - 주문취소신청정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 01. 20
+	 */
+	@PostMapping("/cnclReq")
+	@ResponseBody
+	public GagaResponse cnclReq(@RequestBody OrderChange cnclReq) {
+		
+		GagaMap mav = new GagaMap();
+		
+		if (cnclReq== null) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+		
+		List<Order> cnclReqList = cnclReq.getCancelReqList(); // 취소요청정보목록
+		
+		// TODO
+		// @ 결품취소로직 추가
+		// @ 주문취소시 상태값 체크
+		// @ 취소, 반품시 배송비 체크 로직 (선결제 로직)
+		
+		// 1. 세션회원조회
+		int userNo = TsaSession.getInfo().getUserNo();
+		
+		// 2. 환불금액계산
+		// 2021.01.19 취소신청정보를 목록 (주문상세번호, 취소/반품수량) 으로 표현
+		mav = orderRefundService.cnclRtnRefundAmt(cnclReqList);
+		
+		// 3. 주문변경 기본정보 설정
+		mav.set("ordNo"			, cnclReq.getOrdNo());				// 주문번호
+		mav.set("chgReason"		, cnclReq.getChgReason());			// 변경사유
+		mav.set("chgMemo"		, cnclReq.getChgMemo());			// 변경메모
+		
+		mav.set("accountNo"		, cnclReq.getAccountNo());			// 환불계좌번호
+		mav.set("accountNm"		, cnclReq.getAccountNm());			// 환불계좌예금주명
+		mav.set("bankCd"		, cnclReq.getBankCd());				// 환불계좌은행코드
+		
+		mav.set("allCanYn"		, cnclReq.getAllCanYn());			// 무통장입금전 전체취소 여부
+		mav.set("isCustomer"	, cnclReq.getIsCustomer());			// 변경사유 (고객, 회사)
+		
+		// 4. 주문변경 회수지정보 추가
+		mav.set("chgerNm"		, cnclReq.getChgerNm());			// 변경자명
+		mav.set("chgerEmail"	, cnclReq.getChgerEmail());			// 변경자이메일주소
+		mav.set("chgerPhnno"	, cnclReq.getChgerPhnno());			// 변경자핸드폰번호
+		mav.set("chgerTelno"	, cnclReq.getChgerTelno());			// 변경자전화번호
+		
+		mav.set("reqGbn"		, cnclReq.getReqGbn());				// 신청구분
+						
+		// 5. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL, TB_REFUND)
+		orderChangeService.cnclComplete(mav, userNo);
+		
+		return super.ok("성공");
+	}
+	
+	/**
+	 * 취소요청승인 (관리자)
+	 * @param OrderChange - 주문취소신청정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 01. 20
+	 */
+	@PostMapping("/cnclReqComplete")
+	@ResponseBody
+	public GagaResponse cnclReqComplete(@RequestBody OrderChange cnclReq) {
+		
+		if (cnclReq== null) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+		
+		// 1. 세션회원조회
+		int userNo = TsaSession.getInfo().getUserNo();
+		
+		GagaMap mav = new GagaMap();
+		mav.set("ordNo"			, cnclReq.getOrdNo());
+		mav.set("ordChgSq"		, cnclReq.getOrdChgSq());
+		
+		// 2.취소요청철회 
+		mav = orderChangeService.cnclComplete(mav, userNo);
+		
+		return super.ok("성공");
+	}
 }
 
 

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

@@ -3,10 +3,14 @@ package com.style24.admin.biz.web;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 
+import javax.jws.WebParam;
 import javax.servlet.http.HttpServletRequest;
 
+import com.gagaframework.web.rest.server.GagaResponseStatus;
+import com.style24.admin.biz.service.TsaCustomerService;
+import com.style24.admin.biz.service.TsaPgService;
+import com.style24.core.biz.service.TscOrderService;
 import com.style24.persistence.TscPageRequest;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,13 +33,13 @@ import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.rest.server.GagaResponse;
 import com.gagaframework.web.util.GagaDateUtil;
 import com.gagaframework.web.util.GagaFileUtil;
-import com.style24.admin.biz.service.TsaOrderService;
 import com.style24.admin.biz.service.TsaRendererService;
 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.domain.Goods;
 import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.OrderChange;
+import com.style24.persistence.domain.OrderSample;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -60,7 +64,10 @@ public class TsaOrderController extends TsaBaseController {
 	private TsaRendererService rendererService;
 
 	@Autowired
-	private TsaOrderService orderService;
+	private TscOrderService orderService;
+	
+	@Autowired
+	private TsaPgService pgService;
 
 	/**
 	 * 주문목록조회
@@ -74,7 +81,7 @@ public class TsaOrderController extends TsaBaseController {
 		ModelAndView mav = new ModelAndView();
 
 		mav.addObject("siteCdList"		, rendererService.getAvailCommonCodeList("G012"));		// 사이트구분
-		mav.addObject("mallGbList"		, rendererService.getAvailCommonCodeList("G011"));		// 몰구분		
+		mav.addObject("mallGbList"		, rendererService.getAvailCommonCodeList("G011"));		// 몰구분
 		mav.addObject("supplyCompList"	, rendererService.getSupplyCompanyList());				// 공급업제목록
 		mav.addObject("ordStatList"		, rendererService.getAvailCommonCodeList("G012"));		// 주문상태코드
 		mav.addObject("ordDtlStatList"	, rendererService.getAvailCommonCodeList("G013"));		// 주문상세상태코드
@@ -85,6 +92,8 @@ public class TsaOrderController extends TsaBaseController {
 		mav.addObject("siteCdList"		, rendererService.getAvailCommonCodeList("G000"));		// 사이트구분
 		mav.addObject("formalGbList"	, rendererService.getAvailCommonCodeList("G009"));		// 정상/이월
 
+		mav.addObject("userNo"			, TsaSession.getInfo().getUserNo());
+
 		mav.setViewName("order/OrderListForm");
 
 		return mav;
@@ -261,7 +270,8 @@ public class TsaOrderController extends TsaBaseController {
 	@PostMapping("/seller/unorder/status/save")
 	@ResponseBody
 	public GagaResponse saveUnorderStatus(@RequestBody Collection<Order> orderList) {
-		orderService.saveUnorderStatus(orderList);
+		int userNo = TsaSession.getInfo().getUserNo();
+		orderService.saveUnorderStatus(orderList, userNo);
 		return super.ok("");
 	}
 
@@ -338,7 +348,8 @@ public class TsaOrderController extends TsaBaseController {
 		}
 
 		// 4. 주문상세번호 기준으로 송장번호 등록
-		String result = orderService.saveUnorderInvoice(orderList);
+		int userNo = TsaSession.getInfo().getUserNo();
+		String result = orderService.saveUnorderInvoice(orderList, userNo);
 		GagaMap map = new GagaMap();
 		map.set("msg", result);
 
@@ -360,7 +371,8 @@ public class TsaOrderController extends TsaBaseController {
 	@ResponseBody
 	public GagaMap saveUnorderInvoice(@RequestBody Collection<Order> orderList) {
 		// 1. 송장번호 개별 등록
-		String result = orderService.saveUnorderInvoice(orderList);
+		int userNo = TsaSession.getInfo().getUserNo();
+		String result = orderService.saveUnorderInvoice(orderList, userNo);
 		GagaMap map = new GagaMap();
 		map.set("msg", result);
 		return map;
@@ -613,6 +625,7 @@ public class TsaOrderController extends TsaBaseController {
 	@PostMapping("/deliver/addr/update")
 	@ResponseBody
 	public GagaResponse udpateDeliveryAddrUpdate(@RequestBody Order order) {
+		order.setUpdNo(TsaSession.getInfo().getUserNo());
 		orderService.updateOrderAddr(order);
 		return super.ok(message.getMessage("SUCC_0002"));
 	}
@@ -631,6 +644,68 @@ public class TsaOrderController extends TsaBaseController {
 		orderService.updateOrderChange(order);
 		return super.ok(message.getMessage("SUCC_0002"));
 	}
+
+
+
+
+
+
+
+	/* 주문 샘플 데이터 (추후 삭제 예정) */
+	@GetMapping("/sample/create/form")
+	@ResponseBody
+	public ModelAndView orderSamplePopupForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 상품상태
+		String[] exceptCds = {"G008_00"};
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
+		// 정상이월
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+		// 시즌
+		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
+		
+		mav.setViewName("order/OrderSamplePopupForm");
+		
+		return mav;
+	}
+	
+	@PostMapping("/sample/create")
+	@ResponseBody
+	public GagaMap createOrderSample(@RequestBody OrderSample orderSample) {
+		GagaMap result = new GagaMap();
+		result.set("status", GagaResponseStatus.FAIL.getCode());
+
+		log.info("orderSample >>> {}", orderSample);
+		
+		result = pgService.createOrderSample(orderSample);
+		
+		// 처리 결과 코드에 따른 메세지 설정
+		if (result.get("status").equals(GagaResponseStatus.SUCCESS.getCode())) {
+			result.set("message", message.getMessage("SUCC_0004"));
+		} else {
+			result.set("message", message.getMessage("FAIL_0004"));
+		}
+
+		return result;
+	}
+
+	@PostMapping("/sample/goods/info")
+	@ResponseBody
+	public Collection<Goods> getOrderSampleGoodsInfo(@RequestBody String[] arrGoodsCd) {
+		Goods goods = new Goods();
+		goods.setArrGoodsCd(arrGoodsCd);
+		
+		return pgService.getOrderSampleGoodsInfo(goods);
+	}
+
+	@PostMapping("/sample/goods/stock")
+	@ResponseBody
+	public Goods getOrderSampleGoodsStock(@RequestBody Goods goods) {
+		return pgService.getOrderSampleGoodsStock(goods);
+	}
+	
+	/* //주문 샘플 데이터 (추후 삭제 예정) */
 }
 
 

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

@@ -32,7 +32,7 @@ public class TsaOrderRefundController extends TsaBaseController {
 	private TscMessageByLocale message;
 	
 	@Autowired
-	private TscOrderRefundService coreOrderRefundService;
+	private TscOrderRefundService orderRefundService;
 
 	/**
 	 * 주문 취소/반품 신청환불금액 계산
@@ -52,7 +52,7 @@ public class TsaOrderRefundController extends TsaBaseController {
 		}
 		
 		// 1. 환불금액계산
-		mav = coreOrderRefundService.cnclRtnRefundAmt(cancelReqList);
+		mav = orderRefundService.cnclRtnRefundAmt(cancelReqList);
 		
 		return mav;
 	}

+ 2 - 28
src/main/java/com/style24/admin/biz/web/TsaPgController.java

@@ -1,40 +1,14 @@
 package com.style24.admin.biz.web;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
-import org.springframework.core.io.InputStreamResource;
-import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.gagaframework.excel.GagaExcelUtil;
-import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.rest.server.GagaResponse;
-import com.gagaframework.web.util.GagaDateUtil;
-import com.gagaframework.web.util.GagaFileUtil;
-import com.style24.admin.biz.service.TsaOrderService;
 import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.support.controller.TsaBaseController;
-import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.biz.service.TscOrderService;
 import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.OrderChange;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -59,7 +33,7 @@ public class TsaPgController extends TsaBaseController {
 	private TsaRendererService rendererService;
 	
 	@Autowired
-	private TsaOrderService orderService;
+	private TscOrderService orderService;
 	
 }
 

+ 0 - 31
src/main/java/com/style24/admin/support/env/TsaConstants.java

@@ -41,35 +41,4 @@ public class TsaConstants {
 			return value;
 		}
 	}
-
-	// 쿠폰유형
-	public enum CpnType {
-		CATE_CPN("G230_13"),			// 장바구니쿠폰
-		PAY_CPN("G230_20");			// 주문서쿠폰
-
-		private String value;
-
-		private CpnType(String value) {
-			this.value = value;
-		}
-
-		public String value() {
-			return value;
-		}
-	}
-
-	// 할인 코드 유형
-	public enum DcCdGb {
-		NARMAL("G233_00"),			// 일반 쿠폰 유형
-		SERIAL("G233_10"),			// 시리얼 쿠폰 유형
-		RANDOM("G233_20");			// 랜덤 쿠폰 유형
-
-		private String value;
-
-		private DcCdGb(String value) {	this.value = value;	}
-
-		public String value() {
-			return value;
-		}
-	}
 }

+ 55 - 0
src/main/java/com/style24/persistence/domain/CardPromotion.java

@@ -0,0 +1,55 @@
+package com.style24.persistence.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+import com.style24.persistence.TscPageRequest;
+
+import lombok.Data;
+
+/**
+ * 카드프로모션 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 29
+ */
+@SuppressWarnings("serial")
+@Data
+public class CardPromotion extends TscBaseDomain {
+
+	private Integer cardPrmtSq;	// 카드프로모션일련번호
+	private String prmtNm;	// 프로모션명
+	private String prmtStd;	// 프로모션시작일
+	private String prmtEdd;	// 프로모션종료일
+	private String prmtGb;	// 프로모션구분(A:할인, B:무이자)
+	private String dcGb;	// 행사구분(프로모션구분이 A:할인인 경우)
+	private String linkUrl;	// 연결URL
+	private String note;	// 안내
+	private String dispYn;	// 표시여부
+
+	// 검색조건
+	private String stDate;
+	private String edDate;
+	private String search; // 키워드 종류
+	private String condition; // 키워드 종류별 값
+	private String beforSkipFlag;
+
+	//무이자 저장용
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] minPayAmt;	// 최소결제금액
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] minNoItrt;	// 최소무이자월수(프로모션구분이 B:무이자 인경우)
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] maxNoItrt;	// 최대무이자월수(프로모션구분이 B:무이자 인경우)
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrCardCd;
+
+
+	// Pagination
+	private TscPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
+}

+ 26 - 0
src/main/java/com/style24/persistence/domain/CardPromotionCondition.java

@@ -0,0 +1,26 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 카드프로모션 행사조건 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 29
+ */
+@SuppressWarnings("serial")
+@Data
+public class CardPromotionCondition extends TscBaseDomain {
+
+	private Integer cardPrmtCdtSq;	// 카드프로모션행사조건일련번호
+	private int cardPrmtSq;	// 카드프로모션일련번호
+	private int minPayAmt;	// 최소결제금액
+	private String dcWay;	// 할인구분할인방식(공통코드G240, 프로모션구분이 A:할인인 경우)
+	private int dcVal;	// 할인값(프로모션구분이 A:할인인 경우, 할인방식이 금액이면 할인금액, 율이면 할인율)
+	private int maxDcAmt;	// 최대할인금액(프로모션구분이 A:할인인 경우)
+	private String minNoItrt;	// 최소무이자월수(프로모션구분이 B:무이자 인경우)
+	private String maxNoItrt;	// 최대무이자월수(프로모션구분이 B:무이자 인경우)
+
+}

+ 23 - 0
src/main/java/com/style24/persistence/domain/CardPromotionTarget.java

@@ -0,0 +1,23 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 카드프로모션 대상 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 29
+ */
+@SuppressWarnings("serial")
+@Data
+public class CardPromotionTarget extends TscBaseDomain {
+
+	private Integer cardPrmtCdtSq;	// 카드프로모션행사조건일련번호
+	private String prmtTargetCd;	// 포로모션대상카드(공통코드G941)
+
+	private String callBackFun;
+	private String arrCard;
+
+}

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

@@ -45,8 +45,8 @@ public class Coupon extends TscBaseDomain {
     private String reissuance;				// 쿠폰재발급여부(공통코드G231)
     private String cpnStat;				    // 쿠폰상태(공통코드G232)
     private String endAlimYn;				// 만료알림여부
-    private String firstYn;				    // 첫구매여부 (Y:구매이력이없음 | N:구매이력있음)
-    private String downYn;					// 다운로드가능여부(마이페이지, 상품상세) --> EP쿠폰, 난수쿠폰
+    private String firstOrdYn;				// 첫구매여부 (Y:구매이력이없음 | N:구매이력있음)
+    private String downAblYn;				// 다운로드가능여부(마이페이지, 상품상세) --> EP쿠폰, 난수쿠폰
     private String custJoinStdt;			// 회원가입일자(FROM) 20200101 (신규회원여부의 판단을 가입일자로 설정함)
     private String custJoinEddt;			// 회원가입일자(FROM) 20200101 (신규회원여부의 판단을 가입일자로 설정함)
     private String buyStdt;				    // 회원가입일자(FROM) 20200101 (구매기간일자(FROM) (해당기간에 구매이력이 없으면 다운로드 가능))
@@ -54,7 +54,7 @@ public class Coupon extends TscBaseDomain {
     private int    issueCnt;				// 쿠폰발급개수
     private int    useCnt;					// 쿠폰사용개수
     private String payType;                 // 결제수단
-    private String custJoinYn;              // 신규회원여부
+    private String newCustYn;              // 신규회원여부
     private String afChannel;               // 제휴링크
     private String dcCdGb;                  // 할인코드유형 (공통코드G233)
     private String rdCpnNm;                 // 랜덤쿠폰 사용키 (시리얼명 or 난수)

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

@@ -29,4 +29,6 @@ public class CustCoupon extends TscBaseDomain {
 
     // 그리드 컬럼
     private String  custList;
+    private String  cpnNm;                  // 쿠폰명
+    private Integer ordNo;                  // 주문번호
 }

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

@@ -2,8 +2,8 @@ package com.style24.persistence.domain;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
-
 import com.style24.persistence.TscPageRequest;
+
 import lombok.Data;
 
 /**

+ 8 - 4
src/main/java/com/style24/persistence/domain/GoodsSearch.java

@@ -2,8 +2,8 @@ package com.style24.persistence.domain;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
-
 import com.style24.persistence.TscPageRequest;
+
 import lombok.Data;
 
 /**
@@ -49,7 +49,11 @@ public class GoodsSearch extends TscBaseDomain {
 	private String edDate;
 	private String stockQtySt;
 	private String stockQtyEd;
-	private String cateCd;
+
+	private String siteCd;
+	private String cateGb;
+	private String selLvl;
+	private int cateNo;
 	private String ageGrpCd;
 
 	private String regSuccYn;
@@ -83,8 +87,8 @@ public class GoodsSearch extends TscBaseDomain {
 	private Integer rinbdInfoSq;
 	private String callbackFn;
 
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] siteCd;
+	//@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	//private String[] siteCd;
 
 	/* 상품목록 Multi CheckBox 항목*/
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)

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

@@ -77,6 +77,9 @@ public class MoreBetter extends TscBaseDomain {
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] multiExceptGoods;
 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiDuplicateGoods;
+
 	// 날짜+시간
 	private String eventStdt;				// 다다익선시작일시
 	private String eventStHH;				// 다다익선시작일시

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

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
 import lombok.Data;
 
+import java.util.Collection;
 import java.util.List;
 
 
@@ -55,6 +56,11 @@ public class MoreBetterGoods extends TscBaseDomain {
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] multiExceptGoods;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiDuplicateGoods;
+
+	List<MoreBetterGoods> applyGoodsList;
 /*
 	List<MoreBetterGoods> multiSupplyCompCd;
 	List<MoreBetterGoods> multiBrand;

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

@@ -1,405 +0,0 @@
-package com.style24.persistence.domain;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.style24.persistence.TscBaseDomain;
-
-import com.style24.persistence.TscPageRequest;
-import lombok.Data;
-
-/**
- * 주문 Domain
- *
- * @author jsh77b
- * @since 2020. 11. 16
- */
-@SuppressWarnings("serial")
-@Data
-public class Order extends TscBaseDomain {
-	
-	// 주문마스터
-	private int ordNo;
-	private String mallGb;
-	private String mallGbNm;
-	private String ordDt;
-	private String payDt;
-	private int custNo;
-	private String ordNm;
-	private String ordTelno;
-	private String siteCd;
-	private String siteCdNm;
-	private int npayOrdNo;
-	private String frontGb;
-	private String frontGbNm;
-	private String extmallNm;
-
-	// 주문상세
-	private int ordDtlNo;
-	private String ordExchGb;
-	private String ordDtlStat;
-	private int orgOrdDtlNo;
-	private String supplyCompCd;
-	private String goodsCd;
-	private String formalGb;
-	private String formalGbNm;
-	private String goodsType;
-	private int listPrice;
-	private int currPrice;
-	private double dcRate;
-	private int optAddPrice;
-	private int ordQty;
-	private int ordAmt;
-	private int cnclRtnQty;
-	private int cnclRtnAmt;
-	private int cpn1CpnSq;
-	private int cpn1DcAmt;
-	private int tmtb1Sq;
-	private int tmtb1DcAmt;
-	private int tmtb2Sq;
-	private int tmtb2DcAmt;
-	private int goodsCpnSq;
-	private int goodsCpnDcAmt;
-	private int cartCpnSq;
-	private int cartCpnDcAmt;
-	
-	private int pntDcAmt;
-	private int prePntDcAmt;
-	private int savePntAmt;
-	
-	private int realOrdAmt;
-	private String venderId;
-	private String extmallId;
-	private String agentOrderId;
-	private String extmallOrderId;
-	private String changeableYn;
-	private String changeFeeFreeYn;
-	private String returnableYn;
-	private String returnFeeFreeYn;
-	
-	private String soldoutYn;
-	private String soldoutMemo;
-	private String soldoutRegNo;
-	private String soldoutRegDt;
-	private int delvAddrSq;
-	private String shotDelvYn;
-	private String giftPackYn;
-	
-	private String delvLocCd;
-	private String delvAssigngDt;
-	private String delvAddignStat;
-	private String dstrbtMemo;
-	private String delvStdt;
-	private String delvEddt;
-	
-	private String shipCompCd;
-	private String invoiceNo;
-	private String invoiceSendYn;
-	private String sellStoreCd;
-	private double sellFeeRate;
-	
-	private String afLinkCd;
-	private String ithrCd;
-	private String contentsLoc;
-	
-	private int planDtlsq;
-	private int socialSq;
-	
-	private String condition;
-	private String[] conditions = null;
-	
-	private String stDate;
-	private String edDate;
-	private String searchDateGb;
-	private String orderNm;
-	private int custId;
-	private String orderPhnno;
-	private String vendorId;
-	private String sizeCd;
-	private String goodsNm;
-	private String payMeans;
-	private String chgStat;
-	private String recipNm;
-	private String chgGb;
-	private String wdInvoiceSendYn;
-	
-	// 상품정보
-	private String imgPath1;
-	private String sysImgNm;
-	private String brandCd;
-	private String optCd1;
-	private String optCd2;
-	private String goodsTypeNm;
-	private String brandEnm;
-	private String itemCd;
-	private String goodsNum;
-	private String supplyGoodsCd;
-	private String optCd2s;
-	private int currStockQty;
-	private String currStockQtys;
-	
-	private int totDcAmt;
-	private String dateGbn;
-	private String mallCd;
-	private String search;
-	
-	/* Multi CheckBox 항목*/
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] multiBrand;
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] multiOrdStat;
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] multiOrdDtlStat;
-	
-	private int sumOrdAmt;
-	private int sumOrdCnclAmt;
-	private int sumRealPayAmt;
-	private int ordNoCnt;
-	private int sumOrdQty;
-	private int sumOrdCnclQty;
-	
-	private String excelFileNm;
-	
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private int[] ordNoList;
-	
-	private String delYn;
-	private String recipPhnno;
-	private String recipTelno;
-	private String recipZipcode;
-	private String recipBaseAddr;
-	private String recipDtlAddr;
-	private String ordEmail;
-	private String delvMemo;
-	private String delvAddrEditYn;
-	private String exchGbNm;
-	
-	private String escrowYn;
-	private String payMeansNm;
-	private String cardNm;
-	private String vaBank;
-	private String pgTradeNo;
-	private String payStat;
-	private String payStatNm;
-	private int payAmt;
-	private String vaDeadLine;
-	
-	private String delvFeeGb;
-	private String delvFeeGbNm;
-	private int delvFee;
-	private String delvUsacYn;
-	private String delvUsacDt;
-	private int delvFeeSq;
-	
-	private String coundelClsf;
-	private String relGoodsCd;
-	private String questTitle;
-	private String questDt;
-	private String ansDt;
-	private int andNo;
-	
-	private int ordChgSq;
-	private String chgGbNm;
-	private String chgStatNm;
-	private String chgReason;
-	private String chgReasonNm;
-	private String chgMemo;
-	private String chgerNm;
-	private String chgerPhnno;
-	private String chgerZipcode;
-	private String chgerBaseAddr;
-	private String chgerDtlAddr;
-	private String wdInvoiceNo;
-	
-	private String supplyCompNm;
-	private String brandKnm;
-	private String ordDtlStatNm;	
-	private String ordPhnno;
-	
-	private String custGrade;
-	private String custGradeNm;
-	private String custGb;
-	private String custGbNm;
-	private String managedRsn;
-	private String managedRsnNm;
-	
-	private int itemQty;
-	private int itemPrice;
-	private String itemNm;
-	private int gfcdUseAmt;
-	
-	// Pagination
-	private TscPageRequest pageable;
-	private int pageNo = 1;
-	private int pageSize = 50;
-	private int pageUnit = 10;
-	
-	// 주문문의 1:1 응답 칼럼
-	private String counselClsfNm;
-	private String ansNo;
-	private String ansNm;
-	private String regNm;
-	private String updNm;
-	
-	// 주문메모칼럼
-	private int orderMemoSq;
-	private String memo;
-	private String orgFileNm;
-	private String sysFileNm;
-	
-	// 사은품칼럼
-	private int ordFreegiftSq;
-	private int freegiftSq;
-	private String freegiftNm;
-	private int freegiftValSq;
-	private int usePoint;
-	private int seq;
-	private String userNm;
-	
-	// 환불계좌칼럼
-	private String raBank;
-	private String raBankNm;
-	private String raNo;
-	private String raNm;
-	private String defaultYn;
-	
-	// 주문상세변경내역칼럼
-	private String userId;
-	private String updId;
-	private String shipCompNm;
-	private String shipCompId;
-	
-	// 주문쿠폰
-	private int cpnSq;
-	private int cpnId;
-	private int cpnDcAmt;
-	private String cpnType;
-	private String targetCd1;
-	private String targetCd2;
-	private String cpnNm;
-	private String dcWay;
-	private int dcPval;
-	private int dcMval;
-	private int dcAval;
-	
-	// 주문포인트
-	private int pntPrate;
-	private int pntMrate;
-	private int pntAmt;
-	private String occurGb;
-	private String occurGbNm;
-	private String occurDtlDesc;
-	
-	// 주문상품권
-	private String gfcdNm;
-	private String gfcdNo;
-	private int gfcdAmt;
-	private int chgGfcdAmt;
-	private int usGfcdAmt;
-	private int rmGfcdAmt;
-	
-	// 다다익선
-	private int tmtbSq;
-	private String tmtbNm;
-	private int tmtbDcAmt;
-	
-	// 상태변경
-	private String g20;
-	private String g30;
-	private String g40;
-	private String g50;
-	private String g55;
-	private String g60;
-	
-	// 취소요청
-	private String cncWait;
-	private int ordReqChgQty;
-	private int itemReqChgQty;
-	private int itemOrdPrice;
-	private int minOrdAmt;
-	private int orgDelvFee;
-	private String delvFeeCd;
-	private int ordCanChgQty;
-	private String allCanYn;
-	
-	private String addDelvFeeYn;
-	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;
-	private int rtnDelvFee;
-	private int excDelvFee;
-
-	private String[] ordDtlStatArr;
-	
-	// 교환요청
-	private String ordChgOpt;
-	private String rtnLocZipcode;
-	private String rtnLocBaseAddr;
-	private String rtnLocDtlAddr;
-	private String rtnLocTelno;
-	private String rtnLocNm;
-	private int exchangeOrdDtlNo;
-	private int exchangeOrdDtlItemSq;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

+ 66 - 0
src/main/java/com/style24/persistence/domain/OrderSample.java

@@ -0,0 +1,66 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 주문 샘플 Domain
+ *
+ * @author card007
+ * @since 2021. 01. 30
+ */
+@SuppressWarnings("serial")
+@Data
+public class OrderSample extends TscBaseDomain {
+
+	private int ordNo;
+	private int ordDtlNo;
+	private int ordDtlItemSq;
+	private int delvAddrSq;
+	private int paySq;
+	private int custNo;
+	private String ordNm;
+	private String ordPhnno;
+	private String ordTelno;
+	private String ordEmail;
+	private String recipZipcode;
+	private String recipBaseAddr;
+	private String recipDtlAddr;
+	private String optCd2;
+	private int ordQty;
+	private String delvFeeGb;
+	private String delvFeeCd;
+	private int delvFeeSq;
+	private String ordDtlStat;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private Collection<OrderSampleGoods> goods;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] optCd2s;
+
+	private int no;
+	private String sysImgNm;
+	private String goodsCd;
+	private String compsGoodsCd;
+	private String goodsNm;
+	private String optCd;
+	private int stockQtySum;
+	private String goodsStat;
+	private String styleYear;
+	private String seasonCd;
+	private int listPrice;
+	private int currPrice;
+	private String priceUpdDt;
+	private String erpStockLinkYn;
+	private String formalGb;
+	private String returnableYn;
+	private String regDt;
+	private String regNm;
+	private String updDt;
+	private String updNm;
+}

+ 43 - 0
src/main/java/com/style24/persistence/domain/OrderSampleGoods.java

@@ -0,0 +1,43 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 주문 샘플 상품 Domain
+ *
+ * @author card007
+ * @since 2021. 01. 30
+ */
+@SuppressWarnings("serial")
+@Data
+public class OrderSampleGoods extends TscBaseDomain {
+
+	private int no;
+	private String sysImgNm;
+	private String goodsCd;
+	private String compsGoodsCd;
+	private String goodsNm;
+	private int ordQty;
+	private String optCd;
+	private String optCd2;
+	private int stockQtySum;
+	private String goodsStat;
+	private String styleYear;
+	private String seasonCd;
+	private int listPrice;
+	private int currPrice;
+	private String priceUpdDt;
+	private String erpStockLinkYn;
+	private String formalGb;
+	private String returnableYn;
+	private String regDt;
+	private String regNm;
+	private String updDt;
+	private String updNm;
+
+}

+ 96 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaCardPromotion.xml

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaCardPromotionDao">
+
+	<!-- 목록 페이징 정보 -->
+	<sql id="getListPagingCondition_sql">
+		<choose>
+		<when test="pageable != null">
+		    ) A
+		)Z
+		WHERE RNUM BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
+		</when>
+		<otherwise>
+		    ) A
+		)Z
+		</otherwise>
+		</choose>
+	</sql>
+	
+	<!-- 카드무이자할부 목록 건수-->
+	<select id="getCardInterestListCount" parameterType="CardPromotion" resultType="int">
+		/* TsaCardPromotionDao.getCardInterestListCount */
+		SELECT COUNT(1)
+		FROM TB_CARD_PROMOTION 
+		WHERE PRMT_GB = #{prmtGb}
+		<if test="condition != null and condition != ''">
+		    <choose>
+		        <when test='search != null and search == "1"'>
+		AND CARD_PRMT_SQ = #{condition}
+		        </when>
+		        <otherwise >
+		AND UPPER(PRMT_NM) LIKE CONCAT('%',UPPER(#{condition}),'%')
+		        </otherwise>
+		    </choose>
+		</if>
+		<if test="stDate != null and stDate != ''">
+		AND PRMT_EDD >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		</if>
+		<if test="edDate != null and edDate != ''">
+		<![CDATA[
+		AND PRMT_STD < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		]]>
+		</if>
+		<if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
+		AND PRMT_EDD >= NOW() 
+		</if>
+	</select>
+	
+	<!-- 카드무이자할부 목록 -->
+	<select id="getCardInterestList" parameterType="CardPromotion" resultType="CardPromotion">
+		/* TsaCardPromotionDao.getCardInterestList */
+		SELECT Z.*
+		FROM (
+		    SELECT A.*, @rownum := @rownum + 1 AS RNUM 
+		    FROM (
+		        SELECT CARD_PRMT_SQ
+		             , PRMT_NM
+		             , DATE_FORMAT(PRMT_STD, '%Y%m%d%H%i%S') AS PRMT_STD
+		             , DATE_FORMAT(PRMT_EDD, '%Y%m%d%H%i%S') AS PRMT_EDD
+		             , PRMT_GB
+		             , DC_GB
+		             , LINK_URL
+		             , NOTE
+		             , DISP_YN
+		             , FN_GET_USER_NM(REG_NO) AS REG_NM
+		             , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		             , FN_GET_USER_NM(UPD_NO) AS UPD_NM
+		             , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
+		        FROM TB_CARD_PROMOTION 
+		        WHERE PRMT_GB = #{prmtGb}
+		        <if test="condition != null and condition != ''">
+		            <choose>
+		                <when test='search != null and search == "1"'>
+		        AND CARD_PRMT_SQ = #{condition}
+		                </when>
+		                <otherwise >
+		        AND UPPER(PRMT_NM) LIKE CONCAT('%',UPPER(#{condition}),'%')
+		                </otherwise>
+		            </choose>
+		        </if>
+		        <if test="stDate != null and stDate != ''">
+		        AND PRMT_EDD >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		        </if>
+		        <if test="edDate != null and edDate != ''">
+		        <![CDATA[
+		        AND PRMT_STD < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		        ]]>
+		        </if>
+		        <if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
+		        AND PRMT_EDD >= NOW() 
+		        </if>
+		<include refid="getListPagingCondition_sql"/>
+	</select>
+	
+	
+</mapper>

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

@@ -82,7 +82,7 @@
 	<!-- ERP 연동 여부 -->
 	<select id="getWmsSyncYn" resultType="String">
 		/* TsaSystem.getWmsSyncYn */
-		SELECT UPPER(NVL(USE_YN,'N')) AS WMS_SYNC_YN
+		SELECT UPPER(IFNULL(USE_YN,'N')) AS WMS_SYNC_YN
 		FROM TB_COMMON_CODE
 		WHERE CD_GB = 'G077'
 		AND CD = 'WMSSYNCYN'

+ 42 - 63
src/main/java/com/style24/persistence/mybatis/shop/TsaCoupon.xml

@@ -11,7 +11,6 @@
 				SELECT SITE_CD
 					 , CPN_ID
 					 , CPN_NM
-					 , USABLE_CUST_GB
 					 , CPN_TYPE
 					 , DC_WAY
 					 , DC_PVAL
@@ -56,7 +55,6 @@
 		GROUP BY  T.SITE_CD
 				, T.CPN_ID
 				, T.CPN_NM
-				, T.USABLE_CUST_GB
 				, T.CPN_TYPE
 				, T.DC_WAY
 				, T.DC_PVAL
@@ -113,8 +111,6 @@
 		    CPN_NM
 		  , SITE_CD
 		  , AF_LINK_CD
-		  , USABLE_CUST_GB
-		  , USABLE_CUST_GRADE
 		  , CPN_TYPE
 		  , APPLY_SCOPE
 		  , DC_WAY
@@ -142,22 +138,17 @@
 		  , REG_DT
 		  , UPD_NO
 		  , UPD_DT
-		  , FIRST_YN
-		  , DOWN_YN
+		  , FIRST_ORD_YN
+		  , DOWN_ABL_YN
 		  , CUST_JOIN_STDT
 		  , CUST_JOIN_EDDT
 		  , BUY_STDT
 		  , BUY_EDDT
-		  <if test='cpnType != null and cpnType == "G230_20"'>
-		  , PAY_TYPE
-		  </if>
-		  , CUST_JOIN_YN
+		  , NEW_CUST_YN
 		) VALUES (
 		    #{cpnNm}
 		  , #{siteCd}
 		  , #{afLinkCd}
-		  , #{usableCustGb}
-		  , #{usableCustGrade}
 		  , #{cpnType}
 		  , #{applyScope}
 		  , #{dcWay}
@@ -194,38 +185,33 @@
 		  , now()
 		  , #{updNo}
 		  , now()
-		  , #{firstYn}
-		  , #{downYn}
+		  , #{firstOrdYn}
+		  , #{downAblYn}
 		  <choose>
-			  <when test='custJoinYn != null and custJoinYn == "Y"'>
+			  <when test='newCustYn != null and newCustYn == "Y"'>
 		  , DATE_FORMAT(#{custJoinStdt} , '%Y-%m-%d %H:%i:%s')
 		  , DATE_FORMAT(#{custJoinEddt} , '%Y-%m-%d %H:%i:%s')
 			  </when>
-			  <when test='custJoinYn != null and custJoinYn == "N"'>
+			  <when test='newCustYn != null and newCustYn == "N"'>
 		  , null
 		  , null
 			  </when>
 		  </choose>
 		  <choose>
-			  <when test='firstYn != null and firstYn == "Y"'>
+			  <when test='firstOrdYn != null and firstOrdYn == "Y"'>
 		  , DATE_FORMAT(#{buyStdt} , '%Y-%m-%d %H:%i:%s')
 		  , DATE_FORMAT(#{buyEddt} , '%Y-%m-%d %H:%i:%s')
 			  </when>
-			  <when test='firstYn != null and firstYn == "N"'>
+			  <when test='firstOrdYn != null and firstOrdYn == "N"'>
 		  , DATE_FORMAT(#{buyStdt} , '%Y-%m-%d %H:%i:%s')
 		  , DATE_FORMAT(#{buyEddt} , '%Y-%m-%d %H:%i:%s')
 			  </when>
 		  </choose>
-		  <if test='cpnType != null and cpnType == "G230_20"'>
-		  , #{payType}
-		  </if>
-		  , #{custJoinYn}
+		  , #{newCustYn}
 		) ON DUPLICATE KEY UPDATE
 		    CPN_NM = #{cpnNm}
 		  , SITE_CD = #{siteCd}
 		  , AF_LINK_CD = #{afLinkCd}
-		  , USABLE_CUST_GB = #{usableCustGb}
-		  , USABLE_CUST_GRADE = #{usableCustGrade}
 		  , CPN_TYPE = #{cpnType}
 		  , APPLY_SCOPE = #{applyScope}
 		  , DC_WAY = #{dcWay}
@@ -258,32 +244,29 @@
 		  , END_ALIM_YN = #{endAlimYn}
 		  , UPD_NO = #{updNo}
 		  , UPD_DT = now()
-		  , FIRST_YN = #{firstYn}
-		  , DOWN_YN = #{downYn}
+		  , FIRST_ORD_YN = #{firstOrdYn}
+		  , DOWN_ABL_YN = #{downAblYn}
 		<choose>
-			<when test='custJoinYn != null and custJoinYn == "Y"'>
+			<when test='newCustYn != null and newCustYn == "Y"'>
 		  , CUST_JOIN_STDT = DATE_FORMAT(#{custJoinStdt} , '%Y-%m-%d %H:%i:%s')
 		  , CUST_JOIN_EDDT = DATE_FORMAT(#{custJoinEddt} , '%Y-%m-%d %H:%i:%s')
 			</when>
-			<when test='custJoinYn != null and custJoinYn == "N"'>
+			<when test='newCustYn != null and newCustYn == "N"'>
 		  , CUST_JOIN_STDT = null
 		  , CUST_JOIN_EDDT = null
 			</when>
 		</choose>
 		<choose>
-			<when test='firstYn != null and firstYn == "Y"'>
+			<when test='firstOrdYn != null and firstOrdYn == "Y"'>
 		  , BUY_STDT = DATE_FORMAT(#{buyStdt} , '%Y-%m-%d %H:%i:%s')
 		  , BUY_EDDT = DATE_FORMAT(#{buyEddt} , '%Y-%m-%d %H:%i:%s')
 			</when>
-			<when test='firstYn != null and firstYn == "N"'>
+			<when test='firstOrdYn != null and firstOrdYn == "N"'>
 		  , BUY_STDT = null
 		  , BUY_EDDT = null
 			</when>
 		</choose>
-		<if test='cpnType != null and cpnType == "G230_20"'>
-		  , PAY_TYPE = #{payType}
-		</if>
-		  , CUST_JOIN_YN = #{custJoinYn}
+		  , NEW_CUST_YN = #{newCustYn}
 	</insert>
 
 	<!-- 쿠폰조회 목록 -->
@@ -292,7 +275,6 @@
 		SELECT A.CPN_ID                                               /*쿠폰ID*/
 		     , A.CPN_NM                                               /*쿠폰명*/
 		     , A.SITE_CD                                              /*사이트코드(공통코드G000)*/
-		     , A.USABLE_CUST_GB                                       /*사용가능고객구분(공통코드G100)*/
 		     , A.CPN_TYPE                                             /*쿠폰유형(공통코드G230)*/
 		     , A.DC_WAY                                               /*할인방식(공통코드G240)*/
 		     , A.DC_PVAL                                              /*할인값(PC). 할인방식이 금액이면 할인금액, 율이면 할인율*/
@@ -415,8 +397,6 @@
 			 , B.CPN_NM
 			 , B.SITE_CD
 			 , B.AF_LINK_CD
-			 , B.USABLE_CUST_GB
-			 , B.USABLE_CUST_GRADE
 			 , B.CPN_TYPE
 			 , B.APPLY_SCOPE
 			 , B.DC_WAY
@@ -439,15 +419,14 @@
 			 , B.REISSUANCE
 			 , B.CPN_STAT
 			 , B.END_ALIM_YN
-			 , B.FIRST_YN
-			 , B.DOWN_YN
+			 , B.FIRST_ORD_YN
+			 , B.DOWN_ABL_YN
 		     , B.DC_CD_GB
 			 , B.CUST_JOIN_STDT
 			 , B.CUST_JOIN_EDDT
 			 , B.BUY_STDT
 			 , B.BUY_EDDT
-			 , B.PAY_TYPE
-			 , B.CUST_JOIN_YN
+			 , B.NEW_CUST_YN
 			 , (SELECT AF_CHANNEL
 			      FROM TB_AF_LINK A
 			     WHERE A.AF_LINK_CD = B.AF_LINK_CD) AS AF_CHANNEL
@@ -564,29 +543,29 @@
 	<insert id="saveCouponCustPub" parameterType="CustCoupon">
 		/* TsaCoupon.saveCouponCustPub */
 		INSERT INTO TB_CUST_COUPON (
-			CUST_NO
-		  , CPN_ID
-		  , AVAIL_STDT
-		  , AVAIL_EDDT
-		  , PUB_REASON
-		  , PUB_REASON_DTL
-          , END_ALIM_SEND_YN
-          , REG_NO
-          , REG_DT
-          , UPD_NO
-          , UPD_DT
+		       CUST_NO
+		     , CPN_ID
+		     , AVAIL_STDT
+		     , AVAIL_EDDT
+		     , PUB_REASON
+		     , PUB_REASON_DTL
+		     , END_ALIM_SEND_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
 		) VALUES (
-		    #{custNo}
-		  , #{cpnId}
-		  , DATE_FORMAT(#{availStdt} , '%Y-%m-%d')
-		  , DATE_FORMAT(#{availEddt} , '%Y-%m-%d')
-		  , #{pubReason}
-		  , #{pubReasonDtl}
-		  , #{endAlimSendYn}
-		  , #{regNo}
-		  , now()
-		  , #{updNo}
-		  , now()
+		       #{custNo}
+		     , #{cpnId}
+		     , DATE_FORMAT(#{availStdt} , '%Y%m%d%H%i%S')
+		     , DATE_FORMAT(#{availEddt} , '%Y%m%d%H%i%S')
+		     , #{pubReason}
+		     , #{pubReasonDtl}
+		     , #{endAlimSendYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
 		)
 	</insert>
 

+ 37 - 42
src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml

@@ -307,7 +307,7 @@
 	</update>
 
 	<!--회원 쿠폰내역  -->
-	<select id="getCustomerCouponList" parameterType="Integer" resultType="Coupon">
+	<select id="getCustomerCouponList" parameterType="Integer" resultType="CustCoupon">
 		/* TsaCustomer.getCustomerCounponList */
 		WITH TAB1 AS (
 		              SELECT O.ORD_NO             AS ORD_NO
@@ -349,11 +349,12 @@
 		     , DATE_FORMAT(CC.AVAIL_EDDT, '%Y%m%d%H%i%S')            AS AVAIL_EDDT
 		     , CC.PUB_REASON
 		     , CC.PUB_REASON_DTL
+		     , CC.END_ALIM_SEND_YN
+		     , E.ORD_NO
 		     , DATE_FORMAT(CC.USED_DT, '%Y%m%d%H%i%S')               AS USED_DT
 		     , FN_GET_USER_NM(CC.REG_NO)                             AS REG_NM
 		     , FN_GET_USER_NM(CC.UPD_NO)                             AS USER_NM
 		     , DATE_FORMAT(CC.REG_DT, '%Y%m%d%H%i%S')                AS REG_DT
-		     , E.ORD_NO
 		FROM   TB_COUPON C
 		INNER JOIN
 		       TB_CUST_COUPON CC
@@ -427,46 +428,40 @@
 	<!--회원 포인트내역  -->
 	<select id="getCustomerPointList" parameterType="Integer" resultType="Point">
 		/* TsaCustomer.getCustomerPointList */
-		SELECT CC.*
-		FROM (
-		      SELECT DATE_FORMAT(CASE WHEN CPH.PNT_UPLOAD_STAT = 'G070_30'
-		                              THEN CPH.PNT_UPLOAD_DT
-		                          ELSE CPH.REG_DT END, '%Y-%m-%d' ) AS DT
-		           , CPH.PNT_HST_SQ
-		           , C.CUST_ID
-		           , C.CUST_NO
-		           , C.SITE_CD
-		           , CPH.OCCUR_GB
-		           , CPH.OCCUR_DTL_DESC
-		           , CPH.PNT_AMT
-		           , CPH.ORD_DTL_NO
-		           , CPH.REVIEW_SQ
-		           , DATE_FORMAT(CPH.SWITCH_DUE_DT, '%Y%m%d%H%i%S')  AS SWITCH_DUE_DT
-		           , CPH.PNT_UPLOAD_STAT
-		           , DATE_FORMAT(CPH.PNT_UPLOAD_DT, '%Y%m%d%H%i%S')  AS PNT_UPLOAD_DT
-		           , IFNULL(FN_GET_USER_NM(CPH.REG_NO), CPH.REG_NO)  AS REG_NM
-		           , DATE_FORMAT(CPH.REG_DT, '%Y%m%d%H%i%S')         AS REG_DT
-		           , IFNULL(FN_GET_USER_NM(CPH.UPD_NO), CPH.UPD_NO)  AS UPD_NM
-		           , DATE_FORMAT(CPH.UPD_DT, '%Y%m%d%H%i%S')         AS UPD_DT
-		           , DATE_FORMAT((
-		                          SELECT MAX(CP.EXP_BE_DT) AS EXP_BE_DT
-		                          FROM   TB_CUST_POINT CP
-		                          WHERE  CP.CUST_PNT_SQ = CPH.CUST_PNT_SQ
-			                      AND    CP.CUST_NO = CPH.CUST_NO
-		              ), '%Y%m%d%H%i%S') AS EXP_BE_DT
-		           , DATE_FORMAT((
-		                          SELECT MAX(CP.EXP_CMP_DT) AS EXP_CMP_DT
-		                          FROM   TB_CUST_POINT CP
-		                          WHERE  CP.CUST_PNT_SQ = CPH.CUST_PNT_SQ
-		                          AND    CP.CUST_NO = CPH.CUST_NO
-		              ), '%Y%m%d%H%i%S') AS EXP_CMP_DT
-		      FROM   TB_CUSTOMER C
-		      INNER JOIN
-		             TB_CUST_POINT_HST CPH
-		      ON     C.CUST_NO = CPH.CUST_NO
-		      WHERE  C.CUST_NO = #{custNo}
-		     ) CC
-		ORDER BY CC.DT DESC
+		SELECT  CPH.PNT_HST_SQ
+		      , C.CUST_ID
+		      , C.CUST_NO
+		      , C.SITE_CD
+		      , CPH.OCCUR_GB
+		      , CPH.OCCUR_DTL_DESC
+		      , CPH.PNT_AMT
+		      , CPH.ORD_DTL_NO
+		      , CPH.REVIEW_SQ
+		      , DATE_FORMAT(CPH.SWITCH_DUE_DT, '%Y%m%d%H%i%S')  AS SWITCH_DUE_DT
+		      , CPH.PNT_UPLOAD_STAT
+		      , DATE_FORMAT(CPH.PNT_UPLOAD_DT, '%Y%m%d%H%i%S')  AS PNT_UPLOAD_DT
+		      , IFNULL(FN_GET_USER_NM(CPH.REG_NO), CPH.REG_NO)  AS REG_NM
+		      , DATE_FORMAT(CPH.REG_DT, '%Y%m%d%H%i%S')         AS REG_DT
+		      , IFNULL(FN_GET_USER_NM(CPH.UPD_NO), CPH.UPD_NO)  AS UPD_NM
+		      , DATE_FORMAT(CPH.UPD_DT, '%Y%m%d%H%i%S')         AS UPD_DT
+		      , DATE_FORMAT((
+		                     SELECT MAX(CP.EXP_BE_DT) AS EXP_BE_DT
+		                     FROM   TB_CUST_POINT CP
+		                     WHERE  CP.CUST_PNT_SQ = CPH.CUST_PNT_SQ
+		                     AND    CP.CUST_NO = CPH.CUST_NO
+		         ), '%Y%m%d%H%i%S') AS EXP_BE_DT
+		      , DATE_FORMAT((
+		                     SELECT MAX(CP.EXP_CMP_DT) AS EXP_CMP_DT
+		                     FROM   TB_CUST_POINT CP
+		                     WHERE  CP.CUST_PNT_SQ = CPH.CUST_PNT_SQ
+		                     AND    CP.CUST_NO = CPH.CUST_NO
+		         ), '%Y%m%d%H%i%S') AS EXP_CMP_DT
+		FROM    TB_CUSTOMER C
+		INNER JOIN
+		        TB_CUST_POINT_HST CPH
+		ON      C.CUST_NO = CPH.CUST_NO
+		WHERE   C.CUST_NO = #{custNo}
+		ORDER BY CPH.REG_DT DESC
 	</select>
 
 	<!-- 회원 상품권이력 -->

+ 71 - 42
src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -394,8 +394,8 @@
 	<select id="getGoodsList" parameterType="GoodsSearch" resultType="Goods">
 		/* TsaGoods.getGoodsList */
 		SELECT Q.*
-		    , (CASE WHEN Q.GOODS_TYPE = 'G056_N' THEN (SELECT NVL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK WHERE GOODS_CD = Q.GOODS_CD) 
-		            ELSE (SELECT NVL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK_COMPOSE WHERE GOODS_CD = Q.GOODS_CD) 
+		    , (CASE WHEN Q.GOODS_TYPE = 'G056_N' THEN (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK WHERE GOODS_CD = Q.GOODS_CD) 
+		            ELSE (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK_COMPOSE WHERE GOODS_CD = Q.GOODS_CD) 
 		            END) AS STOCK_QTY_SUM
 		    , (SELECT ITEMKIND_NM FROM TB_ITEMKIND WHERE ITEMKIND_CD = Q.ITEMKIND_CD ) AS ITEMKIND_NM
 		    , FN_GET_USER_NM(REG_NO) AS REG_NM
@@ -553,12 +553,12 @@
 		        <if test="supplyCompCd != null and supplyCompCd != ''">
 		        AND G.SUPPLY_COMP_CD = #{supplyCompCd}
 		        </if>
-				<if test="multiSupplyCompCd != null and multiSupplyCompCd != ''">
-					AND G.SUPPLY_COMP_CD IN
-					<foreach collection="multiSupplyCompCd" item="item" index="index"  open="(" close=")" separator=",">
-						#{item}
-					</foreach>
-				</if>
+		        <if test="multiSupplyCompCd != null and multiSupplyCompCd != ''">
+		            AND G.SUPPLY_COMP_CD IN
+		            <foreach collection="multiSupplyCompCd" item="item" index="index"  open="(" close=")" separator=",">
+		                #{item}
+		            </foreach>
+		        </if>
 		        <if test="brandCd != null and brandCd != ''">
 		        AND G.BRAND_CD = #{brandCd}
 		        </if>
@@ -715,11 +715,31 @@
 		        <if test="ageGrpCd != null and ageGrpCd != ''">
 		        AND G.AGE_GRP_CD = #{ageGrpCd}
 		        </if>
-		        <if test="cateCd != null and cateCd != ''">
+		        <if test="cateNo != null and cateNo > 0 ">
 		        AND G.GOODS_CD IN (
 		            SELECT GOODS_CD
-		            FROM   TB_CATEGORY_GOODS
-		            WHERE  CATE_CD = #{cateCd}
+		            FROM TB_CATE_4SRCH A
+		            INNER JOIN TB_CATE_GOODS B ON A.LEAF_CATE_NO = B.CATE_NO
+		            WHERE 1 = 1
+		            AND SITE_CD = #{siteCd}
+		            AND CATE_GB = #{cateGb}
+		            <choose>
+		                <when test='selLvl != null and selLvl == "2"'>
+		            AND A.CATE1_NO = #{cateNo} 
+		                </when>
+		                    <when test='selLvl != null and selLvl == "3"'>
+		            AND A.CATE2_NO = #{cateNo} 
+		                </when>
+		                    <when test='selLvl != null and selLvl == "4"'>
+		            AND A.CATE3_NO = #{cateNo} 
+		                </when>
+		                    <when test='selLvl != null and selLvl == "5"'>
+		            AND A.CATE4_NO = #{cateNo} 
+		                </when>
+		                <otherwise>
+		            AND A.CATE5_NO = #{cateNo} 
+		                </otherwise>
+		            </choose>
 		        )
 		        </if>
 	</sql>
@@ -777,8 +797,8 @@
 		     , CASE IFNULL((SELECT COUNT(SYS_IMG_NM) FROM TB_GOODS_IMG  WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = G.MAIN_COLOR_CD AND DEFAULT_IMG_YN = 'Y' ),0) 
 		            WHEN 0 THEN 'N'
 		            ELSE 'Y' END AS GOODS_IMAGE_YN
-		     , (CASE WHEN G.GOODS_TYPE = 'G056_N' THEN (SELECT NVL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK WHERE GOODS_CD = G.GOODS_CD) 
-		            ELSE (SELECT NVL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK_COMPOSE WHERE GOODS_CD = G.GOODS_CD) 
+		     , (CASE WHEN G.GOODS_TYPE = 'G056_N' THEN (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK WHERE GOODS_CD = G.GOODS_CD) 
+		            ELSE (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK_COMPOSE WHERE GOODS_CD = G.GOODS_CD) 
 		            END) AS STOCK_QTY_SUM
 		     , (SELECT ITEMKIND_NM FROM TB_ITEMKIND WHERE ITEMKIND_CD = G.ITEMKIND_CD) AS ITEMKIND_NM
 		     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG  WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = G.MAIN_COLOR_CD AND DEFAULT_IMG_YN = 'Y' ) AS SYS_IMG_NM
@@ -972,12 +992,12 @@
 		      , N.NI_CLSF_CD
 		      , N.NI_ITEM_CD
 		      , FN_GET_CODE_NM('G005', N.NI_ITEM_CD) AS NI_ITEM_NM
-		      , CASE WHEN NI_ITEM_CD = 'G005_003' THEN NVL(G.COLOR_NM,N.NI_CONTENT)
-		             WHEN NI_ITEM_CD = 'G005_004' THEN NVL(G.SIZE_NAME,N.NI_CONTENT)
-		             WHEN NI_ITEM_CD = 'G005_006' THEN NVL(FN_GET_CODE_NM('G076', G.ORIGIN_CD),N.NI_CONTENT)
+		      , CASE WHEN NI_ITEM_CD = 'G005_003' THEN IFNULL(G.COLOR_NM,N.NI_CONTENT)
+		             WHEN NI_ITEM_CD = 'G005_004' THEN IFNULL(G.SIZE_NAME,N.NI_CONTENT)
+		             WHEN NI_ITEM_CD = 'G005_006' THEN IFNULL(FN_GET_CODE_NM('G076', G.ORIGIN_CD),N.NI_CONTENT)
 		             WHEN NI_ITEM_CD = 'G005_097' AND FN_GET_CODE_NM('G076', G.ORIGIN_CD) IN ('대한민국', '한국', 'KOREA') THEN 'N'
 		             WHEN NI_ITEM_CD = 'G005_097' AND FN_GET_CODE_NM('G076', G.ORIGIN_CD) NOT IN ('대한민국', '한국', 'KOREA') THEN 'Y'
-		             WHEN NI_ITEM_CD = 'G005_009' THEN NVL(G.MAKE_YMD, N.NI_CONTENT)
+		             WHEN NI_ITEM_CD = 'G005_009' THEN IFNULL(G.MAKE_YMD, N.NI_CONTENT)
 		        ELSE N.NI_CONTENT
 		        END
 		        AS  NI_CONTENT
@@ -1265,7 +1285,7 @@
 	<!-- 상품 자동 검색어 조회-->
 	<select id="getGoodsSnm" parameterType="String" resultType="String">
 		/* TsaGoods.getGoodsSnm */
-		WITH RECURSIVE TMP_COLOR_GOODS AS (
+		WITH TMP_COLOR_GOODS AS (
 		    SELECT GOODS_CD
 		         , REPLACE(CONCAT(GROUP_CONCAT(COLOR_GRP_CD),';',GROUP_CONCAT(COLOR_ENM),';',GROUP_CONCAT(CD_NM)),',',';') AS COLOR_INFO
 		    FROM (
@@ -1289,7 +1309,7 @@
 		       G.STYLE_YEAR,';',
 		       FN_GET_CODE_NM('G006',G.SEASON_CD),';',
 		       FN_GET_CODE_NM('G007',G.SEX_GB),';',
-		       NVL2(D.COLOR_INFO,CONCAT(D.COLOR_INFO,';'),''),
+		       COALESCE(D.COLOR_INFO,CONCAT(D.COLOR_INFO,';'),''),
 		       REPLACE(I.ITEMKIND_NM,'>',';')
 		       )) AS GOODS_SNM
 		FROM TB_GOODS G
@@ -1313,8 +1333,8 @@
 	<select id="getNewNotiInfo" parameterType="Goods" resultType="GoodsNotiInfo">
 		/* TsaGoods.getNewNotiInfo */
 		SELECT D.NI_CLSF_CD
-		     , NVL(C.NI_ITEM_CD, D.NI_ITEM_CD) AS NI_ITEM_CD
-		     , NVL(C.NI_CONTENT, D.NI_CONTENT) AS NI_CONTENT
+		     , IFNULL(C.NI_ITEM_CD, D.NI_ITEM_CD) AS NI_ITEM_CD
+		     , IFNULL(C.NI_CONTENT, D.NI_CONTENT) AS NI_CONTENT
 		     , D.DISP_ORD
 		FROM (
 		       SELECT A.NI_CLSF_CD
@@ -1380,7 +1400,7 @@
 	<!-- 상품 사이즈 조회 -->
 	<select id="getGoodsSizeList" parameterType="Goods" resultType="Option">
 		/* TsaGoods.getGoodsSizeList */
-		WITH RECURSIVE TMP_GOODS AS (
+		WITH TMP_GOODS AS (
 		    SELECT A.GOODS_CD 
 		         , A.GOODS_TYPE 
 		         , IFNULL(B.COMPS_GOODS_CD, A.GOODS_CD) AS COMPS_GOODS_CD
@@ -1393,7 +1413,7 @@
 		SELECT #{goodsCd} AS GOODS_CD
 		     , A.GOODS_CD AS COMPS_GOODS_CD
 		     , A.OPT_CD
-		     , CONCAT(A.OPT_CD1,  NVL2(A.OPT_CD2, '', CONCAT('/', A.OPT_CD2))) AS OPT_NM 
+		     , CONCAT(A.OPT_CD1,  COALESCE(A.OPT_CD2, '', CONCAT('/', A.OPT_CD2))) AS OPT_NM 
 		     , A.OPT_CD1
 		     , A.OPT_CD2
 		     , A.ADD_PRICE
@@ -1429,15 +1449,15 @@
 	<select id="getGoodsColorList" parameterType="Goods" resultType="GoodsImg">
 		/* TsaGoods.getGoodsColorList */
 		SELECT A.GOODS_CD 
-		     , NVL(A.OPT_CD1, A.MAIN_COLOR_CD) AS OPT_CD1
+		     , IFNULL(A.OPT_CD1, A.MAIN_COLOR_CD) AS OPT_CD1
 		     , A.MAIN_COLOR_CD
-		     , IF(A.MAIN_COLOR_CD = NVL(A.OPT_CD1, A.MAIN_COLOR_CD), 'Y','N') AS  MAIN_COLOR_YN
+		     , IF(A.MAIN_COLOR_CD = IFNULL(A.OPT_CD1, A.MAIN_COLOR_CD), 'Y','N') AS  MAIN_COLOR_YN
 		     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG  WHERE GOODS_CD = A.GOODS_CD AND COLOR_CD = A.OPT_CD1 AND DEFAULT_IMG_YN = 'Y' ) AS SYS_IMG_NM 
 		     , C.COLOR_ENM 
 		FROM (
 		      SELECT A.GOODS_CD 
 		           , A.MAIN_COLOR_CD 
-		           , NVL(B.OPT_CD1,'00') AS OPT_CD1
+		           , IFNULL(B.OPT_CD1,'00') AS OPT_CD1
 		      FROM TB_GOODS A
 		      LEFT OUTER JOIN TB_OPTION B ON A.GOODS_CD = B.GOODS_CD
 		                                  AND 1 = (CASE WHEN A.SELF_GOODS_YN = 'Y' THEN 1
@@ -1533,11 +1553,11 @@
 		)
 		VALUES(
 		    #{goodsCd}
-		  , NVL(#{productNo},0)
-		  , NVL(#{productCode},0)
+		  , IFNULL(#{productNo},0)
+		  , IFNULL(#{productCode},0)
 		  , #{brandCd}
 		  , #{itemkindCd}
-		  , NVL(#{goodsNm},'상품명없음')
+		  , IFNULL(#{goodsNm},'상품명없음')
 		  , #{goodsTnm}
 		  , #{goodsSnm}
 		  , #{goodsSnm1}
@@ -1546,13 +1566,13 @@
 		  , #{seasonCd}
 		  , #{sexGb}
 		  , #{goodsNum}
-		  , NVL(#{goodsType},'N')
+		  , IFNULL(#{goodsType},'N')
 		  , #{listPrice}
 		  , #{currPrice}
 		  , #{costPrice}
 		  , #{dcRate}
 		  , #{goodsStat}
-		  , NVL(#{selfMallYn},'Y') 
+		  , IFNULL(#{selfMallYn},'Y') 
 		  , #{goodsGb}
 		  , #{distributionGb}
 		  , #{selfGoodsYn}
@@ -1564,13 +1584,13 @@
 		  , #{pntMrate}
 		  , #{sellFeeRate}
 		  , #{formalGb}
-		  , NVL(#{giftPackYn},'N')
+		  , IFNULL(#{giftPackYn},'N')
 		  , #{originCd}
 		  , #{makeYmd}
 		  , #{taxGb}
-		  , NVL(#{erpStockLinkYn},'N')
-		  , NVL(#{newCustOrdYn},'N')
-		  , NVL(#{adultYn},'N')
+		  , IFNULL(#{erpStockLinkYn},'N')
+		  , IFNULL(#{newCustOrdYn},'N')
+		  , IFNULL(#{adultYn},'N')
 		  , #{regNo}
 		  , NOW()
 		  , #{updNo}
@@ -1626,7 +1646,7 @@
 		  , GOODS_SNM1 = #{goodsSnm1}
 		  , SELF_MALL_YN = #{selfMallYn}
 		  , GOODS_SNM = #{goodsSnm}
-		  , FRST_CFRM_DT = (CASE #{chGoodsStatYn} WHEN 'Y' THEN NVL2(FRST_CFRM_DT, NOW(), FRST_CFRM_DT)
+		  , FRST_CFRM_DT = (CASE #{chGoodsStatYn} WHEN 'Y' THEN COALESCE(FRST_CFRM_DT, NOW(), FRST_CFRM_DT)
 		                                          ELSE FRST_CFRM_DT END)
 		  , PRE_PPNT_USABLE_YN = #{prePpntUsableYn}
 		  , PRE_MPNT_USABLE_YN = #{preMpntUsableYn}
@@ -2742,10 +2762,10 @@
 		, #{sellFeeRate}
 		, STR_TO_DATE(#{applyStdt},'%Y%m%d%H%i%S')
 		, STR_TO_DATE(#{applyEddt},'%Y%m%d%H%i%S')
-		, NVL(#{cfrmYn},'N')
+		, IFNULL(#{cfrmYn},'N')
 		, #{cfrmNo}
 		, #{cfrmDt}
-		, NVL(#{applyYn},'N')
+		, IFNULL(#{applyYn},'N')
 		, #{regNo}
 		, NOW()
 		, #{updNo}
@@ -3133,7 +3153,7 @@
 		              , G.GOODS_NM
 		              , G.LIST_PRICE
 		              , G.CURR_PRICE
-		              , NVL(GB.PC_CURR_PRICE,G.CURR_PRICE) AS BENEFIT_PRICE
+		              , IFNULL(GB.PC_CURR_PRICE,G.CURR_PRICE) AS BENEFIT_PRICE
 		              , FN_GET_USER_NM(GE.REG_NO) AS UPD_NM
 		              , DATE_FORMAT(GE.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
 		              , FN_GET_USER_NM(GE.UPD_NO) AS UPD_NM
@@ -3855,7 +3875,7 @@
 		   , REG_NO
 		   , REG_DT
 		    )
-		WITH RECURSIVE TAB_GOODS AS (
+		WITH TAB_GOODS AS (
 		    SELECT A.GOODS_CD
 		         , A.ITEMKIND_CD
 		         , B.CATE_NO
@@ -4133,8 +4153,8 @@
 		</if>
 		<if test='formalGb != null and formalGb != "X"'>
 		  , FORMAL_GB = #{formalGb}
-		  , PNT_PRATE = NVL(#{pntPrate}, PNT_PRATE)
-		  , PNT_MRATE = NVL(#{pntMrate}, PNT_MRATE)
+		  , PNT_PRATE = IFNULL(#{pntPrate}, PNT_PRATE)
+		  , PNT_MRATE = IFNULL(#{pntMrate}, PNT_MRATE)
 		</if>
 		<if test="minOrdQty != null and minOrdQty > 0">
 		  , MIN_ORD_QTY = #{minOrdQty}
@@ -4324,6 +4344,15 @@
 		        </if>
 		    </otherwise>
 		</choose>
+		<choose>
+		    <when test='sizeGb != null and sizeGb == "1"'>
+		ORDER BY A.SIZE_GB, A.SIZE_CATE1_CD, A.DISP_ORD
+		    </when>
+		    <otherwise>
+		ORDER BY A.SIZE_GB, A.DISP_ORD
+		    </otherwise>
+		</choose>
+		
 	</select>
 	
 	<!-- 사이즈 정보 저장 -->

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

@@ -207,9 +207,9 @@
 		                        ),0) > 0 THEN 1
 		            ELSE 0
 		       END        AS LEAF_LVL /*말단레벨*/
+		     , RANK() OVER(ORDER BY DISP_ORD) AS RK
 		FROM   CONNECTBY2 A
 		WHERE  MENU_ID NOT LIKE 'P%' /*팝업메뉴제외*/
-		ORDER  BY DISP_ORD
 	</select>
 
 </mapper>

+ 53 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaMorebetter.xml

@@ -608,5 +608,58 @@
 			, UPD_DT = NOW()
 		WHERE TMTB_SQ = #{tmtbSq}
 	</update>
+
+	<delete id="deleteTmtbApplyGoodsTemp" parameterType="MoreBetterGoods">
+		/* TsaMarketing.deleteTmtbApplyGoodsTemp */
+		DELETE FROM TB_TMTB_APPLY_GOODS_TEMP
+		WHERE	REG_NO = #{regNo}
+	</delete>
+
+	<insert id="createTmtbApplyGoodsTemp" parameterType="MoreBetterGoods">
+		/* TsaMarketing.createTmtbApplyGoodsTemp */
+		INSERT INTO TB_TMTB_APPLY_GOODS_TEMP(
+											 REG_NO
+											,GOODS_CD
+		)
+		VALUES (
+				   #{regNo}
+			   ,#{goodsCd}
+			   )
+	</insert>
+
+	<select id="getMorebetterRealApplyGoodsList" parameterType="MoreBetter" resultType="MoreBetterGoods">
+		/* TsaMarketing.getMorebetterRealApplyGoodsList */
+		SELECT	GOODS_CD
+		  FROM	TB_TMTB_APPLY_GOODS_TEMP
+		 WHERE	1=1
+		   AND	REG_NO = #{regNo}
+		   AND	GOODS_CD NOT IN (
+							SELECT	GOODS_CD
+							FROM	TB_TMTB_USING_GOODS_TEMP
+							WHERE	1=1
+							  AND	REG_NO = #{regNo}
+							)
+	</select>
+
+	<select id="getMorebetterCompBrandGoodsList" parameterType="MoreBetterGoods" resultType="MoreBetterGoods">
+		/* TsaMarketing.getMorebetterCompBrandGoodsList */
+		SELECT  G.GOODS_CD
+				,'G800_20' AS GOODS_GB
+				,'G260_10' AS TARGET_GB
+		FROM  TB_GOODS G
+		WHERE  1=1
+		<if test="multiSupplyCompCd != null and multiSupplyCompCd.length>0">
+			AND G.SUPPLY_COMP_CD IN
+			<foreach collection="multiSupplyCompCd" item="item" index="index"  open="(" close=")" separator=",">
+				#{item}
+			</foreach>
+		</if>
+		<if test="multiBrand != null and multiBrand.length>0">
+			AND G.BRAND_CD IN
+			<foreach collection="multiBrand" item="item" index="index"  open="(" close=")" separator=",">
+				#{item}
+			</foreach>
+		</if>
+	</select>
 	<!--// CSB 진행 -->
 </mapper>

+ 0 - 1604
src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml

@@ -1,1604 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.style24.admin.biz.dao.TsaOrderDao">
-
-	<!-- 주문목록 > 주문목록카운트 -->
-	<select id="getOrderListCount" parameterType="Order" resultType="int">
-		/* order.getOrderListCnt */
-		SELECT COUNT(1)  
-		FROM   TB_ORDER O
-		INNER  JOIN TB_ORDER_DETAIL OD
-		ON     O.ORD_NO = OD.ORD_NO
-		INNER  JOIN TB_GOODS G1
-		ON     OD.GOODS_CD = G1.GOODS_CD
-		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 G2
-		ON     ODI.ITEM_CD = G2.GOODS_CD
-		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 (
-			SELECT OC.WD_INVOICE_NO
-			     , OC.WD_INVOICE_SEND_YN
-			     , OC.SHIP_COMP_CD
-			     , OCD.ORD_DTL_NO 
-			     , OCD.CHG_QTY
-			     , OCD.CHG_STAT
-			FROM   TB_ORDER_CHANGE OC
-			INNER  JOIN TB_ORDER_CHANGE_DETAIL OCD
-			ON     OC.ORD_CHG_SQ  = OCD.ORD_CHG_SQ
-			WHERE  1=1 
-			GROUP  BY OCD.ORD_DTL_NO 
-		) OCD
-		ON    OD.ORD_DTL_NO = OCD.ORD_DTL_NO
-		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    G1.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="multiOrdDtlStat == null or multiOrdDtlStat == ''">
-        	<if test="multiOrdStat != null and multiOrdStat != ''">
-        AND    OD.ORD_DTL_STAT IN
-				<foreach collection="multiOrdStat" item="item" index="index"  open="(" close=")" separator=",">
-	        		#{item}
-	            </foreach>
-            </if>
-        </if>
-		<if test="chgStat != null and chgStat != ''">
-        AND    OCD.CHG_STAT = #{chgStat}
-        </if>
-        <if test="chgStat == null or chgStat == ''">
-        	<if test="chgGb != null and chgGb != ''">
-        AND    OCD.CHG_STAT = #{chgGb}
-        	</if>
-        </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    OD.EXTMALL_ORDER_ID = #{condition}
-			</if>
-		</if>
-		<if test='search != null and search == "searchAgentOrderId"'>
-        	<if test="condition != null and condition != ''">
-		AND    OD.AGENT_ORDER_ID = #{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    G1.GOODS_CD = #{goodsCd}
-		</if>
-		<if test='sizeCd != null and sizeCd != ""'>
-		AND    ODI.OPT_CD2 = #{sizeCd}
-		</if>
-		<if test='goodsNm != null and goodsNm != ""'>
-		AND    G1.GOODS_NM = #{goodsNm}
-		</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    G2.GOODS_CD = #{goodsCd}
-		</if>
-		<if test='sizeCd != null and sizeCd != ""'>
-		AND    ODI.OPT_CD2 = #{sizeCd}
-		</if>
-		<if test='goodsNm != null and goodsNm != ""'>
-		AND    G2.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>
-		<if test="ordNoList != null and ordNoList != ''">
-        AND    OD.ORD_NO IN
-			<foreach collection="ordNoList" item="item" index="index"  open="(" close=")" separator=",">
-        		#{item}
-            </foreach>
-        </if>
-	</select>
-
-	<!-- 주문목록 > 주문목록 -->
-	<select id="getOrderList" parameterType="Order" resultType="Order">
-		/* order.getOrderList */
-		SELECT Z.*
-		FROM (
-			SELECT @rownum := @rownum + 1 AS RNUM
-			     , A.*
-			FROM (
-				SELECT O.ORD_NO
-				     , OD.ORD_DTL_NO
-				     , ODI.ORD_DTL_ITEM_SQ
-				     , O.ORD_NM
-				     , O.CUST_NO
-				     , OD.VENDOR_ID
-				     , O.FRONT_GB
-				     , DATE_FORMAT(O.ORD_DT,'%Y%m%d%H%i%S') AS ORD_DT
-				     , OD.ORD_EXCH_GB
-				     , OD.ORD_DTL_STAT
-				     , OD.DELV_LOC_CD
-				     , G1.GOODS_CD 
-				     , G1.GOODS_NM
-				     , G1.GOODS_TYPE
-				     , FN_GET_CODE_NM('G056', G1.GOODS_TYPE) AS GOODS_TYPE_NM
-				     , GI.SYS_IMG_NM
-				     , G2.BRAND_CD
-				     , (SELECT Z.BRAND_ENM
-				        FROM   TB_BRAND Z
-				        WHERE  Z.BRAND_CD = G2.BRAND_CD) AS BRAND_ENM
-				     , G2.GOODS_CD AS ITEM_CD
-				     , G2.GOODS_NM AS ITEM_NM
-				     , ODI.OPT_CD1
-				     , ODI.OPT_CD2
-				     , OD.EXTMALL_ORDER_ID
-				     , OD.AGENT_ORDER_ID 
-				     , ODI.ITEM_QTY * OD.ORD_QTY      AS ORD_QTY
-				     , ODI.ITEM_QTY * OD.CNCL_RTN_QTY AS CNCL_RTN_QTY
-				     , ODI.ORD_AMT
-				     , ODI.CNCL_RTN_AMT
-				     , ODI.CPN1_DC_AMT + ODI.TMTB1_DC_AMT + ODI.TMTB2_DC_AMT +  ODI.GOODS_CPN_DC_AMT + ODI.CART_CPN_DC_AMT + ODI.PNT_DC_AMT + ODI.PRE_PNT_DC_AMT AS TOT_DC_AMT
-				     , ODI.REAL_ORD_AMT
-				     , G2.SUPPLY_GOODS_CD
-				     , OD.FORMAL_GB
-				     , DATE_FORMAT(OD.DELV_ASSIGN_DT,'%Y%m%d%H%i%S') AS DELV_ASSIGN_DT 
-				     , OD.INVOICE_NO
-				     , OD.DELV_STDT
-				     , OD.SOLDOUT_YN
-				     , OD.SOLDOUT_MEMO
-				     , DATE_FORMAT(OD.SOLDOUT_REG_DT,'%Y%m%d%H%i%S') AS SOLDOUT_REG_DT 
-				     , OD.SOLDOUT_REG_NO     
-		             , CASE WHEN OD.ORD_EXCH_GB = 'O'
-			                THEN '주문'
-			                ELSE '교환'
-			                END   EXCH_GB_NM 
-				FROM   TB_ORDER O
-				INNER  JOIN TB_ORDER_DETAIL OD
-				ON     O.ORD_NO = OD.ORD_NO
-				INNER  JOIN TB_GOODS G1
-				ON     OD.GOODS_CD = G1.GOODS_CD
-				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 G2
-				ON     ODI.ITEM_CD = G2.GOODS_CD
-				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 (
-					SELECT OC.WD_INVOICE_NO
-					     , OC.WD_INVOICE_SEND_YN
-					     , OC.SHIP_COMP_CD
-					     , OCD.ORD_DTL_NO 
-					     , OCD.CHG_QTY
-					     , OCD.CHG_STAT
-					FROM   TB_ORDER_CHANGE OC
-					INNER  JOIN TB_ORDER_CHANGE_DETAIL OCD
-					ON     OC.ORD_CHG_SQ  = OCD.ORD_CHG_SQ 
-					WHERE  1=1
-					GROUP  BY OCD.ORD_DTL_NO 
-				) OCD
-				ON    OD.ORD_DTL_NO = OCD.ORD_DTL_NO
-				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    G1.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="multiOrdDtlStat == null or multiOrdDtlStat == ''">
-		        	<if test="multiOrdStat != null and multiOrdStat != ''">
-		        AND    OD.ORD_DTL_STAT IN
-						<foreach collection="multiOrdStat" item="item" index="index"  open="(" close=")" separator=",">
-			        		#{item}
-			            </foreach>
-		            </if>
-		        </if>
-				<if test="chgStat != null and chgStat != ''">
-		        AND    OCD.CHG_STAT = #{chgStat}
-		        </if>
-		        <if test="chgStat == null or chgStat == ''">
-		        	<if test="chgGb != null and chgGb != ''">
-		        AND    OCD.CHG_STAT = #{chgGb}
-		        	</if>
-		        </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    OD.EXTMALL_ORDER_ID = #{condition}
-					</if>
-				</if>
-				<if test='search != null and search == "searchAgentOrderId"'>
-		        	<if test="condition != null and condition != ''">
-				AND    OD.AGENT_ORDER_ID = #{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    G1.GOODS_CD = #{goodsCd}
-				</if>
-				<if test='sizeCd != null and sizeCd != ""'>
-				AND    ODI.OPT_CD2 = #{sizeCd}
-				</if>
-				<if test='goodsNm != null and goodsNm != ""'>
-				AND    G1.GOODS_NM = #{goodsNm}
-				</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    G2.GOODS_CD = #{goodsCd}
-				</if>
-				<if test='sizeCd != null and sizeCd != ""'>
-				AND    ODI.OPT_CD2 = #{sizeCd}
-				</if>
-				<if test='goodsNm != null and goodsNm != ""'>
-				AND    G2.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>
-				<if test="ordNoList != null and ordNoList != ''">
-		        AND    OD.ORD_NO IN
-					<foreach collection="ordNoList" item="item" index="index"  open="(" close=")" separator=",">
-		        		#{item}
-		            </foreach>
-		        </if>
-		        ORDER  BY OD.ORD_NO 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="getOrderInfoList" parameterType="Order" resultType="Order">
-		/* order.getOrderInfoList */
-		SELECT O.SITE_CD
-		     , FN_GET_CODE_NM('G000', O.SITE_CD) AS SITE_CD_NM
-		     , O.MALL_GB
-		     , FN_GET_CODE_NM('G011', O.MALL_GB) AS MALL_GB_NM
-		     , O.FRONT_GB
-		     , CASE WHEN O.FRONT_GB = 'P'
-		            THEN 'PC'
-		            ELSE 'MOBILE'
-		             END FRONT_GB_NM
-		     , OD.EXTMALL_ID
-		     , (SELECT X.EXTMALL_NM
-		        FROM   TB_EXTMALL X
-		        WHERE  X.EXTMALL_ID = OD.EXTMALL_ID) AS EXTMALL_NM 
-		     , O.ORD_DT
-		     , O.ORD_NM
-		     , O.CUST_NO
-		     , O.ORD_NO
-		     , O.ORD_EMAIL
-		     , O.ORD_PHNNO
-		     , O.ORD_TELNO
-		     , C.CUST_GB 
-		     , CASE WHEN C.CUST_GB IS NULL 
-		            THEN '비회원'
-		            ELSE FN_GET_CODE_NM('G100', C.CUST_GB) 
-		             END CUST_GB_NM
-		     , C.MANAGED_RSN
-		     , CASE WHEN C.MANAGED_RSN IS NULL 
-		            THEN '부'
-		            ELSE FN_GET_CODE_NM('G120', C.MANAGED_RSN) 
-		             END MANAGED_RSN_NM
-		     , C.CUST_GRADE
-		     , CASE WHEN C.CUST_GRADE IS NULL 
-		            THEN '등급없음'
-		            ELSE FN_GET_CODE_NM('G110', C.CUST_GRADE) 
-		             END CUST_GRADE_NM
-			 , P.ESCROW_YN
-		     , P.PAY_MEANS
-		     , FN_GET_CODE_NM('G014', P.PAY_MEANS) AS PAY_MEANS_NM
-		     , P.CARD_NM
-		     , P.VA_BANK
-		     , CASE WHEN P.PAY_MEANS = 'G014_20' || P.PAY_MEANS = 'G014_10'
-		            THEN FN_GET_CODE_NM('G940', P.VA_BANK)
-		            ELSE P.CARD_NM
-		            END  CARD_NM
-		     , P.PG_TRADE_NO
-		     , DATE_FORMAT(P.PAY_DT,'%Y%m%d%H%i%S') AS PAY_DT
-		     , P.PAY_STAT
-		     , FN_GET_CODE_NM('G016', P.PAY_STAT) AS PAY_STAT_NM
-		     , P.PAY_AMT
-		     , DATE_FORMAT(P.VA_DEADLINE,'%Y%m%d%H%i%S') AS VA_DEADLINE
-		FROM   TB_ORDER O
-		INNER  JOIN TB_ORDER_DETAIL OD
-		ON     O.ORD_NO = OD.ORD_NO
-		LEFT   OUTER JOIN TB_CUSTOMER C
-		ON     O.CUST_NO = C.CUST_NO
-		INNER  JOIN TB_PAYMENT P
-		ON     O.ORD_NO = P.ORD_NO
-		AND    P.PAY_GB = 'O'
-		AND    P.PAY_STAT = 'G016_30'
-		WHERE  1=1
-		AND    O.ORD_NO = #{ordNo}
-		LIMIT  1
-	</select>
-	
-	<!-- 주문상세 > 주문상품상세 목록(단품) -->
-	<select id="getOrderDetailList" parameterType="Order" resultType="Order">
-		/* order.getOrderDetailList */
-		SELECT OD.ORD_NO
-		     , CASE WHEN OD.ORD_EXCH_GB = 'O'
-			        THEN '주문'
-			        ELSE '교환'
-			        END   EXCH_GB_NM 
-		     , OD.ORD_DTL_NO
-		     , G1.GOODS_CD 
-		     , G1.GOODS_NM
-		     , G1.GOODS_TYPE
-		     , FN_GET_CODE_NM('G056', G1.GOODS_TYPE) AS GOODS_TYPE_NM
-		     , GI.SYS_IMG_NM
-		     , G2.BRAND_CD
-		     , (SELECT Z.BRAND_ENM
-		        FROM   TB_BRAND Z
-		        WHERE  Z.BRAND_CD = G2.BRAND_CD) AS BRAND_ENM
-		     , G2.GOODS_CD AS ITEM_CD
-		     , G2.GOODS_NM AS ITEM_NM
-		     , ODI.OPT_CD1
-		     , ODI.OPT_CD2
-		     , ODI.ITEM_QTY
-		     , ODI.ITEM_PRICE
-		     , ODI.ITEM_QTY * OD.ORD_QTY      AS ORD_QTY
-		     , ODI.ITEM_QTY * OD.CNCL_RTN_QTY AS CNCL_RTN_QTY
- 		     , CASE WHEN OCD.ORD_REQ_CHG_QTY IS NULL
-			        THEN 0
-			        ELSE OCD.ORD_REQ_CHG_QTY * ODI.ITEM_QTY
-			        END  ORD_REQ_CHG_QTY
-		     , ODI.OPT_ADD_PRICE
-		     , ODI.CPN1_DC_AMT
-		     , ODI.GOODS_CPN_DC_AMT
-		     , ODI.CART_CPN_DC_AMT
-		     , ODI.TMTB1_DC_AMT
-		     , ODI.TMTB2_DC_AMT
-		     , ODI.PNT_DC_AMT
-		     , ODI.PRE_PNT_DC_AMT
-		     , ODI.SAVE_PNT_AMT
-		     , ODI.GFCD_USE_AMT
-			 , ODI.ORD_AMT
-		     , ODI.REAL_ORD_AMT
-		     , ODI.CNCL_RTN_AMT
-		     , OD.ORD_DTL_STAT
-		     , FN_GET_CODE_NM('G013', OD.ORD_DTL_STAT) AS ORD_DTL_STAT_NM 
-		     , OD.SOLDOUT_YN
-		     , OD.SOLDOUT_REG_NO
-		     , OD.SOLDOUT_MEMO
-		     , OD.INVOICE_NO
-		     , OD.DELV_LOC_CD 
-		     , X.G20
-		     , X.G30
-		     , X.G40
-		     , X.G50
-		     , X.G55
-		     , X.G60
-		     , OD.DELV_ADDR_SQ
-		FROM   TB_ORDER O
-		INNER  JOIN TB_ORDER_DETAIL OD
-		ON     O.ORD_NO = OD.ORD_NO
-		INNER  JOIN TB_GOODS G1
-		ON     OD.GOODS_CD = G1.GOODS_CD
-		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 G2
-		ON     ODI.ITEM_CD = G2.GOODS_CD
-		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 (
-			SELECT MAX(Z.G013_20) AS G20
-			     , MAX(Z.G013_30) AS G30
-			     , MAX(Z.G013_40) AS G40
-			     , MAX(Z.G013_50) AS G50
-			     , MAX(Z.G013_55) AS G55
-			     , MAX(Z.G013_60) AS G60
-			     , Z.ORD_NO
-			     , Z.ORD_DTL_NO
-			FROM (
-				SELECT CASE WHEN ODH.ORD_DTL_STAT = 'G013_20' THEN 'G013_20' END G013_20
-				     , CASE WHEN ODH.ORD_DTL_STAT = 'G013_30' THEN 'G013_30' END G013_30
-				     , CASE WHEN ODH.ORD_DTL_STAT = 'G013_40' THEN 'G013_40' END G013_40
-				     , CASE WHEN ODH.ORD_DTL_STAT = 'G013_50' THEN 'G013_50' END G013_50
-				     , CASE WHEN ODH.ORD_DTL_STAT = 'G013_55' THEN 'G013_55' END G013_55
-				     , CASE WHEN ODH.ORD_DTL_STAT = 'G013_60' THEN 'G013_60' END G013_60
-				     , ODH.ORD_NO
-				     , ODH.ORD_DTL_NO
-				FROM   TB_ORDER_DETAIL_HST ODH
-				INNER  JOIN TB_COMMON_CODE CC
-				ON     ODH.ORD_DTL_STAT = CC.CD
-				WHERE  ODH.ORD_NO = #{ordNo}
-				GROUP  BY ODH.ORD_DTL_STAT
-			) Z
-		) X
-		ON     OD.ORD_DTL_NO = X.ORD_DTL_NO
-		LEFT   OUTER JOIN (
-			SELECT OD.ORD_DTL_NO
-			     , SUM(OCD.CHG_QTY) AS ORD_REQ_CHG_QTY
-			FROM   TB_ORDER_CHANGE_DETAIL OCD
-			INNER  JOIN TB_ORDER_DETAIL OD
-			ON     OCD.ORD_DTL_NO = OD.ORD_DTL_NO
-			WHERE  1=1
-			AND    OD.ORD_NO = #{ordNo}
-			AND    OCD.CHG_STAT IN (
-				'G685_20', 'G685_30', 'G685_40'
-			)
-			GROUP  BY OCD.ORD_DTL_NO
-		) OCD
-		ON     OD.ORD_DTL_NO = OCD.ORD_DTL_NO
-		WHERE  1=1
-		AND    OD.ORD_NO = #{ordNo}
-	</select>
-	
-	<!-- 주문상세 > 사은품목록 -->
-	<select id="getOrderFreeGiftList" parameterType="Order" resultType="Order">
-		/* order.getOrderFreeGiftList */
-		SELECT OFV.ORD_FREEGIFT_SQ
-		     , OFV.ORD_NO
-		     , OFV.FREEGIFT_SQ 
-		     , FG.FREEGIFT_NM 
-		     , OFV.FREEGIFT_VAL_SQ 
-		     , OFV.USE_POINT
-		     , OFV.ITEM_CD 
-		     , G.GOODS_NM AS ITEM_NM
-		     , OFV.ITEM_QTY 
-		     , OFV.OPT_CD 
-		     , OFV.OPT_CD1 
-		     , OFV.OPT_CD2 
-		     , OFV.DEL_YN
-		FROM   TB_ORD_FREEGIFT_VAL OFV
-		INNER  JOIN TB_FREEGIFT FG
-		ON     OFV.FREEGIFT_SQ = FG.FREEGIFT_SQ
-		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'
-		ORDER  BY OFV.REG_DT DESC
-	</select>
-	
-	<!-- 주문상세 > 배송정보 -->
-	<select id="getDeliveryAddrList" parameterType="Order" resultType="Order">
-		/* order.getDeliveryAddrList */
-		SELECT Z.DELV_ADDR_SQ
-		     , SUM(Z.DELV_ADDR_EDIT_YN) AS DELV_ADDR_EDIT_YN
-		     , Z.EXCH_GB_NM
-		     , Z.RECIP_NM
-		     , Z.RECIP_PHNNO
-		     , Z.RECIP_TELNO
-		     , Z.RECIP_ZIPCODE
-		     , Z.RECIP_BASE_ADDR
-		     , Z.RECIP_DTL_ADDR
-		     , Z.ORD_EMAIL
-		     , Z.DELV_MEMO
-		FROM   (
-			SELECT OD.DELV_ADDR_SQ
-			     , CASE WHEN ORD_DTL_STAT IN ('G013_10', 'G013_20', 'G013_30', 'G013_40')
-			            THEN 0
-			            ELSE 1
-			            END DELV_ADDR_EDIT_YN
-			     , OD.ORD_EXCH_GB
-			     , CASE WHEN OD.ORD_EXCH_GB = 'O'
-			            THEN '주문'
-			            ELSE '교환'
-			            END   EXCH_GB_NM 
-			     , DA.RECIP_NM 
-			     , DA.RECIP_PHNNO 
-			     , DA.RECIP_TELNO 
-			     , DA.RECIP_ZIPCODE 
-			     , DA.RECIP_BASE_ADDR
-			     , DA.RECIP_DTL_ADDR
-			     , O.ORD_EMAIL
-			     , DA.DELV_MEMO
-			FROM   TB_ORDER_DETAIL OD
-			INNER  JOIN TB_ORDER O
-			ON     OD.ORD_NO = O.ORD_NO
-			INNER  JOIN TB_DELIVERY_ADDR DA
-			ON     OD.DELV_ADDR_SQ  = DA.DELV_ADDR_SQ
-			WHERE  1=1
-			AND    OD.ORD_NO = #{ordNo}
-		) Z
-		ORDER  BY Z.DELV_ADDR_SQ
-	</select>
-	
-	<!-- 주문상세 > 결제정보 -->
-	<select id="getOrderPaymentBasicInfoList" parameterType="Order" resultType="Order">
-		/* order.getOrderPaymentBasicInfoList */
-		SELECT P.ESCROW_YN
-		     , P.PAY_MEANS
-		     , FN_GET_CODE_NM('G014', P.PAY_MEANS) AS PAY_MEANS_NM
-		     , P.CARD_NM 
-		     , P.VA_BANK
-		     , CASE WHEN P.PAY_MEANS = 'G014_20' || P.PAY_MEANS = 'G014_10'
-		            THEN FN_GET_CODE_NM('G940', P.VA_BANK)
-		            ELSE P.CARD_NM
-		            END  CARD_NM
-		     , P.PG_TRADE_NO
-		     , DATE_FORMAT(P.PAY_DT,'%Y%m%d%H%i%S') AS PAY_DT  
-		     , P.PAY_STAT 
-		     , FN_GET_CODE_NM('G016', P.PAY_STAT) AS PAY_STAT_NM
-		     , P.PAY_AMT 
-		     , DATE_FORMAT(P.VA_DEADLINE,'%Y%m%d%H%i%S') AS VA_DEADLINE 
-		FROM   TB_PAYMENT P
-		WHERE  1=1
-		AND    P.ORD_NO = #{ordNo}
-		AND    P.PAY_STAT = 'G016_30'
-		ORDER  BY P.REG_DT DESC
-	</select>
-	
-	<!-- 주문상세 > 배송비정보 -->
-	<select id="getDeliveryFeeList" parameterType="Order" resultType="Order">
-		/* 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}
-		) Z
-		GROUP  BY Z.DELV_FEE_GB 
-		     , Z.DELV_FEE_GB_NM
-		     , Z.DELV_FEE
-		     , Z.DELV_USAC_YN 
-		     , Z.DELV_USAC_DT 
-		     , Z.SUPPLY_COMP_CD 
-		     , 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_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)
-		            WHEN OC.CHG_GB = 'G680_30' THEN FN_GET_CODE_NM('G688', OC.CHG_REASON)
-		            WHEN OC.CHG_GB = 'G680_40' THEN FN_GET_CODE_NM('G689', OC.CHG_REASON)
-		            ELSE '결제전취소'
-		            END  CHG_REASON_NM
-		     , OC.CHG_MEMO
-		     , OC.CHGER_NM
-		     , OC.CHGER_PHNNO 
-		     , OC.CHGER_ZIPCODE
-		     , OC.CHGER_BASE_ADDR
-		     , OC.CHGER_DTL_ADDR
-		     , OC.WD_INVOICE_SEND_YN
-		     , OC.WD_INVOICE_NO
-		FROM   TB_ORDER_CHANGE_DETAIL OCD
-		INNER  JOIN TB_ORDER_CHANGE OC
-		ON     OC.ORD_CHG_SQ = OCD.ORD_CHG_SQ 
-		INNER  JOIN TB_ORDER_DETAIL OD
-		ON     OCD.ORD_DTL_NO = OD.ORD_DTL_NO 
-		INNER  JOIN (
-			SELECT X.ORD_DTL_ITEM_SQ
-			     , X.ORD_DTL_NO
-			     , X.ITEM_CD
-			     , X.OPT_CD
-			     , X.OPT_CD1
-			     , X.OPT_CD2
-			FROM   TB_ORDER_DETAIL_ITEM X
-			WHERE  X.ORD_NO = #{ordNo}
-			LIMIT  1
-		) ODI 
-		WHERE  1=1
-		AND    OD.ORD_NO = #{ordNo}
-		<if test='ordChgSq != null and ordChgSq != ""'>
-		AND    OCD.ORD_CHG_SQ = #{ordChgSq}	
-		</if>
-		AND    OCD.DEL_YN = 'N'
-		ORDER  BY OC.ORD_CHG_SQ
-		     , OCD.ORD_DTL_NO 
-	</select>
-	
-	<!-- 주문상세 > 환불정보 -->
-	<select id="getOrderRefundInfo" parameterType="Order" resultType="Order">
-		/* order.getOrderRefundInfo */
-		SELECT P.PAY_MEANS
-		     , FN_GET_CODE_NM('G014', P.PAY_MEANS) AS PAY_MEANS_NM
-		     , P.CARD_NM
-		     , 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 
-		     , 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 
-		WHERE  1=1
-		AND    R.ORD_NO = #{ordNo}
-		ORDER  BY R.REG_DT DESC
-	</select>
-	
-	<!-- 주문상세 > 상담내역 -->
-	<select id="getOrderCounselInfo" parameterType="Order" resultType="Order">
-		/* order.getOrderCounselInfo */
-		SELECT CS.COUNSEL_CLSF
-			 , FN_GET_CODE_NM('G059', CS.COUNSEL_CLSF) AS COUNSEL_CLSF_NM
-		     , CS.REL_GOODS_CD
-		     , CS.QUEST_TITLE
-		     , DATE_FORMAT(CS.QUEST_DT,'%Y%m%d%H%i%S') AS QUEST_DT
-		     , DATE_FORMAT(CS.ANS_DT,'%Y%m%d%H%i%S') AS ANS_DT
-		     , CS.ANS_NO
-		     , (SELECT USER_NM
-		        FROM   TB_USER X
-		        WHERE  X.USER_NO = CS.ANS_NO) AS ANS_NM
-		     , CS.DEL_YN
-		FROM   TB_COUNSEL CS
-		WHERE  1=1
-		AND    CS.REL_ORD_NO = #{ordNo}
-		ORDER  BY CS.REG_DT DESC
-	</select>
-	
-	<!-- 주문상세 > 관리자메모 -->
-	<select id="getOrderMemoList" parameterType="Order" resultType="Order">
-		/* order.getOrderTsainMemoList */
-		SELECT ORDER_MEMO_SQ 
-		     , OM.ORD_NO
-		     , OM.MEMO
-		     , OM.REG_NO
-		     , OM.REG_DT
-		     , OM.UPD_NO
-		     , OM.UPD_DT
-		     , (SELECT USER_NM
-		        FROM   TB_USER X
-		        WHERE  X.USER_NO = OM.REG_NO) AS REG_NM
-		FROM  TB_ORDER_MEMO OM
-		WHERE 1=1
-		AND   OM.ORD_NO = #{ordNo}
-		AND   OM.DEL_YN = #{delYn}
-		ORDER BY OM.REG_DT DESC
-	</select>
-	
-	<!-- 주문/배송 > 입점업체미발주목록 -->
-	<select id="getOrderSellerUnorderList" parameterType="Order" resultType="Order">
-		/* order.getOrderSellerUnorderList */
-		SELECT OD.SUPPLY_COMP_CD
-		     , (SELECT SC.SUPPLY_COMP_NM
-		        FROM   TB_SUPPLY_COMPANY SC
-		        WHERE  SC.SUPPLY_COMP_CD = OD.SUPPLY_COMP_CD) AS SUPPLY_COMP_NM
-		     , G1.BRAND_CD 
-		     , (SELECT B.BRAND_KNM 
-		        FROM   TB_BRAND B
-		        WHERE  B.BRAND_CD = G1.BRAND_CD) AS BRAND_KNM
-		     , G1.GOODS_TYPE 
-		     , FN_GET_CODE_NM('G056', G1.GOODS_TYPE) AS GOODS_TYPE_NM
-		     , G1.GOODS_CD
-		     , G1.GOODS_NM
-		     , OD.ORD_NO
-		     , OD.ORD_DTL_NO
-		     , OD.ORD_DTL_STAT 
-		     , FN_GET_CODE_NM('G013', OD.ORD_DTL_STAT) AS ORD_DTL_STAT_NM
-		     , O.ORD_NM 
-		     , DATE_FORMAT(O.ORD_DT,'%Y%m%d%H%i%S') AS ORD_DT
-		     , P.PAY_MEANS 
-		     , FN_GET_CODE_NM('G014', P.PAY_MEANS) AS PAY_MEANS_NM
-		     , O.ORD_PHNNO 
-		     , DA.RECIP_NM 
-		     , DA.RECIP_PHNNO 
-		     , DA.RECIP_ZIPCODE 
-		     , DA.RECIP_BASE_ADDR 
-		     , DA.RECIP_DTL_ADDR 
-		     , G2.SUPPLY_GOODS_CD
-		     , G2.GOODS_CD AS ITEM_CD
-		     , G2.GOODS_NM AS ITEM_NM
-		     , ODI.OPT_CD1
-		     , ODI.OPT_CD2
-		     , ODI.ORD_AMT
-		     , ODI.CPN1_DC_AMT + ODI.TMTB1_DC_AMT + ODI.TMTB2_DC_AMT +  ODI.GOODS_CPN_DC_AMT + ODI.CART_CPN_DC_AMT + ODI.PNT_DC_AMT + ODI.PRE_PNT_DC_AMT AS TOT_DC_AMT
-		     , ODI.REAL_ORD_AMT 
-		     , OD.INVOICE_NO 
-		     , OD.SHIP_COMP_CD
-		FROM   TB_ORDER O
-		INNER  JOIN TB_ORDER_DETAIL OD
-		ON     O.ORD_NO = OD.ORD_NO
-		INNER  JOIN TB_GOODS G1
-		ON     OD.GOODS_CD = G1.GOODS_CD
-		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 G2
-		ON     ODI.ITEM_CD = G2.GOODS_CD
-		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 
-		INNER  JOIN TB_DELIVERY_FEE DF		
-		ON     DF.SUPPLY_COMP_CD = OD.SUPPLY_COMP_CD
-		AND    DF.DELV_FEE_CD = OD.DELV_FEE_CD 
-		AND    DF.ORD_NO = OD.ORD_NO
-		WHERE  1=1
-		<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="ordDtlStat != null and ordDtlStat != ''">
-        AND    OD.ORD_DTL_STAT = #{ordDtlStat}
-        </if>
-        <if test="ordNo != null and ordNo != ''">
-		AND    O.ORD_NO = #{ordNo}
-		</if>
-		<if test="ordNm != null and ordNm != ''">
-		AND    O.ORD_NM = #{ordNm}
-		</if>
-		<if test='goodsCd != null and goodsCd != ""'>
-		AND    G.GOODS_CD = #{goodsCd}
-		</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>
-	</select>
-	
-	<!-- 주문/배송 > 입점업체 엑셀다운용 임시테이블 삭제-->
-	<delete id="deleteEntryExcelDownTmp" parameterType="Order">
-		/* TsbOrder.deleteEntryExcelDownTmp */
-		DELETE FROM TB_ENTRY_UPLOAD_EXCEL
-		WHERE  1=1
-	</delete>
-	
-	<!-- 주문/배송 > 입점업체 주문상세정보 변경 (입점) -->
-	<update id="updateOrderDetailStat" parameterType="Order">
-		/* Order.updateOrderDetailStat */
-		UPDATE TB_ORDER_DETAIL
-		SET    ORD_DTL_STAT = 'G013_30'
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = CURRENT_TIMESTAMP()
-		WHERE  ORD_DTL_NO = #{ordDtlNo}
-		AND    ORD_DTL_STAT in ('G013_20')
-		AND    SUPPLY_COMP_CD = #{supplyCompCd}
-	</update>
-	
-	<!-- 주문/배송 > 주문상세이력 생성-->
-	<insert id="createOrderDetailHst" parameterType="Order">
-		/* Order.createOrderDetailHst */
-		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 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
-				, #{regNo} AS REG_ID
-				, CURRENT_TIMESTAMP() AS REG_DT
-				, #{regNo} AS REG_ID
-				, CURRENT_TIMESTAMP() AS UPD_DT
-		FROM   TB_ORDER_DETAIL
-		WHERE  ORD_DTL_NO = #{ordDtlNo}
-	</insert>
-	
-	<!-- 주문/배송 > 입점업체 엑셀다운 임시파일 체크-->
-	<select id="getEntryUploadExcelCheck" parameterType="Order" resultType="int">
-		SELECT COUNT(1)
-		FROM   TB_ENTRY_UPLOAD_EXCEL X
-		WHERE  1=1
-		AND    X.ORD_NO = #{ordNo}
-		AND    X.ORD_DTL_NO = #{ordDtlNo}
-	</select>
-	
-	<!-- 주문/배송 > 입점업체 엑셀다운용 임시테이블 생성-->
-	<insert id="createEntryExcelDownTmp" parameterType="Order">
-		INSERT INTO TB_ENTRY_UPLOAD_EXCEL (
-			ORD_NO
-			, ORD_DTL_NO
-			, REG_NO
-			, REG_DT
-		) VALUES (
-			#{ordNo}
-			, #{ordDtlNo}
-			, #{regNo}
-			, CURRENT_TIMESTAMP()
-		)
-	</insert>
-	
-	<!-- 주문/배송 > 입점업체미발주목록 > 엑셀다운로드 -->
-	<select id="getSellerUnorderList" parameterType="Order" resultType="Order">
-		/* Order.getSellerUnorderList */
-		SELECT (SELECT SC.SUPPLY_COMP_NM
-		        FROM   TB_SUPPLY_COMPANY SC
-		        WHERE  SC.SUPPLY_COMP_CD = OD.SUPPLY_COMP_CD) AS SUPPLY_COMP_NM
-		     , (SELECT B.BRAND_KNM 
-		        FROM   TB_BRAND B
-		        WHERE  B.BRAND_CD = G1.BRAND_CD) AS BRAND_KNM
-	         , G1.GOODS_CD 
-		     , G1.GOODS_NM
-			 , G1.GOODS_TYPE
-		     , FN_GET_CODE_NM('G056', G1.GOODS_TYPE) AS GOODS_TYPE_NM
-		     , OD.ORD_NO
-		     , OD.ORD_DTL_NO
-		     , FN_GET_CODE_NM('G013', OD.ORD_DTL_STAT) AS ORD_DTL_STAT_NM
-		     , O.ORD_NM 
-		     , DATE_FORMAT(O.ORD_DT,'%Y%m%d%H%i%S') AS ORD_DT
-		     , FN_GET_CODE_NM('G014', P.PAY_MEANS) AS PAY_MEANS_NM
-		     , O.ORD_PHNNO 
-		     , DA.RECIP_NM 
-		     , DA.RECIP_PHNNO 
-		     , DA.RECIP_ZIPCODE 
-		     , DA.RECIP_BASE_ADDR 
-		     , DA.RECIP_DTL_ADDR 
-		     , G2.SUPPLY_GOODS_CD
-		     , G2.GOODS_CD AS ITEM_CD
-		     , G2.GOODS_NM AS ITEM_NM 
-		     , ODI.OPT_CD1
-		     , ODI.OPT_CD2
-		     , ODI.ORD_AMT
-		     , ODI.CPN1_DC_AMT + ODI.TMTB1_DC_AMT + ODI.TMTB2_DC_AMT +  ODI.GOODS_CPN_DC_AMT + ODI.CART_CPN_DC_AMT + ODI.PNT_DC_AMT + ODI.PRE_PNT_DC_AMT AS TOT_DC_AMT
-		     , ODI.REAL_ORD_AMT 
-		     , OD.INVOICE_NO 
-		FROM   TB_ORDER O
-		INNER  JOIN TB_ORDER_DETAIL OD
-		ON     O.ORD_NO = OD.ORD_NO
-		INNER  JOIN TB_GOODS G1
-		ON     OD.GOODS_CD = G1.GOODS_CD
-		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 G2
-		ON     ODI.ITEM_CD = G2.GOODS_CD
-		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' 
-		INNER  JOIN TB_DELIVERY_ADDR DA
-		ON     OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
-		INNER  JOIN TB_DELIVERY_FEE DF		
-		ON     DF.SUPPLY_COMP_CD = OD.SUPPLY_COMP_CD
-		AND    DF.DELV_FEE_CD = OD.DELV_FEE_CD 
-		AND    DF.ORD_NO = OD.ORD_NO
-		INNER  JOIN TB_ENTRY_UPLOAD_EXCEL X
-		ON     OD.ORD_NO = X.ORD_NO
-		AND    OD.ORD_DTL_NO = X.ORD_DTL_NO
-		WHERE  1=1
-		<if test='supplyCompCd != null and supplyCompCd != ""'>
-		AND    OD.SUPPLY_COMP_CD = #{supplyCompCd}
-		</if>
-	</select>
-	
-	<!-- 주문/배송 > 입점업체미발주목록 > 주문상세 목록 -->
-	<select id="getOrderDetailInfo" parameterType="Order" resultType="Order">
-		/* TsaOrder.getOrderDetailInfo */
-		SELECT O.ORD_NO
-		     , O.MALL_GB
-		     , DATE_FORMAT(O.ORD_DT,'%Y%m%d%H%i%S') AS ORD_DT
-		     , DATE_FORMAT(O.PAY_DT,'%Y%m%d%H%i%S') AS PAY_DT
-		     , O.CUST_NO
-		     , O.ORD_NM
-		     , O.ORD_PHNNO
-		     , O.ORD_TELNO
-		     , O.ORD_EMAIL
-		     , OD.ORD_DTL_STAT
-		     , O.SITE_CD
-		     , O.FRONT_GB
-		     , OD.ORD_DTL_NO
-		     , OD.ORD_EXCH_GB
-		     , OD.ORG_ORD_DTL_NO
-		     , OD.VENDOR_ID
-		     , OD.SUPPLY_COMP_CD
-		     , OD.GOODS_CD
-		     , OD.FORMAL_GB
-		     , OD.GOODS_TYPE
-		     , OD.LIST_PRICE
-		     , OD.CURR_PRICE
-		     , OD.DC_RATE
-		     , OD.ORD_QTY
-		     , OD.ORD_AMT
-		     , OD.CNCL_RTN_QTY
-		     , OD.CNCL_RTN_AMT
-		     , OD.GOODS_CPN_DC_AMT
-		     , OD.CART_CPN_DC_AMT
-		     , OD.PNT_DC_AMT
-		     , OD.PRE_PNT_DC_AMT
-		     , OD.SAVE_PNT_AMT
-		     , OD.REAL_ORD_AMT
-		     , OD.AGENT_ORDER_ID
-		     , OD.EXTMALL_ORDER_ID
-		     , OD.ORD_DTL_STAT
-		     , FN_GET_CODE_NM('G013', OD.ORD_DTL_STAT)    AS ORD_DTL_STAT_NM
-		     , OD.SOLDOUT_YN
-		     , OD.SOLDOUT_MEMO
-		     , OD.SOLDOUT_REG_NO
-		     , OD.SOLDOUT_REG_DT
-		     , OD.SHIP_COMP_CD
-		     , OD.INVOICE_NO
-		     , OD.DELV_STDT
-		     , OD.DELV_EDDT
-		     , OD.SELL_STORE_CD
-		     , OD.SELL_FEE_RATE
-		     , OD.DELV_ADDR_SQ
-		     , OD.REG_NO
-		     , OD.REG_DT
-		     , OD.UPD_NO
-		     , OD.UPD_DT
-		     , (SELECT SELF_GOODS_YN FROM TB_GOODS WHERE GOODS_CD = OD.GOODS_CD) AS SELF_YN
-		     , ODI.ITEM_CD
-		     , ODI.OPT_CD1
-		     , ODI.OPT_CD2 
-		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
-		WHERE  O.ORD_NO = OD.ORD_NO
-		AND    OD.ORD_DTL_NO = #{ordDtlNo}
-		AND    ODI.ITEM_CD = #{itemCd}
-		AND    ODI.OPT_CD2 = #{optCd2}
-		AND    OD.ORD_DTL_NO = ODI.ORD_DTL_NO
-	</select>
-	
-	<!-- 주문/배송 > 주문상세정보 변경 - 송장번호 적용(입점)  -->
-	<update id="updateOrderDetailInvoice" parameterType="Order">
-		/* TsaOrder.updateOrderDetailInvoice */
-		UPDATE TB_ORDER_DETAIL
-		SET    ORD_DTL_STAT = 'G013_55'
-		     , INVOICE_NO = REPLACE(#{invoiceNo},'-','')
-		     , INVOICE_SEND_YN = 'Y'
-		     , SHIP_COMP_CD = #{shipCompCd}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = CURRENT_TIMESTAMP()
-		WHERE  ORD_DTL_NO = #{ordDtlNo}
-		AND    ORD_DTL_STAT IN ('G013_30', 'G013_55')
-		AND    SUPPLY_COMP_CD = #{supplyCompCd}
-	</update>
-	
-	<!-- 주문상세 > 주문메오 > 주문메모정보조회 -->
-	<select id="getOrderMemoInfo" parameterType="Order" resultType="Order">
-		/* order.getOrderMemoInfo */
-		SELECT ORDER_MEMO_SQ
-		     , OM.ORD_NO
-		     , OM.MEMO
-		     , OM.REG_NO
-		     , OM.REG_DT
-		     , OM.UPD_NO
-		     , OM.UPD_DT
-		     , (SELECT USER_NM
-		        FROM   TB_USER X
-		        WHERE  X.USER_NO = OM.UPD_NO) AS USER_NM
-		FROM  TB_ORDER_MEMO OM
-		WHERE 1=1
-		AND   OM.ORD_NO = #{ordNo}
-		AND   OM.DEL_YN = 'N'
-	</select>
-	
-	<!-- 주문상세 > 주문요청 관리자 메모 > 메모등록 -->
-	<insert id="createOrderMemo" parameterType="Order">
-		/* order.createOrderMemo */
-		INSERT INTO TB_ORDER_MEMO (
-			ORD_NO
-			,MEMO
-			,ORG_FILE_NM
-			,SYS_FILE_NM
-			,DEL_YN
-			,REG_NO
-			,REG_DT
-			,UPD_NO
-			,UPD_DT
-		) VALUES (
-			#{ordNo}
-			,#{memo}
-			,#{orgFileNm}
-			,#{sysFileNm}
-			,'N'
-			,#{regNo}
-			,CURRENT_TIMESTAMP()
-			,#{updNo}
-			,CURRENT_TIMESTAMP()
-		)
-	</insert>
-	
-	<!-- 주문상세 > 주문요청 관리자 메모 > 메모수정 -->
-	<update id="updateOrderMemo" parameterType="Order">
-		/* order.updateOrderMemo */
-		UPDATE TB_ORDER_MEMO
-		SET    MEMO = #{memo}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = CURRENT_TIMESTAMP() 
-		WHERE  1=1
-		AND    ORD_NO = #{ordNo}
-		AND    ORDER_MEMO_SQ = #{seq}
-	</update>
-	
-	<!-- 주문상세 > 주문요청 관리자 메모 > 메모수정 -->
-	<update id="deleteOrderMemo" parameterType="Order">
-		/* order.deleteOrderMemo */
-		UPDATE TB_ORDER_MEMO
-		SET    DEL_YN = 'Y'
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = CURRENT_TIMESTAMP() 
-		WHERE  1=1
-		AND    ORD_NO = #{ordNo}
-		AND    ORDER_MEMO_SQ = #{seq}
-	</update>
-	
-	<!-- 주문상세 > 주문상품 상세 변경 이력 -->
-	<select id="getOrderDetailHistoryList" parameterType="Order" resultType="Order">
-		/* order.getOrderDetailHistoryList */
-		SELECT DATE_FORMAT(ODH.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
-		     , (SELECT Z.USER_ID
-		        FROM   TB_USER Z
-		        WHERE  Z.USER_NO = ODH.UPD_NO) 				AS UPD_ID
-		     , FN_GET_CODE_NM('G013', ODH.ORD_DTL_STAT)    	AS ORD_DTL_STAT_NM 
-		     , ODH.ORD_QTY
-		     , ODH.CNCL_RTN_QTY 
-		     , ODH.DELV_LOC_CD 
-		     , ODH.INVOICE_NO 
-		     , ODH.SHIP_COMP_CD
-		     , (SELECT SHIP_COMP_NM
-		        FROM   TB_SHIP_COMPANY Z
-		        WHERE  Z.SHIP_COMP_CD = ODH.SHIP_COMP_CD) 	AS SHIP_COMP_NM
-		FROM   TB_ORDER_DETAIL_HST ODH 
-		WHERE  1=1
-		AND    ODH.ORD_DTL_NO = #{ordDtlNo}
-		ORDER  BY ODH.REG_DT DESC
-	</select>
-	
-	<!-- 주문상세 > 쿠폰사용내역 팝업 화면 -->
-	<select id="getOrderDiscountCouponList" parameterType="Order" resultType="Order">
-		/* order.getOrderDiscountCouponList */
-		WITH COUPON_DATA AS (
-			SELECT OD.ORD_NO
-			     , OD.ORD_DTL_NO
-			     , OD.GOODS_CD
-			     , OD.ORD_AMT
-			     , OD.SUPPLY_COMP_CD
-			     , OD.DELV_FEE_CD
-			     , DF.DELV_FEE 
-			     , OD.GOODS_CPN_SQ 
-			     , OD.GOODS_CPN_DC_AMT 
-			     , OD.CART_CPN_SQ
-			     , OD.CART_CPN_DC_AMT
-			     , DF.DELV_CPN_SQ
-			     , DF.DELV_CPN_DC_AMT
-			FROM   TB_ORDER_DETAIL OD
-			INNER  JOIN TB_DELIVERY_FEE DF
-			ON     OD.SUPPLY_COMP_CD = DF.SUPPLY_COMP_CD
-			AND    OD.DELV_FEE_CD = DF.DELV_FEE_CD
-			AND    OD.ORD_NO = DF.ORD_NO
-			WHERE  1=1
-			AND    OD.ORD_NO = #{ordNo}
-		) 
-		SELECT X.*
-		     , CP.CPN_ID
-		     , CP.CPN_NM 
-		     , CP.DC_WAY 
-		     , CP.DC_PVAL 
-		     , CP.DC_MVAL 
-		     , CP.DC_AVAL
-		FROM   (
-			SELECT Z.*
-			FROM   (
-				SELECT 1                       AS DISP_ORD
-				     , CD.GOODS_CPN_SQ         AS CPN_SQ
-				     , CD.GOODS_CPN_DC_AMT     AS CPN_DC_AMT
-				     , '상품쿠폰'                 AS CPN_TYPE
-				     , CD.GOODS_CD             AS TARGET_CD1
-				     , CD.ORD_DTL_NO           AS TARGET_CD2
-				     , CD.ORD_NO
-				     , CD.ORD_AMT
-				FROM   COUPON_DATA CD
-				UNION  ALL
-				SELECT 2                       AS DISP_ORD 
-				     , CD.CART_CPN_SQ          AS CPN_SQ
-				     , CD.CART_CPN_DC_AMT      AS CPN_DC_AMT
-				     , '장바구니쿠폰'              AS CPN_TYPE
-				     , CD.GOODS_CD             AS TARGET_CD1
-				     , CD.ORD_DTL_NO           AS TARGET_CD2
-				     , CD.ORD_NO
-				     , CD.ORD_AMT
-				FROM   COUPON_DATA CD
-				UNION  ALL
-				SELECT 3                       AS DISP_ORD 
-				     , CD.DELV_CPN_SQ 	       AS CPN_SQ
-				     , CD.DELV_CPN_DC_AMT      AS CPN_DC_AMT
-				     , '배송비쿠폰'               AS CPN_TYPE
-				     , CD.SUPPLY_COMP_CD       AS TARGET_CD1
-				     , CD.DELV_FEE_CD          AS TARGET_CD2
-				     , CD.ORD_NO
-				     , CD.DELV_FEE             AS ORD_AMT
-				FROM   COUPON_DATA CD
-				GROUP  BY CD.DELV_CPN_SQ
-				     , CD.DELV_CPN_DC_AMT
-				     , CD.SUPPLY_COMP_CD
-				     , CD.DELV_FEE_CD
-				     , CD.ORD_NO
-			) Z
-			WHERE  1=1
-			AND    Z.CPN_SQ IS NOT NULL
-		) X
-		INNER  JOIN TB_CUST_COUPON CC
-		ON     X.CPN_SQ = CC.CUST_CPN_SQ
-		LEFT   OUTER JOIN TB_COUPON CP
-		ON     CC.CPN_ID = CP.CPN_ID
-		ORDER  BY DISP_ORD
-	</select>
-	
-	<!-- 주문상세 > 포인트사용내역 -->
-	<select id="getOrderDiscountPointList" parameterType="Order" resultType="Order">
-		/* order.getOrderDiscountPointList */
-		SELECT OD.ORD_NO
-		     , OD.ORD_DTL_NO
-		     , OD.GOODS_CD
-		     , G.PNT_PRATE 
-		     , G.PNT_MRATE 
-		     , OD.CURR_PRICE
-		     , OD.REAL_ORD_AMT 
-		     , CPH.PNT_AMT
-		     , CPH.OCCUR_GB 
-		     , CPH.OCCUR_DTL_DESC 
-		     , DATE_FORMAT(CPH.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
-		FROM   TB_ORDER_DETAIL OD
-		INNER  JOIN TB_CUST_POINT_HST CPH
-		ON     OD.ORD_DTL_NO = CPH.ORD_DTL_NO
-		AND    OD.ORD_NO = CPH.ORD_NO
-		INNER  JOIN TB_GOODS G
-		ON     OD.GOODS_CD = G.GOODS_CD
-		WHERE  1=1
-		AND    OD.ORD_NO = #{ordNo}
-		ORDER  BY CPH.REG_DT DESC
-	</select>
-	
-	<!-- 주문상세 > 상품권사용내역 -->
-	<select id="getOrderGiftcardHstList" parameterType="Order" resultType="Order">
-		/* order.getOrderGiftcardHstList */
-		SELECT CG.CUST_GFCD_SQ 
-		     , CG.CHG_GFCD_AMT 
-		     , CG.GFCD_NM 
-		     , CG.GFCD_NO 
-		     , CG.CHG_GFCD_AMT 
-		     , CG.US_GFCD_AMT 
-		     , CG.RM_GFCD_AMT 
-		     , OD.ORD_NO
-		     , OD.ORD_DTL_NO
-		     , OD.GOODS_CD 
-		     , CGH.GFCD_AMT
-		     , CGH.OCCUR_GB 
-		     , CGH.OCCUR_DTL_DESC 
-		     , DATE_FORMAT(CGH.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
-		     , CG.CUST_GFCD_SQ 
-		FROM   TB_ORDER_DETAIL OD
-		INNER  JOIN TB_CUST_GIFTCARD_HST CGH
-		ON     OD.ORD_DTL_NO = CGH.ORD_DTL_NO
-		AND    OD.ORD_NO = CGH.ORD_NO
-		INNER  JOIN TB_CUST_GIFTCARD CG
-		ON     CGH.CUST_GFCD_SQ  = CG.CUST_GFCD_SQ 
-		INNER  JOIN TB_GOODS G
-		ON     OD.GOODS_CD = G.GOODS_CD
-		WHERE  1=1
-		AND    OD.ORD_NO = #{ordNo}
-		ORDER  BY CUST_GFCD_SQ
-		     , OD.ORD_NO
-		     , OD.ORD_DTL_NO
-	</select>
-
-	<!-- 주문상세 > 다다익선적용내역 -->
-	<select id="getOrderTmtbHstList" parameterType="Order" resultType="Order">
-		/* order.getOrderTmtbHstList */
-		WITH TMTB_DATA AS (
-			SELECT TM1.TMTB_SQ			AS  TMTB1_SQ
-			     , TM1.TMTB_NM			AS  TMTB1_NM
-			     , OD.TMTB1_DC_AMT
-			     , OD.ORD_NO
-			     , OD.ORD_DTL_NO
-			     , OD.REG_NO
-			     , OD.REG_DT
-			     , OD.GOODS_CD
-			     , TM2.TMTB_SQ			AS  TMTB2_SQ
-			     , TM2.TMTB_NM			AS  TMTB2_NM
-			     , OD.TMTB2_DC_AMT
-			FROM   TB_ORDER_DETAIL OD
-			INNER  JOIN TB_TMTB TM1
-			ON     OD.TMTB1_SQ = TM1.TMTB_SQ 
-			INNER  JOIN TB_TMTB TM2
-			ON     OD.TMTB2_SQ = TM2.TMTB_SQ 
-			WHERE  1=1
-			AND    OD.ORD_NO = 9
-		)
-		SELECT Z.*
-		FROM (
-			SELECT 1                    AS DISP_ORD
-			     , TD.TMTB1_SQ        	AS TMTB_SQ
-			     , TD.TMTB1_NM			AS TMTB_NM
-			     , TD.TMTB1_DC_AMT      AS TMTB_DC_AMT
-			     , TD.ORD_NO
-			     , TD.ORD_DTL_NO
-			     , TD.GOODS_CD
-			     , TD.REG_NO
-			     , DATE_FORMAT(TD.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
-			FROM   TMTB_DATA TD
-			UNION  ALL
-			SELECT 2                    AS DISP_ORD
-			     , TD.TMTB2_SQ        	AS TMTB_SQ
-			     , TD.TMTB2_NM			AS TMTB_NM
-			     , TD.TMTB2_DC_AMT      AS TMTB_DC_AMT
-			     , TD.ORD_NO
-			     , TD.ORD_DTL_NO
-			     , TD.GOODS_CD
-			     , TD.REG_NO
-			     , DATE_FORMAT(TD.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
-			FROM   TMTB_DATA TD
-		) Z
-		WHERE  1=1
-		AND    Z.TMTB_SQ IS NOT NULL
-		ORDER  BY Z.DISP_ORD
-	</select>
-	
-	<!-- 주문상세 > 주문상세상태변경 -->
-	<update id="changedOrdDtlStat" parameterType="Order">
-		/* order.changedOrdDtlStat */
-		UPDATE TB_ORDER_DETAIL 
-		SET    ORD_DTL_STAT = #{ordDtlStat}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = CURRENT_TIMESTAMP() 
-		WHERE  1=1
-		AND    ORD_NO = #{ordNo}
-		AND    ORD_DTL_NO = #{ordDtlNo}
-	</update>
-	
-	<!-- 배송 > 배송지 정보 수정 -->
-	<update id="updateOrderAddr" parameterType="Order">
-		/* order.updateOrderAddr : 주문 변경 업데이트(주문자 주소) */
-		UPDATE TB_DELIVERY_ADDR
-		SET    RECIP_NM        	= #{recipNm}
-		     , RECIP_PHNNO     	= #{recipPhnno}
-		     , RECIP_TELNO     	= #{recipTelno}
-		     , RECIP_ZIPCODE    = #{recipZipcode}
-		     , RECIP_BASE_ADDR 	= #{recipBaseAddr}
-		     , RECIP_DTL_ADDR  	= #{recipDtlAddr}
-		     , DELV_MEMO       	= #{delvMemo}
-		     , UPD_NO          	= #{updNo}
-		     , UPD_DT          	= NOW()
-		WHERE  DELV_ADDR_SQ 	= #{delvAddrSq}
-	</update>
-
-	<!-- 반품/교환 > 회수지 정보 수정 -->
-	<update id="updateOrderChange" parameterType="Order">
-		/* order.updateOrderChange : 반품/교환 > 회수지 정보 수정 */
-		UPDATE TB_ORDER_CHANGE
-		SET    CHGER_ZIPCODE    = #{chgerZipCode}
-		     , CHGER_BASE_ADDR 	= #{chgerBaseAddr}
-		     , CHGER_DTL_ADDR  	= #{chgerDtlAddr}
-		     , UPD_NO          	= #{updNo}
-		     , UPD_DT          	= NOW()
-		WHERE  ORD_CHG_SQ 		= #{ordChgSq}
-	</update>
-
-
-
-
-
-
-
-
-
-</mapper>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

+ 0 - 812
src/main/java/com/style24/persistence/mybatis/shop/TsaOrderChange.xml

@@ -1,812 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.style24.admin.biz.dao.TsaOrderChangeDao">
-
-	<!-- 주문상세 > 주문취소신청 > 주문취소,반품,교환 대상목록 -->
-	<select id="getCancelRequestTargetList" parameterType="Order" resultType="Order">
-		/* order.getCancelRequestTargetList */
-		SELECT OD.ORD_NO
-		     , OD.ORD_DTL_NO
-		     , OD.ORD_DTL_STAT
-		     , FN_GET_CODE_NM('G013', OD.ORD_DTL_STAT) AS ORD_DTL_STAT_NM
-		     , CASE WHEN OD.ORD_DTL_STAT IN ('G013_20', 'G013_30', 'G013_40')
-		            THEN 'Y'
-		            ELSE 'N'
-		             END ALL_CAN_YN
-		     , G1.GOODS_CD
-		     , G1.GOODS_NM
-		     , G1.GOODS_TYPE
-		     , FN_GET_CODE_NM('G056', G1.GOODS_TYPE) AS GOODS_TYPE_NM
-		     , ODI.ORD_DTL_ITEM_SQ
-		     , G2.GOODS_CD AS ITEM_CD
-		     , G2.GOODS_NM AS ITEM_NM
-		     , ODI.OPT_CD
-		     , ODI.OPT_CD1
-		     , ODI.OPT_CD2
-		     , ODI.ITEM_QTY
-		     , OD.ORD_QTY
-             , OD.CNCL_RTN_QTY 
-		     , CASE WHEN OCD.ORD_REQ_CHG_QTY IS NULL
-		            THEN 0
-		            ELSE OCD.ORD_REQ_CHG_QTY * ODI.ITEM_QTY
-		            END  ORD_REQ_CHG_QTY
-		     , ODI.ITEM_PRICE
-		     , ODI.OPT_ADD_PRICE
-		     , ODI.ORD_AMT
-		     , ODI.CNCL_RTN_AMT
-		     , ODI.CPN1_DC_AMT 
-		     , ODI.TMTB1_DC_AMT 
-		     , ODI.TMTB2_DC_AMT 
-		     , ODI.GOODS_CPN_DC_AMT 
-		     , ODI.CART_CPN_DC_AMT
-		     , ODI.PNT_DC_AMT 
-		     , ODI.PRE_PNT_DC_AMT 
-		     , ODI.GFCD_USE_AMT
-		     , ODI.REAL_ORD_AMT
-		     , DF.DELV_FEE
-		     , DF.SUPPLY_COMP_CD
-		     , DF.DELV_FEE_CD 
-		     , DFP.MIN_ORD_AMT 
-		     , DFP.DELV_FEE AS ORG_DELV_FEE
-		     , DFP.RTN_DELV_FEE
-		     , DFP.DELV_FEE + DFP.RTN_DELV_FEE AS EXC_DELV_FEE
-		     , 0			AS ORD_CAN_CHG_QTY
-		     , VS.OPT_CD2S
-		     , VS.CURR_STOCK_QTYS
-		     , DL.RTN_LOC_NM
-		     , DL.RTN_LOC_ZIPCODE
-		     , DL.RTN_LOC_BASE_ADDR
-		     , DL.RTN_LOC_DTL_ADDR
-		     , DL.RTN_LOC_TELNO
-		     , DL.SELF_YN
-		FROM   TB_ORDER_DETAIL OD
-		INNER  JOIN TB_GOODS G1
-		ON     OD.GOODS_CD = G1.GOODS_CD
-		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 G2
-		ON     ODI.ITEM_CD = G2.GOODS_CD
-		LEFT   OUTER JOIN (
-			SELECT OD.ORD_DTL_NO
-			     , SUM(OCD.CHG_QTY) AS ORD_REQ_CHG_QTY
-			FROM   TB_ORDER_CHANGE_DETAIL OCD
-			INNER  JOIN TB_ORDER_DETAIL OD
-			ON     OCD.ORD_DTL_NO = OD.ORD_DTL_NO
-			WHERE  1=1
-			AND    OD.ORD_NO = #{ordNo}
-			AND    OCD.CHG_STAT IN (
-				'G685_20', 'G685_30', 'G685_40'
-			)
-			GROUP  BY OCD.ORD_DTL_NO
-		) OCD
-		ON     OD.ORD_DTL_NO = OCD.ORD_DTL_NO
-		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
-		ON     DF.SUPPLY_COMP_CD  = DFP.SUPPLY_COMP_CD 
-		AND    DF.DELV_FEE_CD = DFP.DELV_FEE_CD 
-		AND    DFP.USE_YN = 'Y'
-		INNER  JOIN (
-			SELECT TDL.DELV_LOC_CD
-			     , TDL.RTN_LOC_NM
-			     , TDL.RTN_LOC_TELNO
-			     , TDL.RTN_LOC_ZIPCODE
-			     , TDL.RTN_LOC_BASE_ADDR
-			     , TDL.RTN_LOC_DTL_ADDR
-			     , CASE WHEN TSC.DISTRIBUTION_GB IN ('G065_10', 'G065_11', 'G065_12')
-						THEN 'Y'
-						ELSE 'N'
-				   END AS SELF_YN
-			  FROM TB_DELIVERY_LOC TDL
-			 INNER JOIN TB_SUPPLY_COMPANY TSC
-			    ON TDL.SUPPLY_COMP_CD = TSC.SUPPLY_COMP_CD
-		) DL
-		ON     OD.DELV_LOC_CD = DL.DELV_LOC_CD
-		INNER  JOIN (
-			SELECT GOODS_CD
-			     , OPT_CD1
-			     , GROUP_CONCAT(OPT_CD2 ORDER BY DISP_ORD DESC, OPT_CD2 SEPARATOR ',')        AS OPT_CD2S
-			     , GROUP_CONCAT(CURR_STOCK_QTY ORDER BY DISP_ORD DESC, OPT_CD2 SEPARATOR ',') AS CURR_STOCK_QTYS
-			  FROM VW_STOCK
-			 WHERE GOODS_CD IN (SELECT ITEM_CD FROM TB_ORDER_DETAIL_ITEM WHERE ORD_NO = #{ordNo})
-			   AND (CURR_STOCK_QTY - BASE_STOCK_QTY) > 0
-			 GROUP BY GOODS_CD, OPT_CD1
-		) VS
-		ON     ODI.ITEM_CD = VS.GOODS_CD
-		AND    ODI.OPT_CD1 = VS.OPT_CD1
-		WHERE  1=1
-		<if test="ordDtlStatArr != null and ordDtlStatArr != ''">
-        AND    OD.ORD_DTL_STAT IN
-			<foreach collection="ordDtlStatArr" item="item" index="index"  open="(" close=")" separator=",">
-        		#{item}
-            </foreach>
-        </if> 
-		AND    OD.ORD_NO = #{ordNo}
-		GROUP  BY OD.ORD_NO
-		     , OD.ORD_DTL_NO
-		     , ODI.ORD_DTL_ITEM_SQ
-	    ORDER  BY OD.ORD_NO
-	         , OD.ORD_DTL_NO
-	</select>
-		
-	<!-- 주문상세 > 주문취소신청 > 주문변경정보 등록-->
-	<insert id="createOrderChange" parameterType="OrderChange" keyProperty="ordChgSq">
-		/* Order.createOrderChange */
-		INSERT INTO TB_ORDER_CHANGE (
-			CHG_GB
-			, CHG_REASON
-			, CHG_MEMO
-			, CHGER_NM
-			, CHGER_PHNNO
-			, CHGER_TELNO
-			, CHGER_EMAIL
-			, CHGER_ZIPCODE
-			, CHGER_BASE_ADDR
-			, CHGER_DTL_ADDR
-			, CHGER_RTN_MEMO
-			, ADD_PAY_COST
-			, ADD_PAY_AMT
-			, REG_NO
-			, REG_DT
-			, UPD_NO
-			, UPD_DT
-		) values (
-			#{chgGb}
-			 , #{chgReason}
-			 , #{chgMemo}
-			 , #{chgerNm}
-			 , #{chgerPhnno}
-			 , #{chgerTelno}
-			 , #{chgerEmail}
-			 , #{chgerZipNo}
-			 , #{chgerBaseAddr}
-			 , #{chgerDtlAddr}
-			 , #{chgerRtnMemo}
-			 , #{addPayCost}
-			 , #{addPayAmt}
-			 , #{regNo}
-			 , NOW()
-			 , #{updNo}
-			 , NOW()
-		)
-	</insert>
-
-	<!-- 주문상세 > 주문취소신청 > 주문상세단품정보 수정 -->
-	<update id="updateOrderDetailItem" parameterType="Order">
-		/* Order.updateOrderDetailItem */
-		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.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 			= NOW()
-		WHERE  1=1
-		AND    ODI.ORD_NO 			= #{ordNo} 
-		AND    ODI.ORD_DTL_NO 		= #{ordDtlNo} 
-		AND    ODI.ORD_DTL_ITEM_SQ 	= #{ordDtlItemSq}
-	</update>
-	
-	<!-- 주문상세 > 주문취소신청 > 주문상세단품정보 이력 등록 -->
-	<insert id="createOrderDetailItemHst" parameterType="Order">
-		/* Order.createOrderDetailItemHst */
-		INSERT INTO TB_ORDER_DETAIL_ITEM_HST (
-			ORD_DTL_ITEM_SQ
-			, ORD_DTL_NO
-			, ORD_NO
-			, ORD_DTL_STAT
-			, ITEM_CD
-			, OPT_CD
-			, OPT_CD1
-			, OPT_CD2
-			, SKU_MODEL_NO
-			, PRODUCT_NO
-			, PRODUCT_CODE
-			, ITEM_QTY
-			, ITEM_PRICE
-			, OPT_ADD_PRICE
-			, DISP_ORD
-			, ORD_AMT
-			, CNCL_RTN_AMT
-			, CPN1_DC_AMT
-			, TMTB1_DC_AMT
-			, TMTB2_DC_AMT
-			, GOODS_CPN_DC_AMT
-			, CART_CPN_DC_AMT
-			, PNT_DC_AMT
-			, PRE_PNT_DC_AMT
-			, SAVE_PNT_AMT
-			, REAL_ORD_AMT
-			, GFCD_USE_AMT
-			, REG_NO
-			, REG_DT
-			, UPD_NO
-			, UPD_DT
-		) 
-		SELECT ORD_DTL_ITEM_SQ
-			 , ORD_DTL_NO
-			 , ORD_NO
-			 , #{ordDtlStat}
-			 , ITEM_CD
-			 , OPT_CD
-			 , OPT_CD1
-			 , OPT_CD2
-			 , SKU_MODEL_NO
-			 , PRODUCT_NO
-			 , PRODUCT_CODE
-			 , ITEM_QTY
-			 , ITEM_PRICE
-			 , OPT_ADD_PRICE
-			 , DISP_ORD
-			 , ORD_AMT
-			 , #{cnclRtnAmt}
-			 , #{cpn1DcAmt}
-			 , #{tmtb1DcAmt}
-			 , #{tmtb2DcAmt}
-			 , #{goodsCpnDcAmt}
-			 , #{cartCpnDcAmt}
-			 , #{pntDcAmt}
-			 , #{prePntDcAmt}
-			 , #{savePntAmt}
-			 , #{realOrdAmt}
-			 , #{gfcdUseAmt}
-			 , REG_NO
-			 , REG_DT
-			 , UPD_NO
-			 , UPD_DT
-		FROM   TB_ORDER_DETAIL_ITEM
-		WHERE  1=1
-		AND    ORD_NO = #{ordNo} 
-		AND    ORD_DTL_NO = #{ordDtlNo} 
-		AND    ORD_DTL_ITEM_SQ = #{ordDtlItemSq}
-	</insert>
-	
-	<!-- 주문상세 > 주문취소신청 > 주문상세단품정보 수정 (재고수정) -->
-	<update id="updateOptionQty" parameterType="OrderChange">
-		/* Order.updateOptionQty */
-		UPDATE TB_OPTION OP
-		INNER  JOIN TB_ORDER_DETAIL_ITEM ODI
-		ON     OP.GOODS_CD = ODI.ITEM_CD
-		AND    OP.OPT_CD1 = ODI.OPT_CD1
-		AND    OP.OPT_CD2 = ODI.OPT_CD2
-		SET    OP.CURR_STOCK_QTY = OP.CURR_STOCK_QTY + (ODI.ITEM_QTY * #{ordCanChgQty})
-		     , OP.UPD_NO = #{updNo}
-		     , OP.UPD_DT = NOW()
-		WHERE  1=1
-		AND    ODI.ORD_NO 			= #{ordNo} 
-		AND    ODI.ORD_DTL_NO 		= #{ordDtlNo} 
-		AND    ODI.ORD_DTL_ITEM_SQ 	= #{ordDtlItemSq}
-	</update>
-	
-	<!-- 주문상세 > 주문취소 > 주문상세정보(취소,반품) 이력 등록-->
-	<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
-			 , Z.ORD_AMT
-			 , #{ordCanChgQty}
-			 , OD.ORD_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 OD
-		INNER  JOIN (
-		SELECT ODI.ORD_DTL_NO
-		     , 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.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    OD.ORD_NO = #{ordNo}
-		AND    OD.ORD_DTL_NO = #{ordDtlNo}
-	</update>
-	
-	<!-- 주문상세 > 주문취소신청 > 주문변경정보상세 등록-->
-	<insert id="createOrderChangeDetail" parameterType="OrderChange">
-		/* Order.createOrderChangeDetail */
-		INSERT INTO TB_ORDER_CHANGE_DETAIL (
-			ORD_CHG_SQ
-			, ORD_DTL_NO
-			, CHG_QTY
-			, CHG_STAT
-			, COMPLETE_DT
-			, REG_NO
-			, REG_DT
-			, UPD_NO
-			, UPD_DT
-		) VALUES (
-			#{ordChgSq}
-			, #{ordDtlNo}
-			, #{chgQty}
-			, #{chgStat}
-			, NOW()
-			, #{regNo}
-			, NOW()
-			, #{updNo}
-			, NOW()
-		)
-	</insert>
-	
-	<!-- 주문상세 > 주문취소신청 > 주문환불금액정보 등록 -->
-	<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
-		 	 , NOW()
-			 , 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}
-			 , NOW()
-			 , #{updNo}
-			 , NOW()
-		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}
-			, NOW()
-		)
-	</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}
-			, NOW()
-			, #{updNo}
-			, NOW()
-		)
-	</insert>
-	
-	<!-- 주문상세 > 주문취소신청 > 주문사은품취소 -->
-	<update id="updateOrdFreegiftDel" parameterType="Order">
-		/* Order.updateOrdFreegiftDel */
-		UPDATE TB_ORD_FREEGIFT_VAL
-		SET    DEL_YN= 'N'
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-		WHERE  FREEGIFT_VAL_SQ IN (
-			SELECT OFRV.FREEGIFT_VAL_SQ 
-			FROM   TB_ORD_FREEGIFT OFR
-			INNER  JOIN TB_ORD_FREEGIFT_VAL OFRV
-			ON     OFR.ORD_FREEGIFT_SQ  = OFRV.ORD_FREEGIFT_SQ 
-			WHERE  1=1
-			AND    OFR.ORD_NO = (SELECT CASE WHEN SUM(X.ORD_QTY) > SUM(X.CNCL_RTN_QTY)
-								             THEN 0
-								             ELSE X.ORD_NO
-								             END 
-								 FROM   TB_ORDER_DETAIL X
-								 WHERE  1=1
-								 AND    X.ORD_NO = #{ordNo})
-		)
-	</update>
-	
-	
-	
-	<!-- 주문상세 > 주문취소 > 고객환불계좌정보 조회 -->
-	<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}
-			, NOW()
-			, #{updNo}
-			, NOW()
-		)
-	</insert>
-	
-	
-</mapper>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

+ 489 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaPg.xml

@@ -2,7 +2,496 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.style24.admin.biz.dao.TsaPgDao">
 
+	<!-- 주문 샘플 데이터 (추후 삭제 예정) -->
+	<select id="getOrderSampleGoodsInfo" parameterType="Goods" resultType="Goods">
+		SELECT SYS_IMG_NM
+		     , GOODS_CD
+		     , GOODS_NM
+		     , STOCK_QTY_SUM
+		     , GOODS_STAT
+		     , STYLE_YEAR
+			 , SEASON_CD
+		     , LIST_PRICE
+		     , CURR_PRICE
+		     , PRICE_UPD_DT
+		     , ERP_STOCK_LINK_YN
+		     , FORMAL_GB
+		     , RETURNABLE_YN
+		     , REG_DT
+		     , REG_NM
+			 , UPD_DT
+		     , UPD_NM
+		     , REP_GOODS_CD
+			 , GROUP_CONCAT(OPT_CD2 ORDER BY DISP_ORD DESC, OPT_CD2 SEPARATOR ',')        AS SITE_CD
+		  FROM (
+			  SELECT GI.SYS_IMG_NM
+				   , G.GOODS_CD
+				   , G.GOODS_NM
+				   , (CASE WHEN G.GOODS_TYPE = 'G056_N' THEN (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK WHERE GOODS_CD = G.GOODS_CD)
+						   ELSE (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK_COMPOSE WHERE GOODS_CD = G.GOODS_CD)
+					  END) AS STOCK_QTY_SUM
+				   , G.GOODS_STAT
+				   , G.STYLE_YEAR
+				   , G.SEASON_CD
+				   , G.LIST_PRICE
+				   , G.CURR_PRICE
+				   , G.PRICE_UPD_DT
+				   , G.ERP_STOCK_LINK_YN
+				   , G.FORMAL_GB
+				   , G.RETURNABLE_YN
+				   , G.REG_DT
+				   , FN_GET_USER_NM(G.REG_NO) AS REG_NM
+				   , G.UPD_DT
+				   , FN_GET_USER_NM(G.UPD_NO) AS UPD_NM
+				   , IFNULL(GC.COMPS_GOODS_CD, G.GOODS_CD) AS REP_GOODS_CD
+				   , OP.OPT_CD2
+				   , OP.DISP_ORD
+				FROM TB_GOODS G
+				LEFT OUTER JOIN TB_GOODS_COMPOSE GC
+				  ON G.GOODS_CD = GC.GOODS_CD
+			   INNER JOIN TB_OPTION OP
+				  ON IFNULL(GC.COMPS_GOODS_CD, G.GOODS_CD) = OP.GOODS_CD
+				LEFT OUTER JOIN TB_GOODS_IMG GI
+				  ON G.GOODS_CD = GI.GOODS_CD
+			   INNER JOIN TB_BRAND B
+				  ON G.BRAND_CD = B.BRAND_CD
+			   WHERE G.GOODS_CD IN
+		<foreach collection="arrGoodsCd" item="item" index="index"  open="(" close=")" separator=",">
+			#{item}
+		</foreach>
+		  ) Z
+		 GROUP BY SYS_IMG_NM, GOODS_CD, GOODS_NM, STOCK_QTY_SUM, GOODS_STAT, STYLE_YEAR
+				, SEASON_CD, LIST_PRICE, CURR_PRICE, PRICE_UPD_DT, ERP_STOCK_LINK_YN, FORMAL_GB, RETURNABLE_YN, REG_DT, REG_NM
+				, UPD_DT, UPD_NM, REP_GOODS_CD
+	</select>
 	
+	<select id="getOrderSampleGoodsStock" parameterType="Goods" resultType="Goods">
+		SELECT GOODS_CD
+		     , OPT_CD2 AS SITE_CD
+		     , MAX(CURR_STOCK_QTY - BASE_STOCK_QTY) AS MIN_ORD_QTY
+		  FROM VW_STOCK
+		 WHERE GOODS_CD = #{goodsCd}
+		   AND OPT_CD2 = #{siteCd}
+		 GROUP BY GOODS_CD, OPT_CD2
+	</select>
+	
+	<insert id="createOrderSample" parameterType="OrderSample" keyProperty="ordNo">
+		INSERT INTO TB_ORDER
+			( MALL_GB
+			, ORD_DT
+			, PAY_DT
+			, CUST_NO
+			, ORD_NM
+			, ORD_PHNNO
+			, ORD_TELNO
+			, ORD_EMAIL
+			, SITE_CD
+			, NPAY_ORD_NO
+			, FRONT_GB
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+			)
+		VALUES
+			( 'G011_10'			-- MALL_GB
+			, NOW()				-- ORD_DT
+			, NOW()				-- PAY_DT
+			, #{custNo}			-- CUST_NO
+			, #{ordNm}			-- ORD_NM
+			, #{ordPhnno}		-- ORD_PHNNO
+			, NULL				-- ORD_TELNO
+			, #{ordEmail}		-- ORD_EMAIL
+			, 'G000_10'			-- SITE_CD
+			, 0					-- NPAY_ORD_NO
+			, 'P'				-- FRONT_GB
+			, #{custNo}			-- REG_NO
+			, NOW()				-- REG_DT
+			, #{custNo}			-- UPD_NO
+			, NOW()				-- UPD_DT
+			)
+	</insert>
+	
+	<insert id="createDelveryAddrSample" parameterType="OrderSample" keyProperty="delvAddrSq">
+		INSERT INTO TB_DELIVERY_ADDR
+			( RECIP_NM
+			, RECIP_PHNNO
+			, RECIP_TELNO
+			, RECIP_ZIPCODE
+			, RECIP_BASE_ADDR
+			, RECIP_DTL_ADDR
+			, DELV_MEMO
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+			)
+		VALUES
+			( #{ordNm}				-- RECIP_NM
+			, #{ordPhnno}			-- RECIP_PHNNO
+			, NULL					-- RECIP_TELNO
+			, #{recipZipcode}		-- RECIP_ZIP_NO
+			, #{recipBaseAddr}		-- RECIP_BASE_ADDR
+			, #{recipDtlAddr}		-- RECIP_DTL_ADDR
+			, '배송메모'				-- DELV_MEMO
+			, #{custNo}				-- REG_NO
+			, NOW()					-- REG_DT
+			, #{custNo}				-- UPD_NO
+			, NOW()					-- UPD_DT
+			)
+	</insert>
+	
+	<insert id="createDeliveryFeeSample" parameterType="OrderSample" keyProperty="delvFeeSq">
+		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
+			)
+		SELECT 0               -- PAY_SQ
+			 , #{ordNo}        -- ORD_NO
+			 , #{delvFeeGb}    -- DELV_FEE_GB
+			 , G.DELV_FEE_CD   -- DELV_FEE_CD
+			 , 0               -- DELV_FEE
+			 , NULL            -- DELV_CPN_SQ
+			 , 0               -- DELV_CPN_DC_AMT
+			 , 0               -- REAL_DELV_AMT
+			 , NULL            -- ORD_CHG_SQ
+			 , G.SUPPLY_COMP_CD -- SUPPLY_COMP_CD
+			 , 'N'             -- DELV_USAC_YN
+			 , NULL            -- DELV_USER_DT
+			 , #{custNo}       -- REG_NO
+			 , NOW()           -- REG_DT
+			 , #{custNo}       -- UPD_NO
+			 , NOW()           -- UPO_DT
+		  FROM TB_GOODS G
+		 INNER JOIN TB_DELV_FEE_POLICY DFP
+		    ON G.DELV_FEE_CD = DFP.DELV_FEE_CD
+		 WHERE G.GOODS_CD = #{goodsCd}
+		   AND NOT EXISTS(SELECT 1
+							FROM TB_DELIVERY_FEE
+						   WHERE ORD_NO <![CDATA[<>]]> #{ordNo}
+							 AND DELV_FEE_GB <![CDATA[<>]]> #{delvFeeGb}
+							 AND DELV_FEE_CD <![CDATA[<>]]> G.DELV_FEE_CD)
+	</insert>
+	
+	<insert id="createOrderDetailSample" parameterType="OrderSample" keyProperty="ordDtlNo">
+		INSERT INTO TB_ORDER_DETAIL
+			( 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 #{ordNo} -- ORD_NO
+			, 'O' -- ORD_EXCH_GB
+			, #{ordDtlStat} -- ORD_DTL_STAT
+			, NULL -- ORG_ORD_DTL_NO
+			, G.SUPPLY_COMP_CD -- SUPPLY_COMP_CD
+			, G.GOODS_CD -- GOODS_CD
+			, G.PRODUCT_NO -- PRODUCT_NO
+			, G.PRODUCT_CODE -- PRODUCT_CODE
+			, G.FORMAL_GB -- FORMAL_GB
+			, G.GOODS_TYPE -- GOODS_TYPE
+			, G.LIST_PRICE -- LIST_PRICE
+			, G.CURR_PRICE -- CURR_PRICE
+			, G.DC_RATE -- DC_RATE
+			, 0 -- OPT_ADD_PRICE
+			, #{ordQty} -- ORD_QTY
+			, #{ordQty} * G.CURR_PRICE -- ORD_AMT
+			, 0 -- CNCL_RTN_QTY
+			, 0 -- CNCL_RTN_AMT
+			, 0 -- CPN1_CPN_SQ
+			, 0 -- CPN1_DC_AMT
+			, 0 -- TMTB1_SQ
+			, 0 -- TMTB1_DC_AMT
+			, 0 -- TMTB2_SQ
+			, 0 -- TMTB2_DC_AMT
+			, 0 -- GOODS_CPN_SQ
+			, 0 -- GOODS_CPN_DC_AMT
+			, 0 -- CART_CPN_SQ
+			, 0 -- CART_CPN_DC_AMT
+			, 0 -- BURDEN_RATE
+			, 0 -- PNT_DC_AMT
+			, 0 -- PRE_PNT_DC_AMT
+			, 0 -- SAVE_PNT_AMT
+			, #{ordQty} * G.CURR_PRICE -- REAL_ORD_AMT
+			, 0 -- GFCD_USE_AMT
+			, '' -- VENDOR_ID
+			, '' -- EXTMALL_ID
+			, '' -- AGENT_ORDER_ID
+			, '' -- EXTMALL_ORDER_ID
+			, 'Y' -- CHANGABLE_YN
+			, 'Y' -- CHANGE_FEE_FREE_YN
+			, 'Y' -- RETURNABLE_YN
+			, 'Y' -- RETURN_FEE_FREE_YN
+			, 'N' -- SOLDOUT_YN
+			, '' -- SOLDOUT_MEMO
+			, NULL -- SOLDOUT_REG_NO
+			, NOW() -- SOLDOUT_REG_DT
+			, #{delvAddrSq} -- DELV_ADDR_SQ
+			, G.DELV_FEE_CD -- DELV_FEE_CD
+			, 'N' -- SHOT_DELV_YN
+			, 'N' -- GIFT_PACK_YN
+			, 'N' -- MAKE_GOODS_YN
+			, '' -- ENTRY_NO
+			, '' -- DELV_LOC_CD
+			, NOW() -- DELV_ASSIGN_DT
+			, '' -- DELV_ASSIGN_STAT
+			, '' -- DSTRBT_NOTE
+			, NOW() -- DELV_STDT
+			, NOW() -- DELV_EDDT
+			, 'S0001' -- SHIP_COMP_CD
+			, '' -- INVOICE_NO
+			, '' -- INVOICE_SEND_YN
+			, '' -- SELL_STORE_CD
+			, 0 -- SELL_FEE_RATE
+			, '' -- AF_LINK_CD
+			, '' -- ITHR_CD
+			, '' -- CONTENTS_LOC
+			, NULL -- PLAN_DTL_SQ
+			, NULL -- SOCIAL_SQ
+			, #{custNo} -- REG_NO
+			, NOW() -- REG_DT
+			, #{custNo} -- UPD_NO
+			, NOW() -- UPD_DT
+			FROM TB_GOODS G
+		 WHERE G.GOODS_CD = #{goodsCd}
+		   AND NOT EXISTS (SELECT 1 FROM TB_ORDER_DETAIL WHERE ORD_NO = #{ordNo} AND GOODS_CD = #{goodsCd})
+	</insert>
+	
+	<insert id="createOrderDetailItemSample" parameterType="OrderSample" keyProperty="">
+		INSERT INTO TB_ORDER_DETAIL_ITEM
+			( ORD_DTL_NO
+			, ORD_NO
+			, ORD_DTL_STAT
+			, ITEM_CD
+			, OPT_CD
+			, OPT_CD1
+			, OPT_CD2
+			, SKU_MODEL_NO
+			, PRODUCT_NO
+			, PRODUCT_CODE
+			, ITEM_QTY
+			, ITEM_PRICE
+			, OPT_ADD_PRICE
+			, DISP_ORD
+			, ORD_AMT
+			, CNCL_RTN_AMT
+			, CPN1_DC_AMT
+			, TMTB1_DC_AMT
+			, TMTB2_DC_AMT
+			, GOODS_CPN_DC_AMT
+			, CART_CPN_DC_AMT
+			, PNT_DC_AMT
+			, PRE_PNT_DC_AMT
+			, SAVE_PNT_AMT
+			, REAL_ORD_AMT
+			, GFCD_USE_AMT
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+			)
+		SELECT OD.ORD_DTL_NO       -- ORD_DTL_NO
+			 , OD.ORD_NO           -- ORD_NO
+			 , OD.ORD_DTL_STAT     -- ORD_DTL_STAT
+			 , G.GOODS_CD         -- ITEM_CD
+			 , OP.OPT_CD          -- OPT_CD
+			 , OP.OPT_CD1         -- OPT_CD1
+			 , OP.OPT_CD2         -- OPT_CD2
+			 , OP.SKU_MODEL_NO    -- SKU_MODEL_NO
+			 , OP.PRODUCT_NO      -- PRODUCT_NO
+			 , OP.PRODUCT_CODE    -- PRODUCT_CODE
+			 , IFNULL(GC.QTY, 1)  -- ITEM_QTY
+			 , IFNULL(GC.COMPS_CURR_PRICE, G.CURR_PRICE)       -- ITEM_PRICE
+			 , 0                  -- OPT_ADD_PRICE
+			 , IFNULL(GC.DISP_ORD, 1)                  -- DISP_ORD
+			 , #{ordQty} * IFNULL(GC.COMPS_CURR_PRICE, G.CURR_PRICE)          -- ORD_AMT
+			 , 0     -- CNCL_RTN_AMT
+			 , 0      -- CPN1_DC_AMT
+			 , 0     -- TMTB1_DC_AMT
+			 , 0     -- TMTB2_DC_AMT
+			 , 0 -- GOODS_CPN_DC_AMT
+			 , 0  -- CART_CPN_DC_AMT
+			 , 0       -- PNT_DC_AMT
+			 , 0   -- PRE_PNT_DC_AMT
+			 , 0     -- SAVE_PNT_AMT
+			 , #{ordQty} * IFNULL(GC.COMPS_CURR_PRICE, G.CURR_PRICE)     -- REAL_ORD_AMT
+			 , 0     -- GFCD_USE_AMT
+			 , #{custNo}          -- REG_NO
+			 , NOW()              -- REG_DT
+			 , #{custNo}          -- UPD_NO
+			 , NOW()              -- UPD_DT
+		  FROM TB_ORDER_DETAIL OD
+		 INNER JOIN TB_GOODS                     G
+		    ON OD.GOODS_CD = G.GOODS_CD
+		  LEFT OUTER JOIN TB_GOODS_COMPOSE GC
+		    ON G.GOODS_CD = GC.GOODS_CD
+		   AND GC.COMPS_GOODS_CD = #{compsGoodsCd}
+		 INNER JOIN TB_OPTION                    OP
+		    ON IFNULL(GC.COMPS_GOODS_CD, G.GOODS_CD) = OP.GOODS_CD
+		   AND OP.OPT_CD2 = #{optCd}
+		 WHERE OD.ORD_DTL_NO = #{ordDtlNo}
+	</insert>
+	
+	<insert id="createPaymentSample" parameterType="OrderSample" keyProperty="paySq">
+		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 OD.ORD_NO   -- ORD_NO
+			 , NOW()      -- PAY_DT
+			 , 'G014_30'  -- PAY_MEANS
+			 , SUM(OD.REAL_ORD_AMT + DF.REAL_DELV_AMT)  -- PAY_AMT
+			 , 0          -- PG_CPN_AMT
+			 , 0          -- NPAY_CPN_AMT
+			 , 'O'        -- PAY_GB
+			 , 'G016_30'  -- PAY_STAT
+			 , 'KCP'      -- PG_GB
+			 , 'TID00001' -- PG_TID
+			 , '101010'   -- PG_TRADE_NO
+			 , 'STYLE24'  -- PG_SHOP_ID
+			 , 'Y'        -- CARD_TYPE
+			 , ''         -- CARD_KIND
+			 , ''         -- CARD_BANK
+			 , '신한카드'     -- CARD_NM
+			 , ''         -- CARD_MIPS
+			 , ''         -- CARD_PCABLE_YN
+			 , ''         -- VA_NO
+			 , ''         -- VA_NM
+			 , ''         -- VA_BANK
+			 , NOW()      -- VA_DEADLINE
+			 , ''         -- TELECOM
+			 , ''         -- ESCROW_YN
+			 , NULL       -- ORD_CHG_SQ
+			 , #{custNo}          -- REG_NO
+			 , NOW()      -- REG_DT
+			 , #{custNo}          -- UPD_NO
+			 , NOW()      -- UPD_DT
+		  FROM TB_ORDER_DETAIL OD
+		 INNER JOIN (SELECT ORD_NO
+						  , SUM(REAL_DELV_AMT) AS REAL_DELV_AMT
+					   FROM TB_DELIVERY_FEE
+					  WHERE ORD_NO = #{ordNo}
+					  GROUP BY ORD_NO) DF
+		    ON OD.ORD_NO = DF.ORD_NO
+		 WHERE OD.ORD_NO = #{ordNo}
+		 GROUP BY OD.ORD_NO
+	</insert>
+	
+	<update id="updateDeliveryFeeSample" parameterType="OrderSample">
+		UPDATE TB_DELIVERY_FEE
+		   SET PAY_SQ = #{paySq}
+		 WHERE ORD_NO = #{ordNo}
+	</update>
+	<!-- //주문 샘플 데이터 (추후 삭제 예정) -->
 	
 </mapper>
 

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

@@ -209,13 +209,6 @@
 		        <if test="ageGrpCd != null and ageGrpCd != ''">
 		        AND G.AGE_GRP_CD = #{ageGrpCd}
 		        </if>
-		        <if test="cateCd != null and cateCd != ''">
-		        AND G.GOODS_CD IN (
-		            SELECT GOODS_CD
-		            FROM   TB_CATEGORY_GOODS
-		            WHERE  CATE_CD = #{cateCd}
-		        )
-		        </if>
 	</sql>
 	
 	<!-- 목록 페이징 정보 -->
@@ -392,7 +385,7 @@
 		                          , ST.SOLDOUT_YN
 		                          , ST.CURR_STOCK_QTY
 		                          , ST.BASE_STOCK_QTY
-		                          , NVL(SQ.STOCK_QTY,0) AS SALE_STOCK_QTY
+		                          , IFNULL(SQ.STOCK_QTY,0) AS SALE_STOCK_QTY
 		                          , GREATEST(GREATEST(ST.CURR_STOCK_QTY - ST.BASE_STOCK_QTY, 0) - IFNULL(SQ.STOCK_QTY, 0), 0) AS ABLE_STOCK_QTY
 		                          , G.REG_DT
 		                    FROM TB_GOODS G

+ 2 - 3
src/main/webapp/WEB-INF/views/customer/CellphoneChangePopupForm.html

@@ -18,7 +18,7 @@
 	<div class="panelStyle">
 		<!-- TITLE -->
 		<div class="panelTitle">
-			<strong >휴대전화번호변경팝업</strong>
+			<strong >휴대전화 번호 변경팝업</strong>
 			<button type="button" class="close" onclick="uifnPopupClose('popupCellphoneForm')"><em class="fa fa-times"></em></button>
 		</div>
 		<!-- //TITLE -->
@@ -59,7 +59,7 @@
 			<ul class="panelBar">
 				<li class="right">
 					<button type="button" id="btnSendCustCrtfdNo" class="btn btn-success btn-lg" >인증번호발송</button>
-					<button type="button" id="btnCustCertNo" class="btn btn-success btn-lg" style="display: none">인증번호확인</button>
+					<button type="button" id="btnCustCertNo" class="btn btn-success btn-lg" style="display: none">확인(번호변경)</button>
 				</li>
 			</ul>
 		</div>
@@ -71,7 +71,6 @@
 	const elementCellPhnno = [[${elementCellPhnno}]];
 	const elementCustNo = [[${elementCustNo}]];
 
-
 	// 인증번호 전송
 	$('#btnSendCustCrtfdNo').on('click', function () {
 		//휴대폰번호

+ 23 - 32
src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html

@@ -96,14 +96,14 @@
 										<td class="dashR">
 											<select id="custGb" name="custGb">
 												<option th:if="${custGbList}" th:each="oneData, status : ${custGbList}" th:value="${oneData.cd}"
-														th:text="|${oneData.cdNm}|"></option>
+														th:text="${'[' + oneData.cd + '] '+oneData.cdNm}"></option>
 											</select>
 										</td>
 										<th class="dashR">회원등급<em class="required" title="필수"></em></th>
 										<td class="dashR">
 											<select id="custGrade" name="custGrade">
 												<option th:if="${custGradeList}" th:each="oneData, status : ${custGradeList}" th:value="${oneData.cd}"
-														th:text="|${oneData.cdNm}|"></option>
+														th:text="${'[' + oneData.cd + '] '+oneData.cdNm}"></option>
 											</select>
 										</td>
 									</tr>
@@ -113,7 +113,7 @@
 											<select id="managedRsn" name="managedRsn">
 												<option value="">일반</option>
 												<option th:if="${managedRsnList}" th:each="oneData, status : ${managedRsnList}" th:value="${oneData.cd}"
-														th:text="|${oneData.cdNm}|"></option>
+														th:text="${'[' + oneData.cd + '] '+oneData.cdNm}"></option>
 											</select>
 											<span class="infoTxt cRed h5" id="managedRsnDp" name="managedRsnDp"></span>
 										</td>
@@ -158,16 +158,7 @@
 									<tr>
 										<th class="dashR">휴대전화번호<em class="required" title="필수"></em></th>
 										<td class="dashR">
-											<input type="hidden" name="cellPhnno" data-valid-name="휴대전화"/>
-											<select id="firstNo" name="firstNo">
-												<option value="">선택</option>
-												<option th:if="${nationalHpNumberList}" th:each="oneData, status : ${nationalHpNumberList}"
-														th:value="${oneData.cd}" th:text="|${oneData.cd}|"></option>
-											</select> -
-											<input type="text" id="middleNo" name="middleNo" class="w50" maxlength="4" required="required"
-												   data-valid-type="numeric" data-valid-name="휴대전화번호"/> -
-											<input type="text" id="lastNo" name="lastNo" class="w50" maxlength="4" required="required"
-												   data-valid-type="numeric" data-valid-name="휴대전화번호"/>
+											<input type="text" name="cellPhnno" class="w130" readonly="readonly"/>
 											<button type="button" id="btnCustSendLms" class="btn btn-info btn-lg">LMS전송</button>
 											<button type="button" id="btnCustCrtfd" class="btn btn-info btn-lg">번호변경</button>
 										</td>
@@ -181,9 +172,9 @@
 										<th class="dashR">이메일<em class="required" title="필수"></em></th>
 										<td class="dashR">
 											<input type="hidden" name="email" data-valid-name="이메일"/>
-											<input type="text" id="emailId" name="emailId" class="w300"/>
+											<input type="text" id="emailId" name="emailId" class="w200" maxlength="30"/>
 											@
-											<input type="text" id="emailDomain" name="emailDomain" class="w150"/>
+											<input type="text" id="emailDomain" name="emailDomain" class="w150" maxlength="20"/>
 											<select id="emailDomainList" name="emailDomainList">
 												<option value="">선택하세요</option>
 												<option th:if="${emailDomainList}" th:each="oneData, status : ${emailDomainList}" th:value="${oneData.cd}"
@@ -644,7 +635,7 @@
 
 	//쿠폰내역 그리드
 	const columnCouponDefs = [
-		{width: 40, minWidth: 40, cellClass: 'text-center', pinned: 'left', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		// {width: 40, minWidth: 40, cellClass: 'text-center', pinned: 'left', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
 		{headerName: "회원쿠폰SQ", field: "custCpnSq", width: 100, cellClass: 'text-center', hide: true},
 		{headerName: "쿠폰ID", field: "cpnId", width: 100, cellClass: 'text-center'},
 		{headerName: "쿠폰명", field: "cpnNm", width: 300, cellClass: 'text-center'},
@@ -674,7 +665,8 @@
 			}
 		},
 		{headerName: "쿠폰발행 상세사유", field: "pubReasonDtl", width: 300, cellClass: 'text-center'},
-		{headerName: "등록자", field: "regNo", width: 100, cellClass: 'text-center'},
+		{headerName: "만료알림발송여부", field: "endAlimSendYn", width: 150, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
 		{
 			headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
 			cellRenderer: function (params) {
@@ -892,7 +884,16 @@
 	let gridAddrOptions = gagaAgGrid.getGridOptions(columnAddrDefs);		//주소정보 그리드
 	let gridContactOptions = gagaAgGrid.getGridOptions(columnContactDefs);	//회원접촉이력 그리드
 
-	gridCouponOptions.rowSelection = 'multiple';
+	gridOrderOptions.suppressRowClickSelection = true;
+	gridCounselOptions.suppressRowClickSelection = true;
+	gridGoodsQnaOptions.suppressRowClickSelection = true;
+	gridCouponOptions.suppressRowClickSelection = true;
+	gridPointOptions.suppressRowClickSelection = true;
+	gridGiftCardOptions.suppressRowClickSelection = true;
+	gridReviewOptions.suppressRowClickSelection = true;
+	gridGradeOptions.suppressRowClickSelection = true;
+	gridAddrOptions.suppressRowClickSelection = true;
+	gridContactOptions.suppressRowClickSelection = true;
 
 	// 기본정보 - 비밀번호 초기화 버튼
 	$('#btnResetPassword').on('click', function () {
@@ -1098,7 +1099,9 @@
 
 	// 쿠폰발급 버튼
 	$('#btnCustCouponCreate').on('click', function () {
-		cfnCpnPubForCustPopup();
+		let elementCustNo ='#custInfoForm input[name=custNo]';
+		const actionUrl = '/marketing/coupon/issue/popup/form?elementCustNo=' + encodeURIComponent(elementCustNo);
+		cfnOpenModalPopup(actionUrl, 'popupCouponIssue');
 	});
 
 
@@ -1332,13 +1335,6 @@
 	// 휴대전화 유효성 체크 및 데이터 셋팅
 	var fnCheckValidationPhnno = function (formId) {
 		let result = true;
-
-		let firstNo = $(formId + ' select[name=firstNo]').val();
-		let middleNo = $(formId + ' input[name=middleNo]').val();
-		let lastNo = $(formId + ' input[name=lastNo]').val();
-		let cellPhnno = firstNo + '-' + middleNo + '-' + lastNo;
-		$(formId + ' input[name=cellPhnno]').val(cellPhnno);
-
 		if (!gagajf.testRegexp($(formId + ' input[name=cellPhnno]'), /^(01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4})$/)) {
 			result = false;
 		}
@@ -1391,12 +1387,7 @@
 
 	// 휴대전화번호
 	var fnDisplayCellPhnno = function (cellPhnno) {
-		if (!gagajf.isNull(cellPhnno)) {
-			let cellPhSplit = cellPhnno.split("-");
-			$('#firstNo').val(cellPhSplit[0]);
-			$('#middleNo').val(cellPhSplit[1]);
-			$('#lastNo').val(cellPhSplit[2]);
-		}
+		$('#custInfoForm input[name=cellPhnno]').val(cellPhnno);
 	};
 
 	// 이메일

+ 1 - 1
src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html

@@ -1812,7 +1812,7 @@
 			return false;
 		}
 		
-		if (!checkRepYn){
+		if (!checkRepYn && $("#goodsDetailForm input[name=goodsType]").val() == "G056_D"){
 			mcxDialog.alert('구성상품중 대표여부를 선택해 주세요.');
 			return false;
 		}

+ 1 - 1
src/main/webapp/WEB-INF/views/goods/GoodsFreeGoodsForm.html

@@ -304,7 +304,7 @@
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
 			sureBtnClick: function() {
-				gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {debugger;
+				gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {
 					fnDetailFormInit();
 					$('#btnSearch').click();
 				});

+ 8 - 26
src/main/webapp/WEB-INF/views/goods/GoodsItemkindForm.html

@@ -45,9 +45,9 @@
 					<tr>
 						<th>카테고리</th>
 						<td colspan="5">
-							<input name="siteCd" id="siteCd" type="hidden" value="10"/>
+							<input name="siteCd" id="siteCd" type="hidden" value="G000_10"/>
 							<input name="selLvl" id="selLvl" type="hidden"/>
-							<input name="cateCd" id="cateCd" type="hidden"/>
+							<input name="cateNo" id="cateNo" type="hidden"/>
 							<input name="cateType" id="cateType" type="hidden"/>
 							<select name="cateGb" id="cateGb" onchange="fnChangeSelect($(this).val(), 1);">
 								<option value="">[카테고리구분]</option>
@@ -220,24 +220,9 @@
 	}
 
 	var fnChangeSelect = function(val, selLvl){
-		$("#cateCd").val('');
-		$('#tcateCd').val('');
-		$('#mcateCd').val('');
-		$('#scateCd').val('');
-		$('#dcateCd').val('');
-		if(val==''){
-			if(selLvl>1){
-				selLvl = selLvl - 1;
-				if(selLvl>2){
-					$("#cateCd").val($("#selCate"+(selLvl-1)).val());
-				}
-			}else{
-				selLvl = '';
-			}
-		}else{
-			if(selLvl>2){
-				$("#cateCd").val(val);
-			}
+		$("#cateNo").val('');
+		if (1 < selLvl){ //상품검색용 카테고리 설정
+			$("#cateNo").val(val);
 		}
 		$("#searchForm input[name=selLvl]").val(selLvl);
 		$("#searchForm input[name=searchGb]").val("BASIC");
@@ -256,14 +241,11 @@
 			var cd = '';
 			var nm = '';
 			if(data[i].useYn=='Y'){
-				if(selLvl=='1'){
-					cd = data[i].cateGb;
-					nm = gagaAgGrid.lookupValue(cateGbList, cd);
-				}else{
-					cd = data[i].cateCd;
+				
+					cd = data[i].cateNo;
 					nm = data[i].cateNm;
 					$("#cateType").val(data[i].cateType);
-				}
+				
 				html += '<option value="'+cd+'">['+cd+'] '+nm+'</option>';
 			}
 		}

+ 2 - 2
src/main/webapp/WEB-INF/views/goods/GoodsNotiInfoForm.html

@@ -42,9 +42,9 @@
 								<option th:if="${niClsfCdList}" th:each="oneData, status : ${niClsfCdList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
 						</td>
-						<th>상품코드</th>
+						<th>상품코드<em class="required" title="필수"></em></th>
 						<td>
-							<textarea class="textareaR3 w200" name="goodsCd" id="goodsCd"></textarea>
+							<textarea class="textareaR3 w200" name="goodsCd" id="goodsCd" required="required" data-valid-name="상품코드"></textarea>
 						</td>
 					</tr>
 				</table>

+ 21 - 3
src/main/webapp/WEB-INF/views/goods/GoodsSizeInfoForm.html

@@ -56,6 +56,7 @@
 		<!-- //리스트 영역 -->
 		<!-- 등록/수정 -->
 		<form id="sizeInfoForm" name="sizeInfoForm" action="#" th:action="@{'/goods/size/info/save'}">
+		<input type="hidden" name="sizeCate1Cd" />
 		<!-- 등록/수정 -->
 		<div class="panelStyle" >
 			<ul>
@@ -188,17 +189,23 @@
 				if (event.data.sizeCate1Cd == "00") {
 					$("#sizeInfoForm input:radio[name=selfYn]:input[value=N]").click();
 				}else{
-					
 					$("#sizeInfoForm input:radio[name=selfYn]:input[value=Y]").click();
-					$("#sizeInfoForm select[name=brandCd]").val(event.data.sizeCate1Cd);	
+					$("#sizeInfoForm select[name=brandCd]").val(event.data.sizeCate1Cd);
 				}
+				$('#sizeInfoForm input[name=selfYn]').prop('readonly', true);
+				$('#sizeInfoForm input[name=selfYn]').addClass("formControl");
+				$('#sizeInfoForm select[name=brandCd]').prop('disabled', true);
+				$('#sizeInfoForm select[name=brandCd]').addClass("formControl");
 			}
+			$("#sizeInfoForm input[name=sizeCate1Cd]").val(event.data.sizeCate1Cd);
 			$("#sizeInfoForm input[name=sizeCate2Nm]").val(event.data.sizeCate2Nm);
 			$("#sizeInfoForm input[name=sizeCate2Cd]").val(event.data.sizeCate2Cd);
 			$("#sizeInfoForm input[name=dispOrd]").val(event.data.dispOrd);
 			gagaSn.setContents('#sizeInfo', event.data.sizeInfo); 
 				
 			$('#sizeInfoForm input[name=sizeGb]').prop('readonly', true);
+			$('#sizeInfoForm input[name=sizeGb]').addClass("formControl");
+			
 		}
 	}
 
@@ -211,7 +218,14 @@
 	// 신규버튼 초기화
 	$('#btnNew').on('click', function() {
 		$("#sizeInfoForm")[0].reset();
+		$('#sizeInfoForm input[name=sizeCate1Cd]').val(''); 
+		$('#brandArea').removeClass('off').addClass('on');
 		$('#sizeInfoForm input[name=sizeGb]').prop('readonly', false);
+		$('#sizeInfoForm input[name=sizeGb]').removeClass("formControl");
+		$('#sizeInfoForm input[name=selfYn]').prop('readonly', false);
+		$('#sizeInfoForm input[name=selfYn]').removeClass("formControl");
+		$('#sizeInfoForm select[name=brandCd]').prop('disabled', false);
+		$('#sizeInfoForm select[name=brandCd]').removeClass("formControl");
 		$("#sizeInfoForm input:radio[name=sizeGb]:input[value=1]").click();
 		$("#sizeInfoForm input:radio[name=selfYn]:input[value=N]").click();
 		gagaSn.setContents('#sizeInfo', ''); 
@@ -243,7 +257,7 @@
 			return false;
 		
 		if (gagajf.isNull($('#sizeInfoForm input[name=sizeCate2Nm]').val())){
-			if ("1" == $('#sizeInfoForm input[name=sizeGb]').val() && "Y" == $('#sizeInfoForm input[name=selfYn]').val() ){
+			if ("1" == $('#sizeInfoForm input[name=sizeGb]').val() && "Y" == $('#sizeInfoForm input[name=selfYn]:checked').val() ){
 				
 			}else{
 				mcxDialog.alertC("사이즈카테명을 입력해주세요.", {
@@ -256,6 +270,10 @@
 			}	
 		}
 		
+		if (gagajf.isNull($('#sizeInfoForm textarea[name=sizeInfo]').val())){
+			mcxDialog.alert("html 내용을 입력하세요.");
+			return false;
+		}
 		
 		mcxDialog.confirm('저장하시겠습니까?', {
 			cancelBtnText: "취소",

+ 334 - 0
src/main/webapp/WEB-INF/views/marketing/CardInterestForm.html

@@ -0,0 +1,334 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CardInterestForm.html
+ * @desc    : 카드무이자할부관리
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.29   eskim       최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<form id="cardInterestSearchForm" name="cardInterestSearchForm" action="#" th:action="@{'/marketing/card/interest/list'}">
+		<input type="hidden" id="prmtGb" name="prmtGb" value="B" /> <!-- 무이자 -->
+ 		<!-- 패널 영역1 -->
+		<div class="panelStyle" >
+			<div class="panelTitle">
+				<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 하나를 꼭 입력해 주세요.</h3>
+			</div>
+			<div class="panelContent">
+				<table class="frmStyle">
+					<colgroup>
+						<col width="10%"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>구분</th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="search"  value="1"  checked/>프로모션ID</label>
+							<label class="rdoBtn"><input type="radio" name="search"  value="2"/>프로모션명</label>
+							<input type="text" class="w300" maxlength="30" name="condition"/>
+						</td>
+					</tr>
+					<tr>
+						<th>기간</th>
+						<td id="sellTerms"></td>
+					</tr>
+				</table>
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-gray btn-lg" id="btnInit" >초기화</button>
+						<button type="button" class="btn btn-info btn-lg" id="btnSearch" >조회</button>
+					</li>
+				</ul>	
+			</div>
+			<!-- //검색조건 영역 -->
+		</div>
+		<!-- 패널 영역1 -->
+		<div class="panelStyle">
+			<!-- 검색결과 영역 -->
+			<!-- 상단버튼 영역  -->
+			<ul class="panelBar">
+				<li>
+					<button type="button" class="btn btn-danger btn-lg" id="btnCardPromotionDispUpdate">선택비노출</button>
+					<button type="button" class="btn btn-danger btn-lg" id="btnCardPromotionDelete">선택삭제</button>
+				</li>
+				<li class="right">
+					<button type="button" class="btn btn-primary btn-lg" id="btnCardPromotionSave">등록</button>
+					검색결과 : <strong><span id="gridRowTotalCount">0</span> 건</strong>&nbsp;
+					
+					쪽번호 <span id="pgNo">0</span>/ <strong id="endPgNo">0</strong>&nbsp;&nbsp;
+					<select id="pageSize" name="pageSize">
+						<option value="50" selected="selected">50개씩 보기</option>
+						<option value="100">100개씩 보기</option>
+						<option value="500">500개씩 보기</option>
+						<option value="1000">1000개씩 보기</option>
+					</select>
+					<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
+				</li>
+			</ul>
+			<!-- //상단버튼 영역  -->
+			<div id="gridList" style="width: 100%; height: 550px;" class="ag-theme-balham"></div>
+			<ul class="panelBar">
+				<li class="center">
+					<div class="tablePaging" id="cardListPagination"></div>
+				</li>
+			</ul>
+			<!-- 검색결과 영역 -->
+		</div>
+		</form>
+		<!-- //패널 영역2 -->
+	</div>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=2019072202"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var columnDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: 'No', width: 60, cellClass: 'text-center',
+			valueGetter: function(params) { return cfnGridNumner('cardInterestSearchForm',params.node.rowIndex, 'A');}
+		},
+		{headerName: "프로모션ID", field: "cardPrmtSq", width: 130, cellClass: 'text-center'},
+		{headerName: "프로모션명", field: "prmtNm", width: 140, cellClass: 'text-center'
+			,cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "노출여부", field: "dispYn", width: 180, cellClass: 'text-center'},
+		{headerName: "시작일", field: "prmtStd", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "종료일", field: "prmtEdd", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "수정자", field: "updNm" , width: 100, 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") : '';
+			}
+		},
+		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		}
+	];
+	
+	// Get GridOptions
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 중복 선택 가능
+	gridOptions.rowSelection = 'multiple';
+	gridOptions.suppressRowClickSelection = true;
+
+	// Row Click
+	gridOptions.onCellClicked = function(event) {
+		var goodsCd = event.data.goodsCd;
+		if (event.colDef.field == "prmtNm"){
+			
+		}
+	}
+
+	// 초기화 클릭시
+	$('#btnInit').on('click', function() {
+		fnInit();
+	});
+	
+	var fnInit = function(){
+		$('#cardInterestSearchForm')[0].reset();
+	}
+	
+	// 조회클릭시
+	$('#btnSearch').on('click', function() {
+		$("#cardInterestSearchForm input[name=pageNo]").val('1');
+		fnCardPromotionListSearch();
+	});
+
+	// 조회
+	var fnCardPromotionListSearch = function() {
+		
+		if(!fnConditionCheck()) return;
+		
+		gagaPaging.init('cardInterestSearchForm', fnSearchCallBack, 'cardListPagination', $('#cardInterestSearchForm').find('#pageSize').val());
+		gagaPaging.load($("#cardInterestSearchForm input[name=pageNo]").val());
+	}
+
+	//검색 조건 확인
+	var fnConditionCheck = function(){
+		var formId = '#cardInterestSearchForm';
+		var form = document.cardInterestSearchForm;
+
+		var searchFlag = false;
+		var cnt = 0;
+		
+		for (i = 0; i < form.elements.length; i++ ) {
+			var el = form.elements[i];
+			if ($(el).prop("type") == "text" || $(el).prop("type") == "textarea" || ($(el).prop("type") == "select-one" && 
+					el.name != "search" && el.name != "pageSize" && el.name != "beforSkipFlag")) {
+				if (!(el.value == null || el.value == "")) {
+					cnt++;
+				}
+			}
+		}
+		
+		if(cnt > 0) searchFlag = true;
+		
+		if(searchFlag == false){
+			mcxDialog.alert("검색조건을 입력하세요.");
+			return false;
+		}
+		
+		var fromDate = $('#cardInterestSearchForm input[name=stDate]').val();
+		var toDate = $('#cardInterestSearchForm input[name=edDate]').val();
+		
+		if (!gagajf.isNull(fromDate) || !gagajf.isNull(toDate)) {
+			
+			if (gagajf.isNull(fromDate) || gagajf.isNull(toDate)) {
+				mcxDialog.alertC("등록일 조회시 시작일자와 종료일자를 입력하세요.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#cardInterestSearchForm input[name=stDate]').focus();
+					}
+				});
+				return false;
+			}
+
+			if (fromDate > toDate) {
+				mcxDialog.alert("노출기간 시작일자는 종료일자 보다 클 수 없습니다.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#cardInterestSearchForm input[name=stDate]').focus();
+					}
+				});
+				return false;
+			} 
+		}
+
+		return true;
+	}
+	
+	var fnSearchCallBack = function(result){
+
+		$('#cardInterestSearchForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
+		$('#cardInterestSearchForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
+		$('#cardInterestSearchForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
+		$('#cardInterestSearchForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
+		gridOptions.api.setRowData(result.cardPromotionList);
+		gagaPaging.createPagination(result.pageing.pageable);
+	}
+	
+	//페이징 
+	$('#cardInterestSearchForm select[name=pageSize]').on('change', function() {
+		$("#cardInterestSearchForm input[name=pageNo]").val('1');
+		fnCardPromotionListSearch($("#cardInterestSearchForm input[name=searchGb]").val());
+	});
+	
+	//카드 무이자 팝업
+	$('#btnCardPromotionSave').click(function(e) {
+		cardInterestPopup();
+	});
+	
+	var cardInterestPopup = function(cardPrmtSq){
+		var actionUrl = "/marketing/card/interest/popup/form/";
+		if (typeof(cardPrmtSq) != 'undefined' && cardPrmtSq != null ){
+			actionUrl += cardPrmtSq;
+		}else{
+			actionUrl += 0;
+		}
+		
+		cfnOpenModalPopup(actionUrl, 'popupCardInterest'); 
+	}
+	
+	
+	//카드 프로모션 삭제
+	$('#btnCardPromotionDelete').click(function(e) {
+		//상품선택여부 확인처리 추가
+		var selectedData = gridOptions.api.getSelectedRows();
+
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return false;
+		}
+		
+		var arrGoodsCd = [];
+		var arrGoodsTnmResSq = [];
+		var chkFlag = false;
+		//selectedData = gagaAgGrid.getAllRowData(gridOptions);
+		$.each(selectedData, function(idx, item) {
+			
+			if (gagajf.isNull(item.goodsTnmResSq) || item.goodsTnmResSq == "0"){
+				chkFlag = true;
+				mcxDialog.alert(item.goodsCd +"상품은 상품타이틀이 예약된 상품이 아닙니다.");
+				return false;
+			}
+			
+			var toDateStr = new Date().format("YYYYMMDDHHmmss");
+			if (toDateStr > item.applyEddt){
+				chkFlag = true;
+				mcxDialog.alertC("종료된 예약 상품은 삭제할 수 없습니다.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#goodsRsvtTnmForm input[name=applyEdYMD]').focus();
+					}
+				});
+				return false;
+			}
+		
+			arrGoodsCd.push(item.goodsCd);
+			arrGoodsTnmResSq.push(item.goodsTnmResSq);
+		});
+
+		if (chkFlag){
+			return;
+		}
+		
+		mcxDialog.confirm('삭제하시겠습니까? <br/> 삭제한 프로모션은 복구할수 없습니다.',  {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var data = {arrGoodsCd : arrGoodsCd
+						,arrGoodsTnmResSq : arrGoodsTnmResSq
+			};
+			
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit('/goods/title/reserve/delete', jsonData, fnCardPromotionDeleteCollBack);
+			}
+		});
+	});
+	
+	var fnCardPromotionDeleteCollBack = function(){
+		//fnCardPromotionListSearch($();
+	}
+	
+	$(document).ready(function() {
+
+		cfnCreateCalendar('#sellTerms', 'stDate', 'edDate', true, '기간', 'X');
+		var chkBeforSkipFlag = '&nbsp;&nbsp;<label class="chkBox"><input type="checkbox" name="beforSkipFlag" value="Y" >이전데이터 제외</label>';
+		$("#cardInterestSearchForm").find('#sellTerms').append(chkBeforSkipFlag);
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+
+	});
+
+/*]]>*/
+</script>
+ 	
+</html>

+ 221 - 0
src/main/webapp/WEB-INF/views/marketing/CardInterestPopupForm.html

@@ -0,0 +1,221 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CardInterestPopupForm.html
+ * @desc    : 카드무이자할부 팝업 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2019 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.01   eskim       최초 작성
+ *******************************************************************************
+ -->	
+	<div class="modalPopup" data-width="1000"> <!-- data-width="850"  -->
+		<div class="panelStyle">
+			<div class="panelTitle">
+				<h2>프로모션<th:block th:text="${cardPrmtSq > 0 }?'상세':'등록'"></th:block> </h2>
+				<button type="button" class="close" onclick="uifnPopupClose('popupCardInterest')"><i class="fa fa-times"></i></button>
+			</div>
+			<form id="cardInterestForm" name="cardInterestForm" >
+			<div class="panelContent">
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:50%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>프로모션명<em class="required" title="필수"></em></th>
+						<td><input type="text" class="w500" id="prmtNm" name="prmtNm"  maxlength="30" required="required" data-valid-name="프로모션명" /></td>
+						<th>프로모션ID</th>
+						<td><input type="text" class="w100 formControl" id="cardPrmtSq" name="cardPrmtSq"  readonly/></td>
+					</tr>
+					<tr>
+						<th>행사기간<em class="required" title="필수"></em></th>
+						<td >
+							<input name="prmtStdYMD" id="prmtStdYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="행사시작일" />
+							<input name="prmtStd" id="prmtStd" type="hidden" />
+							~
+							<input name="prmtEddYMD" id="prmtEddYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="행사종료일" />
+							<input name="prmtEdd" id="prmtEdd" type="hidden" />
+						</td>
+						<th>노출여부<em class="required" title="필수"></em></th>
+						<td >
+							<label class="rdoBtn"><input type="radio" name="dispYn" value="Y"  checked/>Y</label>
+							<label class="rdoBtn"><input type="radio" name="dispYn" value="N"/>N</label>
+							<input type="hidden" id="dispYnOrg" name="dispYnOrg"/>
+						</td>
+					</tr>
+					<tr>
+						<th>행사조건<em class="required" title="필수"></em><br/>
+							<button type="button" class="btn btn-base btn-sm" id="btnCardContionAdd"><i class="fa fa-plus"></i></button>
+						</th>
+						<td colspan="3" >
+							<div  style="overflow-y:scroll; height:230px;">
+							<table  class="frmStyle">
+								<colgroup>
+									<col style="width:7%;"/>
+									<col/>
+								</colgroup>
+								<tbody id="cardContionList">
+								<tr>
+									<td style="height:100px;"></td>
+									<td><p class="dot">무이자개월 <input type="text" class="w100"  name="minNoItrt" data-valid-type="numeric" required="required" data-valid-name="무이자개월"/>개월 ~
+										<input type="text" class="w100"  name="maxNoItrt" data-valid-type="numeric" required="required" data-valid-name="무이자개월"/>개월</p>
+										<p class="dot">구매금액기준 <input type="text" class="w100"  name="minPayAmt" data-valid-type="numeric" required="required" data-valid-name="구매금액기준"/>원 이상 구매시</p>
+										<p class="dot">대상카드 <button type="button" class="btn btn-base btn-sm" onClick="fnCardAdd(1);">선택</button><br/><span id="arrCardNm1" class="cRed"></span></p>
+										<input type="hidden" name="arrCardCd"/>
+										<input type="hidden" name="cardIdx" id="cardIdx"/>
+									</td>
+								</tr>
+								</tbody>
+							</table>
+							</div>
+						</td>
+					</tr>
+					<tr>
+						<th>부분무이자안내</th>
+						<td  colspan="3">
+						<textarea class="textareaR2" name="note" id="note"></textarea>
+						</td>
+					</tr>
+				</table>
+			</div>
+			<ul class="panelBar">
+				<li class="left">
+					<button type="button" class="btn btn-danger btn-lg" id="btnDeleteGoodsRsvtTnm">상품삭제</button>
+				</li>	
+				<li class="right">
+					<button type="button" class="btnRight btn btn-success btn-lg" id="btnSaveCardInterest">적용</button>
+				</li>
+			</ul>
+			</form>	
+		</div>
+	</div>
+<script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020103001"></script>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.summernote.js?v=2020103001"></script>	
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	//카드행사조건 추가
+	$('#btnCardContionAdd').on('click', function() {
+		var len =  $('#cardInterestForm').find('#cardContionList tr').length;
+		
+		if(len >= 3) {
+			mcxDialog.alert("최대 3개까지 가능합니다.");
+			return false;
+		}
+		
+		var cardHtml = "";
+		cardHtml +='<tr>';
+		cardHtml +='	<td style="height:100px;"><button type="button" class="btn icn"><i class="fa fa-times" aria-hidden="true" onclick="$(this).parent().parent().parent().remove();return false;"></i></button></td>';
+		cardHtml +='	<td><p class="dot">무이자개월 <input type="text" class="w100"  name="minNoItrt" data-valid-type="numeric" required="required" data-valid-name="무이자개월"/>개월 ~';
+		cardHtml +='	<input type="text" class="w100"  name="maxNoItrt" data-valid-type="numeric" required="required" data-valid-name="무이자개월"/>개월</p>';
+		cardHtml +='	<p class="dot">구매금액기준 <input type="text" class="w100"  name="minPayAmt" data-valid-type="numeric" required="required" data-valid-name="구매금액기준"/>원 이상 구매시</p>';
+		cardHtml +='	<p class="dot">대상카드 <button type="button" class="btn btn-base btn-sm" onClick="fnCardAdd('+ (len+1) +');">선택</button><br/><span id="arrCardNm'+(len+1)+'" class="cRed"></span></p>';
+		cardHtml +='	<input type="hidden" name="arrCardCd"/>';
+		cardHtml +='	</td>';
+		cardHtml +='</tr>';
+		
+		$('#cardInterestForm').find('#cardContionList').append(cardHtml);
+		
+	});
+	
+	//카드조회팝업
+	var fnCardAdd = function(idx){
+		$('#cardInterestForm').find('#cardIdx').val(idx);
+		var arrCardCd = $('#cardInterestForm').find("input[name=arrCardCd]").eq(idx-1).val();
+		cfnOpenCardListPopup('fnCardAddCallBakup', arrCardCd);	// /로 구분
+	}
+	
+	// 카드추가/삭제
+	var fnCardAddCallBakup = function(arrCardCd, arrCardNm) {
+		var index = $('#cardInterestForm').find('#cardIdx').val();
+		$('#cardInterestForm').find("#arrCardNm" + (index)).html(arrCardNm);
+		$('#cardInterestForm').find("input[name=arrCardCd]").eq(index-1).val(arrCardCd);
+	};
+	
+	// 저장 클릭 시
+	$('#btnSaveCardInterest').on('click', function() {
+		
+		var optCheck = false;
+		// 입력 값 체크
+		if (!gagajf.validation('#cardInterestForm'))
+			return false;
+		
+		var idx = 0;
+		$('#cardInterestForm').find('#cardContionList tr').each(function() {
+			var minNoItrt = $(this).find("input[name=minNoItrt]").val();
+			var maxNoItrt = $(this).find("input[name=maxNoItrt]").val();
+			var minPayAmt = $(this).find("input[name=minPayAmt]").val();
+			var arrCardCd = $(this).find("input[name=arrCardCd]").val();
+			
+			if (Number(minNoItrt) > Number(maxNoItrt)){
+				optCheck = true;
+				mcxDialog.alertC("무이자개월수를 확인해주세요", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#cardInterestForm').find('#cardContionList tr').find("input[name=maxNoItrt]").eq(idx).focus();
+					}
+				});
+				return false;
+			}
+			
+			if (Number(minPayAmt) < 10000){
+				optCheck = true;
+				mcxDialog.alertC("구매기준금액을 확인해주세요", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#cardInterestForm').find('#cardContionList tr').find("input[name=minPayAmt]").eq(idx).focus();
+					}
+				});
+				return false;
+			}
+			
+			if (gagajf.isNull(arrCardCd)){
+				optCheck = true;
+				mcxDialog.alert((idx+1)+"번째 행사조건의 대상카드를 선택해주세요")
+				return false;
+			}
+			
+			idx++;
+		});
+		
+		if (optCheck){
+			return false;
+		}
+		
+		mcxDialog.confirm('저장하시겠습니까?',  {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+
+				gagajf.ajaxFormSubmit("/marketing/card/interest/save", "#cardInterestForm", fnSaveCardInterestCallBack); 
+
+			}
+		});
+	});
+
+	
+	//창종료
+	var fnSaveCardInterestCallBack = function(){
+		fnCardPromotionListSearch(); 	//본창 호출
+		uifnPopupClose('popupCardInterest');
+		
+	}
+
+	$(document).ready(function() {
+
+		// Create a summernote
+		var snOptions = gagaSn.getToolbarOptions('media');
+		gagaSn.createSummernote(snOptions, '#note');
+	});
+
+/*]]>*/
+</script>
+</html>

+ 85 - 0
src/main/webapp/WEB-INF/views/marketing/CardListPopupForm.html

@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CardListPopupForm.html
+ * @desc    : 카드목록 팝업 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2019 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.01   eskim       최초 작성
+ *******************************************************************************
+ -->	
+	<div class="modalPopup" data-width="700">
+		<div class="panelStyle">
+			<div class="panelTitle">
+				<h2>카드목록</h2>
+				<button type="button" class="close" onclick="uifnPopupClose('popupCardList')"><i class="fa fa-times"></i></button>
+			</div>
+			<form id="cardListForm" name="cardListForm" >
+			<div class="panelContent">
+				<table class="frmStyle">
+					<tr>
+						<td id="cardArea">
+							<th:block th:if="${cardList}" th:each="oneData, status : ${cardList}">
+							<label class="chkBox" th:classappend="${not #strings.isEmpty(params.arrCard) and  #strings.contains(params.arrCard,oneData.cd)?'checked':''}"><input type="checkbox" name="card" th:value="${oneData.cd}" th:text="${oneData.cdNm}" th:checked="${not #strings.isEmpty(params.arrCard) and  #strings.contains(params.arrCard,oneData.cd)}">국민</label>
+							</th:block>
+						</td>
+					</tr>
+				</table>
+			</div>
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btnRight btn btn-success btn-lg" id="btnSaveCardList">적용</button>
+				</li>
+			</ul>
+			</form>	
+		</div>
+	</div>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	// 적용 클릭 시
+	$('#btnSaveCardList').on('click', function() {
+		var arrCardCd = '';
+		var arrCardNm = '';
+		$("#cardListForm #cardArea label").each(function() {
+			if ($(this).find("input:checkbox[name=card]").is(':checked')){
+				if (gagajf.isNull(arrCardCd)){
+					arrCardCd += $(this).find("input[name=card]").val();
+					arrCardNm += $(this).find("input[name=card]").parent('label').text();	
+				}else{
+					arrCardCd += '/' + $(this).find("input[name=card]").val();
+					arrCardNm += '/' + $(this).find("input[name=card]").parent('label').text();
+				}
+			}
+		});
+		
+		var callback = [[${params.callBackFun}]];
+
+		if( typeof callback != 'undefined' && callback){
+
+			if (typeof callback == 'function') {
+				callback(arrCardCd);
+			}else{
+				if( callback ) {
+					if( callback.indexOf("(") == -1 ) eval( callback +"('" + arrCardCd + "','"+ arrCardNm  +"')");
+					else eval( callback(arrCardCd, arrCardNm) );
+				}
+			}
+			uifnPopupClose('popupCardList');
+		}
+		
+	});
+	
+	$(document).ready(function() {
+	
+	});
+
+/*]]>*/
+</script>
+</html>

+ 336 - 0
src/main/webapp/WEB-INF/views/marketing/CouponIssuePopupForm.html

@@ -0,0 +1,336 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CouponIssuePopupForm.html
+ * @desc    : 쿠폰발급 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.28   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="960" data-height="900" >
+	<div id="panel" class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong>쿠폰 발급</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupCouponIssue');"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<form id="searchCouponForm" name="searchCouponForm" action="#" th:action="@{'/marketing/coupon/retrieve/list'}" th:method="post">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:40%;"/>
+						<col style="width:10%;"/>
+						<col style="width:40%;"/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>사이트<em class="required" title="필수"></em></th>
+							<td>
+								<select name="siteCd" required="required">
+									<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+								</select>
+							</td>
+							<th>쿠폰유형</th>
+							<td>
+								<select name="cpnType">
+									<option value="">[전체]</option>
+									<option th:if="${cpnTypeList}" th:each="oneData, status : ${cpnTypeList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<th>쿠폰ID</th>
+							<td>
+								<input type="text" name="cpnId" maxlength="20"/>
+							</td>
+							<th>쿠폰명</th>
+							<td>
+								<input type="text" name="cpnNm" maxlength="50"/>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearchCouponRetrieve">조회</button>
+					</li>
+				</ul>
+			</form>
+			<!-- 리스트 영역 -->
+			<div id="gridCouponList" style="width: 100%; height: 420px;" class="ag-theme-balham"></div>
+			<!-- //리스트 영역 -->
+			<form id="couponIssueForm" name="couponIssueForm">
+				<input type="hidden" name="cpnId"/>
+				<input type="hidden" name="pdGb"/>
+				<input type="hidden" name="custNo"/>
+				<table class="frmStyle" aria-describedby="발급내용">
+					<colgroup>
+						<col style="width: 10%"/>
+						<col style="width: 40%"/>
+						<col style="width: 10%"/>
+						<col style="width: 40%"/>
+					</colgroup>
+					<tr id="availTermsTr">
+						<th class="availTerm">유효기간시작일시<em class="required" title="필수"></em></th>
+						<td class="availTerm">
+							<input type="text" name="availStdt" class="schDate w100" data-valid-name="유효기간시작일시"/>
+							<select name="availStHH" data-valid-name="유효기간시작(시)"required="required">
+								<th:block th:each="num, index : ${#numbers.sequence(0, 23)}">
+									<option th:value="${#numbers.formatInteger(num, 2)}" th:text="|${#numbers.formatInteger(num, 2)}시|">시간</option>
+								</th:block>
+							</select>
+							<select name="availStMM" data-valid-name="유효기간시작(분)" required="required">
+								<th:block th:each="num, index : ${#numbers.sequence(0, 59)}">
+									<option th:value="${#numbers.formatInteger(num, 2)}" th:text="|${#numbers.formatInteger(num, 2)}분|">분</option>
+								</th:block>
+							</select>
+						</td>
+
+						<th class="availTerm">유효기간종료일시<em class="required" title="필수"></em></th>
+						<td class="availTerm">
+							<input type="text" name="availEddt" class="schDate w100" data-valid-name="유효기간종료일시"/>
+							<select name="availEdHH" data-valid-name="유효기간종료(시)">
+								<th:block th:each="num, index  : ${#numbers.sequence(0, 23)}">
+									<option th:value="${#numbers.formatInteger(num, 2)}" th:text="|${#numbers.formatInteger(num, 2)}시|">시간</option>
+								</th:block>
+							</select>
+							<select name="availEdMM" data-valid-name="유효기간종료(분)">
+								<th:block th:each="num: ${#numbers.sequence(0, 59)}">
+									<option th:value="${#numbers.formatInteger(num, 2)}" th:text="|${#numbers.formatInteger(num, 2)}분|">분</option>
+								</th:block>
+							</select>
+						</td>
+					</tr>
+					<tr id="availDaysTr" style="display:none;">
+						<th>유효기간(일)</th>
+						<td><input type="text" name="availDays" data-valid-type="integer"></td>
+					</tr>
+					<tr>
+						<th>발급사유</th>
+						<td>
+							<select name="pubReason" data-valid-name="발급사유" required>
+								<option th:if="${cpnPubReasonList}" th:each="oneData, status : ${cpnPubReasonList}" th:value="${oneData.cd}"
+										th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>만료알림발송여부<em class="required" title="필수"></em></th>
+						<td>
+							<select name="endAlimSendYn" id="endAlimSendYn" data-valid-name="만료알림발송여부" required="required">
+								<option value="Y">Y</option>
+								<option value="N" selected="selected">N</option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>상세사유</th>
+						<td colspan="3">
+							<textarea name="pubReasonDtl" class="textareaR3" style="resize: none;"  data-valid-name="상세사유" required="required"></textarea>
+						</td>
+					</tr>
+				</table>
+			</form>
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-info btn-lg" id="btnIssueCoupon">발급</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+		</div>
+	</div>
+</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	const START_END_TIME = '00';
+	const END_TIME = '59';
+
+	let elementCustNo = [[${elementCustNo}]];
+
+	let siteList = gagajf.convertToArray([[${siteList}]]);
+	let usableCustGbList = gagajf.convertToArray([[${usableCustGbList}]]);
+	let cpnTypeList = gagajf.convertToArray([[${cpnTypeList}]]);
+	let dcWayList = gagajf.convertToArray([[${dcWayList}]]);
+	
+	let columnDefsCouponList = [
+// 		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{
+			headerName: "사이트", field: "siteCd", width: 80, cellClass: "text-center", pinned: 'left',
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(siteList, params.value); }
+		},
+		{headerName: "쿠폰ID", field: "cpnId", width: 90, cellClass: 'text-center', pinned: 'left'},
+		{headerName: "쿠폰명", field: "cpnNm", width: 150, pinned: 'left'},
+		{
+			headerName: "사용가능고객", field: "usableCustGb", width: 120, cellClass: "text-center",
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(usableCustGbList, params.value); }
+		},
+		{
+			headerName: "쿠폰유형", field: "cpnType", width: 100, cellClass: "text-center",
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(cpnTypeList, params.value); }
+		},
+		{
+			headerName: "할인방식", field: "dcWay", width: 100, cellClass: "text-center",
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(dcWayList, params.value); }
+		},
+		{
+			headerName: "할인값(PC)", field: "dcPval", width: 100, cellClass: "text-center",
+			cellRenderer: function(params) { return (!gagajf.isNull(params.value) ? gagaAgGrid.toAddComma(params.value) : '') + (params.data.dcWay == '10' ? '원' : '%'); }
+		},
+		{
+			headerName: "할인값(모바일)", field: "dcMval", width: 100, cellClass: "text-center",
+			cellRenderer: function(params) { return (!gagajf.isNull(params.value) ? gagaAgGrid.toAddComma(params.value) : '') + (params.data.dcWay == '10' ? '원' : '%'); }
+		},
+		{
+			headerName: "최고할인값", field: "maxDcAmt", width: 100, cellClass: "text-center",
+			cellRenderer: function(params) { return (!gagajf.isNull(params.value) ? gagaAgGrid.toAddComma(params.value) : '') + (params.data.dcWay == '10' ? '원' : '%'); }
+		},
+		{
+			headerName: "유효기간", field: "availPeriod", width: 300, cellClass: "text-center",
+			cellRenderer: function(params) {
+				return params.data.pdGb == 'P' ? gagaAgGrid.toDateTimeFormat(params.data.availStdt)
+					+ '~' + gagaAgGrid.toDateTimeFormat(params.data.availStdt) : gagaAgGrid.toAddComma(params.data.availDays) + '일';
+			}
+		},
+		{headerName: "발행제한여부", field: "pubLimitYn", width: 100, cellClass: "text-center"},
+		{
+			headerName: "고객당발행제한수량", field: "custPubLimitQty", width: 100, cellClass: "text-center",
+			cellRenderer: function(params) { return !gagajf.isNull(params.value) ? gagaAgGrid.toAddComma(params.value) : ''; }
+		},
+		{
+			headerName: "총발행제한수량", field: "totPubLimitQty", width: 100, cellClass: "text-center",
+			cellRenderer: function(params) { return !gagajf.isNull(params.value) ? gagaAgGrid.toAddComma(params.value) : ''; }
+		},
+		{
+			headerName: "1회발행수량", field: "onePubQty", width: 100, cellClass: "text-center",
+			cellRenderer: function(params) { return !gagajf.isNull(params.value) ? gagaAgGrid.toAddComma(params.value) : ''; }
+		},
+		{headerName: "다운로드구분", field: "dnGb", width: 100, cellClass: "text-center"},
+		{
+			headerName: "구매제한금액", field: "buyLimitAmt", width: 100, cellClass: "text-right",
+			cellRenderer: function(params) { return !gagajf.isNull(params.value) ? gagaAgGrid.toAddComma(params.value) : ''; }
+		}
+	];
+
+	let gridOptionsCouponList = gagaAgGrid.getGridOptions(columnDefsCouponList);
+	
+	gridOptionsCouponList.rowSelection = 'single';
+	gridOptionsCouponList.rowMultiSelectWithClick = true; // 클릭으로 선택 가능
+	//gridOptionsCouponList.suppressRowClickSelection = true;
+
+	// 셀 클릭 이벤트
+	gridOptionsCouponList.onCellClicked = function (event) {
+		fnBindCouponInfo(event.data);
+	};
+
+	// 조회
+	$('#btnSearchCouponRetrieve').on('click', function() {
+		// Fetch data
+		gagaAgGrid.fetch($('#searchCouponForm').prop('action'), gridOptionsCouponList, '#searchCouponForm');
+	});
+	
+
+	// 발생
+	$('#btnIssueCoupon').on('click', function() {
+		let selectedData = gagaAgGrid.selectedRowData(gridOptionsCouponList);
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 쿠폰이 없습니다.');
+			return false;
+		}
+
+		if (!gagajf.validation('#couponIssueForm'))
+			return ;
+
+		let availStHH = $("#couponIssueForm select[name=availStHH]").val();
+		let availStMM = $("#couponIssueForm select[name=availStMM]").val();
+		let availEdHH = $("#couponIssueForm select[name=availEdHH]").val();
+		let availEdMM = $("#couponIssueForm select[name=availEdMM]").val();
+
+		let custCoupon = $("#couponIssueForm").serializeObject();
+		if (custCoupon.pdGb === 'P') {
+			if (gagajf.isNull(custCoupon.availStdt) && gagajf.isNull(custCoupon.availEddt)) {
+				mcxDialog.alert("유효 시작일시 / 유효 종료일시를 입력해주세요");
+				return;
+			}
+			custCoupon.availStdt = custCoupon.availStdt+' '+availStHH +':'+ availStMM + ':' +START_END_TIME;
+			custCoupon.availEddt = custCoupon.availEddt+' '+availEdHH +':'+ availEdMM + ':' +END_TIME;
+		}
+
+		if (custCoupon.pdGb === 'D') {
+			if (gagajf.isNull(custCoupon.availDays)) {
+				mcxDialog.alert("유효기간(일)을 입력해주세요");
+				return;
+			}
+		}
+
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				let jsonData = JSON.stringify(custCoupon);
+				//console.log(jsonData);
+				gagajf.ajaxJsonSubmit('/marketing/coupon/issue/save', jsonData, fnIssueCouponCallBack);
+			}
+		});
+
+	});
+
+	var fnIssueCouponCallBack = function () {
+		uifnPopupClose('popupCouponIssue');
+		fnSearchCoupon();
+	}
+
+
+
+	// 선택 쿠폰정보 셋팅
+	var fnBindCouponInfo = function(params) {
+		$('#couponIssueForm input[name=cpnId]').val(params.cpnId);
+		$('#couponIssueForm input[name=pdGb]').val(params.pdGb);
+		$('#couponIssueForm input[name=availStdt]').val(gagaAgGrid.toDateFormat(params.availStdt));
+		$("#couponIssueForm select[name=availStHH]").val(params.availStdt.substring(8,10));
+		$("#couponIssueForm select[name=availStMM]").val(params.availStdt.substring(10,12));
+		$('#couponIssueForm input[name=availEddt]').val(gagaAgGrid.toDateFormat(params.availEddt));
+		$("#couponIssueForm select[name=availEdHH]").val(params.availEddt.substring(8,10));
+		$("#couponIssueForm select[name=availEdMM]").val(params.availEddt.substring(10,12));
+		$('#couponIssueForm input[name=availDays]').val(params.availDays);
+
+		//유효기간 숨김처리
+		if (params.pdGb === 'P') {
+			$("#availTermsTr").show();
+			$("#availDaysTr").hide();
+		} else if (params.pdGb === 'D') {
+			$("#availTermsTr").hide();
+			$("#availDaysTr").show();
+		}
+
+	}
+
+	var fnInitDataSet = function () {
+		let custNo = $(elementCustNo).val();
+		if(!gagajf.isNull(custNo)) {
+			$('#couponIssueForm input[name=custNo]').val(custNo);
+		}
+	};
+
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridCouponList', gridOptionsCouponList);
+
+		fnInitDataSet();
+
+
+	});
+/*]]>*/
+</script>
+
+</html>

+ 3 - 3
src/main/webapp/WEB-INF/views/marketing/CouponListForm.html

@@ -142,7 +142,7 @@
 		var cpnTypeList = gagajf.convertToArray([[${cpnTypeList}]]);
 		var siteCdList = gagajf.convertToArray([[${siteCdList}]]);
 		var dcWayList = gagajf.convertToArray([[${dcWayList}]]);
-		var usableCustGbList = gagajf.convertToArray([[${usableCustGbList}]]);
+		//var usableCustGbList = gagajf.convertToArray([[${usableCustGbList}]]);
 		var pdGbList = { "P":"기간", "D":"일수" };
 
 		var columnDefs = [];
@@ -157,12 +157,12 @@
 			{headerName: "쿠폰명", field: "cpnNm", width: 140, cellClass: 'text-center' , cellRenderer: function (params) {
 				return "<a href=\"javascript:void(0);\" onclick=\"cfnCouponCreatePopup('" + params.data.cpnId + "');\">" + params.value + "</a>";
 			}},
-			{headerName: "사용가능고객구분", field: "usableCustGb", width: 140, cellClass: 'text-center' ,
+			/*{headerName: "사용가능고객구분", field: "usableCustGb", width: 140, cellClass: 'text-center' ,
 				cellEditor: 'agRichSelectCellEditor',
 				cellEditorParams: { values: gagaAgGrid.extractValues(usableCustGbList) },
 				valueFormatter: function (params) { return gagaAgGrid.lookupValue(usableCustGbList, params.value); },
 				valueParser: function (params) { return gagaAgGrid.lookupKey(usableCustGbList, params.newValue);}
-			},
+			},*/
 			{headerName: "쿠폰유형", field: "cpnType", width: 140, cellClass: 'text-center' ,
 				cellEditor: 'agRichSelectCellEditor',
 				cellEditorParams: { values: gagaAgGrid.extractValues(cpnTypeList) },

+ 336 - 78
src/main/webapp/WEB-INF/views/marketing/CouponPopupForm.html

@@ -46,9 +46,9 @@
 								<table class="frmStyle">
 									<colgroup>
 										<col style="width:10%">
-										<col style="width:40%;">
+										<col style="width:45%;">
 										<col style="width:10%">
-										<col style="width:40%;">
+										<col style="width:35%;">
 									</colgroup>
 									<tbody>
 										<tr th:if="${cpnDetail}">
@@ -94,9 +94,12 @@
 										<tr>
 											<th>사용가능고객구분<em class="required" title="필수"></em></th>
 											<td>
-												<select name="usableCustGb" id="usableCustGb" required="required" data-valid-name="사용가능고객구분">
+												<!--<select name="usableCustGb" id="usableCustGb" required="required" data-valid-name="사용가능고객구분">
 													<option th:if="${usableCustGbList}" th:each="oneData , status : ${usableCustGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-												</select>
+												</select>-->
+												<input type="hidden" name="usableCustGb"/>
+												<label class="chkBox"><input type="checkbox" name="chkUsableCustGb" id="chkUsableCustGb10" value="G100_10">일반회원</label>
+												<label class="chkBox"><input type="checkbox" name="chkUsableCustGb" id="chkUsableCustGb20" value="G100_20">임직원</label>
 											</td>
 											<th>사이트<em class="required" title="필수"></em></th>
 											<td>
@@ -108,10 +111,16 @@
 										<tr>
 											<th>사용고객등급구분<em class="required" title="필수"></em></th>
 											<td>
-												<select name="usableCustGrade" id="usableCustGrade" required="required" data-valid-name="사용고객등급구분">
+												<!--<select name="usableCustGrade" id="usableCustGrade" required="required" data-valid-name="사용고객등급구분">
 													<option value="ALL">[전체]</option>
 													<option th:if="${usableCustGradeList}" th:each="oneData , status : ${usableCustGradeList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-												</select>
+												</select>-->
+												<input type="hidden" name="usableCustGrade"/>
+												<label class="chkBox"><input type="checkbox" name="chkUsableCustGrade" id="chkUsableCustGrade10" value="G110_10">VIP</label>
+												<label class="chkBox"><input type="checkbox" name="chkUsableCustGrade" id="chkUsableCustGrade20" value="G110_20">GOLD</label>
+												<label class="chkBox"><input type="checkbox" name="chkUsableCustGrade" id="chkUsableCustGrade30" value="G110_30">SILVER</label>
+												<label class="chkBox"><input type="checkbox" name="chkUsableCustGrade" id="chkUsableCustGrade40" value="G110_40">BRONZE</label>
+												<label class="chkBox"><input type="checkbox" name="chkUsableCustGrade" id="chkUsableCustGrade50" value="G110_50">WELCOME</label>
 											</td>
 											<th>만료알림여부<em class="required" title="필수"></em></th>
 											<td>
@@ -135,20 +144,21 @@
 										<tr>
 											<th>할인값(PC)<em class="required" title="필수"></em></th>
 											<td>
-												<input type="text" class="w200" id="dcPval" name="dcPval" value="0" required="required" data-valid-name="할인값(PC)" data-valid-type="numeric" style="text-align: right"><span id="dcPvalSpan">원</span>
+												<input type="text" class="w200" id="dcPval" name="dcPval" value="0" required="required" data-valid-name="할인값(PC)" data-valid-type="numeric" style="text-align: right" onkeyup="fnDcValOnkeyUp(this);"><span id="dcPvalSpan">원</span>
+												<button type="button" class="btn btn-default btn-lg" id="applySameValueBtn">동일적용</button>
 											</td>
 											<th>할인값(모바일웹)<em class="required" title="필수"></em></th>
 											<td>
-												<input type="text" class="w200" id="dcMval" name="dcMval" value="0" required="required" data-valid-name="할인값(모바일웹)" data-valid-type="numeric" style="text-align: right"><span id="dcMvalSpan">원</span>
+												<input type="text" class="w200" id="dcMval" name="dcMval" value="0" required="required" data-valid-name="할인값(모바일웹)" data-valid-type="numeric" style="text-align: right" onkeyup="fnDcValOnkeyUp(this);"><span id="dcMvalSpan">원</span>
 											</td>
 										</tr>
 										<tr>
 											<th>할인값(모바일앱)<em class="required" title="필수"></em></th>
 											<td>
-												<input type="text" class="w200" id="dcAval" name="dcAval" value="0" required="required" data-valid-name="할인값(모바일앱)" data-valid-type="numeric" style="text-align: right"><span id="dcAvalSpan">원</span>
+												<input type="text" class="w200" id="dcAval" name="dcAval" value="0" required="required" data-valid-name="할인값(모바일앱)" data-valid-type="numeric" style="text-align: right" onkeyup="fnDcValOnkeyUp(this);"><span id="dcAvalSpan">원</span>
 											</td>
-											<th>최대할인금액<em class="required" title="필수"></em></th>
-											<td>
+											<th class="maxDcAmtArea">최대할인금액<em class="required" title="필수"></em></th>
+											<td class="maxDcAmtArea">
 												<input type="text" class="w200" id="maxDcAmt" name="maxDcAmt" value="0" required="required" data-valid-name="최대할인금액" data-valid-type="numeric" style="text-align: right;"><span id="maxDcAmtSpan">원</span>
 											</td>
 										</tr>
@@ -167,8 +177,9 @@
 											<td>
 												<input type="hidden" id="downEddt" name="downEddt" required="required" data-valid-name="다운로드종료일시">
 												<input type="text" class="schDate w100" name="downEdDay" id="downEdDay" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
-												<select name="downEdHH" id="downEdHH">
+												<select name="downEdHH" id="downEdHH" onclick="fnChangeEdHH(this);">
 													<option th:if="${hhList}" th:each="oneData , status : ${hhList}" th:text="${oneData.cdNm}" th:value="${oneData.cd}"></option>
+													<option th:text="24시" th:value="24"></option>
 												</select>
 												<select name="downEdMM" id="downEdMM">
 													<option th:if="${mmList}" th:each="oneData , status : ${mmList}" th:text="${oneData.cdNm}" th:value="${oneData.cd}"></option>
@@ -211,34 +222,28 @@
 											<td class="availDateTr">
 												<input type="hidden" id="availEddt" name="availEddt" data-valid-name="유효기간종료일시">
 												<input type="text" class="schDate w100" name="availEdDay" id="availEdDay" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
-												<select name="availEdHH" id="availEdHH">
+												<select name="availEdHH" id="availEdHH" onclick="fnChangeEdHH(this);">
 													<option th:if="${hhList}" th:each="oneData , status : ${hhList}" th:text="${oneData.cdNm}" th:value="${oneData.cd}"></option>
+													<option th:text="24시" th:value="24"></option>
 												</select>
 												<select name="availEdMM" id="availEdMM">
 													<option th:if="${mmList}" th:each="oneData , status : ${mmList}" th:text="${oneData.cdNm}" th:value="${oneData.cd}"></option>
 												</select>
 											</td>
 										</tr>
-										<tr>
+										<tr class="firstBuyTr">
 											<th>첫구매여부<em class="required" title="필수"></em></th>
 											<td>
-												<select name="firstYn" id="firstYn" onchange="firstYnChange(this)" required="required" data-valid-name="첫구매여부">
+												<select name="firstOrdYn" id="firstOrdYn" onchange="firstOrdYnChange(this)" required="required" data-valid-name="첫구매여부">
 													<option value="Y">Y</option>
 													<option value="N" selected="selected">N</option>
 												</select>
 											</td>
-											<th>다운로드가능여부<em class="required" title="필수"></em></th>
-											<td>
-												<select name="downYn" id="downYn" required="required" data-valid-name="다운로드가능여부">
-													<option value="Y">Y</option>
-													<option value="Y" selected="selected">N</option>
-												</select>
-											</td>
 										</tr>
 										<tr>
 											<th class="buyDateTr">첫구매기간시작일시<em class="required" title="필수"></em></th>
 											<td class="buyDateTr">
-												<input type="hidden" id="buyEddt" name="buyEddt" data-valid-name="첫구매기간종료일시">
+												<input type="hidden" name="buyStdt" id="buyStdt" data-valid-name="첫구매기간시작일시">
 												<input type="text" class="schDate w100" name="buyStDay" id="buyStDay" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
 												<select name="buyStHH" id="buyStHH">
 													<option th:if="${hhList}" th:each="oneData , status : ${hhList}" th:text="${oneData.cdNm}" th:value="${oneData.cd}"></option>
@@ -248,28 +253,25 @@
 												</select>
 											<th class="buyDateTr">첫구매기간종료일시<em class="required" title="필수"></em></th>
 											<td class="buyDateTr">
-												<input type="hidden" name="buyStdt" id="buyStdt" data-valid-name="첫구매기간시작일시">
+												<input type="hidden" id="buyEddt" name="buyEddt" data-valid-name="첫구매기간종료일시">
 												<input type="text" class="schDate w100" name="buyEdDay" id="buyEdDay" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
-												<select name="buyEdHH" id="buyEdHH">
+												<select name="buyEdHH" id="buyEdHH" onclick="fnChangeEdHH(this);">
 													<option th:if="${hhList}" th:each="oneData , status : ${hhList}" th:text="${oneData.cdNm}" th:value="${oneData.cd}"></option>
+													<option th:text="24시" th:value="24"></option>
 												</select>
 												<select name="buyEdMM" id="buyEdMM">
 													<option th:if="${mmList}" th:each="oneData , status : ${mmList}" th:text="${oneData.cdNm}" th:value="${oneData.cd}"></option>
 												</select>
 											</td>
 										</tr>
-										<tr>
+										<tr class="custJoinTr">
 											<th>신규회원여부<em class="required" title="필수"></em></th>
 											<td>
-												<select name="custJoinYn" id="custJoinYn" onchange="custJoinYnChange(this)" required="required" data-valid-name="신규회원여부">
+												<select name="newCustYn" id="newCustYn" onchange="newCustYnChange(this)" required="required" data-valid-name="신규회원여부">
 													<option value="Y">Y</option>
 													<option value="N" selected="selected">N</option>
 												</select>
 											</td>
-											<th class="dcCdCheck">총발행제한수량<em class="required" title="필수"></em></th>
-											<td class="dcCdCheck">
-												<input type="text" class="w200" name="totPubLimitQty" id="totPubLimitQty" value="0" required="required" data-valid-name="총발행제한수량" data-valid-type="numeric" style="text-align: right;">개<span class="cRed" id="totPubLimitQtySpan"> *제한없음</span>
-											</td>
 										</tr>
 										<tr>
 											<th class="custJoinDateTr">신규회원기간시작일시<em class="required" title="필수"></em></th>
@@ -286,23 +288,41 @@
 											<td class="custJoinDateTr">
 												<input type="hidden" id="custJoinEddt" name="custJoinEddt" data-valid-name="신규회원기간종료일시">
 												<input type="text" class="schDate w100" name="custJoinEdDay" id="custJoinEdDay" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
-												<select name="custJoinEdHH" id="custJoinEdHH">
+												<select name="custJoinEdHH" id="custJoinEdHH" onclick="fnChangeEdHH(this);">
 													<option th:if="${hhList}" th:each="oneData , status : ${hhList}" th:text="${oneData.cdNm}" th:value="${oneData.cd}"></option>
+													<option th:text="24시" th:value="24"></option>
 												</select>
 												<select name="custJoinEdMM" id="custJoinEdMM">
 													<option th:if="${mmList}" th:each="oneData , status : ${mmList}" th:text="${oneData.cdNm}" th:value="${oneData.cd}"></option>
 												</select>
 											</td>
 										</tr>
-										<tr class="dcCdCheck">
+										<tr class="dcCdCheck1">
+											<th>총발행제한수량<em class="required" title="필수"></em></th>
+											<td>
+												<input type="text" class="w200" name="totPubLimitQty" id="totPubLimitQty" value="0" required="required" data-valid-name="총발행제한수량" data-valid-type="numeric" style="text-align: right;">개
+												<label class="chkBox" id="chkBoxTotPubQty"><input type="checkbox" id="chkNoLimitTotPubLimitQty"/>제한없음</label>
+											</td>
 											<th>1인당발행제한수량<em class="required" title="필수"></em></th>
 											<td>
-												<input type="text" class="w200" name="custPubLimitQty" id="custPubLimitQty" value="0" required="required" data-valid-name="1인당발행제한수량" data-valid-type="numeric" style="text-align: right;">개<span class="cRed" id="custPubLimitQtySpan"> *제한없음</span>
+												<input type="text" class="w200" name="custPubLimitQty" id="custPubLimitQty" value="0" required="required" data-valid-name="1인당발행제한수량" data-valid-type="numeric" style="text-align: right;">개
+												<label class="chkBox" id="chkBoxCustPubQty"><input type="checkbox" id="chkNoLimitCustPubLimitQty"/>제한없음</label>
 											</td>
-											<th>1회발행수량<em class="required" title="필수"></em></th>
-											<td><input type="text" class="w200" name="onePubQty" id="onePubQty" value="1" required="required" data-valid-name="1회발행수량" data-valid-type="numeric" style="text-align: right;">개</td>
 										</tr>
 										<tr>
+											<th class="dcCdCheck2">1회발행수량<em class="required" title="필수"></em></th>
+											<td class="dcCdCheck2">
+												<input type="text" class="w200" name="onePubQty" id="onePubQty" value="1" required="required" data-valid-name="1회발행수량" data-valid-type="numeric" style="text-align: right;">개
+											</td>
+											<th>다운로드가능여부<em class="required" title="필수"></em></th>
+											<td>
+												<select name="downAblYn" id="downAblYn" required="required" data-valid-name="다운로드가능여부">
+													<option value="Y">Y</option>
+													<option value="Y" selected="selected">N</option>
+												</select>
+											</td>
+										</tr>
+										<!--<tr>
 											<th>재발급여부<em class="required" title="필수"></em></th>
 											<td>
 												<select name="reissuance" id="reissuance" required="required" data-valid-name="재발급여부" >
@@ -315,8 +335,8 @@
 													<option th:if="${dnGbList}" th:each="oneData , status:${dnGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 												</select>
 											</td>
-										</tr>
-										<tr class="payTypeTr" style="display: none;">
+										</tr>-->
+										<!--<tr class="payTypeTr" style="display: none;">
 											<th>결제수단<em class="required" title="필수"></em></th>
 											<td colspan="5">
 												<select name="payType" id="payType" data-valid-name="결제수단">
@@ -325,6 +345,12 @@
 												</select>
 											</td>
 										</tr>
+										<tr>
+											<th>멀티결제수단</th>
+											<td colspan="5">
+
+											</td>
+										</tr>-->
 										<tr>
 											<th>쿠폰상태<em class="required" title="필수"></em></th>
 											<td>
@@ -605,8 +631,103 @@
 	brandGridOptions.rowSelection = "multiple";
 	inComGridOptions.stopEditingWhenGridLosesFocus = true;
 
+	// 종료시간 클릭시
+	var fnChangeEdHH = function (obj){
+		var selectId = obj.id;
+		var changeId = "";
+		if(selectId == "downEdHH"){
+			changeId = "downEdMM";
+		}else if(selectId == "availEdHH"){
+			changeId = "availEdMM";
+		}else if(selectId == "buyEdHH"){
+			changeId = "buyEdMM";
+		}else{
+			changeId = "custJoinEdMM";
+		}
+		if(obj.value == 24) {
+			$("#CouponForm #"+changeId+" option").hide();
+			$('#CouponForm #'+changeId+' option:first').show().prop("selected", true);
+		} else {
+			$("#CouponForm #"+changeId+" option").show();
+		}
+	};
+
+	// 총발행 제한수량 -> 제한없음 처리
+	$("#CouponForm #chkBoxTotPubQty").bind('click', function (){
+		var chkBox= document.getElementById('chkNoLimitTotPubLimitQty').checked;
+		if(chkBox){ //true 체크가 되어있었는데 해제됐어 -> 값0 inputbox disabled 해제
+			$("#CouponForm #totPubLimitQty").val(0);
+			$("#CouponForm input[id=totPubLimitQty]").prop("disabled", false);
+		}else{	//false 체크가 안되어있었는데 체크됐어 -> 값0 inputbox disabled
+			$("#CouponForm #totPubLimitQty").val(0);
+			$("#CouponForm input[id=totPubLimitQty]").prop("disabled", true);
+		}
+	});
+
+	// 1인당발행 제한수량 -> 제한없음 처리
+	$("#CouponForm #chkBoxCustPubQty").bind('click', function (){
+		var chkBox= document.getElementById('chkNoLimitCustPubLimitQty').checked;
+		if(chkBox){ //true 체크가 되어있었는데 해제됐어 -> 값0 inputbox disabled 해제
+			$("#CouponForm #custPubLimitQty").val(0);
+			$("#CouponForm input[id=custPubLimitQty]").prop("disabled", false);
+		}else{	//false 체크가 안되어있었는데 체크됐어 -> 값0 inputbox disabled
+			$("#CouponForm #custPubLimitQty").val(0);
+			$("#CouponForm input[id=custPubLimitQty]").prop("disabled", true);
+		}
+	});
+
+	// 할인방식 할인율 일때, 할인값 체크
+	var fnDcValOnkeyUp = function (obj){
+		var inputName = $(obj).attr("name");
+		var rdoDcWay = $('#CouponForm input:radio[name="rdoDcWay"]:checked').val();
+		var dcVal = $("#CouponForm input[name="+inputName+"]").val();
+		if(rdoDcWay == "G240_11"){
+			if(dcVal > 100){
+				mcxDialog.alert('할인율은 100을 넘을수 없습니다.');
+				$("#CouponForm input[name="+inputName+"]").val('');
+				$("#CouponForm input[name="+inputName+"]").focus();
+				return;
+			}
+		}
+	}
+
+	// 할인값 동일적용
+	$("#applySameValueBtn").bind('click change', function () {
+		var cdPval = $("#CouponForm input[name=dcPval]").val();
+		$("#CouponForm input[name=dcMval]").val(cdPval);
+		$("#CouponForm input[name=dcAval]").val(cdPval);
+	});
+
 	// 쿠폰 등록 버튼 클릭시
+
 	function fnCouponCreate(){
+		mcxDialog.confirm('저장하시겠습니까?' , {
+			cancelBtnText:"취소",
+			sureBtnText:"확인",
+			sureBtnClick: function () {
+				var chkUsableCustGb = document.getElementsByName("chkUsableCustGb");
+				var chkUsableCustGrade = document.getElementsByName("chkUsableCustGrade");
+				var usableCustGb = "";
+				var usableCustGrade = "";
+
+				for(let i=0; i<chkUsableCustGb.length; i++){
+					if(chkUsableCustGb[i].checked == true){
+						usableCustGb += chkUsableCustGb[i].value+"|";
+					}
+				}
+				for(let i=0; i<chkUsableCustGrade.length; i++){
+					if(chkUsableCustGrade[i].checked == true){
+						usableCustGrade += chkUsableCustGrade[i].value+"|";
+					}
+				}
+
+				$("#CouponForm input[name=usableCustGb]").val(usableCustGb);
+				$("#CouponForm input[name=usableCustGrade]").val(usableCustGrade);
+			}
+		});
+	}
+
+	function fnCouponCreate2(){
 		mcxDialog.confirm('저장하시겠습니까?' , {
 			cancelBtnText:"취소",
 			sureBtnText:"확인",
@@ -666,7 +787,7 @@
 
 	function checkValidation(){
 		//신규가입 지급한다면 validation 체크
-		if( $('#custJoinYn option:selected').val() == "Y" ){
+		if( $('#newCustYn option:selected').val() == "Y" ){
 			var fromDate = $('#CouponForm input[name=custJoinStdt]').val();
 			var toDate = $('#CouponForm input[name=custJoinEddt]').val();
 
@@ -692,7 +813,7 @@
 		}
 
 		// 첫구매 지급하면 validation 체크
-		if( $('#firstYn option:selected').val() == "Y" ){
+		if( $('#firstOrdYn option:selected').val() == "Y" ){
 			var fromDate = $('#CouponForm input[name=buyStdt]').val();
 			var toDate = $('#CouponForm input[name=buyEddt]').val();
 
@@ -780,10 +901,20 @@
 			$('#dcPvalSpan').text("원");
 			$('#dcMvalSpan').text("원");
 			$('#dcAvalSpan').text("원");
+			$('#dcPval').val(0);
+			$('#dcMval').val(0);
+			$('#dcAval').val(0);
+			$('#maxDcAmt').val(0);
+			$("#CouponForm .maxDcAmtArea").hide();
 		} else {
 			$('#dcPvalSpan').text("%");
 			$('#dcMvalSpan').text("%");
 			$('#dcAvalSpan').text("%");
+			$('#dcPval').val(0);
+			$('#dcMval').val(0);
+			$('#dcAval').val(0);
+			$('#maxDcAmt').val(0);
+			$("#CouponForm .maxDcAmtArea").show();
 		}
 	});
 
@@ -794,6 +925,20 @@
 		if(mode == "U") {
 			radioValue = cpnDetail.cpnType;
 		}
+
+		// 즉시할인 쿠폰일때
+		if(radioValue == 'G230_10'){
+			$('#CouponForm .custJoinTr').hide();
+			$('#CouponForm .custJoinDateTr').hide();
+			$('#CouponForm .firstBuyTr').hide();
+			$('#CouponForm .buyDateTr').hide();
+			$('#CouponForm .dcCdCheck1').hide();
+		}else{
+			$('#CouponForm .custJoinTr').show();
+			$('#CouponForm .firstBuyTr').show();
+			$('#CouponForm .dcCdCheck1').show();
+		}
+
 		// 상품쿠폰 선택시 적용범위 개별로 변경 나머진 전체
 		if(radioValue == 'G230_11') {
 			$("input:radio[name='rdoApplyScope']:radio[value='I']").prop('checked', true);
@@ -803,12 +948,12 @@
 
 		// 주문서 쿠폰 선택시 결제수단 노출
 		if(radioValue == 'G230_20') {
-			$('#CouponForm .payTypeTr').show();
-			$('#CouponForm #payType').attr('required' , true);
+			//$('#CouponForm .payTypeTr').show();
+			//$('#CouponForm #payType').attr('required' , true);
 			$("#CouponForm .dcCdGb").show();		// 할인쿠폰유형 노출
 		} else {
-			$('#CouponForm .payTypeTr').hide();
-			$('#CouponForm #payType').attr('required' , false );
+			//$('#CouponForm .payTypeTr').hide();
+			//$('#CouponForm #payType').attr('required' , false );
 			$("#CouponForm .dcCdGb").hide();		// 할인쿠폰유형 숨김
 			$("#CouponForm input:radio[name='dcCdGb']:radio[value='G233_00']").prop('checked', true);		// 주문서 쿠폰이 아닐 경우 일반 쿠폰으로 설정
 		}
@@ -819,10 +964,11 @@
 	// 할인 쿠폰 유형 변경
 	$("#CouponForm input[name=dcCdGb]").bind('click change', function () {
 		if(this.value == "G233_00") {			// 일반 유형
-			$("#CouponForm .dcCdCheck").show();
+			$("#CouponForm .dcCdCheck1").show();
+			$("#CouponForm .dcCdCheck2").show();
 			$("#CouponForm .serialCpnArea").hide();
 			$("#CouponForm .randomCpnArea").hide();
-			$("#CouponForm #custJoinYn").parent().attr("colspan", "");
+			$("#CouponForm #newCustYn").parent().attr("colspan", "");
 			$("#CouponForm .normalCol").attr("colspan", "5");
 			$('#CouponForm input[name="serialCpnNm"]').attr('required' , false);
 			$('#CouponForm input[name="serialCpnQty"]').attr('required' , false);
@@ -843,8 +989,9 @@
 				$('#CouponForm input[name="serialCpnQty"]').attr('required' , false);
 				$('#CouponForm input[name="randomCpnQty"]').attr('required' , true);
 			}
-			$("#CouponForm .dcCdCheck").hide();								// 총발행제한수량, 1회발행수량, 1인당발행제한수량 숨김
-			$("#CouponForm #custJoinYn").parent().attr("colspan", "5");		// 총발행제한 수량을 없애면서 신규회원여부 colspan 수정
+			$("#CouponForm .dcCdCheck1").hide();								// 총발행제한수량, 1회발행수량, 1인당발행제한수량 숨김
+			$("#CouponForm .dcCdCheck2").hide();								// 총발행제한수량, 1회발행수량, 1인당발행제한수량 숨김
+			$("#CouponForm #newCustYn").parent().attr("colspan", "5");		// 총발행제한 수량을 없애면서 신규회원여부 colspan 수정
 		}
 	});
 
@@ -1161,12 +1308,12 @@
 	}
 
 	// 첫구매여부 변경시
-	function firstYnChange(pThis){
+	function firstOrdYnChange(pThis){
 		var selectVal = $(pThis).val();
 
 		if(typeof selectVal == "undefined") {
 			if(mode == "U") {
-				selectVal = cpnDetail.firstYn;
+				selectVal = cpnDetail.firstOrdYn;
 			} else {
 				selectVal = "N";
 			}
@@ -1184,12 +1331,12 @@
 	}
 
 	// 신규회원여부 변경시
-	function custJoinYnChange(pThis){
+	function newCustYnChange(pThis){
 		var selectVal = $(pThis).val();
 
 		if(typeof selectVal == "undefined") {
 			if(mode == "U") {
-				selectVal = cpnDetail.custJoinYn;
+				selectVal = cpnDetail.newCustYn;
 			} else {
 				selectVal = "N";
 			}
@@ -1249,23 +1396,66 @@
 		// 적용범위값 세팅
 		$('#CouponForm #applyScope').val($('#CouponForm input:radio[name="rdoApplyScope"]:checked').val());
 		// 다운로드기간 세팅
-		$('#CouponForm #downStdt').val($('#CouponForm #downStDay').val() + " " + $('#CouponForm #downStHH').val() + ":" + $('#CouponForm #downStMM').val() + ":00");
-		$('#CouponForm #downEddt').val($('#CouponForm #downEdDay').val() + " " + $('#CouponForm #downEdHH').val() + ":" + $('#CouponForm #downEdMM').val() + ":59");
+		let downStdt = "";
+		let downEddt = "";
+		downStdt = $('#CouponForm input[name=downStDay]').val()+$('#CouponForm select[name=downStHH]').val()+$('#CouponForm select[name=downStMM]').val()+'00';
+		if($('#CouponForm select[name=downEdHH]').val() == "24"){
+			downEddt = $('#CouponForm input[name=downEdDay]').val()+'235959';
+		}else{
+			downEddt = $('#CouponForm input[name=downEdDay]').val()+$('#CouponForm select[name=downEdHH]').val()+$('#CouponForm select[name=downEdMM]').val()+'00';
+		}
+		downStdt = downStdt.replace(/[^0-9]/g, '');
+		downEddt = downEddt.replace(/[^0-9]/g, '');
+		$('#CouponForm #downStdt').val(downStdt);
+		$('#CouponForm #downEddt').val(downEddt);
+
 		// 유효기간 세팅
+		let availStdt = "";
+		let availEddt = "";
 		if($("#CouponForm #pdGb").val() == 'P') {
-			$('#CouponForm #availStdt').val($('#CouponForm #availStDay').val() + " " + $('#CouponForm #availStHH').val() + ":" + $('#CouponForm #availStMM').val() + ":00");
-			$('#CouponForm #availEddt').val($('#CouponForm #availEdDay').val() + " " + $('#CouponForm #availEdHH').val() + ":" + $('#CouponForm #availEdMM').val() + ":59");
+			availStdt = $('#CouponForm input[name=availStDay]').val()+$('#CouponForm select[name=availStHH]').val()+$('#CouponForm select[name=availStMM]').val()+'00';
+			if($('#CouponForm select[name=availEdHH]').val() == "24"){
+				downEddt = $('#CouponForm input[name=availEdDay]').val()+'235959';
+			}else{
+				downEddt = $('#CouponForm input[name=availEdDay]').val()+$('#CouponForm select[name=availEdHH]').val()+$('#CouponForm select[name=availEdMM]').val()+'00';
+			}
+			availStdt = availStdt.replace(/[^0-9]/g, '');
+			availEddt = availEddt.replace(/[^0-9]/g, '');
+			$('#CouponForm #availStdt').val(downStdt);
+			$('#CouponForm #availEddt').val(downEddt);
 			$('#CouponForm #availDays').val('');
 		} else {
 			$('#CouponForm #availStdt').val('');
 			$('#CouponForm #availEddt').val('');
 		}
+
 		// 첫구매기간세팅
-		$('#CouponForm #buyStdt').val($('#CouponForm #buyStDay').val() + " " + $('#CouponForm #buyStHH').val() + ":" + $('#CouponForm #buyStMM').val() + ":00");
-		$('#CouponForm #buyEddt').val($('#CouponForm #buyEdDay').val() + " " + $('#CouponForm #buyEdHH').val() + ":" + $('#CouponForm #buyEdMM').val() + ":59");
+		let buyStdt = "";
+		let buyEddt = "";
+		buyStdt = $('#CouponForm input[name=buyStDay]').val()+$('#CouponForm select[name=buyStHH]').val()+$('#CouponForm select[name=buyStMM]').val()+'00';
+		if($('#CouponForm select[name=buyEdHH]').val() == "24"){
+			buyEddt = $('#CouponForm input[name=buyEdDay]').val()+'235959';
+		}else{
+			buyEddt = $('#CouponForm input[name=buyEdDay]').val()+$('#CouponForm select[name=buyEdHH]').val()+$('#CouponForm select[name=buyEdMM]').val()+'00';
+		}
+		buyStdt = buyStdt.replace(/[^0-9]/g, '');
+		buyEddt = buyEddt.replace(/[^0-9]/g, '');
+		$('#CouponForm #buyStdt').val(buyStdt);
+		$('#CouponForm #buyEddt').val(buyEddt);
+
 		// 신규회원기간 세팅
-		$('#CouponForm #custJoinStdt').val($('#CouponForm #custJoinStDay').val() + " " + $('#CouponForm #custJoinStHH').val() + ":" + $('#CouponForm #custJoinStMM').val() + ":00");
-		$('#CouponForm #custJoinEddt').val($('#CouponForm #custJoinEdDay').val() + " " + $('#CouponForm #custJoinEdHH').val() + ":" + $('#CouponForm #custJoinEdMM').val() + ":59");
+		let custJoinStdt = "";
+		let custJoinEddt = "";
+		custJoinStdt = $('#CouponForm input[name=custJoinStDay]').val()+$('#CouponForm select[name=custJoinStHH]').val()+$('#CouponForm select[name=custJoinStMM]').val()+'00';
+		if($('#CouponForm select[name=custJoinEdHH]').val() == "24"){
+			custJoinEddt = $('#CouponForm input[name=custJoinEdDay]').val()+'235959';
+		}else{
+			custJoinEddt = $('#CouponForm input[name=custJoinEdDay]').val()+$('#CouponForm select[name=custJoinEdHH]').val()+$('#CouponForm select[name=custJoinEdMM]').val()+'00';
+		}
+		custJoinStdt = custJoinStdt.replace(/[^0-9]/g, '');
+		custJoinEddt = custJoinEddt.replace(/[^0-9]/g, '');
+		$('#CouponForm #custJoinStdt').val(custJoinStdt);
+		$('#CouponForm #custJoinEddt').val(custJoinEddt);
 
 		// 할인쿠폰 유형에 따른 총 발행수량 수정 (주문서 쿠폰이고 난수쿠폰일 경우)
 		if($('#CouponForm #cpnType').val() == "G230_20" && $('#CouponForm input:radio[name="dcCdGb"]:checked').val() == "G233_20") {
@@ -1322,16 +1512,28 @@
 			$('input[name=rdoDcWay]').eq(0).attr("checked", true);
 			$('input[name=rdoApplyScope]').eq(0).attr("checked", true)
 			$('#CouponForm #availEdHH option:last').attr("selected", "selected");
-			$('#CouponForm #availEdMM option:last').attr("selected", "selected");
+			$('#CouponForm #availEdMM option').hide();
+			$('#CouponForm #availEdMM option:first').show().prop("selected", true);
 			$('#downEdHH option:last').attr("selected", "selected");
-			$('#downEdMM option:last').attr("selected", "selected");
+			$('#downEdMM option').hide();
+			$('#downEdMM option:first').show().prop("selected", true);
 			$('#custJoinEdHH option:last').attr("selected", "selected");
-			$('#custJoinEdMM option:last').attr("selected", "selected");
+			$('#custJoinEdMM option').hide();
+			$('#custJoinEdMM option:first').show().prop("selected", true);
 			$('#buyEdHH option:last').attr("selected", "selected");
-			$('#buyEdMM option:last').attr("selected", "selected");
+			$('#buyEdMM option').hide();
+			$('#buyEdMM option:first').show().prop("selected", true);
 			$("#CouponForm #afChannel option:first").attr("selected" , "selected");
 			$("#CouponForm .normalCol").attr("colspan", "5");
 			$("#CouponForm .randomCpnArea").hide();
+			$("#CouponForm .maxDcAmtArea").hide();
+			if($('input:radio[name="rdoCpnType"]:checked').val() == 'G230_10'){
+				$('#CouponForm .custJoinTr').hide();
+				$('#CouponForm .custJoinDateTr').hide();
+				$('#CouponForm .firstBuyTr').hide();
+				$('#CouponForm .buyDateTr').hide();
+				$('#CouponForm .dcCdCheck1').hide();
+			}
 		} else {
 			// 수정모드시 그리드 세팅
 			inComGridOptions.api.setRowData(cpnDtlBurdenList);
@@ -1355,16 +1557,16 @@
 			$("#CouponForm #usableCustGb").val(cpnDetail.usableCustGb).prop("selected", true);
 			$("#CouponForm #usableCustGrade").val(cpnDetail.usableCustGrade).prop("selected", true);
 			$("#CouponForm #endAlimYn").val(cpnDetail.endAlimYn).prop("selected", true);
-			$("#CouponForm #firstYn").val(cpnDetail.firstYn).prop("selected", true);
+			$("#CouponForm #firstOrdYn").val(cpnDetail.firstOrdYn).prop("selected", true);
 			$("#CouponForm #reissuance").val(cpnDetail.reissuance).prop("selected", true);
 			$("#CouponForm #dnGb").val(cpnDetail.dnGb).prop("selected", true);
 			$("#CouponForm #cpnStat").val(cpnDetail.cpnStat).prop("selected", true);
-			$("#CouponForm #custJoinYn").val(cpnDetail.custJoinYn).prop("selected", true);
+			$("#CouponForm #newCustYn").val(cpnDetail.newCustYn).prop("selected", true);
 			$("#CouponForm #pdGb").val(cpnDetail.pdGb).prop("selected", true);
 			$("#CouponForm #siteCd").val(cpnDetail.siteCd).prop("selected", true);
 			$("#CouponForm #afChannel").val(cpnDetail.afChannel).prop("selected", true);
 			$("#CouponForm #cpnNm").val(cpnDetail.cpnNm);
-			$("#CouponForm #downYn").val(cpnDetail.downYn);
+			$("#CouponForm #downAblYn").val(cpnDetail.downAblYn);
 			$("#CouponForm #buyLimitAmt").val(cpnDetail.buyLimitAmt);
 			$("#CouponForm #cpnId").val(cpnDetail.cpnId);
 
@@ -1380,6 +1582,25 @@
 			$("#CouponForm input[name='serialCpnQty']").prop("disabled", true);
 			$("#CouponForm input[name='randomCpnQty']").prop("disabled", true);
 
+			// 즉시할인 쿠폰이면
+			if(cpnDetail.cpnType == "G230_10") {
+				$('#CouponForm .custJoinTr').hide();
+				$('#CouponForm .custJoinDateTr').hide();
+				$('#CouponForm .firstBuyTr').hide();
+				$('#CouponForm .buyDateTr').hide();
+				$('#CouponForm .dcCdCheck1').hide();
+			}else{
+				$('#CouponForm .custJoinTr').show();
+				$('#CouponForm .custJoinDateTr').show();
+				$('#CouponForm .firstBuyTr').show();
+				$('#CouponForm .buyDateTr').show();
+				$('#CouponForm .dcCdCheck1').show();
+			}
+
+			// 할인방식이 할인율이면 최대할인금액 노출
+			if(cpnDetail.dcWay == "G240_11"){
+				$("#CouponForm .maxDcAmtArea").show();
+			}
 			// 주문서 쿠폰이면 할인쿠폰유형 노출
 			if(cpnDetail.cpnType == "G230_20") {
 				$("#CouponForm .dcCdGb").show();
@@ -1387,7 +1608,8 @@
 			// 할인코드유형이 일반유형이 아니면
 			if(cpnDetail.dcCdGb != "G233_00" ) {
 				$("#CouponForm .randomCpnTab").show();							// 시리얼 및 난수 TAB 노출
-				$("#CouponForm .dcCdCheck").hide();								// 총발행제한수량, 1회발행수량, 1인당발행제한수량 숨김
+				$("#CouponForm .dcCdCheck1").hide();								// 총발행제한수량, 1회발행수량, 1인당발행제한수량 숨김
+				$("#CouponForm .dcCdCheck2").hide();								// 총발행제한수량, 1회발행수량, 1인당발행제한수량 숨김
 				if(cpnDetail.dcCdGb == "G233_10") {		// 시리얼 유형
 					$("#CouponForm input[name='serialCpnQty']").val(cpnDetail.totPubLimitQty);
 					$("#CouponForm input[name='serialCpnNm']").val(cpnDetail.rdCpnNm);
@@ -1402,6 +1624,42 @@
 				}
 			}
 
+			// 쿠폰다운 날짜
+			let edDtArr = cpnDetail.downEddt.split(" ");
+			if(edDtArr[1] == "23:59:59") {
+				edHour = "24";
+				edMinute = "00";
+				$("#CouponForm #downEdMM option").hide();
+				$('#CouponForm #downEdMM option:first').show().prop("selected", true);
+			}
+
+			// 유효 날짜
+			let availEdDtArr = cpnDetail.availEddt.split(" ");
+			if(availEdDtArr[1] == "23:59:59") {
+				edHour = "24";
+				edMinute = "00";
+				$("#CouponForm #availEdMM option").hide();
+				$('#CouponForm #availEdMM option:first').show().prop("selected", true);
+			}
+
+			// 첫구매 날짜
+			let firstBuyEdDtArr = cpnDetail.buyEddt.split(" ");
+			if(firstBuyEdDtArr[1] == "23:59:59") {
+				edHour = "24";
+				edMinute = "00";
+				$("#CouponForm #buyEdMM option").hide();
+				$('#CouponForm #buyEdMM option:first').show().prop("selected", true);
+			}
+
+			// 신규가입 날짜
+			let custJoinEdDtArr = cpnDetail.custJoinEddt.split(" ");
+			if(custJoinEdDtArr[1] == "23:59:59") {
+				edHour = "24";
+				edMinute = "00";
+				$("#CouponForm #custJoinEdMM option").hide();
+				$('#CouponForm #custJoinEdMM option:first').show().prop("selected", true);
+			}
+
 			/*
 			$("#CouponForm input:checkbox[name='cpnCreateType']").parent("label").addClass("formControl");
 			$("#CouponForm input:checkbox[name='cpnCreateType']").parent("label").prop('disabled', true);
@@ -1418,18 +1676,18 @@
 				$("#CouponForm #usableCustGrade").attr('disabled', true);
 				$("#CouponForm #endAlimYn").attr('readonly', true);
 				$("#CouponForm #endAlimYn").attr('disabled', true);
-				$("#CouponForm #firstYn").attr('readonly', true);
-				$("#CouponForm #firstYn").attr('disabled', true);
+				$("#CouponForm #firstOrdYn").attr('readonly', true);
+				$("#CouponForm #firstOrdYn").attr('disabled', true);
 				$("#CouponForm #reissuance").attr('readonly', true);
 				$("#CouponForm #reissuance").attr('disabled', true);
 				$("#CouponForm #dnGb").attr('readonly', true);
 				$("#CouponForm #dnGb").attr('disabled', true);
-				$("#CouponForm #custJoinYn").attr('readonly', true);
-				$("#CouponForm #custJoinYn").attr('disabled', true);
+				$("#CouponForm #newCustYn").attr('readonly', true);
+				$("#CouponForm #newCustYn").attr('disabled', true);
 				$("#CouponForm #pdGb").attr('readonly', true);
 				$("#CouponForm #pdGb").attr('disabled', true);
-				$("#CouponForm #downYn").attr('readonly', true);
-				$("#CouponForm #downYn").attr('disabled', true);
+				$("#CouponForm #downAblYn").attr('readonly', true);
+				$("#CouponForm #downAblYn").attr('disabled', true);
 				$("#CouponForm #siteCd").attr('readonly', true);
 				$("#CouponForm #siteCd").attr('disabled', true);
 				$("#CouponForm #cpnNm").attr('readonly', true);
@@ -1487,7 +1745,7 @@
 
 			}
 			// 첫구매여부 적용하는 경우 날짜 세팅
-			if (cpnDetail.firstYn == "Y") {
+			if (cpnDetail.firstOrdYn == "Y") {
 				splitDate("start", cpnDetail.buyStdt, "buy");
 				splitDate("end", cpnDetail.buyEddt, "buy");
 				if(issueCnt > 0) {
@@ -1500,7 +1758,7 @@
 				}
 			}
 			// 신규회원여부 적용하는 경우 날짜 세팅
-			if (cpnDetail.custJoinYn == "Y") {
+			if (cpnDetail.newCustYn == "Y") {
 				splitDate("start", cpnDetail.custJoinStdt, "custJoin");
 				splitDate("end", cpnDetail.custJoinEddt, "custJoin");
 				if(issueCnt > 0) {
@@ -1515,8 +1773,8 @@
 		}
 		// 기본세팅
 		pdGbChange();
-		firstYnChange();
-		custJoinYnChange();
+		firstOrdYnChange();
+		newCustYnChange();
 		fnChangeAfLinkCdList();
 
 		// 제휴채널2뎁스 기본세팅

+ 1 - 1
src/main/webapp/WEB-INF/views/marketing/FreeGoodsPromotionForm.html

@@ -22,7 +22,7 @@
 		<!-- 메뉴 설명 -->
 		<div class="infoBox menu-desc"></div>
 
-		<form id="searchForm" name="searchForm" action="#" th:action="@{'/marketing/freeGoodsPromotion/list'}">
+		<form id="searchForm" name="searchForm" action="#" th:action="@{'/marketing/freegoods/promotion/list'}">
 			<input type="hidden" id="searchGb" name="searchGb" />
 			<input type="hidden" id="imageViewYn" name="imageViewYn" />
 			<input type="hidden" id="goodsPriceYn" name="goodsPriceYn" value="Y"/> <!-- 즉시할인판매가 조회 -->

+ 5 - 5
src/main/webapp/WEB-INF/views/marketing/FreeGoodsPromotionRegiForm.html

@@ -595,7 +595,7 @@
 		params.gbn = $('#freeGoodsPromotionForm input[name=gbn]').val();
 		params.freegiftSq = $('#freeGoodsPromotionForm input[name=freegiftSq]').val();
 
-		cfnAjaxSubmit("/marketing/freeGoodsPromotion/detail", "json", fnFreeGoodsPromotionSearchCallback, params);
+		cfnAjaxSubmit("/marketing/freegoods/promotion/detail", "json", fnFreeGoodsPromotionSearchCallback, params);
 	}
 
 	$(document).ready(function() {
@@ -887,7 +887,7 @@
 		};
 
 		var jsonData = JSON.stringify(data);
-		gagajf.ajaxJsonSubmit('/marketing/freeGoodsPromotion/save', jsonData, fnFreeGoodsPromotionSaveFin);
+		gagajf.ajaxJsonSubmit('/marketing/freegoods/promotion/save', jsonData, fnFreeGoodsPromotionSaveFin);
 	});
 
 	// 할인방식 변경
@@ -915,7 +915,7 @@
 						, freegiftSq : $("#freeGoodsPromotionForm input[name=freegiftSq]").val()
 					}
 					var jsonData = JSON.stringify(data);
-					gagajf.ajaxJsonSubmit('/marketing/freeGoodsPromotion/changeStat', jsonData, fnFreeGoodsPromotionSaveFin);
+					gagajf.ajaxJsonSubmit('/marketing/freegoods/promotion/change/stat', jsonData, fnFreeGoodsPromotionSaveFin);
 				}
 			}
 		});
@@ -932,7 +932,7 @@
 						, freegiftSq: $("#freeGoodsPromotionForm input[name=freegiftSq]").val()
 					}
 					var jsonData = JSON.stringify(data);
-					gagajf.ajaxJsonSubmit('/marketing/freeGoodsPromotion/changeStat', jsonData, function() {
+					gagajf.ajaxJsonSubmit('/marketing/freegoods/promotion/change/stat', jsonData, function() {
 						uifnPopupClose('popupFreeGoodsPromotionRegi');
 					});
 				}
@@ -951,7 +951,7 @@
 						, freegiftSq: $("#freeGoodsPromotionForm input[name=freegiftSq]").val()
 					}
 					var jsonData = JSON.stringify(data);
-					gagajf.ajaxJsonSubmit('/marketing/freeGoodsPromotion/changeStat', jsonData, fnFreeGoodsPromotionSaveFin);
+					gagajf.ajaxJsonSubmit('/marketing/freegoods/promotion/change/stat', jsonData, fnFreeGoodsPromotionSaveFin);
 				}
 			}
 		});

+ 17 - 4
src/main/webapp/WEB-INF/views/marketing/MailHeaderFooterDetailForm.html

@@ -137,7 +137,9 @@
 		<!-- 버튼 배치 영역 -->
 		<ul class="panelBar">
 			<li class="right">
-				<button type="button" class="btn btn-info btn-lg" id="btnSaveFaq">저장</button>
+				<button type="button" class="btn btn-warning btn-lg" id="btnCancleMailHF">취소</button>
+				<button type="button" class="btn btn-info btn-lg" id="btnSaveMailHF">저장</button>
+				<button type="button" class="btn btn-danger btn-lg" id="btnDeleteMailHF">삭제</button>
 			</li>
 		</ul>
 		<!-- //버튼 배치 영역 -->
@@ -148,18 +150,24 @@
 <script type="text/javascript" src="/ux/plugins/gaga/gaga.summernote.js?v=20201030"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
+	//취소버튼
+	$('#btnCancleMailHF').on('click', function() {
+		uifnPopupClose('popupMailHF');	
+	});
+	
+	
 	// 저장
-	$('#btnSaveFaq').on('click', function() {
+	$('#btnSaveMailHF').on('click', function() {
 		// 입력 값 체크
 		if (!gagajf.validation('#MailHFForm'))
 			return false;
 		
 		if (gagajf.isNull($('#mailhfContent').val())) {
-			mcxDialog.alert('답변을 입력해 주세요.');
+			mcxDialog.alert('내용을 입력해 주세요.');
 			return false;
 		}
 		
-		mcxDialog.confirm("저장하시겠습니까?", {
+		mcxDialog.confirm("내용을 등록 하시겠습니까?", {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
 			sureBtnClick: function() {
@@ -171,6 +179,11 @@
 		});
 	});
 	
+	//삭제 버튼
+	$('#btnDeleteMailHF').on('click', function() {
+			
+	});
+	
 	$(document).ready(function() {
 		// Create a summernote
 		let snOptions = gagaSn.getToolbarOptions();

+ 2 - 2
src/main/webapp/WEB-INF/views/marketing/MailHeaderFooterForm.html

@@ -31,8 +31,8 @@
 			<!-- 버튼 배치 영역 -->
 			<ul class="panelBar">
 				<li class="right">
-					<button type="button" class="btn btn-info btn-lg" onclick="fnOpenMailHFPopup('N');">등록</button>
-					<button type="button" class="btn btn-danger btn-lg" id="btnDeleteRow">선택 삭제</button>				
+					<button type="button" class="btn btn-danger btn-lg" id="btnDeleteRow">선택삭제</button>	
+					<button type="button" class="btn btn-info btn-lg" onclick="fnOpenMailHFPopup('N');">메일등록</button>
 				</li>
 			</ul>
 			<!-- //버튼 배치 영역 -->

+ 49 - 30
src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html

@@ -61,12 +61,12 @@
 						<td>
 							<input type="hidden" name="tmtbStdt" id="tmtbStdt" required="required" data-valid-name="다다익선시작일시">
 							<input type="text" class="schDate w100" name="eventStdt" id="eventStdt" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
-							<select name="eventStHH" data-valid-name="다다익선시작(시)" style="width: 65px;"> <!--th:disabled="${mode == 'U'}"-->
+							<select name="eventStHH" id="eventStHH" data-valid-name="다다익선시작(시)" style="width: 65px;"> <!--th:disabled="${mode == 'U'}"-->
 								<th:block th:each="num, index : ${#numbers.sequence(0,23)}">
 									<option  th:value="${#numbers.formatInteger(num,2)}" th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="${tmtbMstInfo.eventStHH == #numbers.formatInteger(num,2)}">시간</option>
 								</th:block>
 							</select>
-							<select name="eventStMM" data-valid-name="다다익선시작(분)" style="width: 65px;">
+							<select name="eventStMM" id="eventStMM" data-valid-name="다다익선시작(분)" style="width: 65px;">
 								<th:block th:each="num, index : ${#numbers.sequence(0,59)}">
 									<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}분|" th:selected="${tmtbMstInfo.eventStMM == #numbers.formatInteger(num,2)}">분</option>
 								</th:block>
@@ -76,12 +76,13 @@
 						<td>
 							<input type="hidden" name="tmtbEddt" id="tmtbEddt" required="required" data-valid-name="다다익선종료일시">
 							<input type="text" class="schDate w100" name="eventEddt" id="eventEddt" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
-							<select name="eventEdHH" data-valid-name="다다익선종료(시)" style="width: 65px;">
+							<select name="eventEdHH" id="eventEdHH" data-valid-name="다다익선종료(시)" style="width: 65px;">
 								<th:block th:each="num, index : ${#numbers.sequence(0,23)}">
 									<option  th:value="${#numbers.formatInteger(num,2)}" th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="${tmtbMstInfo.eventEdHH == #numbers.formatInteger(num,2)}">시간</option>
 								</th:block>
+								<option th:text="24시" th:value="24"></option>
 							</select>
-							<select name="eventEdMM" data-valid-name="다다익선종료(분)" style="width: 65px;">
+							<select name="eventEdMM" id="eventEdMM" data-valid-name="다다익선종료(분)" style="width: 65px;">
 								<th:block th:each="num, index : ${#numbers.sequence(0,59)}">
 									<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}분|" th:selected="${tmtbMstInfo.eventEdMM == #numbers.formatInteger(num,2)}">분</option>
 								</th:block>
@@ -526,6 +527,15 @@
 			$("input:radio[name='dcWay']:radio[value="+tmtbMstInfo.dcWay+"]").prop('checked', true); // 선택하기
 			$("input:radio[name='multiYn']:radio[value="+tmtbMstInfo.multiYn+"]").prop('checked', true); // 선택하기
 
+			let edDtArr = tmtbMstInfo.tmtbEddt.split(" ");
+			if(edDtArr[1] == "23:59:59") {
+				edHour = "24";
+				edMinute = "00";
+				$('#moreBetterForm #eventEdHH option:last').show().prop("selected", true);
+				$("#moreBetterForm #eventEdMM option").hide();
+				$('#moreBetterForm #eventEdMM option:first').show().prop("selected", true);
+			}
+
 			if(tmtbMstInfo.tmtbStat == "G232_10"){
 				$("#btnMorebetterSave").show();		// 저장버튼
 				$("#btnChangeStatIng").show();		// 진행버튼
@@ -540,11 +550,27 @@
 		if(mode=="N"){
 			$("input:radio[name='disTmtbStat']:radio[value='G232_10']").prop('checked', true); // 선택하기
 			$("#btnMorebetterSave").show();	// 저장버튼
+
+			if(tmtbMstInfo.eventEdHH == "24"){
+				$("#moreBetterForm #eventEdHH option:last").show().prop("selected", true);
+				$("#moreBetterForm #eventEdMM option").hide();
+				$('#moreBetterForm #eventEdMM option:first').show().prop("selected", true);
+			}
 		}
 		//cfnCreateCalendar('#tmtbTerms', 'tmtbStdt', 'tmtbEddt', true, '행사기간', 'X');
 		cfnCreateCalendar('#tmtbTerms', 'eventStdt', 'eventEddt', true, '행사기간', 'X');
 	});
 
+	// 종료시간 클릭 시
+	$("#moreBetterForm #eventEdHH").bind('click change', function () {
+		if(this.value == 24) {
+			$("#moreBetterForm #eventEdMM option").hide();
+			$('#moreBetterForm #eventEdMM option:first').show().prop("selected", true);
+		} else {
+			$("#moreBetterForm #eventEdMM option").show();
+		}
+	});
+
 	var fnGoodsGbCheck = function (){
 		let applyGoodsData = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList);
 		var checkCnt = 0;
@@ -585,14 +611,18 @@
 			$('#moreBetterForm input[name=tmtbStdt]').focus();
 			return false;
 		}
+		var eventStDt = "";
+		var eventEdDt = "";
 
-		var eventStDt = $('#moreBetterForm input[name=eventStdt]').val()+$('#moreBetterForm select[name=eventStHH]').val()+$('#moreBetterForm select[name=eventStMM]').val()+'00';
-		var eventEdDt = $('#moreBetterForm input[name=eventEddt]').val()+$('#moreBetterForm select[name=eventEdHH]').val()+$('#moreBetterForm select[name=eventEdMM]').val()+'59';
+		eventStDt = $('#moreBetterForm input[name=eventStdt]').val()+$('#moreBetterForm select[name=eventStHH]').val()+$('#moreBetterForm select[name=eventStMM]').val()+'00';
+		if($('#moreBetterForm select[name=eventEdHH]').val() == "24"){
+			eventEdDt = $('#moreBetterForm input[name=eventEddt]').val()+'235959';
+		}else{
+			eventEdDt = $('#moreBetterForm input[name=eventEddt]').val()+$('#moreBetterForm select[name=eventEdHH]').val()+$('#moreBetterForm select[name=eventEdMM]').val()+'00';
+		}
 
 		eventStDt = eventStDt.replace(/[^0-9]/g, '');
 		eventEdDt = eventEdDt.replace(/[^0-9]/g, '');
-		console.log('2.eventStDt>>'+eventStDt);
-		console.log('3.eventEdDt>>'+eventEdDt);
 
 		let fromDate = $('#moreBetterForm input[name=tmtbStdt]').val(eventStDt);
 		let toDate = $('#moreBetterForm input[name=tmtbEddt]').val(eventEdDt);
@@ -611,19 +641,6 @@
 		let allApplyBurdenData = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList);
 		let allSectionGbData = gagaAgGrid.getAllRowData(gridOptionsSectionGbList);
 
-		if(allSupplyCompData.length > 0){
-			if(allBrandData.length < 1){
-				mcxDialog.alert('브랜드를 추가해주세요.');
-				return;
-			}
-		}
-		if(allBrandData.length > 0){
-			if(allSupplyCompData.length < 1){
-				mcxDialog.alert('공급업체를 추가해주세요.');
-				return;
-			}
-		}
-
 		if(allSectionGbData.length < 1){
 			mcxDialog.alert("할인구간을 설정해주세요.");
 			return false;
@@ -685,16 +702,18 @@
 	});
 
 	var fnMorebetterSaveCollback = function(result){
-		console.log('duplicateYn::::'+result.duplicateYn);
+		mcxDialog.alert(result.message);
+
 		if(result.duplicateYn == "Y"){
-			console.log('duplicateGoodsList Size::'+ result.duplicateGoodsList.length);
+			//console.log('duplicateGoodsList Size::'+ result.duplicateGoodsList.length);
 			for(let i=0; i<result.duplicateGoodsList.length; i++){
 				gagaAgGrid.addRowData(gridOptionsDuplicateGoodsList, {"goodsCd" : result.duplicateGoodsList[i].goodsCd, "goodsNm" : result.duplicateGoodsList[i].goodsNm});
 			}
 			mcxDialog.alert("다른 다다익선에서 사용중인 상품이 존재합니다.");
 			gagaAgGrid.exportToExcel('다다익선 중복상품 목록', gridOptionsDuplicateGoodsList);
-
-			return;
+			fnMorebetterFormClose();
+			$('#btnInit').trigger('click');
+			$('#btnSearch').trigger('click');
 		}else{
 			//mcxDialog.alert(result.message);
 			fnMorebetterFormClose();
@@ -722,11 +741,11 @@
 		}
 
 		// 브랜드 데이터 체크
-		let allBrandCnt = gagaAgGrid.getAllRowData(gridOptionsFGBrandList).length;
+		/*let allBrandCnt = gagaAgGrid.getAllRowData(gridOptionsFGBrandList).length;
 		if(allBrandCnt<1){
 			mcxDialog.alert('브랜드를 추가해주세요.');
 			return;
-		}
+		}*/
 	};
 
 	// 브랜드 설정 / 브랜드 추가 콜백함수 (단수로 가져오므로 복수일 경우에 수정 확인 필요)
@@ -746,13 +765,13 @@
 		}
 
 		// 공급업체 데이터 체크
-		var allSupplyCompData = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList);
+		/*var allSupplyCompData = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList);
 		var allBrandData = gagaAgGrid.getAllRowData(gridOptionsFGBrandList);
 
 		if(allSupplyCompData.length < 1){
 			mcxDialog.alert('공급업체를 추가해주세요.');
 			return;
-		}
+		}*/
 	};
 
 	// 분담업체율 설정 / 업체 추가 콜백함수
@@ -824,7 +843,7 @@
 
 	// 공급업체 설정 업체 추가 버튼 클릭시
 	$('#moreBetterForm #btnAddCompany').on('click', function() {
-		cfnOpenCompanyListPopup("fnSetPopupComapnyInfo");
+		cfnOpenCompanyListPopup("fnSetPopupComapnyInfo", "M");
 	});
 
 	// 브랜드 추가 버튼 클릭시 (복수 브랜드때 수정 필요)

+ 19 - 8
src/main/webapp/WEB-INF/views/marketing/PointGrantPopupForm.html

@@ -38,31 +38,31 @@
 						<tr >
 							<th>사이트</th>
 							<td>
-								<select name="siteCd" data-valid-name="사이트" required>
-									<option th:if="${siteCdList}" th:each="oneData, status : ${siteCdList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+								<select name="siteCd" data-valid-name="사이트" required="required">
+									<option th:if="${siteCdList}" th:each="oneData, status : ${siteCdList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] '+ oneData.cdNm}"></option>
 								</select>
 							</td>
 						</tr>
 						<tr>
 							<th>포인트변경사유<em class="required" title="필수"></em></th>
 							<td>
-								<select name="occurGb" data-valid-name="포인트변경사유" required>
+								<select name="occurGb" data-valid-name="포인트변경사유" required="required">
 									<option value="">선택하세요</option>
-									<option th:if="${occurGbList}" th:each="oneData, status : ${occurGbList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+									<option th:if="${occurGbList}" th:each="oneData, status : ${occurGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] '+ oneData.cdNm}"></option>
 								</select>
 							</td>
 						</tr>
 						<tr>
 							<th>증감구분<em class="required" title="필수"></em></th>
 							<td>
-								<select name="signGb" data-valid-name="증감구분" required>
+								<select id="signGb" name="signGb" data-valid-name="증감구분" required="required">
 									<option value="">선택하세요</option>
 									<option value="+">증가</option>
 									<option value="-">감소</option>
 								</select>
 							</td>
 						</tr>
-						<tr class="expire">
+						<tr id="expire">
 							<th >만료일자</th>
 							<td>
 								<input type="text" name="expBeDt" th:value="${expBeDt}" class="schDate w100"/>
@@ -71,13 +71,13 @@
 						<tr>
 							<th>적립포인트</th>
 							<td>
-								<input type="text" name="pntAmt" min="1" data-valid-name="적립포인트" data-valid-type="integer" maxlength="6" required/>
+								<input type="text" name="pntAmt" min="1" data-valid-name="적립포인트" data-valid-type="integer" maxlength="6" required="required"/>
 							</td>
 						</tr>
 						<tr>
 							<th>상세사유</th>
 							<td colspan="3">
-								<textarea name="occurDtlDesc" class="textareaR4" style="resize: none;" data-valid-name="상세사유" required></textarea>
+								<textarea name="occurDtlDesc" class="textareaR4" style="resize: none;" data-valid-name="상세사유" required="required"></textarea>
 							</td>
 						</tr>
 						</tbody>
@@ -95,9 +95,19 @@
 </div>
 <script th:inline="javascript">
 	/*<![CDATA[*/
+	const END_TIME = '23:59:59';
 	const elementCustNo = [[${elementCustNo}]];
 	const pntAssignAmt = [[${pntAssignAmt}]];
 
+	$('#signGb').on('change',function () {
+		let signGb = $(this).val();
+		if (signGb === '+') {
+			$('#expire').show();
+		} else {
+			$('#expire').hide();
+		}
+	});
+
 	// 포인트 부여
 	$('#btnSavePoint').on('click', function () {
 		if(!gagajf.validation('#pointGrantForm'))
@@ -124,6 +134,7 @@
 		// (+ + 1) -> 1, (- + 1) -> -1
 		let pntAmt = grantPoint.pntAmt * (grantPoint.signGb + 1)
 		grantPoint.pntAmt = pntAmt;
+		grantPoint.expBeDt = grantPoint.expBeDt+' '+END_TIME;
 
 		mcxDialog.confirm("포인트를 부여하시겠습니까?", {
 			cancelBtnText: "취소",

+ 159 - 102
src/main/webapp/WEB-INF/views/order/CnclReqForm.html

@@ -23,21 +23,24 @@
 		<div class="panelContent" style="height:90%; overflow-y:auto; padding:0px 20px !important; ">
 			<form id="cancelRequestFrm" name="cancelRequestFrm" action="/orderChange/cancel" method="post" target="hdFrameForOrderCancel">
 				<input type="hidden" name="ordNo" th:value="${ordNo}"/>
+				<input type="hidden" name="ordChgSq" th:value="${ordChgSq}"/>
 				<input type="hidden" name="chgReason" value=""/>
 				<input type="hidden" name="chgReasonDesc" value=""/>
 				
 				<h4>주문정보</h4>
 				<div id="gridOrderCancelRequestList" style="width:100%; height: 200px;" class="ag-theme-balham"></div>
 
-				<h4>취소정보</h4>
+				<h4 id="h4OrderCancelRequestToBeList">취소정보</h4>
 				<div id="gridOrderCancelRequestToBeList" style="width:100%; height: 200px;" class="ag-theme-balham"></div>
 				
-				<h4>배송비정보</h4>
+				<h4 id="h4DelvCdList">배송비정보</h4>
 				<div id="gridDelvCdList" style="width:100%; height: 140px;" class="ag-theme-balham"></div>
 				
 				<div style="text-align:right; padding-bottom:5px; padding-top:5px;">
-					<button type="button" class="btn btn-success" onclick="fnCnclReq('cnclReq');">취소신청</button>
-					<button type="button" class="btn btn-success" onclick="fnCnclReq('cnclComplete');">취소완료</button>
+					<button type="button" class="btn btn-success" id="cnclReqBtn" onclick="fnCnclReq('cnclReq');">취소신청</button>
+					<button type="button" class="btn btn-success" id="cnclCompleteBtn" onclick="fnCnclReq('cnclComplete');">취소완료</button>
+					<button type="button" class="btn btn-success" id="cnclReqCancelBtn" onclick="fnCnclReq('cnclReqCancel');">취소철회</button>
+					<button type="button" class="btn btn-success" id="cnclReqCompleteBtn" onclick="fnCnclReq('cnclReqComplete');">취소승인</button>
 				</div>
 				
 				<table class="frmStyle">
@@ -53,7 +56,7 @@
 							<td>
 								<select name="selectChgReason" onchange="fnChangeChgReason($(this).val());">
 									<option value="">[선택하세요]</option>
-									<option th:if="${chgReasonList}" th:each="oneData, status : ${chgReasonList}" th:value="|${oneData.cd}:${oneData.cdNm}|" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+									<option th:if="${chgReasonList}" th:each="oneData, status : ${chgReasonList}" th:value="|${oneData.cd}|" th:text="|${oneData.cdNm}|"></option>
 								</select>
 							</td>
 							<th>귀책사유</th>
@@ -135,13 +138,23 @@
 /*<![CDATA[*/
 var cancelRequestTargetList = [[${cancelRequestTargetList}]];				// 취소대상목록
 var ordNo 					= [[${ordNo}]];									// 주문번호
+var ordChgSq 				= [[${ordChgSq}]];								// 주문변경번호
 var orderInfoList 			= [[${orderInfoList}]];							// 주문기본정보
+var orderChangeDetailList 	= [[${orderChangeDetailList}]];					// 취소/반품/교환요청 정보
 var payMeans 				= orderInfoList[0].payMeans;					// 결제수단
+var chgReason				= "";											// 변경사유코드
+var chgMemo					= "";											// 변경사유메모
+
+// 변경요청정보 승인, 철회
+if (ordChgSq > 0) {
+	chgReason				= orderChangeDetailList[0].chgReason;			// 변경사유코드
+	chgMemo					= orderChangeDetailList[0].chgMemo;				// 변경사유메모
+}
 
 var temp1 = true;
-var temp2 = false;
+var temp2 = true;
 
-// 1. 주문정보(반품대상)
+// 1. 주문정보(변경요청가능대상)
 var columnCancelReqList = [
 	{
 		headerName	: "주문상세정보",
@@ -223,21 +236,29 @@ var columnCancelReqList = [
 					var ordQty 			= parseInt(params.data.ordQty);
 					var cnclRtnQty 		= parseInt(params.data.cnclRtnQty);
 					var ordReqChgQty 	= parseInt(params.data.ordReqChgQty);
-					var ordCanChgQty 	= ordQty - (cnclRtnQty +  ordReqChgQty);
+					var ordCanChgQty 	= parseInt(params.value);
+					var rtnStr 			= "";
 					
-					var strVal 			= "";
-					strVal += "<select class='ordCanChgQty' name='ordCanChgQty' ordDtlNo='"+params.data.ordDtlNo+"' onChange='fnCalculateRefundAmt(this);'>";
-					
-					for (i=0 ; i<=ordCanChgQty ; i++) {
-						if (i == params.data.ordCanChgQty) {
-							strVal += "	<option value='"+i+"' selected>"+i+"</option>";
-						} else {
-							strVal += "	<option value='"+i+"'>"+i+"</option>";
+					// 취소신청가능수량있으면 수량만 표시 (취소,반품,교환 신청정보 처리)
+					if (ordChgSq > 0) {
+						rtnStr = ordCanChgQty;
+					} else {
+						ordCanChgQty 	= ordQty - (cnclRtnQty +  ordReqChgQty);
+						
+						rtnStr += "<select class='ordCanChgQty' name='ordCanChgQty' ordDtlNo='"+params.data.ordDtlNo+"' onChange='fnCalculateRefundAmt(this);'>";
+						
+						for (i=0 ; i<=ordCanChgQty ; i++) {
+							if (i == params.data.ordCanChgQty) {
+								rtnStr += "	<option value='"+i+"' selected>"+i+"</option>";
+							} else {
+								rtnStr += "	<option value='"+i+"'>"+i+"</option>";
+							}
 						}
+					
+						rtnStr += "</select>";
 					}
-				
-					strVal += "</select>";
-					return strVal;
+					
+					return rtnStr;
 				}
 			}
 		]
@@ -785,7 +806,7 @@ var isCustomer = true;
 
 // 취소정보계산
 var fnCalculateRefundAmt = function (obj) {
-	// 취소정보담은목록
+	// 변경신청목록
 	var cancelRequestTargetToBeList = [];
 
 	if (obj != null) {
@@ -797,7 +818,7 @@ var fnCalculateRefundAmt = function (obj) {
 				cancelRequestTargetList[i].ordCanChgQty = ordCanChgQty;
 			}
 		}
-		// 주문정보 다시 셋팅 (체크해봐야할문제)
+		// 주문변경대상정보 재설정
 		gridOptionsCancelReqList.api.setRowData(cancelRequestTargetList);
 	}
 	
@@ -862,86 +883,88 @@ var fnCalculateRefundAmt = function (obj) {
 
 //  사유
 var fnChangeChgReason = function(reasonCd){
-	var arrReasonCd = reasonCd.split(":");
 	var customerReasonArr = ['G686_10'];
 
 	isCustomer = false;
 	
-	// 취소, 반품, 교환 사유 판단
+	// 귀책사유체크(취소,반품,교환)
 	for (i=0 ; i<customerReasonArr.length ; i++) {
-		if (customerReasonArr[i] == arrReasonCd[0]) {
+		if (customerReasonArr[i] == reasonCd) {
 			isCustomer = true;
 		}
 	}
 	
-	// 귀책사유설정 회사, 고객
+	// 귀책사유체크(회사,고객)
 	if (isCustomer) {
 		$("#imputeReason").text("고객");
 	} else {
 		$("#imputeReason").text("회사");
 	}
 
-	$('#cancelRequestFrm input[name=chgReason]').val(arrReasonCd[0]);
-	$('#cancelRequestFrm input[name=chgReasonDesc]').val(arrReasonCd[1]);
-
-	fnCalculateRefundAmt();			//환불예정금액 계산.
+	$('#cancelRequestFrm input[name=chgReason]').val(reasonCd);
+	
+	//환불예정금액 계산
+	fnCalculateRefundAmt();
 }
 
 // 취소신청/완료
 var fnCnclReq = function (reqGbn) {
-	
 	var temp 		= false;
-	var ordDtlStat	= cancelRequestTargetList[0].ordDtlStat; 
+	var ordDtlStat	= cancelRequestTargetList[0].ordDtlStat;
 	var allCanYn 	= "N";
 	
-	// 1. 취소수량 체크
-	for (i=0 ; i<cancelRequestTargetList.length ; i++) {		
-		if (cancelRequestTargetList[i].ordCanChgQty > 0) {
-			temp = true;
-		}
-	}
-	
-	if (temp == false) {
-		mcxDialog.alert('취소신청수량을 입력하세요.');
-		return;
-	}
-	
-	// 2. 입금대기건 & 전체취소 체크
-	if (ordDtlStat == "G013_10" && $("#spanPayAmt").text() != $("#spanRefundAmt").text()) {
-		alert("입금대기건은 전체 취소만 가능합니다.");
-		return;
-	}
-	
-	// 2.1 전체취소 여부 적용
-	if (ordDtlStat == "G013_10" && $("#spanPayAmt").text() == $("#spanRefundAmt").text()) {
-		allCanYn = "Y";	
-	}
-	
-	// 3. 취소사유 체크
-	var chgReason = $("#cancelRequestFrm select[name=selectChgReason]").val();
-	
-	if (gagajf.isNull(chgReason)) {
-		mcxDialog.alert("취소사유를 입력하세요."); 
-		return ;
-	}
-	
-	// 4. 환불계좌 체크
 	var accountNo 	= "";
 	var accountNm 	= "";
 	var bankCd 		= "";
 	
-	// 결제타입 무통장입금시 환불계좌 등록
-	if (payMeans == 'G014_20') {
-		var refundAccount = gridOptionsRefundAccountInfo.api.getSelectedRows();
+	if (reqGbn == "cnclReq" || reqGbn == "cnclComplete") {
+		// 1. 취소수량 체크
+		for (i=0 ; i<cancelRequestTargetList.length ; i++) {		
+			if (cancelRequestTargetList[i].ordCanChgQty > 0) {
+				temp = true;
+			}
+		}
+		
+		if (temp == false) {
+			mcxDialog.alert('취소신청수량을 입력하세요.');
+			return;
+		}
 		
-		if (refundAccount.length == 0) {
-			mcxDialog.alert('선택된 행이 없습니다.');
+		// 2. 입금대기건 & 전체취소 체크
+		if (ordDtlStat == "G013_10" && $("#spanPayAmt").text() != $("#spanRefundAmt").text()) {
+			alert("입금대기건은 전체 취소만 가능합니다.");
 			return;
 		}
 		
-		accountNo 	= refundAccount[0].accountNo;
-		accountNm 	= refundAccount[0].accountNm;
-		bankCd 		= refundAccount[0].bankCd;
+		// 2.1 전체취소 여부 적용
+		if (ordDtlStat == "G013_10" && $("#spanPayAmt").text() == $("#spanRefundAmt").text()) {
+			allCanYn = "Y";	
+		}
+		
+		// 3. 취소사유 체크
+		var chgReason = $("#cancelRequestFrm select[name=selectChgReason]").val();
+		
+		if (gagajf.isNull(chgReason)) {
+			mcxDialog.alert("취소사유를 입력하세요."); 
+			return ;
+		}
+		
+		// 4. 환불계좌 체크
+		// 결제타입 무통장입금시 환불계좌 등록
+		if (payMeans == 'G014_20') {
+			var refundAccount = gridOptionsRefundAccountInfo.api.getSelectedRows();
+			
+			if (refundAccount.length == 0) {
+				mcxDialog.alert('선택된 행이 없습니다.');
+				return;
+			}
+			
+			accountNo 	= refundAccount[0].accountNo;
+			accountNm 	= refundAccount[0].accountNm;
+			bankCd 		= refundAccount[0].bankCd;
+		}
+	} else {
+		
 	}
 	
 	// 5. 추가정보설정
@@ -950,49 +973,57 @@ var fnCnclReq = function (reqGbn) {
 	var chgerPhnno 	= orderInfoList[0].ordPhnno;
 	var chgerTelno 	= orderInfoList[0].ordTelno;
 
+	// 2021.01.26 화면통합
 	// 6. 취소신청, 취소완료 여부 체크
-	// 취소완료
-	if (reqGbn == "cnclComplete") {
-		cnclUrl = '/orderChange/cnclComplete/';
-	}
 	// 취소신청
-	else if (reqGbn == "cnclReq") {
-		cnclUrl = '/orderChange/cnclReq/';
+	if (reqGbn == "cnclReq") {
+		confirmStr 		= "취소신청하시겠습니까?";
+		cnclUrl 		= '/orderChange/cnclComplete/';
 	}
-	// 취소신청완료
+	// 취소완료
+	else if (reqGbn == "cnclComplete") {
+		confirmStr 		= "취소완료하시겠습니까?";
+		cnclUrl 		= '/orderChange/cnclComplete/';
+	}
+	// 취소신청승인
 	else if (reqGbn == "cnclReqComplete") {
-		cnclUrl = '/orderChange/cnclReqComplete/';
+		confirmStr 		= "요청번호 [" + ordChgSq + "] 에 대한 취소승인 처리를 하시겠습니까?";
+		cnclUrl 		= '/orderChange/cnclComplete/';
+	}
+	// 취소신청철회
+	else if (reqGbn == "cnclReqCancel") {
+		confirmStr 		= "요청번호 [" + ordChgSq + "] 에 대한 요청철회 처리를 하시겠습니까?";
+		cnclUrl 		= '/orderChange/cnclReqCancel/';
 	}
 
-	// 2021.01.26 화면통합
-	cnclUrl = '/orderChange/cnclComplete/';
-	
 	var jsonObj = {
-			"ordNo"				: $('#cancelRequestFrm input[name=ordNo]').val()
-			,"chgReason" 		: $('#cancelRequestFrm input[name=chgReason]').val()
-			,"chgMemo"			: $('#chgMemo').val()
-			,"cancelReqList" 	: cancelRequestTargetList
-			,"accountNo" 		: accountNo
-			,"accountNm" 		: accountNm
-			,"bankCd" 			: bankCd
-			,"allCanYn" 		: allCanYn
-			,"isCustomer" 		: isCustomer
-			,"chgerNm"			: chgerNm
-			,"chgerEmail"		: chgerEmail
-			,"chgerZipcode"		: ""
-			,"chgerBaseAddr"	: ""
-			,"chgerDtlAddr"		: ""
-			,"chgerPhnno"		: chgerPhnno
-			,"chgerTelno"		: chgerTelno
-			,"reqGbn"			: reqGbn
-		}
+		"ordNo"				: $('#cancelRequestFrm input[name=ordNo]').val()
+		,"chgReason" 		: $('#cancelRequestFrm input[name=chgReason]').val()
+		,"chgMemo"			: $('#chgMemo').val()
+		,"cancelReqList" 	: cancelRequestTargetList
+		,"accountNo" 		: accountNo
+		,"accountNm" 		: accountNm
+		,"bankCd" 			: bankCd
+		,"allCanYn" 		: allCanYn
+		,"isCustomer" 		: isCustomer
+		,"chgerNm"			: chgerNm
+		,"chgerEmail"		: chgerEmail
+		,"chgerZipcode"		: ""
+		,"chgerBaseAddr"	: ""
+		,"chgerDtlAddr"		: ""
+		,"chgerPhnno"		: chgerPhnno
+		,"chgerTelno"		: chgerTelno
+		,"reqGbn"			: reqGbn
+		,"ordChgSq"			: ordChgSq
+	}
 
 	// 주문번호, 취소사유, 취소메모, (취소, 반품, 교환 신청 정보 목록), 환불계좌
 	var jsonData = JSON.stringify(jsonObj);
 	
-	mcxDialog.confirm('취소요청하시겠습니까?', {
+	mcxDialog.confirm(confirmStr, {
 		cancelBtnText		: "취소",
-		sureBtnClick		: function(){
+		sureBtnText			: "확인",
+		sureBtnClick		: function() {
 			gagajf.ajaxJsonSubmit(
 				cnclUrl
 				, jsonData
@@ -1047,6 +1078,32 @@ $(document).ready(function() {
 		$('#wrapRefundAccount').addClass("off");
 		fnBindOrderRfAccountInfo();
 	}
+	
+	// 5. 취소신청, 취소완료, 취소승인, 취소철회 버튼 제어
+	if (ordChgSq > 0) {
+		$("#cnclReqBtn").css("display", "none");
+		$("#cnclCompleteBtn").css("display", "none");
+	} else {
+		$("#cnclReqCompleteBtn").css("display", "none");
+		$("#cnclReqCancelBtn").css("display", "none");
+	}
+	
+	// 6. 취소사유 선택
+	if (ordChgSq > 0) {
+		$("select[name='selectChgReason']").val(chgReason);										// 변경사유코드
+		$("select[name='selectChgReason']").attr("disabled", "true");							// 변경사유 비활성화
+		$("#chgMemo").text(chgMemo);															// 변경사유메모
+		$("#chgMemo").attr("disabled", "true");													// 변경사유메모 비활성화
+		fnChangeChgReason(chgReason);															// 귀책사유
+	}
+	
+	// debug mode 해제
+	if (temp2) {
+		$("#h4OrderCancelRequestToBeList").css("display", "none");
+		$("#gridOrderCancelRequestToBeList").css("display", "none");
+		$("#h4DelvCdList").css("display", "none");
+		$("#gridDelvCdList").css("display", "none");
+	}
 });
 </script>
 </html>

+ 20 - 21
src/main/webapp/WEB-INF/views/order/ExchangeRequestForm.html

@@ -29,7 +29,7 @@
 				<h4>주문정보</h4>
 				<div id="gridOrderCancelRequestList" style="width:100%; height: 200px;" class="ag-theme-balham"></div>
 
-				<h4>배송정보</h4>
+				<h4>배송정보</h4>
 				<div id="gridDelvCdList" style="width:100%; height: 140px;" class="ag-theme-balham"></div>
 				
 				<div style="text-align:right; padding-bottom:5px; padding-top:5px;">
@@ -90,7 +90,7 @@
 							<th>회수지주소 <i class="star"></i></th>
 							<td colspan="3">
 								<input type="text" name ="chgerZipcode" class="w100" readonly="readonly"/>
-								<button type="button" class="btn btn-info" onclick="fnOpenDaumAddr('delvLoc');">우편번호찾기</button>
+								<button type="button" class="btn btn-info" onclick="fnOpenDaumAddr('withdraw');">우편번호찾기</button>
 								<input type="text" name ="chgerBaseAddr" class="w300"/>
 								<input type="text" name ="chgerDtlAddr" class="w300"/>
 							</td>
@@ -141,7 +141,7 @@
 						<th>교환지주소 <i class="star"></i></th>
 						<td colspan="3">
 							<input type="text" name ="recipZipcode" class="w100" readonly="readonly"/>
-							<button type="button" class="btn btn-info" onclick="fnOpenDaumAddr('delvLoc');">우편번호찾기</button>
+							<button type="button" class="btn btn-info" onclick="fnOpenDaumAddr('exchange');">우편번호찾기</button>
 							<input type="text" name ="recipBaseAddr" class="w300"/>
 							<input type="text" name ="recipDtlAddr" class="w300"/>
 						</td>
@@ -192,7 +192,7 @@ var addDelvFeeList			= [];											// 추가배송비정보
 var exchangeRequestList		= [];											// 교환요청목록
 
 var temp1 = true;
-var temp2 = false;
+var temp2 = true;
 
 // 1. 주문정보(교환대상)
 var columnExchangeReqList = [
@@ -281,9 +281,9 @@ var columnExchangeReqList = [
 					strVal += '<select class="ordChgOpt" name="ordChgOpt" ordDtlNo="' + params.data.ordDtlNo + '" ordDtlItemSq="' + params.data.ordDtlItemSq + '" onchange="fnChangeOption(this)">';
 					
 					if (gagajf.isNull(ordChgOpt)) {
-						strVal += '<option value="">선택</option>'
+						strVal += '<option value="">선택</option>';
 					} else {
-						strVal += '<option value="" selected>선택</option>'
+						strVal += '<option value="" selected>선택</option>';
 					}
 
 					$.each(optArr, function(idx,item){
@@ -495,10 +495,10 @@ var gridOptionsExchangeReqList = gagaAgGrid.getGridOptions(columnExchangeReqList
 gridOptionsExchangeReqList.suppressRowClickSelection = true;
 gridOptionsExchangeReqList.rowSelection = 'multiple';
 
-// 3. 배송정보(환불정보)
+// 3. 배송정보(환불정보)
 var columnDelvCdList = [
-	{headerName: "업체"			, field: "supplyCompNm"		, width: 100	, cellClass: 'text-center', hide: temp2},
-	{headerName: "배송비코드"		, field: "delvFeeCd"		, width: 100	, cellClass: 'text-center', hide: temp2},
+	{headerName: "업체"			, field: "supplyCompNm"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "배송비코드"		, field: "delvFeeCd"		, width: 100	, cellClass: 'text-center'},
 	{
 		headerName		: "추가배송비"
 		, field			: "addDelvFee"
@@ -507,13 +507,12 @@ var columnDelvCdList = [
 		, cellRenderer	: function (params) {
 			return params.value.addComma();
 		}
-		, hide			: temp2
 	},
-	{headerName: "반품지명"		, field: "rtnLocNm"			, width: 100	, cellClass: 'text-center', hide: temp2},
-	{headerName: "반품지전화번호"	, field: "rtnLocTelno"		, width: 100	, cellClass: 'text-center', hide: temp2},
-	{headerName: "반품지우편번호"	, field: "rtnLocZipcode"	, width: 100	, cellClass: 'text-center', hide: temp2},
-	{headerName: "반품지기본주소"	, field: "rtnLocBaseAddr"	, width: 300	, cellClass: 'text-center', hide: temp2},
-	{headerName: "반품지상세주소"	, field: "rtnLocDtlAddr"	, width: 300	, cellClass: 'text-center', hide: temp2},
+	{headerName: "반품지명"		, field: "rtnLocNm"			, width: 100	, cellClass: 'text-center'},
+	{headerName: "반품지전화번호"	, field: "rtnLocTelno"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "반품지우편번호"	, field: "rtnLocZipcode"	, width: 100	, cellClass: 'text-center'},
+	{headerName: "반품지기본주소"	, field: "rtnLocBaseAddr"	, width: 300	, cellClass: 'text-center'},
+	{headerName: "반품지상세주소"	, field: "rtnLocDtlAddr"	, width: 300	, cellClass: 'text-center'},
 ];
 var gridOptionsDelvCdList = gagaAgGrid.getGridOptions(columnDelvCdList);
 </script>
@@ -620,8 +619,8 @@ var fnExchange = function () {
 			mcxDialog.alert("휴대전화를 입력하세요."); return;
 		}
 	
-		var chgerPhnno 		= chgerPhnno1 + chgerPhnno2 + chgerPhnno3;
-		var chgerTelno 		= chgerTelno1 + chgerTelno2 + chgerTelno3;
+		var chgerPhnno 		= chgerPhnno1 + '-' + chgerPhnno2 + '-' + chgerPhnno3;
+		var chgerTelno 		= chgerTelno1 + '-' + chgerTelno2 + '-' + chgerTelno3;
 		var chgerEmail 		= orderInfoList[0].ordEmail;
 	}
 
@@ -659,8 +658,8 @@ var fnExchange = function () {
 		mcxDialog.alert("휴대전화를 입력하세요."); return;
 	}
 	
-	var recipPhnno 		= recipPhnno1 + recipPhnno2 + recipPhnno3;
-	var recipTelno 		= recipTelno1 + recipTelno2 + recipTelno3;
+	var recipPhnno 		= recipPhnno1 + '-' + recipPhnno2 + '-' + recipPhnno3;
+	var recipTelno 		= recipTelno1 + '-' + recipTelno2 + '-' + recipTelno3;
 	var recipEmail 		= orderInfoList[0].ordEmail;
 	
 	var jsonObj = {
@@ -713,6 +712,7 @@ var fnExchange = function () {
 var fnOpenDaumAddr = function(loc) {
 	let daumZip = new daum.Postcode({
 		oncomplete: function(data) {
+			console.log(data);
 			// 우편번호와 주소 정보를 해당 필드에 넣는다.
 			if (loc == 'withdraw') {
 				$('#exchangeRequestFrm input[name=chgerZipcode]').val(data.zonecode);
@@ -873,8 +873,7 @@ var fnAddDelvFee = function (exchangeRequestTargetList) {
 $(document).ready(function() {
 	// 1. 그리드생성
 	gagaAgGrid.createGrid('gridOrderCancelRequestList'		, gridOptionsExchangeReqList);			// 주문정보
-	//gagaAgGrid.createGrid('gridOrderCancelRequestToBeList'	, gridOptionsExchangeReqToBeList);		// 취소정보
-	gagaAgGrid.createGrid('gridDelvCdList'					, gridOptionsDelvCdList);				// 배송비정보
+	gagaAgGrid.createGrid('gridDelvCdList'					, gridOptionsDelvCdList);				// 배송정보
 	gridOptionsExchangeReqList.api.setRowData(cancelRequestTargetList);
 	
 	// 2.1 TOTAL ROWS 없애기

+ 79 - 85
src/main/webapp/WEB-INF/views/order/OrderDetailForm.html

@@ -166,6 +166,8 @@ var orderChangeInfo 		= [[${orderChangeInfo}]];				// 취소/반품/교환요청
 var orderRefundInfo 		= [[${orderRefundInfo}]];				// 환불정보
 var orderCounselInfo 		= [[${orderCounselInfo}]];				// 상담내역
 var orderAdminMemoInfo 		= [[${orderAdminMemoInfo}]];			// 관리자메모
+
+var canChgDelvStat			= ['G013_10', 'G013_11', 'G013_17', 'G013_20', 'G013_30', 'G013_40'];
 </script>
 
 <!-- AgGrid 컬럼 세팅 -->
@@ -501,7 +503,6 @@ var gridOptionsOrderFreeGiftInfo = gagaAgGrid.getGridOptions(columnDefsOrderFree
 var columnDefsDeliveryInfo = [
 	{headerName: "배송지번호"		, field: "delvAddrSq"		, width: 80, cellClass: 'text-center'},
 	{headerName: "주문구분"		, field: "exchGbNm"			, width: 80, cellClass: 'text-center'},
-	{headerName: "수정여부"		, field: "delvAddrEditYn"	, width: 80, cellClass: 'text-center', hide: true},
 	{headerName: "받는분"			, field: "recipNm"			, width: 80, cellClass: 'text-left', editable: true},
 	{headerName: "핸드폰번호"		, field: "recipPhnno"		, width: 120, cellClass: 'text-left', editable: true},
 	{headerName: "전화번호"		, field: "recipTelno"		, width: 120, cellClass: 'text-left', editable: true},
@@ -512,10 +513,9 @@ var columnDefsDeliveryInfo = [
 		, cellClass		: 'text-center'
 		, cellRenderer	: function (params) {
 			var rtnStr = ""
-			
-			if (params.data.delvAddrEditYn < 1) {
+			if (canChgDelvStat.includes(params.data.ordDtlStat)) {
 				// 배송지 수정 (주문배송, 교환배송)
-				rtnStr += params.value;			
+				rtnStr += params.value;
 				rtnStr += "<button type=\"button\" style=\"margin-left:10px\" class=\"btn btn-info\" onclick=\"fnOpenDaumAddr('" + params.node.rowIndex + "', 'ADDR');\">POST</button>";
 				rtnStr += "<button type=\"button\" class=\"btn btn-info\" onclick=\"fnUpdateOrderAddr('" + params.node.rowIndex + "');\">저장</button>";
 			} else {
@@ -614,8 +614,12 @@ var columnDefsOrderChangeInfo = [
 			var rtnStr = "";
 			
 			// 취소요청, 교환요청, 반품요청 일때는 요청 정보 확인 팝업 정보
-			if (params.data.chgStat == 'G685_20' || params.data.chgStat == 'G685_30' || params.data.chgStat == 'G685_40') {
+			if (params.data.chgStat == 'G685_20') {
 				rtnStr = '<a href="javascript:void(0);" onclick="fnCancelRequest(\'' + params.value + '\');">' + params.value + '</a>';
+			} else if (params.data.chgStat == 'G685_40') {
+				rtnStr = '<a href="javascript:void(0);" onclick="fnReturnRequest(\'' + params.value + '\');">' + params.value + '</a>';
+			} else if (params.data.chgStat == 'G685_30') {
+				rtnStr = '<a href="javascript:void(0);" onclick="fnExchangeRequest(\'' + params.value + '\');">' + params.value + '</a>';
 			} else {
 				rtnStr = params.value;
 			}
@@ -623,12 +627,13 @@ var columnDefsOrderChangeInfo = [
 			return  rtnStr;
 		}
 	},
-	{headerName: "요청구분"		, field: "chgGbNm"		, width: 100	, cellClass: 'text-center'},
+	/*{headerName: "요청구분"		, field: "chgGbNm"		, width: 100	, cellClass: 'text-center'},*/
+	{headerName: "요청상태"		, field: "chgStatNm"	, width: 100	, cellClass: 'text-center'},
 	{headerName: "상품코드"		, field: "goodsCd"		, width: 100	, cellClass: 'text-center'},
 	{headerName: "옵션1"			, field: "optCd1"		, width: 100	, cellClass: 'text-center'},
 	{headerName: "옵션2"			, field: "optCd2"		, width: 100	, cellClass: 'text-center'},
 	{headerName: "수량"			, field: "chgQty"		, width: 100	, cellClass: 'text-center'},
-	{headerName: "요청상태"		, field: "chgStatNm"	, width: 100	, cellClass: 'text-center'},
+	/*{headerName: "요청상태"		, field: "chgStatNm"	, width: 100	, cellClass: 'text-center'},*/
 	{
 		headerName		: "요청일자"		
 		, field			: "regDt"		
@@ -651,7 +656,7 @@ var columnDefsOrderChangeInfo = [
 			var rtnStr = ""
 			
 			// 회수지수정가능(교환요청, 반품요청)
-			if (params.data.chgStat == 'G685_30' || params.data.chgStat == 'G685_40' ) {
+			if (!params.data.wdGb != 'D' && (params.data.chgStat == 'G685_30' || params.data.chgStat == 'G685_40')) {
 				
 				rtnStr += params.value;			
 				rtnStr += "<button type=\"button\" style=\"margin-left:10px\" class=\"btn btn-info\" onclick=\"fnOpenDaumAddr('" + params.node.rowIndex + "', 'CLAIM');\">POST</button>";
@@ -955,7 +960,7 @@ $(document).ready(function () {
 	});
 	// 반품요청
 	$('#btnReturn').on('click', function () {
-		fnReturnRequest(ordNo, 'N');
+		fnReturnRequest();
 	});
 	// 교환요청
 	$('#btnExchange').on('click', function () {
@@ -1014,21 +1019,80 @@ var fnCancelRequest = function (ordChgSq) {
 	cfnOpenModalPopup(actionUrl, 'popupCancelRequestForm');
 };
 
-
-
+//2021.01.25 추가
 // 반품요청
-var fnReturnRequest = function () {
-	var actionUrl = "/orderChange/rtn/req/form?ordNo=" + ordNo;
+var fnReturnRequest = function (ordChgSq) {
+	
+	// 취소요청 구분 (orChgSq null 이면 취소요청화면 있으면 취소요청정보화면)
+	if (ordChgSq == null) {
+		ordChgSq = 0;
+	}
+	
+	var actionUrl = "/orderChange/rtn/req/form?ordNo=" + ordNo + "&ordChgSq=" + ordChgSq;
+	
 	cfnOpenModalPopup(actionUrl, 'popupReturnRequestForm');
 };
 
 // 교환요청
-var fnExchangeRequest = function () {
-	var actionUrl = "/orderChange/exchange/request/form?ordNo=" + ordNo;
+var fnExchangeRequest = function (ordChgSq) {
+	
+	// 취소요청 구분 (orChgSq null 이면 취소요청화면 있으면 취소요청정보화면)
+	if (ordChgSq == null) {
+		ordChgSq = 0;
+	}
+	
+	var actionUrl = "/orderChange/exchange/request/form?ordNo=" + ordNo + "&ordChgSq=" + ordChgSq;
 	cfnOpenModalPopup(actionUrl, 'popupExchangeRequestForm');
 };
 
 
+// 반품요청 철회
+var fnReturnReqeustCancel = function (ordChgSq, ordDtlNo, rowIdx) {
+	mcxDialog.confirm('반품요청을 철회하시겠습니까?', {
+		cancelBtnText	: "취소",
+		sureBtnText		: "확인",
+		sureBtnClick	: function () {
+			var data = new Object();
+			data.ordChgSq = ordChgSq;
+			data.ordDtlNo = ordDtlNo;
+			
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit(
+				'/order/return/request/cancel'
+				, jsonData
+				, function (result) {
+					if (result.message != '회수컨펌 된 내역이 있습니다.') {
+						var selectedRow = gridOptionsOrderChangeInfo.api.getRowNode(rowIdx).data;
+						gridOptionsOrderChangeInfo.api.updateRowData({remove: [selectedRow]});
+					}
+				}
+			);
+		}
+	});
+};
+
+// 교환요청 철회
+var fnExchangeReqeustCancel = function (ordChgSq, ordNo, ordDtlNo, rowIdx) {
+	mcxDialog.confirm('교환요청을 취소하시겠습니까?', {
+		cancelBtnText	: "취소",
+		sureBtnText		: "확인",
+		sureBtnClick	: function () {
+			var data = new Object();
+			data.ordNo 		= ordNo;
+			data.ordDtlNo 	= ordDtlNo;
+			data.ordChgSq 	= ordChgSq;
+			
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit(
+				'/order/exchange/request/cancel'
+				, jsonData, function () {
+					uifnPopupClose('popupOrderDetail');
+					fnReOpenOrderDetailPopup();
+				}
+			);
+		}
+	});
+};
 
 // 주문상품 상세 변경 이력 팝업
 var fnOrderDetailChangeHst = function (ordDtlNo) {
@@ -1164,54 +1228,6 @@ var fnSaveChgerAddr = function (rowIdx) {
 	});
 }
 
-// 반품요청 철회
-var fnReturnReqeustCancel = function (ordChgSq, ordDtlNo, rowIdx) {
-	mcxDialog.confirm('반품요청을 철회하시겠습니까?', {
-		cancelBtnText	: "취소",
-		sureBtnText		: "확인",
-		sureBtnClick	: function () {
-			var data = new Object();
-			data.ordChgSq = ordChgSq;
-			data.ordDtlNo = ordDtlNo;
-			
-			var jsonData = JSON.stringify(data);
-			gagajf.ajaxJsonSubmit(
-				'/order/return/request/cancel'
-				, jsonData
-				, function (result) {
-					if (result.message != '회수컨펌 된 내역이 있습니다.') {
-						var selectedRow = gridOptionsOrderChangeInfo.api.getRowNode(rowIdx).data;
-						gridOptionsOrderChangeInfo.api.updateRowData({remove: [selectedRow]});
-					}
-				}
-			);
-		}
-	});
-};
-
-// 교환요청 철회
-var fnExchangeReqeustCancel = function (ordChgSq, ordNo, ordDtlNo, rowIdx) {
-	mcxDialog.confirm('교환요청을 취소하시겠습니까?', {
-		cancelBtnText	: "취소",
-		sureBtnText		: "확인",
-		sureBtnClick	: function () {
-			var data = new Object();
-			data.ordNo 		= ordNo;
-			data.ordDtlNo 	= ordDtlNo;
-			data.ordChgSq 	= ordChgSq;
-			
-			var jsonData = JSON.stringify(data);
-			gagajf.ajaxJsonSubmit(
-				'/order/exchange/request/cancel'
-				, jsonData, function () {
-					uifnPopupClose('popupOrderDetail');
-					fnReOpenOrderDetailPopup();
-				}
-			);
-		}
-	});
-};
-
 // LMS 전송
 var fnOpenLmsForm = function (orderPhnno, custNo) {
 	if (gagajf.isNull(custNo) && gagajf.isNull(orderPhnno)) {
@@ -1258,28 +1274,6 @@ var fnReceiptPage = function (tid) {
 	window.open(fullUrl, '_blank');
 };
 
-// 수동 회수 지시 
-var fnWdinvocieSend = function (ordChgSq) {
-	mcxDialog.confirm("요청번호 [" + ordChgSq + "] 회수지시 처리 하시겠습니까? <br> 시스템에서 회수지시를 보내지는않습니다.", {
-		cancelBtnText	: "취소",
-		sureBtnText		: "확인",
-		sureBtnClick	: function () {
-			var data = new Object();
-			data.ordChgSq = ordChgSq;
-			
-			var jsonData = JSON.stringify(data);
-			gagajf.ajaxJsonSubmit(
-				'/order/wdinvoice/send/save'
-				, jsonData
-				, function (result) {
-					uifnPopupClose('popupOrderDetail');
-					fnReOpenOrderDetailPopup();
-				}
-			);
-		}
-	});
-};
-
 // 구매확정철회
 var fnChangedCompleteDelivery = function (ordNo, ordDtlNo, ordDtlStat) {
 	if ('70' !== ordDtlStat) {

+ 6 - 0
src/main/webapp/WEB-INF/views/order/OrderListForm.html

@@ -216,6 +216,7 @@
 			<ul class="panelBar">
 				<li>
 					<button type="button" class="btn btn-info btn-lg" onclick="fnOrderExcelList();">엑셀다운로드</button>
+					<button type="button" class="btn btn-info btn-lg" th:if="${userNo == 8 or userNo == 14 or userNo == 11}" onclick="fnCreateSampleOrder();">주문생성</button>
 				</li>
 				<li class="aR">
 					검색결과 : <strong><span id="rowCntOrderList">0</span> 건</strong>&nbsp;
@@ -743,6 +744,11 @@ $(document).ready(function() {
 	gagaAgGrid.createGrid('gridOrderList', gridOptionsOrderList);
 	gridOptionsOrderList.api.hideOverlay();
 });
+
+var fnCreateSampleOrder = function() {
+	var actionUrl = "/order/sample/create/form";
+	cfnOpenModalPopup(actionUrl, "popupOrderSample");
+}
 </script>
 
 </html>

+ 437 - 0
src/main/webapp/WEB-INF/views/order/OrderSamplePopupForm.html

@@ -0,0 +1,437 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OrderSamplePopupForm.html
+ * @desc    : 주문 샘플 데이터 생성 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.30   card007     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1200" id="popupOrderSample">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong th:text="${'주문 샘플 데이터 생성'}"></strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupOrderSample');"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+		
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<form id="orderSamplePopupForm" name="orderSamplePopupForm" action="#" th:action="@{'/order/sample/create'}" th:method="post">
+				<table class="frmStyle" aria-describedby="등록폼">
+					<colgroup>
+						<col style="width:7%;"/>
+						<col style="width:26%;"/>
+						<col style="width:7%;"/>
+						<col style="width:26%;"/>
+						<col style="width:7%;"/>
+						<col/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>회원번호</th>
+							<td>
+								<input class="w200" type="text" name="custNo" id="custNo"/>
+								<button type="button" class="btn btn-info btn-lg" id="btnOrderSearch" onclick="fnApplyCustomerInfo()">적용</button>
+							</td>
+							<th>주문자명</th>
+							<td>
+								<input type="text" name="ordNm" id="ordNm"/>
+							</td>
+							<th>핸드폰번호</th>
+							<td>
+								<input type="text" name="ordPhnno" id="ordPhnno"/>
+							</td>
+						</tr>
+						<tr>
+							<th>전화번호</th>
+							<td>
+								<input type="text" name="ordTelno" id="ordTelno"/>
+							</td>
+							<th>이메일</th>
+							<td colspan="3">
+								<input type="text" name="ordEmail" id="ordEmail"/>
+							</td>
+						</tr>
+						<tr>
+							<th>배송지</th>
+							<td colspan="5">
+								<input type="text" name ="recipZipcode" id="recipZipcode" class="w100" readonly="readonly"/>
+								<button type="button" class="btn btn-info" onclick="fnOpenDaumAddr('delivery');">우편번호찾기</button>
+								<input type="text" name ="recipBaseAddr" id="recipBaseAddr" class="w300"/>
+								<input type="text" name ="recipDtlAddr" id="recipDtlAddr" class="w300"/>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+			</form>
+		</div>
+		<!-- //CONTENT -->
+
+		<!-- Grid -->
+		<ul class="panelBar">
+			<li class="left">
+				<button type="button" class="btn btn-danger btn-lg" onclick="fnGoodsDeleteRow();">행삭제</button>
+			</li>
+			<li class="right">
+				<button type="button" class="btn btnRight btn-base btn-lg" onclick="fnOpenGoodsPopup();">주문상품추가</button>
+			</li>
+		</ul>
+		<div id="gridGoodsList" style="height: 390px;" class="ag-theme-balham lh60"></div>
+		<!-- //Grid -->
+
+		<!-- 버튼 배치 영역 -->
+		<ul class="panelBar">
+			<li class="right">
+				<button type="button" class="btn btn-info btn-lg" id="btnCreateOrderSample">저장</button>
+			</li>
+		</ul>
+		<!-- //버튼 배치 영역 -->
+	</div>
+</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var sessRoleCd = [[${sessionInfo.roleCd}]];
+	var goodsStatList = gagajf.convertToArray([[${goodsStatList}]]);
+	var formalGbList = gagajf.convertToArray([[${formalGbList}]]);
+	var seasonList = gagajf.convertToArray([[${seasonList}]]);
+	var columnDefs = [];
+	columnDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: 'No', width: 60, cellClass: 'text-center',
+			valueGetter: function(params) { return cfnGridNumner('searchForm',params.node.rowIndex, 'A');}
+		},
+		{headerName: "이미지", field: "sysImgNm", width: 100, height: 60, cellClass: 'text-center'
+			,cellRenderer: function(params) {
+				return '<img width="60" src="'+ _goodsUrl+ "/" + params.value + '" alt="" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \''+ _goodsUrl+ "/" + params.value +'\')" onerror="this.src=\'/image/no.gif\';"/>';
+			}
+		},
+		{headerName: "상품코드", field: "goodsCd", width: 140, cellClass: 'text-center'},
+		{headerName: "상품명", field: "goodsNm", width: 200, cellClass: 'text-left'
+			,cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "구성상품코드", field: "compsGoodsCd", width: 140, cellClass: 'text-center'},
+		{headerName: "판매가능재고", field: "stockQtySum", width: 120, cellClass: 'text-right',
+			valueFormatter: function(params) {	return params.value.addComma();},
+			cellStyle : function(params){
+				if ("00" == params.data.goodsStat  || "10" == params.data.goodsStat || "20" == params.data.goodsStat || "30" == params.data.goodsStat) {
+					return;
+				}
+				var color = "";
+				if (params.value <= 0){
+					color = '#ff96689c';
+				}
+				return { 'background-color': color};
+			}
+		},
+		{
+			headerName		: "주문옵션"
+			, field			: "optCd"
+			, width			: 100
+			, cellClass		: "text-center"
+			, cellRenderer	: function (params) {
+				var strVal			= '';
+				if (!gagajf.isNull(params.data.optCd2)) {
+					var optArr = params.data.optCd2.split(',');
+					strVal += '<select class="optCd2" name="optCd2" goodsCd="' + params.data.goodsCd + '" onchange="fnChangeOption(this)">';
+					if (gagajf.isNull(params.data.optCd)) {
+						strVal += '<option value="" selected>선택</option>';	
+					} else {
+						strVal += '<option value="">선택</option>'
+					}
+					
+					
+					$.each(optArr, function (idx, item) {
+						if (params.data.optCd == item) {
+							strVal += '<option value="' + item + '" selected>' + item + '</option>';
+						} else {
+							strVal += '<option value="' + item + '">' + item + '</option>';
+						}
+					});
+				}
+				
+				return strVal;
+			}
+		},
+		{headerName: "주문수량", field: "ordQty", width: 100, cellClass: 'text-center', editable : true},
+		{headerName: "상품상태", field: "goodsStat" , width: 100, cellClass: 'text-center',
+			cellEditorParams: { values: gagaAgGrid.extractValues(goodsStatList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(goodsStatList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(goodsStatList, params.newValue); }
+		},
+		{headerName: "년도", field: "styleYear" , width: 80, cellClass: 'text-center'},
+		{headerName: "시즌", field: "seasonCd" , width: 80, cellClass: 'text-center',
+			cellEditorParams: { values: gagaAgGrid.extractValues(seasonList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(seasonList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(seasonList, params.newValue); }
+		},
+		{headerName: "정상가", field: "listPrice" , width: 100, cellClass: 'text-right'
+			,valueFormatter: function(params) {return params.value.addComma();},
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 14, validType: 'numeric'}
+		},
+		{headerName: "판매가", field: "currPrice" , width: 100, cellClass: 'text-right'
+			,valueFormatter: function(params) {return params.value.addComma();},
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 14, validType: 'numeric'}
+		},
+		/*{headerName: "할인율", field: "dcRate" , width: 90, cellClass: 'text-right'},*/
+		{headerName: "가격변경일", field: "priceUpdDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "ERP재고연동여부", field: "erpStockLinkYn", width: 120, cellClass: 'text-center'},
+		{headerName: "이월구분", field: "formalGb", width: 100, cellClass: 'text-center',
+			cellEditorParams: { values: gagaAgGrid.extractValues(formalGbList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(formalGbList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(formalGbList, params.newValue); }
+		},
+		{headerName: "반품가능", field: "returnableYn" , width: 90, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "등록자", field: "regNm" , width: 100, 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") : '';
+			}
+		},
+		{headerName: "수정자", field: "updNm" , width: 100, cellClass: 'text-center'}
+	];
+	
+	// Get GridOptions
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	
+	// 중복 선택 가능
+	gridOptions.rowSelection = 'multiple';
+	gridOptions.suppressRowClickSelection = true;
+	gridOptions.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
+	
+	gridOptions.getRowStyle = function(params) {
+		if ("G008_00" == params.data.goodsStat  || "G008_10" == params.data.goodsStat || "G008_20" == params.data.goodsStat || "G008_30" == params.data.goodsStat) {
+			return { background: '#23c6c8' };
+		}
+	}
+
+	// 주문수량 변경 이벤트
+	gridOptions.onCellValueChanged = function(event) {
+		let ordQty = event.data.ordQty;
+		if (event.colDef.field == "ordQty" && event.data.ordQty > event.data.stockQtySum) {
+			ordQty = event.data.stockQtySum;
+			mcxDialog.alert('주문수량이 판매가능재고보다 클 수 없습니다.');
+		}
+		
+		gridOptions.api.forEachNode(function(rowNode, index) {
+			if (event.data.goodsCd == rowNode.data.goodsCd){
+				rowNode.data.ordQty = ordQty;
+				
+				gridOptions.api.updateRowData({update: [rowNode.data]});
+			}
+		});
+	}
+
+	//상품조회 팝업
+	var fnOpenGoodsPopup = function() {
+		cfnOpenGoodsPopup('fnFetchGoods');
+	}
+	
+	// 상품추가
+	var fnFetchGoods = function(goodsData) {
+		if (goodsData.length < 1) return;
+		
+		// 기존상품
+		var oldGoodsSetList = gagaAgGrid.getAllRowData(gridOptions);
+		var index = oldGoodsSetList.length+1;
+		
+		var arrGoodsCd = [];
+		$.each(goodsData, function(idx, item) {
+			arrGoodsCd.push(item.goodsCd);
+		})
+		
+		var isExist = false;
+		var jsonData = JSON.stringify(arrGoodsCd);
+		gagajf.ajaxJsonSubmit('/order/sample/goods/info', jsonData, function(result) {
+			$.each(result, function(idx, item) {
+				isExist = false;
+				gridOptions.api.forEachNode(function(rowNode, index) {
+					//중복상품 여부 확인
+					if (item.goodsCd == rowNode.data.goodsCd){
+						isExist = true;
+					}
+				});
+				
+				if(!isExist){
+					var data = {
+						no: index
+						, sysImgNm : item.sysImgNm
+						, goodsCd : item.goodsCd
+						, compsGoodsCd : item.repGoodsCd
+						, goodsNm : item.goodsNm
+						, ordQty : 1
+						, optCd2 : item.siteCd
+						, stockQtySum : item.stockQtySum
+						, goodsStat : item.goodsStat
+						, styleYear : item.styleYear
+						, seasonCd : item.seasonCd
+						, listPrice : item.listPrice
+						, currPrice : item.currPrice
+						, priceUpdDt : item.priceUpdDt
+						, erpStockLinkYn : item.erpStockLinkYn
+						, formalGb : item.formalGb
+						, returnableYn : item.returnableYn
+						, regDt : item.regDt
+						, regNm : item.regNm
+						, updDt : item.updDt
+						, updNm : item.updNm
+					};
+					
+					//그리드 마지막에 추가해야함
+					gridOptions.api.updateRowData({add: [data], addIndex: idx});
+					gridOptions.api.refreshCells();
+					index++;
+				}
+			});
+		});
+	}
+
+	//상품삭제
+	var fnGoodsDeleteRow = function() {
+		var selectedData = gagaAgGrid.selectedRowData(gridOptions);
+		
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		//화면에서 삭제
+		gagaAgGrid.removeRowData(gridOptions, false);
+	}
+
+	// 저장
+	$('#btnCreateOrderSample').on('click', function() {
+		// 입력 값 체크
+		let selectedData = gagaAgGrid.selectedRowData(gridOptions);
+		
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		let optChk = true;
+		let qtyChk = true;
+		$.each(selectedData, function(idx, item) {
+			if (gagajf.isNull(item.optCd)) {
+				optChk = false;
+			} else if (item.ordQty <= 0) {
+				qtyChk = false;
+			}
+		});
+		
+		if (!optChk) {
+			mcxDialog.alert('주문옵션이 없습니다.');
+			return false;
+		}
+		
+		if (!qtyChk) {
+			mcxDialog.alert('주문수량은 0보다 커야 됩니다.');
+			return false;
+		}
+		
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				let params = {};
+				params.custNo = $('#custNo').val();
+				params.ordNm = $('#ordNm').val();
+				params.ordPhnno = $('#ordPhnno').val();
+				params.ordEmail = $('#ordEmail').val();
+				params.recipZipcode = $('#recipZipcode').val();
+				params.recipBaseAddr = $('#recipBaseAddr').val();
+				params.recipDtlAddr = $('#recipDtlAddr').val();
+				params.goods = selectedData;
+				
+				let jsonData = JSON.stringify(params);
+				
+				gagajf.ajaxJsonSubmit($('#orderSamplePopupForm').prop('action'), jsonData, function(result) {
+					uifnPopupClose('popupOrderSample');
+				});
+			}
+		});
+	});
+
+	// 회원정보 적용
+	var fnApplyCustomerInfo = function() {
+		var params = {};
+		params.searchGb = 'custNo';
+		params.searchTxt = $('#orderSamplePopupForm input[name=custNo]').val();
+		
+		var jsonData = JSON.stringify(params);
+		
+		gagajf.ajaxJsonSubmit('/customer/active/list', jsonData, function(result) {
+			let param = result[0];
+			
+			$('#ordNm').val(param.custNm);
+			$('#ordPhnno').val(param.cellPhnno);
+			$('#ordEmail').val(param.email);
+			$('#recipZipcode').val(param.homeZipcode);
+			$('#recipBaseAddr').val(param.homeBaseAddr);
+			$('#recipDtlAddr').val(param.homeDtlAddr);
+		});
+	}
+
+	var fnOpenDaumAddr = function() {
+		let daumZip = new daum.Postcode({
+			oncomplete: function(data) {
+				// 우편번호와 주소 정보를 해당 필드에 넣는다.
+				$('#orderSamplePopupForm input[name=recipZipcode]').val(data.zonecode);
+				$('#orderSamplePopupForm input[name=recipBaseAddr]').val(cfnGetDaumRoadAddr(data));
+				$('#orderSamplePopupForm input[name=recipDtlAddr]').focus();
+				
+				cfnCloseDaumAddr();
+			},
+			width: '100%'
+		});
+		
+		cfnOpenDaumAddr(daumZip);
+	}
+	
+	var fnChangeOption = function(param) {
+		var params = {};
+		params.goodsCd = $(param).attr('goodsCd');
+		params.siteCd = $(param).val();
+		
+		var jsonData = JSON.stringify(params);
+		gagajf.ajaxJsonSubmit('/order/sample/goods/stock', jsonData, function(result) {
+			gridOptions.api.forEachNode(function(rowNode, index) {
+				if (result.goodsCd == rowNode.data.compsGoodsCd){
+					rowNode.data.stockQtySum = result.minOrdQty;
+					console.log(result);
+					rowNode.data.optCd = result.siteCd;
+					gridOptions.api.updateRowData({update: [rowNode.data]});
+				}
+			});
+		});
+	}
+
+	$(document).ready(function() {
+		gagaAgGrid.createGrid('gridGoodsList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 189 - 107
src/main/webapp/WEB-INF/views/order/ReturnRequestForm.html → src/main/webapp/WEB-INF/views/order/RtnReqForm.html

@@ -23,20 +23,23 @@
 		<div class="panelContent" style="height:90%; overflow-y:auto; padding:0px 20px !important; ">
 			<form id="cancelRequestFrm" name="cancelRequestFrm" action="/orderChange/return" method="post" target="hdFrameForOrderCancel">
 				<input type="hidden" name="ordNo" th:value="${ordNo}"/>
+				<input type="hidden" name="ordChgSq" th:value="${ordChgSq}"/>
 				<input type="hidden" name="chgReason" value=""/>
 				<input type="hidden" name="chgReasonDesc" value=""/>
 				
 				<h4>주문정보</h4>
 				<div id="gridOrderCancelRequestList" style="width:100%; height: 200px;" class="ag-theme-balham"></div>
 
-				<h4>반품정보</h4>
+				<h4 id="h4OrderCancelRequestToBeList">반품정보</h4>
 				<div id="gridOrderCancelRequestToBeList" style="width:100%; height: 200px;" class="ag-theme-balham"></div>
 				
-				<h4>배송비정보</h4>
+				<h4 id="h4DelvCdList">배송비정보</h4>
 				<div id="gridDelvCdList" style="width:100%; height: 140px;" class="ag-theme-balham"></div>
 				
 				<div style="text-align:right; padding-bottom:5px; padding-top:5px;">
-					<button type="button" class="btn btn-success" id="btnCancelRequestPartOk" onclick="fnCancelRequestPartOk();">요청</button>
+					<button type="button" class="btn btn-success" id="rtnReqBtn" onclick="fnCnclReq('rtnReq');">반품신청</button>
+					<button type="button" class="btn btn-success" id="rtnReqCancelBtn" onclick="fnCnclReq('rtnReqCancel');">반품철회</button>
+					<!-- <button type="button" class="btn btn-success" id="rtnReqCancelBtn" onclick="fnCnclReq('rtnReqComplete');">반품승인</button> -->
 				</div>
 				
 				<table class="frmStyle">
@@ -52,7 +55,7 @@
 							<td>
 								<select name="selectChgReason" onchange="fnChangeChgReason($(this).val());">
 									<option value="">[선택하세요]</option>
-									<option th:if="${chgReasonList}" th:each="oneData, status : ${chgReasonList}" th:value="|${oneData.cd}:${oneData.cdNm}|" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+									<option th:if="${chgReasonList}" th:each="oneData, status : ${chgReasonList}" th:value="|${oneData.cd}|" th:text="|${oneData.cdNm}|"></option>
 								</select>
 							</td>
 							<th>귀책사유</th>
@@ -186,14 +189,24 @@
 /*<![CDATA[*/
 var cancelRequestTargetList = [[${cancelRequestTargetList}]];				// 취소대상목록
 var ordNo 					= [[${ordNo}]];									// 주문번호
+var ordChgSq 				= [[${ordChgSq}]];								// 주문변경번호
 var orderInfoList 			= [[${orderInfoList}]];							// 주문기본정보
-var payMeans 				= orderInfoList[0].payMeans;					// 결제수단
 var orderDelvRtnAddrInfo	= [[${orderDelvRtnAddrInfo}]];					// 회수지정보
+var orderChangeDetailList 	= [[${orderChangeDetailList}]];					// 취소/반품/교환요청 정보
+var payMeans 				= orderInfoList[0].payMeans;					// 결제수단
+var chgReason				= "";											// 변경사유코드
+var chgMemo					= "";											// 변경사유메모
+
+// 변경요청정보 승인, 철회
+if (ordChgSq > 0) {
+	chgReason				= orderChangeDetailList[0].chgReason;			// 변경사유코드
+	chgMemo					= orderChangeDetailList[0].chgMemo;				// 변경사유메모
+}
 
 var temp1 = true;
-var temp2 = false;
+var temp2 = true;
 
-// 1. 주문정보(반품대상)
+// 1. 주문정보(변경요청가능대상)
 var columnCancelReqList = [
 	{
 		headerName	: "주문상세정보",
@@ -275,21 +288,28 @@ var columnCancelReqList = [
 					var ordQty 			= parseInt(params.data.ordQty);
 					var cnclRtnQty 		= parseInt(params.data.cnclRtnQty);
 					var ordReqChgQty 	= parseInt(params.data.ordReqChgQty);
-					var ordCanChgQty 	= ordQty - (cnclRtnQty +  ordReqChgQty);
+					var ordCanChgQty 	= parseInt(params.value);
+					var rtnStr 			= "";
 					
-					var strVal 			= "";
-					strVal += "<select class='ordCanChgQty' name='ordCanChgQty' ordDtlNo='"+params.data.ordDtlNo+"' onChange='fnCalculateRefundAmt(this);'>";
-					
-					for (i=0 ; i<=ordCanChgQty ; i++) {
-						if (i == params.data.ordCanChgQty) {
-							strVal += "	<option value='"+i+"' selected>"+i+"</option>";
-						} else {
-							strVal += "	<option value='"+i+"'>"+i+"</option>";
+					// 취소신청가능수량있으면 수량만 표시 (취소,반품,교환 신청정보 처리)
+					if (ordChgSq > 0) {
+						rtnStr 			= ordCanChgQty;
+					} else {
+						ordCanChgQty 	= ordQty - (cnclRtnQty +  ordReqChgQty);
+						
+						rtnStr += "<select class='ordCanChgQty' name='ordCanChgQty' ordDtlNo='"+params.data.ordDtlNo+"' onChange='fnCalculateRefundAmt(this);'>";
+						
+						for (i=0 ; i<=ordCanChgQty ; i++) {
+							if (i == params.data.ordCanChgQty) {
+								rtnStr += "	<option value='"+i+"' selected>"+i+"</option>";
+							} else {
+								rtnStr += "	<option value='"+i+"'>"+i+"</option>";
+							}
 						}
+					
+						rtnStr += "</select>";
 					}
-				
-					strVal += "</select>";
-					return strVal;
+					return rtnStr;
 				}
 			}
 		]
@@ -837,7 +857,7 @@ var isCustomer = true;
 
 // 취소정보계산
 var fnCalculateRefundAmt = function (obj) {
-	// 취소정보담은목록
+	// 변경신청목록
 	var cancelRequestTargetToBeList = [];
 
 	if (obj != null) {
@@ -849,7 +869,7 @@ var fnCalculateRefundAmt = function (obj) {
 				cancelRequestTargetList[i].ordCanChgQty = ordCanChgQty;
 			}
 		}
-		// 주문정보 다시 셋팅 (체크해봐야할문제)
+		// 주문변경대상정보 재설정
 		gridOptionsCancelReqList.api.setRowData(cancelRequestTargetList);
 	}
 	
@@ -914,126 +934,162 @@ var fnCalculateRefundAmt = function (obj) {
 
 //  사유
 var fnChangeChgReason = function(reasonCd){
-	var arrReasonCd = reasonCd.split(":");
 	var customerReasonArr = ['G688_10', 'G688_11', 'G688_12', 'G688_13', 'G688_15' , 'G688_21', 'G688_30'];
 
 	isCustomer = false;
 	
-	// 취소, 반품, 교환 사유 판단
+	// 귀책사유체크(취소,반품,교환)
 	for (i=0 ; i<customerReasonArr.length ; i++) {
-		if (customerReasonArr[i] == arrReasonCd[0]) {
+		if (customerReasonArr[i] == reasonCd) {
 			isCustomer = true;
 		}
 	}
 	
-	// 귀책사유설정 회사, 고객
+	// 귀책사유체크(회사,고객)
 	if (isCustomer) {
 		$("#imputeReason").text("고객");
 	} else {
 		$("#imputeReason").text("회사");
 	}
 
-	$('#cancelRequestFrm input[name=chgReason]').val(arrReasonCd[0]);
-	$('#cancelRequestFrm input[name=chgReasonDesc]').val(arrReasonCd[1]);
+	$('#cancelRequestFrm input[name=chgReason]').val(reasonCd);
 	
-	//환불예정금액 계산.
-	fnCalculateRefundAmt();			
+	//환불예정금액 계산
+	fnCalculateRefundAmt();
 }
 
 // 반품요청
-var fnCancelRequestPartOk = function () {
-	var temp 		= false;
-	var ordDtlStat	= cancelRequestTargetList[0].ordDtlStat; 
-	var allCanYn 	= "N";
-	
-	// 1. 취소수량 체크
-	for (i=0 ; i<cancelRequestTargetList.length ; i++) {		
-		if (cancelRequestTargetList[i].ordCanChgQty > 0) {
-			temp = true;
-		}
-	}
+var fnCnclReq = function (reqGbn) {
+	var temp 			= false;
+	var ordDtlStat		= cancelRequestTargetList[0].ordDtlStat; 
+	var allCanYn 		= "N";
 	
-	if (temp == false) {
-		mcxDialog.alert('취소 할 수량을 입력하세요.');
-		return;
-	}
+	var accountNo 		= "";
+	var accountNm 		= "";
+	var bankCd 			= "";
 	
-	// 2. 입금대기건 && 전체취소 체크
-	if (ordDtlStat == "G013_10" && $("#spanPayAmt").text() != $("#spanRefundAmt").text()) {
-		alert("입금대기건은 전체 취소만 가능합니다.");
-		return;
-	}
+	var chgerNm			= "";
+	var chgerZipcode	= "";
+	var chgerBaseAddr	= "";
+	var chgerDtlAddr	= "";
 	
-	// 2.1 전체취소 여부 적용
-	if (ordDtlStat == "G013_10" && $("#spanPayAmt").text() == $("#spanRefundAmt").text()) {
-		allCanYn = "Y";	
-	}
+	var chgerPhnno1		= "";
+	var chgerPhnno2		= "";
+	var chgerPhnno3		= "";
 	
-	// 3. 취소사유 체크
-	var chgReason = $("#cancelRequestFrm select[name=selectChgReason]").val();
+	var chgerTelno1		= "";
+	var chgerTelno2		= "";
+	var chgerTelno3		= "";
 	
-	if (gagajf.isNull(chgReason)) {
-		mcxDialog.alert("취소사유를 입력하세요."); 
-		return ;
-	}
+	var chgerPhnno 		= "";
+	var chgerTelno 		= "";
+	var chgerEmail 		= "";
 	
-	// 4. 환불계좌 체크
-	var accountNo 	= "";
-	var accountNm 	= "";
-	var bankCd 		= "";
-	
-	// 결제타입이 무통장 입금일때 사용
-	if (payMeans == 'G014_20') {
-		var refundAccount = gridOptionsRefundAccountInfo.api.getSelectedRows();
+	if (reqGbn == "rtnReq") {
+		// 1. 취소수량 체크
+		for (i=0 ; i<cancelRequestTargetList.length ; i++) {		
+			if (cancelRequestTargetList[i].ordCanChgQty > 0) {
+				temp = true;
+			}
+		}
 		
-		if (refundAccount.length == 0) {
-			mcxDialog.alert('선택된 행이 없습니다.');
+		if (temp == false) {
+			mcxDialog.alert('취소 할 수량을 입력하세요.');
 			return;
 		}
 		
-		accountNo 	= refundAccount[0].accountNo;
-		accountNm 	= refundAccount[0].accountNm;
-		bankCd 		= refundAccount[0].bankCd;
-	}
-	
-	// 5. 회수지정보설정
-	var chgerNm			= $("#cancelRequestFrm input[name=chgerNm]").val();
-	var chgerZipcode	= $("#cancelRequestFrm input[name=chgerZipcode]").val();
-	var chgerBaseAddr	= $("#cancelRequestFrm input[name=chgerBaseAddr]").val();
-	var chgerDtlAddr	= $("#cancelRequestFrm input[name=chgerDtlAddr]").val();
-	
-	var chgerPhnno1		= $("#cancelRequestFrm select[name=chgerPhnno1]").val();
-	var chgerPhnno2		= $("#cancelRequestFrm input[name=chgerPhnno2]").val();
-	var chgerPhnno3		= $("#cancelRequestFrm input[name=chgerPhnno3]").val();
-	
-	var chgerTelno1		= $("#cancelRequestFrm select[name=chgerTelno1]").val();
-	var chgerTelno2		= $("#cancelRequestFrm input[name=chgerTelno2]").val();
-	var chgerTelno3		= $("#cancelRequestFrm input[name=chgerTelno3]").val();
+		// 2. 입금대기건 && 전체취소 체크
+		if (ordDtlStat == "G013_10" && $("#spanPayAmt").text() != $("#spanRefundAmt").text()) {
+			alert("입금대기건은 전체 취소만 가능합니다.");
+			return;
+		}
+		
+		// 2.1 전체취소 여부 적용
+		if (ordDtlStat == "G013_10" && $("#spanPayAmt").text() == $("#spanRefundAmt").text()) {
+			allCanYn = "Y";	
+		}
+		
+		// 3. 취소사유 체크
+		var chgReason = $("#cancelRequestFrm select[name=selectChgReason]").val();
+		
+		if (gagajf.isNull(chgReason)) {
+			mcxDialog.alert("취소사유를 입력하세요."); 
+			return ;
+		}
+		
+		// 4. 환불계좌 체크
+		// 결제타입이 무통장 입금일때 사용
+		if (payMeans == 'G014_20') {
+			var refundAccount = gridOptionsRefundAccountInfo.api.getSelectedRows();
+			
+			if (refundAccount.length == 0) {
+				mcxDialog.alert('선택된 행이 없습니다.');
+				return;
+			}
+			
+			accountNo 	= refundAccount[0].accountNo;
+			accountNm 	= refundAccount[0].accountNm;
+			bankCd 		= refundAccount[0].bankCd;
+		}
+		
+		// 5. 회수지정보설정
+		chgerNm			= $("#cancelRequestFrm input[name=chgerNm]").val();
+		chgerZipcode	= $("#cancelRequestFrm input[name=chgerZipcode]").val();
+		chgerBaseAddr	= $("#cancelRequestFrm input[name=chgerBaseAddr]").val();
+		chgerDtlAddr	= $("#cancelRequestFrm input[name=chgerDtlAddr]").val();
+		
+		chgerPhnno1		= $("#cancelRequestFrm select[name=chgerPhnno1]").val();
+		chgerPhnno2		= $("#cancelRequestFrm input[name=chgerPhnno2]").val();
+		chgerPhnno3		= $("#cancelRequestFrm input[name=chgerPhnno3]").val();
+		
+		chgerTelno1		= $("#cancelRequestFrm select[name=chgerTelno1]").val();
+		chgerTelno2		= $("#cancelRequestFrm input[name=chgerTelno2]").val();
+		chgerTelno3		= $("#cancelRequestFrm input[name=chgerTelno3]").val();
 
-	if (gagajf.isNull(chgerZipcode)) {
-		mcxDialog.alert("회수지주소를 입력하세요."); return;
-	}
-	if (gagajf.isNull(chgerBaseAddr)) {
-		mcxDialog.alert("회수지주소를 입력하세요."); return;
-	}
-	if (gagajf.isNull(chgerDtlAddr)) {
-		mcxDialog.alert("회수지주소를 입력하세요."); return;
+		if (gagajf.isNull(chgerZipcode)) {
+			mcxDialog.alert("회수지주소를 입력하세요."); return;
+		}
+		if (gagajf.isNull(chgerBaseAddr)) {
+			mcxDialog.alert("회수지주소를 입력하세요."); return;
+		}
+		if (gagajf.isNull(chgerDtlAddr)) {
+			mcxDialog.alert("회수지주소를 입력하세요."); return;
+		}
+		
+		if (gagajf.isNull(chgerPhnno1)) {
+			mcxDialog.alert("휴대전화를 입력하세요."); return;
+		}
+		if (gagajf.isNull(chgerPhnno2)) {
+			mcxDialog.alert("휴대전화를 입력하세요."); return;
+		}
+		if (gagajf.isNull(chgerPhnno3)) {
+			mcxDialog.alert("휴대전화를 입력하세요."); return;
+		}
+		
+		chgerPhnno 		= chgerPhnno1 + chgerPhnno2 + chgerPhnno3;
+		chgerTelno 		= chgerTelno1 + chgerTelno2 + chgerTelno3;
+		chgerEmail 		= orderInfoList[0].ordEmail;
+	} else {
+		
 	}
 	
-	if (gagajf.isNull(chgerPhnno1)) {
-		mcxDialog.alert("휴대전화를 입력하세요."); return;
+	// 2021.01.26 화면통합
+	// 6. 취소신청, 취소완료 여부 체크
+	// 반품신청
+	if (reqGbn == "rtnReq") {
+		confirmStr 		= "취소신청하시겠습니까?";
+		cnclUrl 		= '/orderChange/rtnReq/';
 	}
-	if (gagajf.isNull(chgerPhnno2)) {
-		mcxDialog.alert("휴대전화를 입력하세요."); return;
+	// 반품신청승인
+	else if (reqGbn == "rtnReqComplete") {
+
 	}
-	if (gagajf.isNull(chgerPhnno3)) {
-		mcxDialog.alert("휴대전화를 입력하세요."); return;
+	// 반품신청철회
+	else if (reqGbn == "rtnReqCancel") {
+		confirmStr 		= "요청번호 [" + ordChgSq + "] 에 대한 요청철회 처리를 하시겠습니까?";
+		cnclUrl 		= '/orderChange/rtnReqCancel/';
 	}
-	
-	var chgerPhnno 		= chgerPhnno1 + chgerPhnno2 + chgerPhnno3;
-	var chgerTelno 		= chgerTelno1 + chgerTelno2 + chgerTelno3;
-	var chgerEmail 		= orderInfoList[0].ordEmail;
-	
+
 	var jsonObj = {
 		"ordNo"				: $('#cancelRequestFrm input[name=ordNo]').val()
 		,"chgReason" 		: $('#cancelRequestFrm input[name=chgReason]').val()
@@ -1051,6 +1107,7 @@ var fnCancelRequestPartOk = function () {
 		,"chgerDtlAddr"		: chgerDtlAddr
 		,"chgerPhnno"		: chgerPhnno
 		,"chgerTelno"		: chgerTelno
+		,"ordChgSq"			: ordChgSq
 	}
 
 	// 주문번호, 취소사유, 취소메모, (취소, 반품, 교환 신청 정보 목록), 환불계좌
@@ -1061,7 +1118,7 @@ var fnCancelRequestPartOk = function () {
 		sureBtnClick		: function(){
 			// 취소 실행
 			gagajf.ajaxJsonSubmit(
-				'/orderChange/returnRequest/'
+					cnclUrl
 				, jsonData
 				, function() {
 					uifnPopupClose('popupOrderDetail');
@@ -1157,6 +1214,31 @@ $(document).ready(function() {
 	
 	// 5. 회수지정보설정
 	fnSetChger();
+	
+	// 6. 반품신청, 반품승인, 반품철회 버튼 제어
+	if (ordChgSq > 0) {
+		$("#rtnReqBtn").css("display", "none");
+	} else {
+		$("#rtnReqCompleteBtn").css("display", "none");
+		$("#rtnReqCancelBtn").css("display", "none");
+	}
+	
+	// 7. 취소사유 선택
+	if (ordChgSq > 0) {
+		$("select[name='selectChgReason']").val(chgReason);										// 변경사유코드
+		$("select[name='selectChgReason']").attr("disabled", "true");							// 변경사유 비활성화
+		$("#chgMemo").text(chgMemo);															// 변경사유메모
+		$("#chgMemo").attr("disabled", "true");													// 변경사유메모 비활성화
+		fnChangeChgReason(chgReason);															// 귀책사유
+	}
+	
+	// debug mode 해제
+	if (temp2) {
+		$("#h4OrderCancelRequestToBeList").css("display", "none");
+		$("#gridOrderCancelRequestToBeList").css("display", "none");
+		$("#h4DelvCdList").css("display", "none");
+		$("#gridDelvCdList").css("display", "none");
+	}
 });
 </script>
 </html>

+ 1 - 1
src/main/webapp/ux/css/admin.ui.css

@@ -599,7 +599,7 @@ hr {border:0; padding-bottom:10px;}/* 기본 여백 :10px */
 .w20 {width:20px !important;}
 .w50 {width:50px !important;}
 .w60 {width:60px !important;}
-.w70 {width:60px !important;}
+.w70 {width:70px !important;}
 .w80 {width:80px !important;}
 .w90 {width:80px !important;}
 .w100 {width:100px !important;}

+ 19 - 1
src/main/webapp/ux/js/admin.popup.js

@@ -704,7 +704,7 @@ var cfnOpenBrandListPopup = function(callbackfn, multiGb, searchTxt) {
  * @author : xodud1202
  */
 var cfnOpenFreeGoodsPromotionSetPopup = function(gbn, freegiftSq) {
-	var actionUrl = "/marketing/freeGoodsRegiPopup/form?gbn=" + gbn;
+	var actionUrl = "/marketing/freegoods/promotion/popup/form?gbn=" + gbn;
 	if (typeof(freegiftSq) != 'undefined') actionUrl += "&freegiftSq=" + freegiftSq;
 
 	uifnPopupClose('popupFreeGoodsPromotionRegi');
@@ -821,3 +821,21 @@ var cfnOpenSupplyVendorPopup = function(sName, oParam) {
 
 	cfnOpenModalPopup(actionUrl, 'popupSupplyVendor');
 }
+
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 카드목록 조회 팝업
+ * <pre>
+ *     cfnOpenCardListPopup('fnResult', 'G941_01|G941_02|');
+ * </pre>
+ * @since  : 2021/02/01
+ * @author : eskim
+ */
+var cfnOpenCardListPopup = function(callBackFun, arrCard) {
+	var actionUrl = "/marketing/card/list/popup/form?callBackFun=" + callBackFun;
+	actionUrl += "&arrCard=" + arrCard;
+
+	cfnOpenModalPopup(actionUrl, 'popupCardList');
+}

+ 1 - 1
src/main/webapp/ux/plugins/gaga/gaga.paging.js

@@ -185,7 +185,7 @@ var gagaPaging = {
 				pageTag += "<a class=\"arrow\" href=\"#pageNo="+ (getPageGroup()-1) * pageUnit + "\"><i class=\"fa fa-angle-left\" alt=\"이전페이지\"></i></a>\n"
 			}
 
-			for (let i = firstCount; i < loopCount; i++) {
+			for (var i = firstCount; i < loopCount; i++) {
 				if (pageNo == i) {
 					pageTag += "<a class=\"num on\" href=\"#\">"+ i + "</a>\n";
 				} else {