Bläddra i källkod

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

card007 4 år sedan
förälder
incheckning
c10c0e42a3
70 ändrade filer med 1249 tillägg och 916 borttagningar
  1. 9 0
      src/main/java/com/style24/admin/biz/dao/TsaMorebetterDao.java
  2. 11 0
      src/main/java/com/style24/admin/biz/dao/TsaRendererDao.java
  3. 49 10
      src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java
  4. 12 0
      src/main/java/com/style24/admin/biz/service/TsaRendererService.java
  5. 19 10
      src/main/java/com/style24/admin/biz/service/TsaShoplinkerService.java
  6. 3 2
      src/main/java/com/style24/admin/biz/web/TsaDeliveryController.java
  7. 44 0
      src/main/java/com/style24/admin/biz/web/TsaGoodsController.java
  8. 8 2
      src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
  9. 14 0
      src/main/java/com/style24/admin/biz/web/TsaRendererController.java
  10. 6 0
      src/main/java/com/style24/admin/biz/web/TsaWithdrawController.java
  11. 20 251
      src/main/java/com/style24/persistence/domain/Delivery.java
  12. 2 0
      src/main/java/com/style24/persistence/domain/DelvFeePolicy.java
  13. 1 0
      src/main/java/com/style24/persistence/domain/GoodsSearch.java
  14. 4 0
      src/main/java/com/style24/persistence/domain/GoodsSupplyPrice.java
  15. 10 0
      src/main/java/com/style24/persistence/domain/GoodsVideo.java
  16. 4 0
      src/main/java/com/style24/persistence/domain/MoreBetter.java
  17. 5 0
      src/main/java/com/style24/persistence/domain/MoreBetterGoods.java
  18. 27 229
      src/main/java/com/style24/persistence/domain/Withdraw.java
  19. 1 0
      src/main/java/com/style24/persistence/domain/WmsWithdraw.java
  20. 2 1
      src/main/java/com/style24/persistence/mybatis/shop/TsaDelivery.xml
  21. 9 9
      src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml
  22. 48 1
      src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  23. 70 29
      src/main/java/com/style24/persistence/mybatis/shop/TsaMorebetter.xml
  24. 16 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaRenderer.xml
  25. 19 3
      src/main/java/com/style24/persistence/mybatis/shop/TsaShoplinker.xml
  26. 2 1
      src/main/java/com/style24/persistence/mybatis/shop/TsaWithdraw.xml
  27. 1 0
      src/main/java/com/style24/persistence/mybatis/wms/TsaWmsWithdraw.xml
  28. 1 1
      src/main/resources/config/application-locd.yml
  29. 1 1
      src/main/resources/config/application-locp.yml
  30. 1 1
      src/main/resources/config/application-run.yml
  31. 1 1
      src/main/resources/config/application-style.yml
  32. 1 1
      src/main/resources/config/application-tsit.yml
  33. 1 1
      src/main/webapp/WEB-INF/views/board/NoticeForm.html
  34. 4 4
      src/main/webapp/WEB-INF/views/business/BrandForm.html
  35. 1 1
      src/main/webapp/WEB-INF/views/customer/GoodsQnaForm.html
  36. 1 1
      src/main/webapp/WEB-INF/views/customer/OneToOneQnaForm.html
  37. 24 10
      src/main/webapp/WEB-INF/views/delivery/DeliveryListForm.html
  38. 2 2
      src/main/webapp/WEB-INF/views/display/MainContentsPopupForm.html
  39. 11 11
      src/main/webapp/WEB-INF/views/display/MainGnbContentsPopupForm.html
  40. 2 2
      src/main/webapp/WEB-INF/views/envset/AnswerPhaseForm.html
  41. 22 22
      src/main/webapp/WEB-INF/views/envset/BasicEnvsetForm.html
  42. 117 17
      src/main/webapp/WEB-INF/views/envset/BenefitEnvsetForm.html
  43. 4 4
      src/main/webapp/WEB-INF/views/envset/CustomerGradePolicyForm.html
  44. 40 38
      src/main/webapp/WEB-INF/views/goods/FreeGoodsSearchForm.html
  45. 18 3
      src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html
  46. 50 15
      src/main/webapp/WEB-INF/views/goods/GoodsItemkindForm.html
  47. 57 52
      src/main/webapp/WEB-INF/views/goods/GoodsListForm.html
  48. 32 7
      src/main/webapp/WEB-INF/views/goods/GoodsPopupListForm.html
  49. 6 5
      src/main/webapp/WEB-INF/views/goods/GoodsSalfRegisterForm.html
  50. 15 12
      src/main/webapp/WEB-INF/views/goods/GoodsSupplyPriceForm.html
  51. 2 0
      src/main/webapp/WEB-INF/views/goods/GoodsTitleReserveForm.html
  52. 60 25
      src/main/webapp/WEB-INF/views/goods/GoodsVideoForm.html
  53. 24 5
      src/main/webapp/WEB-INF/views/marketing/CouponPopupForm.html
  54. 16 4
      src/main/webapp/WEB-INF/views/marketing/FreeGoodsPromotionRegiForm.html
  55. 106 11
      src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html
  56. 1 1
      src/main/webapp/WEB-INF/views/marketing/PlanListForm.html
  57. 1 1
      src/main/webapp/WEB-INF/views/marketing/PlanReplyListForm.html
  58. 1 1
      src/main/webapp/WEB-INF/views/marketing/PlanTemplatePopupForm.html
  59. 11 4
      src/main/webapp/WEB-INF/views/ocm/ExtmallSearchForm.html
  60. 50 61
      src/main/webapp/WEB-INF/views/order/OrderDetailForm.html
  61. 3 3
      src/main/webapp/WEB-INF/views/order/OrderDetailGiftcardHst.html
  62. 3 2
      src/main/webapp/WEB-INF/views/shoplinker/ShoplinkerInvoiceSendForm.html
  63. 2 1
      src/main/webapp/WEB-INF/views/signin.html
  64. 26 24
      src/main/webapp/WEB-INF/views/withdraw/WithdrawDirectiveListForm.html
  65. 12 2
      src/main/webapp/WEB-INF/views/withdraw/WithdrawExceptionListForm.html
  66. 9 4
      src/main/webapp/WEB-INF/views/withdraw/WmsWithdrawListForm.html
  67. 1 1
      src/main/webapp/dx5/module/dextuploadx5-application-list.js
  68. BIN
      src/main/webapp/image/logo_STYLE24.png
  69. 52 0
      src/main/webapp/ux/js/admin.common.js
  70. 41 6
      src/main/webapp/ux/plugins/gaga/gaga.validation.js

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

@@ -277,5 +277,14 @@ public interface TsaMorebetterDao {
      */
     void deleteMorebetterApplyGoodsTemp(MoreBetter moreBetter);
     void insertMorebetterApplyGoodsTemp(MoreBetter moreBetter);
+
+    /**
+     * 다다익선 기준상품 제외 한 적용상품 (TB_TMTB_GOODS) 저장
+     * @param moreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 7. 19
+     */
+    void insertTmtbApplyGoods(MoreBetterGoods moreBetterGoods);
     /* // CSB 진행 */
 }

+ 11 - 0
src/main/java/com/style24/admin/biz/dao/TsaRendererDao.java

@@ -7,6 +7,7 @@ import com.style24.persistence.domain.Brand;
 import com.style24.persistence.domain.Color;
 import com.style24.persistence.domain.CommonCode;
 import com.style24.persistence.domain.DeliveryLoc;
+import com.style24.persistence.domain.DelvFeePolicy;
 import com.style24.persistence.domain.Itemkind;
 import com.style24.persistence.domain.SupplyCompany;
 
@@ -234,6 +235,16 @@ public interface TsaRendererDao {
 	 * @since 2020. 11. 24
 	 */
 	Collection<CommonCode> getSupplyDeliveryFeePolicyList(String supplyCompCd);
+	
+	/**
+	 * 업체별 배송비정책 목록(정책명)
+	 *
+	 * @param supplyCompCd - 업체코드
+	 * @return 배송비정책 목록
+	 * @author eskim
+	 * @since 2021. 07. 19
+	 */
+	Collection<DelvFeePolicy> getSupplyDeliveryPolicyList(String supplyCompCd);
 
 	/**
 	 * 전체 제휴채널 목록

+ 49 - 10
src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java

@@ -15,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional;
 import com.style24.admin.biz.dao.TsaMorebetterDao;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 
@@ -105,10 +106,11 @@ public class TsaMorebetterService {
         return morebetterDao.getMorebetterBrandList(merebetterGoods);
     }
 
-    public Collection<MoreBetterGoods> getMorebetterApplyGoodsList(Integer tmtbSq, String targetGb) {
+    public Collection<MoreBetterGoods> getMorebetterApplyGoodsList(Integer tmtbSq, String targetGb, String goodsGb) {
         MoreBetterGoods merebetterGoods = new MoreBetterGoods();
         merebetterGoods.setTmtbSq(tmtbSq);
         merebetterGoods.setTargetGb(targetGb);
+        merebetterGoods.setGoodsGb(goodsGb);
         return morebetterDao.getMorebetterApplyGoodsList(merebetterGoods);
     }
 
@@ -177,8 +179,34 @@ public class TsaMorebetterService {
             morebetterDao.saveMorebetterGoods(regBrand);
         }
 
-        // 적용상품
-        for(MoreBetterGoods regApplyGoods : moreBetter.getGridApplyGoodsList()){
+        // 기준상품
+        for(MoreBetterGoods regDefaultGoods : moreBetter.getDefaultGoodsList()){
+            // 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
+            regDefaultGoods.setTmtbSq(moreBetter.getTmtbSq());
+            regDefaultGoods.setTargetVal(regDefaultGoods.getGoodsCd());
+            regDefaultGoods.setRegNo(moreBetter.getRegNo());
+            regDefaultGoods.setUpdNo(moreBetter.getUpdNo());
+            regDefaultGoods.setMultiDuplicateGoods(moreBetter.getMultiDuplicateGoods());
+            morebetterDao.saveMorebetterGoods(regDefaultGoods);
+        }
+
+        // 기준상품+적용상품 중복제거
+        List<MoreBetterGoods> dgList = moreBetter.getDefaultGoodsList();
+        List<MoreBetterGoods> agList = moreBetter.getGridApplyGoodsList();
+        List<MoreBetterGoods> applyList = new ArrayList<>();
+        if(agList.size() > 0){
+            for(int i=0; i<agList.size(); i++){
+                for(int j=0; j<dgList.size(); j++){
+                    if(!agList.get(i).getGoodsCd().equals(dgList.get(j).getGoodsCd())){
+                        applyList.add(agList.get(i));
+                    }
+                }
+            }
+        }else{
+            applyList = dgList;
+        }
+
+        for(MoreBetterGoods regApplyGoods : applyList){
             // 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
             regApplyGoods.setTmtbSq(moreBetter.getTmtbSq());
             regApplyGoods.setTargetVal(regApplyGoods.getGoodsCd());
@@ -227,19 +255,20 @@ public class TsaMorebetterService {
         StringBuilder sb3 = new StringBuilder();
         //int i = 1;
 
-        if(moreBetter.getGridApplyGoodsList().size()>0){    //getApplyGoodsList
-            for(int i=0; i<moreBetter.getGridApplyGoodsList().size(); i++){
-                sb.append("SELECT   '").append(moreBetter.getGridApplyGoodsList().get(i).getGoodsCd()).append("' AS GOODS_CD ");
-                if(i<moreBetter.getGridApplyGoodsList().size()-1){
+        if(applyList.size()>0){
+            for(int i=0; i<applyList.size(); i++){
+                sb.append("SELECT   '").append(applyList.get(i).getGoodsCd()).append("' AS GOODS_CD ");
+                if(i<applyList.size()-1){
                     sb.append("\n UNION ALL \n");
                 }
 
-                sb3.append("SELECT   '").append(moreBetter.getGridApplyGoodsList().get(i).getGoodsCd()).append("' AS GOODS_CD ").append(" , '").append(moreBetter.getGridApplyGoodsList().get(i).getGoodsGb()).append("' AS GOODS_GB ");
-                if(i<moreBetter.getGridApplyGoodsList().size()-1){
+                sb3.append("SELECT   '").append(applyList.get(i).getGoodsCd()).append("' AS GOODS_CD ").append(" , '").append(applyList.get(i).getGoodsGb()).append("' AS GOODS_GB ");
+                if(i<applyList.size()-1){
                     sb3.append("\n UNION ALL \n");
                 }
             }
         }
+
         moreBetterGoods.setApplySql(sb.toString());
         moreBetterGoods.setApplyGbSql(sb3.toString());
 
@@ -259,6 +288,7 @@ public class TsaMorebetterService {
         moreBetterGoods.setMultiSupplyCompCd(moreBetter.getMultiSupplyCompCd());
         moreBetterGoods.setMultiBrand(moreBetter.getMultiBrand());
         moreBetterGoods.setMultiApplyGoods(moreBetter.getMultiApplyGoods());
+        moreBetterGoods.setMultiDefaultGoods(moreBetter.getMultiDefaultGoods());
         moreBetterGoods.setMultiExceptGoods(moreBetter.getMultiExceptGoods());
         moreBetterGoods.setSectionGb(moreBetter.getSectionGb());
         morebetterDao.insertMorebetterApplyGoods(moreBetterGoods);
@@ -410,7 +440,16 @@ public class TsaMorebetterService {
     public void insertMorebetterApplyGoodsTemp(MoreBetter moreBetter) {
         moreBetter.setRegNo(TsaSession.getInfo().getUserNo());
         moreBetter.setUpdNo(TsaSession.getInfo().getUserNo());
-        if(moreBetter.getMultiApplyGoods().length > 0){
+
+        List<String> list1 = new ArrayList<>(Arrays.asList(moreBetter.getMultiDefaultGoods()));
+        List<String> list2 = new ArrayList<>(Arrays.asList(moreBetter.getMultiApplyGoods()));
+
+        list1.addAll(list2);
+        String[] applyArr = list1.toArray(new String[0]);
+
+        moreBetter.setMultiDefaultGoods(applyArr);
+
+        if(moreBetter.getMultiDefaultGoods().length > 0){
             morebetterDao.deleteMorebetterApplyGoodsTemp(moreBetter);
             morebetterDao.insertMorebetterApplyGoodsTemp(moreBetter);
         }

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

@@ -11,6 +11,7 @@ import com.style24.persistence.domain.Brand;
 import com.style24.persistence.domain.Color;
 import com.style24.persistence.domain.CommonCode;
 import com.style24.persistence.domain.DeliveryLoc;
+import com.style24.persistence.domain.DelvFeePolicy;
 import com.style24.persistence.domain.Itemkind;
 import com.style24.persistence.domain.SupplyCompany;
 
@@ -379,6 +380,17 @@ public class TsaRendererService {
 	public Collection<CommonCode> getSupplyDeliveryFeePolicyList(String supplyCompCd) {
 		return rendererDao.getSupplyDeliveryFeePolicyList(supplyCompCd);
 	}
+	
+	/**
+	 * 업체별 배송비정책 목록(정책명)
+	 * @param supplyCompCd - 공급업체코드
+	 * @return 배송비정책 목록
+	 * @author eskim
+	 * @since 2021. 07. 19
+	 */
+	public Collection<DelvFeePolicy> getSupplyDeliveryPolicyList(String supplyCompCd) {
+		return rendererDao.getSupplyDeliveryPolicyList(supplyCompCd);
+	}
 
 //	/**
 //	 * 직송매장 목록

+ 19 - 10
src/main/java/com/style24/admin/biz/service/TsaShoplinkerService.java

@@ -347,7 +347,7 @@ public class TsaShoplinkerService {
 			}else {
 
 				// 1) 상세내용 - 상품설명
-				htmlDesc = "<div class=\"st_descrp_box\" style=\"max-height:1100px; overflow:hidden;\">";
+				htmlDesc = "<div class=\"st_descrp_box\" style=\"max-height:1100px; overflow:hidden; text-align: left; color:#222;\">";
 				htmlDesc += "<div class=\"st_desc_simple\" style=\"position:relative; margin-top:0px; margin-left:auto; margin-right:auto;\">";
 				htmlDesc += "<span class=\"st_tit_desc\" style=\"display:block; margin-bottom:10px; font-size:18px; font-weight:500; letter-spacing:-0.025em;\">"+goodsMap.getDetailDescNew10()+"</span>";
 				htmlDesc += "<span class=\"st_ptxt01\" style=\"font-size:16px;font-weight:200;line-height:1.5;word-break:keep-all;color:#666666;\">";
@@ -367,7 +367,7 @@ public class TsaShoplinkerService {
 				shoplinkerGoods.setExtmallDescImgYn("N");
 				shoplinkerGoods.setColorListYn("Y"); // 색상별 이미지 정보만 가져옴
 				Collection<ShoplinkerGoods> imgColorList = admShoplinkerDao.getGoodsImageList(shoplinkerGoods);
-				colorDesc = "<div class=\"st_view_option_box\" style=\"margin-top: 100px;text-align: center;\">";
+				colorDesc = "<div class=\"st_view_option_box\" style=\"margin-top: 100px;text-align: center; color:#222;\">";
 				String tmpColor = "";
 				for(ShoplinkerGoods ic : imgColorList ) {
 
@@ -461,13 +461,22 @@ public class TsaShoplinkerService {
                 	htmlDesc += "<span class=\"st_tit_view\" style=\"display: block;color: #222;font-size: 32px;font-weight: 300;text-align: center;\">사이즈정보</span>";
                 	htmlDesc += "<div class=\"st_view\" style=\"margin-top: 40px;\">";
 
-                	String brandSizeImg = env.getProperty("upload.image.view") + "/Upload/brandSizeImg/";
+                	String brandSizeImg = env.getProperty("domain.image").replace("/Upload", "") + "/Upload/brandSizeImg/";
                 	if( "Y".equals(goodsMap.getKidsYn())){
-                		brandSizeImg += "kids/"+goodsMap.getBrandEnm() +".jpg";
-                		htmlDesc += "<img src=\""+ brandSizeImg +"\" alt=\"ANDEW 표준 사이즈\" style=\"display: block;margin: 10px auto 0;\">";
+                		// 나이키 조던/나이키 에스비/나이키 와이에이/컨버스/헐리 는 플레이키즈 사이즈표
+        	    		if( "S0003".equals(goodsMap.getBrandCd()) || "S0004".equals(goodsMap.getBrandCd()) || "S0007".equals(goodsMap.getBrandCd())
+        	    			|| "S0001".equals(goodsMap.getBrandCd()) || "S0006".equals(goodsMap.getBrandCd())){
+
+        	    			brandSizeImg += "kids/PLAYKIZ.jpg";
+        	    		}else {
+        	    			brandSizeImg += "kids/"+goodsMap.getBrandEnm() +".jpg";
+        	    		}
+
+        	    		htmlDesc += "<img src=\""+ brandSizeImg +"\" alt=\"표준 사이즈\" style=\"display: block;margin: 10px auto 0;\">";
+
                 	}else {
                 		brandSizeImg += "casuals/"+goodsMap.getBrandEnm() +".jpg";
-                		htmlDesc += "<img src=\""+ brandSizeImg +"\" alt=\"ANDEW 표준 사이즈\" style=\"display: block;margin: 10px auto 0;\">";
+                		htmlDesc += "<img src=\""+ brandSizeImg +"\" alt=\"표준 사이즈\" style=\"display: block;margin: 10px auto 0;\">";
                 	}
                     htmlDesc += "</div>";
                     htmlDesc += "</div>";
@@ -1199,17 +1208,17 @@ public class TsaShoplinkerService {
 	public void getInvoiceExcelList(ShoplinkerInvoice shoplinkerInvoice, String excelFilenameWithPath) {
 
 		// 헤더 title 설정
-		String[] listTitles = {"IF결과", "IF결과메세지", "샵링커 주문번호", "쇼핑몰 주문번호", "스타일24 주문번호", "주문상세번호", "배송업체", "송장번호", "전송일시"};
+		String[] listTitles = {"IF결과", "IF결과메세지", "샵링커 주문번호", "쇼핑몰 주문번호", "스타일24 주문번호", "주문상세번호", "주문상세상태", "배송업체", "송장번호", "전송일시"};
 
 		// DB 처리 시 사용되는 파라미터명(셀명) 설정
-		String[] cellNames = {"API_RESULT", "API_MESSAGE", "AGENT_ORDER_ID", "EXTMALL_ORDER_ID", "ORD_NO", "ORD_DTL_NO", "SHIP_COMP_NM", "DELIVERY_INVOICE", "REG_DT"};
+		String[] cellNames = {"API_RESULT", "API_MESSAGE", "AGENT_ORDER_ID", "EXTMALL_ORDER_ID", "ORD_NO", "ORD_DTL_NO", "ORD_DTL_STAT_NM", "SHIP_COMP_NM", "DELIVERY_INVOICE", "REG_DT"};
 
 		String[] cellTypes = {
 			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_LEFT.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_LEFT.name(),
-			GagaExcelConstants.CellType.CHAR_CENTER.name()};
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_CENTER.name()};
 
 		Collection<GagaMap> dataList = admShoplinkerDao.getInvoiceExcelList(shoplinkerInvoice);
 

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

@@ -20,10 +20,11 @@ import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.biz.service.TsaDeliveryService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.session.TscSession;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.Delivery;
-import com.style24.persistence.domain.DeliveryLoc;
+
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -113,7 +114,7 @@ public class TsaDeliveryController extends TsaBaseController {
 		GagaMap result = new GagaMap();
 		delivery.setPageable(new TscPageRequest(delivery.getPageNo() - 1, delivery.getPageSize()));
 		delivery.getPageable().setTotalCount(deliveryService.getDeliveryListCount(delivery));
-
+		TscSession.setAttribute("maskingYn", TsaSession.getInfo().getMaskingYn());
 
 		if ("N".equals(delivery.getPageingYn())) {
 			delivery.setPageable(null);

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

@@ -558,6 +558,16 @@ public class TsaGoodsController extends TsaBaseController {
 				throw new IllegalStateException("업체코드 검색중 오류로 인해 조회되지 않았습니다.");
 			}
 		}
+		
+		if (!StringUtils.isBlank(goodsSearch.getItemkindList())) {
+			try {
+				String[] arrItemkind = mapper.readValue(goodsSearch.getItemkindList(), String[].class);
+				goodsSearch.setMultiItemkindCd(arrItemkind);
+			} catch (Exception e) {
+				e.printStackTrace();
+				throw new IllegalStateException("품목 검색중 오류로 인해 조회되지 않았습니다.");
+			}
+		}
 
 		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
 		goodsSearch.setPageable(new TscPageRequest(goodsSearch.getPageNo() - 1, goodsSearch.getPageSize()));
@@ -1577,6 +1587,10 @@ public class TsaGoodsController extends TsaBaseController {
 	public Collection<GoodsSupplyPrice> getGoodsSupplyPriceList(@RequestBody GoodsSupplyPrice goodsSupplyPrice) {
 
 		// multi row 검색관련 처리
+		if (!StringUtils.isBlank(goodsSupplyPrice.getCondition())) {
+			goodsSupplyPrice.setConditionList(goodsSupplyPrice.getCondition().replaceAll("\r", "").trim().split("\n"));
+		}
+		
 		if (!StringUtils.isBlank(goodsSupplyPrice.getBrandList())) {
 			try {
 				String[] arrBrandCd = mapper.readValue(goodsSupplyPrice.getBrandList(), String[].class);
@@ -1596,6 +1610,8 @@ public class TsaGoodsController extends TsaBaseController {
 				throw new IllegalStateException("업체코드 검색중 오류로 인해 조회되지 않았습니다.");
 			}
 		}
+		
+		
 		return goodsService.getGoodsSupplyPriceList(goodsSupplyPrice);
 	}
 
@@ -1769,6 +1785,23 @@ public class TsaGoodsController extends TsaBaseController {
 	@PostMapping("/video/list")
 	@ResponseBody
 	public Collection<GoodsVideo> getGoodsVideoList(@RequestBody GoodsVideo goodsVideo) {
+		
+		// multi row 검색관련 처리
+		if (!StringUtils.isBlank(goodsVideo.getCondition())) {
+			goodsVideo.setConditionList(goodsVideo.getCondition().replaceAll("\r", "").trim().split("\n"));
+
+		}
+
+		if (!StringUtils.isBlank(goodsVideo.getBrandList())) {
+			try {
+				String[] arrBrandCd = mapper.readValue(goodsVideo.getBrandList(), String[].class);
+				goodsVideo.setMultiBrand(arrBrandCd);
+			} catch (Exception e) {
+				e.printStackTrace();
+				throw new IllegalStateException("브랜드코드 검색중 오류로 인해 조회되지 않았습니다.");
+			}
+		}
+		
 		return goodsService.getGoodsVideoList(goodsVideo);
 	}
 
@@ -2395,6 +2428,17 @@ public class TsaGoodsController extends TsaBaseController {
 				throw new IllegalStateException("업체코드 검색중 오류로 인해 조회되지 않았습니다.");
 			}
 		}
+		
+		if (!StringUtils.isBlank(goodsSearch.getItemkindList())) {
+			try {
+				String[] arrItemkind = mapper.readValue(goodsSearch.getItemkindList(), String[].class);
+				goodsSearch.setMultiItemkindCd(arrItemkind);
+			} catch (Exception e) {
+				e.printStackTrace();
+				throw new IllegalStateException("품목 검색중 오류로 인해 조회되지 않았습니다.");
+			}
+		}
+		
 		//log.info("[getPopupGoodsList] goodsSearch=>{}", goodsSearch);
 		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
 		goodsSearch.setPageable(new TscPageRequest(goodsSearch.getPageNo() - 1, goodsSearch.getPageSize()));

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

@@ -813,7 +813,11 @@ public class TsaMarketingController extends TsaBaseController {
 		mav.addObject("dcWayList", rendererService.getAvailCommonCodeList("G240"));
 
 		// 적용 상품구분 목록
-		String[] exceptGoodsCds = {"G800_30", "G800_40"};
+		String[] defaultGoodsCds = {"G800_20", "G800_30", "G800_40"};
+		mav.addObject("defaultGoodsGbList", rendererService.getCommonCodeList("G800", "Y", defaultGoodsCds));
+
+		// 적용 상품구분 목록
+		String[] exceptGoodsCds = {"G800_10", "G800_30", "G800_40"};
 		mav.addObject("applyGoodsGbList", rendererService.getCommonCodeList("G800", "Y", exceptGoodsCds));
 
 		// 제외 상품구분 목록
@@ -827,7 +831,8 @@ public class TsaMarketingController extends TsaBaseController {
 			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("tmtbDefaultGoodsList", morebetterService.getMorebetterApplyGoodsList(tmtbSeq, "G260_10" , "G800_10"));
+			mav.addObject("tmtbApplyGoodsList", morebetterService.getMorebetterApplyGoodsList(tmtbSeq, "G260_10", "G800_20"));
 			mav.addObject("tmtbExceptGoodsList", morebetterService.getMorebetterExceptGoodsList(tmtbSeq, "G260_10"));
 			mav.addObject("tmtbSectionValList", morebetterService.getMorebetterSectionValList(tmtbSeq));
 			mav.addObject("tmtbBurdenList", morebetterService.getMorebetterBurdenList(tmtbSeq));
@@ -835,6 +840,7 @@ public class TsaMarketingController extends TsaBaseController {
 			mav.addObject("tmtbMstInfo", new MoreBetter());
 			mav.addObject("tmtbSupplyCompList", new MoreBetterGoods());
 			mav.addObject("tmtbBrandList", new MoreBetterGoods());
+			mav.addObject("tmtbDefaultGoodsList", new MoreBetterGoods());
 			mav.addObject("tmtbApplyGoodsList", new MoreBetterGoods());
 			mav.addObject("tmtbExceptGoodsList", new MoreBetterGoods());
 			mav.addObject("tmtbSectionValList", new MoreBetterSection());

+ 14 - 0
src/main/java/com/style24/admin/biz/web/TsaRendererController.java

@@ -13,6 +13,7 @@ import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.persistence.domain.Color;
 import com.style24.persistence.domain.CommonCode;
+import com.style24.persistence.domain.DelvFeePolicy;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -107,6 +108,19 @@ public class TsaRendererController extends TsaBaseController {
 	public Collection<CommonCode> getDeliveryFeeList(@PathVariable String supplyCompCd) {
 		return rendererService.getSupplyDeliveryFeePolicyList(supplyCompCd);
 	}
+	
+	/**
+	 * 업체별 배송비정책 목록(정책명)
+	 * @param supplyCompCd - 공급업체코드
+	 * @return
+	 * @author eskim
+	 * @since 2021. 07. 19
+	 */
+	@GetMapping("/delvPolicy/list/{supplyCompCd}")
+	@ResponseBody
+	public Collection<DelvFeePolicy> getSupplyDeliveryPolicyList(@PathVariable String supplyCompCd) {
+		return rendererService.getSupplyDeliveryPolicyList(supplyCompCd);
+	}
 
 	/**
 	 * 벤더외부몰 목록

+ 6 - 0
src/main/java/com/style24/admin/biz/web/TsaWithdrawController.java

@@ -35,10 +35,12 @@ import com.style24.admin.biz.service.TsaWithdrawService;
 import com.style24.admin.biz.service.TsaWmsWithdrawService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.session.TscSession;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.core.biz.service.TscOrderChangeService;
 
 
+
 /**
  * 회수관리 Controller
  * 
@@ -348,6 +350,8 @@ public class TsaWithdrawController extends TsaBaseController {
 		GagaMap result = new GagaMap();
 		wmsWithdraw.setPageable(new TscPageRequest(wmsWithdraw.getPageNo() - 1, wmsWithdraw.getPageSize()));
 		wmsWithdraw.getPageable().setTotalCount(wmsWithdrawService.getWmsWithdrawListCount(wmsWithdraw));
+		TscSession.setAttribute("maskingYn", TsaSession.getInfo().getMaskingYn());
+		
 		if ("N".equals(wmsWithdraw.getPageingYn())) {
 			wmsWithdraw.setPageable(null);
 		}
@@ -403,6 +407,8 @@ public class TsaWithdrawController extends TsaBaseController {
 		withdraw.setPageable(new TscPageRequest(withdraw.getPageNo() - 1, withdraw.getPageSize()));
 		
 		withdraw.getPageable().setTotalCount(withdrawService.getWithdrawDirectiveListCount(withdraw));
+		TscSession.setAttribute("maskingYn", TsaSession.getInfo().getMaskingYn());
+		
 		
 		if ("N".equals(withdraw.getPageingYn())) {
 			withdraw.setPageable(null);

+ 20 - 251
src/main/java/com/style24/persistence/domain/Delivery.java

@@ -5,6 +5,9 @@ import java.util.Collection;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
 import com.style24.persistence.TscPageRequest;
+import com.style24.core.support.session.TscSession;
+import com.style24.core.support.util.CryptoUtils;
+import com.style24.core.support.util.MaskingUtils;
 
 import lombok.Data;
 
@@ -177,261 +180,27 @@ public class Delivery extends TscBaseDomain {
 	private String delvFeeCdGrp;
 	
 	
-	
-	
-	
+	// Masking
 
-	
-	
-	 
+	public String getMaskingOrdNm() {
+		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.name(this.ordNm) : this.ordNm;
 
+	}
 
-	
-	/* 위로  작성  ('' ) ( '')*/
-	
-	
-	
-	
-	/* 아래는 참고용!!*/
-	
+	public String getMaskingRecipNm() {
+		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.name(this.recipNm) : this.recipNm;
 
+	}
 
-	
+	public String getMaskingOrdPhnno() {
+		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.phoneNo(this.ordPhnno) : this.ordPhnno;
+	}
 
-//
-//	
-//	private String ordStat;
-//
-//	private String orderEmail;
-//	private String colorKnm;
-//
-//	//private Integer ordQty;
-//	private Integer cnclRtnQty;
-//	private Integer saleQty;
-//	private Integer saleAmt;
-//	
-//
-//
-//
-//	private String sbagEncloseYn;
-//
-//
-//	private String dstrbtNote;
-//	private String ordExchGbNm;
-//	
-//	private String extmallOrdDtlNo;
-//	private String supplyCompNm;
-//	private String supplyGoodsCd;
-////	private String ordExchGb;
-//	private String frontGb;
-//
-//
-//
-//
-//	private Long ordChgSq;
-//	private String chgGb;
-//	private String chgReason;
-//	private String chgMemo;
-//	private String chgerNm;
-//	private String chgerPhnno;
-//	private String chgerTelno;
-//	private String chgerEmail;
-//	private String chgerPostNo;
-//	private String chgerBaseAddr;
-//	private String chgerDtlAddr;
-//	private Integer chgQty;
-//	private String chgStat;
-//	private String whMemo;
-//	private Integer realOrdAmt;
-//	private Integer cnclRtnAmt;
-//	private Long orgOrdDtlNo;
-//	private String vendorId;
-//
-//	//private String formalGb;
-//	private String formalGbNm;
-//	private String setYn;
-//	private Integer tagPrice;
-//	private Integer listPrice;
-//	private Integer currPrice;
-//	private Integer dcRate;
-//	//private Integer ordAmt;
-//	private Long goodsCpnSq;
-//	private Integer goodsCpnDcAmt;
-//	private Long cartCpnSq;
-//	private Integer cartCpnDcAmt;
-//	private Integer pntDcAmt;
-//	private Integer prePntDcAmt;
-//	private Integer savePntAmt;
-//	private String agentOrderId;
-//	private String exchangableYn;
-//	private String exchangeFeeFreeYn;
-//	private String returnableYn;
-//	private String returnFeeFreeYn;
-//	private String soldoutMemo;
-//	private String soldoutRegId;
-//	private String soldoutRegDt;
-//	private String delvAssignDt;
-//	
-//	private String delvStdt;
-//	private String delvEddt;
-//	private String shipCompNm;
-//	private String invoiceSendYn;
-//	private String sellFeeRate;
-//	private String ithrCd;
-//	private String contentsLoc;
-//	private Integer paySq;
-//	private Integer payAmt;
-//	
-//	private String payStat;
-//	private String delvPayGb;
-//	private String pgCnclTid;
-//	
-//	private String delvFeeGb;
-//	private Integer delvFee;
-//	private String usacGb;
-//	private String prtnGb;
-//	private String orgUsacGb;
-//	private Integer sellQty;
-//	private String sellGb;
-//	private String workDay;
-//	private Integer chasu;
-//	
-//	private String productId;
-//
-//
-//	private String dasRecipStsCd;
-//	private String dasRecipIngDt;
-//	private String dasRecipCplDt;
-//	private String dasWorkCplDt;
-//	private Integer shipQty;
-//	private String soldoutDt;
-//	private String adminRecipYn;
-//	private String adminRecipDt;
-//	private String cncYn;
-//	private String cncDt;
-//	private String regStdt;
-//	private String regEddt;
-//	//private String extmallId;
-//	private Integer stockQty;
-//	//private Integer currStockQty;
-//	//private Integer baseStockQty;
-//
-//	private Integer assignQty;
-//	private String delvArId;
-//	private String rejectReason;
-//	private String chulgoQty;
-//	private String ordExchGbYn;
-//	private String payStDate;
-//	private String payEdDate;
-//
-//	private String stDt;
-//	private String edDt;
-//
-//	private String goodsGb;
-//
-//	private String colorGrpFile;
-//	private Integer invoiceQty;
-//
-//	private String delayDt;
-//	private String orgOrdDtlStat;
-//
-//	private String locCd;  //위치코드(물류로케이션)
-//	private int dispOrd;  //표시순서
-//	private String pickingNo;  //피킹번호
-//	private int pickingQty;  //피킹수량
-//	private String locGcd;  //위치그룹코드
-//	private String updDt;  //수정일시
-//	private String regDt;  //등록일시
-//
-//	private String cd;  //코드
-//	private String cdNm;  //코드명
-//
-//	private String supplyCompSelfYn;
-//	private Double delvFeeRate;
-//	private int delvAddrSq;
-//	private int outSeq;
-//
-//	private String applyStdtFrom;
-//	private String applyStdtTo;
-//	private String memoType;
-//	private String refVal;
-//
-//	private String delvMemoSq;
-//	private int baseAmt;
-//	private String applyStdt;
-//	private String applyStdthh;
-//	private String applyStdtmm;
-//	private String applyEddt;
-//	private String applyEddthh;
-//	private String applyEddtmm;
-//	private int memoQty;
-//	private String memo;
-//	private String useYn;
-//	private String brandCbs;
-//
-//	private String applySttmDip;
-//	private String applyEdtmDip;
-//
-//
-//
-//	private String pResult;
-//
-//	private Long plusCpnSq;
-//	private Integer plusCpnDcAmt; //플러스쿠폰할인금액 명칭바뀜 
-//	private String erpCdCompany;
-//	private String erpCdDepart;
-//
-//	private String ifNo;
-//	private String ifGb;
-//	private String styleCd;
-//
-//	private String chgReasonNm;
-//
-//	private String delvAssignOrd;
-//
-//	private String orderId;
-//
-//	private String custGb;
-//	private String goodsNum;
-//	private String cdCompany;
-//	private String cdDepart;
-//
-//	private Integer orgOrdAmt;
-//	private Integer orgGoodsCpnDcAmt;
-//	private Integer orgCartCpnDcAmt;
-//	private Integer orgPlusCpnDcAmt;
-//	private Integer orgPntDcAmt;
-//	private Integer orgPrePntDcAmt;
-//	private Integer orgSavePntAmt;
-//	private Integer orgRealOrdAmt;
-//	private String outCdTrans;
-//	private String outSongjang;
-//	private String outResult;
-//
-//
-//
-//
-//	private String regNm;
-//
-//	private String invoiceGb;
-//	private String apiGb;
-//	private String resultCd;
-//	private String custOrdNo;
-//	private String hstMemo;
-//
-//
-//
-//	
-//	// 출고처 정보
-//	private String delvAssignGrade;
-//	private String stockApplRate;
-//	private String delvLocZipcode;
-//	private String delvLocBaseAddr;
-//	private String delvLocDtlAddr;
-//	private String rtnLocZipcode;
-//	private String rtnLocBaseAddr;
-//	private String rtnLocDtlAddr;
-//	private String rtnLocTelno;
-//	private String rtnLocNm;
-//	private String invoicePrintType;
+	public String getMaskingRecipDtlAddr() {
+		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.address(this.recipDtlAddr) : this.recipDtlAddr;
+	}
+
+	
+	
+	
 }

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

@@ -22,5 +22,7 @@ public class DelvFeePolicy extends TscBaseDomain {
 	private int rtnDelvFee;			// 반품배송비
 	private String useYn;			// 사용여부
 	private String distributionGb;	// 유통구분
+	
+	private String delvFeeNm;		// 배송비정책명
 
 }

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

@@ -88,6 +88,7 @@ public class GoodsSearch extends TscBaseDomain {
 	private String callbackFn;
 	private String brandList;
 	private String supplyCompList;
+	private String itemkindList;
 	private String goodsContentsType;
 
 	//@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)

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

@@ -42,6 +42,8 @@ public class GoodsSupplyPrice extends TscBaseDomain {
 	private String goodsPriceYn;
 	private String brandList;
 	private String supplyCompList;
+	private String search; // 키워드 종류
+	private String condition; // 키워드 종류별 값
 	
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] arrGoodsCd;
@@ -49,6 +51,8 @@ public class GoodsSupplyPrice extends TscBaseDomain {
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private int[] arrSupplyGoodsPriceSq;
 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] conditionList;
 
 	/* Multi CheckBox 항목*/
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)

+ 10 - 0
src/main/java/com/style24/persistence/domain/GoodsVideo.java

@@ -1,5 +1,6 @@
 package com.style24.persistence.domain;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
@@ -30,5 +31,14 @@ public class GoodsVideo extends TscBaseDomain {
 	private String stDate;
 	private String edDate;
 	
+	private String search; // 키워드 종류
+	private String condition; // 키워드 종류별 값
+	private String brandList;
+	
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiBrand;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] conditionList;
 
 }

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

@@ -65,6 +65,7 @@ public class MoreBetter extends TscBaseDomain {
 	List<MoreBetterGoods> exceptGoodsList;
 	List<MoreBetterBurden> burdenList;
 	List<MoreBetterSection> sectionGbList;
+	List<MoreBetterGoods> defaultGoodsList;
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] multiSupplyCompCd;
@@ -81,6 +82,9 @@ public class MoreBetter extends TscBaseDomain {
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] multiDuplicateGoods;
 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiDefaultGoods;
+
 	// 날짜+시간
 	private String eventStdt;				// 다다익선시작일시
 	private String eventStHH;				// 다다익선시작일시

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

@@ -36,6 +36,8 @@ public class MoreBetterGoods extends TscBaseDomain {
 	private String applySql;	// 적용 상품 쿼리문
 	private String exceptSql;	// 적용 상품 쿼리문
 	private String applyGbSql;	// 적용 상품&구분 쿼리문
+	private String defaultSql;	// 적용 상품 쿼리문
+	private String defaultGbSql;	// 적용 상품&구분 쿼리문
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] arrCompanySq;
@@ -65,6 +67,9 @@ public class MoreBetterGoods extends TscBaseDomain {
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] multiDuplicateGoods;
 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiDefaultGoods;
+
 	List<MoreBetterGoods> applyGoodsList;
 	List<MoreBetterGoods> gridApplyGoodsList;
 

+ 27 - 229
src/main/java/com/style24/persistence/domain/Withdraw.java

@@ -4,6 +4,9 @@ import lombok.Data;
 
 import com.style24.persistence.TscBaseDomain;
 import com.style24.persistence.TscPageRequest;
+import com.style24.core.support.session.TscSession;
+import com.style24.core.support.util.CryptoUtils;
+import com.style24.core.support.util.MaskingUtils;
 
 /**
  * 회수 Domain
@@ -112,241 +115,36 @@ public class Withdraw extends TscBaseDomain {
 	private String withdrawType;
 
 	
-	
-	/*
-	// 회수
-	private String wdInvoiceNo;				// 회수송장번호
-	private String senderNm;				// 발송자 명
-	private String senderPhnno;				// 발송자 휴대전화번호
-	private String senderTelno;				// 발송자 전화번호
-	private String senderPostNo;			// 발송자 우편번호
-	private String senderBaseAddr;			// 발송자 기본주소
-	private String senderDtlAddr;			// 발송자 상세주소
-	private String shipCompCd;				// 배송업체코드
-	private String wdReqReason;				// 회수요청사유(공통코드G688)
-	private Integer wdFee;					// 회수비
-	private Integer encloseFee;				// 동봉비
-	private Integer orgEncloseFee;
-	private Integer codFee;					// 착불비
-	private String wdMemo;					// 회수메모
-	private String sameYn;					// 동일여부(Y:동일)
-	private String arrivalDt;				// 도착일시
-	private String csMemo;					// CS메모
-	private String csObYn;					// CS아웃바운드 여부
-	private String csObDt;					// CS아웃바운드 DLFTL
-	private String csObId;					// CS아웃바운드 ID(사용자)
-	private String smsSendYn;				// SMS발송여부
-	private Long ordDtlNo;					// 주문상세번호
-	private Integer wdQty;					// 회수수량
-	private Integer sumWdQty;				// 등록된 회수수량
-	private Integer sumChgQty;				// 전체 반품신청수량
-	private String rtnLocCd;				// 반품처코드
-	private String sellStoreCd;				// 판매매장코드(판매매장)
-	private String returnType;				// 회수구분
-	private String tagCd;					// 택 코드
-	private String wdStat;					// 회수 상태
-	private Integer orgDelvFee;				// 최초 배송비
-	private Integer minOrdAmt;				// 무료배송 최소금액
-	private String pgStats;					// pg전송 여부(Y: 미전송)
-	private String completeDt;				// 회수 완료 일
-
-	// 주문 관련
-	private Long ordNo;						// 주문번호
-	private String mallGb;					// 몰구분(10:자사몰, 20:외부몰)
-	private String ordDt;					// 주문일시
-	private String payDt;					// 결제일시
-	private Integer custNo;					// 고객번호
-	private String orderNm;					// 주문자이름
-	private String orderPhnno;				// 주문자 휴대전화번호
-	private String orderTelno;				// 주문자 전화번호
-	private String orderEmail;				// 주문자 이메일
-	private String ordStat;					// 주문상태
-	private String siteCd;					// 사이트코드
-	private String frontGb;					// 프론트구분
-	private String afLinkCd;				// 제휴링크코드
-	private String sbagEncloseYn;			// 쇼핑백 동봉여부
-
-	// 주문 상세 관련
-	private String ordExchGb;				// 주문구분
-	private Long orgOrdDtlNo;				// 주문
-	private String supplyCompCd;			// 공급업체
-	private String formalGb;				// 정상이월구분
-	private String setYn;					// 세트여부
-	private Integer tagPrice;				// tag가
-	private Integer listPrice;				// 정상가
-	private Integer currPrice;				// 현재가
-	private String dcRate;					// 할인율
-	private Integer ordQty;					// 주문수량
-	private Integer ordAmt;					// 주문금액
-	private Integer cnclRtnQty;				// 취소반품 수량
-	private Integer cnclRtnAmt;				// 취소반품 금액
-	private String goodsCpnSq;				// 상품쿠폰 일련번호
-	private Integer goodsCpnDcAmt;			// 상품쿠폰 할인금액
-	private String cartCpnSq;				// 장바구니쿠폰 일련번호
-	private Integer cartCpnDcAmt;			// 장바구니쿠폰 할인 금액
-	private Integer pntDcAmt;				// 포인트 할인 금액
-	private Integer prePntDcAmt;			// 선 포인트 할인 금액
-	private Integer savePntAmt;				// 적입 예정 포인트
-	private Integer realOrdAmt;				// 실제 주문 결제 금액
-	private Integer totRealOrdAmt;			// 총 상품 실결제 금액
-	private String vendorId;				// 벤더ID
-	private String extmallId;				// 외부몰ID
-	private String agentOrderId;			// 에이전트주문번호
-	private String extmallOrderId;			// 외부몰주문번호(쇼핑몰주문번호)
-	private String ordDtlStat;				// 주문상세상태(공통코드G013)
-	private String ordDtlStatNm;			// 주문상세상태명(공통코드G013)
-	private String exchangableYn;			// 교환가능여부(Y:교환가능)
-	private String exchangeFeeFreeYn;		// 교환배송비무료여부(Y:교환배송비무료)
-	private String returnableYn;			// 반품가능여부(Y:반품가능)
-	private String returnFeeFreeYn;			// 반품배송비무료여부(Y:반품배송비무료)
-	private String soldoutYn;				// 결품여부(Y:결품)
-	private String soldoutMemo;				// 결품메모
-	private String soldoutRegId;			// 결품등록자ID
-	private String soldoutRegDt;			// 결품등록일시
-	private String delvAddrSq;				// 배송지일련번호(배송지)
-	private String delvLocCd;				// 출고처코드(출고처)
-	private String delvAssignDt;			// 출고지정일시
-	private String delvAssignStat;			// 출고지정상태
-	private String dstrbtNote;				// 물류비고(물류담당자에게 공지)
-	private String delvStdt;				// 배송시작일시
-	private String delvEddt;				// 배송완료일시
-	private String invoiceNo;				// 송장번호
-	private String invoiceSendYn;			// 송장전송여부
-	private String sellFeeRate;				// 판매매장코드(판매매장)
-	private String ithrCd;					// 유입경로(공통코드G027)
-	private String contentsLoc;				// 컨텐츠위치(공통코드G028)
-	private Integer custCpnSq;				// 고객쿠폰 일련번호
-	private Integer buyLimitAmt;			// 구매제한금액
-	private Integer sumOrdQty;				// 전체주문수량
-	private Integer totCnclRtnQty;			// 전체 취소수량
-	private Integer totCnclRtnAmt;			// 전체 취소금액
-	private Integer totGoodsCpnDcAmt;		// 전체 상품쿠폰금액
-	private Integer totCartCpnDcAmt;		// 전체 장바구니쿠폰금액
-	private Integer totPntDcAmt;			// 전체 포인트금액
-	private Integer totPrePntDcAmt;			// 전체 선포인특므액
-	private String plusCpnSq;				// 플러스 쿠폰 일련번호 
-	private Integer plusCpnDcAmt;			// 플러스 쿠폰 할인금액
-	private Integer totPlusCpnDcAmt;		// 전체 플러스 쿠폰 할인금액
+	// Masking
 
-	// 주문 변경 관련
-	private String chgGb;					// 변경구분
-	private String chgerNm;					// 요청자명
-	private String chgReason;				// 변경요청사유
-	private String orgChgReason;
-	private String chgerBaseAddr;			// 회수기본주소
-	private String chgerDtlAddr;			// 회수상세주소
-	private String chgerAddr;				// 회수주소
-	private Long ordChgSq;					// 주문변경번호
-	private Integer chgQty;					// 변경수량
-	private Integer delvFee;				// 배송비
-	private Integer custShipAmt;			// 고객부담 배송비
-	private String chgStat;					// 변경상태
-	private String chgStatNm;				// 변경상태명
-
-	// 환불 관련
-	private Integer totCnclGoodsAmt;		// 총 취소 상품 금액
-	private Integer totCnclPointAmt;		// 총 취소 사용 포입트
-	private Integer totCnclCouponAmt;		// 총 취소 사용 쿠폰
-	private Integer totCnclGoodsRefundAmt;	// 총 취소 상품 환불금액
-	private Integer payAmt;					// 결제금액
-	private Integer paySq;					// 결제일련번호
-	private String delvFeeGb;				// 배송비 유형(10:원주문배송비,	20:재결제배송비, 30:교환배송비, 40:반품배송비)
-	private String delvUsacYn;				// 배송비 정산 여부
-	private String delvUsacDt;				// 배송비 정산 일시
-	private Integer refundAmt;				// 환불금액
-	private String raNm;					// 환불계좌예금주명
-	private String raNo;					// 환불계좌번호
-	private String raBank;					// 환불계좌은행
-	private String occurGb;					// 포인트 발생구분
-	private String occurDtlDesc;			// 포인트 발생 상세설명
-	private String pntUploadStat;			// 포인트 반영상태
-	private String pntUploadDt;				// 포인트 반영일시
-	private Integer pntAmt;					// 포인트금액
-	private Integer availPntAmt;			// 가용포인트 금액
-	private Integer accumPntAmt;			// 누적포인트 금액
-	private Integer usePntAmt;				// 사용포인트 금액
-	private Integer expirePntAmt;			// 소멸포인트 금액
-	private String delvPayGb;				// 배송결제구분
-	private String payStat;					// 결제상태
+	public String getMaskingRecipNm() {
+		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.name(this.recipNm) : this.recipNm;
+	}
 	
+	public String getMaskingChgerNm() {
+		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.name(this.chgerNm) : this.chgerNm;
+	}
 	
-	private String pgCnclTid;				// PG취소거래ID
-	private String pgTradeNo;				// PG
-	private String pgShopId;				// PG가맹정ID
-	private String pgResultCd;
-	private String pgResultMsg;
-	private String pgFulltext;
-	private String checkcardType;
-	private String cardKind;
-	private String cardBank;
-	private String cardNm;
-	private String cardMips;
-	private String cardPcableYn;
-	private String vaNo;
-	private String vaNm;
-	private String vaBank;
-	private String vaDeadline;
-	private String recipNm;
-	private String recipPhnno;
-	private String chgMemo;
-
-	// 상품관련
-	private String goodsCd;					// 상품코드
-	private String orgGoodsCd;				// 원상품코드
-	private String sizeCd;					// 사이즈코드
-	private String goodsNm;					// 상품명
-	private String imgPath1;				// 이미지경로1
-	private String imgPath2;				// 이미지경로2
-	private String imgPath4;				// 이미지경로4
-	private String imgPath5;				// 이미지경로5
-
-	// 재고정산 관련
-	private Integer sellQty;				// 판매수량
-	private String sellGb;					// 판매구분
-	private String occurDt;					// 발생일시
-	private String usacGb;					// 정산구분(공통코드G019)
-	private String prtnGb;					// 환입구분(공통코드G020). 정산구분이 "20:환입"일 때 사용
+	public String getMaskingChgerPhnno() {
+		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.phoneNo(this.chgerPhnno) : this.chgerPhnno;
+	}
+	
+	public String getMaskingChgerDtlAddr() {
+		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.address(this.chgerDtlAddr) : this.chgerDtlAddr;
+	}
+	
+	public String getMaskingOrdNm() {
+		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.name(this.ordNm) : this.ordNm;
+	}
 	
-	private Integer usacQty;				// 정산수량
-	private String orgUsacGb;
-	private String planSq;					// 기획전일련번호
+	public String getMaskingOrdPhnno() {
+		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.phoneNo(this.ordPhnno) : this.ordPhnno;
+	}
 
-	// 회수송장전송 관련
-	private String rtnLocNm;				// 수취인명
-	private String rtnLocTelno;				// 수취인휴대전화번호
-	private String rtnLocPostNo;			// 수취인우편번호
-	private String rtnLocBaseAddr;			// 수취인기본주소
-	private String rtnLocDtlAddr;			// 수취인상세주소
-	private String chgerPhnno;				// 송화인휴대전화번호
-	private String chgerPostNo;				// 송화인우편번호
-	private String wdInvoiceSendYn;			// 택배사 전송여부
-	private String withdrawRegFlag;			// 등록 여부
+	public String getMaskingOrdEmail() {
+		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.email(this.ordEmail) : this.ordEmail;
+	}
 
-	// 검색
-	private String searchType;				// 조회
-	private String searchText;				// 조회
-	private String stDate;					// 조회 시작 기간
-	private String edDate;					// 조회 종료 기간
-	private String dtlStDate;				// 상세조회 시작 기간
-	private String dtlEdDate;				// 상세조회 종료 기간
-	private String withdrawType;			// 회수상태
-	private String withdrawText;			//
-	private String delayDt;					// 회수지연일
-	private String delayDtType;				// 회수유형
-	private String goodsInfo;				// 상품정보(상품코드+사이즈코드)
 
-	private int seq;
-	private String goodsType;				// 상품유형
-	private int rfPntAmt;	//환원 포인트
-	private int rfPrePntAmt;	//취소 선포인트
-	private int rfGoodsCpnAmt;	//취소 상품쿠폰금액
-	private int rfCartCpnAmt;	//취소 장바구니쿠폰금액
-	private int rfPlusCpnAmt;	//취소 플러스쿠폰금액
-	private int rfSavePntAmt;
-	private int realOrdQty;
-	private int orgRealOrdAmt;
-	private int itemQty;	// 단품수량
-	private int itemPrice;	// 단품단가
-	*/
 
 }

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

@@ -28,6 +28,7 @@ public class WmsWithdraw extends TscBaseDomain {
 	private Integer recallno;			// 반품 번호 
 	private Integer orderexceptionno;	// 주문변경번호  
 	private String recalltypecd;		// 반품타입
+	private String recalltypecdnm;		// 반품타입
 	private String receiver;			// 받는자
 	private String receivertelnum;		// 받는자 전화번호
 	private String receivercellnum;		// 받는자 핸드폰 번호

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

@@ -68,7 +68,8 @@
 		      AND    SELL_STORE_CD = Z.SELL_STORE_CD
 		     ) AS SELL_STORE_NM
 		    , FN_GET_CODE_NM('G011', Z.MALL_GB) AS MALL_GB_NM
-		    , FN_GET_CODE_NM('G013', Z.ORD_DTL_STAT) AS ORD_DTL_STAT_NM
+		    , CASE WHEN Z.ORD_DTL_STAT = 'G013_99' AND (SELECT MAX(OC.CHG_REASON) FROM TB_ORDER_CHANGE OC JOIN TB_ORDER_CHANGE_DETAIL OCD ON OC.ORD_CHG_SQ = OCD.ORD_CHG_SQ AND OCD.ORD_DTL_NO = Z.ORD_DTL_NO AND OC.CHG_REASON = 'G686_30') IS NOT NULL 
+		           THEN '품절취소' ELSE FN_GET_CODE_NM('G013', Z.ORD_DTL_STAT) END  AS ORD_DTL_STAT_NM
 		    , (SELECT B.DELV_LOC_NM FROM TB_DELIVERY_LOC B WHERE  Z.DELV_LOC_CD = B.DELV_LOC_CD AND Z.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD ) AS DELV_LOC_NM   -- 출고처명
 		    , (SELECT BD.BRAND_KNM FROM TB_BRAND BD WHERE BD.BRAND_CD = Z.BRAND_CD ) AS BRAND_NM
 		    , FN_GET_CODE_NM('G056', Z.GOODS_TYPE ) AS GOODS_TYPE_NM 

+ 9 - 9
src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml

@@ -1896,17 +1896,17 @@
 		              , DISP_STDT
 		              , DISP_EDDT
 		              , CASE WHEN STR_TITLE2 = 1 THEN TITLE END AS GROUP1_TITLE
-		              , CASE WHEN STR_TITLE2 = 1 THEN GROUP_CONCAT(BRAND_GROUP_NO SEPARATOR ',') END GROUP1_BRAND_CD
-		              , CASE WHEN STR_TITLE2 = 1 THEN GROUP_CONCAT(BRAND_GROUP_NM SEPARATOR ',') END GROUP1_BRAND_NM
-		              , CASE WHEN STR_TITLE2 = 1 THEN GROUP_CONCAT(LOGO_FILE_NM SEPARATOR ',') END GROUP1_BRAND_IMG
+		              , CASE WHEN STR_TITLE2 = 1 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NO IS NULL THEN '' ELSE BRAND_GROUP_NO END SEPARATOR ',') END GROUP1_BRAND_CD
+		              , CASE WHEN STR_TITLE2 = 1 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NM IS NULL THEN '' ELSE BRAND_GROUP_NM END SEPARATOR ',') END GROUP1_BRAND_NM
+		              , CASE WHEN STR_TITLE2 = 1 THEN GROUP_CONCAT(CASE WHEN LOGO_FILE_NM IS NULL THEN '' ELSE LOGO_FILE_NM END SEPARATOR ',') END GROUP1_BRAND_IMG
 		              , CASE WHEN STR_TITLE2 = 2 THEN TITLE END AS GROUP2_TITLE
-		              , CASE WHEN STR_TITLE2 = 2 THEN GROUP_CONCAT(BRAND_GROUP_NO SEPARATOR ',') END GROUP2_BRAND_CD
-		              , CASE WHEN STR_TITLE2 = 2 THEN GROUP_CONCAT(BRAND_GROUP_NM SEPARATOR ',') END GROUP2_BRAND_NM
-		              , CASE WHEN STR_TITLE2 = 2 THEN GROUP_CONCAT(LOGO_FILE_NM SEPARATOR ',') END GROUP2_BRAND_IMG
+		              , CASE WHEN STR_TITLE2 = 2 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NO IS NULL THEN '' ELSE BRAND_GROUP_NO END SEPARATOR ',') END GROUP2_BRAND_CD
+		              , CASE WHEN STR_TITLE2 = 2 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NM IS NULL THEN '' ELSE BRAND_GROUP_NM END SEPARATOR ',') END GROUP2_BRAND_NM
+		              , CASE WHEN STR_TITLE2 = 2 THEN GROUP_CONCAT(CASE WHEN LOGO_FILE_NM IS NULL THEN '' ELSE LOGO_FILE_NM END SEPARATOR ',') END GROUP2_BRAND_IMG
 		              , CASE WHEN STR_TITLE2 = 3 THEN TITLE END AS GROUP3_TITLE
-		              , CASE WHEN STR_TITLE2 = 3 THEN GROUP_CONCAT(BRAND_GROUP_NO SEPARATOR ',') END GROUP3_BRAND_CD
-		              , CASE WHEN STR_TITLE2 = 3 THEN GROUP_CONCAT(BRAND_GROUP_NM SEPARATOR ',') END GROUP3_BRAND_NM
-		              , CASE WHEN STR_TITLE2 = 3 THEN GROUP_CONCAT(LOGO_FILE_NM SEPARATOR ',') END GROUP3_BRAND_IMG
+		              , CASE WHEN STR_TITLE2 = 3 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NO IS NULL THEN '' ELSE BRAND_GROUP_NO END SEPARATOR ',') END GROUP3_BRAND_CD
+		              , CASE WHEN STR_TITLE2 = 3 THEN GROUP_CONCAT(CASE WHEN BRAND_GROUP_NM IS NULL THEN '' ELSE BRAND_GROUP_NM END SEPARATOR ',') END GROUP3_BRAND_NM
+		              , CASE WHEN STR_TITLE2 = 3 THEN GROUP_CONCAT(CASE WHEN LOGO_FILE_NM IS NULL THEN '' ELSE LOGO_FILE_NM END SEPARATOR ',') END GROUP3_BRAND_IMG
 		        FROM (
 		            SELECT
 		                  B.STR_TITLE3

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

@@ -2961,6 +2961,53 @@
 		AND A.REG_DT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
 		]]>
 		</if>
+		<if test='conditionList != null and conditionList.length>0'>
+		    <choose>
+		      <when test='search != null and search == "searchGoodsCd"'>
+		AND (
+		      <foreach collection="conditionList" item="item" index="index" separator="or">
+		       A.GOODS_CD LIKE CONCAT(UPPER(#{item}),'%') 
+		      </foreach>
+		     )
+		      </when>
+		      <when test='search != null and search == "searchGoodsNm"'>
+		AND (
+		      <foreach collection="conditionList" item="item" index="index" separator="or">
+		       UPPER(C.GOODS_NM) LIKE CONCAT(UPPER(#{item}),'%') 
+		      </foreach>
+		     )
+		      </when>
+		       <when test='search != null and search == "searchGoodsNum"'>
+		AND (
+		      <foreach collection="conditionList" item="item" index="index" separator="or">
+		       UPPER(C.GOODS_NUM) LIKE CONCAT(UPPER(#{item}),'%') 
+		      </foreach>
+		     )
+		      </when>
+		      <when test='search != null and search == "searchSupplyGoodsCd"'>
+		AND (
+		      <foreach collection="conditionList" item="item" index="index" separator="or">
+		       UPPER(C.SUPPLY_GOODS_CD) LIKE CONCAT(UPPER(#{item}),'%') 
+		      </foreach>
+		     )
+		      </when>
+		      <when test='search != null and search == "searchExtendGoodsCd"'>
+		AND 1 = 1
+		      </when>
+		      <when test='search != null and search == "searchMasterGoodsCd"'>
+		AND 1 = 1
+		      </when>
+		      <otherwise>
+		AND 1 = 1
+		      </otherwise>
+		    </choose>
+		</if>
+		<if test="multiBrand != null and multiBrand != ''">
+		AND C.BRAND_CD IN
+		    <foreach collection="multiBrand" item="item" index="index"  open="(" close=")" separator=",">
+		#{item}
+		    </foreach>
+		</if>
 		ORDER BY A.VIDEO_SQ DESC
 	</select>
 		
@@ -3637,7 +3684,7 @@
 		    <![CDATA[
 		AND IA.REQ_DT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
 		    ]]>
-			</if>
+		    </if>
 		</if>
 		<if test='dateGbn != null and dateGbn == "alarmDt"'>
 		    <if test="stDate != null and stDate != ''">

+ 70 - 29
src/main/java/com/style24/persistence/mybatis/shop/TsaMorebetter.xml

@@ -201,7 +201,7 @@
 		WHERE 1=1
 		  AND A.TMTB_SQ = #{tmtbSq}
 		  AND A.TARGET_GB = 'G260_10'
-		  AND A.GOODS_GB IN ('G800_10','G800_20')
+		  AND A.GOODS_GB = #{goodsGb}
  		  AND A.DEL_YN = 'N'
 		GROUP BY A.TMTB_GOODS_SQ, B.TMTB_APPLY_GOODS_SQ
 	</select>
@@ -543,16 +543,19 @@
 	<select id="getMorebetterDuplicateList" parameterType="MoreBetterGoods" resultType="MoreBetterGoods">
 		/* TsaMorebetter.getMorebetterDuplicateList */
 		SELECT 	REG_NO
-				, GOODS_CD
-				, GOODS_NM
+		      , GOODS_CD
+		      , GOODS_NM
 		 FROM	TB_TMTB_APPLY_GOODS_TEMP
 		WHERE	1=1
 		  AND	REG_NO = #{regNo}
 		  AND	GOODS_CD NOT IN (
-							SELECT	GOODS_CD
-							FROM	TB_TMTB_APPLY_GOODS
-							WHERE	TMTB_SQ = #{tmtbSq}
-							)
+		                SELECT	B.GOODS_CD
+		                FROM	TB_TMTB A, TB_TMTB_APPLY_GOODS B
+		                WHERE	1=1
+		                AND		A.TMTB_SQ = B.TMTB_SQ
+		                AND		NOW() BETWEEN A.TMTB_ST_DT AND A.TMTB_ED_DT
+		                AND		B.TMTB_SQ = #{tmtbSq}
+		              )
 	</select>
 
 	<update id="updateMorebetterStat" parameterType="MoreBetter">
@@ -648,7 +651,7 @@
 					<foreach collection="multiSupplyCompCd" item="item" open="(" separator="," close=")">
 						#{item}
 					</foreach>
-					<if test="multiApplyGoods != null and multiApplyGoods.length>0">
+					<if test="multiDefaultGoods != null and multiDefaultGoods.length>0">
 						AND GOODS_CD NOT IN ( ${applySql} )
 					</if>
 					UNION ALL
@@ -661,7 +664,7 @@
 					<foreach collection="multiBrand" item="item" open="(" separator="," close=")">
 						#{item}
 					</foreach>
-					<if test="multiApplyGoods != null and multiApplyGoods.length>0">
+					<if test="multiDefaultGoods != null and multiDefaultGoods.length>0">
 						AND GOODS_CD NOT IN ( ${applySql} )
 					</if>
 					UNION ALL
@@ -703,30 +706,68 @@
 		INSERT INTO TB_TMTB_APPLY_GOODS_TEMP
 		SELECT	T.*
 		FROM (
-			SELECT	#{regNo} AS REG_NO
-					, GOODS_CD
-					, GOODS_NM
-			FROM	TB_GOODS
-			WHERE	1=1
-			<if test="multiApplyGoods != null and multiApplyGoods.length>0">
-				AND GOODS_CD IN
-				<foreach collection="multiApplyGoods" item="item" open="(" separator="," close=")">
-					#{item}
-				</foreach>
-			</if>
+		    SELECT	#{regNo} AS REG_NO
+		          , GOODS_CD
+		          , GOODS_NM
+		    FROM    TB_GOODS
+		    WHERE   1=1
+		    <if test="multiDefaultGoods != null and multiDefaultGoods.length>0">
+		    AND GOODS_CD IN
+		        <foreach collection="multiDefaultGoods" item="item" open="(" separator="," close=")">
+		        #{item}
+		        </foreach>
+		    </if>
 		) T
 		WHERE	1=1
 		<if test="multiExceptGoods != null and multiExceptGoods.length>0">
-		AND 	T.GOODS_CD NOT IN (
-		    						SELECT	GOODS_CD
-		    						FROM	TB_GOODS
-		    						WHERE	1=1
-		    						AND 	GOODS_CD IN
-									<foreach collection="multiExceptGoods" item="item" open="(" separator="," close=")">
-										#{item}
-									</foreach>
-								)
+		AND  T.GOODS_CD NOT IN (
+		                  SELECT    GOODS_CD
+		                  FROM    TB_GOODS
+		                  WHERE    1=1
+		                  AND     GOODS_CD IN
+		                  <foreach collection="multiExceptGoods" item="item" open="(" separator="," close=")">
+		                      #{item}
+		                  </foreach>
+		                )
 		</if>
 	</insert>
+
+	<insert id="insertTmtbApplyGoods" parameterType="MoreBetterGoods">
+		/* TsaMarketing.insertTmtbApplyGoods */
+		<selectKey keyProperty="tmtbGoodsSq" resultType="int" order="AFTER">
+			SELECT LAST_INSERT_ID()
+		</selectKey>
+		INSERT INTO TB_TMTB_GOODS(
+		      TMTB_SQ
+		    , GOODS_GB
+		    , TARGET_GB
+		    , TARGET_VAL
+		    , DEL_YN
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		)
+		SELECT #{tmtbSq} AS TMTB_SQ
+		     , Z.GOODS_GB AS GOODS_GB
+		     , 'G260_10' AS TARGET_GB
+		     , Z.GOODS_CD AS TARGET_VAL
+		     , 'N' AS DEL_YN
+		     , #{regNo} AS REG_NO
+		     , NOW() AS REG_DT
+		     , #{updNo} AS UPD_NO
+		     , NOW() AS UPD_DT
+		FROM	(
+		    SELECT T.GOODS_CD
+		         , 'G800_10' AS GOODS_GB
+		    FROM (
+		         ${applyGbSql}
+		         ) T
+		    WHERE	1=1
+		    <if test="exceptSql!= null and exceptSql!=''">
+		    AND 	T.GOODS_CD NOT IN ( ${exceptSql} )
+		    </if>
+		) Z
+	</insert>
 	<!--// CSB 진행 -->
 </mapper>

+ 16 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaRenderer.xml

@@ -393,6 +393,22 @@
 		ORDER BY DELV_FEE_CD
 	</select>
 	
+	<!-- 업체별 배송비정책 목록(정책명) -->
+	<select id="getSupplyDeliveryPolicyList" parameterType="String" resultType="DelvFeePolicy">
+		/* TsaRenderer.getSupplyDeliveryPolicyList */
+		SELECT DELV_FEE_CD
+		     , CASE WHEN DELV_FEE_CRITE = 'G078_10' THEN CONCAT(MIN_ORD_AMT,'원 미만시 ', DELV_FEE,'원 부과' )
+		            WHEN DELV_FEE_CRITE = 'G078_20' THEN '무료배송'
+		            ELSE CONCAT('유료배송 ', DELV_FEE,'원 부과' ) END DELV_FEE_NM
+		     , MIN_ORD_AMT
+		     , DELV_FEE
+		FROM TB_DELV_FEE_POLICY
+		WHERE 1=1
+		AND SUPPLY_COMP_CD = #{supplyCompCd}
+		AND USE_YN = 'Y'
+		ORDER BY DELV_FEE_CD
+	</select>
+	
 	<!-- 전체 제휴채널 목록 -->
 	<select id="getAllAflinkList" resultType="CommonCode">
 		/* TsaRenderer.getAllAflinkList */

+ 19 - 3
src/main/java/com/style24/persistence/mybatis/shop/TsaShoplinker.xml

@@ -249,7 +249,11 @@
 				  WHEN 'CERT' =  A.API_TYPE THEN '인증'
 				  WHEN 'IMAGE' =  A.API_TYPE THEN '이미지'
 			  END API_TYPE
-			, IFNULL(A.API_RESULT, '') AS API_RESULT
+			, CASE WHEN 'true' = A.API_RESULT THEN '전송완료'
+  		    	   WHEN 'false' = A.API_RESULT THEN '전송실패'
+  		    	   WHEN 'error' = A.API_RESULT THEN '오류'
+  		    	   ELSE IFNULL(A.API_RESULT, '')
+			  END API_RESULT
 			, IFNULL(A.API_MESSAGE, '') AS API_MESSAGE
 			, IFNULL(A.API_PRODUCT_ID, '') AS API_PRODUCT_ID
 			, IFNULL(A.GOODS_CD, '') AS GOODS_CD
@@ -346,7 +350,11 @@
 	/* TsaShoplinker.getStockList */
 		SELECT
 			A.API_TYPE
-			, A.API_RESULT
+			, CASE WHEN 'true' = A.API_RESULT THEN '전송완료'
+  		    	   WHEN 'false' = A.API_RESULT THEN '전송실패'
+  		    	   WHEN 'error' = A.API_RESULT THEN '오류'
+  		    	   ELSE IFNULL(A.API_RESULT, '')
+			  END API_RESULT
 			, A.API_MESSAGE
 			, A.GOODS_CD
 			, A.OPT_CD
@@ -680,6 +688,7 @@
 			TB_ORDER_DETAIL OD
 			LEFT OUTER JOIN SHOPLINKER_SYNC_HST SL ON OD.ORD_DTL_NO = SL.ORD_DTL_NO AND SL.API_TYPE = 'INVOICE'
 		WHERE OD.VENDOR_ID = 'G003_V001'
+		AND (OD.ORD_DTL_STAT = 'G013_50' OR SL.ORD_DTL_NO IS NOT NULL)
 		AND OD.INVOICE_NO IS NOT NULL
 		AND OD.DELV_STDT IS NOT NULL
 
@@ -709,7 +718,11 @@
 			, FN_GET_CODE_NM('G013', OD.ORD_DTL_STAT) AS ORD_DTL_STAT_NM
 			, OD.DELV_STDT
 
-			, SL.API_RESULT
+			, CASE WHEN 'true' = SL.API_RESULT THEN '전송완료'
+  		    	   WHEN 'false' = SL.API_RESULT THEN '전송실패'
+  		    	   WHEN 'error' = SL.API_RESULT THEN '오류'
+  		    	   ELSE IFNULL(SL.API_RESULT, '')
+			  END API_RESULT
 			, SL.API_MESSAGE
 			, SL.XML_TXT
 			, SL.REG_DT
@@ -717,6 +730,9 @@
 			TB_ORDER_DETAIL OD
 			LEFT OUTER JOIN SHOPLINKER_SYNC_HST SL ON OD.ORD_DTL_NO = SL.ORD_DTL_NO AND SL.API_TYPE = 'INVOICE'
 		WHERE OD.VENDOR_ID = 'G003_V001'
+		AND (OD.ORD_DTL_STAT = 'G013_50' OR SL.ORD_DTL_NO IS NOT NULL)
+		AND OD.INVOICE_NO IS NOT NULL
+		AND OD.DELV_STDT IS NOT NULL
 
 		<include refid="getSlkInvoiceCondition_sql"/>
 

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

@@ -396,6 +396,7 @@
 		     , CASE WHEN WD_SHIP_STATE = '12' THEN   FN_GET_CODE_NM('G321', Z.WD_REASON_CD)
 		            WHEN WD_SHIP_STATE = '84' THEN   FN_GET_CODE_NM('G322', Z.WD_REASON_CD) ELSE '' END AS WD_REASON_CD_NM
 		     , FN_GET_CODE_NM('G685', Z.CHG_STAT) AS CHG_STAT_NM
+		     , CASE WHEN Z.WD_GB = 'W' THEN '회수요청' ELSE '직접배송' END AS WD_GB_NM 
 		FROM (
 		    SELECT A.*, ROW_NUMBER() OVER(ORDER BY  A.ORD_CHG_SQ, A.ORD_NO DESC, A.ORD_DTL_NO )  RNUM 
 		    FROM ( 
@@ -447,7 +448,7 @@
 						WHERE  1=1 
 						<include refid="getWithdrawDirectiveCondition_sql"/>
 					) A
-				ORDER BY A.ORD_CHG_SQ, A.ORD_NO DESC, A.ORD_DTL_NO
+				ORDER BY A.ORD_CHG_SQ desc, A.ORD_NO DESC, A.ORD_DTL_NO
 				<include refid="getListPagingCondition_sql"/>
 	</select>
 

+ 1 - 0
src/main/java/com/style24/persistence/mybatis/wms/TsaWmsWithdraw.xml

@@ -42,6 +42,7 @@
 	<select id="getWmsWithdrawList" parameterType="WmsWithdraw" resultType="WmsWithdraw">
 		/* TsaWmsWithdraw.getWmsWithdrawList */
 		SELECT Z.*
+		, CASE WHEN Z.RecallTypeCd ='10' THEN '반품' ELSE '교환' END AS RecallTypeCdNm
 		FROM (
 		    SELECT A.*,  ROW_NUMBER() OVER (ORDER BY RecallNo DESC, RecallItemNo ) as RNUM 
 		    FROM (

+ 1 - 1
src/main/resources/config/application-locd.yml

@@ -28,7 +28,7 @@ upload:
     default:
         target.path: /WIDE/workspace/files/data/style24
         max.size: 10
-        allow.extension: jpg|gif|jpeg|png|bmp|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
+        allow.extension: jpg|gif|jpeg|png|bmp|ico|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
         view: //ldimage.style24.com
     goods:
         target.path: /WIDE/workspace/files/data/style24/Upload/ProductImage

+ 1 - 1
src/main/resources/config/application-locp.yml

@@ -28,7 +28,7 @@ upload:
     default:
         target.path: /WIDE/workspace/files/data/style24
         max.size: 10
-        allow.extension: jpg|gif|jpeg|png|bmp|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
+        allow.extension: jpg|gif|jpeg|png|bmp|ico|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
         view: //lpimage.style24.com
     goods:
         target.path: /WIDE/workspace/files/data/style24/Upload/ProductImage

+ 1 - 1
src/main/resources/config/application-run.yml

@@ -38,7 +38,7 @@ upload:
     default:
         target.path: /files/data/style24
         max.size: 10
-        allow.extension: jpg|gif|jpeg|png|bmp|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
+        allow.extension: jpg|gif|jpeg|png|bmp|ico|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
         view: //image.istyle24.com/Upload
     goods:
         target.path: /files/data/style24/ProductImage

+ 1 - 1
src/main/resources/config/application-style.yml

@@ -41,7 +41,7 @@ upload:
     default:
         target.path: /files/data/style24
         max.size: 10
-        allow.extension: jpg|gif|jpeg|png|bmp|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
+        allow.extension: jpg|gif|jpeg|png|bmp|ico|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
         view: //image.istyle24.com/Upload
     goods:
         target.path: /files/data/style24/ProductImage

+ 1 - 1
src/main/resources/config/application-tsit.yml

@@ -30,7 +30,7 @@ upload:
     default:
         target.path: /TSIT/servers/files/data/style24
         max.size: 10
-        allow.extension: jpg|gif|jpeg|png|bmp|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
+        allow.extension: jpg|gif|jpeg|png|bmp|ico|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
 #        view: //tdimage.style24.com
         view: //ts5000.ipdisk.co.kr:8999
     goods:

+ 1 - 1
src/main/webapp/WEB-INF/views/board/NoticeForm.html

@@ -54,7 +54,7 @@
 						</td>
 						<th>공지제목</th>
 						<td>
-							<input name="noteicTitle" type="text" maxlength="200"/>
+							<input name="noticeTitle" type="text" maxlength="200"/>
 						</td>
 						<th>사용여부</th>
 						<td>

+ 4 - 4
src/main/webapp/WEB-INF/views/business/BrandForm.html

@@ -185,21 +185,21 @@
 					<tr>
 						<th>포인트적립율(PC정상)<i class="required" title="필수"></i></th>
 						<td>
-							<input type="text" class="w100 aR" name="pntPrate10" maxlength="3" required="required" data-valid-name="포인트적립율(PC정상)" data-valid-type="real"/>%
+							<input type="text" class="w100 aR" name="pntPrate10" maxlength="3" required="required" data-valid-name="포인트적립율(PC정상)" data-valid-type="preal"/>%
 						</td>
 						<th>포인트적립율(모바일정상)<i class="required" title="필수"></i></th>
 						<td>
-							<input type="text" class="w100 aR" name="pntMrate10" maxlength="3" required="required" data-valid-name="포인트적립율(모바일정상)" data-valid-type="real"/>%
+							<input type="text" class="w100 aR" name="pntMrate10" maxlength="3" required="required" data-valid-name="포인트적립율(모바일정상)" data-valid-type="preal"/>%
 						</td>
 					</tr>
 					<tr>
 						<th>포인트적립율(PC이월)<i class="required" title="필수"></i></th>
 						<td>
-							<input type="text" class="w100 aR" name="pntPrate20" maxlength="3" required="required" data-valid-name="포인트적립율(PC이월)" data-valid-type="real"/>%
+							<input type="text" class="w100 aR" name="pntPrate20" maxlength="3" required="required" data-valid-name="포인트적립율(PC이월)" data-valid-type="preal"/>%
 						</td>
 						<th>포인트적립율(모바일이월)<i class="required" title="필수"></i></th>
 						<td>
-							<input type="text" class="w100 aR" name="pntMrate20" maxlength="3" required="required" data-valid-name="포인트적립율(모바일이월)" data-valid-type="real"/>%
+							<input type="text" class="w100 aR" name="pntMrate20" maxlength="3" required="required" data-valid-name="포인트적립율(모바일이월)" data-valid-type="preal"/>%
 						</td>
 					</tr>
 				<!-- <tr id="brandImgArea" class="off">

+ 1 - 1
src/main/webapp/WEB-INF/views/customer/GoodsQnaForm.html

@@ -78,7 +78,7 @@
 <!-- 						<td colspan="3"><input type="text" name="ansTransId" class="w300" placeholder="" maxlength="20"/></td> -->
 <!-- 					</tr> -->
 					<tr>
-						<th>기간<i class="required" title="필수"></i></th>
+						<th>기간<i class="required" title="필수" data-valid-name="기간"></i></th>
 						<td colspan="7">
 							<select name="termGb">
 								<option value="regDt">문의일</option>

+ 1 - 1
src/main/webapp/WEB-INF/views/customer/OneToOneQnaForm.html

@@ -79,7 +79,7 @@
 <!-- 						<td colspan="3"><input type="text" name="ansTransId" class="w300" placeholder="" maxlength="20"/></td> -->
 <!-- 					</tr> -->
 					<tr>
-						<th>문의기간<i class="required" title="필수"></i></th>
+						<th>문의기간<i class="required" title="필수" data-valid-name="문의기간"></i></th>
 						<td colspan="7" id="terms"></td>
 					</tr>
 				</table>

+ 24 - 10
src/main/webapp/WEB-INF/views/delivery/DeliveryListForm.html

@@ -67,7 +67,7 @@
 							</select>
 						</td>
 
-						<th>업체/브랜드<em class="required" title="필수"></em></th>
+						<th>업체/브랜드</th>
 						<td colspan="3">
 								<select name="supplyCompCd" id="supplyCompCd">
 									<option value="">[전체]</option>
@@ -102,9 +102,9 @@
 						</td>
 						<th>주문상세번호</th>
 						<td>
-							<input type="text" class="" name="ordDtlNo" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" placeholder="" maxlength="20"/>
+							<input type="text" class="" name="ordDtlNo" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" placeholder="" maxlength="9"/>
 						</td>
-						<th rowspan="4">키워드<i class="star"></i></th>
+						<th rowspan="4">키워드<em class="required" title="필수"></em><i class="star"></i></th>
 						<td rowspan="4" colspan="5">
 							<select class="w130" name="search" id="search">
 								<option value="searchOrdNo">주문번호</option>
@@ -151,7 +151,7 @@
 						</td>
 					</tr>
 					<tr>
-						<th>기간</th>
+						<th>기간<em class="required" title="필수"></em></th>
 						<td colspan="8">
 							<select name="termGb" id="termGb">
 								<option value="ordDt">주문등록일</option>
@@ -262,17 +262,19 @@
 			}
 		},
 		{headerName: "몰구분", 		field: "mallGbNm", 		width: 70, cellClass: 'text-center'},
-		{headerName: "주문자", 		field: "ordNm", 		width: 100, cellClass: 'text-center',
+		{headerName: "주문자", 		field: "maskingOrdNm", 		width: 100, cellClass: 'text-center',
 			cellRenderer: function (params) {
 				if (roleCd.indexOf("C") < 0 && !gagajf.isNull(params.value) && params.data.mallGb === 'G011_10' && params.data.custNo > 0) {
-					return '<a href="javascript:void(0);" onclick=\"cfnOpenCustDetailPopup(' + params.data.custNo + ');\">' + params.data.ordNm + '</a>';
+					return '<a href="javascript:void(0);" onclick=\"cfnOpenCustDetailPopup(' + params.data.custNo + ');\">' + params.data.maskingOrdNm + '</a>';
 				} else {
-					return params.data.ordNm;
+					return params.data.maskingOrdNm;
 				}
 			}
 		},
-		{headerName: "휴대번호", 		field: "ordPhnno", 		width: 100, cellClass: 'text-center'},
-		{headerName: "수령인", 		field: "recipNm", 		width: 100, cellClass: 'text-center'},
+		{headerName: "휴대번호", 		field: "maskingOrdPhnno", 		width: 100, cellClass: 'text-center',
+			valueGetter: function (params) { return params.data.maskingOrdPhnno; }
+		},
+		{headerName: "수령인", 		field: "maskingRecipNm", 		width: 100, cellClass: 'text-center'},
 		{headerName: "공급업체", 		field: "supplyCompNm", 	width: 150, cellClass: 'text-center'},
 		{headerName: "브랜드", 		field: "supplyCompNm", 	width: 150, cellClass: 'text-center'},
 		{headerName: "상품코드", 		field: "goodsCd", 		width: 120, cellClass: 'text-center',
@@ -352,7 +354,7 @@
 		{headerName: "배송메모", 		field: "delvMemo", 		width: 200, cellClass: 'text-left'},
 		{headerName: "우편번호", 		field: "recipZipcode", 		width: 80, cellClass: 'text-center'},
 		{headerName: "기본주소", 		field: "recipBaseAddr", 	width: 200, cellClass: 'text-left'},
-		{headerName: "상세주소", 		field: "recipDtlAddr", 		width: 200, cellClass: 'text-left'},
+		{headerName: "상세주소", 		field: "maskingRecipDtlAddr", 		width: 200, cellClass: 'text-left'},
 		{headerName: "product_no", 	field: "productNo", 	width: 100, cellClass: 'text-center'},
 		{headerName: "product_code",field: "productCode", 	width: 100, cellClass: 'text-center'}
 		
@@ -421,6 +423,18 @@
 				return;
 			}
 		}
+		
+		if ($('#searchForm input[name=delvDelayDays]').val() != '') {
+			if ($('#stDate').val() == '') {
+				mcxDialog.alert('시작 기간을 입력하세요.');
+				return;
+			}
+
+			if ($('#edDate').val() == '') {
+				mcxDialog.alert('종료 기간을 입력하세요.');
+				return;
+			}
+		}
 
 		gagaPaging.init('searchForm', fnSearchCallBack, 'deliveryListPagination', $('#searchForm').find('#pageSize').val());
 	    gagaPaging.load($("#searchForm input[name=pageNo]").val());

+ 2 - 2
src/main/webapp/WEB-INF/views/display/MainContentsPopupForm.html

@@ -1023,8 +1023,8 @@
 				$("#mcTable"+tableDataId).find('.pcImg').find("#bannerPreViewUrlPop_"+pcImgIdx).attr('src', $("#uploadDefaultUrlPop").val().replace('/contents/', '')+result[0].mainPimg);
 				$("#mcTable"+tableDataId).find('.pcImg').find("#imgViewPop_"+pcImgIdx).removeClass("off").addClass("on");
 			}
-			$("#mcTable"+tableDataId).find('.mobImg').find("#bannerPreViewUrlPop_"+tableDataId).attr('src', $("#uploadDefaultUrlPop").val().replace('/contents/', '')+result[0].mainPimg);
-			$("#mcTable"+tableDataId).find('.mobImg').find("#imgViewPop_"+tableDataId).removeClass("off").addClass("on");
+			$("#mcTable"+tableDataId).find('.mobImg').find("#bannerPreViewUrlPop_100"+tableDataId).attr('src', $("#uploadDefaultUrlPop").val().replace('/contents/', '')+result[0].mainPimg);
+			$("#mcTable"+tableDataId).find('.mobImg').find("#imgViewPop_100"+tableDataId).removeClass("off").addClass("on");
 		}
 
 		let stdt = result[0].dispStdt.split(" ");

+ 11 - 11
src/main/webapp/WEB-INF/views/display/MainGnbContentsPopupForm.html

@@ -215,11 +215,11 @@
 		brandCdIdx = $("#tabTable" + tabTableRow + " #brandListTd" + callbackBrandTr + " >ul").size()
 
 		for (let i = 0; i < result.length; i++) {
-			html += '<ul id="brandUl' + brandCdIdx + '" class="item ui-state-default brandClass" style="min-height:80px;">';
+			html += '<ul id="brandUl' + brandCdIdx + '" class="item ui-state-default brandClass" style="min-height:80px;max-height:80px;">';
 			html += '	<input type="hidden" name="brandGroupNo" value="' + result[i].brandGroupNo + '">';
 			html += '	<input type="hidden" name="imgPath1" value="' + result[i].logoFileNm + '">';
 			html += '	<li class="img">';
-			html += '		<img style="height:100%;" src="' + uploadGoodsUrl + "/" + result[i].logoFileNm + '" onerror="this.src=\'/image/no.png\';"/>';
+			html += '		<img style="height:65px;" src="' + uploadGoodsUrl + "/" + result[i].logoFileNm + '" onerror="this.src=\'/image/no.png\';"/>';
 			html += '	</li>';
 			html += '	<li class="cont">';
 			html += '		<ul>';
@@ -668,13 +668,13 @@
 			html += '			<div class="sortableWrap" data-unit="7" style="overflow-y:scroll;">';
 			html += '				<div class="itemWrap ui-sortable" id="brandListTd1" data-id="1">';
 			for(let k=0; k<g1cdArr.length; k++){
-				html += '<ul id="brandUl' + k + '" class="item ui-state-default brandClass" style="min-height:80px;">';
+				html += '<ul id="brandUl' + k + '" class="item ui-state-default brandClass" style="min-height:80px;max-height:80px;">';
 				html += '	<input type="hidden" name="brandGroupNo" value="' + g1cdArr[k] + '">';
 				html += '	<li class="img">';
 				if(gagajf.isNull(g1imgArr)){
-					html += '		<img style="height:100%;" src="" onerror="this.src=\'/image/no.png\';"/>';
+					html += '		<img style="height:65px;" src="" onerror="this.src=\'/image/no.png\';"/>';
 				}else{
-					html += '		<img style="height:100%;" src="' + uploadGoodsUrl + "/" + g1imgArr[k] + '" onerror="this.src=\'/image/no.png\';"/>';
+					html += '		<img style="height:65px;" src="' + uploadGoodsUrl + "/" + g1imgArr[k] + '" onerror="this.src=\'/image/no.png\';"/>';
 				}
 				html += '	</li>';
 				html += '	<li class="cont">';
@@ -699,13 +699,13 @@
 			html += '			<div class="sortableWrap" data-unit="7" style="overflow-y:scroll;">';
 			html += '				<div class="itemWrap ui-sortable" id="brandListTd2" data-id="2">';
 			for(let m=0; m<g2cdArr.length; m++){
-				html += '<ul id="brandUl' + m + '" class="item ui-state-default brandClass" style="min-height:80px;">';
+				html += '<ul id="brandUl' + m + '" class="item ui-state-default brandClass" style="min-height:80px;max-height:80px;">';
 				html += '	<input type="hidden" name="brandGroupNo" value="' + g2cdArr[m] + '">';
 				html += '	<li class="img">';
 				if(gagajf.isNull(g2imgArr)){
-					html += '		<img style="height:100%;" src="" onerror="this.src=\'/image/no.png\';"/>';
+					html += '		<img style="height:65px;" src="" onerror="this.src=\'/image/no.png\';"/>';
 				}else{
-					html += '		<img style="height:100%;" src="' + uploadGoodsUrl + "/" + g2imgArr[m] + '" onerror="this.src=\'/image/no.png\';"/>';
+					html += '		<img style="height:65px;" src="' + uploadGoodsUrl + "/" + g2imgArr[m] + '" onerror="this.src=\'/image/no.png\';"/>';
 				}
 				html += '	</li>';
 				html += '	<li class="cont">';
@@ -730,13 +730,13 @@
 			html += '			<div class="sortableWrap" data-unit="7" style="overflow-y:scroll;">';
 			html += '				<div class="itemWrap ui-sortable" id="brandListTd3" data-id="3">';
 			for(let n=0; n<g3cdArr.length; n++){
-				html += '<ul id="brandUl' + n + '" class="item ui-state-default brandClass" style="min-height:80px;">';
+				html += '<ul id="brandUl' + n + '" class="item ui-state-default brandClass" style="min-height:80px;max-height:80px;">';
 				html += '	<input type="hidden" name="brandGroupNo" value="' + g3cdArr[n] + '">';
 				html += '	<li class="img">';
 				if(gagajf.isNull(g3imgArr)){
-					html += '		<img style="height:100%;" src="" onerror="this.src=\'/image/no.png\';"/>';
+					html += '		<img style="height:65px;" src="" onerror="this.src=\'/image/no.png\';"/>';
 				}else{
-					html += '		<img style="height:100%;" src="' + uploadGoodsUrl + "/" + g3imgArr[n] + '" onerror="this.src=\'/image/no.png\';"/>';
+					html += '		<img style="height:65px;" src="' + uploadGoodsUrl + "/" + g3imgArr[n] + '" onerror="this.src=\'/image/no.png\';"/>';
 				}
 				html += '	</li>';
 				html += '	<li class="cont">';

+ 2 - 2
src/main/webapp/WEB-INF/views/envset/AnswerPhaseForm.html

@@ -109,7 +109,7 @@
 						<th>사이트<em class="required" title="필수"></em></th>
 						<td>
 							<select name="siteCd" required="required" data-valid-name="사이트">
-								<option>[선택]</option>
+<!-- 								<option>[선택]</option> -->
 								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
 						</td>
@@ -221,7 +221,7 @@
 			$("#detailForm input:checkbox[name=chkUseYn]").parent().removeClass('checked');
 		}
 		
-		$('#detailForm input[name=ansTitle]').val(event.data.ansTitle.replaceAll('&gt;','>')); // 답변제목
+		$('#detailForm input[name=ansTitle]').val(event.data.ansTitle); // 답변제목
 		$('#detailForm textarea[name=ansContent]').val(event.data.ansContent); // 답변내용
 		$('#detailForm input[name=kakaoCd]').val(event.data.kakaoCd); // 카카오템플릿코드
 		$('#detailForm input[name=buttonNm]').val(event.data.buttonNm); // 카카오버튼명

+ 22 - 22
src/main/webapp/WEB-INF/views/envset/BasicEnvsetForm.html

@@ -122,19 +122,19 @@
 				<tbody>
 					<tr>
 						<th>탈퇴후재가입불가기간(일)</th>
-						<td><input name="c10StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="탈퇴후재가입불가기간"/><span class="cRed">일</span> 동안 탈퇴 후 재가입 불가합니다.</td>
+						<td><input name="c10StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" data-valid-name="탈퇴후재가입불가기간"/><span class="cRed">일</span> 동안 탈퇴 후 재가입 불가합니다.</td>
 					</tr>
 					<tr>
 						<th>휴면회선정기간(일)</th>
-						<td><input name="c10StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="휴면회원선정기간"/><span class="cRed">일</span> 동안 사이트에 로그인 하지 않은 회원을 휴면회원으로 선정합니다.</td>
+						<td><input name="c10StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" data-valid-name="휴면회원선정기간"/><span class="cRed">일</span> 동안 사이트에 로그인 하지 않은 회원을 휴면회원으로 선정합니다.</td>
 					</tr>
 					<tr>
 						<th>휴면회원전환기간(일)</th>
-						<td><input name="c10StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="휴면회원전환기간"/><span class="cRed">일</span> 동안 사이트에 로그인 하지 않은 회원을 휴면회원으로 전환합니다.</td>
+						<td><input name="c10StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" data-valid-name="휴면회원전환기간"/><span class="cRed">일</span> 동안 사이트에 로그인 하지 않은 회원을 휴면회원으로 전환합니다.</td>
 					</tr>
 					<tr>
 						<th>회원등급산정기간</th>
-						<td>전월 기준 최근 <input name="c10StrSetVal4" 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>
+						<td>전월 기준 최근 <input name="c10StrSetVal4" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" 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>
 				</tbody>
 			</table>
@@ -167,7 +167,7 @@
 					<tr>
 						<th>베스트상품노출개수</th>
 						<td>
-							카테고리와 아울렛의 베스트 영역에 상품이 <input name="g10StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer"/> 개 만큼만 노출됩니다.
+							카테고리와 아울렛의 베스트 영역에 상품이 <input name="g10StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger"/> 개 만큼만 노출됩니다.
 						</td>
 					</tr>
 				</tbody>
@@ -187,20 +187,20 @@
 						<td>
 							<!-- 2021-06-08 장바구니 보관 기간 30일 고정 > 지하 1층 회의실B 에서 한수인리더 확인.
 							     장바구니 20일 경과 상품 구매 알림톡 보내기 위해 수정되지 않도록 변경 -xodud1202 -->
-							장바구니 보관기간은 <input name="g11StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" readonly disabled data-valid-name="장바구니보관기간"/><span class="cRed">일</span> 입니다. 보관기간 경과 시 자동 삭제됩니다. (보관기간 30일 고정)
+							장바구니 보관기간은 <input name="g11StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" readonly disabled data-valid-name="장바구니보관기간"/><span class="cRed">일</span> 입니다. 보관기간 경과 시 자동 삭제됩니다. (보관기간 30일 고정)
 							<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> 입니다.
+							장바구니에 담을 수 있는 최대 상품 개수는 <input name="g11StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" 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> 입니다. 보관기간 경과 시 자동 삭제됩니다.
+							위시리스트 보관기간은 <input name="g11StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" 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>
@@ -219,14 +219,14 @@
 					<tr>
 						<th>미로그인 시작일(일)</th>
 						<td>
-							 <input name="g12StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="미로그인 시작일"/><span class="cRed">일</span> 입니다.
+							 <input name="g12StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" 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="g12StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="미로그인 종료일"/><span class="cRed">일</span> 입니다.
+							 <input name="g12StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" 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>
@@ -255,14 +255,14 @@
 					<tr>
 						<th>미로그인 시작일(일)</th>
 						<td>
-							 <input name="g13StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="미로그인 시작일"/><span class="cRed">일</span> 입니다.
+							 <input name="g13StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" 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="g13StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="미로그인 시작일"/><span class="cRed">일</span> 입니다.
+							 <input name="g13StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" 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>
@@ -291,14 +291,14 @@
 					<tr>
 						<th>미로그인 시작일(일)</th>
 						<td>
-							 <input name="g14StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="미로그인 시작일"/><span class="cRed">일</span> 입니다.
+							 <input name="g14StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" 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="g14StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="미로그인 시작일"/><span class="cRed">일</span> 입니다.
+							 <input name="g14StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" 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>
@@ -339,17 +339,17 @@
 					<tr>
 						<th>최소결제금액</th>
 						<td>
-							한 번의 결제 시 상품의 실결제금액이 <input name="o10StrSetVal2" type="text" class="w100 aR" maxlength="7" data-valid-type="integer" data-valid-name="최소결제금액"/> <span class="cRed">원</span> 보다 적을 경우 결제가 불가합니다.
+							한 번의 결제 시 상품의 실결제금액이 <input name="o10StrSetVal2" type="text" class="w100 aR" maxlength="7" data-valid-type="pinteger" data-valid-name="최소결제금액"/> <span class="cRed">원</span> 보다 적을 경우 결제가 불가합니다.
 						</td>
 					</tr>
 					<tr>
 						<th>무료배송비최소주문금액</th>
-						<td>최소주문금액이 <input name="o10StrSetVal3" 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>
+						<td>최소주문금액이 <input name="o10StrSetVal3" type="text" class="w100 aR" maxlength="6" data-valid-type="pinteger" data-valid-name="무료배송비최소주문금액"/> 원 이상이면 배송비가 무료입니다. <span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>이 값은 기본값이며 공급업체별로 다르게 설정할 수도 있습니다.</span></td>
 					</tr>
 					<tr>
 						<th>총알배송주문가능시간</th>
 						<td>
-							오전 <input name="o10StrSetVal4" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="총알배송주문가능시간"/> <span class="cRed">시</span> 까지 주문한 자사상품은 총알배송이 가능합니다.
+							오전 <input name="o10StrSetVal4" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" data-valid-name="총알배송주문가능시간"/> <span class="cRed">시</span> 까지 주문한 자사상품은 총알배송이 가능합니다.
 						</td>
 					</tr>
 				</tbody>
@@ -374,13 +374,13 @@
 					<tr>
 						<th>품절안내메시지자동발송기간(일)</th>
 						<td>
-							품절안내방법이 "자동"일 경우 결제완료 후 <input name="o11StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="자동품절안내메시지발송기간(일)"/><span class="cRed">일</span> 동안 출고되지 않으면 품절안내 메시지를 자동으로 발송합니다.
+							품절안내방법이 "자동"일 경우 결제완료 후 <input name="o11StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" data-valid-name="자동품절안내메시지발송기간(일)"/><span class="cRed">일</span> 동안 출고되지 않으면 품절안내 메시지를 자동으로 발송합니다.
 						</td>
 					</tr>
 					<tr>
 						<th>품절메시지자동발송기간(일)</th>
 						<td>
-							품절안내방법이 "자동"일 경우 결제완료 후 <input name="o11StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="자동품절메시지발송기간(일)"/><span class="cRed">일</span> 동안 출고되지 않으면 품절 메시지를 자동으로 발송합니다.
+							품절안내방법이 "자동"일 경우 결제완료 후 <input name="o11StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" data-valid-name="자동품절메시지발송기간(일)"/><span class="cRed">일</span> 동안 출고되지 않으면 품절 메시지를 자동으로 발송합니다.
 						</td>
 					</tr>
 				</tbody>
@@ -398,19 +398,19 @@
 					<tr>
 						<th>배송완료자동처리기간(일)</th>
 						<td>
-							<span class="cRed">배송중</span> 상태를 기준으로 <input name="d10StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="배송완료자동처리일수"/><span class="cRed">일</span> 경과 시 자동으로 배송완료로 처리합니다.
+							<span class="cRed">배송중</span> 상태를 기준으로 <input name="d10StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" data-valid-name="배송완료자동처리일수"/><span class="cRed">일</span> 경과 시 자동으로 배송완료로 처리합니다.
 						</td>
 					</tr>
 					<tr>
 						<th>구매확정자동처리기간(일)</th>
 						<td>
-							배송완료일 기준으로 <input name="d10StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="구매확정자동처리일수"/><span class="cRed">일</span> 경과 시 자동으로 구매확정 처리합니다.
+							배송완료일 기준으로 <input name="d10StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" data-valid-name="구매확정자동처리일수"/><span class="cRed">일</span> 경과 시 자동으로 구매확정 처리합니다.
 						</td>
 					</tr>
 					<tr>
 						<th>반품가능기간(일)</th>
 						<td>
-							배송완료 후 <input name="d10StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="반품가능기간"/><span class="cRed">일</span> 내에 반품 신청 및 접수가 가능합니다.
+							배송완료 후 <input name="d10StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" data-valid-name="반품가능기간"/><span class="cRed">일</span> 내에 반품 신청 및 접수가 가능합니다.
 						</td>
 					</tr>
 				</tbody>

+ 117 - 17
src/main/webapp/WEB-INF/views/envset/BenefitEnvsetForm.html

@@ -60,13 +60,13 @@
 					<tr>
 						<th>구매포인트소멸기한(일)</th>
 						<td>
-							적립일로부터 <input name="c12StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="구매포인트소멸기한(년)"/><span class="cRed">일</span> 경과 시 소멸합니다.
+							적립일로부터 <input name="c12StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" data-valid-name="구매포인트소멸기한(년)"/><span class="cRed">일</span> 경과 시 소멸합니다.
 						</td>
 					</tr>
 					<tr>
 						<th>상품평포인트소멸기한(일)</th>
 						<td>
-							적립일로부터 <input name="c12StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="상품평포인트소멸기한(년)"/><span class="cRed">일</span> 경과 시 소멸합니다.
+							적립일로부터 <input name="c12StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" data-valid-name="상품평포인트소멸기한(년)"/><span class="cRed">일</span> 경과 시 소멸합니다.
 						</td>
 					</tr>
 				</tbody>
@@ -84,56 +84,56 @@
 					<tr>
 						<th>자사상품정상포인트적립율(PC)</th>
 						<td>
-							<input name="c14StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="real" data-valid-name="자사상품정상포인트적립율(PC)"/><span class="cRed">%</span>
+							<input name="c14StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="preal" data-valid-name="자사상품정상포인트적립율(PC)"/><span class="cRed">%</span>
 							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>자사 정상상품을 PC웹에서 구매 시 적립해 줄 포인트율입니다.</span>
 						</td>
 					</tr>
 					<tr>
 						<th>자사상품정상포인트적립율(모바일)</th>
 						<td>
-							<input name="c14StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="real" data-valid-name="자사상품정상포인트적립율(모바일)"/><span class="cRed">%</span>
+							<input name="c14StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="preal" data-valid-name="자사상품정상포인트적립율(모바일)"/><span class="cRed">%</span>
 							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>자사 정상상품을 모바일에서 구매 시 적립해 줄 포인트율입니다.</span>
 						</td>
 					</tr>
 					<tr>
 						<th>자사상품이월포인트적립율(PC)</th>
 						<td>
-							<input name="c14StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="real" data-valid-name="자사상품이월포인트적립율(PC)"/><span class="cRed">%</span>
+							<input name="c14StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="preal" data-valid-name="자사상품이월포인트적립율(PC)"/><span class="cRed">%</span>
 							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>자사 이월상품을 PC웹에서 구매 시 적립해 줄 포인트율입니다.</span>
 						</td>
 					</tr>
 					<tr>
 						<th>자사상품이월포인트적립율(모바일)</th>
 						<td>
-							<input name="c14StrSetVal4" type="text" class="w50 aR" maxlength="3" data-valid-type="real" data-valid-name="자사상품이월포인트적립율(모바일)"/><span class="cRed">%</span>
+							<input name="c14StrSetVal4" type="text" class="w50 aR" maxlength="3" data-valid-type="preal" data-valid-name="자사상품이월포인트적립율(모바일)"/><span class="cRed">%</span>
 							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>자사 이월상품을 모바일에서 구매 시 적립해 줄 포인트율입니다.</span>
 						</td>
 					</tr>
 					<tr>
 						<th>입점상품정상포인트적립율(PC)</th>
 						<td>
-							<input name="c14StrSetVal5" type="text" class="w50 aR" maxlength="3" data-valid-type="real" data-valid-name="입점상품정상포인트적립율(PC)"/><span class="cRed">%</span>
+							<input name="c14StrSetVal5" type="text" class="w50 aR" maxlength="3" data-valid-type="preal" data-valid-name="입점상품정상포인트적립율(PC)"/><span class="cRed">%</span>
 							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>입점 정상상품을 PC웹에서 구매 시 적립해 줄 포인트율입니다.</span>
 						</td>
 					</tr>
 					<tr>
 						<th>입점상품정상포인트적립율(모바일)</th>
 						<td>
-							<input name="c14StrSetVal6" type="text" class="w50 aR" maxlength="3" data-valid-type="real" data-valid-name="입점상품정상포인트적립율(모바일)"/><span class="cRed">%</span>
+							<input name="c14StrSetVal6" type="text" class="w50 aR" maxlength="3" data-valid-type="preal" data-valid-name="입점상품정상포인트적립율(모바일)"/><span class="cRed">%</span>
 							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>입점 정상상품을 모바일에서 구매 시 적립해 줄 포인트율입니다.</span>
 						</td>
 					</tr>
 					<tr>
 						<th>입점상품이월포인트적립율(PC)</th>
 						<td>
-							<input name="c14StrSetVal7" type="text" class="w50 aR" maxlength="3" data-valid-type="real" data-valid-name="입점상품이월포인트적립율(PC)"/><span class="cRed">%</span>
+							<input name="c14StrSetVal7" type="text" class="w50 aR" maxlength="3" data-valid-type="preal" data-valid-name="입점상품이월포인트적립율(PC)"/><span class="cRed">%</span>
 							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>입점 이월상품을 PC웹에서 구매 시 적립해 줄 포인트율입니다.</span>
 						</td>
 					</tr>
 					<tr>
 						<th>입점상품이월포인트적립율(모바일)</th>
 						<td>
-							<input name="c14StrSetVal8" type="text" class="w50 aR" maxlength="3" data-valid-type="real" data-valid-name="입점상품이월포인트적립율(모바일)"/><span class="cRed">%</span>
+							<input name="c14StrSetVal8" type="text" class="w50 aR" maxlength="3" data-valid-type="preal" data-valid-name="입점상품이월포인트적립율(모바일)"/><span class="cRed">%</span>
 							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>입점 이월상품을 모바일에서 구매 시 적립해 줄 포인트율입니다.</span>
 						</td>
 					</tr>
@@ -152,7 +152,7 @@
 					<tr>
 						<th>상품평등록가능기간(일)</th>
 						<td>
-							상품평 등록가능 기간은 <span class="cRed">구매일</span>로부터 <input name="c15StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="상품평등록가능기간(일)"/><span class="cRed">일</span> 입니다. 등록가능기간 경과 시 등록 불가합니다.
+							상품평 등록가능 기간은 <span class="cRed">구매일</span>로부터 <input name="c15StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" data-valid-name="상품평등록가능기간(일)"/><span class="cRed">일</span> 입니다. 등록가능기간 경과 시 등록 불가합니다.
 						</td>
 					</tr>
 					<tr>
@@ -166,21 +166,21 @@
 					<tr>
 						<th>텍스트상품평포인트</th>
 						<td>
-							<input name="c15StrSetVal3" type="text" class="w100 aR" maxlength="5" data-valid-type="integer" data-valid-name="텍스트상품평포인트"/>
+							<input name="c15StrSetVal3" type="text" class="w100 aR" maxlength="5" data-valid-type="pinteger" data-valid-name="텍스트상품평포인트"/>
 							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>작성한 상품평이 텍스트일 경우 적립해 줄 포인트입니다.</span>
 						</td>
 					</tr>
 					<tr>
 						<th>포토상품평포인트</th>
 						<td>
-							<input name="c15StrSetVal4" type="text" class="w100 aR" maxlength="5" data-valid-type="integer" data-valid-name="포토상품평포인트"/>
+							<input name="c15StrSetVal4" type="text" class="w100 aR" maxlength="5" data-valid-type="pinteger" data-valid-name="포토상품평포인트"/>
 							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>작성한 상품평이 포토일 경우 적립해 줄 포인트입니다.</span>
 						</td>
 					</tr>
 					<tr>
 						<th>베스트상품평포인트</th>
 						<td>
-							<input name="c15StrSetVal5" type="text" class="w100 aR" maxlength="5" data-valid-type="integer" data-valid-name="베스트상품평포인트"/>
+							<input name="c15StrSetVal5" type="text" class="w100 aR" maxlength="5" data-valid-type="pinteger" data-valid-name="베스트상품평포인트"/>
 							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>작성한 상품평이 베스트로 선정될 경우 적립해 줄 포인트입니다.</span>
 						</td>
 					</tr>
@@ -199,20 +199,20 @@
 					<tr>
 						<th>포인트사용기준</th>
 						<td>
-							실결제액 기준 <input name="c17StrSetVal1" type="text" class="w100 aR" maxlength="7" data-valid-type="integer" data-valid-name="포인트사용기준"/> <span class="cRed">원</span> 이상일 때 포인트 사용이 가능합니다.
+							실결제액 기준 <input name="c17StrSetVal1" type="text" class="w100 aR" maxlength="7" data-valid-type="pinteger" data-valid-name="포인트사용기준"/> <span class="cRed">원</span> 이상일 때 포인트 사용이 가능합니다.
 						</td>
 					</tr>
 					<tr>
 						<th>최대사용가능포인트율(%)</th>
 						<td>
-							실결제액의 <input name="c17StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="최대사용가능포인트율"/> <span class="cRed">%</span> 까지 포인트 사용이 가능합니다.
+							실결제액의 <input name="c17StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" 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="c17StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="최대즉시사용포인트율"/> <span class="cRed">%</span> 이하로 즉시 사용할 수 있습니다.
+							포인트를 <input name="c17StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" 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>
@@ -299,6 +299,86 @@
 			params.strSetVal1 = $('input[name=c12StrSetVal1]').val();
 			params.strSetVal2 = $('input[name=c12StrSetVal2]').val();
 		} else if (envsetType == 'C14') { // 구매포인트
+			if ($('input[name=c14StrSetVal1]').val() > 100) {
+				mcxDialog.alertC('자사상품정상포인트적립율(PC)은 최대 100 이하로 입력해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('input[name=c14StrSetVal1]').focus();
+					}
+				});
+				return;
+			}
+		
+			if ($('input[name=c14StrSetVal2]').val() > 100) {
+				mcxDialog.alertC('자사상품정상포인트적립율(모바일)은 최대 100 이하로 입력해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('input[name=c14StrSetVal2]').focus();
+					}
+				});
+				return;
+			}
+			
+			if ($('input[name=c14StrSetVal3]').val() > 100) {
+				mcxDialog.alertC('자사상품이월포인트적립율(PC)은 최대 100 이하로 입력해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('input[name=c14StrSetVal3]').focus();
+					}
+				});
+				return;
+			}
+			
+			if ($('input[name=c14StrSetVal4]').val() > 100) {
+				mcxDialog.alertC('자사상품이월포인트적립율(모바일)은 최대 100 이하로 입력해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('input[name=c14StrSetVal4]').focus();
+					}
+				});
+				return;
+			}
+			
+			if ($('input[name=c14StrSetVal5]').val() > 100) {
+				mcxDialog.alertC('입점상품정상포인트적립율(PC)은 최대 100 이하로 입력해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('input[name=c14StrSetVal5]').focus();
+					}
+				});
+				return;
+			}
+		
+			if ($('input[name=c14StrSetVal6]').val() > 100) {
+				mcxDialog.alertC('입점상품정상포인트적립율(모바일)은 최대 100 이하로 입력해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('input[name=c14StrSetVal6]').focus();
+					}
+				});
+				return;
+			}
+			
+			if ($('input[name=c14StrSetVal7]').val() > 100) {
+				mcxDialog.alertC('입점상품이월포인트적립율(PC)은 최대 100 이하로 입력해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('input[name=c14StrSetVal7]').focus();
+					}
+				});
+				return;
+			}
+			
+			if ($('input[name=c14StrSetVal8]').val() > 100) {
+				mcxDialog.alertC('입점상품이월포인트적립율(모바일)은 최대 100 이하로 입력해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('input[name=c14StrSetVal8]').focus();
+					}
+				});
+				return;
+			}
+		
 			params.envsetNm = '구매포인트';
 			params.strSetVal1 = $('input[name=c14StrSetVal1]').val();
 			params.strSetVal2 = $('input[name=c14StrSetVal2]').val();
@@ -316,6 +396,26 @@
 			params.strSetVal4 = $('input[name=c15StrSetVal4]').val().removeComma();
 			params.strSetVal5 = $('input[name=c15StrSetVal5]').val().removeComma();
 		} else if (envsetType == 'C17') { // 포인트사용
+			if ($('input[name=c17StrSetVal2]').val() > 100) {
+				mcxDialog.alertC('최대사용가능포인트율(%)은 최대 100 이하로 입력해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('input[name=c17StrSetVal2]').focus();
+					}
+				});
+				return;
+			}
+		
+			if ($('input[name=c17StrSetVal3]').val() > 100) {
+				mcxDialog.alertC('최대즉시사용포인트율(%)은 최대 100 이하로 입력해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('input[name=c17StrSetVal3]').focus();
+					}
+				});
+				return;
+			}
+			
 			params.envsetNm = '포인트사용';
 			params.strSetVal1 = $('input[name=c17StrSetVal1]').val().removeComma();
 			params.strSetVal2 = $('input[name=c17StrSetVal2]').val();

+ 4 - 4
src/main/webapp/WEB-INF/views/envset/CustomerGradePolicyForm.html

@@ -96,17 +96,17 @@
 					<tr>
 						<th>등급산정기간<em class="required" title="필수"></em></th>
 						<td colspan="5">
-							전월 기준 최근 <input type="text" name="calMonths" class="w50 aR" maxlength="2" value="3" required="required" data-valid-type="integer" data-valid-name="등급산정기간"/> 개월
+							전월 기준 최근 <input type="text" name="calMonths" class="w50 aR" maxlength="2" value="3" required="required" data-valid-type="pinteger" data-valid-name="등급산정기간"/> 개월
 						</td>
 					</tr>
 					<tr>
 						<th>승급조건<em class="required" title="필수"></em></th>
 						<td colspan="7">
 							구매금액(<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>쿠폰할인, 포인트할인, 배송비, 취소/반품내역을 반영한 실결제금액</span>)
-							<input type="text" name="minBuyAmt" class="w100 aR" maxlength="10" value="0" required="required" data-valid-type="integer" data-valid-name="구매금액"/>원 <span class="cRed">이상</span>
+							<input type="text" name="minBuyAmt" class="w100 aR" maxlength="10" value="0" required="required" data-valid-type="pinteger" data-valid-name="구매금액"/>원 <span class="cRed">이상</span>
 							<span class="infoTxt cRed"><strong>또는</strong></span>
-							주문당 <input type="text" name="buyExceptAmt" class="w100 aR" maxlength="10" value="0" required="required" data-valid-type="integer" data-valid-name="구매건수제외조건"/>원 <span class="cRed">미만 구매건을 제외</span>한 구매건수(<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>취소를 반영한 주문건수</span>)
-							<input type="text" name="minBuyCnt" class="w50 aR" maxlength="2" value="0" required="required" data-valid-type="integer" data-valid-name="구매건수"/>건 <span class="cRed">이상</span>
+							주문당 <input type="text" name="buyExceptAmt" class="w100 aR" maxlength="10" value="0" required="required" data-valid-type="pinteger" data-valid-name="구매건수제외조건"/>원 <span class="cRed">미만 구매건을 제외</span>한 구매건수(<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>취소를 반영한 주문건수</span>)
+							<input type="text" name="minBuyCnt" class="w50 aR" maxlength="2" value="0" required="required" data-valid-type="pinteger" data-valid-name="구매건수"/>건 <span class="cRed">이상</span>
 						</td>
 					</tr>
 					<tr>

+ 40 - 38
src/main/webapp/WEB-INF/views/goods/FreeGoodsSearchForm.html

@@ -23,46 +23,48 @@
 		</div>
 		<!-- //TITLE -->
 
-		<!-- 검색 조건 -->
-		<div class="panelContent">
-			<form id="searchCompanyListForm" name="searchCompanyListForm" action="#" th:action="@{'/goods/freeGoods/list'}" onsubmit="$('#btnSearchFreeGoodsList').trigger('click'); return false;">
-				<table class="frmStyle" aria-describedby="검색조건">
-					<colgroup>
-						<col style="width:15%;"/>
-						<col/>
-					</colgroup>
-					<tbody>
-					<tr>
-						<th>검색어 지정</th>
-						<td>
-							<label class="rdoBtn"><input type="radio" name="search" value="searchProductNo" checked/>사은품코드</label>
-							<label class="rdoBtn"><input type="radio" name="search" value="searchGoodsNm"/>품번</label>
-							<textarea name="condition" style="height:75px;"></textarea>
-						</td>
-					</tr>
-					</tbody>
-				</table>
-				<ul class="panelBar">
-					<li class="center">
-						<button type="button" class="btn btn-base btn-lg" id="btnSearchFreeGoodsList">조회</button>
-					</li>
-				</ul>
-			</form>
-		</div>
-		<!-- //검색 조건 -->
+		<div style="overflow-y:auto;height:34vw;margin:10px 0px;padding:0px 10px;">
+			<!-- 검색 조건 -->
+			<div class="panelContent">
+				<form id="searchCompanyListForm" name="searchCompanyListForm" action="#" th:action="@{'/goods/freeGoods/list'}" onsubmit="$('#btnSearchFreeGoodsList').trigger('click'); return false;">
+					<table class="frmStyle" aria-describedby="검색조건">
+						<colgroup>
+							<col style="width:15%;"/>
+							<col/>
+						</colgroup>
+						<tbody>
+						<tr>
+							<th>검색어 지정</th>
+							<td>
+								<label class="rdoBtn"><input type="radio" name="search" value="searchProductNo" checked/>사은품코드</label>
+								<label class="rdoBtn"><input type="radio" name="search" value="searchGoodsNm"/>품번</label>
+								<textarea name="condition" style="height:75px;"></textarea>
+							</td>
+						</tr>
+						</tbody>
+					</table>
+					<ul class="panelBar">
+						<li class="center">
+							<button type="button" class="btn btn-base btn-lg" id="btnSearchFreeGoodsList">조회</button>
+						</li>
+					</ul>
+				</form>
+			</div>
+			<!-- //검색 조건 -->
 
-		<!-- 리스트 영역 -->
-		<div class="panelContent">
-			<div id="freeGoodsSearchList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
-		</div>
-		<!-- //리스트 영역 -->
+			<!-- 리스트 영역 -->
+			<div class="panelContent">
+				<div id="freeGoodsSearchList" 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="btnConfirmFreeGoods">확인</button>
-			</li>
-		</ul>
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-info btn-lg" id="btnConfirmFreeGoods">확인</button>
+				</li>
+			</ul>
+		</div>
 	</div>
 
 	<script th:inline="javascript">

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

@@ -329,7 +329,7 @@
 									<tr>
 										<th>PC포인트<em class="required" title="필수"></em></th>
 										<td>
-											<input type="text" class="w50 aR" id="pntPrate" name="pntPrate" data-valid-type="numeric" maxlength="3"/> % /&nbsp;
+											<input type="text" class="w50 aR" id="pntPrate" name="pntPrate" data-valid-type="preal" maxlength="3"/> % /&nbsp;
 											<input type="hidden" id="pntPrateOrg" name="pntPrateOrg"/>
 											<label class="rdoBtn"><input type="radio" name="prePpntUsableYn" id="prePpntUsableYnY" value="Y"/>Y</label>
 											<label class="rdoBtn"><input type="radio" name="prePpntUsableYn" id="prePpntUsableYnN" value="N"/>N</label>
@@ -337,7 +337,7 @@
 										</td>
 										<th>모바일포인트<em class="required" title="필수"></em></th>
 										<td>
-											<input type="text" class="w50 aR" id="pntMrate" name="pntMrate" data-valid-type="numeric" maxlength="3"/> % /&nbsp;
+											<input type="text" class="w50 aR" id="pntMrate" name="pntMrate" data-valid-type="preal" maxlength="3"/> % /&nbsp;
 											<input type="hidden" id="pntMrateOrg" name="pntMrateOrg"/>
 											<label class="rdoBtn"><input type="radio" name="preMpntUsableYn" id="preMpntUsableYnY" value="Y"/>Y</label>
 											<label class="rdoBtn"><input type="radio" name="preMpntUsableYn" id="preMpntUsableYnN" value="N"/>N</label>
@@ -1096,7 +1096,8 @@
 			$('#goodsDetailForm input[name=sellEdYMD]').val(result.sellEddt.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD") );
 			$('#goodsDetailForm input[name=sellEdHH]').val(result.sellEddt.toDate("YYYYMMDDHHmmss").format("HH") );
 			
-			cfnCreateCombo('/renderer/delvFee/list/' + result.supplyCompCd, $('#goodsDetailForm select[name=delvFeeCd]'), "[선택]", result.delvFeeCd);
+			//cfnCreateCombo('/renderer/delvFee/list/' + result.supplyCompCd, $('#goodsDetailForm select[name=delvFeeCd]'), "[선택]", result.delvFeeCd);
+			cfnCreateDelvPolicyCombo( result.supplyCompCd, $('#goodsDetailForm select[name=delvFeeCd]'), "[선택]", result.delvFeeCd);
 			$('#goodsDetailForm input[name=delvFeeCdOrg]').val(result.delvFeeCd);
 			cfnCreateCombo('/renderer/delvloc/list/' + result.supplyCompCd, $('#goodsDetailForm select[name=delvLocCd]'), "[선택]", result.delvLocCd);
 			$('#goodsDetailForm input[name=delvLocCdOrg]').val(result.delvLocCd);
@@ -2544,6 +2545,20 @@
 		});
 	});
 	
+	//배송비정책변경시
+	$('#goodsDetailForm select[name=delvFeeCd]').on('change', function() {
+		var delvFeeCd = $("#goodsDetailForm select[name=delvFeeCd]").val();
+		
+		if (gagajf.isNull(delvFeeCd)){
+			$("#goodsDetailForm input[name=delvFee]").val('');
+			$("#goodsDetailForm input[name=minOrdAmt]").val('');
+		}else{
+			
+			var obj = $('#goodsDetailForm select[name=delvFeeCd] option:selected');
+			$("#goodsDetailForm input[name=delvFee]").val(obj.attr("delvFee").addComma());
+			$("#goodsDetailForm input[name=minOrdAmt]").val(obj.attr("minOrdAmt").addComma());
+		}
+	});	
 
 	//품목코드변경시
 	$('#goodsDetailForm select[name=itemkindCd]').on('change', function() {

+ 50 - 15
src/main/webapp/WEB-INF/views/goods/GoodsItemkindForm.html

@@ -23,7 +23,7 @@
 		<!-- 메뉴 설명 -->
 		<div class="infoBox menu-desc">
 		</div>
-		<form id="searchForm" name="searchForm" action="#" th:action="@{'/goods/list'}">
+		<form id="searchForm" name="searchForm" action="#" th:action="@{'/goods/list'}" onsubmit="return false;">
 		<input type="hidden" id="searchGb" name="searchGb" />
  		<!-- 패널 영역1 -->
 		<div class="panelStyle" >
@@ -85,24 +85,31 @@
 							<span id="brandText"></span>
 							<input type="hidden" name="brandList"/>
 						</td>
-						<th>키워드</th>
-						<td>
+						<th rowspan="3">키워드</th>
+						<td rowspan="3">
 							<select name="search" id="search">
 								<option value="searchGoodsCd">상품코드</option>
 								<option value="searchGoodsNm">상품명</option>
 								<option value="searchGoodsNum">품번</option>
 								<option value="searchSupplyGoodsCd">업체상품코드</option>
 							</select>
-							<input type="text" class="w40p" name="condition" id="condition" maxlength="50"/>
+							<textarea class="textareaR3 w50p" name="condition" id="condition"></textarea>
 						</td>
 						
 					</tr>
 					<tr>
 					<th>품목</th>
-						<td colspan="5">
-							<select name="itemkindCd" id="itemkindCdSearch">
+						<td>
+							<input type="text" class="w100" name="itemkindSearchTxt" id="itemkindSearchTxt" maxlength="20" />
+							<button type="button" class="btn icn" id="btnSearchItemkind"><i class="fa fa-search"></i></button>
+							<span id="itemkindText"></span>
+							<input type="hidden" name="itemkindList"/>
+						</td>
+						<th>담당MD</th>
+						<td>
+							<select  name="mdNo" id="mdNo">
 								<option value="">[전체]</option>
-								<option th:if="${itemkindList}" th:each="oneData, status : ${itemkindList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+								<option th:if="${brandMdList}" th:each="oneData, status : ${brandMdList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
 							</select>
 						</td>
 					</tr>
@@ -125,13 +132,7 @@
 								<option th:if="${formalGbList}" th:each="oneData, status : ${formalGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
 						</td>
-						<th>담당MD</th>
-						<td>
-							<select  name="mdNo" id="mdNo">
-								<option value="">[전체]</option>
-								<option th:if="${brandMdList}" th:each="oneData, status : ${brandMdList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
-							</select>
-						</td>
+						
 					</tr>
 				</table>
 				<ul class="panelBar">
@@ -272,9 +273,13 @@
 
 	// 조회
 	$('#btnSearch').on('click', function() {
-		if(gagajf.isNull($("#selCate2").val()) && gagajf.isNull($("#supplyCompCd").val()) && gagajf.isNull($("#condition").val()) && gagajf.isNull($("#itemkindCdSearch").val())
+		
+		if (event.keyCode === 13) return false;
+		
+		if(gagajf.isNull($("#selCate2").val()) && gagajf.isNull($("#supplyCompCd").val()) && gagajf.isNull($("#condition").val()) 
 			&& gagajf.isNull($("#styleYear").val()) && gagajf.isNull($("#formalGb").val()) && gagajf.isNull($("#mdNo").val())
 			&& gagajf.isNull($("#searchForm input[name=supplyCompList]").val()) && gagajf.isNull($("#searchForm input[name=brandList]").val())
+			&& gagajf.isNull($("#searchForm input[name=itemkindList]").val())
 			){
 			mcxDialog.alert('검색조건을 입력해 주세요.');
 			return;
@@ -330,6 +335,8 @@
 		$('#searchForm input[name=supplyCompList]').val('');
 		$('#searchForm').find('#brandText').html('');
 		$('#searchForm').find('#supplyCompText').html('');
+		$('#searchForm input[name=itemkindList]').val('');
+		$('#searchForm').find('#itemkindText').html('');
 	});
 
 	$("#btnChangeItemKindCd").on("click", function(){
@@ -405,6 +412,34 @@
 		cfnOpenBrandListPopup('fnSetBrandInfo', 'M');
 	});
 	
+	// 품목 조회 선택시
+	$('#btnSearchItemkind').on('click', function() {
+		cfnOpenItemkindListPopup('fnSetItemkindInfo', 'M');
+	});
+	
+	// 품목 조회 팝업에서 호출
+	var fnSetItemkindInfo = function(result) {
+		var arrItemkind = [];
+		var itemkindText = "";
+		var sIndex = 0;
+		$('#searchForm').find('#itemkindText').html('');
+		$('#searchForm input[name=itemkindSearchTxt]').val('');
+		result.forEach(function(itemkind){
+			sIndex++; 
+			arrItemkind.push(itemkind.itemkindCd);
+		});
+
+		// 조회값이 하나일 경우 화면에 코드 노출 그외는 갯수 처리 
+		if (sIndex == 1) {
+			$('#searchForm input[name=itemkindSearchTxt]').val(arrItemkind[0]);
+		}else{
+			itemkindText = sIndex + " 개";
+			$('#searchForm').find('#itemkindText').html(itemkindText);	
+		}
+		var jsonData = JSON.stringify(arrItemkind);
+		$("#searchForm input[name=itemkindList]").val(jsonData);
+	}
+	
 	$("#btnSave").on("click", function(){
 		var rowData = gagaAgGrid.getAllRowData(gridOptions);
 		var dataArr = [];

+ 57 - 52
src/main/webapp/WEB-INF/views/goods/GoodsListForm.html

@@ -58,19 +58,11 @@
 							<button type="button" class="btn icn" id="btnSearchSupplyComp"><i class="fa fa-search"></i></button>
 							<span id="supplyCompText"></span>
 							<input type="hidden" name="supplyCompList"/>
-							<!-- <label class="rdoBtn"><input type="radio" name="selfYn" id="selfYnY" value="Y"  checked/>자사</label>
-							<label class="rdoBtn"><input type="radio" name="selfYn" id="selfYnN" value="N"/>입점</label>
-							<select name="supplyCompCd" id="supplyCompCd">
-								<option value="" th:if="${sessionInfo.roleCd} != 'G001_B000'">[전체]</option>
-								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-							<span id="multiBrand"></span> -->
 						</td>
 						<th>브랜드<em class="required" title="필수"></em></th>
 						<td>
 							<input type="text" class="w100" name="searchTxt" id="searchTxt" maxlength="20" />
 							<button type="button" class="btn icn" id="btnSearchBrand"><i class="fa fa-search"></i></button>
-							<!-- <input type="text" class="w100" name="brandCd" readonly="readonly"/> -->
 							<span id="brandText"></span>
 							<input type="hidden" name="brandList"/>
 						</td>
@@ -95,13 +87,18 @@
 					<tr>
 						<th>품목</th>
 						<td>
-							<div class="multiCheckBox"  style="width:300px">
+							<!-- <div class="multiCheckBox"  style="width:300px">
 								<button type="button" class="sltBtn" data-name="[전체]">[전체]</button>
 								<ul style="overflow:auto; height:170px;" id="grpItemkind">
 									<li><label class="chkBox" onclick="uifnAllCheck(this,'grpItemkind')"><input type="checkbox" name="전체선택" >전체선택</label></li>
 									<li th:if="${itemkindList}" th:each="oneData, status : ${itemkindList}"><label class="chkBox" data-group="grpItemkind"><input type="checkbox" name="multiItemkindCd" th:id="${'itemkindCd' + oneData.cd}" th:value="${oneData.cd}" ><th:block th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></th:block></label></li>
 								</ul>
-							</div>
+							</div> -->
+							
+							<input type="text" class="w100" name="itemkindSearchTxt" id="itemkindSearchTxt" maxlength="20" />
+							<button type="button" class="btn icn" id="btnSearchItemkind"><i class="fa fa-search"></i></button>
+							<span id="itemkindText"></span>
+							<input type="hidden" name="itemkindList"/>
 						</td>
 						<th>상품상태</th>
 						<td>
@@ -124,14 +121,6 @@
 					<tr>
 						<th>년도/시즌</th>
 						<td>
-							<!-- <select  name="styleYear" id="styleYear">
-								<option value="">[전체]</option>
-								<option th:if="${styleYearList}" th:each="oneData, status : ${styleYearList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-							<select  name="seasonCd" id="seasonCd">
-								<option value="">[전체]</option>
-								<option th:if="${seasonList}" th:each="oneData, status : ${seasonList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select> -->
 							<div class="multiCheckBox" style="width:140px;">
 								<button type="button" class="sltBtn" data-name="[전체]">[전체]</button>
 								<ul style="overflow:auto; height:140px" id="grpStyle">
@@ -192,10 +181,6 @@
 								<option value="">[전체]</option>
 								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
-							<!-- <label class="chkBox"><input type="checkbox" name="returnableYn" value="Y"/>반품가능</label>
-							<label class="chkBox"><input type="checkbox" name="changeableYn" value="Y"/>교환가능</label>
-							<label class="chkBox"><input type="checkbox" name="returnFeeFreeYn" value="Y"/>무료반품</label>
-							<label class="chkBox"><input type="checkbox" name="changeFeeFreeYn" value="Y"/>무료교환</label> -->
 						</td>
 						<th>담당MD</th>
 						<td>
@@ -353,12 +338,12 @@
 							</td>
 							<th>PC포인트</th>
 							<td>
-								<input type="text" class="w100 aR" id="pntPrateC" name="pntPrateC" data-valid-type="numeric" maxlength="3"/> %
+								<input type="text" class="w100 aR" id="pntPrateC" name="pntPrateC" data-valid-type="preal" maxlength="4"/> %
 								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('pntPrate')" >적용</button>
 							</td>
 							<th>모바일포인트</th>
 							<td>
-								<input type="text" class="w100 aR" id="pntMrateC" name="pntMrateC" data-valid-type="numeric" maxlength="3"/> %
+								<input type="text" class="w100 aR" id="pntMrateC" name="pntMrateC" data-valid-type="preal" maxlength="4"/> %
 								<button type="button" class="btn btn-dark btn-sm" onclick="fnChangeGoodsState('pntMrate')" >적용</button>
 							</td>
 						</tr>
@@ -376,13 +361,6 @@
 							<td colspan="3">
 								<input type="text" class="w100" name="statSupplyCompCd" id="statSupplyCompCd" maxlength="20" />
 								<button type="button" class="btn icn" id="btnSearchSupplyCompStat"><i class="fa fa-search"></i></button>
-								
-							<!-- 	<label class="rdoBtn"><input type="radio" name="statSelfYn" id="statSelfYnY" value="Y"  checked/>자사</label>
-								<label class="rdoBtn"><input type="radio" name="statSelfYn" id="statSelfYnN" value="N"/>입점</label>
-								<select name="statSupplyCompCd" id="statSupplyCompCd">
-									<option value="" th:if="${sessionInfo.roleCd} != 'G001_B000'">[선택]</option>
-									<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-								</select> -->
 								<select name="delvFeeCdC" id="delvFeeCdC" >
 									<option value="">[선택]</option>
 								</select>
@@ -402,7 +380,7 @@
 							<th>판매일시</th>
 							<td colspan="7">
 								<input name="sellStYMDC" id="sellStYMDC" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="판매시작일" />
-								<select name="sellStHHC" id="sellStHCHC" required="required" data-valid-name="판매 시작시간">
+								<select name="sellStHHC" id="sellStHHC" required="required" data-valid-name="판매 시작시간">
 									<th:block th:each="num, index  : ${#numbers.sequence(0,23)}">
 									<option  th:value="${#numbers.formatInteger(num,2)}" th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="${#numbers.formatInteger(num,2)}==0 ? 'true'">시간</option>
 									</th:block>
@@ -486,6 +464,7 @@
 			valueFormatter: function (params) { return gagaAgGrid.lookupValue(seasonList, params.value); },
 			valueParser: function (params) { return gagaAgGrid.lookupKey(seasonList, params.newValue); }
 		},
+		{headerName: "수수료율", field: "sellFeeRate" , width: 80, cellClass: 'text-center'},
 		{headerName: "정상가", field: "listPrice" , width: 100, cellClass: 'text-right'
 			,valueFormatter: function(params) {return params.value.addComma();},
 			cellEditor: 'textCellEditor',
@@ -496,7 +475,6 @@
 			cellEditor: 'textCellEditor',
 			cellEditorParams: { maxlength: 14, validType: 'numeric'}
 		},
-		/*{headerName: "할인율", field: "dcRate" , width: 90, cellClass: 'text-right'},*/
 		{headerName: "자사즉시할인가", field: "benefitPrice" , width: 120, cellClass: 'text-right'
 			,valueFormatter: function(params) {
 				if (params.value > 0) {
@@ -568,9 +546,11 @@
 		$("#searchForm input[type=radio][checked]").parent("label").addClass("checked");
 		$("#multiBrand").empty();
 		$('#searchForm input[name=brandList]').val('');
-		$('#searchForm input[name=supplyCompList]').val('');
 		$('#searchForm').find('#brandText').html('');
+		$('#searchForm input[name=supplyCompList]').val('');
 		$('#searchForm').find('#supplyCompText').html('');
+		$('#searchForm input[name=itemkindList]').val('');
+		$('#searchForm').find('#itemkindText').html('');
 		
 		$(document).find('#searchForm').find(".multiCheckBox").each(function(i, e){
 			let btnNm = $(this).find(".sltBtn").attr("data-name");
@@ -686,20 +666,7 @@
 				return false;
 			}
 		}
-
-/* 		if (!gagajf.isNull($('#searchForm input[name=supplyCompList]').val())){
-			var jsonData = JSON.parse($('#searchForm input[name=supplyCompList]').val()); 
-			if (jsonData.length > 500){
-				mcxDialog.alertC("키워드 조회값을 500 이하로 조회 하세요.", {
-					sureBtnText: "확인",
-					sureBtnClick: function() {
-						$('#searchForm textarea[name=condition]').focus();
-					}
-				});
-				return false;
-			}
-		}
- */		
+	
 		if (!gagajf.isNull($('#searchForm textarea[name=condition]').val())){
 			var arrData = $('#searchForm textarea[name=condition]').val().replace(/\r\n/g,"\n").split("\n"); 
 			if (arrData.length > 500){
@@ -819,6 +786,19 @@
 				});	
 				return false;
 			}
+			
+			var fromDate = $("#searchForm input[name=sellStYMDC]").val().replaceAll('-', '')+ $("#searchForm select[name=sellStHHC]").val();
+			var toDate = $("#searchForm input[name=sellEdYMDC]").val().replaceAll('-', '')+ $("#searchForm select[name=sellEdHHC]").val();
+
+			if (fromDate > toDate) {
+				mcxDialog.alertC("판매기간의 시작일시는 종료일시 보다 클 수 없습니다.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#searchForm input[name=sellStYMDC]').focus();
+					}
+				});
+				return false;
+			}
 
 		}else{
 			if (gagajf.isNull($(objId).val())){
@@ -1036,8 +1016,6 @@
 		}
 	}
 	
-	
-	
 	//세트상품구성 클릭 시
 	$('#btnGoodsSetMake').click(function(e) {
 		cfnOpenGoodsSetPopup();
@@ -1145,6 +1123,33 @@
 		cfnOpenBrandListPopup('fnSetBrandInfo', 'M');
 	});
 	
+	// 품목 조회 선택시
+	$('#btnSearchItemkind').on('click', function() {
+		cfnOpenItemkindListPopup('fnSetItemkindInfo', 'M');
+	});
+	
+	// 품목 조회 팝업에서 호출
+	var fnSetItemkindInfo = function(result) {
+		var arrItemkind = [];
+		var itemkindText = "";
+		var sIndex = 0;
+		$('#searchForm').find('#itemkindText').html('');
+		$('#searchForm input[name=itemkindSearchTxt]').val('');
+		result.forEach(function(itemkind){
+			sIndex++; 
+			arrItemkind.push(itemkind.itemkindCd);
+		});
+
+		// 조회값이 하나일 경우 화면에 코드 노출 그외는 갯수 처리 
+		if (sIndex == 1) {
+			$('#searchForm input[name=itemkindSearchTxt]').val(arrItemkind[0]);
+		}else{
+			itemkindText = sIndex + " 개";
+			$('#searchForm').find('#itemkindText').html(itemkindText);	
+		}
+		var jsonData = JSON.stringify(arrItemkind);
+		$("#searchForm input[name=itemkindList]").val(jsonData);
+	}
 	
 	// 상태일괄변경 - 배송정책 
 	$('#btnSearchSupplyCompStat').on('click', function() {
@@ -1161,9 +1166,9 @@
 			sIndex++; 
 			arrSupplyComp.push(supplyComp.supplyCompCd);
 		});
-		
+
 		$('#searchForm input[name=statSupplyCompCd]').val(arrSupplyComp[0]);
-		cfnCreateCombo('/renderer/delvFee/list/' + $('#searchForm input[name=statSupplyCompCd]').val(), $('#searchForm select[name=delvFeeCdC]'), "[선택]");
+		cfnCreateDelvPolicyCombo( $('#searchForm input[name=statSupplyCompCd]').val(), $('#searchForm select[name=delvFeeCdC]'), "[선택]");
 	}
 	
 	// 상품이미지 미리보기 레이어에서 창 종료 이벤트

+ 32 - 7
src/main/webapp/WEB-INF/views/goods/GoodsPopupListForm.html

@@ -78,13 +78,10 @@
 				<tr>
 					<th>품목</th>
 					<td>
-						<div class="multiCheckBox"  style="width:300px">
-							<button type="button" class="sltBtn" data-name="[전체]">[전체]</button>
-							<ul style="overflow:auto; height:170px;" id="grpPItemkind">
-								<li><label class="chkBox" onclick="uifnAllCheck(this,'grpPItemkind')"><input type="checkbox" name="전체선택" >전체선택</label></li>
-								<li th:if="${itemkindList}" th:each="oneData, status : ${itemkindList}"><label class="chkBox" data-group="grpPItemkind"><input type="checkbox" name="multiItemkindCd" th:id="${'itemkindCd' + oneData.cd}" th:value="${oneData.cd}" ><th:block th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></th:block></label></li>
-							</ul>
-						</div>
+						<input type="text" class="w100" name="itemkindSearchTxt" id="itemkindSearchTxt" maxlength="20" />
+						<button type="button" class="btn icn" id="btnPopupSearchItemkind"><i class="fa fa-search"></i></button>
+						<span id="itemkindText"></span>
+						<input type="hidden" name="itemkindList"/>
 					</td>
 					<th>상품상태</th>
 					<td>
@@ -619,7 +616,35 @@
 		cfnOpenBrandListPopup('fnSetPopupBrandInfo', 'M');
 		
 	});
+	
+	// 품목 조회 선택시
+	$('#btnPopupSearchItemkind').on('click', function() {
+		cfnOpenItemkindListPopup('fnSetPopupItemkindInfo', 'M');
+	});
+	
+	// 품목 조회 팝업에서 호출
+	var fnSetPopupItemkindInfo = function(result) {
+		var arrItemkind = [];
+		var itemkindText = "";
+		var sIndex = 0;
+		$('#goodsPopupForm').find('#itemkindText').html('');
+		$('#goodsPopupForm input[name=itemkindSearchTxt]').val('');
+		result.forEach(function(itemkind){
+			sIndex++; 
+			arrItemkind.push(itemkind.itemkindCd);
+		});
 
+		// 조회값이 하나일 경우 화면에 코드 노출 그외는 갯수 처리 
+		if (sIndex == 1) {
+			$('#goodsPopupForm input[name=itemkindSearchTxt]').val(arrItemkind[0]);
+		}else{
+			itemkindText = sIndex + " 개";
+			$('#goodsPopupForm').find('#itemkindText').html(itemkindText);	
+		}
+		var jsonData = JSON.stringify(arrItemkind);
+		$("#goodsPopupForm input[name=itemkindList]").val(jsonData);
+	}
+	
 	$(document).ready(function() {
 		cfnCreateCalendar('#sellTermsP', 'stDate', 'edDate', true, '등록일', 'X');
 

+ 6 - 5
src/main/webapp/WEB-INF/views/goods/GoodsSalfRegisterForm.html

@@ -661,7 +661,8 @@
 		
 		//배송지 정책
 		$("#goodsDetailForm select[name=delvFeeCd] option:gt(0)").remove();
-		cfnCreateCombo("/renderer/delvFee/list/" + supplyCompCd, $('#goodsDetailForm select[name=delvFeeCd]'), "[선택]", '');
+		cfnCreateDelvPolicyCombo( supplyCompCd, $('#goodsDetailForm select[name=delvFeeCd]'), "[선택]");
+		//cfnCreateCombo("/renderer/delvFee/list/" + supplyCompCd, $('#goodsDetailForm select[name=delvFeeCd]'), "[선택]", '');
 		
 		//출고처
 		$("#goodsDetailForm select[name=delvLocCd] option:gt(0)").remove();
@@ -691,10 +692,10 @@
 			$("#goodsDetailForm input[name=delvFee]").val('');
 			$("#goodsDetailForm input[name=minOrdAmt]").val('');
 		}else{
-			var arrDelvFeeed = $('#goodsDetailForm select[name=delvFeeCd] option:selected').text().split('/');
-			$("#goodsDetailForm input[name=delvFee]").val(arrDelvFeeed[1].addComma());
-			var minOrdAmt = arrDelvFeeed[0].split(']');
-			$("#goodsDetailForm input[name=minOrdAmt]").val(minOrdAmt[1].addComma());
+			
+			var obj = $('#goodsDetailForm select[name=delvFeeCd] option:selected');
+			$("#goodsDetailForm input[name=delvFee]").val(obj.attr("delvFee").addComma());
+			$("#goodsDetailForm input[name=minOrdAmt]").val(obj.attr("minOrdAmt").addComma());
 		}
 	});	
 	

+ 15 - 12
src/main/webapp/WEB-INF/views/goods/GoodsSupplyPriceForm.html

@@ -32,13 +32,13 @@
 			<div class="panelContent">
 				<table class="frmStyle">
 					<colgroup>
-						<col width="10%"/>
-						<col width="15%"/>
-						<col width="10%"/>
-						<col width="15%"/>
-						<col width="10%"/>
-						<col width="15%"/>
-						<col width="10%"/>
+						<col width="8%"/>
+						<col width="17%"/>
+						<col width="8%"/>
+						<col width="17%"/>
+						<col width="8%"/>
+						<col width="20%"/>
+						<col width="8%"/>
 						<col />
 					</colgroup>
 					<tr>
@@ -64,10 +64,6 @@
 							<span id="brandText"></span>
 							<input type="hidden" name="brandList"/>
 						</td>
-						<th>상품코드<em class="required" title="필수"></em></th>
-						<td>
-							<input type="text" class="w150" name="goodsCd" id="goodsCd" maxlength="50"/>
-						</td>
 						<th>승인여부</th>
 						<td>
 							<select  name="cfrmYn" id="cfrmYn">
@@ -75,6 +71,11 @@
 								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
 						</td>
+						<th rowspan="2">상품코드<em class="required" title="필수"></em></th>
+						<td rowspan="2">
+							<input type="hidden" name="search" value="searchGoodsCd"/>
+							<textarea class="textareaR2 w70p" name="condition" id="condition"></textarea>
+						</td>
 					</tr>
 					<tr>
 						<th>발생일<em class="required" title="필수"></em></th>
@@ -259,13 +260,15 @@
 		var formId = '#goodsPriceHstForm';
 		var form = document.goodsPriceHstForm;
 
+		if (event.keyCode === 13) return false;
+		
 		if ($("#goodsPriceHstForm input[name=confirmY]").val() == "Y") return true;
 		
 		var searchFlag = false;
 		var cnt = 0;
 
 		 if( !gagajf.isNull($("#goodsPriceHstForm input[name=supplyCompList]").val())
-				|| !gagajf.isNull($("#goodsPriceHstForm input[name=goodsCd]").val())
+				|| !gagajf.isNull($("#goodsPriceHstForm textarea[name=condition]").val())
 				|| (!gagajf.isNull($("#goodsPriceHstForm input[name=stDate]").val()) && !gagajf.isNull($("#goodsPriceHstForm input[name=edDate]").val()))
 				|| !gagajf.isNull($("#goodsPriceHstForm input[name=brandList]").val())
 			){

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

@@ -253,6 +253,8 @@
 		var formId = '#goodsTnmListForm';
 		var form = document.goodsTnmListForm;
 
+		if (event.keyCode === 13) return false;
+		
 		if($("#goodsTnmListForm input[name=searchGb]").val() == "EXCEL") return true;
 		
 		var searchFlag = false;

+ 60 - 25
src/main/webapp/WEB-INF/views/goods/GoodsVideoForm.html

@@ -32,36 +32,39 @@
 			<div class="panelContent">
 			
 			<form id="searchForm" name="searchForm" action="#" th:action="@{'/goods/video/list'}">
+				
 				<table class="frmStyle">
 					<colgroup>
 						<col style="width:10%;"/>
-						<col style="width:40%;"/>
+						<col style="width:62%;"/>
 						<col style="width:10%;"/>
 						<col/>
 					</colgroup>
 					<tr>
-						<th>키워드</th>
-						<td>
-							<select name="keyWord">
-								<option value="goodsCd">상품코드</option>
-								<option value="goodsNm">상품명</option>
-								<option value="goodsNum">품번</option>
-								<option value="supplyGoodsCd">업체상품코드</option>
-							</select>
-							<input type="text" class="w100" maxlength="20" name="searchTxt" placeholder=""/>
-							<input type="text" class="off" name="goodsCd" id="goodsCd"/>
-							<input type="text" class="off" name="goodsNm" id="goodsNm"/>
-							<input type="text" class="off" name="goodsNum" id="goodsNum"/>
-							<input type="text" class="off" name="supplyGoodsCd" id="supplyGoodsCd"/>
-						</td>
 						<th>브랜드명</th>
 						<td>
-							<input type="text" class="w200" name="brandEnm" placeholder="" maxlength="50"/>
+							<input type="hidden" name="xxxx" value="xxxx"/> <!-- submit 방지 -->
+							<input type="text" class="w100" name="searchTxt" id="searchTxt" maxlength="20" />
+							<button type="button" class="btn icn" id="btnSearchBrand"><i class="fa fa-search"></i></button>
+							<span id="brandText"></span>
+							<input type="hidden" name="brandList"/>
+							
+						</td>
+						<th rowspan="2">키워드</th>
+						<td rowspan="2">
+							<select name="search" id="search">
+								<option value="searchGoodsCd">상품코드</option>
+								<option value="searchGoodsNm">상품명</option>
+								<option value="searchGoodsNum">품번</option>
+								<option value="searchSupplyGoodsCd">업체상품코드</option>
+							</select>
+							<textarea class="textareaR2 w50p" name="condition" id="condition"></textarea>
 						</td>
+						
 					</tr>
 					<tr>
 						<th>등록일</th>
-						<td colspan="3" id="sellTerms">
+						<td id="sellTerms">
 						</td>
 					</tr>
 				</table>
@@ -92,7 +95,7 @@
 		<!-- //리스트 영역 -->
 		<!-- 등록/수정 -->
 		<div class="panelStyle">
-			<form id="detailForm" name="detailForm" action="#" >
+			<form id="detailForm" name="detailForm">
 				<table class="frmStyle">
 					<colgroup>
 						<col style="width:10%;"/>
@@ -266,15 +269,9 @@
 	
 	// 조회
 	$('#btnSearch').on('click', function() {
-		$("#goodsCd").val('');
-		$("#goodsNm").val('');
-		$("#goodsNum").val('');
-		$("#supplyGoodsCd").val('');
-		$("#"+$("#searchForm select[name=keyWord]").val()).val($("#searchForm input[name=searchTxt]").val());
 		
 		if(!fnConditionCheck()) return;
 		
-		
 		// Fetch data
 		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
 		$("#btnNew").click();
@@ -282,6 +279,9 @@
 	
 	//검색 조건 확인
 	var fnConditionCheck = function(){
+		
+		if (event.keyCode === 13) return false;
+		
 		var form = document.searchForm;
 
 		var searchFlag = false;
@@ -290,7 +290,7 @@
 		for (i = 0; i < form.elements.length; i++ ) {
 			var el = form.elements[i];
 
-			if ($(el).prop("type") == "text" || ($(el).prop("type") == "select-one" && el.name != "search" && el.name != "pageSize" && el.name != "keyWord")) {
+			if ($(el).prop("type") == "text" || $(el).prop("type") == "textarea" || ($(el).prop("type") == "select-one" && el.name != "search" && el.name != "pageSize")) {
 				if (!(el.value == null || el.value == "")) {
 					cnt++;
 				}
@@ -315,6 +315,8 @@
 	// 검색조건 초기화
 	$('#btnInit').on('click', function() {
 		$("#searchForm")[0].reset();
+		$('#searchForm input[name=brandList]').val('');
+		$('#searchForm').find('#brandText').html('');
 	});
 	
 	// 선택상품 사용안함
@@ -334,6 +336,39 @@
 		}
 	});
 	
+
+	// 브랜드 조회 선택시
+	$('#btnSearchBrand').on('click', function() {
+		/* if (gagajf.isNull($("#searchForm input[name=searchTxt]").val())){
+			mcxDialog.alert('브랜드 검색어를 입력하세요.');
+			return false;
+		} */
+		cfnOpenBrandListPopup('fnSetBrandInfo', 'M');
+	});
+	
+	// 브랜드 조회 팝업에서 호출
+	var fnSetBrandInfo = function(result) {
+		var arrbrandCd = [];
+		var brandText = "";
+		var bIndex = 0;
+		$('#searchForm').find('#brandText').html('');
+		$('#searchForm input[name=searchTxt]').val('');
+		result.forEach(function(brand){
+			bIndex++; 
+			arrbrandCd.push(brand.brandCd);
+		});
+
+		// 조회값이 하나일 경우 화면에 코드 노출 그외는 갯수 처리 
+		if (bIndex == 1) {
+			$('#searchForm input[name=searchTxt]').val(arrbrandCd[0]);
+		}else{
+			brandText = bIndex + " 개";
+			$('#searchForm').find('#brandText').html(brandText);	
+		}
+		var jsonData = JSON.stringify(arrbrandCd);
+		$("#searchForm input[name=brandList]").val(jsonData);
+	}
+	
 	// 동영상 저장
 	$("#btnSave").on('click', function() {
 		

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

@@ -336,7 +336,7 @@
 											</td>
 										</tr>-->
 										<tr class="payTypeTr" style="display: none;">
-											<th>결제수단<em class="required" title="필수"></em></th>
+											<th>결제수단</th>
 											<td colspan="5">
 												<label class="chkBox" th:if="${payTypeList}" th:each="oneData, status : ${payTypeList}">
 													<input type="checkbox" name="payTypeArr" th:value="${oneData.cd}" th:text="${oneData.cdNm}" checked="checked"/>
@@ -1011,6 +1011,15 @@
 			return false;
 		}
 
+		// 할인방식 할인율 일때, 최대할인금액 0 보다 큰지 체크
+		if($('#CouponForm input:radio[name="rdoDcWay"]:checked').val() == 'G240_11'){
+			if($('#CouponForm').find('input[name=maxDcAmt]').val() < 1){
+				mcxDialog.alert("최대 할인 금액을 입력해주세요.");
+				$('#CouponForm input[name=maxDcAmt]').focus();
+				return false;
+			}
+		}
+
 		if($('#CouponForm input:radio[name="rdoApplyScope"]:checked').val() == 'I'){
 			// 적용대상 체크
 			let targetCnt = 0;
@@ -1065,6 +1074,8 @@
 			return false;
 		}
 
+		/*
+		21-07-19 결제수단 필수조건 아니여서 주석처리
 		if(cpnType == 'G230_20'){
 			// 결제수단 체크박스 체크
 			var payTypeCnt = $('#CouponForm input:checkbox[name=payTypeArr]:checked').length;
@@ -1074,6 +1085,7 @@
 				return false;
 			}
 		}
+		*/
 
 		if($('#CouponForm select[name="pdGb"] option:selected').val() == 'D'){
 			if(gagajf.isNull($("#availDays").val()) || $("#availDays").val() < 1){
@@ -1475,12 +1487,13 @@
 			return false;
 		}
 		// 결제수단 체크박스 체크
+		/* 21-07-19 결제수단 필수조건 아니여서 주석처리
 		var payTypeCnt = $('#CouponForm input:checkbox[name=payTypeArr]').length;
 		if(payTypeCnt<1){
-			mcxDialog.alert("사용가능고객등급을 체크해주세요.");
+			mcxDialog.alert("결제수단을 체크해주세요.");
 			$('#CouponForm input:checkbox[name=payTypeArr]').focus();
 			return false;
-		}
+		}*/
 
 		//신규가입 지급한다면 validation 체크
 		if( $('#newCustYn option:selected').val() == "Y" ){
@@ -2109,10 +2122,16 @@
 		let addCnt = 0;
 		let failCnt = 0;
 		let dupliCnt = 0;
+		let goodsDCnt = 0;
 
 		for(let i = 0 ; i < result.length ; i++) {
 			let addChk = true, gridListValue = gagaAgGrid.getAllRowData(OriginGridListOption);		// 받아온 모든 데이터
 
+			if(result[i].goodsType == 'G056_D'){ //딜상품 제외
+				addChk = false;
+				goodsDCnt++;
+			}
+
 			// 받아온 data for
 			for(let j = 0 ; j < gridListValue.length ; j++) {
 				if(gridListValue[j].goodsCd == result[i].goodsCd) {	addChk = false;	dupliCnt++;}				// 중복체크
@@ -2125,8 +2144,8 @@
 			}
 		}
 		uifnPopupClose('popupGoods');
-		failCnt = result.length - addCnt - dupliCnt;
-		mcxDialog.alert("데이터가 적용되었습니다.<br/>" + addCnt + "건 성공, "+ dupliCnt + "건 중복, " + failCnt + "건 실패");
+		failCnt = result.length - addCnt - dupliCnt - goodsDCnt;
+		mcxDialog.alert("데이터가 적용되었습니다.<br/>" + addCnt + "건 성공, "+ dupliCnt + "건 중복, "+ goodsDCnt + "건 딜상품 제외, " + failCnt + "건 실패");
 	}
 
 	// 기간 일수 변경시

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

@@ -20,7 +20,7 @@
 			<h2>사은품 프로모션 관리</h2>
 			<button type="button" class="close" onclick="fnFreeGoodsPromotionFormClose()"><i class="fa fa-times"></i></button>
 		</div>
-		<div class="marT10" style="height:650px;overflow-y:auto;padding:0 10px;">
+		<div class="marT10" style="height:650px;overflow-y:auto;padding:0 10px;margin-top:0px !important;">
 			<form id="freeGoodsPromotionForm" name="freeGoodsPromotionForm" th:method="post">
 				<input type="hidden" name="gbn" th:value="${param.gbn}" />				<!-- 신규/수정 구분 -->
 				<input type="hidden" id="freegiftSq" name="freegiftSq" th:value="${param.freegiftSq}"/>	<!-- 사은품 프로모션 번호 -->
@@ -78,6 +78,7 @@
 								<label class="chkBox disabledPoint" id="G011_20"><input type="checkbox" id="extmallYn" name="extmallYn" value="Y" class="disabledPoint"/>제휴몰</label>
 								<button type="button" class="btn btnRight btn-success btn-lg" id="btnExtmallPopup">선택</button><span id="extmallCntArea"> 선택 : <span id="extmallCnt">00</span>개</span>
 								<div id="gridFGExtmallList" style="display:none;"></div>
+								<div id="gridExtmallIdList" style="display:none;"></div>
 							</td>
 						</tr>
 					</table>
@@ -668,6 +669,7 @@
 		let gridListValue = gagaAgGrid.getAllRowData(gridListOption);	// 기존 리스트
 		let addCnt = 0;													// 적용 성공 수량
 		let failCnt = 0;												// 실패 수량
+		let dealCntString = "";
 		// 기존 리스트 데이터 for
 		for(let i = 0 ; i < result.length ; i++) {
 			let addChk = true;					// 받아온 모든 데이터
@@ -678,6 +680,13 @@
 				if(eval("gridListValue[j]." + key) == eval("result[i]." + key)) {	addChk = false;	}		// 중복체크
 			}
 
+			if(key == "goodsCd" && result[i].goodsType == "G056_D") {
+				if(dealCntString == "") {
+					dealCntString = "<br/>딜 상품은 추가 될 수 없습니다. 구성상품으로 등록해주세요.";
+				}
+				addChk = false;
+			}
+
 			// 추가된 데이터 중 중복되지 않은 데이터 리스트에 추가
 			if(addChk) {	resultList.push(result[i]); addCnt++;	}
 		}
@@ -691,11 +700,11 @@
 			}
 
 			failCnt = result.length - addCnt;
-			mcxDialog.alert("데이터가 적용되었습니다.<br/>" + addCnt + "건 성공, " + failCnt + "건 실패");
+			mcxDialog.alert("데이터가 적용되었습니다.<br/>" + addCnt + "건 성공, " + failCnt + "건 실패" + dealCntString);
 		} else if (key == "goodsCd") {
 			uifnPopupClose('popupGoods');
 			failCnt = result.length - addCnt;
-			mcxDialog.alert("데이터가 적용되었습니다.<br/>" + addCnt + "건 성공, " + failCnt + "건 실패");
+			mcxDialog.alert("데이터가 적용되었습니다.<br/>" + addCnt + "건 성공, " + failCnt + "건 실패" + dealCntString);
 		}
 
 		// 추가된 정보 그리드에 추가
@@ -1032,12 +1041,15 @@
 			}
 
 			// 추가된 데이터 중 중복되지 않은 데이터 리스트에 추가
-			if(addChk) {	resultList.push(result[i]);	}
+			if(addChk) {
+				resultList.push(result[i]);
+			}
 		}
 
 		// 추가된 정보 그리드에 추가
 		for(let i = 0 ; i < resultList.length ; i++) {
 			gagaAgGrid.addRowData(gridOptionsFGExtmallList, resultList[i], "extmallId");
+			$("#freeGoodsPromotionForm #gridExtmallIdList").append('<input type="hidden" class="extmallIdList" name="extmallIdList" value="' + resultList[i].extmallId + '" />');
 		}
 
 		// 수정된 수량 갯수 수정

+ 106 - 11
src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html

@@ -147,6 +147,39 @@
 					</div>
 				</div>
 			</div>
+			<div class="panelStyle" style="margin:unset;">
+				<!-- TITLE -->
+				<div class="panelTitle">
+					<h2>기준 상품</h2>
+					<span class="panelControl">
+						<i class="fa inner-fa-chevron-up"></i>    <!-- 열림/닫힘 화살표 -->
+					</span>
+				</div>
+				<!-- //TITLE -->
+				<div class="inner-panelContent">
+					<div class="panelContent">
+						<table class="frmStyle">
+							<colgroup>
+								<col width="10%"/>
+								<col width="90%"/>
+							</colgroup>
+							<tr>
+								<th>기준 상품</th>
+								<td>
+									<div class="padding10">
+										<span class="buttonSpan">
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddDefaultGoods">상품 추가</button>
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnDeleteDefaultGoods">선택삭제</button>
+										</span>
+										<br/>
+										<div id="gridTmtbDefaultList" 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">
@@ -338,6 +371,7 @@
 	var tmtbSectionValList = [[${tmtbSectionValList}]];
 	var tmtbSupplyCompList = [[${tmtbSupplyCompList}]];
 	var tmtbBrandList = [[${tmtbBrandList}]];
+	var tmtbDefaultGoodsList = [[${tmtbDefaultGoodsList}]];
 	var tmtbApplyGoodsList = [[${tmtbApplyGoodsList}]];
 	var tmtbExceptGoodsList = [[${tmtbExceptGoodsList}]];
 	var tmtbBurdenList = [[${tmtbBurdenList}]];
@@ -346,6 +380,7 @@
 	var FGAddGoodsStatList = gagajf.convertToArray([[${goodsStatList}]]);		// 상품 상태 리스트
 	var sectionGbList = gagajf.convertToArray([[${sectionGbList}]]);	// 할인구간 리스트
 	var dcWayList = gagajf.convertToArray([[${dcWayList}]]);	// 할인구분 리스트
+	var defaultGoodsGbList = gagajf.convertToArray([[${defaultGoodsGbList}]]);	// 기준 상품구분 목록
 	var applyGoodsGbList = gagajf.convertToArray([[${applyGoodsGbList}]]);	// 적용 상품구분 목록
 	var exceptGoodsGbList = gagajf.convertToArray([[${exceptGoodsGbList}]]);	// 제외 상품구분 목록
 
@@ -368,6 +403,22 @@
 		{headerName: "시퀀스", field: "tmtbGoodsSq", width: 150, cellClass: 'text-center', hide: true},
 		{headerName: "삭제여부", field: "delYn", width: 150, cellClass: 'text-center', hide: true}
 	];
+	// 기준상품 리스트 설정
+	var columnDefaultGoodsList = [
+		{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(defaultGoodsGbList), required: true },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(defaultGoodsGbList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(defaultGoodsGbList, 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},
+		{headerName: "실제적용대상 시퀀스", field: "tmtbApplyGoodsSq", width: 150, cellClass: 'text-center', hide: true},
+		{headerName: "삭제여부", field: "delYn", width: 150, cellClass: 'text-center', hide: true}
+	];
 	// 적용상품 리스트 설정
 	var columnApplyGoodsList = [
 		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
@@ -491,10 +542,13 @@
 	// 브랜드 리스트 설정
 	var gridOptionsFGBrandList = gagaAgGrid.getGridOptions(columnBrandList);
 	gridOptionsFGBrandList.rowSelection = "multiple";
+	// 기준 상품 리스트 설정
+	var gridOptionsDefaultGoodsList = gagaAgGrid.getGridOptions(columnDefaultGoodsList);
+	gridOptionsDefaultGoodsList.rowSelection = "multiple";
 	// 적용상품 리스트 설정
 	var gridOptionsFGApplyGoodsList = gagaAgGrid.getGridOptions(columnApplyGoodsList);
 	// Grid editable
-	gridOptionsFGApplyGoodsList.defaultColDef.editable = true;
+	// gridOptionsFGApplyGoodsList.defaultColDef.editable = true;
 	gridOptionsFGApplyGoodsList.rowSelection = "multiple";
 	// 제외상품 리스트 설정
 	var gridOptionsFGExceptGoodsList = gagaAgGrid.getGridOptions(columnExceptGoodsList);
@@ -520,6 +574,7 @@
 		// 1.그리드 그리기
 		gagaAgGrid.createGrid("gridFGPromotionCompanyList", gridOptionsFGCompanyList);
 		gagaAgGrid.createGrid("gridFGBrandList", gridOptionsFGBrandList);
+		gagaAgGrid.createGrid("gridTmtbDefaultList", gridOptionsDefaultGoodsList);
 		gagaAgGrid.createGrid("gridFGApplyGoodsList", gridOptionsFGApplyGoodsList);
 		gagaAgGrid.createGrid("gridFGExceptGoodsList", gridOptionsFGExceptGoodsList);
 		gagaAgGrid.createGrid("gridApplyBurdenList", gridOptionsApplyBurdenList);
@@ -533,6 +588,7 @@
 		if(mode == "U"){
 			gridOptionsFGCompanyList.api.setRowData(tmtbSupplyCompList);
 			gridOptionsFGBrandList.api.setRowData(tmtbBrandList);
+			gridOptionsDefaultGoodsList.api.setRowData(tmtbDefaultGoodsList);
 			gridOptionsFGApplyGoodsList.api.setRowData(tmtbApplyGoodsList);
 			gridOptionsFGExceptGoodsList.api.setRowData(tmtbExceptGoodsList);
 			gridOptionsSectionGbList.api.setRowData(tmtbSectionValList)
@@ -598,7 +654,7 @@
 	});
 
 	var fnGoodsGbCheck = function (){
-		let applyGoodsData = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList);
+		let applyGoodsData = gagaAgGrid.getAllRowData(gridOptionsDefaultGoodsList);
 		var checkCnt = 0;
 		$.each(applyGoodsData, function(idx, item) {
 			if(item.goodsGb == 'G800_10'){
@@ -607,7 +663,7 @@
 		});
 
 		if(checkCnt < 1){
-			mcxDialog.alert("기상품을 1개 이상 지정해주세요.");
+			mcxDialog.alert("기상품을 1개 이상 지정해주세요.");
 			return false;
 		}
 
@@ -692,6 +748,7 @@
 		// 각 ag-grid list 수량
 		let allSupplyCompData = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList);
 		let allBrandData = gagaAgGrid.getAllRowData(gridOptionsFGBrandList);
+		let allDefaultGoodsData = gagaAgGrid.getAllRowData(gridOptionsDefaultGoodsList);
 		let allApplyGoodsData = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList);
 		let allExceptGoodsData = gagaAgGrid.getAllRowData(gridOptionsFGExceptGoodsList);
 		let allApplyBurdenData = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList);
@@ -713,9 +770,18 @@
 			multiBrand.push(item.brandCd);
 		});
 
+		var multiDefaultGoods = [];
+		$.each(allDefaultGoodsData, function(idx, item) {
+			multiDefaultGoods.push(item.goodsCd);
+		});
+
 		var multiApplyGoods = [];
-		$.each(allApplyGoodsData, function(idx, item) {
-			multiApplyGoods.push(item.goodsCd);
+		$.each(allApplyGoodsData, function(agIdx, agItem) {
+			$.each(allDefaultGoodsData, function(idx, item) {
+				if(agItem.goodsCd != item.goodsCd){
+					multiApplyGoods.push(agItem.goodsCd);
+				}
+			});
 		});
 
 		var multiExceptGoods = [];
@@ -740,14 +806,16 @@
 			, exceptGoodsList : allExceptGoodsData
 			, burdenList : allApplyBurdenData
 			, sectionGbList : allSectionGbData
+			, defaultGoodsList : allDefaultGoodsData
 			, multiSupplyCompCd : multiSupplyCompCd
 			, multiBrand : multiBrand
 			, multiApplyGoods : multiApplyGoods
 			, multiExceptGoods : multiExceptGoods
+			, multiDefaultGoods : multiDefaultGoods
 		};
 
 		var jsonData = JSON.stringify(data);
-
+// console.log(jsonData);
 		gagajf.ajaxJsonSubmit($('#moreBetterForm').prop('action'), jsonData, fnMorebetterSaveCollback);
 	});
 
@@ -843,6 +911,11 @@
 		}
 	};
 
+	// 기준 상품 리스트 콜백함수
+	var fnSetPopupDefaultGoodsInfo = function(result) {
+		gridAddGoodsList(gridOptionsDefaultGoodsList, result , "default");
+	};
+
 	// 적용 상품 리스트 콜백함수
 	var fnSetPopupApplyGoodsInfo = function(result) {
 		gridAddGoodsList(gridOptionsFGApplyGoodsList, result , "apply");
@@ -856,7 +929,11 @@
 	// ag-grid 상품관련 list 콜백함수
 	function gridAddGoodsList(OriginGridListOption, result, gubun) {
 		var goodsGbVal = "G800_10";
-		if(gubun == 'except'){
+		if(gubun == 'default'){
+			goodsGbVal = "G800_10";
+		}else if(gubun == 'apply'){
+			goodsGbVal = "G800_20";
+		}else{
 			goodsGbVal = "G800_30";
 		}
 
@@ -900,7 +977,10 @@
 	$('#moreBetterForm #btnAddBrand').on('click', function() {
 		cfnOpenBrandListPopup("fnSetPopupBrandInfo", "M");
 	});
-
+	// 기준 상품 추가 버튼 클릭시
+	$('#moreBetterForm #btnAddDefaultGoods').on('click', function() {
+		cfnOpenGoodsPopup("fnSetPopupDefaultGoodsInfo");
+	});
 	// 적용 상품 추가 버튼 클릭시
 	$('#moreBetterForm #btnAddApplyGoods').on('click', function() {
 		cfnOpenGoodsPopup("fnSetPopupApplyGoodsInfo");
@@ -927,6 +1007,10 @@
     $('#moreBetterForm #btnDeleteBrand').on('click', function() {
         gridOptionsFGBrandList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsFGBrandList)});
     });
+	// 기준상품 선택삭제 버튼 클릭시
+	$('#moreBetterForm #btnAddDefaultGoods').on('click', function() {
+		gridOptionsDefaultGoodsList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsDefaultGoodsList)});
+	});
     // 적용상품 선택삭제 버튼 클릭시
     $('#moreBetterForm #btnDeleteApplyGoods').on('click', function() {
         gridOptionsFGApplyGoodsList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsFGApplyGoodsList)});
@@ -1090,6 +1174,7 @@
 		// 각 ag-grid list 수량
 		let allSupplyCompData = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList);
 		let allBrandData = gagaAgGrid.getAllRowData(gridOptionsFGBrandList);
+		let allDefaultGoodsData = gagaAgGrid.getAllRowData(gridOptionsDefaultGoodsList);
 		let allApplyGoodsData = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList);
 		let allExceptGoodsData = gagaAgGrid.getAllRowData(gridOptionsFGExceptGoodsList);
 		let allApplyBurdenData = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList);
@@ -1116,9 +1201,18 @@
 			multiBrand.push(item.brandCd);
 		});
 
+		var multiDefaultGoods = [];
+		$.each(allDefaultGoodsData, function(idx, item) {
+			multiDefaultGoods.push(item.goodsCd);
+		});
+
 		var multiApplyGoods = [];
-		$.each(allApplyGoodsData, function(idx, item) {
-			multiApplyGoods.push(item.goodsCd);
+		$.each(allApplyGoodsData, function(agIdx, agItem) {
+			$.each(allDefaultGoodsData, function(idx, item) {
+				if(agItem.goodsCd != item.goodsCd){
+					multiApplyGoods.push(agItem.goodsCd);
+				}
+			});
 		});
 
 		var multiExceptGoods = [];
@@ -1176,9 +1270,10 @@
 						, multiBrand : multiBrand
 						, multiApplyGoods : multiApplyGoods
 						, multiExceptGoods : multiExceptGoods
+						, multiDefaultGoods : multiDefaultGoods
 					}
 					var jsonData = JSON.stringify(data);
-					console.log('jsonData::'+jsonData);
+					// console.log('jsonData::'+jsonData);
 					gagajf.ajaxJsonSubmit('/marketing/morebetter/changeStat', jsonData, fnMorebetterChangeStatCollback);
 				}
 			}

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

@@ -233,7 +233,7 @@
 	// 웹 수정 팝업
 	var fnEventDetailPopup = function(planSq) {
 		var actionUrl = "/marketing/planning/detail/form?mode=U&planSq=" + planSq;
-		cfnOpenModalPopup(actionUrl,'popupPlanDetail');
+		cfnOpenModalPopup(actionUrl,'popupReply');
 	}
 	
 	// 이벤트 코너 관리 팝업

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

@@ -148,7 +148,7 @@
 	// 댓글 이미지 팝업
 	var fnOpenCustReplyPopup = function(planEntrySq,planSq) {
 		var actionUrl = "/marketing/planning/reply/detail/form?planEntrySq=" + planEntrySq + "&planSq=" +planSq;
-		cfnOpenModalPopup(actionUrl,'popupPlanReplyDetail');
+		cfnOpenModalPopup(actionUrl,'popupReplyDetail');
 	} 
 	
 	//페이징 

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

@@ -2151,7 +2151,7 @@ $(document).ready(function() {
 						html += '</td>';
 						html += '</tr>';
 							
-						$("#couponTable").append(html);
+						$("#couponTable").prepend(html);
 						
 						$('#couponPlusBtn'+(i+1)).attr("onclick","fnOpenCouponRetrievePopup('input[name=cuItemVal"+(i+1)+"]', 'input[name=cuItemNm"+(i+1)+"]');")
 						$('#deleteCoupon'+(i+1)).attr("onclick","deleteRowCoupon("+(i+1)+")");

+ 11 - 4
src/main/webapp/WEB-INF/views/ocm/ExtmallSearchForm.html

@@ -67,7 +67,7 @@
 		/*<![CDATA[*/
 		let extmallGbList = gagajf.convertToArray([[${extmallGbList}]]);		// 상품 상태 리스트
 		let columnExtmallPopupDefList = [
-			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{width: 40, minWidth: 40, field: "extmallCheck", cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
 			{headerName: "제휴몰구분", field: "vendorId" , width: 120, cellClass: 'text-center',
 				cellEditorParams: { values: gagaAgGrid.extractValues(extmallGbList) },
 				valueFormatter: function (params) { return gagaAgGrid.lookupValue(extmallGbList, params.value); },
@@ -88,8 +88,15 @@
 		// 조회
 		$('#btnSearchExtmallList').on('click', function() {
 			// Fetch data
-			gagaAgGrid.fetch($('#searchExtmallListForm').prop('action'), gridOptionsExtmallPopupList, '#searchExtmallListForm');
-			gridOptions.api.setRowData(result.morebetterList);
+			gagaAgGrid.fetch($('#searchExtmallListForm').prop('action'), gridOptionsExtmallPopupList, '#searchExtmallListForm', function() {
+				gridOptionsExtmallPopupList.api.forEachNode(function(rowNode, index) {
+					$("#freeGoodsPromotionForm #gridExtmallIdList input[name=extmallIdList]").each(function(i, e){
+						if(rowNode.data.extmallId == $(this).val()) {
+							rowNode.setSelected(true);
+						}
+					});
+				});
+			});
 		});
 
 		// 확인
@@ -97,7 +104,7 @@
 			var selectedData = gagaAgGrid.selectedRowData(gridOptionsExtmallPopupList);
 
 			if (selectedData.length == 0) {
-				mcxDialog.alert('선택된 공급업체가 없습니다.');
+				mcxDialog.alert('선택된 외부몰이 없습니다.');
 				return false;
 			}
 

+ 50 - 61
src/main/webapp/WEB-INF/views/order/OrderDetailForm.html

@@ -101,24 +101,11 @@
 				<h4>배송정보</h4>
 				<div id="gridDeliveryAddrInfo" style="width:100%; height:100px;" class="ag-theme-balham"></div>
 				
-				<table style="width:100%;">
-					<colgroup>
-						<col style="width:65%;"/>
-						<col/>
-					</colgroup>
-					<tbody>
-						<tr>
-							<td style="width:916px;display:inline-block">
-								<h4>결제정보</h4>
-								<div id="gridPaymentInfo" style="width:100%; height: 100px;" class="ag-theme-balham"></div>
-							</td>
-							<td style="">
-								<h4>배송비정보</h4>
-								<div id="gridDeliveryFeeInfo" style="width:100%; height: 100px;" class="ag-theme-balham"></div>
-							</td>
-						<tr>
-					</tbody>
-				</table>
+				<h4>배송비정보</h4>
+				<div id="gridDeliveryFeeInfo" style="width:100%; height:100px;" class="ag-theme-balham"></div>
+				
+				<h4>결제정보</h4>
+				<div id="gridPaymentInfo" style="width:100%; height:100px;" class="ag-theme-balham"></div>
 
 				<div id="wrapOrderChange">
 					<h4>(취소/반품/교환) 요청 정보</h4>
@@ -136,28 +123,6 @@
 					<div id="gridOrderMemoInfo" style="width:100%; height: 100px;" class="ag-theme-balham"></div>
 				</div>
 				
-				<!-- 
-				<table style="width:100%;">
-					<colgroup>
-						<col style="width:65%;"/>
-						<col/>
-					</colgroup>
-					<tbody>
-						<tr>
-							<td style="width:916px;display:inline-block">
-								<h4>상담내역</h4>
-								<div id="gridOrderCounselInfo" style="width:100%; height: 100px;" class="ag-theme-balham"></div>
-							</td>
-							<td style="">
-								<h4>관리자메모</h4>
-								<button type="button" id="btnCreateOrderMemo" class="btn btnRight btn-base btn-sm" style="margin-left:10px;"> +</button>
-								<div id="gridOrderMemoInfo" style="width:100%; height: 100px;" class="ag-theme-balham"></div>
-							</td>
-						</tr>
-					</tbody>
-				</table>
-				 -->
-				
 			</form>
 		</div>
 	</div>
@@ -182,6 +147,8 @@ var allCanYn				= [[${allCanYn}]];						// 배송지수정가능여부
 var orderGoodsCnt 			= [[${orderGoodsInfo.size()}]];			// 주문상세정보
 var orderFreeGiftCnt		= [[${orderFreeGiftInfo.size()}]];		// 주문사은품정보
 var orderDeliveryAddrCnt	= [[${orderDeliveryAddrInfo.size()}]];	// 배송정보
+var orderDeliveryFeeCnt		= [[${orderDeliveryFeeInfo.size()}]];	// 배송비정보
+var orderPaymentCnt			= [[${orderPaymentInfo.size()}]];		// 결제정보
 var orderChangeCnt 			= [[${orderChangeInfo.size()}]];		// 취소/반품/교환요청 정보
 var orderRefundCnt 			= [[${orderRefundInfo.size()}]];		// 환불정보
 var roleCd 					= [[${sessionInfo.roleCd}]];			// 권한코드 
@@ -189,7 +156,7 @@ var roleCd 					= [[${sessionInfo.roleCd}]];			// 권한코드
 // 2021.05.12 
 var hiddenTemp				= true;
 if (userNo == "24" || userNo == "33" || userNo == "8") {
-	hiddenTemp				= false;
+//	hiddenTemp				= false;
 }
 
 </script>
@@ -511,7 +478,9 @@ var columnDefsGoodsInfo = [
 				}
 			},
 			{headerName: "출고처"		, field: "delvLocNm"	, width: 120, cellClass: 'text-center'},
-			{headerName: "배송지번호"	, field: "delvAddrSq"	, width: 120, cellClass: 'text-center'}
+			{headerName: "배송지번호"	, field: "delvAddrSq"	, width: 120, cellClass: 'text-center'},
+			{headerName: "업체명"		, field: "supplyCompNm"	, width: 180, cellClass: 'text-center'},
+			{headerName: "배송정책코드", field: "delvFeeCdGrp"	, width: 120, cellClass: 'text-center'}
 		]
 	}
 ];
@@ -698,11 +667,11 @@ var gridOptionsPaymentInfo = gagaAgGrid.getGridOptions(columnDefsPaymentInfo);
 
 // 5.배송비
 var columnDefsDeliveryFeeInfo = [
-	{headerName: "배송비종류"		, field: "delvFeeGbNm", width: 120, cellClass: 'text-center'},
+	{headerName: "배송비종류"		, field: "delvFeeGbNm", width: 150, cellClass: 'text-center'},
 	{
 		headerName			: "배송비"
 		, field				: "delvFee"
-		, width				: 100
+		, width				: 120
 		, cellClass			: 'text-right'
 		, valueFormatter	: function (params) {
 			return params.value.addComma();
@@ -717,10 +686,19 @@ var columnDefsDeliveryFeeInfo = [
 			return params.value.addComma();
 		}
 	},
+	{
+		headerName			: "상품권사용배송비"
+		, field				: "delvGfcdUseAmt"
+		, width				: 120
+		, cellClass			: 'text-right'
+		, valueFormatter	: function (params) {
+			return params.value.addComma();
+		}
+	},
 	{
 		headerName			: "실제배송비"
 		, field				: "realDelvAmt"
-		, width				: 100
+		, width				: 120
 		, cellClass			: 'text-right'
 		, valueFormatter	: function (params) {
 			return params.value.addComma();
@@ -730,12 +708,14 @@ var columnDefsDeliveryFeeInfo = [
 	{
 		headerName			: "배송비정산일시"	
 		, field				: "delvUsacDt"
-		, width				: 140
+		, width				: 150
 		, cellClass			: 'text-center' 
 		, cellRenderer: function(params) {
 			return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmm").format("YYYY-MM-DD HH:mm") : '';
 		}
-	}
+	},
+	{headerName: "업체명"			, field: "supplyCompNm", width: 180, cellClass: 'text-center'},
+	{headerName: "배송정책코드"	, field: "delvFeeCd", width: 120, cellClass: 'text-center'}
 ];
 var gridOptionsDeliveryFeeInfo = gagaAgGrid.getGridOptions(columnDefsDeliveryFeeInfo);
 
@@ -776,19 +756,24 @@ var columnDefsOrderChangeInfo = [
 			*/
 			
 			// 2021.06.29 변경구분값으로 변경
-			// 취소요청
-			if (params.data.chgGb == "G680_20") {
-				rtnStr = '<a href="javascript:void(0);" onclick="fnCancelRequest(\'' + paramData + '\',\'' + params.value + '\');">' + params.value + '</a>';
-			}
-			// 반품요청
-			else if (params.data.chgGb == "G680_30") {
-				rtnStr = '<a href="javascript:void(0);" onclick="fnReturnRequest(\'' + paramData + '\',\'' + params.value + '\');">' + params.value + '</a>';
-			}
-			// 교환요청
-			else if (params.data.chgGb == "G680_40") {
-				rtnStr = '<a href="javascript:void(0);" onclick="fnExchangeRequest(\'' + paramData + '\',\'' + params.value + '\');">' + params.value + '</a>';
-			}
-			else {
+			// 2021.07.19 as-is 변경정보는 TB_ORDER_DETAIL_ITEM_HST 정보가 존재하지 않음
+			if (params.data.chgItemCnt > 0) {
+				// 취소요청
+				if (params.data.chgGb == "G680_20") {
+					rtnStr = '<a href="javascript:void(0);" onclick="fnCancelRequest(\'' + paramData + '\',\'' + params.value + '\');">' + params.value + '</a>';
+				}
+				// 반품요청
+				else if (params.data.chgGb == "G680_30") {
+					rtnStr = '<a href="javascript:void(0);" onclick="fnReturnRequest(\'' + paramData + '\',\'' + params.value + '\');">' + params.value + '</a>';
+				}
+				// 교환요청
+				else if (params.data.chgGb == "G680_40") {
+					rtnStr = '<a href="javascript:void(0);" onclick="fnExchangeRequest(\'' + paramData + '\',\'' + params.value + '\');">' + params.value + '</a>';
+				}
+				else {
+					rtnStr = params.value;
+				}
+			} else {
 				rtnStr = params.value;
 			}
 			
@@ -1050,6 +1035,8 @@ $(document).ready(function () {
 	var orderDeliveryAddrHeight 	= 40 + (38 * orderDeliveryAddrCnt);
 	var orderChangeHeight 			= 40 + (38 * orderChangeCnt);
 	var orderRefundHeight 			= 40 + (38 * orderRefundCnt);
+	var orderDeliveryFeeHeight 		= 40 + (38 * orderDeliveryFeeCnt);
+	var orderPaymentHeight 			= 40 + (38 * orderPaymentCnt);
 	
 	$("#gridOrderGoodsInfo").css("height"		, orderGoodsHeight+"px");
 	$("#gridOrderFreeGiftInfo").css("height"	, orderFreeGiftHeight+"px");
@@ -1057,6 +1044,9 @@ $(document).ready(function () {
 	$("#gridOrderChangeInfo").css("height"		, orderChangeHeight+"px");
 	$("#gridOrderRefundInfo").css("height"		, orderRefundHeight+"px");
 
+	$("#gridDeliveryFeeInfo").css("height"		, orderDeliveryFeeHeight+"px");
+	$("#gridPaymentInfo").css("height"			, orderPaymentHeight+"px");
+
 	$('#orderDetailContents').css("width", "97%").css("height", "96%");
 	
 	// 메모등록
@@ -1388,7 +1378,6 @@ var fnSweetTracker = function (shipCompCd, invoiceNo) {
 	
 };
 
-
 // 카드전표 영수증 조회
 var fnReceiptPage = function (tid) {
 	var fullUrl = "https://npg.nicepay.co.kr/issue/IssueLoader.do?TID=" + tid + "&type=0";

+ 3 - 3
src/main/webapp/WEB-INF/views/order/OrderDetailGiftcardHst.html

@@ -35,7 +35,7 @@ var orderGiftcardHstList = [[${orderGiftcardHstList}]];
 
 // specify the columns
 var columnDefsOrderGiftcardInfo = [
-		{headerName: "상품권명", 		field: "gfcdNm", 		width: 180, cellClass: 'text-center'},
+		{headerName: "상품권명", 			field: "gfcdNm", 		width: 180, cellClass: 'text-center'},
 		{headerName: "상품권코드", 		field: "gfcdNo", 		width: 180, cellClass: 'text-center'},
 		{
 			headerName			: "상품권승인금액"
@@ -64,8 +64,8 @@ var columnDefsOrderGiftcardInfo = [
 				return params.value.addComma();
 			}	
 		},
-		{headerName: "주문상세", 		field: "ordDtlNo", 		width: 100, cellClass: 'text-center'},
-		{headerName: "상품코드", 		field: "goodsCd", 		width: 100, cellClass: 'text-center'},
+		{headerName: "주문상세/배송비번호", 	field: "ordDtlNo", 		width: 150, cellClass: 'text-center'},
+		{headerName: "상품코드", 			field: "goodsCd", 		width: 100, cellClass: 'text-center'},
 		{
 			headerName			: "상품권사용금액"
 			, field				: "gfcdAmt"

+ 3 - 2
src/main/webapp/WEB-INF/views/shoplinker/ShoplinkerInvoiceSendForm.html

@@ -149,13 +149,13 @@
 	let extmallList = gagajf.convertToArray([[${extmallList}]]);
 
 	let columnDefs = [
-		{headerName: "No", width: 60, cellClass: 'text-center',
+		{headerName: "No", width: 50, cellClass: 'text-center',
 			valueGetter: function(params) { return cfnGridNumner('searchForm',params.node.rowIndex, 'A');}
 		},
 		{headerName: "IF결과", field: "apiResult", width: 100, cellClass: 'text-center',
 			valueFormatter: function (params) { return gagaAgGrid.lookupValue(procGbValue, params.value); }
 		},
-		{headerName: "전송결과메세지", field: "apiMessage", width: 300, cellClass: 'text-center'},
+		{headerName: "전송결과메세지", field: "apiMessage", width: 250, cellClass: 'text-center'},
 		{headerName: "샵링커주문번호", field: "agentOrderId", width: 130, cellClass: 'text-center'},
 		{headerName: "쇼핑몰주문번호", field: "extmallOrderId", width: 130, cellClass: 'text-center'},
 		{
@@ -174,6 +174,7 @@
 			}
 		},
 		{headerName: "주문상세번호", field: "ordDtlNo", width: 120, cellClass: 'text-center'},
+		{headerName: "주문상세상태", field: "ordDtlStatNm", width: 100, cellClass: 'text-center'},
 		{headerName: "배송업체", field: "shipCompNm", width: 150, cellClass: 'text-center'},
 		{headerName: "송장번호", field: "deliveryInvoice", width: 130, cellClass: 'text-center'},
 		{headerName: "배송시작일자", field: "delvStdt", width: 140, cellClass: 'text-center'},

+ 2 - 1
src/main/webapp/WEB-INF/views/signin.html

@@ -25,7 +25,8 @@
 <th:block layout:fragment="content">
 	<form name="loginForm" id="loginForm" th:action="@{/login}" method="post">
 		<div class="loginCont">
-			<div class="logo"><img src="/image/login_logo.png" alt="logo"/></div>
+<!-- 			<div class="logo"><img src="/image/login_logo.png" alt="logo"/></div> -->
+			<div class="logo"><img src="/image/logo_STYLE24.png" alt="logo"/></div>
 			<ul>
 				<li>
 					<ul class="loginBox">

+ 26 - 24
src/main/webapp/WEB-INF/views/withdraw/WithdrawDirectiveListForm.html

@@ -53,11 +53,11 @@
 							</td>
 							<th>주문번호</th>
 							<td>
-								<input type="text" class="w40p" name="ordNo" data-valid-type="integer" placeholder="" maxlength="20"/>
+								<input type="text" class="w40p" name="ordNo" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" placeholder="" maxlength="20"/>
 							</td>
 							<th>주문변경번호</th>
 							<td>
-								<input type="text" class="w40p" name="ordChgSq" data-valid-type="integer" placeholder="" maxlength="20"/>
+								<input type="text" class="w40p" name="ordChgSq" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" placeholder="" maxlength="20"/>
 							</td>
 						</tr>
 						<tr>	
@@ -189,9 +189,7 @@
 			}
 		},
 		{headerName: "주문상세번호", 	field: "ordDtlNo", 		width: 100, cellClass: "text-center"},		
-		{headerName: "회수구분", 		field: "chgGb", 		width: 80, cellClass: "text-center",
-			cellRenderer: function (params) { return params.value == 'G680_30' ? '반품' : '교환'; }
-		},
+		{headerName: "회수구분", 		field: "chgGbNm", 		width: 80, cellClass: "text-center"},
 		
 		{headerName: "사유", 			field: "chgReasonNm", 	width: 150, cellClass: "text-left"},
 		{headerName: "회수요청일", 		field: "regDt", 	width: 100, cellClass: "text-center"},
@@ -199,17 +197,15 @@
 		{headerName: "상품코드", 		field: "goodsCd", 		width: 120, cellClass: "text-center",
 			cellRenderer: function(params) { return gagajf.isNull(params.value) ? '' : '<a href="javascript:void(0);">' + params.value + '</a>'; }
 		},
-		{headerName: "상품명", 		field: "goodsNm", 		width: 200, cellClass: "text-left"},
+		{headerName: "상품명", 			field: "goodsNm", 		width: 200, cellClass: "text-left"},
 		{headerName: "수량", 			field: "chgQty", 		width: 80, cellClass: "text-center"},
-		{headerName: "반품방식", 		field: "wdGb", 			width: 80, cellClass: "text-center",
-			cellRenderer: function (params) { return params.value == 'W' ? '방문회수' : '직접배송'; }
-		},
-		{headerName: "택배사전송", 	field: "sendYn", 		width: 80, cellClass: "text-center"},
+		{headerName: "반품방식", 		field: "wdGbNm", 			width: 80, cellClass: "text-center"},
+		{headerName: "택배사전송", 		field: "sendYn", 		width: 80, cellClass: "text-center"},
 		{headerName: "회수송장번호", 	field: "wdInvoiceNo", 	width: 100, cellClass: "text-center"},
 		{headerName: "회수상태", 		field: "wdShipStateNm", width: 120, cellClass: "text-center"},
 		{headerName: "회수상태수신일시", field: "wdStateDt", 	width: 120, cellClass: "text-center"},
-		{headerName: "미회수사유", 	field: "wdReasonCdNm", 	width: 100, cellClass: "text-center"},
-		{headerName: "재회수지시", 	field: "wdShipState", 		width: 100,	cellClass: 'text-center',
+		{headerName: "미회수사유", 		field: "wdReasonCdNm", 	width: 100, cellClass: "text-center"},
+		{headerName: "재회수지시", 		field: "wdShipState", 		width: 100,	cellClass: 'text-center',
 			cellRenderer: function(params) {
 				return params.value == '12' && params.data.chgStat == 'G685_30' ? '<button type="button" class="btn btn-base btn-sm" onclick="fnReRecallOrder(\'' + params.data.chgGb + '\',\'' + params.data.ordDtlNo + '\',\''+params.data.ordChgSq+'\',\''+params.data.ordNo+'\');">&nbsp;재회수지시&nbsp;</button>' : "";
 			}
@@ -219,22 +215,22 @@
 		{headerName: "배송종료일시", 	field: "wdEddt", 		width: 120, cellClass: "text-center"},
 		{headerName: "수취인명", 		field: "recipNm", 		width: 120, cellClass: "text-center"},
 		
-		{headerName: "LMS", 			field: "chgerPhnno", 	width: 80, cellClass: "text-center",
+		{headerName: "LMS", 			field: "maskingChgerPhnno", 	width: 80, cellClass: "text-center",
 			cellRenderer: function(params) {
 				return '<button type="button" class="btn btn-base btn-sm" onclick="fnLms(\'' + params.data.chgerPhnno + '\',\'' + params.data.custNo + '\');">&nbsp;LMS&nbsp;</button>';
 			}			
 		},
 		
 		
-		{headerName: "변경자명", 		field: "chgerNm", 		width: 100, cellClass: "text-center"},
-		{headerName: "변경자휴대전화", 	field: "chgerPhnno", 	width: 120, cellClass: "text-center"},
-		{headerName: "변경자우편번호", 	field: "chgerZipcode", 	width: 120, cellClass: "text-center"},
-		{headerName: "변경자기본주소", 	field: "chgerBaseAddr", width: 300, cellClass: "text-left"},
-		{headerName: "변경자상세주소", 	field: "chgerDtlAddr", 	width: 200, cellClass: "text-left"},
-		{headerName: "주문자명", 		field: "ordNm", 		width: 100, cellClass: "text-center"},
-		{headerName: "주문자휴대전화", 	field: "ordPhnno", 		width: 120, cellClass: "text-center"},
-		{headerName: "주문자전화번호", 	field: "ordTelno", 		width: 120, cellClass: "text-center"},
-		{headerName: "주문자이메일", 	field: "ordEmail", 		width: 120, cellClass: "text-left"}
+		{headerName: "보내시는분", 			field: "maskingChgerNm", 		width: 100, cellClass: "text-center"},
+		{headerName: "반품회수지휴대전화", 	field: "maskingChgerPhnno", 	width: 120, cellClass: "text-center"},
+		{headerName: "반품회수지우편번호", 	field: "chgerZipcode", 			width: 120, cellClass: "text-center"},
+		{headerName: "반품회수지기본주소", 	field: "chgerBaseAddr", 		width: 300, cellClass: "text-left"},
+		{headerName: "변경자상세주소", 		field: "maskingChgerDtlAddr", 	width: 200, cellClass: "text-left"},
+		{headerName: "주문자명", 			field: "maskingOrdNm", 			width: 100, cellClass: "text-center"},
+		{headerName: "주문자휴대전화", 		field: "maskingOrdPhnno", 		width: 120, cellClass: "text-center"},
+		{headerName: "주문자전화번호", 		field: "ordTelno", 				width: 120, cellClass: "text-center"},
+		{headerName: "주문자이메일", 		field: "maskingOrdEmail", 		width: 120, cellClass: "text-left"}
 	];
 
 	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
@@ -268,8 +264,7 @@
 	
 	// 조회
 	$('#btnSearch').on('click', function() {
-		// Fetch data
-		//gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+		$("#searchForm input[name=pageNo]").val('1');
 		fnSearchList();
 	});
 
@@ -325,6 +320,13 @@
 		
 	}
 	
+	// 페이징
+	$('#searchForm select[name=pageSize]').on('change', function() {
+		$("#searchForm input[name=pageNo]").val('1');
+		fnSearchList();
+	});
+	
+	
 	/*************************************************************************
 	*  재회수지시
 	**************************************************************************/	

+ 12 - 2
src/main/webapp/WEB-INF/views/withdraw/WithdrawExceptionListForm.html

@@ -362,6 +362,7 @@
 	*  조회 버튼 클릭 시
 	**************************************************************************/
 	$('#btnSearch').on('click', function() {
+		$("#searchForm input[name=pageNo]").val('1');
 		fnSearchList();
 	});
 	
@@ -403,6 +404,12 @@
 		
 	}
 	
+	// 페이징
+	$('#searchForm select[name=pageSize]').on('change', function() {
+		$("#searchForm input[name=pageNo]").val('1');
+		fnSearchList();
+	});
+	
 	
 	var fnOrderDetailPopup = function(orderNo){
 		currOrdNo = orderNo;
@@ -494,7 +501,7 @@
 						cfnOpenModalPopup(actionUrl, 'popupReturnRequestForm');
 					}
 				*/
-
+				
 					
 				} else if (event.data.reasonCode == '02' || event.data.reasonCode == '03') { // 미착 , 과착 
 					param += "&ordNo=" 			+ event.data.orderNo;
@@ -563,7 +570,7 @@
 				param += "&ordNo=" 			+ event.data.orderNo;
 				param += "&ordDtlNo=" 		+ event.data.orderDtlNo;
 				param += "&delvFeeCd="		+ event.data.delvFeeCd;
-				param += "&ordChgGb="		+ "G681_50"";
+				param += "&ordChgGb="		+ "G681_50";
 				param += "&delvFeeCdGrp="	+ "WMS";
 				param += "&ordChgSq=" 		+ ordChgSq;
 				param += "&ordDtlNoArr=" 	+ ordDtlNoList.split(",");
@@ -572,7 +579,10 @@
 				
 				var actionUrl = "/orderChange/rtn/req/form?" + param;
 				cfnOpenModalPopup(actionUrl, 'popupReturnRequestForm');
+				
 			}
+			
+			
 		}
 	}
 

+ 9 - 4
src/main/webapp/WEB-INF/views/withdraw/WmsWithdrawListForm.html

@@ -71,7 +71,7 @@
 							<td class="dashR">
 								<select name="recalltypecd" id="recalltypecd" class="w100">
 									<option value="" selected>전체</option>
-									<option value="10">반</option>
+									<option value="10">반</option>
 									<option value="20">교환</option>
 								</select>
 							</td>
@@ -157,9 +157,7 @@
 		},
 		{headerName: "주문상세번호",		field: "orderdtlno",		width: 100,	cellClass: 'text-center'},
 		{headerName: "상태",				field: "statuscd",			width: 100,	cellClass: 'text-center'},
-		{headerName: "반품구분",			field: "recalltypecd",		width: 80,	cellClass: 'text-center',
-			cellRenderer: function (params) { return params.value == '10' ? '일반' : '교환'; }	
-		},
+		{headerName: "반품구분",			field: "recalltypecdnm",	width: 80,	cellClass: 'text-center'},
 		{headerName: "수취인",			field: "receiver",			width: 100,	cellClass: 'text-center'},
 		{headerName: "수취인전화번호",	field: "receivertelnum",	width: 120,	cellClass: 'text-center'},
 		{headerName: "수취인휴대폰번호",	field: "receivercellnum",	width: 120,	cellClass: 'text-center'},
@@ -227,6 +225,7 @@
 	*  조회 버튼 클릭 시
 	**************************************************************************/
 	$('#btnSearch').on('click', function() {
+		$("#searchForm input[name=pageNo]").val('1');
 		fnSearchList();
 	});
 
@@ -268,6 +267,12 @@
 		
 	}
 	
+	// 페이징
+	$('#searchForm select[name=pageSize]').on('change', function() {
+		$("#searchForm input[name=pageNo]").val('1');
+		fnSearchList();
+	});
+	
 	/*************************************************************************
 	*  달력 초기화 
 	**************************************************************************/		

+ 1 - 1
src/main/webapp/dx5/module/dextuploadx5-application-list.js

@@ -21,7 +21,7 @@ var area = this.uFArea, ch = area.att("height"), unit = gvector.fileItemHeight,
 this.uFArea.att("filter", show ? "url(#UIS-BLURING-JOB)" : ""); } else { this.uJobBk.css("display", show ? "block" : "none"); } this.uJobTxt.replaceText("").css("display", show ? "block" : "none").att("fill", enableFilterFx ? "#000" : "#fff"); }; ApplicationForm.prototype.createUIItem = function (item) { var uitem = svgh.createUnit("svg", item.id, { "class": "css-item", x: 0, y: (gsortedList.length * gvector.fileItemHeight), width: "100%", "layout-dx5": "height:{fileItemHeight};" }); var ugroup = svgh.createUnit("g").into(uitem); var utooltip = svgh.createUnit("title").append(svgh.mkTextNode(item.name)).into(ugroup);
 var uback = svgh.createUnit("rect").attp({ "class": "css-item-back", x: 0, y: 0, width: "100%", height: "100%" }).into(ugroup);   var uchkgroup = svgh.createUnit("g", item.id + "-CHECKER", { "class": "css-item-checker" }).into(ugroup); var uchknot = svgh.createUnit("use", item.id + "-CHECKER-NOT", { "style": "display:" + (item.checked ? "none" : "block"), "xlink:href": "#UIS-CHECKER", x: 7, width: 16, height: 16, "layout-dx5": "y:50%-8.5px;" }).into(uchkgroup); var uchkchk = svgh.createUnit("use", item.id + "-CHECKER-CHK", { "style": "display:" + (item.checked ? "block" : "none"), "xlink:href": "#UIS-CHECKER-CHKED", x: 7, width: 16, height: 16, "layout-dx5": "y:50%-8.5px;" }).into(uchkgroup); if (gvector.checkerWidth === 0) uchkgroup.att("class", "hide", true);
 var uicon = svgh.createUnit("image").attp({ width: 18, height: 19, "layout-dx5": "x:8px+{checkerWidth}; y:50%-10px", "xlink:href": "../assets/icons/" + getIconFilename(item.name) }).into(ugroup);   var nameWidthFormat = "100%-32px-{opWidth}-{sizeColumnWidth}-{checkerWidth}", btnRunDisplay = false, btnDownDisplay = false; if (item.type == "VIRTUAL" && item.openUrl && gvector.openButtonVisible) { nameWidthFormat += "-20px"; btnRunDisplay = true; } if (item.type == "VIRTUAL" && item.downUrl && gvector.downloadButtonVisible) { nameWidthFormat += "-20px";
-btnDownDisplay = true; } var unamearea = svgh.createUnit("svg").attp({ "class": "css-item-name-svg", y: 0, height: "100%", "layout-dx5": "x:28px+{checkerWidth};width:" + nameWidthFormat + ";" }).into(ugroup); var ufname = svgh.createUnit("text").attp({ "class": "css-item-font-name css-item-font-color", x: 0, "layout-dx5": "y:{itemTextBaseline};", "font-size": "11px" }).append(svgh.mkTextNode(item.name)).into(unamearea); var ubtnrun = svgh.createUnit("use", item.id + "-OPRUN", { "class": "css-item-op-run", style: "cursor:pointer;display:" + (btnRunDisplay ? "block" : "none"), "xlink:href": "#UIS-RUN", width: 16, height: 16, "layout-dx5": "x:100%-{opWidth}-{sizeColumnWidth}-40px; y:50%-8px;" }).into(ugroup); var ubtndown = svgh.createUnit("use", item.id + "-OPDOWN", { "class": "css-item-op-down", style: "cursor:pointer;display:" + (btnDownDisplay ? "block" : "none"), "xlink:href": "#UIS-DOWNLOAD", width: 16, height: 16, "layout-dx5": "x:100%-{opWidth}-{sizeColumnWidth}-20px; y:50%-8px;" }).into(ugroup);
+btnDownDisplay = true; } var unamearea = svgh.createUnit("svg").attp({ "class": "css-item-name-svg", y: 0, height: "100%", "layout-dx5": "x:28px+{checkerWidth};width:" + nameWidthFormat + ";" }).into(ugroup); var ufname = svgh.createUnit("text").attp({ "class": "css-item-font-name css-item-font-color", x: 0, "layout-dx5": "y:{itemTextBaseline};", "font-size": "11px" }).append(svgh.mkTextNode(item.name)).into(unamearea); var ubtnrun = svgh.createUnit("use", item.id + "-OPRUN", { "class": "css-item-op-run", style: "cursor:pointer;display:" + (btnRunDisplay ? "block" : "none"), "xlink:href": "#UIS-RUN", width: 16, height: 16, "layout-dx5": "x:100%-{opWidth}-{sizeColumnWidth}-40px; y:50%-8px;" }).into(ugroup); var ubtndown = svgh.createUnit("use", item.id + "-OPDOWN", { "class": "css-item-op-down", style: "cursor:pointer;display:" + (btnDownDisplay ? "none" : "none"), "xlink:href": "#UIS-DOWNLOAD", width: 16, height: 16, "layout-dx5": "x:100%-{opWidth}-{sizeColumnWidth}-20px; y:50%-8px;" }).into(ugroup);
 var usize = svgh.createUnit("text").attp({ "class": "css-item-size css-item-font-name css-item-font-color", "text-anchor": "end", "layout-dx5": "x:100%-{opWidth}-8px; y:{itemTextBaseline};", "font-size": "11px" }).append(svgh.mkTextNode(item.size < 0 ? "" : getFriendlySize(item.size))).into(ugroup); var ustatus = svgh.createUnit("use", item.id + "-STATUS", { width: 16, height: 16, "layout-dx5": "x:100%-{opWidth}+7px; y:50%-8px;" }).into(ugroup); if (item.lock === true) ustatus.att("xlink:href", "#UIS-LOCK"); else if (item.status == "DONE") ustatus.att("xlink:href", "#UIS-UPDONE");
 else if (item.type == "FILE" && item.status == "WAIT") ustatus.att("xlink:href", "#UIS-UPWAIT"); else ustatus.att("xlink:href", "#UIS-VFWAIT"); svgh.createUnit("line").attp({ "class": "css-item-grid css-item-grid-color", y1: 0, y2: "100%", "shape-rendering": "crispEdges", "stroke-width": 1, "layout-dx5": "x1:100%-{opWidth}-{sizeColumnWidth}; x2:100%-{opWidth}-{sizeColumnWidth};" }).into(ugroup); svgh.createUnit("line").attp({ "class": "css-item-grid css-item-grid-color", y1: 0, y2: "100%", "shape-rendering": "crispEdges", "stroke-width": 1, "layout-dx5": "x1:100%-{opWidth}; x2:100%-{opWidth};" }).into(ugroup); svgh.createUnit("line").attp({ "class": "css-item-grid css-item-grid-color", x1: 0, y1: "100%", x2: "100%", y2: "100%", "shape-rendering": "crispEdges", "stroke-width": 1.5 }).into(ugroup);
 ugroup.atto("dataItem", item).bind("click", onItemClickHandler, false);   uchknot.atto("dataItem", item).bind("click", onFileCheckHandler, false); uchkchk.atto("dataItem", item).bind("click", onFileCheckHandler, false); ubtnrun.atto("dataItem", item).bind("click", onRunFileHandler, false); ubtndown.atto("dataItem", item).bind("click", onDownloadFileHandler, false); return uitem.element; }; ApplicationForm.prototype.updateUIItem = function (item) { var op = svgh.getAsUnit(item.id + "-STATUS");   if (op.element.correspondingUseElement) op = new SVGUnit(op.element.correspondingUseElement); if (item.lock === true) op.att("xlink:href", "#UIS-LOCK");

BIN
src/main/webapp/image/logo_STYLE24.png


+ 52 - 0
src/main/webapp/ux/js/admin.common.js

@@ -207,6 +207,58 @@ var cfnCreateMultiCombo = function(actionUrl, oTarget, defaultTxt, chooseValArr,
 	}
 }
 
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : Combobox 구성
+ * <pre>
+ *     cfnCreateDelvPolicyCombo("3", oTarget, "[선택]");
+ * </pre>
+ * @param  : supplyCompCd - 업체코드. 필수
+ *           oTarget - target 오브젝트. 필수
+ *           defaultTxt - default 텍스트([선택]/[전체]). option
+ *           chooseCd - 선택된 코드 값. option
+ *           isCodeDisp - 코드표시(true/false). option
+ * @return : None
+ * @since  : 2021/07/19
+ * @author : eskim
+ */
+var cfnCreateDelvPolicyCombo = function(supplyCompCd, oTarget, defaultTxt, chooseCd, isCodeDisp) {
+	if (gagajf.isNull(isCodeDisp)) isCodeDisp = true;
+
+	var actionUrl = '/renderer/delvPolicy/list/' + supplyCompCd;
+	$.getJSON(actionUrl
+		, function(result, status) {
+			if (status == 'success') {
+				$('option', oTarget).remove();
+
+				if (!gagajf.isNull(defaultTxt)) {
+					$(oTarget).append('<option value="">' + defaultTxt + '</option>');
+				}
+
+				$.each(result, function(idx, data) {
+					var tag = '<option value="' + data.delvFeeCd + '"';
+
+					if (!gagajf.isNull(chooseCd) && chooseCd == data.delvFeeCd) {
+						tag += ' selected';
+					}
+					
+					tag += ' minOrdAmt="' + data.minOrdAmt+ '"' ;
+					tag += ' delvFee="' + data.delvFee+ '"' ;
+
+					if (isCodeDisp) {
+						tag += '>[' + data.delvFeeCd + '] ' + data.delvFeeNm + '</option>';
+					} else {
+						tag += '>' + data.delvFeeNm + '</option>';
+					}
+
+					$(oTarget).append(tag);
+				});
+			}
+		});
+}
+
+
 /**
  * @type   : function
  * @access : public

+ 41 - 6
src/main/webapp/ux/plugins/gaga/gaga.validation.js

@@ -107,7 +107,7 @@ var gagajf = {
 	testRegexp : function(el, regexp, type) {
 		var val = $(el).val();
 
-		if (type == 'integer' || type == 'real') {
+		if (type == 'integer' || type == 'pinteger' || type == 'real' || type == 'preal') {
 			// 콤마(,) 제거
 			val = val.removeComma();
 		}
@@ -307,12 +307,24 @@ var gagajf = {
 					if (gagajf.testRegexp($(el), /(^-?[0-9]+\d*$)|(^-$)/, 'integer'))
 						return true;
 
+					isInvalid = false;
+					return false;
+				case 'pinteger': // 양의정수
+					if (gagajf.testRegexp($(el), /(^[0-9]+\d*$)/, 'pinteger'))
+						return true;
+
 					isInvalid = false;
 					return false;
 				case 'real': // 실수
 					if (gagajf.testRegexp($(el), /^-?(([0-9]+\.?)|(\.?))\d*$/, 'real'))
 						return true;
 
+					isInvalid = false;
+					return false;
+				case 'preal': // 실수
+					if (gagajf.testRegexp($(el), /^(([0-9]+\.?)|(\.?))\d*$/, 'preal'))
+						return true;
+
 					isInvalid = false;
 					return false;
 				case 'alphaNumeric': // 알파벳+숫자
@@ -396,8 +408,8 @@ var gagajf = {
 							return false;
 						}
 					}
-
 				case 'integer': // 정수
+				case 'pinteger': // 양의정수
 					//최대값
 					if ($(el).attr("max")) {
 						if ($(el).val() > $(el).attr("max")) {
@@ -425,6 +437,7 @@ var gagajf = {
 						}
 					}
 				case 'real': // 실수
+				case 'preal': // 양의실수
 					//최대값
 					if ($(el).attr("max")) {
 						if ($(el).val() > $(el).attr("max")) {
@@ -478,24 +491,24 @@ var gagajf = {
 	},
 
 	/**
-	 * formId의 input의 data-valid-type이 integer, real인 경우에 값에 comma(,)를 자동으로 붙여 표시한다.
+	 * formId의 input의 data-valid-type이 integer, pinteger, real, preal인 경우에 값에 comma(,)를 자동으로 붙여 표시한다.
 	 * 사용) gagajf.addCommaAtNumberFormattedInput('#registerForm');
 	 */
 	addCommaAtNumberFormattedInput : function(formId) {
 		$(formId).find('input').each(function(idx, el) {
-			if ($(el).data('validType') == 'integer' || $(el).data('validType') == 'real') {
+			if ($(el).data('validType') == 'integer' || $(el).data('validType') == 'pinteger' || $(el).data('validType') == 'real' || $(el).data('validType') == 'preal') {
 				$(el).val($(el).val().removeComma().addComma());
 			}
 		});
 	},
 
 	/**
-	 * formId의 input의 data-valid-type이 integer, real, numeric 인 경우에 값에 comma(,)를 자동으로 제거한다.
+	 * formId의 input의 data-valid-type이 integer, pinteger, real, preal, numeric 인 경우에 값에 comma(,)를 자동으로 제거한다.
 	 * 사용) gagajf.removeCommaAtNumberFormattedInput('#registerForm');
 	 */
 	removeCommaAtNumberFormattedInput : function(formId) {
 		$(formId).find('input').each(function(idx, el) {
-			if ($(el).data('validType') == 'integer' || $(el).data('validType') == 'real' || $(el).data('validType') == 'numeric') {
+			if ($(el).data('validType') == 'integer' || $(el).data('validType') == 'pinteger' || $(el).data('validType') == 'real' || $(el).data('validType') == 'preal' || $(el).data('validType') == 'numeric') {
 				$(el).val($(el).val().removeComma());
 			}
 		});
@@ -1078,6 +1091,7 @@ var gagajf = {
  *           data-valid-type="integer" : 정수. 속성 지정시 숫자와 +, - 만 입력 가능
  *           data-valid-type="pinteger" : 양의정수. 속성 지정시 숫자와 +만 입력 가능
  *           data-valid-type="real" : 실수. 속성 지정시 숫자와 +, -, . 만 입력 가능
+ *           data-valid-type="preal" : 양의실수. 속성 지정시 숫자와 +, .만 입력 가능
  *           data-valid-type="alphaNumeric" : 알파벳과 숫자. 속성 지정 시 영문과 숫자만 형식에 맞게 입력 가능
  *           data-valid-type="date" : 숫자와 / 만 입력 가능
  *           data-valid-type="korean" : 한글. 속성 지정 시 한글만 형식에 맞게 입력 가능
@@ -1092,6 +1106,7 @@ var gagajf = {
  *     <input type="text" data-valid-type="integer" />
  *     <input type="text" data-valid-type="pinteger" />
  *     <input type="text" data-valid-type="real" />
+ *     <input type="text" data-valid-type="preal" />
  *     <input type="text" data-valid-type="alphaNumeric" />
  *     <input type="text" data-valid-type="date" />
  *     <input type="text" data-valid-type="korean" />
@@ -1182,6 +1197,26 @@ $(document).on("keydown", "[data-valid-type=real]", function() {
 		event.returnValue = false;
 	}
 });
+$(document).on("blur", "[data-valid-type=preal]", function() { $(this).val($(this).val().removeComma().addComma()); });
+$(document).on("click", "[data-valid-type=preal]", function() { $(this).val($(this).val().removeComma()); });
+$(document).on("keyup", "[data-valid-type=preal]", function() { $(this).val($(this).val().replace(/[^0-9\+\.]/gi,"")); });
+$(document).on("keydown", "[data-valid-type=preal]", function() {
+	var value = $(this).val();
+
+	var keyCode = gagajf.getKeyCode();
+	if (keyCode == -1)
+		return true;
+
+	if (!((keyCode >= 48 && keyCode <= 57 && !event.shiftKey) // 0 ~ 9
+		|| (keyCode >= 96 && keyCode <= 105) // 0 ~ 9 (Num Lock)
+		|| (keyCode == 187 && event.shiftKey) // Shift 하고 +
+		|| (keyCode == 107) // + (Num Lock)
+		|| (keyCode == 190 && !event.shiftKey) // .
+		)) {
+		$(this).val(value);
+		event.returnValue = false;
+	}
+});
 $(document).on("keyup", "[data-valid-type=alphaNumeric]", function() { $(this).val($(this).val().replace(/[^a-zA-Z0-9]/gi, "")); });
 $(document).on("keyup", "[data-valid-type=date]", function() { $(this).val($(this).val().replace(/[^0-9\/]/gi,"")); });
 $(document).on("keyup", "[data-valid-type=calendar]", function() { $(this).val($(this).val().replace(/[^0-9\/]/gi,"")); });