Просмотр исходного кода

Merge branch 'develop' into csh9191

ChoiSooHwan 5 лет назад
Родитель
Сommit
bcbaee458d
33 измененных файлов с 1738 добавлено и 284 удалено
  1. 11 1
      src/main/java/com/style24/admin/biz/dao/TsaDeliveryDao.java
  2. 18 2
      src/main/java/com/style24/admin/biz/dao/TsaWithdrawDao.java
  3. 45 0
      src/main/java/com/style24/admin/biz/dao/TsaWmsWithdrawDao.java
  4. 2 1
      src/main/java/com/style24/admin/biz/service/TsaBusinessService.java
  5. 16 2
      src/main/java/com/style24/admin/biz/service/TsaDeliveryService.java
  6. 9 1
      src/main/java/com/style24/admin/biz/service/TsaDisplayService.java
  7. 18 2
      src/main/java/com/style24/admin/biz/service/TsaWithdrawService.java
  8. 58 0
      src/main/java/com/style24/admin/biz/service/TsaWmsWithdrawService.java
  9. 10 1
      src/main/java/com/style24/admin/biz/web/TsaCustomerController.java
  10. 38 16
      src/main/java/com/style24/admin/biz/web/TsaDeliveryController.java
  11. 2 1
      src/main/java/com/style24/admin/biz/web/TsaGoodsController.java
  12. 52 2
      src/main/java/com/style24/admin/biz/web/TsaWithdrawController.java
  13. 9 1
      src/main/java/com/style24/persistence/domain/Contents.java
  14. 9 0
      src/main/java/com/style24/persistence/domain/Delivery.java
  15. 72 0
      src/main/java/com/style24/persistence/domain/WmsWithdraw.java
  16. 2 2
      src/main/java/com/style24/persistence/mybatis/shop/TsaBusiness.xml
  17. 181 8
      src/main/java/com/style24/persistence/mybatis/shop/TsaDelivery.xml
  18. 5 5
      src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml
  19. 2 2
      src/main/java/com/style24/persistence/mybatis/shop/TsaSocial.xml
  20. 11 4
      src/main/java/com/style24/persistence/mybatis/shop/TsaWithdraw.xml
  21. 113 0
      src/main/java/com/style24/persistence/mybatis/wms/TsaWmsWithdraw.xml
  22. 19 15
      src/main/webapp/WEB-INF/views/business/BrandGroupPopupForm.html
  23. 13 5
      src/main/webapp/WEB-INF/views/customer/CustomerSecedePopupForm.html
  24. 146 119
      src/main/webapp/WEB-INF/views/delivery/DeliveryWithdrawDirectiveListForm.html
  25. 157 41
      src/main/webapp/WEB-INF/views/display/MainContentsPopupForm.html
  26. 317 23
      src/main/webapp/WEB-INF/views/display/MainGnbContentsPopupForm.html
  27. 52 5
      src/main/webapp/WEB-INF/views/display/MainListForm.html
  28. 2 2
      src/main/webapp/WEB-INF/views/display/MainMultiContentsPopupForm.html
  29. 6 4
      src/main/webapp/WEB-INF/views/goods/GoodsFreeGoodsForm.html
  30. 1 1
      src/main/webapp/WEB-INF/views/withdraw/RefundDetailForm.html
  31. 1 1
      src/main/webapp/WEB-INF/views/withdraw/RefundRegisterListForm.html
  32. 2 17
      src/main/webapp/WEB-INF/views/withdraw/WithdrawExceptionListForm.html
  33. 339 0
      src/main/webapp/WEB-INF/views/withdraw/WmsWithdrawListForm.html

+ 11 - 1
src/main/java/com/style24/admin/biz/dao/TsaDeliveryDao.java

@@ -147,13 +147,23 @@ public interface TsaDeliveryDao {
 	 */
 	void createBangoods(Delivery delivery);
 	
+	/**
+	 * 배송/회수지시 목록 건수
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author moon
+	 * @since 2021. 03. 12
+	 */
+	int getDeliveryWithdrawDirectiveListCount(Delivery delivery);
+	
 	/**
 	 * 배송/회수지시 목록
 	 *
 	 * @param Delivery - 배송/회수지시 정보
 	 * @return Collection<Delivery>
 	 * @author moon
-	 * @since 2020. 11. 11
+	 * @since 2021. 03. 12
 	 */	
 	Collection<Delivery> getDeliveryWithdrawDirectiveList(Delivery delivery);
 }

+ 18 - 2
src/main/java/com/style24/admin/biz/dao/TsaWithdrawDao.java

@@ -8,14 +8,16 @@ import com.style24.persistence.domain.Delivery;
 //import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.Withdraw;
 import com.style24.persistence.domain.WithdrawExc;
+import com.style24.persistence.domain.WmsWithdraw;
+
 import com.style24.core.support.annotation.ShopDs;
 import org.springframework.stereotype.Repository;
 
 /**
  * 회수관리 Dao
  * 
- * @author Daehyoung
- * @since 2020. 02. 06
+ * @author moon
+ * @since 2020. 11. 16
  */
 @ShopDs
 @Repository
@@ -53,6 +55,20 @@ public interface TsaWithdrawDao {
 	 */
 	void updateWithdrawException(WithdrawExc withdrawExc);
 	
+	
+	/**
+	 * 상품옵션 정보
+	 * 
+	 * @param WmsWithdraw
+	 * @return WmsWithdraw
+	 * @author moon
+	 * @since 2021. 03. 11
+	 */
+	WmsWithdraw getOptionInfo(WmsWithdraw wmswithdraw);
+		
+	
+	
+	
 	/**
 	 * 회수등록 - 조회(송장번호용)
 	 * 

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

@@ -0,0 +1,45 @@
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import org.springframework.dao.DataAccessException;
+
+import com.style24.persistence.domain.WmsWithdraw;
+
+import com.style24.core.support.annotation.WmsDs;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 회수관리 Dao
+ * 
+ * @author moon
+ * @since 2021. 03. 10
+ */
+@WmsDs
+@Repository
+public interface TsaWmsWithdrawDao {
+
+	
+	/**
+	 *  WMS회수 목록  건수
+	 * 
+	 * @param WmsWithdraw
+	 * @return int
+	 * @author moon
+	 * @since 2021. 03. 10
+	 */
+	int getWmsWithdrawListCount(WmsWithdraw wmsWithdraw);
+
+	/**
+	 * WMS회수 목록 
+	 * 
+	 * @param WmsWithdraw
+	 * @return Collection<WmsWithdraw>
+	 * @author moon
+	 * @since 2021. 03. 10
+	 */
+	Collection<WmsWithdraw> getWmsWithdrawList(WmsWithdraw wmsWithdraw);
+	
+	
+
+}

+ 2 - 1
src/main/java/com/style24/admin/biz/service/TsaBusinessService.java

@@ -449,7 +449,7 @@ public class TsaBusinessService {
 			String brandImgName = "BRAND_" + brandGroup.getBrandGroupNo() + "_" + GagaDateUtil.getTodayDateTime() + "." + StringUtils.getFilenameExtension(brandGroup.getNewSysFileNm());
 
 			String brandUploadPath = env.getProperty("upload.default.target.path");
-			brandUploadPath = GagaFileUtil.getConcatenationPath(brandUploadPath, "display");
+			brandUploadPath = GagaFileUtil.getConcatenationPath(brandUploadPath, "contents", "brand");
 
 			//기존이미지 삭제
 			try {
@@ -467,6 +467,7 @@ public class TsaBusinessService {
 			// Rename a file
 			file.renameTo(uniqueFile);
 
+			brandImgName = "/contents/brand/" + brandImgName;
 			brandGroup.setLogoFileNm(brandImgName);
 
 		}

+ 16 - 2
src/main/java/com/style24/admin/biz/service/TsaDeliveryService.java

@@ -52,7 +52,7 @@ public class TsaDeliveryService {
 	/**
 	 * 배송 목록 건수
 	 *
-	 * @param goodsSearch
+	 * @param Delivery
 	 * @return
 	 * @author moon
 	 * @since 2021. 02. 26
@@ -263,13 +263,27 @@ public class TsaDeliveryService {
 		}
 	}
 	
+	/**
+	 * 배송/회수지시 목록 건수
+	 *
+	 * @param Delivery
+	 * @return
+	 * @author moon
+	 * @since 2021. 02. 26
+	 */
+	public int getDeliveryWithdrawDirectiveListCount(Delivery delivery) {
+		return deliveryDao.getDeliveryWithdrawDirectiveListCount(delivery);
+	}	
+	
+	
+	
 	/**
 	 * 배송/회수지시 목록
 	 *
 	 * @param -Delivery
 	 * @return Collection<Delivery>
 	 * @author moon
-	 * @since 2020. 11. 11
+	 * @since 2021. 03. 12
 	 */	
 	public Collection<Delivery> getDeliveryWithdrawDirectiveList(Delivery delivery) {
 		return deliveryDao.getDeliveryWithdrawDirectiveList(delivery);

+ 9 - 1
src/main/java/com/style24/admin/biz/service/TsaDisplayService.java

@@ -15,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collection;
 
 /**
@@ -532,7 +533,7 @@ public class TsaDisplayService {
 			log.info("getGoodsCdArr contents:::::{}",contents);
 			//log.info("getGoodsCdArr length:::::{}",contents.getGoodsCdArr().length);
 			if(contents != null && contents.getGoodsCdArr() != null){
-				contents.setPreContentsSq(contents.getDispOrd());
+				contents.setContentsSq(contents.getDispOrd());
 				contents.setRegNo(TsaSession.getInfo().getUserNo());
 				displayDao.deleteContentsGoodsTemp(contents);
 
@@ -549,10 +550,14 @@ public class TsaDisplayService {
 
 		int ind = 1;
 		for (Contents contents : contentsList) {
+			contents.setContentsSq(null);
+			log.info("1==========={}");
 			if (contents != null && contents.getDispStdt() != null && !contents.getDispStdt().equals("")) {
 				// 브랜드 이미지 변경이 일어났을 경우
+				log.info("2==========={}");
 				String brandGroupImg = contents.getBrandGroupImg();
 				if(brandGroupImg != null && !brandGroupImg.equals("")){
+					log.info("3==========={}");
 					String imgInd = "01";
 					String bannerUploadPath = env.getProperty("upload.default.target.path");
 					bannerUploadPath = bannerUploadPath + "/display/";
@@ -572,9 +577,12 @@ public class TsaDisplayService {
 				}
 
 				int cnt = 1;
+				log.info("4==========={}");
 				for (String newImgFile : contents.getNewImgFileArr()) {
+					log.info("5==========={}");
 					//이미지 변경이 일어났을 경우
 					if (newImgFile != null && !newImgFile.equals("")) {
+						log.info("6==========={}");
 						String imgInd = String.valueOf(ind);
 						if (ind < 10) {
 							imgInd = "0" + imgInd;

+ 18 - 2
src/main/java/com/style24/admin/biz/service/TsaWithdrawService.java

@@ -16,7 +16,6 @@ import lombok.extern.slf4j.Slf4j;
 import com.style24.admin.biz.dao.TsaDeliveryDao;
 //import com.style24.admin.biz.dao.TsaOrderDao;
 import com.style24.admin.biz.dao.TsaWithdrawDao;
-//import com.style24.admin.biz.dao.TsaWmsWithdrawDao;
 import com.style24.persistence.domain.Delivery;
 //import com.style24.persistence.domain.Coupon;
 //import com.style24.persistence.domain.Delivery;
@@ -25,7 +24,7 @@ import com.style24.persistence.domain.Delivery;
 //import com.style24.persistence.domain.Point;
 import com.style24.persistence.domain.Withdraw;
 import com.style24.persistence.domain.WithdrawExc;
-
+import com.style24.persistence.domain.WmsWithdraw;
 
 //import com.style24.admin.support.env.TsaConstants;
 //import com.style24.admin.support.env.TsaConstants.OrderStat;
@@ -109,6 +108,23 @@ public class TsaWithdrawService {
 		
 	}
 	
+	/**
+	 * 회수예외 목록 
+	 *
+	 * @param Delivery
+	 * @return
+	 * @author moon
+	 * @since 2021. 03. 04
+	 */
+	public Collection<WmsWithdraw> getOptionInfo(Collection<WmsWithdraw> wmsWithdrawList) {
+		
+		for(WmsWithdraw data : wmsWithdrawList) {
+			
+			WmsWithdraw optionInfo = withdrawDao.getOptionInfo(data);
+			data.setGoodsCd(optionInfo.getGoodsCd());
+		}
+		return wmsWithdrawList; 
+	}	
 	
 	/**
 	 * 회수등록 - 조회(송장번호용)

+ 58 - 0
src/main/java/com/style24/admin/biz/service/TsaWmsWithdrawService.java

@@ -0,0 +1,58 @@
+package com.style24.admin.biz.service;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import lombok.extern.slf4j.Slf4j;
+
+import com.style24.admin.biz.dao.TsaWmsWithdrawDao;
+import com.style24.persistence.domain.WmsWithdraw;
+import com.style24.core.support.message.TscMessageByLocale;
+
+/**
+ * 회수관리 Service
+ *
+ * @author moon
+ * @since 2020. 11. 16
+ */
+@Service
+@Slf4j
+public class TsaWmsWithdrawService {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TsaWmsWithdrawDao wmsWithdrawDao;
+
+
+	/**
+	 * WMS회수 목록 건수
+	 *
+	 * @param Delivery
+	 * @return
+	 * @author moon
+	 * @since 2021. 03. 10
+	 */
+	public int getWmsWithdrawListCount(WmsWithdraw wmsWithdraw) {
+		return wmsWithdrawDao.getWmsWithdrawListCount(wmsWithdraw);
+	}
+	
+	/**
+	 * WMS회수 목록 
+	 *
+	 * @param Delivery
+	 * @return
+	 * @author moon
+	 * @since 2021. 03. 10
+	 */
+	public Collection<WmsWithdraw> getWmsWithdrawList(WmsWithdraw wmsWithdraw) {
+		return wmsWithdrawDao.getWmsWithdrawList(wmsWithdraw);
+	}
+	
+}

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

@@ -670,7 +670,7 @@ public class TsaCustomerController extends TsaBaseController {
 	}
 
 	/**
-	 * 회원탈퇴처리
+	 * 회원탈퇴처리 화면
 	 *
 	 * @param elementCustNo - 고객일련번호
 	 * @return ModelAndView
@@ -692,6 +692,15 @@ public class TsaCustomerController extends TsaBaseController {
 
 		return mav;
 	}
+
+	/**
+	 * 회원탈퇴처리
+	 *
+	 * @param elementCustNo - 고객일련번호
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
 	@PostMapping("/secede/save")
 	@ResponseBody
 	public GagaMap saveCustomerSecede(@RequestBody Customer customer) {

+ 38 - 16
src/main/java/com/style24/admin/biz/web/TsaDeliveryController.java

@@ -410,30 +410,52 @@ public class TsaDeliveryController extends TsaBaseController {
 	}
 	
 	/**
-	 * 출고예외관리 화면 
-	 *
-	 * @param
-	 * @return
+	 * 배송/회수지시목록 화면
+	 * 
+	 * @return ModelAndView
 	 * @throws Exception
 	 * @author moon
-	 * @since 2021. 02. 19
+	 * @since 2021. 03. 12
 	 */
-	@GetMapping("/exception/form")
-	@ResponseBody
-	public ModelAndView deliveryExceptionListForm() throws Exception {
+	@RequestMapping(value = "/dwdirect/list/form")
+	public ModelAndView deliveryWithdrawDirectiveListForm() throws Exception {
 		ModelAndView mav = new ModelAndView();
 
-		// 공급업체
-		//mav.addObject("supplyCompList", rendererService.getSupplyCompanyList());
-		// 출고처 목록
-		//DeliveryLoc deliLoc = new DeliveryLoc(); 
-		//deliLoc.mav.addObject("getDeliveryLocList", rendererService.getDeliveryLocList(deliLoc));
-		
-		mav.setViewName("/delivery/DeliveryExceptionListForm");
+		// 사이트구분
+		mav.addObject("siteCdList", rendererService.getAvailCommonCodeList("G000"));
+
+		mav.setViewName("delivery/DeliveryWithdrawDirectiveListForm");
 
 		return mav;
 	}
 
-	
+	/**
+	 * 배송/회수지시 목록
+	 * 
+	 * @param dwDirective - 배송/회수지시 정보
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2021. 03. 12
+	 */
+	@RequestMapping(value = "/dwdirect/list", method = RequestMethod.POST)
+	@ResponseBody
+	public GagaMap getDeliveryWithdrawDirectiveList(@RequestBody Delivery dwDirective) throws Exception {
+
+		GagaMap result = new GagaMap();
+
+		dwDirective.setPageable(new TscPageRequest(dwDirective.getPageNo() - 1, dwDirective.getPageSize()));
+		dwDirective.getPageable().setTotalCount(deliveryService.getDeliveryWithdrawDirectiveListCount(dwDirective)); 
+
+
+		if ("N".equals(dwDirective.getPageingYn())) {
+			dwDirective.setPageable(null);
+		}		
+		
+		result.set("pageing", dwDirective);
+		result.set("dwdirectList", deliveryService.getDeliveryWithdrawDirectiveList(dwDirective));		
 		
+		return result;
+	}	
+
 }

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

@@ -2616,7 +2616,7 @@ public class TsaGoodsController extends TsaBaseController {
 			String sysImgNm = freeGoods.getProductNo() + "_" + GagaDateUtil.getTodayDateTime() + "." + org.springframework.util.StringUtils.getFilenameExtension(freeGoods.getNewSysImgNm());
 
 			String imgUploadPath = env.getProperty("upload.default.target.path");
-			imgUploadPath = GagaFileUtil.getConcatenationPath(imgUploadPath, "display", "freegoods");
+			imgUploadPath = GagaFileUtil.getConcatenationPath(imgUploadPath, "contents", "freegoods");
 
 			//기존이미지 삭제
 			try {
@@ -2634,6 +2634,7 @@ public class TsaGoodsController extends TsaBaseController {
 			// Rename a file
 			file.renameTo(uniqueFile);
 
+			sysImgNm = "/contents/freegoods/" + sysImgNm;
 			freeGoods.setSysImgNm(sysImgNm);
 
 		}

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

@@ -24,9 +24,11 @@ import com.style24.persistence.domain.Delivery;
 import com.style24.persistence.domain.Pos;
 import com.style24.persistence.domain.Withdraw;
 import com.style24.persistence.domain.WithdrawExc;
+import com.style24.persistence.domain.WmsWithdraw;
 import com.style24.admin.biz.service.TsaDeliveryService;
 import com.style24.admin.biz.service.TsaRendererService;
 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.message.TscMessageByLocale;
@@ -53,6 +55,9 @@ public class TsaWithdrawController extends TsaBaseController {
 
 	@Autowired
 	private TscMessageByLocale message;
+	
+	@Autowired
+	private TsaWmsWithdrawService wmsWithdrawService;
 
 	/**
 	 * 회수등록 화면
@@ -485,13 +490,58 @@ public class TsaWithdrawController extends TsaBaseController {
 	@PostMapping("/exception/complete")
 	@ResponseBody
 	public GagaResponse updateWithdrawException(@RequestBody WithdrawExc withdrawExc) {
-		Delivery delivery = new Delivery();
-
 		withdrawService.createWithdrawInfo(withdrawExc);
 		
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 	
 	
+	/**
+	 * WMS회수목록 화면 
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2021. 03. 10
+	 */
+	@GetMapping("/wms/list/form")
+	@ResponseBody
+	public ModelAndView wmsWithdrawListForm() throws Exception {
+		ModelAndView mav = new ModelAndView();
+		
+		mav.setViewName("/withdraw/WmsWithdrawListForm");
+
+		return mav;
+	}
 	
+	/**
+	 *WMS회수목록 조회 
+	 * 
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2021. 03. 10
+	 */
+	@PostMapping("/wms/list")
+	@ResponseBody
+	public GagaMap getWmsWithdrawList(@RequestBody WmsWithdraw wmsWithdraw) throws Exception {
+		
+		GagaMap result = new GagaMap();
+		wmsWithdraw.setPageable(new TscPageRequest(wmsWithdraw.getPageNo() - 1, wmsWithdraw.getPageSize()));
+		wmsWithdraw.getPageable().setTotalCount(wmsWithdrawService.getWmsWithdrawListCount(wmsWithdraw));
+		if ("N".equals(wmsWithdraw.getPageingYn())) {
+			wmsWithdraw.setPageable(null);
+		}
+		result.set("pageing", wmsWithdraw);
+		Collection<WmsWithdraw> wmsList = wmsWithdrawService.getWmsWithdrawList(wmsWithdraw);
+		
+		wmsList = withdrawService.getOptionInfo(wmsList);
+		
+		result.set("wmsWithdrawList", wmsList);
+		
+
+		return result;
+	}	
 }

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

@@ -16,7 +16,7 @@ public class Contents extends TscBaseDomain {
     private String contentsType;
     private String dispStdt;
     private String dispEddt;
-    private Integer dispOrd;
+    private int dispOrd;
     private String contentsYn;
     private String imgPath1;
     private String imgPath2;
@@ -58,6 +58,7 @@ public class Contents extends TscBaseDomain {
     private String goodsImgList;
 
     List<Contents> dataList;
+    List<BrandGroup> brandGroupdList;
 
     @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
     private String[] contentsLocArr;
@@ -69,4 +70,11 @@ public class Contents extends TscBaseDomain {
     private String[] goodsNmArr;
     @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
     private String[] goodsImgArr;
+
+    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+    private String[] brandGroup1Arr;
+    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+    private String[] brandGroup2Arr;
+    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+    private String[] brandGroup3Arr;
 }

+ 9 - 0
src/main/java/com/style24/persistence/domain/Delivery.java

@@ -90,6 +90,15 @@ public class Delivery extends TscBaseDomain {
 	private String edDate;
 	
 	
+	private String delvGb;
+	private String delvGbNm;         // 지시구분명
+	private String sendYn;           // 전송여부
+	private String ordNm;            // 주문자명
+	private String ordPhnno;         // 주문자휴대전화번호
+	private String ordTelno;         // 주문자전화번호
+	private String ordEmail;         // 주문자이메일
+	
+	
 	private String[] conditions = null;
 	
 	

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

@@ -0,0 +1,72 @@
+package com.style24.persistence.domain;
+
+import lombok.Data;
+
+import com.style24.persistence.TscBaseDomain;
+import com.style24.persistence.TscPageRequest;
+
+/**
+ * WMS회수 Domain
+ * 
+ * @author moon
+ * @since 2021. 03. 10
+ */
+@SuppressWarnings("serial")
+@Data
+public class WmsWithdraw extends TscBaseDomain {
+
+	// 페이징 
+	private String pageingYn;
+	private int startRow;
+	private int endRow;
+	private TscPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
+	
+	// WMS회수
+	private Integer recallno;			// 반품 번호 
+	private Integer orderexceptionno;	// 주문변경번호  
+	private String recalltypecd;		// 반품타입
+	private String receiver;			// 받는자
+	private String receivertelnum;		// 받는자 전화번호
+	private String receivercellnum;		// 받는자 핸드폰 번호
+	private String deliverypostalcode;	// 우편 번호
+	private String deliveryaddr1;		// 기본 주소
+	private String deliveryaddr2;		// 상세 주소
+	private String orderno;				// 주문 번호
+	private String orderguid;			// 주문 고유 번호
+	private String customername;		// 주문자
+	private String loginid;				// 아이디
+	private String csmemo;				// cs 메모
+	private String datecsmemoupdated;	// cs 메모 변경일
+	private String wmsmemo;				// wms 메모
+	private String datewmsmemoupdated;	// wms 메모 변경일
+	private String datecreated;			// 생성일 // 회수요청일
+	private String isdeleted;			// 삭제 여부  
+	private String datedeleted;			// 삭제일  x
+	private String deliveryaddrnew;		// 도로명 주소
+	private String recallitemno;		// 반품 항목 번호 x
+	private String productno;			// 상품 번호
+	private String productcode;			// 상품 코드
+	private String productname;			// 상품명
+	private String skucode;				// 옵션 코드
+	private String skuvalue;			// 옵션 내용
+	private int recallqty;				// 수량
+	private String statuscd;			// 상태
+	private String datecompleted;		// 완료일
+	private String logisticsname;		// 택배사 명
+	private String recallinvoiceno;		// 회수송장번호
+	private String invoiceno;			// 원운송장번호
+	private Integer orderdtlno;			// 주문상세번호
+	private String goodsCd;             // 상품코드
+
+	private int rnum;
+	// 검색
+	
+	private String stDate;					// 조회 시작 기간
+	private String edDate;					// 조회 종료 기간
+	
+	
+
+}

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

@@ -1088,7 +1088,7 @@
 		     , #{brandGroupEnm}
 		     , #{brandGroupKnm}
 		     , #{dispNmLang}
-		     , #{rgbCd}
+		     , IFNULL(NULLIF(#{rgbCd},''),'222222')
 		     , #{logoFileNm}
 		     , #{regNo}
 		     , NOW()
@@ -1104,7 +1104,7 @@
 		SET    BRAND_GROUP_ENM = #{brandGroupEnm}
 		     , BRAND_GROUP_KNM = #{brandGroupKnm}
 		     , DISP_NM_LANG = #{dispNmLang}
-		     , RGB_CD = #{rgbCd}
+		     , RGB_CD = IFNULL(NULLIF(#{rgbCd},''),'222222')
 		     , LOGO_FILE_NM = #{logoFileNm}
 		     , UPD_NO = #{updNo}
 		     , UPD_DT = NOW()

+ 181 - 8
src/main/java/com/style24/persistence/mybatis/shop/TsaDelivery.xml

@@ -7,12 +7,10 @@
 		<choose>
 		<when test="pageable != null">
 		    ) A
-		    JOIN ( SELECT @rownum := 0) R
 		)Z WHERE RNUM BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
 		</when>
 		<otherwise>
 		    ) A
-		    JOIN ( SELECT @rownum := 0) R
 		)Z
 		</otherwise>
 		</choose>
@@ -75,7 +73,7 @@
 		    , (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 
 		FROM (
-		    SELECT A.*, @rownum := @rownum + 1  RNUM 
+		    SELECT A.*, ROW_NUMBER() OVER(ORDER BY  A.ORD_NO DESC, A.ORD_DTL_NO) RNUM 
 		    FROM (
 				SELECT A.* 
 				  FROM (
@@ -167,7 +165,7 @@
 								  INNER JOIN TB_ORDER_DETAIL_ITEM ODI ON B.ORD_DTL_NO   = ODI.ORD_DTL_NO
 							      INNER JOIN TB_GOODS C               ON ODI.ITEM_CD    = C.GOODS_CD
 							      INNER JOIN TB_DELIVERY_ADDR D       ON B.DELV_ADDR_SQ = D.DELV_ADDR_SQ
-							WHERE ODI.ORD_DTL_NO = '5'
+							WHERE 1=1 
 							  AND B.GOODS_TYPE NOT IN ('G056_S')
 					        <include refid="getDeliveryListCondition_sql"/>
 							
@@ -215,7 +213,7 @@
 							      INNER JOIN TB_ORDER_DETAIL B        ON A.ORD_NO       = B.ORD_NO
 							      INNER JOIN TB_GOODS C               ON B.GOODS_CD     = C.GOODS_CD
 							      INNER JOIN TB_DELIVERY_ADDR D       ON B.DELV_ADDR_SQ = D.DELV_ADDR_SQ
-							WHERE B.ORD_DTL_NO = '5'
+							WHERE 1=1
 							  AND B.GOODS_TYPE IN ('G056_S')
 							<include refid="getDeliveryListCondition_sql"/>  
 					) A
@@ -267,7 +265,7 @@
 		<choose>
 		     <when test='search != null and search == "searchOrdNo"'>
 		         <foreach collection="conditions" item="item" index="index" separator="or">
-		      ORD_NM REGEXP CONCAT('[',#{item},']')  
+		      ORD_NO REGEXP CONCAT('[',#{item},']')  
 		         </foreach>
 		     </when>
 		     <when test='search != null and search == "searchExtmallOrderId"'>
@@ -323,7 +321,7 @@
 		AND   B.DELV_STDT <![CDATA[<]]> STR_TO_DATE(REPLACE(#{edDate},'-','')+1 , '%Y%m%d%H%i%s') 
 		    </if>
 		</if>
-		AND B.ORD_DTL_STAT != '00'
+		AND B.ORD_DTL_STAT != 'G013_00'
 	</sql>
 
 
@@ -518,9 +516,184 @@
 		)
 	</insert>
 
+	<!-- 배송/회수지시 목록 건수 -->
+	<select id="getDeliveryWithdrawDirectiveListCount" parameterType="Delivery" resultType="int">
+		/* TsaDelivery.getDeliveryWithdrawDirectiveListCount */
+				SELECT COUNT(*) AS TOTCNT
+				  FROM (		
+						SELECT 
+						       '배송'                              AS DELV_GB_NM  -- 지시구분명
+						     , OD.INVOICE_SEND_YN                 AS SEND_YN     -- 전송여부
+						     , O.SITE_CD                                         -- 사이트코드
+						     , O.ORD_NO                                          -- 주문번호
+						     , OD.ORD_DTL_NO                                     -- 주문상세번호
+						     , IT.ITEM_CD AS GOODS_CD                            -- 상품코드
+						FROM   TB_ORDER O
+						 JOIN  TB_ORDER_DETAIL OD      ON O.ORD_NO = OD.ORD_NO
+						 JOIN  TB_DELIVERY_ADDR DA     ON OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ AND OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
+						 JOIN  TB_ORDER_DETAIL_ITEM IT ON OD.ORD_NO       = IT.ORD_NO       AND OD.ORD_DTL_NO   = IT.ORD_DTL_NO
+						 JOIN  TB_GOODS G              ON IT.ITEM_CD      = G.GOODS_CD
+						WHERE 1=1 
+						<if test="delvGb != null and delvGb != ''">
+						AND    'D' = #{delvGb} -- 배송지시
+						</if>
+						<if test="stDate != null and stDate != ''">
+						AND    O.REG_DT <![CDATA[>=]]> STR_TO_DATE(REPLACE(#{stDate},'-','') , '%Y%m%d%H%i%s')
+						</if>
+						<if test="edDate != null and edDate != ''">
+						AND    O.REG_DT <![CDATA[<]]> STR_TO_DATE(REPLACE(#{edDate},'-','')+1 , '%Y%m%d%H%i%s') 
+						</if>
+						<if test="siteCd != null and siteCd != ''">
+						AND    O.SITE_CD = #{siteCd}
+						</if>
+						AND    OD.ORD_DTL_STAT = 'G013_50' -- 배송중
+						<if test="sendYn != null and sendYn != ''">
+						AND    OD.INVOICE_SEND_YN = #{sendYn}
+						</if>
+						AND    G.SELF_GOODS_YN = 'Y' -- 자사상품만
+						
+						UNION ALL
+						
+						SELECT 
+						       '회수'                 AS DELV_GB_NM      -- 지시구분명
+						     , OC.WD_INVOICE_SEND_YN AS SEND_YN         -- 전송여부
+						     , O.SITE_CD                                -- 사이트코드
+						     , O.ORD_NO                                 -- 주문번호
+						     , OCD.ORD_DTL_NO                           -- 주문상세번호
+						     , IT.ITEM_CD AS GOODS_CD                   -- 상품코드
+						FROM   TB_ORDER_CHANGE OC          
+						JOIN   TB_ORDER_CHANGE_DETAIL OCD ON OC.ORD_CHG_SQ  = OCD.ORD_CHG_SQ 
+						JOIN   TB_ORDER_DETAIL OD         ON OCD.ORD_DTL_NO = OD.ORD_DTL_NO
+						JOIN   TB_ORDER O                 ON OD.ORD_NO      = O.ORD_NO
+						JOIN   TB_ORDER_DETAIL_ITEM IT    ON OD.ORD_NO      = IT.ORD_NO     AND OD.ORD_DTL_NO     = IT.ORD_DTL_NO
+						JOIN   TB_GOODS G                 ON IT.ITEM_CD     = G.GOODS_CD
+						JOIN   TB_DELIVERY_LOC D          ON OD.DELV_LOC_CD = D.DELV_LOC_CD AND OD.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
+						WHERE  1=1 
+						<if test="delvGb != null and delvGb != ''">
+						AND    'W' = #{delvGb} -- 회수지시
+						</if>
+						AND    OC.CHG_GB IN ('G680_30','G680_40') -- 반품요청,교환요청
+						<if test="sendYn != null and sendYn != ''">
+						AND    OC.WD_INVOICE_SEND_YN = #{sendYn}
+						</if>
+						<if test="stDate != null and stDate != ''">
+						AND    OC.REG_DT <![CDATA[>=]]> STR_TO_DATE(REPLACE(#{stDate},'-','') , '%Y%m%d%H%i%s')
+						</if>
+						<if test="edDate != null and edDate != ''">
+						AND    OC.REG_DT <![CDATA[<]]> STR_TO_DATE(REPLACE(#{edDate},'-','')+1 , '%Y%m%d%H%i%s')
+						</if>
+						AND    OCD.CHG_STAT IN ('G685_30','G685_40') -- 반품요청,교환요청
+						<if test="siteCd != null and siteCd != ''">
+						AND    O.SITE_CD = #{siteCd}
+						</if>
+						AND    G.SELF_GOODS_YN = 'Y' -- 자사상품만
+						AND    OCD.DEL_YN      = 'N'
+					) A
+
+	</select>
+	
 	<!-- 배송/회수지시 목록 -->
 	<select id="getDeliveryWithdrawDirectiveList" parameterType="Delivery" resultType="Delivery">
 		/* TsaDelivery.getDeliveryWithdrawDirectiveList */
-		SELECT '1' FROM DUAL
+		SELECT Z.*
+		FROM (
+		    SELECT A.*, ROW_NUMBER() OVER(ORDER BY  A.DELV_GB_NM, A.ORD_NO DESC, A.ORD_DTL_NO )  RNUM 
+		    FROM ( 
+				SELECT A.* 
+				  FROM (		
+						SELECT DISTINCT
+						       '배송'                              AS DELV_GB_NM  -- 지시구분명
+						     , OD.INVOICE_SEND_YN                 AS SEND_YN     -- 전송여부
+						     , O.SITE_CD                                         -- 사이트코드
+						     , O.ORD_NO                                          -- 주문번호
+						     , OD.ORD_DTL_NO                                     -- 주문상세번호
+						     , IT.ITEM_CD AS GOODS_CD                            -- 상품코드
+						     , G.GOODS_NM                                        -- 상품명
+						     , DA.RECIP_NM                                       -- 수취인명
+						     , DA.RECIP_PHNNO                                    -- 수취인휴대전화번호
+						     , DA.RECIP_TELNO                                    -- 수취인전화번호
+						  --   , DA.RECIP_EMAIL                                    -- 수취인이메일
+						     , DA.RECIP_ZIPCODE                                  -- 수취인우편번호
+						     , DA.RECIP_BASE_ADDR                                -- 수취인기본주소
+						     , DA.RECIP_DTL_ADDR                                 -- 수취인상세주소
+						     , O.ORD_NM                                          -- 주문자명
+						     , O.ORD_PHNNO                                       -- 주문자휴대전화번호
+						     , O.ORD_TELNO                                       -- 주문자전화번호
+						     , O.ORD_EMAIL                                       -- 주문자이메일
+						FROM   TB_ORDER O
+						 JOIN  TB_ORDER_DETAIL OD      ON O.ORD_NO = OD.ORD_NO
+						 JOIN  TB_DELIVERY_ADDR DA     ON OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ AND OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
+						 JOIN  TB_ORDER_DETAIL_ITEM IT ON OD.ORD_NO       = IT.ORD_NO       AND OD.ORD_DTL_NO   = IT.ORD_DTL_NO
+						 JOIN  TB_GOODS G              ON IT.ITEM_CD      = G.GOODS_CD
+						WHERE 1=1 
+						<if test="delvGb != null and delvGb != ''">
+						AND    'D' = #{delvGb} -- 배송지시
+						</if>
+						<if test="stDate != null and stDate != ''">
+						AND    O.REG_DT <![CDATA[>=]]> STR_TO_DATE(REPLACE(#{stDate},'-','') , '%Y%m%d%H%i%s')
+						</if>
+						<if test="edDate != null and edDate != ''">
+						AND    O.REG_DT <![CDATA[<]]> STR_TO_DATE(REPLACE(#{edDate},'-','')+1 , '%Y%m%d%H%i%s') 
+						</if>
+						<if test="siteCd != null and siteCd != ''">
+						AND    O.SITE_CD = #{siteCd}
+						</if>
+						AND    OD.ORD_DTL_STAT = 'G013_50' -- 배송중
+						<if test="sendYn != null and sendYn != ''">
+						AND    OD.INVOICE_SEND_YN = #{sendYn}
+						</if>
+						AND    G.SELF_GOODS_YN = 'Y' -- 자사상품만
+						
+						UNION ALL
+						
+						SELECT DISTINCT
+						       '회수'                 AS DELV_GB_NM      -- 지시구분명
+						     , OC.WD_INVOICE_SEND_YN AS SEND_YN         -- 전송여부
+						     , O.SITE_CD                                -- 사이트코드
+						     , O.ORD_NO                                 -- 주문번호
+						     , OCD.ORD_DTL_NO                           -- 주문상세번호
+						     , IT.ITEM_CD AS GOODS_CD                   -- 상품코드
+						     , G.GOODS_NM                               -- 상품명
+						     , D.RTN_LOC_NM          AS RECIP_NM        -- 수취인명
+						     , NULL                  AS RECIP_PHNNO     -- 수취인휴대전화번호
+						     , D.RTN_LOC_TELNO       AS RECIP_TELNO     -- 수취인전화번호
+						     , D.RTN_LOC_ZIPCODE     AS RECIP_POST_NO   -- 수취인우편번호
+						     , D.RTN_LOC_BASE_ADDR   AS RECIP_BASE_ADDR -- 수취인주소
+						     , D.RTN_LOC_DTL_ADDR    AS RECIP_DTL_ADDR  -- 수취인상세주소
+						     , O.ORD_NM                                 -- 주문자명
+						     , O.ORD_PHNNO                              -- 주문자휴대전화번호
+						     , O.ORD_TELNO                              -- 주문자전화번호
+						     , O.ORD_EMAIL                              -- 주문자이메일
+						FROM   TB_ORDER_CHANGE OC          
+						JOIN   TB_ORDER_CHANGE_DETAIL OCD ON OC.ORD_CHG_SQ  = OCD.ORD_CHG_SQ 
+						JOIN   TB_ORDER_DETAIL OD         ON OCD.ORD_DTL_NO = OD.ORD_DTL_NO
+						JOIN   TB_ORDER O                 ON OD.ORD_NO      = O.ORD_NO
+						JOIN   TB_ORDER_DETAIL_ITEM IT    ON OD.ORD_NO      = IT.ORD_NO     AND OD.ORD_DTL_NO     = IT.ORD_DTL_NO
+						JOIN   TB_GOODS G                 ON IT.ITEM_CD     = G.GOODS_CD
+						JOIN   TB_DELIVERY_LOC D          ON OD.DELV_LOC_CD = D.DELV_LOC_CD AND OD.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
+						WHERE  1=1 
+						<if test="delvGb != null and delvGb != ''">
+						AND    'W' = #{delvGb} -- 회수지시
+						</if>
+						AND    OC.CHG_GB IN ('G680_30','G680_40') -- 반품요청,교환요청
+						<if test="sendYn != null and sendYn != ''">
+						AND    OC.WD_INVOICE_SEND_YN = #{sendYn}
+						</if>
+						<if test="stDate != null and stDate != ''">
+						AND    OC.REG_DT <![CDATA[>=]]> STR_TO_DATE(REPLACE(#{stDate},'-','') , '%Y%m%d%H%i%s')
+						</if>
+						<if test="edDate != null and edDate != ''">
+						AND    OC.REG_DT <![CDATA[<]]> STR_TO_DATE(REPLACE(#{edDate},'-','')+1 , '%Y%m%d%H%i%s')
+						</if>
+						AND    OCD.CHG_STAT IN ('G685_30','G685_40') -- 반품요청,교환요청
+						<if test="siteCd != null and siteCd != ''">
+						AND    O.SITE_CD = #{siteCd}
+						</if>
+						AND    G.SELF_GOODS_YN = 'Y' -- 자사상품만
+						AND    OCD.DEL_YN      = 'N'
+					) A
+				ORDER BY A.DELV_GB_NM, A.ORD_NO DESC, A.ORD_DTL_NO
+				<include refid="getListPagingCondition_sql"/>
 	</select>
+	
 </mapper>

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

@@ -1304,21 +1304,21 @@
 			    FROM	TMP_CONTENTS_GOODS B
 			   WHERE	B.CATE_NO = A.CATE_NO
 				 AND	B.CONTENTS_LOC = A.CONTENTS_LOC
-				 AND	B.PRE_CONTENTS_SQ = A.DISP_ORD
+				 AND	B.CONTENTS_SQ = A.DISP_ORD
 				 AND	B.CATE_NO = #{cateNo}
 				 AND	B.CONTENTS_LOC = #{contentsLoc}) AS GOODS_CD_LIST
 			 ,(SELECT 	GROUP_CONCAT(B.GOODS_NM ORDER BY B.DISP_ORD SEPARATOR ',')
 			   FROM	TMP_CONTENTS_GOODS B
 			   WHERE	B.CATE_NO = A.CATE_NO
 				 AND	B.CONTENTS_LOC = A.CONTENTS_LOC
-				 AND	B.PRE_CONTENTS_SQ = A.DISP_ORD
+				 AND	B.CONTENTS_SQ = A.DISP_ORD
 				 AND	B.CATE_NO = #{cateNo}
 				 AND	B.CONTENTS_LOC = #{contentsLoc}) AS GOODS_NM_LIST
 			 ,(SELECT 	GROUP_CONCAT(B.IMG_PATH1 ORDER BY B.DISP_ORD SEPARATOR ',')
 			   FROM	TMP_CONTENTS_GOODS B
 			   WHERE	B.CATE_NO = A.CATE_NO
 				 AND	B.CONTENTS_LOC = A.CONTENTS_LOC
-				 AND	B.PRE_CONTENTS_SQ = A.DISP_ORD
+				 AND	B.CONTENTS_SQ = A.DISP_ORD
 				 AND	B.CATE_NO = #{cateNo}
 				 AND	B.CONTENTS_LOC = #{contentsLoc}) AS GOODS_IMG_LIST
 			 , A.USE_YN
@@ -1615,7 +1615,7 @@
 		DELETE	FROM TMP_CONTENTS_GOODS
 		WHERE	CATE_NO = #{cateNo}
 		AND 	CONTENTS_LOC = #{contentsLoc}
-		AND 	PRE_CONTENTS_SQ = #{preContentsSq}
+		AND 	CONTENTS_SQ = #{contentsSq}
 	</delete>
 
 	<insert id="saveContentsGoodsTemp" parameterType="Contents">
@@ -1643,7 +1643,7 @@
 						 				AND		CONTENTS_LOC = #{contentsLoc}) TMP)
 			,#{contentsLoc}
 		 	,#{preContentsSq}
-		 	,NULL
+		 	,#{contentsSq}
 		 	,#{goodsCd}
 		 	,#{goodsNm}
 		 	,#{imgPath1}

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

@@ -201,8 +201,8 @@
 		SELECT COUNT(*)
 		FROM tb_social A
 		WHERE 1=1
-			AND A.USE_YN = #{useYn}
-			AND A.APPLY_GB = #{applyGb}
+			AND A.USE_YN = 'Y'
+			AND A.APPLY_GB = 'A'
 			AND  (A.SOCIAL_STDT <![CDATA[ <= ]]>  DATE_FORMAT(DATE_ADD(#{socialStdt}, INTERVAL 0 DAY), '%Y%m%d%H%i%S')  
 			OR A.SOCIAL_EDDT <![CDATA[ >= ]]>  DATE_FORMAT(DATE_ADD(#{socialStdt}, INTERVAL 0 DAY), '%Y%m%d%H%i%S'))  
 	</select>

+ 11 - 4
src/main/java/com/style24/persistence/mybatis/shop/TsaWithdraw.xml

@@ -7,12 +7,10 @@
 		<choose>
 		<when test="pageable != null">
 		    ) A
-		    JOIN ( SELECT @rownum := 0) R
 		)Z WHERE RNUM BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
 		</when>
 		<otherwise>
 		    ) A
-		    JOIN ( SELECT @rownum := 0) R
 		)Z
 		</otherwise>
 		</choose>
@@ -57,7 +55,7 @@
 			, ROW_NUMBER() OVER W AS ROWSPAN_CNT
 	        , ROW_NUMBER() OVER T AS ROWSPAN_RANK
 		FROM (
-		    SELECT A.*, @rownum := @rownum + 1  RNUM 
+		    SELECT A.*, ROW_NUMBER() OVER(ORDER BY  A.ORDER_NO, A.RECALL_EXCEPTION_NO, A.RECALL_EXCEPTION_ITEM_NO)  RNUM 
 		    FROM (
 				SELECT A.* 
 				  FROM (
@@ -116,7 +114,7 @@
 
 	<!-- 회수예외 처리완료-->
 	<update id="updateWithdrawException" parameterType="WithdrawExc" >
-		/* TsaDelivery.deleteBangoods */
+		/* TsaWithdraw.deleteBangoods */
 		UPDATE TB_ORDER_RECALL_EXCEPTION SET
 		  RECALL_STAT = #{recallStat}
 		, RECALL_STAT_DT = NOW()
@@ -124,4 +122,13 @@
 
 	</update>
 
+	<!-- 상품옵션 정보 -->
+	<select id="getOptionInfo" parameterType="WmsWithdraw" resultType="WmsWithdraw">
+		/* TsaWithdraw.getOptionInfo */
+			SELECT GOODS_CD
+			 FROM  TB_OPTION 
+			WHERE OPT_CD = #{skucode} 
+	</select>
+	
+	
 </mapper>

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

@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaWmsWithdrawDao">
+
+	<!-- WMS회수목록 건수 -->
+	<select id="getWmsWithdrawListCount" parameterType="WmsWithdraw" resultType="int">
+		/* TsaWmsWithdraw.getWmsWithdrawListCount */
+		SELECT COUNT(*) AS TOTCNT
+		  FROM (		
+				SELECT 
+					  A.RecallNo			-- 반품 번호 
+					, B.RecallItemNo		-- 반품 항목 번호 
+				  FROM ISTYLE24_WMSIF.DBO.TB_IF_RECALLDELIVERY A , ISTYLE24_WMSIF.DBO.TB_IF_RECALLDELIVERYITEM B
+				 WHERE A.RECALLNO = B.RECALLNO 
+					<if test='customername != null and customername != ""'> -- 주문자
+					AND   A.CustomerName = #{customername}
+					</if>
+					<if test='orderno != null and orderno != ""'>  -- 주문번호 
+					AND   A.OrderNo  = #{orderno}
+					</if>
+					<if test='statuscd != null and statuscd != ""'>  -- 입고상태
+					AND   B.StatusCd  = #{statuscd}
+					</if>
+	
+					<if test='recalltypecd != null and recalltypecd != ""'>  -- 반품타입
+					AND   A.RecallTypeCd = #{recalltypecd}
+					</if>
+					<if test='isdeleted != null and isdeleted != ""'>  -- 삭제여부 1삭제 
+					AND    A.IsDeleted = #{isdeleted}
+					</if>				
+					<if test='stDate != null and stDate != ""'> -- 회수요청일 
+					AND   A.DateCreated <![CDATA[>= ]]>  CONVERT(datetime,#{stDate}) 
+					</if>
+					<if test='edDate != null and edDate != ""'>
+					AND   A.DateCreated <![CDATA[<]]> CONVERT(datetime,#{edDate})+1 
+					</if>
+			) A
+
+	</select>
+		
+	<!-- WMS회수목록 -->
+	<select id="getWmsWithdrawList" parameterType="WmsWithdraw" resultType="WmsWithdraw">
+		/* TsaWmsWithdraw.getWmsWithdrawList */
+		SELECT Z.*
+		FROM (
+		    SELECT A.*,  ROW_NUMBER() OVER (ORDER BY RecallNo DESC, RecallItemNo ) as RNUM 
+		    FROM (
+		    
+				SELECT 
+					  A.RecallNo			-- 반품 번호 
+					, B.RecallItemNo		-- 반품 항목 번호 X
+					, A.OrderExceptionNo	-- 주문변경번호  
+					, A.RecallTypeCd		-- 반품타입
+					, A.Receiver			-- 받는자
+					, A.ReceiverTelNum		-- 받는자 전화번호
+					, A.ReceiverCellNum		-- 받는자 핸드폰 번호
+					, A.DeliveryPostalCode	-- 우편 번호
+					, A.DeliveryAddr1		-- 기본 주소
+					, A.DeliveryAddr2		-- 상세 주소
+					, A.OrderNo				-- 주문 번호
+					, A.OrderGUID			-- 주문 고유 번호
+					, A.CustomerName		-- 주문자
+					, A.LoginId				-- 아이디
+					, A.CSMemo				-- CS 메모
+					, CONVERT(char(10), A.DateCSMemoUpdated, 23) AS DateCSMemoUpdated	-- CS 메모 변경일
+					, A.WMSMemo				-- WMS 메모
+					, CONVERT(char(10), A.DateWMSMemoUpdated, 23) AS DateWMSMemoUpdated	-- WMS 메모 변경일
+					, CONVERT(char(10), A.DateCreated, 23) AS DateCreated			    -- 생성일 -- 회수요청일
+					, A.IsDeleted			-- 삭제 여부  
+					, A.DateDeleted			-- 삭제일  x
+					, A.DeliveryAddrNew		-- 도로명 주소
+					, B.ProductNo			-- 상품 번호
+					, B.ProductCode			-- 상품 코드
+					, B.ProductName			-- 상품명
+					, B.SKUCode				-- 옵션 코드
+					, B.SKUValue			-- 옵션 내용
+					, B.RecallQty			-- 수량
+					, B.StatusCd			-- 상태
+					, CONVERT(char(10), B.DateCompleted, 23) AS DateCompleted		-- 완료일
+					, B.LogisticsName		-- 택배사 명
+					, B.RecallInvoiceNo		-- 회수송장번호
+					, B.InvoiceNo			-- 원운송장번호
+					, B.OrderDtlNo			-- 주문상세번호
+				  FROM ISTYLE24_WMSIF.DBO.TB_IF_RECALLDELIVERY A , ISTYLE24_WMSIF.DBO.TB_IF_RECALLDELIVERYITEM B
+				 WHERE A.RECALLNO = B.RECALLNO 
+					<if test='customername != null and customername != ""'> -- 주문자
+					AND   A.CustomerName = #{customername}
+					</if>
+					<if test='orderno != null and orderno != ""'>  -- 주문번호
+					AND   A.OrderNo  = #{orderno}
+					</if>
+					<if test='statuscd != null and statuscd != ""'>  -- 입고상태
+					AND   B.StatusCd  = #{statuscd}
+					</if>
+	
+					<if test='recalltypecd != null and recalltypecd != ""'>  -- 반품타입
+					AND   A.RecallTypeCd = #{recalltypecd}
+					</if>
+					<if test='isdeleted != null and isdeleted != ""'>  -- 삭제여부 1삭제 
+					AND    A.IsDeleted = #{isdeleted}
+					</if>				
+					<if test='stDate != null and stDate != ""'> -- 회수요청일 
+					AND   A.DateCreated <![CDATA[>= ]]>  CONVERT(datetime,#{stDate}) 
+					</if>
+					<if test='edDate != null and edDate != ""'>
+					AND   A.DateCreated <![CDATA[<]]> CONVERT(datetime,#{edDate})+1 
+					</if>
+		    ) A
+		)Z WHERE RNUM BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
+	</select>
+
+
+</mapper>

+ 19 - 15
src/main/webapp/WEB-INF/views/business/BrandGroupPopupForm.html

@@ -25,7 +25,7 @@
 		
 		<!-- 검색 조건 -->
 		<div class="panelContent" >
-		<form id="searchBrandGroupForm" name="searchBrandGroupForm" action="#" th:action="@{'/business/brand/group/list'}" onsubmit="$('#btnSearchBrandGroup').trigger('click'); return false;">
+		<form id="searchBrandGroupForm" name="searchBrandGroupForm" action="#" th:action="@{'/business/brand/group/list'}" >
 			
 			<table class="frmStyle" aria-describedby="검색조건">
 				<colgroup>
@@ -96,10 +96,10 @@
 					</td>
 				</tr>
 				<tr>
-					<th>RGB코드<i class="required" title="필수"></i></th>
+					<th>RGB코드</th>
 					<td  colspan="3">
-						<input type="text" class="w100 aR" name="rgbCd" maxlength="6" data-valid-name="REG코드" />
-						<!-- <span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> 브랜드메인 GBN 배경색으로 적용, 미 입력시 기본색상으로 설정됩니다.</span> -->
+						<input type="text" class="w100 aR" name="rgbCd" maxlength="6" data-valid-name="REG코드" value="222222"/>
+						<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> 브랜드메인 GBN 배경색으로 적용, 미 입력시 기본색상(222222)으로 설정됩니다.</span>
 					</td>
 				</tr>
 				<tr style="height:100px">
@@ -112,9 +112,9 @@
 							<input type="hidden" name="sysFileNm" id="sysFileNm"/>
 							<input type="hidden" name="newSysFileNm" id="newSysFileNm"/>
 						</div>
-						<input type="hidden" name="uploadDefaultUrl" id="uploadDefaultUrl" th:value="${@environment.getProperty('upload.default.view') + '/display/'}"/>
+						<input type="hidden" name="uploadDefaultUrl" id="uploadDefaultUrl" th:value="${@environment.getProperty('upload.default.view')}"/>
 						<span id="imgView" class="off">
-							<img id="bannerPreViewUrl" src="" style="height:100px"/>
+							<img id="bannerPreViewUrl" src="" style="width:100px"/>
 						</span>
 					</td>
 				</tr>
@@ -178,6 +178,8 @@
 			$("#logoFileNm").val('');
 			$("#orgFileNm").val('');
 			$("#bannerPreViewUrl").attr('src', '');
+			$("#imgView").removeClass("on").addClass("off");
+			
 		}
 		$('#brandGroupForm input[name=file]').closest('div').find('label').text('파일선택'); 
 		
@@ -186,10 +188,10 @@
 	// 조회
 	$('#btnSearchBrandGroup').on('click', function() {
 		
-		if (gagajf.isNull($('#searchBrandGroupForm textarea[name=searchBrandGroupNo]').val())  && gagajf.isNull($('#searchBrandGroupForm textarea[name=searchBrandGroupNm]').val())){
-			mcxDialog.alert('검색조건을 입력하세요.');
-			return false;
-		}
+		//if (gagajf.isNull($('#searchBrandGroupForm textarea[name=searchBrandGroupNo]').val())  && gagajf.isNull($('#searchBrandGroupForm textarea[name=searchBrandGroupNm]').val())){
+		//	mcxDialog.alert('검색조건을 입력하세요.');
+		//	return false;
+		//}
 		
 		// Fetch data
 		gagaAgGrid.fetch($('#searchBrandGroupForm').prop('action'), gridOptionsBrandGroupList, '#searchBrandGroupForm');
@@ -237,12 +239,12 @@
 			return;
 		}
 		
-		gagajf.ajaxFileUpload('/common/file/upload?subDir=/display'
+		gagajf.ajaxFileUpload('/common/file/upload?subDir=/contents'
 				, file
 				, function(result) {
 					$('#brandGroupForm input[name=newSysFileNm]').val(result.newFileName);
 					$('#brandGroupForm input[name=sysFileNm]').val(result.newFileName);
-					$("#bannerPreViewUrl").attr('src', $("#uploadDefaultUrl").val()+result.newFileName);
+					$("#bannerPreViewUrl").attr('src', $("#uploadDefaultUrl").val()+"/contents/brand/"+result.newFileName);
 					$("#imgView").removeClass("off").addClass("on");
 				}
 				, 'image'
@@ -256,7 +258,7 @@
 			return false;
 		
 		// RGB 체크
-		if (!gagajf.isNull($('#brandGroupForm input[name=rgbCd]')) ){
+		if (!gagajf.isNull($('#brandGroupForm input[name=rgbCd]').val()) ){debugger;
 			
 			var rgbCd = $('#brandGroupForm input[name=rgbCd]').val();
 			if (rgbCd.indexOf('#') >= 0){
@@ -297,9 +299,11 @@
 	$("#btnBrandGroupNew").on("click", function() {
 		$("#brandGroupForm")[0].reset();
 		$("#brandGroupForm input[name=mode]").val("N");
-		$("#orgFileNm").val('');
 		$("#bannerPreViewUrl").attr('src', '');
-		$("#logoFileNm").val('');
+		$('#brandGroupForm input[name=newSysFileNm]').val('');
+		$('#brandGroupForm input[name=sysFileNm]').val('');
+		$('#brandGroupForm input[name=logoFileNm]').val('');
+		$("#imgView").removeClass("on").addClass("off");
 	});
 	
 	$(document).ready(function() {

+ 13 - 5
src/main/webapp/WEB-INF/views/customer/CustomerSecedePopupForm.html

@@ -89,10 +89,10 @@
 
 	});
 
-	var fnSaveCall = function (data) {
-		console.log('typeof', typeof data.isSuccess);
-		if (data.isSuccess) {
-			mcxDialog.alertC(data.resultMessage, {
+	var fnSaveCall = function (result) {
+		console.log(result);
+		if (result.isSuccess) {
+			mcxDialog.alertC("정상적으로 탈퇴되었습니다.", {
 				sureBtnText: "확인",
 				sureBtnClick: function() {
 					uifnPopupClose('popupCustSecedeForm');
@@ -100,7 +100,15 @@
 				}
 			});
 		} else {
-			mcxDialog.alert(data.resultMessage);
+			let message;
+			if (result.resultType === 'ALREADY_SECEDE') {
+				message = '이미 탈퇴처리된 회원 입니다.';
+			} else if (result.resultType === 'PROGRESS_ORDER') {
+				message = '진행중인 거래가 있습니다. <br> 진행중인 거래를 완료 후 탈퇴 신청을 해주세요.';
+			} else {
+				message = '탈퇴가 정상적으로 처리되지 않았습니다. 다시 시도해 주세요.'
+			}
+			mcxDialog.alert(message);
 			return;
 		}
 	}

+ 146 - 119
src/main/webapp/WEB-INF/views/delivery/DeliveryWithdrawDirectiveListForm.html

@@ -6,15 +6,15 @@
  * @source  : DeliveryWithdrawDirectiveListForm.html
  * @desc    : 배송/회수지시 목록 Page
  *=============================================================
- * ISTYLE24
- * Copyright(C) 2019 TSIT, All rights reserved.
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
  *=============================================================
  * VER  DATE         AUTHOR      DESCRIPTION
  * ===  ===========  ==========  ==================================
- * 1.0  2020.11.11   moon        최초 작성
+ * 1.0  2021.03.11   moon        최초 작성
  *******************************************************************************
  -->
-	<div id="main">
+ 	<div id="main">
 		<!-- 메인타이틀 영역 -->
 		<div class="main-title">
 		</div>
@@ -23,28 +23,30 @@
 		<div class="infoBox menu-desc">
 		</div>
 		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<form id="searchForm" name="searchForm" action="#" th:action="@{'/delivery/dwdirect/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
 		<div class="panelStyle">
-		<!-- TITLE -->
-		<div class="panelTitle">
-			<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 <font color="red">기간, 키워드</font>중 하나를 꼭 입력해 주세요.</h3>
-			<span class="panelControl">
-				<i class="fa fa-chevron-up"></i>
-			</span>
-		</div>
-		<!-- //TITLE -->
-		<div class="panelContent">	
-			<form id="searchForm" name="searchForm" action="#" th:action="@{'/delivery/dwdirect/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<table class="frmStyle">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:20%;"/>
-						<col style="width:10%;"/>
-						<col style="width:20%;"/>
-						<col style="width:10%;"/>
-						<col/>
-					</colgroup>
-					<tbody>
-						<tr>
+			<!-- TITLE -->
+			<div class="panelTitle">
+				<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 <font color="red">주문일/회수요청일</font>은 꼭 입력해 주세요.</h3>
+				<span class="panelControl">
+					<i class="fa fa-chevron-up"></i>
+				</span>
+			</div>
+			<!-- //TITLE -->
+			<div class="panelContent">	
+				
+					<table class="frmStyle">
+						<colgroup>
+							<col style="width:8%;"/>
+							<col style="width:12%;"/>
+							<col style="width:8%;"/>
+							<col style="width:12%;"/>
+							<col style="width:8%;"/>
+							<col style="width:12%;"/>
+						</colgroup>
+												<tr>
 							<th>지시구분</th>
 							<td>
 								<select name="delvGb">
@@ -74,69 +76,79 @@
 							<td colspan="5" id="terms">
 							</td>
 						</tr>
-					</tbody>
-				</table>
-				<!-- <div class="panelBtnB">  -->
-				<ul class="panelBar">
-					<li class="center">
-					<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
-					<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
-					</li>
-				</ul>
-			
-			</form>
-			</div>
+					</table>
+	
+					<ul class="panelBar">
+						<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset(); fnInitCalendar();">초기화</button>
+						<button type="button" id="btnExcel" class="btn btn-info btn-lg" >엑셀다운로드</button>
+						</li>
+					</ul>
+
+				</div>
 		</div>
+		<!-- //검색조건 영역 -->
 
+		<!-- 리스트 영역 -->
 		<div class="panelStyle">
 			<ul class="panelBar">
-				<li class="left">
-					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+				<li class="right">
+					검색결과 : <strong><span id="gridRowTotalCount">0</span> 건</strong>&nbsp;
+					쪽번호 <span id="pgNo">0</span>/ <strong id="endPgNo">0</strong>&nbsp;&nbsp;
+					<select id="pageSize" name="pageSize">
+						<option value="20" selected="selected">20개씩 보기</option>
+						<option value="50">50개씩 보기</option>
+						<option value="100">100개씩 보기</option>
+						<option value="500">500개씩 보기</option>
+						<option value="1000">1000개씩 보기</option>
+					</select>
+					<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
 				</li>
 			</ul>
-
-			<div class="panelContent" style="overflow: hidden;">
-				<div id="gridList" style="width: 100%; height: 600px;"  class="ag-theme-balham"></div>
-			</div>
+			<div id="gridList" style="width:100%; height: 700px;" class="ag-theme-balham"></div>
+			<ul class="panelBar">
+				<li class="center">
+					<div class="tablePaging" id="delvWithdrawListPagination"></div>
+				</li>
+			</ul>
+					 
 		</div>
+		</form>
+		<!-- //리스트 영역 -->
 	</div>
-
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=20210114"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
 	// 사이트목록
 	var siteList = gagajf.convertToArray([[${siteCdList}]]);
 
 	var columnDefs = [
-		{headerName: "지시구분", field: "delvGbNm", width: 80, cellClass: "text-center"},
-		{
-			headerName: "택배사전송", field: "sendYn", width: 80, cellClass: "text-center",
+		{headerName: "지시구분", 		field: "delvGbNm", 		width: 80, cellClass: "text-center"},
+		{headerName: "택배사전송", 	field: "sendYn", 		width: 80, cellClass: "text-center",
 			cellRenderer: function (params) { return params.value == 'Y' ? '전송' : '미전송'; }
 		},
-		{
-			headerName: "사이트", field: "siteCd", width: 80, cellClass: "text-center",
+		{headerName: "사이트", 		field: "siteCd", 		width: 80, cellClass: "text-center",
 			valueFormatter: function (params) { return gagaAgGrid.lookupValue(siteList, params.value); }
 		},
-		{
-			headerName: "주문번호", field: "ordNo", width: 100, cellClass: "text-center",
+		{headerName: "주문번호", 		field: "ordNo", 		width: 100, cellClass: "text-center",
 			cellRenderer: function(params) { return gagajf.isNull(params.value) ? '' : '<a href="javascript:void(0);">' + params.value + '</a>'; }
 		},
-		{headerName: "주문상세번호", field: "ordDtlNo", width: 100, cellClass: "text-center"},
-		{
-			headerName: "상품코드", field: "goodsCd", width: 120, cellClass: "text-center",
+		{headerName: "주문상세번호", 	field: "ordDtlNo", 		width: 100, cellClass: "text-center"},
+		{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},
-		{headerName: "수취인명", field: "recipNm", width: 120, cellClass: "text-center"},
-		{headerName: "수취인휴대전화", field: "recipPhnno", width: 120, cellClass: "text-center"},
-		{headerName: "수취인전화번호", field: "recipTelno", width: 120, cellClass: "text-center"},
-		{headerName: "수취인이메일", field: "recipEmail", width: 120},
-		{headerName: "수취인우편번호", field: "recipPostNo", width: 120, cellClass: "text-center"},
-		{headerName: "수취인기본주소", field: "recipBaseAddr", width: 300},
-		{headerName: "수취인상세주소", field: "recipDtlAddr", width: 200},
-		{headerName: "주문자명", field: "orderNm", width: 100, cellClass: "text-center"},
-		{headerName: "주문자휴대전화", field: "orderPhnno", width: 120, cellClass: "text-center"},
-		{headerName: "주문자전화번호", field: "orderPhnno", width: 120, cellClass: "text-center"},
-		{headerName: "주문자이메일", field: "orderEmail", width: 120}
+		{headerName: "상품명", 		field: "goodsNm", 		width: 200, cellClass: "text-left"},
+		{headerName: "수취인명", 		field: "recipNm", 		width: 120, cellClass: "text-center"},
+		{headerName: "수취인휴대전화", 	field: "recipPhnno", 	width: 120, cellClass: "text-center"},
+		{headerName: "수취인전화번호", 	field: "recipTelno", 	width: 120, cellClass: "text-center"},
+		{headerName: "수취인우편번호", 	field: "recipZipcode", 	width: 120, cellClass: "text-center"},
+		{headerName: "수취인기본주소", 	field: "recipBaseAddr", width: 300, cellClass: "text-left"},
+		{headerName: "수취인상세주소", 	field: "recipDtlAddr", 	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"}
 	];
 
 	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
@@ -155,65 +167,80 @@
 	// 조회
 	$('#btnSearch').on('click', function() {
 		// Fetch data
-		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+		//gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+		fnSearchList();
 	});
 
-// 	// 택배사 전송여부 변경시 처리
-// 	$('#sendYn').on('change',function(){
-// 		var sendVal = $('#searchForm select[name=sendYn]').val();
-// 		fnDatepickerDisabled(sendVal);
-// 	});
-
-// 	// 날짜선택 활성화/비활성화
-// 	var fnDatepickerDisabled = function(flag) {
-// 		if(flag == 'Y'){
-
-// 			$('#stDate').attr('disabled', false);
-// 			$('#edDate').attr('disabled', false);
-// 			$('.btn-default').attr('disabled', false);
-// 			$('.ui-datepicker-trigger').attr('disabled', false);
-// 			$('.btnToday').trigger('click');
-
-// 		} else {
-
-// 			$('#stDate').val('');
-// 			$('#edDate').val('');
-// 			$('#stDate').attr('disabled', true);
-// 			$('#edDate').attr('disabled', true);
-// 			$('.btn-default').attr('disabled', true);
-// 			$('.ui-datepicker-trigger').attr('disabled', true);
-// 		}
-// 	}
+	/*************************************************************************
+	*  조회 
+	**************************************************************************/
+	var fnSearchList = function() {
+		if($('#stDate').val() == ''){
+			mcxDialog.alert('시작 기간을 입력하세요.');
+			return;
+		}
+
+		if($('#edDate').val() == ''){
+			mcxDialog.alert('종료 기간을 입력하세요.');
+			return;
+		}
+
+		// 날짜 유효성 체크
+		if (Number($('#stDate').val().replaceAll("-", "")) > Number($('#edDate').val().replaceAll("-", ""))) {
+			mcxDialog.alert("시작일은 종료일보다 클 수 없습니다.");
+			return;
+		}
+
+		gagaPaging.init('searchForm', fnSearchCallBack, 'delvWithdrawListPagination', $('#searchForm').find('#pageSize').val());
+	    gagaPaging.load($("#searchForm input[name=pageNo]").val());
+	}
+	
+	/*************************************************************************
+	*  조회 콜백
+	**************************************************************************/
+	var fnSearchCallBack = function(result){
+
+		$('#searchForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
+		$('#searchForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
+		$('#searchForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
+		$('#searchForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
+		gridOptions.api.setRowData(result.dwdirectList);
+		gagaPaging.createPagination(result.pageing.pageable);
+		
+	}
+	
+
 
 	//엑셀다운로드
 	$('#btnExcel').on('click', function() {
 		gagaAgGrid.exportToExcel('배송/회수지시 목록', gridOptions);
-// 		var totalRows = gridOptions.api.getDisplayedRowCount();
-// 		if(totalRows==0){
-// 			mcxDialog.alert('조회된 내역이 없습니다.');
-// 			return;
-// 		}
-
-// 		var date = new Date().format("YYYYMMDDHHmmss");
-// 		var params = {
-// 			fileName : "회수송장전송목록_"+ date,
-// 			sheetName: "DATA"
-// 		}
-// 		gridOptions.excelStyles = [
-// 			{
-// 				id: 'dateFormat',
-// 				dataType: 'dateTime',
-// 				numberFormat: {
-// 					format: 'YYYY-MM-DD;@'
-// 				}
-// 			},
-// 			{
-// 				id: 'textFormat',
-// 				dataType: 'string'
-// 			}
-// 		]
-
-// 		gridOptions.api.exportDataAsExcel(params);
+		
+		var totalRows = gridOptions.api.getDisplayedRowCount();
+		if(totalRows==0){
+			mcxDialog.alert('조회된 내역이 없습니다.');
+			return;
+		}
+
+		var date = new Date().format("YYYYMMDDHHmmss");
+		var params = {
+			fileName : "회수송장전송목록_"+ date,
+			sheetName: "DATA"
+		}
+		gridOptions.excelStyles = [
+			{
+				id: 'dateFormat',
+				dataType: 'dateTime',
+				numberFormat: {
+					format: 'YYYY-MM-DD;@'
+				}
+			},
+			{
+				id: 'textFormat',
+				dataType: 'string'
+			}
+		]
+		gridOptions.api.exportDataAsExcel(params);
+		
 	});
 
 	$(document).ready(function() {

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

@@ -1,6 +1,6 @@
 <!DOCTYPE html>
 <html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
+	  xmlns:th="http://www.thymeleaf.org">
 <!--
  *******************************************************************************
  * @source  : MainContentsPopupForm.html
@@ -14,43 +14,43 @@
  * 1.0  2021.2.23    bin2107     최초 작성
  *******************************************************************************
  -->
-	<div class="modalPopup" data-width="1400" >
-		<div class="panelStyle">
-			<div class="panelTitle">
-				<h2 id="popTitle" th:text="${contentsLoc}"></h2>
-				<button type="button" class="close" onclick="fnMainContentsPopupFormClose()"><i class="fa fa-times"></i></button>
-			</div>
-			<div class="panelContent">
-				<ul class="panelBar">
-					<li class="aL">
-						<span class="cBlue">* 상단으로 드래그&amp;드랍하여 순서 변경 가능합니다.</span>
-					</li>
-					<li class="aR">
-						<button type="button" class="btn btn btn-base btn-sm" id="btnPopAddRow">컨텐츠 추가</button>
-						<button type="button" class="btn btn btn-dark btn-sm" id="btnPopSave">임시저장</button>
-						<input type="hidden" name="uploadDefaultUrlPop" id="uploadDefaultUrlPop" th:value="${@environment.getProperty('upload.image.view') + '/display/contents/'}"/>
-					</li>
-				</ul>
-			</div>
-			<form name="contentsTitleForm" id="contentsTitleForm" style="width:1170px; overflow:auto; display: none;">
-				<table class="frmStyle">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:90%;"/>
-					</colgroup>
-					<tr>
-						<th>컨텐츠 타이틀</th>
-						<td><input type="text" name="contentsTitle" style="width:50%;" maxlength="40" required="required" data-valid-name="컨텐츠타이틀" th:value="${contentsTitle}"></td>
-					</tr>
-				</table>
-			</form>
-			<form style="height:600px; width:1370px; overflow:auto;" id="popSortable">
-			</form>
+<div class="modalPopup" data-width="1500" >
+	<div class="panelStyle">
+		<div class="panelTitle">
+			<h2 id="popTitle" th:text="${contentsLoc}"></h2>
+			<button type="button" class="close" onclick="fnMainContentsPopupFormClose()"><i class="fa fa-times"></i></button>
 		</div>
+		<div class="panelContent">
+			<ul class="panelBar">
+				<li class="aL">
+					<span class="cBlue">* 상단으로 드래그&amp;드랍하여 순서 변경 가능합니다.</span>
+				</li>
+				<li class="aR">
+					<button type="button" class="btn btn btn-base btn-sm" id="btnPopAddRow">컨텐츠 추가</button>
+					<button type="button" class="btn btn btn-dark btn-sm" id="btnPopSave">임시저장</button>
+					<input type="hidden" name="uploadDefaultUrlPop" id="uploadDefaultUrlPop" th:value="${@environment.getProperty('upload.image.view') + '/display/contents/'}"/>
+				</li>
+			</ul>
+		</div>
+		<form name="contentsTitleForm" id="contentsTitleForm" style="width:1170px; overflow:auto; display: none;">
+			<table class="frmStyle">
+				<colgroup>
+					<col style="width:10%;"/>
+					<col style="width:90%;"/>
+				</colgroup>
+				<tr>
+					<th>컨텐츠 타이틀</th>
+					<td><input type="text" name="contentsTitle" style="width:50%;" maxlength="40" required="required" data-valid-name="컨텐츠타이틀" th:value="${contentsTitle}"></td>
+				</tr>
+			</table>
+		</form>
+		<form style="height:600px; width:1470px; overflow:auto;" id="popSortable">
+		</form>
 	</div>
+</div>
 
 <script th:inline="javascript">
-/*<![CDATA[*/
+	/*<![CDATA[*/
 	var cateNo = [[${cateNo}]];
 	var contentsLoc = [[${contentsLoc}]];
 	var contentsTitle = [[${contentsTitle}]];
@@ -74,7 +74,8 @@
 		for(var i=0; i<result.length; i++){
 			var dispStdt = result[i].dispStdt.split(" ");
 			var dispEddt = result[i].dispEddt.split(" ");
-			html += '<table class="frmStyle" style="margin-bottom:30px">';
+			html += '<table class="frmStyle mcTable" style="margin-bottom:30px" id="mcTable'+i+'">';
+			html += '<input type="hidden" name="tableIdx" value="'+i+'" >';
 			html += '<colgroup>';
 			html += '<col style="width:10%;"/>';
 			html += '<col style="width:55%;"/>';
@@ -98,7 +99,7 @@
 			html += '<input name="dispOrd" type="text" class="w80"placeholder="전시순서" style="margin-left:5px; text-align:center"/>';
 			html += '</td>';
 			html += '<td class="aL"><button type="button" class="btn btn-base btn-lg" onclick="fnAddTitlePopRow(this);">타이틀추가</button>';
-			if(contentsLoc=='SMM001' || contentsLoc=='SBM004' || contentsLoc=='SBMM004'){
+			if(contentsLoc=='SMM001' || contentsLoc=='SMM002' || contentsLoc=='SBM004' || contentsLoc=='SBMM004'){
 				html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddSubTextPopRow(this);">서브텍스트추가</button>';
 			}
 			if(contentsLoc=='SBM005' || contentsLoc=='SBMM005'){
@@ -109,7 +110,27 @@
 			}
 			html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddLinkPopRow(this);">링크추가</button>';
 			html += '<button type="button" class="btn btn-danger btn-lg" onclick="fnDeleteContentsRow(this);">삭제</button></td>';
-			html += '</tr></thead><tbody>';
+			html += '</tr>';
+			if(contentsLoc=='SMM001'){
+				//html += fnMainBannerArea(i);
+				html += '<tr>';
+				html += '	<th>컨텐츠유형</th>';
+				html += '	<td class="planArea" name="planArea" colspan="3">';
+				html += '		<label class="rdoBtn"><input type="radio" name="contentsType'+i+'" value="P" onclick="fnChangeContentsType(this,'+i+');" checked="checked"/>기획전</label>';
+				html += '		<label class="rdoBtn"><input type="radio" name="contentsType'+i+'" value="E" onclick="fnChangeContentsType(this,'+i+');"/>이벤트</label>';
+				html += '		<input type="text" class="w100 inputPlan" name="planSq'+i+'" value=""/>';
+				html += '		<button type="button" class="btn btn btn-dark btn-sm btnPlan" onclick="fnSearchPlan('+i+');">기획전검색</button>';
+				html += '	</td>';
+				html += '</tr>';
+				html += '<tr>';
+				html += '	<th>썸네일 <br>글자 색상</th>';
+				html += '	<td colspan="3">';
+				html += '		<label class="rdoBtn"><input type="radio" name="thumTextColor'+i+'" value="BLACK" checked="checked"/>BLACK</label>';
+				html += '		<label class="rdoBtn"><input type="radio" name="thumTextColor'+i+'" value="WHITE" />WHITE</label>';
+				html += '	</td>';
+				html += '</tr>';
+			}
+			html += '</thead><tbody>';
 			for(var j=1; j<5; j++){
 				var strTitle = eval("result["+i+"].strTitle" + j);
 				var imgPath = eval("result["+i+"].imgPath" + j);
@@ -138,12 +159,39 @@
 			changeYear: true,
 			defaultDate: $('.schDate').val()
 		});
+		fnResetIdx();
+	}
+
+	var fnResetIdx = function (){
+		$(".mcTable").each(function(i){
+			var thisIdx = $(this).find("input[name=tableIdx]").val();
+			var contentsTypeVal = $(this).find("input:radio[name=contentsType"+thisIdx+"]:checked").val();
+			var textColorVal = $(this).find("input:radio[name=thumTextColor"+thisIdx+"]:checked").val();
+			console.log(i+ '::contentsTypeVal::'+contentsTypeVal);
+			console.log(i+ '::textColorVal::'+textColorVal);
+
+			$(this).find("input:radio[name=contentsType"+thisIdx+"]").removeAttr("onclick");
+			$(this).find("input:radio[name=contentsType"+thisIdx+"]").attr("onclick", "fnChangeContentsType(this,"+i+");");
+			$(this).find("input:radio[name=contentsType"+thisIdx+"]").val(contentsTypeVal);
+			$(this).find("input[name=planSq"+thisIdx+"]").removeAttr("onclick");
+			$(this).find("input[name=planSq"+thisIdx+"]").attr("onclick", "fnSearchPlan("+i+");");
+			$(this).find("input[name=contentsType"+thisIdx+"]").attr('name','contentsType'+i);
+			$(this).find("input[name=planSq"+thisIdx+"]").attr('name','planSq'+i);
+			$(this).find("input:radio[name=thumTextColor"+thisIdx+"]").attr('name','thumTextColor'+i);
+			$(this).find("input:radio[name=thumTextColor"+thisIdx+"]").val(textColorVal);
+			$(this).attr('id','mcTable'+i);
+			$(this).find("input[name=tableIdx]").val(i);
+		});
+
 	}
+
 	/**
 	 * 컨텐츠 추가 버튼
 	 */
+	var dataIdx=0;
 	$("#btnPopAddRow").on("click", function (){
-		var html = '<table class="frmStyle" style="margin-bottom:30px">';
+		var html = '<table class="frmStyle mcTable" style="margin-bottom:30px" id="mcTable'+dataIdx+'">';
+		html += '<input type="hidden" name="tableIdx" value="'+dataIdx+'">';
 		html += '<colgroup>';
 		html += '<col style="width:10%;"/>';
 		html += '<col style="width:55%;"/>';
@@ -167,7 +215,7 @@
 		html += '<input name="dispOrd" type="text" class="w80"placeholder="전시순서" style="margin-left:5px; text-align:center"/>';
 		html += '</td>';
 		html += '<td class="aL"><button type="button" class="btn btn-base btn-lg" onclick="fnAddTitlePopRow(this);">타이틀추가</button>';
-		if(contentsLoc=='SMM001' || contentsLoc=='SBM004' || contentsLoc=='SBMM004'){
+		if(contentsLoc=='SMM001' || contentsLoc=='SMM002' || contentsLoc=='SBM004' || contentsLoc=='SBMM004'){
 			html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddSubTextPopRow(this);">서브텍스트추가</button>';
 		}
 		if(contentsLoc=='SBM005' || contentsLoc=='SBMM005'){
@@ -178,7 +226,27 @@
 		}
 		html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddLinkPopRow(this);">링크추가</button>';
 		html += '<button type="button" class="btn btn-danger btn-lg" onclick="fnDeleteContentsRow(this);">삭제</button></td>';
-		html += '</tr></thead><tbody></tbody></table>';
+		html += '</tr>';
+		if(contentsLoc=='SMM001'){
+			//html += fnMainBannerArea();
+			html += '<tr>';
+			html += '	<th>컨텐츠유형</th>';
+			html += '	<td class="planArea" name="planArea" colspan="3">';
+			html += '		<label class="rdoBtn"><input type="radio" name="contentsType'+dataIdx+'" value="P" onclick="fnChangeContentsType(this,'+dataIdx+');" checked="checked"/>기획전</label>';
+			html += '		<label class="rdoBtn"><input type="radio" name="contentsType'+dataIdx+'" value="E" onclick="fnChangeContentsType(this,'+dataIdx+');"/>이벤트</label>';
+			html += '		<input type="text" class="w100 inputPlan" name="planSq'+dataIdx+'" value=""/>';
+			html += '		<button type="button" class="btn btn btn-dark btn-sm btnPlan" onclick="fnSearchPlan('+dataIdx+');">기획전검색</button>';
+			html += '	</td>';
+			html += '</tr>';
+			html += '<tr>';
+			html += '	<th>썸네일 <br>글자 색상</th>';
+			html += '	<td colspan="3">';
+			html += '		<label class="rdoBtn"><input type="radio" name="thumTextColor'+dataIdx+'" value="BLACK" checked="checked"/>BLACK</label>';
+			html += '		<label class="rdoBtn"><input type="radio" name="thumTextColor'+dataIdx+'" value="WHITE" />WHITE</label>';
+			html += '	</td>';
+			html += '</tr>';
+		}
+		html += '</thead><tbody></tbody></table>';
 		$("#popSortable").prepend(html);
 		$("#popSortable").sortable();
 		$('.schDate').datepicker("destroy");
@@ -187,8 +255,56 @@
 			changeYear: true,
 			defaultDate: $('.schDate').val()
 		});
+		fnResetIdx();
 	});
 
+	var mbIdx = 0;
+	var fnMainBannerArea = function (param){
+		var html = '';
+		html += '<tr>';
+		html += '	<th>컨텐츠유형</th>';
+		html += '	<td class="planArea" name="planArea" colspan="3">';
+		html += '		<label class="rdoBtn"><input type="radio" name="contentsType'+mbIdx+'" value="P" onclick="fnChangeContentsType(this,'+mbIdx+');" checked="checked"/>기획전</label>';
+		html += '		<label class="rdoBtn"><input type="radio" name="contentsType'+mbIdx+'" value="E" onclick="fnChangeContentsType(this,'+mbIdx+');"/>이벤트</label>';
+		html += '		<input type="text" class="w100 inputPlan" name="planSq'+mbIdx+'" value=""/>';
+		html += '		<button type="button" class="btn btn btn-dark btn-sm btnPlan" onclick="fnSearchPlan('+mbIdx+');">기획전검색</button>';
+		html += '	</td>';
+		html += '</tr>';
+		html += '<tr>';
+		html += '	<th>썸네일 <br>글자 색상</th>';
+		html += '	<td colspan="3">';
+		html += '		<label class="rdoBtn"><input type="radio" name="thumTextColor'+mbIdx+'" value="BLACK" checked="checked"/>BLACK</label>';
+		html += '		<label class="rdoBtn"><input type="radio" name="thumTextColor'+mbIdx+'" value="WHITE" />WHITE</label>';
+		html += '	</td>';
+		html += '</tr>';
+		mbIdx++;
+		return html;
+	}
+
+	// 몰메인>메인롤링배너 컨텐츠유형 선택시
+	var fnChangeContentsType = function (obj, idx){
+		var radioVal = $(obj).closest("td").find("input[name=contentsType"+idx+"]:checked").val();
+		if(radioVal=='P'){
+			$(obj).find(".planArea .inputPlan").show();
+			$(obj).find(".planArea .btnPlan").show();
+		}else{
+			$(obj).find(".planArea").find("input[name=planSq"+idx+"]").val('');
+			$(obj).find(".planArea .inputPlan").hide();
+			$(obj).find(".planArea .btnPlan").hide();
+		}
+	}
+
+	// 몰메인>메인롤링배너 기획전 조회
+	var tableDataId = 0;
+	var fnSearchPlan = function (idx){
+		cfnOpenPlanPopup('callbackPlanPopup');
+		tableDataId = idx;
+	}
+
+	var callbackPlanPopup = function (result){
+		$("#mcTable"+tableDataId+" .planArea").find("input[name=planSq"+tableDataId+"]").val(result[0].planSq);
+	}
+
 	/**
 	 * 임시저장
 	 */
@@ -565,7 +681,7 @@
 		$("#popSortable").disableSelection();
 		fnGetContentsPreviewList();
 	});
-/*]]>*/
+	/*]]>*/
 </script>
 
 </html>

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

@@ -27,7 +27,7 @@
 					</li>
 					<li class="aR">
 						<button type="button" class="btn btn btn-base btn-sm" onclick="fnAddTab(this);">TAB 컨텐츠 추가</button>
-						<button type="button" class="btn btn btn-dark btn-sm" id="btnPopSave">임시저장</button>
+						<button type="button" class="btn btn btn-dark btn-sm" id="btnGnbTabSave">임시저장</button>
 					</li>
 				</ul>
 			</div>
@@ -92,32 +92,53 @@
 
 	var fnChangeCateType = function (obj, idx){
 		let cateType = $("#tabTable"+idx).find("input:radio[name=cateType"+idx+"]:checked").val();
-		console.log('cateType>>>'+cateType);
 
 		var html = '';
-		if(cateType=='brand'){
+		if(cateType=='B'){
 			$(obj).closest("table").find("[name=tabBrandRow]").show();
 			$(obj).closest("table").find("[name=tabCateRow]").hide();
 			$(obj).closest("table").find("[name=tabOutletRow]").hide();
 			$(obj).closest("table").find("[name=tabLinkTitleRow]").hide();
 			$(obj).closest("table").find("[name=tabLinkRow]").hide();
-		}else if(cateType=='category'){
+			/*$(obj).closest("table").find("[name=title]").val("브랜드");
+			$(obj).closest("table").find("[name=link]").val("/brand/list");
+			$(obj).closest("table").find("[name=title]").attr("readOnly",true);
+			$(obj).closest("table").find("[name=link]").attr("readOnly",true);*/
+		}else if(cateType=='C'){
 			$(obj).closest("table").find("[name=tabBrandRow]").hide();
+			$(obj).closest("table").find("[name=tabBrandTitle]").hide();
+			$(obj).closest("table").find("[name=tabBrandLink]").hide();
 			$(obj).closest("table").find("[name=tabCateRow]").show();
 			$(obj).closest("table").find("[name=tabOutletRow]").hide();
 			$(obj).closest("table").find("[name=tabLinkTitleRow]").hide();
 			$(obj).closest("table").find("[name=tabLinkRow]").hide();
-		}else if(cateType=='outlet'){
+			/*$(obj).closest("table").find("[name=title]").val("");
+			$(obj).closest("table").find("[name=link]").val("/category/form");
+			$(obj).closest("table").find("[name=title]").attr("readOnly",true);
+			$(obj).closest("table").find("[name=link]").attr("readOnly",true);*/
+		}else if(cateType=='O'){
 			$(obj).closest("table").find("[name=tabBrandRow]").hide();
+			$(obj).closest("table").find("[name=tabBrandTitle]").hide();
+			$(obj).closest("table").find("[name=tabBrandLink]").hide();
 			$(obj).closest("table").find("[name=tabCateRow]").hide();
 			$(obj).closest("table").find("[name=tabLinkTitleRow]").hide();
 			$(obj).closest("table").find("[name=tabLinkRow]").hide();
-		}else if(cateType=='link'){
+			/*$(obj).closest("table").find("[name=title]").val("아울렛");
+			$(obj).closest("table").find("[name=link]").val("/outlet/main");
+			$(obj).closest("table").find("[name=title]").attr("readOnly",true);
+			$(obj).closest("table").find("[name=link]").attr("readOnly",true);*/
+		}else if(cateType=='L'){
 			$(obj).closest("table").find("[name=tabBrandRow]").hide();
+			$(obj).closest("table").find("[name=tabBrandTitle]").hide();
+			$(obj).closest("table").find("[name=tabBrandLink]").hide();
 			$(obj).closest("table").find("[name=tabCateRow]").hide();
 			$(obj).closest("table").find("[name=tabOutletRow]").hide();
 			$(obj).closest("table").find("[name=tabLinkTitleRow]").show();
 			$(obj).closest("table").find("[name=tabLinkRow]").show();
+			/*$(obj).closest("table").find("[name=title]").val("");
+			$(obj).closest("table").find("[name=link]").val("#");
+			$(obj).closest("table").find("[name=title]").attr("readOnly",false);
+			$(obj).closest("table").find("[name=link]").attr("readOnly",false);*/
 		}
 	}
 
@@ -126,7 +147,14 @@
 	 */
 	var tabIdx = 0;
 	var fnAddTab = function (param){
+		if(gagajf.isNull($(".tabTable").find("input[data-id]").val())){
+			tabIdx = 0;
+		}else{
+			tabIdx = parseInt($(".tabTable").find("input[data-id]").val())+1;
+		}
+
 		var html = '<table class="frmStyle tabTable" style="margin-bottom:30px" id="tabTable'+tabIdx+'">';
+		html += '<input type="hidden" name="idxTest" value="'+tabIdx+'" data-id="'+tabIdx+'">';
 		html += '<colgroup>';
 		html += '<col style="width:10%;"/>';
 		html += '<col style="width:55%;"/>';
@@ -159,15 +187,23 @@
 		html += '	<tr name="tabBrandRow" style="display:none;">';
 		html += '		<th>캐주얼<br><button type="button" class="btn btn-base btn-lg" onclick="fnSearchBrand(\''+tabIdx+'\',1);">브랜드조회</button></th>';
 		html += '		<td colspan="3" id="tabBrand1">';
+		html += '			<ul class="brandGroupUl">';
+		html += '			</ul>';
 		html += '		</td>';
 		html += '	</tr>';
 		html += '	<tr name="tabBrandRow" style="display:none;">';
 		html += '		<th>골프<br><button type="button" class="btn btn-base btn-lg" onclick="fnSearchBrand(\''+tabIdx+'\',2);">브랜드조회</button></th>';
-		html += '		<td colspan="3" id="tabBrand2"></td>';
+		html += '		<td colspan="3" id="tabBrand2">';
+		html += '			<ul class="brandGroupUl">';
+		html += '			</ul>';
+		html += '		</td>';
 		html += '	</tr>';
 		html += '	<tr name="tabBrandRow" style="display:none;">';
 		html += '		<th>키즈<br><button type="button" class="btn btn-base btn-lg" onclick="fnSearchBrand(\''+tabIdx+'\',3);">브랜드조회</button></th>';
-		html += '		<td colspan="3" id="tabBrand3"></td>';
+		html += '		<td colspan="3" id="tabBrand3">';
+		html += '			<ul class="brandGroupUl">';
+		html += '			</ul>';
+		html += '		</td>';
 		html += '	</tr>';
 		html += '	<tr name="tabCateRow" style="display:none;">';
 		html += '		<th>카테고리</th>';
@@ -186,7 +222,7 @@
 		html += '	</tr>';
 		html += '	<tr name="tabLinkRow" style="display:none;">';
 		html += '		<th>링크 (없으면 #)</th>';
-		html += '		<td><input name="link" type="text" maxlength="200" required="required" data-valid-name="링크" value=""/></td>';
+		html += '		<td><input name="link" type="text" maxlength="200" data-valid-name="링크" value=""/></td>';
 		html += '	</tr>';
 		html += '</tbody>';
 		html += '</table>';
@@ -200,20 +236,25 @@
 			defaultDate: $('.schDate').val()
 		});
 		tabIdx++;
-		//fnResetTabIdx();
+		fnResetTabIdx();
 		//fnResetCateTypeIdx();
 	}
 
 	var cateTypeIdx = 0;
 	var fnCateTypeArea = function (){
+		if(gagajf.isNull($(".tabTable").find("input[data-id]").val())){
+			cateTypeIdx = 0;
+		}else{
+			cateTypeIdx = parseInt($(".tabTable").find("input[data-id]").val())+1;
+		}
 		var html = '';
 		html += '<tr class="cateTypeTr">';
 		html += '<th>유형선택</th>';
 		html += '<td colspan="3">';
-		html += '<label class="rdoBtn"><input type="radio" name="cateType'+cateTypeIdx+'" value="brand" onclick="fnChangeCateType(this,'+cateTypeIdx+');"/>브랜드</label>';
-		html += '<label class="rdoBtn"><input type="radio" name="cateType'+cateTypeIdx+'" value="category" onclick="fnChangeCateType(this,'+cateTypeIdx+');"/>대카테고리</label>';
-		html += '<label class="rdoBtn"><input type="radio" name="cateType'+cateTypeIdx+'" value="outlet" onclick="fnChangeCateType(this,'+cateTypeIdx+');"/>아울렛</label>';
-		html += '<label class="rdoBtn"><input type="radio" name="cateType'+cateTypeIdx+'" value="link" onclick="fnChangeCateType(this,'+cateTypeIdx+');"/>이벤트링크</label>';
+		html += '<label class="rdoBtn"><input type="radio" name="cateType'+cateTypeIdx+'" value="B" onclick="fnChangeCateType(this,'+cateTypeIdx+');"/>브랜드</label>';
+		html += '<label class="rdoBtn"><input type="radio" name="cateType'+cateTypeIdx+'" value="C" onclick="fnChangeCateType(this,'+cateTypeIdx+');"/>대카테고리</label>';
+		html += '<label class="rdoBtn"><input type="radio" name="cateType'+cateTypeIdx+'" value="O" onclick="fnChangeCateType(this,'+cateTypeIdx+');"/>아울렛</label>';
+		html += '<label class="rdoBtn"><input type="radio" name="cateType'+cateTypeIdx+'" value="L" onclick="fnChangeCateType(this,'+cateTypeIdx+');"/>이벤트링크</label>';
 		html += '</td>';
 		html += '</tr>';
 
@@ -223,7 +264,7 @@
 
 	var fnResetTabIdx = function (){
 		$(".tabTable").each(function(i){
-			$(this).attr('id','tabTable'+i);
+			//$(this).attr('id','tabTable'+i);
 			$(this).find("input[name=dispOrd]").val(i+1);
 		});
 
@@ -245,34 +286,287 @@
 		cfnOpenBrandGroupListPopup("callBackBrandGroup", "S", "S");
 	}
 
+	var brandCdIdx=0;
 	var callBackBrandGroup = function (result){
+		if(gagajf.isNull($("#tabTable"+tabTableRow+" #tabBrand"+callbackBrandTr +" .brandGroupUl").find("input[data-id]:last").val())){
+			brandCdIdx = 0;
+		}else{
+			brandCdIdx = parseInt($("#tabTable"+tabTableRow+" #tabBrand"+callbackBrandTr +" .brandGroupUl").find("input[data-id]:last").val())+1;
+		}
 		var html = '';
 
 		for(let i=0; i<result.length; i++){
 			console.log('brandGroupNo:::'+result[i].brandGroupNo);
-			html += '<ul id="brandUl'+i+'">';
-			html += '<span id="brandSpan'+i+'">';
-			html += '	<input type="hidden" name="brandGroupNo" value="'+result[i].brandGroupNo+'"/>'
-			html += '	<span style="margin-right:10px;">'+result[i].brandGroupNo+'<a href="javascript:void(0);" onclick="fnRemoveBrand(this,'+i+');">X</a></span>';
+			html += '<span id="brandSpan'+brandCdIdx+'">';
+			html += '<input type="hidden" name="hIdx" value="'+brandCdIdx+'" data-id="'+brandCdIdx+'">';
+			html += '	<input type="text" class="w100" name="brandGroupNo" id="brandGroupNo_'+brandCdIdx+'" value="'+result[i].brandGroupNo+'" disabled="disabled"/>'
+			html += '	<span style="margin-right:10px;"><a href="javascript:void(0);" onclick="fnRemoveBrand(this,'+brandCdIdx+');">X</a></span>';
 			html += '</span>';
-			html += '</ul>';
-		}
 
-		$("#tabTable"+tabTableRow +" #tabBrand"+callbackBrandTr).append(html);
+		}
+		$("#tabTable"+tabTableRow +" #tabBrand"+callbackBrandTr+" .brandGroupUl").append(html);
 	}
 
 	var fnRemoveBrand = function (obj, idx){
-		var divId = $(obj).closest('ul').attr('id');
+		var divId = $(obj).closest('td').attr('id');
 		$("#"+divId+" #brandSpan"+idx).remove();
 	}
 
 	// 컨텐츠 행삭제
 	var fnDeleteContentsRow = function (obj){
 		$(obj).closest("table").remove();
+		fnResetTabIdx();
+	}
+
+	/**
+	 * 임시저장
+	 */
+	var dataArr = [];
+	$("#btnGnbTabSave").on('click',function (){
+		if(!gagajf.checkRequired("#gnbTabList")){
+			return;
+		}
+		dataArr = [];
+		console.log('1');
+		$(".tabTable").each(function (){
+			console.log('2');
+			//var brandCasualArr = [];
+			//var brandGolfArr = [];
+			//var brandKidsArr = [];
+			var strTitle1 = "";		// 타이틀
+			var strTitle2 = "";		// category 일때, 카테코드
+			var strVar1 = "";		// 링크
+
+			var brnadCasualList = "";
+			var brnadGolfList = "";
+			var brnadKidsList = "";
+
+			var radioNm = $(this).find(".rdoBtn input").attr("name");
+			var radioValue = $(this).find("input:radio[name="+radioNm+"]:checked").val();
+
+			if(radioValue=='B'){
+				$(this).find("#tabBrand1 >ul >span").each(function (){
+					//brandCasualArr.push($(this).find("input[name=brandGroupNo]").val());
+					brnadCasualList += ','+$(this).find("input[name=brandGroupNo]").val();
+				});
+				$(this).find("#tabBrand2 >ul >span").each(function (){
+					//brandCasualArr.push($(this).find("input[name=brandGroupNo]").val());
+					brnadGolfList += ','+$(this).find("input[name=brandGroupNo]").val();
+				});
+				$(this).find("#tabBrand3 >ul >span").each(function (){
+					//brandCasualArr.push($(this).find("input[name=brandGroupNo]").val());
+					brnadKidsList += ','+$(this).find("input[name=brandGroupNo]").val();
+				});
+				strTitle1 = "브랜드";
+				strVar1 = "/brand/list";
+			}
+
+			if(radioValue=='C'){
+				var cateText = $(this).find("tr[name=tabCateRow]").find("select[name=cate1List] option:selected").text();
+				var cateValue = $(this).find("tr[name=tabCateRow]").find("select[name=cate1List] option:selected").val();
+				var cateTextArr = cateText.split(" ");
+				strTitle1 = cateTextArr[1];
+				strVar1 = "/category/form";
+				strVar2 = cateValue;
+			}
+
+			if(radioValue=='O'){
+				strTitle1 = "아울렛";
+				strVar1 = "/outlet/main";
+			}
+
+			if(radioValue=='L'){
+				strTitle1 = $(this).find("input[name=title]").val();
+				strVar1 = $(this).find("input[name=link]").val();
+			}
+
+			var dispStdt = $(this).find("[name=dispStdt]").val().replace(/[^0-9]/g, '') + "" +$(this).find("[name=stTimeHour]").val().replace('시', '') + "" +$(this).find("[name=stTimeMin]").val().replace('분', '') + "00";
+			var dispEddt = $(this).find("[name=dispEddt]").val().replace(/[^0-9]/g, '') + "" +$(this).find("[name=edTimeHour]").val().replace('시', '') + "" +$(this).find("[name=edTimeMin]").val().replace('분', '') + "59";
+			var dispOrd = $(this).find("[name=dispOrd]").val();
+			var newImgFileArr = [];
+
+			var data = {
+				cateNo : cateNo
+				, contentsLoc : contentsLoc
+				, contentsType : radioValue
+				, dispOrd : dispOrd
+				, dispStdt : dispStdt
+				, dispEddt : dispEddt
+				, newImgFileArr : newImgFileArr
+				, strVar1 : strVar1
+				, strVar2 : brnadCasualList
+				, strVar3 : brnadGolfList
+				, strVar4 : brnadKidsList
+				, strTitle1 : strTitle1
+				, strTitle2 : strTitle2
+				, useYn : 'Y'
+			}
+			dataArr.push(data);
+		});
+		var jsonData = JSON.stringify(dataArr);
+		mcxDialog.confirm('컨텐츠를 저장 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				gagajf.ajaxJsonSubmit('/display/contents/preview/save', jsonData, fnGetGnbTabContentsPreviewList);
+			}
+		});
+	});
+
+	var fnGetGnbTabContentsPreviewList = function (){
+		console.log('등록이되었다!');
+		$("#gnbTabList").html('');
+		var data = {cateNo : cateNo
+			,contentsLoc : contentsLoc
+		};
+		var jsonData = JSON.stringify(data);
+		gagajf.ajaxJsonSubmit('/display/contents/preview/list', jsonData, fnCreateGnbTabLayout);
+	}
+
+
+
+	var tableIdx = 0;
+	var fnCreateGnbTabLayout = function (result){
+		/*if(gagajf.isNull($(".tabTable").find("input[data-id]").val())){
+			tabIdx = 0;
+		}else{
+			tabIdx = parseInt($(".tabTable").find("input[data-id]").val())+1;
+		}*/
+		var html = '';
+		for(var i=0; i<result.length; i++){
+			var dispStdt = result[i].dispStdt.split(" ");
+			var dispEddt = result[i].dispEddt.split(" ");
+
+			html += '<table class="frmStyle tabTable" style="margin-bottom:30px" id="tabTable'+i+'">';
+			html += '<input type="hidden" name="idxTest" value="'+i+'" data-id="'+i+'">';
+			html += '<colgroup>';
+			html += '<col style="width:10%;"/>';
+			html += '<col style="width:55%;"/>';
+			html += '<col/>';
+			html += '</colgroup>';
+			html += '<thead>';
+			html += '<tr class="cateTypeTr">';
+			html += '<th>유형선택</th>';
+			html += '<td colspan="3">';
+			if(result[i].contentsType=='B'){
+				html += '<label class="rdoBtn"><input type="radio" name="cateType'+i+'" value="B" onclick="fnChangeCateType(this,'+i+');" checked="checked"/>브랜드</label>';
+			}else{
+				html += '<label class="rdoBtn"><input type="radio" name="cateType'+i+'" value="B" onclick="fnChangeCateType(this,'+i+');"/>브랜드</label>';
+			}
+			if(result[i].contentsType=='C'){
+				html += '<label class="rdoBtn"><input type="radio" name="cateType'+i+'" value="C" onclick="fnChangeCateType(this,'+i+');" checked="checked"/>대카테고리</label>';
+			}else{
+				html += '<label class="rdoBtn"><input type="radio" name="cateType'+i+'" value="C" onclick="fnChangeCateType(this,'+i+');"/>대카테고리</label>';
+			}
+			if(result[i].contentsType=='O'){
+				html += '<label class="rdoBtn"><input type="radio" name="cateType'+i+'" value="O" onclick="fnChangeCateType(this,'+i+');" checked="checked"/>아울렛</label>';
+			}else{
+				html += '<label class="rdoBtn"><input type="radio" name="cateType'+i+'" value="O" onclick="fnChangeCateType(this,'+i+');"/>아울렛</label>';
+			}
+			if(result[i].contentsType=='L'){
+				html += '<label class="rdoBtn"><input type="radio" name="cateType'+i+'" value="L" onclick="fnChangeCateType(this,'+i+');" checked="checked"/>이벤트링크</label>';
+			}else{
+				html += '<label class="rdoBtn"><input type="radio" name="cateType'+i+'" value="L" onclick="fnChangeCateType(this,'+i+');"/>이벤트링크</label>';
+			}
+			html += '</td>';
+			html += '</tr>';
+			html += '<tr><th>전시일시</th><td><input name="dispStdt" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="노출시작일" data-valid-type="calendar" value="'+dispStdt[0]+'"/>';
+			html += '<select name="stTimeHour" required="required" data-valid-name="노출기간 시작시간">';
+			html += fnCreateTimeOption(24);
+			html += '</select>';
+			html += '<select name="stTimeMin" required="required" data-valid-name="노출기간 시작시간">';
+			html += fnCreateTimeOption(60);
+			html += '</select>';
+			html += '<span> ~ </span>';
+			html += '<input name="dispEddt" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="노출종료일" data-valid-type="calendar" value="'+dispEddt[0]+'"/>';
+			html += '<select name="edTimeHour" required="required" data-valid-name="노출기간 종료시간">';
+			html += fnCreateTimeOption(24,23);
+			html += '</select>';
+			html += '<select name="edTimeMin" required="required" data-valid-name="노출기간 종료시간">';
+			html += fnCreateTimeOption(60,59);
+			html += '</select>';
+			html += '<input name="dispOrd" type="text" class="w80"placeholder="전시순서" style="margin-left:5px; text-align:center" value="'+result[i].dispOrd+'"/>';
+			html += '</td>';
+			html += '<td class="aL cateTypeBtnArea">';
+			html += '<button type="button" class="btn btn-danger btn-lg" onclick="fnDeleteContentsRow(this);">삭제</button></td>';
+			html += '</tr>';
+			html += '</thead>';
+			html += '<tbody>';
+			if(result[i].contentsType=='B'){
+				html += '	<tr name="tabBrandRow">';
+				html += '		<th>캐주얼<br><button type="button" class="btn btn-base btn-lg" onclick="fnSearchBrand(\''+i+'\',1);">브랜드조회</button></th>';
+				html += '		<td colspan="3" id="tabBrand1">';
+				html += '			<ul class="brandGroupUl">';
+
+				html += '			</ul>';
+				html += '		</td>';
+				html += '	</tr>';
+				html += '	<tr name="tabBrandRow">';
+				html += '		<th>골프<br><button type="button" class="btn btn-base btn-lg" onclick="fnSearchBrand(\''+i+'\',2);">브랜드조회</button></th>';
+				html += '		<td colspan="3" id="tabBrand2">';
+				html += '			<ul class="brandGroupUl">';
+
+				html += '			</ul>';
+				html += '		</td>';
+				html += '	</tr>';
+				html += '	<tr name="tabBrandRow">';
+				html += '		<th>키즈<br><button type="button" class="btn btn-base btn-lg" onclick="fnSearchBrand(\''+i+'\',3);">브랜드조회</button></th>';
+				html += '		<td colspan="3" id="tabBrand3">';
+				html += '			<ul class="brandGroupUl">';
+
+				html += '			</ul>';
+				html += '		</td>';
+				html += '	</tr>';
+			}
+			else if(result[i].contentsType=='C'){
+				html += '	<tr name="tabCateRow">';
+				html += '		<th>카테고리</th>';
+				html += '		<td colspan="3">카테고리선택';
+				html += '			<select name="cate1List">';
+				html += '				<option value="">[선택]</option>';
+				for(let i=0; i<cate1List.length; i++){
+					if(strTitle2==cate1List[i].cd){
+						html += '<option value="'+cate1List[i].cd+'" selected="selected">['+cate1List[i].cd+'] '+cate1List[i].cdNm+'</option>';
+					}else{
+						html += '<option value="'+cate1List[i].cd+'">['+cate1List[i].cd+'] '+cate1List[i].cdNm+'</option>';
+					}
+				}
+				html += '			</select>';
+				html += '		</td>';
+				html += '	</tr>';
+			}
+			else if(result[i].contentsType=='L'){
+				html += '	<tr name="tabLinkTitleRow" style="display:none;">';
+				html += '		<th>타이틀</th>';
+				html += '		<td><input name="title" type="text" maxlength="200" data-valid-name="타이틀" value="'+result[i].strTitle1+'"/></td>';
+				html += '	</tr>';
+				html += '	<tr name="tabLinkRow" style="display:none;">';
+				html += '		<th>링크 (없으면 #)</th>';
+				html += '		<td><input name="link" type="text" maxlength="200" data-valid-name="링크" value="'+result[i].strVar1+'"/></td>';
+				html += '	</tr>';
+			}
+			html += '</tbody>';
+			html += '</table>';
+		}
+		$("#gnbTabList").append(html);
+		$("#gnbTabList").sortable();
+		$('.schDate').datepicker("destroy");
+		$('.schDate').datepicker({
+			changeMonth: true,
+			changeYear: true,
+			defaultDate: $('.schDate').val()
+		});
 	}
 
 	$(document).ready(function() {
 		$("#gnbTabList").disableSelection();
+		$("#gnbTabList").sortable({
+			stop: function(event, ui) {
+				fnResetTabIdx();
+			}
+		});
+
+		fnGetGnbTabContentsPreviewList();
 	});
 /*]]>*/
 </script>

+ 52 - 5
src/main/webapp/WEB-INF/views/display/MainListForm.html

@@ -44,11 +44,15 @@
 							</select>
 						</td>
 						<th>중분류</th>
-						<td>
+						<td name="cate2Select" style="display:block;">
 							<select name="cate2No" id="cate2No" onchange="fnGetMainDisplayList('cate2');">
 								<option value="">[선택]</option>
 							</select>
 						</td>
+						<td name="cate2Search" style="display:none;">
+							<input type="text" class="w200" name="brandGroupNo" value="" />
+							<button type="button" class="btn btnRight btn-success btn-lg" onclick="fnSearchBrandGroup();">브랜드조회</button>
+						</td>
 					</tr>
 				</table>
 			</form>
@@ -145,7 +149,17 @@
 	*/
 	var fnGetMainDisplayList = function (cate){
 		if(cate=='cate1'){
-			$("#searchForm select[name=cate2No]").html('<option value="">[선택]</option>');
+			var cate1Val = $("#searchForm select[name=cate1No] option:selected").val().split(',')[0];		//1700,Y
+
+			if((!gagajf.isNull(cate1Val)&&cate1Val=='1711') || (!gagajf.isNull(cate1Val)&&cate1Val=='1721')){
+				$("#searchForm").find("td[name=cate2Select]").css('display','none');
+				$("#searchForm").find("td[name=cate2Search]").css('display','block');
+			}else{
+				$("#searchForm").find("td[name=cate2Select]").css('display','block');
+				$("#searchForm").find("td[name=cate2Search]").css('display','none');
+				$("#searchForm").find("td[name=cate2Search]").find("input[name=brandGroupNo]").val('');
+				$("#searchForm select[name=cate2No]").html('<option value="">[선택]</option>');
+			}
 		}
 		$("#viewUl").addClass("off");
 		var val = $("#searchForm select[name=cate1No]").val();
@@ -164,10 +178,18 @@
 				gagajf.ajaxJsonSubmit('/display/main/category/list', jsonData, fnCate2NoCallBack);
 			}else{
 				$("#viewUl").removeClass("off");
-				var cateNo = val.split(',')[0];
-				if(!gagajf.isNull($("#searchForm select[name=cate2No]").val())){
-					cateNo = $("#searchForm select[name=cate2No]").val().split(',')[0];
+				var cateNo = "";
+				var cate1Val = $("#searchForm select[name=cate1No] option:selected").val().split(',')[0];		//1700,Y
+				if((!gagajf.isNull(cate1Val)&&cate1Val=='1711') || (!gagajf.isNull(cate1Val)&&cate1Val=='1721')){
+					cateNo = $("#searchForm").find("td[name=cate2Search]").find("input[name=brandGroupNo]").val();
+				}else{
+					cateNo = val.split(',')[0];
+					if(!gagajf.isNull($("#searchForm select[name=cate2No]").val())){
+						cateNo = $("#searchForm select[name=cate2No]").val().split(',')[0];
+					}
 				}
+
+				console.log('cateNo::'+cateNo);
 				var data = {
 					cateNo : cateNo
 				};
@@ -178,6 +200,15 @@
 		}
 	}
 
+	var fnSearchBrandGroup = function (){
+		cfnOpenBrandGroupListPopup("fnCallBackBrandGroup", "S", "S");
+	}
+
+	var fnCallBackBrandGroup = function (result){
+		$("#searchForm").find("td[name=cate2Search]").find("input[name=brandGroupNo]").val(result[0].brandGroupNo);
+		fnGetMainDisplayList('cate2');
+	}
+
 	/**
 	 * 레이아웃 조회
 	 */
@@ -463,6 +494,16 @@
 		$(obj).closest("tbody").remove();
 	}
 
+	function fnCate2BrandCheck(){
+		var cateBrand = $("#searchForm").find("td[name=cate2Search]").find("input[name=brandGroupNo]").val();
+		if(gagajf.isNull(cateBrand)){
+			mcxDialog.alert('브랜드코드를 조회해주세요.');
+			return false;
+		}
+
+		return true;
+	}
+
 	/**
 	 * 레이아웃 저장
 	 */
@@ -479,6 +520,12 @@
 		var cateNm = '';
 		if(val.split(',')[1]=='Y'){
 			cateNo = val.split(',')[0];
+			if(cateNo == '1711' || cateNo == '1711'){
+				if(!fnCate2BrandCheck()){
+					return false;
+				}
+				cateNo = $("#searchForm").find("td[name=cate2Search]").find("input[name=brandGroupNo]").val();
+			}
 		}else{
 			cateNo = $("#searchForm select[name=cate2No]").val().split(',')[0];
 		}

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

@@ -14,7 +14,7 @@
  * 1.0  2021.2.24    bin2107     최초 작성
  *******************************************************************************
  -->
-	<div class="modalPopup" data-width="1400" >
+	<div class="modalPopup" data-width="1500" >
 		<div class="panelStyle">
 			<div class="panelTitle">
 				<h2 id="multiPopTitle" th:text="${contentsLoc}">Multi</h2>
@@ -47,7 +47,7 @@
 					</tr>
 				</table>
 			</form>
-			<form style="height:600px; width:1370px; overflow:auto;" id="multiPopSortable">
+			<form style="height:600px; width:1470px; overflow:auto;" id="multiPopSortable">
 				<input type="hidden" name="mdTitle">
 			</form>
 		</div>

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

@@ -130,7 +130,7 @@
 								<input type="hidden" name="sysImgNm" id="sysImgNm"/>
 								<input type="hidden" name="newSysImgNm" id="newSysImgNm"/>
 							</div>
-							<input type="hidden" name="uploadDefaultUrl" id="uploadDefaultUrl" th:value="${@environment.getProperty('upload.default.view') + '/display/freegoods/'}"/>
+							<input type="hidden" name="uploadDefaultUrl" id="uploadDefaultUrl" th:value="${@environment.getProperty('upload.default.view')}"/>
 							<div id="imgView" class="off">
 								<img id="bannerPreViewUrl" src="" style="height:100px"/>
 							</div>
@@ -154,7 +154,7 @@
 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
 		{headerName: "이미지", field: "sysImgNm", width: 100, height: 60, cellClass: 'text-center'
 			,cellRenderer: function(params) {
-				return '<img width="60" src="'+ _imgUrl+ "/display/freegoods/" + params.value + '" alt="" onerror="this.src=\'/image/no.gif\';"/>';
+				return '<img width="60" src="'+ _imgUrl+  params.value + '" alt="" onerror="this.src=\'/image/no.gif\';"/>';
 			}
 		},
 		{headerName: "브랜드", field: "brandEnm", width: 130, cellClass: 'text-center'},
@@ -208,6 +208,8 @@
 				$("#imgView").removeClass("off").addClass("on");
 			}else {
 				$("#sysImgNm").val('');
+				$("#bannerPreViewUrl").attr('src', '');
+				$("#imgView").removeClass("on").addClass("off");
 			}
 			$('#detailForm input[name=file]').closest('div').find('label').text('파일선택');
 		}
@@ -294,12 +296,12 @@
 		var file = this.files[0];
 
 		// 파일 업로드
-		gagajf.ajaxFileUpload('/common/file/upload?subDir=/display/freegoods'
+		gagajf.ajaxFileUpload('/common/file/upload?subDir=/contents/freegoods'
 				, file
 				, function(result) {
 					// 업로드한 파일명 설정
 					$('#detailForm input[name=newSysImgNm]').val(result.newFileName);
-					$("#bannerPreViewUrl").attr('src', $("#uploadDefaultUrl").val()+result.newFileName);
+					$("#bannerPreViewUrl").attr('src', $("#uploadDefaultUrl").val()+"/contents/freegoods/"+result.newFileName);
 					$("#imgView").removeClass("off").addClass("on");
 				}
 		);

+ 1 - 1
src/main/webapp/WEB-INF/views/withdraw/RefundDetailForm.html

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

+ 1 - 1
src/main/webapp/WEB-INF/views/withdraw/RefundRegisterListForm.html

@@ -6,7 +6,7 @@
  * @source  : RefundRegisterListForm.html
  * @desc    : 환불관리 화면 Page
  *=============================================================
- * ISTYLE24
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *=============================================================
  * VER  DATE         AUTHOR      DESCRIPTION

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

@@ -6,7 +6,7 @@
  * @source  : WithdrawExceptionListForm.html
  * @desc    : 회수예외관리 Page
  *=============================================================
- * ISTYLE24
+ * STYLE24
  * Copyright(C) 2021 TSIT, All rights reserved.
  *=============================================================
  * VER  DATE         AUTHOR      DESCRIPTION
@@ -68,7 +68,7 @@
 						</tr>
 						<tr>
 							<th class="dashR">등록일</th>
-							<td colspan="4" class="dashR">
+							<td colspan="6" class="dashR">
 								<span id="terms"></span>
 							</td>
 						</tr>
@@ -245,21 +245,6 @@
 	var fnInitCalendar = function() {
 		cfnChangeCalendar('7d', $('#stDate'), $('#edDate')); //달력 초기화
 	}
-
-	
-	function fnRowSpan(params) {
-		alert("alert");  
-		var orderNo = params.data.orderNo;
-		  alert("orderNo: "+orderNo);
-		  if (orderNo == 18691602) {
-		    // have all Russia age columns width 2
-		    return 2;
-		  } else {
-		    // all other rows should be just normal
-		    return 1;
-		  }
-		}
-	// rowSpan: params => params.data.orderNo === '18692992' ? 2 : 1	
 	
 	/*************************************************************************
 	*  회수예외 처리완료 버튼 - 대기->완료  업데이트

+ 339 - 0
src/main/webapp/WEB-INF/views/withdraw/WmsWithdrawListForm.html

@@ -0,0 +1,339 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : WmsWithdrawListForm.html
+ * @desc    : WMS회수목록 Page
+ *=============================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *=============================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  ==================================
+ * 1.0  2021.03.10   moon        최초 작성
+ * 1.1  
+ ********************************************************************************
+ -->
+ 
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<form id="searchForm" name="searchForm" action="#" th:action="@{'/withdraw/wms/list'}" onsubmit="fnSearchList(); return false;">
+		<div class="panelStyle">
+			<!-- TITLE -->
+			<div class="panelTitle">
+				<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 <font color="red">회수요청일</font>은 꼭 입력해 주세요.</h3>
+				<span class="panelControl">
+					<i class="fa fa-chevron-up"></i>
+				</span>
+			</div>
+			<!-- //TITLE -->
+			<div class="panelContent">	
+				
+					<table class="frmStyle">
+						<colgroup>
+							<col style="width:8%;"/>
+							<col style="width:12%;"/>
+							<col style="width:8%;"/>
+							<col style="width:12%;"/>
+							<col style="width:8%;"/>
+							<col style="width:12%;"/>
+						</colgroup>
+						<tr>
+							<th class="dashR">주문자명</th>
+							<td class="dashR">
+								<input type="text" class="w40p" name="customername" placeholder="" maxlength="20" />
+							</td>
+							<th class="dashR">주문번호</th>
+							<td class="dashR">
+								<input type="text" class="w40p" name="orderno" placeholder="" maxlength="20" data-valid-type="numeric"/>
+							</td>
+							<th class="dashR">입고상태</th>
+							<td class="dashR">
+								<select name="statuscd" id="statuscd">
+									<option value="" selected>전체</option>
+									<option value="입고대기">입고대기</option>
+									<option value="입고완료">입고완료</option>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<th class="dashR">반품타입</th>
+							<td class="dashR">
+								<select name="recalltypecd" id="recalltypecd">
+									<option value="" selected>전체</option>
+									<option value="10">일반</option>
+									<option value="20">교환</option>
+								</select>
+							</td>
+							<th class="dashR">삭제여부</th>
+							<td colspan="4" class="dashR">
+								<select name="isdeleted" id="isdeleted">
+									<option value="">전체</option>
+									<option value="1">Y</option>
+									<option value="0" selected>N</option>
+								</select>
+							</td>
+						</tr>						
+						<tr>
+							<th class="dashR">회수요청일</th>
+							<td colspan="6" class="dashR">
+								<span id="terms"></span>
+							</td>
+						</tr>
+					</table>
+	
+					<ul class="panelBar">
+						<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset(); fnInitCalendar();">초기화</button>
+						<button type="button" id="btnExcel" class="btn btn-info btn-lg" >엑셀다운로드</button>
+						</li>
+					</ul>
+
+				</div>
+		</div>
+		<!-- //검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<ul class="panelBar">
+				<li class="right">
+					검색결과 : <strong><span id="gridRowTotalCount">0</span> 건</strong>&nbsp;
+					쪽번호 <span id="pgNo">0</span>/ <strong id="endPgNo">0</strong>&nbsp;&nbsp;
+					<select id="pageSize" name="pageSize">
+						<option value="20" selected="selected">20개씩 보기</option>
+						<option value="50">50개씩 보기</option>
+						<option value="100">100개씩 보기</option>
+						<option value="500">500개씩 보기</option>
+						<option value="1000">1000개씩 보기</option>
+					</select>
+					<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
+				</li>
+			</ul>
+			<div id="gridList" style="width:100%; height: 700px;" class="ag-theme-balham"></div>
+			<ul class="panelBar">
+				<li class="center">
+					<div class="tablePaging" id="withdrawExceptionListPagination"></div>
+				</li>
+			</ul>
+					 
+		</div>
+		</form>
+		<!-- //리스트 영역 -->
+	</div>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=20210114"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	/*************************************************************************
+	* AG-GRID 영역 
+	**************************************************************************/
+	var uploadGoodsUrl = [[${@environment.getProperty('upload.goods.view')}]]; 
+	var roleCd = [[${sessionInfo.roleCd}]]; 
+
+	var columnDefs = [
+		{headerName: "No.",				field: "rnum",				width: 50,	cellClass: 'text-center'},
+		{headerName: "반품번호",			field: "recallno", 			width: 50,	cellClass: 'text-center', hide: true},
+		{headerName: "주문변경번호",		field: "orderexceptionno",	width: 100,	cellClass: 'text-center'},
+		{headerName: "주문번호",			field: "orderno",			width: 100,	cellClass: 'text-center',
+			cellRenderer: function (params) {
+				if (roleCd.indexOf("C") < 0) {
+					return "<a href=\"javascript:void(0);\" onclick=\"cfnOpenOrderDetailPopup('" + params.data.orderno + "');\">" + params.data.orderno + "</a>";
+				} else {
+					return params.value;
+				}
+			}		
+		},
+		{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: "receiver",			width: 100,	cellClass: 'text-center'},
+		{headerName: "수취인전화번호",		field: "receivertelnum",	width: 120,	cellClass: 'text-center'},
+		{headerName: "수취인휴대폰번호",		field: "receivercellnum",	width: 120,	cellClass: 'text-center'},
+		{headerName: "우편번호",			field: "deliverypostalcode",width: 80,	cellClass: 'text-center'},
+		{headerName: "기본주소",			field: "deliveryaddr1",		width: 300,	cellClass: 'text-left'},
+		{headerName: "상세주소",			field: "deliveryaddr2",		width: 200,	cellClass: 'text-left'},
+		{headerName: "주문자",			field: "customername",		width: 100,	cellClass: 'text-center'},
+		{headerName: "ID",				field: "loginid",			width: 100,	cellClass: 'text-center'},
+		{headerName: "CS메모",			field: "csmemo",			width: 250,	cellClass: 'text-left'},	
+		{headerName: "CS메모 변경일",		field: "datecsmemoupdated",	width: 120,	cellClass: 'text-center'},
+		{headerName: "WMS메모",			field: "wmsmemo",			width: 250,	cellClass: 'text-left'},
+		{headerName: "WMS메모변경일",		field: "datewmsmemoupdated",width: 120,	cellClass: 'text-center'},
+		{headerName: "회수요청일",			field: "datecreated",		width: 100,	cellClass: 'text-center'},
+		{headerName: "삭제여부",			field: "isdeleted",			width: 80,	cellClass: 'text-center',
+			cellRenderer: function (params) { return params.value == '0' ? 'N' : 'Y'; }		
+		},
+		{headerName: "도로명주소",			field: "deliveryaddrnew",	width: 300,	cellClass: 'text-left'},
+		{headerName: "상품번호",			field: "productno",			width: 100,	cellClass: 'text-center'},
+		{headerName: "상품코드",			field: "productcode",		width: 100,	cellClass: 'text-center'},
+		{headerName: "상품명",			field: "productname",		width: 250,	cellClass: 'text-left',
+			cellRenderer: function (params) {
+				if (roleCd.indexOf("C") < 0) {
+					return "<a href=\"javascript:void(0);\" onclick=\"cfnOpenGoodsDetailPopup('U','" + params.data.goodsCd + "');\">" + params.value + "</a>";
+				} else {
+					return params.value;
+				}
+			}					
+		},
+		{headerName: "옵션코드",			field: "skucode",			width: 100,	cellClass: 'text-center'},
+		{headerName: "옵션 내용",			field: "skuvalue",			width: 100,	cellClass: 'text-center'},
+		{headerName: "수량",				field: "recallqty",			width: 100,	cellClass: 'text-center'},	
+		{headerName: "완료일",			field: "datecompleted",		width: 100,	cellClass: 'text-center'},
+		{headerName: "택배사 명",			field: "logisticsname",		width: 100,	cellClass: 'text-left'},
+		{headerName: "회수송장번호",		field: "recallinvoiceno",	width: 120,	cellClass: 'text-center'},
+		{headerName: "원운송장번호",		field: "invoiceno",			width: 120,	cellClass: 'text-center'}
+
+	];
+
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	//gridOptions.suppressRowTransform =true;
+	gridOptions.suppressRowClickSelection = true;
+	//gridOptions.rowSelection = 'multiple';
+	
+	//gridOptions.rowHeight = 35;
+	/*************************************************************************
+	*  조회 버튼 클릭 시
+	**************************************************************************/
+	$('#btnSearch').on('click', function() {
+		fnSearchList();
+	});
+
+	/*************************************************************************
+	*  조회 
+	**************************************************************************/
+	var fnSearchList = function() {
+		if($('#stDate').val() == ''){
+			mcxDialog.alert('시작 기간을 입력하세요.');
+			return;
+		}
+
+		if($('#edDate').val() == ''){
+			mcxDialog.alert('종료 기간을 입력하세요.');
+			return;
+		}
+
+		// 날짜 유효성 체크
+		if (Number($('#stDate').val().replaceAll("-", "")) > Number($('#edDate').val().replaceAll("-", ""))) {
+			mcxDialog.alert("시작일은 종료일보다 클 수 없습니다.");
+			return;
+		}
+
+		gagaPaging.init('searchForm', fnSearchCallBack, 'withdrawExceptionListPagination', $('#searchForm').find('#pageSize').val());
+	    gagaPaging.load($("#searchForm input[name=pageNo]").val());
+	}
+	
+	/*************************************************************************
+	*  조회 콜백
+	**************************************************************************/
+	var fnSearchCallBack = function(result){
+
+		$('#searchForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
+		$('#searchForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
+		$('#searchForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
+		$('#searchForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
+		gridOptions.api.setRowData(result.wmsWithdrawList);
+		gagaPaging.createPagination(result.pageing.pageable);
+		
+	}
+	
+	/*************************************************************************
+	*  달력 초기화 
+	**************************************************************************/		
+	var fnInitCalendar = function() {
+		cfnChangeCalendar('7d', $('#stDate'), $('#edDate')); //달력 초기화
+	}
+
+	
+	function fnRowSpan(params) {
+		alert("alert");  
+		var orderNo = params.data.orderNo;
+		  alert("orderNo: "+orderNo);
+		  if (orderNo == 18691602) {
+		    // have all Russia age columns width 2
+		    return 2;
+		  } else {
+		    // all other rows should be just normal
+		    return 1;
+		  }
+		}
+	// rowSpan: params => params.data.orderNo === '18692992' ? 2 : 1	
+	
+	/*************************************************************************
+	*  회수예외 처리완료 버튼 - 대기->완료  업데이트
+	**************************************************************************/	
+	var fnComplete = function(recallExceptionNo) {
+		var params = {};
+		params.recallExceptionNo = recallExceptionNo;
+		mcxDialog.confirm('처리완료 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var jsonData = JSON.stringify(params);
+				gagajf.ajaxJsonSubmit('/withdraw/exception/complete', jsonData, fnCompleteCallback);
+			}
+		});
+	};
+	
+	/*************************************************************************
+	*  회수예외 처리완료 콜백
+	**************************************************************************/		
+	var fnCompleteCallback = function() {
+		fnSearchList();
+	};
+	
+
+	/*************************************************************************
+	*  엑셀다운로드
+	**************************************************************************/		
+	$('#btnExcel').on('click', function() {
+		var totalRows = gridOptions.api.getDisplayedRowCount();
+		if(totalRows==0){
+			mcxDialog.alert('조회된 내역이 없습니다.');
+			return;
+		}
+
+		var date = new Date().format("YYYYMMDDHHmmss");
+		var params = {
+			fileName : "WMS회수예외목록_"+ date,
+			sheetName: "DATA"
+		}
+		gridOptions.excelStyles = [
+			{
+				id: 'dateFormat',
+				dataType: 'dateTime',
+				numberFormat: {
+					format: 'YYYY-MM-DD;@'
+				}
+			},
+			{
+				id: 'textFormat',
+				dataType: 'string'
+			}
+		]
+		gridOptions.api.exportDataAsExcel(params);
+	});
+
+	/*************************************************************************
+	*  init
+	**************************************************************************/		
+	$(document).ready(function() {
+		gagaAgGrid.createGrid('gridList', gridOptions);
+		cfnCreateCalendar('#terms', 'stDate', 'edDate', true, '');
+		fnInitCalendar();
+	});
+
+/*]]>*/
+</script>
+</html>