Forráskód Böngészése

Merge branch 'develop' into xyzp1539

# Conflicts:
#	style24.admin/src/main/java/com/style24/admin/biz/dao/TsaEnvsetDao.java
#	style24.admin/src/main/java/com/style24/admin/biz/dao/TsaMarketingDao.java
#	style24.admin/src/main/java/com/style24/admin/biz/dao/TsaOrderDao.java
#	style24.admin/src/main/java/com/style24/admin/biz/service/TsaEnvsetService.java
#	style24.admin/src/main/java/com/style24/admin/biz/service/TsaMarketingService.java
#	style24.admin/src/main/java/com/style24/admin/biz/service/TsaOrderService.java
#	style24.admin/src/main/java/com/style24/admin/biz/web/TsaEnvsetController.java
#	style24.admin/src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
#	style24.admin/src/main/java/com/style24/admin/biz/web/TsaOrderController.java
#	style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterBurden.java
#	style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterGoods.java
#	style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterSection.java
#	style24.admin/src/main/java/com/style24/persistence/domain/Order.java
#	style24.admin/src/main/java/com/style24/persistence/domain/OrderChange.java
#	style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaEnvset.xml
#	style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaMarketing.xml
#	style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml
#	style24.admin/src/main/webapp/WEB-INF/views/envset/CustomerGradePolicyForm.html
#	style24.admin/src/main/webapp/WEB-INF/views/marketing/MorebetterListForm.html
#	style24.admin/src/main/webapp/WEB-INF/views/marketing/MorebetterRegForm.html
#	style24.admin/src/main/webapp/WEB-INF/views/order/RefundAccountRegistForm.html
#	style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsProductStockJob.java
#	style24.front/target/m2e-wtp/web-resources/META-INF/MANIFEST.MF
#	style24.front/target/m2e-wtp/web-resources/META-INF/maven/com.style24.front/style24.front/pom.properties
xyzp1539 5 éve
szülő
commit
57822fc021
100 módosított fájl, 10373 hozzáadás és 5986 törlés
  1. 34 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaExchDao.java
  2. 2 75
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaMarketingDao.java
  3. 181 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaMorebetterDao.java
  4. 188 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaOrderChangeDao.java
  5. 46 177
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaOrderDao.java
  6. 33 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaPgDao.java
  7. 35 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaRefundDao.java
  8. 33 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaReturnDao.java
  9. 0 148
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaMarketingService.java
  10. 363 0
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java
  11. 580 0
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaOrderChangeService.java
  12. 137 619
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaOrderService.java
  13. 48 0
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaPgService.java
  14. 117 21
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
  15. 292 0
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java
  16. 86 271
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaOrderController.java
  17. 75 0
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaPgController.java
  18. 24 23
      style24.admin/src/main/java/com/style24/persistence/domain/Aflink.java
  19. 1 1
      style24.admin/src/main/java/com/style24/persistence/domain/FreeGoods.java
  20. 1 1
      style24.admin/src/main/java/com/style24/persistence/domain/Goods.java
  21. 3 0
      style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterBurden.java
  22. 12 0
      style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterGoods.java
  23. 4 0
      style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterSection.java
  24. 1 1
      style24.admin/src/main/java/com/style24/persistence/domain/Option.java
  25. 8 6
      style24.admin/src/main/java/com/style24/persistence/domain/Order.java
  26. 4 2
      style24.admin/src/main/java/com/style24/persistence/domain/OrderChange.java
  27. 1 1
      style24.admin/src/main/java/com/style24/persistence/domain/WmsGoods.java
  28. 4 0
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaBusiness.xml
  29. 107 107
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaEnvset.xml
  30. 1 1
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  31. 1 175
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaMarketing.xml
  32. 444 0
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaMorebetter.xml
  33. 80 806
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml
  34. 777 0
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaOrderChange.xml
  35. 22 0
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaPg.xml
  36. 282 270
      style24.admin/src/main/webapp/WEB-INF/views/business/AflinkForm.html
  37. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/common/ExcelUploadPopupForm.html
  38. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/customer/GoodsQnaDetailForm.html
  39. 254 254
      style24.admin/src/main/webapp/WEB-INF/views/envset/AnswerPhaseForm.html
  40. 379 379
      style24.admin/src/main/webapp/WEB-INF/views/envset/BasicEnvsetForm.html
  41. 1 0
      style24.admin/src/main/webapp/WEB-INF/views/envset/CustomerGradePolicyForm.html
  42. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsDealForm.html
  43. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html
  44. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsDetailSizeStockForm.html
  45. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsEpSkipForm.html
  46. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsEpSkipPopupForm.html
  47. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsFreeGoodsForm.html
  48. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsImageForm.html
  49. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsItemkindForm.html
  50. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsListForm.html
  51. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsMassRegisterForm.html
  52. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsNaverPriceForm.html
  53. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsPopupListForm.html
  54. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsPriceReserveForm.html
  55. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsPriceReservePopupForm.html
  56. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsReinboundInformForm.html
  57. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsReserveSellForm.html
  58. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsReserveSellPopupForm.html
  59. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsSetForm.html
  60. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsSupplyPriceForm.html
  61. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsTitleReserveForm.html
  62. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsTitleReservePopupForm.html
  63. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsVideoForm.html
  64. 33 2
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsWmsIncomelotForm.html
  65. 211 0
      style24.admin/src/main/webapp/WEB-INF/views/marketing/CouponRetrieveForm.html
  66. 11 5
      style24.admin/src/main/webapp/WEB-INF/views/marketing/MorebetterListForm.html
  67. 887 676
      style24.admin/src/main/webapp/WEB-INF/views/marketing/MorebetterRegForm.html
  68. 226 37
      style24.admin/src/main/webapp/WEB-INF/views/order/CancelRequestForm.html
  69. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/order/CancelRequestFormBack.html
  70. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/order/OrderDetailChangeHst.html
  71. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/order/OrderDetailCouponHst.html
  72. 427 414
      style24.admin/src/main/webapp/WEB-INF/views/order/OrderDetailForm.html
  73. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/order/OrderDetailGiftcardHst.html
  74. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/order/OrderDetailPointHst.html
  75. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/order/OrderDetailTmtbHst.html
  76. 3 3
      style24.admin/src/main/webapp/WEB-INF/views/order/OrderListForm.html
  77. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/order/OrderMemoRegistForm.html
  78. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/order/OrderSellerListForm.html
  79. 27 26
      style24.admin/src/main/webapp/WEB-INF/views/order/RefundAccountRegistForm.html
  80. 1105 0
      style24.admin/src/main/webapp/WEB-INF/views/order/ReturnRequestForm.html
  81. 146 146
      style24.admin/src/main/webapp/WEB-INF/views/settle/DeliveryFeeSettleForm.html
  82. 181 163
      style24.admin/src/main/webapp/WEB-INF/views/settle/GoodsSettleForm.html
  83. 200 200
      style24.admin/src/main/webapp/WEB-INF/views/settle/SettleConfirmForm.html
  84. 1 1
      style24.admin/src/main/webapp/WEB-INF/views/stock/GoodsSizeStockForm.html
  85. 923 885
      style24.admin/src/main/webapp/ux/css/admin.ui.css
  86. 22 3
      style24.admin/src/main/webapp/ux/js/admin.popup.js
  87. 189 0
      style24.batch/src/main/java/com/style24/batch/biz/dao/TsbGoodsDao.java
  88. 21 0
      style24.batch/src/main/java/com/style24/batch/biz/dao/TsbWmsGoodsDao.java
  89. 3 3
      style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsBrandproviderJob.java
  90. 1 1
      style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsIncomelotJob.java
  91. 1 1
      style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsMeasurementJob.java
  92. 50 3
      style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsProductStockJob.java
  93. 214 21
      style24.batch/src/main/java/com/style24/batch/biz/service/TsbGoodsService.java
  94. 79 10
      style24.batch/src/main/java/com/style24/batch/biz/service/TsbWmsGoodsService.java
  95. 2 3
      style24.batch/src/main/java/com/style24/batch/biz/task/TsbDeliveryTask.java
  96. 31 0
      style24.batch/src/main/java/com/style24/batch/biz/task/TsbGoodsTask.java
  97. 1 1
      style24.batch/src/main/java/com/style24/persistence/domain/Goods.java
  98. 48 0
      style24.batch/src/main/java/com/style24/persistence/domain/Option.java
  99. 597 12
      style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml
  100. 40 0
      style24.batch/src/main/java/com/style24/persistence/mybatis/wms/TsbWmsGoods.xml

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

@@ -0,0 +1,34 @@
+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 TsaExchDao {
+	
+	
+}
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 2 - 75
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaMarketingDao.java

@@ -1,8 +1,9 @@
 package com.style24.admin.biz.dao;
 
+import org.springframework.stereotype.Component;
+
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.*;
-import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -29,78 +30,4 @@ public interface TsaMarketingDao {
 
 	/* // xodud1202 진행 */
 
-
-	/* CSB 진행 */
-	/**
-	 * 다다익선 프로모션 리스트
-	 * @param MoreBetter
-	 * @return
-	 * @author bin2107
-	 * @since 2020. 12. 28
-	 */
-	Collection<MoreBetter> getMorebetterList(MoreBetter param);
-
-	/**
-	 * 다다익선 마스터(TB_TMTB) 저장
-	 * @param MoreBetter
-	 * @return
-	 * @author bin2107
-	 * @since 2020. 12. 28
-	 */
-	void saveMorebetterMst(MoreBetter tmtb);
-
-	/**
-	 * 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
-	 * @param MoreBetter
-	 * @return
-	 * @author bin2107
-	 * @since 2021. 1. 7
-	 */
-	void saveMorebetterGoods(MoreBetterGoods regSupplyComp);
-
-	/**
-	 * 다다익선 할인구간설정 2차조건(TB_TMTB_SECTION) 저장
-	 * @param MoreBetter
-	 * @return
-	 * @author bin2107
-	 * @since 2021. 1. 6
-	 */
-	void saveMorebetterSection(MoreBetterSection regSection);
-
-	/**
-	 * 다다익선 조건에 따른 할인혜택(금액할인) 설정(TB_TMTB_VAL) 저장
-	 * @param MoreBetter
-	 * @return
-	 * @author bin2107
-	 * @since 2021. 1. 6
-	 */
-	void saveMorebetterVal(MoreBetterSection regSection);
-
-	/**
-	 * 다다익선 업체분담율(TB_TMTB_BURDEN) 저장
-	 * @param MoreBetter
-	 * @return
-	 * @author bin2107
-	 * @since 2020. 12. 28
-	 */
-	void saveMorebetterBurden(MoreBetterBurden regBurden);
-
-	/**
-	 * 다다익선 할인구간설정(TB_TMTB_SECTION) 삭제
-	 * @param MoreBetter
-	 * @return
-	 * @author bin2107
-	 * @since 2021. 1. 6
-	 */
-	void deleteTmtbSectionList(MoreBetterSection sectionVal);
-
-	/**
-	 * 다다익선 조건에 따른 할인혜택(금액할인) 설정(TB_TMTB_VAL) 삭제
-	 * @param MoreBetter
-	 * @return
-	 * @author bin2107
-	 * @since 2021. 1. 6
-	 */
-	void deleteTmtbValList(MoreBetterSection sectionVal);
-	/* // CSB 진행 */
 }

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

@@ -0,0 +1,181 @@
+package com.style24.admin.biz.dao;
+
+import com.style24.core.support.annotation.ShopDs;
+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 org.springframework.stereotype.Component;
+
+import java.util.Collection;
+
+/**
+ * 마케팅 다다익선 Dao
+ *
+ * @author bin2107
+ * @since 2021. 1. 12
+ */
+@ShopDs
+@Component
+public interface TsaMorebetterDao {
+    /* CSB 진행 */
+    /**
+     * 다다익선 프로모션 리스트
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2020. 12. 28
+     */
+    Collection<MoreBetter> getMorebetterList(MoreBetter param);
+
+    /**
+     * 다다익선 상세조회
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 8
+     */
+    MoreBetter getMorebetterMstInfo(Integer tmtbSq);
+
+    /**
+     * 다다익선 구간 조회
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 8
+     */
+    Collection<MoreBetterSection> getMorebetterSectionValList(Integer tmtbSq);
+
+    /**
+     * 다다익선 구간 조회
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 8
+     */
+    Collection<MoreBetterGoods> getMorebetterSupplyCompList(MoreBetterGoods merebetterGoods);
+
+    Collection<MoreBetterGoods> getMorebetterBrandList(MoreBetterGoods merebetterGoods);
+
+    Collection<MoreBetterGoods> getMorebetterApplyGoodsList(MoreBetterGoods merebetterGoods);
+
+    Collection<MoreBetterGoods> getMorebetterExceptGoodsList(MoreBetterGoods merebetterGoods);
+
+    /**
+     * 다다익선 구간 조회
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 8
+     */
+    Collection<MoreBetterBurden> getMorebetterBurdenList(Integer tmtbSq);
+
+    /**
+     * 다다익선 마스터(TB_TMTB) 저장
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2020. 12. 28
+     */
+    void saveMorebetterMst(MoreBetter tmtb);
+
+    /**
+     * 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 7
+     */
+    void saveMorebetterGoods(MoreBetterGoods regSupplyComp);
+
+    /**
+     * 다다익선 할인구간설정 2차조건(TB_TMTB_SECTION) 저장
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 6
+     */
+    void saveMorebetterSection(MoreBetterSection regSection);
+
+    /**
+     * 다다익선 조건에 따른 할인혜택(금액할인) 설정(TB_TMTB_VAL) 저장
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 6
+     */
+    void saveMorebetterVal(MoreBetterSection regSection);
+
+    /**
+     * 다다익선 업체분담율(TB_TMTB_BURDEN) 저장
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2020. 12. 28
+     */
+    void saveMorebetterBurden(MoreBetterBurden regBurden);
+
+    /**
+     * 다다익선 공급업체(TB_TMTB_GOODS) 삭제
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 12
+     */
+    void deleteTmtbSupplyCompanyList(MoreBetterGoods moreBetterGoods);
+
+    /**
+     * 다다익선 브랜드(TB_TMTB_GOODS) 삭제
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 12
+     */
+    void deleteTmtbBrandList(MoreBetterGoods moreBetterGoods);
+
+    /**
+     * 다다익선 적용상품(TB_TMTB_GOODS) 삭제
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 12
+     */
+    void deleteTmtbApplyGoodsList(MoreBetterGoods moreBetterGoods);
+
+    /**
+     * 다다익선 제외상품(TB_TMTB_GOODS) 삭제
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 12
+     */
+    void deleteTmtbExceptGoodsList(MoreBetterGoods moreBetterGoods);
+
+    /**
+     * 다다익선 할인구간설정(TB_TMTB_SECTION) 삭제
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 6
+     */
+    void deleteTmtbSectionList(MoreBetterSection moreBetterSection);
+
+    /**
+     * 다다익선 조건에 따른 할인혜택(금액할인) 설정(TB_TMTB_VAL) 삭제
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 6
+     */
+    void deleteTmtbValList(MoreBetterSection moreBetterSection);
+
+    /**
+     * 다다익선 업체분담율(TB_TMTB_BURDEN) 삭제
+     * @param MoreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 12
+     */
+    void deleteTmtbBurdenList(MoreBetterBurden moreBetterBurden);
+    /* // CSB 진행 */
+}

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

@@ -0,0 +1,188 @@
+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);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 46 - 177
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaOrderDao.java

@@ -16,25 +16,25 @@ import com.style24.persistence.domain.OrderChange;
  */
 @ShopDs
 public interface TsaOrderDao {
-	
+
 	/**
 	 * 주문 목록 카운트
 	 * @param Order
 	 * @return
-	 * @author jsh77b	
+	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
 	int getOrderListCount(Order order);
-	
+
 	/**
 	 * 주문 목록
 	 * @param Order
 	 * @return
-	 * @author jsh77b	
+	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
 	Collection<Order> getOrderList(Order order);
-	
+
 	/**
 	 * 주문기본정보
 	 *
@@ -44,7 +44,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 18
 	 */
 	Collection<Order> getOrderInfoList(Order order);
-	
+
 	/**
 	 * 주문상품정보 목록
 	 *
@@ -54,7 +54,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 18
 	 */
 	Collection<Order> getOrderDetailList(Order order);
-	
+
 	/**
 	 * 주문상세 > 사은품목록
 	 *
@@ -64,7 +64,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 18
 	 */
 	Collection<Order> getOrderFreeGiftList(Order order);
-	
+
 	/**
 	 * 배송정보
 	 *
@@ -74,7 +74,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 18
 	 */
 	Collection<Order> getDeliveryAddrList(Order order);
-	
+
 	/**
 	 * 결제내역 > 결제 기본정보
 	 *
@@ -84,7 +84,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 18
 	 */
 	Collection<Order> getOrderPaymentBasicInfoList(Order order);
-	
+
 	/**
 	 * 배송비 정보
 	 *
@@ -94,7 +94,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 18
 	 */
 	Collection<Order> getDeliveryFeeList(Order order);
-	
+
 	/**
 	 * 반품/교환 > 반품/교환 정보
 	 *
@@ -104,7 +104,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 18
 	 */
 	Collection<Order> getOrderChangeList(Order order);
-	
+
 	/**
 	 * 환불정보
 	 *
@@ -113,8 +113,8 @@ public interface TsaOrderDao {
 	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
-	Collection<Order> orderRefundInfo(Order order);
-	
+	Collection<Order> getOrderRefundInfo(Order order);
+
 	/**
 	 * 상담내역
 	 *
@@ -123,8 +123,8 @@ public interface TsaOrderDao {
 	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
-	Collection<Order> orderCounselInfo(Order order);
-	
+	Collection<Order> getOrderCounselInfo(Order order);
+
 	/**
 	 * 변경내역 > 주문요청 관리자 메모
 	 *
@@ -133,8 +133,8 @@ public interface TsaOrderDao {
 	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
-	Collection<Order> getOrderTsainMemoList(Order order);
-	
+	Collection<Order> getOrderMemoList(Order order);
+
 	/**
 	 * 입점업체미발주 주문목록
 	 *
@@ -144,7 +144,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 18
 	 */
 	Collection<Order> getOrderSellerUnorderList(Order order);
-	
+
 	/**
 	 * 입점업체 엑셀다운용 임시테이블 삭제
 	 *
@@ -153,7 +153,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 30
 	 */
 	void deleteEntryExcelDownTmp(Order order);
-	
+
 	/**
 	 * 주문상세상태 수정 - 입점
 	 *
@@ -162,7 +162,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 30
 	 */
 	int updateOrderDetailStat(Order order);
-	
+
 	/**
 	 * 주문상세 이력 등록
 	 *
@@ -172,7 +172,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 30
 	 */
 	int createOrderDetailHst(Order order);
-	
+
 	/**
 	 * 엑셀 다운로드용 임시테이블 데이타 체크
 	 *
@@ -181,7 +181,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 30
 	 */
 	int getEntryUploadExcelCheck(Order order);
-	
+
 	/**
 	 * 입점업체 엑셀다운용 임시테이블 생성
 	 *
@@ -190,7 +190,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 30
 	 */
 	void createEntryExcelDownTmp(Order order);
-	
+
 	/**
 	 * 입점업체미발주목록
 	 *
@@ -200,7 +200,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 30
 	 */
 	Collection<Order> getSellerUnorderList(Order order);
-	
+
 	/**
 	 * 주문 엑셀다운로드
 	 *
@@ -210,7 +210,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 30
 	 */
 	void getSellerUnorderList(Order order, ResultHandler<Order> handler);
-	
+
 	/**
 	 * 주문상세 정보
 	 *
@@ -220,7 +220,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 30
 	 */
 	Order getOrderDetailInfo(Order order);
-	
+
 	/**
 	 * 주문상세정보 변경 - 송장번호 적용(입점)
 	 *
@@ -229,7 +229,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 11. 30
 	 */
 	int updateOrderDetailInvoice(Order order);
-	
+
 	/**
 	 * 주문상세 > 주문메오 > 주문메모정보조회
 	 *
@@ -239,7 +239,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 12. 16
 	 */
 	Order getOrderMemoInfo(Order order);
-	
+
 	/**
 	 * 주문상세 > 주문요청 관리자 메모 > 메모등록
 	 *
@@ -249,7 +249,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 12. 16
 	 */
 	int createOrderMemo(Order order);
-	
+
 	/**
 	 * 주문상세 > 주문요청 관리자 메모 > 메모수정
 	 *
@@ -259,7 +259,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 12. 16
 	 */
 	int updateOrderMemo(Order order);
-	
+
 	/**
 	 * 주문상세 > 주문요청 관리자 메모 > 메모삭제
 	 *
@@ -269,7 +269,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 12. 16
 	 */
 	int deleteOrderMemo(Order order);
-	
+
 	/**
 	 * 주문상품 상세 변경 이력 화면
 	 *
@@ -279,7 +279,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 12. 16
 	 */
 	Collection<Order> getOrderDetailHistoryList(Order order);
-	
+
 	/**
 	 * 쿠폰사용 내역 팝업 화면
 	 *
@@ -289,7 +289,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 12. 16
 	 */
 	Collection<Order> getOrderDiscountCouponList(Order order);
-	
+
 	/**
 	 * 포인트사용 내역 팝업 화면
 	 *
@@ -299,7 +299,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 12. 16
 	 */
 	Collection<Order> getOrderDiscountPointList(Order order);
-	
+
 	/**
 	 * 상품권사용 내역 팝업 화면
 	 *
@@ -309,7 +309,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 12. 16
 	 */
 	Collection<Order> getOrderGiftcardHstList(Order order);
-	
+
 	/**
 	 * 다다익선적용 내역 팝업 화면
 	 *
@@ -319,7 +319,7 @@ public interface TsaOrderDao {
 	 * @since 2020. 12. 16
 	 */
 	Collection<Order> getOrderTmtbHstList(Order order);
-	
+
 	/**
 	 * 주문상세상태를 변경
 	 *
@@ -329,148 +329,17 @@ public interface TsaOrderDao {
 	 * @since 2020. 12. 22
 	 */
 	int changedOrdDtlStat(Order order);
-	
-	/**
-	 * 주문정보조회
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 22
-	 */
-	Order getOrderInfo(Order order);
 
-	/**
-	 * 주문상세 > 주문취소대상목록
-	 *
-	 * @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 createOrderChangeDetail(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 2020. 12. 22
-	 */
-	int createOrderDetailHstCnclRtn(Order order);
 
-	/**
-	 * 주문상세 > 주문취소신청 > 주문상세정보 수정
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 22
-	 */
-	int updateOrderDetail(Order order);
-	
-	/**
-	 * 주문상세 > 주문취소신청 > 주문 환불 정보 등록
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 22
-	 */
-	int createRefund(Order order);
-	
-	/**
-	 * 주문상세 > 주문취소신청 > 주문 환불 금액 정보 등록
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 22
-	 */
-	int createPayment(Order order);
-	
-	/**
-	 * 주문상세 > 주문취소신청 > 주문 추가 배송 금액 등록
-	 *
-	 * @param Order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2021. 01. 06
-	 */
-	int createDeliveryFee(Order order);
-	
-	/**
-	 * 고객환불계좌 정보 조회
-	 *
-	 * @param order - 주문 정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2021. 01. 04
-	 */
-	Collection<Order> getRefundAccount(Order order);
-	
-	/**
-	 * 환불계좌 존재 유무 체크
-	 *
-	 * @param order
-	 * @return int
-	 * @author jsh77b
-	 * @since 2021. 01. 05
-	 */
-	int getRefundAccountCheck(Order order);
-	
-	/**
-	 * 환불계좌 저정
-	 *
-	 * @param order
-	 * @return int
-	 * @author jsh77b
-	 * @since 2021. 01. 05
-	 */
-	int saveRefundAccount(Order order);
-	
-	
+
+
+
+
+
+
+
+
+
 }
 
 

+ 33 - 0
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaPgDao.java

@@ -0,0 +1,33 @@
+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 TsaPgDao {
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+

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

@@ -0,0 +1,35 @@
+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 TsaRefundDao {
+	
+	
+	
+}
+
+
+
+
+
+
+
+
+
+
+
+
+

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

@@ -0,0 +1,33 @@
+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 TsaReturnDao {
+	
+}
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 0 - 148
style24.admin/src/main/java/com/style24/admin/biz/service/TsaMarketingService.java

@@ -66,7 +66,6 @@ public class TsaMarketingService {
 	@Autowired
 	private NaverLowestPriceApi naverLowestPriceApi;
 
-
 	@Autowired
 	private ObjectMapper mapper;
 
@@ -89,151 +88,4 @@ public class TsaMarketingService {
 
 	/* // xodud1202 진행 */
 
-	/* JSM 진행 */
-
-	/* // JSM 진행 */
-
-	/* CSB 진행 */
-	/**
-	 * 다다익선 리스트
-	 * @param param
-	 * @return
-	 * @author bin2107
-	 * @since 2020. 12. 28
-	 */
-	public Collection<MoreBetter> getMorebetterList(MoreBetter param) {
-		return marketingDao.getMorebetterList(param);
-	}
-
-	/**
-	 * 다다익선 저장
-	 * @param tmtb
-	 * @return
-	 * @author bin2107
-	 * @since 2021. 1. 5
-	 */
-	@Transactional("shopTxnManager")
-	public void saveMoreBetterDetail(MoreBetter tmtb) {
-		// <,> replace 처리
-		tmtb.setRegNo(TsaSession.getInfo().getUserNo());
-		tmtb.setUdpNo(TsaSession.getInfo().getUserNo());
-
-		// TMTB 마스터(TB_TMTB) 저장
-		marketingDao.saveMorebetterMst(tmtb);
-
-		// 다다익선 적용대상 설정
-		// 공급업체
-		Collection<MoreBetterGoods> supplyCompList = tmtb.getSupplyCompListNew();
-		for(MoreBetterGoods regSupplyComp : supplyCompList){
-			// 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
-			// tmtbGoodsSq 생성
-			Integer tmtbGoodsSq =  commonService.getNextSequence("SEQ_TMTB_GOODS");
-			regSupplyComp.setTmtbGoodsSq(tmtbGoodsSq);
-			regSupplyComp.setTmtbSq(tmtb.getTmtbSq());
-			regSupplyComp.setGoodsGb("G800_20");
-			regSupplyComp.setTargetVal(regSupplyComp.getSupplyCompCd());
-			regSupplyComp.setRegNo(tmtb.getRegNo());
-			regSupplyComp.setUdpNo(tmtb.getUdpNo());
-
-			marketingDao.saveMorebetterGoods(regSupplyComp);
-		}
-
-		// 브랜드
-		Collection<MoreBetterGoods> brandList = tmtb.getBrandListNew();
-		for(MoreBetterGoods regBrand : brandList){
-			// 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
-			// tmtbGoodsSq 생성
-			Integer tmtbGoodsSq =  commonService.getNextSequence("SEQ_TMTB_GOODS");
-			regBrand.setTmtbGoodsSq(tmtbGoodsSq);
-			regBrand.setTmtbSq(tmtb.getTmtbSq());
-			regBrand.setGoodsGb("G800_20");
-			regBrand.setTargetVal(regBrand.getBrandCd());
-			regBrand.setRegNo(tmtb.getRegNo());
-			regBrand.setUdpNo(tmtb.getUdpNo());
-
-			marketingDao.saveMorebetterGoods(regBrand);
-		}
-
-		// 적용상품
-		Collection<MoreBetterGoods> applyGoodsList = tmtb.getApplyGoodsListNew();
-		for(MoreBetterGoods regApplyGoods : applyGoodsList){
-			// 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
-			// tmtbGoodsSq 생성
-			Integer tmtbGoodsSq =  commonService.getNextSequence("SEQ_TMTB_GOODS");
-			regApplyGoods.setTmtbGoodsSq(tmtbGoodsSq);
-			regApplyGoods.setTmtbSq(tmtb.getTmtbSq());
-			regApplyGoods.setTargetVal(regApplyGoods.getGoodsCd());
-			regApplyGoods.setRegNo(tmtb.getRegNo());
-			regApplyGoods.setUdpNo(tmtb.getUdpNo());
-
-			marketingDao.saveMorebetterGoods(regApplyGoods);
-		}
-
-		// 제외상품
-		Collection<MoreBetterGoods> exceptGoodsList = tmtb.getExceptGoodsListNew();
-		for(MoreBetterGoods regExceptGoods : exceptGoodsList){
-			// 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
-			// tmtbGoodsSq 생성
-			Integer tmtbGoodsSq =  commonService.getNextSequence("SEQ_TMTB_GOODS");
-			regExceptGoods.setTmtbGoodsSq(tmtbGoodsSq);
-			regExceptGoods.setTmtbSq(tmtb.getTmtbSq());
-			regExceptGoods.setTargetVal(regExceptGoods.getGoodsCd());
-			regExceptGoods.setRegNo(tmtb.getRegNo());
-			regExceptGoods.setUdpNo(tmtb.getUdpNo());
-
-			marketingDao.saveMorebetterGoods(regExceptGoods);
-		}
-
-		// 다다익선 할인구간 저장
-		Collection<MoreBetterSection> sectionGbList = tmtb.getSectionGbListNew();
-		for(MoreBetterSection regSection : sectionGbList){
-			// 다다익선 할인구간설정 2차조건(TB_TMTB_SECTION) 저장
-			// tmtbSectionSq 생성
-			Integer tmtbSectionSq =  commonService.getNextSequence("SEQ_TMTB_SECTION");
-			regSection.setTmtbSectionSq(tmtbSectionSq);
-
-			// 다다익선 조건에 따른 할인혜택(금액할인) 설정(TB_TMTB_VAL) 저장
-			// tmtbValSq 생성
-			Integer tmtbValSq =  commonService.getNextSequence("SEQ_TMTB_VAL");
-			regSection.setTmtbValSq(tmtbValSq);
-			regSection.setTmtbSq(tmtb.getTmtbSq());
-			regSection.setRegNo(tmtb.getRegNo());
-			regSection.setUdpNo(tmtb.getUdpNo());
-
-			marketingDao.saveMorebetterSection(regSection);
-			marketingDao.saveMorebetterVal(regSection);
-		}
-
-		// 다다익선 업체분담율(TB_TMTB_BURDEN) 저장
-		Collection<MoreBetterBurden> burdenList = tmtb.getBurdenListNew();
-		for (MoreBetterBurden regBurden : burdenList) {
-			// tmtbBurdenSq 생성
-			Integer tmtbBurdenSq =  commonService.getNextSequence("SEQ_TMTB_BURDEN");
-			regBurden.setTmtbBurdenSq(tmtbBurdenSq);
-			regBurden.setTmtbSq(tmtb.getTmtbSq());
-			regBurden.setRegNo(tmtb.getRegNo());
-			regBurden.setUdpNo(tmtb.getUdpNo());
-
-			marketingDao.saveMorebetterBurden(regBurden);
-		}
-
-		log.info("newBurdenSq = {}, newTmtbSq = {}, newSupplyCd = {}, newBurdenRate = {} , newUseYn = {}");
-
-	}
-
-	/**
-	 * 다다익선 다다익선 할인구간 삭제
-	 * @param tmtb
-	 * @return
-	 * @author bin2107
-	 * @since 2021. 1. 5
-	 */
-	@Transactional("shopTxnManager")
-	public void deleteSectionValList(Collection<MoreBetterSection> sectionValList) {
-		for (MoreBetterSection sectionVal : sectionValList) {
-			marketingDao.deleteTmtbSectionList(sectionVal);
-			marketingDao.deleteTmtbValList(sectionVal);
-		}
-	}
-	/* // CSB 진행 */
 }

+ 363 - 0
style24.admin/src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java

@@ -0,0 +1,363 @@
+package com.style24.admin.biz.service;
+
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.message.TscMessageByLocale;
+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 lombok.extern.slf4j.Slf4j;
+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.style24.admin.biz.dao.TsaMorebetterDao;
+
+import java.util.Collection;
+
+/**
+ *마케팅>다다익선 Service
+ *
+ * @author bin2107
+ * @since 2021. 1. 12
+ */
+@Service
+@Slf4j
+public class TsaMorebetterService {
+    @Autowired
+    private TscMessageByLocale message;
+
+    @Autowired
+    private Environment env;
+
+    @Autowired
+    private TsaMorebetterDao morebetterDao;
+
+    @Autowired
+    private TsaCommonService commonService;
+
+    /* CSB 진행 */
+    /**
+     * 다다익선 리스트
+     * @param param
+     * @return
+     * @author bin2107
+     * @since 2020. 12. 28
+     */
+    public Collection<MoreBetter> getMorebetterList(MoreBetter param) {
+        return morebetterDao.getMorebetterList(param);
+    }
+
+    /**
+     * 다다익선 마스터 조회
+     * @param
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 8
+     */
+    public MoreBetter getMorebetterMstInfo(Integer tmtbSq){
+        return morebetterDao.getMorebetterMstInfo(tmtbSq);
+    }
+
+    /**
+     * 다다익선 구간 조회
+     * @param
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 8
+     */
+    public Collection<MoreBetterSection> getMorebetterSectionValList(Integer tmtbSq) {
+        return morebetterDao.getMorebetterSectionValList(tmtbSq);
+    }
+
+    /**
+     * 다다익선 구간 조회
+     * @param
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 8
+     */
+    public Collection<MoreBetterGoods> getMorebetterSupplyCompList(Integer tmtbSq, String targetGb) {
+        MoreBetterGoods merebetterGoods = new MoreBetterGoods();
+        merebetterGoods.setTmtbSq(tmtbSq);
+        merebetterGoods.setTargetGb(targetGb);
+        return morebetterDao.getMorebetterSupplyCompList(merebetterGoods);
+    }
+
+    public Collection<MoreBetterGoods> getMorebetterBrandList(Integer tmtbSq, String targetGb) {
+        MoreBetterGoods merebetterGoods = new MoreBetterGoods();
+        merebetterGoods.setTmtbSq(tmtbSq);
+        merebetterGoods.setTargetGb(targetGb);
+        return morebetterDao.getMorebetterBrandList(merebetterGoods);
+    }
+
+    public Collection<MoreBetterGoods> getMorebetterApplyGoodsList(Integer tmtbSq, String targetGb) {
+        MoreBetterGoods merebetterGoods = new MoreBetterGoods();
+        merebetterGoods.setTmtbSq(tmtbSq);
+        merebetterGoods.setTargetGb(targetGb);
+        return morebetterDao.getMorebetterApplyGoodsList(merebetterGoods);
+    }
+
+    public Collection<MoreBetterGoods> getMorebetterExceptGoodsList(Integer tmtbSq, String targetGb) {
+        MoreBetterGoods merebetterGoods = new MoreBetterGoods();
+        merebetterGoods.setTmtbSq(tmtbSq);
+        merebetterGoods.setTargetGb(targetGb);
+        return morebetterDao.getMorebetterExceptGoodsList(merebetterGoods);
+    }
+
+    /**
+     * 다다익선 구간 조회
+     * @param
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 8
+     */
+    public Collection<MoreBetterBurden> getMorebetterBurdenList(Integer tmtbSq) {
+        return morebetterDao.getMorebetterBurdenList(tmtbSq);
+    }
+
+    /**
+     * 다다익선 저장
+     * @param tmtb
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 5
+     */
+    @Transactional("shopTxnManager")
+    public void saveMoreBetterDetail(MoreBetter tmtb) {
+        // <,> replace 처리
+        tmtb.setRegNo(TsaSession.getInfo().getUserNo());
+        tmtb.setUdpNo(TsaSession.getInfo().getUserNo());
+
+        // TMTB 마스터(TB_TMTB) 저장
+        morebetterDao.saveMorebetterMst(tmtb);
+
+        // 다다익선 적용대상 설정
+        // 공급업체
+        Collection<MoreBetterGoods> supplyCompList = tmtb.getSupplyCompListNew();
+        for(MoreBetterGoods regSupplyComp : supplyCompList){
+            // 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
+            // tmtbGoodsSq 생성
+            log.info("regSupplyComp.getTmtbGoodsSq = {}",regSupplyComp.getTmtbGoodsSq());
+            if("".equals(regSupplyComp.getTmtbGoodsSq())){
+                Integer tmtbGoodsSq =  commonService.getNextSequence("SEQ_TMTB_GOODS");
+                regSupplyComp.setTmtbGoodsSq(tmtbGoodsSq);
+            }
+            regSupplyComp.setTmtbSq(tmtb.getTmtbSq());
+            regSupplyComp.setGoodsGb("G800_20");
+            regSupplyComp.setTargetVal(regSupplyComp.getSupplyCompCd());
+            regSupplyComp.setRegNo(tmtb.getRegNo());
+            regSupplyComp.setUdpNo(tmtb.getUdpNo());
+
+            morebetterDao.saveMorebetterGoods(regSupplyComp);
+        }
+
+        // 브랜드
+        Collection<MoreBetterGoods> brandList = tmtb.getBrandListNew();
+        for(MoreBetterGoods regBrand : brandList){
+            // 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
+            // tmtbGoodsSq 생성
+            log.info("regBrand.getTmtbGoodsSq = {}",regBrand.getTmtbGoodsSq());
+            if("".equals(regBrand.getTmtbGoodsSq())){
+                Integer tmtbGoodsSq =  commonService.getNextSequence("SEQ_TMTB_GOODS");
+                regBrand.setTmtbGoodsSq(tmtbGoodsSq);
+            }
+            regBrand.setTmtbSq(tmtb.getTmtbSq());
+            regBrand.setGoodsGb("G800_20");
+            regBrand.setTargetVal(regBrand.getBrandCd());
+            regBrand.setRegNo(tmtb.getRegNo());
+            regBrand.setUdpNo(tmtb.getUdpNo());
+
+            morebetterDao.saveMorebetterGoods(regBrand);
+        }
+
+        // 적용상품
+        Collection<MoreBetterGoods> applyGoodsList = tmtb.getApplyGoodsListNew();
+        for(MoreBetterGoods regApplyGoods : applyGoodsList){
+            // 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
+            // tmtbGoodsSq 생성
+            log.info("regApplyGoods.getTmtbGoodsSq = {}",regApplyGoods.getTmtbGoodsSq());
+            if("".equals(regApplyGoods.getTmtbGoodsSq())){
+                Integer tmtbGoodsSq =  commonService.getNextSequence("SEQ_TMTB_GOODS");
+                regApplyGoods.setTmtbGoodsSq(tmtbGoodsSq);
+            }
+            regApplyGoods.setTmtbSq(tmtb.getTmtbSq());
+            regApplyGoods.setTargetVal(regApplyGoods.getGoodsCd());
+            regApplyGoods.setRegNo(tmtb.getRegNo());
+            regApplyGoods.setUdpNo(tmtb.getUdpNo());
+
+            morebetterDao.saveMorebetterGoods(regApplyGoods);
+        }
+
+        // 제외상품
+        Collection<MoreBetterGoods> exceptGoodsList = tmtb.getExceptGoodsListNew();
+        for(MoreBetterGoods regExceptGoods : exceptGoodsList){
+            // 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
+            // tmtbGoodsSq 생성
+            log.info("regExceptGoods.getTmtbGoodsSq = {}",regExceptGoods.getTmtbGoodsSq());
+            if("".equals(regExceptGoods.getTmtbGoodsSq())){
+                Integer tmtbGoodsSq =  commonService.getNextSequence("SEQ_TMTB_GOODS");
+                regExceptGoods.setTmtbGoodsSq(tmtbGoodsSq);
+            }
+            regExceptGoods.setTmtbSq(tmtb.getTmtbSq());
+            regExceptGoods.setTargetVal(regExceptGoods.getGoodsCd());
+            regExceptGoods.setRegNo(tmtb.getRegNo());
+            regExceptGoods.setUdpNo(tmtb.getUdpNo());
+
+            morebetterDao.saveMorebetterGoods(regExceptGoods);
+        }
+
+        // 다다익선 할인구간 저장
+        Collection<MoreBetterSection> sectionGbList = tmtb.getSectionGbListNew();
+        for(MoreBetterSection regSection : sectionGbList){
+            log.info("regSection.getTmtbSectionSq = {}",regSection.getTmtbSectionSq());
+            log.info("regSection.getTmtbValSq = {}",regSection.getTmtbValSq());
+            // 다다익선 할인구간설정 2차조건(TB_TMTB_SECTION) 저장
+            // tmtbSectionSq 생성
+            if("".equals(regSection.getTmtbSectionSq()) || regSection.getTmtbSectionSq() == null){
+                Integer tmtbSectionSq =  commonService.getNextSequence("SEQ_TMTB_SECTION");
+                regSection.setTmtbSectionSq(tmtbSectionSq);
+            }
+            // 다다익선 조건에 따른 할인혜택(금액할인) 설정(TB_TMTB_VAL) 저장
+            // tmtbValSq 생성
+            if("".equals(regSection.getTmtbValSq()) || regSection.getTmtbValSq() == null){
+                Integer tmtbValSq =  commonService.getNextSequence("SEQ_TMTB_VAL");
+                regSection.setTmtbValSq(tmtbValSq);
+            }
+            regSection.setTmtbSq(tmtb.getTmtbSq());
+            regSection.setRegNo(tmtb.getRegNo());
+            regSection.setUdpNo(tmtb.getUdpNo());
+
+            morebetterDao.saveMorebetterSection(regSection);
+            morebetterDao.saveMorebetterVal(regSection);
+        }
+
+        // 다다익선 업체분담율(TB_TMTB_BURDEN) 저장
+        Collection<MoreBetterBurden> burdenList = tmtb.getBurdenListNew();
+        for (MoreBetterBurden regBurden : burdenList) {
+            // tmtbBurdenSq 생성
+            log.info("regBurden.getTmtbBurdenSq = {}",regBurden.getTmtbBurdenSq());
+            if("".equals(regBurden.getTmtbBurdenSq())){
+                Integer tmtbBurdenSq =  commonService.getNextSequence("SEQ_TMTB_BURDEN");
+                regBurden.setTmtbBurdenSq(tmtbBurdenSq);
+            }
+            regBurden.setTmtbSq(tmtb.getTmtbSq());
+            regBurden.setRegNo(tmtb.getRegNo());
+            regBurden.setUdpNo(tmtb.getUdpNo());
+
+            morebetterDao.saveMorebetterBurden(regBurden);
+        }
+
+        log.info("newBurdenSq = {}, newTmtbSq = {}, newSupplyCd = {}, newBurdenRate = {} , newUseYn = {}");
+    }
+
+    /**
+     * 다다익선 공급업체 삭제
+     * @param
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 5
+     */
+    @Transactional("shopTxnManager")
+    public void deleteTmtbSupplyCompanyList(MoreBetterGoods moreBetterGoods) {
+        if (moreBetterGoods == null || (moreBetterGoods.getArrCompanySq() == null && moreBetterGoods.getArrCompanySq().length <= 0)) {
+            throw new IllegalStateException(message.getMessage("FAIL_1001"));
+        }
+
+        if (moreBetterGoods.getArrCompanySq().length > 0) {
+            morebetterDao.deleteTmtbSupplyCompanyList(moreBetterGoods);
+        }
+    }
+
+    /**
+     * 다다익선 브랜드 삭제
+     * @param
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 16
+     */
+    @Transactional("shopTxnManager")
+    public void deleteTmtbBrandList(MoreBetterGoods moreBetterGoods) {
+        if (moreBetterGoods == null || (moreBetterGoods.getArrBrandSq() == null && moreBetterGoods.getArrBrandSq().length <= 0)) {
+            throw new IllegalStateException(message.getMessage("FAIL_1001"));
+        }
+
+        if (moreBetterGoods.getArrBrandSq().length > 0) {
+            morebetterDao.deleteTmtbBrandList(moreBetterGoods);
+        }
+    }
+
+    /**
+     * 다다익선 적용상품 삭제
+     * @param
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 16
+     */
+    @Transactional("shopTxnManager")
+    public void deleteTmtbApplyGoodsList(MoreBetterGoods moreBetterGoods) {
+        if (moreBetterGoods == null || (moreBetterGoods.getArrApplyGoodsSq() == null && moreBetterGoods.getArrApplyGoodsSq().length <= 0)) {
+            throw new IllegalStateException(message.getMessage("FAIL_1001"));
+        }
+
+        if (moreBetterGoods.getArrApplyGoodsSq().length > 0) {
+            morebetterDao.deleteTmtbApplyGoodsList(moreBetterGoods);
+        }
+    }
+
+    /**
+     * 다다익선 제외상품 삭제
+     * @param
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 16
+     */
+    @Transactional("shopTxnManager")
+    public void deleteTmtbExceptGoodsList(MoreBetterGoods moreBetterGoods) {
+        if (moreBetterGoods == null || (moreBetterGoods.getArrExceptGoodsSq() == null && moreBetterGoods.getArrExceptGoodsSq().length <= 0)) {
+            throw new IllegalStateException(message.getMessage("FAIL_1001"));
+        }
+
+        if (moreBetterGoods.getArrExceptGoodsSq().length > 0) {
+            morebetterDao.deleteTmtbExceptGoodsList(moreBetterGoods);
+        }
+    }
+
+    /**
+     * 다다익선 다다익선 할인구간 삭제
+     * @param
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 5
+     */
+    @Transactional("shopTxnManager")
+    public void deleteTmtbSectionValList(MoreBetterSection moreBetterSection) {
+        if (moreBetterSection == null || (moreBetterSection.getArrSectionSq() == null && moreBetterSection.getArrSectionSq().length <= 0)) {
+            throw new IllegalStateException(message.getMessage("FAIL_1001"));
+        }
+
+        if (moreBetterSection.getArrSectionSq().length > 0) {
+            morebetterDao.deleteTmtbSectionList(moreBetterSection);
+            morebetterDao.deleteTmtbValList(moreBetterSection);
+        }
+    }
+
+    /**
+     * 다다익선 제외상품 삭제
+     * @param
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 16
+     */
+    @Transactional("shopTxnManager")
+    public void deleteTmtbBurdenList(MoreBetterBurden moreBetterBurden) {
+        if (moreBetterBurden == null || (moreBetterBurden.getArrBurdenSq() == null && moreBetterBurden.getArrBurdenSq().length <= 0)) {
+            throw new IllegalStateException(message.getMessage("FAIL_1001"));
+        }
+
+        if (moreBetterBurden.getArrBurdenSq().length > 0) {
+            morebetterDao.deleteTmtbBurdenList(moreBetterBurden);
+        }
+    }
+    /* // CSB 진행 */
+}

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

@@ -0,0 +1,580 @@
+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.TsaOrderChangeDao;
+import com.style24.admin.biz.dao.TsaOrderDao;
+import com.style24.admin.biz.dao.TsaRefundDao;
+import com.style24.admin.support.security.session.TsaSession;
+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 2020. 12. 16
+	 */
+	public Collection<Order> getCancelRequestTargetList(Order order) {
+		return orderChangeDao.getCancelRequestTargetList(order);
+	}
+	
+	/**
+	 * 주문상세 > 주문취소신청 > 주문취소, 반품 환불 금액 계산
+	 * @param Order
+	 * @return Order
+	 * @author jsh77b
+	 * @since 2020. 12. 16
+	 */
+	public GagaMap orderCancelRefundAmt(List<Order> cancelReqList) {
+		GagaMap mav = new GagaMap();
+		
+		// 1. 변수설정
+		int spanPayAmt				= 0; // 총 결제 금액
+		int spanSumRealOrdAmt		= 0; // 상품 실결제 금액
+		int spanSumDeliveryFee		= 0; // 배송금액
+		int spanRtnSumDeliveryFee 	= 0; // 반품배송금액
+		int spanExcSumDeliveryFee 	= 0; // 교환배송금액
+		int spanOrdAmt				= 0; // 주문 상품 금액
+		int spanCnclRtnAmt			= 0; // 취소 상품 금액
+		int spanTotPntDcAmt			= 0; // 취소 사용 포인트
+		int spanPntDcAmt			= 0; // 고객 포인트
+		int spanPrePntDcAmt			= 0; // 상품 선포인트
+		int spanCpnDcAmt			= 0; // 취소 사용 쿠폰금액
+		int spanCpn1DcAmt			= 0; // 즉시할인쿠폰
+		int spanGoodsCpnDcAmt		= 0; // 상품쿠폰
+		int spanCartCpnDcAmt		= 0; // 장바구니쿠폰
+		int spanTmtbDcAmt			= 0; // 취소 다다익선 금액
+		int spanTmtb1DcAmt			= 0; // 수량할인
+		int spanTmtb2DcAmt			= 0; // 금액할인
+		int spanGfcdUseAmt			= 0; // 취소 고객 상품권 금액
+		int spanRealCnclRtnAmt		= 0; // 취소 상품 실결제 금액
+		int spanTotDeliveryFee		= 0; // 환불 배송 금액
+		int spanRefundAmt			= 0; // 환불 금액 합계
+		
+		int sumDeliveryFee			= 0; // 배송금액 (전체 취소시에 배송금액도 같이 환불)
+		
+		List<Order> cancelOrderRefundList 	= new ArrayList<Order>();	// 주문환불금액목록
+		List<Order> cancelDelvRefundList 	= new ArrayList<Order>();	// 주문환불배송금액목록
+		
+		Order orderObj	= new Order();
+		Order delvObj	= new Order();
+		int k 			= 0 ;
+		
+		// 2. 초기 배송정보 설정
+		delvObj.setOrdAmt(0);
+		delvObj.setCnclRtnAmt(0);
+		delvObj.setRealOrdAmt(0);
+		delvObj.setDelvFee(cancelReqList.get(k).getDelvFee());
+		delvObj.setMinOrdAmt(cancelReqList.get(k).getMinOrdAmt());
+		delvObj.setOrgDelvFee(cancelReqList.get(k).getOrgDelvFee());
+		delvObj.setRtnDelvFee(cancelReqList.get(k).getRtnDelvFee());
+		delvObj.setExcDelvFee(cancelReqList.get(k).getExcDelvFee());
+		delvObj.setSupplyCompCd(cancelReqList.get(k).getSupplyCompCd());
+		delvObj.setDelvFeeCd(cancelReqList.get(k).getDelvFeeCd());
+		delvObj.setAllCanYn(cancelReqList.get(k).getAllCanYn());
+		cancelDelvRefundList.add(delvObj);
+		
+		// 3. 취소신청수량 정보를 취소 환불 금액 계산
+		for (Order oneData : cancelReqList) {
+			orderObj	= new Order();
+			
+			// 3.1 주문기본정보 설정
+			orderObj.setItemQty(oneData.getItemQty());
+			orderObj.setOrdQty(oneData.getOrdQty());
+			orderObj.setCnclRtnQty(oneData.getCnclRtnQty());
+			orderObj.setOrdReqChgQty(oneData.getOrdReqChgQty());
+			orderObj.setOrdCanChgQty(oneData.getOrdCanChgQty());
+			orderObj.setItemPrice(oneData.getItemPrice());
+			orderObj.setOptAddPrice	(oneData.getOptAddPrice());
+			orderObj.setOrdAmt(oneData.getOrdAmt());
+			
+			orderObj.setOrdNo(oneData.getOrdNo());
+			orderObj.setOrdDtlNo(oneData.getOrdDtlNo());
+			orderObj.setGoodsCd(oneData.getGoodsCd());
+			orderObj.setGoodsNm(oneData.getGoodsNm());
+			orderObj.setOrdDtlItemSq(oneData.getOrdDtlItemSq());
+			orderObj.setItemCd(oneData.getItemCd());
+			orderObj.setItemNm(oneData.getItemNm());
+			orderObj.setOptCd1(oneData.getOptCd1());
+			orderObj.setOptCd2(oneData.getOptCd2());
+			
+			// 3.2 주문취소수량으로 취소율 정보 설정
+			int ordQty 			= oneData.getOrdQty();
+			int itemQty 		= oneData.getItemQty();
+			int ordCanChgQty 	= oneData.getOrdCanChgQty();
+			
+			float _appQty		= (float)ordCanChgQty / (float)ordQty;
+			
+			// 3.3 주문취소금액 & 취소할인금액 계산
+			orderObj.setCnclRtnAmt(((oneData.getItemPrice() + oneData.getOptAddPrice()) * itemQty) * ordCanChgQty);
+			orderObj.setCpn1DcAmt((int)(oneData.getCpn1DcAmt() 				* _appQty));
+			orderObj.setTmtb1DcAmt((int)(oneData.getTmtb1DcAmt() 			* _appQty));
+			orderObj.setTmtb2DcAmt((int)(oneData.getTmtb2DcAmt() 			* _appQty));
+			orderObj.setGoodsCpnDcAmt((int)(oneData.getGoodsCpnDcAmt() 		* _appQty));
+			orderObj.setCartCpnDcAmt((int)(oneData.getCartCpnDcAmt() 		* _appQty));
+			orderObj.setPntDcAmt((int)(oneData.getPntDcAmt() 				* _appQty));
+			orderObj.setPrePntDcAmt((int)(oneData.getPrePntDcAmt() 			* _appQty));
+			orderObj.setSavePntAmt((int)(oneData.getSavePntAmt() 			* _appQty));
+			orderObj.setGfcdUseAmt((int)(oneData.getGfcdUseAmt() 			* _appQty));
+			
+			// 3.4 취소할인합계금액 적용
+			int dcTotAmt		= 0;
+			dcTotAmt			+= orderObj.getTmtb1DcAmt();
+			dcTotAmt			+= orderObj.getTmtb2DcAmt();
+			dcTotAmt			+= orderObj.getGoodsCpnDcAmt();
+			dcTotAmt			+= orderObj.getCartCpnDcAmt();
+			dcTotAmt			+= orderObj.getPntDcAmt();
+			dcTotAmt			+= orderObj.getPrePntDcAmt();
+			dcTotAmt			+= orderObj.getCpn1DcAmt();
+			dcTotAmt			+= orderObj.getGfcdUseAmt();
+			
+			// 3.5 주문취소환불금액 계산
+			orderObj.setRealOrdAmt(orderObj.getCnclRtnAmt() - dcTotAmt);
+			
+			// 3.6 배송정보 관련 설정		
+			orderObj.setOrdDtlNo(oneData.getOrdDtlNo());
+			orderObj.setGoodsTypeNm(oneData.getGoodsTypeNm());
+			orderObj.setDelvFee(oneData.getDelvFee());
+			orderObj.setSupplyCompCd(oneData.getSupplyCompCd());
+			orderObj.setDelvFeeCd(oneData.getDelvFeeCd());
+			orderObj.setMinOrdAmt(oneData.getMinOrdAmt());
+			orderObj.setOrgDelvFee(oneData.getOrgDelvFee());
+			orderObj.setRtnDelvFee(oneData.getRtnDelvFee());
+			orderObj.setExcDelvFee(oneData.getExcDelvFee());
+			
+			// 3.7 주문상세상태체크
+			orderObj.setOrdDtlStat(oneData.getOrdDtlStat());
+			orderObj.setOrdDtlStatNm(oneData.getOrdDtlStatNm());
+			orderObj.setAllCanYn(oneData.getAllCanYn()); // 전체취소 여부 (기존의 취소 또는 출고, 반품, 교환 의 경우에는 전체취소 불가능)
+			
+			cancelOrderRefundList.add(orderObj);
+			
+			// 3.8 배송업체 & 배송비정책 조건으로 추가 배송비 금액 설정
+			if (cancelDelvRefundList.get(k).getSupplyCompCd().equals(orderObj.getSupplyCompCd()) && cancelDelvRefundList.get(k).getDelvFeeCd().equals(orderObj.getDelvFeeCd())) {
+				// 공급업체 와 배송정책코드가 같으면 주문금액, 취소금액 SUM
+				cancelDelvRefundList.get(k).setOrdAmt(cancelDelvRefundList.get(k).getOrdAmt() + orderObj.getOrdAmt());
+				cancelDelvRefundList.get(k).setCnclRtnAmt(cancelDelvRefundList.get(k).getCnclRtnAmt() + orderObj.getCnclRtnAmt());
+				cancelDelvRefundList.get(k).setRealOrdAmt(cancelDelvRefundList.get(k).getRealOrdAmt() + orderObj.getRealOrdAmt());
+				
+				if ("N".equals(orderObj.getAllCanYn())) {
+					cancelDelvRefundList.get(k).setAllCanYn("N");
+				}
+			} else {			
+				k++;
+				
+				delvObj	= new Order();
+				
+				// 공급업체 와 배송정책코드가 같지안으면 주문금액, 취소금액 RESET
+				delvObj.setOrdAmt(orderObj.getOrdAmt());
+				delvObj.setCnclRtnAmt(orderObj.getCnclRtnAmt());
+				delvObj.setRealOrdAmt(orderObj.getRealOrdAmt());
+				
+				delvObj.setDelvFee(orderObj.getDelvFee());
+				delvObj.setMinOrdAmt(orderObj.getMinOrdAmt());		
+				delvObj.setOrgDelvFee(orderObj.getOrgDelvFee());
+				delvObj.setRtnDelvFee(orderObj.getRtnDelvFee());
+				delvObj.setExcDelvFee(orderObj.getExcDelvFee());
+				delvObj.setSupplyCompCd(orderObj.getSupplyCompCd());
+				delvObj.setDelvFeeCd(orderObj.getDelvFeeCd());
+				delvObj.setAllCanYn(orderObj.getAllCanYn());
+				
+				cancelDelvRefundList.add(delvObj);
+			}
+			
+			// 3.9 FRONT 화면에서 사용 하는 변수 값 설정 & 계산
+			spanSumRealOrdAmt	+= oneData.getRealOrdAmt();
+			spanPntDcAmt		+= orderObj.getPntDcAmt();
+			spanPrePntDcAmt		+= orderObj.getPrePntDcAmt();
+			spanCpn1DcAmt		+= orderObj.getCpn1DcAmt();
+			spanGoodsCpnDcAmt	+= orderObj.getGoodsCpnDcAmt();
+			spanCartCpnDcAmt	+= orderObj.getCartCpnDcAmt();
+			spanTmtb1DcAmt		+= orderObj.getTmtb1DcAmt();
+			spanTmtb2DcAmt		+= orderObj.getTmtb2DcAmt();
+			spanGfcdUseAmt		+= orderObj.getGfcdUseAmt();
+			spanRealCnclRtnAmt	+= orderObj.getRealOrdAmt();
+		}
+		
+		// 4. 추가배송비 발생여부, 추가배송비, 배송비정책단위 전체취소 여부 체크
+		for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
+			Order obj = cancelDelvRefundList.get(i);
+			
+			// 취소금액이 있을때 처리
+			if (obj.getCnclRtnAmt() > 0) {
+			
+				// 4.1 무료배송비용 > (주문금액 - 취소금액)
+				if (obj.getMinOrdAmt() > (obj.getOrdAmt() - obj.getCnclRtnAmt())) {
+					
+					// 4.2 주문시 배송비가 존재하면 추가 배송비 없음
+					if (obj.getDelvFee() > 0) {
+						obj.setAddDelvFeeYn("N");
+						obj.setAddDelvFee(0);
+						
+						// 4.2.1 전체취소시 배송비 환불
+						if ((obj.getOrdAmt() - obj.getCnclRtnAmt()) == 0) {
+							if ("Y".equals(obj.getAllCanYn())) {
+								sumDeliveryFee += obj.getDelvFee(); // 전체취소시 배송금액도 같이 환불
+							}
+						}
+					} else {
+						// 4.3 주문금액 - 취소금액 == 0 이면 전체취소 이므로 배송비 발생 안함
+						// * 2020.12.28 
+						// * case : 배송정책 기준으로 1,2 상품 주문 후 1번 출고 후 1번반품 2번취소 할 경우 전체 취소 가 아니므로 배송비 부과 있을지 모르겠음 주문업체 단위로 배송되기 때문에 발생하지 않을것 같음
+						if ((obj.getOrdAmt() - obj.getCnclRtnAmt()) == 0) {
+							if ("N".equals(obj.getAllCanYn())) {
+								obj.setAddDelvFeeYn("Y");
+								obj.setAddDelvFee(obj.getOrgDelvFee());
+							} else {
+								// 4.4 전체취소의 경우에 해당
+								obj.setAddDelvFeeYn("N");
+								obj.setAddDelvFee(0);
+							}
+						} else {
+							// 4.5 추가배송비 발생 (취소신청화면에서 대부분 아래의 조건에 해당)
+							obj.setAddDelvFeeYn("Y");
+							obj.setAddDelvFee(obj.getOrgDelvFee());
+						}
+					}
+				} else {
+					obj.setAddDelvFeeYn("N");
+					obj.setAddDelvFee(0);
+				}
+			}
+				
+			spanSumDeliveryFee		+= obj.getDelvFee();
+			spanRtnSumDeliveryFee	+= obj.getRtnDelvFee();
+			spanExcSumDeliveryFee	+= obj.getExcDelvFee();
+			spanOrdAmt				+= obj.getOrdAmt();
+			spanCnclRtnAmt			+= obj.getCnclRtnAmt();
+			spanTotDeliveryFee  	+= obj.getAddDelvFee();
+			
+			cancelDelvRefundList.set(i, obj);
+		}
+		
+		// 5. FRONT 화면엣 필요한 금액 설정
+		// 2020.12.30 프론트에서 필요한 부분 작업 필여
+		// 관리자 화면에서 사용하는 환불 칼럼 정보
+		// 환불금액표시
+		spanPayAmt 			= spanSumRealOrdAmt + spanSumDeliveryFee;
+		spanTotPntDcAmt 	= spanPntDcAmt + spanPrePntDcAmt;
+		spanCpnDcAmt 		= spanCpn1DcAmt + spanGoodsCpnDcAmt + spanCartCpnDcAmt;
+		spanTmtbDcAmt 		= spanTmtb1DcAmt + spanTmtb2DcAmt;
+		spanRefundAmt 		= (spanRealCnclRtnAmt + sumDeliveryFee) - spanTotDeliveryFee;
+
+		mav.set("cancelReqList"			, cancelReqList);			//주문 취소 신청 목록
+		mav.set("cancelOrderRefundList"	, cancelOrderRefundList);	//주문 환불 금액 목록
+		mav.set("cancelDelvRefundList"	, cancelDelvRefundList);	//주문 환불 배송 금액 목록
+		mav.set("spanPayAmt"			, spanPayAmt);				//총 결제 금액
+		mav.set("spanSumRealOrdAmt"		, spanSumRealOrdAmt);		//상품 실결제 금액
+		mav.set("spanSumDeliveryFee"	, spanSumDeliveryFee);		//배송금액
+		mav.set("spanOrdAmt"			, spanOrdAmt);				//주문 상품 금액
+		mav.set("spanCnclRtnAmt"		, spanCnclRtnAmt);			//취소 상품 금액
+		mav.set("spanTotPntDcAmt"		, spanTotPntDcAmt);			//취소 사용 포인트
+		mav.set("spanPntDcAmt"			, spanPntDcAmt);			//고객 포인트
+		mav.set("spanPrePntDcAmt"		, spanPrePntDcAmt);			//상품 선포인트
+		mav.set("spanCpnDcAmt"			, spanCpnDcAmt);			//취소 사용 쿠폰금액
+		mav.set("spanCpn1DcAmt"			, spanCpn1DcAmt);			//즉시할인쿠폰
+		mav.set("spanGoodsCpnDcAmt"		, spanGoodsCpnDcAmt);		//상품쿠폰
+		mav.set("spanCartCpnDcAmt"		, spanCartCpnDcAmt);		//장바구니쿠폰
+		mav.set("spanTmtbDcAmt"			, spanTmtbDcAmt);			//취소 다다익선 금액
+		mav.set("spanTmtb1DcAmt"		, spanTmtb1DcAmt);			//수량할인
+		mav.set("spanTmtb2DcAmt"		, spanTmtb2DcAmt);			//금액할인
+		mav.set("spanGfcdUseAmt"		, spanGfcdUseAmt);			//취소 고객 상품권 금액
+		mav.set("spanRealCnclRtnAmt"	, spanRealCnclRtnAmt);		//취소 상품 실결제 금액
+		mav.set("sumDeliveryFee"		, sumDeliveryFee);			//배송비 합계 금액
+		mav.set("spanTotDeliveryFee"	, spanTotDeliveryFee);		//추가 배송 금액
+		mav.set("spanTotRtnDelvFee"		, spanRtnSumDeliveryFee);	//추가 반품 배송 금액
+		mav.set("spanTotExcDelvFee"		, spanExcSumDeliveryFee);	//추가 교환 배송 금액
+		mav.set("spanRefundAmt"			, spanRefundAmt);			//환불 금액 합계
+		
+		return mav;
+	}
+	
+	/**
+	 * 주문상세 > 주문취소신청 > 주문취소
+	 * @param Order
+	 * @return Order
+	 * @author jsh77b
+	 * @since 2020. 12. 30
+	 */
+	@Transactional("shopTxnManager")
+	public void orderCancel(GagaMap mav) {
+		
+		// 1. 세션회원조회
+		int userNo = TsaSession.getInfo().getUserNo();
+		
+		// 2. 취소요정정보목록
+		List<Order> cancelReqList		 	= (List<Order>) mav.get("cancelReqList");			//주문 취소 신청 목록
+		List<Order> cancelOrderRefundList 	= (List<Order>) mav.get("cancelOrderRefundList");	//주문 환불 금액 목록
+		List<Order> cancelDelvRefundList 	= (List<Order>) mav.get("cancelDelvRefundList");	//주문 환불 배송 금액 목록
+				
+		// 3. 취소신청정보
+		int ordNo 			= Integer.parseInt(mav.getString("ordNo").toString());
+		String chgReason 	= mav.getString("chgReason").toString();
+		String chgMemo 		= mav.getString("chgMemo").toString();
+		String allCanYn		= mav.getString("allCanYn").toString();
+		String isCustomer	= mav.getString("isCustomer").toString();
+		String chgGb		= "G680_20";
+		
+		// 4.1 주문변경 기본정보 등록
+		OrderChange orderChange = new OrderChange();
+		orderChange.setOrdNo(ordNo);
+		orderChange.setChgGb(chgGb);
+		orderChange.setChgReason(chgReason);
+		orderChange.setChgMemo(chgMemo);
+		orderChange.setAddPayCost(0);
+		orderChange.setAddPayAmt(0);
+		orderChange.setRegNo(userNo);
+		orderChange.setUpdNo(userNo);
+		
+		orderChangeDao.createOrderChange(orderChange);
+		
+		List<Order> cancelOrderDetailList = new ArrayList<Order>();
+		
+		// 4.2 주문변경 상세 단품 정보 등록 (단품단위)
+		for (int i=0 ; i<cancelOrderRefundList.size() ; i++) {
+			Order cancelOrderRefundPo = cancelOrderRefundList.get(i);
+			cancelOrderRefundPo.setRegNo(userNo);
+			cancelOrderRefundPo.setUpdNo(userNo);
+			
+			// 2020.01.05 추후 무통장입금전 전체 취소시 분기로직 추가 예정
+			if ("Y".equals(allCanYn)) {
+				cancelOrderRefundPo.setOrdDtlStat("G013_98"); // 결제전주문취소 : 공통코드로관리예정
+			} else {
+				cancelOrderRefundPo.setOrdDtlStat("G013_99"); // 결제후주문취소 : 공통코드로관리예정
+			}
+
+			// 4.2.1 취소수량이 존재하면 주문정보 수정 및 주문변경정보 등록
+			if (cancelOrderRefundPo.getOrdCanChgQty() > 0) {
+				// 4.2.3 주문상세단품정보 수정
+				orderChangeDao.updateOrderDetailItem(cancelOrderRefundPo);
+				
+				// 4.2.4 주문상세단품정보 이력 등록
+				orderChangeDao.createOrderDetailItemHst(cancelOrderRefundPo);
+				
+				// 4.3 주문변경 상세 단위로 데이타 등록 (ORD_DTL_NO)
+				Boolean temp = false;
+				
+				if (cancelOrderDetailList.size() > 0) {
+					for (int j=0 ; j<cancelOrderDetailList.size() ; j++) {
+						if (cancelOrderRefundPo.getOrdDtlNo() == cancelOrderDetailList.get(j).getOrdDtlNo()) {
+							temp = true;
+						}
+					}
+				}
+				
+				// 4.4 주문상세단위 데이타 저장
+				if (!temp) {
+					cancelOrderDetailList.add(cancelOrderRefundPo);
+				}
+				
+				// 4.5 상품옵션 재고 원복
+				orderChangeDao.updateOptionQty(cancelOrderRefundPo);
+			}
+		}
+		
+		// 5. 주문상세단위 취소 데이타 처리
+		for (int i=0 ; i<cancelOrderDetailList.size() ; i++) {			
+			Order vo = cancelOrderRefundList.get(i);
+			vo.setRegNo(userNo);
+			vo.setUpdNo(userNo);
+			
+			// 2020.01.05 추후 무통장입금전 전체 취소시 분기로직 추가 예정
+			if ("Y".equals(allCanYn)) {
+				vo.setOrdDtlStat("G013_98"); // 결제전주문취소 : 공통코드로관리예정
+			} else {
+				vo.setOrdDtlStat("G013_99"); // 결제후주문취소 : 공통코드로관리예정
+			}
+			
+			// 5.1 주문변경상세정보 이력 등록
+			orderChangeDao.createOrderDetailHstCnclRtn(vo);
+			
+			// 4.2 주문변경상세정보 수정
+			orderChangeDao.updateOrderDetail(vo);
+			
+			// * 주문상세단위가 아닌 주문상세단품단위로 데이타가 처리되고 있었음
+			// 5.3 주문변경상세정보 등록
+			OrderChange changeDetailPo = new OrderChange();
+			changeDetailPo.setOrdChgSq(orderChange.getOrdChgSq());
+			changeDetailPo.setOrdDtlNo(vo.getOrdDtlNo());
+			changeDetailPo.setChgQty(vo.getOrdCanChgQty());
+			changeDetailPo.setChgStat("G685_21"); // 취소완료 : 공통코드로관리예정
+			changeDetailPo.setRegNo(userNo);
+			changeDetailPo.setUpdNo(userNo);
+			
+			orderChangeDao.createOrderChangeDetail(changeDetailPo);
+		}
+		
+		// To Do List
+		// 취소, 반품 사유에 따른 추가배송비, 반품배송비를 환불금액에서 추가, 제외 할 수 있다.
+		int spanRealCnclRtnAmt 		= Integer.parseInt(mav.get("spanRealCnclRtnAmt").toString());		// 취소금액합계
+		int sumDeliveryFee 			= Integer.parseInt(mav.get("sumDeliveryFee").toString());			// 배송비합계
+		int spanTotDeliveryFee 		= Integer.parseInt(mav.get("spanTotDeliveryFee").toString());		// 추가배송비합계
+		int spanTotRtnDelvFee 		= Integer.parseInt(mav.get("spanTotRtnDelvFee").toString());		// 반품배송비합계
+		int spanRefundAmt			= 0;
+		
+		// 고객사유 : 환불금액계산 = (취소금액 + 배송비) - 추가배송비
+		if ("true".equals(isCustomer)) {
+			spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee) - spanTotDeliveryFee - spanTotRtnDelvFee;
+			//Integer.parseInt(mav.get("spanRefundAmt").toString());
+		}
+		// 회사사유 : 환불금액계산 = (취소금액 + 배송비)
+		else {
+			spanRefundAmt = (spanRealCnclRtnAmt + sumDeliveryFee);
+		}
+		mav.set("spanRefundAmt", spanRefundAmt);
+		
+		// 6. 환불결제 정보 등록
+		Order paymentOrder = new Order();
+		paymentOrder.setOrdNo(ordNo);
+		paymentOrder.setPayAmt(Integer.parseInt(mav.get("spanRefundAmt").toString()) * -1);
+		paymentOrder.setPayStat("G016_99");
+		paymentOrder.setOrdChgSq(orderChange.getOrdChgSq());
+		paymentOrder.setRegNo(userNo);
+		paymentOrder.setUpdNo(userNo);
+		
+		orderChangeDao.createPayment(paymentOrder);
+		
+		// 7. 환불금액 등록
+		Order refundOrder = new Order();
+		refundOrder.setOrdNo(ordNo);
+		refundOrder.setPaySq(paymentOrder.getPaySq());
+		refundOrder.setOrdChgSq(orderChange.getOrdChgSq());
+		refundOrder.setRegNo(userNo);
+		
+		refundOrder.setRefundAmt(Integer.parseInt(mav.get("spanRefundAmt").toString()));
+		refundOrder.setRfCpn1Amt(Integer.parseInt(mav.get("spanCpn1DcAmt").toString()));
+		refundOrder.setRfTmtb1Amt(Integer.parseInt(mav.get("spanTmtb1DcAmt").toString()));
+		refundOrder.setRfTmtb2Amt(Integer.parseInt(mav.get("spanTmtb2DcAmt").toString()));
+		refundOrder.setRfGoodsCpnAmt(Integer.parseInt(mav.get("spanGoodsCpnDcAmt").toString()));
+		refundOrder.setRfCartCpnAmt(Integer.parseInt(mav.get("spanCartCpnDcAmt").toString()));
+		refundOrder.setRfPntAmt(Integer.parseInt(mav.get("spanPntDcAmt").toString()));
+		refundOrder.setRfPrePntAmt(Integer.parseInt(mav.get("spanPrePntDcAmt").toString()));
+		refundOrder.setRfGfcdUseAmt(Integer.parseInt(mav.get("spanGfcdUseAmt").toString()));
+		
+		refundOrder.setRaNo(mav.get("accountNo").toString());
+		refundOrder.setRaNm(mav.get("accountNm").toString());
+		refundOrder.setRaBank(mav.get("bankCd").toString());
+		
+		orderChangeDao.createRefund(refundOrder);
+		
+		// 8. 결제금액이 무료배송금액보다 작으면 배송비 신규 등록
+		for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
+			Order vo = cancelDelvRefundList.get(i);
+			
+			if (vo.getAddDelvFee() > 0) {
+				Order delvFeeOrder = new Order();
+				
+				delvFeeOrder.setPaySq(paymentOrder.getPaySq());
+				delvFeeOrder.setOrdNo(ordNo);
+				delvFeeOrder.setDelvFeeGb("G018_10");
+				delvFeeOrder.setDelvFeeCd(vo.getDelvFeeCd());
+				delvFeeOrder.setDelvFee(vo.getAddDelvFee());
+				delvFeeOrder.setRealDelvAmt(vo.getDelvFee());
+				delvFeeOrder.setOrdChgSq(orderChange.getOrdChgSq());
+				delvFeeOrder.setSupplyCompCd(vo.getSupplyCompCd());
+				delvFeeOrder.setRegNo(userNo);
+				delvFeeOrder.setUpdNo(userNo);
+				
+				orderChangeDao.createDeliveryFee(delvFeeOrder);
+			}
+		}
+		
+		// To Do List
+		// 9. 포인트원복 (사용포인트, 주문상세단위)
+		
+		// To Do List
+		// 10. 쿠폰원복 (상품쿠폰, 주문상세단위) (전체취소시 장바구니쿠폰, 배송비쿠폰)
+		
+		// To Do List
+		// 11. 상품권원복
+		
+		// 12. 사은품 전체 취소 (전체취소시 적용) 추후 사은품 관련 취소 로직 개발 예정
+		Order freegiftOrder = new Order();
+		freegiftOrder.setOrdNo(ordNo);
+		freegiftOrder.setUpdNo(userNo);
+		orderChangeDao.updateOrdFreegiftDel(freegiftOrder);
+		
+		// To Do List
+		// 13. PG 연동
+		
+		// To Do List
+		// 14. 취소 완료 알림톡 발송 에정
+		
+		//int a = 100/0;
+	}
+	
+	
+	
+	
+	
+	
+	/**
+	 * 주문 환불계좌
+	 *
+	 * @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;
+	}
+	
+}

+ 137 - 619
style24.admin/src/main/java/com/style24/admin/biz/service/TsaOrderService.java

@@ -1,8 +1,6 @@
 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;
@@ -13,13 +11,10 @@ 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.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.OrderChange;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -44,7 +39,7 @@ public class TsaOrderService {
 
 	@Autowired
 	private ObjectMapper mapper;
-	
+
 	/**
 	 * 주문목록 카운트
 	 * @param Order
@@ -55,7 +50,7 @@ public class TsaOrderService {
 	public int getOrderListCount(Order order) {
 		return orderDao.getOrderListCount(order);
 	}
-	
+
 	/**
 	 * 주문목록
 	 * @param Order
@@ -78,31 +73,31 @@ public class TsaOrderService {
 	public Collection<Order> getOrderInfoList(Order order) {
 		return orderDao.getOrderInfoList(order);
 	}
-	
+
 	/**
-	 * 주문상세 > 사은품목록
+	 * 주문상품정보 목록
 	 *
 	 * @param order - 주문 정보
 	 * @return Collection<Order>
 	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
-	public Collection<Order> getOrderFreeGiftList(Order order) {
-		return orderDao.getOrderFreeGiftList(order);
+	public Collection<Order> getOrderDetailList(Order order) {
+		return orderDao.getOrderDetailList(order);
 	}
-	
+
 	/**
-	 * 주문상품정보 목록
+	 * 사은품목록
 	 *
 	 * @param order - 주문 정보
 	 * @return Collection<Order>
 	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
-	public Collection<Order> getOrderDetailList(Order order) {
-		return orderDao.getOrderDetailList(order);
+	public Collection<Order> getOrderFreeGiftList(Order order) {
+		return orderDao.getOrderFreeGiftList(order);
 	}
-	
+
 	/**
 	 * 배송정보
 	 *
@@ -114,9 +109,9 @@ public class TsaOrderService {
 	public Collection<Order> getDeliveryAddrList(Order order) {
 		return orderDao.getDeliveryAddrList(order);
 	}
-	
+
 	/**
-	 * 결제내역 > 결제 기본정보
+	 * 결제정보
 	 *
 	 * @param order - 주문 정보
 	 * @return Collection<Order>
@@ -126,9 +121,9 @@ public class TsaOrderService {
 	public Collection<Order> getOrderPaymentBasicInfoList(Order order) {
 		return orderDao.getOrderPaymentBasicInfoList(order);
 	}
-	
+
 	/**
-	 * 배송비 정보
+	 * 배송비정보
 	 *
 	 * @param order - 주문 정보
 	 * @return Collection<Order>
@@ -138,7 +133,7 @@ public class TsaOrderService {
 	public Collection<Order> getDeliveryFeeList(Order order) {
 		return orderDao.getDeliveryFeeList(order);
 	}
-	
+
 	/**
 	 * 취소/반품/교환 요청 정보
 	 *
@@ -159,10 +154,10 @@ public class TsaOrderService {
 	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
-	public Collection<Order> orderRefundInfo(Order order) {
-		return orderDao.orderRefundInfo(order);
+	public Collection<Order> getOrderRefundInfo(Order order) {
+		return orderDao.getOrderRefundInfo(order);
 	}
-	
+
 	/**
 	 * 상담내역
 	 *
@@ -171,23 +166,23 @@ public class TsaOrderService {
 	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
-	public Collection<Order> orderCounselInfo(Order order) {
-		return orderDao.orderCounselInfo(order);
+	public Collection<Order> getOrderCounselInfo(Order order) {
+		return orderDao.getOrderCounselInfo(order);
 	}
-	
+
 	/**
-	 * 변경내역 > 주문요청 관리자 메모
+	 * 주문요청 관리자 메모 목록 조회
 	 *
 	 * @param order - 주문 정보
 	 * @return Collection<Order>
 	 * @author jsh77b
 	 * @since 2020. 11. 18
 	 */
-	public Collection<Order> getOrderTsainMemoList(Order order) {
+	public Collection<Order> getOrderMemoList(Order order) {
 		order.setDelYn("N");
-		return orderDao.getOrderTsainMemoList(order);
+		return orderDao.getOrderMemoList(order);
 	}
-	
+
 	/**
 	 * 입점업체미발주 주문목록
 	 * @param Order
@@ -198,7 +193,7 @@ public class TsaOrderService {
 	public Collection<Order> getOrderSellerUnorderList(Order order) {
 		return orderDao.getOrderSellerUnorderList(order);
 	}
-	
+
 	/**
 	 * 입점업체미발주목록 - 엑셀다운로드시 주문상태값 변경(상품준비중)
 	 *
@@ -224,26 +219,26 @@ public class TsaOrderService {
 			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);
 			}
 		}
 	}
-	
+
 	/**
 	 * 입점업체미발주목록 엑셀다운로드
 	 *
@@ -253,106 +248,106 @@ public class TsaOrderService {
 	 * @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"
+				"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()
+				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();
 	}
-	
+
 	/**
 	 * 입점업체미발주목록 - 송장번호 입력(출고완료)
 	 *
@@ -368,14 +363,14 @@ public class TsaOrderService {
 		int failedCount 		= 0;	// 몰 실패 카운트
 		int successCount 		= 0;	// 몰 성공 카운트
 		String failedGoodCdStr 	= "";	// 실패 상품 리스트
-		
+
 		// 1. 송장번호 등록 대상 목록 처리
 		for (Order oneData : orderList) {
-			
-			// 2. 송장번호, 업체코드 체크 
+
+			// 2. 송장번호, 업체코드 체크
 			if (!StringUtils.isEmpty(oneData.getInvoiceNo()) && !StringUtils.isEmpty(oneData.getShipCompCd())) {
 				totalCount++;
-				
+
 				Order updateData = new Order();
 				updateData.setOrdNo(oneData.getOrdNo());
 				updateData.setOrdDtlNo(oneData.getOrdDtlNo());
@@ -399,19 +394,19 @@ public class TsaOrderService {
 
 				// 4. 상품코드, 사이즈, 주문수량 체크 (세트상품도 단품 단위로 업로드 요청)
 				// 2020.12.15 세트상품 때문에 단품단위로 비교
-				if (!orgOrder.getItemCd().equals(updateData.getItemCd()) 
+				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++;
@@ -427,7 +422,7 @@ public class TsaOrderService {
 
 		return resultMsg;
 	}
-	
+
 	/**
 	 * 주문상세 > 주문요청 관리자 메모 > 메모정보조회
 	 * @param Order
@@ -438,7 +433,7 @@ public class TsaOrderService {
 	public Order getOrderMemoInfo(Order order) {
 		return orderDao.getOrderMemoInfo(order);
 	}
-	
+
 	/**
 	 * 주문상세 > 주문요청 관리자 메모 > 메모등록
 	 * @param Order
@@ -449,7 +444,7 @@ public class TsaOrderService {
 	public void createOrderMemo(Order order) {
 		orderDao.createOrderMemo(order);
 	}
-	
+
 	/**
 	 * 주문상세 > 주문요청 관리자 메모 > 메모수정
 	 * @param Order
@@ -460,7 +455,7 @@ public class TsaOrderService {
 	public void updateOrderMemo(Order order) {
 		orderDao.updateOrderMemo(order);
 	}
-	
+
 	/**
 	 * 주문상세 > 주문요청 관리자 메모 > 메모삭제
 	 * @param Order
@@ -471,7 +466,7 @@ public class TsaOrderService {
 	public void deleteOrderMemo(Order order) {
 		orderDao.deleteOrderMemo(order);
 	}
-	
+
 	/**
 	 * 주문상품 상세 변경 이력 화면
 	 * @param Order
@@ -482,7 +477,7 @@ public class TsaOrderService {
 	public Collection<Order> getOrderDetailHistoryList(Order order) {
 		return orderDao.getOrderDetailHistoryList(order);
 	}
-	
+
 	/**
 	 * 쿠폰사용 내역 팝업 화면
 	 * @param Order
@@ -493,7 +488,7 @@ public class TsaOrderService {
 	public Collection<Order> getOrderDiscountCouponList(Order order) {
 		return orderDao.getOrderDiscountCouponList(order);
 	}
-	
+
 	/**
 	 * 포인트사용 내역 팝업 화면
 	 * @param Order
@@ -504,7 +499,7 @@ public class TsaOrderService {
 	public Collection<Order> getOrderDiscountPointList(Order order) {
 		return orderDao.getOrderDiscountPointList(order);
 	}
-	
+
 	/**
 	 * 상품권사용 내역 팝업 화면
 	 * @param Order
@@ -515,7 +510,7 @@ public class TsaOrderService {
 	public Collection<Order> getOrderGiftcardHstList(Order order) {
 		return orderDao.getOrderGiftcardHstList(order);
 	}
-	
+
 	/**
 	 * 다다익선적용 내역 팝업 화면
 	 * @param Order
@@ -526,7 +521,7 @@ public class TsaOrderService {
 	public Collection<Order> getOrderTmtbHstList(Order order) {
 		return orderDao.getOrderTmtbHstList(order);
 	}
-	
+
 	/**
 	 * 주문상세상태를 변경
 	 * @param Order
@@ -537,488 +532,11 @@ public class TsaOrderService {
 	public void changedOrdDtlStat(Order order) {
 		// 1. 주문상세상태변경
 		int resultInt = orderDao.changedOrdDtlStat(order);
-		
+
 		// 2. 주문상세상태변경 성공 후 주문상세 이력을 등록
 		if (resultInt > 0) {
 			orderDao.createOrderDetailHst(order);
 		}
 	}
-	
-	/**
-	 * 주문정보조회
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	public Order getOrderInfo(Order order) {
-		return orderDao.getOrderInfo(order);
-	}
-	
-	/**
-	 * 주문상세 > 주문취소대상목록
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	public Collection<Order> getCancelRequestTargetList(Order order) {
-		return orderDao.getCancelRequestTargetList(order);
-	}
-	
-	/**
-	 * 주문상세 > 주문취소 환불 금액 계산
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2020. 12. 16
-	 */
-	public GagaMap orderCancelRefundAmt(List<Order> cancelReqList) {
-		GagaMap mav = new GagaMap();
-		
-		// 1. 변수설정
-		int spanPayAmt			= 0; // 총 결제 금액
-		int spanSumRealOrdAmt	= 0; // 상품 실결제 금액
-		int spanSumDeliveryFee	= 0; // 배송금액
-		int spanOrdAmt			= 0; // 주문 상품 금액
-		int spanCnclRtnAmt		= 0; // 취소 상품 금액
-		int spanTotPntDcAmt		= 0; // 취소 사용 포인트
-		int spanPntDcAmt		= 0; // 고객 포인트
-		int spanPrePntDcAmt		= 0; // 상품 선포인트
-		int spanCpnDcAmt		= 0; // 취소 사용 쿠폰금액
-		int spanCpn1DcAmt		= 0; // 즉시할인쿠폰
-		int spanGoodsCpnDcAmt	= 0; // 상품쿠폰
-		int spanCartCpnDcAmt	= 0; // 장바구니쿠폰
-		int spanTmtbDcAmt		= 0; // 취소 다다익선 금액
-		int spanTmtb1DcAmt		= 0; // 수량할인
-		int spanTmtb2DcAmt		= 0; // 금액할인
-		int spanGfcdUseAmt		= 0; // 취소 고객 상품권 금액
-		int spanRealCnclRtnAmt	= 0; // 취소 상품 실결제 금액
-		int spanTotDeliveryFee	= 0; // 환불 배송 금액
-		int spanRefundAmt		= 0; // 환불 금액 합계
-		
-		List<Order> cancelOrderRefundList 	= new ArrayList<Order>();	// 주문환불금액목록
-		List<Order> cancelDelvRefundList 	= new ArrayList<Order>();	// 주문환불배송금액목록
-		
-		Order orderObj	= new Order();
-		Order delvObj	= new Order();
-		int k 			= 0 ;
-		
-		// 2. 초기 배송정보 설정
-		delvObj.setOrdAmt(0);
-		delvObj.setCnclRtnAmt(0);
-		delvObj.setRealOrdAmt(0);
-		delvObj.setDelvFee(cancelReqList.get(k).getDelvFee());
-		delvObj.setMinOrdAmt(cancelReqList.get(k).getMinOrdAmt());
-		delvObj.setOrgDelvFee(cancelReqList.get(k).getOrgDelvFee());
-		delvObj.setSupplyCompCd(cancelReqList.get(k).getSupplyCompCd());
-		delvObj.setDelvFeeCd(cancelReqList.get(k).getDelvFeeCd());
-		delvObj.setAllCanYn(cancelReqList.get(k).getAllCanYn());
-		cancelDelvRefundList.add(delvObj);
-		
-		// 3. 취소신청수량 정보를 취소 환불 금액 계산
-		for (Order oneData : cancelReqList) {
-			orderObj	= new Order();
-			
-			// 3.1 주문기본정보 설정
-			orderObj.setItemQty(oneData.getItemQty());
-			orderObj.setOrdQty(oneData.getOrdQty());
-			orderObj.setCnclRtnQty(oneData.getCnclRtnQty());
-			orderObj.setOrdReqChgQty(oneData.getOrdReqChgQty());
-			orderObj.setOrdCanChgQty(oneData.getOrdCanChgQty());
-			orderObj.setItemPrice(oneData.getItemPrice());
-			orderObj.setOptAddPrice	(oneData.getOptAddPrice());
-			orderObj.setOrdAmt(oneData.getOrdAmt());
-			
-			orderObj.setOrdNo(oneData.getOrdNo());
-			orderObj.setOrdDtlNo(oneData.getOrdDtlNo());
-			orderObj.setGoodsCd(oneData.getGoodsCd());
-			orderObj.setGoodsNm(oneData.getGoodsNm());
-			orderObj.setOrdDtlItemSq(oneData.getOrdDtlItemSq());
-			orderObj.setItemCd(oneData.getItemCd());
-			orderObj.setItemNm(oneData.getItemNm());
-			orderObj.setOptCd1(oneData.getOptCd1());
-			orderObj.setOptCd2(oneData.getOptCd2());
-			
-			// 3.2 주문취소수량으로 취소율 정보 설정
-			int ordQty 			= oneData.getOrdQty();
-			int itemQty 		= oneData.getItemQty();
-			int ordCanChgQty 	= oneData.getOrdCanChgQty();
-			
-			float _appQty		= (float)ordCanChgQty / (float)ordQty;
-			
-			// 3.3 주문취소금액 & 취소할인금액 계산
-			orderObj.setCnclRtnAmt(((oneData.getItemPrice() + oneData.getOptAddPrice()) * itemQty) * ordCanChgQty);
-			orderObj.setCpn1DcAmt((int)(oneData.getCpn1DcAmt() 				* _appQty));
-			orderObj.setTmtb1DcAmt((int)(oneData.getTmtb1DcAmt() 			* _appQty));
-			orderObj.setTmtb2DcAmt((int)(oneData.getTmtb2DcAmt() 			* _appQty));
-			orderObj.setGoodsCpnDcAmt((int)(oneData.getGoodsCpnDcAmt() 		* _appQty));
-			orderObj.setCartCpnDcAmt((int)(oneData.getCartCpnDcAmt() 		* _appQty));
-			orderObj.setPntDcAmt((int)(oneData.getPntDcAmt() 				* _appQty));
-			orderObj.setPrePntDcAmt((int)(oneData.getPrePntDcAmt() 			* _appQty));
-			orderObj.setSavePntAmt((int)(oneData.getSavePntAmt() 			* _appQty));
-			orderObj.setGfcdUseAmt((int)(oneData.getGfcdUseAmt() 			* _appQty));
-			
-			// 3.4 취소할인합계금액 적용
-			int dcTotAmt		= 0;
-			dcTotAmt			+= orderObj.getTmtb1DcAmt();
-			dcTotAmt			+= orderObj.getTmtb2DcAmt();
-			dcTotAmt			+= orderObj.getGoodsCpnDcAmt();
-			dcTotAmt			+= orderObj.getCartCpnDcAmt();
-			dcTotAmt			+= orderObj.getPntDcAmt();
-			dcTotAmt			+= orderObj.getPrePntDcAmt();
-			dcTotAmt			+= orderObj.getCpn1DcAmt();
-			dcTotAmt			+= orderObj.getGfcdUseAmt();
-			
-			// 3.5 주문취소환불금액 계산
-			orderObj.setRealOrdAmt(orderObj.getCnclRtnAmt() - dcTotAmt);
-			
-			// 3.6 배송정보 관련 설정		
-			orderObj.setOrdDtlNo(oneData.getOrdDtlNo());
-			orderObj.setGoodsTypeNm(oneData.getGoodsTypeNm());
-			orderObj.setDelvFee(oneData.getDelvFee());
-			orderObj.setSupplyCompCd(oneData.getSupplyCompCd());
-			orderObj.setDelvFeeCd(oneData.getDelvFeeCd());
-			orderObj.setMinOrdAmt(oneData.getMinOrdAmt());
-			orderObj.setOrgDelvFee(oneData.getOrgDelvFee());
-			
-			// 3.7 주문상세상태체크
-			orderObj.setOrdDtlStat(oneData.getOrdDtlStat());
-			orderObj.setOrdDtlStatNm(oneData.getOrdDtlStatNm());
-			orderObj.setAllCanYn(oneData.getAllCanYn()); // 전체취소 여부 (기존의 취소 또는 출고, 반품, 교환 의 경우에는 전체취소 불가능)
-			
-			cancelOrderRefundList.add(orderObj);
-			
-			// 3.8 배송업체 & 배송비정책 조건으로 추가 배송비 금액 설정
-			if (cancelDelvRefundList.get(k).getSupplyCompCd().equals(orderObj.getSupplyCompCd()) && cancelDelvRefundList.get(k).getDelvFeeCd().equals(orderObj.getDelvFeeCd())) {
-				// 공급업체 와 배송정책코드가 같으면 주문금액, 취소금액 SUM
-				cancelDelvRefundList.get(k).setOrdAmt(cancelDelvRefundList.get(k).getOrdAmt() + orderObj.getOrdAmt());
-				cancelDelvRefundList.get(k).setCnclRtnAmt(cancelDelvRefundList.get(k).getCnclRtnAmt() + orderObj.getCnclRtnAmt());
-				cancelDelvRefundList.get(k).setRealOrdAmt(cancelDelvRefundList.get(k).getRealOrdAmt() + orderObj.getRealOrdAmt());
-				
-				if ("N".equals(orderObj.getAllCanYn())) {
-					cancelDelvRefundList.get(k).setAllCanYn("N");
-				}
-			} else {			
-				k++;
-				
-				delvObj	= new Order();
-				
-				// 공급업체 와 배송정책코드가 같지안으면 주문금액, 취소금액 RESET
-				delvObj.setOrdAmt(orderObj.getOrdAmt());
-				delvObj.setCnclRtnAmt(orderObj.getCnclRtnAmt());
-				delvObj.setRealOrdAmt(orderObj.getRealOrdAmt());
-				
-				delvObj.setDelvFee(orderObj.getDelvFee());
-				delvObj.setMinOrdAmt(orderObj.getMinOrdAmt());			
-				delvObj.setOrgDelvFee(orderObj.getOrgDelvFee());
-				delvObj.setSupplyCompCd(orderObj.getSupplyCompCd());
-				delvObj.setDelvFeeCd(orderObj.getDelvFeeCd());
-				delvObj.setAllCanYn(orderObj.getAllCanYn());
-				
-				cancelDelvRefundList.add(delvObj);
-			}
-			
-			// 3.9 FRONT 화면에서 상용 하는 변수 값 설정 & 계산
-			spanSumRealOrdAmt	+= oneData.getRealOrdAmt();
-			spanPntDcAmt		+= orderObj.getPntDcAmt();
-			spanPrePntDcAmt		+= orderObj.getPrePntDcAmt();
-			spanCpn1DcAmt		+= orderObj.getCpn1DcAmt();
-			spanGoodsCpnDcAmt	+= orderObj.getGoodsCpnDcAmt();
-			spanCartCpnDcAmt	+= orderObj.getCartCpnDcAmt();
-			spanTmtb1DcAmt		+= orderObj.getTmtb1DcAmt();
-			spanTmtb2DcAmt		+= orderObj.getTmtb2DcAmt();
-			spanGfcdUseAmt		+= orderObj.getGfcdUseAmt();
-			spanRealCnclRtnAmt	+= orderObj.getRealOrdAmt();
-		}
-		
-		// 4. 추가배송비 발생여부, 추가배송비, 배송비정책단위 전체취소 여부 체크
-		for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
-			Order obj = cancelDelvRefundList.get(i);
-			
-			// 4.1 무료배송비용 > (주문금액 - 취소금액)
-			if (obj.getMinOrdAmt() > (obj.getOrdAmt() - obj.getCnclRtnAmt())) {
-				
-				// 4.2 주문시 배송비가 존재하면 추가 배송비 없음
-				if (obj.getDelvFee() > 0) {
-					obj.setAddDelvFeeYn("N");
-					obj.setAddDelvFee(0);
-				} else {
-					// 4.3 주문금액 - 취소금액 == 0 이면 전체취소 이므로 배송비 발생 안함
-					// * 2020.12.28 
-					// * case : 배송정책 기준으로 1,2 상품 주문 후 1번 출고 후 1번반품 2번취소 할 경우 전체 취소 가 아니므로 배송비 부과 있을지 모르겠음 주문업체 단위로 배송되기 때문에 발생하지 않을것 같음
-					if ((obj.getOrdAmt() - obj.getCnclRtnAmt()) == 0) {
-						if ("N".equals(obj.getAllCanYn())) {
-							obj.setAddDelvFeeYn("Y");
-							obj.setAddDelvFee(obj.getOrgDelvFee());
-						} else {
-							// 4.4 전체취소의 경우에 해당
-							obj.setAddDelvFeeYn("N");
-							obj.setAddDelvFee(0);
-						}
-					} else {
-						// 4.5 추가배송비 발생 (취소신청화면에서 대부분 아래의 조건에 해당)
-						obj.setAddDelvFeeYn("Y");
-						obj.setAddDelvFee(obj.getOrgDelvFee());
-					}
-				}
-			} else {
-				obj.setAddDelvFeeYn("N");
-				obj.setAddDelvFee(0);
-			}
-			
-			spanSumDeliveryFee	+= obj.getDelvFee();
-			spanOrdAmt			+= obj.getOrdAmt();
-			spanCnclRtnAmt		+= obj.getCnclRtnAmt();
-			spanTotDeliveryFee  += obj.getAddDelvFee();
-			
-			cancelDelvRefundList.set(i, obj);
-		}
-		
-		// 5. FRONT 화면엣 필요한 금액 설정
-		// 2020.12.30 프론트에서 필요한 부분 작업 필여
-		// 관리자 화면에서 사용하는 환불 칼럼 정보
-		// 환불금액표시
-		spanPayAmt 			= spanSumRealOrdAmt + spanSumDeliveryFee;
-		spanTotPntDcAmt 	= spanPntDcAmt + spanPrePntDcAmt;
-		spanCpnDcAmt 		= spanCpn1DcAmt + spanGoodsCpnDcAmt + spanCartCpnDcAmt;
-		spanTmtbDcAmt 		= spanTmtb1DcAmt + spanTmtb2DcAmt;
-		spanRefundAmt 		= spanRealCnclRtnAmt - spanTotDeliveryFee;
-
-		mav.set("cancelReqList"			, cancelReqList);			//주문 취소 신청 목록
-		mav.set("cancelOrderRefundList"	, cancelOrderRefundList);	//주문 환불 금액 목록
-		mav.set("cancelDelvRefundList"	, cancelDelvRefundList);	//주문 환불 배송 금액 목록
-		mav.set("spanPayAmt"			, spanPayAmt);				//총 결제 금액
-		mav.set("spanSumRealOrdAmt"		, spanSumRealOrdAmt);		//상품 실결제 금액
-		mav.set("spanSumDeliveryFee"	, spanSumDeliveryFee);		//배송금액
-		mav.set("spanOrdAmt"			, spanOrdAmt);				//주문 상품 금액
-		mav.set("spanCnclRtnAmt"		, spanCnclRtnAmt);			//취소 상품 금액
-		mav.set("spanTotPntDcAmt"		, spanTotPntDcAmt);			//취소 사용 포인트
-		mav.set("spanPntDcAmt"			, spanPntDcAmt);			//고객 포인트
-		mav.set("spanPrePntDcAmt"		, spanPrePntDcAmt);			//상품 선포인트
-		mav.set("spanCpnDcAmt"			, spanCpnDcAmt);			//취소 사용 쿠폰금액
-		mav.set("spanCpn1DcAmt"			, spanCpn1DcAmt);			//즉시할인쿠폰
-		mav.set("spanGoodsCpnDcAmt"		, spanGoodsCpnDcAmt);		//상품쿠폰
-		mav.set("spanCartCpnDcAmt"		, spanCartCpnDcAmt);		//장바구니쿠폰
-		mav.set("spanTmtbDcAmt"			, spanTmtbDcAmt);			//취소 다다익선 금액
-		mav.set("spanTmtb1DcAmt"		, spanTmtb1DcAmt);			//수량할인
-		mav.set("spanTmtb2DcAmt"		, spanTmtb2DcAmt);			//금액할인
-		mav.set("spanGfcdUseAmt"		, spanGfcdUseAmt);			//취소 고객 상품권 금액
-		mav.set("spanRealCnclRtnAmt"	, spanRealCnclRtnAmt);		//취소 상품 실결제 금액
-		mav.set("spanTotDeliveryFee"	, spanTotDeliveryFee);		//환불 배송 금액
-		mav.set("spanRefundAmt"			, spanRefundAmt);			//환불 금액 합계
-		
-		return mav;
-	}
-	
-	/**
-	 * 주문상세 > 주문취소
-	 * @param Order
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2020. 12. 30
-	 */
-	@Transactional("shopTxnManager")
-	public void orderCancel(GagaMap mav) {
-		
-		// 1. 세션회원조회
-		int userNo = TsaSession.getInfo().getUserNo();
-		
-		// 2. 취소요정정보목록
-		List<Order> cancelReqList		 	= (List<Order>) mav.get("cancelReqList");			//주문 취소 신청 목록
-		List<Order> cancelOrderRefundList 	= (List<Order>) mav.get("cancelOrderRefundList");	//주문 환불 금액 목록
-		List<Order> cancelDelvRefundList 	= (List<Order>) mav.get("cancelDelvRefundList");	//주문 환불 배송 금액 목록
-				
-		// 3. 취소신청정보
-		int ordNo 			= Integer.parseInt(mav.getString("ordNo").toString());
-		String chgReason 	= mav.getString("chgReason").toString();
-		String chgMemo 		= mav.getString("chgMemo").toString();
-		String allCanYn		= mav.getString("allCanYn").toString();
-		String chgGb		= "G680_20";
-		
-		// 4.1 주문변경 기본정보 등록
-		OrderChange orderChange = new OrderChange();
-		orderChange.setOrdNo(ordNo);
-		orderChange.setChgGb(chgGb);
-		orderChange.setChgReason(chgReason);
-		orderChange.setChgMemo(chgMemo);
-		orderChange.setAddPayCost(0);
-		orderChange.setAddPayAmt(0);
-		orderChange.setRegNo(userNo);
-		orderChange.setUpdNo(userNo);
-		
-		orderDao.createOrderChange(orderChange);
-		
-		List<Order> cancelOrderDetailList = new ArrayList<Order>();
-		
-		// 4.2 주문변경 상세 단품 정보 등록 (단품단위)
-		for (int i=0 ; i<cancelOrderRefundList.size() ; i++) {
-			Order vo = cancelOrderRefundList.get(i);
-			vo.setRegNo(userNo);
-			vo.setUpdNo(userNo);
-			
-			// 2020.01.05 추후 무통장입금전 전체 취소시 분기로직 추가 예정
-			if ("Y".equals(allCanYn)) {
-				vo.setOrdDtlStat("G013_98"); // 결제전주문취소 : 공통코드로관리예정
-			} else {
-				vo.setOrdDtlStat("G013_99"); // 결제후주문취소 : 공통코드로관리예정
-			}
-
-			// 4.2.1 취소수량이 존재하면 주문정보 수정 및 주문변경정보 등록
-			if (vo.getOrdCanChgQty() > 0) {
-				// 4.2.3 주문상세단품정보 수정
-				orderDao.updateOrderDetailItem(vo);
-				
-				// 4.2.4 주문상세단품정보 이력 등록
-				orderDao.createOrderDetailItemHst(vo);
-				
-				// 4.3 주문변경 상세 단위로 데이타 등록 (ORD_DTL_NO)
-				Boolean temp = false;
-				
-				if (cancelOrderDetailList.size() > 0) {
-					for (int j=0 ; j<cancelOrderDetailList.size() ; j++) {
-						if (vo.getOrdDtlNo() == cancelOrderDetailList.get(j).getOrdDtlNo()) {
-							temp = true;
-						}
-					}
-				}
-				
-				// 4.4 주문상세단위 데이타 저장
-				if (!temp) {
-					cancelOrderDetailList.add(vo);
-				}
-			}
-		}
-		
-		// 5. 주문상세단위 취소 데이타 처리
-		for (int i=0 ; i<cancelOrderDetailList.size() ; i++) {			
-			Order vo = cancelOrderRefundList.get(i);
-			vo.setRegNo(userNo);
-			vo.setUpdNo(userNo);
-			
-			// 2020.01.05 추후 무통장입금전 전체 취소시 분기로직 추가 예정
-			if ("Y".equals(allCanYn)) {
-				vo.setOrdDtlStat("G013_98"); // 결제전주문취소 : 공통코드로관리예정
-			} else {
-				vo.setOrdDtlStat("G013_99"); // 결제후주문취소 : 공통코드로관리예정
-			}
-			
-			// 5.1 주문변경상세정보 이력 등록
-			orderDao.createOrderDetailHstCnclRtn(vo);
-			
-			// 4.2 주문변경상세정보 수정
-			orderDao.updateOrderDetail(vo);
-			
-			// * 주문상세단위가 아닌 주문상세단품단위로 데이타가 처리되고 있었음
-			// 5.3 주문변경상세정보 등록
-			OrderChange po = new OrderChange();
-			po.setOrdChgSq(orderChange.getOrdChgSq());
-			po.setOrdDtlNo(vo.getOrdDtlNo());
-			po.setChgQty(vo.getOrdCanChgQty());
-			po.setChgStat("G685_21"); // 취소완료 : 공통코드로관리예정
-			po.setRegNo(userNo);
-			po.setUpdNo(userNo);
-			
-			orderDao.createOrderChangeDetail(po);
-		}
-		
-		// 6. 환불결제 정보 등록
-		Order paymentOrder = new Order();
-		paymentOrder.setOrdNo(ordNo);
-		paymentOrder.setPayAmt(Integer.parseInt(mav.get("spanRefundAmt").toString()) * -1);
-		paymentOrder.setPayStat("G016_99");
-		paymentOrder.setOrdChgSq(orderChange.getOrdChgSq());
-		paymentOrder.setRegNo(userNo);
-		paymentOrder.setUpdNo(userNo);
-		
-		orderDao.createPayment(paymentOrder);
-		
-		// 7. 환불금액 등록
-		Order refundOrder = new Order();
-		refundOrder.setOrdNo(ordNo);
-		refundOrder.setPaySq(paymentOrder.getPaySq());
-		refundOrder.setOrdChgSq(orderChange.getOrdChgSq());
-		refundOrder.setRegNo(userNo);
-		
-		refundOrder.setRefundAmt(Integer.parseInt(mav.get("spanRefundAmt").toString()));
-		refundOrder.setRfCpn1Amt(Integer.parseInt(mav.get("spanCpn1DcAmt").toString()));
-		refundOrder.setRfTmtb1Amt(Integer.parseInt(mav.get("spanTmtb1DcAmt").toString()));
-		refundOrder.setRfTmtb2Amt(Integer.parseInt(mav.get("spanTmtb2DcAmt").toString()));
-		refundOrder.setRfGoodsCpnAmt(Integer.parseInt(mav.get("spanGoodsCpnDcAmt").toString()));
-		refundOrder.setRfCartCpnAmt(Integer.parseInt(mav.get("spanCartCpnDcAmt").toString()));
-		refundOrder.setRfPntAmt(Integer.parseInt(mav.get("spanPntDcAmt").toString()));
-		refundOrder.setRfPrePntAmt(Integer.parseInt(mav.get("spanPrePntDcAmt").toString()));
-		refundOrder.setRfGfcdUseAmt(Integer.parseInt(mav.get("spanGfcdUseAmt").toString()));
-		
-		refundOrder.setRaNo(mav.get("accountNo").toString());
-		refundOrder.setRaNm(mav.get("accountNm").toString());
-		refundOrder.setRaBank(mav.get("bankCd").toString());
-		
-		orderDao.createRefund(refundOrder);
-		
-		// 8. 결제금액이 무료배송금액보다 작으면 배송비 신규 등록
-		for (int i=0 ; i<cancelDelvRefundList.size() ; i++) {
-			Order vo = cancelDelvRefundList.get(i);
-			
-			if (vo.getAddDelvFee() > 0) {
-				Order delvFeeOrder = new Order();
-				
-				delvFeeOrder.setPaySq(paymentOrder.getPaySq());
-				delvFeeOrder.setOrdNo(ordNo);
-				delvFeeOrder.setDelvFeeGb("G018_10");
-				delvFeeOrder.setDelvFeeCd(vo.getDelvFeeCd());
-				delvFeeOrder.setDelvFee(vo.getAddDelvFee());
-				delvFeeOrder.setRealDelvAmt(vo.getDelvFee());
-				delvFeeOrder.setOrdChgSq(orderChange.getOrdChgSq());
-				delvFeeOrder.setSupplyCompCd(vo.getSupplyCompCd());
-				delvFeeOrder.setRegNo(userNo);
-				delvFeeOrder.setUpdNo(userNo);
-				
-				orderDao.createDeliveryFee(delvFeeOrder);
-			}
-		}
 
-		// 9. 포인트원복
-		
-		// 10. 쿠폰원복 (상품쿠폰)
-		
-		// 11. 사은품 취소
-		
-		// 12. 재고원복
-		
-		// 13. PG 연동
-		
-		//int a = 100/0;
-	}
-	
-	/**
-	 * 주문 환불계좌
-	 *
-	 * @param order - 주문정보
-	 * @return Order
-	 * @author jsh77b
-	 * @since 2021. 01. 04.
-	 */
-	public Collection<Order> getRefundAccount(Order order) {
-		return orderDao.getRefundAccount(order);
-	}
-	
-	/**
-	 * 환불계좌 저장
-	 *
-	 * @param order - 주문정보
-	 * @return TsaOrder
-	 * @author jsh77b
-	 * @since 2021. 01. 05.
-	 */
-	public int saveRefundAccount(Order order) {
-		
-		// 환불계좌 유무 체크 후 등록
-		if (orderDao.getRefundAccountCheck(order) < 1) {
-			orderDao.saveRefundAccount(order);
-		}
-		
-		return 1;
-	}
-	
 }

+ 48 - 0
style24.admin/src/main/java/com/style24/admin/biz/service/TsaPgService.java

@@ -0,0 +1,48 @@
+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.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.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.OrderChange;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * PG 연동 Service
+ *
+ * @author jsh77b
+ * @since 2020. 11. 16
+ */
+@Service
+@Slf4j
+public class TsaPgService {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private TsaOrderDao orderDao;
+
+	@Autowired
+	private ObjectMapper mapper;
+	
+}

+ 117 - 21
style24.admin/src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -9,8 +9,11 @@ import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.TsaPageRequest;
-import com.style24.persistence.domain.*;
+import com.style24.persistence.domain.CommonCode;
+import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.FreeGoodsPromotion;
 
+import com.style24.persistence.domain.MoreBetter;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
@@ -53,6 +56,9 @@ public class TsaMarketingController extends TsaBaseController {
 	@Autowired
 	private TsaSystemService systemService;
 
+	@Autowired
+	private TsaMorebetterService morebetterService;
+
 	@Autowired
 	private TsaCouponService couponService;
 
@@ -284,7 +290,7 @@ public class TsaMarketingController extends TsaBaseController {
 	public GagaMap getMorebetterList(@RequestBody MoreBetter param) {
 		GagaMap result = new GagaMap();
 
-		List<MoreBetter> tmtbList = (ArrayList<MoreBetter>) marketingService.getMorebetterList(param);
+		List<MoreBetter> tmtbList = (ArrayList<MoreBetter>) morebetterService.getMorebetterList(param);
 
 		param.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
 		param.setPageable(new TsaPageRequest(param.getPageNo() - 1, param.getPageSize()));
@@ -306,41 +312,59 @@ public class TsaMarketingController extends TsaBaseController {
 	 */
 	@ResponseBody
 	@GetMapping("/morebetterRegPopup/form")
-	public ModelAndView morebetterRegForm(MoreBetter tmtb) {
+	public ModelAndView morebetterRegForm(@RequestParam(value = "mode") String mode, @RequestParam(value = "tmtbSeq", required = false) Integer tmtbSeq,MoreBetter tmtb) {
 		ModelAndView mav = new ModelAndView();
 
 		// 상품상태 : 등록일때는 '대기'
 		String[] exceptCds = {"G008_00"};
 		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
-		log.info("CHECK param goodsStatList>>"+rendererService.getCommonCodeList("G008", "Y", exceptCds));
 
 		// 할인구간 목록
 		mav.addObject("sectionGbList", rendererService.getAvailCommonCodeList("G810"));
-		log.info("CHECK param sectionGbList>>"+rendererService.getAvailCommonCodeList("G810"));
+
 		// 할인구분 목록
 		mav.addObject("dcWayList", rendererService.getAvailCommonCodeList("G240"));
-		log.info("CHECK param dcWayList>>"+rendererService.getAvailCommonCodeList("G240"));
 
 		// 적용 상품구분 목록
 		String[] exceptGoodsCds = {"G800_30","G800_40"};
 		mav.addObject("applyGoodsGbList", rendererService.getCommonCodeList("G800", "Y", exceptGoodsCds));
-		log.info("CHECK param applyGoodsGbList>>"+rendererService.getCommonCodeList("G800", "Y", exceptGoodsCds));
 
 		// 제외 상품구분 목록
 		mav.addObject("exceptGoodsGbList", rendererService.getAvailCommonCodeList("G800"));
-		log.info("CHECK param exceptGoodsGbList>>"+rendererService.getAvailCommonCodeList("G800"));
 
-		// 이것도 리스트 받아와서 바꿔야함 ㅠㅠ
-		String tmtbStat = "G232_10";
-		tmtb.setTmtbStat(tmtbStat);
+		// 다다익선 상태 목록
+		mav.addObject("tmtbStatList", rendererService.getAvailCommonCodeList("G232"));
 
-		//tmtb sq 자동생성 추가해야함
+		//tmtb sq 자동생성
 		Integer tmtbSq;
-		tmtbSq =  commonService.getNextSequence("SEQ_TMTB");
-		tmtb.setTmtbSq(tmtbSq);
+		if("N".equals(mode)){
+			tmtbSq =  commonService.getNextSequence("SEQ_TMTB");
+			tmtb.setTmtbSq(tmtbSq);
+		}
 
+		if("U".equals(mode)){
+			// 다다익선 정보
+			mav.addObject("tmtbMstInfo", morebetterService.getMorebetterMstInfo(tmtbSeq));
+			mav.addObject("tmtbSupplyCompList", morebetterService.getMorebetterSupplyCompList(tmtbSeq,"G260_13"));
+			mav.addObject("tmtbBrandList", morebetterService.getMorebetterBrandList(tmtbSeq,"G260_12"));
+			mav.addObject("tmtbApplyGoodsList", morebetterService.getMorebetterApplyGoodsList(tmtbSeq,"G260_10"));
+			mav.addObject("tmtbExceptGoodsList", morebetterService.getMorebetterExceptGoodsList(tmtbSeq,"G260_10"));
+			mav.addObject("tmtbSectionValList", morebetterService.getMorebetterSectionValList(tmtbSeq));
+			mav.addObject("tmtbBurdenList", morebetterService.getMorebetterBurdenList(tmtbSeq));
+		}else{
+			mav.addObject("tmtbMstInfo", new MoreBetter());
+			mav.addObject("tmtbSupplyCompList", new MoreBetterGoods());
+			mav.addObject("tmtbBrandList", new MoreBetterGoods());
+			mav.addObject("tmtbApplyGoodsList", new MoreBetterGoods());
+			mav.addObject("tmtbExceptGoodsList", new MoreBetterGoods());
+			mav.addObject("tmtbSectionValList", new MoreBetterSection());
+			mav.addObject("tmtbBurdenList", new MoreBetterBurden());
+		}
+
+		mav.addObject("mode", mode);
+		mav.addObject("tmtbSeq", tmtbSeq);
 		mav.addObject("params", tmtb);
-		log.info("CHECK param tmtbSq>>"+tmtb.getTmtbSq());
+		log.info("CHECK param tmtbSq::{}", tmtb.getTmtbSq());
 		mav.setViewName("marketing/MorebetterRegForm");
 		return mav;
 	}
@@ -423,7 +447,7 @@ public class TsaMarketingController extends TsaBaseController {
 			e.printStackTrace();
 		}
 
-		log.info("tmtb::"+tmtb);
+		log.info("tmtb::{}", tmtb);
 
 		tmtb.setSupplyCompListNew(tmtbSupplyCompList);
 		tmtb.setBrandListNew(tmtbBrandList);
@@ -432,10 +456,70 @@ public class TsaMarketingController extends TsaBaseController {
 		tmtb.setSectionGbListNew(tmtbSectionGbList);
 		tmtb.setBurdenListNew(tmtbBurdenList);
 
-		marketingService.saveMoreBetterDetail(tmtb);
+		morebetterService.saveMoreBetterDetail(tmtb);
 
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
+	/**
+	 * 다다익선 공급업체 삭제
+	 *
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 12
+	 */
+	@PostMapping("/morebetter/supplyCompany/delete")
+	@ResponseBody
+	public GagaResponse deleteTmtbSupplyCompanyList(@RequestBody MoreBetterGoods moreBetterGoods) {
+		morebetterService.deleteTmtbSupplyCompanyList(moreBetterGoods);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
+	/**
+	 * 다다익선 브랜드 삭제
+	 *
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 12
+	 */
+	@PostMapping("/morebetter/brand/delete")
+	@ResponseBody
+	public GagaResponse deleteTmtbBrandList(@RequestBody MoreBetterGoods moreBetterGoods) {
+		morebetterService.deleteTmtbBrandList(moreBetterGoods);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
+	/**
+	 * 다다익선 적용상품 삭제
+	 *
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 12
+	 */
+	@PostMapping("/morebetter/applyGoods/delete")
+	@ResponseBody
+	public GagaResponse deleteTmtbApplyGoodsList(@RequestBody MoreBetterGoods moreBetterGoods) {
+		morebetterService.deleteTmtbApplyGoodsList(moreBetterGoods);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
+	/**
+	 * 다다익선 제외상품 삭제
+	 *
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 12
+	 */
+	@PostMapping("/morebetter/exceptGoods/delete")
+	@ResponseBody
+	public GagaResponse deleteTmtbExceptGoodsList(@RequestBody MoreBetterGoods moreBetterGoods) {
+		morebetterService.deleteTmtbExceptGoodsList(moreBetterGoods);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
 	/**
 	 * 다다익선 할인구간 삭제
 	 *
@@ -446,12 +530,24 @@ public class TsaMarketingController extends TsaBaseController {
 	 */
 	@PostMapping("/morebetter/sectionVal/delete")
 	@ResponseBody
-	public GagaResponse deleteSectionValList(@RequestBody Collection<MoreBetterSection> sectionValList) {
-		// 추후에 더 개발 ㅠㅠ
-		log.info("[deleteSectionValList]");
-		marketingService.deleteSectionValList(sectionValList);
+	public GagaResponse deleteTmtbSectionValList(@RequestBody MoreBetterSection moreBetterSection) {
+		morebetterService.deleteTmtbSectionValList(moreBetterSection);
 		return super.ok(message.getMessage("SUCC_0003"));
 	}
 
+	/**
+	 * 다다익선 업체분담율 삭제
+	 *
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 12
+	 */
+	@PostMapping("/morebetter/burden/delete")
+	@ResponseBody
+	public GagaResponse deleteTmtbBurdenList(@RequestBody MoreBetterBurden moreBetterBurden) {
+		morebetterService.deleteTmtbBurdenList(moreBetterBurden);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
 	/* // CSB 진행 */
 }

+ 292 - 0
style24.admin/src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java

@@ -0,0 +1,292 @@
+package com.style24.admin.biz.web;
+
+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.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+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.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponse;
+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.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.OrderChange;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 취소관리 Controller
+ *
+ * @author jsh77b
+ * @since 2020. 11. 16
+ */
+@Controller
+@RequestMapping("/orderChange")
+@Slf4j
+public class TsaOrderChangeController extends TsaBaseController {
+	
+	@Autowired
+	private TscMessageByLocale message;
+	
+	@Autowired
+	private Environment env;
+	
+	@Autowired
+	private TsaRendererService rendererService;
+	
+	@Autowired
+	private TsaOrderService orderService;
+	
+	@Autowired
+	private TsaOrderChangeService orderChangeService;
+	
+	/**
+	 * 취소요청 화면
+	 * 
+	 * @param ordNo - 주문번호
+	 * @param cncWait - 취소대기요청 구분
+	 * @return ModelAndView
+	 * @author jsh77b
+	 * @since 2020. 12. 22
+	 */
+	@GetMapping("/cancel/request/form")
+	public ModelAndView cancelRequestFrom(@RequestParam(value = "ordNo") int ordNo) {
+
+		Order order = new Order();
+		ModelAndView mav = new ModelAndView();
+		
+		order.setOrdNo(ordNo);
+		
+		// 취소가능 주문상세상탭값 설정
+		String[] ordDtlStatArr = new String[4];
+		ordDtlStatArr[0] = "G013_10";
+		ordDtlStatArr[1] = "G013_20";
+		ordDtlStatArr[2] = "G013_30";
+		ordDtlStatArr[3] = "G013_40";
+		
+		Collection<Order> cancelRequestTargetList = orderChangeService.getCancelRequestTargetList(order);
+
+		Collection<Order> orderInfoList = orderService.getOrderInfoList(order);
+
+		mav.addObject("chgReasonList"				, rendererService.getAvailCommonCodeList("G686"));	// 취소사유
+		mav.addObject("cancelRequestTargetList"		, cancelRequestTargetList);							// 취소요청대상 목록
+		mav.addObject("orderInfoList"				, orderInfoList);									// 주문정보
+		mav.addObject("ordNo"						, ordNo);
+
+		mav.setViewName("order/CancelRequestForm");
+		
+		return mav;
+	}
+	
+	/**
+	 * 주문취소신청
+	 * @param Collection<Order> - 주문취소신청목록
+	 * @return
+	 * @author jsh77b
+	 * @since 2020. 12. 29
+	 */
+	@PostMapping("/cancel")
+	@ResponseBody
+	public GagaResponse orderCancel(@RequestBody OrderChange cancelReq) {
+		
+		GagaMap mav = new GagaMap();
+		
+		if (cancelReq== null) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		List<Order> cancelReqList = cancelReq.getCancelReqList(); // 취소요청정보
+		
+		// To Do List
+		// @ 결품취소로직 현재는 일반취소로직만존재
+		// @ 주문취소 취소시 상태값 체크
+		// @ 취소, 반품시 배송비 체크 로직 
+		
+		// 1. 환불금액정보 계산 & 조회
+		mav = orderChangeService.orderCancelRefundAmt(cancelReqList);
+		
+		// 2. 주문변경기본정보 설정
+		mav.set("ordNo"			, cancelReq.getOrdNo());
+		mav.set("chgReason"		, cancelReq.getChgReason());
+		mav.set("chgMemo"		, cancelReq.getChgMemo());
+		
+		mav.set("accountNo"		, cancelReq.getAccountNo());
+		mav.set("accountNm"		, cancelReq.getAccountNm());
+		mav.set("bankCd"		, cancelReq.getBankCd());
+		
+		mav.set("allCanYn"		, cancelReq.getAllCanYn());
+		mav.set("isCustomer"	, cancelReq.getIsCustomer());
+		
+		// 3. 주문변경 DB 등록 (주문정보, 배송정보)
+		orderChangeService.orderCancel(mav);
+		
+		return super.ok("성공");
+	}
+	
+	/**
+	 * 주문 취소/반품 신청환불금액 계산
+	 * @param Collection<Order>- 주문취소신청목록
+	 * @return
+	 * @author jsh77b
+	 * @since 2020. 12. 29
+	 */
+	@PostMapping("/cancel/refundAmt")
+	@ResponseBody
+	public GagaMap orderCancelRefundAmt(@RequestBody List<Order> cancelReqList) {
+		
+		GagaMap mav = new GagaMap();
+		
+		if (cancelReqList == null || cancelReqList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+		
+		// 1. 환불금액정보 계산 & 조회
+		mav = orderChangeService.orderCancelRefundAmt(cancelReqList);
+		
+		return mav;
+	}
+	
+	/**
+	 * 반품요청 화면
+	 * 
+	 * @param ordNo - 주문번호
+	 * @param cncWait - 취소대기요청 구분
+	 * @return ModelAndView
+	 * @author jsh77b
+	 * @since 2020. 12. 22
+	 */
+	@GetMapping("/return/request/form")
+	public ModelAndView returnRequestFrom(@RequestParam(value = "ordNo") int ordNo) {
+
+		Order order = new Order();
+		ModelAndView mav = new ModelAndView();
+		
+		order.setOrdNo(ordNo);
+		
+		// 취소가능 주문상세상탭값 설정
+		String[] ordDtlStatArr = new String[3];
+		ordDtlStatArr[0] = "G013_50";
+		ordDtlStatArr[1] = "G013_55";
+		ordDtlStatArr[2] = "G013_60";
+		order.setOrdDtlStatArr(ordDtlStatArr);
+		
+		Collection<Order> cancelRequestTargetList = orderChangeService.getCancelRequestTargetList(order);
+
+		Collection<Order> orderInfoList = orderService.getOrderInfoList(order);
+
+		mav.addObject("chgReasonList"				, rendererService.getAvailCommonCodeList("G686"));	// 반품사유
+		mav.addObject("cancelRequestTargetList"		, cancelRequestTargetList);							// 반품요청대상 목록
+		mav.addObject("orderInfoList"				, orderInfoList);									// 주문정보
+		mav.addObject("ordNo"						, ordNo);
+		mav.addObject("orderDelvRtnAddrInfo"		, orderService.getDeliveryAddrList(order));			// 배송정보
+
+		mav.setViewName("order/ReturnRequestForm");
+		
+		return mav;
+	}
+	
+	
+	
+	/**
+	 * 환불계좌목록
+	 *
+	 * @param ordNo - 주문번호
+	 * @param custNo - 고객고유번호
+	 * @return Collection<TsaOrder>
+	 * @author jsshin
+	 * @since 2020. 10. 16.
+	 */
+	@GetMapping("/refund/account/info/list")
+	@ResponseBody
+	public Collection<Order> getRefundAccountInfoList(@RequestParam(value = "ordNo") int ordNo) {
+		Order order = new Order();
+		order.setOrdNo(ordNo);
+
+		Collection<Order> orderRfAccountInfo = orderChangeService.getRefundAccount(order);
+
+		return orderRfAccountInfo;
+	}
+	
+	/**
+	 * 환불계좌등록 화면
+	 *
+	 * @param ordNo - 주문번호
+	 * @param custNo - 고객고유번호
+	 * @return ModelAndView
+	 * @author jsh77b
+	 * @since 2021. 01. 04.
+	 */
+	@GetMapping("/refund/account/create/form")
+	public ModelAndView refundAccountCreateForm(@RequestParam(value = "ordNo") int ordNo) {
+		ModelAndView mav = new ModelAndView();
+		Order order = new Order();
+		order.setOrdNo(ordNo);
+
+		Collection<Order> orderBasic 			= orderService.getOrderInfoList(order);
+		Collection<Order> orderRfAccountInfo 	= orderChangeService.getRefundAccount(order);
+
+		mav.addObject("bankList"				, rendererService.getCommonCodeList("G940"));
+		mav.addObject("orderRfAccountInfo"		, orderRfAccountInfo);
+		mav.addObject("orderBasic"				, orderBasic);
+
+		mav.setViewName("order/RefundAccountRegistForm");
+		
+		return mav;
+	}
+	
+	/**
+	 * 환불계좌등록
+	 *
+	 * @param order - 환불계좌정보
+	 * @return GagaResponse
+	 * @author jsh77b
+	 * @since 2021. 01. 04.
+	 */
+	@PostMapping("/account/save")
+	@ResponseBody
+	public GagaResponse saveRefundAccount(@RequestBody Order order) {
+		
+		int userNo = TsaSession.getInfo().getUserNo();
+		order.setUpdNo(userNo);
+		order.setRegNo(userNo);
+		
+		String accountCheck = "Y";
+		
+		// To Do List
+		// @ 환불계좌인증
+		
+		
+		if ("Y".equals(accountCheck)) {
+			orderChangeService.saveRefundAccount(order);
+		} else {
+			throw new IllegalStateException("환불계좌정보가 맞지 않습니다!");
+		}
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+	
+	
+}
+
+
+
+
+
+
+
+
+
+

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

@@ -49,24 +49,21 @@ import lombok.extern.slf4j.Slf4j;
 @RequestMapping("/order")
 @Slf4j
 public class TsaOrderController extends TsaBaseController {
-	
+
 	@Autowired
 	private TscMessageByLocale message;
-	
+
 	@Autowired
 	private Environment env;
-	
+
 	@Autowired
 	private TsaRendererService rendererService;
-	
+
 	@Autowired
 	private TsaOrderService orderService;
-	
-	//@Autowired
-	//private TsaMessageByLocale message;
-	
+
 	/**
-	 * 주문 조회 화면
+	 * 주문목록조회
 	 *
 	 * @return ModelAndView
 	 * @author jsh77b
@@ -75,13 +72,13 @@ public class TsaOrderController extends TsaBaseController {
 	@GetMapping("/list/form")
 	public ModelAndView orderListForm() {
 		ModelAndView mav = new ModelAndView();
-		
+
 		mav.addObject("siteCdList"		, rendererService.getAvailCommonCodeList("G012"));		// 사이트구분
 		mav.addObject("mallGbList"		, rendererService.getAvailCommonCodeList("G011"));		// 몰구분		
 		mav.addObject("supplyCompList"	, rendererService.getSupplyCompanyList());				// 공급업제목록
 		mav.addObject("ordStatList"		, rendererService.getAvailCommonCodeList("G012"));		// 주문상태코드
 		mav.addObject("ordDtlStatList"	, rendererService.getAvailCommonCodeList("G013"));		// 주문상세상태코드
-		
+
 		mav.addObject("chgStatList"		, rendererService.getAvailCommonCodeList("G685"));		// 주문변경요청상태코드
 		mav.addObject("chgGbList"		, rendererService.getAvailCommonCodeList("G680"));		// 주문변경구분코드
 		mav.addObject("payMeansList"	, rendererService.getAvailCommonCodeList("G014"));		// 결제수단
@@ -92,9 +89,9 @@ public class TsaOrderController extends TsaBaseController {
 
 		return mav;
 	}
-	
+
 	/**
-	 * 주문 목록
+	 * 주문목록
 	 *
 	 * @param order - 주문정보
 	 * @return Collection<Order>
@@ -105,39 +102,39 @@ public class TsaOrderController extends TsaBaseController {
 	@ResponseBody
 	public GagaMap getOrderList(@RequestBody Order order) throws Exception {
 		GagaMap result = new GagaMap();
-		
+
 		order.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
 		order.setPageable(new TsaPageRequest(order.getPageNo() - 1, order.getPageSize()));
-		
+
 		// 주문상태 CD_GB 변경
 		if (order.getMultiOrdStat() != null) {
 			for (int i=0 ; i<order.getMultiOrdStat().length ; i++) {
-				String ordStat = order.getMultiOrdStat()[i].replace("G012", "G013"); 
+				String ordStat = order.getMultiOrdStat()[i].replace("G012", "G013");
 				order.getMultiOrdStat()[i] = ordStat;
 			}
 		}
-		
+
 		// 주문취소상태 CD_GB 변경
 		if (order.getChgGb() != null) {
-			String chgDtlStat = order.getChgGb().replace("G680", "G685"); 
+			String chgDtlStat = order.getChgGb().replace("G680", "G685");
 			order.setChgGb(chgDtlStat);
 		}
-		
+
 		// 주문전체건수 조회
 		int totalCount = orderService.getOrderListCount(order);
 		order.getPageable().setTotalCount(totalCount);
-		
+
 		// 주문목록 페이지 조회
 		Collection<Order> orderList = orderService.getOrderList(order);
-		
+
 		result.set("pageing"	, order);
 		result.set("orderList"	, orderList);
-		
+
 		return result;
 	}
-	
+
 	/**
-	 * 주문 목록 엑셀 조회
+	 * 주문목록엑셀조회
 	 *
 	 * @param order - 주문정보
 	 * @return Collection<Order>
@@ -148,37 +145,37 @@ public class TsaOrderController extends TsaBaseController {
 	@ResponseBody
 	public Collection<Order> getOrderListSearchExcel(@RequestBody Order order) throws Exception {
 		ObjectMapper mapper = new ObjectMapper();
-		
+
 		// 1. 엑셀업로드경로설정
 		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "");
 		String[] cellName = new String[1];
-		
+
 		// 2. DB 처리 시 사용되는 파라미터명(셀명) 설정
 		cellName[0] = "ordNo";
 		Collection<GagaMap> dataList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, order.getExcelFileNm()), 0, cellName);
-		
+
 		Order searchOrder = new Order();
 		int[] ordNoList = new int[dataList.size()];
 		int cnt = 0;
-		
+
 		for (GagaMap map : dataList) {
 			Order tmpOrder = mapper.convertValue(map, Order.class);
 			ordNoList[cnt] = tmpOrder.getOrdNo();
 			cnt++;
 		}
-		
+
 		// 3. 주문번호 배열에 담고 주문목록 조회
 		searchOrder.setOrdNoList(ordNoList);
 		Collection<Order> orderList = orderService.getOrderList(searchOrder);
-		
+
 		GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, order.getExcelFileNm()));
- 
+
 		return orderList;
 	}
 
 	/**
 	 * 주문상세 화면
-	 * 
+	 *
 	 * @param ordNo - 주문번호
 	 * @return ModelAndView
 	 * @author jsh77b
@@ -188,35 +185,35 @@ public class TsaOrderController extends TsaBaseController {
 	@ResponseBody
 	public ModelAndView orderDetailForm(@RequestParam(value = "ordNo") int ordNo) {
 		ModelAndView mav = new ModelAndView();
-		
+
 		Order order = new Order();
 		order.setOrdNo(ordNo);
 		order.setDelYn("N");
-		
+
 		// 1. 주문기본정보
 		mav.addObject("ordNo"					, ordNo);												// 주문번호
 		mav.addObject("userNo"					, TsaSession.getInfo().getUserNo());					// 관리자번호
-		
+
 		mav.addObject("orderInfo"				, orderService.getOrderInfoList(order));				// 주문기본정보
 		mav.addObject("orderGoodsInfo"			, orderService.getOrderDetailList(order));				// 주문상품정보
 		mav.addObject("orderFreeGiftInfo"		, orderService.getOrderFreeGiftList(order));			// 주문사은품정보 2020.12.16 추가
 		mav.addObject("orderDeliveryAddrInfo"	, orderService.getDeliveryAddrList(order));				// 배송정보
 		mav.addObject("orderPaymentInfo"		, orderService.getOrderPaymentBasicInfoList(order));	// 결제정보
 		mav.addObject("orderDeliveryFeeInfo"	, orderService.getDeliveryFeeList(order));				// 배송비정보
-		
+
 		// 2. 클레임정보
-		mav.addObject("orderChangeInfo"			, orderService.getOrderChangeList(order));				// 취소/반품/교환요청 정보
-		mav.addObject("orderRefundInfo"			, orderService.orderRefundInfo(order));					// 환불정보
-		
+		mav.addObject("orderChangeInfo"			, orderService.getOrderChangeList(order));				// 취소/반품/교환 요청 정보
+		mav.addObject("orderRefundInfo"			, orderService.getOrderRefundInfo(order));				// 환불정보
+
 		// 3. 주문메모정보
-		mav.addObject("orderCounselInfo"		, orderService.orderCounselInfo(order));				// 상담내역
-		mav.addObject("orderAdminMemoInfo"		, orderService.getOrderTsainMemoList(order));			// 관리자메모
+		mav.addObject("orderCounselInfo"		, orderService.getOrderCounselInfo(order));				// 상담내역
+		mav.addObject("orderAdminMemoInfo"		, orderService.getOrderMemoList(order));				// 관리자메모목록
 
 		mav.setViewName("order/OrderDetailForm");
-		
+
 		return mav;
 	}
-	
+
 	/**
 	 * 입점업체미발주목록화면
 	 *
@@ -227,7 +224,7 @@ public class TsaOrderController extends TsaBaseController {
 	@GetMapping("/seller/unorder/list/form")
 	public ModelAndView orderSellerUnorderListForm() {
 		ModelAndView mav = new ModelAndView();
-				
+
 		mav.addObject("supplyCompList"	, rendererService.getSupplyCompanyList());				// 공급업제목록
 		mav.addObject("ordStatList"		, rendererService.getAvailCommonCodeList("G012"));		// 주문상태코드
 		mav.addObject("ordDtlStatList"	, rendererService.getAvailCommonCodeList("G013"));		// 주문상세상태코드
@@ -237,7 +234,7 @@ public class TsaOrderController extends TsaBaseController {
 
 		return mav;
 	}
-	
+
 	/**
 	 * 입점업체미발주 주문목록 조회
 	 *
@@ -248,11 +245,11 @@ public class TsaOrderController extends TsaBaseController {
 	 */
 	@PostMapping("/seller/unorder/list")
 	@ResponseBody
-	public Collection<Order> getOrderSellerUnorderList(@RequestBody Order order) throws Exception {		
-		Collection<Order> orderList = orderService.getOrderSellerUnorderList(order); 
+	public Collection<Order> getOrderSellerUnorderList(@RequestBody Order order) throws Exception {
+		Collection<Order> orderList = orderService.getOrderSellerUnorderList(order);
 		return orderList;
 	}
-	
+
 	/**
 	 * 입점업체미발주목록 - 엑셀다운로드시 주문상태값 변경(출고완료)
 	 *
@@ -267,7 +264,7 @@ public class TsaOrderController extends TsaBaseController {
 		orderService.saveUnorderStatus(orderList);
 		return super.ok("");
 	}
-	
+
 	/**
 	 * 입점업체미발주목록 - 엑셀다운로드
 	 *
@@ -281,16 +278,16 @@ public class TsaOrderController extends TsaBaseController {
 	public ResponseEntity<InputStreamResource> downloadPickingGoodsExcelList(HttpServletRequest request) throws Exception {
 		String excelfileName 	= "입점출고목록_" + GagaDateUtil.getTodayDateTime() + ".xlsx";
 		String excelFilePath 	= GagaFileUtil.getConcatenationPath(env.getProperty("download.path"), "excel", excelfileName);
-		
+
 		Order order = new Order();
 		order.setRegNo(TsaSession.getInfo().getUserNo());
 		order.setSearch("EXCEL");
 
 		orderService.geSellerUnorderExcelList(order, excelFilePath);
-		
+
 		return GagaFileUtil.writeFile(request, excelFilePath);
 	}
-	
+
 	/**
 	 * 입점 송장 엑셀 업로드
 	 *
@@ -305,30 +302,30 @@ public class TsaOrderController extends TsaBaseController {
 	public GagaMap saveSellerUnorderInvoiceExcelupload(@RequestBody Order order) throws Exception {
 
 		ObjectMapper mapper = new ObjectMapper();
-		
+
 		// 1. UPLOAD 경로 조회
 		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
-		
+
 		// 2. DB 처리 시 사용되는 파라미터명(셀명) 설정
 		String[] cellName = {
-			"ordNo"
-			, "ordDtlNo"
-			, "itemCd"
-			, "optCd2"
-			, "itemOrdQty"
-			, "shipCompCd"
-			, "invoiceNo"
+				"ordNo"
+				, "ordDtlNo"
+				, "itemCd"
+				, "optCd2"
+				, "itemOrdQty"
+				, "shipCompCd"
+				, "invoiceNo"
 		};
-		
+
 		Collection<GagaMap> ecxelList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, order.getExcelFileNm()), 0, cellName, 0);
-		
+
 		// 3. 주문목록 매퍼 등록
 		Collection<Order> orderList = new ArrayList<>();
 		for (GagaMap map : ecxelList) {
 			Order tmpGoods = mapper.convertValue(map, Order.class);
 			orderList.add(tmpGoods);
 		}
-		
+
 		// 4. 업로드된 임시 엑셀파일 삭제
 		if (CollectionUtils.isEmpty(orderList)) {
 			try {
@@ -339,7 +336,7 @@ public class TsaOrderController extends TsaBaseController {
 			//throw new IllegalStateException(message.getMessage("FAIL_1001"));
 			throw new IllegalStateException("실패 했습니다.");
 		}
-		
+
 		// 4. 주문상세번호 기준으로 송장번호 등록
 		String result = orderService.saveUnorderInvoice(orderList);
 		GagaMap map = new GagaMap();
@@ -350,7 +347,7 @@ public class TsaOrderController extends TsaBaseController {
 
 		return map;
 	}
-	
+
 	/**
 	 * 입점업체미발주목록 - 송장번호 입력(출고완료)
 	 *
@@ -368,7 +365,7 @@ public class TsaOrderController extends TsaBaseController {
 		map.set("msg", result);
 		return map;
 	}
-	
+
 	/**
 	 * 주문상세 > 주문요청 관리자 메모 > 등록폼
 	 *
@@ -391,9 +388,9 @@ public class TsaOrderController extends TsaBaseController {
 			order.setSeq(seq);
 			order.setOrdNo(ordNo);
 			order.setDelYn("N");
-			
+
 			Order orderMemo = orderService.getOrderMemoInfo(order);
-			
+
 			mav.addObject("orderMemo", orderMemo);
 		}
 
@@ -406,7 +403,7 @@ public class TsaOrderController extends TsaBaseController {
 		mav.setViewName("order/OrderMemoRegistForm");
 		return mav;
 	}
-	
+
 	/**
 	 * 주문상세 > 주문요청 관리자 메모 > 메모저장
 	 *
@@ -421,7 +418,7 @@ public class TsaOrderController extends TsaBaseController {
 		int userNo = TsaSession.getInfo().getUserNo();
 		order.setRegNo(userNo);
 		order.setUpdNo(userNo);
-		
+
 		// 신규
 		if ("N".equals(order.getMode())) {
 			orderService.createOrderMemo(order);
@@ -430,10 +427,10 @@ public class TsaOrderController extends TsaBaseController {
 		else if ("U".equals(order.getMode())) {
 			orderService.updateOrderMemo(order);
 		}
-		
+
 		return super.ok("저장이 완료되었습니다.");
 	}
-	
+
 	/**
 	 * 주문상세 > 주문요청 관리자 메모 > 메모삭제
 	 *
@@ -448,12 +445,12 @@ public class TsaOrderController extends TsaBaseController {
 		int userNo = TsaSession.getInfo().getUserNo();
 		order.setRegNo(userNo);
 		order.setUpdNo(userNo);
-		
+
 		orderService.deleteOrderMemo(order);
-		
+
 		return super.ok("저장이 완료되었습니다.");
 	}
-	
+
 	/**
 	 * 주문상세 > 주문요청 관리자 메모 > 메모삭제 > 새로고침
 	 *
@@ -467,12 +464,12 @@ public class TsaOrderController extends TsaBaseController {
 	public Collection<Order> getOrderTsainMemoList(@PathVariable(value = "ordNo") int ordNo) {
 		Order order = new Order();
 		order.setOrdNo(ordNo);
-		return orderService.getOrderTsainMemoList(order);
+		return orderService.getOrderMemoList(order);
 	}
-	
+
 	/**
 	 * 주문상품 상세 변경 이력 화면
-	 * 
+	 *
 	 * @param ordDtlNo - 주문상세번호
 	 * @return ModelAndView
 	 * @author jsh77b
@@ -492,10 +489,10 @@ public class TsaOrderController extends TsaBaseController {
 		mav.setViewName("order/OrderDetailChangeHst");
 		return mav;
 	}
-	
+
 	/**
 	 * 쿠폰사용 내역 팝업 화면
-	 * 
+	 *
 	 * @param ordNo - 주문번호
 	 * @return ModelAndView
 	 * @author jsh77b
@@ -515,10 +512,10 @@ public class TsaOrderController extends TsaBaseController {
 		mav.setViewName("order/OrderDetailCouponHst");
 		return mav;
 	}
-	
+
 	/**
 	 * 포인트사용 내역 팝업 화면
-	 * 
+	 *
 	 * @param ordNo - 주문번호
 	 * @return ModelAndView
 	 * @author jsh77b
@@ -538,10 +535,10 @@ public class TsaOrderController extends TsaBaseController {
 		mav.setViewName("order/OrderDetailPointHst");
 		return mav;
 	}
-	
+
 	/**
 	 * 상품권사용 내역 팝업 화면
-	 * 
+	 *
 	 * @param ordNo - 주문번호
 	 * @return ModelAndView
 	 * @author jsh77b
@@ -561,10 +558,10 @@ public class TsaOrderController extends TsaBaseController {
 		mav.setViewName("order/OrderDetailGiftcardHst");
 		return mav;
 	}
-	
+
 	/**
 	 * 다다익선적용 내역 팝업 화면
-	 * 
+	 *
 	 * @param ordNo - 주문번호
 	 * @return ModelAndView
 	 * @author jsh77b
@@ -584,7 +581,7 @@ public class TsaOrderController extends TsaBaseController {
 		mav.setViewName("order/OrderDetailTmtbHst");
 		return mav;
 	}
-	
+
 	/**
 	 * 주문상세상태를 변경
 	 *
@@ -599,193 +596,11 @@ public class TsaOrderController extends TsaBaseController {
 		int userNo = TsaSession.getInfo().getUserNo();
 		order.setUpdNo(userNo);
 		order.setRegNo(userNo);
-		
-		orderService.changedOrdDtlStat(order);
-		
-		return super.ok("성공");
-	}
-	
-	/**
-	 * 취소요청 화면
-	 * 
-	 * @param ordNo - 주문번호
-	 * @param cncWait - 취소대기요청 구분
-	 * @return ModelAndView
-	 * @author jsh77b
-	 * @since 2020. 12. 22
-	 */
-	@GetMapping("/cancel/request/form")
-	public ModelAndView cancelRequestFrom(@RequestParam(value = "ordNo") int ordNo, @RequestParam(value = "cncWait") String cncWait) {
 
-		Order order = new Order();
-		ModelAndView mav = new ModelAndView();
-		
-		order.setOrdNo(ordNo);
-		order.setCncWait(cncWait);
-		
-		//NicePay nicePay = new NicePay();
-		//nicePay.setMerchantId(env.getProperty("pg.nicepay.merchantId"));
-		//nicePay.setMerchantKey(env.getProperty("pg.nicepay.merchantKey"));
-		
-		Collection<Order> cancelRequestTargetList = orderService.getCancelRequestTargetList(order);
-
-		Order orderInfo = orderService.getOrderInfo(order);
-
-		//mav.addObject("nicePay", nicePay);
-		mav.addObject("chgReasonList"				, rendererService.getAvailCommonCodeList("G686"));	// 취소사유
-		mav.addObject("cancelRequestTargetList"		, cancelRequestTargetList);							// 취소요청대상 목록
-		mav.addObject("orderInfo"					, orderInfo);										// 주문정보
-		mav.addObject("ordNo"						, ordNo);
-		mav.addObject("cncWait"						, cncWait);
-
-		mav.setViewName("order/CancelRequestForm");
-		
-		return mav;
-	}
-	
-	/**
-	 * 주문취소신청환불금액 계산
-	 * @param Collection<Order>- 주문취소신청목록
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 29
-	 */
-	@PostMapping("/cancel/refundAmt")
-	@ResponseBody
-	public GagaMap orderCancelRefundAmt(@RequestBody List<Order> cancelReqList) {
-		
-		GagaMap mav = new GagaMap();
-		
-		if (cancelReqList == null || cancelReqList.isEmpty()) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-		
-		// 1. 환불금액정보 계산 & 조회
-		mav = orderService.orderCancelRefundAmt(cancelReqList);
-		
-		return mav;
-	}
-	
-	/**
-	 * 주문취소신청
-	 * @param Collection<Order> - 주문취소신청목록
-	 * @return
-	 * @author jsh77b
-	 * @since 2020. 12. 29
-	 */
-	@PostMapping("/cancel")
-	@ResponseBody
-	public GagaResponse orderCancel(@RequestBody OrderChange cancelReq) {
-		
-		GagaMap mav = new GagaMap();
-		
-		if (cancelReq== null) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
+		orderService.changedOrdDtlStat(order);
 
-		List<Order> cancelReqList = cancelReq.getCancelReqList(); // 취소요청정보
-		
-		// 1. 환불금액정보 계산 & 조회
-		mav = orderService.orderCancelRefundAmt(cancelReqList);
-		
-		// 2. 주문변경기본정보 설정
-		mav.set("ordNo"			, cancelReq.getOrdNo());
-		mav.set("chgReason"		, cancelReq.getChgReason());
-		mav.set("chgMemo"		, cancelReq.getChgMemo());
-		
-		mav.set("accountNo"		, cancelReq.getAccountNo());
-		mav.set("accountNm"		, cancelReq.getAccountNm());
-		mav.set("bankCd"		, cancelReq.getBankCd());
-		
-		mav.set("allCanYn"		, cancelReq.getAllCanYn());
-		
-		// 3. 주문변경 DB 등록 (주문정보, 배송정보)
-		orderService.orderCancel(mav);
-		
 		return super.ok("성공");
 	}
-	
-	/**
-	 * 환불계좌등록 화면
-	 *
-	 * @param ordNo - 주문번호
-	 * @param custNo - 고객고유번호
-	 * @return ModelAndView
-	 * @author jsh77b
-	 * @since 2021. 01. 04.
-	 */
-	@GetMapping("/refund/account/create/form")
-	public ModelAndView refundAccountCreateForm(@RequestParam(value = "ordNo") int ordNo) {
-		ModelAndView mav = new ModelAndView();
-		Order order = new Order();
-		order.setOrdNo(ordNo);
-
-		Order orderBasic 						= orderService.getOrderInfo(order);
-		Collection<Order> orderRfAccountInfo 	= orderService.getRefundAccount(order);
-
-		mav.addObject("bankList"				, rendererService.getCommonCodeList("G940"));
-		mav.addObject("orderRfAccountInfo"		, orderRfAccountInfo);
-		mav.addObject("orderBasic"				, orderBasic);
-
-		mav.setViewName("order/RefundAccountRegistForm");
-		
-		return mav;
-	}
-	
-	/**
-	 * 환불계좌 저장
-	 *
-	 * @param order - 환불계좌정보
-	 * @return GagaResponse
-	 * @author jsh77b
-	 * @since 2021. 01. 04.
-	 */
-	@PostMapping("/account/save")
-	@ResponseBody
-	public GagaResponse saveRefundAccount(@RequestBody Order order) {
-		
-		int userNo = TsaSession.getInfo().getUserNo();
-		order.setUpdNo(userNo);
-		order.setRegNo(userNo);
-		
-		/*
-		NicePay nicePay = new NicePay();
-		nicePay.setInAccount(order.getRaNo());
-		nicePay.setInBankCode(order.getRaBnk());
-		nicePay.setRaNm(order.getRaNm());
-		String accountCheck = nicepay.checkBankAccount(nicePay);
-		*/
-		
-		String accountCheck = "Y";
-
-		if ("Y".equals(accountCheck)) {
-			orderService.saveRefundAccount(order);
-		} else {
-			throw new IllegalStateException("환불계좌정보가 맞지 않습니다!");
-		}
-
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-	
-	/**
-	 * 환불계좌정보
-	 *
-	 * @param ordNo - 주문번호
-	 * @param custNo - 고객고유번호
-	 * @return Collection<TsaOrder>
-	 * @author jsshin
-	 * @since 2020. 10. 16.
-	 */
-	@GetMapping("/refund/account/info/list")
-	@ResponseBody
-	public Collection<Order> getRefundAccountInfoList(@RequestParam(value = "ordNo") int ordNo) {
-		Order order = new Order();
-		order.setOrdNo(ordNo);
-
-		Collection<Order> orderRfAccountInfo = orderService.getRefundAccount(order);
-
-		return orderRfAccountInfo;
-	}
 }
 
 

+ 75 - 0
style24.admin/src/main/java/com/style24/admin/biz/web/TsaPgController.java

@@ -0,0 +1,75 @@
+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.support.message.TscMessageByLocale;
+import com.style24.persistence.TsaPageRequest;
+import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.OrderChange;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * PG관리 Controller
+ *
+ * @author jsh77b
+ * @since 2020. 11. 16
+ */
+@Controller
+@RequestMapping("/pg")
+@Slf4j
+public class TsaPgController extends TsaBaseController {
+	
+	@Autowired
+	private TscMessageByLocale message;
+	
+	@Autowired
+	private Environment env;
+	
+	@Autowired
+	private TsaRendererService rendererService;
+	
+	@Autowired
+	private TsaOrderService orderService;
+	
+}
+
+
+
+
+
+
+
+
+
+

+ 24 - 23
style24.admin/src/main/java/com/style24/persistence/domain/Aflink.java

@@ -1,23 +1,24 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 제휴채널 Domain
- *
- * @author gagamel
- * @since 2020. 10. 20
- */
-@SuppressWarnings("serial")
-@Data
-public class Aflink extends TscBaseDomain {
-
-	private String afLinkCd;	// 제휴링크코드
-	private String afLinkNm;	// 제휴링크명
-	private String afChannel;	// 제휴채널
-	private int dispOrd;		// 표시순서
-	private String useYn;		// 사용여부
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 제휴채널 Domain
+ *
+ * @author gagamel
+ * @since 2020. 10. 20
+ */
+@SuppressWarnings("serial")
+@Data
+public class Aflink extends TscBaseDomain {
+
+	private String afLinkCd;	// 제휴링크코드
+	private String afLinkNm;	// 제휴링크명
+	private String afChannel;	// 제휴채널
+	private float feeRate;		// 수수료율(마진율)
+	private int dispOrd;		// 표시순서
+	private String useYn;		// 사용여부
+
+}

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

@@ -15,7 +15,7 @@ import lombok.Data;
 public class FreeGoods extends TscBaseDomain {
 
 	private Integer productNo;	//사은품 상품 번호 - ProductNo(WMS)
-	private int productCode;	//ProductCode(WMS)
+	private String productCode;	//ProductCode(WMS)
 	private String goodsNum;	//품번
 	private String brandCd;		//브랜드코드
 	private String goodsNm;		//상품명

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

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

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

@@ -1,5 +1,6 @@
 package com.style24.persistence.domain;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
 import lombok.Data;
 
@@ -26,4 +27,6 @@ public class MoreBetterBurden extends TscBaseDomain {
 	//private String supplyCompCd;
 	private String burdenRate;
 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrBurdenSq;
 }

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

@@ -1,5 +1,6 @@
 package com.style24.persistence.domain;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TsaPageRequest;
 import com.style24.persistence.TscBaseDomain;
 import lombok.Data;
@@ -34,4 +35,15 @@ public class MoreBetterGoods extends TscBaseDomain {
 	private String goodsCd;
 	private String goodsNm;
 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrCompanySq;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrBrandSq;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrApplyGoodsSq;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrExceptGoodsSq;
 }

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

@@ -1,5 +1,6 @@
 package com.style24.persistence.domain;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
 import lombok.Data;
 
@@ -29,4 +30,7 @@ public class MoreBetterSection extends TscBaseDomain {
 	private Integer udpNo;			// 수정자
 	private String  udtDt;			// 수정일시
 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrSectionSq;
+
 }

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

@@ -21,7 +21,7 @@ public class Option extends TscBaseDomain {
 	private String optCd2;
 	private String skuModelNo;
 	private int productNo;
-	private int productCode;
+	private String productCode;
 	private int baseStockQty;
 	private int currStockQty;
 	private int addPrice;

+ 8 - 6
style24.admin/src/main/java/com/style24/persistence/domain/Order.java

@@ -29,7 +29,7 @@ public class Order extends TscBaseDomain {
 	private int npayOrdNo;
 	private String frontGb;
 	private String frontGbNm;
-	
+
 	// 주문상세
 	private int ordDtlNo;
 	private String ordExchGb;
@@ -329,7 +329,7 @@ public class Order extends TscBaseDomain {
 	private int rfPntAmt;
 	private int rfPrePntAmt;
 	private int rfGfcdUseAmt;
-	
+
 	private int pgCpnAmt;
 	private int npayPntAmt;
 	private String payGb;
@@ -344,19 +344,21 @@ public class Order extends TscBaseDomain {
 	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;
 }
 
 

+ 4 - 2
style24.admin/src/main/java/com/style24/persistence/domain/OrderChange.java

@@ -49,9 +49,11 @@ public class OrderChange extends TscBaseDomain {
 	private String accountNm;
 	private String bankCd;
 	private String bankNm;
-	
+
 	private String allCanYn;
-	
+
+	private String isCustomer;
+
 
 }
 

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

@@ -16,7 +16,7 @@ import lombok.Data;
 public class WmsGoods extends TscBaseDomain {
 
 	private Integer productNo;		//wms상품번호
-	private int productCode;		//wms상품코드
+	private String productCode;		//wms상품코드
 	private String productName;		//상품명
 	private String modelNo;			//모델번호
 	private int providerNo;			//공급처번호

+ 4 - 0
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaBusiness.xml

@@ -793,6 +793,7 @@
 		SELECT AF_LINK_CD
 		     , AF_LINK_NM
 		     , AF_CHANNEL
+		     , FEE_RATE
 		     , DISP_ORD
 		     , USE_YN
 		FROM   TB_AF_LINK
@@ -809,6 +810,7 @@
 		       AF_LINK_CD
 		     , AF_LINK_NM
 		     , AF_CHANNEL
+		     , FEE_RATE
 		     , DISP_ORD
 		     , USE_YN
 		     , REG_NO
@@ -820,6 +822,7 @@
 		       #{afLinkCd}
 		     , #{afLinkNm}
 		     , #{afChannel}
+		     , #{feeRate}
 		     , #{dispOrd}
 		     , #{useYn}
 		     , #{regNo}
@@ -830,6 +833,7 @@
 		ON DUPLICATE KEY UPDATE
 		       AF_LINK_NM = #{afLinkNm}
 		     , AF_CHANNEL = #{afChannel}
+		     , FEE_RATE = #{feeRate}
 		     , DISP_ORD = #{dispOrd}
 		     , USE_YN = #{useYn}
 		     , UPD_NO = #{updNo}

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

@@ -6,139 +6,139 @@
 	<insert id="createEnvset" parameterType="Envset">
 		/* TsaEnvset.createEnvset */
 		INSERT INTO TB_ENVSET (
-		       ENVSET_SQ
-		     , SITE_CD
-		     , ENVSET_TYPE
-		     , ENVSET_NM
-		     , STR_SET_VAL1
-		     , STR_SET_VAL2
-		     , STR_SET_VAL3
-		     , STR_SET_VAL4
-		     , STR_SET_VAL5
-		     , STR_SET_VAL6
-		     , STR_SET_VAL7
-		     , STR_SET_VAL8
-		     , REG_NO
-		     , REG_DT
+								ENVSET_SQ
+							  , SITE_CD
+							  , ENVSET_TYPE
+							  , ENVSET_NM
+							  , STR_SET_VAL1
+							  , STR_SET_VAL2
+							  , STR_SET_VAL3
+							  , STR_SET_VAL4
+							  , STR_SET_VAL5
+							  , STR_SET_VAL6
+							  , STR_SET_VAL7
+							  , STR_SET_VAL8
+							  , REG_NO
+							  , REG_DT
 		)
 		VALUES (
-		       NULL
-		     , #{siteCd}
-		     , #{envsetType}
-		     , #{envsetNm}
-		     , #{strSetVal1}
-		     , #{strSetVal2}
-		     , #{strSetVal3}
-		     , #{strSetVal4}
-		     , #{strSetVal5}
-		     , #{strSetVal6}
-		     , #{strSetVal7}
-		     , #{strSetVal8}
-		     , #{regNo}
-		     , NOW()
-		)
+				   NULL
+			   , #{siteCd}
+			   , #{envsetType}
+			   , #{envsetNm}
+			   , #{strSetVal1}
+			   , #{strSetVal2}
+			   , #{strSetVal3}
+			   , #{strSetVal4}
+			   , #{strSetVal5}
+			   , #{strSetVal6}
+			   , #{strSetVal7}
+			   , #{strSetVal8}
+			   , #{regNo}
+			   , NOW()
+			   )
 	</insert>
 
 	<!-- 환경설정 목록 -->
 	<select id="getEnvsetList" parameterType="Envset" resultType="Envset">
 		/* TsaEnvset.getEnvsetList */
 		SELECT SITE_CD
-		     , ENVSET_TYPE
-		     , ENVSET_NM
-		     , STR_SET_VAL1
-		     , STR_SET_VAL2
-		     , STR_SET_VAL3
-		     , STR_SET_VAL4
-		     , STR_SET_VAL5
-		     , STR_SET_VAL6
-		     , STR_SET_VAL7
-		     , STR_SET_VAL8
-		     , FN_GET_USER_NM(REG_NO)             AS REG_NM
-		     , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT
+			 , ENVSET_TYPE
+			 , ENVSET_NM
+			 , STR_SET_VAL1
+			 , STR_SET_VAL2
+			 , STR_SET_VAL3
+			 , STR_SET_VAL4
+			 , STR_SET_VAL5
+			 , STR_SET_VAL6
+			 , STR_SET_VAL7
+			 , STR_SET_VAL8
+			 , FN_GET_USER_NM(REG_NO)             AS REG_NM
+			 , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT
 		FROM   TB_ENVSET
 		WHERE  SITE_CD = #{siteCd}
-		AND    ENVSET_TYPE = #{envsetType}
+		  AND    ENVSET_TYPE = #{envsetType}
 		ORDER  BY ENVSET_SQ DESC
 	</select>
-	
+
 	<!-- 회원등급정책 생성 -->
 	<insert id="createCustomerGradePolicy" parameterType="CustGradePolicy">
 		/* TsaEnvset.createCustomerGradePolicy */
 		INSERT INTO TB_CUST_GRADE_POLICY (
-		       SITE_CD
-		     , GRADE_CD
-		     , ICON_NM
-		     , CAL_MONTHS
-		     , MIN_BUY_AMT
-		     , MIN_BUY_CNT
-		     , BUY_EXCEPT_AMT
-		     , GRADE_CPN_ID1
-		     , GRADE_CPN_ID2
-		     , GRADE_CPN_ID3
-		     , DISP_ORD
-		     , USE_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
+										   SITE_CD
+										 , GRADE_CD
+										 , ICON_NM
+										 , CAL_MONTHS
+										 , MIN_BUY_AMT
+										 , MIN_BUY_CNT
+										 , BUY_EXCEPT_AMT
+										 , GRADE_CPN_ID1
+										 , GRADE_CPN_ID2
+										 , GRADE_CPN_ID3
+										 , DISP_ORD
+										 , USE_YN
+										 , REG_NO
+										 , REG_DT
+										 , UPD_NO
+										 , UPD_DT
 		)
 		VALUES (
-		       #{siteCd}
-		     , #{gradeCd}
-		     , #{iconNm}
-		     , #{calMonths}
-		     , #{minBuyAmt}
-		     , #{minBuyCnt}
-		     , #{buyExceptAmt}
-		     , #{gradeCpnId1}
-		     , #{gradeCpnId2}
-		     , #{gradeCpnId3}
-		     , #{dispOrd}
-		     , #{useYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       ICON_NM = #{iconNm}
-		     , CAL_MONTHS = #{calMonths}
-		     , MIN_BUY_AMT = #{minBuyAmt}
-		     , MIN_BUY_CNT = #{minBuyCnt}
-		     , BUY_EXCEPT_AMT = #{buyExceptAmt}
-		     , GRADE_CPN_ID1 = #{gradeCpnId1}
-		     , GRADE_CPN_ID2 = #{gradeCpnId2}
-		     , GRADE_CPN_ID3 = #{gradeCpnId3}
-		     , DISP_ORD = #{dispOrd}
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
+				   #{siteCd}
+			   , #{gradeCd}
+			   , #{iconNm}
+			   , #{calMonths}
+			   , #{minBuyAmt}
+			   , #{minBuyCnt}
+			   , #{buyExceptAmt}
+			   , #{gradeCpnId1}
+			   , #{gradeCpnId2}
+			   , #{gradeCpnId3}
+			   , #{dispOrd}
+			   , #{useYn}
+			   , #{regNo}
+			   , NOW()
+			   , #{updNo}
+			   , NOW()
+			   )
+			ON DUPLICATE KEY UPDATE
+								 ICON_NM = #{iconNm}
+								 , CAL_MONTHS = #{calMonths}
+								 , MIN_BUY_AMT = #{minBuyAmt}
+								 , MIN_BUY_CNT = #{minBuyCnt}
+								 , BUY_EXCEPT_AMT = #{buyExceptAmt}
+								 , GRADE_CPN_ID1 = #{gradeCpnId1}
+								 , GRADE_CPN_ID2 = #{gradeCpnId2}
+								 , GRADE_CPN_ID3 = #{gradeCpnId3}
+								 , DISP_ORD = #{dispOrd}
+								 , USE_YN = #{useYn}
+								 , UPD_NO = #{updNo}
+								 , UPD_DT = NOW()
 	</insert>
-	
+
 	<!-- 회원등급정책 목록 -->
 	<select id="getCustomerGradePolicyList" parameterType="CustGradePolicy" resultType="CustGradePolicy">
 		/* TsaEnvset.getCustomerGradePolicyList */
 		SELECT SITE_CD
-		     , GRADE_CD
-		     , ICON_NM
-		     , CAL_MONTHS
-		     , MIN_BUY_AMT
-		     , MIN_BUY_CNT
-		     , BUY_EXCEPT_AMT
-		     , GRADE_CPN_ID1
-		     , FN_GET_COUPON_NM(GRADE_CPN_ID1)    AS GRADE_CPN_NM1
-		     , GRADE_CPN_ID2
-		     , FN_GET_COUPON_NM(GRADE_CPN_ID2)    AS GRADE_CPN_NM2
-		     , GRADE_CPN_ID3
-		     , FN_GET_COUPON_NM(GRADE_CPN_ID3)    AS GRADE_CPN_NM3
-		     , DISP_ORD
-		     , USE_YN
-		     , FN_GET_USER_NM(UPD_NO)             AS UPD_NM
-		     , DATE_FORMAT(UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
+		, GRADE_CD
+		, ICON_NM
+		, CAL_MONTHS
+		, MIN_BUY_AMT
+		, MIN_BUY_CNT
+		, BUY_EXCEPT_AMT
+		, GRADE_CPN_ID1
+		, FN_GET_COUPON_NM(GRADE_CPN_ID1)    AS GRADE_CPN_NM1
+		, GRADE_CPN_ID2
+		, FN_GET_COUPON_NM(GRADE_CPN_ID2)    AS GRADE_CPN_NM2
+		, GRADE_CPN_ID3
+		, FN_GET_COUPON_NM(GRADE_CPN_ID3)    AS GRADE_CPN_NM3
+		, DISP_ORD
+		, USE_YN
+		, FN_GET_USER_NM(UPD_NO)             AS UPD_NM
+		, DATE_FORMAT(UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
 		FROM   TB_CUST_GRADE_POLICY A
 		WHERE  SITE_CD = #{siteCd}
 		<if test="gradeCd != null and gradeCd != ''">
-		AND    GRADE_CD = #{gradeCd}
+			AND    GRADE_CD = #{gradeCd}
 		</if>
 		ORDER  BY SITE_CD, GRADE_CD
 	</select>

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

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

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

@@ -27,181 +27,7 @@
 		</if>
 		ORDER BY REG_DT DESC
 	</select>
-	<!-- // xodud1202 진행 -->
-
 
-	<!-- // CSB 진행 -->
-	<select id="getMorebetterList" parameterType="MoreBetter" resultType="MoreBetter">
-		/* TsaMarketing.getMorebetterList */
-		SELECT TMTB_SQ
-			 , TMTB_NM
-			 , FN_GET_CODE_NM('G232',TMTB_STAT) as TMTB_STAT
-			 , DATE_FORMAT(TMTB_ST_DT, '%Y.%m.%d') AS TMTB_STDT
-			 , DATE_FORMAT(TMTB_ED_DT, '%Y.%m.%d') AS TMTB_EDDT
-			 , DEL_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(UDP_NO) AS UPD_NM
-			 , DATE_FORMAT(UDT_DT, '%Y.%m.%d %H:%i:%S') AS UPD_DT
-		FROM TB_TMTB
-		WHERE 1=1
-		<if test="tmtbStdt != null and tmtbStdt != '' and tmtbEddt != null and tmtbEddt != ''">
-			AND DATE_FORMAT(TMTB_ST_DT,'%Y%m%d%H%i%S') >= DATE_FORMAT(#{tmtbStdt} , '%Y%m%d%H%i%S')
-			AND DATE_FORMAT(TMTB_ED_DT,'%Y%m%d%H%i%S') <![CDATA[ <= ]]> DATE_FORMAT(#{tmtbEddt} , '%Y%m%d%H%i%S')
-		</if>
-		<if test="searchTxt != null and searchTxt != ''">
-			<if test="searchGubun != null and searchGubun == 'tmtbSq'">
-				AND TMTB_SQ = #{searchTxt}
-			</if>
-			<if test="searchGubun != null and searchGubun == 'tmtbNm'">
-				AND TMTB_NM = #{searchTxt}
-			</if>
-		</if>
-		ORDER BY REG_DT DESC
-	</select>
-
-	<insert id="saveMorebetterMst" parameterType="MoreBetter" >
-		/* TsaMarketing.saveMorebetterMst */
-		INSERT INTO TB_TMTB(
-					 TMTB_SQ
-					,TMTB_NM
-					,TMTB_STAT
-					,TMTB_ST_DT
-					,TMTB_ED_DT
-					,MULTI_YN
-					,DEL_YN
-					,REG_NO
-					,REG_DT
-					,UDP_NO
-					,UDT_DT
-			)
-			VALUES (
-			         #{tmtbSq}
-					,#{tmtbNm}
-				    ,#{tmtbStat}
-				    ,#{tmtbStdt}
-				    ,#{tmtbEddt}
-				    ,#{multiYn}
-				    ,'N'
-				    ,#{regNo}
-				    ,NOW()
-				    ,#{udpNo}
-				    ,NOW()
-				   )
-	</insert>
-
-	<insert id="saveMorebetterGoods" parameterType="MoreBetterGoods" >
-		/* TsaMarketing.saveMorebetterGoods */
-		INSERT INTO TB_TMTB_GOODS(
-		         	 TMTB_GOODS_SQ
-		        	,TMTB_SQ
-					,GOODS_GB
-					,TARGET_GB
-					,TARGET_VAL
-					,DEL_YN
-					,REG_NO
-					,REG_DT
-					,UDP_NO
-					,UDT_DT
-			)
-			VALUES (
-			         #{tmtbGoodsSq}
-			        ,#{tmtbSq}
-				    ,#{goodsGb}
-				    ,#{targetGb}
-				    ,#{targetVal}
-				    ,'N'
-				    ,#{regNo}
-				    ,NOW()
-				    ,#{udpNo}
-				    ,NOW()
-				   )
-	</insert>
-
-	<insert id="saveMorebetterSection" parameterType="MoreBetterSection" >
-		/* TsaMarketing.saveMorebetterSection */
-		INSERT INTO TB_TMTB_SECTION(
-					 TMTB_SECTION_SQ
-					,TMTB_SQ
-					,SECTION_GB
-					,SECTION_VAL
-					,DEL_YN
-					,REG_NO
-					,REG_DT
-					,UDP_NO
-					,UDT_DT
-			)
-			VALUES (
-					 #{tmtbSectionSq}
-					,#{tmtbSq}
-					,#{sectionGb}
-				    ,#{sectionVal}
-				    ,'N'
-				    ,#{regNo}
-				    ,NOW()
-				    ,#{udpNo}
-				    ,NOW()
-				   )
-	</insert>
-
-	<insert id="saveMorebetterVal" parameterType="MoreBetterSection" >
-		/* TsaMarketing.saveMorebetterVal */
-		INSERT INTO TB_TMTB_VAL(
-					 TMTB_VAL_SQ
-					,TMTB_SQ
-					,TMTB_SECTION_SQ
-					,DC_WAY
-					,DC_VAL
-					,DEL_YN
-					,REG_NO
-					,REG_DT
-					,UDP_NO
-					,UDT_DT
-			)
-			VALUES (
-					#{tmtbValSq}
-				   ,#{tmtbSq}
-				   ,#{tmtbSectionSq}
-				   ,#{dcWay}
-				   ,#{dcVal}
-				   ,'N'
-				   ,#{regNo}
-				   ,NOW()
-				   ,#{udpNo}
-				   ,NOW()
-				   )
-	</insert>
+	<!-- // xodud1202 진행 -->
 
-	<insert id="saveMorebetterBurden" parameterType="MoreBetterBurden" >
-		/* TsaMarketing.saveMorebetterBurden */
-		INSERT INTO TB_TMTB_BURDEN(
-					 TB_TMTB_BURDEN_SQ
-					,TMTB_SQ
-					,TMTB_SUPPLY_CD
-					,TMTB_BURDEN_RATE
-					,USE_YN
-					,REG_NO
-					,REG_DT
-					,UDP_NO
-					,UDT_DT
-			)
-			VALUES (
-			         #{tmtbBurdenSq}
-			        ,#{tmtbSq}
-			        ,#{tmtbSupplyCd}
-			        ,#{tmtbBurdenRate}
-			        ,#{useYn}
-				    ,#{regNo}
-				    ,NOW()
-				    ,#{udpNo}
-				    ,NOW()
-				   )
-		ON DUPLICATE KEY UPDATE
-					 TMTB_SUPPLY_CD = #{tmtbSupplyCd}
-					,TMTB_BURDEN_RATE = #{tmtbBurdenRate}
-					,USE_YN = #{useYn}
-					,UDP_NO = #{udpNo}
-					,UDT_DT = NOW()
-	</insert>
-	<!--// CSB 진행 -->
 </mapper>

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

@@ -0,0 +1,444 @@
+<?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.TsaMorebetterDao">
+	<!-- // CSB 진행 -->
+	<select id="getMorebetterList" parameterType="MoreBetter" resultType="MoreBetter">
+		/* TsaMarketing.getMorebetterList */
+		SELECT TMTB_SQ
+			 , TMTB_NM
+			 , FN_GET_CODE_NM('G232',TMTB_STAT) as TMTB_STAT
+			 , DATE_FORMAT(TMTB_ST_DT, '%Y.%m.%d') AS TMTB_STDT
+			 , DATE_FORMAT(TMTB_ED_DT, '%Y.%m.%d') AS TMTB_EDDT
+			 , DEL_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(UDP_NO) AS UPD_NM
+			 , DATE_FORMAT(UDT_DT, '%Y.%m.%d %H:%i:%S') AS UPD_DT
+		FROM TB_TMTB
+		WHERE 1=1
+		<if test="tmtbStdt != null and tmtbStdt != '' and tmtbEddt != null and tmtbEddt != ''">
+			AND DATE_FORMAT(TMTB_ST_DT,'%Y%m%d%H%i%S') >= DATE_FORMAT(#{tmtbStdt} , '%Y%m%d%H%i%S')
+			AND DATE_FORMAT(TMTB_ED_DT,'%Y%m%d%H%i%S') <![CDATA[ <= ]]> DATE_FORMAT(#{tmtbEddt} , '%Y%m%d%H%i%S')
+		</if>
+		<if test="searchTxt != null and searchTxt != ''">
+			<if test="searchGubun != null and searchGubun == 'tmtbSq'">
+				AND TMTB_SQ = #{searchTxt}
+			</if>
+			<if test="searchGubun != null and searchGubun == 'tmtbNm'">
+				AND TMTB_NM = #{searchTxt}
+			</if>
+		</if>
+		ORDER BY REG_DT DESC
+	</select>
+
+	<select id="getMorebetterMstInfo" parameterType="Integer" resultType="MoreBetter">
+		/* TsaMarketing.getMorebetterMstInfo */
+		SELECT	   	   TT.TMTB_SQ
+					 , TT.TMTB_NM
+					 , TT.TMTB_STAT
+					 , DATE_FORMAT(TT.TMTB_ST_DT , '%Y-%m-%d') AS TMTB_ST_DT
+					 , DATE_FORMAT(TT.TMTB_ED_DT , '%Y-%m-%d') AS TMTB_ED_DT
+					 , TT.MULTI_YN
+					 , TT.DEL_YN
+					 , TT.REG_NO
+					 , TT.REG_DT
+					 , TT.UDP_NO
+					 , TT.UDT_DT
+					 , TS.SECTION_GB
+					 , TS.SECTION_VAL
+					 , TV.DC_WAY
+					 , TV.DC_VAL
+		FROM 	TB_TMTB TT
+		INNER 	JOIN TB_TMTB_SECTION TS
+		ON 		TT.TMTB_SQ = TS.TMTB_SQ
+		INNER 	JOIN TB_TMTB_VAL TV
+		ON 		TT.TMTB_SQ = TV.TMTB_SQ
+		AND		TS.TMTB_SECTION_SQ = TV.TMTB_SECTION_SQ
+		WHERE 	1=1
+		  AND 	TT.TMTB_SQ = #{tmtbSq}
+		LIMIT 1
+	</select>
+
+	<select id="getMorebetterSectionValList" parameterType="Integer" resultType="MoreBetterSection">
+		/* TsaMarketing.getMorebetterSectionValList */
+		SELECT    TS.TMTB_SQ
+				 ,TS.TMTB_SECTION_SQ
+				 ,TV.TMTB_VAL_SQ
+				 ,TS.SECTION_GB
+				 ,TS.SECTION_VAL
+				 ,TV.DC_WAY
+				 ,TV.DC_VAL
+				 ,TS.DEL_YN
+				 ,TS.REG_NO
+				 ,TS.REG_DT
+				 ,TS.UDP_NO
+				 ,TS.UDT_DT
+		FROM	TB_TMTB_SECTION TS
+		INNER 	JOIN TB_TMTB_VAL TV
+		ON 		TS.TMTB_SQ = TV.TMTB_SQ
+		AND		TS.TMTB_SECTION_SQ = TV.TMTB_SECTION_SQ
+		WHERE 	1=1
+		  AND 	TS.TMTB_SQ = #{tmtbSq}
+		ORDER BY TS.TMTB_SQ, TS.TMTB_SECTION_SQ, TV.TMTB_VAL_SQ
+	</select>
+
+	<select id="getMorebetterSupplyCompList" parameterType="MoreBetterGoods" resultType="MoreBetterGoods">
+		/* TsaMarketing.getMorebetterSupplyCompList */
+		SELECT 	 TMTB_GOODS_SQ
+				 , TMTB_SQ
+				 , GOODS_GB
+				 , TARGET_GB
+				 , TARGET_VAL
+				 , TARGET_VAL AS SUPPLY_COMP_CD
+				 , FN_GET_SUPPLY_COMP_NM(TARGET_VAL) AS SUPPLY_COMP_NM
+				 , DEL_YN
+				 , REG_NO
+				 , REG_DT
+				 , UDP_NO
+				 , UDT_DT
+		FROM TB_TMTB_GOODS
+		WHERE 1=1
+		  AND TMTB_SQ = #{tmtbSq}
+		  AND TARGET_GB = 'G260_13'
+	</select>
+
+	<select id="getMorebetterBrandList" parameterType="MoreBetterGoods" resultType="MoreBetterGoods">
+		/* TsaMarketing.getMorebetterBrandList */
+		SELECT 	 TMTB_GOODS_SQ
+				 , TMTB_SQ
+				 , GOODS_GB
+				 , TARGET_GB
+				 , TARGET_VAL
+				 , TARGET_VAL AS BRAND_CD
+				 , (SELECT   BRAND_ENM
+					FROM  TB_BRAND
+					WHERE BRAND_CD = TARGET_VAL) AS BRAND_ENM
+				 , (SELECT   FN_GET_SUPPLY_COMP_NM(SUPPLY_COMP_CD)
+					FROM  TB_BRAND
+					WHERE BRAND_CD = TARGET_VAL) AS SUPPLY_COMP_NM
+				 , DEL_YN
+				 , REG_NO
+				 , REG_DT
+				 , UDP_NO
+				 , UDT_DT
+		FROM TB_TMTB_GOODS
+		WHERE 1=1
+		  AND TMTB_SQ = #{tmtbSq}
+		  AND TARGET_GB = 'G260_12'
+	</select>
+
+	<select id="getMorebetterApplyGoodsList" parameterType="MoreBetterGoods" resultType="MoreBetterGoods">
+		/* TsaMarketing.getMorebetterApplyGoodsList */
+		SELECT 	 TMTB_GOODS_SQ
+				 , TMTB_SQ
+				 , GOODS_GB
+				 , TARGET_GB
+				 , TARGET_VAL
+				 , TARGET_VAL AS GOODS_CD
+				 , (SELECT  GOODS_NM
+					FROM  TB_GOODS
+					WHERE  GOODS_CD = TARGET_VAL) AS GOODS_NM
+				 , DEL_YN
+				 , REG_NO
+				 , REG_DT
+				 , UDP_NO
+				 , UDT_DT
+		FROM TB_TMTB_GOODS
+		WHERE 1=1
+		  AND TMTB_SQ = #{tmtbSq}
+		  AND TARGET_GB = 'G260_10'
+		  AND GOODS_GB IN ('G800_10','G800_20')
+	</select>
+
+	<select id="getMorebetterExceptGoodsList" parameterType="MoreBetterGoods" resultType="MoreBetterGoods">
+		/* TsaMarketing.getMorebetterExceptGoodsList */
+		SELECT 	 TMTB_GOODS_SQ
+			 , TMTB_SQ
+			 , GOODS_GB
+			 , TARGET_GB
+			 , TARGET_VAL
+			 , TARGET_VAL AS GOODS_CD
+			 , (SELECT  GOODS_NM
+				FROM  TB_GOODS
+				WHERE  GOODS_CD = TARGET_VAL) AS GOODS_NM
+			 , DEL_YN
+			 , REG_NO
+			 , REG_DT
+			 , UDP_NO
+			 , UDT_DT
+		FROM TB_TMTB_GOODS
+		WHERE 1=1
+		  AND TMTB_SQ = #{tmtbSq}
+		  AND TARGET_GB = 'G260_10'
+		  AND GOODS_GB IN ('G800_30')
+	</select>
+
+	<select id="getMorebetterBurdenList" parameterType="Integer" resultType="MoreBetterBurden">
+		/* TsaMarketing.getMorebetterBurdenList */
+		SELECT 		TB_TMTB_BURDEN_SQ AS TMTB_BURDEN_SQ
+				   , TMTB_SQ
+				   , TMTB_SUPPLY_CD
+				   , TMTB_BURDEN_RATE
+				   , USE_YN
+				   , REG_NO
+				   , REG_DT
+				   , UDP_NO
+				   , UDT_DT
+		FROM TB_TMTB_BURDEN
+		WHERE 1=1
+		  AND TMTB_SQ = #{tmtbSq}
+	</select>
+
+	<insert id="saveMorebetterMst" parameterType="MoreBetter" >
+		/* TsaMarketing.saveMorebetterMst */
+		INSERT INTO TB_TMTB(
+					 TMTB_SQ
+					,TMTB_NM
+					,TMTB_STAT
+					,TMTB_ST_DT
+					,TMTB_ED_DT
+					,MULTI_YN
+					,DEL_YN
+					,REG_NO
+					,REG_DT
+					,UDP_NO
+					,UDT_DT
+			)
+			VALUES (
+			         #{tmtbSq}
+					,#{tmtbNm}
+				    ,#{tmtbStat}
+				    ,#{tmtbStdt}
+				    ,#{tmtbEddt}
+				    ,#{multiYn}
+				    ,'N'
+				    ,#{regNo}
+				    ,NOW()
+				    ,#{udpNo}
+				    ,NOW()
+				   )
+			ON DUPLICATE KEY UPDATE
+						 TMTB_NM = #{tmtbNm}
+						,TMTB_STAT = #{tmtbStat}
+						,TMTB_ST_DT = #{tmtbStdt}
+						,TMTB_ED_DT = #{tmtbEddt}
+						,MULTI_YN = #{multiYn}
+						,UDP_NO = #{udpNo}
+						,UDT_DT = NOW()
+	</insert>
+
+	<insert id="saveMorebetterGoods" parameterType="MoreBetterGoods" >
+		/* TsaMarketing.saveMorebetterGoods */
+		INSERT INTO TB_TMTB_GOODS(
+		         	 TMTB_GOODS_SQ
+		        	,TMTB_SQ
+					,GOODS_GB
+					,TARGET_GB
+					,TARGET_VAL
+					,DEL_YN
+					,REG_NO
+					,REG_DT
+					,UDP_NO
+					,UDT_DT
+			)
+			VALUES (
+			         #{tmtbGoodsSq}
+			        ,#{tmtbSq}
+				    ,#{goodsGb}
+				    ,#{targetGb}
+				    ,#{targetVal}
+				    ,'N'
+				    ,#{regNo}
+				    ,NOW()
+				    ,#{udpNo}
+				    ,NOW()
+				   )
+			ON DUPLICATE KEY UPDATE
+						 GOODS_GB = #{goodsGb}
+						,TARGET_GB = #{targetGb}
+						,TARGET_VAL = #{targetVal}
+						,UDP_NO = #{udpNo}
+						,UDT_DT = NOW()
+	</insert>
+
+	<insert id="saveMorebetterSection" parameterType="MoreBetterSection" >
+		/* TsaMarketing.saveMorebetterSection */
+		INSERT INTO TB_TMTB_SECTION(
+					 TMTB_SECTION_SQ
+					,TMTB_SQ
+					,SECTION_GB
+					,SECTION_VAL
+					,DEL_YN
+					,REG_NO
+					,REG_DT
+					,UDP_NO
+					,UDT_DT
+			)
+			VALUES (
+					 #{tmtbSectionSq}
+					,#{tmtbSq}
+					,#{sectionGb}
+				    ,#{sectionVal}
+				    ,'N'
+				    ,#{regNo}
+				    ,NOW()
+				    ,#{udpNo}
+				    ,NOW()
+				   )
+			ON DUPLICATE KEY UPDATE
+						 SECTION_GB = #{sectionGb}
+						,SECTION_VAL = #{sectionVal}
+						,UDP_NO = #{udpNo}
+						,UDT_DT = NOW()
+	</insert>
+
+	<insert id="saveMorebetterVal" parameterType="MoreBetterSection" >
+		/* TsaMarketing.saveMorebetterVal */
+		INSERT INTO TB_TMTB_VAL(
+					 TMTB_VAL_SQ
+					,TMTB_SQ
+					,TMTB_SECTION_SQ
+					,DC_WAY
+					,DC_VAL
+					,DEL_YN
+					,REG_NO
+					,REG_DT
+					,UDP_NO
+					,UDT_DT
+			)
+			VALUES (
+					#{tmtbValSq}
+				   ,#{tmtbSq}
+				   ,#{tmtbSectionSq}
+				   ,#{dcWay}
+				   ,#{dcVal}
+				   ,'N'
+				   ,#{regNo}
+				   ,NOW()
+				   ,#{udpNo}
+				   ,NOW()
+				   )
+			ON DUPLICATE KEY UPDATE
+						 DC_WAY = #{dcWay}
+						,DC_VAL = #{dcVal}
+						,UDP_NO = #{udpNo}
+						,UDT_DT = NOW()
+	</insert>
+
+	<insert id="saveMorebetterBurden" parameterType="MoreBetterBurden" >
+		/* TsaMarketing.saveMorebetterBurden */
+		INSERT INTO TB_TMTB_BURDEN(
+					 TB_TMTB_BURDEN_SQ
+					,TMTB_SQ
+					,TMTB_SUPPLY_CD
+					,TMTB_BURDEN_RATE
+					,USE_YN
+					,REG_NO
+					,REG_DT
+					,UDP_NO
+					,UDT_DT
+			)
+			VALUES (
+			         #{tmtbBurdenSq}
+			        ,#{tmtbSq}
+			        ,#{tmtbSupplyCd}
+			        ,#{tmtbBurdenRate}
+			        ,#{useYn}
+				    ,#{regNo}
+				    ,NOW()
+				    ,#{udpNo}
+				    ,NOW()
+				   )
+		ON DUPLICATE KEY UPDATE
+					 TMTB_SUPPLY_CD = #{tmtbSupplyCd}
+					,TMTB_BURDEN_RATE = #{tmtbBurdenRate}
+					,USE_YN = #{useYn}
+					,UDP_NO = #{udpNo}
+					,UDT_DT = NOW()
+	</insert>
+
+	<delete id="deleteTmtbSupplyCompanyList" parameterType="MoreBetterGoods">
+		/* TsaMarketing.deleteTmtbSupplyCompanyList */
+		DELETE FROM TB_TMTB_GOODS
+		WHERE TMTB_SQ =  #{tmtbSq}
+		<if test="arrCompanySq != null and arrCompanySq.length>0">
+			AND TMTB_GOODS_SQ IN
+			<foreach collection="arrCompanySq" item="item" index="index"  open="(" close=")" separator=",">
+				#{item}
+			</foreach>
+		</if>
+	</delete>
+
+	<delete id="deleteTmtbBrandList" parameterType="MoreBetterGoods">
+		/* TsaMarketing.deleteTmtbBrandList */
+		DELETE FROM TB_TMTB_GOODS
+		WHERE TMTB_SQ =  #{tmtbSq}
+		<if test="arrBrandSq != null and arrBrandSq.length>0">
+			AND TMTB_GOODS_SQ IN
+			<foreach collection="arrBrandSq" item="item" index="index"  open="(" close=")" separator=",">
+				#{item}
+			</foreach>
+		</if>
+	</delete>
+
+	<delete id="deleteTmtbApplyGoodsList" parameterType="MoreBetterGoods">
+		/* TsaMarketing.deleteTmtbApplyGoodsList */
+		DELETE FROM TB_TMTB_GOODS
+		WHERE TMTB_SQ =  #{tmtbSq}
+		<if test="arrApplyGoodsSq != null and arrApplyGoodsSq.length>0">
+			AND TMTB_GOODS_SQ IN
+			<foreach collection="arrApplyGoodsSq" item="item" index="index"  open="(" close=")" separator=",">
+				#{item}
+			</foreach>
+		</if>
+	</delete>
+
+	<delete id="deleteTmtbExceptGoodsList" parameterType="MoreBetterGoods">
+		/* TsaMarketing.deleteTmtbExceptGoodsList */
+		DELETE FROM TB_TMTB_GOODS
+		WHERE TMTB_SQ =  #{tmtbSq}
+		<if test="arrExceptGoodsSq != null and arrExceptGoodsSq.length>0">
+			AND TMTB_GOODS_SQ IN
+			<foreach collection="arrExceptGoodsSq" item="item" index="index"  open="(" close=")" separator=",">
+				#{item}
+			</foreach>
+		</if>
+	</delete>
+
+	<delete id="deleteTmtbSectionList" parameterType="MoreBetterSection">
+		/* TsaMarketing.deleteTmtbSectionList */
+		DELETE FROM TB_TMTB_SECTION
+		WHERE TMTB_SQ =  #{tmtbSq}
+		<if test="arrSectionSq != null and arrSectionSq.length>0">
+			AND TMTB_SECTION_SQ IN
+			<foreach collection="arrSectionSq" item="item" index="index"  open="(" close=")" separator=",">
+				#{item}
+			</foreach>
+		</if>
+	</delete>
+
+	<delete id="deleteTmtbValList" parameterType="MoreBetterSection">
+		/* TsaMarketing.deleteTmtbValList */
+		DELETE FROM TB_TMTB_VAL
+		WHERE TMTB_SQ =  #{tmtbSq}
+		<if test="arrSectionSq != null and arrSectionSq.length>0">
+			AND TMTB_SECTION_SQ IN
+			<foreach collection="arrSectionSq" item="item" index="index"  open="(" close=")" separator=",">
+				#{item}
+			</foreach>
+		</if>
+	</delete>
+
+	<delete id="deleteTmtbBurdenList" parameterType="MoreBetterGoods">
+		/* TsaMarketing.deleteTmtbBurdenList */
+		DELETE FROM TB_TMTB_BURDEN
+		WHERE TMTB_SQ =  #{tmtbSq}
+		<if test="arrBurdenSq != null and arrBurdenSq.length>0">
+			AND TB_TMTB_BURDEN_SQ IN
+			<foreach collection="arrBurdenSq" item="item" index="index"  open="(" close=")" separator=",">
+				#{item}
+			</foreach>
+		</if>
+	</delete>
+	<!--// CSB 진행 -->
+</mapper>

+ 80 - 806
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml

@@ -2,7 +2,7 @@
 <!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)  
@@ -166,7 +166,7 @@
         </if>
 	</select>
 
-	<!-- 주문목록 -->
+	<!-- 주문목록 > 주문목록 -->
 	<select id="getOrderList" parameterType="Order" resultType="Order">
 		/* order.getOrderList */
 		SELECT Z.*
@@ -258,7 +258,7 @@
 				<if test='supplyCompCd != null and supplyCompCd != ""'>
 				AND    OD.SUPPLY_COMP_CD = #{supplyCompCd}
 				</if>
-				<if test="multiBrand != null and multiBrand != ''">
+				<if test="multiBrand != null and multiBrand != ''">
 		        AND    G1.BRAND_CD IN
 					<foreach collection="multiBrand" item="item" index="index"  open="(" close=")" separator=",">
 		        		#{item}
@@ -341,7 +341,7 @@
 				AND    ODI.OPT_CD2 = #{sizeCd}
 				</if>
 				<if test='goodsNm != null and goodsNm != ""'>
-				AND    G2.GOODS_NM = #{goodsNm}
+				AND    G2.GOODS_NM = #{goodsNm}
 				</if>
 				<if test='recipNm != null and recipNm != ""'>
 				AND    DA.RECIP_NM = #{recipNm}
@@ -386,7 +386,7 @@
              , Z.ORD_DTL_ITEM_SQ DESC
 	</select>
 	
-	<!-- 주문상세 > 주문 정보 -->
+	<!-- 주문상세 > 주문기본정보 -->
 	<select id="getOrderInfoList" parameterType="Order" resultType="Order">
 		/* order.getOrderInfoList */
 		SELECT O.SITE_CD
@@ -419,17 +419,36 @@
 		            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
@@ -451,7 +470,11 @@
 		     , ODI.ITEM_PRICE
 		     , ODI.ITEM_QTY * OD.ORD_QTY      AS ORD_QTY
 		     , ODI.ITEM_QTY * OD.CNCL_RTN_QTY AS CNCL_RTN_QTY
-		     , ODI.OPT_ADD_PRICE 
+ 		     , 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
@@ -521,8 +544,21 @@
 				GROUP  BY ODH.ORD_DTL_STAT
 			) Z
 		) X
-		ON     OD.ORD_NO = X.ORD_NO
-		AND    OD.ORD_DTL_NO = X.ORD_DTL_NO
+		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>
@@ -618,13 +654,13 @@
 		/* order.getDeliveryFeeList */
 		SELECT Z.*
 		FROM   (
-			SELECT DF.DELV_FEE_GB 
+			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 
+			     , 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}
@@ -638,7 +674,7 @@
 		     , Z.DELV_FEE_SQ
 	</select>
 	
-	<!-- 주문상세 > 취소 / 반품 / 교환 요청 정보 -->
+	<!-- 주문상세 > 취소/반품/교환 요청정보 -->
 	<select id="getOrderChangeList" parameterType="Order" resultType="Order">
 		/* order.getOrderChangeList */
 		SELECT OCD.ORD_CHG_SQ
@@ -650,7 +686,7 @@
 		     , 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 
+		     , 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)
@@ -676,12 +712,12 @@
 		AND    OD.ORD_NO = #{ordNo}
 		AND    OCD.DEL_YN = 'N'
 		ORDER  BY OC.REG_DT DESC
-		     , OCD.ORD_DTL_NO 
+		     , OCD.ORD_DTL_NO
 	</select>
 	
 	<!-- 주문상세 > 환불정보 -->
-	<select id="orderRefundInfo" parameterType="Order" resultType="Order">
-		/* order.orderRefundInfo */
+	<select id="getOrderRefundInfo" parameterType="Order" resultType="Order">
+		/* order.getOrderRefundInfo */
 		SELECT P.PAY_MEANS
 		     , FN_GET_CODE_NM('G014', P.PAY_MEANS) AS PAY_MEANS_NM
 		     , P.CARD_NM
@@ -693,7 +729,7 @@
 		     , R.RA_NO
 		     , R.RA_NM 
 		     , R.REFUND_AMT 
-		     , DATE_FORMAT(P.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT 
+		     , 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
@@ -702,11 +738,12 @@
 		ON     R.ORD_CHG_SQ = P.ORD_CHG_SQ 
 		WHERE  1=1
 		AND    R.ORD_NO = #{ordNo}
+		ORDER  BY R.REG_DT DESC
 	</select>
 	
 	<!-- 주문상세 > 상담내역 -->
-	<select id="orderCounselInfo" parameterType="Order" resultType="Order">
-		/* order.orderCounselInfo */
+	<select id="getOrderCounselInfo" parameterType="Order" resultType="Order">
+		/* order.getOrderCounselInfo */
 		SELECT CS.COUNSEL_CLSF
 			 , FN_GET_CODE_NM('G059', CS.COUNSEL_CLSF) AS COUNSEL_CLSF_NM
 		     , CS.REL_GOODS_CD
@@ -725,7 +762,7 @@
 	</select>
 	
 	<!-- 주문상세 > 관리자메모 -->
-	<select id="getOrderTsainMemoList" parameterType="Order" resultType="Order">
+	<select id="getOrderMemoList" parameterType="Order" resultType="Order">
 		/* order.getOrderTsainMemoList */
 		SELECT ORDER_MEMO_SQ 
 		     , OM.ORD_NO
@@ -793,7 +830,7 @@
 		AND    OD.ORD_DTL_NO = ODI.ORD_DTL_NO 
 		INNER  JOIN TB_GOODS G2
 		ON     ODI.ITEM_CD = G2.GOODS_CD
-		INNER  JOIN TB_GOODS_IMG GI
+		LEFT   OUTER JOIN TB_GOODS_IMG GI
 		ON     ODI.ITEM_CD = GI.GOODS_CD
 		AND    ODI.OPT_CD1 = GI.COLOR_CD
 		INNER  JOIN TB_PAYMENT P
@@ -834,14 +871,14 @@
 		</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
@@ -853,7 +890,7 @@
 		AND    SUPPLY_COMP_CD = #{supplyCompCd}
 	</update>
 	
-	<!-- 주문상세이력 생성-->
+	<!-- 주문/배송 > 주문상세이력 생성-->
 	<insert id="createOrderDetailHst" parameterType="Order">
 		/* Order.createOrderDetailHst */
 		INSERT INTO TB_ORDER_DETAIL_HST (
@@ -1008,7 +1045,7 @@
 		WHERE  ORD_DTL_NO = #{ordDtlNo}
 	</insert>
 	
-	<!-- 입점업체 엑셀다운 임시파일 체크-->
+	<!-- 주문/배송 > 입점업체 엑셀다운 임시파일 체크-->
 	<select id="getEntryUploadExcelCheck" parameterType="Order" resultType="int">
 		SELECT COUNT(1)
 		FROM   TB_ENTRY_UPLOAD_EXCEL X
@@ -1017,7 +1054,7 @@
 		AND    X.ORD_DTL_NO = #{ordDtlNo}
 	</select>
 	
-	<!-- 입점업체 엑셀다운용 임시테이블 생성-->
+	<!-- 주문/배송 > 입점업체 엑셀다운용 임시테이블 생성-->
 	<insert id="createEntryExcelDownTmp" parameterType="Order">
 		INSERT INTO TB_ENTRY_UPLOAD_EXCEL (
 			ORD_NO
@@ -1076,7 +1113,7 @@
 		AND    OD.ORD_DTL_NO = ODI.ORD_DTL_NO
 		INNER  JOIN TB_GOODS G2
 		ON     ODI.ITEM_CD = G2.GOODS_CD
-		INNER  JOIN TB_GOODS_IMG GI
+		LEFT   OUTER JOIN TB_GOODS_IMG GI
 		ON     ODI.ITEM_CD = GI.GOODS_CD
 		AND    ODI.OPT_CD1 = GI.COLOR_CD 
 		INNER  JOIN TB_PAYMENT P
@@ -1169,7 +1206,7 @@
 		AND    OD.ORD_DTL_NO = ODI.ORD_DTL_NO
 	</select>
 	
-	<!-- 주문상세정보 변경 - 송장번호 적용(입점)  -->
+	<!-- 주문/배송 > 주문상세정보 변경 - 송장번호 적용(입점)  -->
 	<update id="updateOrderDetailInvoice" parameterType="Order">
 		/* TsaOrder.updateOrderDetailInvoice */
 		UPDATE TB_ORDER_DETAIL
@@ -1477,781 +1514,18 @@
 		AND    ORD_DTL_NO = #{ordDtlNo}
 	</update>
 	
-	<!-- 주문정보 -->
-	<select id="getOrderInfo" parameterType="Order" resultType="Order">
-		/* order.getOrderInfo */
-		SELECT O.ORD_NO
-		     , O.MALL_GB
-		     , FN_GET_CODE_NM('G011', O.MALL_GB) AS MALL_GB_NM
-		     , DATE_FORMAT(O.ORD_DT,'%Y%m%d%H%i%S') AS ORD_DT
-		     , O.CUST_NO
-		     , O.ORD_NM
-		     , O.ORD_PHNNO
-		     , O.ORD_TELNO
-		     , O.ORD_EMAIL
-		     , O.SITE_CD
-		     , FN_GET_CODE_NM('G000', O.SITE_CD) AS SITE_NM
-		     , O.FRONT_GB
-		     , O.REG_NO
-		     , DATE_FORMAT(O.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
-		     , O.UPD_NO
-		     , DATE_FORMAT(O.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
-		     , P.PAY_MEANS
-		     , FN_GET_CODE_NM('G014', P.PAY_MEANS) AS PAY_MEANS_NM
-		     , DATE_FORMAT(O.PAY_DT,'%Y%m%d%H%i%S') AS PAY_DT
-		     , P.PAY_AMT
-		     , P.PAY_SQ
-		     , P.PAY_STAT
-		     , P.PG_GB
-		     , P.PG_TID
-		     , P.ESCROW_YN
-		     , C.CUST_GB
-		     , C.CUST_GRADE
-		     , S.SUM_ORD_QTY
-		     , S.SUM_CNCL_RTN_QTY
-		     , S.SUM_REAL_ORD_AMT
-		     , S.SUM_CNCL_RTN_AMT
-		     , S.SUM_CART_CPN_DC_AMT
-		FROM   TB_ORDER O
-		INNER  JOIN TB_PAYMENT P
-		ON     O.ORD_NO = P.ORD_NO
-		INNER  JOIN (
-			SELECT MAX(PAY_SQ) AS PAY_SQ 
-			FROM   TB_PAYMENT 
-			WHERE  ORD_NO = #{ordNo}
-		) PS
-		ON     P.PAY_SQ = PS.PAY_SQ
-		LEFT   OUTER JOIN TB_CUSTOMER C
-		ON     O.CUST_NO = C.CUST_NO
-		INNER  JOIN (
-			SELECT ORD_NO
-			     , NVL(MIN(CART_CPN_SQ),0) AS CART_CPN_SQ
-			     , SUM(OD.ORD_QTY)         AS SUM_ORD_QTY
-			     , SUM(OD.CNCL_RTN_QTY)    AS SUM_CNCL_RTN_QTY
-			     , SUM(OD.REAL_ORD_AMT)    AS SUM_REAL_ORD_AMT
-			     , SUM(OD.CNCL_RTN_AMT)    AS SUM_CNCL_RTN_AMT
-			     , SUM(OD.CART_CPN_DC_AMT) AS SUM_CART_CPN_DC_AMT
-			FROM  TB_ORDER_DETAIL OD
-			WHERE ORD_NO = #{ordNo}
-			GROUP BY ORD_NO
-		) S
-		ON    1=1
-		LEFT  OUTER JOIN TB_CUST_COUPON CC
-		ON    S.CART_CPN_SQ = CC.CUST_CPN_SQ 
-		WHERE O.ORD_NO = P.ORD_NO
-		AND   O.ORD_NO = #{ordNo}
-	</select>
-	
-	<!-- 주문상세 > 주문취소대상목록 -->
-	<select id="getCancelRequestTargetList" parameterType="Order" resultType="Order">
-		/* order.getCancelRequestTargetList */
-		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
-		     , 0			AS ORD_CAN_CHG_QTY
-		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 
-		WHERE  1=1
-		AND    OD.ORD_DTL_STAT IN (
-			'G013_10', 'G013_20', 'G013_30', 'G013_40'
-		)
-		AND    OD.ORD_NO = #{ordNo}
-		GROUP  BY OD.ORD_NO
-		     , OD.ORD_DTL_NO
-	    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_ZIP_NO
-			, CHGER_BASE_ADDR
-			, CHGER_DTL_ADDR
-			, CHGER_RTN_MEMO
-			, ADD_PAY_COST
-			, ADD_PAY_AMT
-			, REG_NO
-			, REG_DT
-			, UPD_NO
-			, UPD_DT
-		) 
-		SELECT #{chgGb}
-			 , #{chgReason}
-			 , #{chgMemo}
-			 , ORD_NM
-			 , ORD_PHNNO
-			 , ORD_TELNO
-			 , ORD_EMAIL
-			 , #{chgerZipNo}
-			 , #{chgerBaseAddr}
-			 , #{chgerDtlAddr}
-			 , #{chgerRtnMemo}
-			 , #{addPayCost}
-			 , #{addPayAmt}
-			 , #{regNo}
-			 , SYSDATE()
-			 , #{updNo}
-			 , SYSDATE()
-		FROM   TB_ORDER  
-		WHERE  ORD_NO = #{ordNo}
-	</insert>
-	
-	<!-- 주문상세 > 주문취소신청 > 주문변경정보 등록-->
-	<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}
-			, SYSDATE()
-			, #{regNo}
-			, SYSDATE()
-			, #{updNo}
-			, SYSDATE()
-		)
-	</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.ORD_AMT 			= ODI.ORD_AMT 				- #{cnclRtnAmt}
-		     , ODI.CNCL_RTN_AMT 	= ODI.CNCL_RTN_AMT 			+ #{cnclRtnAmt}
-		     , ODI.CPN1_DC_AMT 		= ODI.CPN1_DC_AMT 			- #{cpn1DcAmt}
-		     , ODI.TMTB1_DC_AMT 	= ODI.TMTB1_DC_AMT 			- #{tmtb1DcAmt}
-		     , ODI.TMTB2_DC_AMT 	= ODI.TMTB1_DC_AMT 			- #{tmtb2DcAmt}
-		     , ODI.GOODS_CPN_DC_AMT = ODI.GOODS_CPN_DC_AMT 		- #{goodsCpnDcAmt}
-		     , ODI.CART_CPN_DC_AMT 	= ODI.CART_CPN_DC_AMT 		- #{cartCpnDcAmt}
-		     , ODI.PNT_DC_AMT 		= ODI.PNT_DC_AMT 			- #{pntDcAmt}
-		     , ODI.PRE_PNT_DC_AMT 	= ODI.PRE_PNT_DC_AMT 		- #{prePntDcAmt}
-		     , ODI.SAVE_PNT_AMT 	= ODI.SAVE_PNT_AMT 			- #{savePntAmt}
-		     , ODI.REAL_ORD_AMT 	= ODI.REAL_ORD_AMT 			- #{realOrdAmt}
-		     , ODI.GFCD_USE_AMT 	= ODI.GFCD_USE_AMT 			- #{gfcdUseAmt}
-		     , ODI.UPD_NO 			= #{updNo}
-		     , ODI.UPD_DT 			= SYSDATE()
-		WHERE  1=1
-		AND    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
-			 , #{ordAmt}
-			 , #{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>
-	
-	<!-- 주문상세이력 생성-->
-	<insert id="createOrderDetailHstCnclRtn" parameterType="Order">
-		/* Order.createOrderDetailHstCnclRtn */
-		INSERT INTO TB_ORDER_DETAIL_HST (
-				ORD_DTL_NO
-				, ORD_NO
-				, ORD_EXCH_GB
-				, ORD_DTL_STAT
-				, ORG_ORD_DTL_NO
-				, SUPPLY_COMP_CD
-				, GOODS_CD
-				, PRODUCT_NO
-				, PRODUCT_CODE
-				, FORMAL_GB
-				, GOODS_TYPE
-				, LIST_PRICE
-				, CURR_PRICE
-				, DC_RATE
-				, OPT_ADD_PRICE
-				, ORD_QTY
-				, ORD_AMT
-				, CNCL_RTN_QTY
-				, CNCL_RTN_AMT
-				, CPN1_CPN_SQ
-				, CPN1_DC_AMT
-				, TMTB1_SQ
-				, TMTB1_DC_AMT
-				, TMTB2_SQ
-				, TMTB2_DC_AMT
-				, GOODS_CPN_SQ
-				, GOODS_CPN_DC_AMT
-				, CART_CPN_SQ
-				, CART_CPN_DC_AMT
-				, BURDEN_RATE
-				, PNT_DC_AMT
-				, PRE_PNT_DC_AMT
-				, SAVE_PNT_AMT
-				, REAL_ORD_AMT
-				, GFCD_USE_AMT
-				, VENDOR_ID
-				, EXTMALL_ID
-				, AGENT_ORDER_ID
-				, EXTMALL_ORDER_ID
-				, CHANGABLE_YN
-				, CHANGE_FEE_FREE_YN
-				, RETURNABLE_YN
-				, RETURN_FEE_FREE_YN
-				, SOLDOUT_YN
-				, SOLDOUT_MEMO
-				, SOLDOUT_REG_NO
-				, SOLDOUT_REG_DT
-				, DELV_ADDR_SQ
-				, DELV_FEE_CD
-				, SHOT_DELV_YN
-				, GIFT_PACK_YN
-				, MAKE_GOODS_YN
-				, ENTRY_NO
-				, DELV_LOC_CD
-				, DELV_ASSIGN_DT
-				, DELV_ASSIGN_STAT
-				, DSTRBT_NOTE
-				, DELV_STDT
-				, DELV_EDDT
-				, SHIP_COMP_CD
-				, INVOICE_NO
-				, INVOICE_SEND_YN
-				, SELL_STORE_CD
-				, SELL_FEE_RATE
-				, AF_LINK_CD
-				, ITHR_CD
-				, CONTENTS_LOC
-				, PLAN_DTL_SQ
-				, SOCIAL_SQ
-				, REG_NO
-				, REG_DT
-				, UPD_NO
-				, UPD_DT
-		)
-		SELECT OD.ORD_DTL_NO
-			 , OD.ORD_NO
-			 , OD.ORD_EXCH_GB
-			 , #{ordDtlStat}
-			 , OD.ORG_ORD_DTL_NO
-			 , OD.SUPPLY_COMP_CD
-			 , OD.GOODS_CD
-			 , OD.PRODUCT_NO
-			 , OD.PRODUCT_CODE
-			 , OD.FORMAL_GB
-			 , OD.GOODS_TYPE
-			 , OD.LIST_PRICE
-			 , OD.CURR_PRICE
-			 , OD.DC_RATE
-			 , OD.OPT_ADD_PRICE
-			 , OD.ORD_QTY - #{ordCanChgQty}
-			 , OD.ORD_AMT - Z.ORD_AMT
-			 , #{ordCanChgQty}
-			 , OD.ORD_AMT - Z.CNCL_RTN_AMT
-			 , OD.CPN1_CPN_SQ
-			 , OD.CPN1_DC_AMT - Z.CPN1_DC_AMT
-			 , OD.TMTB1_SQ
-			 , OD.TMTB1_DC_AMT - Z.TMTB1_DC_AMT
-			 , OD.TMTB2_SQ
-			 , OD.TMTB2_DC_AMT - Z.TMTB2_DC_AMT
-			 , OD.GOODS_CPN_SQ
-			 , OD.GOODS_CPN_DC_AMT - Z.GOODS_CPN_DC_AMT
-			 , OD.CART_CPN_SQ
-			 , OD.CART_CPN_DC_AMT - Z.CART_CPN_DC_AMT
-			 , OD.BURDEN_RATE
-			 , OD.PNT_DC_AMT - Z.PNT_DC_AMT
-			 , OD.PRE_PNT_DC_AMT - Z.PRE_PNT_DC_AMT
-			 , OD.SAVE_PNT_AMT - Z.SAVE_PNT_AMT
-			 , Z.REAL_ORD_AMT
-			 , OD.GFCD_USE_AMT - Z.GFCD_USE_AMT
-			 , OD.VENDOR_ID
-			 , OD.EXTMALL_ID
-			 , OD.AGENT_ORDER_ID
-			 , OD.EXTMALL_ORDER_ID
-			 , OD.CHANGABLE_YN
-			 , OD.CHANGE_FEE_FREE_YN
-			 , OD.RETURNABLE_YN
-			 , OD.RETURN_FEE_FREE_YN
-			 , OD.SOLDOUT_YN
-			 , OD.SOLDOUT_MEMO
-			 , OD.SOLDOUT_REG_NO
-			 , OD.SOLDOUT_REG_DT
-			 , OD.DELV_ADDR_SQ
-			 , OD.DELV_FEE_CD
-			 , OD.SHOT_DELV_YN
-			 , OD.GIFT_PACK_YN
-			 , OD.MAKE_GOODS_YN
-			 , OD.ENTRY_NO
-			 , OD.DELV_LOC_CD
-			 , OD.DELV_ASSIGN_DT
-			 , OD.DELV_ASSIGN_STAT
-			 , OD.DSTRBT_NOTE
-			 , OD.DELV_STDT
-			 , OD.DELV_EDDT
-			 , OD.SHIP_COMP_CD
-			 , OD.INVOICE_NO
-			 , OD.INVOICE_SEND_YN
-			 , OD.SELL_STORE_CD
-			 , OD.SELL_FEE_RATE
-			 , OD.AF_LINK_CD
-			 , OD.ITHR_CD
-			 , OD.CONTENTS_LOC
-			 , OD.PLAN_DTL_SQ
-			 , OD.SOCIAL_SQ
-			 , #{regNo} AS REG_ID
-			 , CURRENT_TIMESTAMP() AS REG_DT
-			 , #{regNo} AS REG_ID
-			 , CURRENT_TIMESTAMP() AS UPD_DT
-		FROM   TB_ORDER_DETAIL OD
-		INNER  JOIN (
-		SELECT ODI.ORD_DTL_NO
-		     , SUM(ODI.ORD_AMT) AS ORD_AMT
-		     , SUM(ODI.CNCL_RTN_AMT) AS CNCL_RTN_AMT
-		     , SUM(ODI.CPN1_DC_AMT) AS CPN1_DC_AMT
-		     , SUM(ODI.TMTB1_DC_AMT) AS TMTB1_DC_AMT
-		     , SUM(ODI.TMTB2_DC_AMT) AS TMTB2_DC_AMT
-		     , SUM(ODI.GOODS_CPN_DC_AMT) AS GOODS_CPN_DC_AMT
-		     , SUM(ODI.CART_CPN_DC_AMT) AS CART_CPN_DC_AMT
-		     , SUM(ODI.PNT_DC_AMT) AS PNT_DC_AMT
-		     , SUM(ODI.PRE_PNT_DC_AMT) AS PRE_PNT_DC_AMT
-		     , SUM(ODI.SAVE_PNT_AMT) AS SAVE_PNT_AMT
-		     , SUM(ODI.REAL_ORD_AMT) AS REAL_ORD_AMT
-		     , SUM(ODI.GFCD_USE_AMT) AS GFCD_USE_AMT
-		FROM   TB_ORDER_DETAIL_ITEM ODI
-		WHERE  ODI.ORD_DTL_NO = #{ordDtlNo}
-		GROUP  BY ODI.ORD_DTL_NO
-		) Z
-		ON    OD.ORD_DTL_NO = Z.ORD_DTL_NO
-		AND   OD.ORD_DTL_NO = #{ordDtlNo}
-	</insert>
-	
-	<!-- 주문상세 > 주문취소신청 > 주문상세정보 수정 -->
-	<update id="updateOrderDetail" parameterType="Order">
-		/* Order.updateOrderDetail */
-		UPDATE TB_ORDER_DETAIL OD
-		INNER  JOIN (
-		SELECT ODI.ORD_DTL_NO
-		     , SUM(ODI.ORD_AMT) 			AS ORD_AMT
-		     , SUM(ODI.CNCL_RTN_AMT) 		AS CNCL_RTN_AMT
-		     , SUM(ODI.CPN1_DC_AMT) 		AS CPN1_DC_AMT
-		     , SUM(ODI.TMTB1_DC_AMT) 		AS TMTB1_DC_AMT
-		     , SUM(ODI.TMTB2_DC_AMT) 		AS TMTB2_DC_AMT 
-		     , SUM(ODI.GOODS_CPN_DC_AMT) 	AS GOODS_CPN_DC_AMT
-		     , SUM(ODI.CART_CPN_DC_AMT) 	AS CART_CPN_DC_AMT 
-		     , SUM(ODI.PNT_DC_AMT) 			AS PNT_DC_AMT 
-		     , SUM(ODI.PRE_PNT_DC_AMT) 		AS PRE_PNT_DC_AMT
-		     , SUM(ODI.SAVE_PNT_AMT) 		AS SAVE_PNT_AMT 
-		     , SUM(ODI.REAL_ORD_AMT) 		AS REAL_ORD_AMT 
-		     , SUM(ODI.GFCD_USE_AMT) 		AS GFCD_USE_AMT 
-		FROM   TB_ORDER_DETAIL_ITEM ODI
-		WHERE  ODI.ORD_NO = #{ordNo} 
-		AND    ODI.ORD_DTL_NO = #{ordDtlNo}
-		GROUP  BY ODI.ORD_DTL_NO
-		) Z
-		ON     OD.ORD_DTL_NO 			= Z.ORD_DTL_NO
-		SET    OD.ORD_DTL_STAT			= CASE WHEN OD.ORD_QTY > (OD.CNCL_RTN_QTY + #{ordCanChgQty})
-		                                       THEN OD.ORD_DTL_STAT
-		                                       ELSE #{ordDtlStat}
-		                                        END
-		     , OD.CNCL_RTN_QTY			= OD.CNCL_RTN_QTY + #{ordCanChgQty}
-		     , OD.ORD_AMT 				= Z.ORD_AMT
-		     , OD.CNCL_RTN_AMT  		= Z.CNCL_RTN_AMT
-		     , OD.CPN1_DC_AMT 			= Z.CPN1_DC_AMT
-		     , OD.TMTB1_DC_AMT 			= Z.TMTB1_DC_AMT
-		     , OD.TMTB2_DC_AMT 			= Z.TMTB2_DC_AMT
-		     , OD.GOODS_CPN_DC_AMT 		= Z.GOODS_CPN_DC_AMT
-		     , OD.CART_CPN_DC_AMT 		= Z.CART_CPN_DC_AMT
-		     , OD.PNT_DC_AMT 			= Z.PNT_DC_AMT
-		     , OD.PRE_PNT_DC_AMT 		= Z.PRE_PNT_DC_AMT
-		     , OD.SAVE_PNT_AMT 			= Z.SAVE_PNT_AMT
-		     , OD.REAL_ORD_AMT 			= Z.REAL_ORD_AMT
-		     , OD.GFCD_USE_AMT 			= Z.GFCD_USE_AMT
-		WHERE  1=1
-		AND    OD.ORD_NO = #{ordNo}
-		AND    OD.ORD_DTL_NO = #{ordDtlNo}
-	</update>
-		
-	<!-- 주문상세 > 주문취소신청 > 주문환불 결제 정보 등록 -->
-	<insert id="createPayment" parameterType="Order" keyProperty="paySq">
-		/* Order.createPayment */
-		INSERT INTO TB_PAYMENT (
-			ORD_NO
-			, PAY_DT
-			, PAY_MEANS
-			, PAY_AMT
-			, PG_CPN_AMT
-			, NPAY_PNT_AMT
-			, PAY_GB
-			, PAY_STAT
-			, PG_GB
-			, PG_TID
-			, PG_TRADE_NO
-			, PG_SHOP_ID
-			, CARD_TYPE
-			, CARD_KIND
-			, CARD_BANK
-			, CARD_NM
-			, CARD_MIPS
-			, CARD_PCABLE_YN
-			, VA_NO
-			, VA_NM
-			, VA_BANK
-			, VA_DEADLINE
-			, TELECOM
-			, ESCROW_YN
-			, ORD_CHG_SQ
-			, REG_NO
-			, REG_DT
-			, UPD_NO
-			, UPD_DT
-		) 
-		SELECT ORD_NO
-		 	 , SYSDATE()
-			 , PAY_MEANS
-			 , #{payAmt}
-			 , #{pgCpnAmt}
-			 , #{npayPntAmt}
-			 , PAY_GB
-			 , #{payStat}
-			 , PG_GB
-			 , #{pgTid}
-			 , #{pgTradeNo}
-			 , PG_SHOP_ID
-			 , CARD_TYPE
-			 , CARD_KIND
-			 , CARD_BANK
-			 , CARD_NM
-			 , CARD_MIPS
-			 , CARD_PCABLE_YN
-			 , #{vaNo}
-			 , #{vaNm}
-			 , #{vaBank}
-			 , #{vaDeadline}
-			 , TELECOM
-			 , ESCROW_YN
-			 , #{ordChgSq}
-			 , #{regNo}
-			 , SYSDATE()
-			 , #{updNo}
-			 , SYSDATE()
-		FROM   TB_PAYMENT 
-		WHERE  1=1
-		AND    ORD_NO = #{ordNo}
-		AND    PAY_GB = 'O'
-		AND    PAY_STAT = 'G016_30'
-	</insert>
-	
-	<!-- 주문상세 > 주문취소신청 > 주문환불 금액 정보 등록 -->
-	<insert id="createRefund" parameterType="Order">
-		/* Order.createRefund */
-		INSERT INTO TB_REFUND (
-			ORD_NO
-			, PAY_SQ
-			, ORD_CHG_SQ
-			, REFUND_AMT
-			, RA_NO
-			, RA_BANK
-			, RA_NM
-			, RF_CPN1_AMT
-			, RF_TMTB1_AMT
-			, RF_TMTB2_AMT
-			, RF_GOODS_CPN_AMT
-			, RF_CART_CPN_AMT
-			, RF_PNT_AMT
-			, RF_PRE_PNT_AMT
-			, RF_GFCD_USE_AMT
-			, REG_NO
-			, REG_DT
-		) VALUES (
-			#{ordNo}
-			, #{paySq}
-			, #{ordChgSq}
-			, #{refundAmt}
-			, #{raNo}
-			, #{raBank}
-			, #{raNm}
-			, #{rfCpn1Amt}
-			, #{rfTmtb1Amt}
-			, #{rfTmtb2Amt}
-			, #{rfGoodsCpnAmt}
-			, #{rfCartCpnAmt}
-			, #{rfPntAmt}
-			, #{rfPrePntAmt}
-			, #{rfGfcdUseAmt}
-			, #{regNo}
-			, SYSDATE()
-		)
-	</insert>
-	
-	<!-- 주문상세 > 주문취소신청 > 주문 추가 배송 금액 등록-->
-	<insert id="createDeliveryFee" parameterType="Order">
-		/* Order.createDeliveryFee */
-		INSERT INTO TB_DELIVERY_FEE ( 
-			PAY_SQ
-			, ORD_NO
-			, DELV_FEE_GB
-			, DELV_FEE_CD
-			, DELV_FEE
-			, DELV_CPN_SQ
-			, DELV_CPN_DC_AMT
-			, REAL_DELV_AMT
-			, ORD_CHG_SQ
-			, SUPPLY_COMP_CD
-			, DELV_USAC_YN
-			, DELV_USAC_DT
-			, REG_NO
-			, REG_DT
-			, UPD_NO
-			, UPD_DT
-		) VALUES (
-			#{paySq}
-			, #{ordNo}
-			, #{delvFeeGb}
-			, #{delvFeeCd}
-			, #{delvFee}
-			, #{delvCpnSq}
-			, #{delvCpnDcAmt}
-			, #{realDelvAmt}
-			, #{ordChgSq}
-			, #{supplyCompCd}
-			, 'N'
-			, null
-			, #{regNo}
-			, SYSDATE()
-			, #{updNo}
-			, SYSDATE()
-		)
-	</insert>
-	
-	<!-- 고객환불계좌정보 조회 -->
-	<select id="getRefundAccount" parameterType="Order" resultType="Order">
-		/* Order.getRefundAccount */
-		SELECT Z.ACCOUNT_NO
-		     , Z.ACCOUNT_NM
-		     , Z.BANK_CD
-		     , FN_GET_CODE_NM('G940', Z.BANK_CD) AS BANK_NM
-		     , Z.DEFAULT_YN
-		     , Z.REG_DT
-		FROM   (
-			SELECT CA.ACCOUNT_NO
-			     , CA.ACCOUNT_NM 
-			     , CA.BANK_CD
-			     , CA.DEFAULT_YN
-			     , CA.REG_DT
-			FROM   TB_ORDER O
-			LEFT   OUTER JOIN TB_CUST_ACCOUNT CA 
-			ON     O.CUST_NO = CA.CUST_NO
-			WHERE  1=1
-			AND    O.CUST_NO = 0
-			GROUP  BY CA.ACCOUNT_NO
-			     , CA.ACCOUNT_NM 
-			     , CA.BANK_CD
-			     , CA.DEFAULT_YN
-			ORDER  BY CA.DEFAULT_YN DESC
-			     , CA.REG_DT DESC
-		) Z
-	</select>
-	
-	<!-- 고객환불계좌정보 체크 -->
-	<select id="getRefundAccountCheck" parameterType="Order" resultType="int">
-		/* Order.getRefundAccountCheck */
-		SELECT COUNT(1)
-		FROM   TB_CUST_ACCOUNT CA
-		WHERE  1=1
-		AND    CA.ACCOUNT_NO = ${accountNo}
-		AND    CA.ACCOUNT_NM = #{accountNm}
-		AND    CA.BANK_CD = #{bankCd}
-		AND    CA.DEL_YN = 'N'
-	</select>
-	
-	<!-- 고객환불계좌정보 등록 -->
-	<insert id="saveRefundAccount" parameterType="Order">
-		/* Order.saveRefundAccount */
-		INSERT INTO TB_CUST_ACCOUNT (
-			CUST_NO
-			, BANK_CD
-			, ACCOUNT_NO
-			, ACCOUNT_NM
-			, DEFAULT_YN
-			, DEL_YN
-			, REG_NO
-			, REG_DT
-			, UPD_NO
-			, UPD_DT
-		) VALUES (
-			#{custNo}
-			, #{bankCd}
-			, #{accountNo}
-			, #{accountNm}
-			, 'N'
-			, 'N'
-			, #{regNo}
-			, SYSDATE()
-			, #{updNo}
-			, SYSDATE()
-		)
-	</insert>
-	
+
+
+
+
+
+
+
+
+
+
+
+
 </mapper>
 
 

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

@@ -0,0 +1,777 @@
+<?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
+		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'
+		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
+	    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_ZIP_NO
+			, CHGER_BASE_ADDR
+			, CHGER_DTL_ADDR
+			, CHGER_RTN_MEMO
+			, ADD_PAY_COST
+			, ADD_PAY_AMT
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+		) 
+		SELECT #{chgGb}
+			 , #{chgReason}
+			 , #{chgMemo}
+			 , ORD_NM
+			 , ORD_PHNNO
+			 , ORD_TELNO
+			 , ORD_EMAIL
+			 , #{chgerZipNo}
+			 , #{chgerBaseAddr}
+			 , #{chgerDtlAddr}
+			 , #{chgerRtnMemo}
+			 , #{addPayCost}
+			 , #{addPayAmt}
+			 , #{regNo}
+			 , SYSDATE()
+			 , #{updNo}
+			 , SYSDATE()
+		FROM   TB_ORDER  
+		WHERE  ORD_NO = #{ordNo}
+	</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 			= SYSDATE()
+		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 = SYSDATE()
+		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}
+			, SYSDATE()
+			, #{regNo}
+			, SYSDATE()
+			, #{updNo}
+			, SYSDATE()
+		)
+	</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
+		 	 , SYSDATE()
+			 , PAY_MEANS
+			 , #{payAmt}
+			 , #{pgCpnAmt}
+			 , #{npayPntAmt}
+			 , PAY_GB
+			 , #{payStat}
+			 , PG_GB
+			 , #{pgTid}
+			 , #{pgTradeNo}
+			 , PG_SHOP_ID
+			 , CARD_TYPE
+			 , CARD_KIND
+			 , CARD_BANK
+			 , CARD_NM
+			 , CARD_MIPS
+			 , CARD_PCABLE_YN
+			 , #{vaNo}
+			 , #{vaNm}
+			 , #{vaBank}
+			 , #{vaDeadline}
+			 , TELECOM
+			 , ESCROW_YN
+			 , #{ordChgSq}
+			 , #{regNo}
+			 , SYSDATE()
+			 , #{updNo}
+			 , SYSDATE()
+		FROM   TB_PAYMENT 
+		WHERE  1=1
+		AND    ORD_NO = #{ordNo}
+		AND    PAY_GB = 'O'
+		AND    PAY_STAT = 'G016_30'
+	</insert>
+	
+	<!-- 주문상세 > 주문취소신청 > 주문환불정보 등록 -->
+	<insert id="createRefund" parameterType="Order">
+		/* Order.createRefund */
+		INSERT INTO TB_REFUND (
+			ORD_NO
+			, PAY_SQ
+			, ORD_CHG_SQ
+			, REFUND_AMT
+			, RA_NO
+			, RA_BANK
+			, RA_NM
+			, RF_CPN1_AMT
+			, RF_TMTB1_AMT
+			, RF_TMTB2_AMT
+			, RF_GOODS_CPN_AMT
+			, RF_CART_CPN_AMT
+			, RF_PNT_AMT
+			, RF_PRE_PNT_AMT
+			, RF_GFCD_USE_AMT
+			, REG_NO
+			, REG_DT
+		) VALUES (
+			#{ordNo}
+			, #{paySq}
+			, #{ordChgSq}
+			, #{refundAmt}
+			, #{raNo}
+			, #{raBank}
+			, #{raNm}
+			, #{rfCpn1Amt}
+			, #{rfTmtb1Amt}
+			, #{rfTmtb2Amt}
+			, #{rfGoodsCpnAmt}
+			, #{rfCartCpnAmt}
+			, #{rfPntAmt}
+			, #{rfPrePntAmt}
+			, #{rfGfcdUseAmt}
+			, #{regNo}
+			, SYSDATE()
+		)
+	</insert>
+
+	<!-- 주문상세 > 주문취소신청 > 주문추가배송금액등록-->
+	<insert id="createDeliveryFee" parameterType="Order">
+		/* Order.createDeliveryFee */
+		INSERT INTO TB_DELIVERY_FEE ( 
+			PAY_SQ
+			, ORD_NO
+			, DELV_FEE_GB
+			, DELV_FEE_CD
+			, DELV_FEE
+			, DELV_CPN_SQ
+			, DELV_CPN_DC_AMT
+			, REAL_DELV_AMT
+			, ORD_CHG_SQ
+			, SUPPLY_COMP_CD
+			, DELV_USAC_YN
+			, DELV_USAC_DT
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+		) VALUES (
+			#{paySq}
+			, #{ordNo}
+			, #{delvFeeGb}
+			, #{delvFeeCd}
+			, #{delvFee}
+			, #{delvCpnSq}
+			, #{delvCpnDcAmt}
+			, #{realDelvAmt}
+			, #{ordChgSq}
+			, #{supplyCompCd}
+			, 'N'
+			, null
+			, #{regNo}
+			, SYSDATE()
+			, #{updNo}
+			, SYSDATE()
+		)
+	</insert>
+	
+	<!-- 주문상세 > 주문취소신청 > 주문사은품취소 -->
+	<update id="updateOrdFreegiftDel" parameterType="Order">
+		/* Order.updateOrdFreegiftDel */
+		UPDATE TB_ORD_FREEGIFT_VAL
+		SET    DEL_YN= 'N'
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = SYSDATE()
+		WHERE  FREEGIFT_VAL_SQ IN (
+			SELECT OFRV.FREEGIFT_VAL_SQ 
+			FROM   TB_ORD_FREEGIFT OFR
+			INNER  JOIN TB_ORD_FREEGIFT_VAL OFRV
+			ON     OFR.ORD_FREEGIFT_SQ  = OFRV.ORD_FREEGIFT_SQ 
+			WHERE  1=1
+			AND    OFR.ORD_NO = (SELECT CASE WHEN SUM(X.ORD_QTY) > SUM(X.CNCL_RTN_QTY)
+								             THEN 0
+								             ELSE X.ORD_NO
+								             END 
+								 FROM   TB_ORDER_DETAIL X
+								 WHERE  1=1
+								 AND    X.ORD_NO = #{ordNo})
+		)
+	</update>
+	
+	
+	
+	<!-- 주문상세 > 주문취소 > 고객환불계좌정보 조회 -->
+	<select id="getRefundAccount" parameterType="Order" resultType="Order">
+		/* Order.getRefundAccount */
+		SELECT Z.ACCOUNT_NO
+		     , Z.ACCOUNT_NM
+		     , Z.BANK_CD
+		     , FN_GET_CODE_NM('G940', Z.BANK_CD) AS BANK_NM
+		     , Z.DEFAULT_YN
+		     , Z.REG_DT
+		FROM   (
+			SELECT CA.ACCOUNT_NO
+			     , CA.ACCOUNT_NM 
+			     , CA.BANK_CD
+			     , CA.DEFAULT_YN
+			     , CA.REG_DT
+			FROM   TB_ORDER O
+			LEFT   OUTER JOIN TB_CUST_ACCOUNT CA 
+			ON     O.CUST_NO = CA.CUST_NO
+			WHERE  1=1
+			AND    O.CUST_NO = 0
+			GROUP  BY CA.ACCOUNT_NO
+			     , CA.ACCOUNT_NM 
+			     , CA.BANK_CD
+			     , CA.DEFAULT_YN
+			ORDER  BY CA.DEFAULT_YN DESC
+			     , CA.REG_DT DESC
+		) Z
+	</select>
+	
+	<!-- 주문상세 > 주문취소 > 고객환불계좌정보 중복체크 -->
+	<select id="getRefundAccountCheck" parameterType="Order" resultType="int">
+		/* Order.getRefundAccountCheck */
+		SELECT COUNT(1)
+		FROM   TB_CUST_ACCOUNT CA
+		WHERE  1=1
+		AND    CA.ACCOUNT_NO = ${accountNo}
+		AND    CA.ACCOUNT_NM = #{accountNm}
+		AND    CA.BANK_CD = #{bankCd}
+		AND    CA.DEL_YN = 'N'
+	</select>
+	
+	<!-- 주문상세 > 주문취소 > 고객환불계좌정보 등록 -->
+	<insert id="saveRefundAccount" parameterType="Order">
+		/* Order.saveRefundAccount */
+		INSERT INTO TB_CUST_ACCOUNT (
+			CUST_NO
+			, BANK_CD
+			, ACCOUNT_NO
+			, ACCOUNT_NM
+			, DEFAULT_YN
+			, DEL_YN
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+		) VALUES (
+			#{custNo}
+			, #{bankCd}
+			, #{accountNo}
+			, #{accountNm}
+			, 'N'
+			, 'N'
+			, #{regNo}
+			, SYSDATE()
+			, #{updNo}
+			, SYSDATE()
+		)
+	</insert>
+	
+	
+	
+</mapper>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

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

@@ -0,0 +1,22 @@
+<?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.TsaPgDao">
+
+	
+	
+</mapper>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 282 - 270
style24.admin/src/main/webapp/WEB-INF/views/business/AflinkForm.html

@@ -1,270 +1,282 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : AflinkForm.html
- * @desc    : 제휴채널관리 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.20   gagamel     최초 작성
- *******************************************************************************
- -->
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-		
-		<!-- 메뉴 설명 -->
-		<div class="infoBox menu-desc">
-		</div>
-		<!-- //메뉴 설명 -->
-		
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle">
-			<form id="searchForm" name="searchForm" action="#" th:action="@{'/business/aflink/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<table class="frmStyle" aria-describedby="검색조건">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col/>
-					</colgroup>
-					<tr>
-						<th>제휴채널</th>
-						<td>
-							<select name="afChannel">
-								<option value="">[전체]</option>
-								<option th:if="${afChannelList}" th:each="oneData, status : ${afChannelList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-					</tr>
-				</table>
-				
-				<ul class="panelBar">
-					<li class="center">
-						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
-						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
-					</li>
-				</ul>
-			</form>
-		</div>
-		<!-- 검색조건 영역 -->
-
-		<!-- 리스트 영역 -->
-		<div class="panelStyle">
-			<!-- 다중 TABLE 배치 -->
-			<ul class="division">
-				<li style="width: 60%">
-					<!-- 버튼 배치 영역 -->
-					<ul class="panelBar">
-						<li class="left">
-							<button type="button" class="btn btn-danger btn-lg" id="btnDelete">사용안함</button>
-						</li>
-						<li class="right">
-							<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
-						</li>
-					</ul>
-					<!-- //버튼 배치 영역 -->
-					
-					<div id="gridList" style="width: 100%; height: 570px;" class="ag-theme-balham"></div>
-				</li>
-				<li>
-					<!-- 버튼 배치 영역 -->
-					<ul class="panelBar">
-						<li>
-							<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
-							<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
-						</li>
-					</ul>
-					<!-- //버튼 배치 영역 -->
-					
-					<form id="detailForm" name="detailForm" action="#" th:action="@{'/business/aflink/save'}">
-						<table class="frmStyle">
-							<colgroup>
-								<col style="width:30%"/>
-								<col/>
-							</colgroup>
-							<tr>
-								<th>제휴코드<i class="star"></i></th>
-								<td>
-									<input type="text" class="w100" name="afLinkCd" placeholder="" maxlength="5" required="required" data-valid-type="alphaNumeric" data-valid-name="제휴코드" onkeyup="$(this).val($(this).val().toUpperCase());"/>
-								</td>
-							</tr>
-							<tr>
-								<th>제휴명<i class="star"></i></th>
-								<td>
-									<input type="text" class="w300" name="afLinkNm" placeholder="" maxlength="100" required="required" data-valid-name="제휴명"/>
-								</td>
-							</tr>
-							<tr>
-								<th>제휴채널<i class="star"></i></th>
-								<td>
-									<select name="afChannel" required="required" data-valid-name="제휴채널">
-										<option value="">[선택]</option>
-										<option th:if="${afChannelList}" th:each="oneData, status : ${afChannelList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-									</select>
-								</td>
-							</tr>
-							<tr>
-								<th>표시순서<i class="star"></i></th>
-								<td>
-									<input type="text" class="w100 text-right" name="dispOrd" placeholder="" maxlength="5" required="required" data-valid-type="numeric" data-valid-name="표시순서" />
-								</td>
-							</tr>
-							<tr>
-								<th>사용여부<i class="star"></i></th>
-								<td>
-									<input type="hidden" name="useYn"/>
-									<label class="chkBox"><input type="checkbox" name="chkUseYn" value="Y" checked="checked" disabled="disabled"/>사용</label>
-								</td>
-							</tr>
-						</table>
-					</form>
-				</li>
-			</ul>
-			<!--//다중 TABLE 배치 -->
-		</div>
-		<!-- //리스트 영역 -->
-	</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	let afChannelList = gagajf.convertToArray([[${afChannelList}]]);
-	let useYnList = { "Y":"Yes", "N":"No" };
-
-	let columnDefs = [
-		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
-		{headerName: "제휴링크코드", field: "afLinkCd", width: 100, cellClass: 'text-center'},
-		{
-			headerName: "제휴링크명", field: "afLinkNm", width: 180, cellClass: 'text-center',
-			cellRenderer: function(params) {
-				return '<a href="javascript:void(0);">' + params.value + '</a>';
-			}
-		},
-		{
-			headerName: "제휴채널", field: "afChannel", width: 120, cellClass: 'text-center',
-			valueGetter: function (params) { return gagaAgGrid.lookupValue(afChannelList, params.data.afChannel); }
-		},
-		{headerName: "표시순서", field: "dispOrd", width: 100, cellClass: 'text-center'},
-		{
-			headerName: "사용여부", field: "useYn", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) { return gagaAgGrid.lookupValue(useYnList, params.data.useYn); }
-		}
-	];
-
-	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
-
-	// 다중 선택
-	gridOptions.rowSelection = 'multiple';
-	
-	// Cell click
-	gridOptions.onCellClicked = function(event) {
-		if (event.colDef.field != 'afLinkNm')
-			return;
-		
-		$('#detailForm input[name=afLinkCd]').val(event.data.afLinkCd);
-		$('#detailForm input[name=afLinkCd]').attr('readonly', true);
-		$('#detailForm input[name=afLinkNm]').val(event.data.afLinkNm);
-		$('#detailForm select[name=afChannel]').val(event.data.afChannel);
-		$('#detailForm select[name=afMedia]').val(event.data.afMedia);
-		$('#detailForm input[name=dispOrd]').val(event.data.dispOrd);
-		
-		$("#detailForm input[name=useYn]").val(event.data.useYn);
-		if (event.data.useYn == 'Y') {
-			$("#detailForm input:checkbox[name=chkUseYn]").attr('checked', true);
-		} else {
-			$("#detailForm input:checkbox[name=chkUseYn]").attr('checked', false);
-		}
-
-		$('#detailForm input[name=afLinkNm]').focus();
-	}
-	
-	// 검색
-	$('#btnSearch').on('click', function() {
-		var actionUrl = $('#searchForm').prop('action') + '?' + $('#searchForm').serialize();
-
-		// Fetch data
-		gagaAgGrid.fetch(actionUrl, gridOptions, '#searchForm');
-	});
-
-	// 신규
-	$('#btnNew').on('click', function() {
-		$('#detailForm')[0].reset();
-		$('#detailForm input[name=afLinkCd]').attr('readonly', false);
-		$('#detailForm input[name=afLinkCd]').removeClass('formControl');
-		$('#detailForm input:checkbox[name=chkUseYn]').attr('disabled', true);
-		$('#detailForm input:checkbox[name=chkUseYn]').addClass('formControl');
-		$('#detailForm input[name=afLinkCd]').focus();
-	});
-	
-	// 사용안함 버튼 클릭 시
-	$('#btnDelete').on('click', function() {
-		var removedData = gagaAgGrid.removeRowData(gridOptions);
-
-		if (removedData.length == 0) {
-			mcxDialog.alert('선택된 행이 없습니다.');
-			return;
-		}
-
-		mcxDialog.confirm('사용안함으로 처리하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function(){
-				// delete 대신 update 처리해야 하므로 다음과 같이 useYn 값을 변환
-				var updatedData = [];
-
-				$.each(removedData, function(idx, item) {
-					item.useYn = 'N';
-					updatedData.push(item);
-				});
-
-				var jsonData = JSON.stringify(updatedData);
-				gagajf.ajaxJsonSubmit('/business/aflink/list/delete'
-						, jsonData
-						, function() {
-							$('#btnSearch').trigger('click');
-						});
-			}
-		});
-	});
-	
-	// 저장 처리
-	$('#btnSave').on('click', function() {
-		// 입력 값 체크
-		if (!gagajf.validation('#detailForm'))
-			return false;
-
-		$('#detailForm input[name=useYn]').val($('#detailForm input:checkbox[name=chkUseYn]').is(":checked") ? 'Y' : 'N');
-
-		mcxDialog.confirm('저장하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function(){
-				gagajf.ajaxFormSubmit($('#detailForm').prop('action')
-						, $('#detailForm')
-						, function() {
-							$('#btnNew').trigger('click');
-							$('#btnSearch').trigger('click');
-						}
-				);
-			}
-		});
-	});
-	
-	// 엑셀다운로드
-	$('#btnExcel').on('click', function() {
-		gagaAgGrid.exportToExcel('제휴채널 목록', gridOptions);
-	});
-	
-	$(document).ready(function() {
-		// Create a agGrid
-		gagaAgGrid.createGrid('gridList', gridOptions);
-	});
-/*]]>*/
-</script>
-
-</html>
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : AflinkForm.html
+ * @desc    : 제휴채널관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.20   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/business/aflink/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>상위제휴채널</th>
+						<td>
+							<select name="afChannel">
+								<option value="">[전체]</option>
+								<option th:if="${afChannelList}" th:each="oneData, status : ${afChannelList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 다중 TABLE 배치 -->
+			<ul class="division">
+				<li style="width: 60%">
+					<!-- 버튼 배치 영역 -->
+					<ul class="panelBar">
+						<li class="left">
+							<button type="button" class="btn btn-danger btn-lg" id="btnDelete">사용안함</button>
+						</li>
+						<li class="right">
+							<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+						</li>
+					</ul>
+					<!-- //버튼 배치 영역 -->
+					
+					<div id="gridList" style="width: 100%; height: 570px;" class="ag-theme-balham"></div>
+				</li>
+				<li>
+					<!-- 버튼 배치 영역 -->
+					<ul class="panelBar">
+						<li>
+							<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
+							<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+						</li>
+					</ul>
+					<!-- //버튼 배치 영역 -->
+					
+					<form id="detailForm" name="detailForm" action="#" th:action="@{'/business/aflink/save'}">
+						<table class="frmStyle">
+							<colgroup>
+								<col style="width:30%"/>
+								<col/>
+							</colgroup>
+							<tr>
+								<th>제휴코드<i class="star"></i></th>
+								<td>
+									<input type="text" class="w100" name="afLinkCd" placeholder="" maxlength="5" required="required" data-valid-type="alphaNumeric" data-valid-name="제휴코드" onkeyup="$(this).val($(this).val().toUpperCase());"/>
+								</td>
+							</tr>
+							<tr>
+								<th>제휴명<i class="star"></i></th>
+								<td>
+									<input type="text" class="w300" name="afLinkNm" placeholder="" maxlength="100" required="required" data-valid-name="제휴명"/>
+								</td>
+							</tr>
+							<tr>
+								<th>상위제휴채널<i class="star"></i></th>
+								<td>
+									<select name="afChannel" required="required" data-valid-name="상위제휴채널">
+										<option value="">[선택]</option>
+										<option th:if="${afChannelList}" th:each="oneData, status : ${afChannelList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+									</select>
+								</td>
+							</tr>
+							<tr>
+								<th>마진율<i class="star"></i></th>
+								<td>
+									<input type="text" class="w100 text-right" name="feeRate" placeholder="" maxlength="3" required="required" data-valid-type="real" data-valid-name="마진율" />%
+								</td>
+							</tr>
+							<tr>
+								<th>표시순서<i class="star"></i></th>
+								<td>
+									<input type="text" class="w100 text-right" name="dispOrd" placeholder="" maxlength="5" required="required" data-valid-type="numeric" data-valid-name="표시순서" />
+								</td>
+							</tr>
+							<tr>
+								<th>사용여부<i class="star"></i></th>
+								<td>
+									<input type="hidden" name="useYn"/>
+									<label class="chkBox"><input type="checkbox" name="chkUseYn" value="Y" checked="checked" disabled="disabled"/>사용</label>
+								</td>
+							</tr>
+						</table>
+					</form>
+				</li>
+			</ul>
+			<!--//다중 TABLE 배치 -->
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let afChannelList = gagajf.convertToArray([[${afChannelList}]]);
+	let useYnList = { "Y":"Yes", "N":"No" };
+
+	let columnDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "제휴채널코드", field: "afLinkCd", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "제휴채널명", field: "afLinkNm", width: 180,
+			cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{
+			headerName: "상위제휴채널", field: "afChannel", width: 120, cellClass: 'text-center',
+			valueGetter: function (params) { return gagaAgGrid.lookupValue(afChannelList, params.data.afChannel); }
+		},
+		{
+			headerName: "마진율", field: "feeRate", width: 100, cellClass: 'text-center',
+			cellRenderer: function(params) { return params.value + '%'; }
+		},
+		{headerName: "표시순서", field: "dispOrd", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "사용여부", field: "useYn", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) { return gagaAgGrid.lookupValue(useYnList, params.data.useYn); }
+		}
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 다중 선택
+	gridOptions.rowSelection = 'multiple';
+	
+	// Cell click
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field != 'afLinkNm')
+			return;
+		
+		$('#detailForm input[name=afLinkCd]').val(event.data.afLinkCd);
+		$('#detailForm input[name=afLinkCd]').attr('readonly', true);
+		$('#detailForm input[name=afLinkNm]').val(event.data.afLinkNm);
+		$('#detailForm select[name=afChannel]').val(event.data.afChannel);
+		$('#detailForm input[name=feeRate]').val(event.data.feeRate);
+		$('#detailForm input[name=dispOrd]').val(event.data.dispOrd);
+		
+		$("#detailForm input[name=useYn]").val(event.data.useYn);
+		if (event.data.useYn == 'Y') {
+			$("#detailForm input:checkbox[name=chkUseYn]").attr('checked', true);
+			$("#detailForm input:checkbox[name=chkUseYn]").parent().addClass('checked');
+		} else {
+			$("#detailForm input:checkbox[name=chkUseYn]").attr('checked', false);
+			$("#detailForm input:checkbox[name=chkUseYn]").parent().removeClass('checked');
+		}
+
+		$('#detailForm input[name=afLinkNm]').focus();
+	}
+	
+	// 검색
+	$('#btnSearch').on('click', function() {
+		var actionUrl = $('#searchForm').prop('action') + '?' + $('#searchForm').serialize();
+
+		// Fetch data
+		gagaAgGrid.fetch(actionUrl, gridOptions, '#searchForm');
+	});
+
+	// 신규
+	$('#btnNew').on('click', function() {
+		$('#detailForm')[0].reset();
+		$('#detailForm input[name=afLinkCd]').attr('readonly', false);
+		$('#detailForm input[name=afLinkCd]').removeClass('formControl');
+		$('#detailForm input:checkbox[name=chkUseYn]').attr('disabled', true);
+		$('#detailForm input:checkbox[name=chkUseYn]').addClass('formControl');
+		$('#detailForm input[name=afLinkCd]').focus();
+	});
+	
+	// 사용안함 버튼 클릭 시
+	$('#btnDelete').on('click', function() {
+		var removedData = gagaAgGrid.removeRowData(gridOptions);
+
+		if (removedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+
+		mcxDialog.confirm('사용안함으로 처리하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				// delete 대신 update 처리해야 하므로 다음과 같이 useYn 값을 변환
+				var updatedData = [];
+
+				$.each(removedData, function(idx, item) {
+					item.useYn = 'N';
+					updatedData.push(item);
+				});
+
+				var jsonData = JSON.stringify(updatedData);
+				gagajf.ajaxJsonSubmit('/business/aflink/list/delete'
+						, jsonData
+						, function() {
+							$('#btnSearch').trigger('click');
+						});
+			}
+		});
+	});
+	
+	// 저장 처리
+	$('#btnSave').on('click', function() {
+		// 입력 값 체크
+		if (!gagajf.validation('#detailForm'))
+			return false;
+
+		$('#detailForm input[name=useYn]').val($('#detailForm input:checkbox[name=chkUseYn]').is(":checked") ? 'Y' : 'N');
+
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				gagajf.ajaxFormSubmit($('#detailForm').prop('action')
+						, $('#detailForm')
+						, function() {
+							$('#btnNew').trigger('click');
+							$('#btnSearch').trigger('click');
+						}
+				);
+			}
+		});
+	});
+	
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('제휴채널 목록', gridOptions);
+	});
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/common/ExcelUploadPopupForm.html

@@ -6,7 +6,7 @@
  * @source  : ExcelUploadPopupForm.html
  * @desc    : 엑셀 업로드 팝업 Page
  *============================================================================
- * Pastelmall
+ * STYLE24
  * Copyright(C) 2019 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/customer/GoodsQnaDetailForm.html

@@ -57,7 +57,7 @@
 							<td th:text="*{siteNm}"></td>
 							<td>상품문의</td>
 							<td th:text="*{questDt}"></td>
-							<td th:utext="*{custNm + ' / ' + cellPhnno + '<br/>' + email}"></td>
+							<td th:utext="*{maskingCustNm + ' / ' + maskingCellPhnno + '<br/>' + maskingEmail}"></td>
 							<td th:utext="*{ansTransYn == 'Y' ? ansTransDt + '<br/>' + ansCompNm : ''}"></td>
 							<td th:utext="*{ansStat == 'G060_20' ? ansStatNm + ' / ' + ansDt + '<br/>' + ansNm : ansStatNm}"></td>
 						</tr>

+ 254 - 254
style24.admin/src/main/webapp/WEB-INF/views/envset/AnswerPhaseForm.html

@@ -1,255 +1,255 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-	<!--
- *******************************************************************************
- * @source  : AnswerPhaseForm.html
- * @desc    : 답변문구관리 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.29   gagamel     최초 작성
- *******************************************************************************
- -->
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-		
-		<!-- 메뉴 설명 -->
-		<div class="infoBox menu-desc">
-		</div>
-		<!-- //메뉴 설명 -->
-		
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle">
-			<form id="searchForm" name="searchForm" action="#" th:action="@{'/envset/answer/phase/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<table class="frmStyle" aria-describedby="검색조건">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:20%;"/>
-						<col style="width:10%;"/>
-						<col style="width:20%;"/>
-						<col style="width:10%;"/>
-						<col style="width:20%;"/>
-						<col/>
-					</colgroup>
-					<tr>
-						<th>사이트</th>
-						<td>
-							<select name="siteCd">
-								<option value="">[전체]</option>
-								<option th:if="${siteList}" th:each="oneData, status : ${siteList}"th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>답변종류</th>
-						<td>
-							<select name="ansClsf">
-								<option value="">[전체]</option>
-								<option th:if="${ansClsfList}" th:each="oneData, status : ${ansClsfList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>답변제목</th>
-						<td>
-							<input type="text" name="ansTitle" class="w200"/>
-						</td>
-						<th>사용여부</th>
-						<td>
-							<select name="useYn">
-								<option value="">[전체]</option>
-								<option value="Y">[Y] Yes</option>
-								<option value="N">[N] No</option>
-							</select>
-						</td>
-					</tr>
-				</table>
-				
-				<ul class="panelBar">
-					<li class="center">
-						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
-						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
-					</li>
-				</ul>
-			</form>
-		</div>
-		<!-- 검색조건 영역 -->
-		
-		<!-- 리스트 영역 -->
-		<div class="panelStyle">
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="right">
-					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-			
-			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
-		</div>
-		
-		<!-- 등록/수정 -->
-		<div class="panelStyle">
-			<form id="detailForm" name="detailForm" action="#" th:action="@{'/envset/answer/phase/save'}">
-				<input type="hidden" name="ansSq" value=""/>
-				<table class="frmStyle" aria-describedby="등록폼">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:20%;"/>
-						<col style="width:10%;"/>
-						<col style="width:20%;"/>
-						<col style="width:10%;"/>
-						<col style="width:20%;"/>
-						<col/>
-					</colgroup>
-					<tr>
-						<th>사이트<em class="required" title="필수"></em></th>
-						<td>
-							<select name="siteCd" required="required" data-valid-name="사이트">
-								<option>[전체]</option>
-								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>답변종류<em class="required" title="필수"></em></th>
-						<td>
-							<select name="ansClsf" required="required" data-valid-name="답변종류">
-								<option value="">[선택]</option>
-								<option th:if="${ansClsfList}" th:each="oneData, status : ${ansClsfList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>사용여부</th>
-						<td>
-							<input type="hidden" name="useYn" value="Y"/>
-							<label class="chkBox"><input type="checkbox" name="chkUseYn" checked="checked"/>사용</label>
-						</td>
-					</tr>
-					<tr>
-						<th>답변제목<em class="required" title="필수"></em></th>
-						<td colspan="5">
-							<input type="text" name="ansTitle" required="required" data-valid-name="답변제목"/>
-						</td>
-						
-					</tr>
-					<tr>
-						<th>답변내용<em class="required" title="필수"></em></th>
-						<td colspan="5">
-							<textarea name="ansContent" class="textareaR3" required="required"  data-valid-name="답변내용"></textarea>
-						</td>
-					</tr>
-				</table>
-			</form>
-			
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="right">
-					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
-					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-		</div>
-		<!-- 등록/수정 -->
-	</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	var siteList = gagajf.convertToArray([[${siteList}]]);
-	var ansClsfList = gagajf.convertToArray([[${ansClsfList}]]);
-
-	var columnDefs = [
-		{headerName: "답변번호", field: "ansSq", width: 100, cellClass: 'text-center'},
-		{
-			headerName: "사이트", field: "siteCd", width: 150, cellClass: 'text-center',
-			valueGetter: function (params) { return gagaAgGrid.lookupValue(siteList, params.data.siteCd); }
-		},
-		{
-			headerName: "답변종류", field: "ansClsf", width: 150, cellClass: 'text-center',
-			valueGetter: function (params) { return gagaAgGrid.lookupValue(ansClsfList, params.data.ansClsf); }
-		},
-		{
-			headerName: "답변제목", field: "ansTitle", width: 350,
-			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
-		},
-		{headerName: "사용여부", field: "useYn", width: 80, cellClass: 'text-center'},
-		{headerName: "등록자", field: "regNm", width: 150, cellClass: 'text-center'},
-		{
-			headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
-			cellRenderer: function(params) { return gagaAgGrid.toDateTimeFormat(params.value); }
-		},
-		{headerName: "수정자", field: "updNm", width: 100, cellClass: 'text-center'},
-		{
-			headerName: "수정일시", field: "updDt", width: 150, cellClass: 'text-center',
-			cellRenderer: function(params) { return gagaAgGrid.toDateTimeFormat(params.value); }
-		}
-	];
-
-	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
-
-	// 셀 클릭 이벤트
-	gridOptions.onCellClicked = function(event) {
-		if (event.colDef.field != 'ansTitle')
-			return;
-		
-		$('#detailForm input[name=ansSq]').val(event.data.ansSq); // 답변일련번호
-		$('#detailForm select[name=siteCd]').val(event.data.siteCd); // 사이트
-		$('#detailForm select[name=ansClsf]').val(event.data.ansClsf); // 답변종류
-
-		if (event.data.useYn == 'Y') {
-			$("#detailForm input:checkbox[name=chkUseYn]").prop('checked', true);
-		} else {
-			$("#detailForm input:checkbox[name=chkUseYn]").prop('checked', false);
-		}
-		
-		$('#detailForm input[name=ansTitle]').val(event.data.ansTitle.replaceAll('&gt;','>')); // 답변제목
-		$('#detailForm textarea[name=ansContent]').val(event.data.ansContent); // 답변내용
-	}
-
-	// 검색
-	$('#btnSearch').on('click', function() {
-		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
-	});
-	
-	// 신규
-	$('#btnNew').on('click', function() {
-		$('#detailForm')[0].reset();
-		$('#detailForm input[name=ansSq]').val('');
-		$('#detailForm input[name=ansTitle]').focus();
-	});
-
-	// 저장/수정
-	$("#btnSave").on("click", function() {
-		// 필수값 체크
-		if (!gagajf.validation('#detailForm'))
-			return false;
-
-		mcxDialog.confirm('저장하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				$('#detailForm input[name=useYn]').val($('#detailForm input:checkbox[name=chkUseYn]').is(':checked') ? 'Y' : 'N');
-				
-				gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {
-					$('btnNew').click();
-					$('#btnSearch').trigger('click');
-				});
-				
-				gagajf.ajaxJsonSubmit($(formId).prop("action"), jsonData, fnSaveCallback);
-			}
-		});
-	});
-
-	// 엑셀다운로드
-	$('#btnExcel').on('click', function() {
-		gagaAgGrid.exportToExcel('답변문구 목록', gridOptions);
-	});
-	
-	$(document).ready(function() {
-		gagaAgGrid.createGrid('gridList', gridOptions);
-	});
-/*]]>*/
-</script>
-
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+	<!--
+ *******************************************************************************
+ * @source  : AnswerPhaseForm.html
+ * @desc    : 답변문구관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.29   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/envset/answer/phase/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>사이트</th>
+						<td>
+							<select name="siteCd">
+								<option value="">[전체]</option>
+								<option th:if="${siteList}" th:each="oneData, status : ${siteList}"th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>답변종류</th>
+						<td>
+							<select name="ansClsf">
+								<option value="">[전체]</option>
+								<option th:if="${ansClsfList}" th:each="oneData, status : ${ansClsfList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>답변제목</th>
+						<td>
+							<input type="text" name="ansTitle" class="w200"/>
+						</td>
+						<th>사용여부</th>
+						<td>
+							<select name="useYn">
+								<option value="">[전체]</option>
+								<option value="Y">[Y] Yes</option>
+								<option value="N">[N] No</option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+		
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+			
+			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+		</div>
+		
+		<!-- 등록/수정 -->
+		<div class="panelStyle">
+			<form id="detailForm" name="detailForm" action="#" th:action="@{'/envset/answer/phase/save'}">
+				<input type="hidden" name="ansSq" value=""/>
+				<table class="frmStyle" aria-describedby="등록폼">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>사이트<em class="required" title="필수"></em></th>
+						<td>
+							<select name="siteCd" required="required" data-valid-name="사이트">
+								<option>[선택]</option>
+								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>답변종류<em class="required" title="필수"></em></th>
+						<td>
+							<select name="ansClsf" required="required" data-valid-name="답변종류">
+								<option value="">[선택]</option>
+								<option th:if="${ansClsfList}" th:each="oneData, status : ${ansClsfList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>사용여부</th>
+						<td>
+							<input type="hidden" name="useYn" value="Y"/>
+							<label class="chkBox checked"><input type="checkbox" name="chkUseYn" checked="checked"/>사용</label>
+						</td>
+					</tr>
+					<tr>
+						<th>답변제목<em class="required" title="필수"></em></th>
+						<td colspan="5">
+							<input type="text" name="ansTitle" maxlength="100" required="required" data-valid-name="답변제목"/>
+						</td>
+						
+					</tr>
+					<tr>
+						<th>답변내용<em class="required" title="필수"></em></th>
+						<td colspan="5">
+							<textarea name="ansContent" class="textareaR3" required="required"  data-valid-name="답변내용"></textarea>
+						</td>
+					</tr>
+				</table>
+			</form>
+			
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
+					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+		</div>
+		<!-- 등록/수정 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var siteList = gagajf.convertToArray([[${siteList}]]);
+	var ansClsfList = gagajf.convertToArray([[${ansClsfList}]]);
+
+	var columnDefs = [
+		{headerName: "답변번호", field: "ansSq", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "사이트", field: "siteCd", width: 150, cellClass: 'text-center',
+			valueGetter: function (params) { return gagaAgGrid.lookupValue(siteList, params.data.siteCd); }
+		},
+		{
+			headerName: "답변종류", field: "ansClsf", width: 150, cellClass: 'text-center',
+			valueGetter: function (params) { return gagaAgGrid.lookupValue(ansClsfList, params.data.ansClsf); }
+		},
+		{
+			headerName: "답변제목", field: "ansTitle", width: 350,
+			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
+		{headerName: "사용여부", field: "useYn", width: 80, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regNm", width: 150, cellClass: 'text-center'},
+		{
+			headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{headerName: "수정자", field: "updNm", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "수정일시", field: "updDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		}
+	];
+
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 셀 클릭 이벤트
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field != 'ansTitle')
+			return;
+		
+		$('#detailForm input[name=ansSq]').val(event.data.ansSq); // 답변일련번호
+		$('#detailForm select[name=siteCd]').val(event.data.siteCd); // 사이트
+		$('#detailForm select[name=ansClsf]').val(event.data.ansClsf); // 답변종류
+
+		if (event.data.useYn == 'Y') {
+			$("#detailForm input:checkbox[name=chkUseYn]").prop('checked', true);
+			$("#detailForm input:checkbox[name=chkUseYn]").parent().addClass('checked');
+		} else {
+			$("#detailForm input:checkbox[name=chkUseYn]").prop('checked', false);
+			$("#detailForm input:checkbox[name=chkUseYn]").parent().removeClass('checked');
+		}
+		
+		$('#detailForm input[name=ansTitle]').val(event.data.ansTitle.replaceAll('&gt;','>')); // 답변제목
+		$('#detailForm textarea[name=ansContent]').val(event.data.ansContent); // 답변내용
+	}
+
+	// 검색
+	$('#btnSearch').on('click', function() {
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+	
+	// 신규
+	$('#btnNew').on('click', function() {
+		$('#detailForm')[0].reset();
+		$('#detailForm input[name=ansSq]').val('');
+		$('#detailForm input[name=ansTitle]').focus();
+	});
+
+	// 저장/수정
+	$("#btnSave").on("click", function() {
+		// 필수값 체크
+		if (!gagajf.validation('#detailForm'))
+			return false;
+
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				$('#detailForm input[name=useYn]').val($('#detailForm input:checkbox[name=chkUseYn]').is(':checked') ? 'Y' : 'N');
+				
+				gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {
+					$('btnNew').click();
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('답변문구 목록', gridOptions);
+	});
+	
+	$(document).ready(function() {
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
 </html>

+ 379 - 379
style24.admin/src/main/webapp/WEB-INF/views/envset/BasicEnvsetForm.html

@@ -1,379 +1,379 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : BasicEnvsetForm.html
- * @desc    : 기본환경설정 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.21   gagamel     최초 작성
- *******************************************************************************
- -->
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-		
-		<!-- 메뉴 설명 -->
-		<div class="infoBox menu-desc">
-		</div>
-		<!-- //메뉴 설명 -->
-		
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle">
-			<table class="frmStyle" aria-describedby="검색조건">
-				<colgroup>
-					<col style="width:10%;"/>
-					<col/>
-				</colgroup>
-				<tr>
-					<th>사이트</th>
-					<td>
-						<select name="siteCd" class="w150" onchange="fnSearch();">
-							<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-						</select>
-					</td>
-				</tr>
-			</table>
-		</div>
-		<!-- 검색조건 영역 -->
-
-		<div class="panelStyle">
-			<h4>[B10] 쇼핑몰Meta정보</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B10');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B10', '쇼핑몰Meta정보');">이력보기</button>
-			
-			<table class="frmStyle" aria-describedby="쇼핑몰Meta정보">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>웹브라우저Title</th>
-						<td>
-							<input name="b10StrSetVal1" type="text" class="w500" maxlength="200"/>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>웹 브라우저 상단에 노출되는 사이트 소개 문구입니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>쇼핑몰Title(og:title)</th>
-						<td>
-							<input name="b10StrSetVal2" type="text" class="w500" maxlength="200"/>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>오픈그래프 Title입니다. 영문/한글/숫자만 입력하세요.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>쇼핑몰설명(og:description)</th>
-						<td>
-							<input name="b10StrSetVal3" type="text" class="w500" maxlength="200"/>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>오픈그래프 Description입니다. 200자 이내의 영문/한글/숫자만 입력하세요.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>쇼핑몰이미지(og:image)</th>
-						<td>
-							<div class="uFile w500">
-								<input type="file" id="b10StrSetVal4" name="b10StrSetVal4" class="uFileInput"/>
-								<label for="b10StrSetVal4" class="uFileLabel">쇼핑몰이미지 선택</label>
-								<input type="hidden" name="b10StrSetVal4OrgFileNm"/>
-								<input type="hidden" name="b10StrSetVal4SysFileNm"/>
-							</div>
-							<a id="b10StrSetVal4FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b10StrSetVal4');"></a>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>오픈그래프 Image입니다</span>
-						</td>
-					</tr>
-					<tr>
-						<th>키워드(Keywords)</th>
-						<td>
-							<input name="b10StrSetVal5" type="text" class="w500" maxlength="70"/>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>70자 이내로 작성하시고 같은 단어는 3회 이상 반복하시면 안 됩니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>파비콘이미지</th>
-						<td>
-							<div class="uFile w500">
-								<input type="file" id="b10StrSetVal6" name="b10StrSetVal6" class="uFileInput"/>
-								<label for="b10StrSetVal6" class="uFileLabel">파비콘이미지 선택</label>
-								<input type="hidden" name="b10StrSetVal6OrgFileNm"/>
-								<input type="hidden" name="b10StrSetVal6SysFileNm"/>
-							</div>
-							<a id="b10StrSetVal6FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b10StrSetVal6');"></a>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>16x16 사이즈의 아이콘 이미지(확장자:ico)</span>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-			
-			<h4>[B11] 기본설정</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B11');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B11', '기본설정');">이력보기</button>
-			<table class="frmStyle" aria-describedby="기본설정">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>탈퇴후재가입불가기간(일)</th>
-						<td><input name="b11StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="탈퇴후재가입불가기간"/><span class="cRed">개월</span> 동안 탈퇴 후 재가입 불가합니다.</td>
-					</tr>
-					<tr>
-						<th>휴면회원선정기간(일)</th>
-						<td><input name="b11StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="휴면회원선정기간"/><span class="cRed">일</span> 동안 사이트에 로그인 하지 않은 회원을 휴면회원으로 선정합니다.</td>
-					</tr>
-					<tr>
-						<th>휴면회원전환기간(일)</th>
-						<td><input name="b11StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="휴면회원전환기간"/><span class="cRed">일</span> 동안 사이트에 로그인 하지 않은 회원을 휴면회원으로 전환합니다.</td>
-					</tr>
-					<tr>
-						<th>회원등급산정기간</th>
-						<td>직전월 이전 <input name="b11StrSetVal4" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="회원등급산정기간"/><span class="cRed">개월</span> 기간동안의 매출금액을 기준으로 월초에 산정합니다. <span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>0으로 설정하면 회원별등급산정을 하지 않습니다.</span></td>
-					</tr>
-					<tr>
-						<th>무료배송비최소주문금액</th>
-						<td>최소주문금액이 <input name="b11StrSetVal5" type="text" class="w100 aR" maxlength="6" data-valid-type="integer" data-valid-name="무료배송비최소주문금액"/> 원 이상이면 배송비가 무료입니다. <span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>이 값은 기본값이며 공급업체별로 다르게 설정할 수도 있습니다.</span></td>
-					</tr>
-				</tbody>
-			</table>
-			
-			<h4>[G10] 상품노출</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('G10');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('G10', '상품노출');">이력보기</button>
-			<table class="frmStyle" aria-describedby="상품노출">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>상품평노출여부</th>
-						<td>
-							<label class="rdoBtn"><input type="radio" name="g10StrSetVal1" value="Y" checked="checked"/>노출</label>
-							<label class="rdoBtn"><input type="radio" name="g10StrSetVal1" value="N">미노출</label>
-							<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>미노출로 설정 시 상품상세의 상품평 영역이 노출되지 않습니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>품절상품노출여부</th>
-						<td>
-							<label class="rdoBtn"><input type="radio" name="g10StrSetVal2" value="Y"/>노출</label>
-							<label class="rdoBtn"><input type="radio" name="g10StrSetVal2" value="N" checked="checked">미노출</label>
-							<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>품절된 상품을 사이트에 노출할지 말지를 설정합니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>특가세일노출기준</th>
-						<td>
-							상품 썸네일 리스트의 가격은 할인율이 <input name="g10StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name=""/><span class="cRed">%</span> 이상일 경우 TAG가와 할인율 대신 <span class="infoTxt cBlue">'특가세일'</span>로 표기됩니다.
-						</td>
-					</tr>
-				</tbody>
-			</table>
-
-			<h4>[G11] 상품보관</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('G11');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('G11', '상품보관');">이력보기</button>
-			<table class="frmStyle" aria-describedby="상품보관">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>장바구니보관기간(일)</th>
-						<td>
-							장바구니 보관기간은 <input name="g11StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="장바구니보관기간"/><span class="cRed">일</span> 입니다. 보관기간 경과 시 자동 삭제됩니다.
-							<span class="infoTxt cBlue"><i class="fa fa-info-circle marL20" aria-hidden="true"></i>0으로 설정하면 자동으로 삭제 처리를 하지 않습니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>장바구니담기최대상품수</th>
-						<td>
-							장바구니에 담을 수 있는 최대 상품 개수는 <input name="g11StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="장바구니보관기간"/><span class="cRed">개</span> 입니다.
-						</td>
-					</tr>
-					<tr>
-						<th>위시리스트보관기간(일)</th>
-						<td>
-							위시리스트 보관기간은 <input name="g11StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="위시리스트보관기간"/><span class="cRed">일</span> 입니다. 보관기간 경과 시 자동 삭제됩니다.
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>0으로 설정하면 자동으로 삭제 처리를 하지 않습니다.</span>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-		</div>
-	</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	// 조회
-	var fnSearch = function() {
-		var siteCd = $('select[name=siteCd]').val();
-		var actionUrl = '/envset/' + siteCd;
-
-		// 쇼핑몰Meta정보
-		$.getJSON(actionUrl + '/B10'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$('input[name=b10StrSetVal1]').val(result.strSetVal1);
-							$('input[name=b10StrSetVal2]').val(result.strSetVal2);
-							$('input[name=b10StrSetVal3]').val(result.strSetVal3);
-							
-							if (!gagajf.isNull(result.strSetVal4)) {
-								$('input[name=b10StrSetVal4SysFileNm]').val(result.strSetVal4);
-								$('#b10StrSetVal4FileDownload').html(result.strSetVal4);
-								$('#b10StrSetVal4FileDownload').show();
-							}
-							
-							$('input[name=b10StrSetVal5]').val(result.strSetVal5);
-							
-							if (!gagajf.isNull(result.strSetVal6)) {
-								$('input[name=b10StrSetVal6SysFileNm]').val(result.strSetVal6);
-								$('#b10StrSetVal6FileDownload').html(result.strSetVal6);
-								$('#b10StrSetVal6FileDownload').show();
-							}
-						}
-					}
-				});
-
-		// 기본설정
-		$.getJSON(actionUrl + '/B11'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$('input[name=b11StrSetVal1]').val(result.strSetVal1);
-							$('input[name=b11StrSetVal2]').val(result.strSetVal2);
-							$('input[name=b11StrSetVal3]').val(result.strSetVal3);
-							$('input[name=b11StrSetVal4]').val(result.strSetVal4);
-							$('input[name=b11StrSetVal5]').val(gagajf.isNull(result.strSetVal5) ? result.strSetVal5 : result.strSetVal5.addComma());
-						}
-					}
-				});
-		
-		// 상품노출
-		$.getJSON(actionUrl + '/G10'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$("input:radio[name=g10StrSetVal1]").parents('td').find('label').removeClass('checked');
-							if (result.strSetVal1 == 'Y') {
-								$("input:radio[name=g10StrSetVal1]").eq(0).prop('checked', true);
-							} else {
-								$("input:radio[name=g10StrSetVal1]").eq(1).prop('checked', true);
-							}
-
-							$("input:radio[name=g10StrSetVal2]").parents('td').find('label').removeClass('checked');
-							if (result.strSetVal2 == 'Y') {
-								$("input:radio[name=g10StrSetVal2]").eq(0).prop('checked', true);
-							} else {
-								$("input:radio[name=g10StrSetVal2]").eq(1).prop('checked', true);
-							}
-							
-							$('input[name=g10StrSetVal3]').val(result.strSetVal3);
-						}
-					}
-				});
-
-		// 상품보관
-		$.getJSON(actionUrl + '/G11'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$('input[name=g11StrSetVal1]').val(result.strSetVal1);
-							$('input[name=g11StrSetVal2]').val(result.strSetVal2);
-							$('input[name=g11StrSetVal3]').val(result.strSetVal3);
-						}
-					}
-				});
-	}
-
-	// 파일첨부 선택 시
-	$('#b10StrSetVal4').on('change', function() { fnChooseFile(this); });
-	$('#b10StrSetVal6').on('change', function() { fnChooseFile(this); });
-
-	var fnChooseFile = function(obj) {
-		// multiple 속성이 있으면 files에는 다수의 객체가 할당됨
-		var file = obj.files[0];
-
-		// 파일 업로드
-		gagajf.ajaxFileUpload('/common/file/upload?subDir=/envset'
-				, file
-				, function(result) {
-					// 업로드한 파일명 설정
-					$('input[name=' + obj.name + 'OrgFileNm]').val(result.oldFileName);
-					$('input[name=' + obj.name + 'SysFileNm]').val(result.newFileName);
-				}
-		);
-	}
-
-	// 파일다운로드
-	var fnDownloadFile = function(id) {
-		$('#' + id + 'FileDownload').attr({
-			href : _uploadDefaultUrl + '/envset/' + $('input[name=' + id + 'SysFileNm]').val(),
-			target: '_blank'
-		}).get(0).click();
-	}
-
-	// 저장 처리
-	var fnSave = function(envsetType) {
-		var params = new Object();
-		params.siteCd = $('select[name=siteCd]').val();
-		params.envsetType = envsetType;
-
-		if (envsetType == 'B10') { // 쇼핑몰Meta정보
-			params.envsetNm = '쇼핑몰Meta정보';
-			params.strSetVal1 = $('input[name=b10StrSetVal1]').val();
-			params.strSetVal2 = $('input[name=b10StrSetVal2]').val();
-			params.strSetVal3 = $('input[name=b10StrSetVal3]').val();
-			params.strSetVal4 = $('input[name=b10StrSetVal4SysFileNm]').val();
-			params.strSetVal5 = $('input[name=b10StrSetVal5]').val();
-			params.strSetVal6 = $('input[name=b10StrSetVal6SysFileNm]').val();
-		} else if (envsetType == 'B11') { // 기본설정
-			params.envsetNm = '기본설정';
-			params.strSetVal1 = $('input[name=b11StrSetVal1]').val();
-			params.strSetVal2 = $('input[name=b11StrSetVal2]').val();
-			params.strSetVal3 = $('input[name=b11StrSetVal3]').val();
-			params.strSetVal4 = $('input[name=b11StrSetVal4]').val();
-			params.strSetVal5 = $('input[name=b11StrSetVal5]').val().removeComma();
-			params.strSetVal6 = $('input[name=b10StrSetVal6SysFileNm]').val();
-		} else if (envsetType == 'G10') { // 상품노출
-			params.envsetNm = '상품노출';
-			params.strSetVal1 = $('input:radio[name=g10StrSetVal1]:checked').val();
-			params.strSetVal2 = $('input:radio[name=g10StrSetVal2]:checked').val();
-			params.strSetVal3 = $('input[name=g10StrSetVal1]').val();
-		} else if (envsetType == 'G11') { // 상품보관
-			params.envsetNm = '상품보관';
-			params.strSetVal1 = $('input[name=g11StrSetVal1]').val();
-			params.strSetVal2 = $('input[name=g11StrSetVal2]').val();
-			params.strSetVal3 = $('input[name=g11StrSetVal3]').val();
-		}
-
-		var jsonData = JSON.stringify(params);
-		gagajf.ajaxJsonSubmit('/envset/create', jsonData);
-	}
-
-	// 환경설정 이력보기 팝업
-	var fnOpenEnvsetPopup = function(envsetType, envsetTypeNm) {
-		var actionUrl = '/envset/history/form'
-				+ '?siteCd=' + $('select[name=siteCd]').val()
-				+ '&envsetType=' + envsetType
-				+ '&envsetTypeNm=' + encodeURIComponent(envsetTypeNm);
-		cfnOpenModalPopup(actionUrl, 'popupEnvset');
-	}
-	
-	$(document).ready(function() {
-		$('select[name=siteCd]').trigger('change');
-	});
-/*]]>*/
-</script>
-
-</html>
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : BasicEnvsetForm.html
+ * @desc    : 기본환경설정 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.21   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<table class="frmStyle" aria-describedby="검색조건">
+				<colgroup>
+					<col style="width:10%;"/>
+					<col/>
+				</colgroup>
+				<tr>
+					<th>사이트</th>
+					<td>
+						<select name="siteCd" class="w150" onchange="fnSearch();">
+							<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+						</select>
+					</td>
+				</tr>
+			</table>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<div class="panelStyle">
+			<h4>[B10] 쇼핑몰Meta정보</h4>
+			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B10');">저장</button>
+			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B10', '쇼핑몰Meta정보');">이력보기</button>
+			
+			<table class="frmStyle" aria-describedby="쇼핑몰Meta정보">
+				<colgroup>
+					<col style="width: 15%;"/>
+					<col/>
+				</colgroup>
+				<tbody>
+					<tr>
+						<th>웹브라우저Title</th>
+						<td>
+							<input name="b10StrSetVal1" type="text" class="w500" maxlength="200"/>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>웹 브라우저 상단에 노출되는 사이트 소개 문구입니다.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>쇼핑몰Title(og:title)</th>
+						<td>
+							<input name="b10StrSetVal2" type="text" class="w500" maxlength="200"/>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>오픈그래프 Title입니다. 영문/한글/숫자만 입력하세요.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>쇼핑몰설명(og:description)</th>
+						<td>
+							<input name="b10StrSetVal3" type="text" class="w500" maxlength="200"/>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>오픈그래프 Description입니다. 200자 이내의 영문/한글/숫자만 입력하세요.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>쇼핑몰이미지(og:image)</th>
+						<td>
+							<div class="uFile w500">
+								<input type="file" id="b10StrSetVal4" name="b10StrSetVal4" class="uFileInput"/>
+								<label for="b10StrSetVal4" class="uFileLabel">쇼핑몰이미지 선택</label>
+								<input type="hidden" name="b10StrSetVal4OrgFileNm"/>
+								<input type="hidden" name="b10StrSetVal4SysFileNm"/>
+							</div>
+							<a id="b10StrSetVal4FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b10StrSetVal4');"></a>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>오픈그래프 Image입니다</span>
+						</td>
+					</tr>
+					<tr>
+						<th>키워드(Keywords)</th>
+						<td>
+							<input name="b10StrSetVal5" type="text" class="w500" maxlength="70"/>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>70자 이내로 작성하시고 같은 단어는 3회 이상 반복하시면 안 됩니다.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>파비콘이미지</th>
+						<td>
+							<div class="uFile w500">
+								<input type="file" id="b10StrSetVal6" name="b10StrSetVal6" class="uFileInput"/>
+								<label for="b10StrSetVal6" class="uFileLabel">파비콘이미지 선택</label>
+								<input type="hidden" name="b10StrSetVal6OrgFileNm"/>
+								<input type="hidden" name="b10StrSetVal6SysFileNm"/>
+							</div>
+							<a id="b10StrSetVal6FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b10StrSetVal6');"></a>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>16x16 사이즈의 아이콘 이미지(확장자:ico)</span>
+						</td>
+					</tr>
+				</tbody>
+			</table>
+			
+			<h4>[B11] 기본설정</h4>
+			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B11');">저장</button>
+			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B11', '기본설정');">이력보기</button>
+			<table class="frmStyle" aria-describedby="기본설정">
+				<colgroup>
+					<col style="width: 15%;"/>
+					<col/>
+				</colgroup>
+				<tbody>
+					<tr>
+						<th>탈퇴후재가입불가기간(일)</th>
+						<td><input name="b11StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="탈퇴후재가입불가기간"/><span class="cRed">개월</span> 동안 탈퇴 후 재가입 불가합니다.</td>
+					</tr>
+					<tr>
+						<th>휴면회원선정기간(일)</th>
+						<td><input name="b11StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="휴면회원선정기간"/><span class="cRed">일</span> 동안 사이트에 로그인 하지 않은 회원을 휴면회원으로 선정합니다.</td>
+					</tr>
+					<tr>
+						<th>휴면회원전환기간(일)</th>
+						<td><input name="b11StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="휴면회원전환기간"/><span class="cRed">일</span> 동안 사이트에 로그인 하지 않은 회원을 휴면회원으로 전환합니다.</td>
+					</tr>
+					<tr>
+						<th>회원등급산정기간</th>
+						<td>직전월 이전 <input name="b11StrSetVal4" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="회원등급산정기간"/><span class="cRed">개월</span> 기간 동안의 구매금액(실결제금액)과 구매건수를 기준으로 월초에 산정합니다. <span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>자세한 사항은 "<span class="cRed">운영관리 > 환경설정 > 회원등급정책관리</span>" 화면을 참조해 주세요.</span></td>
+					</tr>
+					<tr>
+						<th>무료배송비최소주문금액</th>
+						<td>최소주문금액이 <input name="b11StrSetVal5" type="text" class="w100 aR" maxlength="6" data-valid-type="integer" data-valid-name="무료배송비최소주문금액"/> 원 이상이면 배송비가 무료입니다. <span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>이 값은 기본값이며 공급업체별로 다르게 설정할 수도 있습니다.</span></td>
+					</tr>
+				</tbody>
+			</table>
+			
+			<h4>[G10] 상품노출</h4>
+			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('G10');">저장</button>
+			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('G10', '상품노출');">이력보기</button>
+			<table class="frmStyle" aria-describedby="상품노출">
+				<colgroup>
+					<col style="width: 15%;"/>
+					<col style="width: 85%;"/>
+				</colgroup>
+				<tbody>
+					<tr>
+						<th>상품평노출여부</th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="g10StrSetVal1" value="Y" checked="checked"/>노출</label>
+							<label class="rdoBtn"><input type="radio" name="g10StrSetVal1" value="N">미노출</label>
+							<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>미노출로 설정 시 상품상세의 상품평 영역이 노출되지 않습니다.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>품절상품노출여부</th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="g10StrSetVal2" value="Y"/>노출</label>
+							<label class="rdoBtn"><input type="radio" name="g10StrSetVal2" value="N" checked="checked">미노출</label>
+							<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>품절된 상품을 사이트에 노출할지 말지를 설정합니다.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>특가세일노출기준</th>
+						<td>
+							상품 썸네일 리스트의 가격은 할인율이 <input name="g10StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name=""/><span class="cRed">%</span> 이상일 경우 TAG가와 할인율 대신 <span class="infoTxt cBlue">'특가세일'</span>로 표기됩니다.
+						</td>
+					</tr>
+				</tbody>
+			</table>
+
+			<h4>[G11] 상품보관</h4>
+			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('G11');">저장</button>
+			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('G11', '상품보관');">이력보기</button>
+			<table class="frmStyle" aria-describedby="상품보관">
+				<colgroup>
+					<col style="width: 15%;"/>
+					<col style="width: 85%;"/>
+				</colgroup>
+				<tbody>
+					<tr>
+						<th>장바구니보관기간(일)</th>
+						<td>
+							장바구니 보관기간은 <input name="g11StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="장바구니보관기간"/><span class="cRed">일</span> 입니다. 보관기간 경과 시 자동 삭제됩니다.
+							<span class="infoTxt cBlue"><i class="fa fa-info-circle marL20" aria-hidden="true"></i>0으로 설정하면 자동으로 삭제 처리를 하지 않습니다.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>장바구니담기최대상품수</th>
+						<td>
+							장바구니에 담을 수 있는 최대 상품 개수는 <input name="g11StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="장바구니보관기간"/><span class="cRed">개</span> 입니다.
+						</td>
+					</tr>
+					<tr>
+						<th>위시리스트보관기간(일)</th>
+						<td>
+							위시리스트 보관기간은 <input name="g11StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="위시리스트보관기간"/><span class="cRed">일</span> 입니다. 보관기간 경과 시 자동 삭제됩니다.
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>0으로 설정하면 자동으로 삭제 처리를 하지 않습니다.</span>
+						</td>
+					</tr>
+				</tbody>
+			</table>
+		</div>
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	// 조회
+	var fnSearch = function() {
+		var siteCd = $('select[name=siteCd]').val();
+		var actionUrl = '/envset/' + siteCd;
+
+		// 쇼핑몰Meta정보
+		$.getJSON(actionUrl + '/B10'
+				, function(result, status) {
+					if (status === 'success') {
+						if (!gagajf.isNull(result)) {
+							$('input[name=b10StrSetVal1]').val(result.strSetVal1);
+							$('input[name=b10StrSetVal2]').val(result.strSetVal2);
+							$('input[name=b10StrSetVal3]').val(result.strSetVal3);
+							
+							if (!gagajf.isNull(result.strSetVal4)) {
+								$('input[name=b10StrSetVal4SysFileNm]').val(result.strSetVal4);
+								$('#b10StrSetVal4FileDownload').html(result.strSetVal4);
+								$('#b10StrSetVal4FileDownload').show();
+							}
+							
+							$('input[name=b10StrSetVal5]').val(result.strSetVal5);
+							
+							if (!gagajf.isNull(result.strSetVal6)) {
+								$('input[name=b10StrSetVal6SysFileNm]').val(result.strSetVal6);
+								$('#b10StrSetVal6FileDownload').html(result.strSetVal6);
+								$('#b10StrSetVal6FileDownload').show();
+							}
+						}
+					}
+				});
+
+		// 기본설정
+		$.getJSON(actionUrl + '/B11'
+				, function(result, status) {
+					if (status === 'success') {
+						if (!gagajf.isNull(result)) {
+							$('input[name=b11StrSetVal1]').val(result.strSetVal1);
+							$('input[name=b11StrSetVal2]').val(result.strSetVal2);
+							$('input[name=b11StrSetVal3]').val(result.strSetVal3);
+							$('input[name=b11StrSetVal4]').val(result.strSetVal4);
+							$('input[name=b11StrSetVal5]').val(gagajf.isNull(result.strSetVal5) ? result.strSetVal5 : result.strSetVal5.addComma());
+						}
+					}
+				});
+		
+		// 상품노출
+		$.getJSON(actionUrl + '/G10'
+				, function(result, status) {
+					if (status === 'success') {
+						if (!gagajf.isNull(result)) {
+							$("input:radio[name=g10StrSetVal1]").parents('td').find('label').removeClass('checked');
+							if (result.strSetVal1 == 'Y') {
+								$("input:radio[name=g10StrSetVal1]").eq(0).prop('checked', true);
+							} else {
+								$("input:radio[name=g10StrSetVal1]").eq(1).prop('checked', true);
+							}
+
+							$("input:radio[name=g10StrSetVal2]").parents('td').find('label').removeClass('checked');
+							if (result.strSetVal2 == 'Y') {
+								$("input:radio[name=g10StrSetVal2]").eq(0).prop('checked', true);
+							} else {
+								$("input:radio[name=g10StrSetVal2]").eq(1).prop('checked', true);
+							}
+							
+							$('input[name=g10StrSetVal3]').val(result.strSetVal3);
+						}
+					}
+				});
+
+		// 상품보관
+		$.getJSON(actionUrl + '/G11'
+				, function(result, status) {
+					if (status === 'success') {
+						if (!gagajf.isNull(result)) {
+							$('input[name=g11StrSetVal1]').val(result.strSetVal1);
+							$('input[name=g11StrSetVal2]').val(result.strSetVal2);
+							$('input[name=g11StrSetVal3]').val(result.strSetVal3);
+						}
+					}
+				});
+	}
+
+	// 파일첨부 선택 시
+	$('#b10StrSetVal4').on('change', function() { fnChooseFile(this); });
+	$('#b10StrSetVal6').on('change', function() { fnChooseFile(this); });
+
+	var fnChooseFile = function(obj) {
+		// multiple 속성이 있으면 files에는 다수의 객체가 할당됨
+		var file = obj.files[0];
+
+		// 파일 업로드
+		gagajf.ajaxFileUpload('/common/file/upload?subDir=/envset'
+				, file
+				, function(result) {
+					// 업로드한 파일명 설정
+					$('input[name=' + obj.name + 'OrgFileNm]').val(result.oldFileName);
+					$('input[name=' + obj.name + 'SysFileNm]').val(result.newFileName);
+				}
+		);
+	}
+
+	// 파일다운로드
+	var fnDownloadFile = function(id) {
+		$('#' + id + 'FileDownload').attr({
+			href : _uploadDefaultUrl + '/envset/' + $('input[name=' + id + 'SysFileNm]').val(),
+			target: '_blank'
+		}).get(0).click();
+	}
+
+	// 저장 처리
+	var fnSave = function(envsetType) {
+		var params = new Object();
+		params.siteCd = $('select[name=siteCd]').val();
+		params.envsetType = envsetType;
+
+		if (envsetType == 'B10') { // 쇼핑몰Meta정보
+			params.envsetNm = '쇼핑몰Meta정보';
+			params.strSetVal1 = $('input[name=b10StrSetVal1]').val();
+			params.strSetVal2 = $('input[name=b10StrSetVal2]').val();
+			params.strSetVal3 = $('input[name=b10StrSetVal3]').val();
+			params.strSetVal4 = $('input[name=b10StrSetVal4SysFileNm]').val();
+			params.strSetVal5 = $('input[name=b10StrSetVal5]').val();
+			params.strSetVal6 = $('input[name=b10StrSetVal6SysFileNm]').val();
+		} else if (envsetType == 'B11') { // 기본설정
+			params.envsetNm = '기본설정';
+			params.strSetVal1 = $('input[name=b11StrSetVal1]').val();
+			params.strSetVal2 = $('input[name=b11StrSetVal2]').val();
+			params.strSetVal3 = $('input[name=b11StrSetVal3]').val();
+			params.strSetVal4 = $('input[name=b11StrSetVal4]').val();
+			params.strSetVal5 = $('input[name=b11StrSetVal5]').val().removeComma();
+			params.strSetVal6 = $('input[name=b10StrSetVal6SysFileNm]').val();
+		} else if (envsetType == 'G10') { // 상품노출
+			params.envsetNm = '상품노출';
+			params.strSetVal1 = $('input:radio[name=g10StrSetVal1]:checked').val();
+			params.strSetVal2 = $('input:radio[name=g10StrSetVal2]:checked').val();
+			params.strSetVal3 = $('input[name=g10StrSetVal1]').val();
+		} else if (envsetType == 'G11') { // 상품보관
+			params.envsetNm = '상품보관';
+			params.strSetVal1 = $('input[name=g11StrSetVal1]').val();
+			params.strSetVal2 = $('input[name=g11StrSetVal2]').val();
+			params.strSetVal3 = $('input[name=g11StrSetVal3]').val();
+		}
+
+		var jsonData = JSON.stringify(params);
+		gagajf.ajaxJsonSubmit('/envset/create', jsonData);
+	}
+
+	// 환경설정 이력보기 팝업
+	var fnOpenEnvsetPopup = function(envsetType, envsetTypeNm) {
+		var actionUrl = '/envset/history/form'
+				+ '?siteCd=' + $('select[name=siteCd]').val()
+				+ '&envsetType=' + envsetType
+				+ '&envsetTypeNm=' + encodeURIComponent(envsetTypeNm);
+		cfnOpenModalPopup(actionUrl, 'popupEnvset');
+	}
+	
+	$(document).ready(function() {
+		$('select[name=siteCd]').trigger('change');
+	});
+/*]]>*/
+</script>
+
+</html>

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

@@ -293,4 +293,5 @@
 /*]]>*/
 </script>
 
+>>>>>>> develop
 </html>

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsDealForm.html

@@ -6,7 +6,7 @@
  * @source  : goodsDealForm.html
  * @desc    : 딜상상품 구성 관리
  *============================================================================
- * SISUN
+ * STYLE24
  * Copyright(C) 2019 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

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

@@ -6,7 +6,7 @@
  * @source  : GoodsDetailForm.html
  * @desc    : 상품 상세 팝업
  *============================================================================
- * SISUNChDataYn
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsDetailSizeStockForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsSizeStockForm.html
  * @desc    : 상품 옵셥/재고 화면
  *============================================================================
- * SISUN
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsEpSkipForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsEpSkipForm.html
  * @desc    : 네이버EP제외상품관리
  *============================================================================
- * PASTEL
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsEpSkipPopupForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsEpSkipPopupForm.html
  * @desc    : 네이버 EP 제외 상품 예약 화면
  *============================================================================
- * PASTEL
+ * STYLE24
  * Copyright(C) 2019 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

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

@@ -6,7 +6,7 @@
  * @source  : GoodsFreeGoodsForm.html
  * @desc    : 사은품관리 Page
  *============================================================================
- * Pastelmall
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsImageForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsImageMassForm.html
  * @desc    : 상품 이미지 보기 화면(대량등록)
  *============================================================================
- * SISUN
+ * STYLE24
  * Copyright(C) 2019 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsItemkindForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsItemkindForm.html
  * @desc    : 품목변경관리 목록
  *============================================================================
- * Pastelmall
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsListForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsListForm.html
  * @desc    : 상품목록 Page
  *============================================================================
- * SISUN
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsMassRegisterForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsMassRegisterForm.html
  * @desc    : 대량상품등록
  *============================================================================
- * SISUN
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsNaverPriceForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsNaverPriceForm.html
  * @desc    : 네이버최저가 조회
  *============================================================================
- * Pastelmall
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsPopupListForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsPopupListForm.html
  * @desc    : 상품 조회 팝업
  *============================================================================
- * SISUN
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsPriceReserveForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsPriceReserveForm.html
  * @desc    : 상품 가격 예약관리
  *============================================================================
- * PASTEL
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsPriceReservePopupForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsPriceReservePopupForm.html
  * @desc    : 상품 가격 예약등록 화면
  *============================================================================
- * PASTEL
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsReinboundInformForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsReinboundInformForm.html
  * @desc    : 재입고알림관리
  *============================================================================
- * PASTEL
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsReserveSellForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsReserveSellForm.html
  * @desc    : 상품예약판매관리
  *============================================================================
- * PASTEL
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsReserveSellPopupForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsReserveSellPopupForm.html
  * @desc    : 상품예약판매 등록 화면
  *============================================================================
- * PASTEL
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsSetForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsSetForm.html
  * @desc    : 세트상품 구성 관리
  *============================================================================
- * SISUN
+ * STYLE24
  * Copyright(C) 2019 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsSupplyPriceForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsSupplyPriceForm.html
  * @desc    : 입점 상품 가격 승인  관리
  *============================================================================
- * SISUN
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsTitleReserveForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsTitleReserveForm.html
  * @desc    : 상품 타이틀 예약관리
  *============================================================================
- * PASTEL
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsTitleReservePopupForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsTitleReservePopupForm.html
  * @desc    : 상품등록 타이틀 예약등록 화면
  *============================================================================
- * PASTEL
+ * STYLE24
  * Copyright(C) 2019 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsVideoForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsVideoForm.html
  * @desc    : 상품동영상관리 Page
  *============================================================================
- * Pastelmall
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 33 - 2
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsWmsIncomelotForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsWmsIncomelotForm.html
  * @desc    : WMS입고상품관리 화면
  *============================================================================
- * SISUN
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION
@@ -72,6 +72,15 @@
 			<ul class="panelBar">
 				<li class="right">
 					<button type="button" class="btn btn-primary btn-lg"  id="btnCreateFreeGoods">사은품 등록</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>
 			<!-- 검색결과 영역 -->
@@ -151,6 +160,7 @@
 	
 	// 조회클릭시
 	$('#btnSearch').on('click', function() {
+		$("#goodsWmsIncomelotForm input[name=pageNo]").val('1');
 		fnGoodsWmsIncomelotListSearch('BASIC');
 	});
 
@@ -165,9 +175,30 @@
 		
 		if(!fnConditionCheck()) return;
 		
-		gagaAgGrid.fetch($('#goodsWmsIncomelotForm').prop('action'), gridOptions, '#goodsWmsIncomelotForm');
+		//gagaAgGrid.fetch($('#goodsWmsIncomelotForm').prop('action'), gridOptions, '#goodsWmsIncomelotForm');
+		
+		gagaPaging.init('goodsWmsIncomelotForm', fnSearchCallBack, 'goodsListPagination', $('#goodsWmsIncomelotForm').find('#pageSize').val());
+		gagaPaging.load($("#goodsWmsIncomelotForm input[name=pageNo]").val());
 	}
 
+	var fnSearchCallBack = function(result){
+
+		$('#goodsWmsIncomelotForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
+		$('#goodsWmsIncomelotForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
+		$('#goodsWmsIncomelotForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
+		$('#goodsWmsIncomelotForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
+		gridOptions.api.setRowData(result.goodsList);
+		gagaPaging.createPagination(result.pageing.pageable);
+		
+	}
+	
+	//페이징
+	$('#goodsWmsIncomelotForm select[name=pageSize]').on('change', function() {
+		$("#goodsWmsIncomelotForm input[name=pageNo]").val('1');
+		fnGoodsWmsIncomelotListSearch($("#goodsWmsIncomelotForm input[name=searchGb]").val());
+	});
+	
+	
 	//검색 조건 확인
 	var fnConditionCheck = function(){
 		var formId = '#goodsWmsIncomelotForm';

+ 211 - 0
style24.admin/src/main/webapp/WEB-INF/views/marketing/CouponRetrieveForm.html

@@ -0,0 +1,211 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CouponRetrieveForm.html
+ * @desc    : 쿠폰조회 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.08   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1200" id="popupCoupon">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong>쿠폰 조회</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupCoupon');"><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" th:value="${cpnNm}"/>
+							</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>
+		<!-- //CONTENT -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelContent">
+			<div id="gridCouponList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+		
+		<!-- 버튼 배치 영역 -->
+		<ul class="panelBar">
+			<li class="right">
+				<button type="button" class="btn btn-info btn-lg" id="btnConfirmCoupon">확인</button>
+			</li>
+		</ul>
+		<!-- //버튼 배치 영역 -->
+	</div>
+</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let returnCode = [[${returnCode}]];
+	let returnName = [[${returnName}]];
+
+	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: "pdGb", width: 100, cellClass: "text-center", hide: true,
+// 			cellRenderer: function(params) { return (params.value == 'P' ? '기간' : '일수'); }
+// 		},
+// 		{
+// 			headerName: "유효시작일시", field: "availStdt", width: 150, cellClass: "text-center", hide: true,
+// 			cellRenderer: function(params) { return !gagajf.isNull(params.value) ? gagaAgGrid.toDateTimeFormat(params.value) : ''; }
+// 		},
+// 		{
+// 			headerName: "유효종료일시", field: "availEddt", width: 150, cellClass: "text-center", hide: true,
+// 			cellRenderer: function(params) { return !gagajf.isNull(params.value) ? gagaAgGrid.toDateTimeFormat(params.value) : ''; }
+// 		},
+// 		{headerName: "유효일수", field: "availDays", width: 100, cellClass: "text-center", hide: true},
+		{
+			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);
+
+	// Row double click
+	gridOptionsCouponList.onRowDoubleClicked = function(event) {
+		$('#btnConfirmCoupon').trigger('click');
+	}
+
+	// 조회
+	$('#btnSearchCouponRetrieve').on('click', function() {
+		// Fetch data
+		gagaAgGrid.fetch($('#searchCouponForm').prop('action'), gridOptionsCouponList, '#searchCouponForm');
+	});
+	
+	// 부모창에 값을 설정
+	let fnSetCouponValueToOpener = function(rowData) {
+		$(returnCode).val(rowData.cpnId);
+		$(returnName).val(rowData.cpnNm);
+
+		uifnPopupClose('popupCoupon');
+	}
+	
+	// 확인
+	$('#btnConfirmCoupon').on('click', function() {
+		var selectedData = gagaAgGrid.selectedRowData(gridOptionsCouponList);
+		
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 쿠폰이 없습니다.');
+			return false;
+		}
+		
+		fnSetCouponValueToOpener(selectedData[0]);
+	});
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridCouponList', gridOptionsCouponList);
+		
+		$('#btnSearchCouponRetrieve').trigger('click');
+	});
+/*]]>*/
+</script>
+
+</html>

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

@@ -6,7 +6,7 @@
  * @source  : MorebetterListForm.html
  * @desc    : 다다익선 관리 페이지
  *============================================================================
- * SISUN
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION
@@ -21,8 +21,10 @@
 		<!-- //메인타이틀 영역 -->
 		
 		<!-- 메뉴 설명 -->
-		<!--<div class="infoBox menu-desc">
-		</div>-->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+
 		<form id="searchForm" name="searchForm" action="#" th:action="@{'/marketing/morebetter/list'}">
 			<input type="hidden" id="searchGb" name="searchGb" />
 			<input type="hidden" id="imageViewYn" name="imageViewYn" />
@@ -102,7 +104,11 @@
 /*<![CDATA[*/
 	var columnDefs = [];
 	columnDefs = [
-		{headerName: "프로모션ID", field: "tmtbSq", width: 80, cellClass: 'text-center'},
+		{headerName: "프로모션ID", field: "tmtbSq", width: 80, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return "<a href=\"javascript:void(0);\" onclick=\"cfnOpenMorebetterSetPopup('U','" + params.value + "');\">" + params.value + "</a>";
+			}
+		},
 		{headerName: "프로모션명", field: "tmtbNm", width: 200, cellClass: 'text-center'},
 		{headerName: "상태", field: "tmtbStat", width: 140, cellClass: 'text-center'},
 		{headerName: "시작일", field: "tmtbStdt", width: 140, cellClass: 'text-center'},
@@ -207,7 +213,7 @@
 
 	// 등록클릭시
 	$('#btnMorebetterReg').on('click', function() {
-		cfnOpenMorebetterSetPopup();
+		cfnOpenMorebetterSetPopup('N');
 	});
 
 

+ 887 - 676
style24.admin/src/main/webapp/WEB-INF/views/marketing/MorebetterRegForm.html

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

+ 226 - 37
style24.admin/src/main/webapp/WEB-INF/views/order/CancelRequestForm.html

@@ -5,7 +5,7 @@
  * @source  : CancelRequestForm.html
  * @desc    : 취소요청 화면
  *============================================================================
- * Pastelmall
+ * STYLE24
  * Copyright(C) 2019 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION
@@ -21,7 +21,7 @@
 		</div>
 			
 		<div class="panelContent" style="height:90%; overflow-y:auto; padding:0px 20px !important; ">
-			<form id="cancelRequestFrm" name="cancelRequestFrm" action="/order/cancel" method="post" target="hdFrameForOrderCancel">
+			<form id="cancelRequestFrm" name="cancelRequestFrm" action="/orderChange/cancel" method="post" target="hdFrameForOrderCancel">
 				<input type="hidden" name="ordNo" th:value="${ordNo}"/>
 				<input type="hidden" name="chgReason" value=""/>
 				<input type="hidden" name="chgReasonDesc" value=""/>
@@ -36,15 +36,6 @@
 				<div id="gridDelvCdList" style="width:100%; height: 140px;" class="ag-theme-balham"></div>
 				
 				<div style="text-align:right; padding-bottom:5px; padding-top:5px;">
-					<button type="button" class="btn btn-success" id="btnCancelRequestEscrow" onclick="fnCancelRequestEscrow();" style="display:none;">에스크로 결제생성</button>
-					<label th:if="${sessionInfo.userId == 'jsshin'
-									|| sessionInfo.userId == 'dlffyd7942'
-									|| sessionInfo.userId == 'card007'
-									|| sessionInfo.userId == 'hrkim'
-									|| sessionInfo.userId =='666badboy'
-									|| sessionInfo.userId =='yjyy83'}">
-						<input type="checkbox" name="pgStats" value="N">PG 전문 미전송
-					</label>
 					<button type="button" class="btn btn-success" id="btnCancelRequestPartOk" onclick="fnCancelRequestPartOk();">요청</button>
 				</div>
 				
@@ -119,6 +110,7 @@
 							<th>추가 배송 금액</th>
 							<td><span id="spanTotDeliveryFee"></span>원 </td>
 						</tr>
+						
 						<tr>
 							<th>환불 금액 합계</th>
 							<td colspan="3"><span id="spanRefundAmt"></span>원</td>
@@ -126,6 +118,12 @@
 					</tbody>
 				</table>
 				
+				<div id="wrapRefundAccount" style="width:50%;">
+					<h4>환불계좌정보</h4>
+					<button type="button" id="btnSaveAccount" class="btn btnRight btn-base btn-sm" style="margin-left:10px;" onclick="fnCreateOrderRfAccount();">등록</button>
+					<div id="gridRefundAccountInfo" style="height: 150px;" class="ag-theme-balham"></div>
+				</div>
+				
 			</form>
 		</div>
 	</div>
@@ -134,12 +132,15 @@
 <!-- data -->
 <script th:inline="javascript">
 /*<![CDATA[*/
-var cancelRequestTargetList = [[${cancelRequestTargetList}]];
+var cancelRequestTargetList = [[${cancelRequestTargetList}]];				// 취소대상목록
+var ordNo 					= [[${ordNo}]];									// 주문번호
+var orderInfoList 			= [[${orderInfoList}]];							// 주문기본정보
+var payMeans 				= orderInfoList[0].payMeans;					// 결제수단
 
 var temp1 = true;
 var temp2 = false;
 
-// specify the columns
+// 1. 주문정보(반품대상)
 var columnCancelReqList = [
 	{
 		headerName	: "주문상세정보",
@@ -159,8 +160,8 @@ var columnCancelReqList = [
 			{headerName: "단품번호"		, field: "ordDtlItemSq"		, width: 100	, cellClass: 'text-center', hide: temp2},
 			{headerName: "단품코드"		, field: "itemCd"			, width: 100	, cellClass: 'text-center', hide: temp2},
 			{headerName: "단품명"			, field: "itemNm"			, width: 200	, cellClass: 'text-center', hide: temp2},
-			{headerName: "칼라코드"		, field: "optCd1"			, width: 80		, cellClass: 'text-center', hide: temp1},
-			{headerName: "사이즈코드"		, field: "optCd2"			, width: 80		, cellClass: 'text-center', hide: temp2},
+			{headerName: "옵션1"			, field: "optCd1"			, width: 80		, cellClass: 'text-center', hide: temp1},
+			{headerName: "옵션2"			, field: "optCd2"			, width: 80		, cellClass: 'text-center', hide: temp2},
 			{
 				headerName		: "단품수량"		
 				, field			: "itemQty"			
@@ -379,17 +380,37 @@ var columnCancelReqList = [
 				}
 				, hide			: temp2
 			},
+			{
+				headerName		: "반품배송비"		
+				, field			: "rtnDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "교환배송비"		
+				, field			: "excDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
 			{headerName: "전체취소가능"		, field: "allCanYn"			, width: 100	, cellClass: 'text-center', hide: temp2},
 		]
 	}
 ];
 var gridOptionsCancelReqList = orderAgGrid.getGridOptions(columnCancelReqList);
+
 // Add on options
 gridOptionsCancelReqList.suppressRowClickSelection = true;
 gridOptionsCancelReqList.rowSelection = 'multiple';
 
-
-//specify the columns
+// 2. 취소정보(환불정보)
 var columnCancelReqToBeList = [
 	{
 		headerName	: "주문상세정보",
@@ -612,13 +633,33 @@ var columnCancelReqToBeList = [
 				}
 				, hide			: temp2
 			},
+			{
+				headerName		: "반품배송비"		
+				, field			: "rtnDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "교환배송비"		
+				, field			: "excDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
 			{headerName: "전체취소가능"		, field: "allCanYn"			, width: 100	, cellClass: 'text-center', hide: temp2},
 		]
 	}
 ];
 var gridOptionsCancelReqToBeList = orderAgGrid.getGridOptions(columnCancelReqToBeList);
 
-//specify the columns
+// 3. 배송비정보(환불정보)
 var columnDelvCdList = [
 	{
 		headerName	: "배송코드기준금액",
@@ -687,6 +728,26 @@ var columnDelvCdList = [
 				}
 				, hide			: temp2
 			},
+			{
+				headerName		: "반품배송비"		
+				, field			: "rtnDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "교환배송비"		
+				, field			: "excDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
 			{headerName: "추가배송비여부"		, field: "addDelvFeeYn"		, width: 140	, cellClass: 'text-center', hide: temp2},
 			{
 				headerName		: "추가배송비"		
@@ -703,6 +764,18 @@ var columnDelvCdList = [
 	}
 ];
 var gridOptionsDelvCdList = orderAgGrid.getGridOptions(columnDelvCdList);
+
+// 4. 무통장 계좌정보
+var columnDefsRefundAccountInfo = [
+	{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: false, checkboxSelection: true, filter: false},
+	{headerName: "은행명"		, field: "bankNm"		, width: 140	, cellClass: 'text-center'},
+	{headerName: "은행코드"	, field: "bankCd"		, width: 120	, cellClass: 'text-center', hidden:true},
+	{headerName: "계좌번호"	, field: "accountNo"	, width: 150	, cellClass: 'text-center'},
+	{headerName: "예금주"		, field: "accountNm"	, width: 120	, cellClass: 'text-center'},
+	{headerName: "기본"		, field: "defaultYn"	, width: 100	, cellClass: 'text-center'}
+];
+
+var gridOptionsRefundAccountInfo = orderAgGrid.getGridOptions(columnDefsRefundAccountInfo);
 </script>
 
 <!-- AgGrid 컬럼 세팅 -->
@@ -744,6 +817,9 @@ var orderAgGrid = {
 </script>
 
 <script>
+// 현재 사유는 고객 입니다.
+var isCustomer = true;
+
 // 취소정보계산
 var fnCalculateRefundAmt = function (obj) {
 	// 취소정보담은목록
@@ -762,10 +838,16 @@ var fnCalculateRefundAmt = function (obj) {
 		gridOptionsCancelReqList.api.setRowData(cancelRequestTargetList);
 	}
 	
+	if (cancelRequestTargetList.length == 0) {
+		alert("요청 대상정보가 존재 하지 않습니다.");
+		uifnPopupClose('popupCancelRequestForm');
+		return false;
+	}
+	
 	// 환불금액계산호출
 	var jsonData = JSON.stringify(cancelRequestTargetList);
 	gagajf.ajaxJsonSubmit(
-		'/order/cancel/refundAmt'
+		'/orderChange/cancel/refundAmt'
 		, jsonData
 		, function(result) {
 			gridOptionsCancelReqToBeList.api.setRowData(result.cancelOrderRefundList);
@@ -794,7 +876,19 @@ var fnCalculateRefundAmt = function (obj) {
 			$("#spanGfcdUseAmt").text(result.spanGfcdUseAmt.addComma());			//취소 고객 상품권 금액
 			
 			$("#spanRealCnclRtnAmt").text(result.spanRealCnclRtnAmt.addComma());	//취소 상품 실결제 금액
-			$("#spanTotDeliveryFee").text(result.spanTotDeliveryFee.addComma());	//환불 배송 금액
+			$("#spanTotDeliveryFee").text(result.spanTotDeliveryFee.addComma());	//취소 환불 배송 금액
+			
+			$("#spanTotRtnDelvFee").text(result.spanTotRtnDelvFee.addComma());		//반품 환불 배송 금액
+			$("#spanTotExcDelvFee").text(result.spanTotExcDelvFee.addComma());		//교환 환불 배송 금액
+			
+			// 고객사유 : 환불금액계산 = (취소금액 + 배송비) - 추가배송비
+			if (isCustomer) {
+				result.spanRefundAmt = (result.spanRealCnclRtnAmt + result.sumDeliveryFee) - result.spanTotDeliveryFee;
+			} 
+			// 회사사유 : 환불금액계산 = (취소금액 + 배송비)
+			else {
+				result.spanRefundAmt = (result.spanRealCnclRtnAmt + result.sumDeliveryFee);
+			}
 			
 			$("#spanRefundAmt").text(result.spanRefundAmt.addComma());				//환불 금액 합계
 		}
@@ -808,41 +902,124 @@ var fnChangeChgReason = function(reasonCd){
 	// 취소, 반품, 교환 사유 판단
 	if (arrREasonCd[0] == 'G686_10') {
 		$("#imputeReason").text("고객");
-		isImputationCustomers = true;
+		isCustomer = true;
 	} else {
 		$("#imputeReason").text("회사");
-		isImputationCustomers = false;
+		isCustomer = false;
 	}
 
 	$('#cancelRequestFrm input[name=chgReason]').val(arrREasonCd[0]);
 	$('#cancelRequestFrm input[name=chgReasonDesc]').val(arrREasonCd[1]);
 
-	//fnCalculateRefundAmt();			//환불예정금액 계산.
+	fnCalculateRefundAmt();			//환불예정금액 계산.
 }
 
 // 취소요청
 var fnCancelRequestPartOk = function () {
-	var jsonObj = {
-		"ordNo"			: $('#cancelRequestFrm input[name=ordNo]').val()
-		,"chgReason" 	: $('#cancelRequestFrm input[name=chgReason]').val()
-		,"chgMemo"		: $('#chgMemo').val()
-		,"cancelReqList" : cancelRequestTargetList
+	
+	var temp 		= false;
+	var ordDtlStat	= cancelRequestTargetList[0].ordDtlStat; 
+	var allCanYn 	= "N";
+	
+	// 1. 취소수량 체크
+	for (i=0 ; i<cancelRequestTargetList.length ; i++) {		
+		if (cancelRequestTargetList[i].ordCanChgQty > 0) {
+			temp = true;
+		}
+	}
+	
+	if (temp == false) {
+		mcxDialog.alert('취소 할 수량을 입력하세요.');
+		return;
+	}
+	
+	// 2. 입금대기건 && 전체취소 체크
+	if (ordDtlStat == "G013_10" && $("#spanPayAmt").text() != $("#spanRefundAmt").text()) {
+		alert("입금대기건은 전체 취소만 가능합니다.");
+		return;
+	}
+	
+	// 2.1 전체취소 여부 적용
+	if (ordDtlStat == "G013_10" && $("#spanPayAmt").text() == $("#spanRefundAmt").text()) {
+		allCanYn = "Y";	
+	}
+	
+	// 3. 취소사유 체크
+	var chgReason = $("#cancelRequestFrm select[name=selectChgReason]").val();
+	
+	if (gagajf.isNull(chgReason)) {
+		mcxDialog.alert("취소사유를 입력하세요."); return ;
+	}
+	
+	// 4. 환불계좌 체크
+	var accountNo 	= "";
+	var accountNm 	= "";
+	var bankCd 		= "";
+	
+	if (payMeans == 'G014_20') {
+		var refundAccount = gridOptionsRefundAccountInfo.api.getSelectedRows();
+		
+		if (refundAccount.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		accountNo 	= refundAccount[0].accountNo;
+		accountNm 	= refundAccount[0].accountNm;
+		bankCd 		= refundAccount[0].bankCd;
 	}
 	
-	// 취소, 반품, 교환 신청 정보 목록
+	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
+	}
+
+	// 주문번호, 취소사유, 취소메모, (취소, 반품, 교환 신청 정보 목록), 환불계좌
 	var jsonData = JSON.stringify(jsonObj);
 	
-	gagajf.ajaxJsonSubmit(
-		'/order/cancel/'
-		, jsonData
-		, function() {
-			
+	mcxDialog.confirm('취소요청하시겠습니까?', {
+		cancelBtnText		: "취소",
+		sureBtnClick		: function(){
+			// 취소 실행
+			gagajf.ajaxJsonSubmit(
+				'/orderChange/cancel/'
+				, jsonData
+				, function() {
+					uifnPopupClose('popupOrderDetail');
+					fnReOpenOrderDetailPopup();
+					uifnPopupClose('popupCancelRequestForm');
+				}
+			);
 		}
-	);
+	});
 }
 
-$(document).ready(function() {	
-	// Create a agGrid
+// 환불계좌 등록
+var fnCreateOrderRfAccount = function () {	
+	var actionUrl = "/orderChange/refund/account/create/form?ordNo=" + ordNo ;
+	cfnOpenModalPopup(actionUrl, 'popupCreateRefundAccount');
+};
+
+// 환불계좌 정보
+var fnBindOrderRfAccountInfo = function () {
+	gagaAgGrid.fetch(
+		"/orderChange/refund/account/info/list?ordNo=" + ordNo
+		, gridOptionsRefundAccountInfo
+		, null
+		, function (result) {
+		}
+	)
+};
+
+$(document).ready(function() {
+	// 1. Create a agGrid
 	gagaAgGrid.createGrid('gridOrderCancelRequestList'		, gridOptionsCancelReqList);			// 주문정보
 	gridOptionsCancelReqList.api.setRowData(cancelRequestTargetList);
 	
@@ -850,8 +1027,20 @@ $(document).ready(function() {
 	
 	gagaAgGrid.createGrid('gridDelvCdList'					, gridOptionsDelvCdList);				// 배송비 정보
 	
+	gagaAgGrid.createGrid('gridRefundAccountInfo'			, gridOptionsRefundAccountInfo);		// 환불계좌정보
+	
 	// 취소정보계산
 	fnCalculateRefundAmt(null);
+	
+	// 그리드 숨김처리
+	if (payMeans !== 'G014_20') {
+		$('#wrapRefundAccount').addClass("off");
+	}
+	
+	if (payMeans === 'G014_20' && mallGb === 'G011_10' ) {
+		// 환불계좌정보
+		fnBindOrderRfAccountInfo();
+	}
 });
 </script>
 </html>

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/order/CancelRequestFormBack.html

@@ -5,7 +5,7 @@
  * @source  : CancelRequestForm.html
  * @desc    : 취소요청 화면
  *============================================================================
- * Pastelmall
+ * STYLE24
  * Copyright(C) 2019 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/order/OrderDetailChangeHst.html

@@ -5,7 +5,7 @@
  * @source  : OrderDetailChangeHst.html
  * @desc    : 주문상품상세이력 화면
  *============================================================================
- * Pastelmall
+ * STYLE24
  * Copyright(C) 2019 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/order/OrderDetailCouponHst.html

@@ -5,7 +5,7 @@
  * @source  : OrderDetailCouponHst.html
  * @desc    : 주문상품 상세 쿠폰 이력 화면
  *============================================================================
- * Pastelmall
+ * STYLE24
  * Copyright(C) 2019 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 427 - 414
style24.admin/src/main/webapp/WEB-INF/views/order/OrderDetailForm.html


+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/order/OrderDetailGiftcardHst.html

@@ -5,7 +5,7 @@
  * @source  : OrderDetailPointHst.html
  * @desc    : 주문상품 상세 상품권 이력 화면
  *============================================================================
- * Pastelmall
+ * STYLE24
  * Copyright(C) 2019 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/order/OrderDetailPointHst.html

@@ -5,7 +5,7 @@
  * @source  : OrderDetailPointHst.html
  * @desc    : 주문상품 상세 마일리지 이력 화면
  *============================================================================
- * Pastelmall
+ * STYLE24
  * Copyright(C) 2019 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/order/OrderDetailTmtbHst.html

@@ -5,7 +5,7 @@
  * @source  : OrderDetailPointHst.html
  * @desc    : 주문상품 상세 상품권 이력 화면
  *============================================================================
- * Pastelmall
+ * STYLE24
  * Copyright(C) 2019 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

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

@@ -5,7 +5,7 @@
  * @source  : OrderListForm.html
  * @desc    : 주문목록 Page
  *============================================================================
- * SISUN
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION
@@ -458,8 +458,8 @@ var columnDefsOrderList = [
 					}
 				}
 			},
-			{headerName: "색상"		, field: "optCd1"		, width: 60	, cellClass: 'text-center'	, sortable: true},
-			{headerName: "사이즈"		, field: "optCd2"		, width: 60		, cellClass: 'text-center'	, sortable: true},
+			{headerName: "옵션1"		, field: "optCd1"		, width: 60	, cellClass: 'text-center'	, sortable: true},
+			{headerName: "옵션2"		, field: "optCd2"		, width: 60		, cellClass: 'text-center'	, sortable: true},
 			{headerName: "단품명"		, field: "itemNm"		, width: 200	, cellClass: 'text-left'	, sortable: true},
 			{
 				headerName		: "외부몰벤더"

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/order/OrderMemoRegistForm.html

@@ -5,7 +5,7 @@
  * @source  : OrderMemoRegistForm.html
  * @desc    : 주문메모 등록 화면
  *============================================================================
- * SISUN
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/order/OrderSellerListForm.html

@@ -5,7 +5,7 @@
  * @source  : OrderSellerListForm.html
  * @desc    : 입점업체미발주목록조회 Page
  *============================================================================
- * SISUN
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 27 - 26
style24.admin/src/main/webapp/WEB-INF/views/order/RefundAccountRegistForm.html

@@ -5,7 +5,7 @@
  * @source  : OrderListForm.html
  * @desc    : 주문목록 Page
  *============================================================================
- * SISUN
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION
@@ -19,7 +19,7 @@
 			<h2>환불계좌정보</h2>
 			<button type="button" class="close" onclick="uifnPopupClose('popupCreateRefundAccount');"><i class="fa fa-times"></i></button>
 		</div>
-		
+
 		<div class="panelContent" style="height:90%; overflow-y:auto; padding:0px 20px !important; ">
 			<form id="orderRefundAccontForm">
 				<table class="frmStyle">
@@ -33,23 +33,23 @@
 						<col />
 					</colgroup>
 					<tbody>
-						<tr>
-							<th>은행</th>
-								<td>
-									<select name="bankCd">
-										<option value="">[선택하세요]</option>
-										<option th:if="${bankList}" th:each="oneData, status : ${bankList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
-									</select>
-								</td>
-								<th>계좌번호</th>
-								<td><input type="text" name="accountNo" data-valid-type="numeric"></td>
-								<th>예금주</th>
-								<td><input type="text" name="accountNm"></td>
-							</th:block>
-							<td>
-								<button type="button" class="btn btn-success" id="saveAccountBtn" onclick="fnSaveAccount();">저장</button>
-							</td>
-						</tr>
+					<tr>
+						<th>은행</th>
+						<td>
+							<select name="bankCd">
+								<option value="">[선택하세요]</option>
+								<option th:if="${bankList}" th:each="oneData, status : ${bankList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+							</select>
+						</td>
+						<th>계좌번호</th>
+						<td><input type="text" name="accountNo" data-valid-type="numeric"></td>
+						<th>예금주</th>
+						<td><input type="text" name="accountNm"></td>
+						</th:block>
+						<td>
+							<button type="button" class="btn btn-success" id="saveAccountBtn" onclick="fnSaveAccount();">저장</button>
+						</td>
+					</tr>
 					</tbody>
 				</table>
 			</form>
@@ -58,10 +58,11 @@
 </div>
 
 <script th:inline="javascript">
-/*<![CDATA[*/
-/* 이벤트 바인딩 관련 */
-	var ordNo 	= [[${orderBasic.ordNo}]];
-	var custNo 	= [[${orderBasic.custNo}]];
+	/*<![CDATA[*/
+	/* 이벤트 바인딩 관련 */
+	var orderInfoList 			= [[${orderInfoList}]];							// 주문기본정보
+	var ordNo 					= orderInfoList[0].ordNo;
+	var custNo 					= orderInfoList[0].custNo;
 
 	/* 환불계좌번호 저장 */
 	var fnSaveAccount = function(){
@@ -99,9 +100,9 @@
 				data.bankCd 		= bankCd;
 				data.accountNo 		= accountNo;
 				data.accountNm 		= accountNm;
-				
+
 				var jsonData = JSON.stringify(data);
-				
+
 				gagajf.ajaxJsonSubmit('/order/account/save', jsonData, function(result){
 					uifnPopupClose('popupCreateRefundAccount');
 					fnBindOrderRfAccountInfo();
@@ -115,7 +116,7 @@
 
 	});
 
-/*]]>*/
+	/*]]>*/
 </script>
 
 </html>

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

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

+ 146 - 146
style24.admin/src/main/webapp/WEB-INF/views/settle/DeliveryFeeSettleForm.html

@@ -1,146 +1,146 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : DeliveryFeeSettleForm.html
- * @desc    : 배송비정산 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.26   gagamel     최초 작성
- *******************************************************************************
- -->
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-		
-		<!-- 메뉴 설명 -->
-		<div class="infoBox menu-desc">
-		</div>
-		<!-- //메뉴 설명 -->
-		
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle">
-			<form id="searchForm" name="searchForm" action="#" th:action="@{'/settle/delivery/fee/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<table class="frmStyle" aria-describedby="검색조건">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:60%;"/>
-						<col style="width:10%;"/>
-						<col/>
-					</colgroup>
-					<tr>
-						<th>출기간<i class="required" title="필수" aria-hidden="true"></i></th>
-						<td id="terms">
-						</td>
-						<th>유통구분</th>
-						<td>
-							<select name="distributionGb">
-								<option value="">[전체]</option>
-								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-					</tr>
-					<tr>
-						<th>공급업체/브랜드</th>
-						<td colspan="3">
-							<select name="supplyCompCd">
-								<option value="">[전체]</option>
-								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-							/
-							<select name="brandCd">
-								<option value="">[전체]</option>
-							</select>
-						</td>
-					</tr>
-				</table>
-				
-				<ul class="panelBar">
-					<li class="center">
-						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
-						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
-					</li>
-				</ul>
-			</form>
-		</div>
-		<!-- 검색조건 영역 -->
-
-		<!-- 리스트 영역 -->
-		<div class="panelStyle">
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="right">
-					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-			
-			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
-		</div>
-		<!-- //리스트 영역 -->
-	</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
-	let distributionGbList = gagajf.convertToArray([[${distributionGbList}]]);
-
-	let columnDefs = [
-		{
-			headerName: "출고일자", field: "outgoingDt", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) {
-				return gagaAgGrid.toDateFormat(params.data.outgoingDt);
-			}
-		},
-		{
-			headerName: "공급업체", field: "supplyCompCd", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(supplyCompList, params.data.supplyCompCd);
-			}
-		},
-		{
-			headerName: "유통구분", field: "distributionGb", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(distributionGbList, params.data.distributionGb);
-			}
-		},
-		{
-			headerName: "배송비구분", field: "delvFeeGb", width: 100, cellClass: 'text-center'/* ,
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(delvFeeGbList, params.data.delvFeeGb);
-			} */
-		},
-		{ headerName: "주문번호", field: "ordNo", width: 100, cellClass: 'text-center' },
-		{ headerName: "배송비", field: "delvFee", width: 100, cellClass: 'text-right' }
-	];
-
-	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
-
-	// 검색
-	$('#btnSearch').on('click', function() {
-		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
-	});
-	
-	// 엑셀다운로드
-	$('#btnExcel').on('click', function() {
-		gagaAgGrid.exportToExcel('배송비정산 목록', gridOptions);
-	});
-	
-	$(document).ready(function() {
-		cfnCreateCalendar('#terms', 'startDt', 'endDt', true, '출');
-		$('.btnToday').trigger('click');
-		
-		// Create a agGrid
-		gagaAgGrid.createGrid('gridList', gridOptions);
-	});
-/*]]>*/
-</script>
-
-</html>
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : DeliveryFeeSettleForm.html
+ * @desc    : 배송비정산 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.26   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/settle/delivery/fee/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:60%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>출기간<i class="required" title="필수" aria-hidden="true"></i></th>
+						<td id="terms">
+						</td>
+						<th>유통구분</th>
+						<td>
+							<select name="distributionGb">
+								<option value="">[전체]</option>
+								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>공급업체/브랜드</th>
+						<td colspan="3">
+							<select name="supplyCompCd">
+								<option value="">[전체]</option>
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							/
+							<select name="brandCd">
+								<option value="">[전체]</option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+			
+			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
+	let distributionGbList = gagajf.convertToArray([[${distributionGbList}]]);
+
+	let columnDefs = [
+		{
+			headerName: "출고일자", field: "outgoingDt", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.toDateFormat(params.data.outgoingDt);
+			}
+		},
+		{
+			headerName: "공급업체", field: "supplyCompCd", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(supplyCompList, params.data.supplyCompCd);
+			}
+		},
+		{
+			headerName: "유통구분", field: "distributionGb", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(distributionGbList, params.data.distributionGb);
+			}
+		},
+		{
+			headerName: "배송비구분", field: "delvFeeGb", width: 100, cellClass: 'text-center'/* ,
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(delvFeeGbList, params.data.delvFeeGb);
+			} */
+		},
+		{ headerName: "주문번호", field: "ordNo", width: 100, cellClass: 'text-center' },
+		{ headerName: "배송비", field: "delvFee", width: 100, cellClass: 'text-right' }
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 검색
+	$('#btnSearch').on('click', function() {
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+	
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('배송비정산 목록', gridOptions);
+	});
+	
+	$(document).ready(function() {
+		cfnCreateCalendar('#terms', 'startDt', 'endDt', true, '출');
+		$('.btnToday').trigger('click');
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 181 - 163
style24.admin/src/main/webapp/WEB-INF/views/settle/GoodsSettleForm.html

@@ -1,163 +1,181 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : GoodsSettleForm.html
- * @desc    : 상품정산 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.22   gagamel     최초 작성
- *******************************************************************************
- -->
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-		
-		<!-- 메뉴 설명 -->
-		<div class="infoBox menu-desc">
-		</div>
-		<!-- //메뉴 설명 -->
-		
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle">
-			<form id="searchForm" name="searchForm" action="#" th:action="@{'/settle/goods/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<table class="frmStyle" aria-describedby="검색조건">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:60%;"/>
-						<col style="width:10%;"/>
-						<col/>
-					</colgroup>
-					<tr>
-						<th>출고기간<i class="required" title="필수" aria-hidden="true"></i></th>
-						<td id="terms">
-						</td>
-						<th>유통구분</th>
-						<td>
-							<select name="distributionGb">
-								<option value="">[전체]</option>
-								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-					</tr>
-					<tr>
-						<th>공급업체/브랜드</th>
-						<td colspan="3">
-							<select name="supplyCompCd">
-								<option value="">[전체]</option>
-								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-							/
-							<select name="brandCd">
-								<option value="">[전체]</option>
-							</select>
-						</td>
-					</tr>
-				</table>
-				
-				<ul class="panelBar">
-					<li class="center">
-						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
-						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
-					</li>
-				</ul>
-			</form>
-		</div>
-		<!-- 검색조건 영역 -->
-
-		<!-- 리스트 영역 -->
-		<div class="panelStyle">
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="right">
-					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-			
-			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
-		</div>
-		<!-- //리스트 영역 -->
-	</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
-	let distributionGbList = gagajf.convertToArray([[${distributionGbList}]]);
-
-	let columnDefs = [
-		{ headerName: "주문번호", field: "ordNo", width: 100, cellClass: 'text-center' },
-		{
-			headerName: "공급업체", field: "supplyCompCd", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(supplyCompList, params.data.supplyCompCd);
-			}
-		},
-		{
-			headerName: "유통구분", field: "distributionGb", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(distributionGbList, params.data.distributionGb);
-			}
-		},
-		{ headerName: "정산주기", field: "usacPeriod", width: 100, cellClass: 'text-center' },
-		{ headerName: "주문일시", field: "ordDt", width: 150, cellClass: 'text-center' },
-		{
-			headerName: "정산구분", field: "usacGb", width: 100, cellClass: 'text-center'/* ,
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(usacGbList, params.data.usacGb);
-			} */
-		},
-		{
-			headerName: "환입구분", field: "prtnGb", width: 100, cellClass: 'text-center'/* ,
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(prtnGbList, params.data.prtnGb);
-			} */
-		},
-		{ headerName: "상품코드", field: "goodsCd", width: 120, cellClass: 'text-center' },
-		{ headerName: "상품명", field: "goodsNm", width: 150, cellClass: 'text-center' },
-		{ headerName: "브랜드", field: "brandEnm", width: 100, cellClass: 'text-center' },
-		{ headerName: "담당MD", field: "mdNm", width: 100, cellClass: 'text-center' },
-		{ headerName: "단품코드", field: "itemCd", width: 120, cellClass: 'text-center' },
-		{ headerName: "사이즈", field: "sizeCd", width: 100, cellClass: 'text-center' },
-		{ headerName: "판매가", field: "currPrice", width: 100, cellClass: 'text-right' },
-		{ headerName: "판매수량", field: "sellQty", width: 100, cellClass: 'text-center' },
-		{ headerName: "판매총액", field: "sellAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "즉시사용쿠폰금액", field: "duseCpnDcAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "상품쿠폰사용금액", field: "goodsCpnDcAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "주문서쿠폰사용금액", field: "cartCpnDcAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "포인트사용금액", field: "pntDcAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "다다익선할인금액", field: "multiDcAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "자사쿠폰분담액", field: "selfCpnDcAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "입점쿠폰분담액", field: "supplyCompCpnDcAmt", width: 100, cellClass: 'text-right' }
-	];
-
-	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
-
-	// 검색
-	$('#btnSearch').on('click', function() {
-		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
-	});
-	
-	// 엑셀다운로드
-	$('#btnExcel').on('click', function() {
-		gagaAgGrid.exportToExcel('상품정산 목록', gridOptions);
-	});
-	
-	$(document).ready(function() {
-		cfnCreateCalendar('#terms', 'startDt', 'endDt', true, '출고');
-		$('.btnToday').trigger('click');
-		
-		// Create a agGrid
-		gagaAgGrid.createGrid('gridList', gridOptions);
-	});
-/*]]>*/
-</script>
-
-</html>
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsSettleForm.html
+ * @desc    : 상품정산 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.22   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/settle/goods/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:60%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>매출기간<i class="required" title="필수" aria-hidden="true"></i></th>
+						<td id="terms">
+						</td>
+						<th>유통구분</th>
+						<td>
+							<select name="distributionGb">
+								<option value="">[전체]</option>
+								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>몰구분</th>
+						<td>
+							<select name="mallGb">
+								<option value="">[전체]</option>
+								<option value="">자사몰</option>
+								<option value="">제휴몰</option>
+							</select>
+							/제휴몰일 때는 벤더+제휴몰 콤보박스 구현
+						</td>
+						<th>공급업체/브랜드</th>
+						<td>
+							<select name="supplyCompCd">
+								<option value="">[전체]</option>
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							/
+							<select name="brandCd">
+								<option value="">[전체]</option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+			
+			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
+	let distributionGbList = gagajf.convertToArray([[${distributionGbList}]]);
+
+	let columnDefs = [
+		{ headerName: "주문번호", field: "ordNo", width: 100, cellClass: 'text-center' },
+		{ headerName: "샵링커주문번호", field: "ordNo", width: 150, cellClass: 'text-center', hide: true },
+		{ headerName: "제휴몰주문번호", field: "extmallOrdNo", width: 150, cellClass: 'text-center' },
+		{ headerName: "제휴몰명", field: "extmallNm", width: 150, cellClass: 'text-center' },
+		{
+			headerName: "공급업체", field: "supplyCompCd", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(supplyCompList, params.data.supplyCompCd);
+			}
+		},
+		{
+			headerName: "유통구분", field: "distributionGb", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(distributionGbList, params.data.distributionGb);
+			}
+		},
+		{ headerName: "정산주기", field: "usacPeriod", width: 100, cellClass: 'text-center' },
+		{ headerName: "주문일시", field: "ordDt", width: 150, cellClass: 'text-center' },
+		{
+			headerName: "정산구분", field: "usacGb", width: 100, cellClass: 'text-center'/* ,
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(usacGbList, params.data.usacGb);
+			} */
+		},
+		{
+			headerName: "환입구분", field: "prtnGb", width: 100, cellClass: 'text-center'/* ,
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(prtnGbList, params.data.prtnGb);
+			} */
+		},
+		{ headerName: "발생(출고/회수)일시", field: "occurDt", width: 150, cellClass: 'text-center' },
+		{ headerName: "상품코드", field: "goodsCd", width: 120, cellClass: 'text-center' },
+		{ headerName: "상품명", field: "goodsNm", width: 150, cellClass: 'text-center' },
+		{ headerName: "브랜드", field: "brandEnm", width: 100, cellClass: 'text-center' },
+		{ headerName: "담당MD", field: "mdNm", width: 100, cellClass: 'text-center' },
+		{ headerName: "단품코드", field: "itemCd", width: 120, cellClass: 'text-center' },
+		{ headerName: "사이즈", field: "sizeCd", width: 100, cellClass: 'text-center' },
+		{ headerName: "판매가", field: "currPrice", width: 100, cellClass: 'text-right' },
+		{ headerName: "판매수량", field: "sellQty", width: 100, cellClass: 'text-center' },
+		{ headerName: "판매총액", field: "sellAmt", width: 100, cellClass: 'text-right' },
+		{ headerName: "즉시사용쿠폰금액", field: "duseCpnDcAmt", width: 120, cellClass: 'text-right' },
+		{ headerName: "상품쿠폰사용금액", field: "goodsCpnDcAmt", width: 120, cellClass: 'text-right' },
+		{ headerName: "주문서쿠폰사용금액", field: "cartCpnDcAmt", width: 130, cellClass: 'text-right' },
+		{ headerName: "포인트사용금액", field: "pntDcAmt", width: 120, cellClass: 'text-right' },
+		{ headerName: "다다익선할인금액", field: "multiDcAmt", width: 120, cellClass: 'text-right' },
+		{ headerName: "자사쿠폰분담액", field: "selfCpnDcAmt", width: 120, cellClass: 'text-right' },
+		{ headerName: "입점쿠폰분담액", field: "supplyCompCpnDcAmt", width: 120, cellClass: 'text-right' },
+		{ headerName: "실판매금액", field: "realSellAmt", width: 100, cellClass: 'text-right' },
+		{ headerName: "상품총액", field: "goodsTotAmt", width: 100, cellClass: 'text-right' },
+		{ headerName: "판매수수료율", field: "sellFeeRate", width: 100, cellClass: 'text-right' },
+		{ headerName: "수수료", field: "sellFeeAmt", width: 100, cellClass: 'text-right' },
+		{ headerName: "정산대상액", field: "settleAmt", width: 100, cellClass: 'text-right' }
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 검색
+	$('#btnSearch').on('click', function() {
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+	
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('상품정산 목록', gridOptions);
+	});
+	
+	$(document).ready(function() {
+		cfnCreateCalendar('#terms', 'startDt', 'endDt', true, '매출');
+		$('.btnToday').trigger('click');
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 200 - 200
style24.admin/src/main/webapp/WEB-INF/views/settle/SettleConfirmForm.html

@@ -1,200 +1,200 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : SettleConfirmForm.html
- * @desc    : 정산확정관리 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.26   gagamel     최초 작성
- *******************************************************************************
- -->
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-		
-		<!-- 메뉴 설명 -->
-		<div class="infoBox menu-desc">
-		</div>
-		<!-- //메뉴 설명 -->
-		
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle">
-			<form id="searchForm" name="searchForm" action="#" th:action="@{'/settle/confirm/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<table class="frmStyle" aria-describedby="검색조건">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:60%;"/>
-						<col style="width:10%;"/>
-						<col/>
-					</colgroup>
-					<tr>
-						<th>출기간<i class="required" title="필수" aria-hidden="true"></i></th>
-						<td id="terms">
-						</td>
-						<th>유통구분</th>
-						<td>
-							<select name="distributionGb">
-								<option value="">[전체]</option>
-								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-					</tr>
-					<tr>
-						<th>공급업체/브랜드</th>
-						<td colspan="3">
-							<select name="supplyCompCd">
-								<option value="">[전체]</option>
-								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-							/
-							<select name="brandCd">
-								<option value="">[전체]</option>
-							</select>
-						</td>
-					</tr>
-				</table>
-				
-				<ul class="panelBar">
-					<li class="center">
-						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
-						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
-					</li>
-				</ul>
-			</form>
-		</div>
-		<!-- 검색조건 영역 -->
-
-		<!-- 리스트 영역 -->
-		<div class="panelStyle">
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="right">
-					<button type="button" class="btn btn-warning btn-lg" id="btnUpload">기타차감 엑셀업로드</button>
-					<button type="button" class="btn btn-default btn-lg" id="btnExcel">세금계산서용 엑셀다운로드</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-			
-			<div id="gridList" style="width: 100%; height: 570px" class="ag-theme-balham"></div>
-		</div>
-		<!-- //리스트 영역 -->
-	</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
-	let distributionGbList = gagajf.convertToArray([[${distributionGbList}]]);
-	let bankList = gagajf.convertToArray([[${bankList}]]);
-	
-	let columnDefs = [
-		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
-		{
-			headerName: "정산확정", field: "confirmYn", width: 100, cellClass: 'text-center',
-			cellRenderer: function(params) {
-				if (params.value == 'Y') {
-					return '<button type="button" class="btn btn-success btn-sm">확정</button>';
-				} else {
-					return '<button type="button" class="btn btn-danger btn-sm">해제</button>';
-				}
-			}
-		},
-		{
-			headerName: "공급업체", field: "supplyCompCd", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(supplyCompList, params.data.supplyCompCd);
-			}
-		},
-		{ headerName: "전자계약여부", field: "econtractYn", width: 100, cellClass: 'text-center' },
-		{ headerName: "사업자등록번호", field: "bizNo", width: 120, cellClass: 'text-center' },
-		{ headerName: "정산주기", field: "settleDay", width: 100, cellClass: 'text-center' },
-		{ headerName: "판매수량", field: "sellQty", width: 100, cellClass: 'text-center' },
-		{ headerName: "판매총액", field: "sellAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "수수료", field: "sellFeeAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "쿠폰할인금액", field: "cpnDcAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "자사쿠폰분담액", field: "selfCpnDcAmt", width: 120, cellClass: 'text-right' },
-		{ headerName: "입점쿠폰분담액", field: "supplyCompCpnDcAmt", width: 120, cellClass: 'text-right' },
-		{ headerName: "계산서발행금액", field: "billAmt", width: 120, cellClass: 'text-right' },
-		{ headerName: "공급가액", field: "supplyAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "세액", field: "taxAmt", width: 100, cellClass: 'text-right' },
-		{ headerName: "배송비", field: "delvFeeAmt", width: 100, cellClass: 'text-right' },
-		{
-			headerName: "기타차감", field: "etcDeductAmt", width: 100, cellClass: 'text-right',
-			editable: true, cellEditor: 'numericCellEditor', cellEditorParams: { maxlength: 12, validType: 'integer' },
-			cellRenderer: function(params) { return gagajf.isNull(params.value) ? 0 : params.value.addComma(); },
-			cellStyle: { color: '#fffff', 'background-color': '#aaaaff' }
-		},
-		{ headerName: "지급금액", field: "giveAmt", width: 100, cellClass: 'text-right' },
-		{
-			headerName: "미수금", field: "receivableAmt", width: 100, cellClass: 'text-right',
-			editable: true, cellEditor: 'numericCellEditor', cellEditorParams: { maxlength: 12, validType: 'integer' },
-			cellRenderer: function(params) { return gagajf.isNull(params.value) ? 0 : params.value.addComma(); },
-			cellStyle: { color: '#fffff', 'background-color': '#aaaaff' }
-		},
-		{ headerName: "총지급금액", field: "totGiveAmt", width: 100, cellClass: 'text-right' },
-		
-		{
-			headerName: "상태", field: "settleStat", width: 100, cellClass: 'text-center',
-			cellRenderer: function (params) {
-				// 전자계약이 안 되어 있으면 "보류"
-				// 전자계약은 되어 있으나 지급금액 < 0 이면 "미수금" 그 외는 "정상"
-				if (params.data.econtractYn == 'N') {
-					return '보류';
-				}
-				
-				if (params.data.giveAmt < 0) {
-					return '미수금';
-				}
-				
-				return '정상';
-			}
-		},
-		{
-			headerName: "은행", field: "bankCd", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(bankList, params.data.bankCd);
-			}
-		},
-		{ headerName: "계좌번호", field: "accountNo", width: 150, cellClass: 'text-center' },
-		{ headerName: "예금주명", field: "depositorNm", width: 100, cellClass: 'text-center' },
-		{ headerName: "계산서이메일", field: "billEmail", width: 100, cellClass: 'text-center' }
-	];
-
-	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
-
-	// 검색
-	$('#btnSearch').on('click', function() {
-		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
-	});
-	
-	// 세금계산서용 엑셀다운로드
-	$('#btnExcel').on('click', function() {
-		// DB 처리로 작업해야 함. 항목은 다음과 같음.
-		// 작성일
-		// 품목: "상품판매수수료"로 고정
-		// 공급가액: ROUND(현금거래액 / 1.1)
-		// 세액: 현금거래액 - 공급가액
-		// 현금거래액: ROUND(수수료 - 자사쿠폰분담액). < 0인 경우 0으로 표기
-		// 공급업체 / 사업자등록번호 / 대표자명 / 업태 / 업종 / 주소
-		// 정산담당자 / 정산담당자연락처 / 계산서이메일
-		// 세금계산서발행금액: ROUND(수수료 - 자사쿠폰분담액). < 0인 경우 0으로 표기
-	});
-	
-	$(document).ready(function() {
-		cfnCreateCalendar('#terms', 'startDt', 'endDt', true, '출');
-		$('.btnToday').trigger('click');
-		
-		// Create a agGrid
-		gagaAgGrid.createGrid('gridList', gridOptions);
-	});
-/*]]>*/
-</script>
-
-</html>
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : SettleConfirmForm.html
+ * @desc    : 정산확정관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.26   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/settle/confirm/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:60%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>출기간<i class="required" title="필수" aria-hidden="true"></i></th>
+						<td id="terms">
+						</td>
+						<th>유통구분</th>
+						<td>
+							<select name="distributionGb">
+								<option value="">[전체]</option>
+								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>공급업체/브랜드</th>
+						<td colspan="3">
+							<select name="supplyCompCd">
+								<option value="">[전체]</option>
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							/
+							<select name="brandCd">
+								<option value="">[전체]</option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-warning btn-lg" id="btnUpload">기타차감 엑셀업로드</button>
+					<button type="button" class="btn btn-default btn-lg" id="btnExcel">세금계산서용 엑셀다운로드</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+			
+			<div id="gridList" style="width: 100%; height: 570px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
+	let distributionGbList = gagajf.convertToArray([[${distributionGbList}]]);
+	let bankList = gagajf.convertToArray([[${bankList}]]);
+	
+	let columnDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{
+			headerName: "정산확정", field: "confirmYn", width: 100, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				if (params.value == 'Y') {
+					return '<button type="button" class="btn btn-success btn-sm">확정</button>';
+				} else {
+					return '<button type="button" class="btn btn-danger btn-sm">해제</button>';
+				}
+			}
+		},
+		{
+			headerName: "공급업체", field: "supplyCompCd", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(supplyCompList, params.data.supplyCompCd);
+			}
+		},
+		{ headerName: "전자계약여부", field: "econtractYn", width: 100, cellClass: 'text-center' },
+		{ headerName: "사업자등록번호", field: "bizNo", width: 120, cellClass: 'text-center' },
+		{ headerName: "정산주기", field: "settleDay", width: 100, cellClass: 'text-center' },
+		{ headerName: "판매수량", field: "sellQty", width: 100, cellClass: 'text-center' },
+		{ headerName: "판매총액", field: "sellAmt", width: 100, cellClass: 'text-right' },
+		{ headerName: "수수료", field: "sellFeeAmt", width: 100, cellClass: 'text-right' },
+		{ headerName: "쿠폰할인금액", field: "cpnDcAmt", width: 100, cellClass: 'text-right' },
+		{ headerName: "자사쿠폰분담액", field: "selfCpnDcAmt", width: 120, cellClass: 'text-right' },
+		{ headerName: "입점쿠폰분담액", field: "supplyCompCpnDcAmt", width: 120, cellClass: 'text-right' },
+		{ headerName: "계산서발행금액", field: "billAmt", width: 120, cellClass: 'text-right' },
+		{ headerName: "공급가액", field: "supplyAmt", width: 100, cellClass: 'text-right' },
+		{ headerName: "세액", field: "taxAmt", width: 100, cellClass: 'text-right' },
+		{ headerName: "배송비", field: "delvFeeAmt", width: 100, cellClass: 'text-right' },
+		{
+			headerName: "기타차감", field: "etcDeductAmt", width: 100, cellClass: 'text-right',
+			editable: true, cellEditor: 'numericCellEditor', cellEditorParams: { maxlength: 12, validType: 'integer' },
+			cellRenderer: function(params) { return gagajf.isNull(params.value) ? 0 : params.value.addComma(); },
+			cellStyle: { color: '#fffff', 'background-color': '#aaaaff' }
+		},
+		{ headerName: "지급금액", field: "giveAmt", width: 100, cellClass: 'text-right' },
+		{
+			headerName: "미수금", field: "receivableAmt", width: 100, cellClass: 'text-right',
+			editable: true, cellEditor: 'numericCellEditor', cellEditorParams: { maxlength: 12, validType: 'integer' },
+			cellRenderer: function(params) { return gagajf.isNull(params.value) ? 0 : params.value.addComma(); },
+			cellStyle: { color: '#fffff', 'background-color': '#aaaaff' }
+		},
+		{ headerName: "총지급금액", field: "totGiveAmt", width: 100, cellClass: 'text-right' },
+		
+		{
+			headerName: "상태", field: "settleStat", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				// 전자계약이 안 되어 있으면 "보류"
+				// 전자계약은 되어 있으나 지급금액 < 0 이면 "미수금" 그 외는 "정상"
+				if (params.data.econtractYn == 'N') {
+					return '보류';
+				}
+				
+				if (params.data.giveAmt < 0) {
+					return '미수금';
+				}
+				
+				return '정상';
+			}
+		},
+		{
+			headerName: "은행", field: "bankCd", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(bankList, params.data.bankCd);
+			}
+		},
+		{ headerName: "계좌번호", field: "accountNo", width: 150, cellClass: 'text-center' },
+		{ headerName: "예금주명", field: "depositorNm", width: 100, cellClass: 'text-center' },
+		{ headerName: "계산서이메일", field: "billEmail", width: 100, cellClass: 'text-center' }
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 검색
+	$('#btnSearch').on('click', function() {
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+	
+	// 세금계산서용 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		// DB 처리로 작업해야 함. 항목은 다음과 같음.
+		// 작성일
+		// 품목: "상품판매수수료"로 고정
+		// 공급가액: ROUND(현금거래액 / 1.1)
+		// 세액: 현금거래액 - 공급가액
+		// 현금거래액: ROUND(수수료 - 자사쿠폰분담액). < 0인 경우 0으로 표기
+		// 공급업체 / 사업자등록번호 / 대표자명 / 업태 / 업종 / 주소
+		// 정산담당자 / 정산담당자연락처 / 계산서이메일
+		// 세금계산서발행금액: ROUND(수수료 - 자사쿠폰분담액). < 0인 경우 0으로 표기
+	});
+	
+	$(document).ready(function() {
+		cfnCreateCalendar('#terms', 'startDt', 'endDt', true, '출');
+		$('.btnToday').trigger('click');
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 1 - 1
style24.admin/src/main/webapp/WEB-INF/views/stock/GoodsSizeStockForm.html

@@ -6,7 +6,7 @@
  * @source  : GoodsSizeStockForm.html
  * @desc    : 상품 사이즈별 재고 현황
  *============================================================================
- * SISUN
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 923 - 885
style24.admin/src/main/webapp/ux/css/admin.ui.css

@@ -1,885 +1,923 @@
-@import url("https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700"); @import url("https://fonts.googleapis.com/css?family=Roboto:400,300,500,700"); html,body {position:relative; height:100%;}
-html, body, header, div, ul, ol, li, dl, dt, dd, h1, h2, h3, h4, h5, h6, label, a, p, form, input, textarea, table, hr, span, em {margin:0; padding:0; box-sizing:border-box;}
-/* { } */
-body {overflow-x:hidden; font-family:"open sans", "Roboto", "Malgun Gothic", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size:12px; background-color:#f3f3f4;}
-h1, h2, h3, h4, h5, h6 {display:inline-block;}
-ul, ol {list-style:none;}
-ul::after, ol::after {display:block; clear:both; content:'';}
-img {vertical-align:middle; border-style:none;}
-a {text-decoration:none;}
-em, i {font-style:normal;}
-table {border-collapse:collapse;}
-th {text-align:inherit;}
-label {position:relative; margin-right:20px; display:inline-block; -webkit-touch-callout:none; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none;}
-label:last-child {margin-right:0 !important;}
-input,button,select,textarea {font-family:inherit; font-size:inherit;}
-input.btn-sm {padding:1px 6px;}
-input[type=text] {width:100%;}
-input[type=text], input[type=file], input[type=date], [type=password], textarea {padding:4px 3px 4px 5px; color:inherit; border-radius:1px; vertical-align:middle; margin:1px 3px 2px 0;}
-input[type=date],input[type=time],input[type=datetime-local],input[type=month] {-webkit-appearance:listbox;}
-input[readonly="readonly"], input[disabled="disabled"], input[readonly="readonly"]:before, input[disabled="disabled"]:before, select[readonly="readonly"], select[disabled="disabled"] {background-color:#eee !important;}
-button, select {text-transform:none;}
-button,[type=button],[type=reset],[type=submit] {margin:0; -webkit-appearance:button; border-radius:0; cursor:pointer; background-color:transparent; border-color:transparent;}
-button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner {padding:0; border-style:none;}
-textarea {overflow:auto; resize:vertical; width:100%; margin:4px 0; vertical-align:middle; line-height:22px; height:32px;}
-.textareaR2 {min-height:60px; line-height:26px;}
-.textareaR3 {min-height:96px; line-height:26px;}
-.textareaR4 {min-height:134px; line-height:26px;}
-.byteChk {line-height:20px; padding-left:20px; display:inline-block; vertical-align:middle;}
-select {margin:0 3px 1px 0; padding:3px 10px 3px 3px; color:inherit; border-radius:1px; vertical-align:middle;}
-select, input[type=text], input[type=file], input[type=date], input[type=password], textarea {border:1px solid #dbdbdb;}
-select:focus, input:focus, textarea:focus, button:focus, .outline {outline:2px auto #4D90FE;}
-.formControl {background:#eee;}
-.off {display:none !important;}
-.scrollOff {overflow:hidden;}
-.f25 {font-size:25px;}
-
-html,body,#wrapper,#container {min-height:100%; height:100%;}
-#wrapper {position:relative; min-width:1240px;}
-
-/* 로그인 --------------- */
-.loginBg {background:#f3f3f4;}
-.loginWrap {width:500px; box-shadow:0 7px 7px -5px rgba(0, 0, 0, 0.1);}
-.loginWrap .loginBox input[type=text],
-.loginWrap .loginBox input[type=password]{padding:10px; width:100%; border:1px solid #ced4da; border-radius:.25rem;}
-.loginWrap .loginBox li:nth-of-type(2), .loginBox li:nth-of-type(3) {padding-bottom:10px;}
-.loginWrap .loginBox li:nth-of-type(4) {padding:10px 0 50px 0; line-height:30px; text-align:left;}
-.loginWrap .loginBox li:nth-of-type(5) {margin-bottom:30px; text-align:center;}
-.loginWrap .loginBox a {display:inline-block; padding:10px;}
-.loginWrap .loginBox .dot {color:#ccc;}
-.loginWrap .btn-black {background-color:#555; color:#fff; font-weight:bold; float:right; margin:0 !important;}
-.loginWrap .btn-black:hover{background-color:#000; box-shadow:none;}
-.loginWrap .btn-purple {background-color:#667eea; color:#fff; font-weight:bold; float:right; margin:0 !important;}
-.loginWrap .btn-purple:hover{background-color:#2e38cb; box-shadow:none;}
-.loginWrap .loginInfo {color:#888; line-height:23px; text-align:left;}
-.loginWrap .loginInfo em i {margin-right:7px;}
-.loginWrap .loginInfo p:first-child{margin-bottom:15px;}
-.loginWrap .loginInfo p span {display:inline-block; margin-bottom:15px; line-height:40px; font-size:16px; font-weight:bold; border-bottom:1px solid #000;}
-
-/* 로그인 style :black */
-.login_black {position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); -ms-transform:translate(-50%, -50%); background:#fff;}
-.login_black .logo { padding:25px 0; text-align:center; background:#000;}
-.login_black .loginInfo em {color:#555; font-weight:bold;}
-.login_black .loginCont > ul {padding:60px 60px 70px;}
-.login_black .loginBox li:nth-of-type(5) {border-top:1px solid #e4e4e4; border-bottom:1px solid #e4e4e4;}
-.login_black .loginBox a {color:#555}
-
-/* 보안 인증 */
-.loginWrap .certiFrm {padding:40px 60px 70px;}
-.loginWrap .certiFrm h2{margin:10px 0 30px;}
-.loginWrap .certiFrm h2 i{margin-right:10px;}
-.loginWrap .certiFrm .alertBox{margin-bottom:15px}
-.loginWrap .certiFrm .input{height:45px; position:relative;}
-.loginWrap .certiFrm .input input[type=text]{position:relative; padding:10px; width:45px; height:45px; line-height:45px; font-size:16px; border:1px solid #ced4da; border-radius:.25rem; text-align:center;}
-.loginWrap .certiFrm .input input[type=text]:focus{color:#4D90FE;font-weight:bold;}
-.loginWrap .certiFrm .input .countdown{display:inline-block; position:relative; padding-left:20px; line-height:45px; height:45px;color:red; text-align:center;vertical-align:top; font-size:14px}
-.loginWrap .certiFrm .info{margin-top:20px; line-height:22px; color:#555;}
-.loginWrap .certiFrm .button{margin:25px 0 50px;}
-.loginWrap .certiFrm .button button{margin:0 5px !important; padding:5px 20px; height:32px; float:right}
-.loginWrap .certiFrm .button button:focus{outline:2px auto #4D90FE !important; }
-.loginWrap .certiFrm .button .btn-black{width:100px !important;}
-
-/* 로그인 :alert */
-.alertBox {position:relative; padding:10px 40px 10px 10px; margin-bottom:10px; border:1px solid; border-radius:.25rem; line-height:22px;}
-.alertBox .alertClose {position:absolute; top:0; right:5px; padding:0 10px; height:40px; text-indent:-9999px; background:url('/image/btn_sltClose.png') no-repeat 50% 50%;}
-.alertBox .alertClose:hover {background:url('/image/btn_sltCloseOn.png') no-repeat 50% 50%;}
-.alert-success {color:#155724; background-color:#d4edda; border-color:#c3e6cb;}
-.alert-info {color:#0c5460; background-color:#d1ecf1; border-color:#bee5eb;}
-.alert-warning {color:#856404; background-color:#fff3cd; border-color:#ffeeba;}
-.alert-danger {color:#721c24; background-color:#f8d7da; border-color:#f5c6cb;}
-
-/* header--------------- */
-header {position:fixed; top:0; left:0; right:0; z-index:10; min-width:1240px; width:100%; height:60px; line-height:60px; color:#fff; background:linear-gradient(135deg,#667eea 0,#764ba2 100%);}
-header a, header button {color:#fff;}
-.header-logo {float:left; width:260px; line-height:60px; background:rgba(250, 251, 252, 0.1); overflow:hidden;}
-.header-logo a {display:inline-block; margin:0 10px 0 20px; width:184px; height:60px;}
-.header-logo .lnbClose {width:30px; line-height:30px; display:inline-block !important;}
-.header-logo .lnbClose:hover {color:rgba(255, 255, 255, 0.8);}
-.header-menu {position:absolute; left:260px; padding:0 0 0 30px; font-weight:bold;}
-.header-menu .menu {display:inline-block; -ms-user-select:none; -webkit-user-select:none; user-select:none;}
-.header-menu .menu a {display:inline-block; margin-right:7px; padding:0 14px; line-height:34px; border-radius:50px; background:rgba(0, 0, 0, 0.07);}
-.header-menu .menu a:hover {color:rgba(255, 255, 255, 0.8);}
-.header-menu .menu a.on {background:rgba(0, 0, 0, 0.3);}
-.header-info {display:inline-block; float:right; margin-right:20px;}
-.header-info a {color:rgba(255, 255, 255, 0.8);}
-.header-info a:hover {color:#fff;}
-.header-info i.heart {font-size:6px; color:rgba(255, 255, 255, 0.4); margin-right:3px;}
-.header-info i.dot {font-size:13px; color:rgba(255, 255, 255, 0.4); margin:0 3px;}
-.header-info-sm {display:none; float:right; margin-right:20px;}
-.header-info-sm a {display:inline-block; padding:0 7px; color:rgba(255, 255, 255, 0.8);}
-.header-info-sm a:hover {color:#fff;}
-
-/* GNB:툴팁--------------- */
-.tooltip .tooltiptext {visibility:hidden; position:absolute; top:48px; right:20px; z-index:1; padding:0 15px; line-height:30px; color:#fff; font-size:13px; text-align:center; background-color:#233646; border-radius:3px;}
-.tooltip .tooltiptext::after {content:""; position:absolute; bottom:100%; right:38px; border-width:5px; border-style:solid; border-color:transparent transparent #233646 transparent;}
-.tooltip .tooltiptext.logout::after {right:10px;}
-.tooltip:hover .tooltiptext {visibility:visible;}
-
-/* LNB--------------- */
-#lnb-wrapper {position:fixed; top:60px; left:-260px; width:260px; height:100%; vertical-align:top; overflow-y:auto; transition:left .3s; -webkit-transition:left .3s; background-color:#2f4050;}
-#lnb-wrapper:after{content:''; position:absolute; top:0; left:0; z-index:-1; width:100%; height:100%;}
-#lnb-wrapper.on {left:0;}
-#lnb {margin-bottom:100px; width:260px;}
-#lnb a {display:block; color:#a7b1c2;}
-#lnb a:hover {color:#fff;}
-#lnb a.on {color:#fff;}
-#lnb .dep2 {padding:14px 20px 14px 35px; background:url('/image/icon_dep2.png') 10px 50% no-repeat, url('/image/icon_depArr2.png') 222px 50% no-repeat; background-color:#233646; cursor:pointer;}
-#lnb .dep2.on {display:block; background:url('/image/icon_dep2On.png') 10px 50% no-repeat, url('/image/icon_depArr2On.png') 222px 50% no-repeat; background-color:#233646;}
-#lnb .dep3 {padding:5px 0 10px 10px; border-left:4px solid #8597eb; cursor:pointer;}
-#lnb .dep3 a {padding:10px; cursor:pointer;}
-#lnb .dep4 {padding:5px 0 10px 20px; cursor:pointer;}
-#lnb .dep4 a {padding:10px; cursor:pointer;}
-
-/* main--------------- */
-#main-wrapper {position:relative; left:0; top:0; margin-left:0; min-height:100%; padding-bottom:60px; vertical-align:top; color:#222; transition:margin-left .3s; -webkit-transition:margin-left .3s;}
-#main-wrapper.on {margin-left:260px;}
-#main {padding-top:60px; position:relative;}
-#main .main-title {height:60px; margin-left:20px; margin-right:20px;}
-#main .main-title h1 {padding-top:15px; font-size:20px; color:#333; font-weight:700;}
-#main .main-title ol {margin-top:25px; float:right; color:#666;}
-#main .main-title li {float:left;}
-#main .main-title li::before {padding:0 5px; content:"/"; color:#999;}
-#main .main-title li:nth-of-type(1)::before {content:none !important;}
-#main .main-title i {padding-right:3px; color:#999;}
-#main .sub-title {margin:0 20px 10px; font-size:14px; color:#6c7dda; font-weight:bold;}
-#main .sub-title i {margin-right:10px;}
-
-/* 패널영역 스타일--------------- */
-.panelStyle {position:relative; margin:0 20px 30px 20px; padding:15px 15px 0; background-color:#fff; border-top:2px solid #dfe2e3; box-shadow:0 7px 7px -5px rgba(0, 0, 0, 0.04);}
-.panelStyle::after, .frmStyle::after{position:relative; bottom:-5px; content:''; display:block; border:1px solid rgba(255,255,255,0);}
-.panelStyle .panelTitle {margin:-15px -15px 0; padding:0 20px; line-height:40px; border-bottom:1px solid #e7eaec;}
-.panelStyle .panelControl {position:absolute; top:0; right:15px; color:#c4c4c4;}
-.panelStyle .panelControl i {padding:10px 10px; cursor:pointer;}
-.panelStyle .panelContent {margin-top:10px;}
-.panelStyle h2 {margin-right:10px; font-size:14px; font-weight:bold;}
-.panelStyle h3 {margin-right:10px; font-size:12px; font-weight:normal; line-height:25px;}
-.panelStyle h3 i {padding-right:5px}
-.panelStyle h4 {padding-left:23px; height:31px; line-height:31px; background:url('/image/icon_h4.png') no-repeat 3px 50%; color:#666;}
-.panelStyle .panelBar {display:table; width:100%; padding-bottom:10px;}
-.panelStyle .panelBar h4 {margin-bottom:0;}
-.panelStyle .panelBar > li {display:table-cell;}
-.panelStyle .panelBar > .center {text-align:center;}
-.panelStyle .panelBar > .right {text-align:right;}
-.panelStyle .inner-fa-chevron-up:before {content:"\f077";}
-.panelStyle .inner-fa-chevron-down:before {content:"\f078";}
-
-/* 패널 내부 테이블 여러개 배치 */
-.panelStyle .division + .panelBar {padding-bottom:15px;}
-.panelStyle .division {display:table; width:100%;}
-.panelStyle .division > li, .panelStyle .division > div {display:table-cell; padding-right:40px;}
-.panelStyle .division > li:last-child, .panelStyle .division > div:last-child {padding-right:0;}
-/* table, grid, button 상하 여백 */
-.ag-theme-balham{margin-bottom:15px !important;}
-.frmStyle + .panelBar {padding-bottom:15px;}
-.ag-theme-balham {margin:10px 0 15px;}
-.ag-theme-balham + .panelBar{padding-bottom:15px;}
-.panelBar + .ag-theme-balham {margin:0 0 15px;}
-.panelBar + .frmStyle {margin-top:0;}
-
-/* TABS 영역 --------------- */
-.tabs {position:relative; margin-bottom:30px; margin-left:20px; margin-right:20px;}
-.tabs h2 {position:absolute; top:0; z-index:2; margin-left:10px; font-size:14px; line-height:34px;}
-.tabs h2 i {margin-right:12px;}
-.tabsNav {overflow:hidden; position:relative; top:0; z-index:2; padding:0 30px 0 20px; height:35px;}
-.tabsNav ul {display:inline-block;}
-.tabsNav li {float:left; position:relative;}
-.tabsNav li a {padding:0 20px; line-height:35px; height:35px; display:block; color:#888; font-weight:bold; background-color:#f9f9f9; border:1px solid #dfe2e3; border-bottom:2px solid #dfe2e3; border-top-left-radius:.25rem; border-top-right-radius:.25rem;}
-.tabsNav li.on a {background-color:#fff; color:#222; border:1px solid #ccc; border-bottom:2px solid #fff;}
-.tabsCont {position:relative; top:-2px; z-index:1;}
-.tabsCont::after {display:block}
-.tab {display:none;}
-.tab > .panelStyle{margin:0;}
-.tab.on {display:block;}
-.popupTabs {padding-top:10px;}
-.tabContArea {overflow-x:hidden; overflow-y:auto;}
-.tabBtnArea {padding:15px 0 20px 0;}
-.popup .tabsCont {box-shadow:none;}
-.popup .tabs {margin-bottom:0;}
-
-/* Add TABS 영역 --------------- */
-.btn-add-tab {position:absolute; top:5px; right:0; z-index:2; padding:0 10px;}
-.tabsNav .ui-tabs-active a {background-color:#fff; color:#222; border:1px solid #ccc; border-bottom:2px solid #fff;}
-.tab-del {position:absolute; top:1px; right:1px; padding:4px 6px; color:gray; cursor:pointer; border-top-right-radius:.25rem;}
-.tab-del:hover {color:#f40552;}
-a, button, .ui-state-active, .ui-state-focus, .ui-state-hover {outline:0 !important;}
-.tabsNav .ui-corner-top a {padding:0 35px 0 20px}
-
-/* tabsJr 영역 --------------- */
-.tabsJr {position:relative;}
-.tabsJrNav {overflow:hidden; position:relative; top:0; z-index:2; height:31px; margin:0 30px 0 20px;}
-.tabsJrNav > ul {display:inline-block;}
-.tabsJrNav li {float:left;}
-.tabsJrNav li a {padding:0 20px; line-height:30px; height:30px; display:block; color:#888; /*font-weight:bold; */ background-color:#f9f9f9; border:1px solid #ccc; border-top-left-radius:.25rem; border-top-right-radius:.25rem;}
-.tabsJrNav li.on a {padding-bottom:2px; font-weight:bold; color:#555; background-color:#fff; border-top:1px solid #ccc; border-right:1px solid #ccc; border-bottom:1px solid #fff;}
-.tabsJrCont {position:relative; top:-2px; z-index:1;}
-.tabsJrCont::after {display:block}
-.tabJr {display:none;}
-.tabJr .panelStyle{margin:0; border-top:1px solid #ddd; min-height:20px; padding:20px 15px 0; box-shadow:0 -5px 7px -5px rgba(0, 0, 0, 0.05);}
-.tabJr.on {display:block;}
-.tabJrContArea {vertical-align:middle;}
-
-/* modal, modeless popup --------------- */
-.modalPopup{display:none; position:fixed; left:0; top:0; z-index:11; width:100%; height:100%; background:rgba(0,0,0,0.5);}
-.modalPopup > .panelStyle{position:absolute; top:50%; left:50%; z-index:11; -ms-transform:translate(-50%, -50%); transform:translate(-50%, -50%); margin:0; border:1px solid #79797a; border-radius:3px;}
-.modalPopup > .panelStyle .close {position:absolute; top:0; right:0; font-size:18px; padding:5px 15px 8px;}
-.modalPopup .tabs{ margin:0;}
-.modalPopup .tabs .panelStyle{box-shadow:none}
-.modalPopup .tab > .panelStyle{overflow-y:auto;}
-
-/*MODELESS POPUP --------------- */
-.modelessPopup{display:none; position:absolute; z-index:11; top:50%; left:50%;}
-.modelessPopup.draggable {cursor:move;}
-.modelessPopup .panelStyle{margin:0; border:1px solid #ccc; border-radius:3px;}
-.modelessPopup .panelStyle .close {position:absolute; top:0; right:0; font-size:18px; padding:5px 15px 8px;}
-.modelessPopup .tabs{ margin:0;}
-.modelessPopup .tabs .panelStyle{box-shadow:none}
-.modelessPopup .tab > .panelStyle{overflow-y:auto;}
-
-/*VIDEO POPUP --------------- */
-.videoPopup {display:none; position:fixed; top:50%; left:50%; z-index:11; -ms-transform:translate(-50%, -50%); transform:translate(-50%, -50%); margin:0; border:1px solid #79797a; border-radius:3px;}
-.modalPopup::before{position:fixed; left:0; top:0; z-index:11; width:100%; height:100%; background:rgba(0,0,0,0.5);}
-.videoPopup .close {position:absolute; top:-20px; right:-20px; z-index:1; width:40px; height:40px; line-height:20px; font-size:20px; border:1px solid #666; border-radius:50px; background-color:#fff;}
-.videoPopup iframe{width:100%; height:100%}
-
-
-#btnTop {display:none; position:fixed; right:0; bottom:50px; width:40px; line-height:10px; font-size:10px; background:#fff; border:1px solid #ddd; border-right:none; padding:3px 0 5px 0; box-shadow:5px 5px 5px -4px rgba(0, 0, 0, 0.07); color:#1c84c6;}
-#btnTop i {width:100%; font-size:12px;}
-#btnTop:hover {padding-right:30px; width:70px; font-weight:bold;}
-
-
-/* 컨텐트 스크롤--------------- */
-.xScroll {overflow-x:auto;}
-.yScroll {overflow-y:auto;}
-
-/* 폼테이블 스타일 --------------- */
-.frmStyle {width:100%; margin-bottom:15px;}
-.frmStyle th {border-top:1px solid #dae0fd;}
-.frmStyle tr:last-child th {border-bottom:1px solid #dae0fd;}
-.frmStyle tr:last-child td {border-bottom:1px solid #eee;}
-.frmStyle th {padding:0 15px; height:36px; line-height:24px; white-space:nowrap; text-align:center; background:#e9ecfb;}
-.frmStyle td {padding:0 10px 0 10px; line-height:36px; position:relative; border-top:1px solid #eee; border-right:1px solid #eee;}
-
-/* 체크박스&라디오박스 공통--------------- */
-input[type=radio] {position:absolute; top:50%; left:0; width:18px; height:18px; transform:translate(0,-50%); -ms-transform:translate(0,-50%);}
-label.chkBox, label.rdoBtn {position:relative; display:inline-block; padding-left:26px; height:22px; line-height:22px; vertical-align:middle; cursor:pointer;}
-/* 체크박스 :전체선택 버튼--------------- */
-input[type=checkbox] {position:absolute; top:0; left:0; width:0; height:0;}
-input[type=button].chkBox {margin-left:-2px; padding-left:24px; height:22px; vertical-align:middle; background:url('/image/icon_checkN.png') no-repeat 0 50%;}
-
-/* 체크박스--------------- */
-label.chkBox::before {position:absolute; top:2px; left:0; content:''; width:16px; height:16px; border:1px solid #dbdbdb; background:#fff;}
-label.chkBox.checked::after {position:absolute; top:6px; left:3px; content:''; width:8px; height:4px; border-bottom:3px solid #676a6c; border-left:3px solid #676a6c; -webkit-transform:rotate(-45deg); transform:rotate(-45deg);}
-label.chkBox .formControl::before {background:#eee;}
-
-/* 라디오버튼--------------- */
-input[type=radio]::before {position:absolute; top:0; left:0; content:''; width:16px; height:16px; border:1px solid #dbdbdb; border-radius:50%; background:#fff;}
-input[type=radio]:checked::after {position:absolute; top:5px; left:5px; content:''; width:8px; height:8px; border-radius:50%; background:#676a6c;}
-input[type=radio].formControl::before {background:#eee;}
-
-/* 토글 스위치--------------- */
-.switchBox{ display:inline-block;position:relative; width:60px; height:28px; vertical-align:middle;border-radius:25px;overflow:hidden;}
-.switchBox input[type="checkbox"]{position:absolute;visibility:hidden;}
-.switchBox label{display:block;position:absolute;top:0;width:60px;height:28px;background-color:#aaa;transition-duration:0.2s;}
-.switchBox label span{position:absolute;left:0;top:50%;z-index:1;width:26px;height:23px;border-radius:25px;transform:translate(3px, -50%);transition-duration:0.2s;background-color:#fff;text-indent:-9999px;}
-.switchBox label:before,label:after{position:absolute;top:0;width:52%;font-size:11px;line-height:27px;color:#fff;text-align:center;}
-.switchBox label:before{left:0;content:'ON';}
-.switchBox label:after{right:0;content:'OFF';}
-.switchBox input:checked + label span{transform:translate(31px, -50%);}
-.switchBox input:checked::before, .switchBox input:checked::after{border:none}
-.switch-base input:checked + label{color:#fff; background-color:#8597eb;}
-.switch-primary input:checked + label{color:#fff; background-color:#1ab394;}
-.switch-success input:checked + label{color:#fff; background-color:#1c84c6;}
-.switch-info input:checked + label{color:#fff; background-color:#23c6c8; }
-.switch-warning input:checked + label{color:#fff; background-color:#f8ac59;}
-.switch-danger input:checked + label{color:#fff; background-color:#ed5565;}
-.switch-black input:checked + label{color:#fff; background-color:#222;}
-.switchBox + .switchBox {margin-left:6px;}
-
-/* 테이블 스타일--------------- */
-.tableStyle {width:100%; max-width:100%; margin-bottom:15px;}
-.tableStyle th {position:relative; padding:7px 0; color:#333; border-top:1px solid #dae0fd; border-bottom:1px solid #dae0fd; border-right:1px solid #dae0fd; background-color:#e9ecfb; text-align:center;}
-.tableStyle th:last-child {border-right:none;}
-.tableStyle td {position:relative; padding:7px 0; border-right:1px solid #ebebeb; border-bottom:1px solid #ebebeb; text-align:center;}
-.tableStyle td:last-child {border-right:none;}
-.tableStyle tbody tr:nth-of-type(2n) {background-color:rgba(0, 0, 0, 0.02);}
-.tableStyle tbody tr:hover {background-color:rgba(224,243,255,0.6);}
-.tableStyle + .panelBar {padding-bottom:15px;}
-/* 스캔 */
-.scanTbl th {font-size:25px; line-height:80px;}
-.scanTbl td {line-height:80px;}
-.scanTbl input[type=text] {line-height:50px; font-size:32px;}
-.scanTbl .btn {overflow-y:hidden; margin-bottom:1px; padding:12px 30px; font-size:25px;}
-table.noPad tr > td, td.noPad {padding:0 !important;}
-th[rowspan] {border-bottom:1px solid #dae0fd;}
-td[rowspan] {border-bottom:1px solid #eee;}
-.nowrap {white-space:nowrap;}
-.solidR {border-right:1px solid #eee; vertical-align:middle;}
-.solidL {border-left:1px solid #eee; vertical-align:middle;}
-.solidT {border-top:1px solid #eee;}
-.solidB {border-bottom:1px solid #eee;}
-.dashR {border-right:1px solid #dae0fd;}
-.dashL {border-left:1px solid #dae0fd;}
-.noPad table.frmStyle > tr:first-child th {border-top:0 !important;}
-.noPad table.frmStyle > tr:first-child td {border-top:0 !important;}
-.noPad table.frmStyle > tr:last-child th {border-bottom:0 !important;}
-.noPad table.frmStyle > tr:last-child td {border-bottom:0 !important;}
-
-
-/* Q&A 스타일--------------- */
-.qnaStyle {width:100%; max-width:100%;}
-.qnaStyle th {position:relative; padding:7px 0; color:#333; border-top:1px solid #dae0fd; border-bottom:1px solid #dae0fd; border-right:1px solid #dae0fd; background-color:#e9ecfb; text-align:center;}
-.qnaStyle th:last-child {border-right:none;}
-.qnaStyle td {position:relative; padding:7px 0; text-align:center;}
-.qnaStyle tr td {border-bottom:1px solid #ecf5f7;}
-.qnaStyle tbody tr:nth-of-type(3n+1) td {background-color:rgba(224,243,255,0.6);}
-.qnaStyle tbody tr:nth-of-type(3n) td {border-bottom:1px solid #ddd;}
-.qnaClaim { text-align:left !important; padding-left:10px !important;}
-.qnaClaim .goods {font-weight:bold; line-height:26px;}
-.qnaClaim .cont {line-height:22px; padding:10px 0; color:#1d3e9d;}
-.qnaClaim .email {line-height:26px;}
-.qnaClaim .email em {border-bottom:1px solid #aaa;}
-.lineRound {border:2px solid #ccc; border-radius:15px; padding:4px 14px; font-weight:bold;}
-
-/* 사은품 프로모션 등록창 style */
-.frGoodsPro .padding10 {padding:10px;}
-.frGoodsPro .wid45 {width:45%;display:inline-block;}
-.frGoodsPro .inner-tb-solid {border:solid 1px #eee;}
-
-/* 내부 테이블 디자인 */
-.subTable {display:table; width:100%;}
-.subTable dl {display:table; width:100%;}
-.subTable dt, .subTable dd {display:table-cell;}
-.subTable dt {vertical-align:middle; white-space:nowrap; width:8%; padding:0 15px; background:#e9ecfb; text-align:center; border-bottom:1px solid #dae0fd;}
-.subTable dl:last-child dt {border-bottom:none;}
-.subTable dd {border-bottom:1px solid #eee; padding:3px 20px 3px 10px;}
-.subTable dl:last-child dd {border-bottom:none;}
-
-/* button --------------- */
-.btn {border-radius:3px; vertical-align:middle; white-space:nowrap;font-size:12px;user-select:none;}
-.btn-lg {padding:4px 20px 5px; height:28px; overflow-y:hidden;}
-.btn-sm {margin-top:-2px; line-height:100%; height:28px; overflow-y:hidden;}
-.btn-ssm {margin-top:-2px; line-height:100%; height:22px; overflow-y:hidden;}
-.btn + .btn {margin-left:6px;}
-.btn:first-child {margin-left:0;}
-
-/* 버튼 색상 */
-.btn-white {color:#555 !important; background-color:#fff !important; border:1px solid #ccc !important;}
-.btn-default {color:#555; background-color:#eee; border:1px solid #dcdcdc;}
-.btn-gray {color:#fff; background-color:#aaa; border:1px solid #aaa;}
-.btn-base {color:#fff; background-color:#8597eb; border:1px solid #8597eb;}
-.btn-primary {color:#fff; background-color:#1ab394; border:1px solid #1ab394;}
-.btn-success {color:#fff; background-color:#1c84c6; border:1px solid #1c84c6;}
-.btn-info {color:#fff; background-color:#23c6c8; border:1px solid #23c6c8;}
-.btn-pink {color:#fff; background-color:#feada6; border:1px solid #feada6;}
-.btn-warning {color:#fff; background-color:#f8ac59; border:1px solid #f8ac59;}
-.btn-danger {color:#fff; background-color:#ed5565; border:1px solid #ed5565;}
-.btn-dark {color:#fff; background-color:#6c757d; border:1px solid #6c757d;}
-.btn.icn {line-height:28px; height:28px; padding:0 8px; background-color:#eee; border:1px solid #dbdbdb;}
-.btn.icn i {padding-top:6px; width:12px; vertical-align:top; font-size:14px; text-align:center;}
-
-/* 페이징 --------------- */
-.tablePaging {position:relative; 	display:inline-block; vertical-align:middle;}
-.tablePaging a {display:inline-block; float:left; margin:0 5px; width:28px; height:28px; line-height:28px; text-align:center; border:1px solid #ccc; border-radius:50px; cursor:pointer;}
-.tablePaging a.arrow {background-color:rgba(0, 0, 0, 0.03); 	border-color:#ebebeb;}
-.tablePaging .num.on {background:#8597eb; color:#fff; border-color:#8597eb;}
-
-/* 다중 Select Box */
-.mSelectWrap select {display:none;}
-.mSelectBox {display:inline-block; position:relative; top:-1px; margin:2px 0 2px 0; padding:0 7px 0 0; width:100%; height:auto !important; min-height:29px; border:1px solid #e5e6e7; vertical-align:middle;}
-.mSelected {overflow:auto;}
-.mSelected li {float:left; margin:2px 5px 3px; line-height:24px; padding:0 7px; background:#dbedf9; -ms-user-select:none; -moz-user-select:-moz-none; -webkit-user-select:none; user-select:none;}
-.mSelected li.srchFld {margin:0; padding:0; background:none;}
-.mSelected .srchFld input {width:25px; margin:0; padding:0; border:none; outline:none;}
-.mSelected a {border:none !important; float:right; margin-left:3px; padding:0 3px; width:15px; line-height:22px; text-indent:-9999px; background:url('/image/btn_sltClose.png') no-repeat 100% 50%;}
-.mSelected a:hover {background:url('/image/btn_sltCloseOn.png') no-repeat 100% 50%;}
-.mSelecting {display:none; overflow-y:auto; overflow-x:hidden; position:absolute; top:100%; left:-1px; z-index:1; width:100%; max-height:156px; line-height:30px; border:1px solid #e5e6e7; background:#fff;}
-.mSelecting li {margin:0 10px; cursor:pointer;}
-
-/* 멀티 Select Box */
-.mSelWrap {display:inline-block;}
-.mSelWrap select {height:100px; padding:7px 0;}
-.mSelWrap .mSelBtn {margin:0 0 0 5px; float:right; width:33px; vertical-align:top;}
-.mSelWrap .mSelBtn .btn {margin:0; vertical-align:top;}
-.mSelWrap option {padding:4px 100px 4px 10px;}
-
-/* 파일첨부 --------------- */
-.uFile {overflow:hidden; position:relative; display:inline-block; margin:-2px 5px 0 0; width:80%; height:28px; vertical-align:middle; border:1px solid #dbdbdb;}
-.lrStyle .uFile {margin-top:2px;}
-.uFileInput {position:absolute; top:0; width:100%; margin:0 !important; padding:0 !important; line-height:28px; border:none !important;}
-.uFileLabel {position:absolute; top:0; right:0; left:0; z-index:1; margin:0; padding:0 7px; width:cals(100% - 7px); line-height:28px; height:28px; background-color:#fff; border-radius:1px; overflow:hidden; white-space:nowrap;}
-.uFileLabel::after {position:absolute; top:0; right:0; bottom:0; width:30px; z-index:3; line-height:28px; content:" "; border-left:1px solid #dbdbdb; background:#eee url('/image/icon_upload.png') no-repeat 50% 50%;}
-
-/* badge --------------- */
-.badge {float:right; margin-top:2px; padding:0 5px; min-width:9px; line-height:18px; color:#fff; font-size:12px; font-weight:600; border-radius:3px; text-align:center; text-shadow:1px 1px 1px rgba(0,0,0,0.4); letter-spacing:-0.5px;}
-.badge-warning {background-color:#ed7908;}
-.badge-primary {background-color:#1ab394;}
-.badge-danger {background-color:#ed5565;}
-.badge-success {background-color:#2fa4e7;}
-.badge-info {background-color:#23c6c8;}
-.badge.circle {border-radius:50px;}
-.dep3 .badge {position:relative; top:-28px; right:20px;}
-
-/* tag */
-.tagNum {display:inline-block; margin-left:5px; padding:0 3px 0 2px; min-width:13px; line-height:16px; font-weight:normal; color:#fc5555; background:#fff; border-radius:5px;}
-
-/* footer --------------- */
-footer {position:absolute; bottom:0; left:0; width:100%; height:40px; background-color:#fff; border-top:1px solid #e7eaec; line-height:39px; font-size:13px;}
-footer .f-left {float:left; padding-left:20px; line-height:38px;}
-footer .f-right {float:right; padding-right:20px; line-height:38px;}
-
-/* 이미지 카드 */
-.dexterArea {min-width:350px; min-height:180px; padding:0 !important; vertical-align:top; background:#f1f1f1; vertical-align:top;}
-.dexterTable {display:table; width:100%; overflow-y:auto;}
-.dexterTable > li {display:table-cell; vertical-align:top; line-height:23px;}
-.dexterNo div {padding:0 10px; border-top:1px solid #ddd; border-right:1px solid #ddd; background:#fff;}
-.dexterNo div:first-child {margin-top:36px;}
-.dexterNo div:last-child {border-bottom:1px solid #ddd;}
-
-/* 수정용 이미지 카드 */
-.cardArea {width:100%; padding:0 0 20px; overflow-y:auto;}
-.imgCard {vertical-align:top; position:relative; display:inline-block; margin:20px 20px 0 0; padding:10px 10px 0 10px; border:1px solid #dbdbdb;}
-.imgCard ul {display:table;}
-.imgCard li {display:table-cell;}
-.imgCard img {margin-right:15px;}
-.imgCard li:nth-of-type(2) {padding-top:20px; max-width:150px; line-height:24px}
-.imgCard p {font-size:12px;}
-.imgCard .cardClose {position:absolute; top:0; right:0; width:24px; background:url('/image/btn_sltClose.png') no-repeat 50% 50%; text-indent:-9999px;}
-.imgCard .cardClose:hover {background:#f1f1f1 url('/image/btn_sltCloseOn.png') no-repeat 50% 50%;}
-.verticalTop {vertical-align:top;}
-
-/* 조회용 이미지 카드 */
-.cardArea2 {padding:10px 0;}
-.cardArea2 ul, .cardArea2 .box {vertical-align:top; position:relative; display:inline-block; margin:10px; border:1px solid #dbdbdb; max-width:300px;}
-.cardArea2 li {display:table-cell; line-height:26px; vertical-align:middle;}
-.cardArea2 li:nth-of-type(2) {padding:0 10px;}
-.cardArea2 .cardDel {position:absolute; top:0; right:0; background:url('/image/btn_sltClose.png') no-repeat 50% 50%; text-indent:-9999px;}
-.cardArea2 .cardDel:hover {background:#f1f1f1 url('/image/btn_sltCloseOn.png') no-repeat 50% 50%;}
-
-/* 테이블 외부 안내문구 */
-.panelStyle > .notice {margin:0 0 15px ;}
-.panelContent > .notice {margin:15px 0;}
-.notice em {color:red;}
-.notice li, p.dot {padding-left:20px; background:url('/image/dot_bk.png') no-repeat 5px 10px; line-height:24px;}
-p.dot .btn {margin-left:10px !important;}
-p.dot em {color:red;}
-
-/* 정렬 */
-.txt {line-height:36px;}
-.aC {text-align:center !important;}
-.aR {text-align:right !important;}
-.aL {text-align:left !important;}
-.vaT {vertical-align:top !important;}
-.vaM {vertical-align:middle !important;}
-.vaB {vertical-align:bottom !important;}
-
-/* 테이블 내부 안내문구 */
-.infoTxt {line-height:26px; padding:5px 0;}
-.infoTxt i {margin-right:7px;}
-.infoTxt em {color:red;}
-.infoTxtTh {display:inline-block; text-align:left; font-weight:normal; font-size:12px;}
-.infoTxtTh li {padding-top:3px;}
-.infoTxtTh i {padding-right:5px;}
-.srchOption {overflow:auto; padding:10px 0; line-height:36px;}
-
-/* 유의사항 안내 */
-.infoBox {margin:0 20px 20px; padding:7px 10px; border-top:2px solid #dfe2e3; border-bottom:2px solid #dfe2e3; background:#fff}
-.infoBox p {padding-left:25px; line-height:20px; font-size:12px; background:url('/image/dot_bk.png') no-repeat 10px 50%; background-size:3px auto;}
-
-/* 검색결과 안내문 */
-.srchNotice {padding-bottom:7px; font-weight:normal; font-size:14px;}
-.srchNotice em {color:red;}
-
-/* 필수입력항목 */
-.required {display:inline-block; position:relative; top:-3px; width:12px; height:7px; background:url('/image/icon_required.png') no-repeat 0 50%;}
-
-
-/* COLOR DESIGN -------------------------------------*/
-/*Color :Base ---*/
-.color-mPurple header,span.color-mPurple {background:linear-gradient(135deg,#667eea 0,#764ba2 100%) !important;}
-.color-purple header,span.color-purple {background:#667eea !important;}
-
-/*Color :Gray ---*/
-.color-mGray header,span.color-mGray {background:linear-gradient(to right,#6c757d 0%,#555 100%) !important;}
-.color-gray header,span.color-gray {background:#666 !important;}
-.color-mGray .frmStyle th,.color-mGray .tableStyle th,.color-gray .frmStyle th,.color-gray .tableStyle th {background:#eee !important; 	border-top:1px solid #ddd; 	border-bottom:1px solid #ddd;}
-.color-mGray .tablePaging .num.on,.color-gray .tablePaging .num.on {background:#888 !important; 	border-color:#888 !important;}
-.color-mGray #lnb .dep3,.color-gray #lnb .dep3 {border-color:#777 !important;}
-.color-mGray .tabsJrNav li.on a,.color-gray .tabsJrNav li.on a {color:#333;}
-
-/*Color :Blue ---*/
-.color-mBlue header,span.color-mBlue {background:linear-gradient(to right,#4481eb 0%,#04befe 100%) !important;}
-.color-blue header,span.color-blue {background:#0042a5 !important;}
-.color-mBlue .frmStyle th,.color-mBlue .tableStyle th,.color-blue .frmStyle th,.color-blue .tableStyle th {background:#d8eafc !important; 	border-top:1px solid #ddd; 	border-bottom:1px solid #ddd;}
-.color-mBlue .tablePaging .num.on,.color-blue .tablePaging .num.on {background:#3e91de !important; 	border-color:#3e91de !important;}
-.color-mBlue #lnb .dep3,.color-blue #lnb .dep3 {border-color:#3e91de !important;}
-.color-mBlue .tabsJrNav li.on a,.color-blue .tabsJrNav li.on a {background:#d8eafc;}
-.color-mBlue .tabJr.on,.color-blue .tabJr.on {border-top:4px solid #d8eafc;}
-.color-mBlue .tabsJrNav li.on a,.color-blue .tabsJrNav li.on a {color:#333;}
-
-/*Color :Green ---*/
-.color-mGreen header,span.color-mGreen {background:linear-gradient(135deg,#00b09b 0,#96c93d 100%) !important;}
-.color-green header,span.color-green {background:#00b09b !important;}
-.color-mGreen .frmStyle th,.color-mGreen .tableStyle th,.color-green .frmStyle th,.color-green .tableStyle th {background:#e5f7f5 !important; 	border-top:1px solid #ddd; 	border-bottom:1px solid #ddd;}
-.color-mGreen .tablePaging .num.on,.color-green .tablePaging .num.on {background:rgba(0,176,155,0.8); 	border-color:rgba(0,176,155,0.8) !important;}
-.color-mGreen #lnb .dep3,.color-green #lnb .dep3 {border-color:#00b09b !important;}
-.color-mGreen .tabsJrNav li.on a,.color-green .tabsJrNav li.on a {background:#e5f7f5;}
-.color-mGreen .tabJr.on,.color-green .tabJr.on {border-top:4px solid #e5f7f5;}
-.color-mGreen .tabsJrNav li.on a,.color-green .tabsJrNav li.on a {color:#333;}
-
-/*Color :Pink ---*/
-.color-mPink header,span.color-mPink {background:linear-gradient(to right, rgb(242, 112, 156), rgb(255, 148, 114)) !important;}
-.color-pink header,span.color-pink {background:#feada6 !important;}
-.color-mPink .frmStyle th,.color-mPink .tableStyle th,.color-pink .frmStyle th,.color-pink .tableStyle th {background:#fff7f6 !important; border-top:1px solid #ddd; border-bottom:1px solid #ddd;}
-.color-mPink .tablePaging .num.on,.color-pink .tablePaging .num.on {background:#feada6; 	border-color:#feada6 !important;}
-.color-mPink #lnb .dep3,.color-pink #lnb .dep3 {border-color:#feada6 !important;}
-.color-mPink .tabsJrNav li.on a,.color-pink .tabsJrNav li.on a {background:#fff7f6;}
-.color-mPink .tabJr.on,.color-pink .tabJr.on {border-top:4px solid #fff7f6;}
-.color-mPink .tabsJrNav li.on a,
-.color-pink .tabsJrNav li.on a {color:#333;}
-
-/*Color :black ---*/
-.color-black header, span.color-black{background:#3E3E3E !important;}
-.color-black .header-logo{background:#000 !important;}
-.color-black .header-menu .menu a{background:#000 !important;}
-.color-black .header-menu .menu a.on{background:#fff !important; color:#000 !important;}
-.color-black #lnb-wrapper{background-color:#b2b2b2 !important;}
-.color-black #lnb .dep2{background-color:#545454 !important;}
-.color-black #lnb .dep3{border-color:#000 !important;}
-.color-black #lnb .dep3{background:#fdfdfd !important;  }
-.color-black #lnb .dep3 a{color:#111111 !important;}
-.color-black #lnb a{color:#fff !important;}
-.color-black .frmStyle th, .color-black .tableStyle th, .color-black .frmStyle th, .color-black .tableStyle th{background:#eee !important; 	border-top:1px solid #ddd; border-bottom:1px solid #ddd;}
-.color-black .tablePaging .num.on, .color-black .tablePaging .num.on{background:#888 !important; 	border-color:#888 !important;}
-.color-black .tabsJrNav li.on a, .color-black .tabsJrNav li.on a{color:#333; background:#eee !important}
-.color-black .tabJr.on, .color-black .tabJr.on { border-top:4px solid #eee;}
-
-/* 폰트 컬러, 폰트 두께 */
-.cBlue {color:#127fdc !important;}
-.cGray {color:#666 !important;}
-.cRed {color:red !important;}
-.bold {font-weight:bold !important;}
-
-/* 배경 투명도 */
-.bgOp6 {opacity:0.6; color:#000 !important;}
-
-/* 여백 지정 */
-hr {border:0; padding-bottom:10px;}/* 기본 여백 :10px */
-.pad10 {padding:10px 0 !important;}
-.pad15 {padding:15px 0 !important;}
-.pad20 {padding:20px 0 !important;}
-.padT3 {padding-top:3px !important;}
-.padT5 {padding-top:5px !important;}
-.padT10 {padding-top:10px !important;}
-.padT15 {padding-top:15px !important;}
-.padT20 {padding-top:20px !important;}
-.padT30 {padding-top:30px !important;}
-.padT40 {padding-top:40px !important;}
-.padR20 {padding-right:20px !important;}
-.padL10 {padding-left:10px !important;}
-.padB5 {padding-bottom:5px !important;}
-.padB10 {padding-bottom:10px !important;}
-.padB15 {padding-bottom:15px !important;}
-.padB20 {padding-bottom:20px !important;}
-.padB30 {padding-bottom:30px !important;}
-.padB40 {padding-bottom:40px !important;}
-.marT5 {margin-top:5px !important;}
-.marT10 {margin-top:10px !important;}
-.marT15 {margin-top:15px !important;}
-.marT20 {margin-top:20px !important;}
-.marR3 {margin-right:3px !important;}
-.marL5 {margin-left:5px !important;}
-.marL10 {margin-left:10px !important;}
-.marL20 {margin-left:20px !important;}
-.marR10 {margin-right:10px !important;}
-.marR20 {margin-right:20px !important;}
-
-/* 넓이 지정 --------------- */
-.w20 {width:20px !important;}
-.w50 {width:50px !important;}
-.w60 {width:60px !important;}
-.w70 {width:60px !important;}
-.w80 {width:80px !important;}
-.w90 {width:80px !important;}
-.w100 {width:100px !important;}
-.w130 {width:130px !important;}
-.w150 {width:150px !important;}
-.w200 {width:200px !important;}
-.w300 {width:300px !important;}
-.w400 {width:400px !important;}
-.w500 {width:500px !important;}
-.w600 {width:600px !important;}
-.w800 {width:800px !important;}
-.w100p {width:100% !important;}
-.w90p {width:90% !important;}
-.w80p {width:80% !important;}
-.w70p {width:70% !important;}
-.w60p {width:60% !important;}
-.w50p {width:50% !important;}
-.w40p {width:40% !important;}
-.w30p {width:30% !important;}
-.w20p {width:20% !important;}
-.h100 {height:100px !important;} /*alert, confirm 컨텐츠 높이에 사용*/
-
-
-/*-- 캘린더 --------------*/
-#calendar {max-width:900px; margin:20px 0 50px 20px;}
-
-/*-- error page --------------*/
-#errPage {padding-top:40px; width:650px; background:#fff; position:relative; top:48%; left:50%; transform:translate(-50%,-50%); -ms-transform:translate(-50%,-50%); border-radius:9px; vertical-align:middle; overflow:hidden; box-shadow:0 0 2px 0 rgba(0,0,0,0.12), 0 2px 2px 0 rgba(0,0,0,0.24);}
-#errPage .errImg {padding-left:50px; display:table-cell; vertical-align:middle; padding-bottom:30px;}
-#errPage .errImg div {border-radius:50%; position:relative; display:inline-block; width:140px; height:140px; color:#fff; background:#d196e4; box-shadow:2px 2px 6px 0 rgba(0,0,0,0.2) inset;}
-#errPage .fa-television {position:absolute; top:30px; left:28px; font-weight:bold; font-size:80px;}
-#errPage .fa-info {position:absolute; top:49px; left:66px; font-size:34px;}
-#errPage .errTxt {padding:0 50px; display:table-cell; padding-bottom:40px;}
-#errPage .errTxt .ttl {font-size:16px; font-weight:bold; padding-bottom:20px;}
-#errPage .errTxt .cont { padding-bottom:20px; line-height:26px;}
-#errPage .errTxt .tel {color:#777;}
-#errPage .errBtn {width:100%; background:#f9f9fa; line-height:70px; text-align:right;}
-#errPage .errBtn .btn {margin-right:30px; border-radius:33px; background:#858b90; color:#fff; padding:5px 30px; line-height:24px; font-weight:bold; -webkit-transition:0.2s; transition:0.2s;}
-#errPage .errBtn .btn:hover {background:#555;}
-
-/*-- DEXTER --------------*/
-.dexterNo { width:43px;}
-.dexterNo div { padding:0 10px; border-top:1px solid #ddd; border-right:1px solid #ddd; background:#fff; text-align:right;}
-.dexterNo div:first-child {margin-top:28px;}
-
-/*-- 회원추가 --------------*/
-.memAddWrap {line-height:26px; padding:3px 0;}
-.memAdd {margin-right:15px; padding:2px 27px 2px 0; position:relative; line-height:24px; height:24px; white-space:nowrap;}
-.memAdd button {position:absolute; top:3px; right:0; bottom:0; width:18px; height:18px; border:1px solid #dbdbdb; border-radius:3px; text-indent:-9999px; background:#eee url('/image/btn_sltClose.png') no-repeat 50% 50%;}
-.memAdd button:hover {background:#eee url('/image/btn_sltCloseOn.png') no-repeat 50% 50%;}
-
-/*-- Date Picker --------------*/ /* 20200521 수정 */
-table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
-.mtz-monthpicker-month {padding:7px; cursor:pointer;}
-.ui-datepicker-trigger {padding:0;}
-.ui-datepicker {z-index:800 !important; text-align:center; background:#fff;}
-.ui-datepicker .ui-datepicker-today,
-.ui-datepicker .ui-state-highlight {background:#fff7cf !important;}
-.ui-datepicker .ui-state-active {border:1px solid red !important;}
-.ui-datepicker .ui-datepicker-prev {position:absolute; top:3px; left:3px; width:30px; line-height:30px; text-indent:-9999px; background:url('/image/icon_prev.png') no-repeat 50% 50%;}
-.ui-datepicker .ui-datepicker-next {position:absolute; top:3px; right:3px; width:30px; line-height:30px; text-indent:-9999px; background:url('/image/icon_next.png') no-repeat 50% 50%;}
-.ui-datepicker .ui-datepicker-calendar {padding:5px; border:1px solid #ddd; border-top:none; text-align:center;}
-.ui-datepicker .ui-datepicker-calendar th{padding:5px 0}
-.ui-datepicker-week-end {text-align:center;}
-.ui-datepicker-calendar .ui-state-default {display:inline-block; text-align:center; width:32px; line-height:24px; border:none;}
-.ui-datepicker-header {position:relative; background:#d0e9ff; text-align:center; padding:5px; border:1px solid #ddd; border-bottom:none;}
-.ui-datepicker-buttonpane button {background-color:#eee; border:1px solid #dcdcdc; line-height:24px; border-radius:3px; margin:0 5px 5px 5px;}
-.ui-datepicker-current {float:left;}
-.ui-datepicker-close {float:right;}
-
-/* prograss bar */
-.prograssWrap {display:flex; flex-direction:row;}
-.prograssWrap > li {display:flex; align-items:center;}
-.prograssWrap > li:nth-of-type(1) {width:96%}
-.prograssWrap > li:nth-of-type(2) {margin-left:1.5rem !important}
-.prograss-lg {display:flex; width:100%; height:1rem; background-color:#f4f5fd; border-radius:.65rem; overflow:hidden; box-shadow:inset 0 1px 2px rgba(0,0,0,.1);}
-.prograss-sm {display:flex; width:100%; height:.5rem; background-color:#f4f5fd; border-radius:.65rem; overflow:hidden; box-shadow:inset 0 1px 2px rgba(0,0,0,.1);}
-.prograss-bar {display:flex; border-top-right-radius:.65rem; border-bottom-right-radius:.65rem; transition:width .6s ease;}
-.prograss-bar.bg-info {background-color:#11c5db;}
-.prograss-txt.bg-info {color:#11c5db; font-weight:bold;}
-.prograss-bar.bg-success {background-color:#1bc943;}
-.prograss-txt.bg-success {color:#1bc943; font-weight:bold;}
-.prograss-bar.bg-danger {background-color:#f83245;}
-.prograss-txt.bg-danger {color:#f83245; font-weight:bold;}
-.prograss-bar.bg-base {background:linear-gradient(135deg,#667eea 0,#764ba2 100%);}
-.prograss-txt.bg-base {color:#8597eb; font-weight:bold;}
-
-/* Multi CheckBox */
-.multiCheckBox {position:relative; display:inline-block; width:auto; line-height:27px; margin:3px 3px 3px 0;}
-.multiCheckBox .sltBtn {padding-left:5px; width:100%; height:27px; color:#555; text-align:left; border:1px solid #dbdbdb; box-sizing:border-box; -webkit-touch-callout:none; -webkit-user-select:none; -ms-user-select:none; user-select:none;}
-.multiCheckBox .sltBtn::after {position:absolute; top:6px; right:10px; content:''; width:7px; height:7px; border-bottom:1px solid #555; border-left:1px solid #555; -webkit-transform:rotate(-45deg); transform:rotate(-45deg);}
-.multiCheckBox .sltBtn.on::after {top:10px; -webkit-transform:rotate(135deg); transform:rotate(135deg);}
-.multiCheckBox ul {display:none; position:absolute; top:26px; left:0; z-index:1; width:100%; height:auto; border:1px solid #dbdbdb; background:#fff;}
-.multiCheckBox li {padding:3px 10px;}
-.multiCheckBox li:hover {background-color:Highlight; color:HighlightText;}
-.multiCheckBox label {display:flex;}
-
-/* checkBox More */
-.checkBoxList {overflow:hidden; padding-right:36px; height:36px;}
-.checkBoxList.on {overflow:visible; height:auto;}
-.checkBoxList .more {position:absolute; top:-1px; right:0; width:36px; height:38px; border:1px solid #eee; background:#f7f7f7;}
-.checkBoxList ul {display:flex; flex-wrap:wrap;}
-.checkBoxList li {justify-content:flex-start; line-height:36px;}
-.checkBoxList[data-unit='1'] li {flex-basis:100%;}
-.checkBoxList[data-unit='2'] li {flex-basis:50%;}
-.checkBoxList[data-unit='3'] li {flex-basis:33%;}
-.checkBoxList[data-unit='4'] li {flex-basis:25%;}
-.checkBoxList[data-unit='5'] li {flex-basis:20%;}
-.checkBoxList[data-unit='6'] li {flex-basis:16.6%;}
-.checkBoxList[data-unit='7'] li {flex-basis:14.2%;}
-.checkBoxList[data-unit='8'] li {flex-basis:12.5%;}
-
-/* 아이콘 툴팁 버튼 */
-.iconTooltip {display:inline-block; position:relative; margin-right:10px;}
-.iconTooltip i {position:relative; color:#46a1ff; width:15px; height:15px; line-height:16px; border-radius:50%; border:1px solid #46a1ff; cursor:pointer; text-align:center;}
-.iconTooltip:hover i {box-shadow:0px 3px 7px 0px rgba(0,0,0,0.4);}
-.iconTooltip span {display:none; position:absolute; top:36px; z-index:5; padding:10px 15px; line-height:24px; color:#fff; background:#6d6d6d; box-shadow:0px 3px 7px 0px rgba(0,0,0,0.2); border-radius:5px;}
-.iconTooltip span:after {position:absolute; top:-4px; content:''; background:#6d6d6d; width:8px; height:8px; -ms-transform:rotate(-45deg); -webkit-transform:rotate(-45deg); transform:rotate(-45deg);}
-.iconTooltip span.left {left:-10px}
-.iconTooltip span.left:after {left:15px;}
-.iconTooltip span.right {right:-10px}
-.iconTooltip span.right:after {right:15px;}
-.iconTooltip span.center {left:50%;}
-.iconTooltip span.center:after {right:5px;}
-.iconTooltip:hover span{display:block;}
-
-/* 상품이동 */
-.itemMove {display:inline-block; width:800px; border:1px solid #eee;}
-.itemMove .item {float:left; display:table; margin:0 10px 20px 0; width:220px; border:1px solid #eee;}
-.itemMove .item li {display:table-cell; vertical-align:top;}
-.itemMove .item li:nth-of-type(1) {width:80px;}
-.itemMove .item li:nth-of-type(1) img {width:80px; height:80px;}
-.itemMove .item button {width:16px; height:16px; text-indent:-9999px;}
-.itemMove .item input {width:30px; height:14px !important; line-height:14px}
-.itemMove .item li:nth-of-type(2) div {line-height:20px}
-
-/* 상품 Dragable :20200129 */
-.sortableWrap #sortable { overflow-y:auto }
-.sortableWrap {margin:20px 0; width:100%; max-height:675px;}
-.sortableWrap .itemWrap {display:inline-block;}
-.sortableWrap .item {float:left; margin-right:12px; margin-bottom:12px; padding:5px 8px; line-height:20px; border:1px solid #ddd; vertical-align:top; background:#fff;}
-.sortableWrap .item > li {float:left; vertical-align:middle;}
-.sortableWrap .item .img {margin-top:3px; margin-right:10px; width:80px;}
-.sortableWrap .item .img img {width:80px; height:80px; cursor:move;}
-.sortableWrap .btnArea {text-align:center; margin-top:15px; padding:0 10px;}
-.sortableWrap button.icnSm {overflow:hidden; position:relative; width:24px; height:20px; background-color:#fff;}
-.sortableWrap button.icnSm i {position:absolute; top:-4px; left:-3px; width:24px; line-height:24px; font-size:15px; color:#888;}
-.sortableWrap button.icnSm:hover i {color:#111;}
-.sortableWrap button.icnSm:last-child {margin-right:0;}
-.sortableWrap .item .cont {width:114px;}
-.sortableWrap .item .cont li em {margin:0 3px 0 7px;}
-.sortableWrap .item .cont .no {font-weight:bold; padding-bottom:3px;}
-.sortableWrap .item .cont .title {padding-bottom:3px; border-bottom:1px solid #eee;}
-.sortableWrap .item .cont .price {padding-top:3px; padding-bottom:3px;}
-.sortableWrap .item .cont input {margin-left:5px; width:37px;}
-
-
-.ag-theme-balham.lh60 .ag-cell {line-height:60px !important; height:60px;}
-.ag-theme-balham.lh70 .ag-cell {line-height:70px !important; height:70px;}
-.ag-theme-balham.lh80 .ag-cell {line-height:80px !important; height:80px;}
-.ag-theme-balham.lh90 .ag-cell {line-height:90px !important; height:90px;}
-.ag-theme-balham.lh100 .ag-cell {line-height:100px !important; height:100px;}
-.ag-theme-balham.lh110 .ag-cell {line-height:110px !important; height:110px;}
-.ag-theme-balham.lh120 .ag-cell {line-height:120px !important; height:120px;}
-
-
-/* 테이블 상품명 클릭시 이미지 레이어 활성화 */
-.viewImg {position:relative; color:blue; cursor:pointer}
-.thumbLayer {display:inline-block; position:absolute; top:0; right:0; z-index:5; border:1px solid #ddd}
-.thumbLayer img {width:100%; height:auto;}
-
-/* dashboard */
-.flexWrap{display:-ms-flexbox; display:flex; -ms-flex-wrap:wrap; flex-wrap:wrap; color:#676a6c;}
-.flexWrap li{padding:0 20px 20px; width:calc(33.3%);}
-.flexWrap.unit4 li{width:calc(25%);}
-.flexWrap.unit5 li{width:calc(20%);}
-.flexWrap.unit6 li{width:calc(16.6%);}
-.flexWrap .title{padding:15px; font-weight:600; border:1px solid #e7eaec; border-top:2px solid #e7eaec;}
-.flexWrap .title h5{font-size:15px; font-weight:bold;}
-.flexWrap .title span{float:right; padding:1px 8px; font-size:10px; border-radius:0.25em;}
-.flexWrap .content{padding:15px; border:1px solid #e7eaec; border-top:none;}
-.flexWrap .content em{font-size:30px; font-weight:200;}
-.statText {margin-top:5px}
-.statText::after{display:block; clear:both; content:''}
-.statText span:nth-of-type(1){float:left; font-size:11px;}
-.statText span:nth-of-type(2){float:right; font-size:13px; font-weight:600;}
-.txt-success{color:#1c84c6;}
-.txt-info{color:#23c6c8;}
-.flexWrap .txt-danger{color:#ed5565;}
-.flexWrap .bg-success{background:#1c84c6;}
-.flexWrap .bg-info{background:#23c6c8;}
-.flexWrap .bg-danger{background:#ed5565;}
-.btn.on{-webkit-box-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);}
-.dbChart .btn-group{float:right; line-height:37px;}
-.dbChart .btn-group button{margin:0; height:23px;}
-.dbChart .boxleft{float:left; margin:20px 15px 20px 15px; width:calc(100% - 490px);}
-.dbChart .boxRight{float:left; margin:20px 20px 20px 40px; width:400px;}
-.dbChart .boxRight em{font-size:24px; font-weight:200;}
-.dbChart .boxRight > div{margin-bottom:25px;}
-.dbChart .boxRight .statText .c1 {color:#FF7043}
-.dbChart .boxRight .progress .c1 {background:#FF7043}
-.dbChart .boxRight .statText .c2 {color:#48C9B0}
-.dbChart .boxRight .progress .c2 {background:#48C9B0}
-.dbChart .boxRight .statText .c3 {color:#ca9900}
-.dbChart .boxRight .progress .c3 {background:#FFD54F}
-.progress{display:-ms-flexbox; display:flex; margin-top:5px; height:1rem; overflow:hidden; font-size:.75rem; background-color:#e9ecef; border-radius:.25rem;}
-.progress-mini{height:5px; margin-bottom:0;}
-.progress > div{height:5px; margin-bottom:0; transition:width 0.3s;}
-
-
-/* 카테고리 Sort */
-.categoryOrder {margin-bottom:15px; background:#fcfcfc;}
-.categoryOrder li {clear:both; padding-left:15px; line-height:40px; cursor:move; border-top:1px dashed red; }
-.categoryOrder li button.on {background-image:url(/image/icon_cate_minus.png);}
-/* .categoryOrder li:after {content:''; position:absolute; top:8px; left:-10px; width:21px; height:21px; background:url(/image/line_cate.png)} */
-.categoryOrder li:before{position:relative; content:''; width:1px; height:100%; background:#ddd;}
-.categoryOrder li ol{display:none}
-/* .categoryOrder ol:last-child li {background-image:none !important} */
-.categoryOrder button{position:relative; z-index:200; padding:0 15px 0; margin:0; line-height:40px; cursor:pointer; background-image:url(/image/icon_cate_plus.png); background-repeat:no-repeat; background-position:0 0;}
-
-
-
-/* 반응형:GNB 유저명,등급,로그아웃 --------------- */
-@media ( max-width:1370px ) {
- .header-info { display:none;}
- .header-info-sm { display:inline-block;}
-}
-
-/* 반응형 :dashboard(20200522) --------------- */
-@media ( max-width:1023px ) {
- /* 대시보드 */
- #wrapper.dashboard{width:100%; min-width:100%;}
- .dashboard .header-logo{width:100%}
- .dashboard #lnb-wrapper{display:none;}
- .dashboard .header-menu{display:none;}
- .dashboard .tabs{margin-left:0; margin-right:0;}
- .dashboard .tabs h2{position:relative; margin:10px 15px}
- .dashboard .tabsNav li:first-child{margin-left:0}
- .dashboard .tabsNav li:last-child{margin-right:0}
- .dashboard .tabsNav li a{font-size:16px}
- .dashboard .flexWrap li{width:100%}
- .dashboard .flexWrap.unit4 li{width:100%}
- .dashboard .flexWrap.unit5 li{width:100%}
- .dashboard .flexWrap.unit6 li{width:100%}
- .dashboard .boxStyle{margin-left:0; margin-right:0;}
- .dashboard .dbChart .boxleft{clear:left; margin:30px 15px 0 0; width:100%;}
- .dashboard .dbChart .boxRight{clear:right; width:100%; margin:30px 20px 20px;}
-}
-
-/* Fix Input Zoom on devices older than iPhone 5:*/
-@media screen and (device-aspect-ratio:2/3) {
-  select, textarea, input[type="text"], input[type="password"],
-  input[type="datetime"], input[type="datetime-local"],
-  input[type="date"], input[type="month"], input[type="time"],
-  input[type="week"], input[type="number"], input[type="email"],
-  input[type="url"]{ font-size:16px;}
-}
-
-/* Fix Input Zoom on iPhone 5, 5C, 5S, iPod Touch 5g */
-@media screen and (device-aspect-ratio:40/71) {
-  select, textarea, input[type="text"], input[type="password"],
-  input[type="datetime"], input[type="datetime-local"],
-  input[type="date"], input[type="month"], input[type="time"],
-  input[type="week"], input[type="number"], input[type="email"],
-  input[type="url"]{ font-size:16px;}
-}
-
-/* Fix Input Zoom on iPhone 6, iPhone 6s, iPhone 7 */
-@media screen and (device-aspect-ratio:375/667) {
-  select, textarea, input[type="text"], input[type="password"],
-  input[type="datetime"], input[type="datetime-local"],
-  input[type="date"], input[type="month"], input[type="time"],
-  input[type="week"], input[type="number"], input[type="email"],
-  input[type="url"]{ font-size:16px;}
-}
-
-/* Fix Input Zoom on iPhone 6 Plus, iPhone 6s Plus, iPhone 7 Plus, iPhone 8, iPhone X, XS, XS Max */
-@media screen and (device-aspect-ratio:9/16) {
-  select, textarea, input[type="text"], input[type="password"],
-  input[type="datetime"], input[type="datetime-local"],
-  input[type="date"], input[type="month"], input[type="time"],
-  input[type="week"], input[type="number"], input[type="email"],
-  input[type="url"]{ font-size:16px;}
-}
-
+@import url("https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700"); @import url("https://fonts.googleapis.com/css?family=Roboto:400,300,500,700"); html,body {position:relative; height:100%;}
+html, body, header, div, ul, ol, li, dl, dt, dd, h1, h2, h3, h4, h5, h6, label, a, p, form, input, textarea, table, hr, span, em {margin:0; padding:0; box-sizing:border-box;}
+body {overflow-x:hidden; font-family:"open sans", "Roboto", "Malgun Gothic", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size:12px; background-color:#f3f3f4;}
+h1, h2, h3, h4, h5, h6 {display:inline-block;}
+ul, ol {list-style:none;}
+ul::after, ol::after {display:block; clear:both; content:'';}
+img {vertical-align:middle; border-style:none;}
+a {text-decoration:none;}
+em, i {font-style:normal;}
+table {border-collapse:collapse;}
+th {text-align:inherit;}
+label {position:relative; margin-right:20px; display:inline-block; -webkit-touch-callout:none; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none;}
+label:last-child {margin-right:0 !important;}
+input,button,select,textarea {font-family:inherit; font-size:inherit;}
+input.btn-sm {padding:1px 6px;}
+input[type=text] {width:100%;}
+input[type=text], input[type=file], input[type=date], [type=password], textarea {padding:4px 3px 4px 5px; color:inherit; border-radius:1px; vertical-align:middle; margin:1px 3px 2px 0;}
+input[type=date],input[type=time],input[type=datetime-local],input[type=month] {-webkit-appearance:listbox;}
+input[readonly="readonly"], input[disabled="disabled"], input[readonly="readonly"]:before, input[disabled="disabled"]:before, select[readonly="readonly"], select[disabled="disabled"] {background-color:#eee !important;}
+button, select {text-transform:none;}
+button,[type=button],[type=reset],[type=submit] {margin:0; -webkit-appearance:button; border-radius:0; cursor:pointer; background-color:transparent; border-color:transparent;}
+button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner {padding:0; border-style:none;}
+textarea {overflow:auto; resize:vertical; width:100%; margin:4px 0; vertical-align:middle; line-height:22px; height:32px;}
+.textareaR2 {min-height:60px; line-height:26px;}
+.textareaR3 {min-height:96px; line-height:26px;}
+.textareaR4 {min-height:134px; line-height:26px;}
+.byteChk {line-height:20px; padding-left:20px; display:inline-block; vertical-align:middle;}
+select {margin:0 3px 1px 0; padding:3px 10px 3px 3px; color:inherit; border-radius:1px; vertical-align:middle;}
+select, input[type=text], input[type=file], input[type=date], input[type=password], textarea {border:1px solid #dbdbdb;}
+select:focus, input:focus, textarea:focus, button:focus, .outline {outline:2px auto #4D90FE;}
+.formControl {background:#eee;}
+.off {display:none !important;}
+.scrollOff {overflow:hidden;}
+.f25 {font-size:25px;}
+
+html,body,#wrapper,#container {min-height:100%; height:100%;}
+#wrapper {position:relative; min-width:1240px;}
+
+/* 로그인 --------------- */
+.loginBg {background:#f3f3f4;}
+.loginWrap {width:500px; box-shadow:0 7px 7px -5px rgba(0, 0, 0, 0.1);}
+.loginWrap .loginBox input[type=text],
+.loginWrap .loginBox input[type=password]{padding:10px; width:100%; border:1px solid #ced4da; border-radius:.25rem;}
+.loginWrap .loginBox li:nth-of-type(2), .loginBox li:nth-of-type(3) {padding-bottom:10px;}
+.loginWrap .loginBox li:nth-of-type(4) {padding:10px 0 50px 0; line-height:30px; text-align:left;}
+.loginWrap .loginBox li:nth-of-type(5) {margin-bottom:30px; text-align:center;}
+.loginWrap .loginBox a {display:inline-block; padding:10px;}
+.loginWrap .loginBox .dot {color:#ccc;}
+.loginWrap .btn-black {background-color:#555; color:#fff; font-weight:bold; float:right; margin:0 !important;}
+.loginWrap .btn-black:hover{background-color:#000; box-shadow:none;}
+.loginWrap .btn-purple {background-color:#667eea; color:#fff; font-weight:bold; float:right; margin:0 !important;}
+.loginWrap .btn-purple:hover{background-color:#2e38cb; box-shadow:none;}
+.loginWrap .loginInfo {color:#888; line-height:23px; text-align:left;}
+.loginWrap .loginInfo em i {margin-right:7px;}
+.loginWrap .loginInfo p:first-child{margin-bottom:15px;}
+.loginWrap .loginInfo p span {display:inline-block; margin-bottom:15px; line-height:40px; font-size:16px; font-weight:bold; border-bottom:1px solid #000;}
+
+/* 로그인 style :black */
+.login_black {position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); -ms-transform:translate(-50%, -50%); background:#fff;}
+.login_black .logo { padding:25px 0; text-align:center; background:#000;}
+.login_black .loginInfo em {color:#555; font-weight:bold;}
+.login_black .loginCont > ul {padding:60px 60px 70px;}
+.login_black .loginBox li:nth-of-type(5) {border-top:1px solid #e4e4e4; border-bottom:1px solid #e4e4e4;}
+.login_black .loginBox a {color:#555}
+
+/* 보안 인증 */
+.loginWrap .certiFrm {padding:40px 60px 70px;}
+.loginWrap .certiFrm h2{margin:10px 0 30px;}
+.loginWrap .certiFrm h2 i{margin-right:10px;}
+.loginWrap .certiFrm .alertBox{margin-bottom:15px}
+.loginWrap .certiFrm .input{height:45px; position:relative;}
+.loginWrap .certiFrm .input input[type=text]{position:relative; padding:10px; width:45px; height:45px; line-height:45px; font-size:16px; border:1px solid #ced4da; border-radius:.25rem; text-align:center;}
+.loginWrap .certiFrm .input input[type=text]:focus{color:#4D90FE;font-weight:bold;}
+.loginWrap .certiFrm .input .countdown{display:inline-block; position:relative; padding-left:20px; line-height:45px; height:45px;color:red; text-align:center;vertical-align:top; font-size:14px}
+.loginWrap .certiFrm .info{margin-top:20px; line-height:22px; color:#555;}
+.loginWrap .certiFrm .button{margin:25px 0 50px;}
+.loginWrap .certiFrm .button button{margin:0 5px !important; padding:5px 20px; height:32px; float:right}
+.loginWrap .certiFrm .button button:focus{outline:2px auto #4D90FE !important; }
+.loginWrap .certiFrm .button .btn-black{width:100px !important;}
+
+/* 로그인 :alert */
+.alertBox {position:relative; padding:10px 40px 10px 10px; margin-bottom:10px; border:1px solid; border-radius:.25rem; line-height:22px;}
+.alertBox .alertClose {position:absolute; top:0; right:5px; padding:0 10px; height:40px; text-indent:-9999px; background:url('../../image/btn_sltClose.png') no-repeat 50% 50%;}
+.alertBox .alertClose:hover {background:url('../../image/btn_sltCloseOn.png') no-repeat 50% 50%;}
+.alert-success {color:#155724; background-color:#d4edda; border-color:#c3e6cb;}
+.alert-info {color:#0c5460; background-color:#d1ecf1; border-color:#bee5eb;}
+.alert-warning {color:#856404; background-color:#fff3cd; border-color:#ffeeba;}
+.alert-danger {color:#721c24; background-color:#f8d7da; border-color:#f5c6cb;}
+
+/* header--------------- */
+header {position:fixed; top:0; left:0; right:0; z-index:10; min-width:1240px; width:100%; height:60px; line-height:60px; color:#fff; background:linear-gradient(135deg,#667eea 0,#764ba2 100%);}
+header a, header button {color:#fff;}
+.header-logo {float:left; width:260px; line-height:60px; background:rgba(250, 251, 252, 0.1); overflow:hidden;}
+.header-logo a {display:inline-block; margin:0 10px 0 20px; width:184px; height:60px;}
+.header-logo .lnbClose {width:30px; line-height:30px; display:inline-block !important;}
+.header-logo .lnbClose:hover {color:rgba(255, 255, 255, 0.8);}
+.header-menu {position:absolute; left:260px; padding:0 0 0 30px; font-weight:bold;}
+.header-menu .menu {display:inline-block; -ms-user-select:none; -webkit-user-select:none; user-select:none;}
+.header-menu .menu a {display:inline-block; margin-right:7px; padding:0 14px; line-height:34px; border-radius:50px; background:rgba(0, 0, 0, 0.07);}
+.header-menu .menu a:hover {color:rgba(255, 255, 255, 0.8);}
+.header-menu .menu a.on {background:rgba(0, 0, 0, 0.3);}
+.header-info {display:inline-block; float:right; margin-right:20px;}
+.header-info a {color:rgba(255, 255, 255, 0.8);}
+.header-info a:hover {color:#fff;}
+.header-info i.heart {font-size:6px; color:rgba(255, 255, 255, 0.4); margin-right:3px;}
+.header-info i.dot {font-size:13px; color:rgba(255, 255, 255, 0.4); margin:0 3px;}
+.header-info-sm {display:none; float:right; margin-right:20px;}
+.header-info-sm a {display:inline-block; padding:0 7px; color:rgba(255, 255, 255, 0.8);}
+.header-info-sm a:hover {color:#fff;}
+
+/* GNB:툴팁--------------- */
+.tooltip .tooltiptext {visibility:hidden; position:absolute; top:48px; right:20px; z-index:1; padding:0 15px; line-height:30px; color:#fff; font-size:13px; text-align:center; background-color:#233646; border-radius:3px;}
+.tooltip .tooltiptext::after {content:""; position:absolute; bottom:100%; right:38px; border-width:5px; border-style:solid; border-color:transparent transparent #233646 transparent;}
+.tooltip .tooltiptext.logout::after {right:10px;}
+.tooltip:hover .tooltiptext {visibility:visible;}
+
+/* LNB--------------- */
+#lnb-wrapper {position:fixed; top:60px; left:-260px; width:260px; height:100%; vertical-align:top; overflow-y:auto; transition:left .3s; -webkit-transition:left .3s; background-color:#2f4050;}
+#lnb-wrapper:after{content:''; position:absolute; top:0; left:0; z-index:-1; width:100%; height:100%;}
+#lnb-wrapper.on {left:0;}
+#lnb {margin-bottom:100px; width:260px;}
+#lnb a {display:block; color:#a7b1c2;}
+#lnb a:hover {color:#fff;}
+#lnb a.on {color:#fff;}
+#lnb .dep2 {padding:14px 20px 14px 35px; background:url('../../image/icon_dep2.png') 10px 50% no-repeat, url('../../image/icon_depArr2.png') 222px 50% no-repeat; background-color:#233646; cursor:pointer;}
+#lnb .dep2.on {display:block; background:url('../../image/icon_dep2On.png') 10px 50% no-repeat, url('../../image/icon_depArr2On.png') 222px 50% no-repeat; background-color:#233646;}
+#lnb .dep3 {padding:5px 0 10px 10px; border-left:4px solid #8597eb; cursor:pointer;}
+#lnb .dep3 a {padding:10px; cursor:pointer;}
+#lnb .dep4 {padding:5px 0 10px 20px; cursor:pointer;}
+#lnb .dep4 a {padding:10px; cursor:pointer;}
+
+/* main--------------- */
+#main-wrapper {position:relative; left:0; top:0; margin-left:0; min-height:100%; padding-bottom:60px; vertical-align:top; color:#222; transition:margin-left .3s; -webkit-transition:margin-left .3s;}
+#main-wrapper.on {margin-left:260px;}
+#main {padding-top:60px; position:relative;}
+#main .main-title {height:60px; margin-left:20px; margin-right:20px;}
+#main .main-title h1 {padding-top:15px; font-size:20px; color:#333; font-weight:700;}
+#main .main-title ol {margin-top:25px; float:right; color:#666;}
+#main .main-title li {float:left;}
+#main .main-title li::before {padding:0 5px; content:"/"; color:#999;}
+#main .main-title li:nth-of-type(1)::before {content:none !important;}
+#main .main-title i {padding-right:3px; color:#999;}
+#main .sub-title {margin:0 20px 10px; font-size:14px; color:#6c7dda; font-weight:bold;}
+#main .sub-title i {margin-right:10px;}
+
+/* 패널영역 스타일--------------- */
+.panelStyle {position:relative; margin:0 20px 30px 20px; padding:15px 15px 0; background-color:#fff; border-top:2px solid #dfe2e3; box-shadow:0 7px 7px -5px rgba(0, 0, 0, 0.04);}
+.panelStyle::after, .frmStyle::after{position:relative; bottom:-5px; content:''; display:block; border:1px solid rgba(255,255,255,0);}
+.panelStyle .panelTitle {margin:-15px -15px 0; padding:0 20px; line-height:40px; border-bottom:1px solid #e7eaec;}
+.panelStyle .panelControl {position:absolute; top:0; right:15px; color:#c4c4c4;}
+.panelStyle .panelControl i {padding:10px 10px; cursor:pointer;}
+.panelStyle .panelContent {margin-top:10px;}
+.panelStyle h2 {margin-right:10px; font-size:14px; font-weight:bold;}
+.panelStyle h3 {margin-right:10px; font-size:12px; font-weight:normal; line-height:25px;}
+.panelStyle h3 i {padding-right:5px}
+.panelStyle h4 {padding-left:23px; height:31px; line-height:31px; background:url('../../image/icon_h4.png') no-repeat 3px 50%; color:#666;}
+.panelStyle .panelBar {display:table; width:100%; padding-bottom:10px;}
+.panelStyle .panelBar h4 {margin-bottom:0;}
+.panelStyle .panelBar > li {display:table-cell;}
+.panelStyle .panelBar > .center {text-align:center;}
+.panelStyle .panelBar > .right {text-align:right;}
+
+/* 패널 내부 테이블 여러개 배치 */
+.panelStyle .division + .panelBar {padding-bottom:15px;}
+.panelStyle .division {display:table; width:100%;}
+.panelStyle .division > li, .panelStyle .division > div {display:table-cell; padding-right:40px;}
+.panelStyle .division > li:last-child, .panelStyle .division > div:last-child {padding-right:0;}
+/* table, grid, button 상하 여백 */
+.ag-theme-balham{margin-bottom:15px !important;}
+.frmStyle + .panelBar {padding-bottom:15px;}
+.ag-theme-balham {margin:10px 0 15px;}
+.ag-theme-balham + .panelBar{padding-bottom:15px;}
+.panelBar + .ag-theme-balham {margin:0 0 15px;}
+.panelBar + .frmStyle {margin-top:0;}
+
+/* TABS 영역 --------------- */
+.tabs {position:relative; margin-bottom:30px; margin-left:20px; margin-right:20px;}
+.tabs h2 {position:absolute; top:0; z-index:2; margin-left:10px; font-size:14px; line-height:34px;}
+.tabs h2 i {margin-right:12px;}
+.tabsNav {overflow:hidden; position:relative; top:0; z-index:2; padding:0 30px 0 20px; height:35px;}
+.tabsNav ul {display:inline-block;}
+.tabsNav li {float:left; position:relative;}
+.tabsNav li a {padding:0 20px; line-height:35px; height:35px; display:block; color:#888; font-weight:bold; background-color:#f9f9f9; border:1px solid #dfe2e3; border-bottom:2px solid #dfe2e3; border-top-left-radius:.25rem; border-top-right-radius:.25rem;}
+.tabsNav li.on a {background-color:#fff; color:#222; border:1px solid #ccc; border-bottom:2px solid #fff;}
+.tabsCont {position:relative; top:-2px; z-index:1;}
+.tabsCont::after {display:block}
+.tab {display:none;}
+.tab > .panelStyle{margin:0;}
+.tab.on {display:block;}
+.popupTabs {padding-top:10px;}
+.tabContArea {overflow-x:hidden; overflow-y:auto;}
+.tabBtnArea {padding:15px 0 20px 0;}
+.popup .tabsCont {box-shadow:none;}
+.popup .tabs {margin-bottom:0;}
+
+/* Add TABS 영역 --------------- */
+.btn-add-tab {position:absolute; top:5px; right:0; z-index:2; padding:0 10px;}
+.tabsNav .ui-tabs-active a {background-color:#fff; color:#222; border:1px solid #ccc; border-bottom:2px solid #fff;}
+.tab-del {position:absolute; top:1px; right:1px; padding:4px 6px; color:gray; cursor:pointer; border-top-right-radius:.25rem;}
+.tab-del:hover {color:#f40552;}
+a, button, .ui-state-active, .ui-state-focus, .ui-state-hover {outline:0 !important;}
+.tabsNav .ui-corner-top a {padding:0 35px 0 20px}
+
+/* tabsJr 영역 --------------- */
+.tabsJr {position:relative;}
+.tabsJrNav {overflow:hidden; position:relative; top:0; z-index:2; height:31px; margin:0 30px 0 20px;}
+.tabsJrNav > ul {display:inline-block;}
+.tabsJrNav li {float:left;}
+.tabsJrNav li a {padding:0 20px; line-height:30px; height:30px; display:block; color:#888; /*font-weight:bold; */ background-color:#f9f9f9; border:1px solid #ccc; border-top-left-radius:.25rem; border-top-right-radius:.25rem;}
+.tabsJrNav li.on a {padding-bottom:2px; font-weight:bold; color:#555; background-color:#fff; border-top:1px solid #ccc; border-right:1px solid #ccc; border-bottom:1px solid #fff;}
+.tabsJrCont {position:relative; top:-2px; z-index:1;}
+.tabsJrCont::after {display:block}
+.tabJr {display:none;}
+.tabJr .panelStyle{margin:0; border-top:1px solid #ddd; min-height:20px; padding:20px 15px 0; box-shadow:0 -5px 7px -5px rgba(0, 0, 0, 0.05);}
+.tabJr.on {display:block;}
+.tabJrContArea {vertical-align:middle;}
+
+/* modal, modeless popup --------------- */
+.modalPopup{display:none; position:fixed; left:0; top:0; z-index:11; width:100%; height:100%; background:rgba(0,0,0,0.5);}
+.modalPopup > .panelStyle{position:absolute; top:50%; left:50%; z-index:11; -ms-transform:translate(-50%, -50%); transform:translate(-50%, -50%); margin:0; border:1px solid #79797a; border-radius:3px;}
+.modalPopup > .panelStyle .close {position:absolute; top:0; right:0; font-size:18px; padding:5px 15px 8px;}
+.modalPopup .tabs{ margin:0;}
+.modalPopup .tabs .panelStyle{box-shadow:none}
+.modalPopup .tab > .panelStyle{overflow-y:auto;}
+
+/*MODELESS POPUP --------------- */
+.modelessPopup{display:none; position:absolute; z-index:11; top:50%; left:50%;}
+.modelessPopup.draggable {cursor:move;}
+.modelessPopup .panelStyle{margin:0; border:1px solid #ccc; border-radius:3px;}
+.modelessPopup .panelStyle .close {position:absolute; top:0; right:0; font-size:18px; padding:5px 15px 8px;}
+.modelessPopup .tabs{ margin:0;}
+.modelessPopup .tabs .panelStyle{box-shadow:none}
+.modelessPopup .tab > .panelStyle{overflow-y:auto;}
+
+/*VIDEO POPUP --------------- */
+.videoPopup {display:none; position:fixed; top:50%; left:50%; z-index:11; -ms-transform:translate(-50%, -50%); transform:translate(-50%, -50%); margin:0; border:1px solid #79797a; border-radius:3px;}
+.modalPopup::before{position:fixed; left:0; top:0; z-index:11; width:100%; height:100%; background:rgba(0,0,0,0.5);}
+.videoPopup .close {position:absolute; top:-20px; right:-20px; z-index:1; width:40px; height:40px; line-height:20px; font-size:20px; border:1px solid #666; border-radius:50px; background-color:#fff;}
+.videoPopup iframe{width:100%; height:100%}
+
+
+#btnTop {display:none; position:fixed; right:0; bottom:50px; width:40px; line-height:10px; font-size:10px; background:#fff; border:1px solid #ddd; border-right:none; padding:3px 0 5px 0; box-shadow:5px 5px 5px -4px rgba(0, 0, 0, 0.07); color:#1c84c6;}
+#btnTop i {width:100%; font-size:12px;}
+#btnTop:hover {padding-right:30px; width:70px; font-weight:bold;}
+
+
+/* 컨텐트 스크롤--------------- */
+.xScroll {overflow-x:auto;}
+.yScroll {overflow-y:auto;}
+
+/* 폼테이블 스타일 --------------- */
+.frmStyle {width:100%; margin-bottom:15px;}
+.frmStyle th {border-top:1px solid #dae0fd;}
+.frmStyle tr:last-child th {border-bottom:1px solid #dae0fd;}
+.frmStyle tr:last-child td {border-bottom:1px solid #eee;}
+.frmStyle th {padding:0 15px; height:36px; line-height:24px; white-space:nowrap; text-align:center; background:#e9ecfb;}
+.frmStyle td {padding:0 10px 0 10px; line-height:36px; position:relative; border-top:1px solid #eee; border-right:1px solid #eee;}
+
+/* 체크박스&라디오박스 공통--------------- */
+input[type=radio] {position:absolute; top:50%; left:0; width:18px; height:18px; transform:translate(0,-50%); -ms-transform:translate(0,-50%);}
+label.chkBox, label.rdoBtn {position:relative; display:inline-block; padding-left:26px; height:22px; line-height:22px; vertical-align:middle; cursor:pointer;}
+/* 체크박스 :전체선택 버튼--------------- */
+input[type=checkbox] {position:absolute; top:0; left:0; width:0; height:0;}
+input[type=button].chkBox {margin-left:-2px; padding-left:24px; height:22px; vertical-align:middle; background:url('../../image/icon_checkN.png') no-repeat 0 50%;}
+
+/* 체크박스--------------- */
+label.chkBox::before {position:absolute; top:2px; left:0; content:''; width:16px; height:16px; border:1px solid #dbdbdb; background:#fff;}
+label.chkBox.checked::after {position:absolute; top:6px; left:3px; content:''; width:8px; height:4px; border-bottom:3px solid #676a6c; border-left:3px solid #676a6c; -webkit-transform:rotate(-45deg); transform:rotate(-45deg);}
+label.chkBox .formControl::before {background:#eee;}
+
+/* 라디오버튼--------------- */
+input[type=radio]::before {position:absolute; top:0; left:0; content:''; width:16px; height:16px; border:1px solid #dbdbdb; border-radius:50%; background:#fff;}
+input[type=radio]:checked::after {position:absolute; top:5px; left:5px; content:''; width:8px; height:8px; border-radius:50%; background:#676a6c;}
+input[type=radio].formControl::before {background:#eee;}
+
+/* 토글 스위치--------------- */
+.switchBox{ display:inline-block;position:relative; width:60px; height:28px; vertical-align:middle;border-radius:25px;overflow:hidden;}
+.switchBox input[type="checkbox"]{position:absolute;visibility:hidden;}
+.switchBox label{display:block;position:absolute;top:0;width:60px;height:28px;background-color:#aaa;transition-duration:0.2s;}
+.switchBox label span{position:absolute;left:0;top:50%;z-index:1;width:26px;height:23px;border-radius:25px;transform:translate(3px, -50%);transition-duration:0.2s;background-color:#fff;text-indent:-9999px;}
+.switchBox label:before,label:after{position:absolute;top:0;width:52%;font-size:11px;line-height:27px;color:#fff;text-align:center;}
+.switchBox label:before{left:0;content:'ON';}
+.switchBox label:after{right:0;content:'OFF';}
+.switchBox input:checked + label span{transform:translate(31px, -50%);}
+.switchBox input:checked::before, .switchBox input:checked::after{border:none}
+.switch-base input:checked + label{color:#fff; background-color:#8597eb;}
+.switch-primary input:checked + label{color:#fff; background-color:#1ab394;}
+.switch-success input:checked + label{color:#fff; background-color:#1c84c6;}
+.switch-info input:checked + label{color:#fff; background-color:#23c6c8; }
+.switch-warning input:checked + label{color:#fff; background-color:#f8ac59;}
+.switch-danger input:checked + label{color:#fff; background-color:#ed5565;}
+.switch-black input:checked + label{color:#fff; background-color:#222;}
+.switchBox + .switchBox {margin-left:6px;}
+
+/* 테이블 스타일--------------- */
+.tableStyle {width:100%; max-width:100%; margin-bottom:15px;}
+.tableStyle th {position:relative; padding:7px 0; color:#333; border-top:1px solid #dae0fd; border-bottom:1px solid #dae0fd; border-right:1px solid #dae0fd; background-color:#e9ecfb; text-align:center;}
+.tableStyle th:last-child {border-right:none;}
+.tableStyle td {position:relative; padding:7px 0; border-right:1px solid #ebebeb; border-bottom:1px solid #ebebeb; text-align:center;}
+.tableStyle td:last-child {border-right:none;}
+.tableStyle tbody tr:nth-of-type(2n) {background-color:rgba(0, 0, 0, 0.02);}
+.tableStyle tbody tr:hover {background-color:rgba(224,243,255,0.6);}
+.tableStyle + .panelBar {padding-bottom:15px;}
+/* 스캔 */
+.scanTbl th {font-size:25px; line-height:80px;}
+.scanTbl td {line-height:80px;}
+.scanTbl input[type=text] {line-height:50px; font-size:32px;}
+.scanTbl .btn {overflow-y:hidden; margin-bottom:1px; padding:12px 30px; font-size:25px;}
+table.noPad tr > td, td.noPad {padding:0 !important;}
+th[rowspan] {border-bottom:1px solid #dae0fd;}
+td[rowspan] {border-bottom:1px solid #eee;}
+.nowrap {white-space:nowrap;}
+.solidR {border-right:1px solid #eee; vertical-align:middle;}
+.solidL {border-left:1px solid #eee; vertical-align:middle;}
+.solidT {border-top:1px solid #eee;}
+.solidB {border-bottom:1px solid #eee;}
+.dashR {border-right:1px solid #dae0fd;}
+.dashL {border-left:1px solid #dae0fd;}
+.noPad table.frmStyle > tr:first-child th {border-top:0 !important;}
+.noPad table.frmStyle > tr:first-child td {border-top:0 !important;}
+.noPad table.frmStyle > tr:last-child th {border-bottom:0 !important;}
+.noPad table.frmStyle > tr:last-child td {border-bottom:0 !important;}
+
+
+/* Q&A 스타일--------------- */
+.qnaStyle {width:100%; max-width:100%;}
+.qnaStyle th {position:relative; padding:7px 0; color:#333; border-top:1px solid #dae0fd; border-bottom:1px solid #dae0fd; border-right:1px solid #dae0fd; background-color:#e9ecfb; text-align:center;}
+.qnaStyle th:last-child {border-right:none;}
+.qnaStyle td {position:relative; padding:7px 0; text-align:center;}
+.qnaStyle tr td {border-bottom:1px solid #ecf5f7;}
+.qnaStyle tbody tr:nth-of-type(3n+1) td {background-color:rgba(224,243,255,0.6);}
+.qnaStyle tbody tr:nth-of-type(3n) td {border-bottom:1px solid #ddd;}
+.qnaClaim { text-align:left !important; padding-left:10px !important;}
+.qnaClaim .goods {font-weight:bold; line-height:26px;}
+.qnaClaim .cont {line-height:22px; padding:10px 0; color:#1d3e9d;}
+.qnaClaim .email {line-height:26px;}
+.qnaClaim .email em {border-bottom:1px solid #aaa;}
+.lineRound {border:2px solid #ccc; border-radius:15px; padding:4px 14px; font-weight:bold;}
+
+/* 내부 테이블 디자인 */
+.subTable {display:table; width:100%;}
+.subTable dl {display:table; width:100%;}
+.subTable dt, .subTable dd {display:table-cell;}
+.subTable dt {vertical-align:middle; white-space:nowrap; width:8%; padding:0 15px; background:#e9ecfb; text-align:center; border-bottom:1px solid #dae0fd;}
+.subTable dl:last-child dt {border-bottom:none;}
+.subTable dd {border-bottom:1px solid #eee; padding:3px 20px 3px 10px;}
+.subTable dl:last-child dd {border-bottom:none;}
+
+/* button --------------- */
+.btn {border-radius:3px; vertical-align:middle; white-space:nowrap;font-size:12px;user-select:none;}
+.btn-lg {padding:4px 20px 5px; height:28px; overflow-y:hidden;}
+.btn-sm {margin-top:-2px; line-height:100%; height:28px; overflow-y:hidden;}
+.btn-ssm {margin-top:-2px; line-height:100%; height:22px; overflow-y:hidden;}
+.btn + .btn {margin-left:6px;}
+.btn:first-child {margin-left:0;}
+
+/* 버튼 색상 */
+.btn-white {color:#555 !important; background-color:#fff !important; border:1px solid #ccc !important;}
+.btn-default {color:#555; background-color:#eee; border:1px solid #dcdcdc;}
+.btn-gray {color:#fff; background-color:#aaa; border:1px solid #aaa;}
+.btn-base {color:#fff; background-color:#8597eb; border:1px solid #8597eb;}
+.btn-primary {color:#fff; background-color:#1ab394; border:1px solid #1ab394;}
+.btn-success {color:#fff; background-color:#1c84c6; border:1px solid #1c84c6;}
+.btn-info {color:#fff; background-color:#23c6c8; border:1px solid #23c6c8;}
+.btn-pink {color:#fff; background-color:#feada6; border:1px solid #feada6;}
+.btn-warning {color:#fff; background-color:#f8ac59; border:1px solid #f8ac59;}
+.btn-danger {color:#fff; background-color:#ed5565; border:1px solid #ed5565;}
+.btn-dark {color:#fff; background-color:#6c757d; border:1px solid #6c757d;}
+.btn.icn {line-height:28px; height:28px; padding:0 8px; background-color:#eee; border:1px solid #dbdbdb;}
+.btn.icn i {padding-top:6px; width:12px; vertical-align:top; font-size:14px; text-align:center;}
+
+/* 페이징 --------------- */
+.tablePaging {position:relative; 	display:inline-block; vertical-align:middle;}
+.tablePaging a {display:inline-block; float:left; margin:0 5px; width:28px; height:28px; line-height:28px; text-align:center; border:1px solid #ccc; border-radius:50px; cursor:pointer;}
+.tablePaging a.arrow {background-color:rgba(0, 0, 0, 0.03); 	border-color:#ebebeb;}
+.tablePaging .num.on {background:#8597eb; color:#fff; border-color:#8597eb;}
+
+/* 다중 Select Box */
+.mSelectWrap select {display:none;}
+.mSelectBox {display:inline-block; position:relative; top:-1px; margin:2px 0 2px 0; padding:0 7px 0 0; width:100%; height:auto !important; min-height:29px; border:1px solid #e5e6e7; vertical-align:middle;}
+.mSelected {overflow:auto;}
+.mSelected li {float:left; margin:2px 5px 3px; line-height:24px; padding:0 7px; background:#dbedf9; -ms-user-select:none; -moz-user-select:-moz-none; -webkit-user-select:none; user-select:none;}
+.mSelected li.srchFld {margin:0; padding:0; background:none;}
+.mSelected .srchFld input {width:25px; margin:0; padding:0; border:none; outline:none;}
+.mSelected a {border:none !important; float:right; margin-left:3px; padding:0 3px; width:15px; line-height:22px; text-indent:-9999px; background:url('../../image/btn_sltClose.png') no-repeat 100% 50%;}
+.mSelected a:hover {background:url('../../image/btn_sltCloseOn.png') no-repeat 100% 50%;}
+.mSelecting {display:none; overflow-y:auto; overflow-x:hidden; position:absolute; top:100%; left:-1px; z-index:1; width:100%; max-height:156px; line-height:30px; border:1px solid #e5e6e7; background:#fff;}
+.mSelecting li {margin:0 10px; cursor:pointer;}
+
+/* 멀티 Select Box */
+.mSelWrap {display:inline-block;}
+.mSelWrap select {height:100px; padding:7px 0;}
+.mSelWrap .mSelBtn {margin:0 0 0 5px; float:right; width:33px; vertical-align:top;}
+.mSelWrap .mSelBtn .btn {margin:0; vertical-align:top;}
+.mSelWrap option {padding:4px 100px 4px 10px;}
+
+/* 파일첨부 --------------- */
+.uFile {overflow:hidden; position:relative; display:inline-block; margin:-2px 5px 0 0; width:80%; height:28px; vertical-align:middle; border:1px solid #dbdbdb;}
+.lrStyle .uFile {margin-top:2px;}
+.uFileInput {position:absolute; top:0; width:100%; margin:0 !important; padding:0 !important; line-height:28px; border:none !important;}
+.uFileLabel {position:absolute; top:0; right:0; left:0; z-index:1; margin:0; padding:0 7px; width:cals(100% - 7px); line-height:28px; height:28px; background-color:#fff; border-radius:1px; overflow:hidden; white-space:nowrap;}
+.uFileLabel::after {position:absolute; top:0; right:0; bottom:0; width:30px; z-index:3; line-height:28px; content:" "; border-left:1px solid #dbdbdb; background:#eee url('../../image/icon_upload.png') no-repeat 50% 50%;}
+
+/* badge --------------- */
+.badge {float:right; margin-top:2px; padding:0 5px; min-width:9px; line-height:18px; color:#fff; font-size:12px; font-weight:600; border-radius:3px; text-align:center; text-shadow:1px 1px 1px rgba(0,0,0,0.4); letter-spacing:-0.5px;}
+.badge-warning {background-color:#ed7908;}
+.badge-primary {background-color:#1ab394;}
+.badge-danger {background-color:#ed5565;}
+.badge-success {background-color:#2fa4e7;}
+.badge-info {background-color:#23c6c8;}
+.badge.circle {border-radius:50px;}
+.dep3 .badge {position:relative; top:-28px; right:20px;}
+
+/* badge-등급 ------------*/
+.badgeLevel{overflow:hidden;display:inline-block;margin:4px 0;padding:0;width:60px;height:60px;line-height:56px;font-size:30px;font-weight:bold;border-radius:100%;text-align:center;vertical-align:top;box-sizing:border-box;}
+.badgeLevel.white{background-color:#fff;border:1px solid #333;color:#333;}
+.badgeLevel.dark1{background-color:#ccc;border:1px solid #ccc;color:#333;}
+.badgeLevel.dark2{background-color:#aaa;border:1px solid #aaa;color:#333;}
+.badgeLevel.dark3{background-color:#777;border:1px solid #777;color:#fff;}
+.badgeLevel.black{background-color:#333;border:1px solid #333;color:#fff;}
+
+/* tag */
+.tagNum {display:inline-block; margin-left:5px; padding:0 3px 0 2px; min-width:13px; line-height:16px; font-weight:normal; color:#fc5555; background:#fff; border-radius:5px;}
+
+/* footer --------------- */
+footer {position:absolute; bottom:0; left:0; width:100%; height:40px; background-color:#fff; border-top:1px solid #e7eaec; line-height:39px; font-size:13px;}
+footer .f-left {float:left; padding-left:20px; line-height:38px;}
+footer .f-right {float:right; padding-right:20px; line-height:38px;}
+
+/* 이미지 카드 */
+.dexterArea {min-width:350px; min-height:180px; padding:0 !important; vertical-align:top; background:#f1f1f1;vertical-align:top;}
+.dexterTable {display:table; width:100%; overflow-y:auto;}
+.dexterTable > li {display:table-cell; vertical-align:top; line-height:23px;}
+.dexterNo div {padding:0 10px; border-top:1px solid #ddd; border-right:1px solid #ddd; background:#fff;}
+.dexterNo div:first-child {margin-top:36px;}
+.dexterNo div:last-child {border-bottom:1px solid #ddd;}
+
+/* 수정용 이미지 카드 */
+.cardArea {width:100%; padding:0 0 20px; overflow-y:auto;}
+.imgCard {vertical-align:top; position:relative; display:inline-block; margin:20px 20px 0 0; padding:10px 10px 0 10px; border:1px solid #dbdbdb;}
+.imgCard ul {display:table;}
+.imgCard li {display:table-cell;}
+.imgCard img {margin-right:15px;}
+.imgCard li:nth-of-type(2) {padding-top:20px; max-width:150px; line-height:24px}
+.imgCard p {font-size:12px;}
+.imgCard .cardClose {position:absolute; top:0; right:0; width:24px; background:url('../../image/btn_sltClose.png') no-repeat 50% 50%; text-indent:-9999px;}
+.imgCard .cardClose:hover {background:#f1f1f1 url('../../image/btn_sltCloseOn.png') no-repeat 50% 50%;}
+.verticalTop {vertical-align:top;}
+
+/* 조회용 이미지 카드 */
+.cardArea2 {padding:10px 0;}
+.cardArea2 ul, .cardArea2 .box {vertical-align:top; position:relative; display:inline-block; margin:10px; border:1px solid #dbdbdb; max-width:300px;}
+.cardArea2 li {display:table-cell; line-height:26px; vertical-align:middle;}
+.cardArea2 li:nth-of-type(2) {padding:0 10px;}
+.cardArea2 .cardDel {position:absolute; top:0; right:0; background:url('../../image/btn_sltClose.png') no-repeat 50% 50%; text-indent:-9999px;}
+.cardArea2 .cardDel:hover {background:#f1f1f1 url('../../image/btn_sltCloseOn.png') no-repeat 50% 50%;}
+
+/* 테이블 외부 안내문구 */
+.panelStyle > .notice {margin:0 0 15px ;}
+.panelContent > .notice {margin:15px 0;}
+.notice em {color:red;}
+.notice li, p.dot {padding-left:20px; background:url('../../image/dot_bk.png') no-repeat 5px 10px; line-height:24px;}
+p.dot .btn {margin-left:10px !important;}
+p.dot em {color:red;}
+
+/* 정렬 */
+.txt {line-height:36px;}
+.aC {text-align:center !important;}
+.aR {text-align:right !important;}
+.aL {text-align:left !important;}
+.vaT {vertical-align:top !important;}
+.vaM {vertical-align:middle !important;}
+.vaB {vertical-align:bottom !important;}
+
+/* 테이블 내부 안내문구 */
+.infoTxt {line-height:26px; padding:5px 0;}
+.infoTxt i {margin-right:7px;}
+.infoTxt em {color:red;}
+.infoTxtTh {display:inline-block; text-align:left; font-weight:normal; font-size:12px;}
+.infoTxtTh li {padding-top:3px;}
+.infoTxtTh i {padding-right:5px;}
+.srchOption {overflow:auto; padding:10px 0; line-height:36px;}
+
+/* 유의사항 안내 */
+.infoBox {margin:0 20px 20px; padding:7px 10px; border-top:2px solid #dfe2e3; border-bottom:2px solid #dfe2e3; background:#fff}
+.infoBox p {padding-left:25px; line-height:20px; font-size:12px; background:url('../../image/dot_bk.png') no-repeat 10px 50%; background-size:3px auto;}
+
+/* 검색결과 안내문 */
+.srchNotice {padding-bottom:7px; font-weight:normal; font-size:14px;}
+.srchNotice em {color:red;}
+
+/* 필수입력항목 */
+.required {display:inline-block; position:relative; top:-3px; width:12px; height:7px; background:url('../../image/icon_required.png') no-repeat 0 50%;}
+
+
+/* COLOR DESIGN -------------------------------------*/
+/*Color :Base ---*/
+.color-mPurple header,span.color-mPurple {background:linear-gradient(135deg,#667eea 0,#764ba2 100%) !important;}
+.color-purple header,span.color-purple {background:#667eea !important;}
+
+/*Color :Gray ---*/
+.color-mGray header,span.color-mGray {background:linear-gradient(to right,#6c757d 0%,#555 100%) !important;}
+.color-gray header,span.color-gray {background:#666 !important;}
+.color-mGray .frmStyle th,.color-mGray .tableStyle th,.color-gray .frmStyle th,.color-gray .tableStyle th {background:#eee !important; 	border-top:1px solid #ddd; 	border-bottom:1px solid #ddd;}
+.color-mGray .tablePaging .num.on,.color-gray .tablePaging .num.on {background:#888 !important; 	border-color:#888 !important;}
+.color-mGray #lnb .dep3,.color-gray #lnb .dep3 {border-color:#777 !important;}
+.color-mGray .tabsJrNav li.on a,.color-gray .tabsJrNav li.on a {color:#333;}
+
+/*Color :Blue ---*/
+.color-mBlue header,span.color-mBlue {background:linear-gradient(to right,#4481eb 0%,#04befe 100%) !important;}
+.color-blue header,span.color-blue {background:#0042a5 !important;}
+.color-mBlue .frmStyle th,.color-mBlue .tableStyle th,.color-blue .frmStyle th,.color-blue .tableStyle th {background:#d8eafc !important; 	border-top:1px solid #ddd; 	border-bottom:1px solid #ddd;}
+.color-mBlue .tablePaging .num.on,.color-blue .tablePaging .num.on {background:#3e91de !important; 	border-color:#3e91de !important;}
+.color-mBlue #lnb .dep3,.color-blue #lnb .dep3 {border-color:#3e91de !important;}
+.color-mBlue .tabsJrNav li.on a,.color-blue .tabsJrNav li.on a {background:#d8eafc;}
+.color-mBlue .tabJr.on,.color-blue .tabJr.on {border-top:4px solid #d8eafc;}
+.color-mBlue .tabsJrNav li.on a,.color-blue .tabsJrNav li.on a {color:#333;}
+
+/*Color :Green ---*/
+.color-mGreen header,span.color-mGreen {background:linear-gradient(135deg,#00b09b 0,#96c93d 100%) !important;}
+.color-green header,span.color-green {background:#00b09b !important;}
+.color-mGreen .frmStyle th,.color-mGreen .tableStyle th,.color-green .frmStyle th,.color-green .tableStyle th {background:#e5f7f5 !important; 	border-top:1px solid #ddd; 	border-bottom:1px solid #ddd;}
+.color-mGreen .tablePaging .num.on,.color-green .tablePaging .num.on {background:rgba(0,176,155,0.8); 	border-color:rgba(0,176,155,0.8) !important;}
+.color-mGreen #lnb .dep3,.color-green #lnb .dep3 {border-color:#00b09b !important;}
+.color-mGreen .tabsJrNav li.on a,.color-green .tabsJrNav li.on a {background:#e5f7f5;}
+.color-mGreen .tabJr.on,.color-green .tabJr.on {border-top:4px solid #e5f7f5;}
+.color-mGreen .tabsJrNav li.on a,.color-green .tabsJrNav li.on a {color:#333;}
+
+/*Color :Pink ---*/
+.color-mPink header,span.color-mPink {background:linear-gradient(to right, rgb(242, 112, 156), rgb(255, 148, 114)) !important;}
+.color-pink header,span.color-pink {background:#feada6 !important;}
+.color-mPink .frmStyle th,.color-mPink .tableStyle th,.color-pink .frmStyle th,.color-pink .tableStyle th {background:#fff7f6 !important; border-top:1px solid #ddd; border-bottom:1px solid #ddd;}
+.color-mPink .tablePaging .num.on,.color-pink .tablePaging .num.on {background:#feada6; 	border-color:#feada6 !important;}
+.color-mPink #lnb .dep3,.color-pink #lnb .dep3 {border-color:#feada6 !important;}
+.color-mPink .tabsJrNav li.on a,.color-pink .tabsJrNav li.on a {background:#fff7f6;}
+.color-mPink .tabJr.on,.color-pink .tabJr.on {border-top:4px solid #fff7f6;}
+.color-mPink .tabsJrNav li.on a,
+.color-pink .tabsJrNav li.on a {color:#333;}
+
+/*Color :black ---*/
+.color-black header, span.color-black{background:#3E3E3E !important;}
+.color-black .header-logo{background:#000 !important;}
+.color-black .header-menu .menu a{background:#000 !important;}
+.color-black .header-menu .menu a.on{background:#fff !important; color:#000 !important;}
+.color-black #lnb-wrapper{background-color:#b2b2b2 !important;}
+.color-black #lnb .dep2{background-color:#545454 !important;}
+.color-black #lnb .dep3{border-color:#000 !important;}
+.color-black #lnb .dep3{background:#fdfdfd !important;  }
+.color-black #lnb .dep3 a{color:#111111 !important;}
+.color-black #lnb a{color:#fff !important;}
+.color-black .frmStyle th, .color-black .tableStyle th, .color-black .frmStyle th, .color-black .tableStyle th{background:#eee !important; 	border-top:1px solid #ddd; border-bottom:1px solid #ddd;}
+.color-black .tablePaging .num.on, .color-black .tablePaging .num.on{background:#888 !important; 	border-color:#888 !important;}
+.color-black .tabsJrNav li.on a, .color-black .tabsJrNav li.on a{color:#333; background:#eee !important}
+.color-black .tabJr.on, .color-black .tabJr.on { border-top:4px solid #eee;}
+
+/* 폰트 컬러, 폰트 두께 */
+.cBlue {color:#127fdc !important;}
+.cGray {color:#666 !important;}
+.cRed {color:red !important;}
+.bold {font-weight:bold !important;}
+
+/* 배경 투명도 */
+.bgOp6 {opacity:0.6; color:#000 !important;}
+
+/* 여백 지정 */
+hr {border:0; padding-bottom:10px;}/* 기본 여백 :10px */
+.pad10 {padding:10px 0 !important;}
+.pad15 {padding:15px 0 !important;}
+.pad20 {padding:20px 0 !important;}
+.padT3 {padding-top:3px !important;}
+.padT5 {padding-top:5px !important;}
+.padT10 {padding-top:10px !important;}
+.padT15 {padding-top:15px !important;}
+.padT20 {padding-top:20px !important;}
+.padT30 {padding-top:30px !important;}
+.padT40 {padding-top:40px !important;}
+.padR20 {padding-right:20px !important;}
+.padL10 {padding-left:10px !important;}
+.padB5 {padding-bottom:5px !important;}
+.padB10 {padding-bottom:10px !important;}
+.padB15 {padding-bottom:15px !important;}
+.padB20 {padding-bottom:20px !important;}
+.padB30 {padding-bottom:30px !important;}
+.padB40 {padding-bottom:40px !important;}
+.marT5 {margin-top:5px !important;}
+.marT10 {margin-top:10px !important;}
+.marT15 {margin-top:15px !important;}
+.marT20 {margin-top:20px !important;}
+.marR3 {margin-right:3px !important;}
+.marL5 {margin-left:5px !important;}
+.marL10 {margin-left:10px !important;}
+.marL20 {margin-left:20px !important;}
+.marR10 {margin-right:10px !important;}
+.marR20 {margin-right:20px !important;}
+
+/* 넓이 지정 --------------- */
+.w20 {width:20px !important;}
+.w50 {width:50px !important;}
+.w60 {width:60px !important;}
+.w70 {width:60px !important;}
+.w80 {width:80px !important;}
+.w90 {width:80px !important;}
+.w100 {width:100px !important;}
+.w130 {width:130px !important;}
+.w150 {width:150px !important;}
+.w200 {width:200px !important;}
+.w300 {width:300px !important;}
+.w400 {width:400px !important;}
+.w500 {width:500px !important;}
+.w600 {width:600px !important;}
+.w800 {width:800px !important;}
+.w100p {width:100% !important;}
+.w90p {width:90% !important;}
+.w80p {width:80% !important;}
+.w70p {width:70% !important;}
+.w60p {width:60% !important;}
+.w50p {width:50% !important;}
+.w40p {width:40% !important;}
+.w30p {width:30% !important;}
+.w20p {width:20% !important;}
+.h100 {height:100px !important;} /*alert, confirm 컨텐츠 높이에 사용*/
+
+
+/*-- 캘린더 --------------*/
+#calendar {max-width:900px; margin:20px 0 50px 20px;}
+
+/*-- error page --------------*/
+#errPage {padding-top:40px; width:650px; background:#fff; position:relative; top:48%; left:50%; transform:translate(-50%,-50%); -ms-transform:translate(-50%,-50%); border-radius:9px; vertical-align:middle; overflow:hidden; box-shadow:0 0 2px 0 rgba(0,0,0,0.12), 0 2px 2px 0 rgba(0,0,0,0.24);}
+#errPage .errImg {padding-left:50px; display:table-cell; vertical-align:middle; padding-bottom:30px;}
+#errPage .errImg div {border-radius:50%; position:relative; display:inline-block; width:140px; height:140px; color:#fff; background:#d196e4; box-shadow:2px 2px 6px 0 rgba(0,0,0,0.2) inset;}
+#errPage .fa-television {position:absolute; top:30px; left:28px; font-weight:bold; font-size:80px;}
+#errPage .fa-info {position:absolute; top:49px; left:66px; font-size:34px;}
+#errPage .errTxt {padding:0 50px; display:table-cell; padding-bottom:40px;}
+#errPage .errTxt .ttl {font-size:16px; font-weight:bold; padding-bottom:20px;}
+#errPage .errTxt .cont { padding-bottom:20px; line-height:26px;}
+#errPage .errTxt .tel {color:#777;}
+#errPage .errBtn {width:100%; background:#f9f9fa; line-height:70px; text-align:right;}
+#errPage .errBtn .btn {margin-right:30px; border-radius:33px; background:#858b90; color:#fff; padding:5px 30px; line-height:24px; font-weight:bold; -webkit-transition:0.2s; transition:0.2s;}
+#errPage .errBtn .btn:hover {background:#555;}
+
+/*-- DEXTER --------------*/
+.dexterNo { width:43px;}
+.dexterNo div { padding:0 10px; border-top:1px solid #ddd; border-right:1px solid #ddd; background:#fff; text-align:right;}
+.dexterNo div:first-child {margin-top:28px;}
+
+/*-- 회원추가 --------------*/
+.memAddWrap {line-height:26px; padding:3px 0;}
+.memAdd {margin-right:15px; padding:2px 27px 2px 0; position:relative; line-height:24px; height:24px; white-space:nowrap;}
+.memAdd button {position:absolute; top:3px; right:0; bottom:0; width:18px; height:18px; border:1px solid #dbdbdb; border-radius:3px; text-indent:-9999px; background:#eee url('../../image/btn_sltClose.png') no-repeat 50% 50%;}
+.memAdd button:hover {background:#eee url('../../image/btn_sltCloseOn.png') no-repeat 50% 50%;}
+
+/*-- Date Picker --------------*/ /* 20200521 수정 */
+table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
+.mtz-monthpicker-month {padding:7px; cursor:pointer;}
+.ui-datepicker-trigger {padding:0;}
+.ui-datepicker {z-index:800 !important; text-align:center; background:#fff;}
+.ui-datepicker .ui-datepicker-today,
+.ui-datepicker .ui-state-highlight {background:#fff7cf !important;}
+.ui-datepicker .ui-state-active {border:1px solid red !important;}
+.ui-datepicker .ui-datepicker-prev {position:absolute; top:3px; left:3px; width:30px; line-height:30px; text-indent:-9999px; background:url('../../image/icon_prev.png') no-repeat 50% 50%;}
+.ui-datepicker .ui-datepicker-next {position:absolute; top:3px; right:3px; width:30px; line-height:30px; text-indent:-9999px; background:url('../../image/icon_next.png') no-repeat 50% 50%;}
+.ui-datepicker .ui-datepicker-calendar {padding:5px; border:1px solid #ddd; border-top:none; text-align:center;}
+.ui-datepicker .ui-datepicker-calendar th{padding:5px 0}
+.ui-datepicker-week-end {text-align:center;}
+.ui-datepicker-calendar .ui-state-default {display:inline-block; text-align:center; width:32px; line-height:24px; border:none;}
+.ui-datepicker-header {position:relative; background:#d0e9ff; text-align:center; padding:5px; border:1px solid #ddd; border-bottom:none;}
+.ui-datepicker-buttonpane button {background-color:#eee; border:1px solid #dcdcdc; line-height:24px; border-radius:3px; margin:0 5px 5px 5px;}
+.ui-datepicker-current {float:left;}
+.ui-datepicker-close {float:right;}
+
+/* prograss bar */
+.prograssWrap {display:flex; flex-direction:row;}
+.prograssWrap > li {display:flex; align-items:center;}
+.prograssWrap > li:nth-of-type(1) {width:96%}
+.prograssWrap > li:nth-of-type(2) {margin-left:1.5rem !important}
+.prograss-lg {display:flex; width:100%; height:1rem; background-color:#f4f5fd; border-radius:.65rem; overflow:hidden; box-shadow:inset 0 1px 2px rgba(0,0,0,.1);}
+.prograss-sm {display:flex; width:100%; height:.5rem; background-color:#f4f5fd; border-radius:.65rem; overflow:hidden; box-shadow:inset 0 1px 2px rgba(0,0,0,.1);}
+.prograss-bar {display:flex; border-top-right-radius:.65rem; border-bottom-right-radius:.65rem; transition:width .6s ease;
+  background-image: linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);
+  background-size: 1rem 1rem;
+  -webkit-animation: progress-bar-stripes 1s linear infinite; animation: progress-bar-stripes 1s linear infinite;}
+.prograss-bar.bg-info {background-color:#1c84c6;}
+.prograss-txt.bg-info {color:#1c84c6;}
+.prograss-bar.bg-success {background-color:#1ab394;}
+.prograss-txt.bg-success {color:#1ab394;}
+.prograss-bar.bg-danger {background-color:#f83245;}
+.prograss-txt.bg-danger {color:#f83245;}
+.prograss-bar.bg-base {background-color:#f8ac59;}
+.prograss-txt.bg-base {color:#ffa749;}
+
+/* Multi CheckBox */
+.multiCheckBox {position:relative; display:inline-block; width:auto; line-height:27px; margin:3px 3px 3px 0;}
+.multiCheckBox .sltBtn {padding-left:5px; width:100%; height:27px; color:#555; text-align:left; border:1px solid #dbdbdb; box-sizing:border-box; -webkit-touch-callout:none; -webkit-user-select:none; -ms-user-select:none; user-select:none;}
+.multiCheckBox .sltBtn::after {position:absolute; top:6px; right:10px; content:''; width:7px; height:7px; border-bottom:1px solid #555; border-left:1px solid #555; -webkit-transform:rotate(-45deg); transform:rotate(-45deg);}
+.multiCheckBox .sltBtn.on::after {top:10px; -webkit-transform:rotate(135deg); transform:rotate(135deg);}
+.multiCheckBox ul {display:none; position:absolute; top:26px; left:0; z-index:1; width:100%; height:auto; border:1px solid #dbdbdb; background:#fff;}
+.multiCheckBox li {padding:3px 10px;}
+.multiCheckBox li:hover {background-color:Highlight; color:HighlightText;}
+.multiCheckBox label {display:flex;}
+
+/* checkBox More */
+.checkBoxList {overflow:hidden; padding-right:36px; height:36px;}
+.checkBoxList.on {overflow:visible; height:auto;}
+.checkBoxList .more {position:absolute; top:-1px; right:0; width:36px; height:38px; border:1px solid #eee; background:#f7f7f7;}
+.checkBoxList ul {display:flex; flex-wrap:wrap;}
+.checkBoxList li {justify-content:flex-start; line-height:36px;}
+.checkBoxList[data-unit='1'] li {flex-basis:100%;}
+.checkBoxList[data-unit='2'] li {flex-basis:50%;}
+.checkBoxList[data-unit='3'] li {flex-basis:33%;}
+.checkBoxList[data-unit='4'] li {flex-basis:25%;}
+.checkBoxList[data-unit='5'] li {flex-basis:20%;}
+.checkBoxList[data-unit='6'] li {flex-basis:16.6%;}
+.checkBoxList[data-unit='7'] li {flex-basis:14.2%;}
+.checkBoxList[data-unit='8'] li {flex-basis:12.5%;}
+
+/* 아이콘 툴팁 버튼 */
+.iconTooltip {display:inline-block; position:relative; margin-right:10px;}
+.iconTooltip i {position:relative; color:#46a1ff; width:15px; height:15px; line-height:16px; border-radius:50%; border:1px solid #46a1ff; cursor:pointer; text-align:center;}
+.iconTooltip:hover i {box-shadow:0px 3px 7px 0px rgba(0,0,0,0.4);}
+.iconTooltip span {display:none; position:absolute; top:36px; z-index:5; padding:10px 15px; line-height:24px; color:#fff; background:#6d6d6d; box-shadow:0px 3px 7px 0px rgba(0,0,0,0.2); border-radius:5px;}
+.iconTooltip span:after {position:absolute; top:-4px; content:''; background:#6d6d6d; width:8px; height:8px; -ms-transform:rotate(-45deg); -webkit-transform:rotate(-45deg); transform:rotate(-45deg);}
+.iconTooltip span.left {left:-10px}
+.iconTooltip span.left:after {left:15px;}
+.iconTooltip span.right {right:-10px}
+.iconTooltip span.right:after {right:15px;}
+.iconTooltip span.center {left:50%;}
+.iconTooltip span.center:after {right:5px;}
+.iconTooltip:hover span{display:block;}
+
+/* 상품이동 */
+.itemMove {display:inline-block; width:800px; border:1px solid #eee;}
+.itemMove .item {float:left; display:table; margin:0 10px 20px 0; width:220px; border:1px solid #eee;}
+.itemMove .item li {display:table-cell; vertical-align:top;}
+.itemMove .item li:nth-of-type(1) {width:80px;}
+.itemMove .item li:nth-of-type(1) img {width:80px; height:80px;}
+.itemMove .item button {width:16px; height:16px; text-indent:-9999px;}
+.itemMove .item input {width:30px; height:14px !important; line-height:14px}
+.itemMove .item li:nth-of-type(2) div {line-height:20px}
+
+/* 상품 Dragable :20200129 */
+.sortableWrap #sortable { overflow-y:auto }
+.sortableWrap {margin:20px 0; width:100%; max-height:675px;}
+.sortableWrap .itemWrap {display:inline-block;}
+.sortableWrap .item {float:left; margin-right:12px; margin-bottom:12px; padding:5px 8px; line-height:20px; border:1px solid #ddd; vertical-align:top; background:#fff;}
+.sortableWrap .item > li {float:left; vertical-align:middle;}
+.sortableWrap .item .img {margin-top:3px; margin-right:10px; width:80px;}
+.sortableWrap .item .img img {width:80px; height:80px; cursor:move;}
+.sortableWrap .btnArea {text-align:center; margin-top:15px; padding:0 10px;}
+.sortableWrap button.icnSm {overflow:hidden; position:relative; width:24px; height:20px; background-color:#fff;}
+.sortableWrap button.icnSm i {position:absolute; top:-4px; left:-3px; width:24px; line-height:24px; font-size:15px; color:#888;}
+.sortableWrap button.icnSm:hover i {color:#111;}
+.sortableWrap button.icnSm:last-child {margin-right:0;}
+.sortableWrap .item .cont {width:114px;}
+.sortableWrap .item .cont li em {margin:0 3px 0 7px;}
+.sortableWrap .item .cont .no {font-weight:bold; padding-bottom:3px;}
+.sortableWrap .item .cont .title {padding-bottom:3px; border-bottom:1px solid #eee;}
+.sortableWrap .item .cont .price {padding-top:3px; padding-bottom:3px;}
+.sortableWrap .item .cont input {margin-left:5px; width:37px;}
+
+
+.ag-theme-balham.lh60 .ag-cell {line-height:60px !important; height:60px;}
+.ag-theme-balham.lh70 .ag-cell {line-height:70px !important; height:70px;}
+.ag-theme-balham.lh80 .ag-cell {line-height:80px !important; height:80px;}
+.ag-theme-balham.lh90 .ag-cell {line-height:90px !important; height:90px;}
+.ag-theme-balham.lh100 .ag-cell {line-height:100px !important; height:100px;}
+.ag-theme-balham.lh110 .ag-cell {line-height:110px !important; height:110px;}
+.ag-theme-balham.lh120 .ag-cell {line-height:120px !important; height:120px;}
+
+
+/* 테이블 상품명 클릭시 이미지 레이어 활성화 */
+.viewImg {position:relative; color:blue; cursor:pointer}
+.thumbLayer {display:inline-block; position:absolute; top:0; right:0; z-index:5; border:1px solid #ddd}
+.thumbLayer img {width:100%; height:auto;}
+
+/* dashboard */
+.flexWrap{display:-ms-flexbox; display:flex; -ms-flex-wrap:wrap; flex-wrap:wrap; color:#676a6c;}
+.flexWrap li{padding:0 20px 20px; width:calc(33.3%);}
+.flexWrap.unit4 li{width:calc(25%);}
+.flexWrap.unit5 li{width:calc(20%);}
+.flexWrap.unit6 li{width:calc(16.6%);}
+.flexWrap .title{padding:15px; font-weight:600; border:1px solid #e7eaec; border-top:2px solid #e7eaec;}
+.flexWrap .title h5{font-size:15px; font-weight:bold;}
+.flexWrap .title span{float:right; padding:1px 8px; font-size:10px; border-radius:0.25em;}
+.flexWrap .content{padding:15px; border:1px solid #e7eaec; border-top:none;}
+.flexWrap .content em{font-size:30px; font-weight:200;}
+.statText {margin-top:5px}
+.statText::after{display:block; clear:both; content:''}
+.statText span:nth-of-type(1){float:left; font-size:11px;}
+.statText span:nth-of-type(2){float:right; font-size:13px; font-weight:600;}
+.txt-success{color:#1c84c6;}
+.txt-info{color:#23c6c8;}
+.flexWrap .txt-danger{color:#ed5565;}
+.flexWrap .bg-success{background:#1c84c6;}
+.flexWrap .bg-info{background:#23c6c8;}
+.flexWrap .bg-danger{background:#ed5565;}
+.btn.on{-webkit-box-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);}
+.dbChart .btn-group{float:right; line-height:37px;}
+.dbChart .btn-group button{margin:0; height:23px;}
+.dbChart .boxleft{float:left; margin:20px 15px 20px 15px; width:calc(100% - 490px);}
+.dbChart .boxRight{float:left; margin:20px 20px 20px 40px; width:400px;}
+.dbChart .boxRight em{font-size:24px; font-weight:200;}
+.dbChart .boxRight > div{margin-bottom:25px;}
+.dbChart .boxRight .statText .c1 {color:#FF7043}
+.dbChart .boxRight .progress .c1 {background:#FF7043}
+.dbChart .boxRight .statText .c2 {color:#48C9B0}
+.dbChart .boxRight .progress .c2 {background:#48C9B0}
+.dbChart .boxRight .statText .c3 {color:#ca9900}
+.dbChart .boxRight .progress .c3 {background:#FFD54F}
+.progress{display:-ms-flexbox; display:flex; margin-top:5px; height:1rem; overflow:hidden; font-size:.75rem; background-color:#e9ecef; border-radius:.25rem;}
+.progress-mini{height:5px; margin-bottom:0;}
+.progress > div{height:5px; margin-bottom:0; transition:width 0.3s;}
+
+
+/* 카테고리 Sort */
+.categoryOrder {margin-bottom:15px; background:#fcfcfc;}
+.categoryOrder li {clear:both; padding-left:15px; line-height:40px; cursor:move; border-top:1px dashed red; }
+.categoryOrder li button.on {background-image:url(../../image/icon_cate_minus.png);}
+/* .categoryOrder li:after {content:''; position:absolute; top:8px; left:-10px; width:21px; height:21px; background:url(../../image/line_cate.png)} */
+.categoryOrder li:before{position:relative; content:''; width:1px; height:100%; background:#ddd;}
+.categoryOrder li ol{display:none}
+/* .categoryOrder ol:last-child li {background-image:none !important} */
+.categoryOrder button{position:relative; z-index:200; padding:0 15px 0; margin:0; line-height:40px; cursor:pointer; background-image:url(../../image/icon_cate_plus.png); background-repeat:no-repeat; background-position:0 0;}
+
+/* 메인 공지팝업 */
+.noticeWrap{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:800px;background-color:#fff;}
+.noticeWrap .swiper-container{overflow:hidden;position:relative;top:0;}
+.noticeWrap .swiper-wrapper{display:flex;width:100%;transition-property:transform;box-sizing:content-box;}
+.noticeWrap .swiper-slide{overflow-y:auto;max-height:500px;padding:20px 20px 40px;flex-shrink:0;position:relative;width:100%;height:100%;transition-property:transform;}
+.noticeWrap .swiper-slide img{max-width:100%;height:auto;}
+.noticeWrap .swipeControl{display:inline-block;position:absolute;top:-35px;right:0;/* transform:translate(-50%,0); */z-index:1;width:100px;}
+.noticeWrap .swipeControl button{text-indent:-9999px;}
+.noticeWrap .swipeControl button[aria-label]{position:absolute;width:30px;height:30px;}
+.noticeWrap .swipeControl button[aria-label]::after{top:6px;width:12px;height:12px;}
+.noticeWrap .swipeControl button[aria-label].arr{top:0;}
+.noticeWrap .swipeControl button[aria-label].arr.prev{left:0;}
+.noticeWrap .swipeControl button[aria-label].arr.next{right:0}
+.noticeWrap .swipeControl button[aria-label].arr::after{position:absolute;display:block;content:'';border-bottom:1px solid #fff;border-left:1px solid #fff}
+.noticeWrap .swipeControl button[aria-label].arr.prev::after{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}
+.noticeWrap .swipeControl button[aria-label].arr.next::after{-webkit-transform:rotate(-135deg);-ms-transform:rotate(-135deg);transform:rotate(-135deg)}
+.noticeWrap .swipeControl .prev:after{left:8px;}
+.noticeWrap .swipeControl .next:after{right:8px;}
+.noticeWrap .swipeControl .swiper-button-disabled:after{border-color:#ddd;}
+.noticeWrap .swipeControl .swiper-pagination{line-height:28px;width:100%;text-align:center;}
+.noticeWrap .swipeControl .swiper-pagination-bullet{display:inline-block;margin:0 5px;width:10px;height:10px;background:#ddd;border-radius:50%;cursor:pointer;}
+.noticeWrap .swipeControl .swiper-pagination-fraction span{font-size:14px;}
+.noticeWrap .swipeControl .swiper-pagination-fraction i{color:#ccc;}
+.noticeWrap .swipeControl .swiper-pagination-current{color:#fff;font-weight:bold;}
+.noticeWrap .swipeControl .swiper-pagination-total{color:#ccc}
+.noticeWrap .btnArea{display:flex;background-color:#f0f0f0;}
+.noticeWrap .btnArea > span{flex:1;position:relative;}
+.noticeWrap .btnArea > span::after{content:'';position:absolute;top:50%;right:0;transform:translate(0, -50%);width:1px;height:15px;background-color:#ccc;}
+.noticeWrap .btnArea > span:last-child::after{background-color:unset;}
+.noticeWrap .btnArea button{width:100%;height:50px;color:#000}
+.noticeWrap .title{line-height:34px;padding:0 0 10px 0;font-size:18px;font-weight:bold;border-bottom:1px solid #ececec;}
+.noticeWrap .content{padding:20px 0 20px;line-height:26px;font-size:13px;}
+.noticeWrap .download li{line-height:26px;}
+.noticeWrap .download i{margin-right:15px;}
+.noticeWrap .download a{border-bottom:1px solid #337ab7;color:#337ab7;}
+.noticeWrap .download a:visited{border-bottom:1px solid #999;color:#333;}
+
+
+/* 반응형:GNB 유저명,등급,로그아웃 --------------- */
+@media ( max-width:1370px ) {
+ .header-info { display:none;}
+ .header-info-sm { display:inline-block;}
+}
+
+/* 반응형 :dashboard(20200522) --------------- */
+@media ( max-width:1023px ) {
+ /* 대시보드 */
+ #wrapper.dashboard{width:100%; min-width:100%;}
+ .dashboard .header-logo{width:100%}
+ .dashboard #lnb-wrapper{display:none;}
+ .dashboard .header-menu{display:none;}
+ .dashboard .tabs{margin-left:0; margin-right:0;}
+ .dashboard .tabs h2{position:relative; margin:10px 15px}
+ .dashboard .tabsNav li:first-child{margin-left:0}
+ .dashboard .tabsNav li:last-child{margin-right:0}
+ .dashboard .tabsNav li a{font-size:16px}
+ .dashboard .flexWrap li{width:100%}
+ .dashboard .flexWrap.unit4 li{width:100%}
+ .dashboard .flexWrap.unit5 li{width:100%}
+ .dashboard .flexWrap.unit6 li{width:100%}
+ .dashboard .boxStyle{margin-left:0; margin-right:0;}
+ .dashboard .dbChart .boxleft{clear:left; margin:30px 15px 0 0; width:100%;}
+ .dashboard .dbChart .boxRight{clear:right; width:100%; margin:30px 20px 20px;}
+}
+
+/* Fix Input Zoom on devices older than iPhone 5:*/
+@media screen and (device-aspect-ratio:2/3) {
+  select, textarea, input[type="text"], input[type="password"],
+  input[type="datetime"], input[type="datetime-local"],
+  input[type="date"], input[type="month"], input[type="time"],
+  input[type="week"], input[type="number"], input[type="email"],
+  input[type="url"]{ font-size:16px;}
+}
+
+/* Fix Input Zoom on iPhone 5, 5C, 5S, iPod Touch 5g */
+@media screen and (device-aspect-ratio:40/71) {
+  select, textarea, input[type="text"], input[type="password"],
+  input[type="datetime"], input[type="datetime-local"],
+  input[type="date"], input[type="month"], input[type="time"],
+  input[type="week"], input[type="number"], input[type="email"],
+  input[type="url"]{ font-size:16px;}
+}
+
+/* Fix Input Zoom on iPhone 6, iPhone 6s, iPhone 7 */
+@media screen and (device-aspect-ratio:375/667) {
+  select, textarea, input[type="text"], input[type="password"],
+  input[type="datetime"], input[type="datetime-local"],
+  input[type="date"], input[type="month"], input[type="time"],
+  input[type="week"], input[type="number"], input[type="email"],
+  input[type="url"]{ font-size:16px;}
+}
+
+/* Fix Input Zoom on iPhone 6 Plus, iPhone 6s Plus, iPhone 7 Plus, iPhone 8, iPhone X, XS, XS Max */
+@media screen and (device-aspect-ratio:9/16) {
+  select, textarea, input[type="text"], input[type="password"],
+  input[type="datetime"], input[type="datetime-local"],
+  input[type="date"], input[type="month"], input[type="time"],
+  input[type="week"], input[type="number"], input[type="email"],
+  input[type="url"]{ font-size:16px;}
+}

+ 22 - 3
style24.admin/src/main/webapp/ux/js/admin.popup.js

@@ -537,10 +537,10 @@ var cfnPopPos =function(delvLocCd){
  * @desc   : 쿠폰조회 팝업
  * <pre>
  *     var oParam = new Object();
- *     oParam.returnCode = 'input[name=sellStoreCd]'; // 반환할코드
- *     oParam.returnName = 'input[name=sellStoreNm]'; // 반환할코드명칭
+ *     oParam.returnCode = 'input[name=cpnId]'; // 반환할코드
+ *     oParam.returnName = 'input[name=cpnNm]'; // 반환할코드명칭
  *     oParam.processType = 'DELV'; // 콜백함수처리유형
- *     cfnOpenCouponRetrievePopup($('input[name=sellStoreNm]').val(), oParam);
+ *     cfnOpenCouponRetrievePopup($('input[name=cpnNm]').val(), oParam);
  * </pre>
  * @param sName - 명칭. 필수
  * @param oParam - 파라미터 오브젝트. 필수
@@ -722,6 +722,25 @@ var cfnOpenCompanyListPopup = function(callbackfn) {
 	cfnOpenModalPopup(actionUrl, 'popupCompanyList');
 }
 
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 다다익선 등록 팝업
+ * <pre>
+ *     cfnOpenTmtbSetPopup();
+ * </pre>
+ * @param  : mode - 모드(N:신규, U:상세/수정, C:복사) 필수
+ * @since  : 2020/12/29
+ * @author : bin2107
+ */
+var cfnOpenMorebetterSetPopup = function(mode ,tmtbSeq) {
+	var actionUrl = "/marketing/morebetterRegPopup/form?mode="+mode;
+	if (typeof(tmtbSeq) != 'undefined') actionUrl += "&tmtbSeq=" + tmtbSeq;
+	uifnPopupClose('popupMorebetterReg');
+	cfnOpenModalPopup(actionUrl, 'popupMorebetterReg');
+}
+
+
 /**
  * @type   : function
  * @access : public

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

@@ -11,7 +11,12 @@ import com.style24.persistence.domain.GoodsIfMeasurement;
 import com.style24.persistence.domain.GoodsSafeNo;
 import com.style24.persistence.domain.GoodsSummary;
 import com.style24.persistence.domain.IfBrand;
+import com.style24.persistence.domain.IfProduct;
+import com.style24.persistence.domain.IfProductSku;
 import com.style24.persistence.domain.IfProvider;
+import com.style24.persistence.domain.Option;
+
+import com.gagaframework.web.parameter.GagaMap;
 
 /**
  * 상품 Dao
@@ -292,4 +297,188 @@ public interface TsbGoodsDao {
 	 */
 	Collection<IfBrand> getBrandList();
 
+	/**
+	 * 상품 정보 조회
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	Collection<IfProduct> getGoodsList();
+
+	/**
+	 * TB_IF_PRODUCTSKU_TEMP 삭제
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	void deleteIfProductSku();
+
+	/**
+	 * TB_IF_PRODUCTSKU_TEMP 저장
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	//void createIfProductSku(IfProductSku ifProductSku);
+	void createIfProductSku(GagaMap dataMap);
+
+	/**
+	 * TB_IF_PRODUCTSKU_TEMP 저장
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	void createIfProductSkuByRow(IfProductSku ifProductSku);
+
+
+	/**
+	 * TB_IF_PRODUCTSKU_HST 삭제
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	void deleteWmsProductSkuHst(String jobdate);
+
+	/**
+	 * TB_IF_PRODUCTSKU_HST 저장
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	void createWmsProductSkuHst(String jobdate);
+
+
+	/**
+	 *  상품 전시재고 삭제
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	void deleteGoodsDispStock();
+
+	/**
+	 * 상품 전시재고 생성
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	void createGoodsDispStock();
+
+
+	/**
+	 * TB_STOCK = > TB_STOCK_SYNC 적용
+	 *
+	 * @author eskim
+	 * @since 2020. 08. 24
+	 */
+	void deleteTbOptionSyncTemp();
+
+	/**
+	 * ERP 재고 임시 테이블 이관
+	 *
+	 * @author eskim
+	 * @since 2020. 08. 24
+	 */
+	void createTbOptionSyncTemp();
+
+	/**
+	 * 입점상품 SELL_QTY 목록 조회
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	Collection<Option> getGoodsSelfNoStockList();
+
+	/**
+	 * 상품 옵션/재고 정보 이력생성
+	 *
+	 * @param option
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void createStockHst(Option option);
+
+	/**
+	 * 상품 옵션/재고 변경
+	 *
+	 * @param option
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void updateStock(Option option);
+
+	/**
+	 * WMS 재고 임시 테이블 삭제
+	 *
+	 * @param
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void deleteGoodsOptionSync();
+
+	/**
+	 * TB_OPTION = > TB_OPTION_SYNC 적용
+	 *
+	 * @param
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void createGoodsOptionSync();
+
+	/**
+	 * TB_OPTION_SYNC_TEMP => TB_OPTION_SYNC 변경적용
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void saveGoodsOptionSyncSync();
+
+	/**
+	 * WMS 임시 테이블에서 실테이블로 이관(재고가 상이한것만 수정)
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void saveGoodsOptionNew();
+
+	/**
+	 * TB_SELL_QTY_TEMP 테이블 삭제
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void deleteTtbSellQtyTemp();
+
+	/**
+	 * TB_SELL_QTY_TEMP 생성
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void createTtbSellQtyTemp();
+
+	/**
+	 * WMS 재고 테이블 이관 후 TB_SELL_QTY 데이터 삭제
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void deleteSellQty();
+
+	/**
+	 * TB_SELL_QTY_TEMP => TB_SELL_QTY 생성
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void createTtbSellQty();
+
+	/**
+	 * TB_ORDER_DETAIL => TB_SELL_QTY 생성
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	void createTtbSellQtyByOrderDetail();
+
 }

+ 21 - 0
style24.batch/src/main/java/com/style24/batch/biz/dao/TsbWmsGoodsDao.java

@@ -7,6 +7,8 @@ import com.style24.persistence.domain.GoodsIfIncomelot;
 import com.style24.persistence.domain.GoodsIfIncomelotitem;
 import com.style24.persistence.domain.GoodsIfMeasurement;
 import com.style24.persistence.domain.IfBrand;
+import com.style24.persistence.domain.IfProduct;
+import com.style24.persistence.domain.IfProductSku;
 import com.style24.persistence.domain.IfProvider;
 
 /**
@@ -72,4 +74,23 @@ public interface TsbWmsGoodsDao {
 	 */
 	void saveWmsBrandProviderXref(IfBrand ifBrand);
 
+	/**
+	 * WMS 상품 정보 송신
+	 *
+	 * @param ifProduct
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	void saveWmsProduct(IfProduct ifProduct);
+
+	/**
+	 * WMS 재고 테이블 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	Collection<IfProductSku> getWmsIfProductSukList();
+
+
 }

+ 3 - 3
style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsBrandproviderJob.java

@@ -5,7 +5,7 @@ import org.springframework.stereotype.Component;
 
 import com.style24.batch.biz.job.TsbAbstractJob;
 import com.style24.batch.biz.service.TsbCommonService;
-import com.style24.batch.biz.service.TsbGoodsService;
+import com.style24.batch.biz.service.TsbWmsGoodsService;
 import com.style24.persistence.domain.IfBrand;
 
 import lombok.extern.slf4j.Slf4j;
@@ -23,7 +23,7 @@ import com.gagaframework.web.util.GagaDateUtil;
 public class TsbGoodsWmsBrandproviderJob extends TsbAbstractJob<IfBrand, IfBrand, IfBrand> {
 
 	@Autowired
-	private TsbGoodsService goodsService;
+	private TsbWmsGoodsService wmsGoodsService;
 
 	@Autowired
 	private TsbCommonService commonService;
@@ -52,7 +52,7 @@ public class TsbGoodsWmsBrandproviderJob extends TsbAbstractJob<IfBrand, IfBrand
 	@Override
 	public IfBrand write(IfBrand ifBrand) throws Exception {
 
-		goodsService.saveWmsBrandProvider();
+		wmsGoodsService.saveWmsBrandProvider();
 
 		return ifBrand;
 	}

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

@@ -13,7 +13,7 @@ import lombok.extern.slf4j.Slf4j;
 import com.gagaframework.web.util.GagaDateUtil;
 
 /**
- * WMS 입고 연용
+ * WMS 입고 수신
  *
  * @author eskim
  * @since 2021. 01. 01

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

@@ -13,7 +13,7 @@ import lombok.extern.slf4j.Slf4j;
 import com.gagaframework.web.util.GagaDateUtil;
 
 /**
- * WMS 실측사이즈 연용
+ * WMS 실측사이즈 수신
  *
  * @author eskim
  * @since 2020. 12. 31

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

@@ -1,15 +1,21 @@
 package com.style24.batch.biz.job.goods;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import com.style24.batch.biz.job.TsbAbstractJob;
 import com.style24.batch.biz.service.TsbCommonService;
 import com.style24.batch.biz.service.TsbGoodsService;
+import com.style24.batch.biz.service.TsbWmsGoodsService;
 import com.style24.persistence.domain.IfProductSku;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.util.GagaDateUtil;
 
 /**
@@ -25,6 +31,9 @@ public class TsbGoodsWmsProductStockJob extends TsbAbstractJob<IfProductSku, IfP
 	@Autowired
 	private TsbGoodsService goodsService;
 
+	@Autowired
+	private TsbWmsGoodsService wmsGoodsService;
+
 	@Autowired
 	private TsbCommonService commonService;
 
@@ -56,14 +65,52 @@ public class TsbGoodsWmsProductStockJob extends TsbAbstractJob<IfProductSku, IfP
 			log.info("WMS 정보 동기화 미실행 {}, 연동여부 : {}", GagaDateUtil.getToday("yyyy-MM-dd HH:mm:ss"), wmsSyncYn);
 			return null;
 		}else {
+			/**
+			 * 나중에 개발 서버에서 꼭 테스트 해봅시다~~~~
+			 */
 			//wms상품재고이력 생성
-			goodsService.createWmsProductSkuHst(jobdate);
+//			goodsService.createWmsProductSkuHst(jobdate);
+
+			// TB_IF_PRODUCTSKU_TEMP 작업
+			goodsService.deleteIfProductSku();
+
+			// TB_IF_PRODUCTSKU_TEMP 생성
+			Collection<IfProductSku> wmsIfProductSukList = wmsGoodsService.getWmsIfProductSukList();
+
+			//대용량 : N
+			String byrow = "N";
+			if ("Y".equals(byrow)) {
+				for(IfProductSku ifProductSkuMap : wmsIfProductSukList) {
+					goodsService.createIfProductSkuByRow(ifProductSkuMap);
+				}
+			}else {
+
+				List<IfProductSku> productSukList = new ArrayList<IfProductSku>();
+				GagaMap dataMap = new GagaMap();
+				int index = 0;
+				for(IfProductSku ifProductSkuMap : wmsIfProductSukList) {
+
+					productSukList.add(ifProductSkuMap);
+					index++;
+					if (index % 200 == 0 ||  wmsIfProductSukList.size() == index) {
+						dataMap.set("productSukList", productSukList);
+						goodsService.createIfProductSku(dataMap);
+
+						productSukList.clear();
+					}
+				}
+
+			}
+//
+//			// TB_IF_PRODUCTSKU_HST 생성
+//			//goodsService.createWmsProductSkuHst(jobdate);
+
 			//온라인 상품 재고 적용
-			goodsService.saveGoodsStock();
+			//goodsService.saveGoodsStock();
 		}
 
 		//온라인 전시 재고 작업
-		goodsService.saveGoodsDispStock();
+		//goodsService.saveGoodsDispStock();
 
 		return ifProductSku;
 	}

+ 214 - 21
style24.batch/src/main/java/com/style24/batch/biz/service/TsbGoodsService.java

@@ -1,7 +1,9 @@
 package com.style24.batch.biz.service;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -19,13 +21,17 @@ import com.style24.persistence.domain.GoodsIfMeasurement;
 import com.style24.persistence.domain.GoodsSafeNo;
 import com.style24.persistence.domain.GoodsSummary;
 import com.style24.persistence.domain.IfBrand;
+import com.style24.persistence.domain.IfProduct;
+import com.style24.persistence.domain.IfProductSku;
 import com.style24.persistence.domain.IfProvider;
+import com.style24.persistence.domain.Option;
 
 import io.netty.util.internal.StringUtil;
 
 import lombok.extern.slf4j.Slf4j;
 
 import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.util.GagaDateUtil;
 
 /**
  * 상품 Service
@@ -409,40 +415,227 @@ public class TsbGoodsService {
 	}
 
 	/**
-	 * WMS 브랜드/업체정보 송신
+	 * 업체정보 조회
 	 *
 	 * @return
 	 * @author eskim
 	 * @since 2021. 01. 01
 	 */
-	//@Transactional("wmsTxnManager")
-	public void saveWmsBrandProvider() {
+	public Collection<IfProvider> getSupplyCompanyList() {
+		return goodsDao.getSupplyCompanyList();
+	}
+
+	/**
+	 * 브랜드정보 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	public Collection<IfBrand> getBrandList() {
+		return goodsDao.getBrandList();
+	}
 
-		//업체정보 송신(수정일 7일)
-		/*
-		 * 매핑 확인건
-		G065_10	자사-제조
-		G065_11	자사-사입
-		G065_12	자사-위탁
-		 */
 
-		Collection<IfProvider> ifProviderList = goodsDao.getSupplyCompanyList();
+	/**
+	 * 상품 정보 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	public Collection<IfProduct> getGoodsList() {
+		return goodsDao.getGoodsList();
+	}
+
+	/**
+	 * wms상품재고이력 생성
+	 *
+	 * @param jobdate
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 07
+	 */
+	@Transactional("shopTxnManager")
+	public void createWmsProductSkuHst(String jobdate) {
+
+		// TB_IF_PRODUCTSKU_TEMP 작업
+		goodsDao.deleteIfProductSku();
+
+		// TB_IF_PRODUCTSKU_TEMP 생성
+		Collection<IfProductSku> wmsIfProductSukList = wmsGoodsService.getWmsIfProductSukList();
+		String byrow = "N";
+		if ("Y".equals(byrow)) {
+			for(IfProductSku ifProductSku : wmsIfProductSukList) {
+				goodsDao.createIfProductSkuByRow(ifProductSku);
+			}
+		}else {
+
+			List<IfProductSku> productSukList = new ArrayList<IfProductSku>();
+
+			GagaMap dataMap = new GagaMap();
+			int index = 0;
+			for(IfProductSku ifProductSku : wmsIfProductSukList) {
+
+				productSukList.add(ifProductSku);
+				index++;
+				if (index % 200 == 0 ||  wmsIfProductSukList.size() == index) {
+					dataMap.set("productSukList", productSukList);
+					goodsDao.createIfProductSku(dataMap);
+					productSukList.clear();
+				}
+			}
 
-		for (IfProvider ifProvider : ifProviderList) {
-			ifProvider.setRegNo(TsbConstants.REG_NO);
-			ifProvider.setUpdNo(TsbConstants.REG_NO);
-			wmsGoodsService.saveWmsProvider(ifProvider);
 		}
 
-		//브랜드, 브랜드/업체 관계정보 송신
-		Collection<IfBrand> ifBrandList = goodsDao.getBrandList();
+		// TB_IF_PRODUCTSKU_HST 2달 전 데이터 삭제
+		String delYyyymmdd = GagaDateUtil.getOffsetMonth(-2, "yyyyMMdd") + "000000";  //년월일시분초
+		goodsDao.deleteWmsProductSkuHst(delYyyymmdd);
+//		// TB_IF_PRODUCTSKU_HST 생성
+		goodsDao.createWmsProductSkuHst(jobdate);
+
+	}
+
+	/**
+	 * WMS 임시 테이블에서 실테이블로 이관
+	 *
+	 * @throws Exception
+	 * @author eskim
+	 * @since 2021. 01. 07
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsStock() throws Exception {
+
+		// wms 재고 임시 테이블(TB_OPTION_SYNC_TEMP) 삭제
+		goodsDao.deleteTbOptionSyncTemp();
+		// wms 재고 임시 테이블(TB_OPTION_SYNC_TEMP) 적용 - 출고처별 판매비율 적용
+		goodsDao.createTbOptionSyncTemp();
+
+			// 입점 상품 재고 동기화 후 SELL_QTY 삭제
+			updateOptionByOfSellQty();
+
+			// TB_OPTION = > TB_OPTION_SYNC 적용
+			goodsDao.deleteGoodsOptionSync();
+			goodsDao.createGoodsOptionSync();
+
+			// TB_OPTION_SYNC_TEMP => TB_OPTION_SYNC 변경적용
+			goodsDao.saveGoodsOptionSyncSync();
+
+			// TB_OPTION_SYNC => TB_OPTION 적용
+			goodsDao.saveGoodsOptionNew();
+
+			// 자사상품중 주문상세상태가 입금대기, 결제완료, 교환대기 건은 TB_SELL_QTY 생성
+			createSellQtySelfGoods();
+
+	}
+
+	/**
+	 * 입점상품 SELL_QTY 만큼 재고 차감
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	private void updateOptionByOfSellQty() {
+		Collection<Option> goodsSelfNoStockList = goodsDao.getGoodsSelfNoStockList();
+		if (goodsSelfNoStockList != null && !goodsSelfNoStockList.isEmpty()) {
+
+			for (Option option : goodsSelfNoStockList) {
+
+				option.setRegNo(TsbConstants.REG_NO);
+				option.setUpdNo(TsbConstants.REG_NO);
+				// 이력생성
+				goodsDao.createStockHst(option);
 
-		for (IfBrand ifBrand : ifBrandList) {
-			ifBrand.setRegNo(TsbConstants.REG_NO);
-			ifBrand.setUpdNo(TsbConstants.REG_NO);
-			wmsGoodsService.saveWmsBrand(ifBrand);
+				// 재고 변경
+				goodsDao.updateStock(option);
+			}
 		}
+	}
+
+	/**
+	 * 자사상품, TB_SELL_QTY 생성
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 08
+	 */
+	private void createSellQtySelfGoods() {
+
+		// TB_SELL_QTY_TEMP 삭제
+		goodsDao.deleteTtbSellQtyTemp();
+
+		// TB_SELL_QTY_TEMP 생성
+		goodsDao.createTtbSellQtyTemp();
+
+		// 초기화
+		goodsDao.deleteSellQty();
+
+		// TB_SELL_QTY_TEMP => TB_SELL_QTY 생성
+		goodsDao.createTtbSellQty();
+
+		// TB_ORDER_DETAIL => TB_SELL_QTY 생성
+		goodsDao.createTtbSellQtyByOrderDetail();
 
 	}
+	/**
+	 * 상품 전시재고 생성
+	 *
+	 * @author eskim
+	 * @since 2020. 01. 06
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsDispStock()  {
+		goodsDao.deleteGoodsDispStock();
+		goodsDao.createGoodsDispStock();
+	}
+
+	/**
+	 * TB_IF_PRODUCTSKU_TEMP 삭제
+	 *
+	 * @author eskim
+	 * @since 2020. 01. 11
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteIfProductSku() {
+		goodsDao.deleteIfProductSku();
+	}
+
+	/**
+	 * TB_IF_PRODUCTSKU 생성(by row )
+	 *
+	 * @author eskim
+	 * @since 2020. 01. 11
+	 */
+	@Transactional("shopTxnManager")
+	public void createIfProductSkuByRow(IfProductSku ifProductSku) {
+		goodsDao.createIfProductSkuByRow(ifProductSku);
+	}
+
+	/**
+	 * TB_IF_PRODUCTSKU 생성
+	 *
+	 * @author eskim
+	 * @since 2020. 01. 11
+	 */
+	@Transactional("shopTxnManager")
+	public void createIfProductSku(GagaMap dataMap) {
+		goodsDao.createIfProductSku(dataMap);
+	}
+
+	
+	/**
+	 * TB_IF_PRODUCTSKU_HST 저장
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 11
+	 */
+	@Transactional("shopTxnManager")
+	public void createIfProductSku(String jobdate) {
+		goodsDao.createWmsProductSkuHst(jobdate);
+	}
+
 
 }

+ 79 - 10
style24.batch/src/main/java/com/style24/batch/biz/service/TsbWmsGoodsService.java

@@ -4,12 +4,16 @@ import java.util.Collection;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import com.style24.batch.biz.dao.TsbWmsGoodsDao;
+import com.style24.batch.support.env.TsbConstants;
 import com.style24.persistence.domain.GoodsIfIncomelot;
 import com.style24.persistence.domain.GoodsIfIncomelotitem;
 import com.style24.persistence.domain.GoodsIfMeasurement;
 import com.style24.persistence.domain.IfBrand;
+import com.style24.persistence.domain.IfProduct;
+import com.style24.persistence.domain.IfProductSku;
 import com.style24.persistence.domain.IfProvider;
 
 import lombok.extern.slf4j.Slf4j;
@@ -27,6 +31,9 @@ public class TsbWmsGoodsService {
 	@Autowired
 	private TsbWmsGoodsDao wmsGoodsDao;
 
+	@Autowired
+	private TsbGoodsService goodsService;
+
 	/**
 	 * WMS 실측사이즈 연용
 	 *
@@ -67,23 +74,85 @@ public class TsbWmsGoodsService {
 	 * @author eskim
 	 * @since 2021. 01. 05
 	 */
-	//@Transactional("wmsTxnManager")
-	public void saveWmsProvider(IfProvider ifProvider) {
-		wmsGoodsDao.saveWmsProvider(ifProvider);
+	@Transactional("wmsTxnManager")
+	public void saveWmsBrand(IfBrand ifBrand) {
+		//브랜드 정보 송신
+		wmsGoodsDao.saveWmsBrand(ifBrand);
+		//WMS 브랜드업체관계정보 송신
+		wmsGoodsDao.saveWmsBrandProviderXref(ifBrand);
 	}
 
+
 	/**
-	 * WMS 업체정보 송신
+	 * WMS 브랜드/업체정보 송신
 	 *
 	 * @return
 	 * @author eskim
-	 * @since 2021. 01. 05
+	 * @since 2021. 01. 01
 	 */
-	public void saveWmsBrand(IfBrand ifBrand) {
-		//브랜드 정보 송신
-		wmsGoodsDao.saveWmsBrand(ifBrand);
-		//WMS 브랜드업체관계정보 송신
-		wmsGoodsDao.saveWmsBrandProviderXref(ifBrand);
+	@Transactional("wmsTxnManager")
+	public void saveWmsBrandProvider() {
+
+		//업체정보 송신(수정일 7일)
+		/*
+		 * 매핑 확인건
+		G065_10	자사-제조
+		G065_11	자사-사입
+		G065_12	자사-위탁
+		 */
+
+		Collection<IfProvider> ifProviderList = goodsService.getSupplyCompanyList();
+
+		for (IfProvider ifProvider : ifProviderList) {
+			ifProvider.setRegNo(TsbConstants.REG_NO);
+			ifProvider.setUpdNo(TsbConstants.REG_NO);
+			wmsGoodsDao.saveWmsProvider(ifProvider);
+		}
+
+		//브랜드, 브랜드/업체 관계정보 송신
+		Collection<IfBrand> ifBrandList = goodsService.getBrandList();
+
+		for (IfBrand ifBrand : ifBrandList) {
+			ifBrand.setRegNo(TsbConstants.REG_NO);
+			ifBrand.setUpdNo(TsbConstants.REG_NO);
+			//브랜드 정보 송신
+			wmsGoodsDao.saveWmsBrand(ifBrand);
+			//WMS 브랜드업체관계정보 송신
+			wmsGoodsDao.saveWmsBrandProviderXref(ifBrand);
+		}
+
+	}
+
+	/**
+	 * WMS 상품정보 송신
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	@Transactional("wmsTxnManager")
+	public void saveGoodsWmsProduct(String jobdate) {
+		//상품 정보 송신
+		Collection<IfProduct> ifGoodsList = goodsService.getGoodsList();
+
+		for (IfProduct ifProduct : ifGoodsList) {
+			ifProduct.setRegNo(TsbConstants.REG_NO);
+			ifProduct.setUpdNo(TsbConstants.REG_NO);
+			//상품 정보 송신
+			wmsGoodsDao.saveWmsProduct(ifProduct);
+
+		}
+	}
+
+	/**
+	 * WMS 재고 테이블 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	public Collection<IfProductSku> getWmsIfProductSukList() {
+		return wmsGoodsDao.getWmsIfProductSukList();
 	}
 
 }

+ 2 - 3
style24.batch/src/main/java/com/style24/batch/biz/task/TsbDeliveryTask.java

@@ -2,7 +2,6 @@ package com.style24.batch.biz.task;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import com.style24.batch.biz.job.delivery.TsbDailyDeliveryZoneJob;
@@ -47,12 +46,12 @@ public class TsbDeliveryTask {
 	 */
 
 	/**
-	 * 총알배송 권역정보   : 일배치  오전 11시  
+	 * 총알배송 권역정보   : 일배치  오전 11시
 	 *
 	 * @throws Exception
 	 */
 	//@Scheduled(cron = "${cron.delivery.tsbDailyDeliveryZoneJob}")
-	@Scheduled(fixedDelay = 3500000)
+	//@Scheduled(fixedDelay = 3500000)
 	@Async
 	public void tsbDailyDeliveryZoneJob() throws Exception {
 		dailyDeliveryZoneJob.run("cron.delivery.daily.deliveryZone");

+ 31 - 0
style24.batch/src/main/java/com/style24/batch/biz/task/TsbGoodsTask.java

@@ -15,6 +15,8 @@ import com.style24.batch.biz.job.goods.TsbGoodsTnmJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsBrandproviderJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsIncomelotJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsMeasurementJob;
+import com.style24.batch.biz.job.goods.TsbGoodsWmsProductJob;
+import com.style24.batch.biz.job.goods.TsbGoodsWmsProductStockJob;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -57,6 +59,12 @@ public class TsbGoodsTask {
 	@Autowired
 	private TsbGoodsWmsBrandproviderJob goodsWmsBrandproviderJob;
 
+	@Autowired
+	private TsbGoodsWmsProductJob goodsWmsProductJob;
+
+	@Autowired
+	private TsbGoodsWmsProductStockJob goodsWmsProductStockJob;
+
 
 
 	/**
@@ -203,5 +211,28 @@ public class TsbGoodsTask {
 		goodsWmsBrandproviderJob.runById("cron.goods.wms.brandprovider");
 	}
 
+	/**
+	 * WMS 상품정보 송신 적용 주기 : 일배치 - 03시 15분
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.wms.product}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsWmsProductJob() throws Exception {
+		goodsWmsProductJob.runById("cron.goods.wms.product");
+	}
+
+	/**
+	 * WMS 상품 재고 수신 적용 주기 : 시간배치 - 01분
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.wms.product.stock}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsWmsProductStockJob() throws Exception {
+		goodsWmsProductStockJob.runById("cron.goods.wms.product.stock");
+	}
 
 }

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

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

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

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

+ 597 - 12
style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml

@@ -1208,10 +1208,6 @@
 		       PRODUCT_NO 
 		     , PRODUCT_CODE 
 		     , PRODUCT_NAME 
-		     , SKUCODE 
-		     , NORMAL_QTY 
-		     , BROKEN_QTY 
-		     , TOTAL_QTY 
 		     , MODEL_NO 
 		     , PROVIDER_NO
 		     , PROVIDER_NAME
@@ -1225,11 +1221,7 @@
 		SELECT B.PRODUCTNO 
 		     , B.PRODUCTCODE 
 		     , B.PRODUCTNAME 
-		     , B.SKUCODE 
-		     , B.NORMALQTY 
-		     , B.BROKENQTY 
-		     , B.TOTALQTY 
-		     , B.MODELNO 
+		     , LEFT(B.MODELNO,10) AS MODELNO 
 		     , A.PROVIDERNO
 		     , A.PROVIDERNAME
 		     , A.BRANDNO
@@ -1257,9 +1249,6 @@
 		</choose>
 		ON DUPLICATE KEY UPDATE
 		       PRODUCT_NAME = IF(GOODS_REG_GB IS NULL, B.PRODUCTNAME, TB_WMS_GOODS.PRODUCT_NAME)
-		     , NORMAL_QTY = IF(GOODS_REG_GB IS NULL, B.NORMALQTY, TB_WMS_GOODS.NORMAL_QTY)
-		     , BROKEN_QTY = IF(GOODS_REG_GB IS NULL, B.BROKENQTY, TB_WMS_GOODS.BROKEN_QTY)
-		     , TOTAL_QTY = IF(GOODS_REG_GB IS NULL, B.TOTALQTY, TB_WMS_GOODS.TOTAL_QTY)
 		     , MODEL_NO = IF(GOODS_REG_GB IS NULL, B.MODELNO, TB_WMS_GOODS.MODEL_NO)
 		     , PROVIDER_NO = IF(GOODS_REG_GB IS NULL, A.PROVIDERNO, TB_WMS_GOODS.PROVIDER_NO)
 		     , PROVIDER_NAME = IF(GOODS_REG_GB IS NULL, A.PROVIDERNAME, TB_WMS_GOODS.PROVIDER_NAME)
@@ -1311,4 +1300,600 @@
 		]]>
 	</select>
 	
+	<!-- 상품 목록 -->
+	<select id="getGoodsList" resultType="IfProduct">
+		/* TsbGoods.getGoodsList */
+		SELECT G.PRODUCT_NO AS PRODUCTNO
+		     , G.PRODUCT_CODE AS PRODUCTCODE
+		     , G.GOODS_NM AS PRODUCTNAME
+		     , B.BRAND_NO AS BRANDNO
+		     , B.BRAND_ENM AS BRANDNAME
+		     , C.PROVIDER_NO AS PROVIDERNO
+		     , (CASE G.GOODS_STAT WHEN 'G008_20' THEN '승인보류' 
+		                         WHEN 'G008_40' THEN '승인대기' 
+		                         WHEN 'G008_70' THEN '품절'
+		                         WHEN 'G008_99' THEN '삭제'
+		                         WHEN 'G008_95' THEN '판매중지'
+		                         ELSE '판매중'
+		        END) AS STATUSCD
+		     , G.SUPPLY_GOODS_CD AS VENDORPRODUCTCODE
+		     , G.GOODS_CD
+		     , G.BRAND_CD
+		     , G.SUPPLY_COMP_CD
+		     , (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
+		FROM   TB_GOODS G
+		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		INNER JOIN TB_SUPPLY_COMPANY C ON G.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD
+		WHERE  G.SELF_GOODS_YN  = 'Y'  /* 자사 */
+		AND G.UPD_DT >= DATE_FORMAT(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 DAY), '%Y%m%d'), '%Y%m%d%H%i%S') 
+		<![CDATA[
+		AND G.UPD_DT < DATE_FORMAT(DATE_FORMAT(NOW(), '%Y%m%d'), '%Y%m%d%H%i%S')
+		]]>
+	</select>
+	
+	<!-- TB_IF_PRODUCTSKU_TEMP 삭제 -->
+	<delete id="deleteIfProductSku"  timeout="300">
+		/* TsbGoods.deleteIfProductSku */
+		TRUNCATE TABLE TB_IF_PRODUCTSKU
+	</delete>
+	
+	<!-- TB_IF_PRODUCTSKU_TEMP 저장 -->
+	<insert id="createIfProductSku"  parameterType="java.util.HashMap" >
+		/* TsbGoods.createIfProductSku */
+		INSERT INTO TB_IF_PRODUCTSKU(
+		       SKUCODE
+		     , SKUMODELNO
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , OPTION1
+		     , OPTION2
+		     , OPTION3
+		     , SELLINGSTOCKAMOUNT
+		     , SELLINGSTOCKTYPECD
+		     , LIMITSTOCKAMOUNT
+		     , VENDORSKUMODELNO
+		     , VENDORSKUCODE
+		     , ISVIRTUALSTOCK
+		     , DATEVIRTUALSTOCK
+		     , SKUCODE88
+		     , UPD_DT
+		)
+		VALUES
+		<foreach collection="productSukList" item="item" index="index"  separator=",">
+		(
+		       #{item.skucode}
+		     , #{item.skumodelno}
+		     , #{item.productno}
+		     , #{item.productcode}
+		     , #{item.option1}
+		     , #{item.option2}
+		     , #{item.option3}
+		     , #{item.sellingstockamount}
+		     , #{item.sellingstocktypecd}
+		     , #{item.limitstockamount}
+		     , #{item.vendorskumodelno}
+		     , #{item.vendorskucode}
+		     , #{item.isvirtualstock}
+		     , #{item.datevirtualstock}
+		     , #{item.skucode88}
+		     , NOW()
+		)
+		</foreach>
+		
+	</insert>
+	
+	<!-- TB_IF_PRODUCTSKU_TEMP 저장 -->
+	<insert id="createIfProductSkuByRow"  parameterType="IfProduct">
+		/* TsbGoods.createIfProductSkuByRow */
+		INSERT INTO TB_IF_PRODUCTSKU(
+		       SKUCODE
+		     , SKUMODELNO
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , OPTION1
+		     , OPTION2
+		     , OPTION3
+		     , SELLINGSTOCKAMOUNT
+		     , SELLINGSTOCKTYPECD
+		     , LIMITSTOCKAMOUNT
+		     , VENDORSKUMODELNO
+		     , VENDORSKUCODE
+		     , ISVIRTUALSTOCK
+		     , DATEVIRTUALSTOCK
+		     , SKUCODE88
+		     , UPD_DT
+		)
+		VALUES(
+		       #{skucode}
+		     , #{skumodelno}
+		     , #{productno}
+		     , #{productcode}
+		     , #{option1}
+		     , #{option2}
+		     , #{option3}
+		     , #{sellingstockamount}
+		     , #{sellingstocktypecd}
+		     , #{limitstockamount}
+		     , #{vendorskumodelno}
+		     , #{vendorskucode}
+		     , #{isvirtualstock}
+		     , #{datevirtualstock}
+		     , #{skucode88}
+		     , NOW()
+		)
+	</insert>
+	
+	<!-- TB_IF_PRODUCTSKU_HST 삭제 -->
+	<delete id="deleteWmsProductSkuHst"  parameterType="String" timeout="300">
+		/* TsbGoods.deleteWmsProductSkuHst */
+		DELETE FROM TB_IF_PRODUCTSKU_HST
+		WHERE JOBDATE <![CDATA[<=]]> #{jobdate} 
+	</delete>
+	
+	<!-- TB_IF_PRODUCTSKU_HST 저장 -->
+	<insert id="createWmsProductSkuHst"  parameterType="String" timeout="300">
+		/* TsbGoods.createWmsProductSkuHst */
+		INSERT INTO TB_IF_PRODUCTSKU_HST(
+		       JOBDATE
+		     , SKUCODE
+		     , SKUMODELNO
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , OPTION1
+		     , OPTION2
+		     , OPTION3
+		     , SELLINGSTOCKAMOUNT
+		     , SELLINGSTOCKTYPECD
+		     , LIMITSTOCKAMOUNT
+		     , VENDORSKUMODELNO
+		     , VENDORSKUCODE
+		     , ISVIRTUALSTOCK
+		     , DATEVIRTUALSTOCK
+		     , SKUCODE88
+		)
+		SELECT #{jobdate}
+		     , SKUCODE
+		     , SKUMODELNO
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , OPTION1
+		     , OPTION2
+		     , OPTION3
+		     , SELLINGSTOCKAMOUNT
+		     , SELLINGSTOCKTYPECD
+		     , LIMITSTOCKAMOUNT
+		     , VENDORSKUMODELNO
+		     , VENDORSKUCODE
+		     , ISVIRTUALSTOCK
+		     , DATEVIRTUALSTOCK
+		     , SKUCODE88
+		FROM TB_IF_PRODUCTSKU
+	</insert>
+	
+	<!-- TB_GOODS_STOCK 삭제 -->
+	<delete id="deleteGoodsDispStock"   timeout="300">
+		/* TsbGoods.deleteGoodsDispStock */
+		DELETE FROM TB_GOODS_STOCK
+	</delete>
+	
+	<!-- TB_GOODS_STOCK 저장 -->
+	<insert id="createGoodsDispStock"  parameterType="String" timeout="300">
+		/* TsbGoods.createGoodsDispStock */
+		INSERT INTO TB_GOODS_STOCK( 
+		    GOODS_CD
+		  , STOCK_QTY
+		  , REG_DT
+		)
+		SELECT Z.GOODS_CD
+		     , MIN(Z.STOCK_QTY_ITEM) AS STOCK_QTY
+		     , NOW()
+		FROM   (
+		        SELECT A.GOODS_CD
+		             , A.MIN_ORD_QTY
+		             , SUM(C.CURR_STOCK_QTY - C.BASE_STOCK_QTY) AS STOCK_QTY_ITEM
+		        FROM   TB_GOODS A
+		             , VW_STOCK C
+		        WHERE  A.GOODS_CD = C.GOODS_CD
+		        AND    C.SOLDOUT_YN = 'N'
+		        AND    C.CURR_STOCK_QTY - C.BASE_STOCK_QTY > 0
+		        GROUP  BY A.GOODS_CD, A.MIN_ORD_QTY
+		        UNION ALL
+		        SELECT A.GOODS_CD
+		             , A.MIN_ORD_QTY
+		             , SUM(C.CURR_STOCK_QTY - C.BASE_STOCK_QTY) AS STOCK_QTY_ITEM
+		        FROM   TB_GOODS A
+		             , TB_GOODS_COMPOSE B
+		             , VW_STOCK C
+		        WHERE  A.GOODS_CD = B.GOODS_CD
+		        AND    B.COMPS_GOODS_CD = C.GOODS_CD
+		        AND    B.USE_YN = 'Y'
+		        AND    A.GOODS_TYPE != 'N'
+		        AND    C.SOLDOUT_YN = 'N'
+		        AND    C.CURR_STOCK_QTY - C.BASE_STOCK_QTY > 0
+		        GROUP  BY A.GOODS_CD, A.MIN_ORD_QTY
+		       ) Z
+		GROUP  BY Z.GOODS_CD, Z.MIN_ORD_QTY
+		HAVING Z.MIN_ORD_QTY <![CDATA[<=]]> MIN(Z.STOCK_QTY_ITEM)
+	</insert>
+	
+	<!-- ERP 재고 임시 테이블 삭제 -->
+	<delete id="deleteTbOptionSyncTemp"   timeout="300">
+		/* TsbGoods.deleteTbOptionSyncTemp */
+		TRUNCATE TABLE TB_OPTION_SYNC_TEMP
+	</delete>
+
+	<!--ERP 재고 임시 테이블 이관  -->
+	<insert id="createTbOptionSyncTemp"   timeout="300">
+		/* TsbGoods.createTbOptionSyncTemp */
+		INSERT INTO TB_OPTION_SYNC_TEMP
+		(
+		       GOODS_CD
+		     , OPT_CD
+		     , OPT_CD1
+		     , OPT_CD2
+		     , SKU_MODEL_NO
+		     , PRODUCT_NO
+		     , PRODUCT_CODE
+		     , BASE_STOCK_QTY
+		     , CURR_STOCK_QTY
+		     , ADD_PRICE
+		     , SOLDOUT_YN
+		     , DISP_ORD
+		     , DISP_YN
+		     , ERP_STOCK_LINK_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT GOODS_CD
+		     , OPT_CD
+		     , OPT_CD1
+		     , OPT_CD2
+		     , SKU_MODEL_NO
+		     , PRODUCT_NO
+		     , PRODUCT_CODE
+		     , 0 AS BASE_STOCK_QTY
+		     , CURR_STOCK_QTY
+		     , 0 AS ADD_PRICE
+		     , 'N' AS SOLDOUT_YN
+		     , DISP_ORD
+		     , 'Y' AS DISP_YN
+		     , ERP_STOCK_LINK_YN
+		     , 0 AS REG_NO
+		     , NOW() AS REG_DT
+		     , 0 AS UPD_NO
+		     , NOW() AS UPD_DT
+		FROM (
+		      SELECT GOODS_CD
+		           , OPT_CD
+		           , OPT_CD1
+		           , OPT_CD2
+		           , SKU_MODEL_NO
+		           , PRODUCT_NO
+		           , PRODUCT_CODE
+		           , SUM(CURR_STOCK_QTY) AS CURR_STOCK_QTY
+		           , NVL((SELECT (MAX(DISP_ORD) + 1) AS DISP_ORD 
+		                  FROM TB_OPTION WHERE GOODS_CD = Z.GOODS_CD) , ROW_NUMBER() OVER(PARTITION BY GOODS_CD ORDER BY OPT_CD)) AS DISP_ORD
+		           , ERP_STOCK_LINK_YN
+		       FROM (
+		           SELECT B.GOODS_CD
+		                , A.SKUCODE AS OPT_CD
+		                , MAX(A.OPTION1) AS OPT_CD1
+		                , MAX(A.OPTION2) AS OPT_CD2
+		                , MAX(A.SKUMODELNO) AS SKU_MODEL_NO
+		                , MAX(B.PRODUCT_NO) AS PRODUCT_NO
+		                , MAX(B.PRODUCT_CODE) AS PRODUCT_CODE
+		                , ROUND(GREATEST(A.SELLINGSTOCKAMOUNT, 0) * (NVL(D.STOCK_APPL_RATE, 0)/100)) AS CURR_STOCK_QTY
+		                , MAX(B.ERP_STOCK_LINK_YN) AS ERP_STOCK_LINK_YN
+		                , D.DELV_LOC_CD
+		                , D.STOCK_APPL_RATE
+		           FROM TB_IF_PRODUCTSKU A 
+		           INNER JOIN TB_GOODS B ON A.PRODUCTCODE = B.PRODUCT_CODE 
+		                                 AND B.SELF_GOODS_YN = 'Y'
+		                                 AND B.GOODS_TYPE = 'N'
+		           INNER JOIN TB_OPTION E ON A.SKUCODE = E.OPT_CD
+		                                  AND A.PRODUCTCODE = E.PRODUCT_CODE
+		           INNER JOIN TB_STOCK_SYNC_BASE C ON B.BRAND_CD = C.BRAND_CD
+		                                           AND C.STOCK_SYNC_YN = 'Y'
+		           INNER JOIN TB_DELIVERY_LOC D ON B.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
+		                                        AND C.DELV_LOC_CD = D.DELV_LOC_CD
+		                                        AND D.USE_YN = 'Y'
+		           WHERE 1 = 1
+		           GROUP BY B.GOODS_CD, A.SKUCODE, D.DELV_LOC_CD, D.STOCK_APPL_RATE
+		           ) Z
+		       GROUP BY GOODS_CD, OPT_CD, ERP_STOCK_LINK_YN
+		      ) Y
+	</insert>
+	
+	<!-- 입점상품 SELL_QTY 목록 조회 -->
+	<select id="getGoodsSelfNoStockList" resultType="Option"   timeout="300">
+		/* TsbGoods.getGoodsSelfNoStockList */
+		SELECT A.GOODS_CD
+		     , A.OPT_CD
+		     , SUM(
+		           (CASE A.SELL_GB WHEN '10' THEN 1
+		                          WHEN '20' THEN 1
+		                          ELSE -1 END) * A.SELL_QTY
+		           ) AS SALE_STOCK_QTY
+		FROM TB_SELL_QTY A
+		   , TB_GOODS B
+		WHERE A.GOODS_CD = B.GOODS_CD
+		AND B.SELF_GOODS_YN = 'N'  -- 입점상품
+		GROUP BY A.GOODS_CD, A.OPT_CD
+	</select>
+	
+	<!-- 상품 옵션/재고 정보 이력생성 -->
+	<insert id="createStockHst" parameterType="Option"   timeout="300">
+		/* TsaGoods.createStockHst */
+		INSERT INTO TB_OPTION_HST 
+		(     OPTION_HST_SQ
+		    , GOODS_CD
+		    , OPT_CD
+		    , OPT_CD1
+		    , OPT_CD2
+		    , SKU_MODEL_NO
+		    , PRODUCT_NO
+		    , PRODUCT_CODE
+		    , BASE_STOCK_QTY
+		    , CURR_STOCK_QTY
+		    , ADD_PRICE
+		    , SOLDOUT_YN
+		    , DISP_ORD
+		    , DISP_YN
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		)
+		SELECT NULL
+		     , GOODS_CD
+		     , OPT_CD
+		     , OPT_CD1
+		     , OPT_CD2
+		     , SKU_MODEL_NO
+		     , PRODUCT_NO
+		     , PRODUCT_CODE
+		     , BASE_STOCK_QTY
+		     , CURR_STOCK_QTY
+		     , ADD_PRICE
+		     , SOLDOUT_YN
+		     , DISP_ORD
+		     , DISP_YN
+		     , #{regNo}
+		     , NOW()
+		     , UPD_NO
+		     , UPD_DT
+		FROM TB_OPTION
+		WHERE GOODS_CD = #{goodsCd}
+		AND OPT_CD = #{optCd}
+	</insert>
+	
+	<!-- 상품 재고 정보 저장 -->
+	<update id="updateStock" parameterType="Option"  timeout="300">
+		/* TsbGoods.updateStock */
+		UPDATE TB_STOCK
+		SET CURR_ON_STOCK_QTY = GREATEST(CURR_ON_STOCK_QTY - #{saleStockQty},0)
+		  , UPD_NO = #{updNo}
+		  , UPD_DT = NOW()
+		WHERE GOODS_CD = #{goodsCd}
+		AND OPT_CD = #{optCd}
+	</update>
+	
+	<!-- WMS 재고 임시 테이블 삭제 -->
+	<delete id="deleteGoodsOptionSync"  timeout="300">
+		/* TsbGoods.deleteGoodsOptionSync */
+		TRUNCATE TABLE TB_OPTION_SYNC
+	</delete>
+	
+	<!--TB_OPTION = > TB_OPTION_SYNC 적용 -->
+	<insert id="createGoodsOptionSync"  timeout="300">
+		/* TsbGoods.createGoodsOptionSync */
+		INSERT INTO TB_OPTION_SYNC
+		(
+		       GOODS_CD
+		     , OPT_CD
+		     , OPT_CD1
+		     , OPT_CD2
+		     , SKU_MODEL_NO
+		     , PRODUCT_NO
+		     , PRODUCT_CODE
+		     , BASE_STOCK_QTY
+		     , CURR_STOCK_QTY
+		     , ADD_PRICE
+		     , SOLDOUT_YN
+		     , DISP_ORD
+		     , DISP_YN
+		     , ERP_STOCK_LINK_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT B.GOODS_CD
+		     , B.OPT_CD
+		     , B.OPT_CD1
+		     , B.OPT_CD2
+		     , B.SKU_MODEL_NO
+		     , B.PRODUCT_NO
+		     , B.PRODUCT_CODE
+		     , B.BASE_STOCK_QTY
+		     , B.CURR_STOCK_QTY
+		     , B.ADD_PRICE
+		     , B.SOLDOUT_YN
+		     , B.DISP_ORD
+		     , B.DISP_YN
+		     , A.ERP_STOCK_LINK_YN
+		     , B.REG_NO
+		     , B.REG_DT
+		     , B.UPD_NO
+		     , B.UPD_DT
+		FROM   TB_GOODS A, TB_OPTION B
+		WHERE  A.GOODS_CD = B.GOODS_CD
+	</insert>
+	
+	<!-- TB_OPTION_SYNC_TEMP => TB_OPTION_SYNC 변경적용-->
+	<insert id="saveGoodsOptionSyncSync"  timeout="300">
+		/* TsbGoods.saveGoodsOptionSyncSync */
+		UPDATE TB_OPTION_SYNC A, (SELECT GOODS_CD
+		                               , OPT_CD
+		                               , CURR_STOCK_QTY
+		                               , ERP_STOCK_LINK_YN
+		                          FROM TB_OPTION_SYNC_TEMP
+		                          WHERE ERP_STOCK_LINK_YN = 'Y'
+		                          ) B
+		SET A.CURR_STOCK_QTY = B.CURR_STOCK_QTY
+		  , A.UPD_NO = 0
+		  , A.UPD_DT = NOW()
+		WHERE A.GOODS_CD = B.GOODS_CD
+		AND A.OPT_CD = B.OPT_CD
+		<![CDATA[
+		AND A.CURR_STOCK_QTY <> B.CURR_STOCK_QTY
+		]]>
+	</insert>
+	
+	<!-- WMS 임시 테이블에서 실테이블로 변경 -->
+	<insert id="saveGoodsOptionNew"  timeout="300">
+		/* TsbGoods.saveGoodsOptionNew */
+		UPDATE TB_OPTION A, (SELECT GOODS_CD
+		                          , OPT_CD
+		                          , CURR_STOCK_QTY
+		                          , ERP_STOCK_LINK_YN
+		                      FROM TB_OPTION_SYNC
+		                      WHERE ERP_STOCK_LINK_YN = 'Y'
+		                      ) B
+		SET A.CURR_STOCK_QTY = B.CURR_STOCK_QTY
+		  , A.UPD_NO = 0
+		  , A.UPD_DT = NOW()
+		WHERE A.GOODS_CD = B.GOODS_CD
+		AND A.OPT_CD = B.OPT_CD
+		<![CDATA[
+		AND A.CURR_STOCK_QTY <> B.CURR_STOCK_QTY
+		]]>
+	</insert>
+		
+	<!-- TB_SELL_QTY_TEMP 테이블 삭제 -->
+	<delete id="deleteTtbSellQtyTemp"  timeout="300">
+		/* TsbGoods.deleteTtbSellQtyTemp */
+		TRUNCATE TABLE TB_SELL_QTY_TEMP
+	</delete>
+	
+	<!-- TB_SELL_QTY_TEMP 테이블 삭제 -->
+	<insert id="createTtbSellQtyTemp"  timeout="300">
+		/* TsbGoods.createTtbSellQtyTemp */
+		INSERT INTO TB_SELL_QTY_TEMP (
+		      GOODS_CD
+		    , OPT_CD
+		    , SELL_GB
+		    , ORD_DTL_NO
+		    , ORD_CHG_SQ
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , SELL_QTY
+		    , REG_NO
+		    , REG_DT
+		)
+		SELECT GOODS_CD
+		    , OPT_CD
+		    , SELL_GB
+		    , ORD_DTL_NO
+		    , ORD_CHG_SQ
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , SELL_QTY
+		    , REG_NO
+		    , REG_DT
+		FROM TB_SELL_QTY
+	</insert>
+
+	<!-- 주문적재 테이블 삭제 -->
+	<delete id="deleteSellQty"  timeout="300">
+		/* TsbGoods.deleteSellQty */
+		DELETE FROM TB_SELL_QTY
+	</delete>
+	
+	<!-- TB_SELL_QTY 테이블 생성 -->
+	<insert id="createTtbSellQty"  timeout="300">
+		/* TsbGoods.createTtbSellQty */
+		INSERT INTO TB_SELL_QTY (
+		      GOODS_CD
+		    , OPT_CD
+		    , SELL_GB
+		    , ORD_DTL_NO
+		    , ORD_CHG_SQ
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , SELL_QTY
+		    , REG_NO
+		    , REG_DT
+		)
+		SELECT  GOODS_CD
+		    , OPT_CD
+		    , SELL_GB
+		    , ORD_DTL_NO
+		    , ORD_CHG_SQ
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , SELL_QTY
+		    , REG_NO
+		    , REG_DT
+		FROM TB_SELL_QTY_TEMP
+		WHERE ORD_DTL_NO IN (
+		                     SELECT OD.ORD_DTL_NO
+		                     FROM TB_ORDER_DETAIL OD
+		                        , TB_ORDER_DETAIL_ITEM ODI
+		                        , TB_GOODS G
+		                     WHERE OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		                     AND OD.ORD_DTL_STAT IN ('G013_10','G013_20') -- 입금대기, 결제완료
+		                     AND ODI.ITEM_CD = G.GOODS_CD
+		                     AND G.SELF_GOODS_YN ='Y'
+		                    )
+	</insert>
+	
+	<!-- TB_SELL_QTY 테이블 생성 -->
+	<insert id="createTtbSellQtyByOrderDetail"  timeout="300">
+		/* TsbGoods.createTtbSellQtyByOrderDetail */
+		INSERT INTO TB_SELL_QTY (
+		      GOODS_CD
+		    , SELL_GB
+		    , ORD_DTL_NO
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , SELL_QTY
+		    , REG_NO
+		    , REG_DT
+		)
+		SELECT ITEM_CD
+		     , OPT_CD
+		     , SELL_GB
+		     , ORD_DTL_NO
+		     , AGENT_ORDER_ID
+		     , EXTMALL_ORDER_ID
+		     , SELL_QTY
+		     , 0
+		     , NOW()
+		FROM (
+		      SELECT ODI.ITEM_CD
+		           , ODI.OPT_CD
+		           , '10' AS SELL_GB -- 주문건
+		           , OD.ORD_DTL_NO
+		           , OD.AGENT_ORDER_ID
+		           , OD.EXTMALL_ORDER_ID
+		           , SUM((OD.ORD_QTY - OD.CNCL_RTN_QTY) * ODI.ITEM_QTY) AS SELL_QTY
+		      FROM TB_ORDER_DETAIL OD
+		         , TB_ORDER_DETAIL_ITEM ODI
+		      WHERE OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		      AND OD.ORD_DTL_STAT IN ('G013_10','G013_20') -- 입금대기, 결제완료
+		      AND EXISTS (SELECT 1 FROM TB_OPTION X WHERE X.GOODS_CD = ODI.ITEM_CD AND X.OPT_CD = ODI.OPT_CD)
+		      GROUP BY ODI.ITEM_CD, ODI.OPT_CD, OD.ORD_DTL_NO, OD.AGENT_ORDER_ID, OD.EXTMALL_ORDER_ID
+		     ) A
+		WHERE NOT EXISTS (SELECT 1 
+		                  FROM TB_SELL_QTY Y 
+		                  WHERE Y.GOODS_CD = A.ITEM_CD 
+		                  AND Y.OPT_CD = A.OPT_CD
+		                  AND Y.SELL_GB = A.SELL_GB
+		                  AND Y.ORD_DTL_NO = A.ORD_DTL_NO
+		                  )
+	</insert>
+	
 </mapper>

+ 40 - 0
style24.batch/src/main/java/com/style24/persistence/mybatis/wms/TsbWmsGoods.xml

@@ -68,6 +68,7 @@
 		     , NORMALQTY
 		     , BROKENQTY
 		     , TOTALQTY
+		     , MODELNO
 		FROM TB_IF_INCOMELOTITEM
 		WHERE 1 = 1 
 		<choose>
@@ -194,4 +195,43 @@
 		           );
 	</insert>
 	
+	<!--WMS 상품정보 송신-->
+	<update id="saveWmsProduct" parameterType="IfProduct" >
+		/* TsbWmsGoods.saveWmsProduct */
+		UPDATE TB_IF_PRODUCT
+		SET PRODUCTNAME = #{productname}
+		  , BRANDNO = #{brandno}
+		  , BRANDNAME = #{brandname}
+		  , PROVIDERNO = #{providerno}
+		  , STATUSCD = #{statuscd}
+		  , VENDORPRODUCTCODE = #{vendorproductcode}
+		  , GOODS_CD = #{goodsCd}
+		  , BRAND_CD = #{brandCd }
+		  , SUPPLY_COMP_CD = #{supplyCompCd}
+		  , SYS_IMG_NM = #{sysImgNm}
+		  , DATElASTMODIFIED = GETDATE()
+		WHERE PRODUCTCODE = #{productcode}
+	</update>
+	
+	<!-- WMS 재고 테이블 조회   -->
+	<select id="getWmsIfProductSukList"  resultType="IfProductSku">
+		/* TsbWmsGoods.getWmsIfProductSukList */
+		SELECT  top 1000 SKUCODE
+		     , SKUMODELNO
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , OPTION1
+		     , OPTION2
+		     , OPTION3
+		     , SELLINGSTOCKAMOUNT
+		     , SELLINGSTOCKTYPECD
+		     , LIMITSTOCKAMOUNT
+		     , VENDORSKUMODELNO
+		     , VENDORSKUCODE
+		     , ISVIRTUALSTOCK
+		     , DATEVIRTUALSTOCK
+		     , SKUCODE88
+		FROM TB_IF_PRODUCTSKU
+	</select>
+	
 </mapper>

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott