Przeglądaj źródła

Merge branch 'develop' into jsshin

jsshin 5 lat temu
rodzic
commit
24a0a36db9
45 zmienionych plików z 3764 dodań i 622 usunięć
  1. 52 8
      src/main/java/com/style24/admin/biz/dao/TsaDeliveryDao.java
  2. 74 0
      src/main/java/com/style24/admin/biz/dao/TsaPlanDao.java
  3. 8 0
      src/main/java/com/style24/admin/biz/dao/TsaRendererDao.java
  4. 29 0
      src/main/java/com/style24/admin/biz/dao/TsaSocialDao.java
  5. 34 0
      src/main/java/com/style24/admin/biz/dao/TsaWithdrawDao.java
  6. 108 16
      src/main/java/com/style24/admin/biz/service/TsaDeliveryService.java
  7. 1 1
      src/main/java/com/style24/admin/biz/service/TsaDisplayService.java
  8. 104 3
      src/main/java/com/style24/admin/biz/service/TsaPlanService.java
  9. 11 0
      src/main/java/com/style24/admin/biz/service/TsaRendererService.java
  10. 55 1
      src/main/java/com/style24/admin/biz/service/TsaSocialService.java
  11. 51 13
      src/main/java/com/style24/admin/biz/service/TsaWithdrawService.java
  12. 19 0
      src/main/java/com/style24/admin/biz/web/TsaBusinessController.java
  13. 96 9
      src/main/java/com/style24/admin/biz/web/TsaDeliveryController.java
  14. 116 1
      src/main/java/com/style24/admin/biz/web/TsaDisplayController.java
  15. 48 5
      src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
  16. 73 1
      src/main/java/com/style24/admin/biz/web/TsaWithdrawController.java
  17. 3 0
      src/main/java/com/style24/persistence/domain/Aflink.java
  18. 87 29
      src/main/java/com/style24/persistence/domain/Delivery.java
  19. 6 0
      src/main/java/com/style24/persistence/domain/Plan.java
  20. 2 2
      src/main/java/com/style24/persistence/domain/Pos.java
  21. 12 12
      src/main/java/com/style24/persistence/domain/Social.java
  22. 88 0
      src/main/java/com/style24/persistence/domain/WithdrawExc.java
  23. 326 203
      src/main/java/com/style24/persistence/mybatis/shop/TsaDelivery.xml
  24. 120 7
      src/main/java/com/style24/persistence/mybatis/shop/TsaPlan.xml
  25. 17 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaRenderer.xml
  26. 103 5
      src/main/java/com/style24/persistence/mybatis/shop/TsaSocial.xml
  27. 127 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaWithdraw.xml
  28. 141 0
      src/main/webapp/WEB-INF/views/business/AfChannelPopupForm.html
  29. 1 1
      src/main/webapp/WEB-INF/views/delivery/BangoodsListForm.html
  30. 63 0
      src/main/webapp/WEB-INF/views/delivery/DeliveryDetailItemForm.html
  31. 308 0
      src/main/webapp/WEB-INF/views/delivery/DeliveryExceptionListForm.html
  32. 135 138
      src/main/webapp/WEB-INF/views/delivery/DeliveryListForm.html
  33. 109 0
      src/main/webapp/WEB-INF/views/delivery/SaveInvoiceForm.html
  34. 206 0
      src/main/webapp/WEB-INF/views/display/LookbookBannerPopupForm.html
  35. 230 0
      src/main/webapp/WEB-INF/views/display/LookbookListForm.html
  36. 190 48
      src/main/webapp/WEB-INF/views/display/PopupListForm.html
  37. 164 49
      src/main/webapp/WEB-INF/views/marketing/PlanDetailPopupForm.html
  38. 4 4
      src/main/webapp/WEB-INF/views/marketing/PlanListForm.html
  39. 7 5
      src/main/webapp/WEB-INF/views/marketing/PlanPopupForm.html
  40. 10 10
      src/main/webapp/WEB-INF/views/marketing/PlanTemplatePopupForm.html
  41. 1 1
      src/main/webapp/WEB-INF/views/marketing/PollListForm.html
  42. 60 45
      src/main/webapp/WEB-INF/views/marketing/SocialShoppingListForm.html
  43. 330 0
      src/main/webapp/WEB-INF/views/withdraw/WithdrawExceptionListForm.html
  44. 4 1
      src/main/webapp/ux/css/admin.ui.css
  45. 31 4
      src/main/webapp/ux/js/admin.popup.js

+ 52 - 8
src/main/java/com/style24/admin/biz/dao/TsaDeliveryDao.java

@@ -4,6 +4,7 @@ import java.util.Collection;
 
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Delivery;
+import com.style24.persistence.domain.GoodsSearch;
 
 
 /**
@@ -15,6 +16,18 @@ import com.style24.persistence.domain.Delivery;
 @ShopDs
 public interface TsaDeliveryDao {
 
+	
+	/**
+	 * 배송 목록 건수
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author moon
+	 * @since 2021. 02. 26
+	 */
+	int getDeliveryListCount(Delivery delivery);
+
+	
 	/**
 	 * 배송 목록
 	 *
@@ -26,14 +39,14 @@ public interface TsaDeliveryDao {
 	Collection<Delivery> getDeliveryList(Delivery delivery);
 
 	/**
-	 * 주문 상세
+	 * 주문상세 단품 목록
 	 *
-	 * @param ordDtlNo - 주문상세번호
+	 * @param delivery - 배송정보
 	 * @return Collection<Delivery>
 	 * @author moon
-	 * @since 2020. 11. 05
+	 * @since 2021. 03. 05
 	 */
-	Collection<Delivery> getOrderDetail(long ordDtlNo);	
+	Collection<Delivery> getDelvDetailItemList(Delivery ordDtlNo);
 	
 	/**
 	 * 주문상세 상태 값 변경
@@ -46,14 +59,45 @@ public interface TsaDeliveryDao {
 	int updateOrderDetailStat(Delivery delivery);
 	
 	/**
-	 * 주문 상세 이력 등록
+	 * 송장번호 변경
 	 *
-	 * @param delivery
-	 * @return void
+	 * @param delivery 
+	 * @return int
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	int saveChangeInvoice(Delivery delivery);
+	
+	
+	/**
+	 * 주문 상태 값 변경
+	 *
+	 * @param delivery 
+	 * @return int
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	int updateOrderStat(Delivery delivery);
+	
+
+	/**************************************************************************************/
+	
+	int createOrderDetailHst(Delivery delivery);
+	
+	/**
+	 * 주문 상세
+	 *
+	 * @param ordDtlNo - 주문상세번호
+	 * @return Collection<Delivery>
 	 * @author moon
 	 * @since 2020. 11. 05
 	 */
-	void createOrderDetailHst(Delivery delivery);	
+	Collection<Delivery> getOrderDetail(Integer ordDtlNo);	
+	
+
+	
+
+	
 	
 	/**
 	 * 출고금지상품 목록

+ 74 - 0
src/main/java/com/style24/admin/biz/dao/TsaPlanDao.java

@@ -139,6 +139,62 @@ public interface TsaPlanDao {
 	 */
 	void deletePlanBrand(Plan param);
 	
+	/**
+	 * 기획전 제휴채널 등록
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	void createPlanAfChannel(Plan param);
+	
+	/**
+	 * 기획전 제휴채널  복사
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	void createPlanAfChannelCopy(Plan param);
+	
+	/**
+	 * 기획전 고객유형 복사
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 3. 5
+	 */
+	void createPlanCustGbCopy(Plan param);
+	
+	/**
+	 * 기획전 고객등급 복사
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 3. 5
+	 */
+	void createPlanCustGradeCopy(Plan param);
+	
+	
+	/**
+	 * 기획전 제휴채널 목록
+	 *
+	 * @param 
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	Collection<Plan> getPlanAfChannelList(Plan param);
+	
+	/**
+	 * 기획전 제휴채널 삭제
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	void deletePlanAfChannel(Plan param);
+	
 	/**
 	 * 기획전 브랜드 목록
 	 *
@@ -290,6 +346,15 @@ public interface TsaPlanDao {
 	 */
 	void createPlanCustGb(Plan param);
 	
+	/**
+	 * 기획전 회원구분 삭제
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	void deletePlanCustGb(Plan param);
+	
 	/**
 	 * 기획전 회원등급 등록
 	 *
@@ -299,6 +364,15 @@ public interface TsaPlanDao {
 	 */
 	void createPlanCustGrade(Plan param);
 	
+	/**
+	 * 기획전 회원등급 삭제
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	void deletePlanCustGrade(Plan param);
+	
 	/**
 	 * 기획전 회원구분 조회
 	 *

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

@@ -267,4 +267,12 @@ public interface TsaRendererDao {
 	 */
 	Collection<CommonCode> getCate1List();
 
+	/**
+	 * 자사 브랜드 그룹 조회
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 4
+	 */
+	Collection<CommonCode> getSelfBrandGroupList();
 }

+ 29 - 0
src/main/java/com/style24/admin/biz/dao/TsaSocialDao.java

@@ -46,4 +46,33 @@ public interface TsaSocialDao {
 	 * @since 2021. 3. 3
 	 */
 	int getSocialCount(Social params);
+	
+	/**
+	 * 소셜 상품 저장
+	 *
+	 * @param 소셜 상품 정보
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	void saveSocialGoods(Social params);
+	
+	/**
+	 * 쇼셜 상품 목록
+	 *
+	 * @return 쇼셜쇼핑 상품 목록
+	 * @author sowon	
+	 * @since 2021. 3. 4
+	 */
+	Collection<Social> getSocialGoodsList(Social params);
+	
+	/**
+	 * 소셜 상품 삭제
+	 *
+	 * @param 소셜 상품 정보
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	void deleteSocialGoods(Social params);
+
+
 }

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

@@ -4,8 +4,10 @@ import java.util.Collection;
 
 import org.springframework.dao.DataAccessException;
 
+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.core.support.annotation.ShopDs;
 import org.springframework.stereotype.Repository;
 
@@ -19,6 +21,38 @@ import org.springframework.stereotype.Repository;
 @Repository
 public interface TsaWithdrawDao {
 
+	
+	/**
+	 * 회수예외 목록 건수
+	 * 
+	 * @param WithdrawExc
+	 * @return int
+	 * @author moon
+	 * @since 2021. 03. 04
+	 */
+	int getWithdrawExceptionListCount(WithdrawExc withdrawExc);
+
+	/**
+	 * 회수예외 목록 
+	 * 
+	 * @param WithdrawExc
+	 * @return Collection<WithdrawExc>
+	 * @author moon
+	 * @since 2021. 03. 04
+	 */
+	Collection<WithdrawExc> getWithdrawExceptionList(WithdrawExc withdrawExc);
+	
+	
+	/**
+	 * 회수예외 완료처리 
+	 * 
+	 * @param WithdrawExc
+	 * @return 
+	 * @author moon
+	 * @since 2021. 03. 04
+	 */
+	void updateWithdrawException(WithdrawExc withdrawExc);
+	
 	/**
 	 * 회수등록 - 조회(송장번호용)
 	 * 

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

@@ -8,14 +8,20 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.stereotype.Service;
 import org.apache.commons.lang3.StringUtils;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.style24.admin.biz.dao.TsaDeliveryDao;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.admin.support.util.TsitUtil;
-
+import com.style24.admin.support.env.TsaConstants;
+import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.Delivery;
+import com.style24.persistence.domain.GoodsSearch;
+
 import com.style24.core.support.env.TscConstants.OrderDetailStat;
-import com.style24.admin.support.env.TsaConstants;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.core.biz.dao.TscOrderDao;
+import com.style24.persistence.domain.Order;
+
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -34,7 +40,27 @@ public class TsaDeliveryService {
 	
 	@Autowired
 	private TsaDeliveryDao deliveryDao;
+	
+	@Autowired
+	private TscOrderDao orderDao;
+	
 
+	@Autowired
+	private ObjectMapper mapper;
+	
+	
+	/**
+	 * 배송 목록 건수
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author moon
+	 * @since 2021. 02. 26
+	 */
+	public int getDeliveryListCount(Delivery delivery) {
+		return deliveryDao.getDeliveryListCount(delivery);
+	}
+	
 	/**
 	 * 배송 목록
 	 *
@@ -53,14 +79,82 @@ public class TsaDeliveryService {
 		}
 
 		// 외부몰권한일 때 외부몰벤더ID 설정
-		if (TsaSession.getInfo().getRoleCd().startsWith("C")) {
+		if (TsaSession.getInfo().getRoleCd().startsWith("G001_C")) {
 			delivery.setMallGb(TsaConstants.MallGb.EXTMALL.value());
 			delivery.setVendorId(TsaSession.getInfo().getVendorId());
 		}
 		
+		if (!StringUtils.isBlank(delivery.getBrandList())) {
+			try {
+				String [] arrBrandCd = mapper.readValue(delivery.getBrandList(), String[].class);
+				delivery.setMultiBrand(arrBrandCd);
+			} catch (Exception e) {
+				e.printStackTrace();
+				throw new IllegalStateException("브랜드코드 검색중 오류로 인해 조회되지 않았습니다.");
+			}
+		}
+
+		if (!StringUtils.isBlank(delivery.getSupplyCompList())) {
+			try {
+				String [] arrSupplyComp = mapper.readValue(delivery.getSupplyCompList(), String[].class);
+				delivery.setMultiSupplyCompCd(arrSupplyComp);
+			} catch (Exception e) {
+				e.printStackTrace();
+				throw new IllegalStateException("업체코드 검색중 오류로 인해 조회되지 않았습니다.");
+			}
+		}
+		
+		
 		return deliveryDao.getDeliveryList(delivery);
 	}
 	
+	/**
+	 * 주문상세 단품 목록
+	 *
+	 * @param  ordDtlNo
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2021. 03. 05
+	 */
+	public Collection<Delivery> getDelvDetailItemList(Integer ordDtlNo) {
+		
+		Delivery delivery = new Delivery();
+		delivery.setOrdDtlNo(ordDtlNo);
+		return deliveryDao.getDelvDetailItemList(delivery);
+	}	
+	
+	/**
+	 * 배송완료처리
+	 *
+	 * @param -TsaDelivery
+	 * @return void
+	 * @author moon
+	 * @since 2021. 03. 05
+	 */
+	@Transactional("shopTxnManager")
+	public void saveDeliveryComplete(Delivery delivery) {
+
+		Integer userNo = TsaSession.getInfo().getUserNo();
+		
+		delivery.setUpdNo(userNo);
+		delivery.setRegNo(userNo);
+		// 주문상세상태 => 배송완료
+		delivery.setOrdDtlStat(OrderDetailStat.DELIVERY_COMPLETE.value());
+		delivery.setHstMemo("수기배송완료처리");
+
+		// 주문상세 상태 값 수정
+		deliveryDao.updateOrderDetailStat(delivery);
+
+		// 주문상세이력 - 주문Dao 사용
+		Order order = new Order();
+		order.setOrdDtlNo(delivery.getOrdDtlNo());
+		order.setUpdNo(userNo);
+		order.setRegNo(userNo);
+		orderDao.createOrderDetailHst(order);
+
+	}
+	
+	
 	/**
 	 * 주문상세
 	 *
@@ -69,7 +163,7 @@ public class TsaDeliveryService {
 	 * @author moon
 	 * @since 2020. 11. 05
 	 */
-	public Collection<Delivery> getOrderDetail(long ordDtlNo) {
+	public Collection<Delivery> getOrderDetail(Integer ordDtlNo) {
 		return deliveryDao.getOrderDetail(ordDtlNo);
 	}	
 	
@@ -82,26 +176,24 @@ public class TsaDeliveryService {
 	 * @since 2020. 11. 05
 	 */
 	@Transactional("shopTxnManager")
-	public void saveOrderDetail(Collection<Delivery> deliveryList) {
+	public void saveChangeInvoice(Collection<Delivery> deliveryList) {
 	
 		int userId = TsaSession.getInfo().getUserNo();
 
 		for (Delivery oneDelivery : deliveryList) {
 			oneDelivery.setUpdNo(userId);
 			oneDelivery.setRegNo(userId);
-			// 배송 준비중, 배송중이면 해당 상태값으로 업데이트
-			if (OrderDetailStat.DELIVERY_PREPARE.equals(oneDelivery.getOrgOrdDtlStat()) || OrderDetailStat.SHIPPING.equals(oneDelivery.getOrgOrdDtlStat())) {
-				oneDelivery.setOrdDtlStat(oneDelivery.getOrgOrdDtlStat());
-			} else {
-				oneDelivery.setOrdDtlStat(OrderDetailStat.DELIVERY_PREPARE.value());
-			}
-			oneDelivery.setHstMemo("수기송장 수정");
-			// 주문상세수정
-			deliveryDao.updateOrderDetailStat(oneDelivery);
+			
+			// 송장번호 변경
+			deliveryDao.saveChangeInvoice(oneDelivery);
+			
 			// 주문상세이력
-			deliveryDao.createOrderDetailHst(oneDelivery);
+			Order order = new Order();
+			order.setOrdDtlNo(oneDelivery.getOrdDtlNo());
+			order.setUpdNo(userId);
+			order.setRegNo(userId);
+			orderDao.createOrderDetailHst(order);			
 		}
-
 	}	
 	
 	/**

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

@@ -624,7 +624,7 @@ public class TsaDisplayService {
 						} else if (cnt == 7) {
 							contents.setImgPath7(contentsPath + yearMonth + "/" + newFilename);
 						} else if (cnt == 8) {
-							contents.setImgPath4(contentsPath + yearMonth + "/" + newFilename);
+							contents.setImgPath8(contentsPath + yearMonth + "/" + newFilename);
 						}
 						ind++;
 

+ 104 - 3
src/main/java/com/style24/admin/biz/service/TsaPlanService.java

@@ -88,6 +88,15 @@ public class TsaPlanService {
 			planDao.createPlanCate(plan);
 		}
 		
+		String[] channel = param.getMultiChannel();
+		// 기획전 제휴채널 insert
+		for (int j = 0; j < channel.length; j++) {
+			plan.setAfLinkCd(channel[j]);
+			plan.setPlanSq(param.getPlanSq());
+			plan.setRegNo(TsaSession.getInfo().getUserNo());
+			planDao.createPlanAfChannel(plan);
+		}
+		
 		// 기획전 회원구분 insert
 		String[] custGb = param.getUsableCustGbArr();
 		for (int j = 0; j < custGb.length; j++) {
@@ -297,7 +306,7 @@ public class TsaPlanService {
 			planDao.createPlanCate(plan);
 		}
 		
-		// 기존 기획전 카테고리 삭제
+		// 기존 기획전 브랜드 삭제
 		for (int i = 0; i < param.getMultiBrand().length; i++) {
 			planDao.deletePlanBrand(param);;
 		}
@@ -313,6 +322,50 @@ public class TsaPlanService {
 			planDao.createPlanBrand(plan);
 		}
 		
+		// 기존 기획전 제휴채널 삭제
+		for (int i = 0; i < param.getMultiChannel().length; i++) {
+			planDao.deletePlanAfChannel(param);
+		}
+		
+		
+		String[] channel = param.getMultiChannel();
+		// 기획전 제휴채널 insert
+		for (int j = 0; j < channel.length; j++) {
+			plan.setAfLinkCd(channel[j]);
+			plan.setPlanSq(param.getPlanSq());
+			plan.setRegNo(TsaSession.getInfo().getUserNo());
+			planDao.createPlanAfChannel(plan);
+		}
+		
+		//기존 회원구분 삭제
+		for (int i = 0; i < param.getUsableCustGbArr().length; i++) {
+			planDao.deletePlanCustGb(param);
+		}
+		
+		
+		// 기획전 회원구분 insert
+		String[] custGb = param.getUsableCustGbArr();
+		for (int j = 0; j < custGb.length; j++) {
+			plan.setCustGb(custGb[j]);
+			plan.setPlanSq(param.getPlanSq());
+			plan.setRegNo(TsaSession.getInfo().getUserNo());
+			planDao.createPlanCustGb(plan);
+		}
+		
+		//기존 회원등급 삭제
+		for (int i = 0; i < param.getUsableCustGradeArr().length; i++) {
+			planDao.deletePlanCustGrade(param);
+		}
+		
+		// 기획전 회원등급 insert
+		String[] custGrade = param.getUsableCustGradeArr();
+		for (int j = 0; j < custGrade.length; j++) {
+			plan.setCustGrade(custGrade[j]);
+			plan.setPlanSq(param.getPlanSq());
+			plan.setRegNo(TsaSession.getInfo().getUserNo());
+			planDao.createPlanCustGrade(plan);
+		}
+		
 		// 최종업데이트 
 		planDao.updatePlanInfo(param);
 
@@ -338,7 +391,7 @@ public class TsaPlanService {
 	 *
 	 * @param 복사대상 기획전 번호
 	 * @return 복사된 기획전 번호
-	 * @author rladbwnd5
+	 * @author sowon
 	 * @since 2021. 02. 09
 	 */
 	@Transactional("shopTxnManager")
@@ -350,6 +403,9 @@ public class TsaPlanService {
 		param.setUpdNo(userNo);
 		planDao.createPlanCopy(param);
 		
+		plan.setRegNo(userNo);
+		plan.setUpdNo(userNo);
+		
 		// 02. 기획전 브랜드 복사
 		plan.setPlanSq(param.getCopyPlanSq());
 		Collection <Plan> brandList = planDao.getPlanBrandList(plan);
@@ -361,7 +417,7 @@ public class TsaPlanService {
 			planDao.createPlanBrandCopy(plan);
 		}
 		
-		// 02. 기획전 브랜드 복사
+		// 02. 기획전 카테고리 복사
 		plan.setPlanSq(param.getCopyPlanSq());
 		Collection <Plan> cateList = planDao.getPlanCateList(plan);
 		
@@ -372,6 +428,38 @@ public class TsaPlanService {
 			planDao.createPlanCateCopy(plan);
 		}
 		
+		// 03.기획전 제휴채널 복사
+		plan.setPlanSq(param.getCopyPlanSq());
+		Collection <Plan> afChannelList = planDao.getPlanAfChannelList(plan);
+		
+		for(Plan afChannel : afChannelList){
+			plan.setPlanSq(param.getPlanSq());
+			plan.setAfLinkCd(afChannel.getAfLinkCd());
+			plan.setCopyPlanSq(param.getCopyPlanSq()); 
+			planDao.createPlanAfChannelCopy(plan);
+		}
+		
+		// 04.고객 유형복사
+		plan.setPlanSq(param.getCopyPlanSq());
+		Collection <Plan> custGbList = planDao.getPlanCustGbList(plan);
+		
+		for(Plan custGb : custGbList){
+			plan.setPlanSq(param.getPlanSq());
+			plan.setCustGb(custGb.getCustGb());
+			plan.setCopyPlanSq(param.getCopyPlanSq()); 
+			planDao.createPlanCustGbCopy(plan);
+		}
+		
+		// 05.고객 등급 복사
+		plan.setPlanSq(param.getCopyPlanSq());
+		Collection <Plan> custGradeList = planDao.getPlanCustGradeList(plan);
+		
+		for(Plan custGrade : custGradeList){
+			plan.setPlanSq(param.getPlanSq());
+			plan.setCustGrade(custGrade.getCustGrade());
+			plan.setCopyPlanSq(param.getCopyPlanSq()); 
+			planDao.createPlanCustGradeCopy(plan);
+		}
 
 		return plan;
 	}
@@ -417,6 +505,19 @@ public class TsaPlanService {
 		return planDao.getPlanCateList(param);
 	}
 	
+
+	/**
+	 * 기획전 제휴채널 목록
+	 *
+	 * @param 
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	public Collection<Plan> getPlanAfChannelList(Plan param){
+		return planDao.getPlanAfChannelList(param);
+	}
+	
 	/**
 	 * 기획전 코너 목록 조회
 	 *

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

@@ -587,4 +587,15 @@ public class TsaRendererService {
 	public Collection<CommonCode> getCate1List() {
 		return rendererDao.getCate1List();
 	}
+
+	/**
+	 * 자사 브랜드 그룹 조회
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 4
+	 */
+	public Collection<CommonCode> getSelfBrandGroupList(){
+		return rendererDao.getSelfBrandGroupList();
+	}
 }

+ 55 - 1
src/main/java/com/style24/admin/biz/service/TsaSocialService.java

@@ -8,7 +8,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import com.style24.admin.biz.dao.TsaSocialDao;
 import com.style24.admin.support.security.session.TsaSession;
-import com.style24.persistence.domain.Plan;
 import com.style24.persistence.domain.Social;
 
 import lombok.extern.slf4j.Slf4j;
@@ -64,5 +63,60 @@ public class TsaSocialService {
 	public int getSocialCount(Social param) {
 		return socialDao.getSocialCount(param);
 	}
+	
+	/**
+	 * 소셜 상품 저장
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	@Transactional("shopTxnManager")
+	public void saveSocialGoods(Collection<Social> paramList) {
+		Integer userNo = TsaSession.getInfo().getUserNo();
 
+		for (Social social : paramList) {
+			social.setRegNo(userNo);
+			social.setUpdNo(userNo);
+			social.setDelYn("N");
+
+			socialDao.saveSocialGoods(social);
+		}
+	}
+	
+	
+	/**
+	 * 쇼셜 상품 목록
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	public Collection<Social> getSocialGoodsList(Social params) {
+		return socialDao.getSocialGoodsList(params);
+	}
+
+	/**
+	 * 소셜 상품 삭제
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteSocialGoods(Collection<Social> paramList) {
+		Integer userNo = TsaSession.getInfo().getUserNo();
+
+		Social socialInfo = null;
+		for (Social social : paramList) {
+			socialInfo = new Social();
+			socialInfo.setSocialSq(social.getSocialSq());
+			socialInfo.setScgoodsSq(social.getScgoodsSq());
+			socialInfo.setGoodsCd(social.getGoodsCd());
+			socialInfo.setUpdNo(userNo);
+			socialInfo.setDelYn(social.getDelYn());
+
+			socialDao.deleteSocialGoods(socialInfo);
+		}
+	}
 }

+ 51 - 13
src/main/java/com/style24/admin/biz/service/TsaWithdrawService.java

@@ -5,33 +5,29 @@ 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.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.util.GagaDateUtil;
+//import com.gagaframework.web.parameter.GagaMap;
+//import com.gagaframework.web.util.GagaDateUtil;
 
 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.Coupon;
 import com.style24.persistence.domain.Delivery;
+//import com.style24.persistence.domain.Coupon;
+//import com.style24.persistence.domain.Delivery;
 //import com.style24.persistence.domain.Order;
 //import com.style24.persistence.domain.PayGate;
 //import com.style24.persistence.domain.Point;
 import com.style24.persistence.domain.Withdraw;
+import com.style24.persistence.domain.WithdrawExc;
 
 
-
-import com.style24.admin.support.env.TsaConstants;
+//import com.style24.admin.support.env.TsaConstants;
 //import com.style24.admin.support.env.TsaConstants.OrderStat;
 //import com.style24.admin.support.env.TsaConstants.PayMeans;
 //import com.style24.admin.support.env.TsaConstants.PaymentStat;
@@ -39,7 +35,7 @@ import com.style24.admin.support.env.TsaConstants;
 //import com.style24.admin.support.env.TsaConstants.UsacGb;
 
 import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.admin.support.security.session.TsaSession;
+//import com.style24.admin.support.security.session.TsaSession;
 
 /**
  * 회수관리 Service
@@ -69,9 +65,51 @@ public class TsaWithdrawService {
 	//@Autowired
 	//private TsaWmsWithdrawDao wmsWithdrawDao;
 
-	@Autowired
-	private TsaKakaoService kakaoService;
+	//@Autowired
+	//private TsaKakaoService kakaoService;
 
+	
+
+	/**
+	 * 회수예외 목록 건수
+	 *
+	 * @param Delivery
+	 * @return
+	 * @author moon
+	 * @since 2021. 03. 04
+	 */
+	public int getWithdrawExceptionListCount(WithdrawExc withdrawExc) {
+		return withdrawDao.getWithdrawExceptionListCount(withdrawExc);
+	}
+	
+	/**
+	 * 회수예외 목록 
+	 *
+	 * @param Delivery
+	 * @return
+	 * @author moon
+	 * @since 2021. 03. 04
+	 */
+	public Collection<WithdrawExc> getWithdrawExceptionList(WithdrawExc withdrawExc) {
+		return withdrawDao.getWithdrawExceptionList(withdrawExc);
+	}
+	
+	/**
+	 * 회수예외 완료처리 
+	 *
+	 * @param Delivery
+	 * @return
+	 * @author moon
+	 * @since 2021. 03. 04
+	 */	
+	@Transactional("shopTxnManager")
+	public void createWithdrawInfo(WithdrawExc withdrawExc) {
+		withdrawExc.setRecallStat("S");
+		withdrawDao.updateWithdrawException(withdrawExc);
+		
+	}
+	
+	
 	/**
 	 * 회수등록 - 조회(송장번호용)
 	 *

+ 19 - 0
src/main/java/com/style24/admin/biz/web/TsaBusinessController.java

@@ -777,5 +777,24 @@ public class TsaBusinessController extends TsaBaseController {
 		businessService.saveBrandGroup(brandGroup);
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
+	
+	
+	/**
+	 * 제휴채널 조회팝업
+	 * @param afChannel
+	 * @return
+	 * @author sowon
+	 * @since 2021. 03. 4
+	 */
+	@GetMapping("/channel/popup/form")
+	public ModelAndView getAfChannelList(Aflink aflink) {
+		ModelAndView mav = new ModelAndView();
+		// 제휴채널 콤보박스 목록
+		mav.addObject("afChannelList", rendererService.getCommonCodeList("G053"));
+		mav.addObject("params", aflink);
+		mav.setViewName("business/AfChannelPopupForm");
+
+		return mav;
+	}
 		
 }

+ 96 - 9
src/main/java/com/style24/admin/biz/web/TsaDeliveryController.java

@@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.style24.admin.biz.service.TsaRendererService;
@@ -21,11 +22,13 @@ import com.style24.admin.biz.service.TsaDeliveryService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.Delivery;
 import com.style24.persistence.domain.DeliveryLoc;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.rest.server.GagaResponse;
 
 /**
@@ -82,7 +85,7 @@ public class TsaDeliveryController extends TsaBaseController {
 		mav.addObject("delvTypeList", rendererService.getAvailCommonCodeList("G024"));
 		
 		String supplyCompCd = "";
-		if ("B000".equals(TsaSession.getInfo().getRoleCd())) {
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
 			supplyCompCd = TsaSession.getInfo().getSupplyCompCd();
 		}
 		
@@ -106,11 +109,67 @@ public class TsaDeliveryController extends TsaBaseController {
 	 */
 	@PostMapping("/list")
 	@ResponseBody
-	public Collection<Delivery> getDeliveryList(@RequestBody Delivery delivery) throws Exception {
-		Collection<Delivery> dataList = deliveryService.getDeliveryList(delivery);
-		return dataList;
+	public GagaMap getDeliveryList(@RequestBody Delivery delivery) throws Exception {
+		
+		GagaMap result = new GagaMap();
+
+		delivery.setPageable(new TscPageRequest(delivery.getPageNo() - 1, delivery.getPageSize()));
+		delivery.getPageable().setTotalCount(deliveryService.getDeliveryListCount(delivery));
+
+
+		if ("N".equals(delivery.getPageingYn())) {
+			delivery.setPageable(null);
+		}		
+		
+		result.set("pageing", delivery);
+		result.set("deliveryList", deliveryService.getDeliveryList(delivery));
+		
+		return result;
 	}
 
+	/**
+	 * 주문상세 단품 목록
+	 *
+	 * @param ordDtlNo - 주문상세번호
+	 * @return ModelAndView
+	 * @author moon
+	 * @since 2021. 03. 05
+	 */
+	@GetMapping("/detail/item/form/{ordDtlNo}")
+	@ResponseBody
+	public ModelAndView detailItemFrom(@PathVariable(value = "ordDtlNo") Integer ordDtlNo) {
+		ModelAndView mav = new ModelAndView();
+		Collection<Delivery> delvDetailItemList = deliveryService.getDelvDetailItemList(ordDtlNo);
+		
+		mav.addObject("delvDetailItemList", delvDetailItemList);
+		
+		mav.setViewName("delivery/DeliveryDetailItemForm");
+		return mav;
+	}
+	
+	/**
+	 * 배송완료처리
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2021. 03. 05
+	 */
+	@PostMapping("/complete/save")
+	@ResponseBody
+	public GagaResponse saveDeliveryComplete(@RequestBody Delivery delivery) throws Exception {
+
+		if (delivery == null) {
+			throw new IllegalStateException(message.getMessage("FAIL_1002"));
+		}
+
+		deliveryService.saveDeliveryComplete(delivery);
+
+		return super.ok(message.getMessage("SUCC_0004"));
+	}
+
+	
 	/**
 	 * 배송 목록 화면 - 품절처리
 	 *
@@ -197,10 +256,11 @@ public class TsaDeliveryController extends TsaBaseController {
 	 * @return
 	 * @throws Exception
 	 * @author moon
-	 * @since 2020. 11. 05
+	 * @since 2021. 03. 06
 	 */
-	@GetMapping("/save/invoice/form")
-	public ModelAndView saveInvoiceForm(@RequestParam(value = "ordDtlNo", required = true)long ordDtlNo) {
+	@GetMapping("/save/invoice/form/{ordDtlNo}")
+	@ResponseBody
+	public ModelAndView saveInvoiceForm(@PathVariable(value = "ordDtlNo") Integer ordDtlNo) {
 		ModelAndView mav = new ModelAndView();
 		Collection<Delivery> ordDeliveryList = deliveryService.getOrderDetail(ordDtlNo);
 		Delivery ordDelivery = ordDeliveryList.iterator().next();
@@ -219,7 +279,7 @@ public class TsaDeliveryController extends TsaBaseController {
 	 * @return
 	 * @throws Exception
 	 * @author moon
-	 * @since 2020. 11. 05
+	 * @since 2021. 03. 06
 	 */
 	@PostMapping("/orderDetail/save")
 	@ResponseBody
@@ -229,7 +289,7 @@ public class TsaDeliveryController extends TsaBaseController {
 			throw new IllegalStateException(message.getMessage("FAIL_1002"));
 		}
 
-		deliveryService.saveOrderDetail(deliveryList);
+		deliveryService.saveChangeInvoice(deliveryList);
 
 		return super.ok(message.getMessage("SUCC_0004"));
 	}
@@ -349,4 +409,31 @@ public class TsaDeliveryController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 	
+	/**
+	 * 출고예외관리 화면 
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2021. 02. 19
+	 */
+	@GetMapping("/exception/form")
+	@ResponseBody
+	public ModelAndView deliveryExceptionListForm() 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");
+
+		return mav;
+	}
+
+	
+		
 }

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

@@ -6,6 +6,7 @@ import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.util.GagaDateUtil;
 import com.style24.admin.biz.service.TsaBusinessService;
 import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.biz.service.TscLookbookService;
 import com.style24.core.biz.service.TscPopupService;
 import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.*;
@@ -49,6 +50,9 @@ public class TsaDisplayController extends TsaBaseController {
 	@Autowired
 	private TscPopupService corePopupService;
 
+	@Autowired
+	private TscLookbookService coreLookbookService;
+
 	/**
 	 * 카테고리관리 화면
 	 * @return
@@ -650,7 +654,7 @@ public class TsaDisplayController extends TsaBaseController {
 		ModelAndView mav = new ModelAndView();
 		mav.addObject("siteCdList", rendererService.getAvailCommonCodeList("G000"));
 		mav.addObject("viewPageList", rendererService.getAvailCommonCodeList("G037"));
-		mav.addObject("cate1NoList", rendererService.getCate1List());
+		mav.addObject("cateNoList", rendererService.getCate1List());
 		mav.setViewName("display/PopupListForm");
 		return mav;
 	}
@@ -689,4 +693,115 @@ public class TsaDisplayController extends TsaBaseController {
 		corePopupService.savePopup(popup);
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
+
+	/**
+	 * 팝업관리 삭제
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 4
+	 */
+	@PostMapping("/popup/delete")
+	@ResponseBody
+	public GagaResponse deletePopup(@RequestBody Popup popup) {
+		popup.setRegNo(TsaSession.getInfo().getUserNo());
+		popup.setUpdNo(TsaSession.getInfo().getUserNo());
+		corePopupService.deletePopup(popup);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
+	/**
+	 * 팝업관리 프론트 적용
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 4
+	 */
+	@PostMapping("/popupfront/save")
+	@ResponseBody
+	public GagaResponse savePopupFront(@RequestBody Popup popup) {
+		popup.setRegNo(TsaSession.getInfo().getUserNo());
+		popup.setUpdNo(TsaSession.getInfo().getUserNo());
+		corePopupService.savePopupFront(popup);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 룩북관리 화면
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 4
+	 */
+	@GetMapping("/lookbook/form")
+	public ModelAndView lookbookListForm() {
+		ModelAndView mav = new ModelAndView();
+		mav.addObject("siteCdList", rendererService.getAvailCommonCodeList("G000"));
+		mav.addObject("brandGroupList", rendererService.getSelfBrandGroupList());
+		mav.setViewName("display/LookbookListForm");
+		return mav;
+	}
+
+	/**
+	 * 룩북 등록/수정 상세 팝업
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 5
+	 */
+	@GetMapping("/lookbook/banner/popup/form")
+	public ModelAndView mainMultiContentsPopupForm(@RequestParam(value = "mode") String mode, @RequestParam(value = "lookbookSq", required = false) Integer lookbookSq) {
+		ModelAndView mav = new ModelAndView();
+		mav.addObject("mode", mode);
+		mav.addObject("lookbookSq", lookbookSq);
+		mav.addObject("brandGroupList", rendererService.getSelfBrandGroupList());
+		mav.setViewName("display/LookbookBannerPopupForm");
+		return mav;
+	}
+
+	/**
+	 * 룩북 등록/수정
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 5
+	 */
+	@PostMapping("/lookbook/save")
+	@ResponseBody
+	public GagaResponse saveLookbook(@RequestBody Lookbook lookbook) {
+		lookbook.setRegNo(TsaSession.getInfo().getUserNo());
+		lookbook.setUpdNo(TsaSession.getInfo().getUserNo());
+		coreLookbookService.saveLookbook(lookbook);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 룩북 리스트
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 3
+	 */
+	@PostMapping("/lookbook/list")
+	@ResponseBody
+	public GagaMap getLookbookList(@RequestBody Lookbook lookbook) {
+		GagaMap result = new GagaMap();
+
+		lookbook.setRegNo(TsaSession.getInfo().getUserNo());
+		lookbook.setPageable(new TscPageRequest(lookbook.getPageNo() - 1, lookbook.getPageSize()));
+		lookbook.getPageable().setTotalCount(coreLookbookService.getLookbookListCount(lookbook));
+
+		result.set("pageing", lookbook);
+		result.set("lookbookList", coreLookbookService.getLookbookList(lookbook));
+		return result;
+	}
+
+	/**
+	 * 룩북 삭제
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 5
+	 */
+	@PostMapping("/lookbook/delete")
+	@ResponseBody
+	public GagaResponse deleteLookbook(@RequestBody Lookbook lookbook) {
+		lookbook.setRegNo(TsaSession.getInfo().getUserNo());
+		lookbook.setUpdNo(TsaSession.getInfo().getUserNo());
+		coreLookbookService.deleteLookbook(lookbook);
+		return super.ok(message.getMessage("SUCC_0009"));
+	}
 }

+ 48 - 5
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -44,6 +44,7 @@ import com.style24.persistence.TscPageRequest;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.gagaframework.excel.GagaExcelUtil;
 import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.rest.server.GagaResponse;
@@ -1648,10 +1649,6 @@ public class TsaMarketingController extends TsaBaseController {
 
 		} else if(param.getMode().equals("U")){ // 상세 일 때
 			mav.addObject("planInfo", planService.getPlanDetailInfo(param));
-
-			//mav.addObject("fsrcPc", planService.getPlanFsrcPcList(param));
-
-			//mav.addObject("fsrcMobile", planService.getPlanFsrcMobileList(param));
 			
 			// 등록했던 브랜드
 			mav.addObject("planBrandList", planService.getPlanBrandList(param));
@@ -1659,6 +1656,9 @@ public class TsaMarketingController extends TsaBaseController {
 			// 등록했던 카테고리
 			mav.addObject("planCateList", planService.getPlanCateList(param));
 			
+			// 등록했던 제휴채널
+			mav.addObject("afChannelList", planService.getPlanAfChannelList(param));
+			
 			mav.addObject("brandList", rendererService.getSupplyCompanyBrandList(""));
 			
 			// 사용가능고객구분 목록
@@ -1753,7 +1753,6 @@ public class TsaMarketingController extends TsaBaseController {
 	@PostMapping("/planning/list/detail/popup")
 	@ResponseBody
 	public Collection<Plan> getPlanListPop(@RequestBody Plan param) {
-		//param.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
 		Collection<Plan> planList = planService.getPlanList(param);
 		return planList;
 	}
@@ -2340,7 +2339,51 @@ public class TsaMarketingController extends TsaBaseController {
 		return result;
 	}
 	
+	/**
+	 * 소셜 상품 저장
+	 *
+	 * @param 소셜 상품 정보
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	@PostMapping("/social/goods/save")
+	@ResponseBody
+	public GagaResponse saveSocialGoods(@RequestBody Collection<Social> paramList) {
+		socialService.saveSocialGoods(paramList);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+	
+	/**
+	 * 소셜 상품 목록
+	 *
+	 * @param 소셜 상품 정보
+	 * @return 소셜 상품 목록
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	@PostMapping("/social/goods/list")
+	@ResponseBody
+	public Collection<Social> getSocialGoodsList(@RequestBody Social params) {
+		Collection<Social> socialList = socialService.getSocialGoodsList(params);
+		return socialList;
+	}
 
+	/**
+	 * 소셜 상품 삭제
+	 *
+	 * @param 소셜 상품 정보
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	@PostMapping("/social/goods/delete")
+	@ResponseBody
+	public GagaResponse deleteSocialGoods(@RequestBody Collection<Social> paramList) {
+		socialService.deleteSocialGoods(paramList);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+	
 
 
 }

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

@@ -17,9 +17,13 @@ import org.springframework.web.servlet.ModelAndView;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.rest.server.GagaResponse;
-
+import com.style24.persistence.TscPageRequest;
+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.admin.biz.service.TsaDeliveryService;
 import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.biz.service.TsaWithdrawService;
@@ -422,4 +426,72 @@ public class TsaWithdrawController extends TsaBaseController {
 //		return dataList;
 //	}
 
+	
+	/**
+	 * 회수예외관리 화면 
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2021. 02. 19
+	 */
+	@GetMapping("/exception/form")
+	@ResponseBody
+	public ModelAndView withdrawExceptionListForm() throws Exception {
+		ModelAndView mav = new ModelAndView();
+		
+		mav.setViewName("/withdraw/WithdrawExceptionListForm");
+
+		return mav;
+	}
+	
+	/**
+	 * 회수예외관리 조회 
+	 * 
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2021. 03. 04
+	 */
+	@PostMapping("/exception/list")
+	@ResponseBody
+	public GagaMap getWithdrawExceptionList(@RequestBody WithdrawExc withdrawExc) throws Exception {
+		
+		GagaMap result = new GagaMap();
+		withdrawExc.setPageable(new TscPageRequest(withdrawExc.getPageNo() - 1, withdrawExc.getPageSize()));
+		withdrawExc.getPageable().setTotalCount(withdrawService.getWithdrawExceptionListCount(withdrawExc));
+		if ("N".equals(withdrawExc.getPageingYn())) {
+			withdrawExc.setPageable(null);
+		}
+		result.set("pageing", withdrawExc);
+		result.set("withdrawExceptionList", withdrawService.getWithdrawExceptionList(withdrawExc));
+		
+
+		return result;
+	}
+	
+	
+	/**
+	 * 회수예외관리 - 완료처리
+	 * 
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2021. 03. 04
+	 */
+	@PostMapping("/exception/complete")
+	@ResponseBody
+	public GagaResponse updateWithdrawException(@RequestBody WithdrawExc withdrawExc) {
+		Delivery delivery = new Delivery();
+
+		withdrawService.createWithdrawInfo(withdrawExc);
+		
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+	
+	
+	
 }

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

@@ -20,5 +20,8 @@ public class Aflink extends TscBaseDomain {
 	private float feeRate;		// 수수료율(마진율)
 	private int dispOrd;		// 표시순서
 	private String useYn;		// 사용여부
+	
+	// 검색조건
+	private String callBackFun;		// 콜백함수
 
 }

+ 87 - 29
src/main/java/com/style24/persistence/domain/Delivery.java

@@ -4,6 +4,7 @@ import java.util.Collection;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
+import com.style24.persistence.TscPageRequest;
 
 import lombok.Data;
 
@@ -31,8 +32,8 @@ public class Delivery extends TscBaseDomain {
 	private String goodsStat;
 	private String delvBanStdt;
 	private String delvBanEddt;   
-	private int    delvBanGoodsSq;
-	private String GoodsStatNm;
+	private Integer  delvBanGoodsSq;
+	private String goodsStatNm;
 	private String supplyCompCd;
 	private String searchTxt;
 	private String colorCd;
@@ -49,6 +50,68 @@ public class Delivery extends TscBaseDomain {
 	private String delYn;
 	private Integer custNo;
 	private Integer custDelvAddrSq;
+	private String goodsType;
+	private String goodsTypeNm;
+	private String sellStoreCd;
+	private String sellStoreNm;
+	private String mallGbNm;
+	private String ordDtlStatNm;
+	private String ordDtlStat;
+	
+	private String itemCd; 
+	private String optCd1; 
+	private String optCd2; 
+	private String itemQty; 
+	private String itemPrice; 
+	
+	private String shipCompCd;
+	private String invoiceNo;
+	
+	
+	
+	private String brandList;
+	private String supplyCompList;
+	
+	
+	private int delvDelayDays;
+	private String delvLocClsf;
+	private String siteCd;
+	private String mallGb;
+	private String orderNm;
+	private String orderPhnno;
+	private Integer ordDtlNo;
+	private Integer ordNo;
+	private String search;
+	private String condition;			// 키워드 검색
+	private String delvLocCd;
+	private String soldoutYn;
+	private String termGb;
+	private String stDate;
+	private String edDate;
+	
+	
+	private String[] conditions = null;
+	
+	
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiOrdDtlStat = null;
+	
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiBrand;
+	
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiSupplyCompCd;
+	
+	private String pageingYn;
+
+	// Pagination
+	private int startRow;
+	private int endRow;
+	
+	private TscPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
 	
 	/* 위로  작성  ('' ) ( '')*/
 	
@@ -56,18 +119,17 @@ public class Delivery extends TscBaseDomain {
 	
 	
 	/* 아래는 참고용!!*/
-	private Long ordNo;
-	private Long ordDtlNo;
-	private String siteCd;
+	
+
+
 	private String siteNm;
-	private String sellStoreCd;
-	private String sellStoreNm;
+
 	private String ordDt;
 	private String payDt;
-	private String mallGb;
-	private String mallGbNm;
+
+	
 	private String ordStat;
-	private String orderNm;
+
 	private String orderEmail;
 	private String colorKnm;
 
@@ -75,13 +137,13 @@ public class Delivery extends TscBaseDomain {
 	private Integer cnclRtnQty;
 	private Integer saleQty;
 	private Integer saleAmt;
-	private String ordDtlStat;
-	private String ordDtlStatNm;
-	private String delvLocCd;
+	
+
+
 
 	private String sbagEncloseYn;
-	private String invoiceNo;
-	private String soldoutYn;
+
+
 	private String dstrbtNote;
 	private String ordExchGbNm;
 	private String extmallOrderId;
@@ -90,11 +152,10 @@ public class Delivery extends TscBaseDomain {
 	private String supplyGoodsCd;
 	private String ordExchGb;
 	private String frontGb;
-	private String termGb;
-	private String orderPhnno;
-	private Integer delvDelayDays;
-	private String stDate;
-	private String edDate;
+
+
+
+
 	private Long ordChgSq;
 	private String chgGb;
 	private String chgReason;
@@ -141,7 +202,6 @@ public class Delivery extends TscBaseDomain {
 	private String delvAssignStat;
 	private String delvStdt;
 	private String delvEddt;
-	private String shipCompCd;
 	private String shipCompNm;
 	private String invoiceSendYn;
 	private String sellFeeRate;
@@ -184,7 +244,7 @@ public class Delivery extends TscBaseDomain {
 	private Integer currStockQty;
 	private Integer baseStockQty;
 	private String delvArGb;
-	private String delvLocClsf;
+
 	private Integer assignQty;
 	private String delvArId;
 	private String rejectReason;
@@ -192,7 +252,6 @@ public class Delivery extends TscBaseDomain {
 	private String ordExchGbYn;
 	private String payStDate;
 	private String payEdDate;
-	private String goodsStatNm;
 
 	private String stDt;
 	private String edDt;
@@ -242,7 +301,7 @@ public class Delivery extends TscBaseDomain {
 	private String applySttmDip;
 	private String applyEdtmDip;
 
-	private Integer itemPrice;
+
 
 	private String pResult;
 
@@ -278,9 +337,9 @@ public class Delivery extends TscBaseDomain {
 	private String outSongjang;
 	private String outResult;
 
-	private String condition;			// 키워드 검색
-	private String[] conditions = null;
-	private String search;
+
+
+
 	private String regNm;
 
 	private String invoiceGb;
@@ -290,8 +349,7 @@ public class Delivery extends TscBaseDomain {
 	private String hstMemo;
 
 
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] multiOrdDtlStat = null;
+
 	
 	// 출고처 정보
 	private String delvAssignGrade;

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

@@ -151,6 +151,9 @@ public class Plan extends TscBaseDomain{
 		private String pageYn;				// 페이징 사용 여부
 		private String changeGb;			// 순서변경 updown 구분
 		private int stockQtySum;			// 재고
+		private String afLinkCd;			// 제휴채널
+		private String afChannel;			// 제휴채널 공통코드
+		private String afLinkNm;			// 제휴채널 명
 
 		// 기획전 팝업
 		private String callBackFun;			// 콜백함수명
@@ -182,6 +185,9 @@ public class Plan extends TscBaseDomain{
 		private String[] multiPlanCoupon;		//쿠폰목록
 		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 		private String[] multiPlanFile;			//이미지목록
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiChannel;			//제휴채널목록
+		
 
 		
 		// 템플릿 저장하기 위한 임시 변수

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

@@ -25,8 +25,8 @@ public class Pos extends TscBaseDomain {
 
 	private String supplyCompCd;
 	private double sellFeeRate;
-	private Long ordNo;
-	private Long ordDtlNo;
+	private Integer ordNo;
+	private Integer ordDtlNo;
 	private String orderNm;
 	private String ordDtlStat;
 	private String recipNm;

+ 12 - 12
src/main/java/com/style24/persistence/domain/Social.java

@@ -37,23 +37,23 @@ public class Social extends TscBaseDomain{
 		// SOCIAL GOODS
 		private Integer scgoodsSq;		// 소셜상품일련번호(SEQ_SCGOODS sequence)
 		private String goodsCd;			// 상품코드(상품)
-		private String currBprice;		// 변경전현재판매가
-		private String currAprice;		// 변경후현재판매가
-		private String dcBrate;			// 변경전할인율
-		private String dcArate;			// 변경후할인율
-		private String pntBprate;		// 변경전포인트적립율(PC)
-		private String pntAprate;		// 변경후포인트적립율(PC)
-		private String pntBmrate;		// 변경전포인트적립율(모바일)
-		private String pntAmrate;		// 변경후포인트적립율(모바일)
+		private int currBprice;		// 변경전현재판매가
+		private int currAprice;		// 변경후현재판매가
+		private float dcBrate;			// 변경전할인율
+		private float dcArate;			// 변경후할인율
+		private float pntBprate;		// 변경전포인트적립율(PC)
+		private float pntAprate;		// 변경후포인트적립율(PC)
+		private float pntBmrate;		// 변경전포인트적립율(모바일)
+		private float pntAmrate;		// 변경후포인트적립율(모바일)
 		private String erpPriceLinkYn;	// erp가격연계여부(자사품만 사용, y연계)
 		private String dispOrd;			// 표시순서
 		private String delYn;			// 삭제여부(Y:삭제)
 
 		// GOODS
-		private String currPrice;		// 현재 판매가
-		private String dcRate;			// 할인율
-		private String pntPrate;		// PC 포인트 적립율
-		private String pntMrate;		// MOBILE 포인트 적립율
+		private int currPrice;		// 현재 판매가
+		private float dcRate;			// 할인율
+		private float pntPrate;		// PC 포인트 적립율
+		private float pntMrate;		// MOBILE 포인트 적립율
 
 		
 

+ 88 - 0
src/main/java/com/style24/persistence/domain/WithdrawExc.java

@@ -0,0 +1,88 @@
+package com.style24.persistence.domain;
+
+import lombok.Data;
+
+import com.style24.persistence.TscBaseDomain;
+import com.style24.persistence.TscPageRequest;
+
+/**
+ * 회수예외 Domain
+ * 
+ * @author moon
+ * @since 2021. 03. 04
+ */
+@SuppressWarnings("serial")
+@Data
+public class WithdrawExc 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;
+	
+	// 회수예외 
+	private String statusCd;           // 처리상태
+	private String dateCreated;        // 등록일자
+	private String customerName;       // 고객명
+	private Integer orderNo;           // 주문번호
+	private Integer orderDtlNo;        // 주문상세번호 
+	private String logisticsName;      // 택배사명
+	private String invoiceNo;          // 반송장번호
+	private String chargeType;         // 요금구분
+	private int chargeAmount;          // 배송비
+	private String userNameCreated;    // 작업자
+	private String reasonCd;           // 예외사유
+	private String brandNm;            // 브랜드명
+	private String productCode;        // 상품코드
+	private String skuCode;            // sku코드
+	private String productName;        // 상품명
+	private String skuValue;           // 속성
+	private String skuModelNo;         // 원코드
+	private int exceptionQty;          // 수량
+	private String siteCd;             // 주문경로
+	private Integer recallExceptionNo; // 반품예외처리번호 
+	private String recallStat;         // 반품대기처리상태 
+	private String goodsCd;            // 상품코드
+	private String adminMemo;          // WMS메시지
+	private int rnum;
+	private int rowspanCnt;            // rowspan 갯수 
+	private int rowspanRank;           // rowspan 순위 
+	private Integer recallExceptionItemNo;
+
+	
+	// 검색
+	
+	private String stDate;					// 조회 시작 기간
+	private String edDate;					// 조회 종료 기간
+	
+	
+	
+	private String searchType;				// 조회
+	private String searchText;				// 조회
+
+	private String dtlStDate;				// 상세조회 시작 기간
+	private String dtlEdDate;				// 상세조회 종료 기간
+	private String withdrawType;			// 회수상태
+	private String withdrawText;			//
+	private String delayDt;					// 회수지연일
+	private String delayDtType;				// 회수유형
+	private String goodsInfo;				// 상품정보(상품코드+사이즈코드)
+
+	private int seq;
+	private String goodsType;				// 상품유형
+	private int rfPntAmt;	//환원 포인트
+	private int rfPrePntAmt;	//취소 선포인트
+	private int rfGoodsCpnAmt;	//취소 상품쿠폰금액
+	private int rfCartCpnAmt;	//취소 장바구니쿠폰금액
+	private int rfPlusCpnAmt;	//취소 플러스쿠폰금액
+	private int rfSavePntAmt;
+	private int realOrdQty;
+	private int orgRealOrdAmt;
+	private int itemQty;	// 단품수량
+	private int itemPrice;	// 단품단가
+
+}

+ 326 - 203
src/main/java/com/style24/persistence/mybatis/shop/TsaDelivery.xml

@@ -2,178 +2,285 @@
 <!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.TsaDeliveryDao">
 
+	<!-- 목록 페이징 정보 -->
+	<sql id="getListPagingCondition_sql">
+		<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>
+	</sql>
+	
+	<!-- 배송목록 건수 -->
+	<select id="getDeliveryListCount" parameterType="Delivery" resultType="int">
+		/* TsaDelivery.getDeliveryList */
+		SELECT COUNT(*) AS TOTCNT
+		  FROM (		
+				SELECT A.* 
+				  FROM (
+					SELECT 
+							  CASE WHEN ORD_DTL_STAT IN('G013_20','G013_30','G013_35','G013_40')
+							       THEN FN_GET_BIZDAYS(IF(A.ORD_EXCH_GB='O',DATE_FORMAT(A.PAY_DT,'%Y%m%d'),DATE_FORMAT(A.WD_EDDT,'%Y%m%d')),DATE_FORMAT(NOW(),'%Y%m%d')) - 1 
+							       ELSE NULL END AS DELV_DELAY_DAYS
+							, FN_GET_CODE_NM('G024', (SELECT B.DELV_LOC_CLSF FROM TB_DELIVERY_LOC B WHERE  A.DELV_LOC_CD = B.DELV_LOC_CD AND A.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD ) ) AS DELV_LOC_CLSF  -- 출고처 분류 G024  물류창고, 일반매장, 직송매장, 입점업체 
+					  FROM (
+							SELECT 
+								  A.PAY_DT         -- 결제일시
+								, B.SUPPLY_COMP_CD -- 공급업체
+								, B.ORD_DTL_STAT  -- 주문상세상태
+								, B.DELV_LOC_CD   -- 출고처
+								, (SELECT MAX(CH.WD_EDDT) FROM TB_ORDER_CHANGE CH INNER JOIN TB_ORDER_CHANGE_DETAIL CHD ON CH.ORD_CHG_SQ = CHD.ORD_CHG_SQ WHERE CHD.ORD_DTL_NO =  B.ORG_ORD_DTL_NO) AS WD_EDDT
+					            , B.ORD_EXCH_GB
+							FROM  TB_ORDER A 
+							      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 1=1
+							<include refid="getDeliveryListCondition_sql"/>  
+					) A
+				) A
+				WHERE 1=1
+				<if test='delvDelayDays != null and delvDelayDays != ""'>
+				<![CDATA[
+				AND A.DELV_DELAY_DAYS >= #{delvDelayDays}
+				]]>
+				</if>
+				<if test='delvLocClsf != null and delvLocClsf != ""'>
+				AND   A.DELV_LOC_CLSF = #{delvLocClsf}
+				</if>
+			) A
+
+	</select>
+		
 	<!-- 배송목록 -->
 	<select id="getDeliveryList" parameterType="Delivery" resultType="Delivery">
 		/* TsaDelivery.getDeliveryList */
-		SELECT  CASE WHEN ORD_DTL_STAT IN('50','55','60')
-		        THEN NULL
-		        ELSE FN_GET_BIZDAYS(DECODE(ORD_EXCH_GB,'O',TO_CHAR(A.PAY_DT,'YYYYMMDD'),TO_CHAR(WD_EDDT,'YYYYMMDD')),TO_CHAR(SYSDATE,'YYYYMMDD')) - 1
-		        END AS DELV_DELAY_DAYS
-		      , ORD_NO
-		      , ORD_DTL_NO
-		      , SITE_CD
-		      , FN_GET_CODE_NM('G000', SITE_CD) AS SITE_NM
-		      , SELL_STORE_CD
-		      , (
-		          SELECT SELL_STORE_NM
-		          FROM   TB_SELL_STORE
-		          WHERE  SUPPLY_COMP_CD = A.SUPPLY_COMP_CD
-		          AND    SELL_STORE_CD = A.SELL_STORE_CD
-		         ) AS SELL_STORE_NM
-		      , ORD_DT
-		      , PAY_DT
-		      , MALL_GB
-		      , FN_GET_CODE_NM('G011', MALL_GB) AS MALL_GB_NM
-		      , CUST_NO
-		      , ORDER_NM
-		      , RECIP_NM
-		      , GOODS_CD
-		      , GOODS_NM
-		      , (
-		         SELECT COLOR_KNM
-		         FROM TB_COLOR
-		         WHERE SUPPLY_COMP_CD = A.SUPPLY_COMP_CD
-		         AND COLOR_CD = A.COLOR_CD AND BRAND_CD = A.BRAND_CD
-		         ) AS COLOR_KNM
-		      , SIZE_CD
-		      , SUPPLY_GOODS_CD
-		      , ORD_QTY
-		      , CNCL_RTN_QTY
-		      , SALE_QTY
-		      , SALE_AMT
-		      , ORD_DTL_STAT
-		      , FN_GET_CODE_NM('G013', ORD_DTL_STAT) AS ORD_DTL_STAT_NM
-		      , A.DELV_LOC_CD
-		      , B.DELV_LOC_NM
-		      , SBAG_ENCLOSE_YN
-		      , INVOICE_NO
-		      , SOLDOUT_YN
-		      , DSTRBT_NOTE
-		      , DECODE(ORD_EXCH_GB, 'E', 'Y', '') AS ORD_EXCH_GB
-		      , EXTMALL_ORDER_ID
-		      , EXTMALL_ORD_DTL_NO
-		      , AGENT_ORDER_ID
-		      , A.SUPPLY_COMP_CD
-		      , (
-		         SELECT SUPPLY_COMP_NM
-		         FROM TB_SUPPLY_COMPANY
-		         WHERE SUPPLY_COMP_CD = A.SUPPLY_COMP_CD
-		         ) AS SUPPLY_COMP_NM
-		      , DELV_MEMO
-		      , A.SHIP_COMP_CD
-		      , A.DELV_STDT
-		      , A.REAL_ORD_AMT
-		      , A.EXTMALL_NM
-		      , A.ORDER_PHNNO
-		      , A.ORDER_TELNO
-		      , A.ORDER_EMAIL
-		      , B.DELV_LOC_CLSF
-		FROM
-		(
-		 SELECT A.ORD_NO
-		      , ODI.ORD_DTL_NO
-		      , A.SITE_CD
-		      , B.SELL_STORE_CD
-		      , A.ORD_DT
-		      , A.PAY_DT
-		      , A.MALL_GB
-		      , A.CUST_NO
-		      , A.ORDER_NM
-		      , D.RECIP_NM
-		      , ODI.ITEM_CD     AS GOODS_CD
-		      , C.GOODS_NM
-		      , C.COLOR_CD
-		      , ODI.SIZE_CD
-		      , C.SUPPLY_GOODS_CD
-		      , B.ORD_QTY
-		      , B.CNCL_RTN_QTY
-		      , (B.ORD_QTY - B.CNCL_RTN_QTY) AS SALE_QTY
-		      , (B.ORD_AMT - B.CNCL_RTN_AMT) AS SALE_AMT
-		      , B.ORD_DTL_STAT
-		      , B.DELV_LOC_CD
-		      , A.SBAG_ENCLOSE_YN
-		      , B.INVOICE_NO
-		      , B.SOLDOUT_YN
-		      , B.DSTRBT_NOTE
-		      , B.ORD_EXCH_GB
-		      , B.EXTMALL_ORDER_ID
-		      , B.EXTMALL_ORD_DTL_NO
-		      , B.AGENT_ORDER_ID
-		      , B.SUPPLY_COMP_CD
-		      , D.DELV_MEMO
-		      , B.SHIP_COMP_CD
-		      , B.DELV_STDT
-		      , B.REAL_ORD_AMT
-		      , NVL((SELECT MAX(EXTMALL_NM)
-		              FROM TB_EXTMALL WHERE VENDOR_ID = B.VENDOR_ID
-		              AND  EXTMALL_ID = B.EXTMALL_ID), 'PASTELmall'
-		            )  AS EXTMALL_NM
-		      , C.BRAND_CD
-		      , (SELECT MAX(WD_EDDT) FROM TB_ORDER_CHANGE CH, TB_ORDER_CHANGE_DETAIL CHD WHERE CH.ORD_CHG_SQ = CHD.ORD_CHG_SQ AND CHD.ORD_DTL_NO =  B.ORG_ORD_DTL_NO) AS WD_EDDT
-		      , A.ORDER_PHNNO
-		      , A.ORDER_TELNO
-		      , A.ORDER_EMAIL
-		FROM  TB_ORDER A
-			, TB_ORDER_DETAIL_ITEM ODI
-		    , TB_ORDER_DETAIL B
-		    , TB_GOODS C
-		    , TB_DELIVERY_ADDR D
-		WHERE A.ORD_NO = B.ORD_NO
-		AND   B.ORD_DTL_NO = ODI.ORD_DTL_NO
-		AND   ODI.ITEM_CD = C.GOODS_CD
-		AND   B.DELV_ADDR_SQ = D.DELV_ADDR_SQ
-		<if test='ordDtlNo != null and ordDtlNo != ""'>
-		AND   ODI.ORD_DTL_NO = #{ordDtlNo}
-		</if>
-		<if test='termGb == "ordDt"'>
-		    <if test='stDate != null and stDate != ""'>
-		AND   A.REG_DT >= TO_DATE(#{stDate}, 'YYYY/MM/DD HH24 MI SS')
-		    </if>
-		    <if test='edDate != null and edDate != ""'>
-		AND   A.REG_DT <![CDATA[<]]> TO_DATE(#{edDate}, 'YYYY/MM/DD HH24 MI SS') + 1
-		    </if>
-		</if>
-		<if test='termGb == "delvDt"'>
-		    <if test='stDate != null and stDate != ""'>
-		AND   B.DELV_EDDT >= TO_DATE(#{stDate}, 'YYYY/MM/DD HH24 MI SS')
-		    </if>
-		    <if test='edDate != null and edDate != ""'>
-		AND   B.DELV_EDDT <![CDATA[<]]> TO_DATE(#{edDate}, 'YYYY/MM/DD HH24 MI SS') + 1
-		    </if>
+		SELECT Z.*
+		    , FN_GET_CODE_NM('G000', Z.SITE_CD) AS SITE_NM
+			, ( SELECT SELL_STORE_NM
+		      FROM   TB_SELL_STORE
+		      WHERE  SUPPLY_COMP_CD = Z.SUPPLY_COMP_CD
+		      AND    SELL_STORE_CD = Z.SELL_STORE_CD
+		     ) AS SELL_STORE_NM
+		    , FN_GET_CODE_NM('G011', Z.MALL_GB) AS MALL_GB_NM
+		    , FN_GET_CODE_NM('G013', Z.ORD_DTL_STAT) AS ORD_DTL_STAT_NM
+		    , (SELECT B.DELV_LOC_NM FROM TB_DELIVERY_LOC B WHERE  Z.DELV_LOC_CD = B.DELV_LOC_CD AND Z.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD ) AS DELV_LOC_NM   -- 출고처명
+		    , (SELECT BD.BRAND_KNM FROM TB_BRAND BD WHERE BD.BRAND_CD = Z.BRAND_CD ) AS BRAND_NM
+		    , FN_GET_CODE_NM('G056', Z.GOODS_TYPE ) AS GOODS_TYPE_NM 
+		FROM (
+		    SELECT A.*, @rownum := @rownum + 1  RNUM 
+		    FROM (
+				SELECT A.* 
+				  FROM (
+					SELECT 
+							  CASE WHEN ORD_DTL_STAT IN('G013_20','G013_30','G013_35','G013_40')
+							       THEN FN_GET_BIZDAYS(IF(A.ORD_EXCH_GB='O',DATE_FORMAT(A.PAY_DT,'%Y%m%d'),DATE_FORMAT(A.WD_EDDT,'%Y%m%d')),DATE_FORMAT(NOW(),'%Y%m%d')) - 1 
+							       ELSE NULL END AS DELV_DELAY_DAYS
+							, A.ORD_NO     -- 주문번호
+							, A.ORD_DTL_NO -- 주문상세번호
+							, A.SITE_CD    -- 사이트
+							, A.SELL_STORE_CD -- 판매몰
+							, A.EXTMALL_NM  -- 판매몰명     
+							, A.ORD_DT         -- 주문일시
+							, A.PAY_DT         -- 결제일시
+							, A.MALL_GB        -- 몰구분
+							, A.ORD_NM         -- 주문자
+							, A.RECIP_NM       -- 수령인
+							, A.SUPPLY_COMP_CD -- 공급업체
+							, A.GOODS_CD       -- 상품코드
+							, A.GOODS_TYPE     -- 구성유형 
+							, A.GOODS_NM       -- 상품명
+							, A.OPT_CD1        -- 옵션1
+							, A.OPT_CD2        -- 옵션2 
+							, A.OPT_CD         -- SKU 
+							, A.SKU_MODEL_NO
+							, A.PRODUCT_NO
+							, A.PRODUCT_CODE
+							, A.ORD_QTY        -- 주문수량
+							, A.CNCL_RTN_QTY   -- 취소수량
+							, A.SALE_QTY       -- 판매수량
+							, A.SALE_AMT       -- 판매금액
+							, A.REAL_ORD_AMT   -- 실결제금액
+							, A.ORD_DTL_STAT   -- 주문상세상태
+							, FN_GET_CODE_NM('G024', (SELECT B.DELV_LOC_CLSF FROM TB_DELIVERY_LOC B WHERE  A.DELV_LOC_CD = B.DELV_LOC_CD AND A.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD ) ) AS DELV_LOC_CLSF           -- 출고처 분류 G024  물류창고, 일반매장, 직송매장, 입점업체 
+				            , A.DELV_LOC_CD   -- 출고처
+							, A.SHIP_COMP_CD  -- 출고택배사
+							, A.INVOICE_NO    -- 출고송장
+							-- 송장등록수정
+							-- 배송완료처리
+							, A.EXTMALL_ORDER_ID -- 외부몰주문번호
+							-- , B.EXTMALL_ORD_DTL_NO-- 외부몰부주문번호
+							, A.SOLDOUT_YN    -- 결품여부
+							, A.DELV_MEMO     -- 배송메모
+							, A.ORD_EXCH_GB   -- 교환여부
+							, A.DELV_STDT     -- 배송시작일  
+							, A.BRAND_CD      -- 브랜드	
+
+					  FROM (
+							SELECT 
+								  A.ORD_NO     -- 주문번호
+								, B.ORD_DTL_NO -- 주문상세번호
+								, A.SITE_CD    -- 사이트
+								, B.SELL_STORE_CD -- 판매몰
+								, IFNULL((SELECT MAX(EXTMALL_NM) FROM TB_EXTMALL WHERE VENDOR_ID = B.VENDOR_ID
+								          AND  EXTMALL_ID = B.EXTMALL_ID), '아이스타일24')  AS EXTMALL_NM  -- 판매몰명
+								, A.ORD_DT         -- 주문일시
+								, A.PAY_DT         -- 결제일시
+								, A.MALL_GB        -- 몰구분
+								, A.ORD_NM         -- 주문자
+								, D.RECIP_NM       -- 수령인
+								, B.SUPPLY_COMP_CD -- 공급업체
+								, B.GOODS_CD       -- 상품코드
+								, B.GOODS_TYPE     -- 구성유형 
+								, C.GOODS_NM       -- 상품명
+								, ODI.OPT_CD1      -- 옵션1
+								, ODI.OPT_CD2      -- 옵션2 
+								, ODI.OPT_CD       -- SKU 
+								, ODI.SKU_MODEL_NO
+								, ODI.PRODUCT_NO
+								, ODI.PRODUCT_CODE
+								, ODI.ITEM_QTY * B.ORD_QTY      AS ORD_QTY      -- 주문수량
+								, ODI.ITEM_QTY * B.CNCL_RTN_QTY AS CNCL_RTN_QTY -- 취소수량
+								, (ODI.ITEM_QTY * B.ORD_QTY  - ODI.ITEM_QTY * B.CNCL_RTN_QTY) SALE_QTY -- 판매수량
+								, B.ORD_AMT - B.CNCL_RTN_AMT  AS SALE_AMT       -- 판매금액
+								, B.REAL_ORD_AMT  -- 실결제금액
+								, B.ORD_DTL_STAT  -- 주문상세상태
+								, B.DELV_LOC_CD   -- 출고처
+								, B.SHIP_COMP_CD  -- 출고택배사
+								, B.INVOICE_NO    -- 출고송장
+								, B.EXTMALL_ORDER_ID -- 외부몰주문번호
+								, B.SOLDOUT_YN    -- 결품여부
+								, D.DELV_MEMO     -- 배송메모
+								, B.ORD_EXCH_GB   -- 교환여부
+								, B.DELV_STDT     -- 배송시작일  
+								, (SELECT MAX(CH.WD_EDDT) FROM TB_ORDER_CHANGE CH INNER JOIN TB_ORDER_CHANGE_DETAIL CHD ON CH.ORD_CHG_SQ = CHD.ORD_CHG_SQ WHERE CHD.ORD_DTL_NO =  B.ORG_ORD_DTL_NO) AS WD_EDDT
+							    , C.BRAND_CD
+							FROM  TB_ORDER A 
+							      INNER JOIN TB_ORDER_DETAIL B        ON A.ORD_NO       = B.ORD_NO
+								  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'
+							  AND B.GOODS_TYPE NOT IN ('G056_S')
+					        <include refid="getDeliveryListCondition_sql"/>
+							
+							UNION ALL
+							
+							SELECT 
+								  A.ORD_NO     -- 주문번호
+								, B.ORD_DTL_NO -- 주문상세번호
+								, A.SITE_CD    -- 사이트
+								, B.SELL_STORE_CD -- 판매몰
+								, IFNULL((SELECT MAX(EXTMALL_NM) FROM TB_EXTMALL WHERE VENDOR_ID = B.VENDOR_ID
+								          AND  EXTMALL_ID = B.EXTMALL_ID), '아이스타일24')  AS EXTMALL_NM  -- 판매몰명
+								, A.ORD_DT         -- 주문일시
+								, A.PAY_DT         -- 결제일시
+								, A.MALL_GB        -- 몰구분
+								, A.ORD_NM         -- 주문자
+								, D.RECIP_NM       -- 수령인
+								, B.SUPPLY_COMP_CD -- 공급업체
+								, B.GOODS_CD       -- 상품코드
+								, B.GOODS_TYPE     -- 구성유형 
+								, C.GOODS_NM       -- 상품명
+								, '-' AS OPT_CD1   -- 옵션1
+								, '-' AS OPT_CD2   -- 옵션2 
+								, '-' AS OPT_CD    -- SKU 
+								, '-' AS SKU_MODEL_NO
+								, NULL  AS PRODUCT_NO
+								, '-'  AS PRODUCT_CODE
+								, B.ORD_QTY      AS ORD_QTY      -- 주문수량
+								, B.CNCL_RTN_QTY AS CNCL_RTN_QTY -- 취소수량
+								, B.ORD_QTY  - B.CNCL_RTN_QTY   AS SALE_QTY   -- 판매수량
+								, B.ORD_AMT - B.CNCL_RTN_AMT    AS SALE_AMT   -- 판매금액
+								, B.REAL_ORD_AMT  -- 실결제금액
+								, B.ORD_DTL_STAT  -- 주문상세상태
+								, B.DELV_LOC_CD   -- 출고처
+								, B.SHIP_COMP_CD  -- 출고택배사
+								, B.INVOICE_NO    -- 출고송장
+								, B.EXTMALL_ORDER_ID -- 외부몰주문번호
+								, B.SOLDOUT_YN    -- 결품여부
+								, D.DELV_MEMO     -- 배송메모
+								, B.ORD_EXCH_GB   -- 교환여부
+								, B.DELV_STDT     -- 배송시작일  
+								, (SELECT MAX(CH.WD_EDDT) FROM TB_ORDER_CHANGE CH INNER JOIN TB_ORDER_CHANGE_DETAIL CHD ON CH.ORD_CHG_SQ = CHD.ORD_CHG_SQ WHERE CHD.ORD_DTL_NO =  B.ORG_ORD_DTL_NO) AS WD_EDDT
+							    , C.BRAND_CD 
+							FROM  TB_ORDER A 
+							      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'
+							  AND B.GOODS_TYPE IN ('G056_S')
+							<include refid="getDeliveryListCondition_sql"/>  
+					) A
+				) A
+				WHERE 1=1
+				<if test='delvDelayDays != null and delvDelayDays != ""'>
+				<![CDATA[
+				AND A.DELV_DELAY_DAYS >= #{delvDelayDays}
+				]]>
+				</if>
+				<if test='delvLocClsf != null and delvLocClsf != ""'>
+				AND   A.DELV_LOC_CLSF = #{delvLocClsf}
+				</if>
+				ORDER BY A.ORD_NO DESC, A.ORD_DTL_NO
+	<include refid="getListPagingCondition_sql"/>
+	</select>
+
+    <!-- 배송목록 조회 조건  -->
+	<sql id="getDeliveryListCondition_sql">
+		<if test='siteCd != null and siteCd != ""'>
+		AND  A.SITE_CD = #{siteCd}
 		</if>
-		<if test='termGb == "delvStDt"'>
-		    <if test='stDate != null and stDate != ""'>
-		AND   B.DELV_STDT >= TO_DATE(#{stDate}, 'YYYY/MM/DD HH24 MI SS')
-		    </if>
-		    <if test='edDate != null and edDate != ""'>
-		AND   B.DELV_STDT <![CDATA[<]]> TO_DATE(#{edDate}, 'YYYY/MM/DD HH24 MI SS') + 1
-		    </if>
+		<if test='mallGb != null and mallGb != ""'>
+		AND  A.MALL_GB = #{mallGb}
 		</if>
+        <if test="multiSupplyCompCd != null and multiSupplyCompCd != ''">
+        AND B.SUPPLY_COMP_CD IN
+            <foreach collection="multiSupplyCompCd" item="item" index="index"  open="(" close=")" separator=",">
+        	#{item}
+            </foreach>
+        </if>
+        <if test="multiBrand != null and multiBrand != ''">
+        AND C.BRAND_CD IN
+            <foreach collection="multiBrand" item="item" index="index"  open="(" close=")" separator=",">
+        	#{item}
+            </foreach>
+        </if>
 		<if test='orderNm != null and orderNm != ""'>
 		AND   A.ORDER_NM = #{orderNm}
 		</if>
-		<if test='recipNm != null and recipNm != ""'>
-		AND   D.RECIP_NM = #{recipNm}
-		</if>
 		<if test='orderPhnno != null and orderPhnno != ""'>
 		AND   REPLACE(A.ORDER_PHNNO, '-', '') = REPLACE(#{orderPhnno}, '-', '')
 		</if>
+		<if test='ordDtlNo != null and ordDtlNo != ""'>
+		AND   B.ORD_DTL_NO = #{ordDtlNo}
+		</if>
 		<if test='conditions != null and conditions != "" '>
 		AND (
 		<choose>
 		     <when test='search != null and search == "searchOrdNo"'>
 		         <foreach collection="conditions" item="item" index="index" separator="or">
-		      REGEXP_LIKE(UPPER(A.ORD_NO), UPPER(#{item}))
+		      ORD_NM REGEXP CONCAT('[',#{item},']')  
 		         </foreach>
 		     </when>
 		     <when test='search != null and search == "searchExtmallOrderId"'>
 		         <foreach collection="conditions" item="item" index="index" separator="or">
-		      REGEXP_LIKE(UPPER(B.EXTMALL_ORDER_ID), UPPER(#{item}))
+		      EXTMALL_ORDER_ID REGEXP CONCAT('[',#{item},']')      
 		         </foreach>
 		      </when>
 		</choose>
 		      )
 		</if>
+		<if test='recipNm != null and recipNm != ""'>
+		AND   D.RECIP_NM = #{recipNm}
+		</if>
 		<if test='invoiceNo != null and invoiceNo != ""'>
 		AND   B.INVOICE_NO = #{invoiceNo}
 		</if>
@@ -183,80 +290,96 @@
 		<if test='delvLocCd != null and delvLocCd != ""'>
 		AND   B.DELV_LOC_CD = #{delvLocCd}
 		</if>
-		<if test='frontGb != null and frontGb != ""'>
-		AND   A.FRONT_GB = #{frontGb}
-		</if>
-		<if test='siteCd != null and siteCd != ""'>
-		AND  A.SITE_CD = #{siteCd}
-		</if>
-		<if test='soldoutYn != null and soldoutYn != ""'>
-		AND  B.SOLDOUT_YN = #{soldoutYn}
-		</if>
-		<if test='mallGb != null and mallGb != ""'>
-		AND  A.MALL_GB = #{mallGb}
-		</if>
 		<if test="multiOrdDtlStat != null and multiOrdDtlStat !=''">
 		AND  B.ORD_DTL_STAT IN
 		    <foreach collection="multiOrdDtlStat" item="item" index="index"  open="(" close=")" separator=",">
 		     #{item}
 		    </foreach>
+		</if>		
+		<if test='soldoutYn != null and soldoutYn != ""'>
+		AND  B.SOLDOUT_YN = #{soldoutYn}
 		</if>
-		<if test='supplyCompCd != null and supplyCompCd != ""'>
-		AND  B.SUPPLY_COMP_CD = #{supplyCompCd}
-		</if>
-		<if test='vendorId != null and vendorId != ""'>
-		AND  B.VENDOR_ID = #{vendorId}
-		</if>
-		<if test='extmallId != null and extmallId != ""'>
-		AND  B.EXTMALL_ID = #{extmallId}
+		<if test='termGb == "ordDt"'>
+		    <if test='stDate != null and stDate != ""'>
+		AND   A.REG_DT >= STR_TO_DATE(REPLACE(#{stDate},'-',''), '%Y%m%d%H%i%s')    
+		    </if>
+		    <if test='edDate != null and edDate != ""'>
+		AND   A.REG_DT <![CDATA[<]]> STR_TO_DATE(REPLACE(#{edDate},'-','') +1, '%Y%m%d%H%i%s') 
+		    </if>
 		</if>
-		<choose>
-			<when test='soldoutYn == "Y"'>
-				AND B.ORD_DTL_STAT = '99'
-			</when>
-			<otherwise>
-				<choose>
-					<when test='delvDelayDays != null and delvDelayDays != ""'>
-						AND B.ORD_DTL_STAT IN ('20', '30', '34', '35', '40')
-					</when>
-					<when test='multiOrdDtlStat == null or multiOrdDtlStat == ""'>
-						AND B.ORD_DTL_STAT != '00'
-					</when>
-				</choose>
-			</otherwise>
-		</choose>
-		) A
-		, TB_DELIVERY_LOC B
-		WHERE A.DELV_LOC_CD = B.DELV_LOC_CD (+)
-		AND A.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD(+)
-		<if test='delvDelayDays != null and delvDelayDays != ""'>
-		AND   CASE WHEN ORD_DTL_STAT IN('50','55','60') THEN NULL
-		      ELSE FN_GET_BIZDAYS(DECODE(ORD_EXCH_GB,'O',TO_CHAR(A.PAY_DT,'YYYYMMDD'),TO_CHAR(WD_EDDT,'YYYYMMDD')),TO_CHAR(SYSDATE,'YYYYMMDD')) END >= #{delvDelayDays}
+		<if test='termGb == "delvDt"'>
+		    <if test='stDate != null and stDate != ""'>
+		AND   B.DELV_EDDT >= STR_TO_DATE(REPLACE(#{stDate},'-',''), '%Y%m%d%H%i%s')
+		    </if>
+		    <if test='edDate != null and edDate != ""'>
+		AND   B.DELV_EDDT <![CDATA[<]]> STR_TO_DATE(REPLACE(#{edDate},'-','')+1, '%Y%m%d%H%i%s')
+		    </if>
 		</if>
-		<if test='delvLocClsf != null and delvLocClsf != ""'>
-		AND   B.DELV_LOC_CLSF = #{delvLocClsf}
+		<if test='termGb == "delvStDt"'>
+		    <if test='stDate != null and stDate != ""'>
+		AND   B.DELV_STDT >= STR_TO_DATE(REPLACE(#{stDate},'-',''), '%Y%m%d%H%i%s')
+		    </if>
+		    <if test='edDate != null and edDate != ""'>
+		AND   B.DELV_STDT <![CDATA[<]]> STR_TO_DATE(REPLACE(#{edDate},'-','')+1 , '%Y%m%d%H%i%s') 
+		    </if>
 		</if>
-		ORDER BY A.ORD_NO DESC, A.ORD_DTL_NO
-		
-	</select>
+		AND B.ORD_DTL_STAT != '00'
+	</sql>
 
-	<!-- 주문상세 -->
-	<select id="getOrderDetail" parameterType="Delivery" resultType="Delivery">
-		/* TsaDelivery.getOrderDetail */
-		SELECT '1' FROM DUAL
+
+	<!-- 주문상세 단품 목록 -->
+	<select id="getDelvDetailItemList" parameterType="Delivery" resultType="Delivery">
+		/* TsaDelivery.getDelvDetailItemList */
+		SELECT 
+		     B.ITEM_CD 
+		   , (SELECT G.GOODS_NM FROM TB_GOODS G WHERE G.GOODS_CD = B.ITEM_CD) AS GOODS_NM
+		   , B.OPT_CD1 
+		   , B.OPT_CD2 
+		   , B.ITEM_QTY 
+		   , B.ITEM_PRICE 
+		 FROM TB_ORDER_DETAIL A
+		 JOIN TB_ORDER_DETAIL_ITEM B ON A.ORD_DTL_NO = B.ORD_DTL_NO 
+	    WHERE A.ORD_DTL_NO  = #{ordDtlNo}
+	    ORDER BY DISP_ORD 
 	</select>
 
+
 	<!-- 주문상세 상태 값 변경 -->
 	<update id="updateOrderDetailStat" parameterType="Delivery" >
 		/* TsaDelivery.updateOrderDetailStat */
-		SELECT '1' FROM DUAL
+		UPDATE TB_ORDER_DETAIL
+		SET    ORD_DTL_STAT = #{ordDtlStat}
+		     , DELV_EDDT    = IFNULL(DELV_EDDT, NOW()) 
+		     , UPD_NO       = #{updNo}
+		     , UPD_DT       = NOW()
+		WHERE  ORD_DTL_NO   = #{ordDtlNo}
 	</update>
+
+	<!-- 주문상세 -->
+	<select id="getOrderDetail" parameterType="Integer" resultType="Delivery">
+		/* TsaDelivery.getOrderDetail */
+		SELECT 
+			  A.ORD_NO
+			, A.ORD_DTL_NO
+			, A.ORD_DTL_STAT 
+			, A.SHIP_COMP_CD 
+			, A.INVOICE_NO 
+		  FROM TB_ORDER_DETAIL A
+		 WHERE ORD_DTL_NO  = #{ordDtlNo}
+	</select>
 	
-	<!-- 주문 상세 이력 등록-->
-	<update id="createOrderDetailHst" parameterType="Delivery" >
-		/* TsaDelivery.createOrderDetailHst */
-		SELECT '1' FROM DUAL
+	<!-- 송장번호  변경 -->
+	<update id="saveChangeInvoice" parameterType="Delivery" >
+		/* TsaDelivery.saveChangeInvoice */
+		UPDATE TB_ORDER_DETAIL
+		SET    SHIP_COMP_CD = #{shipCompCd}
+		     , INVOICE_NO   = #{invoiceNo}
+		     , UPD_NO       = #{updNo}
+		     , UPD_DT       = NOW()
+		WHERE  ORD_DTL_NO   = #{ordDtlNo}
 	</update>
+		
+
 	
 	<!-- 출고금지상품 목록 -->
 	<select id="getBangoodsList" parameterType="Delivery" resultType="Delivery">

+ 120 - 7
src/main/java/com/style24/persistence/mybatis/shop/TsaPlan.xml

@@ -446,6 +446,31 @@
 		WHERE PLAN_SQ = ${planSq}
 	</delete>
 	
+	<insert id="createPlanAfChannel" parameterType="Plan">
+		/* TsaPlan.createPlanAfChannel */
+		INSERT INTO TB_PLAN_AF_CHANNEL
+			(
+				PLAN_SQ
+			  , AF_LINK_CD
+			  , REG_NO
+			  , REG_DT
+			)
+		VALUES
+		   (
+			    #{planSq}
+			  , #{afLinkCd}
+			  , #{regNo}
+			  , CURRENT_TIMESTAMP
+		   )
+	</insert>
+	
+	<delete id="deletePlanAfChannel" parameterType="Plan">
+		/* TsaPlan.deletePlanAfChannel */
+		DELETE 
+		FROM TB_PLAN_AF_CHANNEL
+		WHERE PLAN_SQ = ${planSq}
+	</delete>
+	
 	<select id="getPlanBrandList" parameterType="Plan" resultType="Plan">
 		/* TsaPlan.getPlanBrandList */
 		SELECT TP.PLAN_NM AS PLAN_NM
@@ -463,6 +488,18 @@
 		    AND TP.DEL_YN = 'N'
 	</select>
 	
+	<select id="getPlanAfChannelList" parameterType="Plan" resultType="Plan">
+			SELECT A.PLAN_SQ 
+			      ,A.AF_LINK_CD 
+			      ,B.AF_LINK_NM  
+			      ,A.REG_DT 
+			      ,B.FEE_RATE 
+			      ,B.DISP_ORD 
+			      ,B.AF_CHANNEL 
+			FROM TB_PLAN_AF_CHANNEL A LEFT JOIN TB_AF_LINK B ON A.AF_LINK_CD = B.AF_LINK_CD 
+			WHERE PLAN_SQ = #{planSq}
+	</select>
+	
 	<insert id="createPlanBrandCopy" parameterType="Plan">
 		/* TsaPlan.createPlanBrandCopy */
 			INSERT INTO
@@ -475,12 +512,13 @@
 					  ,REG_DT  
 					  ,UPD_NO  
 					  ,UPD_DT  
-     			      ) SELECT 	BRAND_GROUP_NO
-						  , ${planSq} 
+     			      ) SELECT 	
+     			      		BRAND_GROUP_NO
+						  , #{planSq} 
 						  , DISP_YN 
-						  , REG_NO  
+						  , #{regNo} 
 						  , CURRENT_TIMESTAMP  
-						  , UPD_NO  
+						  , #{updNo} 
 						  , CURRENT_TIMESTAMP  
 	        	   FROM   TB_PLAN_BRAND
 	        	   WHERE 1=1
@@ -551,11 +589,11 @@
 					  ,UPD_DT 
      			      ) SELECT 	
      			      		CATE_NO
-						  , ${planSq} 
+						  , #{planSq} 
 						  , DISP_YN 
-						  , REG_NO  
+						  ,#{regNo}
 						  , now()  
-						  , UPD_NO  
+						  ,#{updNo}
 						  , now()  
 	        	   FROM   TB_PLAN_CATE
 	        	   WHERE 1=1
@@ -563,6 +601,67 @@
 	        	     AND CATE_NO = #{cateNo}
 	</insert>
 	
+	<insert id="createPlanAfChannelCopy" parameterType="Plan">
+		/* TsaPlan.createPlanAfChannelCopy */
+			INSERT INTO
+					 TB_PLAN_AF_CHANNEL
+					 (
+			         	  PLAN_SQ
+			         	, AF_CHANNEL
+			         	, REG_NO
+			         	, REG_DT
+     			      ) SELECT 	
+     			      		 #{planSq}
+     			      		,AF_CHANNEL
+     			      		,#{regNo}
+     			      		,now()
+	        	   FROM   TB_PLAN_AF_CHANNEL
+	        	   WHERE 1=1
+					 AND PLAN_SQ = #{copyPlanSq}
+					 AND AF_CHANNEL = #{afChannel}
+	</insert>
+	
+	<insert id="createPlanCustGbCopy" parameterType="Plan">
+		/* TsaPlan.createPlanCustGbCopy */
+			INSERT INTO
+					 TB_PLAN_CUST_DIVISION
+					 (
+			         	 PLAN_SQ
+			           , CUST_GB
+			           , REG_NO
+			           , REG_DT
+     			      ) SELECT 	
+     			      		 #{planSq}
+     			      		, CUST_GB
+     			      		,#{regNo}
+     			      		,now()
+	        	   FROM  TB_PLAN_CUST_DIVISION
+	        	   WHERE 1=1
+					 AND PLAN_SQ = #{copyPlanSq}
+					 AND CUST_GB = #{custGb}
+	</insert>
+	
+	<insert id="createPlanCustGradeCopy" parameterType="Plan">
+		/* TsaPlan.createPlanCustGbCopy */
+			INSERT INTO
+					 TB_PLAN_CUST_GRADE
+					 (
+			         	PLAN_SQ
+			          , CUST_GRADE
+			          , REG_NO
+			          , REG_DT
+     			      ) SELECT 	
+     			      		 #{planSq}
+     			      		, CUST_GRADE
+     			      		,#{regNo}
+     			      		,now()
+	        	   FROM  TB_PLAN_CUST_GRADE
+	        	   WHERE 1=1
+					 AND PLAN_SQ = #{copyPlanSq}
+					 AND CUST_GRADE = #{custGrade}
+	</insert>
+	
+	
 	<!-- 기획전 코너 시퀀스 조회 -->
 	<select id="getPlanDtlSq" parameterType="Plan" resultType="Integer">
 		/* TsaPlan.getPlanDtlSq */
@@ -872,6 +971,13 @@
 					  )
 	</insert>
 	
+	<delete id="deletePlanCustGb" parameterType="Plan">
+		/* TsaPlan.deletePlanCustGb */
+		DELETE 
+		FROM TB_PLAN_CUST_DIVISION
+		WHERE PLAN_SQ= #{planSq}
+	</delete>
+	
 	<insert id="createPlanCustGrade" parameterType="Plan">
 		/* TsaPlan.createPlanCustGrade */
 		INSERT INTO TB_PLAN_CUST_GRADE
@@ -889,6 +995,13 @@
 				 )
 	</insert>
 	
+	<delete id="deletePlanCustGrade" parameterType="Plan">
+		/* TsaPlan.deletePlanCustGrade */
+		DELETE 
+		FROM TB_PLAN_CUST_GRADE
+		WHERE PLAN_SQ= #{planSq}
+	</delete>
+	
 	<select id="getPlanCustGbList" parameterType="Plan" resultType="Plan">
 		/* TsaPlan.createPlanCustGrade */
 		SELECT CUST_GB 

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

@@ -425,4 +425,21 @@
 		ORDER BY CATE1_NO
 	</select>
 
+	<!-- 자사 브랜드 그룹 조회 -->
+	<select id="getSelfBrandGroupList" resultType="CommonCode">
+		/* TsaRenderer.getSelfBrandGroupList */
+		SELECT Z.BRAND_GROUP_NO AS CD
+			 , Z.BRAND_GROUP_ENM AS CD_NM
+		FROM	(
+					SELECT	A.BRAND_GROUP_NO
+						 	,A.BRAND_GROUP_ENM
+						 	,RANK() OVER(ORDER BY A.BRAND_GROUP_NO) AS DISP_ORD
+					FROM	TB_BRAND_GROUP A
+					LEFT JOIN TB_BRAND B
+					ON (((UPPER(A.BRAND_GROUP_ENM) = UPPER(B.BRAND_GRP_NM)) OR (UPPER(A.BRAND_GROUP_KNM) = UPPER(B.BRAND_GRP_NM))))
+					WHERE	B.SELF_YN = 'Y'
+				) Z
+		ORDER BY Z.DISP_ORD
+	</select>
+
 </mapper>

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

@@ -89,6 +89,106 @@
 		FROM TB_SOCIAL	
 	</select>
 	
+	<!-- 소셜 상품 저장 -->
+	<insert id="saveSocialGoods" parameterType="Social">
+		/* TsaSocial.saveSocialGoods */
+		INSERT INTO TB_SOCIAL_GOODS
+				(
+					SOCIAL_SQ
+				  , GOODS_CD
+				  , CURR_BPRICE
+				  , CURR_APRICE
+				  , DC_BRATE
+				  , DC_ARATE
+				  , PNT_BPRATE
+				  , PNT_APRATE
+				  , PNT_BMRATE
+				  , PNT_AMRATE
+				  , ERP_PRICE_LINK_YN
+				  , DISP_ORD
+				  , DEL_YN
+				  , REG_NO
+				  , REG_DT
+				  , UPD_NO
+				  , UPD_DT
+				)
+			VALUES
+				(
+				   #{socialSq}
+				 , #{goodsCd}
+				 , #{currBprice}
+				 , #{currAprice}
+				 , #{dcBrate}
+				 , #{dcArate}
+				 , #{pntBprate}
+				 , #{pntAprate}
+				 , #{pntBmrate}
+				 , #{pntAmrate}
+				 , 'N'
+				 , #{dispOrd}
+				 , #{delYn}
+				 , #{regNo}
+				 , NOW()
+				 , #{updNo}
+				 , NOW()
+				 )
+			ON
+			    DUPLICATE KEY 
+			UPDATE 
+			     CURR_BPRICE=#{currBprice}
+			   , CURR_APRICE=#{currAprice}
+			   , DC_BRATE=#{dcBrate}
+			   , DC_ARATE=#{dcArate}
+			   , PNT_BPRATE=#{pntBprate} 
+			   , PNT_APRATE=#{pntAprate} 
+			   , PNT_BMRATE=#{pntBmrate} 
+			   , PNT_AMRATE=#{pntAmrate} 
+			   , DISP_ORD=#{dispOrd}
+			   , DEL_YN=#{delYn}
+			   , UPD_NO=#{updNo}
+			   , UPD_DT= NOW()
+					
+	</insert>
+	
+	<!-- 쇼셜 상품 목록 -->
+	<select id="getSocialGoodsList" parameterType="Social" resultType="Social">
+		/* TsaSocial.getSocialGoodsList */
+		SELECT SCGOODS_SQ    
+		     , SOCIAL_SQ     
+		     , GOODS_CD      
+		     , CURR_BPRICE   
+		     , CURR_APRICE   
+		     , DC_BRATE      
+		     , DC_ARATE      
+		     , PNT_BPRATE    
+		     , PNT_APRATE    
+		     , PNT_BMRATE    
+		     , PNT_AMRATE    
+		     , DISP_ORD      
+		     , DEL_YN        
+		FROM   TB_SOCIAL_GOODS
+		WHERE  SOCIAL_SQ = #{socialSq}
+		<if test="goodsCd != null and goodsCd != ''">
+		AND    GOODS_CD = #{goodsCd}
+		</if>
+		AND    DEL_YN = 'N'
+		ORDER  BY DISP_ORD
+	</select>
+	
+	<!-- 소셜 상품 삭제 -->
+	<update id="deleteSocialGoods" parameterType="Social">
+		/* TsaSocial.deleteSocialGoods */
+		UPDATE TB_SOCIAL_GOODS
+		SET    DEL_YN = #{delYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = now()
+		WHERE  SOCIAL_SQ = #{socialSq}
+		AND    SCGOODS_SQ = #{scgoodsSq}
+		AND    GOODS_CD = #{goodsCd}
+	</update>
+	
+	
+	
 	<sql id="getPlanListCondition_sql">
 		<if test ="siteCd != null and siteCd !=''">
 		AND    SITE_CD = #{siteCd}
@@ -105,11 +205,9 @@
 		<if test="frontGb != null and frontGb != ''">
 		AND    FRONT_GB = #{frontGb}
 		</if>
-		<if test="socialStdt != null and socialStdt != ''">
-		AND    DISP_EDDT <![CDATA[>=]]> DATE_FORMAT(#{socialStdt}, '%Y-%m-%d %H:%i:%S')
-		</if>
-		<if test="socialEddt != null and socialEddt != ''">
-		AND    DISP_STDT <![CDATA[<=]]> DATE_FORMAT(#{socialEddt}, '%Y-%m-%d %H:%i:%S')
+		<if test="stDate != null and stDate != '' and edDate != null and edDate != ''">
+        AND    SOCIAL_STDT <![CDATA[ >= ]]> DATE_FORMAT(#{stDate},'%Y-%m-%d %H:%i:%S')
+        AND    SOCIAL_STDT <![CDATA[ <= ]]> DATE_FORMAT(#{edDate},'%Y-%m-%d %H:%i:%S')
 		</if>
 	</sql>
 	

+ 127 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaWithdraw.xml

@@ -0,0 +1,127 @@
+<?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.TsaWithdrawDao">
+
+	<!-- 목록 페이징 정보 -->
+	<sql id="getListPagingCondition_sql">
+		<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>
+	</sql>
+	
+
+	<!-- 회수예외목록 건수 -->
+	<select id="getWithdrawExceptionListCount" parameterType="WithdrawExc" resultType="int">
+		/* TsaWithdraw.getWithdrawExceptionListCount */
+		SELECT COUNT(*) AS TOTCNT
+		  FROM (		
+				SELECT 
+					  A.RECALL_STAT   -- 반품대기처리상태
+					, A.STATUS_CD     -- 처리상태
+					, A.RECALL_EXCEPTION_NO -- 반품예외처리번호 
+				  FROM TB_ORDER_RECALL_EXCEPTION A 
+				  JOIN TB_ORDER_RECALL_EXCEPTION_ITEM B ON A.RECALL_EXCEPTION_NO = B.RECALL_EXCEPTION_NO
+				  WHERE B.REASON_CD NOT IN('확정 전 품절(재고없음)','확정 전 불량')
+					<if test='customerName != null and customerName != ""'>
+					AND   A.CUSTOMER_NAME = #{customerName}
+					</if>
+					<if test='orderNo != null and orderNo != ""'>
+					AND   A.ORDER_NO  = #{orderNo}
+					</if>
+					<if test='recallStat != null and recallStat != ""'>
+					AND   A.RECALL_STAT  = #{recallStat}
+					</if>
+					<if test='stDate != null and stDate != ""'>
+					AND   A.DATE_CREATED <![CDATA[>= ]]> STR_TO_DATE(REPLACE(#{stDate},'-',''), '%Y%m%d%H%i%s') 
+					</if>
+					<if test='edDate != null and edDate != ""'>
+					AND   A.DATE_CREATED <![CDATA[<]]> STR_TO_DATE(REPLACE(#{edDate},'-','') + 1 , '%Y%m%d%H%i%s') 
+					</if>
+			) A
+
+	</select>
+		
+	<!-- 회수예외목록 -->
+	<select id="getWithdrawExceptionList" parameterType="WithdrawExc" resultType="WithdrawExc">
+		/* TsaWithdraw.getWithdrawExceptionList */
+		SELECT Z.*
+			, ROW_NUMBER() OVER W AS ROWSPAN_CNT
+	        , ROW_NUMBER() OVER T AS ROWSPAN_RANK
+		FROM (
+		    SELECT A.*, @rownum := @rownum + 1  RNUM 
+		    FROM (
+				SELECT A.* 
+				  FROM (
+						SELECT 
+							  A.RECALL_STAT   -- 반품대기처리상태
+							, A.STATUS_CD     -- 처리상태
+							, A.DATE_CREATED  -- 등록일자
+							, A.CUSTOMER_NAME -- 고객명
+							, A.ORDER_NO      -- 주문번호
+							, B.ORDER_DTL_NO  -- 주문상세번호 
+							, A.LOGISTICS_NAME -- 택배사명
+							, A.INVOICE_NO     -- 반송장번호
+							, A.CHARGE_TYPE    -- 요금구분
+							, A.CHARGE_AMOUNT  -- 배송비
+							, A.USER_NAME_CREATED -- 작업자
+							, B.REASON_CD -- 예외사유
+							, IFNULL((SELECT GROUP_CONCAT(ADMIN_MEMO ORDER BY RECALL_EXCEPTION_MEMO_NO ) 
+							     FROM TB_ORDER_RECALL_EXCEPTION_MEMO C WHERE C.RECALL_EXCEPTION_NO = A.RECALL_EXCEPTION_NO  AND ADMIN_MEMO !='.'),'-') AS ADMIN_MEMO -- WMS메시지
+							, IFNULL((SELECT BRAND_KNM FROM TB_BRAND BR JOIN TB_GOODS GD ON BR.BRAND_CD = GD.BRAND_CD WHERE GD.GOODS_CD = C.GOODS_CD),'') AS BRAND_NM           -- 브랜드명
+							, B.PRODUCT_CODE   -- 상품코드
+							, B.SKU_CODE       -- SKU코드
+							, B.PRODUCT_NAME   -- 상품명
+							, B.SKU_VALUE      -- 속성
+							, C.SKU_MODEL_NO   -- 원코드
+							, B.EXCEPTION_QTY  -- 수량
+							, O.SITE_CD        -- 주문경로
+							, A.RECALL_EXCEPTION_NO -- 반품예외처리번호 
+							, IFNULL(C.GOODS_CD,'') AS GOODS_CD       -- 상품코드 
+							, B.RECALL_EXCEPTION_ITEM_NO 
+						  FROM TB_ORDER_RECALL_EXCEPTION A 
+						  JOIN TB_ORDER_RECALL_EXCEPTION_ITEM B ON A.RECALL_EXCEPTION_NO = B.RECALL_EXCEPTION_NO
+						  LEFT JOIN TB_ORDER O ON O.ORD_NO = A.ORDER_NO 
+						  LEFT JOIN TB_OPTION C ON C.OPT_CD = B.SKU_CODE
+						  WHERE B.REASON_CD NOT IN('확정 전 품절(재고없음)','확정 전 불량')
+							<if test='customerName != null and customerName != ""'>
+							AND   A.CUSTOMER_NAME = #{customerName}
+							</if>
+							<if test='orderNo != null and orderNo != ""'>
+							AND   A.ORDER_NO  = #{orderNo}
+							</if>
+							<if test='recallStat != null and recallStat != ""'>
+							AND   A.RECALL_STAT  = #{recallStat}
+							</if>
+							<if test='stDate != null and stDate != ""'>
+							AND   A.DATE_CREATED <![CDATA[>= ]]> STR_TO_DATE(REPLACE(#{stDate},'-',''), '%Y%m%d%H%i%s') 
+							</if>
+							<if test='edDate != null and edDate != ""'>
+							AND   A.DATE_CREATED <![CDATA[<]]> STR_TO_DATE(REPLACE(#{edDate},'-','')+ 1, '%Y%m%d%H%i%s')
+							</if>
+				) A
+				ORDER BY A.ORDER_NO, A.RECALL_EXCEPTION_NO, A.RECALL_EXCEPTION_ITEM_NO
+	<include refid="getListPagingCondition_sql"/>
+	      WINDOW W AS (PARTITION BY ORDER_NO ORDER BY ORDER_NO), T AS (PARTITION BY ORDER_NO ORDER BY ORDER_NO , RECALL_EXCEPTION_ITEM_NO DESC )
+	</select>
+
+
+	<!-- 회수예외 처리완료-->
+	<update id="updateWithdrawException" parameterType="WithdrawExc" >
+		/* TsaDelivery.deleteBangoods */
+		UPDATE TB_ORDER_RECALL_EXCEPTION SET
+		  RECALL_STAT = #{recallStat}
+		, RECALL_STAT_DT = NOW()
+		WHERE RECALL_EXCEPTION_NO = #{recallExceptionNo}
+
+	</update>
+
+</mapper>

+ 141 - 0
src/main/webapp/WEB-INF/views/business/AfChannelPopupForm.html

@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : AfChannelPopupForm.html
+ * @desc    : 제휴채널조회 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.04   sowon       최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="350" id="popupAfChannel">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong>제휴채널 조회</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupAfChannel');"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+		
+		<!-- 검색 조건 -->
+		<div class="panelContent" >
+				<form id="searchForm" name="searchForm" action="#" th:action="@{'/business/aflink/list'}" onsubmit="$('#btnAfSearch').trigger('click'); return false;">
+					<table class="frmStyle" aria-describedby="검색조건">
+						<colgroup>
+							<col style="width:10%;"/>
+							<col/>
+						</colgroup>
+						<tr>
+							<th>상위제휴채널</th>
+							<td>
+								<select name="afChannel">
+									<option value="">[전체]</option>
+									<option th:if="${afChannelList}" th:each="oneData, status : ${afChannelList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+								</select>
+							</td>
+						</tr>
+					</table>
+					
+					<ul class="panelBar">
+						<li class="center">
+							<button type="button" class="btn btn-base btn-lg" id="btnAfSearch">조회</button>
+							<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+						</li>
+					</ul>
+				</form>
+		<!-- //검색 조건 -->
+		
+		<!-- 리스트 영역 -->
+			<div id="gridAfList" style="width: 100%; height: 570px;" class="ag-theme-balham"></div>
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-info btn-lg" id="btnConfirmAfChannel">확인</button>
+				</li>
+			</ul>
+
+		</div>
+	</div>
+</div>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let afChannelList = gagajf.convertToArray([[${afChannelList}]]);
+	let useYnList = { "Y":"Yes", "N":"No" };
+	
+	let columnDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "제휴채널코드", field: "afLinkCd", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "제휴채널명", field: "afLinkNm", width: 180,
+			cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{
+			headerName: "상위제휴채널", field: "afChannel", width: 120, cellClass: 'text-center',
+			valueGetter: function (params) { return gagaAgGrid.lookupValue(afChannelList, params.data.afChannel); }
+		}
+	];
+	
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	
+	// 다중 선택
+	gridOptions.rowSelection = 'multiple';
+	
+	// 검색
+	$('#btnAfSearch').on('click', function() {
+		var actionUrl = $('#searchForm').prop('action') + '?' + $('#searchForm').serialize();
+
+		// Fetch data
+		gagaAgGrid.fetch(actionUrl, gridOptions, '#searchForm');
+	});
+	
+	
+	// 적용 버튼 클릭 시
+	$('#btnConfirmAfChannel').on('click', function() {
+		
+		var selectedData = gagaAgGrid.selectedRowData(gridOptions);
+		
+		if (selectedData.length < 1) {
+			mcxDialog.alert('선택 된 제휴채널이 없습니다.');
+			return
+		}
+	
+		var callbackFn = [[${params.callBackFun}]];
+		
+		var jsonData = JSON.stringify(selectedData);
+
+		console.log("jsonData:" + jsonData);
+		console.log("callbackFn:" + callbackFn);
+		if ( typeof callbackFn != 'undefined' && callbackFn) {
+
+			if (typeof callbackFn == 'function') {
+				callbackFn(jsonData);
+			} else {
+				if (callbackFn) {
+					if ( callbackFn.indexOf("(") == -1 ) eval( callbackFn +"(" + jsonData+")");
+					else eval( callbackFn(jsonData) );
+				}
+			}
+			uifnPopupClose('popupAfChannel');
+		}  
+	});
+	
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridAfList', gridOptions);
+	});
+	/*]]>*/
+
+</script>
+
+
+
+</html>

+ 1 - 1
src/main/webapp/WEB-INF/views/delivery/BangoodsListForm.html

@@ -264,7 +264,7 @@
 	 	});
 		
 		
-		mcxDialog.confirm("저장하시겠습니까?", {
+		mcxDialog.confirm("삭제하시겠습니까?", {
 		    cancelBtnText: "취소",
 		    sureBtnText: "확인",
 		    sureBtnClick: function() {

+ 63 - 0
src/main/webapp/WEB-INF/views/delivery/DeliveryDetailItemForm.html

@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : DeliveryDetailItemForm.html
+ * @desc    : 주문상세 단품 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.05   moon       최초 작성
+ *******************************************************************************
+ -->
+
+
+<div class="modalPopup" data-width="650" >
+	<div class="panelStyle">
+		<div class="panelTitle">
+			<h2>세트구성 상품정보</h2>
+			<button type="button" class="close" onclick="uifnPopupClose('popupDeliveryDetailItemForm')"><i class="fa fa-times"></i></button>
+		</div>
+				
+		<div class="panelContent" style="overflow-y:auto;">
+			<form id="DeliveryDetailItemFrm">
+				<div id="gridDelvDetailItemInfo" style="width:100%; height: 260px;" class="ag-theme-balham"></div>
+			</form>
+		</div>
+	</div>
+</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+
+var delvDetailItemList = [[${delvDetailItemList}]];
+
+	// specify the columns
+	var columnDefsDelvDetailItemInfo = [
+			{headerName: "상품코드",	field: "itemCd", 	width: 130, cellClass: 'text-center'},
+			{headerName: "상품명", 	field: "goodsNm", 	width: 200, cellClass: 'text-left'},
+			{headerName: "색상",  	field: "optCd1", 	width: 80, cellClass: 'text-center'},
+			{headerName: "사이즈", 	field: "optCd2", 	width: 80, cellClass: 'text-center'},
+			{headerName: "수량",  	field: "itemQty", 	width: 50, cellClass: 'text-center'},
+			{headerName: "단가", 		field: "itemPrice", width: 60, cellClass: 'text-right',
+				cellRenderer: function (params) {
+					return params.value.addComma();
+				}
+			},
+	];
+
+	$(document).ready(function() {
+		// Get GridOptions
+		var gridDelvDetailItemInfo = gagaAgGrid.getGridOptions(columnDefsDelvDetailItemInfo);
+		gagaAgGrid.createGrid('gridDelvDetailItemInfo', gridDelvDetailItemInfo);
+		gridDelvDetailItemInfo.api.setRowData(delvDetailItemList);
+		$('.ag-status-bar').hide();
+	});
+/*]]>*/
+</script>
+
+</html>

+ 308 - 0
src/main/webapp/WEB-INF/views/delivery/DeliveryExceptionListForm.html

@@ -0,0 +1,308 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : DeliveryExceptionListForm.html
+ * @desc    : 출고예외관리 Page
+ *=============================================================
+ * ISTYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *=============================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  ==================================
+ * 1.0  2021.02.19   moon        최초 작성
+ * 1.1  
+ ********************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		<!-- 검색조건 영역 -->
+		<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/deliveryExcpt/list'}" onsubmit="fnSearchList(); return false;">
+					<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="orderNm" 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="delYn" id="delYn">
+									<option value="">전체</option>
+									<option value="대기" selected>대기</option>
+									<option value="처리완료">처리완료</option>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<th class="dashR">등록일</th>
+							<td colspan="4" 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>
+				</form>
+				</div>
+		</div>
+		<!-- //검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!--  
+			<ul class=panelBar>
+				<li class="left">
+					<button type="button" id="btnSoldout" class="btn btn-danger btn-lg" onclick="deleteBangoods();" >삭제</button>
+				</li>
+				<li class="right">
+					<button type="button" id="btnSave" class="btn btn-success btn-lg btnRight" onclick="registerBangoods();">등록</button>
+				</li>
+			</ul>
+			 -->
+			<div class="panelContent" style="overflow: hidden;">
+				<div id="gridList" style="width:100%; height: 500px;" class="ag-theme-balham"></div>
+			</div>
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	/*************************************************************************
+	* AG-GRID 영역 
+	**************************************************************************/
+	
+	var uploadGoodsUrl = [[${@environment.getProperty('upload.goods.view')}]]; 
+	var roleCd = [[${sessionInfo.roleCd}]]; 
+
+	var columnDefs = [
+		/*
+		{ width: 42, minWidth: 42, cellClass: 'text-center', headerCheckboxSelection: true, headerCheckboxSelectionFilteredOnly: true
+			, checkboxSelection: function (params) {
+				return  (params.data.delYn == 'N' ) ? true : false;
+			}	
+		},
+		*/
+		{headerName: "반품예외처리번호",			field: "delvBanGoodsSq",width: 50,	cellClass: 'text-center', hide: true},
+		{headerName: "처리상태",				field: "delYn",			width: 150,	cellClass: 'text-center'},
+		{headerName: "등록일자",				field: "brandKnm",		width: 150,	cellClass: 'text-center'},
+		{headerName: "주문번호",				field: "delvLocNm",		width: 150,	cellClass: 'text-center'},
+		
+		{headerName: "주문자명",				field: "delvLocNm",		width: 150,	cellClass: 'text-center'},
+		{headerName: "택배사명",				field: "delvLocNm",		width: 150,	cellClass: 'text-center'},
+		{headerName: "반송장번호",				field: "delvLocNm",		width: 150,	cellClass: 'text-center'},
+		{headerName: "요금구분",				field: "delvLocNm",		width: 150,	cellClass: 'text-center'},
+		{headerName: "배송비",				field: "delvLocNm",		width: 150,	cellClass: 'text-center'},
+		{headerName: "작업자",				field: "delvLocNm",		width: 150,	cellClass: 'text-center'},
+		{headerName: "예외사유",				field: "delvLocNm",		width: 150,	cellClass: 'text-center'},
+		{headerName: "WMS메시지",				field: "delvLocNm",		width: 150,	cellClass: 'text-center'},
+		{headerName: "브랜드명",				field: "delvLocNm",		width: 150,	cellClass: 'text-center'},
+		{headerName: "상품코드",				field: "delvLocNm",		width: 150,	cellClass: 'text-center'},
+		{headerName: "SKU코드",				field: "delvLocNm",		width: 150,	cellClass: 'text-center'},
+		
+		
+		
+		{headerName: "상품명",				field: "goodsNm",		width: 150,	cellClass: 'text-center'},
+		{
+			headerName: "상품코드", field: "goodsCd", width: 130, cellClass: 'text-center', sortable: true,
+			cellRenderer: function (params) {
+				
+				if (roleCd.indexOf("C") < 0) {
+					return "<a href=\"javascript:void(0);\" onclick=\"cfnOpenGoodsDetailPopup('U','" + params.value + "');\">" + params.value + "</a>";
+				} else {
+					return params.value;
+				}
+			}
+		},
+		{headerName: "속성",		    field: "colorCd",		width: 80,	cellClass: 'text-center'},
+		{headerName: "원코드",		field: "sizeCd",		width: 80,	cellClass: 'text-center'},
+		{headerName: "수량",		field: "goodsStat",		width: 80,	cellClass: 'text-center'},
+		{headerName: "주문경로",	field: "delvBanStdt",	width: 150,	cellClass: 'text-center'}
+		
+	];
+
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	gridOptions.rowSelection = 'multiple';
+	
+	//gridOptions.rowHeight = 60;
+	/*************************************************************************
+	*  조회 버튼 클릭 시
+	**************************************************************************/
+	$('#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;
+		}
+
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm', function() {
+		});
+	}
+
+	/*************************************************************************
+	*  달력 초기화 
+	**************************************************************************/		
+	var fnInitCalendar = function() {
+		cfnChangeCalendar('1d', $('#stDate'), $('#edDate')); //달력 초기화
+	}
+
+	/*************************************************************************
+	*  업체 콤보박스 변경 시
+	**************************************************************************/	
+	$('#searchForm select[name=supplyCompCd]').on('change', function() {
+		var actionUrl = '/renderer/supplyCompany/brand/list/'+ $(this).val();
+		cfnCreateCombo(actionUrl, $('#searchForm select[name=brandCd]'), "[전체]");
+	});
+
+	/*************************************************************************
+	*  엑셀다운로드
+	**************************************************************************/		
+	$('#btnExcel').on('click', function() {
+		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 deleteBangoods = function(){
+		
+		var selectedData = gridOptions.api.getSelectedNodes();
+		
+		$.each(selectedData, function(idx, row) {
+	
+	 		if(row.data.delYn == "Y") {
+	 			gridOptions.api.deselectIndex(row.rowIndex);
+	 		}
+	 	});
+		
+		
+		mcxDialog.confirm("삭제하시겠습니까?", {
+		    cancelBtnText: "취소",
+		    sureBtnText: "확인",
+		    sureBtnClick: function() {
+
+	            var gridData = gagaAgGrid.removeRowData(gridOptions,false);
+
+	            if (gridData.length == 0) {
+	            	mcxDialog.alert('선택된 행이 없습니다.');
+	                return;
+	            }
+
+	            var createData = [];
+	            $.each(gridData, function(idx, item) {
+	                var param = new Object;
+
+	                param.delvBanGoodsSq = item.delvBanGoodsSq;
+	                param.goodsCd = item.goodsCd;
+	                param.colorCd = item.colorCd;
+	                param.sizeCd = item.sizeCd;
+
+	                createData.push(param);
+	            });
+
+	            var jsonData = JSON.stringify(createData);
+	            gagajf.ajaxJsonSubmit('/delivery/bangoods/delete', jsonData, fnSearchList);
+	        }
+		});
+	}
+
+	/*************************************************************************
+	*  등록 팝업 호출 
+	**************************************************************************/	
+	var registerBangoods = function(){
+		var actionUrl = "/delivery/bangoods/regist/form";
+		cfnOpenModalPopup(actionUrl,'popupRegistBangoods');
+	}
+
+	$(document).ready(function() {
+		gagaAgGrid.createGrid('gridList', gridOptions);
+		cfnCreateCalendar('#terms', 'stDate', 'edDate', true, '출고금지상품관리');
+		//var hideList = ["btnThisWeek", "btnYesterWeek", "btnRecentMonth", "btnThisMonth", "btnYesterMonth", "btnRecent3Month"];
+		//cfnCreateCalendar('#terms', 'stDate', 'edDate', true, '출고금지상품관리', '', hideList);
+		fnInitCalendar();
+	});
+
+/*]]>*/
+</script>
+</html>

+ 135 - 138
src/main/webapp/WEB-INF/views/delivery/DeliveryListForm.html

@@ -25,7 +25,7 @@
 	</div>
 	<!-- //메뉴 설명 -->
 	<!-- 검색조건 영역 -->
-
+	<form id="searchForm" name="searchForm" action="#" th:action="@{'/delivery/list/'}" onsubmit="fnSearchList(); return false;">
 	<div class="panelStyle">
 		<!-- TITLE -->
 		<div class="panelTitle">
@@ -36,7 +36,7 @@
 		</div>
 		<!-- //TITLE -->
 		<div class="panelContent">	
-			<form id="searchForm" name="searchForm" action="#" th:action="@{'/delivery/list/'}" onsubmit="fnSearchList(); return false;">
+			
 				<table class="frmStyle">
 					<colgroup>
 						<col style="width:8%;"/>
@@ -47,8 +47,7 @@
 						<col style="width:12%;"/>
 						<col style="width:8%;"/>
 						<col style="width:12%;"/>
-						<col style="width:8%;"/>
-						<col style="width:12%;"/>
+
 					</colgroup>
 					<tr>
 						<th>사이트</th>
@@ -59,34 +58,34 @@
 							</select>
 						</td>
 						<th>몰구분</th>
-						<td colspan="3">
+						<td>
 							<select name="mallGb" style="width: 100px;">
-								<option value="" th:if="${sessionInfo.roleCd} != 'B000' and ${sessionInfo.roleCd} != 'C000'">[전체]</option>
-								<option th:if="${mallGbList}" th:each="oneData, status : ${mallGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+								<option value="" th:if="${sessionInfo.roleCd} != 'G001_B000' and ${sessionInfo.roleCd} != 'G001_C000'">[전체]</option>
+								<option th:if="${mallGbList}" th:each="oneData, status : ${mallGbList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
 							</select>
-							<span id="selfmall">
-								<select name="supplyCompCd">
-									<option value="" th:if="${sessionInfo.roleCd} != 'B000' and ${sessionInfo.roleCd} != 'C000'">[전체]</option>
-									<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-								</select>
-							</span>
-							<span id="extmallVendor">
-								<select name="vendorId">
-									<option value="" th:if="${sessionInfo.roleCd} != 'B000' and ${sessionInfo.roleCd} != 'C000'">[전체]</option>
-									<option th:if="${vendorList}" th:each="oneData, status : ${vendorList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-								</select>
-								<select name="extmallId" style="width: 150px;">
-									<option value="">[전체]</option>
-								</select>
-							</span>
 						</td>
-						<th>프론트구분</th>
-						<td colspan="3">
-							<select class="w130" name="frontGb" id="frontGb">
-								<option value="">[전체]</option>
-								<option value="P">PC</option>
-								<option value="M">Mobile</option>
+
+						<th>업체<em class="required" title="필수"></em></th>
+						<td>
+							<input type="text" class="w100" name="supplyCompSearchTxt" id="supplyCompSearchTxt" maxlength="20" />
+							<button type="button" class="btn icn" id="btnSearchSupplyComp"><i class="fa fa-search"></i></button>
+							<span id="supplyCompText"></span>
+							<input type="hidden" name="supplyCompList"/>
+							<!-- <label class="rdoBtn"><input type="radio" name="selfYn" id="selfYnY" value="Y"  checked/>자사</label>
+							<label class="rdoBtn"><input type="radio" name="selfYn" id="selfYnN" value="N"/>입점</label>
+							<select name="supplyCompCd" id="supplyCompCd">
+								<option value="" th:if="${sessionInfo.roleCd} != 'G001_B000'">[전체]</option>
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
+							<span id="multiBrand"></span> -->
+						</td>
+						<th>브랜드<em class="required" title="필수"></em></th>
+						<td>
+							<input type="text" class="w100" name="searchTxt" id="searchTxt" maxlength="20" />
+							<button type="button" class="btn icn" id="btnSearchBrand"><i class="fa fa-search"></i></button>
+							<!-- <input type="text" class="w100" name="brandCd" readonly="readonly"/> -->
+							<span id="brandText"></span>
+							<input type="hidden" name="brandList"/>
 						</td>
 					</tr>
 					<tr>
@@ -130,7 +129,7 @@
 						<td>
 							<select class="w150" name="delvLocClsf" id="delvLocClsf">
 								<option value="">[전체]</option>
-								<option th:if="${delvTypeList}" th:each="oneData, status : ${delvTypeList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+								<option th:if="${delvTypeList}" th:each="oneData, status : ${delvTypeList}" th:value="${oneData.cd}" th:text="| ${oneData.cdNm}|"></option>
 							</select>
 						</td>
 						<th>출고처</th>
@@ -188,7 +187,7 @@
 					<button type="button" id="btnExcel" class="btn btn-info btn-lg">엑셀다운로드</button>
 					</li>
 				</ul>
-			</form>
+			
 		</div>
 	</div>
 	<!-- //검색조건 영역 -->
@@ -201,19 +200,37 @@
 				<!-- <button type="button" id="btnSave" class="btn btn-success btn-lg btnRight" onclick="deliveryInfoSave();">저장</button>
 				<button type="button" id="btnWith" class="btn btn-success btn-lg btnRight">T</button> -->
 			</li>
+			<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="50" selected="selected">50개씩 보기</option>
+					<option value="100">100개씩 보기</option>
+					<option value="500">500개씩 보기</option>
+					<option value="1000">1000개씩 보기</option>
+				</select>
+				<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
+			</li>
+		</ul>
+
+		<div id="gridDeliveryList" style="width:100%; height: 700px;" class="ag-theme-balham"></div>
+		<ul class="panelBar">
+			<li class="center">
+				<div class="tablePaging" id="deliveryListPagination"></div>
+			</li>
 		</ul>
-		<div class="panelContent" style="overflow: hidden;">
-			<div id="gridDeliveryList" style="width:100%; height: 700px;" class="ag-theme-balham"></div>
-		</div>
 	</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 shipCompanyList =  gagajf.convertToArray([[${shipCompanyList}]]);
-
+	var roleCd = [[${sessionInfo.roleCd}]];
 	var columnDefs = [
 		{
 			headerName: "결품",
@@ -224,15 +241,13 @@
 			headerCheckboxSelectionFilteredOnly: true
 			,
 			checkboxSelection: function (params) {
-				return (params.data.ordDtlStat == '20' || params.data.ordDtlStat == '25' || params.data.ordDtlStat == '30' || params.data.ordDtlStat == '34') ? true : false;
+				return (params.data.ordDtlStat == 'G013_20' || params.data.ordDtlStat == 'G013_25') ? true : false;
 			}
 		},
 		{headerName: "지연일", field: "delvDelayDays", width: 85, cellClass: 'text-center'},
-		{
-			headerName: "주문번호", field: "ordNo", width: 95, cellClass: 'text-center',
+		{headerName: "주문번호", field: "ordNo", width: 95, cellClass: 'text-center',
 			cellRenderer: function (params) {
-				var roleCd = [[${sessionInfo.roleCd}]];
-				if (!roleCd.startsWith("C")) {
+				if (roleCd.indexOf("C") < 0) {
 					return "<a href=\"javascript:void(0);\" onclick=\"cfnOpenOrderDetailPopup('" + params.value + "');\">" + params.value + "</a>";
 				} else {
 					return params.value;
@@ -243,24 +258,20 @@
 		{headerName: "사이트", field: "siteNm", width: 120, cellClass: 'text-center'},
 		{headerName: "판매몰", field: "sellStoreNm", width: 150, cellClass: 'text-left'},
 		{headerName: "판매몰명", field: "extmallNm", width: 150, cellClass: 'text-left'},
-		{
-			headerName: "주문일시", field: "ordDt", width: 150, cellClass: 'text-center',
+		{headerName: "주문일시", field: "ordDt", width: 150, cellClass: 'text-center',
 			cellRenderer: function (params) {
 				return !gagajf.isNull(params.value) ? gagaAgGrid.toDateTimeFormat(params.value) : '';
 			}
 		},
-		{
-			headerName: "결제일시", field: "ordDt", width: 150, cellClass: 'text-center',
+		{headerName: "결제일시", field: "ordDt", width: 150, cellClass: 'text-center',
 			cellRenderer: function (params) {
 				return !gagajf.isNull(params.value) ? gagaAgGrid.toDateTimeFormat(params.value) : '';
 			}
 		},
 		{headerName: "몰구분", field: "mallGbNm", width: 70, cellClass: 'text-center'},
-		{
-			headerName: "주문자", field: "orderNm", width: 100, cellClass: 'text-center',
+		{headerName: "주문자", field: "orderNm", width: 100, cellClass: 'text-center',
 			cellRenderer: function (params) {
-				var roleCd = [[${sessionInfo.roleCd}]];
-				if (!roleCd.startsWith("C") && !gagajf.isNull(params.value) && params.data.mallGb === '10') {
+				if (roleCd.indexOf("C") < 0 && !gagajf.isNull(params.value) && params.data.mallGb === 'G011_10') {
 					return '<a href="javascript:void(0);" onclick=\"cfnOpenCustDetailPopup(' + params.data.custNo + ');\">' + params.data.orderNm + '</a>';
 				} else {
 					return params.data.orderNm;
@@ -269,31 +280,38 @@
 		},
 		{headerName: "수령인", field: "recipNm", width: 100, cellClass: 'text-center'},
 		{headerName: "공급업체", field: "supplyCompNm", width: 150, cellClass: 'text-center'},
-		{
-			headerName: "상품코드", field: "goodsCd", width: 120, cellClass: 'text-center',
+		{headerName: "상품코드", field: "goodsCd", width: 120, cellClass: 'text-center',
 			cellRenderer: function (params) {
-				var roleCd = [[${sessionInfo.roleCd}]];
-				if (!roleCd.startsWith("C")) {
+				if (roleCd.indexOf("C") < 0) {
 					return "<a href=\"javascript:void(0);\" onclick=\"cfnOpenGoodsDetailPopup('U','" + params.value + "');\">" + params.value + "</a>";
 				} else {
 					return params.value;
 				}
 			}
 		},
+		{headerName: "구성유형", field: "goodsTypeNm", width: 130, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				var option;
+				if (params.data.goodsType == 'G056_S') {
+					option = "<a href=\"javascript:void(0);\" onclick=\"fnOrderDetailItemForm('" + params.data.ordDtlNo + "');\">" + params.value + "</a>";
+				} else {
+					option = params.value
+				}
+				return option;
+			}
+		},
 		{headerName: "상품명", field: "goodsNm", width: 280, cellClass: 'text-left'},
 		{headerName: "색상", field: "colorKnm", width: 120, cellClass: 'text-center'},
 		{headerName: "사이즈", field: "sizeCd", width: 70, cellClass: 'text-center'},
 		{headerName: "주문수량", field: "ordQty", width: 80, cellClass: 'text-center'},
 		{headerName: "취소수량", field: "cnclRtnQty", width: 80, cellClass: 'text-center'},
 		{headerName: "판매수량", field: "saleQty", width: 80, cellClass: 'text-center'},
-		{
-			headerName: "판매금액", field: "saleAmt", width: 100, cellClass: 'text-center'
+		{headerName: "판매금액", field: "saleAmt", width: 100, cellClass: 'text-center'
 			, valueFormatter: function (params) {
 				return params.value.addComma();
 			}
 		},
-		{
-			headerName: "실결제금액", field: "realOrdAmt", width: 100, cellClass: 'text-center'
+		{headerName: "실결제금액", field: "realOrdAmt", width: 100, cellClass: 'text-center'
 			, valueFormatter: function (params) {
 				return params.value.addComma();
 			}
@@ -302,15 +320,14 @@
 		{headerName: "출고처", field: "delvLocCd", width: 100, cellClass: 'text-center'},
 		{headerName: "출고처명", field: "delvLocNm", width: 100, cellClass: 'text-center'},
 		{headerName: "쇼핑백", field: "sbagEncloseYn", width: 80, cellClass: 'text-center'},
-		{
-			headerName: "출고택배사", field: "shipCompCd", width: 170, cellClass: 'text-center'
+		{headerName: "출고택배사", field: "shipCompCd", width: 170, cellClass: 'text-center'
 			, valueGetter: function (params) { return gagaAgGrid.lookupValue(shipCompanyList, params.data.shipCompCd); }
 		},
 		{headerName: "출고송장", field: "invoiceNo", width: 150, cellClass: 'text-left'},
 		{headerName: "송장등록수정", field: "invoiceNo", width: 120, cellClass: 'text-center'
 			, cellRenderer : function (params) {
 				var buttonTag = '';
-				if (Number(params.data.ordDtlStat) >= 20 && Number(params.data.ordDtlStat) <= 50 ) {
+				if (params.data.ordDtlStat === 'G013_30' || params.data.ordDtlStat === 'G013_40' || params.data.ordDtlStat === 'G013_50' || params.data.ordDtlStat === 'G013_55') {
 					buttonTag = '<button type="button"class="btn btn-success" onClick="fnSaveInvoiceNo('+params.data.ordDtlNo+');">송장등록수정</button>';
 				}
 				return buttonTag;
@@ -319,7 +336,7 @@
 		{headerName: "배송완료처리", field: "ordDtlStat", width: 120, cellClass: 'text-center'
 			, cellRenderer: function(params) {
 				var buttonTag = '';
-				if (params.data.ordDtlStat === '40' || params.data.ordDtlStat === '50' || params.data.ordDtlStat === '55' ) {
+				if (params.data.ordDtlStat === 'G013_50' || params.data.ordDtlStat === 'G013_55'  ) {
 					buttonTag = '<button type="button"class="btn btn-success" onClick="deliveryComplete('+params.data.ordDtlStat+', '+params.data.ordNo+', '+params.data.ordDtlNo+');">배송완료</button>';
 				}
 				return buttonTag;
@@ -340,9 +357,9 @@
 	//gridOptions.defaultColDef.editable = true;
 
 	gridOptions.suppressRowClickSelection = true;
-	gridOptions.rowSelection = 'multiple';
+	//gridOptions.rowSelection = 'multiple';
 	gridOptions.isRowSelectable = function(rowNode) {
-		return rowNode.data.ordDtlStat == '20' || rowNode.data.ordDtlStat == '25' || rowNode.data.ordDtlStat == '30' || rowNode.data.ordDtlStat == '34' || rowNode.data.ordDtlStat == '35';
+		return rowNode.data.ordDtlStat == 'G013_20' || rowNode.data.ordDtlStat == 'G013_25';
 	}
 	gridOptions.getRowStyle = function (params) {
 		if (params.data.ordExchGb === 'Y') {
@@ -353,13 +370,19 @@
 	var fnInitCalendar = function () {
 		$(".btnToday").trigger('click');
 	}
-
-	// 조회
+	
+	/*************************************************************************
+	* 조회 클릭
+	**************************************************************************/
 	$('#btnSearch').on('click', function () {
 		fnSearchList();
 	});
 
+	/*************************************************************************
+	* 조회 
+	**************************************************************************/	
 	var fnSearchList = function () {
+	
 		if ($('#searchForm input[name=ordNo]').val() == '') {
 			if ($('#stDate').val() == '') {
 				mcxDialog.alert('시작 기간을 입력하세요.');
@@ -372,19 +395,44 @@
 			}
 		}
 
-		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm', function () {
-		});
+		gagaPaging.init('searchForm', fnSearchCallBack, 'deliveryListPagination', $('#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.deliveryList);
+		gagaPaging.createPagination(result.pageing.pageable);
+		
+	}
+	
+
+	/*************************************************************************
+	* 구성상품 내역 팝업 호출 
+	**************************************************************************/	
+	var fnOrderDetailItemForm = function (ordDtlNo) {
+		var actionUrl = "/delivery/detail/item/form/" + ordDtlNo;
+		cfnOpenModalPopup(actionUrl, 'popupDeliveryDetailItemForm');
+	}
+	
+	
+	/*************************************************************************
+	* 엑셀다운로드 
+	**************************************************************************/		
 	$('#btnExcel').on('click', function () {
 		var totalRows = gridOptions.api.getDisplayedRowCount();
 		if (totalRows == 0) {
 			mcxDialog.alert('조회된 내역이 없습니다.');
 			return;
 		}
-
-
 		var date = new Date().format("YYYYMMDDHHmmss");
 		var params = {
 
@@ -404,11 +452,13 @@
 				dataType: 'string'
 			}
 		]
-
 		gridOptions.api.exportDataAsExcel(params);
 	});
 
-	// 결품처리 버튼 클릭 시
+
+	/*************************************************************************
+	* 품절처리
+	**************************************************************************/		
 	$('#btnSoldout').on('click', function () {
 		var removedData = gagaAgGrid.removeRowData(gridOptions);
 
@@ -440,7 +490,10 @@
 		});
 	});
 
-	// 배송완료처리
+	
+	/*************************************************************************
+	* 배송완료처리 -수동
+	**************************************************************************/		
 	var deliveryComplete = function (orgOrdDtlStat, ordNo, ordDtlNo) {
 		mcxDialog.confirm('배송완료 처리를 하시겠습니까?', {
 			cancelBtnText: "취소",
@@ -458,79 +511,23 @@
 
 	}
 
-	// 송장변경 팝업
+
+	/*************************************************************************
+	* 송장변경 팝업호출
+	**************************************************************************/			
 	var fnSaveInvoiceNo = function (ordDtlNo) {
-		var actionUrl = "/delivery/save/invoice/form?ordDtlNo=" + ordDtlNo ;
-		cfnOpenModalPopup(actionUrl, 'popupSaveInvoice');
+		var actionUrl = "/delivery/save/invoice/form/" + ordDtlNo ;
+		cfnOpenModalPopup(actionUrl, 'popupChangeInvoice');
 	};
 
-
-	// 배송정보 저장
-	var deliveryInfoSave = function () {
-
-		var changeData = gagaAgGrid.getChangedData(gridOptions);
-
-		if (changeData.length < 1) {
-			mcxDialog.alert('변경 된 데이터가 없습니다.');
-			return;
-		}
-
-		mcxDialog.confirm('저장 하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function () {
-				var updatedData = [];
-
-				$.each(changeData, function (idx, item) {
-					var param = new Object;
-					param.shipCompCd = item.shipCompCd;
-					param.invoiceNo = item.invoiceNo;
-					param.ordDtlNo = item.ordDtlNo;
-
-					updatedData.push(param);
-				});
-
-				var jsonData = JSON.stringify(updatedData);
-				gagajf.ajaxJsonSubmit('/delivery/orderDetail/save', jsonData, fnSearchList);
-			}
-		});
-	}
-
-
-	// 벤더 콤보박스 변경 시
-	$('#searchForm select[name=vendorId]').on('change', function () {
-		var actionUrl = '/renderer/vendor/extmall/list/' + $(this).val();
-		cfnCreateCombo(actionUrl, $('#searchForm select[name=extmallId]'), "[전체]");
-	});
-
-
-	// 몰구분 콤보박스 변경 시
-	$('#searchForm select[name=mallGb]').on('change', function () {
-		if ($(this).val() == '10') { // 자사몰
-			$('#extmallVendor').hide();
-			$('#selfmall').show();
-			$('#searchForm select[name=vendorId]').val('');
-			$('#searchForm select[name=extmallId]').val('');
-		} else if ($(this).val() == '20') { // 외부몰
-			$('#selfmall').hide();
-			$('#extmallVendor').show();
-			$('#searchForm select[name=supplyCompCd]').val('');
-		} else {
-			$('#selfmall').hide();
-			$('#extmallVendor').hide();
-			$('#searchForm select[name=vendorId]').val('');
-			$('#searchForm select[name=supplyCompCd]').val('');
-			$('#searchForm select[name=extmallId]').val('');
-		}
-	});
-
+	/*************************************************************************
+	* init
+	**************************************************************************/	
 	$(document).ready(function () {
 		gagaAgGrid.createGrid('gridDeliveryList', gridOptions);
 		var hideList = ["btnThisWeek", "btnYesterWeek", "btnRecentMonth", "btnThisMonth", "btnYesterMonth", "btnRecent3Month"];
 		cfnCreateCalendar('#terms', 'stDate', 'edDate', true, '주문', '', hideList);
 		$(".btnToday").trigger('click');
-		$('#extmallVendor').hide();
-		$('#selfmall').hide();
 		$('#searchForm select[name=mallGb]').trigger('change');
 		//uifnFitGrid('auto'); // TO-BE 지워야됨  
 	});

+ 109 - 0
src/main/webapp/WEB-INF/views/delivery/SaveInvoiceForm.html

@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : SaveInvoiceForm.html
+ * @desc    : 송장등록/수정 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.06   moon       최초 작성
+ *******************************************************************************
+ -->
+
+
+<div class="modalPopup" data-width="900" >
+	<div class="panelStyle">
+		<div class="panelTitle">
+			<h2>배송정보</h2>
+			<button type="button" class="close" onclick="uifnPopupClose('popupChangeInvoice')"><i class="fa fa-times"></i></button>
+		</div>
+		<div class="panelContent" style="overflow-y:auto;">
+		<form id="saveInvoiceForm">
+			<table class="frmStyle">
+				<colgroup>
+					<col style="width:160px;" />
+					<col />
+					<col />
+					<col />
+					<col />
+					<col />
+					<col />
+				</colgroup>
+				<tbody>
+				<tr>
+					<th>배송업체</th>
+					<th:block th:if="${shipCompanyList}">
+						<td>
+							<select name="shipCompany">
+								<option value="">[선택하세요]</option>
+								<option th:if="${shipCompanyList}" th:each="oneData, status : ${shipCompanyList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}" th:selected="${oneData.cd == ordDelivery.shipCompCd}"></option>
+							</select>
+						</td>
+						<th>송장번호</th>
+						<td><input type="text" name="invoiceNo" th:value="${#strings.defaultString(ordDelivery.invoiceNo,'')}" data-valid-type="numeric" ></td>
+					</th:block>
+					<td>
+						<button type="button" class="btn btn-success" id="saveAccountBtn" onclick="fnSaveAccount();">저장</button>
+					</td>
+				</tbody>
+			</table>
+		</form>
+		</div>
+	</div>
+</div>
+
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+/* 이벤트 바인딩 관련 */
+	var ordDtlNo = [[${ordDelivery.ordDtlNo}]];
+	var ordDtlStat = [[${ordDelivery.ordDtlStat}]];
+
+	/* 환불계좌번호 저장 */
+	var fnSaveAccount = function(){
+		var shipCompCd = $("#saveInvoiceForm select[name=shipCompany]").val();
+		var invoiceNo = $("#saveInvoiceForm input[name=invoiceNo]").val();
+
+
+		if(gagajf.isNull(shipCompCd)) {
+			mcxDialog.alert('택배사 선택을 해주세요.');
+			return;
+		}
+
+		if(gagajf.isNull(invoiceNo)) {
+			mcxDialog.alert('송장번호를 입력해 주세요.');
+			return;
+		}
+
+
+		mcxDialog.confirm('송장등록/수정된 내용은 물류시스템에 전송되지 않습니다. <br> 저장 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+					var param = {};
+					param.shipCompCd = shipCompCd;
+					param.invoiceNo  = invoiceNo;
+					param.ordDtlNo   = ordDtlNo;
+
+				var jsonData = JSON.stringify([param]);
+				gagajf.ajaxJsonSubmit('/delivery/orderDetail/save', jsonData, function (result) {
+					uifnPopupClose('popupChangeInvoice');
+				});
+			}
+		});
+	};
+
+	$(document).ready(function() {
+
+
+	});
+
+/*]]>*/
+</script>
+
+</html>

+ 206 - 0
src/main/webapp/WEB-INF/views/display/LookbookBannerPopupForm.html

@@ -0,0 +1,206 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : LookbookBannerPopupForm.html
+ * @desc    : 룩북 배너 등록/수정 상세 팝업
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.05   bin2107     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1400" data-height="750">
+	<div class="panelStyle" >
+		<form id="lbBannerForm" name="lbBannerForm" action="#" th:action="@{'/display/lookbook/save'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+			<input type="hidden" id="siteCd" name="siteCd" value="G00_10"/>
+			<input type="hidden" id="lookbookSq" name="lookbookSq" th:value="${lookbookSq}"/>
+			<div class="panelTitle">
+				<h2 th:text="${'룩북 ' + (mode == 'N' ? '등록1' : '상세')}"></h2>
+				<button type="button" class="close" onclick="uifnPopupClose('popupLookbookBanner');"><i class="fa fa-times"></i></button>
+			</div>
+			<div>
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+					</colgroup>
+					<tbody>
+					<tr>
+						<th>타이틀<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w400" name="title" required="required" data-valid-name="타이틀">
+						</td>
+						<th>브랜드<i class="required" title="필수"></i></th>
+						<td>
+							<select name="brandCd">
+								<option value="">[선택]</option>
+								<option th:if="${brandGroupList}" th:each="oneData, status : ${brandGroupList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>노출기간<i class="required" title="필수"></i></th>
+						<td id="sellTerms2">
+							<span class="nowrap">
+								<input name="lbDispStdt" id="lbStDate" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="노출기간 시작일" />
+								<select id="lbStTimeHour" required="required" data-valid-name="노출기간 시작시간">
+									<th:block th:each="num, index  : ${#numbers.sequence(0,23)}">
+										<option  th:value="${#numbers.formatInteger(num,2)}" th:text="|${#numbers.formatInteger(num,2)}시|" >시간</option>
+									</th:block>
+								</select>
+								<select id="lbStTimeMin" required="required" data-valid-name="노출기간 시작시간">
+									<th:block th:each="num: ${#numbers.sequence(0,59)}">
+										<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}분|" >분</option>
+									</th:block>
+								</select>
+								<input name="lbDispStTime" id="lbStTime" type="hidden" data-valid-name="노출기간 시작시간" value='000000' />
+								~
+								<input name="lbDispEddt" id="lbEdDate" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="노출기간 종료일" />
+								<select id="lbEdTimeHour" required="required" data-valid-name="노출기간 종료시간">
+									<th:block th:each="num: ${#numbers.sequence(0,23)}">
+										<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="${#numbers.formatInteger(num,2)}==23 ? 'true'">시간</option>
+									</th:block>
+								</select>
+								<select id="lbEdTimeMin" required="required" data-valid-name="노출기간 종료시간">
+									<th:block th:each="num: ${#numbers.sequence(0,59)}">
+										<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}분|" th:selected="${#numbers.formatInteger(num,2)}==59 ? 'true'">분</option>
+									</th:block>
+								</select>
+								<input name="lbDispEdTime" id="lbEdTime" type="hidden" data-valid-name="노출기간 종료시간" value='235959' />
+							</span>
+						</td>
+						<th>노출여부<i class="required" title="필수"></i></th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="dispYn" value="Y" checked="checked"/>Y</label>
+							<label class="rdoBtn"><input type="radio" name="dispYn" value="N">N</label>
+						</td>
+					</tr>
+					<tr>
+						<th>메인 목록 썸네일<i class="required" title="필수"></i></th>
+						<td colspan="3">
+							<div class="uFile w300">
+								<input id="file" name="file" type="file" class="uFileInput w300"/>
+								<label for="file" class="uFileLabel">파일선택</label>
+								<input type="hidden" name="orgTnfileNm"/>
+								<input type="hidden" name="sysTnfileNm"/>
+								<input type="hidden" name="newSysTnfileNm"/>
+							</div>
+							<input type="hidden" name="uploadDefaultUrl" id="uploadDefaultUrl" th:value="${@environment.getProperty('upload.image.view') + '/display/lookbook/thumbnail/'}"/>
+							<div id="imgView" class="off">
+								<img id="bannerPreViewUrl" src="" style="width:100px; height:100px"/>
+							</div>
+						</td>
+					</tr>
+					</tbody>
+				</table>
+			</div>
+		</form>
+		<ul class="panelBar">
+			<li  class="right">
+				<button type="button" class="btn btnRight btn-success btn-lg" id="btnSave">저장</button>
+			</li>
+		</ul>
+	</div>
+</div>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=2019072202"></script>
+<script th:inline="javascript">
+
+	/**
+	 * 저장
+	 */
+	$("#btnSave").on('click',function (){
+		// 필수값 validation 체크
+		if (!gagajf.validation('#lbBannerForm')) {
+			return false;
+		}
+
+		// 데이터 validation 체크
+		if(!dataValidation()){
+			return false;
+		}
+
+		var orgTnfileNm = $('#lbBannerForm input[name=sysTnfileNm]').val();
+		var sysTnfileNm = $('#lbBannerForm input[name=sysTnfileNm]').val();
+		var newSysTnfileNm = $('#lbBannerForm input[name=newSysTnfileNm]').val();
+
+		var fromDate = $('#lbBannerForm input[name=lbDispStdt]').val().replace(/[^0-9]/g, '')+$('#lbBannerForm #lbStTimeHour').val()+$('#lbBannerForm #lbStTimeMin').val()+'00';
+		var toDate = $('#lbBannerForm input[name=lbDispEddt]').val().replace(/[^0-9]/g, '')+$('#lbBannerForm #lbEdTimeHour').val()+$('#lbBannerForm #lbEdTimeMin').val()+'59';
+
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var data = {
+					lookbookSq : $('#lbBannerForm input[name=lookbookSq]').val()
+					,title : $('#lbBannerForm input[name=title]').val()
+					,brandCd : $('#lbBannerForm select[name=brandCd]').val()
+					,dispStdt : fromDate
+					,dispEddt : toDate
+					,dispYn : $('#lbBannerForm input[name=dispYn]:checked').val()
+					,orgTnfileNm : orgTnfileNm
+					,sysTnfileNm : sysTnfileNm
+					,newSysTnfileNm : newSysTnfileNm
+					,mainDispYn : 'N'
+					,dispOrd : 1
+				};
+
+				var jsonData = JSON.stringify(data);
+				gagajf.ajaxJsonSubmit($('#lbBannerForm').prop('action'), jsonData, fnPopupSaveCollback);
+			}
+		});
+	});
+
+	var fnPopupSaveCollback = function (result){
+		uifnPopupClose('popupLookbookBanner');
+	}
+
+	// 데이터 validation 체크
+	function dataValidation(){
+		// 날짜체크
+		var fromDate = $('#lbBannerForm input[name=lbDispStdt]').val().replace(/[^0-9]/g, '')+$('#lbBannerForm #lbStTimeHour').val()+$('#lbBannerForm #lbStTimeMin').val();
+		var toDate = $('#lbBannerForm input[name=lbDispEddt]').val().replace(/[^0-9]/g, '')+$('#lbBannerForm #lbEdTimeHour').val()+$('#lbBannerForm #lbEdTimeMin').val();
+		if(fromDate > toDate){
+			mcxDialog.alert('노출 시작일자는 종료일자 보다 클 수 없습니다.');
+			return false;
+		}
+
+		return true;
+	}
+
+	// 썸네일이미지 첨부파일
+	$("#lbBannerForm input[name=file]").on('change',function(){
+		var file = this.files[0];
+		file.name = 'test';
+		if (typeof(file) == 'undefined'){
+			return;
+		}
+
+		gagajf.ajaxFileUpload('/common/file/upload?subDir=/display/lookbook/thumbnail'
+				, file
+				, function(result) {
+					$('#lbBannerForm input[name=sysTnfileNm]').val(result.oldFileName);
+					$('#lbBannerForm input[name=newSysTnfileNm]').val(result.newFileName);
+					$("#lbBannerForm #bannerPreViewUrl").attr('src', $("#lbBannerForm #uploadDefaultUrl").val()+result.newFileName);
+					$("#lbBannerForm #imgView").removeClass("off").addClass("on");
+				}
+				, 'image'
+		);
+	});
+
+	$(document).ready(function() {
+		//sortable Item List
+		//fnSearchData();
+	});
+</script>
+</html>

+ 230 - 0
src/main/webapp/WEB-INF/views/display/LookbookListForm.html

@@ -0,0 +1,230 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : LookbookListForm.html
+ * @desc    : 룩북관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.3.4     bin2107     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<form id="searchForm" name="searchForm" action="#" th:action="@{'/display/lookbook/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+			<div class="panelStyle">
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:40%;"/>
+					</colgroup>
+					<tr>
+						<th>사이트</th>
+						<td>
+							<select name="siteCd">
+								<option th:if="${siteCdList}" th:each="oneData, status : ${siteCdList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>브랜드</th>
+						<td>
+							<select name="brandCd">
+								<option value="">[선택]</option>
+								<option th:if="${brandGroupList}" th:each="oneData, status : ${brandGroupList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>전시기간</th>
+						<td colspan="5" id="sellTerms">
+							<span class="nowrap">
+								<input name="dispStdt" id="schStDate" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="노출기간 시작일" />
+								<select id="schStTimeHour" required="required" data-valid-name="노출기간 시작시간">
+									<th:block th:each="num, index  : ${#numbers.sequence(0,23)}">
+									<option  th:value="${#numbers.formatInteger(num,2)}" th:text="|${#numbers.formatInteger(num,2)}시|" >시간</option>
+									</th:block>
+								</select>
+								<select id="schStTimeMin" required="required" data-valid-name="노출기간 시작시간">
+									<th:block th:each="num: ${#numbers.sequence(0,59)}">
+									<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}분|" >분</option>
+									</th:block>
+								</select>
+								<input name="dispStTime" id="schStTime" type="hidden" data-valid-name="노출기간 시작시간" value='000000' />
+								~
+								<input name="dispEddt" id="schEdDate" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="노출기간 종료일" />
+								<select id="schEdTimeHour" required="required" data-valid-name="노출기간 종료시간">
+									<th:block th:each="num: ${#numbers.sequence(0,23)}">
+									<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="${#numbers.formatInteger(num,2)}==23 ? 'true'">시간</option>
+									</th:block>
+								</select>
+								<select id="schEdTimeMin" required="required" data-valid-name="노출기간 종료시간">
+									<th:block th:each="num: ${#numbers.sequence(0,59)}">
+									<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}분|" th:selected="${#numbers.formatInteger(num,2)}==59 ? 'true'">분</option>
+									</th:block>
+								</select>
+								<input name="dispEdTime" id="schEdTime" type="hidden" data-valid-name="노출기간 종료시간" value='235959' />
+							</span>
+						</td>
+					</tr>
+				</table>
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-default btn-lg" id="btnInit">초기화</button>
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+					</li>
+				</ul>
+			</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 상단영역 START -->
+			<ul class="panelBar">
+				<li class="left">
+					<span class="btnLeft">
+						<button type="button" class="btn btn-danger btn-lg" id="btnDel">노출안함</button>
+					</span>
+				</li>
+				<li class="right">
+					<span class="btnRight">
+						<button type="button" class="btn btn-success btn-lg" id="btnReg">등록</button>
+					</span>
+					검색결과 : <strong><span id="gridRowTotalCount">0</span> 건</strong>&nbsp;
+					쪽번호 <span id="pgNo">0</span>/ <strong id="endPgNo">0</strong>&nbsp;&nbsp;
+					<select id="pageSize" name="pageSize">
+						<option value="50" selected="selected">50개씩 보기</option>
+						<option value="100">100개씩 보기</option>
+						<option value="500">500개씩 보기</option>
+						<option value="1000">1000개씩 보기</option>
+					</select>
+					<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
+				</li>
+			</ul>
+			<!-- 상단영역 END -->
+			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+
+			<ul class="panelBar">
+				<li class="center">
+					<div class="tablePaging" id="lookbookListPagination"></div>
+				</li>
+			</ul>
+		</div>
+		<!-- //리스트 영역 -->
+		</form>
+	</div>
+
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=2019072202"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var brandGroupList = [[${brandGroupList}]];
+
+	let columnDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "룩북일련번호", field: "lookbookSq", width: 100, cellClass: 'text-center'
+			,cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "타이틀", field: "title", width: 200, cellClass: 'text-center'},
+		{headerName: "브랜드", field: "brandCd", width: 80, cellClass: 'text-center'},
+		{headerName: "메인룩북", field: "mainDispYn", width: 80, cellClass: 'text-center'},
+		{headerName: "노출여부", field: "dispYn", width: 80, cellClass: 'text-center'},
+		{headerName: "노출시작일", field: "dispStdt", width: 150, cellClass: 'text-center'},
+		{headerName: "노출종료일", field: "dispEddt", width: 150, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regNm", width: 80, cellClass: 'text-center'},
+		{headerName: "등록일자", field: "regDt", width: 150, cellClass: 'text-center'},
+		{headerName: "수정자", field: "updNm", width: 80, cellClass: 'text-center'},
+		{headerName: "수정일자", field: "updDt", width: 150, cellClass: 'text-center'}
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	gridOptions.rowSelection = "multiple";
+
+	// 등록 팝업
+	$("#btnReg").on('click', function(){
+		cfnOpenLookbookBannerPopup('N');
+	});
+
+	// 초기화 버튼
+	$("#btnInit").on('click', function (){
+		$("#searchForm")[0].reset();
+		gagajf.setDate('schStDate', 'schEdDate', 't');
+	});
+
+	// 조회
+	$("#btnSearch").on('click', function(){
+		$("#searchForm input[name=dispStTime]").val($('#searchForm #schStTimeHour').val()+$('#searchForm #schStTimeMin').val()+'00');
+		$("#searchForm input[name=dispEdTime]").val($('#searchForm #schEdTimeHour').val()+$('#searchForm #schEdTimeMin').val()+'59');
+		fnSearch();
+	});
+
+	var fnSearch = function(){
+		gagaPaging.init('searchForm', fnSearchCallBack, 'lookbookListPagination', $('#searchForm').find('#pageSize').val());
+		gagaPaging.load(1);
+	};
+
+	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.lookbookList);
+		gagaPaging.createPagination(result.pageing.pageable);
+	}
+
+	// 노출안함
+	$("#btnDel").on('click', function (){
+		var selectRowData = gagaAgGrid.selectedRowData(gridOptions);
+		if (selectRowData.length > 0) {
+			mcxDialog.confirm('변경하시겠습니까?', {
+				cancelBtnText: "취소",
+				sureBtnText: "확인",
+				sureBtnClick: function(){
+					var selectDataArr = [];
+					$.each(selectRowData, function(idx, item) {
+						selectDataArr.push(item.lookbookSq);
+					});
+
+					var data = {
+						selectDataArr : selectDataArr
+					};
+
+					var jsonData = JSON.stringify(data);
+					gagajf.ajaxJsonSubmit('/display/lookbook/delete', jsonData, fnSaveCollback);
+				}
+			});
+		}else{
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+	});
+
+	var fnSaveCollback = function (){
+		$("#btnInit").click();
+		$('#btnSearch').trigger('click');
+	}
+
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 190 - 48
src/main/webapp/WEB-INF/views/display/PopupListForm.html

@@ -102,11 +102,12 @@
 					<select name="viewPage" id="viewPageView" onchange="fnChangeViewPage('View')" >
 						<option th:if="${viewPageList}" th:each="oneData, status : ${viewPageList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 					</select>
-					<select name="cate1No" id="cate1NoView" class='off' data-valid-name="대카테고리">
-						<option th:if="${cate1NoList}" th:each="oneData, status : ${cate1NoList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+					<select name="cateNo" id="cateNoView" class='off' data-valid-name="대카테고리">
+						<option value="">[선택]</option>
+						<option th:if="${cateNoList}" th:each="oneData, status : ${cateNoList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 					</select>
 					<input type="text" class="off w80" name="brandCd" id="brandCdView" placeholder="브랜드그룹번호" required="required" data-valid-name="브랜드"/>
-					<button type="button" class="off btn btn-base btn-lg" id="btnSearchBrandGroupView" onclick="fnBrandGroupSearch('View')">브랜드 조회</button>
+					<button type="button" class="off btn btn-base btn-lg" id="searchBrandGroupView" onclick="fnBrandGroupSearch('View')">브랜드 조회</button>
 					<input type="text" class="off w80" name="planSq" id="planSqView" placeholder="기획전번호" required="required" data-valid-name="기획전번호"/>
 					<button type="button" class="off btn btn-base btn-lg" id="btnSearchPlanView" onclick="fnPlanSearch('View')">기획전 조회</button>
 					<span class="nowrap">
@@ -189,12 +190,12 @@
 							<select name="viewPage" id="viewPage" onchange="fnChangeViewPage('')" data-valid-name="전시위치">
 								<option th:if="${viewPageList}" th:each="oneData, status : ${viewPageList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
-							<select name="cate1No" id="cate1No" class='off' data-valid-name="대카테고리">
+							<select name="cateNo" id="cateNo" class='off' data-valid-name="대카테고리">
 								<option value="">[선택]</option>
-								<option th:if="${cate1NoList}" th:each="oneData, status : ${cate1NoList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+								<option th:if="${cateNoList}" th:each="oneData, status : ${cateNoList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
 							<input type="text" class="off w80" name="brandCd" id="brandCd" placeholder="브랜드그룹번호" data-valid-name="브랜드그룹번호"/>
-							<button type="button" class="off btn btn-base btn-lg" id="btnSearchBrandGroup"  onclick="fnBrandGroupSearch('')">브랜드 조회</button>
+							<button type="button" class="off btn btn-base btn-lg" id="searchBrandGroup"  onclick="fnBrandGroupSearch('')">브랜드 조회</button>
 							<input type="text" class="off w80" name="planSq" id="planSq" placeholder="기획전번호" data-valid-name="기획전번호"/>
 							<button type="button" class="off btn btn-base btn-lg" id="btnSearchPlan"  onclick="fnPlanSearch('')">기획전 조회</button>
 						</td>
@@ -262,10 +263,11 @@
 						<td colspan="7">
 							<div id="ImageArea">
 								이미지파일 : <span class="uFile w300">
-												<input id="imgUrl1" name="imgUrl" type="file" class="uFileInput w300"  data-valid-name="이미지파일" onchange="fnFileUpload(this);"/>
-												<label for="imgUrl1" class="uFileLabel">파일선택</label>
-												<input type="hidden" name="orgImgFileNm"/>
-												<input type="hidden" name="newImgFileNm"/>
+												<input id="file_1" name="file" type="file" class="uFileInput w300"  data-valid-name="이미지파일" onchange="fnFileUpload(this);"/>
+												<label for="file_1" class="uFileLabel">파일선택</label>
+												<input type="hidden" name="orgFileNm"/>
+												<input type="hidden" name="sysFileNm"/>
+												<input type="hidden" name="newSysFileNm"/>
 											</span>
 								&nbsp;&nbsp;&nbsp;&nbsp;LINK : <input type="text" class="w400" name="linkUrl"  maxlength="300" required="required" data-valid-name="LINK" value="#"/>
 								<span class="memAdd off" id="imgFileNm1"></span>
@@ -294,33 +296,92 @@
 /*<![CDATA[*/
 	var siteCdList = [[${siteCdList}]];
 	var viewPageList = [[${viewPageList}]];
-	var cate1NoList = [[${cate1NoList}]];
+	var cateNoList = [[${cateNoList}]];
 
 	var imgDivLen = 1;	//이미지 추가 액션수관리
 
 	let columnDefs = [
 		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
-		{headerName: "팝업일련번호", field: "popupSq", width: 150, cellClass: 'text-center'},
+		{headerName: "팝업일련번호", field: "popupSq", width: 150, cellClass: 'text-center'
+			,cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
 		{headerName: "적용여부", field: "displayYn", width: 150, cellClass: 'text-center'},
-		{headerName: "전시위치", field: "viewPage", width: 150, cellClass: 'text-center'},
-		{headerName: "카테고리", field: "cate1No", width: 150, cellClass: 'text-center'},
+		{headerName: "전시위치", field: "viewPage", width: 150, cellClass: 'text-center'
+			,valueFormatter: function (params) { return !gagajf.isNull(params.value) ? "["+params.value+"] "+params.data.viewPageNm : '';}
+		},
+		{headerName: "카테고리", field: "cateNo", width: 150, cellClass: 'text-center'},
 		{headerName: "브랜드", field: "brandCd", width: 150, cellClass: 'text-center'},
 		{headerName: "기획전번호", field: "planSq", width: 150, cellClass: 'text-center'},
-		{headerName: "PC/모바일", field: "frontGb", width: 150, cellClass: 'text-center'},
+		{headerName: "PC/모바일", field: "frontGb", width: 150, cellClass: 'text-center'
+			,valueFormatter: function(params) {
+				if (params.data.frontGb == 'A') {
+					return '전체';
+				}else if(params.data.frontGb == 'P'){
+					return 'PC';
+				}else{
+					return '모바일';
+				}
+			}
+		},
 		{headerName: "우선순위", field: "dispOrd", width: 150, cellClass: 'text-center'},
 		{headerName: "전시시작일", field: "dispStdt", width: 150, cellClass: 'text-center'},
+		{headerName: "전시시작시간", field: "dispStTime", width: 150, cellClass: 'text-center'},
 		{headerName: "전시종료일", field: "dispEddt", width: 150, cellClass: 'text-center'},
-		{headerName: "등록자", field: "regNo", width: 150, cellClass: 'text-center'},
+		{headerName: "전시종료시간", field: "dispEdTime", width: 150, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regNm", width: 150, cellClass: 'text-center'},
 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center'}
 	];
 
 	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
 	gridOptions.rowSelection = "multiple";
 
+	// ROW Click
+	gridOptions.onCellClicked = function(event) {
+		var popupSq = event.data.popupSq;
+		if (event.colDef.field == "popupSq"){
+			$("#btnNew").click();
+			var formId = '#detailForm';
+			$(formId + " input[name=popupSq]").val(event.data.popupSq);
+			$(formId + " select[name=siteCd]").val(event.data.siteCd);
+			$(formId + " select[name=viewPage]").val(event.data.viewPage);
+			fnChangeViewPage('');
+			$(formId + " select[name=cateNo]").val(event.data.cateNo).attr("selected", true);
+			$(formId + " input[name=brandCd]").val(event.data.brandCd);
+			$(formId + " input[name=planSq]").val(event.data.planSq);
+			$(formId + " select[name=frontGb]").val(event.data.frontGb);
+			$(formId + " select[name=popupGb]").val(event.data.popupGb);
+			$(formId + " input[name=unexpDays]").val(event.data.unexpDays);
+			$(formId + " input[name=dispOrd]").val(event.data.dispOrd);
+			var dispStdt = event.data.dispStdt.replace(/[^0-9]/g, '');
+			$(formId + " input[name=dispStdt]").val(dispStdt.substr(0,4)+"-"+dispStdt.substr(4,2)+"-"+dispStdt.substr(6,2));
+			var dispStTime = event.data.dispStTime.replace(/[^0-9]/g, '');
+			$("#stTime").val(dispStTime);
+			$("#stTimeHour").val(dispStTime.substr(0,2));
+			$("#stTimeMin").val(dispStTime.substr(2,2));
+			var dispEddt = event.data.dispEddt.replace(/[^0-9]/g, '');
+			$(formId + " input[name=dispEddt]").val(dispEddt.substr(0,4)+"-"+dispEddt.substr(4,2)+"-"+dispEddt.substr(6,2));
+			var dispEdTime = event.data.dispEdTime.replace(/[^0-9]/g, '');
+			$("#edTime").val(dispEdTime);
+			$("#edTimeHour").val(dispEdTime.substr(0,2));
+			$("#edTimeMin").val(dispEdTime.substr(2,2));
+
+			$(formId + " input[name=orgFileNm]").eq(0).val(event.data.imgUrl1);
+			$(formId + " input[name=sysFileNm]").eq(0).val(event.data.imgUrl1);
+			$(formId + " input[name=linkUrl]").eq(0).val(event.data.linkUrl1);
+			$(formId + " #imgFileNm1").html(event.data.imgUrl1);
+			$(formId + " #imgFileNm1").removeClass('off').addClass('on');
+			$(".uFileLabel").text('');
+		}
+	}
+
 	/**
 	 * 조회
 	 */
 	$('#btnSearch').on('click', function (){
+		$("#searchForm input[name=dispStTime]").val($('#searchForm #schStTimeHour').val()+$('#searchForm #schStTimeMin').val()+'00');
+		$("#searchForm input[name=dispEdTime]").val($('#searchForm #schEdTimeHour').val()+$('#searchForm #schEdTimeMin').val()+'59');
 		fnSearch();
 	});
 
@@ -341,31 +402,31 @@
 	// 미리보기위치 선택
 	var fnChangeViewPage = function(sub){
 		if($("#viewPage"+sub).val()=="G037_30"){
-			$("#cate1No"+sub).removeClass("off").addClass("on");
+			$("#cateNo"+sub).removeClass("off").addClass("on");
 			$("#brandCd"+sub).removeClass("on").addClass("off");
-			$("#btnSearchBrandGroup"+sub).removeClass("on").addClass("off");
+			$("#searchBrandGroup"+sub).removeClass("on").addClass("off");
 			$("#planSq"+sub).removeClass("on").addClass("off");
 			$("#btnSearchPlan"+sub).removeClass("on").addClass("off");
 		}else if($("#viewPage"+sub).val()=="G037_31"){
-			$("#cate1No"+sub).removeClass("on").addClass("off");
+			$("#cateNo"+sub).removeClass("on").addClass("off");
 			$("#brandCd"+sub).removeClass("off").addClass("on");
-			$("#btnSearchBrandGroup"+sub).removeClass("off").addClass("on");
+			$("#searchBrandGroup"+sub).removeClass("off").addClass("on");
 			$("#planSq"+sub).removeClass("on").addClass("off");
 			$("#btnSearchPlan"+sub).removeClass("on").addClass("off");
 		}else if($("#viewPage"+sub).val()=="G037_40"){
-			$("#cate1No"+sub).removeClass("on").addClass("off");
+			$("#cateNo"+sub).removeClass("on").addClass("off");
 			$("#brandCd"+sub).removeClass("on").addClass("off");
-			$("#btnSearchBrandGroup"+sub).removeClass("on").addClass("off");
+			$("#searchBrandGroup"+sub).removeClass("on").addClass("off");
 			$("#planSq"+sub).removeClass("off").addClass("on");
 			$("#btnSearchPlan"+sub).removeClass("off").addClass("on");
 		}else{
-			$("#cate1No"+sub).removeClass("on").addClass("off");
+			$("#cateNo"+sub).removeClass("on").addClass("off");
 			$("#brandCd"+sub).removeClass("on").addClass("off");
-			$("#btnSearchBrandGroup"+sub).removeClass("on").addClass("off");
+			$("#searchBrandGroup"+sub).removeClass("on").addClass("off");
 			$("#planSq"+sub).removeClass("on").addClass("off");
 			$("#btnSearchPlan"+sub).removeClass("on").addClass("off");
 		}
-		$("#cate1No"+sub).val('');
+		$("#cateNo"+sub).val('');
 		$("#brandCd"+sub).val('');
 		$("#planSq"+sub).val('');
 	};
@@ -386,11 +447,12 @@
 		$('#detailForm #imgFileNm1').html('');
 		$('#detailForm input[name=orgImgFileNm]').val('');
 		$('#detailForm input[name=newImgFileNm]').val('');
-		$("#cate1No").removeClass("on").addClass("off");
-		$("#btnSearchBrandGroup").removeClass("on").addClass("off");
+		$("#cateNo").removeClass("on").addClass("off");
+		$("#searchBrandGroup").removeClass("on").addClass("off");
 		$('#detailForm input[name=brandCd]').removeClass("on").addClass("off");
 		$("#btnSearchPlan").removeClass("on").addClass("off");
 		$('#detailForm input[name=planSq]').removeClass("on").addClass("off");
+		$(".uFileLabel").text('');
 		imgDivLen = 1;
 	});
 
@@ -408,7 +470,7 @@
 		var selectViewPage = $('#detailForm select[name=viewPage]').val();
 
 		if(selectViewPage=='G037_30'){
-			if(gagajf.isNull($('#detailForm select[name=cate1No]').val())){
+			if(gagajf.isNull($('#detailForm select[name=cateNo]').val())){
 				mcxDialog.alert('카테고리를 선택해 주세요.');
 				return false;
 			}
@@ -425,7 +487,7 @@
 		}
 
 		var orgFileNm = $('#detailForm #imgFileNm1').html();
-		var imgFileNm = $('#detailForm input[name=newImgFileNm]').val();
+		var imgFileNm = $('#detailForm input[name=newSysFileNm]').val();
 		if(gagajf.isNull(orgFileNm)){
 			if(gagajf.isNull(imgFileNm)){
 				mcxDialog.alert('이미지파일을 선택해 주세요.');
@@ -433,6 +495,7 @@
 			}
 		}
 
+		return true;
 	}
 
 	// 이미지 첨부
@@ -445,8 +508,8 @@
 		gagajf.ajaxFileUpload('/common/file/upload?subDir=/display/popup'
 				, file
 				, function(result) {
-					$(obj).closest('div').find('input:hidden[name=orgImgFileNm]').val(result.oldFileName);
-					$(obj).closest('div').find('input:hidden[name=newImgFileNm]').val(result.newFileName);
+					$(obj).closest('div').find('input:hidden[name=sysFileNm]').val(result.oldFileName);
+					$(obj).closest('div').find('input:hidden[name=newSysFileNm]').val(result.newFileName);
 				}
 		);
 	};
@@ -455,7 +518,6 @@
 	 * 저장
 	 */
 	$("#btnSave").on('click',function(){
-		console.log('저장을 눌렀다@');
 		// 필수값 validation 체크
 		if (!gagajf.validation('#detailForm')) {
 			return false;
@@ -467,20 +529,10 @@
 		}
 
 		// 이미지 파일 체크
-		// 기존 이미지 명있는데 그대로 쓰면 -> orgImg
-		// 기존 이미지 명있는데 새로 등록 -> newImg
 		var imgUrl = '';
-		var orgFileNm = $('#detailForm #imgFileNm1').html();
-		var imgFileNm = $('#detailForm input[name=newImgFileNm]').val();
-		if(gagajf.isNull(orgFileNm)){
-			imgUrl = imgFileNm;
-		}else{
-			if(gagajf.isNull(imgFileNm)){
-				imgUrl = orgFileNm;
-			}else{
-				imgUrl = imgFileNm;
-			}
-		}
+		var orgFileNm = $('#detailForm input[name=orgFileNm]').val();
+		var sysFileNm = $('#detailForm input[name=sysFileNm]').val();
+		var newSysFileNm = $('#detailForm input[name=newSysFileNm]').val();
 
 		var fromDate = $('#detailForm input[name=dispStdt]').val().replace(/[^0-9]/g, '')+$('#detailForm #stTimeHour').val()+$('#detailForm #stTimeMin').val()+'00';
 		var toDate = $('#detailForm input[name=dispEddt]').val().replace(/[^0-9]/g, '')+$('#detailForm #edTimeHour').val()+$('#detailForm #edTimeMin').val()+'59';
@@ -489,7 +541,7 @@
 			popupSq : $('#detailForm input[name=popupSq]').val()
 			,siteCd : $('#detailForm select[name=siteCd]').val()
 			,viewPage : $('#detailForm select[name=viewPage]').val()
-			,cate1No : $('#detailForm select[name=cate1No]').val()
+			,cateNo : $('#detailForm select[name=cateNo]').val()
 			,brandCd : $('#detailForm input[name=brandCd]').val()
 			,planSq : $('#detailForm input[name=planSq]').val()
 			,frontGb : $('#detailForm select[name=frontGb]').val()
@@ -497,10 +549,11 @@
 			,dispOrd : $('#detailForm input[name=dispOrd]').val()
 			,dispStdt : fromDate
 			,dispEddt : toDate
-			,imgUrl1 : imgUrl
 			,orgFileNm : orgFileNm
-			,newImgFileNm1 : imgUrl
+			,sysFileNm : sysFileNm
+			,newSysFileNm : newSysFileNm
 			,linkUrl1 : $('#detailForm input[name=linkUrl]').val()
+			,useYn : 'Y'
 		};
 
 		var jsonData = JSON.stringify(data);
@@ -509,8 +562,97 @@
 	});
 
 	var fnPopupSaveCollback = function (result){
+		$("#btnNew").click();
 		$('#btnSearch').trigger('click');
 	}
+
+	// 브랜드 조회
+	var formNm = "";
+	var fnBrandGroupSearch = function(sub){
+		if(!gagajf.isNull(sub)){
+			formNm = "searchForm";
+		}else{
+			formNm = "detailForm";
+		}
+		cfnOpenBrandGroupListPopup("callBackBrandGroup", "S", "S");
+	}
+
+	var callBackBrandGroup = function(result){
+		$("#"+formNm+" input[name=brandCd]").val(result[0].brandGroupNo);
+	}
+
+	// 기획전 조회
+	var planFormNm = "";
+	var fnPlanSearch = function (sub){
+		if(!gagajf.isNull(sub)){
+			planFormNm = "searchForm";
+		}else{
+			planFormNm = "detailForm";
+		}
+		cfnOpenPlanPopup("callBackPlan");
+	}
+
+	var callBackPlan = function (result){
+		$("#"+planFormNm+" input[name=planSq]").val(result[0].planSq);
+	}
+
+	/**
+	 * 삭제
+	 */
+	$("#btnDel").on('click',function(){
+		var selectRowData = gagaAgGrid.selectedRowData(gridOptions);
+		if (selectRowData.length > 0) {
+			mcxDialog.confirm('삭제하시겠습니까?', {
+				cancelBtnText: "취소",
+				sureBtnText: "확인",
+				sureBtnClick: function(){
+					var selectDataArr = [];
+					$.each(selectRowData, function(idx, item) {
+						selectDataArr.push(item.popupSq);
+					});
+
+					var data = {
+						selectDataArr : selectDataArr
+					};
+
+					var jsonData = JSON.stringify(data);
+					gagajf.ajaxJsonSubmit('/display/popup/delete', jsonData, fnPopupSaveCollback);
+				}
+			});
+		}else{
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+	});
+
+	/**
+	 * 적용
+	 */
+	$("#btnReg").on('click',function(){
+		var selectRowData = gagaAgGrid.selectedRowData(gridOptions);
+		if (selectRowData.length > 0) {
+			mcxDialog.confirm('적용하시겠습니까?', {
+				cancelBtnText: "취소",
+				sureBtnText: "확인",
+				sureBtnClick: function(){
+					var selectDataArr = [];
+					$.each(selectRowData, function(idx, item) {
+						selectDataArr.push(item.popupSq);
+					});
+
+					var data = {
+						selectDataArr : selectDataArr
+					};
+
+					var jsonData = JSON.stringify(data);
+					gagajf.ajaxJsonSubmit('/display/popupfront/save', jsonData, fnPopupSaveCollback);
+				}
+			});
+		}else{
+			mcxDialog.alert('프론트에 적용할 행을 선택해주세요.');
+			return;
+		}
+	});
 	
 	$(document).ready(function() {
 		// Create a agGrid

+ 164 - 49
src/main/webapp/WEB-INF/views/marketing/PlanDetailPopupForm.html

@@ -138,11 +138,19 @@
   						</td>
 					</tr>
 					<tr>
-						<th>제휴채널<em class="required" title="필수"></em></th>
+						<th>제휴채널</th>
 						<td colspan="3">
-							<label class="chkBox" th:if="${upperAfLinkCdList}" th:each="oneData, status : ${upperAfLinkCdList}">
-								<input type="checkbox" name="upperAfLinkCdArr" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/>
-							</label>
+							<!-- 수정시 프로모션명 입력 : before -->
+							<div class="padding10"	style="display: inline-block; width: 49%;">
+								<!--<span>공급업체 설정</span>-->
+								<div class="padding10 inner-tb-solid">
+									<span class="buttonSpan">
+										<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddAf">제휴채널 추가</button>
+										<button type="button" class="btn btnRight btn-success btn-lg"id="btnDeleteAf">선택삭제</button>
+									</span> <br />
+									<div id="gridAfPlanList" style="width: 100%; height: 200px;" class="ag-theme-balham"></div>
+								</div>
+							</div>
   						</td>
 						
 					</tr>
@@ -402,9 +410,9 @@
 						<td>
 							<input type="text" name="planNm" id="planNm" maxlength="50" required="required" data-valid-name="기획전명"/>
 						</td>
-						<th>서브제목<em class="required" title="필수"></em></th>
+						<th>서브제목</th>
 						<td>
-							<input type="text" name="dtlTitle1" id="dtlTitle1"/>
+							<input type="text" name="dtlTitle1" id="dtlTitle1" data-valid-name="서브제목"/>
 						</td>
 					</tr>
 					<tr>
@@ -470,11 +478,19 @@
   						</td>
 					</tr>
 					<tr>
-						<th>제휴채널<em class="required" title="필수"></em></th>
+						<th>제휴채널</th>
 						<td colspan="3">
-							<label class="chkBox" th:if="${upperAfLinkCdList}" th:each="oneData, status : ${upperAfLinkCdList}">
-								<input type="checkbox" name="upperAfLinkCdArr" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/>
-							</label>
+							<!-- 수정시 프로모션명 입력 : before -->
+							<div class="padding10"	style="display: inline-block; width: 49%;">
+								<!--<span>공급업체 설정</span>-->
+								<div class="padding10 inner-tb-solid">
+									<span class="buttonSpan">
+										<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddAf">제휴채널 추가</button>
+										<button type="button" class="btn btnRight btn-success btn-lg"id="btnDeleteAf">선택삭제</button>
+									</span> <br />
+									<div id="gridAfPlanList" style="width: 100%; height: 200px;" class="ag-theme-balham"></div>
+								</div>
+							</div>
   						</td>
 					</tr>
 					<tr>
@@ -511,7 +527,7 @@
 							<input type="text" name="replyTitle1" id="replyTitle1" maxlength="50" required="required"/>
 						</td>
 						
-						<th>댓글서브제목<em class="required" title="필수"></em></th>
+						<th>댓글서브제목</th>
 						<td>
 							<input type="text" name="replyTitle2" id="replyTitle3" maxlength="50" required="required"/>
 						</td>
@@ -629,8 +645,38 @@
 	var planCateList = [[${planCateList}]];
 	var custGbList = [[${gbList}]];
 	var custGradeList =	[[${gradeList}]]; 
+	var afChannelList = [[${afChannelList}]]; 
 	var snOptions;
 
+	let useYnList = { "Y":"Yes", "N":"No" };
+	let channelName = {"G053_01":"직접","G053_02":"네이버","G053_03":"다음","G053_04":"크리데오","G053_05":"카카오","G053_06":"인스타그램","G053_07":"페이스북","G053_08":"구글"
+			          ,"G053_09":"바이럴","G053_10":"모비온","G053_11":"YES24","G053_12":"한세드림"}
+	
+	let columnAfDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "제휴채널코드", field: "afLinkCd", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "제휴채널명", field: "afLinkNm", width: 180,
+			cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "상위제휴채널", field: "afChannel", width: 120, cellClass: 'text-center',
+			cellEditor: 'agRichSelectCellEditor',
+			cellEditorParams: { values: gagaAgGrid.extractValues(channelName) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(channelName, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(channelName, params.newValue); }	
+		}
+
+	];
+	
+	// 제휴채널 그리드 설정
+	var gridOptionsAfList = gagaAgGrid.getGridOptions(columnAfDefs);
+	gridOptionsAfList.rowSelection = "multiple";
+	gridOptionsAfList.suppressRowClickSelection = true;
+	
+    
+    
 	// 카테고리 전시 여부
 	var fnCataCheck = function(is, formId) {
 		if (is.checked) {
@@ -724,7 +770,7 @@
 					}
 				}
 			}
-	}else{
+	}else if($('#planUpdateForm select[name=replyYn]').val()=='N'){
 		$("#append1").css('display','none');
 		$("#append2").css('display','none');
 		$("#append3").css('display','none');
@@ -762,6 +808,10 @@
 				}
 			}
 		}
+	}else{
+		$("#append1").css('display','none');
+		$("#append2").css('display','none');
+		$("#append3").css('display','none');
 	}
 	
 	
@@ -905,17 +955,13 @@
 			multiCate.push(item.cateNo);
 		});
 		
-		var usableCustGradeArr = [];
-		var chkCustGrade = $('#planRegisterForm input:checkbox[name=usableCustGradeArr]:checked');
-		for(let i=0; i< chkCustGrade.length; i++){
-			usableCustGradeArr.push(chkCustGrade.eq(i).val());
-		}
+		let allChannelData = gagaAgGrid.getAllRowData(gridOptionsAfList);
+		var multiChannel = [];
+		$.each(allChannelData, function(idx, item) {
+			multiChannel.push(item.afLinkCd);
+		});
 		
-		var usableCustGbArr = [];
-		var chkCustGb = $('#planRegisterForm input:checkbox[name=usableCustGbArr]:checked');
-		for(let i=0; i< chkCustGb.length; i++){
-			usableCustGbArr.push(chkCustGb.eq(i).val());
-		}
+	
 		
 		// 기획전 등록
 		if (formId == '#planRegisterForm') {
@@ -923,6 +969,32 @@
 				cancelBtnText: "취소",
 				sureBtnText: "확인",
 				sureBtnClick: function() {
+					if(!validationPlanDetail()){
+						return false;
+					}
+					
+					var usableCustGradeArr = [];
+					var chkCustGrade = $('#planRegisterForm input:checkbox[name=usableCustGradeArr]:checked');
+					
+					if(chkCustGrade.length < 1){
+						mcxDialog.alert("사용가능고객등급을 체크해주세요.");
+						return false;
+					}
+					for(let i=0; i< chkCustGrade.length; i++){
+						usableCustGradeArr.push(chkCustGrade.eq(i).val());
+					}
+					
+					var usableCustGbArr = [];
+					var chkCustGb = $('#planRegisterForm input:checkbox[name=usableCustGbArr]:checked');
+					
+					if(chkCustGb.length < 1){
+						mcxDialog.alert("사용가능고객구분을 체크해주세요.");
+						return false;
+					}
+					
+					for(let i=0; i< chkCustGb.length; i++){
+						usableCustGbArr.push(chkCustGb.eq(i).val());
+					}
 					
 					let data = {
 							 multiBrand : multiBrand
@@ -931,6 +1003,7 @@
 							,CateList : allCateData
 							,usableCustGradeArr : usableCustGradeArr
 							,usableCustGbArr : usableCustGbArr
+							,multiChannel : multiChannel
 						    ,mode : $('#planRegisterForm input[name=mode]').val()
 						    ,planSq : $('#planRegisterForm input[name=planSq]').val()
 							,planGb	: $('#planRegisterForm select[name=planGb]').val()
@@ -970,16 +1043,46 @@
 				}
 			});
 		} else { // 기획전 수정
+	
 			mcxDialog.confirm('저장 하시겠습니까?', {
 				cancelBtnText: "취소",
 				sureBtnText: "확인",
 				sureBtnClick: function() {
+					if(!validationPlanDetail()){
+						return false;
+					}
 					
+					var usableCustGradeArr = [];
+					var chkCustGrade = $('#planUpdateForm input:checkbox[name=usableCustGradeArr]:checked');
+					
+					if(chkCustGrade.length < 1){
+						mcxDialog.alert("사용가능고객등급을 체크해주세요.");
+						return false;
+					}
+					
+					for(let i=0; i< chkCustGrade.length; i++){
+						usableCustGradeArr.push(chkCustGrade.eq(i).val());
+					}
+					
+					var usableCustGbArr = [];
+					var chkCustGb = $('#planUpdateForm input:checkbox[name=usableCustGbArr]:checked');
+					
+					if(chkCustGb.length < 1){
+						mcxDialog.alert("사용가능고객구분을 체크해주세요.");
+						return false;
+					}
+					
+					for(let i=0; i< chkCustGb.length; i++){
+						usableCustGbArr.push(chkCustGb.eq(i).val());
+					}
 					let data = {
 							 multiBrand : multiBrand
 							,brandList : allBrandData
 							,multiCate : multiCate
+							,multiChannel : multiChannel
 							,CateList : allCateData
+							,usableCustGradeArr : usableCustGradeArr
+							,usableCustGbArr : usableCustGbArr
 						    ,mode : $('#planUpdateForm input[name=mode]').val()
 						    ,planSq : $('#planUpdateForm input[name=planSq]').val()
 							,planGb	: $('#planUpdateForm select[name=planGb]').val()
@@ -1105,9 +1208,6 @@
 		{headerName: "브랜드그룹명", field: "brandGroupKnm", width: 120, cellClass: 'text-center'},
 		{headerName: "브랜드영문명", field: "brandGroupEnm", width: 150, cellClass: 'text-center'},
 		{headerName: "", field: "brandKnm", width: 150, cellClass: 'text-center'},
-		/* {headerName: "적용대상", field: "targetGb", width: 150, cellClass: 'text-center', hide: true},
-		{headerName: "시퀀스", field: "tmtbGoodsSq", width: 150, cellClass: 'text-center', hide: true},
-		{headerName: "삭제여부", field: "delYn", width: 150, cellClass: 'text-center', hide: true}  */
 	];
 	
 	// 브랜드 그리드 설정
@@ -1163,7 +1263,7 @@
     	gridOptionsFGCateList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsFGCateList)});
     });
 	
-	
+
 	
 	// 카테고리 추가
 	$('#btnAddCate').on('click' , function () {
@@ -1194,7 +1294,43 @@
 		}
 	}
 	
+	// 제휴채널 추가
+	$('#btnAddAf').on('click' , function () {
+		cfnOpenAfChannelPopup("callBackAf");
+	});
 	
+	// 제휴채널 콜백
+	var callBackAf = function(result) {
+		// 기존 리스트 데이터 for
+		for(let i = 0 ; i < result.length ; i++) {
+			let addChk = true, gridListValue = gagaAgGrid.getAllRowData(gridOptionsAfList);		// 받아온 모든 데이터
+
+			// 받아온 data for
+			for(let j = 0 ; j < gridListValue.length ; j++) {
+				// 동일한 data는 추가하지 않음
+				if(gridListValue[j].afLinkCd == result[i].afLinkCd) {	addChk = false;	}		// 중복체크
+			}
+
+			// 중복되지 않은 데이터 리스트에 추가
+			if(addChk) {
+				gagaAgGrid.addRowData(gridOptionsAfList, {"afLinkCd":result[i].afLinkCd , "afLinkNm":result[i].afLinkNm, "afChannel":result[i].afChannel});
+			}
+		}
+	}
+	
+	// 제츄채널 선택삭제 버튼 클릭시
+    $('#btnDeleteAf').on('click', function() {
+    	gridOptionsAfList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsAfList)});
+    });
+	
+	// validation 체크
+	function validationPlanDetail() {
+		if( $('#planUpdateForm input[name=planNm]').val() == '' || $('#planRegisterForm input[name=planNm]').val() == ''){
+			mcxDialog.alert('기획전명을 입력하세요.');
+			return false;
+		}
+		return true;
+	} 
 
 	$(document).ready(function() {
 		
@@ -1207,22 +1343,12 @@
 		// 그리드 그리기
 		gagaAgGrid.createGrid("gridFGBrandList", gridOptionsFGBrandList);
 		gagaAgGrid.createGrid("gridFGCateList", gridOptionsFGCateList);
+		gagaAgGrid.createGrid("gridAfPlanList", gridOptionsAfList);
 		
 		 if (mode =='U') {
-			/* $('#planDetailForm input[name=badgeFcolor]').spectrum({
-				preferredFormat: "hex",
-				showInput: true,
-				allowEmpty: true
-			});
-
-			$('#planDetailForm input[name=badgeBcolor]').spectrum({
-				preferredFormat: "hex",
-				showInput: true,
-				allowEmpty: true
-			}); */
-			
 			gridOptionsFGBrandList.api.setRowData(planBrandList);
 			gridOptionsFGCateList.api.setRowData(planCateList);
+			gridOptionsAfList.api.setRowData(afChannelList);
 
 			if (planInfo.goodsLimitYn == 'N') {
 				$('#planDetailForm input[name=goodsLimitQty]').hide();
@@ -1238,17 +1364,6 @@
 			}
 
 		} else {
-			/* $('#planRegisterForm input[name=badgeFcolor]').spectrum({
-				preferredFormat: "hex",
-				showInput: true,
-				allowEmpty: true
-			});
-
-			$('#planRegisterForm input[name=badgeBcolor]').spectrum({
-				preferredFormat: "hex",
-				showInput: true,
-				allowEmpty: true
-			}); */
 
 			$("#viewStartDtNew").val(_today);
 			$("#viewEndDtNew").val(_today);

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

@@ -97,9 +97,9 @@
 			</table>
 
 			<ul class="panelBar">
-				<li class="center"><input type="button" value="초기화"
-					class="btn btn-gray btn-lg" id="btnInit" /> <input type="button"
-					value="조회" class="btn btn-base btn-lg" id="btnSearch" /></li>
+				<li class="center"><input type="button" value="초기화" class="btn btn-gray btn-lg" id="btnInit" /> 
+				<input type="button" value="조회" class="btn btn-base btn-lg" id="btnSearch" />
+				</li>
 			</ul>
 	</div>
 
@@ -361,7 +361,7 @@
 		$("#planListSearchForm input[name=pageNo]").val('1');
 		fnPlanListSearch($("#planListSearchForm input[name=searchGb]").val());
 	});
-	
+
 	
 	$(document).ready(function() {
 

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

@@ -44,11 +44,13 @@
 					<tbody>
 						<tr>
 							<th>사이트</th>
-						 	<td><label th:if="${siteList}"
-								th:each="oneData, status : ${siteList}"> <input
-									type="checkbox" name="siteCds" th:value="${oneData.cd}"
-									th:text="${oneData.cdNm}" />
-							</label></td>
+							<td><select name="siteCd">
+									<th:block th:if="${siteList}"
+										th:each="oneData, status : ${siteList}">
+										<option th:value="${oneData.cd}"
+											th:text="${oneData.cdNm}"></option>
+									</th:block>
+							</select></td>
 
 							<th>기획전명</th>
 							<td><input type="text" name="planNm" id="planNm" /></td>

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

@@ -338,7 +338,7 @@
 														</tr>
 														<tr>
 															<th>전시 순서</th>
-															<td><input type="text" name="goodsDispOrd1" class="w300 aR">
+															<td><input type="text" name="goodsDispOrd1" class="w300 aR" data-valid-type="numeric">
 															</td>
 														</tr>
 													</table>
@@ -397,7 +397,7 @@
 														</tr>
 														<tr>
 															<th>전시 순서</th>
-															<td><input type="text" name="goodsDispOrd2" class="w300 aR">
+															<td><input type="text" name="goodsDispOrd2" class="w300 aR" data-valid-type="numeric">
 															</td>
 														</tr>
 													</table>
@@ -457,7 +457,7 @@
 														</tr>
 														<tr>
 															<th>전시 순서</th>
-															<td><input type="text" name="goodsDispOrd3" class="w300 aR">
+															<td><input type="text" name="goodsDispOrd3" class="w300 aR" data-valid-type="numeric">
 															</td>
 														</tr>
 													</table>
@@ -517,7 +517,7 @@
 														</tr>
 														<tr>
 															<th>전시 순서</th>
-															<td><input type="text" name="goodsDispOrd4" class="w300 aR">
+															<td><input type="text" name="goodsDispOrd4" class="w300 aR" data-valid-type="numeric">
 															</td>
 														</tr>
 													</table>
@@ -577,7 +577,7 @@
 														</tr>
 														<tr>
 															<th>전시 순서</th>
-															<td><input type="text" name="goodsDispOrd5" class="w300 aR">
+															<td><input type="text" name="goodsDispOrd5" class="w300 aR" data-valid-type="numeric">
 															</td>
 														</tr>
 													</table>
@@ -637,7 +637,7 @@
 														</tr>
 														<tr>
 															<th>전시 순서</th>
-															<td><input type="text" name="goodsDispOrd6" class="w300 aR">
+															<td><input type="text" name="goodsDispOrd6" class="w300 aR" data-valid-type="numeric">
 															</td>
 														</tr>
 													</table>
@@ -697,7 +697,7 @@
 														</tr>
 														<tr>
 															<th>전시 순서</th>
-															<td><input type="text" name="goodsDispOrd7" class="w300 aR">
+															<td><input type="text" name="goodsDispOrd7" class="w300 aR" data-valid-type="numeric">
 															</td>
 														</tr>
 													</table>
@@ -757,7 +757,7 @@
 														</tr>
 														<tr>
 															<th>전시 순서</th>
-															<td><input type="text" name="goodsDispOrd8" class="w300 aR">
+															<td><input type="text" name="goodsDispOrd8" class="w300 aR" data-valid-type="numeric">
 															</td>
 														</tr>
 													</table>
@@ -817,7 +817,7 @@
 														</tr>
 														<tr>
 															<th>전시 순서</th>
-															<td><input type="text" name="goodsDispOrd9" class="w300 aR">
+															<td><input type="text" name="goodsDispOrd9" class="w300 aR" data-valid-type="numeric">
 															</td>
 														</tr>
 													</table>
@@ -877,7 +877,7 @@
 														</tr>
 														<tr>
 															<th>전시 순서</th>
-															<td><input type="text" name="goodsDispOrd10" class="w300 aR">
+															<td><input type="text" name="goodsDispOrd10" class="w300 aR" data-valid-type="numeric">
 															</td>
 														</tr>
 													</table>

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

@@ -219,7 +219,7 @@
 <table class="frmStyle" style="display: none;" id="rowQuestion">
 	<tr id="trRowQuestion">
 	<td>
-		<input type="checkbox" name="chkIdx" style="margin-left: 10px; top: 50%;  left: 0;  width: 18px; height: 18px; transform: translate(0,-50%);"/>
+		<input type="checkbox" name="chkIdx" style="top: 50%; width: 18px; height: 18px;"/>
 		<input type="hidden" name="crud" value="C"/>
 		<input type="hidden" name="pollQsq" value=""/>
 	</td>

+ 60 - 45
src/main/webapp/WEB-INF/views/marketing/SocialShoppingListForm.html

@@ -33,29 +33,6 @@
 					<col/>
 				</colgroup>
 				<tbody>
-					<tr>
-						<th>진행기간</th>
-						<td colspan="7" id="terms"></td>
-					</tr>
-					<tr>
-						<th>소셜번호</th>
-						<td>
-							<input type="text" name="socualSq" id="socualSq"/>
-						</td>
-
-						<th>등록자</th>
-						<td>
-							<input type="text" name="regId" id="regId"/>
-						</td>
-
-						<th>사용여부</th>
-						<td>
-							<select name="useYn">
-								<option value="">전체</option>
-								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
-							</select>
-						</td>
-					</tr>
 					<tr>
 						<th>사이트</th>
 						<td>
@@ -81,6 +58,29 @@
 							</select>
 						</td>
 					</tr>
+					<tr>
+						<th>소셜번호</th>
+						<td>
+							<input type="text" name="socialSq" id="socialSq"/>
+						</td>
+
+						<th>등록자</th>
+						<td>
+							<input type="text" name="regId" id="regId"/>
+						</td>
+
+						<th>사용여부</th>
+						<td>
+							<select name="useYn">
+								<option value="">전체</option>
+								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>진행기간</th>
+						<td colspan="7" id="terms"></td>
+					</tr>
 				</tbody>
 			</table>
 			<ul class="panelBar">
@@ -130,7 +130,7 @@
 						<!-- 버튼 배치 영역 -->
 						<ul class="panelBar">
 							<li class="right">
-								<button type="button" class="btn btn-info btn-lg" onclick="$('#detailForm')[0].reset(); $('.tabsNav li').eq(1).addClass('off');">신규</button>
+								<button type="button" class="btn btn-info btn-lg" onclick="afreshBtn()">신규</button>
 							<button type="button" class="btn btn-success btn-lg" onclick="fnSocialSaveValid();">저장</button>
 							</li>
 						</ul>
@@ -196,10 +196,13 @@
 										<select name="socialType" required="required" data-valid-name="소셜유형">
 											<option th:if="${socialTypeList}" th:each="oneData, status : ${socialTypeList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
 										</select>
-										 <span id="planSpan">
+										
 											<button type="button" class="btn btn-base btn-lg" id="btnSearchPlan">기획전 조회</button>
-											<input type="text" name="socialPlanSq" readonly="readonly"/>
-											<input type="hidden" name="planSq"/>
+											/ 기획전
+										 <span id="planSpan">
+											<select name="planSq" id="planSq">
+													<option th:if="${planList}" th:each="oneData, status : ${planList}" th:value="${oneData.planSq}" th:text="|[${oneData.planSq}]  ${oneData.planNm}|"></option>
+											</select>
 										</span>
 									</td>
 									
@@ -261,15 +264,12 @@
 							<li class="right">
 								<button type="button" class="btn btn-default btn-lg" onclick="fnOpenGoodsPopup();">상품추가</button>
 								<button type="button" class="btn btn-default btn-lg" onclick="fnDeleteGoods();">상품삭제</button>
-								<button type="button" class="btn btn-default btn-lg" onclick="fnSocialGoodsExcelUpload();">엑셀상품추가</button>
-								<button type="button" class="btn btn-default btn-lg" onclick="cfnDownloadSampleFile('SF011');">엑셀상품추가 양식 다운로드</button>
+								<!-- <button type="button" class="btn btn-default btn-lg" onclick="fnSocialGoodsExcelUpload();">엑셀상품추가</button>
+								<button type="button" class="btn btn-default btn-lg" onclick="cfnDownloadSampleFile('SF011');">엑셀상품추가 양식 다운로드</button> -->
 								<button type="button" class="btn btn-success btn-lg" onclick="fnSocialGoodsSave();">저장</button>
-								<button type="button" class="btn btn-success btn-lg" onclick="fnSocialSaveValid();">저장</button>
 							</li>
 						</ul>
-					<div class="panelStyle">	
 						<div id="gridGoodsList" style="width: 100%; height: 500px;"  class="ag-theme-balham"></div>
-					</div>
 					
 					
 					<!-- <li class="boxContentBtnB" style="margin-top: 10px;">
@@ -290,7 +290,7 @@
 /*<![CDATA[*/
 
 	var siteList = gagajf.convertToArray([[${siteList}]]);
-	var socialTypeList = ([[${socialTypeList}]]);
+	var socialTypeList = gagajf.convertToArray([[${socialTypeList}]]);
 	var wmGbList = {"A":"ALL", "P":"웹", "M":"모바일"};
 	var applyList = {"P":"대기", "A":"적용", "F":"종료"};
 
@@ -354,11 +354,15 @@
 		$(formId + ' input[name=socialTnm]').val(data.socialTnm);
 		$(formId + ' select[name=siteCd]').val(data.siteCd);
 		$(formId + ' select[name=useYn]').val(data.useYn);
+		$(formId + ' select[name=applyGb]').val(data.applyGb);
 		$(formId + ' select[name=frontGb]').val(data.frontGb);
 		$(formId + ' select[name=socialType]').val(data.socialType);
 		$(formId + ' select[name=planSq]').val(data.planSq);
 		$(formId + ' select[name=socialType]').trigger('change');
 		
+		$(formId + ' select[name=planSq]').attr("disabled",true);
+		$(formId + ' select[name=socialType]').attr("disabled",true);
+		$(formId + ' button[id=btnSearchPlan]').css("display","none");
 		// 진행 기간 설정
 		var stDate = data.socialStdt.split(" ")[0];
 		var edDate = data.socialEddt.split(" ")[0];
@@ -374,6 +378,18 @@
 		$('#edTimeHour').val(edTime.substring(0,2));
 	}
 	
+	// 신규버튼  클릭 시 
+	var afreshBtn = function() {
+		var formId = '#detailForm';
+		
+		$('#detailForm')[0].reset();
+		$('.tabsNav li').eq(1).addClass('off');
+		
+		$(formId + ' select[name=planSq]').removeAttr("disabled");
+		$(formId + ' select[name=socialType]').removeAttr("disabled");
+		$(formId + ' button[id=btnSearchPlan]').removeAttr("style");
+		
+	};
 	// 소셜 기본정보 저장
 	var fnSocialSaveValid = function() {
 		var formId = '#detailForm';
@@ -497,17 +513,17 @@
 		{headerName: "상품코드"				, field:'goodsCd'	, width:300 , cellClass: 'text-center',
 			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
 		},
-		{headerName: '적용 판매가'			, field:'currAprice', width:200 , cellClass: 'text-right', cellEditor: 'numericCellEditor', hide : true
+		{headerName: '적용 판매가'			, field:'currAprice', width:200 , cellClass: 'text-right', cellEditor: 'numericCellEditor'
 			, editable: function(params) { return gagajf.isNull(params.data.dcArate) ? true : false; } 
 			, cellRenderer: function(params) { return gagajf.isNull(params.value) ? '' : params.value.addComma(); }
 		}, // 변경 후 현재판매가
-		{headerName: '적용 할인율'			, field:'dcArate'	, width:200 , cellClass: 'text-right', cellEditor: 'numericCellEditor', hide : true
+		{headerName: '적용 할인율'			, field:'dcArate'	, width:200 , cellClass: 'text-right', cellEditor: 'numericCellEditor'
 			, editable: function(params) { return gagajf.isNull(params.data.currAprice) ? true : false; }
 		}, // 변경 후 할인율
-		{headerName: '적용 PC 포인트'		, field:'pntAprate'	, width:200 , cellClass: 'text-right', editable : true, cellEditor: 'numericCellEditor', hide : true }, // 변경 후 포인트적립율(PC)
-		{headerName: '적용 MOBILE 포인트'	, field:'pntAmrate'	, width:200 , cellClass: 'text-right', editable : true, cellEditor: 'numericCellEditor', hide : true }, // 변경 후 포인트적립율(모바일)
-		{headerName: '표시순서'				, field:'dispOrd'	, width:100 , cellClass: 'text-center', editable : true, cellEditor: 'numericCellEditor', hide : true},
-		{headerName: '삭제여부'				, field:'delYn'		, width:100 , cellClass: 'text-center', hide : true},
+		{headerName: '적용 PC 포인트'		, field:'pntAprate'	, width:200 , cellClass: 'text-right', editable : true, cellEditor: 'numericCellEditor'}, // 변경 후 포인트적립율(PC)
+		{headerName: '적용 MOBILE 포인트'	, field:'pntAmrate'	, width:200 , cellClass: 'text-right', editable : true, cellEditor: 'numericCellEditor' }, // 변경 후 포인트적립율(모바일)
+		{headerName: '표시순서'				, field:'dispOrd'	, width:100 , cellClass: 'text-center', editable : true, cellEditor: 'numericCellEditor'},
+		{headerName: '삭제여부'				, field:'delYn'		, width:100 , cellClass: 'text-center', hide: true},
 	];
 
 	var gridOptionsGoods = gagaAgGrid.getGridOptions(columnDefsGoods);
@@ -654,7 +670,7 @@
 		});
 	}
 	
-	var fnSocialGoodsExcelUpload = function() {
+	/* var fnSocialGoodsExcelUpload = function() {
 		cfnExcelUploadPopup('socialGoodsExcelUpload', 'socialGoodsExcelUpload');
 	}
 	
@@ -667,7 +683,7 @@
 		
 		var jsonData = JSON.stringify(data);
 		gagajf.ajaxJsonSubmit('/marketing/social/goods/excelupload', jsonData, fnSearchSocialGoodsList);
-	}
+	} */
 	
 	// 소셜 상품 저장
 	var fnSocialGoodsSave = function() {
@@ -680,7 +696,7 @@
 		
 		var checkData = [];
 		var msg = '';
-		/* $(goodsList).each(function(idx, goods) {
+		$(goodsList).each(function(idx, goods) {
 			if (goods.dcArate > 100) {
 				msg = '할인율은 100을 넘을 수 없습니다.';
 				return false;
@@ -696,7 +712,7 @@
 		if (!gagajf.isNull(msg)) {
 			mcxDialog.alert(msg);
 			return;
-		} */
+		}
 		
 		mcxDialog.confirm('저장 하시겠습니까?', {
 			cancelBtnText: "취소",
@@ -714,8 +730,7 @@
 	});
 	
 	var popupPlan = function(result) {
-		$('#detailForm input[name=socialPlanSq]').val("[" + result[0].planSq + "] " +result[0].planNm);
-		$('#detailForm input[name=planSq]').val(result[0].planSq);
+		$('#detailForm select[name=planSq]').val(result[0].planSq);
 	}
 	
 	$(document).ready(function() {

+ 330 - 0
src/main/webapp/WEB-INF/views/withdraw/WithdrawExceptionListForm.html

@@ -0,0 +1,330 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : WithdrawExceptionListForm.html
+ * @desc    : 회수예외관리 Page
+ *=============================================================
+ * ISTYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *=============================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  ==================================
+ * 1.0  2021.02.22   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/exception/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="recallStat" id="recallStat">
+									<option value="">전체</option>
+									<option value="P" selected>대기</option>
+									<option value="S">처리완료</option>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<th class="dashR">등록일</th>
+							<td colspan="4" 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: "반품예외처리번호",		field: "recallExceptionNo", width: 50,	cellClass: 'text-center', hide: true},
+		{headerName: "No.",				field: "rnum",				width: 50,	cellClass: 'text-center'},
+		{headerName: "처리상태",			field: "recallStat",		width: 100,	cellClass: 'text-center',rowSpan: params => params.data.rowspanRank === 1 ? params.data.rowspanCnt : 1,
+		    cellClassRules: {
+		        'cell-span': "data.rowspanRank == 1"
+		      },
+			cellRenderer: function(params) {
+				var btnText = '';
+				if(params.data.recallStat === 'P') {
+					btnText= '<a href="javascript:void(0);"  onclick="fnComplete(\''+params.data.recallExceptionNo+'\')" class="btn btn-success btn-ssm">대기</a>';
+				} else { btnText = '완료' }
+				return btnText;
+			}			
+		},
+		
+		{headerName: "주문번호",			field: "orderNo",			width: 200,	cellClass: 'text-center', rowSpan: params => params.data.rowspanRank === 1 ? params.data.rowspanCnt : 1,  
+		    cellClassRules: {
+		        'cell-span': "data.rowspanRank == 1"
+		      },
+			
+			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: "customerName",		width: 100,	cellClass: 'text-center'},
+		{headerName: "택배사명",			field: "logisticsName",		width: 100,	cellClass: 'text-center'},
+		{headerName: "반송장번호",			field: "invoiceNo",			width: 120,	cellClass: 'text-center'},
+		{headerName: "요금구분",			field: "chargeType",		width: 80,	cellClass: 'text-center'},
+		{headerName: "배송비",			field: "chargeAmount",		width: 100,	cellClass: 'text-right'
+			,valueFormatter: function(params) {
+				if (params.value > 0) {
+					return params.value.addComma();
+				}else{
+					return '0';
+				}
+			}
+		},
+		{headerName: "작업자",			field: "userNameCreated",	width: 100,	cellClass: 'text-center'},
+		{headerName: "예외사유",			field: "reasonCd",			width: 150,	cellClass: 'text-center'},
+		{headerName: "WMS메시지",			field: "adminMemo",			width: 300,	cellClass: 'text-left'},
+		{headerName: "브랜드명",			field: "brandNm",			width: 150,	cellClass: 'text-center'},
+		{headerName: "상품코드",			field: "productCode",		width: 100,	cellClass: 'text-center',
+			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: "SKU코드",			field: "skuCode",			width: 100,	cellClass: 'text-center'},
+		{headerName: "상품명",			field: "productName",		width: 200,	cellClass: 'text-left'},
+		{headerName: "속성",		    	field: "skuValue",			width: 80,	cellClass: 'text-center'},
+		{headerName: "원코드",			field: "skuModelNo",		width: 150,	cellClass: 'text-left'},
+		{headerName: "수량",				field: "exceptionQty",		width: 80,	cellClass: 'text-right'},
+		{headerName: "주문경로",			field: "siteCd",			width: 100,	cellClass: 'text-left'},
+		{headerName: "등록일시",			field: "dateCreated",		width: 150,	cellClass: 'text-center'}
+		
+	];
+
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	gridOptions.suppressRowTransform =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.withdrawExceptionList);
+		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>

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

@@ -926,4 +926,7 @@ table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
   input[type="date"], input[type="month"], input[type="time"],
   input[type="week"], input[type="number"], input[type="email"],
   input[type="url"]{ font-size:16px;}
-}
+}
+.cell-span {
+	background-color: #FFFFFF;
+}

+ 31 - 4
src/main/webapp/ux/js/admin.popup.js

@@ -486,13 +486,15 @@ var cfnOpenMainContentsPopup = function(cateNo, contentsLoc) {
  *     cfnOpenLookbookBannerPopup(lookbookSq,lookbookTitle);
  * </pre>
  * @param  : lookbookSq - 룩북 일련번호
+ * 			 mode - 모드(N:신규, U:상세/수정, C:복사) 필수
  * @since  : 2020/02/25
  * @author : sasa004
  */
-var cfnOpenLookbookBannerPopup = function(lookbookSq, lookbookTitle) {
-	var actionUrl = "/display/lookbook/banner/popup/form?lookbookSq=" + lookbookSq;
-	if (typeof(lookbookTitle) != 'undefined') actionUrl += "&lookbookTitle=" + encodeURIComponent(lookbookTitle);
-	uifnPopupClose('popupLookbookBanner');
+var cfnOpenLookbookBannerPopup = function(mode, lookbookSq) {
+	var actionUrl = "/display/lookbook/banner/popup/form?mode="+mode;
+	if (typeof(lookbookSq) != 'undefined') actionUrl += "&lookbookSq=" + lookbookSq;
+	//if (typeof(lookbookTitle) != 'undefined') actionUrl += "&lookbookTitle=" + encodeURIComponent(lookbookTitle);
+	//uifnPopupClose('popupLookbookBanner');
 	cfnOpenModalPopup(actionUrl, 'popupLookbookBanner');
 }
 
@@ -708,6 +710,7 @@ var cfnOpenBrandGroupListPopup = function(callbackfn, multiGb, type) {
 	cfnOpenModalPopup(actionUrl, "popupBrandGroup");
 }
 
+
 /**
  * @type   : function
  * @access : public
@@ -889,3 +892,27 @@ var cfnOpenMainMultiContentsPopup = function(cateNo, contentsLoc) {
 	//uifnPopClose('popupMainMultiContents');
 	cfnOpenModalPopup(actionUrl, 'popupMainMultiContents');
 }
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 제휴채널 팝업
+ * <pre>
+ *     cfnOpenGoodsPopup('goosCallbackFun');
+ * </pre>
+ * @param  : callbackfun - 콜백함수
+ * @since  : 2020/01/17
+ * @author : eskim
+ */
+var cfnOpenAfChannelPopup = function(callbackfun) {
+	var actionUrl = "/business/channel/popup/form";
+	console.log(callbackfun);
+	if (typeof(callbackfun) == 'undefined'){
+		return;
+	}
+	if (typeof(callbackfun) != 'undefined'){
+		actionUrl += "?callBackFun=" + callbackfun;
+	} 
+		
+	cfnOpenModalPopup(actionUrl,'popupAfChannel');
+}