Prechádzať zdrojové kódy

Merge branch 'develop' into bin2107

bin2107 5 rokov pred
rodič
commit
89d0b8a742
23 zmenil súbory, kde vykonal 2162 pridanie a 568 odobranie
  1. 166 2
      src/main/java/com/style24/admin/biz/dao/TsaDeliveryDao.java
  2. 3 32
      src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java
  3. 21 2
      src/main/java/com/style24/admin/biz/dao/TsaWmsWithdrawDao.java
  4. 266 6
      src/main/java/com/style24/admin/biz/service/TsaDeliveryService.java
  5. 15 36
      src/main/java/com/style24/admin/biz/service/TsaGoodsService.java
  6. 28 5
      src/main/java/com/style24/admin/biz/service/TsaWmsWithdrawService.java
  7. 143 0
      src/main/java/com/style24/admin/biz/web/TsaDeliveryController.java
  8. 7 8
      src/main/java/com/style24/admin/biz/web/TsaGoodsController.java
  9. 18 0
      src/main/java/com/style24/admin/support/env/TsaConstants.java
  10. 285 256
      src/main/java/com/style24/persistence/domain/Delivery.java
  11. 7 5
      src/main/java/com/style24/persistence/domain/GoodsVideo.java
  12. 0 38
      src/main/java/com/style24/persistence/domain/Video.java
  13. 12 20
      src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml
  14. 430 2
      src/main/java/com/style24/persistence/mybatis/shop/TsaDelivery.xml
  15. 46 111
      src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  16. 34 1
      src/main/java/com/style24/persistence/mybatis/wms/TsaWmsWithdraw.xml
  17. 398 0
      src/main/webapp/WEB-INF/views/delivery/AssignListForm.html
  18. 124 0
      src/main/webapp/WEB-INF/views/delivery/AssignPopupForm.html
  19. 8 6
      src/main/webapp/WEB-INF/views/delivery/DeliveryDetailItemForm.html
  20. 1 1
      src/main/webapp/WEB-INF/views/delivery/DeliveryWithdrawDirectiveListForm.html
  21. 1 1
      src/main/webapp/WEB-INF/views/delivery/SaveInvoiceForm.html
  22. 111 33
      src/main/webapp/WEB-INF/views/goods/GoodsVideoForm.html
  23. 38 3
      src/main/webapp/ux/plugins/gaga/gaga.summernote.js

+ 166 - 2
src/main/java/com/style24/admin/biz/dao/TsaDeliveryDao.java

@@ -4,7 +4,6 @@ import java.util.Collection;
 
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Delivery;
-import com.style24.persistence.domain.GoodsSearch;
 
 
 /**
@@ -20,7 +19,7 @@ public interface TsaDeliveryDao {
 	/**
 	 * 배송 목록 건수
 	 *
-	 * @param goodsSearch
+	 * @param Delivery
 	 * @return
 	 * @author moon
 	 * @since 2021. 02. 26
@@ -166,4 +165,169 @@ public interface TsaDeliveryDao {
 	 * @since 2021. 03. 12
 	 */	
 	Collection<Delivery> getDeliveryWithdrawDirectiveList(Delivery delivery);
+	
+	/**
+	 * 출고처지정 목록 건수
+	 *
+	 * @param 
+	 * @return
+	 * @author moon
+	 * @since 2021. 04. 19
+	 */
+	int getAssignListCount(Delivery delivery);
+	
+	/**
+	 * 출고처지정 목록
+	 *
+	 * @param Delivery 
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2021. 04. 19
+	 */
+	Collection<Delivery> getAssignList(Delivery delivery);	
+	
+	/**
+	 * 출고처 수동지정 대상 조회
+	 *
+	 * @param ordDtlNo - 주문상세번호
+	 * @return Delivery
+	 * @author moon
+	 * @since 2021. 04. 19
+	 */
+	Delivery getDeliveryAssignPopup(Integer ordDtlNo);
+	
+	
+	
+	
+	
+	
+	/**
+	 * 출고대상 주문상세아이템 조회 
+	 *
+	 * @param Delivery 
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2021. 04. 19
+	 */
+	Collection<Delivery> getOrdDtlNoItemList(Delivery delivery);		
+	
+	/**
+	 * 출고처지정 임시 테이블 삭제 
+	 *
+	 * @param Delivery 
+	 * @return 
+	 * @author moon
+	 * @since 2021. 04. 19
+	 */
+	void deleteTbDeliveryLocTmp(Delivery delivery);		
+	
+	
+	/**
+	 * 출고처지정 임시 테이블 등록(일반) 
+	 *
+	 * @param Delivery 
+	 * @return 
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	void insertTbDeliveryLocTmp(Delivery delivery);		
+	
+	
+	/**
+	 * 출고처지정 임시 테이블 등록(세트) 
+	 *
+	 * @param Delivery 
+	 * @return 
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	void insertTbDeliveryLocSetTmp(Delivery delivery);		
+	
+	
+	/**
+	 * 출고처 지정 임시테이블 세트상품갯수 max값 조회
+	 * @param  
+	 * @return int
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	int getDeliveryLocTmpGoodsSetMaxCnt(Delivery delivery);	
+	
+	/**
+	 * 출고처지정 임시 테이블 수정 
+	 * @param Delivery
+	 * @return
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */	
+	void updateTbDeliveryLocSetTmp(Delivery delivery);		
+	
+	/**
+	 * 주문상세 출고처 지정대상 리스트
+	 *
+	 * @param Delivery 
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	Collection<Delivery> getOrdDtlAssignLocList(Delivery delivery);		
+	
+	
+	/**
+	 * 출고처지정 등록
+	 *
+	 * @param Delivery
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	void createDeliveryAssign(Delivery delivery);	
+
+	/**
+	 * 출고처지정 이력 등록
+	 *
+	 * @param Delivery
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	void createDeliveryAssignHst(Delivery delivery);
+	
+	/**
+	 * 주문상세 출고처 등록 
+	 *
+	 * @param Delivery
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	void updateOrdDtlDelvCd(Delivery delivery);
+	
+	/**
+	 * 주문상세 아이템 목록 
+	 *
+	 * @param Delivery 
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	Collection<Delivery> getOrdDtlItemList(Delivery delivery);		
+	
+	/**
+	 * 출고지정 삭제
+	 *
+	 * @param Delivery
+	 * @return void
+	 * @throws 
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	void deleteTbDeliveryAssign(Delivery delivery);	
+	
+	/**
+	 * 주문상세 출고처 지정 취소
+	 *
+	 * @param delivery
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	void cancelAssignDelvLoc(Delivery delivery);
+	
 }

+ 3 - 32
src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java

@@ -29,7 +29,6 @@ import com.style24.persistence.domain.NoticeGoods;
 import com.style24.persistence.domain.Option;
 import com.style24.persistence.domain.ReinboundInform;
 import com.style24.persistence.domain.SizeInfo;
-import com.style24.persistence.domain.Video;
 import com.style24.persistence.domain.WmsColorMapping;
 import com.style24.persistence.domain.WmsGoods;
 import com.style24.persistence.domain.WmsSeasonMapping;
@@ -770,17 +769,7 @@ public interface TsaGoodsDao {
 	 * @author eskim
 	 * @since 2020. 11. 16
 	 */
-	void updateNotUseGoodsVideo(Video video);
-
-	/**
-	 * 동영상 일련번호 조회
-	 *
-	 * @param video
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 16
-	 */
-	String getVideoSeq(Video video);
+	void updateNotUseGoodsVideo(GoodsVideo goodsVideo);
 
 	/**
 	 * 동영상 등록
@@ -789,7 +778,7 @@ public interface TsaGoodsDao {
 	 * @author eskim
 	 * @since 2020. 11. 16
 	 */
-	void createVideo(Video video);
+	void createGoodsVideo(GoodsVideo goodsVideo);
 
 	/**
 	 * 동영상 수정
@@ -798,25 +787,7 @@ public interface TsaGoodsDao {
 	 * @author eskim
 	 * @since 2020. 11. 16
 	 */
-	void updateVideo(Video video);
-
-	/**
-	 * 동영상 위치 삭제 Y 처리
-	 *
-	 * @param video
-	 * @author eskim
-	 * @since 2020. 11. 16
-	 */
-	void delVideoDispLoc(Video video);
-
-	/**
-	 * 동영상 위치 수정/저장
-	 *
-	 * @param video
-	 * @author eskim
-	 * @since 2020. 11. 16
-	 */
-	void saveVideoDispLoc(Video video);
+	void updateGoodsVideo(GoodsVideo goodsVideo);
 
 	/**
 	 * 상품 옵션 존재여부 확인

+ 21 - 2
src/main/java/com/style24/admin/biz/dao/TsaWmsWithdrawDao.java

@@ -5,7 +5,7 @@ import java.util.Collection;
 import org.springframework.dao.DataAccessException;
 
 import com.style24.persistence.domain.WmsWithdraw;
-
+import com.style24.persistence.domain.Delivery;
 import com.style24.core.support.annotation.WmsDs;
 import org.springframework.stereotype.Repository;
 
@@ -40,6 +40,25 @@ public interface TsaWmsWithdrawDao {
 	 */
 	Collection<WmsWithdraw> getWmsWithdrawList(WmsWithdraw wmsWithdraw);
 	
+	/**
+	 *  출고처지정 지연재고 등록
+	 * 
+	 * @param WmsWithdraw
+	 * @return int
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	void insertWmsTbIfDelifixQty(Delivery delivery);	
+	
+	/**
+	 *  출고처지정 지연재고 삭제
+	 * 
+	 * @param WmsWithdraw
+	 * @return int
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	void deleteWmsTbIfDelifixQty(Delivery delivery);
+	
 	
-
 }

+ 266 - 6
src/main/java/com/style24/admin/biz/service/TsaDeliveryService.java

@@ -17,6 +17,10 @@ import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.Delivery;
 import com.style24.persistence.domain.GoodsSearch;
 
+
+import com.style24.core.biz.service.TscWmsService;
+import com.style24.admin.biz.service.TsaWmsWithdrawService;
+import com.style24.persistence.domain.WmsDelivery;
 import com.style24.core.support.env.TscConstants.OrderDetailStat;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.core.biz.dao.TscOrderDao;
@@ -44,10 +48,16 @@ public class TsaDeliveryService {
 	@Autowired
 	private TscOrderDao orderDao;
 	
-
 	@Autowired
 	private ObjectMapper mapper;
 	
+	@Autowired
+	private TscWmsService wmsService;
+	
+	@Autowired
+	private TsaWmsWithdrawService wmsWithdrawService;
+	
+	
 	
 	/**
 	 * 배송 목록 건수
@@ -126,7 +136,7 @@ public class TsaDeliveryService {
 	/**
 	 * 배송완료처리
 	 *
-	 * @param -TsaDelivery
+	 * @param -Delivery
 	 * @return void
 	 * @author moon
 	 * @since 2021. 03. 05
@@ -140,7 +150,7 @@ public class TsaDeliveryService {
 		delivery.setRegNo(userNo);
 		// 주문상세상태 => 배송완료
 		delivery.setOrdDtlStat(OrderDetailStat.DELIVERY_COMPLETE.value());
-		delivery.setHstMemo("수기배송완료처리");
+		//delivery.setHstMemo("수기배송완료처리");
 
 		// 주문상세 상태 값 수정
 		deliveryDao.updateOrderDetailStat(delivery);
@@ -211,7 +221,7 @@ public class TsaDeliveryService {
 	/**
 	 * 출고금지상품 삭제
 	 *
-	 * @param -TsaDelivery
+	 * @param -Delivery
 	 * @return void
 	 * @author moon
 	 * @since 2020. 11. 05
@@ -241,7 +251,7 @@ public class TsaDeliveryService {
 	/**
 	 * 출고금지상품 등록
 	 *
-	 * @param -TsaDelivery
+	 * @param -Delivery
 	 * @return void
 	 * @author moon
 	 * @since 2020. 11. 05
@@ -283,9 +293,259 @@ public class TsaDeliveryService {
 	 * @param -Delivery
 	 * @return Collection<Delivery>
 	 * @author moon
-	 * @since 2021. 03. 12
+	 * @since 2021. 04. 12
 	 */	
 	public Collection<Delivery> getDeliveryWithdrawDirectiveList(Delivery delivery) {
 		return deliveryDao.getDeliveryWithdrawDirectiveList(delivery);
 	}
+	
+	/**
+	 * 출고처지정 목록 건수
+	 *
+	 * @param Delivery
+	 * @return
+	 * @author moon
+	 * @since 2021. 04. 19
+	 */
+	public int getAssignListCount(Delivery delivery) {
+		return deliveryDao.getAssignListCount(delivery);
+	}
+	
+	/**
+	 * 출고처지정 목록
+	 *
+	 * @param -Delivery
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2021. 04. 19
+	 */
+	public Collection<Delivery> getAssignList(Delivery delivery) {
+		// multi row 검색관련 처리
+//		
+//		if (StringUtils.isNotBlank(delivery.getCondition())) {
+//			TsitUtil tsitUtil = new TsitUtil();
+//			String searchCondition = tsitUtil.replaceMultiSelectParamsArr(delivery.getCondition());
+//			delivery.setConditions(searchCondition.split(","));
+//		}
+
+		// 외부몰권한일 때 외부몰벤더ID 설정
+		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.getAssignList(delivery);
+	}	
+	
+	/**
+	 * 출고처 수동지정 대상 조회
+	 *
+	 * @param ordDtlNo - 주문상세번호
+	 * @return Delivery
+	 * @author moon
+	 * @since 2021. 04. 19
+	 */
+	public Delivery getDeliveryAssignPopup(Integer ordDtlNo) {
+		return deliveryDao.getDeliveryAssignPopup(ordDtlNo);
+	}
+	
+	/**
+	 * 출고처지정 팝업 목록
+	 *
+	 * @param -Delivery
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2021. 04. 19
+	 */
+	@Transactional("shopTxnManager")
+	public Collection<Delivery> getDeliveryLocStockList(Delivery delivery) {
+		Collection<Delivery> delvLocList = null;
+		String goodsType    = "";
+		String supplyCompCd = "";
+		String tmpKey = "ITEM"+TsaSession.getInfo().getUserNo();
+		
+		/** 1. 주문상세번호에 대한 단품 리스트 조회 */
+		Collection<Delivery>  itemList = deliveryDao.getOrdDtlNoItemList(delivery);
+		
+		/** 2. 임시 테이블 삭제                         */
+		Delivery tempKey = new Delivery();
+		tempKey.setUseGb(tmpKey);
+		deliveryDao.deleteTbDeliveryLocTmp(tempKey);
+		
+		/** 3. 실재고 조회   && 임시 테이블 저장   */
+		for(Delivery item : itemList) {
+			Integer productNo = item.getProductNo();
+			String skuCode    = item.getOptCd();
+			String styleCd    = item.getGoodsCd();
+			String colorCd    = item.getOptCd1();
+			String sizeCd     = item.getOptCd2();
+			supplyCompCd = item.getSupplyCompCd();
+			// 실재고 조회 
+			Collection<WmsDelivery> stockList = wmsService.getRealStock(productNo, skuCode, styleCd, colorCd, sizeCd);
+			
+			if(stockList != null ) {
+				for(WmsDelivery relStock : stockList) {
+					item.setDelvLocCd(relStock.getStockLoc());
+					item.setLocQty(relStock.getLocQty());
+					item.setUseGb(tmpKey);
+					if(relStock.getLocQty() >= item.getOrdQty()) {
+						if("G056_S".equals(item.getGoodsType())) {
+							goodsType = "G056_S";
+							// 세트 상품일경우 임시테이블 저장 ( 재고수와  주문수량 나눈값의 최소값 저장 )
+							deliveryDao.insertTbDeliveryLocSetTmp(item);
+						} else {
+							// 일반 상품일경우 임시테이블 저장 ( 재고수와  주문수량 나눈값의 최소값 저장 )
+							deliveryDao.insertTbDeliveryLocTmp(item);
+						}
+					}
+				}
+			}
+		}
+		
+		if("G056_S".equals(goodsType)) {
+			
+			// 임시테이블 MAX(GOODS_LOC_SET_CNT) 조회 
+			Delivery tmep = new Delivery();
+			tmep.setUseGb(tmpKey);
+			int setCnt = deliveryDao.getDeliveryLocTmpGoodsSetMaxCnt(tmep);
+			
+			// 임시테이블  세트갯수 비교  세트 있는 모든 매장 업데이트
+			if(itemList.size() == setCnt ) {
+				Delivery tmp = new Delivery();
+				tmp.setOrdDtlNo(delivery.getOrdDtlNo());
+				tmp.setGoodsLocSetCnt(setCnt);
+				tmp.setUseGb(tmpKey);
+				deliveryDao.updateTbDeliveryLocSetTmp(tmp);
+			}			
+		}
+		
+		/** 5. 재고 있는 출고처만 조회  */
+		delivery.setGoodsLocCnt(itemList.size());
+		delivery.setSupplyCompCd(supplyCompCd);
+		delivery.setUseGb(tmpKey);
+		delvLocList = deliveryDao.getOrdDtlAssignLocList(delivery);
+		
+		return delvLocList;
+	}
+	
+
+	/**
+	 * 출고처지정 처리
+	 *
+	 * @param Delivery
+	 * @return
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	@Transactional("shopTxnManager")
+	public int saveDeliveryLocAssign(Delivery delivery) {
+		int succ =0;
+		Integer userNo = TsaSession.getInfo().getUserNo();
+		delivery.setRegNo(userNo);
+		delivery.setUpdNo(userNo);
+		
+		
+		// 주문상세 조회 
+		Collection<Delivery> itemList = deliveryDao.getOrdDtlItemList(delivery);
+		Delivery chk = itemList.iterator().next();
+		if(OrderDetailStat.PAYMENT_COMPLETE.value().equals(chk.getOrdDtlStat())) {
+
+			// 출고처지정 등록  (출고처가 창고이면  수락여부 Y:수락  아니면 P:대기)
+			if(TsaConstants.DeliveryClassification.WARE_HOUSE.value().equals(delivery.getDelvLocClsf())) {
+				delivery.setDelvArGb("Y");
+			} else {
+				delivery.setDelvArGb("P");
+			}
+			delivery.setLocQty(0);
+			deliveryDao.createDeliveryAssign(delivery);
+			
+			// 출고처지정 이력 등록 
+			deliveryDao.createDeliveryAssignHst(delivery);
+			
+			// 주문상세 출고처 및 상태 업데이트
+			delivery.setOrdDtlStat(OrderDetailStat.DELIVERY_LOC_ASSIGN.value());
+			deliveryDao.updateOrdDtlDelvCd(delivery);
+	
+			// 주문상세이력
+			Order order = new Order();
+			order.setOrdDtlNo(delivery.getOrdDtlNo());
+			order.setUpdNo(userNo);
+			order.setRegNo(userNo);
+			orderDao.createOrderDetailHst(order);		
+			
+			// 창고일경우 와 매장일경우  분리해서 재고지연테이블에 등록    
+			if(TsaConstants.DeliveryClassification.WARE_HOUSE.value().equals(delivery.getDelvLocClsf())) {
+				for(Delivery item : itemList) {
+					item.setOrdQty(item.getItemQty());
+					wmsWithdrawService.insertWmsTbIfDelifixQty(item);
+				}
+			} else {
+	//			for(Delivery item : itemList) {
+	//				// 매장쪽 
+	//			}
+			}
+			succ =1;
+		}
+		
+		return succ;
+	}
+	
+	/**
+	 * 출고처지정 취소
+	 *
+	 * @param Delivery
+	 * @return void
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	@Transactional("shopTxnManager")
+	public void cancelAssignDelvLoc(Delivery delivery) {
+		log.info("delivery {}"+delivery);
+		int userId = TsaSession.getInfo().getUserNo();
+		
+		//1. 창고 매장 구분  지연재고 삭제 
+		if(TsaConstants.DeliveryClassification.WARE_HOUSE.value().equals(delivery.getDelvLocClsf())) {
+			wmsWithdrawService.deleteWmsTbIfDelifixQty(delivery);
+		} else {  // 매장일때 
+			
+		}
+		
+		//2. 출고처지정 삭제 
+		deliveryDao.deleteTbDeliveryAssign(delivery);
+		
+		//3. 주문상세 출고처지정 초기화  및 주문상세 이력 
+		delivery.setRegNo(userId);
+		delivery.setUpdNo(userId);
+		delivery.setOrdDtlStat(OrderDetailStat.PAYMENT_COMPLETE.value());
+		deliveryDao.cancelAssignDelvLoc(delivery);
+		
+		//4. 주문상세이력
+		Order order = new Order();
+		order.setOrdDtlNo(delivery.getOrdDtlNo());
+		order.setUpdNo(userId);
+		order.setRegNo(userId);
+		orderDao.createOrderDetailHst(order);		
+	}	
+	
 }

+ 15 - 36
src/main/java/com/style24/admin/biz/service/TsaGoodsService.java

@@ -52,7 +52,6 @@ import com.style24.persistence.domain.ReinboundInform;
 import com.style24.persistence.domain.SearchData;
 import com.style24.persistence.domain.SizeInfo;
 import com.style24.persistence.domain.SupplyCompany;
-import com.style24.persistence.domain.Video;
 import com.style24.persistence.domain.WmsColorMapping;
 import com.style24.persistence.domain.WmsGoods;
 import com.style24.persistence.domain.WmsSeasonMapping;
@@ -2184,10 +2183,8 @@ public class TsaGoodsService {
 	@Transactional("shopTxnManager")
 	public void updateNotUseGoodsVideo(Collection<GoodsVideo> goodsVideos) {
 		for (GoodsVideo goodsVideo : goodsVideos) {
-			Video video = new Video();
-			video.setUpdNo(TsaSession.getInfo().getUserNo());
-			video.setVideoSq(goodsVideo.getVideoSq());
-			goodsDao.updateNotUseGoodsVideo(video);
+			goodsVideo.setUpdNo(TsaSession.getInfo().getUserNo());
+			goodsDao.updateNotUseGoodsVideo(goodsVideo);
 		}
 	}
 
@@ -2200,34 +2197,16 @@ public class TsaGoodsService {
 	 * @since 2020. 11. 16
 	 */
 	@Transactional("shopTxnManager")
-	public void saveGoodsVideo(Video video) {
-		video.setRegNo(TsaSession.getInfo().getUserNo());
-		video.setUpdNo(TsaSession.getInfo().getUserNo());
-		if (video.getVideoSq() == null || video.getVideoSq() == 0) {
-
-			String videoSeq = goodsDao.getVideoSeq(video);
-			if (StringUtils.isBlank(videoSeq)) {
-				goodsDao.createVideo(video);
-			} else {
-				//video.setVideoSq(Integer.parseInt(videoSeq));  //why?
-				//goodsDao.updateVideo(video);
-			}
-		}
-
-		if (video.getVideoSq() == null || video.getVideoSq() == 0) {
-			String videoSeq = goodsDao.getVideoSeq(video);
-
-			if (!StringUtils.isBlank(videoSeq)) {
-				video.setVideoSq(Integer.parseInt(videoSeq));
-			}
-		}
-
-		//goodsDao.delVideoDispLoc(video);  why?
-		String[] displocValArr = video.getDisplocValArr();
-		for (String displocVal : displocValArr) {
-			video.setDisplocVal(displocVal);
-			goodsDao.saveVideoDispLoc(video);
+	public void saveGoodsVideo(GoodsVideo goodsVideo) {
+		goodsVideo.setRegNo(TsaSession.getInfo().getUserNo());
+		goodsVideo.setUpdNo(TsaSession.getInfo().getUserNo());
+		
+		if (goodsVideo.getVideoSq() == null || goodsVideo.getVideoSq() == 0) {
+			goodsDao.createGoodsVideo(goodsVideo);
+		}else {
+			goodsDao.updateGoodsVideo(goodsVideo);
 		}
+		
 	}
 
 	/**
@@ -2243,7 +2222,7 @@ public class TsaGoodsService {
 
 		int cnt = 0;
 
-		for (GagaMap map : dataList) {
+		/*for (GagaMap map : dataList) {
 			Video video = mapper.convertValue(map, Video.class);
 			video.setUpdNo(TsaSession.getInfo().getUserNo());
 			video.setRegNo(TsaSession.getInfo().getUserNo());
@@ -2256,18 +2235,18 @@ public class TsaGoodsService {
 				video.setVideoGb("Y");
 			}
 			String videoSeq = goodsDao.getVideoSeq(video);
-
+		
 			if (StringUtils.isBlank(videoSeq)) {
 				goodsDao.createVideo(video);
 			}
-
+		
 			videoSeq = goodsDao.getVideoSeq(video);
 			if (!StringUtils.isBlank(videoSeq)) {
 				video.setVideoSq(Integer.parseInt(videoSeq));
 			}
 			goodsDao.saveVideoDispLoc(video);
 			cnt++;
-		}
+		}*/
 
 		return cnt;
 	}

+ 28 - 5
src/main/java/com/style24/admin/biz/service/TsaWmsWithdrawService.java

@@ -1,17 +1,14 @@
 package com.style24.admin.biz.service;
 
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import lombok.extern.slf4j.Slf4j;
 
+import lombok.extern.slf4j.Slf4j;
 import com.style24.admin.biz.dao.TsaWmsWithdrawDao;
 import com.style24.persistence.domain.WmsWithdraw;
+import com.style24.persistence.domain.Delivery;
 import com.style24.core.support.message.TscMessageByLocale;
 
 /**
@@ -55,4 +52,30 @@ public class TsaWmsWithdrawService {
 		return wmsWithdrawDao.getWmsWithdrawList(wmsWithdraw);
 	}
 	
+	/**
+	 * 출고처지정 지연재고 등록
+	 *
+	 * @param Delivery
+	 * @return
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	@Transactional("wmsTxnManager")
+	public void insertWmsTbIfDelifixQty(Delivery delivery) {
+		wmsWithdrawDao.insertWmsTbIfDelifixQty(delivery);
+	}
+	
+	/**
+	 * 출고처지정 지연재고 삭제 
+	 *
+	 * @param Delivery
+	 * @return
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	@Transactional("wmsTxnManager")
+	public void deleteWmsTbIfDelifixQty(Delivery delivery) {
+		wmsWithdrawDao.deleteWmsTbIfDelifixQty(delivery);
+	}
+	
 }

+ 143 - 0
src/main/java/com/style24/admin/biz/web/TsaDeliveryController.java

@@ -458,4 +458,147 @@ public class TsaDeliveryController extends TsaBaseController {
 		return result;
 	}	
 
+	
+	/**
+	 * 출고처지정 관리
+	 * 
+	 * @return ModelAndView
+	 * @throws Exception
+	 * @author moon
+	 * @since 2021. 04. 19
+	 */
+	@RequestMapping(value = "/assign/form")
+	public ModelAndView assignListForm() throws Exception {
+		ModelAndView mav = new ModelAndView();
+
+		// 몰구분
+		mav.addObject("mallGbList", rendererService.getAvailCommonCodeList("G011"));
+		// 주문상세상태코드
+		mav.addObject("ordDtlStatList", rendererService.getAvailCommonCodeList("G013"));
+		// 출고처
+		mav.addObject("deliveryLocList", rendererService.getDeliveryLocList(""));
+		// 사이트구분
+		mav.addObject("siteCdList", rendererService.getAvailCommonCodeList("G000"));
+		// 정상이월
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+		
+		
+		mav.setViewName("delivery/AssignListForm");
+
+		return mav;
+	}	
+	
+	/**
+	 * 출고처지정 관리 - 출고처지정 목록  
+	 * 
+	 * @param 
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2021. 03. 12
+	 */
+	@PostMapping("/assign/list")
+	@ResponseBody
+	public GagaMap getAssignList(@RequestBody Delivery delivery) throws Exception {
+		
+		GagaMap result = new GagaMap();
+
+		delivery.setPageable(new TscPageRequest(delivery.getPageNo() - 1, delivery.getPageSize()));
+		delivery.getPageable().setTotalCount(deliveryService.getAssignListCount(delivery));
+
+
+		if ("N".equals(delivery.getPageingYn())) {
+			delivery.setPageable(null);
+		}
+		
+		result.set("pageing", delivery);
+		result.set("assignList", deliveryService.getAssignList(delivery));
+		
+		return result;
+	}
+
+	/**
+	 * 출고처지정 팝업 화변
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 08. 11
+	 */
+	@GetMapping("/assign/popup/form/{ordDtlNo}")
+	public ModelAndView getDeliveryLocAssignPopupForm(@PathVariable(value = "ordDtlNo") Integer ordDtlNo) throws Exception {
+		ModelAndView mav = new ModelAndView();
+
+		Delivery delvList = deliveryService.getDeliveryAssignPopup(ordDtlNo);
+
+		mav.addObject("orderDetail", delvList);
+
+		mav.setViewName("delivery/AssignPopupForm");
+		return mav;
+	}	
+	
+	
+	/**
+	 * 출고처지정 팝업 리스트 
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2021. 04. 19
+	 */
+	@PostMapping("/assign/popup/list")
+	@ResponseBody
+	public Collection<Delivery> getDeliveryLocAssingPopupList(@RequestBody Delivery delivery) throws Exception {
+		log.debug("delivery : {}", delivery);
+		if (delivery == null) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		Collection<Delivery> dataList = deliveryService.getDeliveryLocStockList(delivery);
+		return dataList;
+	}
+
+	/**
+	 * 출고처지정 처리
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2021. 04. 20
+	 */
+	@PostMapping("/assign/save")
+	@ResponseBody
+	public GagaResponse saveDeliveryLocAssign(@RequestBody Delivery delivery) throws Exception {
+		if (delivery == null) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+		log.info("delivery {}"+delivery);
+		int succ = deliveryService.saveDeliveryLocAssign(delivery);
+		
+		if(succ == 1) {
+			return super.ok(message.getMessage("SUCC_0004"));
+		} else {
+			return super.ok("이미 출고처가 지정되었습니다.");
+		}	
+	}
+	
+	/**
+	 * 출고처지정 취소 
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 04. 20
+	 */
+	@PostMapping("/cancel/assignDelvLoc")
+	@ResponseBody
+	public GagaResponse cancelAssignDelvLoc(@RequestBody Delivery param) throws Exception {
+		deliveryService.cancelAssignDelvLoc(param);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+	
 }

+ 7 - 8
src/main/java/com/style24/admin/biz/web/TsaGoodsController.java

@@ -58,7 +58,6 @@ import com.style24.persistence.domain.Option;
 import com.style24.persistence.domain.ReinboundInform;
 import com.style24.persistence.domain.SizeInfo;
 import com.style24.persistence.domain.User;
-import com.style24.persistence.domain.Video;
 import com.style24.persistence.domain.WmsColorMapping;
 import com.style24.persistence.domain.WmsGoods;
 import com.style24.persistence.domain.WmsSeasonMapping;
@@ -1648,8 +1647,8 @@ public class TsaGoodsController extends TsaBaseController {
 	 */
 	@PostMapping("/video/save")
 	@ResponseBody
-	public GagaResponse saveGoodsVideo(@RequestBody Video video) {
-		goodsService.saveGoodsVideo(video);
+	public GagaResponse saveGoodsVideo(@RequestBody GoodsVideo goodsVideo) {
+		goodsService.saveGoodsVideo(goodsVideo);
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 
@@ -1664,18 +1663,18 @@ public class TsaGoodsController extends TsaBaseController {
 	 */
 	@PostMapping("/video/excel/save")
 	@ResponseBody
-	public GagaResponse saveExcelGoodsVideo(@RequestBody Video video) throws Exception {
+	public GagaResponse saveExcelGoodsVideo(@RequestBody GoodsVideo goodsVideo) throws Exception {
 		String[] cellName = null;
 		// DB 처리 시 사용되는 파라미터명(셀명) 설정
 		cellName = new String[2];
-		cellName[0] = "displocVal";
-		cellName[1] = "videoVal";
+		cellName[0] = "goodsCd";
+		cellName[1] = "kmcKey";
 		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.default.target.path"), "excel");
-		Collection<GagaMap> dataList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, video.getExcelFileNm()), 0, cellName);
+		Collection<GagaMap> dataList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, goodsVideo.getExcelFileNm()), 0, cellName);
 
 		int cnt = goodsService.saveExcelGoodsVideo(dataList);
 
-		GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, video.getExcelFileNm()));
+		GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, goodsVideo.getExcelFileNm()));
 
 		return super.ok(cnt + " 건 처리되었습니다.");
 	}

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

@@ -41,4 +41,22 @@ public class TsaConstants {
 			return value;
 		}
 	}
+	
+	// 출고처분류
+	public enum DeliveryClassification {
+		WARE_HOUSE("G024_10"),				// 물류창고
+		NORMAL_STORE("G024_20"),			// 일반매장
+		DIRECT_STORE("G024_21"),			// 직송매장
+		SUPPLY_COMPANY("G024_30");			// 입점업체
+
+		private String value;
+
+		private DeliveryClassification(String value) {
+			this.value = value;
+		}
+
+		public String value() {
+			return value;
+		}
+	}	
 }

+ 285 - 256
src/main/java/com/style24/persistence/domain/Delivery.java

@@ -32,7 +32,6 @@ public class Delivery extends TscBaseDomain {
 	private String goodsStat;
 	private String delvBanStdt;
 	private String delvBanEddt;   
-	private Integer  delvBanGoodsSq;
 	private String goodsStatNm;
 	private String supplyCompCd;
 	private String searchTxt;
@@ -48,8 +47,6 @@ public class Delivery extends TscBaseDomain {
 	private String recipDtlAddr;
 	private String delvMemo;
 	private String delYn;
-	private Integer custNo;
-	private Integer custDelvAddrSq;
 	private String goodsType;
 	private String goodsTypeNm;
 	private String sellStoreCd;
@@ -57,30 +54,19 @@ public class Delivery extends TscBaseDomain {
 	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 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;
@@ -88,8 +74,12 @@ public class Delivery extends TscBaseDomain {
 	private String termGb;
 	private String stDate;
 	private String edDate;
-	
-	
+	private String ordDt;       	// 주문일시
+	private String payDt;       	// 결제일시
+	private String extmallId;   	// 외부몰
+	private String optCd;       	// 옵션 
+	private String ordExchGb; 	// 주문교환 
+	private String siteNm;
 	private String delvGb;
 	private String delvGbNm;         // 지시구분명
 	private String sendYn;           // 전송여부
@@ -97,7 +87,41 @@ public class Delivery extends TscBaseDomain {
 	private String ordPhnno;         // 주문자휴대전화번호
 	private String ordTelno;         // 주문자전화번호
 	private String ordEmail;         // 주문자이메일
+	private String extmallOrderId;
+	private String delvAssignStat;
+	private String mallNm;
+	private String ordExchNm;
+	private String extmallNm;
+	private String useGb;
+	private String formalGb; 
+	private String delvArGb;
+	private String vendorId;
+	private String rejectReason;
+	private String goodsGb;
+	
+	private Integer ordDtlNo;
+	private Integer ordNo;
+	private Integer custNo;
+	private Integer custDelvAddrSq;
+	private Integer delvBanGoodsSq;
+	private Integer productNo;
+	private Integer delvAssignSq;
+	private Integer delvAssignHstSq;
+	
+	private int delvDelayDays;
+	private int ordQty; 		// 주문수량
+	private int currStockQty; 	// 현재고
+	private int baseStockQty; 	// 안전재고
+	private int ordAmt; 		// 주문금액
+	private int ordDtlQty;
+	private int locQty;
+	private int goodsLocSetCnt;
+	private int goodsLocCnt;
+	private int saleQty;
+	private int itemQty; 
+	private int currPrice;
 	
+	private Double delvFeeRate;
 	
 	private String[] conditions = null;
 	
@@ -122,6 +146,14 @@ public class Delivery extends TscBaseDomain {
 	private int pageSize = 50;
 	private int pageUnit = 10;
 	
+	
+
+	
+	
+	 
+
+
+	
 	/* 위로  작성  ('' ) ( '')*/
 	
 	
@@ -131,245 +163,242 @@ public class Delivery extends TscBaseDomain {
 	
 
 
-	private String siteNm;
-
-	private String ordDt;
-	private String payDt;
-
 	
-	private String ordStat;
-
-	private String orderEmail;
-	private String colorKnm;
-
-	private Integer ordQty;
-	private Integer cnclRtnQty;
-	private Integer saleQty;
-	private Integer saleAmt;
-	
-
-
-
-	private String sbagEncloseYn;
 
-
-	private String dstrbtNote;
-	private String ordExchGbNm;
-	private String extmallOrderId;
-	private String extmallOrdDtlNo;
-	private String supplyCompNm;
-	private String supplyGoodsCd;
-	private String ordExchGb;
-	private String frontGb;
-
-
-
-
-	private Long ordChgSq;
-	private String chgGb;
-	private String chgReason;
-	private String chgMemo;
-	private String chgerNm;
-	private String chgerPhnno;
-	private String chgerTelno;
-	private String chgerEmail;
-	private String chgerPostNo;
-	private String chgerBaseAddr;
-	private String chgerDtlAddr;
-	private Integer chgQty;
-	private String chgStat;
-	private String whMemo;
-	private Integer realOrdAmt;
-	private Integer cnclRtnAmt;
-	private Long orgOrdDtlNo;
-	private String vendorId;
-
-	private String formalGb;
-	private String formalGbNm;
-	private String setYn;
-	private Integer tagPrice;
-	private Integer listPrice;
-	private Integer currPrice;
-	private Integer dcRate;
-	private Integer ordAmt;
-	private Long goodsCpnSq;
-	private Integer goodsCpnDcAmt;
-	private Long cartCpnSq;
-	private Integer cartCpnDcAmt;
-	private Integer pntDcAmt;
-	private Integer prePntDcAmt;
-	private Integer savePntAmt;
-	private String agentOrderId;
-	private String exchangableYn;
-	private String exchangeFeeFreeYn;
-	private String returnableYn;
-	private String returnFeeFreeYn;
-	private String soldoutMemo;
-	private String soldoutRegId;
-	private String soldoutRegDt;
-	private String delvAssignDt;
-	private String delvAssignStat;
-	private String delvStdt;
-	private String delvEddt;
-	private String shipCompNm;
-	private String invoiceSendYn;
-	private String sellFeeRate;
-	private String ithrCd;
-	private String contentsLoc;
-	private Integer paySq;
-	private Integer payAmt;
-	private String payMeans;
-	private String payStat;
-	private String delvPayGb;
-	private String pgCnclTid;
-	private String pgGb;
-	private String delvFeeGb;
-	private Integer delvFee;
-	private String usacGb;
-	private String prtnGb;
-	private String orgUsacGb;
-	private Integer sellQty;
-	private String sellGb;
-	private String workDay;
-	private Integer chasu;
-	private String extmallNm;
-	private String productId;
-
-
-	private String dasRecipStsCd;
-	private String dasRecipIngDt;
-	private String dasRecipCplDt;
-	private String dasWorkCplDt;
-	private Integer shipQty;
-	private String soldoutDt;
-	private String adminRecipYn;
-	private String adminRecipDt;
-	private String cncYn;
-	private String cncDt;
-	private String regStdt;
-	private String regEddt;
-	private String extmallId;
-	private Integer stockQty;
-	private Integer currStockQty;
-	private Integer baseStockQty;
-	private String delvArGb;
-
-	private Integer assignQty;
-	private String delvArId;
-	private String rejectReason;
-	private String chulgoQty;
-	private String ordExchGbYn;
-	private String payStDate;
-	private String payEdDate;
-
-	private String stDt;
-	private String edDt;
-
-	private String goodsGb;
-
-	private String colorGrpFile;
-	private Integer invoiceQty;
-
-	private String delayDt;
-	private String orgOrdDtlStat;
-
-	private String locCd;  //위치코드(물류로케이션)
-	private int dispOrd;  //표시순서
-	private String pickingNo;  //피킹번호
-	private int pickingQty;  //피킹수량
-	private String locGcd;  //위치그룹코드
-	private String updDt;  //수정일시
-	private String regDt;  //등록일시
-
-	private String cd;  //코드
-	private String cdNm;  //코드명
-
-	private String supplyCompSelfYn;
-	private Double delvFeeRate;
-	private int delvAddrSq;
-	private int outSeq;
-
-	private String applyStdtFrom;
-	private String applyStdtTo;
-	private String memoType;
-	private String refVal;
-
-	private String delvMemoSq;
-	private int baseAmt;
-	private String applyStdt;
-	private String applyStdthh;
-	private String applyStdtmm;
-	private String applyEddt;
-	private String applyEddthh;
-	private String applyEddtmm;
-	private int memoQty;
-	private String memo;
-	private String useYn;
-	private String brandCbs;
-
-	private String applySttmDip;
-	private String applyEdtmDip;
-
-
-
-	private String pResult;
-
-	private Long plusCpnSq;
-	private Integer plusCpnDcAmt; //플러스쿠폰할인금액 명칭바뀜 
-	private String erpCdCompany;
-	private String erpCdDepart;
-
-	private String ifNo;
-	private String ifGb;
-	private String styleCd;
-
-	private String chgReasonNm;
-
-	private String delvAssignOrd;
-
-	private String orderId;
-
-	private String custGb;
-	private String goodsNum;
-	private String cdCompany;
-	private String cdDepart;
-
-	private Integer orgOrdAmt;
-	private Integer orgGoodsCpnDcAmt;
-	private Integer orgCartCpnDcAmt;
-	private Integer orgPlusCpnDcAmt;
-	private Integer orgPntDcAmt;
-	private Integer orgPrePntDcAmt;
-	private Integer orgSavePntAmt;
-	private Integer orgRealOrdAmt;
-	private String outCdTrans;
-	private String outSongjang;
-	private String outResult;
-
-
-
-
-	private String regNm;
-
-	private String invoiceGb;
-	private String apiGb;
-	private String resultCd;
-	private String custOrdNo;
-	private String hstMemo;
-
-
-
-	
-	// 출고처 정보
-	private String delvAssignGrade;
-	private String stockApplRate;
-	private String delvLocZipcode;
-	private String delvLocBaseAddr;
-	private String delvLocDtlAddr;
-	private String rtnLocZipcode;
-	private String rtnLocBaseAddr;
-	private String rtnLocDtlAddr;
-	private String rtnLocTelno;
-	private String rtnLocNm;
-	private String invoicePrintType;
+//
+//	
+//	private String ordStat;
+//
+//	private String orderEmail;
+//	private String colorKnm;
+//
+//	//private Integer ordQty;
+//	private Integer cnclRtnQty;
+//	private Integer saleQty;
+//	private Integer saleAmt;
+//	
+//
+//
+//
+//	private String sbagEncloseYn;
+//
+//
+//	private String dstrbtNote;
+//	private String ordExchGbNm;
+//	
+//	private String extmallOrdDtlNo;
+//	private String supplyCompNm;
+//	private String supplyGoodsCd;
+////	private String ordExchGb;
+//	private String frontGb;
+//
+//
+//
+//
+//	private Long ordChgSq;
+//	private String chgGb;
+//	private String chgReason;
+//	private String chgMemo;
+//	private String chgerNm;
+//	private String chgerPhnno;
+//	private String chgerTelno;
+//	private String chgerEmail;
+//	private String chgerPostNo;
+//	private String chgerBaseAddr;
+//	private String chgerDtlAddr;
+//	private Integer chgQty;
+//	private String chgStat;
+//	private String whMemo;
+//	private Integer realOrdAmt;
+//	private Integer cnclRtnAmt;
+//	private Long orgOrdDtlNo;
+//	private String vendorId;
+//
+//	//private String formalGb;
+//	private String formalGbNm;
+//	private String setYn;
+//	private Integer tagPrice;
+//	private Integer listPrice;
+//	private Integer currPrice;
+//	private Integer dcRate;
+//	//private Integer ordAmt;
+//	private Long goodsCpnSq;
+//	private Integer goodsCpnDcAmt;
+//	private Long cartCpnSq;
+//	private Integer cartCpnDcAmt;
+//	private Integer pntDcAmt;
+//	private Integer prePntDcAmt;
+//	private Integer savePntAmt;
+//	private String agentOrderId;
+//	private String exchangableYn;
+//	private String exchangeFeeFreeYn;
+//	private String returnableYn;
+//	private String returnFeeFreeYn;
+//	private String soldoutMemo;
+//	private String soldoutRegId;
+//	private String soldoutRegDt;
+//	private String delvAssignDt;
+//	
+//	private String delvStdt;
+//	private String delvEddt;
+//	private String shipCompNm;
+//	private String invoiceSendYn;
+//	private String sellFeeRate;
+//	private String ithrCd;
+//	private String contentsLoc;
+//	private Integer paySq;
+//	private Integer payAmt;
+//	private String payMeans;
+//	private String payStat;
+//	private String delvPayGb;
+//	private String pgCnclTid;
+//	private String pgGb;
+//	private String delvFeeGb;
+//	private Integer delvFee;
+//	private String usacGb;
+//	private String prtnGb;
+//	private String orgUsacGb;
+//	private Integer sellQty;
+//	private String sellGb;
+//	private String workDay;
+//	private Integer chasu;
+//	
+//	private String productId;
+//
+//
+//	private String dasRecipStsCd;
+//	private String dasRecipIngDt;
+//	private String dasRecipCplDt;
+//	private String dasWorkCplDt;
+//	private Integer shipQty;
+//	private String soldoutDt;
+//	private String adminRecipYn;
+//	private String adminRecipDt;
+//	private String cncYn;
+//	private String cncDt;
+//	private String regStdt;
+//	private String regEddt;
+//	//private String extmallId;
+//	private Integer stockQty;
+//	//private Integer currStockQty;
+//	//private Integer baseStockQty;
+//
+//	private Integer assignQty;
+//	private String delvArId;
+//	private String rejectReason;
+//	private String chulgoQty;
+//	private String ordExchGbYn;
+//	private String payStDate;
+//	private String payEdDate;
+//
+//	private String stDt;
+//	private String edDt;
+//
+//	private String goodsGb;
+//
+//	private String colorGrpFile;
+//	private Integer invoiceQty;
+//
+//	private String delayDt;
+//	private String orgOrdDtlStat;
+//
+//	private String locCd;  //위치코드(물류로케이션)
+//	private int dispOrd;  //표시순서
+//	private String pickingNo;  //피킹번호
+//	private int pickingQty;  //피킹수량
+//	private String locGcd;  //위치그룹코드
+//	private String updDt;  //수정일시
+//	private String regDt;  //등록일시
+//
+//	private String cd;  //코드
+//	private String cdNm;  //코드명
+//
+//	private String supplyCompSelfYn;
+//	private Double delvFeeRate;
+//	private int delvAddrSq;
+//	private int outSeq;
+//
+//	private String applyStdtFrom;
+//	private String applyStdtTo;
+//	private String memoType;
+//	private String refVal;
+//
+//	private String delvMemoSq;
+//	private int baseAmt;
+//	private String applyStdt;
+//	private String applyStdthh;
+//	private String applyStdtmm;
+//	private String applyEddt;
+//	private String applyEddthh;
+//	private String applyEddtmm;
+//	private int memoQty;
+//	private String memo;
+//	private String useYn;
+//	private String brandCbs;
+//
+//	private String applySttmDip;
+//	private String applyEdtmDip;
+//
+//
+//
+//	private String pResult;
+//
+//	private Long plusCpnSq;
+//	private Integer plusCpnDcAmt; //플러스쿠폰할인금액 명칭바뀜 
+//	private String erpCdCompany;
+//	private String erpCdDepart;
+//
+//	private String ifNo;
+//	private String ifGb;
+//	private String styleCd;
+//
+//	private String chgReasonNm;
+//
+//	private String delvAssignOrd;
+//
+//	private String orderId;
+//
+//	private String custGb;
+//	private String goodsNum;
+//	private String cdCompany;
+//	private String cdDepart;
+//
+//	private Integer orgOrdAmt;
+//	private Integer orgGoodsCpnDcAmt;
+//	private Integer orgCartCpnDcAmt;
+//	private Integer orgPlusCpnDcAmt;
+//	private Integer orgPntDcAmt;
+//	private Integer orgPrePntDcAmt;
+//	private Integer orgSavePntAmt;
+//	private Integer orgRealOrdAmt;
+//	private String outCdTrans;
+//	private String outSongjang;
+//	private String outResult;
+//
+//
+//
+//
+//	private String regNm;
+//
+//	private String invoiceGb;
+//	private String apiGb;
+//	private String resultCd;
+//	private String custOrdNo;
+//	private String hstMemo;
+//
+//
+//
+//	
+//	// 출고처 정보
+//	private String delvAssignGrade;
+//	private String stockApplRate;
+//	private String delvLocZipcode;
+//	private String delvLocBaseAddr;
+//	private String delvLocDtlAddr;
+//	private String rtnLocZipcode;
+//	private String rtnLocBaseAddr;
+//	private String rtnLocDtlAddr;
+//	private String rtnLocTelno;
+//	private String rtnLocNm;
+//	private String invoicePrintType;
 }

+ 7 - 5
src/main/java/com/style24/persistence/domain/GoodsVideo.java

@@ -16,17 +16,19 @@ import lombok.Data;
 public class GoodsVideo extends TscBaseDomain {
 
 	private Integer videoSq;
-	private String brandCd; // 브랜드코드
-	private String brandEnm; // 브랜드영문명
-	private String brandGrpNm; // 브랜드그룹명
 	private String goodsCd;
-	private String videoGb;
-	private String videoVal;
+	private String videoGb;	// 비디오 구분 M: mp4, Y:유투브
+	private String kmcKey;	// 
+	private String kufKey;
 	private String dispYn;
+	
+	private String brandEnm; // 브랜드영문명
 	private String goodsNm;
 	private String goodsNum;
 	private String supplyGoodsCd;
 	private String excelFileNm;
 	private String stDate;
 	private String edDate;
+	
+
 }

+ 0 - 38
src/main/java/com/style24/persistence/domain/Video.java

@@ -1,38 +0,0 @@
-package com.style24.persistence.domain;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-
-/**
- * 동영상 Domain
- *
- * @author eskim
- * @since 2020. 11. 16
- */
-@SuppressWarnings("serial")
-@Data
-public class Video extends TscBaseDomain {
-
-	private Integer videoSq;
-	private String displocGb;	//노출위치구분(B:브랜드, G:상품)
-	private String displocVal;	//노출위치값(노출위치구분이 "B:브랜드"이면 브랜드코드, "G:상품"이면 상품코드)
-	private String videoGb;	//동영상구분(Y:유투브, M:MP4)
-	private String videoVal;	//동영상값(동영상구분이 Y이면 유투브ID, M이면 URL)
-	private String videoTitle;
-	private String videoTitle2;
-	private String dispYn;
-	private String excelFileNm;
-	private String brandEnm;
-	private String stDate;
-	private String edDate;
-	private String fyear;
-	private String tyear;
-	private String seasonStr;
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] displocValArr;
-
-}

+ 12 - 20
src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml

@@ -392,26 +392,18 @@
 		               AND    EXP_CMP_DT IS NOT NULL
 		               ), 0)                           AS EXPIRE_PNT_AMT -- 소멸포인트
 		     , IFNULL((
-		               SELECT SUM(A.PNT_AMT + B.PNT_AMT) AS PNT_AMT
-		               FROM (
-		                     SELECT SUM(PNT_AMT) AS PNT_AMT
-		                          , ORD_NO
-		                     FROM   TB_CUST_POINT_HST
-		                     WHERE  OCCUR_GB = 'G069_12' -- 적립예정
-		                     AND    PNT_UPLOAD_STAT = 'G070_10' -- 포인트반영
-		                     AND    CUST_NO = #{custNo}
-		                     GROUP BY ORD_NO
-		                    ) A
-		                 , (
-		                    SELECT SUM(PNT_AMT) AS PNT_AMT
-		                         , ORD_NO
-		                    FROM   TB_CUST_POINT_HST
-		                    WHERE  OCCUR_GB = 'G069_13' -- 적립예정취소
-		                    AND    PNT_UPLOAD_STAT = 'G070_20' -- 포인트반영전취소
-		                    AND    CUST_NO = #{custNo}
-		                    GROUP BY ORD_NO
-		                    ) B
-		               WHERE A.ORD_NO = B.ORD_NO
+		               SELECT SUM(CPH.PNT_AMT) AS PNT_AMT
+		               FROM   TB_CUST_POINT_HST CPH
+		               WHERE  CPH.OCCUR_GB IN ('G069_12', 'G069_13')             -- 적립예정, 적립취소
+		               AND    CPH.PNT_UPLOAD_STAT IN ('G070_10', 'G070_20')        -- 반영예정, 반영전취소
+		               AND    CPH.CUST_NO = #{custNo}
+		               AND    NOT EXISTS (
+		                                  SELECT 1
+		                                  FROM  TB_CUST_POINT_HST
+		                                  WHERE PNT_UPLOAD_STAT = 'G070_30'
+		                                  AND   ORD_NO = CPH.ORD_NO
+		                                  AND   ORD_DTL_NO = CPH.ORD_DTL_NO
+		                                  )
 		               ), 0)                           AS EXPECTED_PNT_AMT -- 적립예정포인트
 		     , IFNULL((
 		               SELECT SUM(RM_PNT_AMT) AS RM_PNT_AMT

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

@@ -18,7 +18,7 @@
 	
 	<!-- 배송목록 건수 -->
 	<select id="getDeliveryListCount" parameterType="Delivery" resultType="int">
-		/* TsaDelivery.getDeliveryList */
+		/* TsaDelivery.getDeliveryListCount */
 		SELECT COUNT(*) AS TOTCNT
 		  FROM (		
 				SELECT A.* 
@@ -335,10 +335,13 @@
 		   , B.OPT_CD2 
 		   , B.ITEM_QTY 
 		   , B.ITEM_PRICE 
+		   , C.CURR_STOCK_QTY
+		   , C.BASE_STOCK_QTY
 		 FROM TB_ORDER_DETAIL A
 		 JOIN TB_ORDER_DETAIL_ITEM B ON A.ORD_DTL_NO = B.ORD_DTL_NO 
+		 JOIN VW_STOCK             C ON B.ITEM_CD    = C.GOODS_CD    AND B.OPT_CD = C.OPT_CD 
 	    WHERE A.ORD_DTL_NO  = #{ordDtlNo}
-	    ORDER BY DISP_ORD 
+	    ORDER BY B.DISP_ORD  
 	</select>
 
 
@@ -697,4 +700,429 @@
 				<include refid="getListPagingCondition_sql"/>
 	</select>
 	
+	<!-- 출고처지정 목록 건수 -->
+	<select id="getAssignListCount" parameterType="Delivery" resultType="int">
+		/* TsaDelivery.getAssignListCount */
+		SELECT COUNT(*) AS TOTCNT
+		  FROM (
+				SELECT 
+					  B.ORD_DTL_NO   -- 주문상세번호
+					, B.GOODS_CD     -- 상품코드
+				  FROM TB_ORDER A 
+				  JOIN TB_ORDER_DETAIL B      ON A.ORD_NO = B.ORD_NO
+				  JOIN TB_ORDER_DETAIL_ITEM C ON B.ORD_NO = C.ORD_NO AND B.ORD_DTL_NO = C.ORD_DTL_NO 
+				  JOIN TB_GOODS D             ON B.GOODS_CD = D.GOODS_CD 
+				  JOIN VW_STOCK E             ON C.ITEM_CD = E.GOODS_CD AND C.OPT_CD = E.OPT_CD 
+				 WHERE D.SELF_GOODS_YN  = 'Y'  -- 자사상품만 
+				   AND B.ORD_DTL_STAT IN ('G013_20','G013_35')
+				   AND B.GOODS_TYPE    != 'G056_S'
+				   <include refid="getAssignListCondition_sql"/>
+				   
+				 UNION ALL
+				  
+				SELECT 
+					  B.ORD_DTL_NO   -- 주문상세번호
+					, B.GOODS_CD     -- 상품코드
+				  FROM TB_ORDER A 
+				  JOIN TB_ORDER_DETAIL B      ON A.ORD_NO = B.ORD_NO
+				  JOIN TB_GOODS D             ON B.GOODS_CD = D.GOODS_CD 
+				 WHERE D.SELF_GOODS_YN  = 'Y'  -- 자사상품만 
+				   AND B.ORD_DTL_STAT IN ('G013_20','G013_35')
+				   AND B.GOODS_TYPE    != 'G056_S'				 
+				   <include refid="getAssignListCondition_sql"/>
+		       ) A 
+		
+	</select>	
+	
+	<!-- 출고처지정 목록 -->
+	<select id="getAssignList" parameterType="Delivery" resultType="Delivery">
+		/* TsaDelivery.getAssignList */
+		SELECT Z.*
+		     , FN_GET_CODE_NM('G000', Z.SITE_CD) AS SITE_NM
+		     , FN_GET_CODE_NM('G011', Z.MALL_GB) AS MALL_NM
+		     , FN_GET_CODE_NM('G056', Z.GOODS_TYPE) AS GOODS_TYPE_NM
+		     , CASE WHEN ORD_EXCH_GB ='O' THEN '주문' ELSE '교환' END AS ORD_EXCH_NM     -- 상품코드
+		     , FN_GET_CODE_NM('G013', Z.ORD_DTL_STAT) AS ORD_DTL_STAT_NM 
+			 , (SELECT MAX(EE.EXTMALL_NM)
+			      FROM TB_EXTMALL EE
+			     WHERE EE.VENDOR_ID  = Z.VENDOR_ID
+				   AND EE.EXTMALL_ID = Z.EXTMALL_ID) AS EXTMALL_NM	
+			 , (SELECT L.DELV_LOC_NM FROM TB_DELIVERY_LOC L WHERE L.DELV_LOC_CD = Z.DELV_LOC_CD AND L.SUPPLY_COMP_CD = Z.SUPPLY_COMP_CD ) AS DELV_LOC_NM	
+			 , (SELECT DL.DELV_LOC_CLSF FROM TB_DELIVERY_LOC DL WHERE DL.DELV_LOC_CD = Z.DELV_LOC_CD AND DL.SUPPLY_COMP_CD = Z.SUPPLY_COMP_CD  ) AS DELV_LOC_CLSF   	      
+		  FROM (
+				SELECT A.*, ROW_NUMBER() OVER(ORDER BY  A.ORD_NO DESC, A.ORD_DTL_NO) RNUM 
+				FROM (  
+					SELECT A.* FROM (	
+						SELECT 
+							  A.SITE_CD      -- 사이트
+							, A.ORD_NO       -- 주문번호
+							, B.ORD_DTL_NO   -- 주문상세번호
+							, B.DELV_LOC_CD  -- 출고처
+							, A.ORD_DT       -- 주문일시
+							, A.PAY_DT       -- 결제일시
+							, A.MALL_GB      -- 몰구분
+							, B.EXTMALL_ID   -- 외부몰
+							, A.ORD_NM       -- 주문자
+							, B.GOODS_TYPE   -- 구성유형  (신규)
+							, D.GOODS_NM     -- 상품명 
+							, B.GOODS_CD     -- 상품코드
+							, C.OPT_CD       -- 옵션 
+							, C.OPT_CD1      -- 옵션1	
+							, C.OPT_CD2      -- 옵션2  
+							, B.ORD_QTY - B.CNCL_RTN_QTY  AS ORD_QTY -- 주문수량
+							, E.CURR_STOCK_QTY 	-- 현재고
+							, E.BASE_STOCK_QTY 	-- 안전재고
+							, B.ORD_AMT - B.CNCL_RTN_AMT AS ORD_AMT -- 주문금액
+							, B.ORD_EXCH_GB 	-- 주문교환 
+							, B.ORD_DTL_STAT 	-- 주문상세상태
+							, B.VENDOR_ID
+							, B.SUPPLY_COMP_CD 
+						  FROM TB_ORDER A 
+						  JOIN TB_ORDER_DETAIL B      ON A.ORD_NO = B.ORD_NO
+						  JOIN TB_ORDER_DETAIL_ITEM C ON B.ORD_NO = C.ORD_NO AND B.ORD_DTL_NO = C.ORD_DTL_NO 
+						  JOIN TB_GOODS D             ON B.GOODS_CD = D.GOODS_CD 
+						  JOIN VW_STOCK E             ON C.ITEM_CD = E.GOODS_CD AND C.OPT_CD = E.OPT_CD 
+						 WHERE D.SELF_GOODS_YN  = 'Y'  -- 자사상품만 
+						   AND B.ORD_DTL_STAT IN ('G013_20','G013_35')
+						   AND B.GOODS_TYPE    != 'G056_S'
+						   <include refid="getAssignListCondition_sql"/>
+						   
+					UNION ALL 				   
+						
+						SELECT 
+							  A.SITE_CD      -- 사이트
+							, A.ORD_NO       -- 주문번호
+							, B.ORD_DTL_NO   -- 주문상세번호
+							, B.DELV_LOC_CD  -- 출고처
+							, A.ORD_DT       -- 주문일시
+							, A.PAY_DT       -- 결제일시
+							, A.MALL_GB      -- 몰구분
+							, B.EXTMALL_ID   -- 외부몰
+							, A.ORD_NM       -- 주문자
+							, B.GOODS_TYPE   -- 구성유형  (신규)
+							, D.GOODS_NM     -- 상품명 
+							, B.GOODS_CD     -- 상품코드
+							, '-' AS OPT_CD       -- 옵션 
+							, '-' AS OPT_CD1      -- 옵션1	
+							, '-' AS OPT_CD2      -- 옵션2  
+							, B.ORD_QTY - B.CNCL_RTN_QTY  AS ORD_QTY -- 주문수량
+							, NULL AS CURR_STOCK_QTY 	-- 현재고
+							, NULL AS BASE_STOCK_QTY 	-- 안전재고
+							, B.ORD_AMT - B.CNCL_RTN_AMT AS ORD_AMT -- 주문금액
+							, B.ORD_EXCH_GB 	-- 주문교환 
+							, B.ORD_DTL_STAT 	-- 주문상세상태
+							, B.VENDOR_ID
+							, B.SUPPLY_COMP_CD 
+						  FROM TB_ORDER A 
+						  JOIN TB_ORDER_DETAIL B      ON A.ORD_NO = B.ORD_NO
+						  JOIN TB_GOODS D             ON B.GOODS_CD = D.GOODS_CD 
+						 WHERE D.SELF_GOODS_YN  = 'Y'  -- 자사상품만 
+						   AND B.ORD_DTL_STAT IN ('G013_20','G013_35')
+						   AND B.GOODS_TYPE     = 'G056_S'
+						   <include refid="getAssignListCondition_sql"/>  
+						 
+				       ) A
+				       ORDER BY A.ORD_NO, A.ORD_DTL_NO, A.OPT_CD
+		<include refid="getListPagingCondition_sql"/>			       
+	</select>	
+	
+    <!-- 출고처지정 조회 조건  -->
+	<sql id="getAssignListCondition_sql">
+		<if test='ordNo != null and ordNo != ""'>
+			AND A.ORD_NO = #{ordNo}
+		</if>		
+		<if test='ordDtlNo != null and ordDtlNo != ""'>
+			AND B.ORD_DTL_NO = #{ordDtlNo}
+		</if>	
+		<if test='extmallOrderId != null and extmallOrderId != ""'>
+			AND LOWER(B.EXTMALL_ORDER_ID) LIKE LOWER(#{extmallOrderId}||'%')
+		</if>
+		<if test='siteCd != null and siteCd != ""'>
+			AND A.SITE_CD = #{siteCd}
+		</if>
+		<if test='mallGb != null and mallGb != ""'>
+			AND A.MALL_GB = #{mallGb}
+		</if>	
+		<if test='goodsCd != null and goodsCd != ""'>
+			AND C.GOODS_CD = #{goodsCd}
+		</if>
+		<if test='delvAssignStat == "Y"'>
+			AND B.DELV_LOC_CD IS NOT NULL
+		</if>
+		<if test='delvAssignStat == "N"'>
+			AND B.DELV_LOC_CD IS NULL
+		</if>
+		<if test='delvLocCd != null and delvLocCd != ""'>
+			AND B.DELV_LOC_CD = #{delvLocCd}
+		</if>
+		<if test='siteCd != null and siteCd != ""'>
+			AND  A.SITE_CD = #{siteCd}
+		</if>
+		<if test='ordExchGb == "Y"'>
+			AND B.ORD_EXCH_GB = 'E'
+		</if>
+		<if test='ordExchGb == "N"'>
+			AND B.ORD_EXCH_GB = 'O'
+		</if>		
+		<if test='stDate != null and stDate != ""'>
+			AND A.ORD_DT >= STR_TO_DATE(replace(#{stDate},'-',''), '%Y%m%d%H%i%S')
+		</if>
+		<if test='edDate != null and edDate != ""'>
+			AND A.ORD_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(replace(#{edDate},'-',''), '%Y%m%d%H%i%S'), INTERVAL 1 DAY) 
+		</if>		 
+	
+	</sql>
+	
+	<!-- 출고처 수동지정 대상 조회  -->
+	<select id="getDeliveryAssignPopup" parameterType="Delivery" resultType="Delivery">
+		/* TsaDelivery.getDeliveryAssignPopup */
+        SELECT
+              A.ORD_NO
+            , B.ORD_DTL_NO
+            , GROUP_CONCAT(G.ITEM_CD ORDER BY G.ITEM_CD SEPARATOR '\r\n') AS GOODS_CD
+            , B.CURR_PRICE
+        FROM  TB_ORDER A
+        JOIN  TB_ORDER_DETAIL B      ON A.ORD_NO = B.ORD_NO
+        JOIN  TB_ORDER_DETAIL_ITEM G ON B.ORD_NO = G.ORD_NO AND B.ORD_DTL_NO = G.ORD_DTL_NO
+        WHERE B.ORD_DTL_NO     = #{ordDtlNo}
+      GROUP BY A.ORD_NO, B.ORD_DTL_NO, B.CURR_PRICE
+	</select>
+			
+	
+	<!-- 출고처 수동지정 주문상세 리스트 조회 -->
+	<select id="getOrdDtlNoItemList" resultType="Delivery">
+		/*TsaDelivery.getOrdDtlNoItemList */
+		SELECT 
+			  A.ORD_NO 
+			, B.ORD_DTL_NO 
+			, B.GOODS_CD 
+			, C.ITEM_CD 
+			, C.OPT_CD 
+			, C.OPT_CD1 
+			, C.OPT_CD2 
+		    , (B.ORD_QTY - B.CNCL_RTN_QTY) * C.ITEM_QTY  AS ORD_QTY
+		    , (B.ORD_QTY - B.CNCL_RTN_QTY)               AS ORD_DTL_QTY
+		    , C.ITEM_QTY                                 AS ITEM_QTY
+		    , B.GOODS_TYPE 
+		    , C.PRODUCT_NO 
+    		, B.FORMAL_GB  
+    		, B.SUPPLY_COMP_CD 
+    		, D.BRAND_CD
+		  FROM TB_ORDER             A
+		  JOIN TB_ORDER_DETAIL      B ON A.ORD_NO = B.ORD_NO 
+		  JOIN TB_ORDER_DETAIL_ITEM C ON B.ORD_NO = C.ORD_NO AND B.ORD_DTL_NO = C.ORD_DTL_NO 
+		  JOIN TB_GOODS             D ON B.GOODS_CD = D.GOODS_CD 
+		 WHERE B.ORD_DTL_NO = #{ordDtlNo}
+	</select>
+		
+	<!-- 출고처지정 임시 테이블 삭제    -->
+	<delete id="deleteTbDeliveryLocTmp" parameterType="Delivery"  >
+		/*TsaDelivery.deleteTbDeliveryLocTmp*/
+		DELETE FROM TB_DELIVERY_LOC_TMP WHERE USE_GB = #{useGb}
+	</delete>	
+	
+	<!-- 출고처지정 임시테이블 등록  -->
+	<insert id="insertTbDeliveryLocTmp" parameterType="Delivery" >
+		/* TsaDelivery.insertTbDeliveryLocTmp */
+		INSERT INTO TB_DELIVERY_LOC_TMP
+		(
+			  USE_GB
+			, DELV_LOC_CD
+			, DELV_ASSIGN_ORD
+			, LOC_QTY
+			, GOODS_LOC_CNT
+			, ORD_DTL_NO_LIST
+		)
+		VALUES
+		(
+			  #{useGb}
+			, #{delvLocCd}
+			, (SELECT DELV_ASSIGN_ORD FROM TB_DELIVERY_LOC LC WHERE LC.DELV_LOC_CD = #{delvLocCd} AND LC.SUPPLY_COMP_CD = #{supplyCompCd})
+			, TRUNCATE(#{locQty}/#{ordQty},0)
+			, 1
+			, #{ordDtlNo}
+		) ON DUPLICATE KEY
+		UPDATE 
+			GOODS_LOC_CNT = GOODS_LOC_CNT+1
+		  , ORD_DTL_NO_LIST = CONCAT(ORD_DTL_NO_LIST,',',#{ordDtlNo})
+		  , LOC_QTY = CASE WHEN  LOC_QTY > TRUNCATE(#{locQty}/#{ordQty},0) THEN  TRUNCATE(#{locQty}/#{ordQty},0) ELSE LOC_QTY END	
+	</insert>	
+	
+	<!-- 출고처지정 임시테이블 세트 등록  -->
+	<insert id="insertTbDeliveryLocSetTmp" parameterType="Delivery" >
+		/* TsaDelivery.insertTbDeliveryLocSetTmp */
+		INSERT INTO TB_DELIVERY_LOC_TMP
+		(
+			  USE_GB
+			, DELV_LOC_CD
+			, DELV_ASSIGN_ORD
+			, LOC_QTY
+			, GOODS_LOC_CNT
+			, GOODS_LOC_SET_CNT
+		)
+		VALUES
+		(
+			  #{useGb}
+			, #{delvLocCd}
+			, (SELECT DELV_ASSIGN_ORD FROM TB_DELIVERY_LOC LC WHERE LC.DELV_LOC_CD = #{delvLocCd} AND LC.SUPPLY_COMP_CD = #{supplyCompCd})
+			, TRUNCATE(#{locQty}/#{ordQty})
+			, 0
+			, 1
+		) ON DUPLICATE KEY
+		UPDATE 
+			GOODS_LOC_SET_CNT = A.GOODS_LOC_SET_CNT+1
+		  ,	LOC_QTY = CASE WHEN LOC_QTY > TRUNCATE(#{locQty}/#{ordQty})THEN TRUNCATE(#{locQty}/#{ordQty}) ELSE LOC_QTY END 		
+	</insert>
+	
+	<!-- 출고처 지정 임시테이블 세트상품갯수 max값 조회      -->	
+	<select id="getDeliveryLocTmpGoodsSetMaxCnt" resultType="int">
+		/*TsbDelivery.getDeliveryLocTmpGoodsSetMaxCnt*/
+		SELECT CASE WHEN MAX(GOODS_LOC_SET_CNT) IS NULL THEN 0 ELSE MAX(GOODS_LOC_SET_CNT)  END  AS CNT 
+		  FROM TB_DELIVERY_LOC_TMP
+		 WHERE USE_GB = #{useGb}
+	</select>			
+	
+	<!-- 출고처지정 임시 테이블 수정   -->
+	<update id="updateTbDeliveryLocSetTmp" parameterType="Delivery"  >
+		/*TsbDelivery.updateTbDeliveryLocSetTmp*/
+		UPDATE TB_DELIVERY_LOC_TMP SET
+		      GOODS_LOC_CNT = GOODS_LOC_CNT + 1
+		    , ORD_DTL_NO_LIST =  CASE WHEN ORD_DTL_NO_LIST IS NULL THEN #{ordDtlNo} ELSE CONCAT(ORD_DTL_NO_LIST,',',#{ordDtlNo}) END
+		WHERE USE_GB = #{useGb} AND GOODS_LOC_SET_CNT = #{goodsLocSetCnt}		
+	</update>	
+		
+	<!-- 주문상세 출고처 지정대상 리스트 -->
+	<select id="getOrdDtlAssignLocList" resultType="Delivery">
+		/*TsaDelivery.getOrdDtlAssignLocList */
+		SELECT   (SELECT DELV_LOC_NM FROM TB_DELIVERY_LOC WHERE DELV_LOC_CD = A.DELV_LOC_CD AND SUPPLY_COMP_CD = #{supplyCompCd}) AS DELV_LOC_NM
+		       , DELV_LOC_CD
+		       , LOC_QTY AS STOCK_QTY
+		       , (SELECT DELV_LOC_CLSF FROM TB_DELIVERY_LOC WHERE DELV_LOC_CD = A.DELV_LOC_CD AND SUPPLY_COMP_CD = #{supplyCompCd} ) AS DELV_LOC_CLSF
+		       , IFNULL((SELECT CASE WHEN DELV_AR_GB ='N' THEN 'Y' ELSE 'N' END FROM TB_DELIVERY_ASSIGN WHERE DELV_LOC_CD = A.DELV_LOC_CD AND  ORD_DTL_NO = #{ordDtlNo}),'N') AS DELV_AR_GB
+		  FROM TB_DELIVERY_LOC_TMP A
+		 WHERE USE_GB        = #{useGb}
+		   AND GOODS_LOC_CNT = #{goodsLocCnt}
+
+	</select>
+			
+	<!-- 주문상세 출고처 등록   -->
+	<insert id="updateOrdDtlDelvCd" parameterType="Delivery" >
+		/*TsbDelivery.updateOrdDtlDelvCd*/
+		UPDATE TB_ORDER_DETAIL SET
+			  ORD_DTL_STAT     =  #{ordDtlStat}
+			, DELV_LOC_CD      =  #{delvLocCd}
+			, DELV_ASSIGN_DT   = NOW()
+			, DELV_ASSIGN_STAT = #{delvArGb}
+			, UPD_NO           = #{updNo}
+			, UPD_DT           = NOW()
+		WHERE ORD_NO     = #{ordNo}
+		  AND ORD_DTL_NO = #{ordDtlNo}
+	</insert>		
+			
+	<!-- 출고처지정 등록    -->
+	<insert id="createDeliveryAssign" parameterType="Delivery" keyProperty="delvAssignSq" >
+		/*TsbDelivery.insertTbDeliveryAssign*/
+		INSERT INTO TB_DELIVERY_ASSIGN
+		(
+			  DELV_ASSIGN_SQ    --	출고지정일련번호
+			, ORD_NO	 		--	주문번호
+			, ORD_DTL_NO	 	--	주문상세번호
+			, DELV_LOC_CD	    --	출고처코드
+			, ASSIGN_QTY	    --	지정수량
+			, DELV_AR_GB	    --	출고수락거부구분(P:대기, Y:수락, N:거부)
+			, REG_NO	 	    --	등록자NO
+			, REG_DT	 	    --	등록일시
+			, UPD_NO	 	    --	수정자NO
+			, UPD_DT	 	    --	수정일시
+		)
+		VALUES
+		(
+			  #{delvAssignSq}	--	출고지정일련번호
+			, #{ordNo}	 		--	주문번호
+			, #{ordDtlNo}	 	--	주문상세번호
+			, #{delvLocCd}	    --	출고처코드
+			, #{locQty}	        --	지정수량
+			, #{delvArGb}	    --	출고수락거부구분(P:대기, Y:수락, N:거부)
+			, #{regNo}	 	    --	등록자NO
+			, NOW()	 		    --	등록일시
+			, #{regNo}	 	    --	수정자NO
+			, NOW()	            --	수정일시
+		)		
+	</insert>
+   
+	<!-- 출고처지정HST 등록    -->
+	<insert id="createDeliveryAssignHst" parameterType="Delivery" keyProperty="delvAssignHstSq" >
+		/*TsbDelivery.insertTbDeliveryAssignHst*/
+		INSERT INTO TB_DELIVERY_ASSIGN_HST
+		(
+			  DELV_ASSIGN_SQ  --  출고지정일련번호
+			, ORD_NO	 	  --  주문번호
+			, ORD_DTL_NO	  --  주문상세번호
+			, DELV_LOC_CD	  --  출고처코드
+			, ASSIGN_QTY	  --  지정수량
+			, DELV_AR_GB	  --  출고수락거부구분(P:대기, Y:수락, N:거부)
+			, REG_NO	 	  --  등록자NO
+			, REG_DT	 	  --  등록일시
+			, UPD_NO	 	  --  수정자NO
+			, UPD_DT	 	  --  수정일시
+			, HST_REG_DT      --  이력등록일시
+		)
+		VALUES
+		(
+			  #{delvAssignSq}	--	출고지정일련번호
+			, #{ordNo}	 		--	주문번호
+			, #{ordDtlNo}	 	--	주문상세번호
+			, #{delvLocCd}	    --	출고처코드
+			, #{locQty}	        --	지정수량
+			, #{delvArGb}	    --	출고수락거부구분(P:대기, Y:수락, N:거부)
+			, #{regNo}	 	    --	등록자NO
+			, NOW()	 		    --	등록일시
+			, #{regNo}	 	    --	수정자NO
+			, NOW()	            --	수정일시
+			, NOW()	            --	수정일시
+		)
+	</insert>
+				
+	<!-- 주문상세 아이템목록  -->
+	<select id="getOrdDtlItemList" resultType="Delivery">
+		/*TsaDelivery.getOrdDtlItemList */
+		SELECT 
+			  A.ORD_NO 
+			, B.ORD_DTL_NO 
+			, B.ORD_DTL_STAT 
+			, (B.ORD_QTY - B.CNCL_RTN_QTY) * C.ITEM_QTY AS ITEM_QTY
+			, B.ORD_QTY - B.CNCL_RTN_QTY AS ORD_QTY
+			, C.ITEM_CD 
+			, C.OPT_CD 
+			, C.OPT_CD1 
+			, C.OPT_CD2 
+			, C.PRODUCT_NO 
+		  FROM TB_ORDER A 
+		  JOIN TB_ORDER_DETAIL B      ON A.ORD_NO = B.ORD_NO 
+		  JOIN TB_ORDER_DETAIL_ITEM C ON B.ORD_NO = C.ORD_NO AND B.ORD_DTL_NO = C.ORD_DTL_NO 
+		 WHERE B.ORD_NO     = #{ordNo}
+		   AND B.ORD_DTL_NO = #{ordDtlNo}		
+	</select>				
+	
+	<!-- 출고처지정 삭제   -->
+	<delete id="deleteTbDeliveryAssign" parameterType="Delivery" >
+		/*TsbDelivery.deleteTbDeliveryAssign*/
+		DELETE FROM TB_DELIVERY_ASSIGN
+		WHERE ORD_DTL_NO  = #{ordDtlNo}
+	</delete>	
+	
+	<!-- 주문상세 출고처지정 취소   -->
+	<update id="cancelAssignDelvLoc" parameterType="Delivery" >
+		/*TsbDelivery.cancelAssignDelvLoc*/
+		UPDATE TB_ORDER_DETAIL SET
+			  ORD_DTL_STAT     = #{ordDtlStat}
+			, DELV_LOC_CD      = NULL
+			, DELV_ASSIGN_DT   = NULL
+			, DELV_ASSIGN_STAT = 'P'
+			, UPD_NO           = #{updNo}
+			, UPD_DT           = NOW()
+		WHERE ORD_DTL_NO = #{ordDtlNo}
+	</update>	
+		
+	
 </mapper>

+ 46 - 111
src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -1606,9 +1606,9 @@
 		  , #{currPrice}
 		  , #{costPrice}
 		  , #{dcRate}
-		  , STR_TO_DATE(#{sellStdt}},'%Y%m%d%H%i%S')
-		  , STR_TO_DATE(#{sellEddt}},'%Y%m%d%H%i%S')
 		  , #{goodsStat}
+		  , STR_TO_DATE(#{sellStdt},'%Y%m%d%H%i%S')
+		  , STR_TO_DATE(#{sellEddt},'%Y%m%d%H%i%S')
 		  , IFNULL(#{selfMallYn},'Y') 
 		  , #{goodsGb}
 		  , #{distributionGb}
@@ -2831,12 +2831,11 @@
 	<select id="getGoodsVideoList" parameterType="GoodsVideo" resultType="GoodsVideo">
 		/* TsaGoods.getGoodsVideoList */
 		SELECT A.VIDEO_SQ
-		     , B.BRAND_CD
-		     , B.BRAND_ENM
-		     , B.BRAND_GRP_NM
-		     , A.DISPLOC_VAL AS GOODS_CD
-		     , E.VIDEO_GB
-		     , E.VIDEO_VAL
+		     , A.GOODS_CD
+		     , D.BRAND_ENM
+		     , A.VIDEO_GB
+		     , A.KMC_KEY
+		     , A.KUF_KEY
 		     , A.DISP_YN
 		     , A.REG_NO
 		     , FN_GET_USER_NM(A.REG_NO) AS REG_NM
@@ -2844,38 +2843,28 @@
 		     , A.UPD_NO
 		     , FN_GET_USER_NM(A.UPD_NO) AS REG_NM
 		     , DATE_FORMAT(A.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
-		FROM TB_VIDEO_DISPLOC A
-		INNER JOIN TB_VIDEO E ON A.VIDEO_SQ = E.VIDEO_SQ
-		INNER JOIN (SELECT C.GOODS_CD
-		                 , C.BRAND_CD
-		                 , D.BRAND_ENM
-		                 , D.BRAND_GRP_NM
-		            FROM TB_GOODS C
-		            INNER JOIN TB_BRAND D ON C.BRAND_CD = D.BRAND_CD
-		            WHERE 1 = 1
-		            <if test='goodsNm != null and goodsNm != "" '>
-		            AND C.GOODS_NM = #{goodsNm}
-		            </if>
-		            <if test='goodsNum != null and goodsNum != "" '>
-		            AND C.GOODS_NUM = #{goodsNum}
-		            </if>
-		            <if test='supplyGoodsCd != null and supplyGoodsCd != "" '>
-		            AND C.SUPPLY_GOODS_CD = #{supplyGoodsCd}
-		            </if>
-		            <if test='brandEnm != null and brandEnm != "" '>
-		            AND (
-		                 D.BRAND_ENM LIKE #{brandEnm}||'%'
-		                 OR
-		                 D.BRAND_KNM LIKE #{brandEnm}||'%'
-		                )
-		            </if>
-		            ) B
-		           ON (A.DISPLOC_VAL = B.GOODS_CD
-		           )
-		WHERE A.DISPLOC_VAL = B.GOODS_CD
-		AND A.DISPLOC_GB = 'G'
+		FROM TB_GOODS_VIDEO A
+		INNER JOIN TB_GOODS C ON A.GOODS_CD = C.GOODS_CD
+		INNER JOIN TB_BRAND D ON C.BRAND_CD = D.BRAND_CD
+		WHERE 1 = 1
 		<if test='goodsCd != null and goodsCd != "" '>
-		AND A.DISPLOC_VAL = #{goodsCd}
+		AND A.GOODS_CD = #{goodsCd}
+		</if>
+		<if test='goodsNm != null and goodsNm != "" '>
+		AND C.GOODS_NM = #{goodsNm}
+		</if>
+		<if test='goodsNum != null and goodsNum != "" '>
+		AND C.GOODS_NUM = #{goodsNum}
+		</if>
+		<if test='supplyGoodsCd != null and supplyGoodsCd != "" '>
+		AND C.SUPPLY_GOODS_CD = #{supplyGoodsCd}
+		</if>
+		<if test='brandEnm != null and brandEnm != "" '>
+		AND (
+		     D.BRAND_ENM LIKE #{brandEnm}||'%'
+		     OR
+		     D.BRAND_KNM LIKE #{brandEnm}||'%'
+		    )
 		</if>
 		<if test='stDate != null and stDate != "" '>
 		<![CDATA[
@@ -2887,41 +2876,29 @@
 		AND A.REG_DT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
 		]]>
 		</if>
-		ORDER BY A.DISPLOC_VAL
+		ORDER BY A.VIDEO_SQ DESC
 	</select>
 		
 	<!-- 상품 동영상 노출안함으로 변경 -->
-	<update id="updateNotUseGoodsVideo" parameterType="Video">
+	<update id="updateNotUseGoodsVideo" parameterType="GoodsVideo">
 		/* TsaGoods.updateNotUseGoodsVideo */
-		UPDATE TB_VIDEO_DISPLOC
+		UPDATE TB_GOODS_VIDEO
 		SET DISP_YN = 'N'
 		  , UPD_NO = #{updNo}
 		  , UPD_DT = NOW()
 		WHERE VIDEO_SQ = #{videoSq}
 	</update>
 	
-	<!-- 동영상 코드 조회 -->
-	<select id="getVideoSeq" parameterType="Video" resultType="String">
-		/* TsaGoods.getVideoSeq */
-		SELECT MAX(VIDEO_SQ) AS VIDEO_SQ
-		FROM TB_VIDEO
-		WHERE VIDEO_GB = #{videoGb}
-		AND VIDEO_VAL = #{videoVal}
-	</select>
-	
 	<!-- 동영상  등록 -->
-	<insert id="createVideo" parameterType="Video">
-		/* TsaGoods.createVideo */
-		INSERT INTO TB_VIDEO
+	<insert id="createGoodsVideo" parameterType="GoodsVideo">
+		/* TsaGoods.createGoodsVideo */
+		INSERT INTO TB_GOODS_VIDEO
 		    (
 		           VIDEO_SQ
+		         , GOODS_CD
 		         , VIDEO_GB
-		         , VIDEO_VAL
-		         , FYEAR
-		         , TYEAR
-		         , SEASON_STR
-		         , VIDEO_TITLE
-		         , VIDEO_TITLE2
+		         , KMC_KEY
+		         , KUF_KEY
 		         , DISP_YN
 		         , REG_NO
 		         , REG_DT
@@ -2930,76 +2907,34 @@
 		    )
 		    VALUES (
 		           NULL
+		         , #{goodsCd}
 		         , #{videoGb}
-		         , #{videoVal}
-		         , #{fyear}
-		         , #{tyear}
-		         , #{seasonStr}
-		         , #{videoTitle}
-		         , #{videoTitle2}
+		         , #{kmcKey}
+		         , #{kufKey}
 		         , #{dispYn}
 		         , #{regNo}
 		         , NOW()
 		         , #{updNo}
 		         , NOW()
 		    )
+		ON DUPLICATE KEY UPDATE
+		       DISP_YN = #{dispYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
 	</insert>
 	
 	<!-- 동영상  수정 -->
-	<update id="updateVideo" parameterType="Video">
-		/* TsaGoods.saveVideo */
+	<update id="updateGoodsVideo" parameterType="GoodsVideo">
+		/* TsaGoods.saveGoodsVideo */
 		UPDATE TB_VIDEO SET
 		           DISP_YN = #{dispYn}
 		         , VIDEO_GB = #{videoGb}
 		         , VIDEO_VAL = #{videoVal}
-		         , FYEAR = #{fyear}
-		         , TYEAR = #{tyear}
-		         , SEASON_STR = #{seasonStr}
-		         , VIDEO_TITLE = #{videoTitle}
-		         , VIDEO_TITLE2 = #{videoTitle2}
 		         , UPD_NO = #{updNo}
 		         , UPD_DT = NOW()
-	</update>
-	
-	<!-- 동영상 위치 노출안함으로 처리 -->
-	<update id="delVideoDispLoc" parameterType="Video">
-		/* TsaGoods.initVideoDispLoc */
-		UPDATE TB_VIDEO_DISPLOC
-		SET DISP_YN = 'N'
 		WHERE VIDEO_SQ = #{videoSq}
-		AND DISPLOC_GB = #{displocGb}
 	</update>
 	
-	<!-- 동영상 위치 등록 -->
-	<insert id="saveVideoDispLoc" parameterType="Video">
-		/* TsaGoods.saveVideoDispLoc */
-		INSERT INTO TB_VIDEO_DISPLOC
-		    (
-		           VIDEO_SQ
-		         , DISPLOC_GB
-		         , DISPLOC_VAL
-		         , DISP_YN
-		         , REG_NO
-		         , REG_DT
-		         , UPD_NO
-		         , UPD_DT
-		    )
-		    VALUES (
-		           #{videoSq}
-		         , #{displocGb}
-		         , #{displocVal}
-		         , #{dispYn}
-		         , #{regNo}
-		         , NOW()
-		         , #{updNo}
-		         , NOW()
-		    )
-		ON DUPLICATE KEY UPDATE
-		       DISP_YN = #{dispYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-	
 	<!-- 상품 옵션 존재여부 확인 -->
 	<select id="getGoodsOptionCount" parameterType="Option" resultType="int">
 		/* TsaGoods.getGoodsOptionCount */

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

@@ -109,5 +109,38 @@
 		)Z WHERE RNUM BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
 	</select>
 
-
+	<!-- 출고처지정 지연재고 등록     -->
+	<insert id="insertWmsTbIfDelifixQty" parameterType="Delivery" >
+		/*TsaWmsWithdraw.insertWmsTbIfDelifixQty*/
+		INSERT INTO iSTYLE24_WmsIf.dbo.TB_IF_DELIFIX_QTY
+		(
+			  OrderNo
+			, OrderDtlNo
+			, SKUCode
+			, ProductNo
+			, Qty
+			, DateCreated
+		)
+		VALUES
+		(
+			  #{ordNo}
+			, #{ordDtlNo}
+			, #{optCd}
+			, #{productNo}
+			, #{ordQty}
+			, GETDATE()
+		)
+	</insert>	
+	
+	<!-- 출고처지정 지연재고 삭제     -->
+	<delete id="deleteWmsTbIfDelifixQty" parameterType="Delivery" >
+		/*TsaWmsWithdraw.deleteWmsTbIfDelifixQty*/
+		DELETE FROM iSTYLE24_WmsIf.dbo.TB_IF_DELIFIX_QTY 
+		WHERE OrderNo    = #{ordNo}
+		  AND OrderDtlNo = #{ordDtlNo}
+	</delete>		
+	
+	
+	
+	
 </mapper>

+ 398 - 0
src/main/webapp/WEB-INF/views/delivery/AssignListForm.html

@@ -0,0 +1,398 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : AssignListForm.html
+ * @desc    : 출고처지정 목록 Page
+ *============================================================================
+ * ISTYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.16   moon       최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+	
+		<!-- 검색조건 영역 -->
+		<form id="searchForm" name="searchForm" action="#" th:action="@{'/delivery/assign/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: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>
+						<tr>
+							<th>주문자명</th>
+							<td>
+								<input type="text" class="" name="orderNm" placeholder="" maxlength="20" />
+							</td>
+							<th>주문번호</th>
+							<td>
+								<input type="text" class="" name="ordNo" placeholder="" maxlength="20" />
+							</td>
+							<th>주문상세번호</th>
+							<td>
+								<input type="text" class="" name="ordDtlNo" placeholder="" maxlength="20" />
+							</td>
+							<th>외부몰주문번호</th>
+							<td>
+								<input type="text" class="" name="extmallOrderId" placeholder="" maxlength="100" />
+							</td>
+						</tr>
+						<tr>
+							<th>사이트</th>
+							<td>
+								<select name="siteCd" id="siteCd">
+									<option value="">[전체]</option>
+									<option th:if="${siteCdList}" th:each="oneData, status : ${siteCdList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+								</select>
+							</td>
+							<th>몰구분</th>
+							<td>
+								<select name="mallGb" id="mallGb">
+									<option value="">[전체]</option>
+									<option th:if="${mallGbList}" th:each="oneData, status : ${mallGbList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+								</select>
+							</td>
+							<th>상품코드</th>
+							<td>
+								<input type="text" class="" name="goodsCd" placeholder="" maxlength="20" />
+							</td>
+							<th>정상/이월</th>
+							<td>
+								<select name="formalGb" id="formalGb">
+									<option value="">[전체]</option>
+									<option th:if="formalGbList" th:each="oneData, status : ${formalGbList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<th>출고처지정상태</th>
+							<td>
+								<select name="delvAssignStat" id="delvAssignStat">
+									<option value="">[전체]</option>
+									<option value="Y">출고처 지정</option>
+									<option value="N" selected>출고처 미지정</option>
+								</select>
+							</td>
+							<th>출고처</th>
+							<td>
+								<select name="delvLocCd" id="delvLocCd">
+									<option value="">[전체]</option>
+									<option th:if="${deliveryLocList}" th:each="oneData, status : ${deliveryLocList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+								</select>
+							</td>
+							<!-- <th>주문상세상태</th>
+							<td>
+								<select name="ordDtlStat" id="ordDtlStat">
+									<option value="">[전체]</option>
+									<option th:if="${ordDtlStatList}" th:each="oneData, status : ${ordDtlStatList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+								</select>
+							</td> -->
+							<th>교환여부</th>
+							<td td colspan="4">
+								<select name="ordExchGb" id="ordExchGb">
+									<option value="">[전체]</option>
+									<option value="Y">Yes</option>
+									<option value="N">No</option>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<th>주문등록일</th>
+							<td colspan="7">
+								<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="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="gridAssignList" style="width:100%; height: 700px;" class="ag-theme-balham"></div>
+				<ul class="panelBar">
+					<li class="center">
+						<div class="tablePaging" id="assignListPagination"></div>
+					</li>
+				</ul>
+		</div>
+		</form>
+		<!-- //리스트 영역 -->
+	</div>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=20210114"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	var columnDefs = [
+		// group cell renderer needed for expand / collapse icons
+		{headerName: "사이트", 		field: "siteNm", 		width: 120,	cellClass: 'text-center'},
+		{headerName: "주문번호", 		field: "ordNo", 	width: 85,	cellClass: 'text-center'
+			, cellRenderer: function(params) {
+				return "<a href=\"javascript:void(0);\" onclick=\"cfnOpenOrderDetailPopup('" + params.value + "');\">" + params.value + "</a>";
+			}
+		},
+		{headerName: "주문상세번호", 	field: "ordDtlNo", 			width: 100,	cellClass: 'text-center'},
+		{headerName: "출고처지정취소", 	field: "delvLocCd", 		width: 140,	cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return gagajf.isNull(params.value) ? "" : '<button type="button" class="btn btn-danger btn-sm" onclick="fnCancelAssignDelvLoc(\'' + params.data.ordNo + '\',\'' + params.data.ordDtlNo + '\',\''+params.data.delvLocClsf+'\');">&nbsp;출고처지정취소&nbsp;</button>';
+			}
+		},		
+		{headerName: "출고처", 		field: "delvLocNm",			width: 200, cellClass: 'text-center'
+			, cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value : "<a href=\"javascript:void(0);\" onclick=\"fnOpenDeliveryAssignPopup('" + params.data.ordDtlNo + "');\">[출고처 지정]</a>";
+			}},
+		{headerName: "주문일시", 		field: "ordDt", 			width: 150, cellClass: 'text-center',
+				cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYY-MM-DD HH:mm:ss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "결제일시", 		field: "ordDt", 			width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYY-MM-DD HH:mm:ss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "몰구분", 		field: "mallNm", 			width: 70, cellClass: 'text-center'},
+		{headerName: "외부몰", 		field: "extmallNm",			width: 150,	cellClass: 'text-center'},
+		{headerName: "주문자", 		field: "ordNm",				width: 100, cellClass: 'text-center'},
+		{headerName: "상품코드", 		field: "goodsCd", 			width: 120, cellClass: 'text-center'},
+		{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: "optCd",				width: 100,	cellClass: 'text-center'},
+		{headerName: "색상", 			field: "optCd1",			width: 70, 	cellClass: 'text-center'},
+		{headerName: "사이즈", 		field: "optCd2",			width: 70, 	cellClass: 'text-center'},
+		{headerName: "주문수량",		field: "ordQty", 			width: 80,	cellClass: 'text-center'},
+		{headerName: "현재고",		field: "currStockQty", 		width: 80,	cellClass: 'text-center',
+			cellRenderer: function (params) {
+				var option;
+				if (params.data.goodsType == 'G056_S') {
+					option = "-";
+				} else {
+					option = params.value
+				}
+				return option;
+			}		
+		},
+		{headerName: "안전재고",		field: "baseStockQty", 		width: 80,	cellClass: 'text-center',
+			cellRenderer: function (params) {
+				var option;
+				if (params.data.goodsType == 'G056_S') {
+					option = "-";
+				} else {
+					option = params.value
+				}
+				return option;
+			}				
+		},
+		{headerName: "주문금액", 		field: "ordAmt", 			width: 80, 	cellClass: 'text-center', valueFormatter: function (params) { return params.value.addComma(); }	},
+		{headerName: "주문상세상태", 	field: "ordDtlStatNm",		width: 100, cellClass: 'text-center'},
+		{headerName: "교환여부", 		field: "ordExchNm",			width: 80,  cellClass: 'text-left'},
+		{headerName: "물류비고", 		field: "dstrbtNote",		width: 300, cellClass: 'text-left'},
+		{headerName: "정상/이월",	 	field: "formalGbNm",		width: 80, cellClass: 'text-center'}
+	];
+	
+	//Get GridOptions
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	
+	//Grid editable
+	//gridOptions.defaultColDef.editable = true;
+	
+	gridOptions.suppressRowClickSelection = true;
+	gridOptions.rowSelection = 'multiple';
+	
+	/*************************************************************************
+	* init
+	**************************************************************************/		
+	$(document).ready(function() {
+	    gagaAgGrid.createGrid('gridAssignList', gridOptions);
+	    var hideList = ["btnThisWeek", "btnYesterWeek", "btnRecentMonth", "btnThisMonth", "btnYesterMonth", "btnRecent3Month"];
+		cfnCreateCalendar('#terms', 'stDate', 'edDate', true, '주문', '', hideList);
+		$(".btnToday").trigger('click');
+
+		
+	});
+
+	/*************************************************************************
+	* 초기화 
+	**************************************************************************/		
+	var fnInitCalendar = function() {
+		$(".btnToday").trigger('click');
+	}
+	
+	/*************************************************************************
+	* 조회 클릭
+	**************************************************************************/
+	$('#btnSearch').on('click', function() {
+		fnSearchList();
+	});
+	
+	/*************************************************************************
+	* 조회 
+	**************************************************************************/		
+	var fnSearchList = function() {
+		if($('#searchForm input[name=ordNo]').val() == '' && $('#searchForm input[name=ordDtlNo]').val() == '') {
+			if($('#stDate').val() == ''){
+				mcxDialog.alert('시작 기간을 입력하세요.');
+				return;
+			}
+
+			if($('#edDate').val() == ''){
+				mcxDialog.alert('종료 기간을 입력하세요.');
+				return;
+			}
+		}
+		
+		gagaPaging.init('searchForm', fnSearchCallBack, 'assignListPagination', $('#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.assignList);
+		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 = {
+			
+			fileName : "출고처목록_"+ date,
+			sheetName: "DATA"
+		}
+		gridOptions.excelStyles = [
+			{
+				id: 'dateFormat',
+				dataType: 'dateTime',
+				numberFormat: {
+					format: 'YYYY-MM-DD;@'
+				}
+			},
+			{
+				id: 'textFormat',
+				dataType: 'string'
+			}
+		]
+		
+		gridOptions.api.exportDataAsExcel(params);
+	});
+	
+	/*************************************************************************
+	* 수동출고처지정 팝업호출
+	**************************************************************************/		
+	var fnOpenDeliveryAssignPopup = function(ordDtlNo) {
+		var actionUrl = "/delivery/assign/popup/form/";
+		if (typeof(ordDtlNo) != 'undefined') actionUrl += ordDtlNo;
+		cfnOpenModalPopup(actionUrl, "popupAssignForm");
+	}
+	
+	/*************************************************************************
+	* 출고처 지정 취소
+	**************************************************************************/			
+	var fnCancelAssignDelvLoc = function(ordNo, ordDtlNo, delvLocClsf){
+		mcxDialog.confirm("출고처 지정 취소 하시겠습니까?", {
+		    cancelBtnText: "취소",
+		    sureBtnText: "확인",
+		    sureBtnClick: function() {
+	            var param = new Object;
+	            param.ordNo    = ordNo;
+	            param.ordDtlNo = ordDtlNo;
+	            param.delvLocClsf = delvLocClsf;
+	            var jsonData = JSON.stringify(param);
+	            gagajf.ajaxJsonSubmit('/delivery/cancel/assignDelvLoc', jsonData, fnSearchList);
+	        }
+		});
+	}
+	
+	
+	
+/*]]>*/
+</script>
+</html>

+ 124 - 0
src/main/webapp/WEB-INF/views/delivery/AssignPopupForm.html

@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : AssignPopupForm.html
+ * @desc    : 출고처 지정 팝업
+ *============================================================================
+ * ISTYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.04.19   moon       최초 작성
+ *******************************************************************************
+ -->
+	<div class="modalPopup" data-width="620">
+		<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<h2>출고처 지정</h2>
+			<button type="button" class="close" onclick="uifnPopupClose('popupAssignForm')"><i class="fa fa-times"></i></button>
+		</div>
+		<!-- //TITLE -->
+
+		<form id="assignPopupForm" name="assignPopupForm" th:action="@{'/delivery/assign/popup/list'}" >
+		<input type="hidden" name="ordDtlNo" id="ordDtlNo" th:value="${orderDetail.ordDtlNo}">
+		<input type="hidden" name="goodsCd" id="goodsCd" th:value="${orderDetail.goodsCd}">
+		<input type="hidden" name="sizeCd" id="ordNo" th:value="${orderDetail.ordNo}"> 
+			<table class="frmStyle">
+				<colgroup>
+					<col style="width:10%;"/>
+					<col style="width:20%;"/>
+					<col style="width:10%;"/>
+					<col style="width:20%;"/>
+					<col style="width:10%;"/>
+					<col style="width:30%;"/>
+				</colgroup>
+				<tr>
+					<th>주문상세번호</th>
+					<td class="aC solidR" th:text="${orderDetail.ordDtlNo}"></td>
+					<th>상품가격</th>
+					<td class="aC solidR" th:text="${#numbers.formatDecimal(orderDetail.currPrice, 0,'COMMA', 0,'POINT')}">
+					<th>상품코드</th>
+					<td class="aC solidR" th:text="${orderDetail.goodsCd}"></td>
+				</tr>
+			</table>
+		</form>
+
+		<ul class="panelBar">
+			<li class="center">
+			<button type="button" class="btn btn-base btn-sm" id="btnPopupSearch">조회</button>
+			<button type="button" class="btn btn-danger btn-sm" id="btnPopupAssign">출고처 지정</button>
+			</li>
+		</ul>
+		<!-- 테이블 영역  영역 -->
+		
+		<div id="gridDelvLocList" style="width: 100%; height: 300px;" class="ag-theme-balham"></div>
+		
+		<!-- 테이블 영역 -->
+		</div>
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var assignPopupColumnDefs = [
+		// group cell renderer needed for expand / collapse icons
+		{headerName: "출고처", 		field: "delvLocNm", width: 300, cellClass: 'text-center'},
+		{headerName: "출고처코드", 	field: "delvLocCd",	width: 100,	cellClass: 'text-center'},
+		{headerName: "수량",      	field: "stockQty", 	width: 60,	cellClass: 'text-center'},
+		{headerName: "출고거부여부",	field: "delvArGb",	width: 100, cellClass: 'text-center'}
+	];
+
+	//Get GridOptions
+	var assignPopupGridOptions = gagaAgGrid.getGridOptions(assignPopupColumnDefs);
+
+	assignPopupGridOptions.rowSelection = 'single';
+
+	$(document).ready(function() {
+	    gagaAgGrid.createGrid('gridDelvLocList', assignPopupGridOptions);
+	});
+
+	$('#btnPopupSearch').on('click', function() {
+		fnPopupSearchList();
+	});
+
+	var fnPopupSearchList = function() {
+		gagaAgGrid.fetch($('#assignPopupForm').prop('action'), assignPopupGridOptions, '#assignPopupForm', function(){
+		});
+	}
+
+	// 출고처지정 버튼 클릭 시
+	$('#btnPopupAssign').on('click', function() {
+		var selectedRowData = gagaAgGrid.selectedRowData(assignPopupGridOptions);
+
+		if (selectedRowData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+
+		mcxDialog.confirm('출고처를 지정하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var updatedData = selectedRowData[0];
+				updatedData.ordDtlNo = $('#ordDtlNo').val();
+				updatedData.ordNo = $('#ordNo').val();
+				var jsonData = JSON.stringify(updatedData);
+				 gagajf.ajaxJsonSubmit('/delivery/assign/save'
+						, jsonData
+						, function() {
+							$('#btnSearch').trigger('click');
+							uifnPopupClose('popupAssignForm');
+						});
+			}
+		});
+	});
+
+	$(document).ready(function() {
+		fnPopupSearchList();
+	});
+/*]]>*/
+</script>
+</html>

+ 8 - 6
src/main/webapp/WEB-INF/views/delivery/DeliveryDetailItemForm.html

@@ -6,7 +6,7 @@
  * @source  : DeliveryDetailItemForm.html
  * @desc    : 주문상세 단품 화면
  *============================================================================
- * STYLE24
+ * ISTYLE24
  * Copyright(C) 2021 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION
@@ -16,7 +16,7 @@
  -->
 
 
-<div class="modalPopup" data-width="650" >
+<div class="modalPopup" data-width="750" >
 	<div class="panelStyle">
 		<div class="panelTitle">
 			<h2>세트구성 상품정보</h2>
@@ -38,16 +38,18 @@ var delvDetailItemList = [[${delvDetailItemList}]];
 
 	// specify the columns
 	var columnDefsDelvDetailItemInfo = [
-			{headerName: "상품코드",	field: "itemCd", 	width: 130, cellClass: 'text-center'},
+			{headerName: "상품코드",	field: "itemCd", 	width: 100, 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',
+			{headerName: "사이즈", 	field: "optCd2", 	width: 70, cellClass: 'text-center'},
+			{headerName: "수량",  	field: "itemQty", 	width: 45, cellClass: 'text-center'},
+			{headerName: "단가", 		field: "itemPrice", width: 70, cellClass: 'text-right',
 				cellRenderer: function (params) {
 					return params.value.addComma();
 				}
 			},
+			{headerName: "현재고",  	field: "currStockQty", 	width: 70, cellClass: 'text-right'},
+			{headerName: "안전재고",  	field: "baseStockQty", 	width: 70, cellClass: 'text-right'}
 	];
 
 	$(document).ready(function() {

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

@@ -6,7 +6,7 @@
  * @source  : DeliveryWithdrawDirectiveListForm.html
  * @desc    : 배송/회수지시 목록 Page
  *=============================================================
- * STYLE24
+ * ISTYLE24
  * Copyright(C) 2021 TSIT, All rights reserved.
  *=============================================================
  * VER  DATE         AUTHOR      DESCRIPTION

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

@@ -6,7 +6,7 @@
  * @source  : SaveInvoiceForm.html
  * @desc    : 송장등록/수정 화면
  *============================================================================
- * STYLE24
+ * ISTYLE24
  * Copyright(C) 2021 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION

+ 111 - 33
src/main/webapp/WEB-INF/views/goods/GoodsVideoForm.html

@@ -92,7 +92,7 @@
 		<!-- //리스트 영역 -->
 		<!-- 등록/수정 -->
 		<div class="panelStyle">
-			<form id="detailForm" name="detailForm" action="#" th:action="@{'/display/brand/save'}">
+			<form id="detailForm" name="detailForm" action="#" >
 				<table class="frmStyle">
 					<colgroup>
 						<col style="width:10%;"/>
@@ -113,9 +113,9 @@
 						</td>
 						<th>동영상구분<em class="required" title="필수"></em></th>
 						<td>
-							<select name="videoGb" id="videoGb" required="required" data-valid-name="동영상구분" onchange="">
-								<option value="">[선택]</option>
-								<option value="Y">[Y] 유투브</option>
+							<select name="videoGb" id="videoGb" required="required" data-valid-name="동영상구분" onchange="fnVideoGb();">
+								<!-- <option value="">[선택]</option> -->
+								<option value="Y" selected="selected">[Y] 유투브</option>
 								<option value="M">[M] MP4</option>
 							</select>
 						</td>
@@ -125,14 +125,28 @@
 							<label class="rdoBtn"><input type="radio" name="dispYn" id="dispYn" value="N">N</label>
 						</td>
 					</tr>
-					<tr>
+					<tr id="youtubeArea">
 						<th>동영상URL<em class="required" title="필수"></em></th>
 						<td class="infoTxt" colspan="5">
 							<em><i class="fa fa-info-circle"></i>유투브의 경우 빨간색 표시로 되어있는 값만 넣으세요.</em><br/>
 							예시 : https://www.youtube.com/embed/<em><strong>5YqYG71bQ3s</strong></em>?showinfo=0&amp;rel=0&amp;vp=hd1080&amp;fs=0&amp;wmode=opaque&amp;enablejsapi=1
 							<br/>
-							<input type="text" class="w400" id="videoVal" name="videoVal" maxlength="100" required="required" data-valid-name="동영상URL">
-							<button type="button" class="btn btn-dark btn-lg" onclick="cfnOpenGoodsVideoPopup('filmVideoView','videoVal', '#detailForm', $('#videoGb').val());">미리보기</button>
+							<input type="text" class="w400" id="kmcKey" name="kmcKey" maxlength="100" >
+							<button type="button" class="btn btn-dark btn-lg" onclick="cfnOpenGoodsVideoPopup('filmVideoView','kmcKey', '#detailForm', $('#videoGb').val());">미리보기</button>
+						</td>
+					</tr>
+					<tr id="fileArea" style="display:none;">
+						<th>파일첨부<em class="required" title="필수"></em></th>
+						<td class="infoTxt" colspan="5">
+							<div class="uFile w300">
+								<input id="file" name="file" type="file" class="uFileInput w300"/>
+								<label for="file" class="uFileLabel">파일선택</label>
+								<input type="hidden" name="kufKey"/>
+								<input type="hidden" name="kmcKey"/>
+							</div>
+							<div id="keyArea">미디어키 : <input type="text" class="w200"  name="hkmcKey" disabled> upload키 : <input type="text" class="w200"  name="hkufKey" disabled></div>
+							<button type="button" class="btn btn-dark btn-lg" onclick="cfnOpenGoodsVideoPopup('filmVideoView','kmcKey', '#detailForm', $('#videoGb').val());">미리보기</button>
+							
 						</td>
 					</tr>
 				</table>
@@ -145,7 +159,7 @@
 			</form>
 		</div>
 	</div>
-
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.kollus.js"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
 	var videoGbList = {'Y':'유투브', 'M':'MP4'};
@@ -163,7 +177,7 @@
  		{headerName: "동영상구분", field: "videoGb", width: 100, cellClass: 'text-center',
 			cellRenderer: function (params) { return !gagajf.isNull(params.value) ? "["+params.value+"] "+gagaAgGrid.lookupValue(videoGbList, params.value) : '';}
 		},
-		{headerName: "동영상정보", field: "videoVal", width: 300, cellClass: 'text-center'},
+		{headerName: "동영상정보", field: "kmcKey", width: 300, cellClass: 'text-center'},
 		{headerName: "노출여부", field: "dispYn", width: 80, cellClass: 'text-center'},
 		{headerName: "등록일자", field: "regDt", width: 150, cellClass: 'text-center',
 			cellRenderer: function(params) {
@@ -192,10 +206,24 @@
 			$(formId + " input[name=videoSq]").val(event.data.videoSq);
 			$(formId + " input[name=goodsCd]").val(event.data.goodsCd);
 			$(formId + " select[name=videoGb]").val(event.data.videoGb);
-			$(formId + " input[name=videoVal]").val(event.data.videoVal);
+			$(formId + " input[name=kmcKey]").val(event.data.kmcKey);
+			$(formId + " input[name=kufKey]").val(event.data.kufKey);
+			$(formId + " input[name=hkmcKey]").val(event.data.kmcKey);
+			$(formId + " input[name=hkufKey]").val(event.data.kufKey);
 			$(formId + " input:radio[name=dispYn]:input[value="+event.data.dispYn+"]").click();
 			$(formId + " input[name=goodsCd]").prop("disabled", true);
+			$(formId + " select[name=videoGb]").prop("disabled", true);
+			
 			$(formId).closest("div").show();
+			if ("Y" == event.data.videoGb){
+				$('#youtubeArea').show();
+				$('#fileArea').hide();
+			}else{
+				$('#youtubeArea').hide();
+				$('#fileArea').show();
+				$('.uFile').hide();
+				$('#keyArea').show();
+			}
 		}
 	}
 	
@@ -204,6 +232,9 @@
 		$("#detailForm")[0].reset();
 		$("#detailForm input[name=videoSq]").val('');
 		$("#detailForm input[name=goodsCd]").prop("disabled", false);
+		$("#detailForm select[name=videoGb]").prop("disabled", false);
+		$('#youtubeArea').show();
+		$('#fileArea').hide();
 	});
 
 	// 엑셀등록
@@ -218,6 +249,21 @@
 		
 	}
 	
+	// 동영상구분 변경시
+	var fnVideoGb = function(){
+		if ("Y" == $("#detailForm select[name=videoGb]").val()){
+			$('#youtubeArea').show();
+			$('#fileArea').hide();
+			$('.uFile').hide();
+			$('#keyArea').hide();
+		}else{
+			$('#youtubeArea').hide();
+			$('#fileArea').show();
+			$('.uFile').show();
+			$('#keyArea').hide();
+		}
+	}
+	
 	// 조회
 	$('#btnSearch').on('click', function() {
 		$("#goodsCd").val('');
@@ -225,15 +271,47 @@
 		$("#goodsNum").val('');
 		$("#supplyGoodsCd").val('');
 		$("#"+$("#searchForm select[name=keyWord]").val()).val($("#searchForm input[name=searchTxt]").val());
-		// 기간 값 체크
-		if (!fnCalendarDateValidation('#sellTerms', 'stDate', 'edDate')){
-			return false;
-		}
+		
+		if(!fnConditionCheck()) return;
+		
+		
 		// Fetch data
 		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
 		$("#btnNew").click();
 	});
 	
+	//검색 조건 확인
+	var fnConditionCheck = function(){
+		var form = document.searchForm;
+
+		var searchFlag = false;
+		var cnt = 0;
+
+		for (i = 0; i < form.elements.length; i++ ) {
+			var el = form.elements[i];
+
+			if ($(el).prop("type") == "text" || ($(el).prop("type") == "select-one" && el.name != "search" && el.name != "pageSize" && el.name != "keyWord")) {
+				if (!(el.value == null || el.value == "")) {
+					cnt++;
+				}
+			}
+		}
+		if(cnt > 0) searchFlag = true;
+
+		
+		if(searchFlag == false){
+			mcxDialog.alert("검색조건을 입력하세요.");
+			return false;
+		}
+		
+		// 기간 값 체크
+		if (!fnCalendarDateValidation('#sellTerms', 'stDate', 'edDate')){
+			return false;
+		}
+
+		return true;
+	}
+	
 	// 검색조건 초기화
 	$('#btnInit').on('click', function() {
 		$("#searchForm")[0].reset();
@@ -261,12 +339,13 @@
 		
 		var formId = '#detailForm';
 		var videoSq = $(formId + " input[name=videoSq]").val();
-		var displocVal = $(formId + " input[name=goodsCd]").val();
+		var goodsCd = $(formId + " input[name=goodsCd]").val();
 		var videoGb = $(formId + " select[name=videoGb]").val();
-		var videoVal = $(formId + " input[name=videoVal]").val();
+		var kmcKey = $(formId + " input[name=kmcKey]").val();
+		var kufKey = $(formId + " input[name=kufKey]").val();
 		var dispYn = $(formId + " input:radio[name=dispYn]:checked").val();
 		
-		if(displocVal==''){
+		if(goodsCd==''){
 			gagajf.alertMessage(formId + " input[name=goodsCd]", 'input');
 			return;
 		}
@@ -274,21 +353,14 @@
 			gagajf.alertMessage(formId + " select[name=videoGb]", 'select');
 			return;
 		}
-		if(videoVal==''){
-			gagajf.alertMessage(formId + " input[name=videoVal]", 'input');
+		/* if(kmcKey==''){
+			gagajf.alertMessage(formId + " input[name=kmcKey]", 'input');
 			return;
-		}
+		} */
 		
-		if(videoVal.indexOf("http")>-1){
-			if(videoGb=='Y'){
-				mcxDialog.alert('동영상URL 형식이 유투브와 맞지 않습니다.');
-				return;
-			}
-		}else{
-			if(videoGb=='M'){
-				mcxDialog.alert('동영상URL 형식이 MP4와 맞지 않습니다.');
-				return;
-			}
+		if(kmcKey.indexOf("http")>-1){
+			mcxDialog.alert('동영상 정보를 확인해 주세요.');
+			return;
 		}
 		
 		mcxDialog.confirm('저장 하시겠습니까?', {
@@ -296,10 +368,10 @@
 			sureBtnText: "확인",
 			sureBtnClick: function(){
 				var data = {videoSq : videoSq
-							,displocGb : 'G'
-							,displocValArr : [displocVal]
+							,goodsCd : goodsCd
 							,videoGb : videoGb
-							,videoVal : videoVal
+							,kmcKey : kmcKey
+							,kufKey : kufKey
 							,dispYn : dispYn
 							};
 				var jsonData = JSON.stringify(data);
@@ -312,6 +384,12 @@
 		$('#btnSearch').click();
 	}
 	
+	// 동영상파일 선택 시
+	$('#detailForm input[name=file]').on('change', function() {
+		var file = this.files[0];
+		gagaKollus.upload('Goods', file, $('input[name=kufKey]'));
+	});
+	
 	$(document).ready(function() {
 		
 		cfnCreateCalendar('#sellTerms', 'stDate', 'edDate', true, '등록일', true);

+ 38 - 3
src/main/webapp/ux/plugins/gaga/gaga.summernote.js

@@ -87,9 +87,18 @@ var gagaSn = {
 			fontSizes: ['8','9','10','11','12','13','14','15','16','17','18','19','20','24','30','36'],
 			toolbar: toolbarOptions,
 			callbacks: {
-				onImageUpload: function(files, editor, welEditable) { //이미지 업로드
-					for (var i = files.length - 1; i >= 0; i--) {
-						sendFile(files[i], this);
+				onImageUpload: function(files) { // 이미지 업로드
+					for (var i = 0; i < files.length; i++) {
+						uploadImage(files[i], this);
+					}
+				},
+				onPaste: function(e) {
+					var clipboardData = e.originalEvent.clipboardData;
+					if (clipboardData && clipboardData.items && clipboardData.items.length) {
+						var item = clipboardData.items[0];
+						if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {
+							e.preventDefault();
+						}
 					}
 				}
 			}
@@ -107,6 +116,32 @@ var gagaSn = {
 		} catch(e) {
 			// Do nothing
 		}
+	},
+	
+	uploadImage : function(file, editorId) {
+		var formData = new FormData();
+		formData.append("file", file);
+		formData.append("policy", image);
+		
+		$.ajax({
+			data : formData,
+			type : 'POST',
+			url : '/common/file/upload?subDir=/editor',
+			cache : false,
+			contentType : false,
+			enctype : 'multipart/form-data',
+			processData : false,
+			success : function(data) {
+				console.log("================== EDITOR FILE UPLOAD ===================");
+				console.log("viewUrl : " + data.viewUrl);
+				console.log("viewPath : " + data.viewPath);
+				console.log("oldFileNm : " + data.oldFileNm);
+				console.log("newFileNm : " + data.newFileNm);
+				console.log("filePath : " + data.filePath);
+				console.log("================== // EDITOR FILE UPLOAD ===================");
+				$(editorId).summernote('insertImage', data.viewPath);
+			}
+		});
 	}
 
 }