moon 5 éve
szülő
commit
79dc105930
33 módosított fájl, 8247 hozzáadás és 2 törlés
  1. 117 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaDeliveryDao.java
  2. 71 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaPosDao.java
  3. 465 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaWithdrawDao.java
  4. 186 0
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaDeliveryService.java
  5. 120 0
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaPosService.java
  6. 1541 0
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaWithdrawService.java
  7. 352 0
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaDeliveryController.java
  8. 475 0
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaPosController.java
  9. 91 0
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaShipController.java
  10. 425 0
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaWithdrawController.java
  11. 16 0
      style24.admin/src/main/java/com/style24/admin/support/env/TsaConstants.java
  12. 300 0
      style24.admin/src/main/java/com/style24/persistence/domain/Delivery.java
  13. 251 0
      style24.admin/src/main/java/com/style24/persistence/domain/Withdraw.java
  14. 402 0
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaDelivery.xml
  15. 72 0
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaPos.xml
  16. 2 2
      style24.admin/src/main/webapp/WEB-INF/views/business/DeliveryLocForm.html
  17. 217 0
      style24.admin/src/main/webapp/WEB-INF/views/delivery/BanGoodsRegistForm.html
  18. 313 0
      style24.admin/src/main/webapp/WEB-INF/views/delivery/BangoodsListForm.html
  19. 540 0
      style24.admin/src/main/webapp/WEB-INF/views/delivery/DeliveryListForm.html
  20. 236 0
      style24.admin/src/main/webapp/WEB-INF/views/delivery/DeliveryWithdrawDirectiveListForm.html
  21. 845 0
      style24.admin/src/main/webapp/WEB-INF/views/pos/PosMainForm.html
  22. 508 0
      style24.admin/src/main/webapp/WEB-INF/views/withdraw/RefundDetailForm.html
  23. 244 0
      style24.admin/src/main/webapp/WEB-INF/views/withdraw/RefundRegisterListForm.html
  24. 39 0
      style24.batch/src/main/java/com/style24/batch/biz/dao/TsbDeliveryDao.java
  25. 26 0
      style24.batch/src/main/java/com/style24/batch/biz/dao/TsbWmsDeliveryDao.java
  26. 73 0
      style24.batch/src/main/java/com/style24/batch/biz/job/delivery/TsbDailyDeliveryZoneJob.java
  27. 71 0
      style24.batch/src/main/java/com/style24/batch/biz/service/TsbDeliveryService.java
  28. 46 0
      style24.batch/src/main/java/com/style24/batch/biz/service/TsbWmsDeliveryService.java
  29. 61 0
      style24.batch/src/main/java/com/style24/batch/biz/task/TsbDeliveryTask.java
  30. 39 0
      style24.batch/src/main/java/com/style24/persistence/domain/Delivery.java
  31. 58 0
      style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbDelivery.xml
  32. 40 0
      style24.batch/src/main/java/com/style24/persistence/mybatis/wms/TsbWmsDelivery.xml
  33. 5 0
      style24.batch/src/main/resources/config/application-locd.yml

+ 117 - 0
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaDeliveryDao.java

@@ -0,0 +1,117 @@
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Delivery;
+
+
+/**
+ * 배송관리 Dao
+ *
+ * @author moon
+ * @since 2020. 11. 05
+ */
+@ShopDs
+public interface TsaDeliveryDao {
+
+	/**
+	 * 배송 목록
+	 *
+	 * @param delivery - 배송정보
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	Collection<Delivery> getDeliveryList(Delivery delivery);
+
+	/**
+	 * 주문 상세
+	 *
+	 * @param ordDtlNo - 주문상세번호
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	Collection<Delivery> getOrderDetail(long ordDtlNo);	
+	
+	/**
+	 * 주문상세 상태 값 변경
+	 *
+	 * @param delivery 
+	 * @return int
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	int updateOrderDetailStat(Delivery delivery);
+	
+	/**
+	 * 주문 상세 이력 등록
+	 *
+	 * @param delivery
+	 * @return void
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	void createOrderDetailHst(Delivery delivery);	
+	
+	/**
+	 * 출고금지상품 목록
+	 *
+	 * @param delivery
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	Collection<Delivery> getBangoodsList(Delivery delivery);	
+	
+	/**
+	 * 출고금지상품 삭제
+	 *
+	 * @param delivery
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	void deleteBangoods(Delivery delivery);	
+	
+	/**
+	 * 출고금지상품 등록 대상목록
+	 *
+	 * @param delivery
+	 * @return Collection<TsaDelivery>
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	Collection<Delivery> getBangoodsRegistList(Delivery delivery);
+
+	/**
+	 * 출고금지상품 카운트
+	 *
+	 * @param delivery
+	 * @return int
+	 * @author moon
+	 * @since 2020. 11. 06
+	 */
+	int getBangoodsListCnt(Delivery delivery);
+
+	/**
+	 * 출고금지상품 등록
+	 *
+	 * @param delivery
+	 * @author moon
+	 * @since 2020. 11. 06
+	 */
+	void createBangoods(Delivery delivery);
+	
+	/**
+	 * 배송/회수지시 목록
+	 *
+	 * @param Delivery - 배송/회수지시 정보
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2020. 11. 11
+	 */	
+	Collection<Delivery> getDeliveryWithdrawDirectiveList(Delivery delivery);
+
+		
+}

+ 71 - 0
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaPosDao.java

@@ -0,0 +1,71 @@
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.gagaframework.web.parameter.GagaMap;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Pos;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 매장POS Dao
+ * 
+ * @author moon
+ * @since 2020. 11. 13
+ */
+@ShopDs
+@Repository
+public interface TsaPosDao {
+
+	/**
+	 * 매장로그인 정보 조회
+	 * 
+	 * @param pos
+	 * @return Pos
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	Pos getStoreLoginInfo(Pos pos);
+
+	/**
+	 * 출고대기목록, 출고목록
+	 * 
+	 * @param pos - 매장
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	Collection<Pos> getPosDeliveryList(Pos pos);
+
+	/**
+	 * 정산내역
+	 * 
+	 * @param pos - 매장
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	Collection<Pos> getPosUsacList(Pos pos);
+
+	/**
+	 * Cnplus엑셀다운로드
+	 * 
+	 * @param pos - 매장
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	Collection<GagaMap> getOrderExcelList(Pos pos);
+
+	/**
+	 * 매장 r/t여부 조회   ???????
+	 * 
+	 * @param pos - 매장
+	 * @return int
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */	
+	int getShopRtCheck(Pos pos);
+
+}

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

@@ -0,0 +1,465 @@
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import org.springframework.dao.DataAccessException;
+
+//import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.Withdraw;
+import com.style24.core.support.annotation.ShopDs;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 회수관리 Dao
+ * 
+ * @author Daehyoung
+ * @since 2020. 02. 06
+ */
+@ShopDs
+@Repository
+public interface TsaWithdrawDao {
+
+	/**
+	 * 회수등록 - 조회(송장번호용)
+	 * 
+	 * @param Withdraw
+	 * @return Collection<Withdraw>
+	 * @author yujung
+	 * @since 2020. 02. 11
+	 */
+	//Collection<Withdraw> getWithdrawRegisterInvoiceList(Withdraw withdraw);
+
+	/**
+	 * 회수등록 - 조회(상품코드용)
+	 * 
+	 * @param Withdraw
+	 * @return Collection<Withdraw>
+	 * @author yujung
+	 * @since 2020. 02. 12
+	 */
+	//Collection<Withdraw> getWithdrawRegisterGoodsList(Withdraw withdraw);
+
+	/**
+	 * 회수등록 - 회수 마스터 등록처리
+	 * 
+	 * @param Withdraw
+	 * @author yujung
+	 * @since 2020. 02. 12
+	 */
+	//void saveWithdrawInfo(Withdraw withdraw);
+
+	/**
+	 * 회수등록 - 회수 상세 등록처리
+	 * 
+	 * @param Withdraw
+	 * @author yujung
+	 * @since 2020. 02. 12
+	 */
+	//void createWithdrawDetailInfo(Withdraw withdraw);
+
+	/**
+	 * 주문변경 마스터 회수종료일 저장
+	 * 
+	 * @param Withdraw
+	 * @author yujung
+	 * @since 2020. 02. 12
+	 */
+	//void updateOrderChangeInfo(Withdraw withdraw);
+
+	/**
+	 * 회수송장번호 수정
+	 * 
+	 * @param withdraw
+	 * @author yujung
+	 * @since 2020. 02. 27
+	 */
+	//void updateRegisterWdInvoiceNo(Withdraw withdraw);
+
+	/**
+	 * 회수송장번호 조회
+	 * 
+	 * @param withdraw
+	 * @author yujung
+	 * @since 2020. 05. 31
+	 */
+	//Collection<Withdraw> getWdInvoiceNo(Withdraw withdraw);
+
+	/**
+	 * 환불관리 목록
+	 * 
+	 * @param withdraw
+	 * @return Collection<Withdraw>
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	Collection<Withdraw> getRefundList(Withdraw withdraw);
+	//Collection<Withdraw> getWithdrawRegisterList(Withdraw withdraw);
+	/**
+	 * 회수관리 회수데이터 삭제처리
+	 * 
+	 * @param withdraw
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	void deleteWithdraw(Withdraw withdraw);
+
+	/**
+	 * 회수관리 회수 상세 데이터 삭제처리
+	 * 
+	 * @param withdraw
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	void deleteWithdrawDetail(Withdraw withdraw);
+
+	/**
+	 * 환불등록 팝업 목록
+	 * 
+	 * @param withdraw
+	 * @return Collection<Withdraw>
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	Collection<Withdraw> getRefundRegisterPopupList(Withdraw withdraw);
+	//Collection<Withdraw> getWithdrawRegisterPopupList(Withdraw withdraw);
+	/**
+	 * 회수관리 아웃바운드 수정
+	 * 
+	 * @param withdraw
+	 * @author yujung
+	 * @since 2020. 03. 25
+	 */
+	//void updateWithdrawOutbound(Withdraw withdraw);
+
+	/**
+	 * 주문변경 수정
+	 * 
+	 * @param withdraw
+	 * @author yujung
+	 * @since 2020. 03. 25
+	 */
+	//void updateWithdrawOrderChange(Withdraw withdraw);
+
+	/**
+	 * 회수상세 상품정보 수정
+	 * 
+	 * @param withdraw
+	 * @author yujung
+	 * @since 2020. 03. 25
+	 */
+	//void updateWithdrawDetailGoodsInfo(Withdraw withdraw);
+
+	/**
+	 * 회수상세 정보 수정
+	 * 
+	 * @param withdraw
+	 * @author yujung
+	 * @since 2020. 03. 25
+	 */
+	//void updateWithdrawDetailInfo(Withdraw withdraw);
+
+	/**
+	 * 환불관리 - 상세 정보 조회
+	 * 
+	 * @param withdraw - 주문변경번호
+	 * @return Collection<Withdraw>
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	Collection<Withdraw> getRefundDetailList(Withdraw withdraw);
+
+	/**
+	 * 회수배송비 등록
+	 * 
+	 * @param withdraw - 회수배송비 정보
+	 * @author yujung
+	 * @since 2020. 02. 20
+	 */
+	//void createWithdrawDeliveryFeeInfo(Withdraw withdraw);
+
+	/**
+	 * 쿠폰정보 조회
+	 * 
+	 * @param withdraw - 쿠폰정보
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	Withdraw getCouponInfo(Withdraw withdraw);
+
+	/**
+	 * 남은주문 리스트
+	 * 
+	 * @param withdraw - 주문번호, 주문변경번호
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	Collection<Withdraw> getWithdrawRemainOrderDetailList(Withdraw withdraw);
+
+	/**
+	 * 회원포인트 이력 등록
+	 * 
+	 * @param withdraw - 회원 포인트 정보
+	 * @author yujung
+	 * @since 2020. 02. 24
+	 */
+	//void createWithdrawCustPointHst(Withdraw withdraw);
+
+	/**
+	 * 회원포인트 조회
+	 * 
+	 * @param custNo
+	 * @author yujung
+	 * @since 2020. 02. 24
+	 */
+	//Withdraw getCustPointInfo(int custNo);
+
+	/**
+	 * 회원포인트 수정
+	 * 
+	 * @param withdraw - 포인트정보
+	 * @author yujung
+	 * @since 2020. 02. 24
+	 */
+	//void updateWithdrawCustPoint(Withdraw withdraw);
+
+	/**
+	 * 주문상세정보 수정
+	 * 
+	 * @param withdraw - 주문상세 정보
+	 * @author yujung
+	 * @since 2020. 02. 20
+	 */
+	//void updateWithdrawOrderDetailInfo(Withdraw withdraw);
+
+	/**
+	 * 주문상세이력 등록
+	 * 
+	 * @param withdraw - 주문상세번호
+	 * @author yujung
+	 * @since 2020. 02. 20
+	 */
+	//void createWithdrawOrderDetailHstInfo(Withdraw withdraw);
+
+	/**
+	 * 주문상세이력 등록2
+	 * 
+	 * @param withdraw - 주문상세번호
+	 * @author yujung
+	 * @since 2020. 02. 20
+	 */
+	//void createWithdrawOrderDetailHstInfo2(Withdraw withdraw);
+
+	/**
+	 * 주문변경상세 수정
+	 * 
+	 * @param withdraw - 주문상세번호
+	 * @author yujung
+	 * @since 2020. 02. 20
+	 */
+	//void updateWithdrawOrderChangeDetailInfo(Withdraw withdraw);
+
+	/**
+	 * 정산 등록
+	 * 
+	 * @param withdraw - 정산 정보
+	 * @author yujung
+	 * @since 2020. 02. 21
+	 */
+	//void createWithdrawUsac(Withdraw withdraw);
+
+	/**
+	 * 판매분재고 등록
+	 * 
+	 * @param withdraw - 판매분재고 정보
+	 * @author yujung
+	 * @since 2020. 02. 21
+	 */
+	//void createWithdrawSellQty(Withdraw withdraw);
+
+	/**
+	 * 환불정보 계산
+	 * 
+	 * @param ordNo
+	 * @return Withdraw
+	 * @author yujung
+	 * @since 2020. 02. 21
+	 */
+	//Withdraw getRefundInfo(Long ordNo);
+
+	/**
+	 * 주문마스터 수정
+	 * 
+	 * @param withdraw - 주문상태
+	 * @author yujung
+	 * @since 2020. 02. 24
+	 */
+	//void updateWithdrawOrderInfo(Withdraw withdraw);
+
+	/**
+	 * 환불정보 등록
+	 * 
+	 * @param withdraw - 환불정보
+	 * @author yujung
+	 * @since 2020. 02. 21
+	 */
+	//void createWithdrawRefund(Withdraw withdraw);
+
+	/**
+	 * 결제정보 조회
+	 * 
+	 * @param ordNo - 결제정보
+	 * @return Withdraw
+	 * @author yujung
+	 * @since 2020. 02. 24
+	 */
+	//Withdraw getPaymentInfo(Long ordNo);
+
+	/**
+	 * 기존결제 정보 수정
+	 * 
+	 * @param withdraw - 결제정보
+	 * @author yujung
+	 * @since 2020. 02. 25
+	 */
+	//void updateWithdrawPayment(Withdraw withdraw);
+
+	/**
+	 * 결제정보 등록
+	 * 
+	 * @param withdraw - 결제정보
+	 * @author yujung
+	 * @since 2020. 02. 21
+	 */
+	//void createWithdrawPayment(Withdraw withdraw);
+
+	/**
+	 * 남은 상품 정보
+	 * 
+	 * @param withdraw
+	 * @return Withdraw
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	Withdraw getRemainGoodsInfo(Withdraw withdraw);
+
+	/**
+	 * 남은 회수 수량
+	 * 
+	 * @param ordChgSq
+	 * @return 남은회수수량
+	 * @author yujung
+	 * @since 2020. 02. 20
+	 */
+	//int getRemainWithdrawCount(Long ordChgSq);
+
+	/**
+	 * 취소가 아닌 수량
+	 * 
+	 * @param
+	 * @throws DataAccessException
+	 * @author swkim
+	 * @since 2020. 04. 14
+	 */
+	//public int getOrderNotCancelCnt(Long ordNo);
+
+	/**
+	 * 동봉비 수정
+	 * 
+	 * @param
+	 * @throws DataAccessException
+	 * @author swkim
+	 * @since 2020. 04. 14
+	 */
+	//public void updateWithdrawEncloseFee(Withdraw withdraw);
+
+	/**
+	 * 반품 매출반영 차수
+	 * 
+	 * @param delvLocCd
+	 * @return 반품 매출반영 차수
+	 * @author yujung
+	 * @since 2020. 02. 20
+	 */
+	//int getIfOnlineSalesMaxOutSeq(String delvLocCd);
+
+	/**
+	 * 반품 매출반영
+	 * 
+	 * @param
+	 * @throws DataAccessException
+	 * @author swkim
+	 * @since 2020. 05. 11
+	 */
+	//public void createReturnIfOnlineSales(Withdraw withdraw);
+
+	/**
+	 * 주문번호에 대한 합계 금액
+	 * 
+	 * @param withdraw
+	 * @return Withdraw
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	Withdraw getOrderDetailSumAmt(String ordNo);
+
+	/**
+	 * 환불완료 목록
+	 * 
+	 * @param 검색조건
+	 * @return Collection<Withdraw>
+	 * @author yujung
+	 * @since 2020. 05. 29
+	 */
+	//Collection<Withdraw> getRefundCompleteList(Withdraw withdraw);
+
+	/**
+	 * 반품신청, 회수수량 비교 데이터
+	 * 
+	 * @param 검색조건
+	 * @return Withdraw
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	Withdraw getSumChgQtyWdQty(Withdraw withdraw);
+
+	/**
+	 * ERP 환입매출 반영
+	 * 
+	 * @param 검색조건
+	 * @return Withdraw
+	 * @author cjs
+	 * @since 2020. 08. 04
+	 */
+	//void createIfEcpTbSalesReturn(Withdraw withdraw);
+
+	/**
+	 * 교환출고처 지정대기를 출고처예정상태로 변경
+	 * 
+	 * @param 검색조건
+	 * @return Withdraw
+	 * @author cjs
+	 * @since 2020. 08. 04
+	 */
+	//void updateExchangeLocAssignStatus(Withdraw withdraw);
+
+	/**
+	 * 아이템 단위 상세정보
+	 * 
+	 * @param 검색조건
+	 * @return Withdraw
+	 * @author cjs
+	 * @since 2020. 08. 04
+	 */
+	//Collection<Withdraw> getWithdrawDetailList2(Withdraw withdraw);
+
+	/**
+	 * 교환배송비 등록
+	 * 
+	 * @param TsaOrder
+	 * @return
+	 * @author cjs
+	 * @since 2020. 08. 23
+	 */
+	//void mergeDeliveryFee(TsaOrder setParams);
+
+}

+ 186 - 0
style24.admin/src/main/java/com/style24/admin/biz/service/TsaDeliveryService.java

@@ -0,0 +1,186 @@
+package com.style24.admin.biz.service;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.stereotype.Service;
+import org.apache.commons.lang3.StringUtils;
+
+import com.style24.admin.biz.dao.TsaDeliveryDao;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.admin.support.util.TsitUtil;
+
+import com.style24.persistence.domain.Delivery;
+import com.style24.admin.support.env.TsaConstants.OrderDetailStat;
+import com.style24.admin.support.env.TsaConstants;
+import com.style24.core.support.message.TscMessageByLocale;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 배송관리 Service
+ *
+ * @author moon
+ * @since 2020. 11. 05
+ */
+@Service
+@Slf4j
+public class TsaDeliveryService {
+
+	@Autowired
+	private TscMessageByLocale message;
+	
+	@Autowired
+	private TsaDeliveryDao deliveryDao;
+
+	/**
+	 * 배송 목록
+	 *
+	 * @param -Delivery
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	public Collection<Delivery> getDeliveryList(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("C")) {
+			delivery.setMallGb(TsaConstants.MallGb.EXTMALL.value());
+			delivery.setVendorId(TsaSession.getInfo().getVendorId());
+		}
+		
+		return deliveryDao.getDeliveryList(delivery);
+	}
+	
+	/**
+	 * 주문상세
+	 *
+	 * @param  ordDtlNo
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	public Collection<Delivery> getOrderDetail(long ordDtlNo) {
+		return deliveryDao.getOrderDetail(ordDtlNo);
+	}	
+	
+	/**
+	 * 수기송장등록/수정
+	 *
+	 * @param -Delivery
+	 * @return void
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	@Transactional("shopTxnManager")
+	public void saveOrderDetail(Collection<Delivery> deliveryList) {
+	
+		int userId = TsaSession.getInfo().getUserNo();
+
+		for (Delivery oneDelivery : deliveryList) {
+			oneDelivery.setUpdNo(userId);
+			oneDelivery.setRegNo(userId);
+			// 배송 준비중, 배송중이면 해당 상태값으로 업데이트
+			if (OrderDetailStat.DELIVERY_PREPARE.equals(oneDelivery.getOrgOrdDtlStat()) || OrderDetailStat.SHIPPING.equals(oneDelivery.getOrgOrdDtlStat())) {
+				oneDelivery.setOrdDtlStat(oneDelivery.getOrgOrdDtlStat());
+			} else {
+				oneDelivery.setOrdDtlStat(OrderDetailStat.DELIVERY_PREPARE.value());
+			}
+			oneDelivery.setHstMemo("수기송장 수정");
+			// 주문상세수정
+			deliveryDao.updateOrderDetailStat(oneDelivery);
+			// 주문상세이력
+			deliveryDao.createOrderDetailHst(oneDelivery);
+		}
+
+	}	
+	
+	/**
+	 * 출고금지상품 목록
+	 *
+	 * @param  Delivery
+	 * @return Delivery List
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	public Collection<Delivery> getBangoodsList(Delivery delivery) {
+		return deliveryDao.getBangoodsList(delivery);
+	}	
+	
+	/**
+	 * 출고금지상품 삭제
+	 *
+	 * @param -TsaDelivery
+	 * @return void
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteBangoods(Collection<Delivery> bangoodsList) {
+		int userId = TsaSession.getInfo().getUserNo();
+
+		for (Delivery oneBangood : bangoodsList) {
+			oneBangood.setUpdNo(userId);
+			deliveryDao.deleteBangoods(oneBangood);
+		}
+	}
+	
+	/**
+	 * 출고금지상품 등록 대상목록
+	 *
+	 * @param  Delivery
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	public Collection<Delivery> getBangoodsRegistList(Delivery delivery) {
+		return deliveryDao.getBangoodsRegistList(delivery);
+	}
+	
+	/**
+	 * 출고금지상품 등록
+	 *
+	 * @param -TsaDelivery
+	 * @return void
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	@Transactional("shopTxnManager")
+	public void createBangoods(Collection<Delivery> bangoodsList) {
+		int userId = TsaSession.getInfo().getUserNo();
+
+		for (Delivery oneBangood : bangoodsList) {
+
+			int cnt = deliveryDao.getBangoodsListCnt(oneBangood);
+			if (cnt > 0) {
+				throw new IllegalStateException(message.getMessage("DELIVERY_0001"));
+			}
+
+			oneBangood.setRegNo(userId);
+			oneBangood.setUpdNo(userId);
+			deliveryDao.createBangoods(oneBangood);
+		}
+	}
+	
+	/**
+	 * 배송/회수지시 목록
+	 *
+	 * @param -Delivery
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2020. 11. 11
+	 */	
+	public Collection<Delivery> getDeliveryWithdrawDirectiveList(Delivery delivery) {
+		return deliveryDao.getDeliveryWithdrawDirectiveList(delivery);
+	}
+	
+}

+ 120 - 0
style24.admin/src/main/java/com/style24/admin/biz/service/TsaPosService.java

@@ -0,0 +1,120 @@
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.excel.GagaExcelUtil;
+import com.gagaframework.excel.env.GagaExcelConstants;
+import com.gagaframework.web.parameter.GagaMap;
+
+import com.style24.admin.biz.dao.TsaPosDao;
+import com.style24.persistence.domain.Pos;
+
+/**
+ * 매장POS Service
+ * 
+ * @author moon
+ * @since 2020. 11. 13
+ */
+@Service
+@Slf4j
+public class TsaPosService {
+
+	@Autowired
+	private TsaPosDao posDao;
+
+	/**
+	 * 매장로그인 정보 조회
+	 * 
+	 * @param pos - 매장정보
+	 * @return Pos
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	public Pos getStoreLoginInfo(Pos pos) {
+		return posDao.getStoreLoginInfo(pos);
+	}
+
+	/**
+	 * 출고대기/출고목록
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	public Collection<Pos> getPosDeliveryList(Pos pos) {
+		return posDao.getPosDeliveryList(pos);
+	}
+
+	/**
+	 * 정산내역
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	public Collection<Pos> getPosUsacList(Pos pos) {
+		return posDao.getPosUsacList(pos);
+	}
+
+	/**
+	 * CNPlus 엑셀다운로드
+	 * 
+	 * @param pos - 매장정보
+	 * @return Pos
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	public void getOrderExcelList(Pos pos, String excelFilenameWithPath) {
+
+		// 헤더 title 설정
+
+		String[] listTitles = {"예약구분", "집하예정일", "받는분성명"  //3
+			, "받는분전화번호", "받는분기타연락처", "받는분우편번호" //3
+			, "받는분주소(전체, 분할)", "운송장번호", "고객주문번호" //3
+			, "품목명", "박스수량", "박스타입", "기본운임"  //4
+			, "배송메세지1", "배송메세지2", "품목명"};  //3
+
+		// DB 처리 시 사용되는 파라미터명(셀명) 설정
+		String[] cellNames = {"RSRVT_GB", "SCHDL_CLDT", "RECIP_NM"  //3
+			, "RECIP_PHNNO", "RECIP_TELNO", "RECIP_POST_NO" //3
+			, "RECIP_ADDR", "INVOICE_NO", "ORD_NO"  //3
+			, "GOODS_NM", "BOX_QTY", "BOX_TYPE", "FEE" //4
+			, "DELV_MEMO", "DELV_MEMO2", "GOODS_CD"}; //3
+
+		String[] cellTypes = {GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name()
+		};
+		Collection<GagaMap> dataList = posDao.getOrderExcelList(pos); // map형식으로 조회
+		try {
+			GagaExcelUtil.createExcel(excelFilenameWithPath, dataList, cellNames, cellTypes);
+
+		} catch (Exception e) {
+			throw new IllegalStateException(e);
+		}
+	}
+	
+	public GagaMap getChkShopRt(Pos tsaPos) {
+		GagaMap result = new GagaMap();
+		int cnt = posDao.getShopRtCheck(tsaPos);
+		if(cnt > 0) {
+			result.set("chk", "Y");
+		} else {
+			result.set("chk", "N");
+		}
+		return result;
+	}
+
+}

+ 1541 - 0
style24.admin/src/main/java/com/style24/admin/biz/service/TsaWithdrawService.java

@@ -0,0 +1,1541 @@
+package com.style24.admin.biz.service;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.util.GagaDateUtil;
+
+import com.style24.admin.biz.dao.TsaDeliveryDao;
+//import com.style24.admin.biz.dao.TsaOrderDao;
+import com.style24.admin.biz.dao.TsaWithdrawDao;
+//import com.style24.admin.biz.dao.TsaWmsWithdrawDao;
+
+
+
+//import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.Delivery;
+//import com.style24.persistence.domain.Order;
+//import com.style24.persistence.domain.PayGate;
+//import com.style24.persistence.domain.Point;
+import com.style24.persistence.domain.Withdraw;
+
+
+
+import com.style24.admin.support.env.TsaConstants;
+import com.style24.admin.support.env.TsaConstants.OrderDetailStat;
+//import com.style24.admin.support.env.TsaConstants.OrderStat;
+//import com.style24.admin.support.env.TsaConstants.PayMeans;
+//import com.style24.admin.support.env.TsaConstants.PaymentStat;
+//import com.style24.admin.support.env.TsaConstants.PurchaseReturnGb;
+//import com.style24.admin.support.env.TsaConstants.UsacGb;
+
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.admin.support.security.session.TsaSession;
+
+/**
+ * 회수관리 Service
+ *
+ * @author moon
+ * @since 2020. 11. 16
+ */
+@Service
+@Slf4j
+public class TsaWithdrawService {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TsaWithdrawDao withdrawDao;
+
+	@Autowired
+	private TsaDeliveryDao deliveryDao;
+
+	//@Autowired
+	//private TsaOrderDao orderDao;
+
+	//@Autowired
+	//private TsaOrderService orderService;
+
+	//@Autowired
+	//private TsaWmsWithdrawDao wmsWithdrawDao;
+
+	@Autowired
+	private TsaKakaoService kakaoService;
+
+	/**
+	 * 회수등록 - 조회(송장번호용)
+	 *
+	 * @param withdraw
+	 * @return Collection<Withdraw>
+	 * @author rladbwnd5
+	 * @since 2020. 02. 11
+	 */
+//	public Collection<Withdraw> getWithdrawRegisterInvoiceList(Withdraw withdraw) {
+//		Collection<Withdraw> dataList = withdrawDao.getWithdrawRegisterInvoiceList(withdraw);
+//		return dataList;
+//	}
+
+	/**
+	 * 회수등록 - 조회(상품코드용)
+	 *
+	 * @param withdraw
+	 * @return Withdraw List
+	 * @author rladbwnd5
+	 * @since 2020. 02. 12
+	 */
+//	public Collection<Withdraw> getWithdrawRegisterGoodsList(Withdraw withdraw) {
+//		return withdrawDao.getWithdrawRegisterGoodsList(withdraw);
+//	}
+
+	/**
+	 * 회수등록 - 등록처리
+	 *
+	 * @param withdrawList
+	 * @return Withdraw List
+	 * @author rladbwnd5
+	 * @since 2020. 02. 12
+	 */
+//	@Transactional("shopTxnManager")
+//	public void createWithdrawInfo(Collection<Withdraw> withdrawList) {
+//		String uesrId = TsaSession.getInfo().getUserId();
+//
+//		// 회수 마스터 등록 정보
+//		Withdraw withdrawInfo = withdrawList.iterator().next();
+//
+//		// 주문변경번호
+//		Long ordChgSq = withdrawInfo.getOrdChgSq();
+//
+//		// 기존 회수 수량
+//		int wdQty = withdrawInfo.getSumWdQty();
+//
+//		// 1. 회수 상세 등록 (동일 여부 판단 위해 상세 먼저 등록)
+//		for (Withdraw withdrawDetailInfo : withdrawList) {
+//			if (ordChgSq > 0) {
+//				wdQty += withdrawDetailInfo.getWdQty(); // 기존 회수 수량 + 회수 수량
+//
+//				// 회수 완료 확인
+//				if (withdrawInfo.getSumChgQty() == wdQty) {
+//					withdrawInfo.setSameYn("Y");
+//				}
+//			} else {
+//				withdrawInfo.setSameYn("N");
+//			}
+//
+//			withdrawDetailInfo.setRegId(uesrId);
+//			withdrawDetailInfo.setUpdId(uesrId);
+//			withdrawDao.createWithdrawDetailInfo(withdrawDetailInfo);
+//		}
+//
+//		// 2. 회수 마스터 등록 처리
+//		withdrawInfo.setRegId(uesrId);
+//		withdrawInfo.setUpdId(uesrId);
+//		withdrawDao.saveWithdrawInfo(withdrawInfo);
+//	}
+
+	/**
+	 * 회수송장번호 변경
+	 *
+	 * @param
+	 * @return
+	 * @author rladbwnd5
+	 * @since 2020. 02. 27
+	 */
+//	@Transactional("shopTxnManager")
+//	public void updateRegisterWdInvoiceNo(Withdraw withdraw) {
+//		withdraw.setUpdId(TsaSession.getInfo().getUserId());
+//		withdrawDao.updateRegisterWdInvoiceNo(withdraw);
+//	}
+
+	/**
+	 * 회수송장번호 조회
+	 *
+	 * @param
+	 * @return
+	 * @author yujung
+	 * @since 2020. 05. 31
+	 */
+//	public Collection<Withdraw> getWdInvoiceNo(Withdraw withdraw) {
+//		return withdrawDao.getWdInvoiceNo(withdraw);
+//	}
+
+	/**
+	 * 환불관리 목록
+	 *
+	 * @param withdraw
+	 * @return Collection<Withdraw>
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	public Collection<Withdraw> getRefundList(Withdraw withdraw) {
+		return withdrawDao.getRefundList(withdraw);
+	}
+
+	/**
+	 * 환불관리 회수데이터 삭제처리
+	 *
+	 * @param
+	 * @return
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteWithdrawInfo(Withdraw withdraw) {
+		Withdraw search = new Withdraw();
+		search.setWdInvoiceNo(withdraw.getWdInvoiceNo());
+		Collection<Withdraw> withdrawList = withdrawDao.getRefundList(search);
+		// 마지막 회수 리스트 일 때 마스터 정보 삭제
+		if (withdrawList.size() == 1) {
+			withdrawDao.deleteWithdraw(withdraw);
+		}
+
+		withdrawDao.deleteWithdrawDetail(withdraw);
+	}
+
+	/**
+	 * 회수마스터 삭제처리
+	 *
+	 * @param
+	 * @return
+	 * @author yujung
+	 * @since 2020. 06. 01
+	 */
+//	@Transactional("shopTxnManager")
+//	public void deleteWithdraw(Withdraw withdraw) {
+//		withdrawDao.deleteWithdraw(withdraw);
+//	}
+
+	/**
+	 * 회수상세 삭제처리
+	 *
+	 * @param
+	 * @return
+	 * @author yujung
+	 * @since 2020. 06. 01
+	 */
+//	@Transactional("shopTxnManager")
+//	public void deleteWithdrawDetail(Withdraw withdraw) {
+//		withdrawDao.deleteWithdrawDetail(withdraw);
+//	}
+
+	/**
+	 * 회수등록 팝업 목록
+	 *
+	 * @param
+	 * @return
+	 * @author rladbwnd5
+	 * @since 2020. 03. 03
+	 */
+//	public Collection<Withdraw> getWithdrawRegisterPopupList(Withdraw withdraw) {
+//		return withdrawDao.getWithdrawRegisterPopupList(withdraw);
+//	}
+
+	/**
+	 * 회수등록팝업 주문매핑(송장번호 수정)
+	 *
+	 * @param
+	 * @return
+	 * @author yujung
+	 * @since 2020. 03. 25
+	 */
+//	@Transactional("shopTxnManager")
+//	public void updateOrderChangeWdInvoiceNo(Withdraw withdraw) {
+//		String userId = TsaSession.getInfo().getUserId();
+//
+//		// 주문변경 회수송장번호 변경
+//		Withdraw orderChangeParam = new Withdraw();
+//		orderChangeParam.setOrdChgSq(withdraw.getOrdChgSq());
+//		orderChangeParam.setWdInvoiceNo(withdraw.getWdInvoiceNo());
+//		orderChangeParam.setUpdId(userId);
+//		withdrawDao.updateRegisterWdInvoiceNo(orderChangeParam);
+//
+//		// 회수상세 변경
+//		Withdraw withdrawDetailInfo = new Withdraw();
+//		withdrawDetailInfo.setWdInvoiceNo(withdraw.getWdInvoiceNo());
+//		withdrawDetailInfo.setGoodsCd(withdraw.getGoodsCd());
+//		withdrawDetailInfo.setSizeCd(withdraw.getSizeCd());
+//		withdrawDetailInfo.setOrdDtlNo(withdraw.getOrdDtlNo());
+//		withdrawDetailInfo.setUpdId(userId);
+//		withdrawDao.updateWithdrawDetailInfo(withdrawDetailInfo);
+//
+//		// 회수송장번호 등록
+//		Withdraw wdInvoiceInfo = new Withdraw();
+//		wdInvoiceInfo.setWdInvoiceNo(withdraw.getWdInvoiceNo());
+//		wdInvoiceInfo.setOrdChgSq(withdraw.getOrdChgSq());
+//		wdInvoiceInfo.setUpdId(userId);
+//		withdrawDao.updateWithdrawOrderChange(wdInvoiceInfo);
+//	}
+
+	/**
+	 * 회수등록팝업 주문매핑(주문상세일련번호 수정)
+	 *
+	 * @param
+	 * @return
+	 * @author yujung
+	 * @since 2020. 03. 25
+	 */
+//	@Transactional("shopTxnManager")
+//	public void updateWithdrawOrdDtlNo(Withdraw withdraw) {
+//		// 아웃바운드 정보 업데이트
+//		Withdraw outboundInfo = new Withdraw();
+//		outboundInfo.setWdInvoiceNo(withdraw.getWdInvoiceNo());
+//		outboundInfo.setCsObYn("Y");
+//		outboundInfo.setCsObId(TsaSession.getInfo().getUserId());
+//		withdrawDao.updateWithdrawOutbound(outboundInfo);
+//
+//		// 회수상세 변경
+//		Withdraw withdrawDetailInfo = new Withdraw();
+//		withdrawDetailInfo.setWdInvoiceNo(withdraw.getWdInvoiceNo());
+//		withdrawDetailInfo.setGoodsCd(withdraw.getGoodsCd());
+//		withdrawDetailInfo.setSizeCd(withdraw.getSizeCd());
+//		withdrawDetailInfo.setOrdDtlNo(withdraw.getOrdDtlNo());
+//		withdrawDetailInfo.setUpdId(TsaSession.getInfo().getUserId());
+//		withdrawDao.updateWithdrawDetailInfo(withdrawDetailInfo);
+//
+//		// 회수관리 주문상세번호 및 상품 정보 변경
+//		Withdraw withdrawInfo = new Withdraw();
+//		withdrawInfo.setOrgOrdDtlNo(withdraw.getOrgOrdDtlNo()); // 원주문상세번호
+//		withdrawInfo.setGoodsCd(withdraw.getGoodsCd());
+//		withdrawInfo.setSizeCd(withdraw.getSizeCd());
+//		withdrawInfo.setOrdDtlNo(withdraw.getOrdDtlNo()); // 변경 될 주문번호
+//		withdrawInfo.setWdInvoiceNo(withdraw.getWdInvoiceNo());
+//		withdrawInfo.setUpdId(TsaSession.getInfo().getUserId());
+//		withdrawDao.updateWithdrawDetailGoodsInfo(withdrawInfo);
+//
+//		// withdrawDao.updateWithdrawOrdDtlNo(withdraw);
+//		// return super.ok(message.getMessage("SUCC_0002"));
+//	}
+
+	/**
+	 * 환불관리 상세정보
+	 *
+	 * @param withdraw - 변경주문번호
+	 * @return
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	public Collection<Withdraw> getRefundDetailList(Withdraw withdraw) {
+		return withdrawDao.getRefundDetailList(withdraw);
+	}
+
+	/**
+	 * 환불관리 남은상품정보
+	 *
+	 * @param withdraw - 변경주문번호, 주문번호
+	 * @return
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	public Withdraw getRemainGoodsInfo(Withdraw withdraw) {
+		return withdrawDao.getRemainGoodsInfo(withdraw);
+	}
+
+	/**
+	 * 환불관리 남은상품리스트
+	 *
+	 * @param withdraw - 변경주문번호, 주문번호
+	 * @return
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	public Collection<Withdraw> getWithdrawRemainOrderDetailList(Withdraw withdraw) {
+		return withdrawDao.getWithdrawRemainOrderDetailList(withdraw);
+	}
+
+	/**
+	 * 회수관리 쿠폰정보
+	 *
+	 * @param withdraw - 변경주문번호, 주문번호
+	 * @return
+	 * @author moon
+	 * @since 2020. 11. 15
+	 */
+	public Withdraw getCouponInfo(Withdraw withdraw) {
+		return withdrawDao.getCouponInfo(withdraw);
+	}
+
+
+	/**
+	 * 회수관리 - 회수처리
+	 *
+	 * @param params
+	 * @return
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	@Transactional("shopTxnManager")
+	public void refundDetailConfirm(Withdraw params) {
+//		// 기본값 설정
+//		String userId = TsaSession.getInfo().getUserId();
+//		int custNo = params.getCustNo();		// 회원번호
+//		Long ordNo = params.getOrdNo();		// 주문번호
+//		Long ordDtlNo = params.getOrdDtlNo();	// 주문상세번호
+//		Long ordChgSq = params.getOrdChgSq();	// 주문변경번호
+//		int cnclRtnQty = params.getCnclRtnQty();	// 취소반품 수량
+//		int custShipAmt = params.getCustShipAmt();	// 고객부담배송비
+//		String chgGb = params.getChgGb();	// 변경요청구분
+//		String supplyCompCd = params.getSupplyCompCd();
+//		String pgStat = params.getPgStats();
+//		String mallGb = params.getMallGb();
+//		String chgReason = params.getChgReason();
+//		String orgChgReason = params.getOrgChgReason();
+//		int orgEncloseFee = params.getOrgEncloseFee();
+//		int encloseFee = params.getEncloseFee();
+//		String delvLocCd = params.getDelvLocCd();	// 반품처코드
+//
+//		if (!chgReason.equals(orgChgReason)) {
+//			Withdraw chgParams = new Withdraw();
+//			chgParams.setUpdId(userId);
+//			chgParams.setChgReason(chgReason);
+//			chgParams.setOrdChgSq(ordChgSq);
+//			withdrawDao.updateWithdrawOrderChange(chgParams);
+//		}
+//
+//		if (encloseFee != orgEncloseFee) {
+//			Withdraw withdrawParams = new Withdraw();
+//			withdrawParams.setEncloseFee(encloseFee);
+//			withdrawParams.setUpdId(userId);
+//			withdrawParams.setWdInvoiceNo(params.getWdInvoiceNo());
+//			withdrawDao.updateWithdrawEncloseFee(withdrawParams);
+//		}
+//
+//		Withdraw ordChgDtlParams = new Withdraw();
+//		ordChgDtlParams.setOrdChgSq(ordChgSq);
+//		ordChgDtlParams.setOrdDtlNo(ordDtlNo);
+//		if (TsaConstants.OrderChangeGb.EXCHANGE.value().equals(params.getChgGb())) {	// 교환인 경우
+//			ordChgDtlParams.setChgStat(TsaConstants.OrderChangeStat.EXCHANGE_COMPLETE.value());
+//		} else {
+//			ordChgDtlParams.setChgStat(TsaConstants.OrderChangeStat.RETURN_COMPLETE.value());
+//		}
+//		ordChgDtlParams.setUpdId(userId);
+//		withdrawDao.updateWithdrawOrderChangeDetailInfo(ordChgDtlParams);
+//
+//		int remainCount = withdrawDao.getRemainWithdrawCount(ordChgSq);	// 회수컨펌 남은 개수
+//
+//		if (remainCount == 0) {
+//			// 주문 변경 회수 종료 일시 업데이트
+//			Withdraw orderChangeInfo = new Withdraw();
+//			orderChangeInfo.setOrdChgSq(ordChgSq);
+//			orderChangeInfo.setUpdId(userId);
+//			withdrawDao.updateOrderChangeInfo(orderChangeInfo);
+//
+//			int orgDelvFee = 0;	// 원주문배송비
+//			int refundAmt = 0;	// 환불금액
+//			int refundPntAmt = 0;
+//			int refundPrePntAmt = 0;
+//			int refundGoodsCpnAmt = 0;
+//			int refundCartCpnAmt = 0;
+//			int refundCancelCartCpnAmt = 0;
+//			int refundPlusCpnAmt = 0;
+//			int refundSavePntAmt = 0;
+//			Long usedCartCpnSq = null;
+//
+//			Collection<TsaPoint> pointList = new ArrayList<TsaPoint>();
+//			Collection<TsaPoint> prePointList = new ArrayList<TsaPoint>();
+//			Collection<TsaPoint> savePointList = new ArrayList<TsaPoint>();
+//
+//			// ORD_CHG_SQ 별 ITEM_CD 단위의 리스트
+//			Collection<Withdraw> withdrawList = withdrawDao.getWithdrawDetailList(params);
+//
+//			// 쿠폰정보
+//			String couponCartCpnSq = withdrawList.iterator().next().getCartCpnSq();
+//			Withdraw couponInfo = null;
+//			if (StringUtils.isNotBlank(couponCartCpnSq)) {
+//				Withdraw searchCoupon = new Withdraw();
+//				searchCoupon.setCartCpnSq(couponCartCpnSq);
+//				searchCoupon.setCustNo(custNo);
+//				couponInfo = withdrawDao.getCouponInfo(searchCoupon);
+//			}
+//
+//			List<Withdraw> ifOnilneSales = new ArrayList();
+//			GagaMap setOrdDtlNos = new GagaMap();
+//			int cancelRequestAmt = 0;                            // 취소요청금액 cancelRequestAmt
+//
+//			for (Withdraw withdraw : withdrawList) {
+//				// 세트상품인 경우 회수컨펌 처리건이 있으면 스킵
+//				if ("S".equals(withdraw.getGoodsType()) && setOrdDtlNos.getInt(withdraw.getOrdDtlNo()) > 1) {
+//					continue;
+//				}
+//				orgDelvFee = withdraw.getOrgDelvFee();
+//				String goodsCpnSq = withdraw.getGoodsCpnSq();
+//				String cartCpnSq = withdraw.getCartCpnSq();
+//				int cnclReturnRealOrdAmt = 0;
+//				int orgOrdAmt = withdraw.getOrdAmt();
+//				int orgCurrPrice = withdraw.getCurrPrice();
+//				int orgRealOrdAmt = withdraw.getRealOrdAmt();
+//				int ordQty = withdraw.getOrdQty();
+//				int orgCnclRtnQty = withdraw.getCnclRtnQty();
+//				int wdQty = withdraw.getWdQty();
+//				int realOrdQty = ordQty - orgCnclRtnQty;
+//				int orgCnclRtnAmt = withdraw.getCnclRtnAmt();
+//				int orgGoodsCpnDcAmt = withdraw.getGoodsCpnDcAmt();
+//				int orgCartCpnDcAmt = withdraw.getCartCpnDcAmt();
+//				int orgPntDcAmt = withdraw.getPntDcAmt();
+//				int orgPrePntDcAmt = withdraw.getPrePntDcAmt();
+//				int orgSavePntAmt = withdraw.getSavePntAmt();
+//				String plusCpnSq = withdraw.getPlusCpnSq();
+//				int orgPlusCpnDcAmt = withdraw.getPlusCpnDcAmt();
+//
+//				/* 정산,환불 처리용 */
+//				int rfPntAmt = (int)((double)orgPntDcAmt / realOrdQty * wdQty);				// 환원 포인트
+//				int rfPrePntAmt = (int)((double)orgPrePntDcAmt / realOrdQty * wdQty);		// 취소 선포인트
+//				int rfGoodsCpnAmt = (int)((double)orgGoodsCpnDcAmt / realOrdQty * wdQty);	// 취소 상품쿠폰금액
+//				int rfCartCpnAmt = (int)((double)orgCartCpnDcAmt / realOrdQty * wdQty);		// 취소 장바구니쿠폰금액
+//				int rfPlusCpnAmt = (int)((double)orgPlusCpnDcAmt / realOrdQty * wdQty);		// 취소 플러스쿠폰금액
+//				int rfSavePntAmt = (int)((double)orgSavePntAmt / realOrdQty * wdQty);
+//
+//				refundPntAmt += rfPntAmt;
+//				refundPrePntAmt += rfPrePntAmt;
+//				refundGoodsCpnAmt += rfGoodsCpnAmt;
+//				refundCartCpnAmt += rfCartCpnAmt;
+//				refundPlusCpnAmt += rfPlusCpnAmt;
+//				refundSavePntAmt += rfSavePntAmt;
+//
+//				int cnclRtnAmt = 0;
+//				int erpCnclRtnAmt = 0;
+//				int goodsCpnDcAmt = orgGoodsCpnDcAmt - rfGoodsCpnAmt;
+//				int cartCpnDcAmt = orgCartCpnDcAmt - rfCartCpnAmt;
+//				int plusCpnDcAmt = orgPlusCpnDcAmt - rfPlusCpnAmt;
+//				int pntDcAmt = orgPntDcAmt - rfPntAmt;
+//				int prePntDcAmt = orgPrePntDcAmt - rfPrePntAmt;
+//				int savePntAmt = orgSavePntAmt - (orgSavePntAmt / realOrdQty * wdQty);
+//				cnclRtnQty = orgCnclRtnQty + wdQty;
+//
+//				log.info("orgRealOrdAmt = " + orgRealOrdAmt);
+//				log.info("wdQty = " + wdQty);
+//				log.info("cnclRtnAmt = " + cnclRtnAmt);
+//
+//				cnclRtnAmt += orgCnclRtnAmt + (orgCurrPrice * wdQty);
+//				erpCnclRtnAmt = (orgCurrPrice * wdQty);
+//				cnclReturnRealOrdAmt = (orgCurrPrice * wdQty) - rfPntAmt - rfPrePntAmt - rfGoodsCpnAmt - rfCartCpnAmt - rfPlusCpnAmt;
+//
+//				log.info("orgCnclRtnAmt = " + orgCnclRtnAmt);
+//				log.info("orgRealOrdAmt = " + orgRealOrdAmt);
+//				log.info("orgOrdAmt = " + orgOrdAmt);
+//				log.info("ordQty = " + ordQty);
+//				log.info("orgCnclRtnQty = " + orgCnclRtnQty);
+//				log.info("(orgOrdAmt / (ordQty - orgCnclRtnQty)) = " + (orgOrdAmt / (ordQty - orgCnclRtnQty)));
+//				log.info("refundPntAmt = " + refundPntAmt);
+//				log.info("refundPrePntAmt = " + refundPrePntAmt);
+//				log.info("refundGoodsCpnAmt = " + refundGoodsCpnAmt);
+//				log.info("refundCartCpnAmt = " + refundCartCpnAmt);
+//				log.info("refundPlusCpnAmt = " + refundPlusCpnAmt);
+//				log.info("cnclReturnRealOrdAmt = " + cnclReturnRealOrdAmt);
+//
+//				int realOrdAmt = orgRealOrdAmt - cnclReturnRealOrdAmt;
+//				refundAmt += cnclReturnRealOrdAmt;
+//
+//				log.info("realOrdAmt = " + realOrdAmt);
+//				log.info("cnclRtnQty = " + cnclRtnQty);
+//				log.info("cnclRtnAmt = " + cnclRtnAmt);
+//				log.info("goodsCpnDcAmt = " + goodsCpnDcAmt);
+//				log.info("goodsCpnSq = " + goodsCpnSq);
+//				log.info("cartCpnDcAmt = " + cartCpnDcAmt);
+//				log.info("cartCpnSq = " + cartCpnSq);
+//				log.info("pntDcAmt = " + pntDcAmt);
+//				log.info("prePntDcAmt = " + prePntDcAmt);
+//				log.info("savePntAmt = " + savePntAmt);
+//				log.info("plusCpnDcAmt = " + plusCpnDcAmt);
+//				log.info("plusCpnSq = " + plusCpnSq);
+//
+//				// 주문상세 업데이트
+//				log.info("============== 주문상세 업데이트 ==============");
+//
+//				Withdraw updParams = new Withdraw();
+//				updParams.setUpdId(userId);
+//				updParams.setOrdDtlNo(withdraw.getOrdDtlNo());
+//				if (cnclRtnQty == ordQty) {
+//					updParams.setOrdDtlStat(OrderDetailStat.PAYMENT_AFTER_CANCEL.value());
+//				}
+//				updParams.setRealOrdAmt(realOrdAmt);
+//				updParams.setCnclRtnQty(cnclRtnQty);
+//				updParams.setCnclRtnAmt(cnclRtnAmt);
+//				updParams.setGoodsCpnDcAmt(goodsCpnDcAmt);
+//				updParams.setGoodsCpnSq(goodsCpnSq);
+//				updParams.setCartCpnDcAmt(cartCpnDcAmt);
+//				updParams.setCartCpnSq(cartCpnSq);
+//				updParams.setPlusCpnDcAmt(plusCpnDcAmt);
+//				updParams.setPlusCpnSq(plusCpnSq);
+//				updParams.setPntDcAmt(pntDcAmt);
+//				updParams.setPrePntDcAmt(prePntDcAmt);
+//				updParams.setSavePntAmt(savePntAmt);
+//				updParams.setRegId(userId);
+//				withdrawDao.updateWithdrawOrderDetailInfo(updParams);
+//				withdrawDao.createWithdrawOrderDetailHstInfo(updParams);
+//
+//				// 주문상세 업데이트
+//				log.info("============== 매출반영 ==============");
+//
+//				Withdraw ifData = new Withdraw();
+//				ifData.setOrdDtlNo(withdraw.getOrdDtlNo());
+//				ifData.setOrdNo(ordNo);
+//				ifData.setWdQty(wdQty);
+//				ifData.setCnclRtnAmt(cnclRtnAmt);
+//				ifData.setGoodsCd(withdraw.getGoodsCd());
+//				ifData.setRealOrdAmt(cnclReturnRealOrdAmt);
+//				ifData.setRealOrdQty(realOrdQty);
+//				ifData.setRfGoodsCpnAmt(rfGoodsCpnAmt);
+//				ifData.setRfCartCpnAmt(rfCartCpnAmt);
+//				ifData.setRfPlusCpnAmt(rfPlusCpnAmt);
+//				ifData.setRfPntAmt(rfPntAmt);
+//				ifData.setRfPrePntAmt(rfPrePntAmt);
+//				ifData.setRfSavePntAmt(rfSavePntAmt);
+//				ifData.setGoodsType(withdraw.getGoodsType());
+//				ifData.setOrdAmt(erpCnclRtnAmt);
+//				ifData.setCartCpnSq(cartCpnSq);
+//				ifData.setGoodsCpnSq(goodsCpnSq);
+//				ifData.setPlusCpnSq(plusCpnSq);
+//				ifData.setOrderNm(withdraw.getOrderNm());
+//				ifData.setOrderPhnno(withdraw.getOrderPhnno());
+//				ifOnilneSales.add(ifData);
+//
+//				// 자사몰이면서 반품이면 포인트,쿠폰 반환
+//				if (TsaConstants.MallGb.SELFMALL.value().equals(mallGb) && TsaConstants.OrderChangeGb.RETURN.value().equals(chgGb)) {
+//
+//					if (rfPntAmt > 0) {
+//						TsaPoint point = new TsaPoint();
+//						point.setPntAmt(rfPntAmt);
+//						point.setOrdNo((int)(long)ordNo);
+//						point.setOrdDtlNo((int)(long)ordDtlNo);
+//						pointList.add(point);
+//					}
+//
+//					if (rfPrePntAmt > 0) {
+//						TsaPoint point = new TsaPoint();
+//						point.setPntAmt(rfPrePntAmt);
+//						point.setOrdNo((int)(long)ordNo);
+//						point.setOrdDtlNo((int)(long)ordDtlNo);
+//						prePointList.add(point);
+//					}
+//
+//					if (savePntAmt > 0) {
+//						TsaPoint point = new TsaPoint();
+//						point.setPntAmt(-rfSavePntAmt);
+//						point.setOrdNo((int)(long)ordNo);
+//						point.setOrdDtlNo((int)(long)ordDtlNo);
+//						savePointList.add(point);
+//					}
+//
+//					if (StringUtils.isNotBlank(withdraw.getGoodsCpnSq())) {
+//						TsaOrder goodsCpnParam = new TsaOrder();
+//						goodsCpnParam.setCustCpnSq(Long.parseLong(withdraw.getGoodsCpnSq()));
+//						goodsCpnParam.setUpdId(userId);
+//
+//						TsaCoupon goodsCpnInfo = orderDao.getCustCouponInfo(goodsCpnParam.getCustCpnSq());
+//						if (goodsCpnInfo != null) {
+//							goodsCpnInfo = orderDao.getCouponInfo(goodsCpnInfo.getCpnId());
+//
+//							if (goodsCpnInfo != null && ("10".equals(goodsCpnInfo.getReissuance()) || "30".equals(goodsCpnInfo.getReissuance()))) {
+//								orderDao.updateCustCouponCancel(goodsCpnParam);
+//							}
+//						}
+//					}
+//
+//					if (StringUtils.isNotBlank(withdraw.getPlusCpnSq())) {
+//						TsaOrder plusCpnParam = new TsaOrder();
+//						plusCpnParam.setCustCpnSq(Long.parseLong(withdraw.getPlusCpnSq()));
+//						plusCpnParam.setUpdId(userId);
+//
+//						TsaCoupon plusCpnInfo = orderDao.getCustCouponInfo(plusCpnParam.getCustCpnSq());
+//						if (plusCpnInfo != null) {
+//							plusCpnInfo = orderDao.getCouponInfo(plusCpnInfo.getCpnId());
+//
+//							if (plusCpnInfo != null && ("10".equals(plusCpnInfo.getReissuance()) || "30".equals(plusCpnInfo.getReissuance()))) {
+//								orderDao.updateCustCouponCancel(plusCpnParam);
+//							}
+//						}
+//					}
+//
+//					if (StringUtils.isNotBlank(withdraw.getCartCpnSq())) {
+//						usedCartCpnSq = Long.parseLong(withdraw.getCartCpnSq());
+//					}
+//				}
+//
+//				// 반품요청에 대한 컨펌시 환입 정산정보 생성
+//				if (TsaConstants.OrderChangeGb.RETURN.value().equals(chgGb)) {
+//					Withdraw paramUsac = new Withdraw();
+//					paramUsac.setUsacGb(UsacGb.PURCHASE_RETURN.value());
+//					paramUsac.setPrtnGb(PurchaseReturnGb.RETURN.value());
+//					paramUsac.setOrdDtlNo(withdraw.getOrdDtlNo());
+//					paramUsac.setOrgUsacGb(UsacGb.SELL.value());
+//					paramUsac.setUsacQty(wdQty);
+//					paramUsac.setGoodsCpnDcAmt(rfGoodsCpnAmt);
+//					paramUsac.setCartCpnDcAmt(rfCartCpnAmt);
+//					paramUsac.setPlusCpnDcAmt(rfPlusCpnAmt);
+//					paramUsac.setPntDcAmt(rfPntAmt);
+//					paramUsac.setPrePntDcAmt(rfPrePntAmt);
+//					paramUsac.setRegId(userId);
+//					withdrawDao.createWithdrawUsac(paramUsac);
+//				}
+//
+//				// 세트상품인 경우 상세번호를 저장
+//				if ("S".equals(withdraw.getGoodsType())) {
+//					setOrdDtlNos.setInt(withdraw.getOrdDtlNo(), setOrdDtlNos.getInt(withdraw.getOrdDtlNo()) < 1 ? 1 : setOrdDtlNos.getInt(withdraw.getOrdDtlNo()) + 1);
+//				}
+//			}
+//
+//			// 쿠폰 처리
+//			String chgReasonCds = "10,11,12,13,15,21,30";	// 고객 귀책
+//			if (chgReasonCds.contains(chgReason) && TsaConstants.OrderChangeGb.RETURN.value().equals(chgGb)) {
+//				if (couponInfo != null) {
+//					if (StringUtils.isNotBlank(couponCartCpnSq) && couponInfo.getBuyLimitAmt() > 0) {
+//						refundCancelCartCpnAmt += orderDetailCouponCancel(ordNo, ordChgSq, couponInfo.getBuyLimitAmt());
+//					}
+//				}
+//			}
+//
+//			Withdraw orderDetailSumAmtInfo = withdrawDao.getOrderDetailSumAmt(ordNo.toString());
+//
+//			// 마지막에 처리 할 것. 장바구니 쿠폰 사용 여부 처리( 추후 구매제한에 대한 것도 처리 필요)
+//			if (StringUtils.isNotBlank(couponCartCpnSq) && orderDetailSumAmtInfo.getTotCartCpnDcAmt() == 0 && TsaConstants.OrderChangeGb.RETURN.value().equals(chgGb)) {
+//				TsaCoupon cartCpnInfo = new TsaCoupon();
+//				if (usedCartCpnSq != null) {
+//					cartCpnInfo = orderDao.getCustCouponInfo(usedCartCpnSq);
+//				}
+//				if (cartCpnInfo != null) {
+//					cartCpnInfo = orderDao.getCouponInfo(cartCpnInfo.getCpnId());
+//
+//					if (cartCpnInfo != null && ("10".equals(cartCpnInfo.getReissuance()) || "30".equals(cartCpnInfo.getReissuance()))) {
+//						TsaOrder paramCpn = new TsaOrder();
+//						paramCpn.setUpdId(userId);
+//						paramCpn.setCustCpnSq(Long.parseLong(couponCartCpnSq));
+//						orderDao.updateCustCouponCancel(paramCpn);
+//					}
+//				}
+//			}
+//
+//			int remainOrdCnt = withdrawDao.getOrderNotCancelCnt(ordNo);
+//
+//			TsaDelivery paramOrder = new TsaDelivery();
+//			paramOrder.setOrdNo(ordNo);
+//
+//			if (remainOrdCnt == 0 && TsaConstants.OrderChangeGb.RETURN.value().equals(chgGb)) {
+//				paramOrder.setUpdId(userId);
+//				paramOrder.setOrdStat(OrderStat.PAYMENT_AFTER_CANCEL.value());
+//				deliveryDao.updateOrder(paramOrder);
+//			}
+//
+//			/* 포인트 처리 */
+//			TsaOrder ordPnt = new TsaOrder();
+//			ordPnt.setOrdNo(Long.toString(ordNo));
+//			ordPnt.setCustNo(Integer.toString(custNo));
+//			ordPnt.setOccurGb(TsaConstants.PointOccurGb.USE_POINT.value());
+//			int ordUsedCustPointHstSq = orderDao.getOrderCustPointHstSq(ordPnt);	// 사용한 포인트 정보
+//
+//			if (ordUsedCustPointHstSq > 0 && TsaConstants.OrderChangeGb.RETURN.value().equals(chgGb)) {
+//
+//				// 환불 포인트 만료일
+//				String expireDt = orderDao.getOrderAccountExpireDt(ordUsedCustPointHstSq);
+//				String toDay = GagaDateUtil.getToday();
+//
+//				if (StringUtils.isNotBlank(expireDt)) {
+//
+//					// 만료일이 지났으면 오늘 + 7일로 셋팅
+//					long longSwitchDueDt = Long.parseLong(expireDt);
+//					long longToDay = Long.parseLong(toDay);
+//
+//					if (longSwitchDueDt < longToDay) {
+//						expireDt = GagaDateUtil.getOffsetDate(toDay, 7, "yyyyMMdd");
+//					}
+//
+//					// 사용 포인트 반환
+//					if (refundPntAmt > 0) {
+//						TsaPoint point = new TsaPoint();
+//						point.setCustNo(Integer.toString(custNo));
+//						point.setOccurGb(TsaConstants.PointOccurGb.USE_POINT_CANCEL.value());
+//						point.setGivenPntAmt(refundPntAmt);
+//						point.setAvailPntAmt(refundPntAmt);
+//						point.setUsePntAmt(0);
+//						point.setExpireDt(expireDt);
+//						point.setOrdNo(Integer.parseInt(Long.toString(ordNo)));
+//						point.setSwitchDueDt(GagaDateUtil.getTodayDateTime());
+//						point.setPntUploadStat(TsaConstants.PointOccurStat.APPLY_COMPLETE.value());
+//						point.setPntUploadDt(point.getSwitchDueDt());
+//						point.setRegId(userId);
+//						point.setUpdId(userId);
+//						orderDao.createPointAccount(point);
+//
+//						point.setPntAmt(point.getGivenPntAmt());
+//						orderDao.createCustPointHst(point);
+//
+//						orderDao.createPointDetail(point);
+//
+//						for (TsaPoint paramPnt : pointList) {
+//							paramPnt.setCustPointHstSq(point.getCustPointHstSq());
+//							paramPnt.setRegId(userId);
+//							orderDao.createOrderPoint(paramPnt);
+//						}
+//					}
+//
+//					// 적립 예정 포인트 취소
+//					if (refundSavePntAmt > 0) {
+//						TsaPoint point = new TsaPoint();
+//
+//						point.setOrdNo(Integer.parseInt(Long.toString(ordNo)));
+//						point.setOccurGb(TsaConstants.PointOccurGb.EXPECT_POINT.value());
+//						String switchDueDt = orderDao.getPointAccountSwitchDueDt(point);
+//						expireDt = orderDao.getPointAccountExpireDt(point);
+//						String pntUploadStat = orderDao.getPointAccountPntUploadStat(point);
+//						
+//						int availPntAmt = 0;
+//						String uploadDt = "";
+//						String uploadStat = TsaConstants.PointOccurStat.APPLY_EXPECT.value();
+//						String toDayTime = GagaDateUtil.getTodayDateTime();
+//
+//						// 예정일이 지났으면 오늘로 셋팅
+//						if (TsaConstants.PointOccurStat.APPLY_COMPLETE.value().equals(pntUploadStat)) {
+//							availPntAmt = -refundSavePntAmt;
+//							switchDueDt = toDayTime;
+//							uploadDt = switchDueDt;
+//							uploadStat = TsaConstants.PointOccurStat.APPLY_COMPLETE.value();
+//						}
+//
+//						point.setCustNo(Integer.toString(custNo));
+//						point.setOccurGb(TsaConstants.PointOccurGb.EXPECT_POINT_CANCEL.value());
+//						point.setGivenPntAmt(-refundSavePntAmt);
+//						point.setAvailPntAmt(availPntAmt);
+//						point.setUsePntAmt(0);
+//						point.setExpireDt(expireDt);
+//						point.setSwitchDueDt(GagaDateUtil.getTodayDateTime());
+//						point.setPntUploadStat(uploadStat);
+//						point.setPntUploadDt(uploadDt);
+//						point.setRegId(userId);
+//						point.setUpdId(userId);
+//						orderDao.createPointAccount(point);
+//
+//						point.setPntAmt(point.getGivenPntAmt());
+//						orderDao.createCustPointHst(point);
+//
+//						orderDao.createPointDetail(point);
+//
+//						for (TsaPoint paramPnt : savePointList) {
+//							paramPnt.setCustPointHstSq(point.getCustPointHstSq());
+//							paramPnt.setRegId(userId);
+//							orderDao.createOrderPoint(paramPnt);
+//						}
+//					}
+//				}
+//			}
+//
+//			if (TsaConstants.OrderChangeGb.RETURN.value().equals(chgGb)) {	// 반품인경우
+//				// 결제 정보
+//				TsaOrder paramPay = new TsaOrder();
+//				paramPay.setOrdNo(ordNo.toString());
+//				paramPay.setPayStat(PaymentStat.PAYMENT_COMPLETE.value());
+//				paramPay.setDelvPayGb("O");
+//				TsaOrder pay = orderDao.getPayment(paramPay);
+//
+//				pay.setOrgPayStat(PaymentStat.PAYMENT_COMPLETE.value());
+//
+//				int orgPaySq = pay.getPaySq();
+//				int paySq = orgPaySq + 1;
+//				int orgPayAmt = pay.getPayAmt();
+//				int devlFeePaySq = orgPaySq;
+//
+//				// 원 결제 정보 업데이트
+//				pay.setOrdNo(ordNo.toString());
+//				pay.setPayStat(PaymentStat.PAYMENT_CANCEL.value());
+//				pay.setUpdId(userId);
+//
+//				/* 9.배송비 등록 */
+//				GagaMap delvMap = deliveryFeeProcess(params, orgPaySq, chgReasonCds);
+//				int totRfDelvFee = delvMap.getInt("totDelvFee");	// 총환불배송비
+//				int rfDelvCpnAmt = delvMap.getInt("rfDelvCpnAmt");
+//
+//				// 환불금액
+//				log.info("============== 환불 금액 ==============");
+//
+//				if (TsaConstants.MallGb.SELFMALL.value().equals(mallGb)) {	// 자사몰인경우
+//					refundAmt = refundAmt + totRfDelvFee - refundCancelCartCpnAmt;
+//				}
+//
+//				log.info("refundAmt = " + refundAmt);
+//				log.info("custShipAmt = " + custShipAmt);
+//				log.info("orgDelvFee = " + orgDelvFee);
+//				log.info("refundGoodsCpnAmt = " + refundGoodsCpnAmt);
+//				log.info("refundCartCpnAmt = " + (refundCartCpnAmt + refundCancelCartCpnAmt));
+//				log.info("refundPntAmt = " + refundPntAmt);
+//				log.info("refundPrePntAmt = " + refundPrePntAmt);
+//				log.info("refundCancelCartCpnAmt = " + refundCancelCartCpnAmt);
+//				log.info("refundPlusCpnAmt = " + refundPlusCpnAmt);
+//				log.info("totRfDelvFee = " + totRfDelvFee);
+//				log.info("rfDelvCpnAmt = " + rfDelvCpnAmt);
+//
+//				// 환불정보
+//				if (TsaConstants.MallGb.SELFMALL.value().equals(mallGb)) {	// 자사몰만 환불정보 등록
+//					if (PayMeans.ACCOUNT_DEPOSIT.value().equals(pay.getPayMeans())) {
+//						pay.setOrdChgSq(ordChgSq);
+//						TsaOrder paramRefund = orderDao.getRefundAccount(pay);
+//
+//						if (paramRefund != null) {
+//							pay.setRaBnk(paramRefund.getRaBnk());
+//							pay.setRaNm(paramRefund.getRaNm());
+//							pay.setRaNo(paramRefund.getRaNo());
+//						} else {
+//							paramRefund = orderDao.getCustomerDefaultAccount(Integer.toString(custNo));
+//							if (paramRefund != null) {
+//								pay.setRaNo(paramRefund.getRaNo());
+//								pay.setRaNm(paramRefund.getRaNm());
+//								pay.setRaBnk(paramRefund.getRaBnk());
+//							}
+//						}
+//						if (paramRefund == null) {
+//							throw new IllegalStateException("환불계좌정보가 없습니다.");
+//						}
+//						paramRefund.setOrdNo(Long.toString(ordNo));
+//						paramRefund.setPaySq(pay.getPaySq());
+//						paramRefund.setOrdChgSq(ordChgSq);
+//						paramRefund.setRefundAmt(refundAmt);
+//						paramRefund.setRfGoodsCpnAmt(refundGoodsCpnAmt + refundPlusCpnAmt + rfDelvCpnAmt);
+//						paramRefund.setRfCartCpnAmt(refundCartCpnAmt + refundCancelCartCpnAmt);
+//						paramRefund.setRfPntAmt(refundPntAmt);
+//						paramRefund.setRfPrePntAmt(refundPrePntAmt);
+//						paramRefund.setRegId(userId);
+//						orderDao.createRefund(paramRefund);
+//					} else {
+//						TsaOrder paramRefund = new TsaOrder();
+//						paramRefund.setOrdNo(Long.toString(ordNo));
+//						paramRefund.setPaySq(pay.getPaySq());
+//						paramRefund.setOrdChgSq(ordChgSq);
+//						paramRefund.setRefundAmt(refundAmt);
+//						paramRefund.setRfGoodsCpnAmt(refundGoodsCpnAmt + refundPlusCpnAmt + rfDelvCpnAmt);
+//						paramRefund.setRfCartCpnAmt(refundCartCpnAmt + refundCancelCartCpnAmt);
+//						paramRefund.setRfPntAmt(refundPntAmt);
+//						paramRefund.setRfPrePntAmt(refundPrePntAmt);
+//						paramRefund.setRegId(userId);
+//						orderDao.createRefund(paramRefund);
+//					}
+//				}
+//
+//				int payAmt = orgPayAmt - refundAmt;
+//
+//				String partCancelYn = "N";
+//
+//				if (orgPaySq > 1) {
+//					partCancelYn = "Y";
+//				}
+//
+//				if (payAmt > 0) {
+//					paramPay.setPaySq(paySq);
+//					paramPay.setPayAmt(payAmt);
+//					paramPay.setPayStat(PaymentStat.PAYMENT_COMPLETE.value());
+//					paramPay.setRegId(userId);
+//					paramPay.setUpdId(userId);
+//					paramPay.setOrgPaySq(pay.getPaySq());
+//					orderDao.createPayment(paramPay);
+//
+//					partCancelYn = "Y";
+//					devlFeePaySq = paySq;
+//				}
+//
+//				// 매출반영
+//				// ERP 판매반영 생성
+//				for (Withdraw withdraw : ifOnilneSales) {
+//					withdraw.setPayAmt(payAmt);
+//					withdraw.setRefundAmt(refundAmt);
+//					withdraw.setRegId(userId);
+//					createIfEcpTbSalesReturn(withdraw);
+//				}
+//
+//				boolean checkPay = orgPayAmt - payAmt < 0 ? true : false;
+//				if (checkPay) {
+//					throw new IllegalStateException("결제금액과 환불정보가 맞지 않습니다.");
+//				}
+//
+//				/* PG결제취소 */
+//
+//				TsaPayGate paramPg = new TsaPayGate();
+//				paramPg.setPgShopId(pay.getPgShopId());	// 상점아이디
+//				paramPg.setPgGb(pay.getPgGb());    // pg구분
+//				paramPg.setTid(pay.getPgTid());    // 거래번호
+//				paramPg.setCancelAmt(refundAmt);    // 취소금액
+//				paramPg.setPartCancelYn(partCancelYn);    // 부분취소여부
+//
+//				if (TsaConstants.PayMeans.ACCOUNT_DEPOSIT.value().equals(pay.getPayMeans())) {        // 무통입금일때
+//					paramPg.setRefundYn("Y");
+//					paramPg.setRefundBankCd(pay.getRaBnk());    // 환불은행코드
+//					paramPg.setRefundAcctNo(pay.getRaNo());    // 환불계좌번호
+//					paramPg.setRefundAcctNm(pay.getRaNm());    // 환불계좌주명
+//				}
+//
+//				// 자사몰이고 결제완료이고 PG점프가 아닌경우 PG와 통신한다.
+//				if (TsaConstants.MallGb.SELFMALL.value().equals(mallGb)
+//					&& TsaConstants.PaymentStat.PAYMENT_COMPLETE.value().equals(pay.getOrgPayStat()) && "N".equals(pgStat)) {
+//
+//					GagaMap result = orderService.cancelPgPayment(paramPg);
+//
+//					if (result.getBoolean("success")) {        // 00:취소성공
+//						result.put("resultCd", "00");
+//						result.put("resultMsg", "결제취소가 완료되었습니다.");
+//						pay.setPgCnclTid(result.getString("TID"));
+//					} else {
+//						throw new IllegalStateException(result.getString("ResultMsg"));        // PG처리 실패시 전체 ROLLBACK 처리함.
+//					}
+//
+//				}
+//
+//				if (payAmt == 0) {
+//					paySq = orgPaySq;
+//					pay.setPayStat(TsaConstants.PaymentStat.PAYMENT_CANCEL.value());
+//				}
+//
+//				orderDao.updatePayment(pay);
+//
+//				// 카카오 알림톡 전송
+//				try {
+//					if (TsaConstants.MallGb.SELFMALL.value().equals(mallGb)) {
+//						kakaoService.sendReturnComplete(params, withdrawList);
+//					}
+//				} catch (Exception e) {
+//					e.fillInStackTrace();
+//				}
+//
+//			} else {// 교환인 경우
+//
+//				// 교환출고처 지정대기(26) 상태인 놈을 출고처 예정(34) 으로 업데이트
+//				for (Withdraw withdraw : ifOnilneSales) {
+//					withdrawDao.updateExchangeLocAssignStatus(withdraw);
+//					withdraw.setUpdId(userId);
+//					withdraw.setRegId(userId);
+//					withdrawDao.createWithdrawOrderDetailHstInfo(withdraw); // 원주문상세번호에 대한 이력
+//					withdrawDao.createWithdrawOrderDetailHstInfo2(withdraw); // 교환 주문상세번호에 대한 이력
+//				}
+//
+//				// 매출반영 환입 ERP 판매반영 생성
+//				for (Withdraw withdraw : ifOnilneSales) {
+//					withdraw.setRegId(userId);
+//					createIfEcpTbSalesReturn(withdraw);
+//				}
+//				// 카카오 알림톡 전송
+//				try {
+//					if (TsaConstants.MallGb.SELFMALL.value().equals(mallGb)) {
+//						kakaoService.sendWithdrawConfirm(params, withdrawList);
+//					}
+//				} catch (Exception e) {
+//					e.fillInStackTrace();
+//				}
+//			}
+//
+//		}
+//
+	}
+
+	/**
+	 * ERP 환입반영처리
+	 *
+	 * @param withdraw - 주문 정보
+	 * @return
+	 * @author yh98kim
+	 * @since 2020. 05. 13
+	 */
+//	@Transactional("shopTxnManager")
+//	public void createIfEcpTbSalesReturn(Withdraw withdraw) {
+//		if ("S".equals(withdraw.getGoodsType())) {
+//			// 세트의 단품별 비중을 구한다.
+//			Collection<Withdraw> withdrawList = withdrawDao.getWithdrawDetailList2(withdraw);
+//			int totCnt = withdrawList.size();
+//			int cnt = 0;
+//
+//			int sumDivRfPntAmt = 0;
+//			int sumDivRfPrePntAmt = 0;
+//			int sumDivRfGoodsCpnAmt = 0;
+//			int sumDivRfCartCpnAmt = 0;
+//			int sumDivRfPlusCpnAmt = 0;
+//			int sumDivRfSavePntAmt = 0;
+//
+//			int rfPntAmt = withdraw.getRfPntAmt();
+//			int rfPrePntAmt = withdraw.getRfPrePntAmt();
+//			int rfGoodsCpnAmt = withdraw.getRfGoodsCpnAmt();
+//			int rfCartCpnAmt = withdraw.getRfCartCpnAmt();
+//			int rfPlusCpnAmt = withdraw.getRfPlusCpnAmt();
+//			int rfSavePntAmt = withdraw.getSavePntAmt();
+//
+//			int wdQty = withdraw.getWdQty();	// 회수수량
+//			int realOrdAmt = withdraw.getRealOrdAmt();	// 실주문금액
+//
+//			GagaMap gMap = new GagaMap();
+//
+//			for (Withdraw wd : withdrawList) {
+//				int divRfPntAmt = 0;
+//				int divRfPrePntAmt = 0;
+//				int divRfGoodsCpnAmt = 0;
+//				int divRfCartCpnAmt = 0;
+//				int divRfPlusCpnAmt = 0;
+//				int divRfSavePntAmt = 0;
+//
+//				// item 별 비중: 회수수량 * itemQty * itemPrice / realOrdAmt
+//				// 소수점 2째짜리까지 비중을 구한다.
+//				Double rate = Math.round(wdQty * wd.getItemQty() * wd.getItemPrice() / realOrdAmt * 100) / 100.0;
+//
+//				if (totCnt > 1 && cnt == totCnt - 1) {	// 마지막 건인 경우 쿠폰 포인트는 총계에서 나머지 합계를 빼서 구한다.
+//					divRfPntAmt = rfPntAmt - sumDivRfPntAmt;
+//					divRfPrePntAmt = rfPrePntAmt - sumDivRfPrePntAmt;
+//					divRfGoodsCpnAmt = rfGoodsCpnAmt - sumDivRfPrePntAmt;
+//					divRfCartCpnAmt = rfCartCpnAmt - sumDivRfGoodsCpnAmt;
+//					divRfPlusCpnAmt = rfPlusCpnAmt - sumDivRfPlusCpnAmt;
+//					divRfSavePntAmt = rfSavePntAmt - sumDivRfSavePntAmt;
+//				} else {
+//					divRfPntAmt = (int)Math.round(rfPntAmt * rate);
+//					divRfPrePntAmt = (int)Math.round(rfPrePntAmt * rate);
+//					divRfGoodsCpnAmt = (int)Math.round(rfGoodsCpnAmt * rate);
+//					divRfCartCpnAmt = (int)Math.round(rfCartCpnAmt * rate);
+//					divRfPlusCpnAmt = (int)Math.round(rfPlusCpnAmt * rate);
+//					divRfSavePntAmt = (int)Math.round(rfSavePntAmt * rate);
+//
+//					sumDivRfPntAmt += divRfPntAmt;
+//					sumDivRfPrePntAmt += divRfPrePntAmt;
+//					sumDivRfGoodsCpnAmt += divRfGoodsCpnAmt;
+//					sumDivRfCartCpnAmt += divRfCartCpnAmt;
+//					sumDivRfPlusCpnAmt += divRfPlusCpnAmt;
+//					sumDivRfSavePntAmt += divRfSavePntAmt;
+//				}
+//				wd.setRfPntAmt(divRfPntAmt);
+//				wd.setRfPrePntAmt(divRfPrePntAmt);
+//				wd.setRfGoodsCpnAmt(divRfGoodsCpnAmt);
+//				wd.setRfCartCpnAmt(divRfCartCpnAmt);
+//				wd.setRfPlusCpnAmt(divRfPlusCpnAmt);
+//				wd.setRfSavePntAmt(divRfSavePntAmt);
+//				wd.setOrdAmt(wdQty * wd.getItemQty() * wd.getItemPrice());
+//				int tmpRealOrdAmt = wdQty * wd.getItemQty() * wd.getItemPrice() - (divRfPntAmt - divRfPrePntAmt - divRfGoodsCpnAmt - divRfCartCpnAmt - divRfPlusCpnAmt);
+//				wd.setRealOrdAmt(tmpRealOrdAmt);
+//
+//				withdrawDao.createIfEcpTbSalesReturn(withdraw);
+//
+//				cnt++;
+//			}
+//		} else {
+//			withdrawDao.createIfEcpTbSalesReturn(withdraw);
+//		}
+//	}
+
+	/**
+	 * 배송비 처리
+	 *
+	 * @param params - 주문 정보
+	 * @return
+	 * @author yh98kim
+	 * @since 2020. 05. 13
+	 */
+//	@Transactional("shopTxnManager")
+//	public GagaMap deliveryFeeProcess(Withdraw params, int paySq, String chgReasonCds) {
+//		GagaMap resultMap = new GagaMap();
+//		TsaOrder order = new TsaOrder();
+//		order.setOrdNo(Long.toString(params.getOrdNo()));
+//		Collection<TsaOrder> delvFeeList = orderDao.getSupplyCompDelvFeeList(order);
+//		String regId = TsaSession.getInfo().getUserId();
+//		String ordNo = order.getOrdNo();
+//		String chgReasonDesc = order.getChgReasonDesc();
+//		int totDelvFee = 0;                    // 환불할 총배송비
+//		int selfYCnt = 0;                    // 자사상품 카운트
+//		String selfYSupplyCompCd = "";        // 자사상품 대표업체코드
+//		int selfYDelvFee = 0;                // 자사상품 결제한배송비
+//		int selfYAddDelvFee = 0;
+//		int selfYMinOrdAmt = 9999999;        // 자사상품 무료배송 최소주문금액
+//		int selfYSumRealOrdAmt = 0;            // 자사상품 총결제금액
+//		Long selfYdelvCpnSq = null;			// 배송비쿠폰
+//		int selfYDelvCpnAmt = 0;
+//		int rfDelvCpnAmt = 0;
+//
+//		TsaOrder setParams = new TsaOrder();
+//		setParams.setOrdNo(ordNo);
+//		setParams.setPaySq(paySq);
+//		setParams.setOrdChgSq(params.getOrdChgSq());
+//
+//		// 교환배송비 부과여부
+//		boolean bExchDelvFee = false; // true: 교환배송비 부과, false: 교환배송비 부과안함
+//
+//		String delvFeeGb = TsaConstants.DeliveryFeeGb.RETURN_DELIVERY_FEE.value();
+//		if (TsaConstants.OrderChangeGb.EXCHANGE.value().equals(params.getChgGb())) {
+//			delvFeeGb = TsaConstants.DeliveryFeeGb.EXCHANGE_DELIVERY_FEE.value();	// 교환
+//			if (chgReasonCds.contains(params.getChgReason())) {	// 고객귀책인 경우
+//				bExchDelvFee = true;
+//			}
+//		}
+//		setParams.setDelvFeeGb(delvFeeGb);
+//		setParams.setDelvUsacYn("N");
+//		setParams.setRegId(regId);
+//		setParams.setUpdId(regId);
+//
+//		// 회수비(반품배송비) 부과여부
+//		boolean bRtnDelvFee = true;	// true: 회수비 부과, false: 회수비 부과안함
+//		// 주문당 변경건수
+//		int chgCnt = deliveryDao.getOrdReturnChgCnt(params.getOrdNo());
+//		// 회원이고 고객귀책인 경우에 주문당 1회만 회수비 무료
+//		if (params.getCustNo() != 0 && chgReasonCds.contains(params.getChgReason())) {	// 고객귀책
+//			if (chgCnt == 1) {
+//				bRtnDelvFee = false;
+//			}
+//		}
+//
+//		for (TsaOrder oneData : delvFeeList) {
+//
+//			String selfYn = oneData.getSelfYn();
+//			String supplyCompCd = oneData.getSupplyCompCd();
+//
+//			int payDelvFee = oneData.getPayDelvFee();
+//			int delvFee = oneData.getDelvFee();
+//			int sumRealOrdAmt = oneData.getSumRealOrdAmt();
+//			int sumCnclRtnAmt = oneData.getSumCnclRtnAmt();
+//			int minOrdAmt = oneData.getMinOrdAmt();
+//			int delvCpnAmt = oneData.getDelvCpnAmt();
+//			Long delvCpnSq = oneData.getDelvCpnSq();
+//
+//			log.debug("################# sumRealOrdAmt : {}", sumRealOrdAmt);
+//			log.debug("################# sumCnclRtnAmt : {}", sumCnclRtnAmt);
+//
+//			if (selfYn.equals("Y")) {    // 자사
+//				if (selfYCnt == 0) {    // 자사 대표업체코드 : 업체코드로 DESC 해서 가져옴 - 파스텔(W), 플라인타이거(F)
+//					selfYSupplyCompCd = supplyCompCd;
+//					selfYDelvFee = payDelvFee;
+//					selfYAddDelvFee = delvFee;
+//				}
+//				if (minOrdAmt < selfYMinOrdAmt) {
+//					selfYMinOrdAmt = minOrdAmt;
+//				}
+//
+//				if (selfYDelvCpnAmt == 0) {
+//					selfYDelvCpnAmt = delvCpnAmt;
+//					selfYdelvCpnSq = delvCpnSq;
+//				}
+//
+//				selfYSumRealOrdAmt += sumRealOrdAmt;
+//				selfYCnt++;
+//			} else {    // 입점업체
+//
+//				if (TsaConstants.OrderChangeGb.EXCHANGE.value().equals(params.getChgGb())) {	// 교환인 경우
+//					if (bExchDelvFee) {	// 교환배송비 부과
+//						setParams.setDelvFee(delvFee * 2 - params.getEncloseFee());
+//						totDelvFee += delvFee * 2 - params.getEncloseFee();
+//						// TB_DELIVERY_FEE 에서 ORD_NO, ORD_CHG_SQ 조건으로 Update
+//						setParams.setSupplyCompCd(supplyCompCd);
+//						withdrawDao.mergeDeliveryFee(setParams);
+//					}
+//				} else {	// 반품인 경우
+//					if (payDelvFee > 0) {    // 결제한배송비가 있을경우
+//
+//						if (sumRealOrdAmt == 0) {    // 전체취소한경우 배송비 환불
+//
+//							// 귀책사유에 따라 배송비 환불
+//							if (!chgReasonCds.contains(params.getChgReason())) {	// 회사귀책
+//								setParams.setDelvFee(-payDelvFee - params.getEncloseFee());
+//								totDelvFee += payDelvFee - delvCpnAmt + params.getEncloseFee();
+//							} else {	// 고객귀책
+//								if (bRtnDelvFee) {	// 회수비 부과
+//									setParams.setDelvFee(delvFee - params.getEncloseFee());	// 회수배송비(delvFee) - 동봉비
+//									// 총환불배송비 = 동봉비 - 배송쿠폰금액 - 고객부담배송비
+//									totDelvFee += params.getEncloseFee() - delvCpnAmt - delvFee;
+//								} else {
+//									setParams.setDelvFee(0 - params.getEncloseFee());	// 회수배송비(delvFee) - 동봉비
+//									// 총환불배송비 = 동봉비 - 배송쿠폰금액 - 고객부담배송비(0)
+//									totDelvFee += params.getEncloseFee() - delvCpnAmt;
+//								}
+//							}
+//
+//							setParams.setSupplyCompCd(supplyCompCd);
+//							orderDao.createDeliveryFee(setParams);
+//
+//							if (delvCpnSq != null && delvCpnSq > 0L) {
+//								TsaCoupon delvCpnInfo = orderDao.getCustCouponInfo(delvCpnSq);
+//								delvCpnInfo = orderDao.getCouponInfo(delvCpnInfo.getCpnId());
+//
+//								if ("10".equals(delvCpnInfo.getReissuance()) || "30".equals(delvCpnInfo.getReissuance())) {
+//									TsaOrder delvCpnParam = new TsaOrder();
+//									delvCpnParam.setUpdId(regId);
+//									delvCpnParam.setCustCpnSq(delvCpnSq);
+//									orderDao.updateCustCouponCancel(delvCpnParam);
+//								}
+//								rfDelvCpnAmt += delvCpnAmt;
+//							}
+//						}
+//					} else {
+//						if (delvCpnAmt == 0) {    // 결제한배송비가 없었을경우(배송비 쿠폰 사용시 계산 필요없음)
+//							if (chgReasonCds.contains(params.getChgReason())) {	// 고객귀책
+//								if (sumRealOrdAmt < minOrdAmt) {    // 무료배송최소주문금액보다 작을경우 배송비 발생
+//									if (bRtnDelvFee) {	// 회수비 부과
+//										setParams.setDelvFee(delvFee * 2);	// 회수배송비+원주문배송비
+//										totDelvFee -= delvFee * 2;
+//									} else {
+//										setParams.setDelvFee(0);
+//									}
+//								} else {
+//									if (bRtnDelvFee) {	// 회수비 부과
+//										setParams.setDelvFee(delvFee);	// 회수배송비
+//										totDelvFee -= delvFee;
+//									} else {
+//										setParams.setDelvFee(0);	// 회수배송비
+//									}
+//								}
+//								setParams.setSupplyCompCd(supplyCompCd);
+//								orderDao.createDeliveryFee(setParams);
+//							}
+//						}
+//					}
+//				}
+//			}
+//
+//		} /* ~for */
+//
+//		/* 자사상품 배송비 등록 */
+//		if (selfYCnt > 0) {
+//
+//			if (TsaConstants.OrderChangeGb.EXCHANGE.value().equals(params.getChgGb())) {	// 교환인 경우
+//				if (bExchDelvFee) {	// 교환배송비 부과
+//					setParams.setDelvFee(selfYAddDelvFee * 2 - params.getEncloseFee());
+//					totDelvFee += selfYAddDelvFee * 2 - params.getEncloseFee();
+//					// TB_DELIVERY_FEE 에서 ORD_NO, ORD_CHG_SQ 조건으로 Update
+//					setParams.setSupplyCompCd(selfYSupplyCompCd);
+//					withdrawDao.mergeDeliveryFee(setParams);
+//				}
+//
+//			} else {
+//
+//				if (selfYDelvFee > 0) {    // 결제한배송비가 있을경우
+//
+//					if (selfYSumRealOrdAmt == 0) {    // 전체취소한경우 배송비 환불
+//						// 귀책사유에 따라 배송비 환불
+//						if (!chgReasonCds.contains(params.getChgReason())) {	// 회사귀책
+//							setParams.setDelvFee(selfYDelvFee * -1 - params.getEncloseFee());
+//							totDelvFee += selfYDelvFee - selfYDelvCpnAmt + params.getEncloseFee();
+//						} else {
+//							if (bRtnDelvFee) {	// 회수비 부과
+//								setParams.setDelvFee(selfYDelvFee * -1 - params.getEncloseFee());
+//								totDelvFee += params.getEncloseFee() - selfYDelvCpnAmt - selfYDelvFee;
+//							} else {
+//								setParams.setDelvFee(-params.getEncloseFee());
+//								totDelvFee += params.getEncloseFee() - selfYDelvCpnAmt;
+//							}
+//						}
+//						setParams.setSupplyCompCd(selfYSupplyCompCd);
+//						orderDao.createDeliveryFee(setParams);
+//
+//						if (selfYdelvCpnSq != null && selfYdelvCpnSq > 0L) {
+//							TsaCoupon delvCpnInfo = orderDao.getCustCouponInfo(selfYdelvCpnSq);
+//							delvCpnInfo = orderDao.getCouponInfo(delvCpnInfo.getCpnId());
+//
+//							if ("10".equals(delvCpnInfo.getReissuance()) || "30".equals(delvCpnInfo.getReissuance())) {
+//								TsaOrder delvCpnParam = new TsaOrder();
+//								delvCpnParam.setUpdId(regId);
+//								delvCpnParam.setCustCpnSq(selfYdelvCpnSq);
+//								orderDao.updateCustCouponCancel(delvCpnParam);
+//							}
+//
+//							rfDelvCpnAmt += selfYDelvCpnAmt;
+//						}
+//
+//					} else {
+//						if (bRtnDelvFee) {	// 회수비 부과
+//							setParams.setDelvFee(-selfYDelvFee);
+//						} else {
+//							setParams.setDelvFee(0);
+//						}
+//						setParams.setSupplyCompCd(selfYSupplyCompCd);
+//						orderDao.createDeliveryFee(setParams);
+//						totDelvFee -= selfYDelvCpnAmt;
+//					}
+//
+//				} else {
+//					if (selfYDelvCpnAmt == 0) {							// 결제한배송비가 없었을경우(배송비 쿠폰 사용시 계산 필요없음)
+//						if (chgReasonCds.contains(params.getChgReason())) {	// 고객귀책
+//							if (selfYSumRealOrdAmt < selfYMinOrdAmt) {		// 무료배송최소주문금액보다 작을경우 배송비 발생
+//								if (bRtnDelvFee) {	// 회수비 부과
+//									setParams.setDelvFee(selfYAddDelvFee * 2);
+//									totDelvFee -= selfYAddDelvFee * 2;
+//								} else {
+//									setParams.setDelvFee(0);
+//									totDelvFee -= 0;
+//								}
+//								setParams.setSupplyCompCd(selfYSupplyCompCd);
+//								orderDao.createDeliveryFee(setParams);
+//							} else {									// 무료배송금액보다 큰 경우에는 회수비만 부과
+//								if (bRtnDelvFee) {	// 회수비 부과
+//									setParams.setDelvFee(selfYAddDelvFee);
+//									totDelvFee -= selfYAddDelvFee;
+//									setParams.setSupplyCompCd(selfYSupplyCompCd);
+//									orderDao.createDeliveryFee(setParams);
+//								}
+//							}
+//						}
+//					}
+//				}
+//			}
+//		}
+//
+//		resultMap.setInt("totDelvFee", totDelvFee);
+//		resultMap.setInt("rfDelvCpnAmt", rfDelvCpnAmt);
+//
+//		return resultMap;
+//	}
+
+	/**
+	 * 회수관리 - 주문상세 남은상품에 대한 장바구니쿠폰 처리
+	 *
+	 * @param ordNo
+	 * @param ordChgSq
+	 * @param buyLimitAmt
+	 * @return int
+	 * @author rladbwnd5
+	 * @since 2020. 02. 17
+	 */
+//	@Transactional("shopTxnManager")
+//	private int orderDetailCouponCancel(Long ordNo, Long ordChgSq, int buyLimitAmt) {
+//		int refundCancelCartCpnAmt = 0;
+//		String userId = TsaSession.getInfo().getUserId();
+//
+//		Withdraw searchParam = new Withdraw();
+//		searchParam.setOrdNo(ordNo);
+//		searchParam.setOrdChgSq(ordChgSq);
+//		Withdraw remianGoodsInfo = withdrawDao.getRemainGoodsInfo(searchParam);
+//
+//		if (remianGoodsInfo.getRealOrdAmt() < buyLimitAmt) {
+//			Collection<Withdraw> remainOrderDetailList = withdrawDao.getWithdrawRemainOrderDetailList(searchParam);
+//
+//			for (Withdraw orderDetail : remainOrderDetailList) {
+//				// 기존 정산 취소
+//				Withdraw paramCancelUsac = new Withdraw();
+//				paramCancelUsac.setUsacGb(UsacGb.PURCHASE_RETURN.value());
+//				paramCancelUsac.setPrtnGb("40"); // 해택할인취소 PurchaseReturnGb.CANCEL.value() 명칭 필요할 듯
+//				paramCancelUsac.setOrdDtlNo(orderDetail.getOrdDtlNo());
+//				paramCancelUsac.setOrgUsacGb(UsacGb.SELL.value());
+//				paramCancelUsac.setUsacQty(orderDetail.getOrdQty());
+//				paramCancelUsac.setGoodsCpnDcAmt(orderDetail.getGoodsCpnDcAmt());
+//				paramCancelUsac.setCartCpnDcAmt(orderDetail.getCartCpnDcAmt());
+//				paramCancelUsac.setPlusCpnDcAmt(orderDetail.getPlusCpnDcAmt());
+//				paramCancelUsac.setPntDcAmt(orderDetail.getPntDcAmt());
+//				paramCancelUsac.setPrePntDcAmt(orderDetail.getPrePntDcAmt());
+//				paramCancelUsac.setRegId(userId);
+//				paramCancelUsac.setPlusCpnDcAmt(orderDetail.getPlusCpnDcAmt());
+//				withdrawDao.createWithdrawUsac(paramCancelUsac);
+//
+//				refundCancelCartCpnAmt += orderDetail.getCartCpnDcAmt();
+//				orderDetail.setRealOrdAmt(orderDetail.getRealOrdAmt() + orderDetail.getCartCpnDcAmt());
+//				orderDetail.setCartCpnDcAmt(0);
+//				orderDetail.setCartCpnSq(null);
+//				orderDetail.setUpdId(userId);
+//				orderDetail.setRegId(userId);
+//				withdrawDao.updateWithdrawOrderDetailInfo(orderDetail);
+//				withdrawDao.createWithdrawOrderDetailHstInfo(orderDetail);
+//
+//				// 재정산
+//				Withdraw paramUsac = new Withdraw();
+//				paramUsac.setUsacGb(UsacGb.SELL.value());
+//				paramUsac.setPrtnGb(null);
+//				paramUsac.setOrdDtlNo(orderDetail.getOrdDtlNo());
+//				paramUsac.setOrgUsacGb(UsacGb.SELL.value());
+//				paramUsac.setUsacQty(orderDetail.getOrdQty());
+//				paramUsac.setGoodsCpnDcAmt(orderDetail.getGoodsCpnDcAmt());
+//				paramUsac.setCartCpnDcAmt(orderDetail.getCartCpnDcAmt());
+//				paramUsac.setPlusCpnDcAmt(orderDetail.getPlusCpnDcAmt());
+//				paramUsac.setPntDcAmt(orderDetail.getPntDcAmt());
+//				paramUsac.setPrePntDcAmt(orderDetail.getPrePntDcAmt());
+//				paramUsac.setPlusCpnDcAmt(orderDetail.getPlusCpnDcAmt());
+//				paramUsac.setRegId(userId);
+//				withdrawDao.createWithdrawUsac(paramUsac);
+//			}
+//		}
+//
+//		return refundCancelCartCpnAmt;
+//	}
+
+	/**
+	 * 환불관리 - 주문번호 전체 금액
+	 *
+	 * @param ordNo
+	 * @return
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	public Withdraw getOrderDetailSumAmt(String ordNo) {
+		return withdrawDao.getOrderDetailSumAmt(ordNo);
+	}
+
+	/**
+	 * 환불목록
+	 *
+	 * @param withdraw
+	 * @return Withdraw List
+	 * @author yujung
+	 * @since 2020. 05. 29
+	 */
+//	public Collection<Withdraw> getRefundCompleteList(Withdraw withdraw) {
+//		return withdrawDao.getRefundCompleteList(withdraw);
+//	}
+
+	/**
+	 * 반품신청, 회수수량 비교 데이터
+	 *
+	 * @param withdraw
+	 * @return Withdraw
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	public Withdraw getSumChgQtyWdQty(Withdraw withdraw) {
+		return withdrawDao.getSumChgQtyWdQty(withdraw);
+	}
+
+	/**
+	 * wms 회수요청
+	 *
+	 * @param
+	 * @return
+	 * @author cjs
+	 * @since 2020. 07. 14
+	 */
+//	@Transactional("wmsTxnManager")
+//	public void saveWmsWithdrawRequest(TsaOrder order) {
+//
+//		String userId = TsaSession.getInfo().getUserId();
+//
+//		String reqSn = wmsWithdrawDao.getRequestSn();
+//		order.setSeq(reqSn);
+//
+//		order.setInvoiceNo("123412341");
+//		order.setOrdChgSq(3);
+//		order.setRecipNm("반품자");
+//		order.setRecipTelno("010-111-1111");
+//		order.setRecipPhnno("010-2222-2222");
+//		order.setRecipPostNo("12345");
+//		order.setRecipBaseAddr("서울시 강남구 논현로 323");
+//		order.setRecipDtlAddr("MTU 빌딩 6층 전산실");
+//		order.setChgMemo("사이즈가 작아요");
+//		order.setChgerRtnMemo("물류메모");
+//		order.setChgGb("40");
+//		order.setChgReason("13");
+//		order.setRegDt("20200505121212");
+//		order.setChgQty(1);
+//		order.setChgRegDt("20200505121212");
+//		order.setChgerNm("변경자");
+//		if (order.getSellStoreCd() == null || order.getSellStoreCd().isEmpty()) {
+//			order.setSellStoreCd("PASTEL");
+//		}
+//		order.setOrdDtlNos(order.getOrdDtlNo());
+//		order.setChgQtys(Integer.toString(order.getChgQty()));
+//
+//		/* 1.회수요청 Header 등록 */
+//		wmsWithdrawDao.createWithdrawHeader(order);
+//
+//		/* 2.회수요청 Detail 등록 */
+//		int cnt = 0;
+//		order.setChgStat(TsaConstants.OrderChangeStat.RETURN.value());
+//		String[] ordDtlNoArr = order.getOrdDtlNos().split(",");
+//		String[] chgQtyArr = order.getChgQtys().split(",");
+//
+//		for (String ordDtlNo : ordDtlNoArr) {
+//			if (!StringUtils.isBlank(ordDtlNo)) {
+//				order.setOrdDtlNo(ordDtlNo);
+//				order.setChgQty(Integer.parseInt(chgQtyArr[cnt]));
+//				wmsWithdrawDao.createWithdrawDetail(order);
+//			}
+//			cnt++;
+//		}
+//	}
+}

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

@@ -0,0 +1,352 @@
+package com.style24.admin.biz.web;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.style24.admin.biz.service.TsaRendererService;
+import com.style24.admin.biz.service.TsaDeliveryService;
+import com.style24.admin.support.controller.TsaBaseController;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Delivery;
+import com.style24.persistence.domain.DeliveryLoc;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.rest.server.GagaResponse;
+
+/**
+ * 배송 Controller
+ *
+ * @author moon
+ * @since 2020. 11. 05
+ */
+@Controller
+@RequestMapping("/delivery")
+@Slf4j
+public class TsaDeliveryController extends TsaBaseController {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private TsaRendererService rendererService;
+
+	@Autowired
+	private TsaDeliveryService deliveryService;
+
+	
+	
+	
+	@Value("${upload.default.target.path}")
+	private String uploadTargetPath;
+
+	/**
+	 * 배송 목록 화면
+	 * @return
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	@GetMapping("/list/form")
+	public ModelAndView deliveryListForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 몰구분
+		//mav.addObject("mallGbList", rendererService.getMallGbCommonCodeList(TsaSession.getInfo().getRoleCd()));
+		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("shipCompanyList", rendererService.getShipCompanyList());
+		// 출고처분류
+		mav.addObject("delvTypeList", rendererService.getAvailCommonCodeList("G024"));
+		
+		String supplyCompCd = "";
+		if ("B000".equals(TsaSession.getInfo().getRoleCd())) {
+			supplyCompCd = TsaSession.getInfo().getSupplyCompCd();
+		}
+		
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd));
+        //mav.addObject("vendorList", rendererService.getVendorCommonCodeList(TsaSession.getInfo().getRoleCd()));
+
+		mav.setViewName("delivery/DeliveryListForm");
+
+		return mav;
+	}
+
+	/**
+	 * 배송 목록 화면 - 배송 목록
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	@PostMapping("/list")
+	@ResponseBody
+	public Collection<Delivery> getDeliveryList(@RequestBody Delivery delivery) throws Exception {
+		Collection<Delivery> dataList = deliveryService.getDeliveryList(delivery);
+		return dataList;
+	}
+
+	/**
+	 * 배송 목록 화면 - 품절처리
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	@PostMapping("/list/soldout")
+	@ResponseBody
+	public GagaResponse soldoutDeliveryList(@RequestBody Collection<Delivery> deliveryList) throws Exception {
+		if (deliveryList == null || deliveryList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1002"));
+		}
+		// 세트상품일경우 주문번호, 주문상세기준으로 data 정비 
+		Collection<Delivery> orderDtlList = new ArrayList<Delivery>();
+
+		int orderDtlListCnt = 0;
+		for (Delivery delivery : deliveryList) {
+			Delivery dtlno = new Delivery();
+			dtlno.setOrdNo(delivery.getOrdNo());
+			dtlno.setOrdDtlNo(delivery.getOrdDtlNo());
+			dtlno.setSaleQty(delivery.getSaleQty());
+			dtlno.setCustNo(delivery.getCustNo());
+			dtlno.setDelvLocClsf(delivery.getDelvLocClsf());
+			if (orderDtlListCnt == 0) {
+				orderDtlList.add(dtlno);
+			} else {
+				int dupChk = 0;
+				for (Delivery param : orderDtlList) {
+					if (delivery.getOrdNo().equals(param.getOrdNo()) && delivery.getOrdDtlNo().equals(param.getOrdDtlNo())) {
+						dupChk++;
+					}
+				}
+				if (dupChk == 0) {
+					orderDtlList.add(dtlno);
+				}
+				orderDtlListCnt++;
+			}
+		}
+		/*
+		// 주문 취소 형식에 맞게 data 정비 
+		Collection<TsaOrder> orderlist = new ArrayList<TsaOrder>();
+
+		for (TsaDelivery delivery : orderDtlList) {
+			TsaOrder param = new TsaOrder();
+			param.setOrdNo(delivery.getOrdNo() + "");
+			param.setOrdDtlNo(delivery.getOrdDtlNo() + "");
+			param.setOrdDtlNos(delivery.getOrdDtlNo() + "");
+			param.setCustNo(delivery.getCustNo());
+			param.setChgQty(delivery.getSaleQty());
+			param.setChgQtys(delivery.getSaleQty() + "");  // getChgQtys
+			param.setDelvLocClsf(delivery.getDelvLocClsf());
+
+			if (orderlist == null || orderlist.isEmpty()) {
+				orderlist.add(param);
+			} else {
+				int cnt = 0;
+				for (TsaOrder order : orderlist) {
+					if (delivery.getOrdNo().equals(order.getOrdNo())) {
+						order.setOrdDtlNos(order.getOrdDtlNos() + "," + param.getOrdDtlNo());
+						order.setChgQtys(order.getChgQtys() + "," + param.getChgQty());
+						cnt = 1;
+					}
+				}
+				if (cnt == 0) {
+					orderlist.add(param);
+				}
+			}
+		}
+
+		for (TsaOrder order : orderlist) {
+			deliveryService.saveGoodsSoldout(order);
+		}
+		*/
+		return super.ok(message.getMessage("SUCC_0004"));
+	}
+	
+	/**
+	 * 배송 목록 화면 - 송장번호변경(팝업)
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	@GetMapping("/save/invoice/form")
+	public ModelAndView saveInvoiceForm(@RequestParam(value = "ordDtlNo", required = true)long ordDtlNo) {
+		ModelAndView mav = new ModelAndView();
+		Collection<Delivery> ordDeliveryList = deliveryService.getOrderDetail(ordDtlNo);
+		Delivery ordDelivery = ordDeliveryList.iterator().next();
+		// 택배사명 목록
+		mav.addObject("shipCompanyList", rendererService.getShipCompanyList());
+		mav.addObject("ordDelivery", ordDelivery);
+		
+		mav.setViewName("delivery/SaveInvoiceForm");
+		return mav;
+	} 
+	
+	/**
+	 * 배송 목록 화면 - 송장번호변경(팝업) - 송장번호수정
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	@PostMapping("/orderDetail/save")
+	@ResponseBody
+	public GagaResponse saveOrderDetail(@RequestBody Collection<Delivery> deliveryList) throws Exception {
+
+		if (deliveryList == null) {
+			throw new IllegalStateException(message.getMessage("FAIL_1002"));
+		}
+
+		deliveryService.saveOrderDetail(deliveryList);
+
+		return super.ok(message.getMessage("SUCC_0004"));
+	}
+	
+	/**
+	 * 출고금지상품관리 화면
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	@GetMapping("/ban/goods/form")
+	@ResponseBody
+	public ModelAndView bangoodsListForm() throws Exception {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList());
+		// 출고처 목록
+		DeliveryLoc deliLoc = new DeliveryLoc(); 
+		mav.addObject("getDeliveryLocList", rendererService.getDeliveryLocList(deliLoc));
+		mav.setViewName("delivery/BangoodsListForm");
+
+		return mav;
+	}
+	
+	/**
+	 * 출고금지상품관리 화면 - 출고금지상품목록
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	@PostMapping("/bangoods/list")
+	@ResponseBody
+	public Collection<Delivery> getBangoodsList(@RequestBody Delivery delivery) throws Exception {
+		Collection<Delivery> dataList = deliveryService.getBangoodsList(delivery);
+		return dataList;
+	}	
+	
+	/**
+	 * 출고금지상품관리 화면 - 출고금지상품 삭제
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	@PostMapping("/bangoods/delete")
+	@ResponseBody
+	public GagaResponse deleteBangoods(@RequestBody Collection<Delivery> deliveryList) throws Exception {
+		deliveryService.deleteBangoods(deliveryList);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+	
+	/**
+	 * 출고금지상품관리 화면 - 출고금지상품 등록 화면(팝업)
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	@GetMapping("/bangoods/regist/form")
+	@ResponseBody
+	public ModelAndView registBangoodsForm() throws Exception {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList());
+		// 출고처 목록
+		DeliveryLoc deliLoc = new DeliveryLoc();
+		mav.addObject("getDeliveryLocList", rendererService.getDeliveryLocList(deliLoc));
+		// 상품상태
+		mav.addObject("goodsStatList", rendererService.getAvailCommonCodeList("G008"));
+
+		mav.setViewName("delivery/BanGoodsRegistForm");
+
+		return mav;
+	}	
+
+	/**
+	 * 출고금지상품관리 화면 - 출고금지상품 등록 화면(팝업) - 출고금지상품 등록 대상목록
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	@PostMapping("/bangoods/regist/list")
+	@ResponseBody
+	public Collection<Delivery> getBangoodsRegistList(@RequestBody Delivery delivery) throws Exception {
+		Collection<Delivery> dataList = deliveryService.getBangoodsRegistList(delivery);
+		return dataList;
+	}
+
+	/**
+	 * 출고금지상품관리 화면 - 출고금지상품 등록 화면(팝업) - 출고금지상품 등록
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	@PostMapping("/bangoods/regist/save")
+	@ResponseBody
+	public GagaResponse createBangoods(@RequestBody Collection<Delivery> deliveryList) throws Exception {
+		deliveryService.createBangoods(deliveryList);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+	
+}

+ 475 - 0
style24.admin/src/main/java/com/style24/admin/biz/web/TsaPosController.java

@@ -0,0 +1,475 @@
+package com.style24.admin.biz.web;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.core.io.InputStreamResource;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponse;
+import com.gagaframework.web.util.GagaDateUtil;
+import com.gagaframework.web.util.GagaFileUtil;
+
+import com.style24.persistence.domain.CommonCode;
+//import com.style24.admin.biz.persistence.domain.TsaDeliveryAssign;
+import com.style24.persistence.domain.DeliveryLoc;
+
+import com.style24.persistence.domain.Delivery;
+import com.style24.persistence.domain.Pos;
+
+import com.style24.admin.biz.service.TsaDeliveryService;
+import com.style24.admin.biz.service.TsaPosService;
+import com.style24.admin.biz.service.TsaRendererService;
+//import com.style24.admin.biz.service.TsaStatisticsService;
+
+import com.style24.admin.support.controller.TsaBaseController;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.admin.support.security.session.TsaSession;
+
+/**
+ * 매장 Controller
+ * 
+ * @author moon
+ * @since 2020. 11. 13
+ */
+@Controller
+@RequestMapping("/pos")
+@Slf4j
+public class TsaPosController extends TsaBaseController {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private TsaPosService posService;
+
+	@Autowired
+	private TsaDeliveryService deliveryService;
+
+	@Autowired
+	private TsaRendererService rendererService;
+
+	//@Autowired
+	//private TsaStatisticsService statisticsService;
+
+	/**
+	 * 매장POS 로그인 처리
+	 * 
+	 * @param sellStoreCd - 매장코드
+	 * @param session - HttpSession
+	 * @return String - 포스메인화면이동
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	@GetMapping("/login")
+	public String posLogin(@RequestParam("delvLocCd") String delvLocCd, HttpSession session) {
+		String returnUrl = "forward:/pos/main";
+		if (TsaSession.isStoreLogin()) {
+			// 로그인 정보와 다른 매장코드로 접근시 기존 로그인 세션 삭제
+			log.info("delvLocCd {}", delvLocCd);
+			log.info("TsaSession.getPosInfo() {}", TsaSession.getPosInfo());
+			if (!delvLocCd.equals(TsaSession.getPosInfo().getDelvLocCd())) {
+				session.removeAttribute("sessionPosInfo");
+			}
+		}
+
+		Pos posParam = new Pos();
+		posParam.setDelvLocCd(delvLocCd);
+		Pos posInfo = posService.getStoreLoginInfo(posParam);
+
+		if (posInfo == null) {
+			log.debug(String.format("StoreCode={} was not found!", delvLocCd));
+			throw new UsernameNotFoundException(message.getMessage("LOGN_0001"));
+		}
+		// 세션 설정
+		session.setAttribute("sessionPosInfo", posInfo);
+
+		log.info("posInfo{}", posInfo);
+
+		return returnUrl;
+	}
+
+	/**
+	 * 매장POS 메인
+	 * 
+	 * @return ModelAndView
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	@GetMapping("/main")
+	public ModelAndView posMain() {
+		ModelAndView mav = new ModelAndView();
+		mav.addObject("delvLocNm", TsaSession.getPosInfo().getDelvLocNm());
+		mav.addObject("delvLocCd", TsaSession.getPosInfo().getDelvLocCd());
+
+		// 택배사명 목록
+		mav.addObject("shipCompanyList", rendererService.getShipCompanyList());
+
+		// 주문상세상태 
+		mav.addObject("orderDtlSateList", rendererService.getCommonCodeList("G013"));
+
+		mav.addObject("g017List", rendererService.getCommonCodeList("G017"));
+
+		mav.setViewName("pos/PosMainForm");
+		return mav;
+	}
+
+	/**
+	 * 출고대기목록 / 출고목록
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	@PostMapping("/wait/order/list")
+	@ResponseBody
+	public Collection<Pos> getPosWaitOrderList(@RequestBody Pos pos) {
+		pos.setDelvLocCd(TsaSession.getPosInfo().getDelvLocCd());
+		pos.setSupplyCompCd(TsaSession.getPosInfo().getSupplyCompCd());
+		return posService.getPosDeliveryList(pos);
+	}
+
+	/**
+	 * 출고목록
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	@PostMapping("/delivery/order/list")
+	@ResponseBody
+	public Collection<Pos> getPosDeliveryList(@RequestBody Pos pos) {
+		pos.setDelvLocCd(TsaSession.getPosInfo().getDelvLocCd());
+		pos.setSupplyCompCd(TsaSession.getPosInfo().getSupplyCompCd());
+		return posService.getPosDeliveryList(pos);
+	}
+
+	/**
+	 * 출고수락 / 출고거부 처리
+	 * 
+	 * @param pos - 매장정보
+	 * @return GagaResponse
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	@PostMapping("/delivery/assign/save")
+	@ResponseBody
+	public GagaResponse savePosDeliveryAssign(@RequestBody Pos pos) {
+		Delivery delivery = new Delivery();
+		delivery.setOrdNo(pos.getOrdNo());
+		delivery.setOrdDtlNo(pos.getOrdDtlNo());
+		delivery.setDelvLocCd(TsaSession.getPosInfo().getDelvLocCd());
+		delivery.setDelvArGb(pos.getDelvArGb());
+		delivery.setRejectReason(pos.getRejectReason());
+
+		String rtn = "";
+		if ("Y".equals(pos.getDelvArGb())) { //출고수락
+			//rtn = deliveryService.savePosDeliveryLocAssign(delivery);
+		} else {
+			//rtn = deliveryService.savePosDeliveryLocReject(delivery);
+		}
+		if ("S".equals(rtn)) {
+			return super.ok(message.getMessage("SUCC_0001"));
+		} else {
+			return super.ok("다른 출고처로 지정되었습니다.");
+		}
+	}
+
+	/**
+	 * 수락취소
+	 * 
+	 * @param pos - 매장정보
+	 * @return GagaResponse
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	@PostMapping("/delivery/assign/save/cancel")
+	@ResponseBody
+	public GagaResponse savePosDeliveryAssignCancel(@RequestBody Pos pos) {
+		Delivery delivery = new Delivery();
+		delivery.setOrdNo(pos.getOrdNo());
+		delivery.setOrdDtlNo(pos.getOrdDtlNo());
+		delivery.setDelvLocCd(TsaSession.getPosInfo().getDelvLocCd());
+		delivery.setDelvArGb(pos.getDelvArGb());
+		delivery.setRejectReason(pos.getRejectReason());
+
+		//deliveryService.savePosDeliveryLocRejectCancel(delivery);
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 정산내역
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	@PostMapping("/usac/list")
+	@ResponseBody
+	public Collection<Pos> getPosUsacList(@RequestBody Pos pos) {
+		pos.setDelvLocCd(TsaSession.getPosInfo().getDelvLocCd());
+		return posService.getPosUsacList(pos);
+	}
+
+	/**
+	 * 출고거부이력 목록
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	@PostMapping("/ban/delivery/list")
+	@ResponseBody
+	public Collection<Delivery> getPosBanDeliveryList(@RequestBody Pos pos) {
+		Delivery delivery = new Delivery();
+		delivery.setDelvLocCd(TsaSession.getPosInfo().getDelvLocCd());
+		delivery.setGoodsGb("goodsCd");
+		delivery.setSearchTxt(pos.getGoodsCd());
+		Collection<Delivery> rejectList = new ArrayList<Delivery>();
+		return rejectList; //deliveryService.getDeliveryAssignList(delivery);
+	}
+
+	/**
+	 * 출고수락목록 배송준비중
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	@PostMapping("/invoice/save")
+	@ResponseBody
+	public Collection<GagaMap> saveInvoice(@RequestBody Collection<Pos> posList) {
+		String delvLocCd = TsaSession.getPosInfo().getDelvLocCd();
+		Double delvFeeRate = TsaSession.getPosInfo().getDelvFeeRate();
+
+		Collection<GagaMap> resultList = new ArrayList<>();
+		Collection<Pos> dtlNoList = new ArrayList<Pos>();
+
+		for (Pos posParam : posList) {
+
+			// 세트상품일경우 주문상세번호 중복제거 
+			String chk = "N";
+			for (Pos param : dtlNoList) {
+				if (param.getOrdDtlNo() == posParam.getOrdDtlNo()) {
+					chk = "Y";
+				}
+			}
+			if (!"Y".equals(chk)) {
+				Delivery delivery = new Delivery();
+				delivery.setOrdNo(posParam.getOrdNo());
+				delivery.setOrdDtlNo(posParam.getOrdDtlNo());
+				// TODO: 매장코드는 id 생성후 매핑???
+				//delivery.setUpdNo(delvLocCd);
+				//delivery.setRegNo(delvLocCd);
+				delivery.setDelvFeeRate(delvFeeRate);
+
+
+				GagaMap result = null;//deliveryService.savePos(delivery);
+
+				dtlNoList.add(posParam);
+				resultList.add(result);
+			}
+
+		}
+		return resultList;
+	}
+
+	/**
+	 * 출고수락목록 송상등록
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	@PostMapping("/invoice/save/invoiceno")
+	@ResponseBody
+	public Collection<GagaMap> savePosInvoice(@RequestBody Collection<Pos> posList) {
+		String delvLocCd = TsaSession.getPosInfo().getDelvLocCd();
+		Double delvFeeRate = TsaSession.getPosInfo().getDelvFeeRate();
+
+		Collection<GagaMap> resultList = new ArrayList<>();
+		Collection<Pos> dtlNoList = new ArrayList<Pos>();
+
+		for (Pos posParam : posList) {
+
+			// 세트상품일경우 주문상세번호 중복제거 
+			String chk = "N";
+			for (Pos param : dtlNoList) {
+				if (param.getOrdDtlNo() == posParam.getOrdDtlNo()) {
+					chk = "Y";
+				}
+			}
+			if (!"Y".equals(chk)) {
+				Delivery delivery = new Delivery();
+				delivery.setOrdNo(posParam.getOrdNo());
+				delivery.setOrdDtlNo(posParam.getOrdDtlNo());
+				// TOTO : 추후 
+				//delivery.setUpdId(delvLocCd);
+				//delivery.setRegId(delvLocCd);
+				delivery.setDelvFeeRate(delvFeeRate);
+				delivery.setInvoiceNo(posParam.getInvoiceNo());
+				delivery.setShipCompCd(posParam.getShipCompCd());
+
+				GagaMap result = null; //deliveryService.savePosInvoice(delivery);
+
+				dtlNoList.add(posParam);
+				resultList.add(result);
+			}
+
+		}
+		return resultList;
+	}
+
+	/**
+	 * 엑셀다운로드
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */	
+	@GetMapping("/order/excel/list")
+	public ResponseEntity<InputStreamResource> downloadOrderExcelList(HttpServletRequest request, Pos pos) throws Exception {
+		if (StringUtils.isBlank(pos.getOrdDtlNos())) {
+			throw new IllegalStateException(message.getMessage("FAIL_1003"));
+		}
+		String excelfileName = "CNPlus 엑셀양식_" + GagaDateUtil.getTodayDateTime() + ".xlsx";
+		String excelFilenameWithPath = GagaFileUtil.getConcatenationPath(env.getProperty("download.path"), "excel", excelfileName);
+		log.info("pos {}", pos.getOrdDtlNos());
+		if (StringUtils.isNotBlank(pos.getOrdDtlNos())) {
+			pos.setOrdDtlNoArr(pos.getOrdDtlNos().split(","));
+		}
+		// 대용량엑셀파일다운로드는 이런 식으로 ...
+		posService.getOrderExcelList(pos, excelFilenameWithPath);
+
+		return GagaFileUtil.writeFile(request, excelFilenameWithPath);
+	}
+
+	/**
+	 * 매장 출고처지정 수략율 통계화면
+	 *
+	 * @author card007
+	 * @since 2020. 09. 16
+	 */
+	/*
+	@GetMapping("/delivery/assign/statistics/form")
+	public ModelAndView storeDeliveryAssignStatisticsForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList());
+
+		mav.setViewName("statistics/DeliveryAssignForm");
+
+		return mav;
+	}
+	*/
+
+	/**
+	 * 매장 출고처지정 수략율 통계 조회
+	 *
+	 * @param TsaDeliveryAssign - 출고처지정
+	 * @return Collection<TsaDeliveryAssign>
+	 * @author card007
+	 * @since 2020. 09. 16
+	 */
+	/*
+	@PostMapping("/delivery/assign/statistics/list")
+	@ResponseBody
+	public Collection<TsaDeliveryAssign> getStoreDeliveryAssignStatistics(@RequestBody TsaDeliveryAssign deliveryAssign) {
+		return statisticsService.getStoreDeliveryAssignStatistics(deliveryAssign);
+	}
+	*/
+	/**
+	 * 매장 출고처지정 상세 데이터 조회
+	 *
+	 * @param TsaDeliveryAssign - 출고처지정
+	 * @return Collection<TsaDeliveryAssign>
+	 * @author card007
+	 * @since 2020. 09. 16
+	 */
+	/*
+	@GetMapping("/delivery/assign/statistics/detail/{delvLocCd}")
+	@ResponseBody
+	public ModelAndView storeDeliveryAssignDetailForm(@PathVariable String delvLocCd, @RequestParam(value = "stDate", required = false) String stDate, @RequestParam(value = "edDate", required = false) String edDate, @RequestParam(value = "brandCd", required = false) String brandCd) {
+		ModelAndView mav = new ModelAndView();
+
+		TsaDeliveryAssign deliveryAssign = new TsaDeliveryAssign();
+		deliveryAssign.setDelvLocCd(delvLocCd);
+		deliveryAssign.setBrandCd(brandCd);
+		deliveryAssign.setStDate(stDate);
+		deliveryAssign.setEdDate(edDate);
+
+		Collection<TsaDeliveryAssign> dataList = statisticsService.getStoreDeliveryAssignDetailList(deliveryAssign);
+
+		mav.addObject("dataList", dataList);
+
+		// 출고거부사유
+		mav.addObject("noList", rendererService.getAvailCommonCodeList("G017"));
+
+		mav.setViewName("statistics/DeliveryAssignDetailPopupForm");
+
+		return mav;
+	}
+	*/
+
+	/**
+	 * 입점업체브랜드 목록
+	 *
+	 * @param supplyCompCd - 입점업체관리일련번호
+	 * @return
+	 * @author moon
+	 * @since 2019. 11. 13
+	 */
+	@GetMapping("/delivery/assign/statistics/brand/list/{supplyCompCd}")
+	@ResponseBody
+	public Collection<CommonCode> getSupplyCompanyBrandList(@PathVariable String supplyCompCd) {
+		return rendererService.getSupplyCompanyBrandList(supplyCompCd);
+	}
+
+	/**
+	 * 출고처 목록
+	 *
+	 * @param deliveryLoc - 출고처 정보
+	 * @return
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	@GetMapping("/delivery/assign/statistics/store/stock/link/list/{supplyCompCd}")
+	@ResponseBody
+	public Collection<CommonCode> getStoreStockLinkList(@PathVariable String supplyCompCd) {
+		DeliveryLoc deliveryLoc = new DeliveryLoc();
+		deliveryLoc.setSupplyCompCd(supplyCompCd);
+		deliveryLoc.setDelvLocClsf("21");
+		return rendererService.getDeliveryLocList(deliveryLoc);
+	}
+}

+ 91 - 0
style24.admin/src/main/java/com/style24/admin/biz/web/TsaShipController.java

@@ -0,0 +1,91 @@
+package com.style24.admin.biz.web;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.style24.admin.biz.service.TsaRendererService;
+import com.style24.admin.biz.service.TsaDeliveryService;
+import com.style24.admin.support.controller.TsaBaseController;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Delivery;
+import com.style24.persistence.domain.DeliveryLoc;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.rest.server.GagaResponse;
+
+/**
+ * 택배 Controller
+ *
+ * @author moon
+ * @since 2020. 11. 17
+ */
+@Controller
+@RequestMapping("/ship")
+@Slf4j
+public class TsaShipController extends TsaBaseController {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private TsaRendererService rendererService;
+
+	@Autowired
+	private TsaDeliveryService deliveryService;
+
+	@Value("${upload.default.target.path}")
+	private String uploadTargetPath;
+
+	/**
+	 * 배송/회수지시목록 화면
+	 * 
+	 * @return ModelAndView
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 11. 17
+	 */
+	@RequestMapping(value = "/dwdirect/list/form")
+	public ModelAndView deliveryWithdrawDirectiveListForm() throws Exception {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트구분
+		mav.addObject("siteCdList", rendererService.getAvailCommonCodeList("G000"));
+
+		mav.setViewName("delivery/DeliveryWithdrawDirectiveListForm");
+
+		return mav;
+	}
+
+	/**
+	 * 배송/회수지시 목록
+	 * 
+	 * @param dwDirective - 배송/회수지시 정보
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 11. 17
+	 */
+	@RequestMapping(value = "/dwdirect/list", method = RequestMethod.POST)
+	@ResponseBody
+	public Collection<Delivery> getDeliveryWithdrawDirectiveList(@RequestBody Delivery dwDirective) throws Exception {
+		return deliveryService.getDeliveryWithdrawDirectiveList(dwDirective);
+	}	
+}

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

@@ -0,0 +1,425 @@
+package com.style24.admin.biz.web;
+
+import java.util.Collection;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+//import org.apache.commons.collections.CollectionUtils;
+//import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.rest.server.GagaResponse;
+
+import com.style24.persistence.domain.Withdraw;
+import com.style24.admin.biz.service.TsaDeliveryService;
+import com.style24.admin.biz.service.TsaRendererService;
+import com.style24.admin.biz.service.TsaWithdrawService;
+import com.style24.admin.support.controller.TsaBaseController;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.message.TscMessageByLocale;
+
+/**
+ * 회수관리 Controller
+ * 
+ * @author moon
+ * @since 2020. 11. 16
+ */
+@Controller
+@RequestMapping("/withdraw")
+@Slf4j
+public class TsaWithdrawController extends TsaBaseController {
+
+	@Autowired
+	private TsaWithdrawService withdrawService;
+
+	@Autowired
+	private TsaRendererService rendererService;
+
+	@Autowired
+	private TsaDeliveryService deliveryService;
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	/**
+	 * 회수등록 화면
+	 * 
+	 * @return
+	 * @throws Exception
+	 * @author rladbwnd5
+	 * @since 2020. 02. 10
+	 */
+//	@RequestMapping(value = "/register/form")
+//	public ModelAndView withdrawRegisterForm() throws Exception {
+//		ModelAndView mav = new ModelAndView();
+//
+//		// 택배사명 목록
+//		mav.addObject("shipCompanyList", rendererService.getShipCompanyList());
+//
+//		// 회수요청사유
+//		mav.addObject("wdReqReasonList", rendererService.getAvailCommonCodeList("G688"));
+//
+//		mav.setViewName("withdraw/WithdrawRegisterTriForm");
+//
+//		return mav;
+//	}
+
+	/**
+	 * 회수등록 - 조회(송장번호용)
+	 * 
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author rladbwnd5
+	 * @since 2020. 02. 11
+	 */
+//	@PostMapping("/register/invoicelist")
+//	@ResponseBody
+//	public Collection<Withdraw> getWithdrawRegisterInvoiceList(@RequestBody Withdraw withdraw) {
+//		Collection<Withdraw> dataList = withdrawService.getWithdrawRegisterInvoiceList(withdraw);
+//		return dataList;
+//	}
+
+	/**
+	 * 회수등록 - 조회(상품코드용)
+	 * 
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author rladbwnd5
+	 * @since 2020. 02. 12
+	 */
+//	@PostMapping("/register/goodslist")
+//	@ResponseBody
+//	public Collection<Withdraw> getWithdrawRegisterGoodsList(@RequestBody Withdraw withdraw) {
+//
+//		log.debug("goodsCd = {} ", withdraw.getGoodsCd());
+//		Collection<Withdraw> dataList = withdrawService.getWithdrawRegisterGoodsList(withdraw);
+//		return dataList;
+//	}
+
+	/**
+	 * 회수등록 - 등록처리
+	 * 
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author rladbwnd5
+	 * @since 2020. 02. 12
+	 */
+//	@PostMapping("/register/create")
+//	@ResponseBody
+//	public GagaResponse createWithdrawInfo(@RequestBody Collection<Withdraw> withdrawList) {
+//		Withdraw withdraw = withdrawList.iterator().next();
+//		String goodsCd = withdraw.getGoodsCd();
+//		withdraw.setGoodsCd(null);
+//		//withdraw.setOrdNo(null);
+//		Collection<Withdraw> withdrawCount = withdrawService.getWithdrawRegisterList(withdraw);
+//		withdraw.setGoodsCd(goodsCd);
+//
+//		if (CollectionUtils.isEmpty(withdrawCount)) {
+//			withdrawService.createWithdrawInfo(withdrawList);
+//		} else {
+//			return super.error("이미 등록된 회수송장번호가 존재합니다.");
+//		}
+//
+//		log.debug("withdraw = {}", withdrawList);
+//
+//		return super.ok(message.getMessage("SUCC_0001"));
+//	}
+
+	/**
+	 * 회수송장번호 변경 팝업 화면
+	 * 
+	 * @return
+	 * @throws Exception
+	 * @author rladbwnd5
+	 * @since 2020. 02. 27
+	 */
+//	@RequestMapping(value = "/register/wdinvoicenochange/form")
+//	public ModelAndView wdInvoiceNoChangeForm() throws Exception {
+//		ModelAndView mav = new ModelAndView();
+//
+//		mav.setViewName("withdraw/WdInvoiceNoChange");
+//
+//		return mav;
+//	}
+
+	/**
+	 * 회수송장번호 변경
+	 * 
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author rladbwnd5
+	 * @since 2020. 02. 27
+	 */
+//	@PostMapping("/register/withdrawinvoiceno/update")
+//	@ResponseBody
+//	public GagaResponse updateRegisterWdInvoiceNo(@RequestBody Withdraw withdraw) {
+//		withdrawService.updateRegisterWdInvoiceNo(withdraw);
+//		return super.ok(message.getMessage("SUCC_0002"));
+//	}
+
+	/**
+	 * 환불관리 목록 화면
+	 * 
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	@RequestMapping(value = "/refund/form")
+	public ModelAndView withdrawRefundForm() throws Exception {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트구분
+		mav.addObject("siteCdList", rendererService.getAvailCommonCodeList("G000"));
+
+		mav.setViewName("withdraw/RefundRegisterListForm");
+
+		return mav;
+	}
+
+	/**
+	 * 환불관리 목록
+	 * 
+	 * @param  withdraw
+	 * @return Collection<Withdraw>
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	@PostMapping("/refund/list")
+	@ResponseBody
+	public Collection<Withdraw> getRefundList(@RequestBody Withdraw withdraw) {
+		return withdrawService.getRefundList(withdraw);
+	}
+
+	/**
+	 * 환불관리 회수 데이터 삭제처리
+	 * 
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	@PostMapping(value = "/refund/Withdraw/delete")
+	@ResponseBody
+	public GagaResponse deleteWithdrawInfo(@RequestBody Withdraw withdraw) {
+		withdrawService.deleteWithdrawInfo(withdraw);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
+	/**
+	 * 회수등록 팝업 화면
+	 * 
+	 * @param
+	 * @return 회수등록 팝업 화면
+	 * @throws Exception
+	 * @author rladbwnd5
+	 * @since 2020. 03. 03
+	 */
+//	@GetMapping("/register/popup/form")
+//	@ResponseBody
+//	public ModelAndView withdrawRegisterPopupForm(Withdraw withdraw) {
+//		ModelAndView mav = new ModelAndView();
+//
+//		mav.addObject("wdInvoiceNo", withdraw.getWdInvoiceNo());
+//
+//		mav.addObject("goodsCd", withdraw.getGoodsCd());
+//
+//		mav.addObject("sizeCd", withdraw.getSizeCd());
+//
+//		if (StringUtils.isNotBlank(withdraw.getOrdDtlNo().toString())) {
+//			mav.addObject("ordDtlNo", withdraw.getOrdDtlNo());
+//		}
+//
+//		// 주문상세 상태
+//		mav.addObject("ordDtlStatList", rendererService.getAvailCommonCodeList("G013"));
+//
+//		mav.setViewName("withdraw/WithdrawRegisterPopupForm");
+//		return mav;
+//	}
+
+
+	/**
+	 * 회수등록 팝업 목록
+	 * 
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author rladbwnd5
+	 * @since 2020. 03. 03
+	 */
+//	@PostMapping("/register/popup/list")
+//	@ResponseBody
+//	public Collection<Withdraw> getWithdrawRegisterPopupList(@RequestBody Withdraw withdraw) {
+//		Collection<Withdraw> dataList = withdrawService.getWithdrawRegisterPopupList(withdraw);
+//		return dataList;
+//	}
+
+
+	/**
+	 * 회수등록팝업 주문매핑(송장번호 수정)
+	 * 
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author rladbwnd5
+	 * @since 2020. 03. 03
+	 */
+//	@PostMapping("/register/popup/wdinvoiceno/update")
+//	@ResponseBody
+//	public GagaResponse updateOrderChangeWdInvoiceNo(@RequestBody Withdraw withdraw) {
+//		withdrawService.updateOrderChangeWdInvoiceNo(withdraw);
+//		return super.ok(message.getMessage("SUCC_0002"));
+//	}
+
+	/**
+	 * 회수등록팝업 주문매핑(주문상세일련번호 수정)
+	 * 
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author rladbwnd5
+	 * @since 2020. 03. 03
+	 */
+//	@PostMapping("/register/popup/orddtlno/update")
+//	@ResponseBody
+//	public GagaResponse updateWithdrawOrdDtlNo(@RequestBody Withdraw withdraw) {
+//		withdrawService.updateWithdrawOrdDtlNo(withdraw);
+//		return super.ok(message.getMessage("SUCC_0002"));
+//	}
+
+	/**
+	 * 환불관리 상세 화면
+	 * 
+	 * @param ordNo
+	 * @return 회수 상세 화면
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	@GetMapping("/refund/detail/form")
+	@ResponseBody
+	public ModelAndView refundDetailForm(Withdraw withdraw) {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("ordChgSq", withdraw.getOrdChgSq());
+
+		// 남은 상품 정보
+		mav.addObject("remainGoodsInfo", withdrawService.getRemainGoodsInfo(withdraw));
+
+		// 남은 상품 목록
+		mav.addObject("remainGoodsList", withdrawService.getWithdrawRemainOrderDetailList(withdraw));
+
+		// 장바구니 쿠폰 정보
+		mav.addObject("couponInfo", withdrawService.getCouponInfo(withdraw));
+
+		// 주문전체 금액
+		mav.addObject("orderDetailSumAmt", withdrawService.getOrderDetailSumAmt(withdraw.getOrdNo().toString()));
+
+		//
+		mav.addObject("sumQty", withdrawService.getSumChgQtyWdQty(withdraw));
+
+		// TODO: 아래 확인후 구현 (.. ) ( ..)
+		//mav.addObject("ordChgCnt", deliveryService.getOrdChgCnt(withdraw.getOrdNo()));
+		mav.setViewName("withdraw/WithdrawDetailForm");
+		return mav;
+	}
+
+	/**
+	 * 환불관리상세 정보
+	 * 
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	@PostMapping("/detail/list")
+	@ResponseBody
+	public Collection<Withdraw> getRefundDetailList(@RequestBody Withdraw withdraw) {
+		Collection<Withdraw> dataList = withdrawService.getRefundDetailList(withdraw);
+		return dataList;
+	}
+
+	/**
+	 * 환불관리상세 - 회수처리
+	 * 
+	 * @param withdraw
+	 * @return GagaResponse
+	 * @author moon
+	 * @since 2020. 11. 16
+	 */
+	@PostMapping("/detail/confirm")
+	@ResponseBody
+	public GagaResponse refundDetailConfirm(@RequestBody Withdraw withdraw) {
+		withdrawService.refundDetailConfirm(withdraw);
+		return super.ok(message.getMessage("SUCC_0004"));
+	}
+
+	/**
+	 * 회수송장전송목록 화면
+	 * 
+	 * @return ModelAndView
+	 * @throws Exception
+	 * @author Daehyoung
+	 * @since 2020. 02. 25
+	 */
+//	@RequestMapping(value = "/invoice/send/list/form")
+//	public ModelAndView invoiceSendListForm() throws Exception {
+//		ModelAndView mav = new ModelAndView();
+//
+//		// 사이트구분
+//		mav.addObject("siteCdList", rendererService.getAvailCommonCodeList("G000"));
+//
+//		mav.setViewName("withdraw/InvoiceSendListForm");
+//
+//		return mav;
+//	}
+
+	/**
+	 * 환불완료 화면
+	 * 
+	 * @return ModelAndView
+	 * @throws Exception
+	 * @author yujung
+	 * @since 2020. 05. 29
+	 */
+//	@RequestMapping(value = "/refundcomplete/list/form")
+//	public ModelAndView refundCompleteListListForm() throws Exception {
+//		ModelAndView mav = new ModelAndView();
+//
+//		mav.setViewName("withdraw/RefundCompleteListForm");
+//
+//		return mav;
+//	}
+
+	/**
+	 * 환불완료 목록
+	 * 
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author yujung
+	 * @since 2020. 05. 29
+	 */
+//	@PostMapping("/refundcomplete/list")
+//	@ResponseBody
+//	public Collection<Withdraw> getRefundCompleteList(@RequestBody Withdraw withdraw) {
+//		Collection<Withdraw> dataList = withdrawService.getRefundCompleteList(withdraw);
+//		return dataList;
+//	}
+
+}

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

@@ -47,6 +47,22 @@ public class TsaConstants {
 			this.value = value;
 		}
 
+		public String value() {
+			return value;
+		}
+	}
+	
+	// 몰구분
+	public enum MallGb {
+		SELFMALL("G011_10"),			// 자사몰
+		EXTMALL("G011_20");				// 제휴몰몰
+
+		private String value;
+
+		private MallGb(String value) {
+			this.value = value;
+		}
+
 		public String value() {
 			return value;
 		}

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

@@ -0,0 +1,300 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TsaPageRequest;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 Domain
+ *
+ * @author moon
+ * @since 2020. 11. 05
+ */
+@SuppressWarnings("serial")
+@Data
+public class Delivery extends TscBaseDomain {
+
+	
+	/* 아래로 작성 (.. ) ( ..) */
+	
+	private String brandCd;
+	private String brandKnm;
+	private String delvLocNm;
+	private String imgType;
+	private String imgPath1;
+	private String goodsNm;
+	private String goodsCd;
+	private String sizeCd;
+	private String goodsStat;
+	private String delvBanStdt;
+	private String delvBanEddt;   
+	private int    delvBanGoodsSq;
+	private String GoodsStatNm;
+	private String supplyCompCd;
+	private String searchTxt;
+
+	
+	/* 위로  작성  ('' ) ( '')*/
+	
+	
+	
+	
+	/* 아래는 참고용!!*/
+	private Long ordNo;
+	private Long ordDtlNo;
+	private String siteCd;
+	private String siteNm;
+	private String sellStoreCd;
+	private String sellStoreNm;
+	private String ordDt;
+	private String payDt;
+	private String mallGb;
+	private String mallGbNm;
+	private String ordStat;
+	private String custNo;
+	private String orderNm;
+	private String orderEmail;
+	private String recipNm;
+	private String colorKnm;
+
+	private Integer ordQty;
+	private Integer cnclRtnQty;
+	private Integer saleQty;
+	private Integer saleAmt;
+	private String ordDtlStat;
+	private String ordDtlStatNm;
+	private String delvLocCd;
+
+	private String sbagEncloseYn;
+	private String invoiceNo;
+	private String soldoutYn;
+	private String dstrbtNote;
+	private String ordExchGbNm;
+	private String extmallOrderId;
+	private String extmallOrdDtlNo;
+	private String supplyCompNm;
+	private String supplyGoodsCd;
+	private String delvMemo;
+	private String ordExchGb;
+	private String frontGb;
+	private String termGb;
+	private String orderPhnno;
+	private Integer delvDelayDays;
+	private String stDate;
+	private String edDate;
+	private Long ordChgSq;
+	private String chgGb;
+	private String chgReason;
+	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 shipCompCd;
+	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 colorCd;
+	private String recipTelno;
+	private String recipPhnno;
+	private String recipPostNo;
+	private String recipBaseAddr;
+	private String recipDtlAddr;
+	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 String delvLocClsf;
+	private Integer assignQty;
+	private String delvArId;
+	private String rejectReason;
+	private String chulgoQty;
+
+	private String ordExchGbYn;
+	private String payStDate;
+	private String payEdDate;
+
+	private String delYn;
+
+
+	private String goodsStatNm;
+
+	private String stDt;
+	private String edDt;
+
+	private String goodsGb;
+
+	private String colorGrpFile;
+
+	private String custDelvAddrSq;
+	private String delvAddrNm;
+	private String defaultYn;
+	private String recipEmail;
+	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 Integer itemPrice;
+
+	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 condition;			// 키워드 검색
+	private String[] conditions = null;
+	private String search;
+	private String regNm;
+
+	private String invoiceGb;
+	private String apiGb;
+	private String resultCd;
+	private String custOrdNo;
+	private String hstMemo;
+
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiOrdDtlStat = null;
+}

+ 251 - 0
style24.admin/src/main/java/com/style24/persistence/domain/Withdraw.java

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

+ 402 - 0
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaDelivery.xml

@@ -0,0 +1,402 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaDeliveryDao">
+
+	<!-- 배송목록 -->
+	<select id="getDeliveryList" parameterType="Delivery" resultType="Delivery">
+		/* TsaDelivery.getDeliveryList */
+		SELECT  CASE WHEN ORD_DTL_STAT IN('50','55','60')
+		        THEN NULL
+		        ELSE FN_GET_BIZDAYS(DECODE(ORD_EXCH_GB,'O',TO_CHAR(A.PAY_DT,'YYYYMMDD'),TO_CHAR(WD_EDDT,'YYYYMMDD')),TO_CHAR(SYSDATE,'YYYYMMDD')) - 1
+		        END AS DELV_DELAY_DAYS
+		      , ORD_NO
+		      , ORD_DTL_NO
+		      , SITE_CD
+		      , FN_GET_CODE_NM('G000', SITE_CD) AS SITE_NM
+		      , SELL_STORE_CD
+		      , (
+		          SELECT SELL_STORE_NM
+		          FROM   TB_SELL_STORE
+		          WHERE  SUPPLY_COMP_CD = A.SUPPLY_COMP_CD
+		          AND    SELL_STORE_CD = A.SELL_STORE_CD
+		         ) AS SELL_STORE_NM
+		      , ORD_DT
+		      , PAY_DT
+		      , MALL_GB
+		      , FN_GET_CODE_NM('G011', MALL_GB) AS MALL_GB_NM
+		      , CUST_NO
+		      , ORDER_NM
+		      , RECIP_NM
+		      , GOODS_CD
+		      , GOODS_NM
+		      , (
+		         SELECT COLOR_KNM
+		         FROM TB_COLOR
+		         WHERE SUPPLY_COMP_CD = A.SUPPLY_COMP_CD
+		         AND COLOR_CD = A.COLOR_CD AND BRAND_CD = A.BRAND_CD
+		         ) AS COLOR_KNM
+		      , SIZE_CD
+		      , SUPPLY_GOODS_CD
+		      , ORD_QTY
+		      , CNCL_RTN_QTY
+		      , SALE_QTY
+		      , SALE_AMT
+		      , ORD_DTL_STAT
+		      , FN_GET_CODE_NM('G013', ORD_DTL_STAT) AS ORD_DTL_STAT_NM
+		      , A.DELV_LOC_CD
+		      , B.DELV_LOC_NM
+		      , SBAG_ENCLOSE_YN
+		      , INVOICE_NO
+		      , SOLDOUT_YN
+		      , DSTRBT_NOTE
+		      , DECODE(ORD_EXCH_GB, 'E', 'Y', '') AS ORD_EXCH_GB
+		      , EXTMALL_ORDER_ID
+		      , EXTMALL_ORD_DTL_NO
+		      , AGENT_ORDER_ID
+		      , A.SUPPLY_COMP_CD
+		      , (
+		         SELECT SUPPLY_COMP_NM
+		         FROM TB_SUPPLY_COMPANY
+		         WHERE SUPPLY_COMP_CD = A.SUPPLY_COMP_CD
+		         ) AS SUPPLY_COMP_NM
+		      , DELV_MEMO
+		      , A.SHIP_COMP_CD
+		      , A.DELV_STDT
+		      , A.REAL_ORD_AMT
+		      , A.EXTMALL_NM
+		      , A.ORDER_PHNNO
+		      , A.ORDER_TELNO
+		      , A.ORDER_EMAIL
+		      , B.DELV_LOC_CLSF
+		FROM
+		(
+		 SELECT A.ORD_NO
+		      , ODI.ORD_DTL_NO
+		      , A.SITE_CD
+		      , B.SELL_STORE_CD
+		      , A.ORD_DT
+		      , A.PAY_DT
+		      , A.MALL_GB
+		      , A.CUST_NO
+		      , A.ORDER_NM
+		      , D.RECIP_NM
+		      , ODI.ITEM_CD     AS GOODS_CD
+		      , C.GOODS_NM
+		      , C.COLOR_CD
+		      , ODI.SIZE_CD
+		      , C.SUPPLY_GOODS_CD
+		      , B.ORD_QTY
+		      , B.CNCL_RTN_QTY
+		      , (B.ORD_QTY - B.CNCL_RTN_QTY) AS SALE_QTY
+		      , (B.ORD_AMT - B.CNCL_RTN_AMT) AS SALE_AMT
+		      , B.ORD_DTL_STAT
+		      , B.DELV_LOC_CD
+		      , A.SBAG_ENCLOSE_YN
+		      , B.INVOICE_NO
+		      , B.SOLDOUT_YN
+		      , B.DSTRBT_NOTE
+		      , B.ORD_EXCH_GB
+		      , B.EXTMALL_ORDER_ID
+		      , B.EXTMALL_ORD_DTL_NO
+		      , B.AGENT_ORDER_ID
+		      , B.SUPPLY_COMP_CD
+		      , D.DELV_MEMO
+		      , B.SHIP_COMP_CD
+		      , B.DELV_STDT
+		      , B.REAL_ORD_AMT
+		      , NVL((SELECT MAX(EXTMALL_NM)
+		              FROM TB_EXTMALL WHERE VENDOR_ID = B.VENDOR_ID
+		              AND  EXTMALL_ID = B.EXTMALL_ID), 'PASTELmall'
+		            )  AS EXTMALL_NM
+		      , C.BRAND_CD
+		      , (SELECT MAX(WD_EDDT) FROM TB_ORDER_CHANGE CH, TB_ORDER_CHANGE_DETAIL CHD WHERE CH.ORD_CHG_SQ = CHD.ORD_CHG_SQ AND CHD.ORD_DTL_NO =  B.ORG_ORD_DTL_NO) AS WD_EDDT
+		      , A.ORDER_PHNNO
+		      , A.ORDER_TELNO
+		      , A.ORDER_EMAIL
+		FROM  TB_ORDER A
+			, TB_ORDER_DETAIL_ITEM ODI
+		    , TB_ORDER_DETAIL B
+		    , TB_GOODS C
+		    , TB_DELIVERY_ADDR D
+		WHERE A.ORD_NO = B.ORD_NO
+		AND   B.ORD_DTL_NO = ODI.ORD_DTL_NO
+		AND   ODI.ITEM_CD = C.GOODS_CD
+		AND   B.DELV_ADDR_SQ = D.DELV_ADDR_SQ
+		<if test='ordDtlNo != null and ordDtlNo != ""'>
+		AND   ODI.ORD_DTL_NO = #{ordDtlNo}
+		</if>
+		<if test='termGb == "ordDt"'>
+		    <if test='stDate != null and stDate != ""'>
+		AND   A.REG_DT >= TO_DATE(#{stDate}, 'YYYY/MM/DD HH24 MI SS')
+		    </if>
+		    <if test='edDate != null and edDate != ""'>
+		AND   A.REG_DT <![CDATA[<]]> TO_DATE(#{edDate}, 'YYYY/MM/DD HH24 MI SS') + 1
+		    </if>
+		</if>
+		<if test='termGb == "delvDt"'>
+		    <if test='stDate != null and stDate != ""'>
+		AND   B.DELV_EDDT >= TO_DATE(#{stDate}, 'YYYY/MM/DD HH24 MI SS')
+		    </if>
+		    <if test='edDate != null and edDate != ""'>
+		AND   B.DELV_EDDT <![CDATA[<]]> TO_DATE(#{edDate}, 'YYYY/MM/DD HH24 MI SS') + 1
+		    </if>
+		</if>
+		<if test='termGb == "delvStDt"'>
+		    <if test='stDate != null and stDate != ""'>
+		AND   B.DELV_STDT >= TO_DATE(#{stDate}, 'YYYY/MM/DD HH24 MI SS')
+		    </if>
+		    <if test='edDate != null and edDate != ""'>
+		AND   B.DELV_STDT <![CDATA[<]]> TO_DATE(#{edDate}, 'YYYY/MM/DD HH24 MI SS') + 1
+		    </if>
+		</if>
+		<if test='orderNm != null and orderNm != ""'>
+		AND   A.ORDER_NM = #{orderNm}
+		</if>
+		<if test='recipNm != null and recipNm != ""'>
+		AND   D.RECIP_NM = #{recipNm}
+		</if>
+		<if test='orderPhnno != null and orderPhnno != ""'>
+		AND   REPLACE(A.ORDER_PHNNO, '-', '') = REPLACE(#{orderPhnno}, '-', '')
+		</if>
+		<if test='conditions != null and conditions != "" '>
+		AND (
+		<choose>
+		     <when test='search != null and search == "searchOrdNo"'>
+		         <foreach collection="conditions" item="item" index="index" separator="or">
+		      REGEXP_LIKE(UPPER(A.ORD_NO), UPPER(#{item}))
+		         </foreach>
+		     </when>
+		     <when test='search != null and search == "searchExtmallOrderId"'>
+		         <foreach collection="conditions" item="item" index="index" separator="or">
+		      REGEXP_LIKE(UPPER(B.EXTMALL_ORDER_ID), UPPER(#{item}))
+		         </foreach>
+		      </when>
+		</choose>
+		      )
+		</if>
+		<if test='invoiceNo != null and invoiceNo != ""'>
+		AND   B.INVOICE_NO = #{invoiceNo}
+		</if>
+		<if test='goodsCd != null and goodsCd != ""'>
+		AND   C.GOODS_CD = #{goodsCd}
+		</if>
+		<if test='delvLocCd != null and delvLocCd != ""'>
+		AND   B.DELV_LOC_CD = #{delvLocCd}
+		</if>
+		<if test='frontGb != null and frontGb != ""'>
+		AND   A.FRONT_GB = #{frontGb}
+		</if>
+		<if test='siteCd != null and siteCd != ""'>
+		AND  A.SITE_CD = #{siteCd}
+		</if>
+		<if test='soldoutYn != null and soldoutYn != ""'>
+		AND  B.SOLDOUT_YN = #{soldoutYn}
+		</if>
+		<if test='mallGb != null and mallGb != ""'>
+		AND  A.MALL_GB = #{mallGb}
+		</if>
+		<if test="multiOrdDtlStat != null and multiOrdDtlStat !=''">
+		AND  B.ORD_DTL_STAT IN
+		    <foreach collection="multiOrdDtlStat" item="item" index="index"  open="(" close=")" separator=",">
+		     #{item}
+		    </foreach>
+		</if>
+		<if test='supplyCompCd != null and supplyCompCd != ""'>
+		AND  B.SUPPLY_COMP_CD = #{supplyCompCd}
+		</if>
+		<if test='vendorId != null and vendorId != ""'>
+		AND  B.VENDOR_ID = #{vendorId}
+		</if>
+		<if test='extmallId != null and extmallId != ""'>
+		AND  B.EXTMALL_ID = #{extmallId}
+		</if>
+		<choose>
+			<when test='soldoutYn == "Y"'>
+				AND B.ORD_DTL_STAT = '99'
+			</when>
+			<otherwise>
+				<choose>
+					<when test='delvDelayDays != null and delvDelayDays != ""'>
+						AND B.ORD_DTL_STAT IN ('20', '30', '34', '35', '40')
+					</when>
+					<when test='multiOrdDtlStat == null or multiOrdDtlStat == ""'>
+						AND B.ORD_DTL_STAT != '00'
+					</when>
+				</choose>
+			</otherwise>
+		</choose>
+		) A
+		, TB_DELIVERY_LOC B
+		WHERE A.DELV_LOC_CD = B.DELV_LOC_CD (+)
+		AND A.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD(+)
+		<if test='delvDelayDays != null and delvDelayDays != ""'>
+		AND   CASE WHEN ORD_DTL_STAT IN('50','55','60') THEN NULL
+		      ELSE FN_GET_BIZDAYS(DECODE(ORD_EXCH_GB,'O',TO_CHAR(A.PAY_DT,'YYYYMMDD'),TO_CHAR(WD_EDDT,'YYYYMMDD')),TO_CHAR(SYSDATE,'YYYYMMDD')) END >= #{delvDelayDays}
+		</if>
+		<if test='delvLocClsf != null and delvLocClsf != ""'>
+		AND   B.DELV_LOC_CLSF = #{delvLocClsf}
+		</if>
+		ORDER BY A.ORD_NO DESC, A.ORD_DTL_NO
+		
+	</select>
+
+	<!-- 주문상세 -->
+	<select id="getOrderDetail" parameterType="Delivery" resultType="Delivery">
+		/* TsaDelivery.getOrderDetail */
+		SELECT '1' FROM DUAL
+	</select>
+
+	<!-- 주문상세 상태 값 변경 -->
+	<update id="updateOrderDetailStat" parameterType="Delivery" >
+		/* TsaDelivery.updateOrderDetailStat */
+		SELECT '1' FROM DUAL
+	</update>
+	
+	<!-- 주문 상세 이력 등록-->
+	<update id="createOrderDetailHst" parameterType="Delivery" >
+		/* TsaDelivery.createOrderDetailHst */
+		SELECT '1' FROM DUAL
+	</update>
+	
+	<!-- 출고금지상품 목록 -->
+	<select id="getBangoodsList" parameterType="Delivery" resultType="Delivery">
+		/* TsaDelivery.getBangoodsList */
+		SELECT DBG.DEL_YN
+			, G.BRAND_CD
+			, B.BRAND_KNM
+			, DL.DELV_LOC_NM
+			, GI.IMG_TYPE
+			, GI.IMG_PATH1
+			, G.GOODS_NM
+			, DBG.GOODS_CD
+			, DBG.SIZE_CD
+			, FN_GET_CODE_NM('G008', G.GOODS_STAT) AS GOODS_STAT
+			, DBG.DELV_BAN_STDT 
+			, DBG.DELV_BAN_EDDT	
+			, DBG.DELV_BAN_GOODS_SQ
+		FROM  TB_DELIVERY_BAN_GOODS DBG
+		INNER JOIN TB_DELIVERY_LOC DL   ON DBG.DELV_LOC_CD = DL.DELV_LOC_CD
+		INNER JOIN TB_GOODS        G    ON DBG.GOODS_CD = G.GOODS_CD
+		INNER JOIN TB_BRAND        B    ON G.BRAND_CD = B.BRAND_CD
+		LEFT OUTER JOIN TB_GOODS_IMG GI ON G.GOODS_CD = GI.GOODS_CD
+		WHERE 1=1
+		<if test='supplyCompCd != null and supplyCompCd != ""'>
+			AND G.SUPPLY_COMP_CD = #{supplyCompCd}
+		</if>
+		<if test='brandCd != null and brandCd != ""'>
+			AND G.BRAND_CD = #{brandCd}
+		</if>
+		<if test='searchTxt != null and searchTxt != ""'>
+			<if test='goodsGb == "goodsCd"'>
+				AND G.GOODS_CD LIKE UPPER(#{searchTxt} || '%')
+			</if>
+			<if test='goodsGb == "goodsNm"'>
+				AND G.GOODS_NM LIKE #{searchTxt} || '%'
+			</if>
+		</if>
+		<if test='delvLocCd != null and delvLocCd != ""'>
+			AND DBG.DELV_LOC_CD = #{delvLocCd}
+		</if>
+		<if test='delYn != null and delYn != ""'>
+			AND DBG.DEL_YN = #{delYn}
+		</if>
+		<if test="stDate != null and stDate != '' and edDate != null and edDate != ''">
+			AND DBG.REG_DT BETWEEN STR_TO_DATE(CONCAT(#{stDate},' 000000'),'%Y-%m-%d %H%i%S') AND STR_TO_DATE(CONCAT(#{edDate},' 235959'), '%Y-%m-%d %H%i%S')
+		</if>
+	</select>
+
+	<!-- 출고금지상품 삭제 -->
+	<update id="deleteBangoods" parameterType="Delivery" >
+		/* TsaDelivery.deleteBangoods */
+       UPDATE TB_DELIVERY_BAN_GOODS
+		  SET DEL_YN = 'Y'
+			, UPD_NO = #{updNo}
+			, UPD_DT = NOW()
+		WHERE DELV_BAN_GOODS_SQ = #{delvBanGoodsSq}
+		  AND GOODS_CD          = #{goodsCd}
+		  AND SIZE_CD           = #{sizeCd}
+	</update>
+
+	<!-- 출고금지상품 등록 대상목록 -->
+	<select id="getBangoodsRegistList" parameterType="Delivery" resultType="Delivery">
+		/* TsaDelivery.getBangoodsRegistList */
+		SELECT 
+		      G.BRAND_CD
+			, B.BRAND_KNM
+			, GI.IMG_PATH1
+			, G.GOODS_NM
+			, G.GOODS_CD
+			, S.OPT_CD2 AS SIZE_CD
+			, G.GOODS_STAT
+			, (SELECT CD_NM FROM TB_COMMON_CODE WHERE CD_GB = 'G008' AND CD =G.GOODS_STAT) AS GOODS_STAT_NM
+		FROM  TB_GOODS G
+		INNER JOIN TB_BRAND B  ON G.BRAND_CD = B.BRAND_CD
+		INNER JOIN TB_OPTION S ON G.GOODS_CD = S.GOODS_CD
+		LEFT OUTER JOIN TB_GOODS_IMG GI ON G.GOODS_CD = GI.GOODS_CD		
+		WHERE 1=1
+		<if test='supplyCompCd != null and supplyCompCd != ""'>
+			AND G.SUPPLY_COMP_CD = #{supplyCompCd}
+		</if>
+		<if test='brandCd != null and brandCd != ""'>
+			AND G.BRAND_CD = #{brandCd}
+		</if>
+		<if test='searchTxt != null and searchTxt != ""'>
+			<if test='goodsGb == "goodsCd"'>
+				AND G.GOODS_CD LIKE UPPER(#{searchTxt} || '%')
+			</if>
+			<if test='goodsGb == "goodsNm"'>
+				AND G.GOODS_NM LIKE #{searchTxt} || '%'
+			</if>
+		</if>
+		<if test='goodsStat != null and goodsStat != ""'>
+			AND G.GOODS_STAT = #{goodsStat}
+		</if>
+	</select>
+
+	<!-- 출고금지상품 카운트 -->
+	<select id="getBangoodsListCnt" parameterType="Delivery"	resultType="int">
+		/* TsaDelivery.getBangoodsListCnt */
+		SELECT COUNT(*)
+		  FROM TB_DELIVERY_BAN_GOODS
+		 WHERE DELV_LOC_CD = #{delvLocCd}
+		   AND GOODS_CD    = #{goodsCd}
+		   AND SIZE_CD     = #{sizeCd}
+		   AND DEL_YN      = 'N'
+	</select>
+
+	<!-- 출고금지상품 등록 -->
+	<insert id="createBangoods" parameterType="Delivery" >
+		/* TsaDelivery.createBangoods */
+		INSERT INTO TB_DELIVERY_BAN_GOODS (
+			  DELV_LOC_CD
+			, GOODS_CD
+			, SIZE_CD
+			, DELV_BAN_STDT
+			, DELV_BAN_EDDT
+			, DEL_YN
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+		)
+		VALUES (
+			  #{delvLocCd}
+			, #{goodsCd}
+			, #{sizeCd}
+			, replace(#{delvBanStdt},'-','')
+			, replace(#{delvBanEddt},'-','')
+			, 'N'
+			, #{regNo}
+			, NOW()
+			, #{updNo}
+			, NOW()
+		)
+	</insert>
+
+	<!-- 배송/회수지시 목록 -->
+	<select id="getDeliveryWithdrawDirectiveList" parameterType="Delivery" resultType="Delivery">
+		/* TsaDelivery.getDeliveryWithdrawDirectiveList */
+		SELECT '1' FROM DUAL
+	</select>
+	
+</mapper>

+ 72 - 0
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaPos.xml

@@ -0,0 +1,72 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!DOCTYPE mapper PUBLIC '-//mybatis.org//DTD Mapper 3.0//EN' 'http://mybatis.org/dtd/mybatis-3-mapper.dtd'>
+<mapper namespace="com.style24.admin.biz.dao.TsaPosDao">
+
+	<!--매장로그인 정보 조회 -->
+	<select id="getStoreLoginInfo" parameterType="Pos" resultType="Pos">
+		/* Pos.getStoreLoginInfo */
+		SELECT DELV_LOC_CD
+		     , DELV_LOC_NM
+		     , DELV_LOC_CLSF
+		     , SUPPLY_COMP_CD
+		     , DELV_FEE_RATE
+		FROM   TB_DELIVERY_LOC
+		WHERE  DELV_LOC_CD   = #{delvLocCd}
+		-- AND    DELV_LOC_CLSF = '21' --직송매장
+		AND    USE_YN        = 'Y'
+	</select>
+
+	<!--출고대기목록-->
+	<select id="getPosDeliveryList" parameterType="Pos" resultType="Pos">
+		/* Pos.getPosDeliveryList */
+		SELECT '1' FROM DUAL
+	</select>
+
+	<!--정산내역-->
+	<select id="getPosUsacList" parameterType="Pos" resultType="Pos">
+		/* Pos.getPosUsacList */
+        SELECT '1' FROM DUAL
+	</select>
+
+	<!--배송정보-->
+	<select id="getOrderExcelList" parameterType="Pos" resultType="paramMap">
+		/* Pos.getOrderExcelList */
+        SELECT ' '                                   AS RSRVT_GB     -- 예약구분: ( 일반/ 반품) 공란이면 선택한 형식적용
+             , ' '                                   AS SCHDL_CLDT   -- 집하예정일 (공란이면 자동 적용)
+             , C.RECIP_NM                                           -- 받는분 성명
+             , C.RECIP_PHNNO                                        -- 받는분 전화번호 
+             , C.RECIP_TELNO                                        -- 받는분기타연락처 
+             , C.RECIP_POST_NO                                      -- 받는분 우편번호 
+             , C.RECIP_BASE_ADDR||C.RECIP_DTL_ADDR  AS RECIP_ADDR   -- 받는분 주소(전체)
+             , ' ' AS INVOICE_NO                                         -- 운송장번호 
+             , A.ORD_NO                                             -- 고객주문번호 
+             , D.GOODS_NM||'/'|| G.SIZE_CD ||'x'|| (B.ORD_QTY * G.ITEM_QTY)  AS GOODS_NM  -- 품목명 
+             , ' '                                   AS BOX_QTY      -- 박스수량 (공란이면 1로인식)
+             , ' '                                   AS BOX_TYPE     -- 박스타입 (공란이면 화면기준적용) 
+             , ' '                                   AS FEE          -- 기본운임 (운임합계) 
+             , C.DELV_MEMO                          AS DELV_MEMO    -- 배달메시지1
+             , ' '                                   AS DELV_MEMO2   -- 배달메시지2 
+             , D.GOODS_CD||'/'|| G.SIZE_CD ||'x'|| (B.ORD_QTY * G.ITEM_QTY) AS GOODS_CD
+        FROM  TB_ORDER A
+            , TB_ORDER_DETAIL B
+            , TB_ORDER_DETAIL_ITEM G
+            , TB_DELIVERY_ADDR C
+            , TB_GOODS D
+        WHERE A.ORD_NO       = B.ORD_NO
+          AND B.ORD_NO       = G.ORD_NO
+          AND B.ORD_DTL_NO   = G.ORD_DTL_NO
+          AND B.DELV_ADDR_SQ = C.DELV_ADDR_SQ
+          AND G.ITEM_CD      = D.GOODS_CD
+          AND B.ORD_DTL_NO IN
+		<foreach collection="ordDtlNoArr" item="item" index="index"  open="(" close=")" separator=",">
+		      #{item}
+		</foreach>
+	</select>
+	
+	<!-- 매장pos r/t여부 체크 20200925 -->
+    <select id="getShopRtCheck"  parameterType="Pos" resultType="int">
+        /*Pos.getShopRtCheck*/
+        SELECT '1' FROM DUAL
+    </select>
+
+</mapper>

+ 2 - 2
style24.admin/src/main/webapp/WEB-INF/views/business/DeliveryLocForm.html

@@ -228,9 +228,9 @@
 			headerName: "매장POS", field: "btnPos", width: 120, cellClass: 'text-center',
 			cellRenderer: function(params) {
 				var btn = '';
-				if (params.value === '21') {
+				//if (params.value === '21') {
 					btn ='<button type="button" class="btn btn-success btn-sm" onclick="cfnPopPos(\'' + params.data.delvLocCd + '\');\">매장[POS]</button>';
-				}
+				//}
 				return btn;
 			}
 		},

+ 217 - 0
style24.admin/src/main/webapp/WEB-INF/views/delivery/BanGoodsRegistForm.html

@@ -0,0 +1,217 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : BanGoodsRegistForm.html
+ * @desc    : 출고금지상품 등록 팝업
+ *=============================================================
+ * ISTYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *=============================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  ==================================
+ * 1.0  2020.11.11   moon        최초 작성
+ *******************************************************************************
+ -->
+	<div class="modalPopup" data-width="1200">
+		<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<h2>출고금지 상품 등록</h2>
+			<button type="button" class="close" onclick="uifnPopupClose('popupRegistBangoods')"><i class="fa fa-times"></i></button>
+		</div>
+		<!-- //TITLE -->
+
+		<form id="bangoodsRegistForm" name="BangoodsRegistForm" action="#" th:action="@{'/delivery/bangoods/regist/list'}" th:method="post">
+			<table class="frmStyle">
+				<colgroup>
+					<col style="width:8%" />
+					<col style="width:20%;" />
+					<col style="width:8%" />
+					<col style="width:20%;" />
+				</colgroup>
+				<tbody>
+					<tr>
+						<th>업체/브랜드</th>
+						<td>
+							<select name="supplyCompCd" id="supplyCompCd" class="w120">
+								<option value="">[전체]</option>
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+							</select>
+							/
+							<select name="brandCd" id="brandCd" class="w120">
+								<option value="">[전체]</option>
+							</select>
+						</td>
+						<th>구분</th>
+						<td>
+								<select name="goodsGb" id="">
+									<option value="goodsCd">상품코드</option>
+									<option value="goodsNm">상품명</option>
+								</select>
+								<input type="text" class="w60p" name="searchTxt" placeholder="" maxlength="20" />
+						</td>
+					</tr>
+					<tr>
+						<th>상품상태</th>
+						<td colspan="3">
+							<select  name="goodsStat" id="goodsStat">
+								<option value="">[전체]</option>
+								<option th:if="${goodsStatList}" th:each="oneData, status : ${goodsStatList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+				</tbody>
+			</table>
+			<ul class="panelBar">
+				<li class="center">
+				<button type="button" class="btn btn-info btn-sm" onclick="fnPopSearch();">상품조회</button>
+				</li>
+			</ul>
+			
+			
+			<div class="frmBtnB">
+			<table class="frmStyle">
+				<colgroup>
+					<col style="width:20%" />
+					<col />
+				</colgroup>
+				<tr>
+					<th>출고금지기간</th>
+					<td>
+						<span>
+							<input type="text" class="schDate w100" id="delvBanStdt" name="delvBanStdt" maxlength="10"/>~
+							<input type="text" class="schDate w100" id="delvBanEddt" name=delvBanEddt maxlength="10"/>
+						</span>
+					</td>
+					<th>출고금지출고처</th>
+					<td>
+						<select  name="popDelvLocCd" id="popDelvLocCd">
+							<option value="">[전체]</option>
+							<option th:if="${getDeliveryLocList}" th:each="oneData, status : ${getDeliveryLocList}" th:value="${oneData.Cd}" th:text="${oneData.cdNm}"></option>
+						</select>
+					</td>
+				</tr>
+			</table>
+			</div>
+
+			<div id="gridBanGoodsList" style="width: 100%; height: 260px; padding-top:10PX;" class="ag-theme-balham"></div>
+		
+		</form>
+		<!-- 버튼 배치 영역 -->
+		<ul class="panelBar">
+			<li class="right">
+			<button type="button" class="btn btn-success btn-lg" id="btnBangoodsSave">저장</button>
+			</li>
+		</ul>
+		<!-- //버튼 -->
+
+		</div>
+	</div>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var doubleSubmitFlag = false;
+
+	// specify the columns
+	var columnBanDefs = [
+		{width: 42, minWidth: 42, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "브랜드",	field: "brandKnm", width: 150, minWidth: 80, cellClass: 'text-center'},
+		{headerName: "이미지",	field: "imgPath1", width: 130, height: 80, cellClass: 'text-center'
+			,cellRenderer: function(params) {
+				if (params.data.imgType == "A"){
+					return '<img width="60" src="'+ params.value + '" alt=""/>';
+				}else{
+					return '<img width="60" src="'+ params.value + '" alt=""/>';
+				}
+			}
+		},
+		{headerName: "상품명",	field: "goodsNm", width: 330, minWidth: 100},
+		{headerName: "상품코드",	field: "goodsCd", width: 150, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "사이즈",	field: "sizeCd", width: 150, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "상품상태",	field: "goodsStatNm", width: 150, minWidth: 100, cellClass: 'text-center'},
+	];
+
+	// Get popGridOptions
+	var popGridOptions = gagaAgGrid.getGridOptions(columnBanDefs);
+
+	// Add on options
+	popGridOptions.rowSelection = 'multiple';
+	popGridOptions.rowHeight = 80; //이미지가 있을경우 높이 지정해야함.
+
+	$(document).ready(function() {
+		gagaAgGrid.createGrid('gridBanGoodsList', popGridOptions);
+	});
+
+	// 조회
+	var fnPopSearch = function() {
+		var formId = '#bangoodsRegistForm';
+		gagaAgGrid.fetch($(formId).prop('action'), popGridOptions, formId);
+	}
+
+	// 저장
+ 	$('#btnBangoodsSave').on('click', function() {
+
+		var delvLocCd = $("#popDelvLocCd option:selected").val();
+
+		if (gagajf.isNull(delvLocCd)) {
+			mcxDialog.alert("출고처를 선택해주세요!");
+ 			 $("#popDelvLocCd").focus();
+			return;
+ 		}
+
+		var delvBanStdt = $('#delvBanStdt').val();
+		var delvBanEddt = $('#delvBanEddt').val();
+
+		if (gagajf.isNull(delvBanStdt) || gagajf.isNull(delvBanEddt)) {
+			mcxDialog.alert("출고금지 기간을 입력 해주세요!");
+			return false;
+ 		}
+
+		// 날짜 유효성 체크
+		if (Number(delvBanStdt.replaceAll("-", "")) > Number(delvBanEddt.replaceAll("-", ""))) {
+			mcxDialog.alert("시작일은 종료일보다 클 수 없습니다.");
+			return;
+		}
+
+		mcxDialog.confirm("등록 하시겠습니까?", {
+		    cancelBtnText: "취소",
+		    sureBtnText: "확인",
+		    sureBtnClick: function() {
+
+	            var gridData = gagaAgGrid.removeRowData(popGridOptions,false);
+
+	            if (gridData.length == 0) {
+	            	mcxDialog.alert('선택된 행이 없습니다.');
+	                return;
+	            }
+
+	            var createData = [];
+	            $.each(gridData, function(idx, item) {
+	                var param = new Object;
+
+	                param.goodsCd = item.goodsCd;
+	                param.sizeCd = item.sizeCd;
+	                param.delvBanStdt = delvBanStdt;
+	                param.delvBanEddt = delvBanEddt;
+	                param.delvLocCd = delvLocCd;
+
+	                createData.push(param);
+	            });
+
+	            var jsonData = JSON.stringify(createData);
+	            gagajf.ajaxJsonSubmit('/delivery/bangoods/regist/save', jsonData, fnPopSearch);
+	        }
+		});
+
+ 	});
+
+	// 업체 콤보박스 변경 시
+	$('#bangoodsRegistForm select[name=supplyCompCd]').on('change', function() {
+		var actionUrl = '/renderer/supplyCompany/brand/list/'+ $(this).val();
+		cfnCreateCombo(actionUrl, $('#bangoodsRegistForm select[name=brandCd]'), "[전체]");
+	});
+
+/*]]>*/
+</script>
+</html>

+ 313 - 0
style24.admin/src/main/webapp/WEB-INF/views/delivery/BangoodsListForm.html

@@ -0,0 +1,313 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : BangoodsListForm.html
+ * @desc    : 출고금지상품관리 Page
+ *=============================================================
+ * ISTYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *=============================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  ==================================
+ * 1.0  2020.11.10   moon        최초 작성
+ * 1.1  
+ ********************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<!-- TITLE -->
+			<div class="panelTitle">
+				<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 <font color="red">기간, 키워드</font>중 하나를 꼭 입력해 주세요.</h3>
+				<span class="panelControl">
+					<i class="fa fa-chevron-up"></i>
+				</span>
+			</div>
+			<!-- //TITLE -->
+			<div class="panelContent">	
+				<form id="searchForm" name="searchForm" action="#" th:action="@{'/delivery/bangoods/list'}" onsubmit="fnSearchList(); return false;">
+					<table class="frmStyle">
+						<colgroup>
+							<col style="width:8%;"/>
+							<col style="width:12%;"/>
+							<col style="width:8%;"/>
+							<col style="width:12%;"/>
+						</colgroup>
+						<tr>
+							<th class="dashR">업체/브랜드</th>
+							<td class="dashR">
+								<select name="supplyCompCd" id="supplyCompCd">
+									<option value="">[전체]</option>
+									<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+								</select>
+								/
+								<select name="brandCd" id="brandCd">
+									<option value="">[전체]</option>
+								</select>
+							</td>
+							<th class="dashR">구분</th>
+							<td class="dashR">
+								<select name="goodsGb" id="">
+									<option value="goodsCd">상품코드</option>
+									<option value="goodsNm">상품명</option>
+								</select>
+								<input type="text" class="w40p" name="searchTxt" placeholder="" maxlength="20" />
+							</td>
+						</tr>
+	
+						<tr>
+							<th class="dashR">출고처</th>
+							<td class="dashR">
+								<select name="delvLocCd" id="delvLocCd">
+									<option value="">[전체]</option>
+									<option th:if="${getDeliveryLocList}" th:each="oneData, status : ${getDeliveryLocList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+								</select>
+							</td>
+							<th class="dashR">삭제여부</th>
+							<td class="dashR">
+								<select name="delYn" id="delYn">
+									<option value="N">N</option>
+									<option value="Y">Y</option>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<th class="dashR">등록일</th>
+							<td colspan="4" class="dashR">
+								<span id="terms"></span>
+							</td>
+						</tr>
+					</table>
+	
+					<ul class="panelBar">
+						<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset(); fnInitCalendar();">초기화</button>
+						<button type="button" id="btnExcel" class="btn btn-info btn-lg" >엑셀다운로드</button>
+						</li>
+					</ul>
+				</form>
+				</div>
+		</div>
+		<!-- //검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<ul class=panelBar>
+				<li class="left">
+					<button type="button" id="btnSoldout" class="btn btn-danger btn-lg" onclick="deleteBangoods();" >삭제</button>
+				</li>
+				<li class="right">
+					<button type="button" id="btnSave" class="btn btn-success btn-lg btnRight" onclick="registerBangoods();">등록</button>
+				</li>
+			</ul>
+			<div class="panelContent" style="overflow: hidden;">
+				<div id="gridList" style="width:100%; height: 500px;" class="ag-theme-balham"></div>
+			</div>
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	/*************************************************************************
+	* AG-GRID 영역 
+	**************************************************************************/
+	
+	var uploadGoodsUrl = [[${@environment.getProperty('upload.goods.view')}]]; 
+	var roleCd = [[${sessionInfo.roleCd}]]; 
+
+	var columnDefs = [
+		{ width: 42, minWidth: 42, cellClass: 'text-center', headerCheckboxSelection: true, headerCheckboxSelectionFilteredOnly: true
+			, checkboxSelection: function (params) {
+				return  (params.data.delYn == 'N' ) ? true : false;
+			}	
+		},
+		{headerName: "출고금지상품번호",			field: "delvBanGoodsSq",width: 50,	cellClass: 'text-center', hide: true},
+		{headerName: "삭제",					field: "delYn",			width: 50,	cellClass: 'text-center'},
+		{headerName: "브랜드",				field: "brandKnm",		width: 150,	cellClass: 'text-center'},
+		{headerName: "출고처명",				field: "delvLocNm",		width: 150,	cellClass: 'text-center'},
+		{headerName: "이미지",				field: "imgPath1",		width: 100,	cellClass: 'text-center', 
+			cellRenderer: function(params) {
+				if (params.data.imgType == "A"){
+					return '<img width="60" src="'+ params.value + '" alt=""/>';
+				}else{
+					return '<img width="60" src="'+ params.value + '" alt=""/>';
+				}
+			}
+		},
+		{headerName: "상품명",				field: "goodsNm",		width: 150,	cellClass: 'text-center'},
+		{
+			headerName: "상품코드", field: "goodsCd", width: 130, cellClass: 'text-center', sortable: true,
+			cellRenderer: function (params) {
+				
+				if (roleCd.indexOf("C") < 0) {
+					return "<a href=\"javascript:void(0);\" onclick=\"cfnOpenGoodsDetailPopup('U','" + params.value + "');\">" + params.value + "</a>";
+				} else {
+					return params.value;
+				}
+			}
+		},
+		{headerName: "사이즈",		field: "sizeCd",		width: 80,	cellClass: 'text-center'},
+		{headerName: "상품상태",		field: "goodsStat",		width: 80,	cellClass: 'text-center'},
+		{headerName: "출고금지시작일자",	field: "delvBanStdt",	width: 150,	cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateFormat(params.value); }},
+		{headerName: "출고금지종료일자",	field: "delvBanEddt",	width: 150,	cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateFormat(params.value); }}
+		
+	];
+
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	//gridOptions.rowHeight = 60;
+	/*************************************************************************
+	*  조회 버튼 클릭 시
+	**************************************************************************/
+	$('#btnSearch').on('click', function() {
+		fnSearchList();
+	});
+
+	/*************************************************************************
+	*  조회 
+	**************************************************************************/
+	var fnSearchList = function() {
+		if($('#stDate').val() == ''){
+			mcxDialog.alert('시작 기간을 입력하세요.');
+			return;
+		}
+
+		if($('#edDate').val() == ''){
+			mcxDialog.alert('종료 기간을 입력하세요.');
+			return;
+		}
+
+		// 날짜 유효성 체크
+		if (Number($('#stDate').val().replaceAll("-", "")) > Number($('#edDate').val().replaceAll("-", ""))) {
+			mcxDialog.alert("시작일은 종료일보다 클 수 없습니다.");
+			return;
+		}
+
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm', function() {
+		});
+	}
+
+	/*************************************************************************
+	*  달력 초기화 
+	**************************************************************************/		
+	var fnInitCalendar = function() {
+		cfnChangeCalendar('7d', $('#stDate'), $('#edDate')); //달력 초기화
+	}
+
+	/*************************************************************************
+	*  업체 콤보박스 변경 시
+	**************************************************************************/	
+	$('#searchForm select[name=supplyCompCd]').on('change', function() {
+		var actionUrl = '/renderer/supplyCompany/brand/list/'+ $(this).val();
+		cfnCreateCombo(actionUrl, $('#searchForm select[name=brandCd]'), "[전체]");
+	});
+
+	/*************************************************************************
+	*  엑셀다운로드
+	**************************************************************************/		
+	$('#btnExcel').on('click', function() {
+		var totalRows = gridOptions.api.getDisplayedRowCount();
+		if(totalRows==0){
+			mcxDialog.alert('조회된 내역이 없습니다.');
+			return;
+		}
+
+		var date = new Date().format("YYYYMMDDHHmmss");
+		var params = {
+
+			fileName : "출고금지상품목록_"+ date,
+			sheetName: "DATA"
+		}
+		gridOptions.excelStyles = [
+			{
+				id: 'dateFormat',
+
+				dataType: 'dateTime',
+				numberFormat: {
+					format: 'YYYY-MM-DD;@'
+				}
+			},
+			{
+				id: 'textFormat',
+				dataType: 'string'
+			}
+		]
+
+		gridOptions.api.exportDataAsExcel(params);
+	});
+
+	/*************************************************************************
+	*  삭제
+	**************************************************************************/	
+	var deleteBangoods = function(){
+		
+		var selectedData = gridOptions.api.getSelectedNodes();
+		
+		$.each(selectedData, function(idx, row) {
+	
+	 		if(row.data.delYn == "Y") {
+	 			gridOptions.api.deselectIndex(row.rowIndex);
+	 		}
+	 	});
+		
+		
+		mcxDialog.confirm("저장하시겠습니까?", {
+		    cancelBtnText: "취소",
+		    sureBtnText: "확인",
+		    sureBtnClick: function() {
+
+	            var gridData = gagaAgGrid.removeRowData(gridOptions,false);
+
+	            if (gridData.length == 0) {
+	            	mcxDialog.alert('선택된 행이 없습니다.');
+	                return;
+	            }
+
+	            var createData = [];
+	            $.each(gridData, function(idx, item) {
+	                var param = new Object;
+
+	                param.delvBanGoodsSq = item.delvBanGoodsSq;
+	                param.goodsCd = item.goodsCd;
+	                param.sizeCd = item.sizeCd;
+
+	                createData.push(param);
+	            });
+
+	            var jsonData = JSON.stringify(createData);
+	            gagajf.ajaxJsonSubmit('/delivery/bangoods/delete', jsonData, fnSearchList);
+	        }
+		});
+	}
+
+	/*************************************************************************
+	*  등록 팝업 호출 
+	**************************************************************************/	
+	var registerBangoods = function(){
+		var actionUrl = "/delivery/bangoods/regist/form";
+		cfnOpenModalPopup(actionUrl,'popupRegistBangoods');
+	}
+
+	$(document).ready(function() {
+		gagaAgGrid.createGrid('gridList', gridOptions);
+		cfnCreateCalendar('#terms', 'stDate', 'edDate', true, '출고금지상품관리');
+		//var hideList = ["btnThisWeek", "btnYesterWeek", "btnRecentMonth", "btnThisMonth", "btnYesterMonth", "btnRecent3Month"];
+		//cfnCreateCalendar('#terms', 'stDate', 'edDate', true, '출고금지상품관리', '', hideList);
+		fnInitCalendar();
+	});
+
+/*]]>*/
+</script>
+</html>

+ 540 - 0
style24.admin/src/main/webapp/WEB-INF/views/delivery/DeliveryListForm.html

@@ -0,0 +1,540 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : DeliveryListForm.html
+ * @desc    : 배송목록 Page
+ *============================================================================
+ * ISTYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.11.10   moon        최초 작성
+ *******************************************************************************
+ -->
+<div id="main">
+	<!-- 메인타이틀 영역 -->
+	<div class="main-title">
+	</div>
+	<!-- //메인타이틀 영역 -->
+	
+	<!-- 메뉴 설명 -->
+	<div class="infoBox menu-desc">
+	</div>
+	<!-- //메뉴 설명 -->
+	<!-- 검색조건 영역 -->
+
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 <font color="red">기간, 키워드</font>중 하나를 꼭 입력해 주세요.</h3>
+			<span class="panelControl">
+				<i class="fa fa-chevron-up"></i>
+			</span>
+		</div>
+		<!-- //TITLE -->
+		<div class="panelContent">	
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/delivery/list/'}" onsubmit="fnSearchList(); return false;">
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:8%;"/>
+						<col style="width:12%;"/>
+						<col style="width:8%;"/>
+						<col style="width:12%;"/>
+						<col style="width:8%;"/>
+						<col style="width:12%;"/>
+						<col style="width:8%;"/>
+						<col style="width:12%;"/>
+						<col style="width:8%;"/>
+						<col style="width:12%;"/>
+					</colgroup>
+					<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 colspan="3">
+							<select name="mallGb" style="width: 100px;">
+								<option value="" th:if="${sessionInfo.roleCd} != 'B000' and ${sessionInfo.roleCd} != 'C000'">[전체]</option>
+								<option th:if="${mallGbList}" th:each="oneData, status : ${mallGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<span id="selfmall">
+								<select name="supplyCompCd">
+									<option value="" th:if="${sessionInfo.roleCd} != 'B000' and ${sessionInfo.roleCd} != 'C000'">[전체]</option>
+									<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+								</select>
+							</span>
+							<span id="extmallVendor">
+								<select name="vendorId">
+									<option value="" th:if="${sessionInfo.roleCd} != 'B000' and ${sessionInfo.roleCd} != 'C000'">[전체]</option>
+									<option th:if="${vendorList}" th:each="oneData, status : ${vendorList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+								</select>
+								<select name="extmallId" style="width: 150px;">
+									<option value="">[전체]</option>
+								</select>
+							</span>
+						</td>
+						<th>프론트구분</th>
+						<td colspan="3">
+							<select class="w130" name="frontGb" id="frontGb">
+								<option value="">[전체]</option>
+								<option value="P">PC</option>
+								<option value="M">Mobile</option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>주문자명</th>
+						<td>
+							<input type="text" class="" name="orderNm" placeholder="" maxlength="20"/>
+						</td>
+						<th>주문자휴대폰번호</th>
+						<td>
+							<input type="text" class="" name="orderPhnno" placeholder="" maxlength="20"/>
+						</td>
+						<th>주문상세번호</th>
+						<td>
+							<input type="text" class="" name="ordDtlNo" placeholder="" maxlength="20"/>
+						</td>
+						<th rowspan="4">키워드<i class="star"></i></th>
+						<td rowspan="4" colspan="5">
+							<select class="w130" name="search" id="search">
+								<option value="searchOrdNo">주문번호</option>
+								<option value="searchExtmallOrderId">외부몰주문번호</option>
+							</select>
+							<textarea class="textareaR3 w70p" name="condition" id="condition"></textarea>
+						</td>
+					</tr>
+					<tr>
+						<th>수령인</th>
+						<td>
+							<input type="text" class="" name="recipNm" placeholder="" maxlength="20"/>
+						</td>
+						<th>송장번호</th>
+						<td>
+							<input type="text" class="" name="invoiceNo" placeholder="" maxlength="20"/>
+						</td>
+						<th>상품코드</th>
+						<td>
+							<input type="text" class="" name="goodsCd" placeholder="" maxlength="20"/>
+						</td>
+					</tr>
+					<tr>
+						<th>출고처유형</th>
+						<td>
+							<select class="w150" name="delvLocClsf" id="delvLocClsf">
+								<option value="">[전체]</option>
+								<option th:if="${delvTypeList}" th:each="oneData, status : ${delvTypeList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+							</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>
+							<div class="multiCheckBox" style="width:270px">
+								<button type="button" class="sltBtn" style="overflow-x: hidden; padding-right:5px;">[전체]</button>
+								<ul style="display: none; box-shadow: 3px 3px 3px; overflow-y: scroll; height: 112px;">
+									<li th:if="${ordDtlStatList}" th:each="oneData, status : ${ordDtlStatList}">
+										<label class="chkBox">
+											<input type="checkbox" name="multiOrdDtlStat" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|">
+										</label>
+									</li>
+								</ul>
+							</div>
+						</td>
+					</tr>
+					<tr>
+						<th>배송지연일</th>
+						<td>
+							<input type="text" class="" name="delvDelayDays" data-valid-type="integer" placeholder="" maxlength="3" style="width:20%;"/>일
+							이상(결제일 기준)
+						</td>
+						<th>결품여부</th>
+						<td>
+							<select name="soldoutYn" id="soldoutYn">
+								<option value="">[전체]</option>
+								<option value="Y">Yes</option>
+								<option value="N" selected>No</option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>기간</th>
+						<td colspan="8">
+							<select name="termGb" id="termGb">
+								<option value="ordDt">주문등록일</option>
+								<option value="delvDt">배송일자</option>
+								<option value="delvStDt">배송시작일자</option>
+							</select>
+							<span id="terms"></span>
+						</td>
+					</tr>
+				</table>
+				<ul class="panelBar">
+					<li class="center">
+					<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+					<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset(); fnInitCalendar();">초기화</button>
+					<button type="button" id="btnExcel" class="btn btn-info btn-lg">엑셀다운로드</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+	</div>
+	<!-- //검색조건 영역 -->
+
+	<!-- 리스트 영역 -->
+	<div class="panelStyle">
+		<ul class="panelBar">
+			<li class="left">
+				<button type="button" id="btnSoldout" class="btn btn-danger btn-lg">품절처리</button>
+				<!-- <button type="button" id="btnSave" class="btn btn-success btn-lg btnRight" onclick="deliveryInfoSave();">저장</button>
+				<button type="button" id="btnWith" class="btn btn-success btn-lg btnRight">T</button> -->
+			</li>
+		</ul>
+		<div class="panelContent" style="overflow: hidden;">
+			<div id="gridDeliveryList" style="width:100%; height: 700px;" class="ag-theme-balham"></div>
+		</div>
+	</div>
+	<!-- //리스트 영역 -->
+</div>
+
+<script th:inline="javascript">
+	/*<![CDATA[*/
+
+	var shipCompanyList =  gagajf.convertToArray([[${shipCompanyList}]]);
+
+	var columnDefs = [
+		{
+			headerName: "결품",
+			field: "soldout",
+			width: 50,
+			cellClass: 'text-center',
+			headerCheckboxSelection: true,
+			headerCheckboxSelectionFilteredOnly: true
+			,
+			checkboxSelection: function (params) {
+				return (params.data.ordDtlStat == '20' || params.data.ordDtlStat == '25' || params.data.ordDtlStat == '30' || params.data.ordDtlStat == '34') ? true : false;
+			}
+		},
+		{headerName: "지연일", field: "delvDelayDays", width: 85, cellClass: 'text-center'},
+		{
+			headerName: "주문번호", field: "ordNo", width: 95, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				var roleCd = [[${sessionInfo.roleCd}]];
+				if (!roleCd.startsWith("C")) {
+					return "<a href=\"javascript:void(0);\" onclick=\"cfnOpenOrderDetailPopup('" + params.value + "');\">" + params.value + "</a>";
+				} else {
+					return params.value;
+				}
+			}
+		},
+		{headerName: "주문상세번호", field: "ordDtlNo", width: 85, cellClass: 'text-center'},
+		{headerName: "사이트", field: "siteNm", width: 120, cellClass: 'text-center'},
+		{headerName: "판매몰", field: "sellStoreNm", width: 150, cellClass: 'text-left'},
+		{headerName: "판매몰명", field: "extmallNm", width: 150, cellClass: 'text-left'},
+		{
+			headerName: "주문일시", field: "ordDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return !gagajf.isNull(params.value) ? gagaAgGrid.toDateTimeFormat(params.value) : '';
+			}
+		},
+		{
+			headerName: "결제일시", field: "ordDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return !gagajf.isNull(params.value) ? gagaAgGrid.toDateTimeFormat(params.value) : '';
+			}
+		},
+		{headerName: "몰구분", field: "mallGbNm", width: 70, cellClass: 'text-center'},
+		{
+			headerName: "주문자", field: "orderNm", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				var roleCd = [[${sessionInfo.roleCd}]];
+				if (!roleCd.startsWith("C") && !gagajf.isNull(params.value) && params.data.mallGb === '10') {
+					return '<a href="javascript:void(0);" onclick=\"cfnOpenCustDetailPopup(' + params.data.custNo + ');\">' + params.data.orderNm + '</a>';
+				} else {
+					return params.data.orderNm;
+				}
+			}
+		},
+		{headerName: "수령인", field: "recipNm", width: 100, cellClass: 'text-center'},
+		{headerName: "공급업체", field: "supplyCompNm", width: 150, cellClass: 'text-center'},
+		{
+			headerName: "상품코드", field: "goodsCd", width: 120, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				var roleCd = [[${sessionInfo.roleCd}]];
+				if (!roleCd.startsWith("C")) {
+					return "<a href=\"javascript:void(0);\" onclick=\"cfnOpenGoodsDetailPopup('U','" + params.value + "');\">" + params.value + "</a>";
+				} else {
+					return params.value;
+				}
+			}
+		},
+		{headerName: "상품명", field: "goodsNm", width: 280, cellClass: 'text-left'},
+		{headerName: "색상", field: "colorKnm", width: 120, cellClass: 'text-center'},
+		{headerName: "사이즈", field: "sizeCd", width: 70, cellClass: 'text-center'},
+		{headerName: "주문수량", field: "ordQty", width: 80, cellClass: 'text-center'},
+		{headerName: "취소수량", field: "cnclRtnQty", width: 80, cellClass: 'text-center'},
+		{headerName: "판매수량", field: "saleQty", width: 80, cellClass: 'text-center'},
+		{
+			headerName: "판매금액", field: "saleAmt", width: 100, cellClass: 'text-center'
+			, valueFormatter: function (params) {
+				return params.value.addComma();
+			}
+		},
+		{
+			headerName: "실결제금액", field: "realOrdAmt", width: 100, cellClass: 'text-center'
+			, valueFormatter: function (params) {
+				return params.value.addComma();
+			}
+		},
+		{headerName: "주문상세상태", field: "ordDtlStatNm", width: 100, cellClass: 'text-center'},
+		{headerName: "출고처", field: "delvLocCd", width: 100, cellClass: 'text-center'},
+		{headerName: "출고처명", field: "delvLocNm", width: 100, cellClass: 'text-center'},
+		{headerName: "쇼핑백", field: "sbagEncloseYn", width: 80, cellClass: 'text-center'},
+		{
+			headerName: "출고택배사", field: "shipCompCd", width: 170, cellClass: 'text-center'
+			, valueGetter: function (params) { return gagaAgGrid.lookupValue(shipCompanyList, params.data.shipCompCd); }
+		},
+		{headerName: "출고송장", field: "invoiceNo", width: 150, cellClass: 'text-left'},
+		{headerName: "송장등록수정", field: "invoiceNo", width: 120, cellClass: 'text-center'
+			, cellRenderer : function (params) {
+				var buttonTag = '';
+				if (Number(params.data.ordDtlStat) >= 20 && Number(params.data.ordDtlStat) <= 50 ) {
+					buttonTag = '<button type="button"class="btn btn-success" onClick="fnSaveInvoiceNo('+params.data.ordDtlNo+');">송장등록수정</button>';
+				}
+				return buttonTag;
+			}
+		},
+		{headerName: "배송완료처리", field: "ordDtlStat", width: 120, cellClass: 'text-center'
+			, cellRenderer: function(params) {
+				var buttonTag = '';
+				if (params.data.ordDtlStat === '40' || params.data.ordDtlStat === '50' || params.data.ordDtlStat === '55' ) {
+					buttonTag = '<button type="button"class="btn btn-success" onClick="deliveryComplete('+params.data.ordDtlStat+', '+params.data.ordNo+', '+params.data.ordDtlNo+');">배송완료</button>';
+				}
+				return buttonTag;
+			}
+		},
+		{headerName: "외부몰주문번호", field: "extmallOrderId", width: 200, cellClass: 'text-left'},
+		{headerName: "외부몰부주문번호", field: "agentOrderId", width: 200, cellClass: 'text-left'},
+		{headerName: "원코드", field: "supplyGoodsCd", width: 120, cellClass: 'text-left'},
+		{headerName: "결품여부", field: "soldoutYn", width: 80, cellClass: 'text-center'},
+		{headerName: "배송메모", field: "delvMemo", width: 200, cellClass: 'text-left'},
+		{headerName: "교환여부", field: "ordExchGb", width: 80, cellClass: 'text-left'}
+	];
+
+	//Get GridOptions
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	//Grid editable
+	//gridOptions.defaultColDef.editable = true;
+
+	gridOptions.suppressRowClickSelection = true;
+	gridOptions.rowSelection = 'multiple';
+	gridOptions.isRowSelectable = function(rowNode) {
+		return rowNode.data.ordDtlStat == '20' || rowNode.data.ordDtlStat == '25' || rowNode.data.ordDtlStat == '30' || rowNode.data.ordDtlStat == '34' || rowNode.data.ordDtlStat == '35';
+	}
+	gridOptions.getRowStyle = function (params) {
+		if (params.data.ordExchGb === 'Y') {
+			return {background: 'orange'}
+		}
+	}
+
+	var fnInitCalendar = function () {
+		$(".btnToday").trigger('click');
+	}
+
+	// 조회
+	$('#btnSearch').on('click', function () {
+		fnSearchList();
+	});
+
+	var fnSearchList = function () {
+		if ($('#searchForm input[name=ordNo]').val() == '') {
+			if ($('#stDate').val() == '') {
+				mcxDialog.alert('시작 기간을 입력하세요.');
+				return;
+			}
+
+			if ($('#edDate').val() == '') {
+				mcxDialog.alert('종료 기간을 입력하세요.');
+				return;
+			}
+		}
+
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm', function () {
+		});
+	}
+
+	//엑셀다운로드
+	$('#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);
+	});
+
+	// 결품처리 버튼 클릭 시
+	$('#btnSoldout').on('click', function () {
+		var removedData = gagaAgGrid.removeRowData(gridOptions);
+
+		if (removedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+
+		mcxDialog.confirm('결품 처리하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				// delete 대신 update 처리해야 하므로 다음과 같이 useYn 값을 변환
+				var updatedData = [];
+
+				$.each(removedData, function (idx, item) {
+
+					updatedData.push(item);
+				});
+
+
+				var jsonData = JSON.stringify(updatedData);
+				gagajf.ajaxJsonSubmit('/delivery/list/soldout'
+					, jsonData
+					, function () {
+						$('#btnSearch').trigger('click');
+					});
+			}
+		});
+	});
+
+	// 배송완료처리
+	var deliveryComplete = function (orgOrdDtlStat, ordNo, ordDtlNo) {
+		mcxDialog.confirm('배송완료 처리를 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				var jsonData = {
+					"ordNo": ordNo,
+					"ordDtlNo": ordDtlNo,
+					"orgOrdDtlStat": orgOrdDtlStat
+				};
+				var tranData = JSON.stringify(jsonData);
+				gagajf.ajaxJsonSubmit('/delivery/complete/save', tranData, fnSearchList);
+			}
+		});
+
+	}
+
+	// 송장변경 팝업
+	var fnSaveInvoiceNo = function (ordDtlNo) {
+		var actionUrl = "/delivery/save/invoice/form?ordDtlNo=" + ordDtlNo ;
+		cfnOpenModalPopup(actionUrl, 'popupSaveInvoice');
+	};
+
+
+	// 배송정보 저장
+	var deliveryInfoSave = function () {
+
+		var changeData = gagaAgGrid.getChangedData(gridOptions);
+
+		if (changeData.length < 1) {
+			mcxDialog.alert('변경 된 데이터가 없습니다.');
+			return;
+		}
+
+		mcxDialog.confirm('저장 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				var updatedData = [];
+
+				$.each(changeData, function (idx, item) {
+					var param = new Object;
+					param.shipCompCd = item.shipCompCd;
+					param.invoiceNo = item.invoiceNo;
+					param.ordDtlNo = item.ordDtlNo;
+
+					updatedData.push(param);
+				});
+
+				var jsonData = JSON.stringify(updatedData);
+				gagajf.ajaxJsonSubmit('/delivery/orderDetail/save', jsonData, fnSearchList);
+			}
+		});
+	}
+
+
+	// 벤더 콤보박스 변경 시
+	$('#searchForm select[name=vendorId]').on('change', function () {
+		var actionUrl = '/renderer/vendor/extmall/list/' + $(this).val();
+		cfnCreateCombo(actionUrl, $('#searchForm select[name=extmallId]'), "[전체]");
+	});
+
+
+	// 몰구분 콤보박스 변경 시
+	$('#searchForm select[name=mallGb]').on('change', function () {
+		if ($(this).val() == '10') { // 자사몰
+			$('#extmallVendor').hide();
+			$('#selfmall').show();
+			$('#searchForm select[name=vendorId]').val('');
+			$('#searchForm select[name=extmallId]').val('');
+		} else if ($(this).val() == '20') { // 외부몰
+			$('#selfmall').hide();
+			$('#extmallVendor').show();
+			$('#searchForm select[name=supplyCompCd]').val('');
+		} else {
+			$('#selfmall').hide();
+			$('#extmallVendor').hide();
+			$('#searchForm select[name=vendorId]').val('');
+			$('#searchForm select[name=supplyCompCd]').val('');
+			$('#searchForm select[name=extmallId]').val('');
+		}
+	});
+
+	$(document).ready(function () {
+		gagaAgGrid.createGrid('gridDeliveryList', gridOptions);
+		var hideList = ["btnThisWeek", "btnYesterWeek", "btnRecentMonth", "btnThisMonth", "btnYesterMonth", "btnRecent3Month"];
+		cfnCreateCalendar('#terms', 'stDate', 'edDate', true, '주문', '', hideList);
+		$(".btnToday").trigger('click');
+		$('#extmallVendor').hide();
+		$('#selfmall').hide();
+		$('#searchForm select[name=mallGb]').trigger('change');
+		//uifnFitGrid('auto'); // TO-BE 지워야됨  
+	});
+
+	/*]]>*/
+</script>
+</html>

+ 236 - 0
style24.admin/src/main/webapp/WEB-INF/views/delivery/DeliveryWithdrawDirectiveListForm.html

@@ -0,0 +1,236 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : DeliveryWithdrawDirectiveListForm.html
+ * @desc    : 배송/회수지시 목록 Page
+ *=============================================================
+ * ISTYLE24
+ * Copyright(C) 2019 TSIT, All rights reserved.
+ *=============================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  ==================================
+ * 1.0  2020.11.11   moon        최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 <font color="red">기간, 키워드</font>중 하나를 꼭 입력해 주세요.</h3>
+			<span class="panelControl">
+				<i class="fa fa-chevron-up"></i>
+			</span>
+		</div>
+		<!-- //TITLE -->
+		<div class="panelContent">	
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/delivery/dwdirect/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>지시구분</th>
+							<td>
+								<select name="delvGb">
+									<option value="">전체</option>
+									<option value="D">배송지시</option>
+									<option value="W">회수지시</option>
+								</select>
+							</td>
+							<th>택배사 전송여부</th>
+							<td>
+								<select name="sendYn">
+									<option value="">전체</option>
+									<option value="N">미전송</option>
+									<option value="Y">전송</option>
+								</select>
+							</td>
+							<th>사이트</th>
+							<td>
+								<select name="siteCd">
+									<option value="">전체</option>
+									<option th:if="${siteCdList}" th:each="oneData, status : ${siteCdList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<th>주문일/회수요청일</th>
+							<td colspan="5" id="terms">
+							</td>
+						</tr>
+					</tbody>
+				</table>
+				<!-- <div class="panelBtnB">  -->
+				<ul class="panelBar">
+					<li class="center">
+					<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+					</li>
+				</ul>
+			
+			</form>
+			</div>
+		</div>
+
+		<div class="panelStyle">
+			<ul class="panelBar">
+				<li class="left">
+					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+				</li>
+			</ul>
+
+			<div class="panelContent" style="overflow: hidden;">
+				<div id="gridList" style="width: 100%; height: 600px;"  class="ag-theme-balham"></div>
+			</div>
+		</div>
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	// 사이트목록
+	var siteList = gagajf.convertToArray([[${siteCdList}]]);
+
+	var columnDefs = [
+		{headerName: "지시구분", field: "delvGbNm", width: 80, cellClass: "text-center"},
+		{
+			headerName: "택배사전송", field: "sendYn", width: 80, cellClass: "text-center",
+			cellRenderer: function (params) { return params.value == 'Y' ? '전송' : '미전송'; }
+		},
+		{
+			headerName: "사이트", field: "siteCd", width: 80, cellClass: "text-center",
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(siteList, params.value); }
+		},
+		{
+			headerName: "주문번호", field: "ordNo", width: 100, cellClass: "text-center",
+			cellRenderer: function(params) { return gagajf.isNull(params.value) ? '' : '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
+		{headerName: "주문상세번호", field: "ordDtlNo", width: 100, cellClass: "text-center"},
+		{
+			headerName: "상품코드", field: "goodsCd", width: 120, cellClass: "text-center",
+			cellRenderer: function(params) { return gagajf.isNull(params.value) ? '' : '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
+		{headerName: "상품명", field: "goodsNm", width: 200},
+		{headerName: "수취인명", field: "recipNm", width: 120, cellClass: "text-center"},
+		{headerName: "수취인휴대전화", field: "recipPhnno", width: 120, cellClass: "text-center"},
+		{headerName: "수취인전화번호", field: "recipTelno", width: 120, cellClass: "text-center"},
+		{headerName: "수취인이메일", field: "recipEmail", width: 120},
+		{headerName: "수취인우편번호", field: "recipPostNo", width: 120, cellClass: "text-center"},
+		{headerName: "수취인기본주소", field: "recipBaseAddr", width: 300},
+		{headerName: "수취인상세주소", field: "recipDtlAddr", width: 200},
+		{headerName: "주문자명", field: "orderNm", width: 100, cellClass: "text-center"},
+		{headerName: "주문자휴대전화", field: "orderPhnno", width: 120, cellClass: "text-center"},
+		{headerName: "주문자전화번호", field: "orderPhnno", width: 120, cellClass: "text-center"},
+		{headerName: "주문자이메일", field: "orderEmail", width: 120}
+	];
+
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 셀 클릭 이벤트
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field == 'ordNo') {
+			// 주문 상세
+			cfnOpenOrderDetailPopup(event.data.ordNo);
+		} else if (event.colDef.field == 'goodsCd') {
+			// 상품 상세
+			cfnOpenGoodsDetailPopup('U', event.data.goodsCd);
+		}
+	};
+
+	// 조회
+	$('#btnSearch').on('click', function() {
+		// Fetch data
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+
+// 	// 택배사 전송여부 변경시 처리
+// 	$('#sendYn').on('change',function(){
+// 		var sendVal = $('#searchForm select[name=sendYn]').val();
+// 		fnDatepickerDisabled(sendVal);
+// 	});
+
+// 	// 날짜선택 활성화/비활성화
+// 	var fnDatepickerDisabled = function(flag) {
+// 		if(flag == 'Y'){
+
+// 			$('#stDate').attr('disabled', false);
+// 			$('#edDate').attr('disabled', false);
+// 			$('.btn-default').attr('disabled', false);
+// 			$('.ui-datepicker-trigger').attr('disabled', false);
+// 			$('.btnToday').trigger('click');
+
+// 		} else {
+
+// 			$('#stDate').val('');
+// 			$('#edDate').val('');
+// 			$('#stDate').attr('disabled', true);
+// 			$('#edDate').attr('disabled', true);
+// 			$('.btn-default').attr('disabled', true);
+// 			$('.ui-datepicker-trigger').attr('disabled', true);
+// 		}
+// 	}
+
+	//엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('배송/회수지시 목록', gridOptions);
+// 		var totalRows = gridOptions.api.getDisplayedRowCount();
+// 		if(totalRows==0){
+// 			mcxDialog.alert('조회된 내역이 없습니다.');
+// 			return;
+// 		}
+
+// 		var date = new Date().format("YYYYMMDDHHmmss");
+// 		var params = {
+// 			fileName : "회수송장전송목록_"+ date,
+// 			sheetName: "DATA"
+// 		}
+// 		gridOptions.excelStyles = [
+// 			{
+// 				id: 'dateFormat',
+// 				dataType: 'dateTime',
+// 				numberFormat: {
+// 					format: 'YYYY-MM-DD;@'
+// 				}
+// 			},
+// 			{
+// 				id: 'textFormat',
+// 				dataType: 'string'
+// 			}
+// 		]
+
+// 		gridOptions.api.exportDataAsExcel(params);
+	});
+
+	$(document).ready(function() {
+		
+
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+		cfnCreateCalendar('#terms', 'stDate', 'edDate', false);
+		// grid 높이 조절
+		//uifnFitGrid('auto');
+
+		gagajf.setDate('#terms', 'stDate', 'edDate', 't');
+
+		//fnDatepickerDisabled();
+	});
+
+/*]]>*/
+</script>
+
+</html>

+ 845 - 0
style24.admin/src/main/webapp/WEB-INF/views/pos/PosMainForm.html

@@ -0,0 +1,845 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<head th:replace="common/fragments/header :: header"></head>
+<body>
+<th:block th:replace="common/fragments/variables :: variables"></th:block>
+
+<!--
+ *******************************************************************************
+ * @source  : PosMainForm.html
+ * @desc    : POS Main Page
+ *============================================================================
+ * ISTYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.11.13   moon        최초 작성
+ *******************************************************************************
+ -->
+
+<div id="main" style="padding-top:0;">
+		<!-- TITLE -->
+		<div class="main-title">
+			<h1>매장명 : <span th:text="${delvLocNm}"></span></h1>
+		</div>
+		<!-- //TITLE -->
+	
+		<!-- TABS SPACE -->
+		<div class="tabs">
+			<!-- TABS NAVI -->
+			<ul class="tabsNav p-left">
+				<li class="on"><a href="#tab1#top" id="tab1-1">출고대기목록</a></li>
+				<li><a href="#tab2#top">출고목록</a></li>
+				<li><a href="#tab3#top">정산내역</a></li>
+				<li><a href="#tab4#top">출고거부이력</a></li>
+			</ul>
+			<!-- //TABS NAVI -->
+			<!-- TABS CONTENTS -->
+			<ul class="tabsCont">
+				<!-- TAB1 : 출고대기목록 -->
+				<li class="tab on" id="tab1">
+					<div class="panelStyle">
+					<!-- TAB2 CONTENTS AREA -->
+					<form id="waitingOrder">
+						<input type="hidden" name="delvLocCd" th:value="${delvLocCd}">
+						<input type="hidden" name="ordDtlStat" value="35"/>
+						<input type="hidden" name="ordDtlNos">
+							<h4>출고대기</h4>
+							<table class="frmStyle">
+								<colgroup>
+									<col style="width:10%;"/>
+									<col style="width:23%;"/>
+									<col style="width:10%;"/>
+									<col style="width:23%;"/>
+									<col style="width:10%;"/>
+									<col/>
+								</colgroup>
+								<tbody>
+								<tr>
+									<th>주문번호</th>
+									<td><input type="text" class="w300" name="ordNo"/></td>
+									<th>수령자</th>
+									<td><input type="text" class="w300" name="recipNm" maxlength="10"/></td>
+									<th>출고여부</th>
+									<td>
+										<select class="w150" name="delvArGb">
+											<option value="">전체</option>
+											<option value="P">출고대기</option>
+											<option value="Y">출고수락</option>
+											<option value="N">출고거부</option>
+										</select>
+									</td>
+								</tr>
+								<tr>
+									<th>조회기간</th>
+									<td colspan="5" id="waitTerms"></td>
+								</tr>
+								</tbody>
+							</table>
+							<ul class="panelBar">
+								<li class="center">
+									<button type="button" class="btn btn-base btn-lg" id="btnWaitSearch">조회</button>
+									<button type="button" class="btn btn-base btn-lg" id="btnCnplus">Cnplus엑셀다운로드</button>
+								</li>
+							</ul>
+							
+						<div id="watingGrid" style="width: 99%; height: 500px;" class="ag-theme-balham lh80" ></div>
+
+						<!-- //TAB2 CONTENTS AREA -->
+					</form>
+					</div>
+				</li>
+				<!-- //TAB1 : 출고대기목록 -->
+				<!-- TAB2 : 출고목록 -->
+				<li class="tab" id="tab2">
+					<div class="panelStyle">
+					<!-- TAB2 CONTENTS AREA -->
+					<form id="deliveryInfo">
+						<input type="hidden" name="delvLocCd" th:value="${delvLocCd}">
+						<input type="hidden" name="ordDtlNos">
+
+							<h4>출고목록</h4>
+							<table class="frmStyle">
+								<colgroup>
+									<col style="width:10%;"/>
+									<col style="width:23%;"/>
+									<col style="width:10%;"/>
+									<col style="width:23%;"/>
+									<col style="width:10%;"/>
+									<col/>
+								</colgroup>
+								<tbody>
+								<tr>
+									<th>주문번호</th>
+									<td><input type="text" class="w300" name="ordNo"/></td>
+									<th>수령자</th>
+									<td><input type="text" class="w300" name="recipNm" maxlength="10"/></td>
+									<th>주문상세상태</th>
+									<td>
+										<select class="w150" name="ordDtlStat">
+											<option value="all">전체</option>
+											<option value="40" selected>배송준비중</option>
+											<option value="50">배송중</option>
+											<option value="60">배송완료</option>
+										</select>
+									</td>
+								</tr>
+								<tr>
+									<th>조회기간</th>
+									<td colspan="5" id="deliveryTerms"></td>
+								</tr>
+								</tbody>
+							</table>
+							<ul class="panelBar">
+								<li class="center">
+								<button type="button" class="btn btn-base btn-lg" id="btnDeliveySearch">조회</button>
+								<button type="button" class="btn btn-base btn-lg" id="btnReCnplus">Cnplus엑셀재다운로드</button>
+								<button type="button" class="btn btn-base btn-lg" id="btnDeliveySave">송장번호저장</button>
+								</li>
+							</ul>
+
+							<div id="deliveryGrid" style="width: 99%; height: 500px;" class="ag-theme-balham lh80" ></div>
+				
+						<!-- //TAB2 CONTENTS AREA -->
+					</form>
+					</div>
+				</li>
+				<!-- //TAB2 : 출고대기목록 -->
+				<!-- TAB3 : 정산 내역 -->
+				<li class="tab" id="tab3">
+					<div class="panelStyle">
+					<!-- TAB3 CONTENTS AREA -->
+					<form id="usacList">
+						<input type="hidden" name="delvLocCd" th:value="${delvLocCd}">
+							<h4>정산 내역</h4>
+							<table class="frmStyle">
+								<colgroup>
+									<col style="width:10%;"/>
+									<col style="width:23%;"/>
+									<col style="width:10%;"/>
+									<col style="width:23%;"/>
+									<col style="width:10%;"/>
+									<col/>
+								</colgroup>
+								<tbody>
+								<tr>
+									<th>조회기간</th>
+									<td colspan="3" id="usacTerms"></td>
+								</tr>
+								</tbody>
+							</table>
+							<ul class="panelBar">
+								<li class="center">
+								<button type="button" class="btn btn-base btn-lg" id="btnSearchUsac">조회</button>
+								</li>
+							</ul>
+							<div id="usacGrid" style="width: 99%; height: 500px;" class="ag-theme-balham lh80" ></div>
+					</form>
+					</div>
+					<!-- //TAB3 CONTENTS AREA -->
+				</li>
+				<!-- //TAB3 : 정산 내역 -->
+				<!-- TAB4 : 출고거부 내역 -->
+				<li class="tab" id="tab4">
+					<div class="panelStyle">
+					<!-- TAB4 CONTENTS AREA -->
+					<form id="banDelv">
+						<input type="hidden" name="delvLocCd" th:value="${delvLocCd}">
+							<h4>출고거부 내역</h4>
+							<table class="frmStyle">
+								<colgroup>
+									<col style="width:10%;"/>
+									<col style="width:80%;"/>
+									<col style="width:10%;"/>
+									<col/>
+								</colgroup>
+								<tbody>
+								<tr>
+									<th>상품코드</th>
+									<td><input type="text" class="w300" id="goodsCd" name="goodsCd"/></td>
+								</tr>
+								<tr>
+									<th>조회기간</th>
+									<td colspan="3" id="banDelvTerms"></td>
+								</tr>
+								</tbody>
+							</table>
+							<ul class="panelBar">
+								<li class="center">
+								<button type="button" class="btn btn-base btn-lg" id="btnBanDelvSearch">조회</button>
+								</li>
+							</ul>
+							<div id="banDelvGrid" style="width: 99%; height: 500px;" class="ag-theme-balham lh80" ></div>
+					
+					</form>
+					</div>
+					<!-- //TAB4 CONTENTS AREA -->
+				</li>
+				<!-- //TAB4 : 출고거부 내역 -->
+			</ul>
+			<!-- //TABS CONTENTS -->
+	
+		<!-- //TABS SPACE -->
+	</div>
+</div>
+
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	var goodsImgParam    = "?width=60&height=60";
+	var goodsImgBigParam = "?width=600&height=600";
+	var delvarGbList     =  {"P" : "출고대기", "Y" : "출고수락", "N" : "출고거부"};
+	var uploadGoodsUrl   = [[${@environment.getProperty('upload.goods.view')}]];
+	var shipCompanyList  =  gagajf.convertToArray([[${shipCompanyList}]]);
+	var orderDtlSateList =  gagajf.convertToArray([[${orderDtlSateList}]]);
+
+	var g017Init = {'cd' :'0', 'cdNm' :'[선택]'};
+	var g017ObjectList = [[${g017List}]];
+	g017ObjectList.push(g017Init);
+	var g017List       =  gagajf.convertToArray(g017ObjectList);
+	delete g017List[90];
+	delete g017List[40];
+
+
+	//출고대기 그리드
+	var columnwatingApplyDefs = [
+
+		{headerName: "출고", field: "chulgo", width: 50, cellClass: 'text-center', headerCheckboxSelection: true, headerCheckboxSelectionFilteredOnly: true
+			, checkboxSelection: function (params) {
+				return  (params.data.ordDtlStat == '35' && params.data.delvArGb == 'Y') ? true : false;
+			}
+		},
+
+		{headerName: "수락", field: "delvArGbY", width: 100, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				var btnText = '';
+				if(params.value === 'P'){
+					btnText ='<a href="javascript:void(0);" onclick="fnApplyDelvLoc(\''+params.data.ordNo+'\',\''+params.data.ordDtlNo+'\')" class="btn btn-success btn-lg">수락</a>';
+				}
+				return btnText;
+			}
+		},
+		{headerName: "거부", field: "delvArGbN", width: 100, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				var btnText = '';
+				if(params.value === 'P') {
+					btnText= '<a href="javascript:void(0);"  class="btn btn-success btn-lg">거부</a>';
+
+				}
+				return btnText;
+			}
+		},
+		{headerName: "거부사유", field: "rejectReason", width: 80, minWidth: 75, cellClass: 'text-center', sortable: true ,
+			cellEditor: 'agSelectCellEditor',
+			editable : function (params) { return  (params.data.ordDtlStat === '35' && params.data.delvArGb === 'P') ? true : false;},
+			cellEditorParams: { values: gagaAgGrid.extractValues(g017List) },
+			valueFormatter: function (params) {
+				var dataValue = '0';
+				if(!gagajf.isNull(params.value)) {
+					dataValue = params.value;
+				}
+				return gagaAgGrid.lookupValue(g017List, dataValue);
+			},
+			valueParser: function (params) { return gagaAgGrid.lookupKey(g017List, params.newValue); },
+			singleClickEdit: true
+		},
+		{
+			headerName: "출고여부", field: "delvArGb", width: 130, cellClass: 'text-center' ,
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(delvarGbList, params.value); },
+		},
+		{headerName: "이미지", field: "imgPath1", width: 130, height: 80, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				if (params.data.imgType != "B"){
+					return '<img width="60" src="'+ uploadGoodsUrl+params.value + '" alt="" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \''+ params.value +'\')"/>';
+				}else{
+					return '<img width="60" src="'+ params.value+goodsImgParam + '" alt="" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \''+ params.value+goodsImgBigParam +'\')"/>';
+				}
+			}
+		},
+		{headerName: "상품명", field: "goodsNm", width: 200, cellClass: 'text-left'},
+		{headerName: "상품코드", field: "goodsCd", width: 130, cellClass: 'text-center' },
+		{headerName: "사이즈", field: "sizeCd", width: 85, cellClass: 'text-center' },
+		{
+			headerName: "주문수량",  field: "ordQty", width: 80, cellClass: 'text-center',
+			valueFormatter: function(params) {return params.value.addComma();}
+		},
+		{headerName: "주문번호", field: "ordNo", width: 90, cellClass: 'text-center'},
+		{headerName: "주문상세번호", field: "ordDtlNo", width: 90, cellClass: 'text-center', hide: true},
+		{headerName: "주문일시", field: "ordDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{headerName: "주문자", field: "orderNm", width: 130, cellClass: 'text-center' },
+		{headerName: "수령자", field: "recipNm", width: 130, cellClass: 'text-center'},
+		{headerName: "송장번호", field: "invoiceNo", width: 120, cellClass: 'text-center'},
+		{headerName: "우편번호", field: "recipPostNo", width: 90, cellClass: 'text-center'},
+		{headerName: "주소", field: "recipAddr", width: 450, cellClass: 'text-left'},
+		{headerName: "전화번호", field: "recipPhnno", width: 120, cellClass: 'text-center'},
+		{headerName: "배송메모", field: "delvMemo", width: 120, cellClass: 'text-center'}
+
+
+	];
+
+	//출고그리드
+	var columnDeliveryDefs= [
+		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "송장번호", field: "invoiceNo", width: 120, cellClass: 'text-center',
+			cellEditor: 'textCellEditor',
+			editable : function (params) { return  (params.data.ordDtlStat == '40' && params.data.delvArGb == 'Y') ? true : false;},
+			cellEditorParams: { maxlength: 15 }
+		},
+
+		{headerName: "택배사", field: "shipCompCd", width: 100, minWidth: 75, cellClass: 'text-center',
+			cellEditor: 'agRichSelectCellEditor',
+			editable : function (params) { return  (params.data.ordDtlStat == '40' && params.data.delvArGb == 'Y') ? true : false;},
+			cellEditorParams: { values: gagaAgGrid.extractValues(shipCompanyList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(shipCompanyList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(shipCompanyList, params.newValue); }
+		},
+
+		{headerName: "이미지", field: "imgPath1", width: 130, height: 80, cellClass: 'text-center', editable :false,
+			cellRenderer: function(params) {
+				if (params.data.imgType != "B"){
+					return '<img width="60" src="'+ uploadGoodsUrl+params.value + '" alt="" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \''+ params.value +'\')"/>';
+				}else{
+					return '<img width="60" src="'+ params.value+goodsImgParam + '" alt="" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \''+ params.value+goodsImgBigParam +'\')"/>';
+				}
+			}
+		},
+		{headerName: "상품명", field: "goodsNm", width: 200, cellClass: 'text-left', editable :false},
+		{headerName: "상품코드", field: "goodsCd", width: 130, cellClass: 'text-center' , editable :false},
+		{headerName: "사이즈", field: "sizeCd", width: 85, cellClass: 'text-center' , editable :false},
+		{
+			headerName: "주문수량",  field: "ordQty", width: 80, cellClass: 'text-center', editable :false,
+			valueFormatter: function(params) {return params.value.addComma();}
+		},
+		{headerName: "주문번호", field: "ordNo", width: 90, cellClass: 'text-center', editable :false},
+		{headerName: "주문상세번호", field: "ordDtlNo", width: 90, cellClass: 'text-center', editable :false},
+		{headerName: "주문상세상태", field: "ordDtlStat", width: 130, cellClass: 'text-center', editable :false,
+			cellEditorParams: { values: gagaAgGrid.extractValues(orderDtlSateList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(orderDtlSateList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(orderDtlSateList, params.newValue); }
+		},
+		{headerName: "주문상세번호", field: "ordDtlNo", width: 90, cellClass: 'text-center', hide: true, editable :false},
+		{
+			headerName: "주문일시", field: "ordDt", width: 150, cellClass: 'text-center', editable :false,
+			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{
+			headerName: "출고일시", field: "delvStdt", width: 150, cellClass: 'text-center', editable :false,
+			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{headerName: "주문자", field: "orderNm", width: 130, cellClass: 'text-center' , editable :false},
+		{headerName: "수령자", field: "recipNm", width: 130, cellClass: 'text-center', editable :false},
+		{headerName: "우편번호", field: "recipPostNo", width: 90, cellClass: 'text-center'},
+		{headerName: "주소", field: "recipAddr", width: 450, cellClass: 'text-left'},
+		{headerName: "전화번호", field: "recipPhnno", width: 120, cellClass: 'text-center'},
+		{headerName: "배송메모", field: "delvMemo", width: 120, cellClass: 'text-center'},
+
+		{headerName: "수락취소", field: "delvArGbCnl", width: 120, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				var btnText = '';
+				if(params.value === 'Y') {
+					btnText= '<a href="javascript:void(0);"  class="btn btn-success btn-lg">수락취소</a>';
+				}
+				return btnText;
+			}
+		},
+		{headerName: "거부사유", field: "rejectReason", width: 100, minWidth: 75, cellClass: 'text-center', sortable: true ,
+			cellEditor: 'agSelectCellEditor',
+			editable : function (params) { return  (params.data.ordDtlStat === '40' && params.data.delvArGb === 'Y') ? true : false;},
+			cellEditorParams: { values: gagaAgGrid.extractValues(g017List) },
+			valueFormatter: function (params) {
+				var dataValue = '0';
+				if(!gagajf.isNull(params.value)) {
+					dataValue = params.value;
+				}
+				return gagaAgGrid.lookupValue(g017List, dataValue);
+			},
+			valueParser: function (params) { return gagaAgGrid.lookupKey(g017List, params.newValue); },
+			singleClickEdit: true
+		}
+
+	];
+
+	//정산내역 그리드
+	var columnUsacDefs = [
+		{headerName: "이미지", field: "imgPath1", width: 130, height: 80, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				if (params.data.imgType != "B"){
+					return '<img width="60" src="'+ uploadGoodsUrl+params.value + '" alt="" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \''+ params.value +'\')"/>';
+				}else{
+					return '<img width="60" src="'+ params.value+goodsImgParam + '" alt="" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \''+ params.value+goodsImgBigParam +'\')"/>';
+				}
+			}
+		},
+		{headerName: "상품명", field: "goodsNm", width: 200, cellClass: 'text-left'},
+		{headerName: "상품코드", field: "goodsCd", width: 130, cellClass: 'text-center' },
+		{headerName: "사이즈", field: "sizeCd", width: 85, cellClass: 'text-center' },
+		{
+			headerName: "출고수량", field: "ordQty", width: 80, cellClass: 'text-right',
+			valueFormatter: function(params) {return params.value.addComma();}
+		},
+		{
+			headerName: "발생일시", field: "occurDt", width: 150, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{
+			headerName: "출고일시", field: "delvStdt", width: 150, cellClass: 'text-center',
+		    cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{headerName: "출고구분", field: "usacGbNm", width: 100, cellClass: 'text-center' },
+		{headerName: "실결제금액", field: "realAmt", width: 95, cellClass: 'text-right'
+			,valueFormatter: function(params) {
+				return params.value.addComma();
+			}
+		},
+		{headerName: "수수료율", field: "delvFeeRate", width: 95, cellClass: 'text-right'
+			,cellRenderer: function(params) {
+				return params.value === 0 ? '': params.value+'%';
+			}
+		},
+		{headerName: "수수료", field: "delvFeeAmt", width: 95, cellClass: 'text-right'
+			,valueFormatter: function(params) {
+				return params.value.addComma();
+			}
+		},
+		{headerName: "주문번호", field: "ordNo", width: 90, cellClass: 'text-center'},
+		{headerName: "주문상세", field: "ordDtlNo", width: 90, cellClass: 'text-center', hide: true}
+	];
+
+	//출고거부 이력 그리드
+	var columnBanDelvDefs = [
+		{headerName: "이미지", field: "imgPath1", width: 130, height: 80, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				if (params.data.imgType != "B"){
+					return '<img width="60" src="'+ uploadGoodsUrl+params.value + '" alt="" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \''+ params.value +'\')"/>';
+				}else{
+					return '<img width="60" src="'+ params.value+goodsImgParam + '" alt="" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \''+ params.value+goodsImgBigParam +'\')"/>';
+				}
+			}
+		},
+		{headerName: "거부일시", field: "delvBanStdt", width: 150, cellClass: 'text-center'
+		},
+		{headerName: "상품코드", field: "goodsCd", width: 130, cellClass: 'text-center'},
+		{headerName: "사이즈", field: "sizeCd", width: 80, cellClass: 'text-center'},
+		{headerName: "주문번호", field: "ordNo", width: 100, cellClass: 'text-center'},
+		{headerName: "거부사유", field: "rejectReason", width: 100, cellClass: 'text-center'}
+	];
+
+	var gridWaitingOptions = gagaAgGrid.getGridOptions(columnwatingApplyDefs);
+	var gridDeliveryOptions = gagaAgGrid.getGridOptions(columnDeliveryDefs);
+	var gridUsacOptions = gagaAgGrid.getGridOptions(columnUsacDefs);
+	var gridBanDelvOptions = gagaAgGrid.getGridOptions(columnBanDelvDefs);
+	gridWaitingOptions.rowHeight = 80; //이미지가 있을경우 높이 지정해야함.
+	gridDeliveryOptions.rowHeight = 80;
+	gridUsacOptions.rowHeight = 80; //이미지가 있을경우 높이 지정해야함.
+	gridBanDelvOptions.rowHeight = 80; //이미지가 있을경우 높이 지정해야함.
+
+	//gridDeliveryOptions.rowSelection = 'multiple';
+	//gridWaitingOptions.rowSelection = 'multiple';
+
+	gridDeliveryOptions.defaultColDef.editable = true;
+	gridDeliveryOptions.stopEditingWhenGridLosesFocus = true;
+
+	gridWaitingOptions.isRowSelectable = function(rowNode) {
+		return rowNode.data.delvArGb == 'Y';
+	}
+
+	// 출고대기 주문조회
+	$('#btnWaitSearch').on('click', function () {
+		if(!gagajf.validation('#waitingOrder'))
+			return;
+		gagaAgGrid.fetch('/pos/wait/order/list',gridWaitingOptions, '#waitingOrder');
+	});
+
+	// 출고조회
+	$('#btnDeliveySearch').on('click', function () {
+		if(!gagajf.validation('#deliveryInfo'))
+			return;
+		gagaAgGrid.fetch('/pos/delivery/order/list',gridDeliveryOptions, '#deliveryInfo');
+	});
+
+	// 정산내역 조회
+	$('#btnSearchUsac').on('click', function () {
+		gagaAgGrid.fetch('/pos/usac/list',gridUsacOptions, '#usacList');
+	});
+
+	// 출고거부 조회
+	$('#btnBanDelvSearch').on('click', function () {
+		gagaAgGrid.fetch('/pos/ban/delivery/list',gridBanDelvOptions, '#banDelv');
+	});
+
+	var fnSetDelvCallback = function() {
+		$('#tab1-1').trigger('click');
+		$('#btnWaitSearch').trigger('click');
+	};
+
+	var fnCancelCallback = function() {
+		$('#tab3').trigger('click');
+		$('#btnDeliveySearch').trigger('click');
+	};
+
+
+	// 출고수락
+	var fnApplyDelvLoc = function(ordNo, ordDtlNo) {
+		var params = {};
+		params.ordNo = ordNo;
+		params.ordDtlNo = ordDtlNo;
+		params.delvArGb = 'Y';  // 수락
+		mcxDialog.confirm('출고수락 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var jsonData = JSON.stringify(params);
+				gagajf.ajaxJsonSubmit('/pos/delivery/assign/save', jsonData, fnSetDelvCallback);
+			}
+		});
+	};
+
+	// 출고거부
+	gridWaitingOptions.onCellClicked = function(event) {
+		if (event.colDef.field == 'delvArGbN'){
+			if(gagajf.isNull(event.data.rejectReason) || event.data.rejectReason === '0'){
+				mcxDialog.alert('거부 사유를 선택해주세요.');
+			} else {
+				var params = {};
+				params.ordNo = event.data.ordNo;
+				params.ordDtlNo = event.data.ordDtlNo;
+				params.delvArGb = 'N';  // 거부
+				params.rejectReason = event.data.rejectReason;
+				mcxDialog.confirm('거부 하시겠습니까?', {
+					cancelBtnText: "취소",
+					sureBtnText: "확인",
+					sureBtnClick: function(){
+						var jsonData = JSON.stringify(params);
+						gagajf.ajaxJsonSubmit('/pos/delivery/assign/save', jsonData, fnSetDelvCallback);
+					}
+				});
+			}
+		}
+	}
+
+	// 수락취소
+	gridDeliveryOptions.onCellClicked = function(event) {
+		if (event.colDef.field == 'delvArGbCnl' && event.data.ordDtlStat == '40'){
+			if(gagajf.isNull(event.data.rejectReason) || event.data.rejectReason === '0'){
+				mcxDialog.alert('수락취소 사유를 선택해주세요.');
+			} else {
+				var params = {};
+				params.ordNo = event.data.ordNo;
+				params.ordDtlNo = event.data.ordDtlNo;
+				params.delvArGb = 'N';  // 거부
+				params.rejectReason = event.data.rejectReason;
+				mcxDialog.confirm('수락취소 하시겠습니까?<br/> 다른출고처로 지정됩니다.', {
+					cancelBtnText: "취소",
+					sureBtnText: "확인",
+					sureBtnClick: function(){
+						var jsonData = JSON.stringify(params);
+						gagajf.ajaxJsonSubmit('/pos/delivery/assign/save/cancel', jsonData, fnCancelCallback);
+					}
+				});
+			}
+		}
+	}
+
+
+
+	/*
+	// 출고거부
+	var fnBanDelivery = function(ordNo, ordDtlNo) {
+		// 거부사유 팝업 선택 후 저장
+
+
+		var params = {};
+		params.ordNo = ordNo;
+		params.ordDtlNo = ordDtlNo;
+		params.delvArGb = 'N';  // 거부
+		mcxDialog.confirm('거부 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var jsonData = JSON.stringify(params);
+				gagajf.ajaxJsonSubmit('/pos/delivery/assign/save', jsonData, fnSetDelvCallback);
+			}
+		});
+	};
+	*/
+	// Cnplus엑셀다운로드
+	// $('#btnCnplus').on('click', function() {
+	//
+	// 	var selectedData = gridWaitingOptions.api.getSelectedNodes();
+	// 	var chk ="Y";
+	// 	$.each(selectedData, function(idx, row) {
+	//
+	// 		if(row.data.delvArGb == "P") {
+	// 			gridWaitingOptions.api.deselectIndex(row.rowIndex);
+	// 		}
+	// 	});
+	//
+	// 	mcxDialog.confirm('출고처리 하시겠습니까?', {
+	// 		cancelBtnText: "취소",
+	// 		sureBtnText: "확인",
+	// 		sureBtnClick: function(){
+	// 			fnSaveCnplus();
+	// 		}
+	// 	});
+	// });
+
+	// Cnplus엑셀재다운로드
+	$('#btnReCnplus').on('click', function() {
+
+		var selectedData = gagaAgGrid.selectedRowData(gridDeliveryOptions);
+		var dataLength = selectedData.length;
+		if (dataLength === 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		var ordDtlNoArr = [];
+		$.each(selectedData, function(idx, data) {
+			if(!gagajf.isNull(data.ordDtlNo)) {
+				ordDtlNoArr.push(data.ordDtlNo);
+			}
+		});
+
+		$('#deliveryInfo input[name=ordDtlNos]').val(ordDtlNoArr.join(','));
+		mcxDialog.confirm('CNPlus양식 엑셀 다운로드 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				fnExcelDownLoad('#deliveryInfo');
+			}
+		});
+	});
+
+	// CNPlus 엑셀 다운로드 저장
+	var fnSaveCnplus = function() {
+		var selectedData = gagaAgGrid.selectedRowData(gridWaitingOptions);
+		var dataLength = selectedData.length;
+		if (dataLength == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		var ordDtlNoArr = [];
+		$.each(selectedData, function(idx, data) {
+			if(!gagajf.isNull(data.ordDtlNo)) {
+				ordDtlNoArr.push(data.ordDtlNo);
+			}
+		});
+
+		$('#waitingOrder input[name=ordDtlNos]').val(ordDtlNoArr.join(','));
+		var jsonData = JSON.stringify(selectedData);
+		gagajf.ajaxJsonSubmit('/pos/invoice/save', jsonData, fnSaveCnplusCallback);
+	};
+
+	// CNPlus 엑셀 다운로드
+	var fnSaveCnplusCallback = function(dataList) {
+		if (dataList.length === 0)
+			return;
+		var resultMessage = '';
+		var ordDtlNoArr = [];
+		$.each(dataList, function(idx, data) {
+			resultMessage += '주문번호 : '+data.ordNo +' 주문상세번호 : '+data.ordDtlNo+ '결과 메시지 : '+ data.message +'<br/>';
+			if(data.status === 200) {
+				if(!gagajf.isNull(data.ordDtlNo)) {
+					ordDtlNoArr.push(data.ordDtlNo);
+				}
+			}
+		});
+		$('#waitingOrder input[name=ordDtlNos]').val(ordDtlNoArr.join(','));
+		mcxDialog.confirm(resultMessage+ 'CNPlus양식 엑셀 다운로드 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				fnExcelDownLoad('#waitingOrder');
+			}
+		});
+	};
+
+	//엑셀다운로드
+	var fnExcelDownLoad = function(formId) {
+		var params =  $(formId).serialize();
+		if(formId==='#waitingOrder') {
+			$('#orderExcelList').attr({ href : '/pos/order/excel/list?' + params }).get(0).click();
+		}
+		if(formId==='#deliveryInfo') {
+			$('#deliveryExcelList').attr({ href : '/pos/order/excel/list?' + params }).get(0).click();
+		}
+	};
+
+
+	// 송장번호 등록 버튼
+	$('#btnDeliveySave').on('click', function() {
+
+		var selectData = gagaAgGrid.selectedRowData(gridDeliveryOptions);
+		var dataLength = selectData.length;
+		if (dataLength === 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+
+		var selectedData = gridDeliveryOptions.api.getSelectedNodes();
+
+		var chk ="Y";
+		$.each(selectedData, function(idx, row) {
+
+			if(!gagajf.isNull(row.data.ordDtlNo)) {
+				// 송장번호 저장 완료건들 체크 풀기
+				if(row.data.ordDtlStat =="50" || row.data.ordDtlStat =="60" || row.data.ordDtlStat =="70"){
+					gridDeliveryOptions.api.deselectIndex(row.rowIndex);
+				}
+
+				if(row.data.shipCompCd == "7"){
+					var invoNo = row.data.invoiceNo;
+
+					//송장번호 자리수 체크 12자리
+					var invoNoLen  = invoNo.length;
+					if(invoNoLen != 12){
+						mcxDialog.alert('['+invoNo+']은 잘못된 송장번호 형식입니다.');
+						chk = "N";
+						return false;
+					}
+					// 송장번호 유효성 체크 [ 앞2자리 제외하고 3번째자리부터 9개숫자를 7로나눈 나머지가 12번째 숫자임.]
+					var invoNolast = invoNo.substring(11,12);
+					var chkInvono = invoNo.substring(2,11);
+					var invonoMod = chkInvono % 7 ;
+
+					if(invoNolast != invonoMod ){
+						mcxDialog.alert('['+invoNo+']은 잘못된 송장번호 형식입니다.');
+						chk = "N";
+						return false;
+					}
+				}
+
+				if(gagajf.isNull(row.data.invoiceNo)){
+					mcxDialog.alert('송장번호를 입력해 주세요.');
+					chk = "N";
+					return false;
+				}
+
+
+			}
+		});
+
+
+		var selectedData2 = gagaAgGrid.selectedRowData(gridDeliveryOptions);
+		var dataLength2 = selectedData2.length;
+		if (dataLength2 === 0) {
+			mcxDialog.alert('이미 완료된 대상입니다.');
+			return;
+		}
+
+		if(chk == "N") return false;
+		mcxDialog.confirm('송장번호등록 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				fnSaveInvoice();
+			}
+		});
+
+	});
+
+	// 송장번호 등록
+	var fnSaveInvoice = function(){
+		var selectedData = gagaAgGrid.selectedRowData(gridDeliveryOptions);
+		var dataLength = selectedData.length;
+		if (dataLength === 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		var ordDtlNoArr = [];
+		$.each(selectedData, function(idx, data) {
+			if(!gagajf.isNull(data.ordDtlNo)) {
+				ordDtlNoArr.push(data.ordDtlNo);
+			}
+		});
+
+		$('#deliveryInfo input[name=ordDtlNos]').val(ordDtlNoArr.join(','));
+		var jsonData = JSON.stringify(selectedData);
+		gagajf.ajaxJsonSubmit('/pos/invoice/save/invoiceno', jsonData, fnInvoiceCallback);
+	}
+
+	var fnInvoiceCallback = function() {
+		$('#tab3').trigger('click');
+		$('#btnDeliveySearch').trigger('click');
+		mcxDialog.alert('입력이 완료되었습니다.');
+	};
+
+	// 가이드 문서
+	var fnPpt = function(){
+		//var openWin = window.open("https://img.pastelmall.com/pastelmall_images/shop/guide.pdf", 'ppt_popup', "top=100, left=200, toolbar=no, menubar=no, scrollbars=no, resizable=yes" );
+	}
+	// 가이드 동영상
+	var fnVideo = function(){
+		//var openWin = window.open("", 'video_popup', "top=100, left=200, toolbar=no, menubar=no, scrollbars=no, resizable=yes" );
+		//openWin.document.body.innerHTML = '<video id="myVideo1" autoplay loop controls muted style="width:950px;"><source src="https://img.pastelmall.com/pastelmall_images/shop/guide.mp4" type="video/mp4">Your browser does not support HTML5 video.</video>';
+	};
+
+
+	$(document).ready(function() {
+		gagaAgGrid.createGrid('watingGrid', gridWaitingOptions);
+		gagaAgGrid.createGrid('deliveryGrid', gridDeliveryOptions);
+		gagaAgGrid.createGrid('usacGrid', gridUsacOptions);
+		gagaAgGrid.createGrid('banDelvGrid', gridBanDelvOptions);
+		cfnCreateCalendar('#deliveryTerms', 'deliveryStDate', 'deliveryEdDate', true, '조회');
+		cfnCreateCalendar('#waitTerms', 'waitOrdStDate', 'waitOrdEdDate', true, '조회');
+		cfnCreateCalendar('#usacTerms', 'usacStDate', 'usacEdDate', true, '조회');
+		cfnCreateCalendar('#banDelvTerms', 'banDelvStDate', 'banDelvEdDate', true, '조회');
+
+		setTimeout(fnSetDate, 100);
+	});
+
+	var fnSetDate = function(){
+		cfnChangeCalendar('1m', $('#deliveryStDate'), $('#deliveryEdDate'));
+		cfnChangeCalendar('7d', $('#waitOrdStDate'), $('#waitOrdEdDate'));
+		cfnChangeCalendar('1m', $('#usacStDate'), $('#usacEdDate'));
+		cfnChangeCalendar('1m', $('#banDelvStDate'), $('#banDelvEdDate'));
+
+		//$('#btnWaitSearch').trigger('click');
+	}
+
+	/*]]>*/
+</script>
+</body>
+</html>

+ 508 - 0
style24.admin/src/main/webapp/WEB-INF/views/withdraw/RefundDetailForm.html

@@ -0,0 +1,508 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : RefundDetailForm.html
+ * @desc    : 환불상세팝업
+ *============================================================================
+ * ISTYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.11.16   moon        최초 작성
+ *******************************************************************************
+ -->
+	<ul class="popup modal" data-width="1260" >
+		<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<h2>회수 상세</h2>
+			<button type="button" class="close" onclick="uifnPopupClose('popupWithdrawDetail')"><i class="fa fa-times"></i></button>
+		</div>
+		<!-- //TITLE -->
+
+			<form id="withdrawDetailForm" name="withdrawDetailForm" action="#" th:method="post" onSubmit="return false">
+				<input type="hidden" name="orgChgReason" readonly/>
+				<input type="hidden" name="orgEncloseFee" readonly/>
+				<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 />
+					</colgroup>
+					<tr>
+						<th>회수구분</th>
+						<td>
+							<span id="returnType"></span>
+							<input type="hidden" name="chgGb"/>
+						</td>
+						<th>도착일자</th>
+						<td>
+							<span id="arriValDt"></span>
+						</td>
+						
+					</tr>
+					<tr>
+						<th>최종요청사유</th>
+						<td>
+							<select name="chgReason"></select>
+						</td>
+						<th>귀책사유<i class="star"></i></th>
+						<td>
+							<span id="chgReasonText">
+							</span>
+						</td>
+					</tr>
+					<tr id="refundArea0">
+						<th>동봉비</th>
+						<td>
+							<input type="text" name="encloseFee" data-valid-type="integer" onchange="_encloseFee=$(this).val(); $('#withdrawDetailForm select[name=chgReason]').trigger('change');" class="w100 aR"/>원
+						</td>
+						<th>착불비</th>
+						<td>
+							<span id="codFee"></span>원
+						</td>
+					</tr>
+					<tr>
+						<th>회수메모</th>
+						<td>
+							<span id="shipMemo"></span>
+						</td>
+						<th>회수사유</th>
+						<td><span id="changeReason"></span></td>
+					</tr>
+					<tr>
+						<th>클레임메모</th>
+						<td colspan="3">
+							<span id="claimMemo"></span>
+						</td>
+					</tr>
+				</table>
+				
+				<div id="divRefundInfo">
+					<h4>환불 예정 정보</h4>
+					<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/>
+						</colgroup>
+						<tr id="refundArea1">
+							<th>총 결제 금액</th>
+							<td colspan="3"><span id="totPayAmt"></span>원 (상품 실결제 금액 : <span id="totRealAmt"></span>원, 배송비 : <span id="delvFee"></span>원)</td>
+						</tr>
+						<tr id="refundArea2">
+							<th>취소 상품 금액</th>
+							<td><span id="cnclGoodsAmt"></span>원</td>
+							<th>취소 사용 포인트</th>
+							<td><span id="cnclPointAmt"></span>원</td>
+							<th>취소 사용 쿠폰금액</th>
+							<td><span id="cnclCouponAmt"></span>원</td>
+							<th>취소 상품 환불금액</th>
+							<td><span id="cnclGoodsRefundAmt"></span>원</td>
+						</tr>
+						<tr>
+							<th>추가 고객부담 배송비</th>
+							<td>
+								<span id="custShipAmt"></span>원
+							</td>
+							<td colspan="4">
+								(원주문배송비 : <span id="orgDelvFee"></span>원 + 회수배송비 : <span id="returnDelvFee"></span>원)<span id="delvFeeAddText"></span>
+							</td>
+						</tr>
+						<tr id="refundArea4">
+							<th>환불예정금액</th>
+							<td colspan="7"><span id="totRefundAmt"></span>원</td>
+						</tr>
+					</table>
+				</div>
+				
+				<div class="cardArea" style="height: 350px;">
+					<h4 style="width:98%;">
+						회수대상 상품 정보
+						<span class="btnRight"  id="pgBtn" >
+							<label><input type="checkbox" name="pgStats" value="N" th:if="${sessionInfo.roleCd == '0000'}">PG 전문 미전송</label>
+						</span>
+					</h4>
+		
+					<div id="refundGridList" style="width: 100%; height: 260px; padding-top:10PX;" class="ag-theme-balham"></div>
+				</div>
+			</form>
+		
+		</div>
+	</ul>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+
+	var ordChgSq = [[${ordChgSq}]];	// 주문변경번호
+	var remainGoodsInfo = [[${remainGoodsInfo}]]; // 주문 남은 상품 정보
+	var remainGoodsList = [[${remainGoodsList}]]; // 주문 남은 상품 목록
+	var couponInfo = [[${couponInfo}]]; // 쿠폰 정보
+	var orderDetailSumAmt = [[${orderDetailSumAmt}]];
+	var sumQty = [[${sumQty}]];
+	var ordChgCnt = [[${ordChgCnt}]];	//회수신청건수
+	var chgGb = "반품";
+	
+	var columnDefsDetail = [
+		{headerName: "주문번호", 		field: "ordNo", 	width: 150, minWidth: 100, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return "<a href=\"javascript:void(0);\" onclick=\"cfnOpenOrderDetailPopup('" + params.value + "');\">" + params.value + "</a>";
+			}
+		},
+		{headerName: "상품코드", 		field: "goodsCd", 	width: 150, minWidth: 100, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return "<a href=\"javascript:void(0);\" onclick=\"cfnOpenGoodsDetailPopup('U','" + params.value + "','');\">" + params.value + "</a>";
+			}
+		},
+		{headerName: "사이즈", 		field: "sizeCd", 	width: 70, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "신청수량", 		field: "chgQty", 	width: 100, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "회수수량", 		field: "wdQty", 	width: 100, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "상품명", 		field: "goodsNm",	width: 150, minWidth: 100},
+		{headerName: "회수처리상태", 	field: "wdStat",	width: 120, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "회수처리", 		field: "ordDtlNo",	width: 120, minWidth: 100, cellClass: 'text-center'
+			, cellRenderer : function(params) {
+				if (params.data.wdStat == 'N') {
+					if (params.data.wdQty > 0) {
+						return "<a href=\"javascript:void(0);\" class=\"btn btn-base btn-sm\">회수컨펌</a>";
+					} else {
+						return "";
+					}
+				} else if (params.data.wdStat == 'Y') {
+					return "회수완료";
+				}
+			}
+		},
+		{headerName: "등록일", 		field: "regDt", 	width: 100, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "등록자", 		field: "udtId", 	width: 100, minWidth: 100, cellClass: 'text-center'}
+	];
+	
+	// Get withDrawDetailGridOptions
+	var withdrawDetailGridOptions = gagaAgGrid.getGridOptions(columnDefsDetail);
+	withdrawDetailGridOptions.rowSelection = 'multiple';
+	
+	withdrawDetailGridOptions.getRowStyle = function(params) {
+		if (params.data.wdStat == 'N') {
+			if (params.data.wdQty < 1) {
+				return { 'background-color': '#FF0000'};
+			}
+		} 
+	}
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('refundGridList', withdrawDetailGridOptions);
+		
+		fnDetailSearch(true);
+	});
+	
+	var initFlag = '';
+	//회수 상세내역 조회
+	var fnDetailSearch = function(Init) {
+		initFlag = Init;
+		var data = { 'ordChgSq' : ordChgSq };
+		var jsonData = JSON.stringify(data);
+		
+		gagajf.ajaxJsonSubmit('/withdraw/detail/list', jsonData, fnWithdrawDetailCallback);
+	}
+	
+	// 상세 정보 콜백 함수
+	var fnWithdrawDetailCallback = function(result) {
+		if (result.length < 1) {
+			mcxDialog.alert('회수데이터 오류입니다. 운영팀에 문의 해주세요! ');
+			return;
+		}
+		
+		var confirmCnt = 0;
+		$(result).each(function(idx) {
+			if (result[idx].wdStat == 'Y') {
+				confirmCnt++;
+			}
+			
+			// 전체 회수 완료 일 때.
+			if (result.length == confirmCnt || result[idx].mallGb == '20') {
+				fnSearch();
+				setReadOnly(true);
+				$('#pgBtn').hide();
+				$('#divRefundInfo').hide();
+			}
+		});
+		
+		// 회수리스트 설정
+		withdrawDetailGridOptions.api.setRowData(result); 
+		
+		if (!initFlag) return;
+		
+		fnSetWithdrawInfo(result[0]);	// 회수정보 설정
+		fnSetCnclInfo(result);			// 취소 관련 설정
+
+		if(chgGb == "40") {
+			$('#divRefundInfo').hide();
+		}
+	}
+	
+	var _orgDelvFee = 0;	// 최초 배송비
+	var _delvFee = 0;		// 배송비
+	var _totRealOrdAmt = 0;	// 상품 실결제금액
+	var _payAmt = 0;		// 총결제금액
+	var _encloseFee = 0;	// 동봉비
+	
+	var _totCnclGoodsAmt = 0;		// 총 취소 상품 금액
+	var _totCnclPointAmt = 0;		// 총 취소 사용 포입트
+	var _totCnclCouponAmt = 0;		// 총 취소 사용 쿠폰
+	var _totCnclGoodsRefundAmt = 0;	// 총 취소 상품 환불금액
+	
+	// 회수정보 설정
+	var fnSetWithdrawInfo = function(data) {
+		// 전역변수 설정
+		_orgDelvFee = gagajf.convNull(data.orgDelvFee, 0); // 최초배송비
+		_delvFee = data.delvFee; // 부과배송비
+		if(_orgDelvFee > 0) _delvFee = _orgDelvFee;
+		
+		_totRealOrdAmt = data.totRealOrdAmt;
+		_payAmt = data.payAmt == null ? 0 : data.payAmt;
+		_encloseFee = data.encloseFee;
+		
+		// 회수 상세
+		$('#withdrawDetailForm input[name=chgGb]').val(data.chgGb);
+		chgGb = data.chgGb;
+		$("#returnType").text(data.returnType); 		//회수구분
+		$('#arriValDt').text(data.regDt);				//회수일시
+		$('#shipMemo').text(data.wdMemo);				//회수메모
+		$('#codFee').text(data.codFee);					//착불비
+		$('#withdrawDetailForm input[name=chgReason]').val(data.wdReqReason);
+		$('#withdrawDetailForm input[name=orgChgReason]').val(data.wdReqReason);
+		$('#withdrawDetailForm input[name=encloseFee]').val(_encloseFee);			//동봉비
+		$('#withdrawDetailForm input[name=orgEncloseFee]').val(_encloseFee);			//동봉비
+		
+		$('#delvFee').text(_orgDelvFee.addComma());	//배송비
+		$('#totRealAmt').text(_totRealOrdAmt.addComma());	//상품 실결제 금액
+		$('#totPayAmt').text(_payAmt.addComma());	//총 결제금액
+		$('#claimMemo').text(data.chgMemo);
+		cfnCreateCombo('/renderer/avail/commonCode/list/G688', $('#withdrawDetailForm select[name=chgReason]'), '', data.chgReason);
+	}
+	
+	// 취소 금액 설정
+	var fnSetCnclInfo = function(data) {
+		$(data).each(function(idx, item) {
+			var sumCpn = item.goodsCpnDcAmt + item.cartCpnDcAmt + item.plusCpnDcAmt;
+			var sumPoint = item.pntDcAmt + item.prePntDcAmt;
+			
+			_totCnclCouponAmt += Number((sumCpn / (item.ordQty - item.cnclRtnQty)) * item.wdQty);
+			_totCnclPointAmt  += Number((sumPoint / (item.ordQty - item.cnclRtnQty)) * item.wdQty);
+			_totCnclGoodsAmt  += item.currPrice * Number(item.wdQty);
+			
+			if (item.ordQty != (item.wdQty + item.cnclRtnQty)) {
+				var tempCouponAmt = Number((sumCpn / (item.ordQty - item.cnclRtnQty)) * (item.ordQty - item.cnclRtnQty - item.wdQty));
+				var tempPointAmt = Number((sumPoint / (item.ordQty - item.cnclRtnQty)) * (item.ordQty - item.cnclRtnQty - item.wdQty));
+				var tempGoodsAmt = item.currPrice * (item.ordQty - item.cnclRtnQty - item.wdQty);
+				
+				var tempOrdAmt = Number(tempGoodsAmt - tempPointAmt - tempCouponAmt);
+				remainGoodsInfo.realOrdAmt += tempOrdAmt;
+			}
+		});
+		
+		_totCnclGoodsRefundAmt = Math.floor(_totCnclGoodsAmt) - Math.floor(_totCnclPointAmt) - Math.floor(_totCnclCouponAmt);
+
+		$('#cnclGoodsAmt').text(Math.floor(_totCnclGoodsAmt).addComma());
+		$('#cnclPointAmt').text(Math.floor(_totCnclPointAmt).addComma());
+		$('#cnclCouponAmt').text(Math.floor(_totCnclCouponAmt).addComma());
+		$('#cnclGoodsRefundAmt').text(Math.floor(_totCnclGoodsRefundAmt).addComma());
+
+		fnSetChgReason(data[0].chgReason);
+	}
+	
+	// 귀책사유 설정
+	$('#withdrawDetailForm select[name=chgReason]').on('change', function() {
+		fnSetChgReason($(this).val());
+	});
+	
+	// 변경요청설정
+	var fnSetChgReason = function(value) {
+		var checkData = ['10', '11', '12', '13', '15', '21', '30']; //귀책이 고객
+		var orgDelvFee = 0;
+		var custShipAmt = 0;
+		if (gagajf.isNull(value)) return;
+
+		if(ordChgCnt == 1) {	//1회 회수비 0원
+			_delvFee = 0;
+			$('#delvFeeAddText').text(" 1회 회수비용은 회사가 부담합니다.");
+		} else if (checkData.indexOf(value) != -1) {	// 고객 귀책사유인 경우
+			$('#chgReasonText').text('고객');
+			if(_orgDelvFee == 0) {	// 원주문 배송비가 0 이면
+				// 남은상품의 실주문금액이 최소주문금액보다 작거나 0인 경우 부과배송비(TB_GOODS 의 DELV_FEE)를 원주문 배송비로 저장
+				if (remainGoodsInfo.minOrdAmt > remainGoodsInfo.realOrdAmt || remainGoodsInfo.realOrdAmt == 0) {
+					orgDelvFee = _delvFee;
+				}
+			}
+			
+			//_orgDelvFee = orgDelvFee;
+			
+			if (couponInfo != null && couponInfo.buyLimitAmt > 0) {
+				if (couponInfo.buyLimitAmt > remainGoodsInfo.realOrdAmt) {	//남은상품의 실주문금액이 쿠폰사용금액기준액보다 작은경우 장바구니 쿠폰 취소
+					
+					$(remainGoodsList).each(function(idx, goods) {
+						_totCnclCouponAmt += Number(goods.cartCpnDcAmt);
+					});
+					
+					_totCnclGoodsRefundAmt = _totCnclGoodsAmt - _totCnclPointAmt - _totCnclCouponAmt;
+					$('#cnclCouponAmt').text(_totCnclCouponAmt.addComma());
+					$('#cnclGoodsRefundAmt').text(_totCnclGoodsRefundAmt.addComma());
+				}
+			}
+			
+			$('#orgDelvFee').text(orgDelvFee.addComma());
+			$('#returnDelvFee').text(_delvFee.addComma());
+			
+			// 고객부담 배송비 = 원주문배송비 + 회수배송비 + 착불비
+			custShipAmt = Number(orgDelvFee) + Number(_delvFee) + Number($('#codFee').text().replace(/,/gi, ""));
+		} else {
+			if (couponInfo != null && couponInfo.buyLimitAmt > 0) {
+				if (couponInfo.buyLimitAmt > remainGoodsInfo.realOrdAmt) {
+					
+					$(remainGoodsList).each(function(idx, goods) {
+						_totCnclCouponAmt -= Number(goods.cartCpnDcAmt);
+					});
+					
+					_totCnclGoodsRefundAmt = _totCnclGoodsAmt - _totCnclPointAmt - _totCnclCouponAmt;
+					$('#cnclCouponAmt').text(_totCnclCouponAmt.addComma());
+					$('#cnclGoodsRefundAmt').text(_totCnclGoodsRefundAmt.addComma());
+				}
+			}
+			
+			$('#chgReasonText').text('회사');
+			$('#orgDelvFee').text('0');
+			$('#returnDelvFee').text('0');
+		}
+		
+		
+		// 고객부담배송비 -= 동봉비
+		$('#custShipAmt').text((custShipAmt - $('#withdrawDetailForm input[name=encloseFee]').val().replace(/,/gi, "")).addComma());
+		
+		fnSetTotRefundData(custShipAmt);
+	}
+	
+	// 환불 금액 계산
+	var fnSetTotRefundData = function(custShipAmt) {
+		custShipAmt = (custShipAmt - $('#withdrawDetailForm input[name=encloseFee]').val().replace(/,/gi, ""));	// 배송비(고객부담배송비 - 동봉비)
+
+		if (_totCnclGoodsRefundAmt < 1)
+			return;
+		
+		if ($('#chgReasonText').text() == '고객') {
+			if (remainGoodsInfo.realOrdAmt == 0) {
+				var tempDelvFee = 0;
+			}
+		} else {	// 귀책사유가 회사에 있고 남은상품의 실주문금액이 0이거나 총취소환불금액과 같을 경우
+			var tempDelvFee = 0;
+			if (remainGoodsInfo.realOrdAmt == 0 || remainGoodsInfo.realOrdAmt == _totCnclGoodsRefundAmt) {
+				//tempDelvFee = _orgDelvFee;
+			}
+		}
+
+		var delvFee = tempDelvFee == 0 ? tempDelvFee : _orgDelvFee;
+		var totRefundAmt = Number(_totCnclGoodsRefundAmt) + Number(delvFee) - Number(custShipAmt);//- Number(custShipAmt);//+ Number(_orgDelvFee) - Number(custShipAmt);
+		$('#totRefundAmt').text(Math.floor(totRefundAmt).addComma());
+	}
+	
+	// 회수컨펌 클릭 시
+	withdrawDetailGridOptions.onCellClicked = function(event) {
+		if (event.colDef.field != "ordDtlNo" || event.data.wdQty < 1 || event.data.wdStat == "Y") return;
+		
+		if (sumQty.chgQty != sumQty.wdQty) {
+			mcxDialog.alert('반품신청 수량과 회수등록수량이 맞지 않습니다.<br/>반품신청수량 : ' + sumQty.chgQty + '<br/>회수등록수량 : ' + sumQty.wdQty);
+			return;
+		}
+		
+		fnWithdrawDetailConfirm(event.data);
+	}
+	
+	// 회수 컨펌
+	var confirmFlag = true;
+	var fnWithdrawDetailConfirm = function(data) {
+		var totPayAmt = $('#totPayAmt').text().replace(/,/gi,"");
+		var totRefundAmt = $('#totRefundAmt').text().replace(/,/gi,"");
+		
+		if ( data.mallGb == '10' && chgGb == '30') {
+			if (totRefundAmt <= 0) { // 아웃바운드 필요. (동동 및 계좌이체로 받아야함)
+				mcxDialog.alert('환불금액 부족합니다.');
+				return;
+			}
+			
+			if(Number(totRefundAmt) > Number(totPayAmt)) {
+				mcxDialog.alert('환불금액이 총 결제금액보다 큽니다.<br/>환불금액 : ' + totRefundAmt + '<br/>(남은)결제금액 : ' + totPayAmt);
+				return;
+			}
+		}
+		
+		var allData = gagaAgGrid.getAllRowData(withdrawDetailGridOptions);
+		var remainCnt = 0;
+		
+		$(allData).each(function(idx) {
+			remainCnt++;
+		});
+		
+		data.chgGb = $('#withdrawDetailForm input[name=chgGb]').val();
+		data.chgReason = $('#withdrawDetailForm select[name=chgReason]').val();	// 최종요청사유
+		data.orgChgReason = $('#withdrawDetailForm input[name=orgChgReason]').val();
+		data.encloseFee = $('#withdrawDetailForm input[name=encloseFee]').val().replace(/,/gi, "");		// 동봉비
+		data.orgEncloseFee = $('#withdrawDetailForm input[name=orgEncloseFee]').val().replace(/,/gi, "");		// 동봉비
+		data.custShipAmt = $('#custShipAmt').text().replace(/,/gi, "");	// 고객부담 배송비
+		data.pgStats = $('#withdrawDetailForm input:checkbox[name=pgStats]').is(":checked") ? "Y" : "N"; 
+		data.totRefundAmt = totRefundAmt;
+		data.mode = allData.length;
+		
+// 		data.searchType = '1'; // 테스트 에러
+
+		var jsonData = JSON.stringify(data);
+		
+		if (!confirmFlag) {
+			mcxDialog.alert('데이터 처리 중입니다.');
+			return;
+		}
+
+		mcxDialog.confirm('회수컨펌 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				gagajf.ajaxJsonSubmit('/withdraw/detail/confirm', jsonData, function(result) {
+					confirmFlag = true;
+					fnDetailSearch(false);
+				});
+			}
+		});
+	}
+	
+	// readonly 설정
+	var setReadOnly = function(flag) {
+		if (flag) {
+			$('#withdrawDetailForm input[name=encloseFee]').attr('readonly', 'readonly');
+			$('#withdrawDetailForm input[name=encloseFee]').addClass('formControl');
+			
+			$('#withdrawDetailForm select[name=chgReason]').attr('disabled', 'disabled');
+			$('#withdrawDetailForm select[name=chgReason]').addClass('formControl');	
+		} else {
+			$('#withdrawDetailForm input[name=encloseFee]').remove('readonly');
+			$('#withdrawDetailForm input[name=encloseFee]').removeClass('formControl');
+			
+			$('#withdrawDetailForm select[name=chgReason]').remove('disabled');
+			$('#withdrawDetailForm select[name=chgReason]').removeClass('formControl');
+		}
+		
+	}
+
+/*]]>*/
+</script>
+</html>

+ 244 - 0
style24.admin/src/main/webapp/WEB-INF/views/withdraw/RefundRegisterListForm.html

@@ -0,0 +1,244 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : RefundRegisterListForm.html
+ * @desc    : 환불관리 화면 Page
+ *=============================================================
+ * ISTYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *=============================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  ==================================
+ * 1.0  2020.11.16   moon        최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		<div class="panelStyle">
+			<!-- TITLE -->
+			<div class="panelTitle">
+				<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 <font color="red">기간, 키워드</font>중 하나를 꼭 입력해 주세요.</h3>
+				<span class="panelControl">
+					<i class="fa fa-chevron-up"></i>
+				</span>
+			</div>
+			<!-- //TITLE -->
+			<div class="panelContent">
+
+				<form id="searchForm" name="searchForm" action="#">
+					<table class="frmStyle">
+						<colgroup>
+							<col style="width:10%" />
+							<col style="width:40%" />
+							<col style="width:10%" />
+							<col style="width:40%" />
+						</colgroup>
+						<tbody>
+							<tr>
+								<th>구분</th>
+								<td colspan="3">
+									<select id="searchType" name="searchType">
+										<option value="withdrawDt">회수등록일자</option>
+										<option value="returnDt">교환/반품신청일자</option>
+										<option value="confirmDt">회수확정일자</option>
+									</select>
+									<span id="terms">
+										<input type="text" class="schDate w100" id="stDate" name="stDate" maxlength="10"/>
+										~
+										<input type="text" class="schDate w100" id="edDate" name="edDate" maxlength="10"/>
+									</span>
+								</td>
+							</tr>
+							<tr>
+								<th>주문번호</th>
+								<td >
+									<input type="text" id="ordNo" name="ordNo" class="w200" />
+								</td>
+								<th>회수송장번호</th>
+								<td>
+									<input type="text" name="wdInvoiceNo" class="w200" />
+								</td>
+							</tr>
+							<tr>
+								<th>회수상태</th>
+								<td >
+									<select id="withdrawType" name="withdrawType">
+										<option value="">전체</option>
+										<option value="B">교환/반품접수완료(실물입고)</option>
+										<option value="A">교환/반품접수대기(실물입고)</option>
+										<option value="D">회수컨펌완료</option>
+									</select>
+								</td>
+								<th>상품코드</th>
+								<td>
+									<input type="text" class="w200" name="goodsCd"/>
+								</td>
+							</tr>
+							<tr>
+								<th>회수컨펌지연일</th>
+								<td>
+									<input type="text" class="w50" id="delayDt" name="delayDt" value="" data-valid-type="numeric"/>일
+									<select id="delayDtType" name="delayDtType">
+										<option value="U">이상</option>
+										<option value="D">미만</option>
+									</select>
+								</td>
+								<th>등록ID</th>
+								<td>
+									<select id="regId" name="regId">
+										<option value="">[전체]</option>
+									</select>
+								</td>
+							</tr>
+						</tbody>
+					</table>
+	
+					<ul class="panelBar">
+						<li class="center">
+						<button type="button" class="btn btn-base btn-lg btn-lg" id="btnSearch">조회</button>
+						</li>
+					</ul>
+	
+				</form>
+			</div>
+		</div>
+		<div class="panelStyle">
+			<div class="panelContent" style="overflow: hidden;">
+				<div id="gridList" style="width:100%; height: 570px;" class="ag-theme-balham"></div>
+			</div>
+		</div>
+		
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	// specify the columns
+	var columnDefs = [
+// 		주문자 미상 사용 할 경우 주석 풀 것.
+		{headerName: "", field: "delete", width: 70, minWidth: 60, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				if (params.data.chgGb == "미상") {
+					return '<button type="button" class="btn btn-danger btn-sm" onclick="fnWithdrawDelete(\'' + params.data.wdInvoiceNo + '\' , \'' + params.data.goodsCd + '\' , \'' + params.data.sizeCd +'\');">삭제</button>';
+				} else {
+					return params.value;
+				}
+			}
+		},
+		{headerName: "회수지연일", 	field: "delayDt", 	width: 120, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "회수구분", 		field: "chgGb", 	width: 120, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "주문변경일련번호", field: "ordChgSq", 	width: 130, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "주문번호", 		field: "ordNo", 	width: 130, minWidth: 190, cellClass: 'text-center'},
+		{headerName: "변경요청주문번호", field: "ordChgSq", 	width: 100, minWidth: 100, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				if (gagajf.isNull(params.value)) { // 주문자 미상일 경우
+					if (gagajf.isNull(params.data.orgGoodsCd)) {
+						return "오반품";
+					} else {
+						return "<a href=\"javascript:void(0);\" class=\"btn btn-danger btn-sm\">회수등록</a>";
+					}
+				} else {
+					if (params.data.delayDt == '컨펌완료') {
+						return "<a href=\"javascript:void(0);\" class=\"btn btn-dark btn-sm\">컨펌완료</a>";
+					}else{
+						return "<a href=\"javascript:void(0);\" class=\"btn btn-base btn-sm\">회수컨펌</a>";
+					}
+				}
+			}
+		},
+		{headerName: "회수송장번호", 	field: "wdInvoiceNo", 	width: 150, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "접수송장번호", 	field: "invoiceNo", 	width: 150, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "보내는사람", 	field: "senderNm", 		width: 100, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "요청성명", 		field: "chgerNm",		width: 100, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "보낸연락처", 	field: "senderPhnno", 	width: 150, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "도착일시", 		field: "arrivalDt", 	width: 190, minWidth: 120, cellClass: 'text-center'},
+		{headerName: "회수확정일자", 	field: "wdEddt",	 	width: 190, minWidth: 120, cellClass: 'text-center'},
+		{headerName: "회수메모", 		field: "wdMemo", 		width: 150, minWidth: 100, cellClass: 'text-lecenterft'},
+		{headerName: "상품코드", 		field: "goodsCd", 		width: 150, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "사이즈", 		field: "sizeCd", 		width: 80, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "반품수량", 		field: "chgQty", 		width: 80, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "회수수량", 		field: "wdQty", 		width: 80, minWidth: 100, cellClass: 'text-center'},
+		{headerName: "클레임메모", 	field: "chgMemo", 		width: 200, minWidth: 100, cellClass: 'text-lecenterft'},
+		{headerName: "접수변경요청사유", field: "wdReqReason", 	width: 150, minWidth: 100, cellClass: 'text-center'},
+	];
+
+	// Get GridOptions
+	var withDrawGridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// Grid editable
+	withDrawGridOptions.defaultColDef.editable = false;
+
+	//일자조회구분 변경시 처리
+	$('#searchType').on('change', function() {
+		$('#delayDt').val('');
+	});
+
+	$(document).ready(function() {
+		cfnCreateCalendar('#terms', 'stDate', 'edDate', true, '조회');
+
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', withDrawGridOptions);
+
+		gagajf.setDate('#terms', 'stDate', 'edDate', '3m');
+
+		//uifnFitGrid('auto');
+	});
+
+	//조회버튼 클릭
+	$('#btnSearch').on('click', function() {
+		fnSearch();
+	});
+
+	var fnSearch = function() {
+		var formId = '#searchForm';
+		gagaAgGrid.fetch("/withdraw/refund/list", withDrawGridOptions, formId);
+	};
+
+	// cell Click
+	withDrawGridOptions.onCellClicked = function(event) {
+		if (event.colDef.field != 'ordChgSq') return;
+
+		// 회수등록 팝업
+		if (event.data.ordChgSq > 0 && !gagajf.isNull(event.data.ordChgSq) && event.data.wdQty > 0) {
+			// 회수 상세 화면
+			detailPopup(event.data.ordChgSq, event.data.ordNo);
+		} 
+	}
+
+	// 회수 상세 화면
+	var detailPopup = function(ordChgSq, ordNo) {
+		if (ordChgSq == 0) return;
+
+		var actionUrl = "/withdraw/refund/detail/form?ordChgSq=" + ordChgSq + '&ordNo=' + ordNo;
+		cfnOpenModalPopup(actionUrl, "popupWithdrawDetail");
+	}
+
+	// 회수 삭제
+	var fnWithdrawDelete = function(wdInvoiceNo, goodsCd, sizeCd) {
+		var params = new Object();
+		params.wdInvoiceNo = wdInvoiceNo;
+		params.goodsCd = goodsCd;
+		params.sizeCd = sizeCd;
+
+		var jsonData = JSON.stringify(params);
+		mcxDialog.confirm('회수 데이터를 삭제 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				gagajf.ajaxJsonSubmit('/withdraw/refund/Withdraw/delete', jsonData, fnSearch);
+			}
+		});
+	}
+
+/*]]>*/
+</script>
+</html>

+ 39 - 0
style24.batch/src/main/java/com/style24/batch/biz/dao/TsbDeliveryDao.java

@@ -0,0 +1,39 @@
+package com.style24.batch.biz.dao;
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Delivery;
+
+/**
+ * 배송 Dao
+ *
+ * @author moon
+ * @since 2020. 12. 08
+ */
+@ShopDs
+public interface TsbDeliveryDao {
+
+	/**
+	 * 총알배송 권역정보 갱신
+	 * @param 
+	 * @return
+	 * @author moon
+	 * @since 2020. 12. 08
+	 */
+	void mergeDailyDeliveryZone(Delivery delivery);
+
+	/**
+	 * 배치로그 생성
+	 * @param batchLog - 배치로그 정보
+	 * @author gagamel
+	 * @since 2020. 12. 2
+	 */
+	//void createBatchLog(BatchLog batchLog);
+
+	/**
+	 * 배치로그 종료 처리
+	 * @param batchLogSq - 배치로그일련번호
+	 * @author gagamel
+	 * @since 2020. 12. 2
+	 */
+	//void updateBatchLog(Integer batchLogSq);
+
+}

+ 26 - 0
style24.batch/src/main/java/com/style24/batch/biz/dao/TsbWmsDeliveryDao.java

@@ -0,0 +1,26 @@
+package com.style24.batch.biz.dao;
+
+import java.util.Collection;
+import com.style24.core.support.annotation.WmsDs;
+import com.style24.persistence.domain.Delivery;
+
+/**
+ * 배송 Dao
+ *
+ * @author moon
+ * @since 2020. 12. 08
+ */
+@WmsDs
+public interface TsbWmsDeliveryDao {
+
+	/**
+	 * WMS_IF 총알배송 권역정보 조회
+	 * @param batchId - 배치ID
+	 * @return
+	 * @author moon
+	 * @since 2020. 12. 08
+	 */
+	Collection<Delivery> getWmsIfDailyDeliveryZoneList();
+	
+	
+}

+ 73 - 0
style24.batch/src/main/java/com/style24/batch/biz/job/delivery/TsbDailyDeliveryZoneJob.java

@@ -0,0 +1,73 @@
+package com.style24.batch.biz.job.delivery;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbDeliveryService;
+import com.style24.batch.biz.service.TsbWmsDeliveryService;
+import com.style24.persistence.domain.Delivery;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 권영배송정보 갱신 (wmsif to mall) 
+ *
+ * @author moon
+ * @since 2020. 12. 08
+ */
+@Component
+@Slf4j
+public class TsbDailyDeliveryZoneJob extends TsbAbstractJob<Delivery, Delivery, Delivery> {
+
+	@Autowired
+	private TsbDeliveryService deliveryService;
+
+	@Autowired
+	private TsbWmsDeliveryService wmsDeliveryService
+	
+	;
+	private int succCnt = 0;
+	private int failCnt = 0;
+
+	@Override
+	public Delivery read() throws Exception {
+
+		Delivery delivery = new Delivery();
+		return delivery;
+	}
+
+	@Override
+	public Delivery process(Delivery delivery) throws Exception {
+		succCnt = 0;
+		failCnt = 1;
+		/**
+		 * 1. wms_if: TB_IF_DailyDeliveryZone 조회 
+		 * 2. mall: TB_DailyDeliveryZone merge 
+		 * */
+		
+		// 1. wms_if: TB_IF_DailyDeliveryZone 조회 
+		Collection<Delivery> dailyDeliZoneList = wmsDeliveryService.getWmsIfDailyDeliveryZoneList();
+		
+		// 2. mall: TB_DailyDeliveryZone merge 
+		deliveryService.mergeDailyDeliveryZone(dailyDeliZoneList);
+		succCnt = 1;
+		failCnt = 0;
+		
+		return delivery;
+	}
+
+	@Override
+	public Delivery write(Delivery delivery) throws Exception {
+
+		return delivery;
+	}
+
+	@Override
+	public void notify(Delivery delivery) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 71 - 0
style24.batch/src/main/java/com/style24/batch/biz/service/TsbDeliveryService.java

@@ -0,0 +1,71 @@
+package com.style24.batch.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.batch.biz.dao.TsbDeliveryDao;
+import com.style24.batch.support.env.TsbConstants;
+import com.style24.persistence.domain.Delivery;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 배치 Service
+ *
+ * @author moon
+ * @since 2020. 12. 08
+ */
+@Service
+@Slf4j
+public class TsbDeliveryService {
+
+	@Autowired
+	private TsbDeliveryDao deliveryDao;
+
+	/**
+	 * 총알배송 권역정보 갱신 
+	 * @param  Collection<Delivery>
+	 * @return 
+	 * @author moon
+	 * @since  2020. 12. 08
+	 */
+	public void mergeDailyDeliveryZone(Collection<Delivery> dailyDeliZoneList) {
+        
+		for(Delivery delivery : dailyDeliZoneList) {
+			deliveryDao.mergeDailyDeliveryZone(delivery);
+		}
+	}
+
+	/**
+	 * 배치로그 생성
+	 * @param batchId - 배치ID
+	 * @return 배치로그일련번호
+	 * @author gagamel
+	 * @since 2020. 12. 2
+	 */
+//	@Transactional("shopTxnManager")
+//	public Integer createBatchLog(String batchId) {
+//
+//		BatchLog batchLog = new BatchLog();
+//		batchLog.setBatchId(batchId);
+//		batchLog.setRegNo(TsbConstants.REG_NO);
+//		batchDao.createBatchLog(batchLog);
+//
+//		return batchLog.getBatchLogSq();
+//	}
+
+	/**
+	 * 배치로그 종료 처리
+	 * @param batchLogSq - 배치로그일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 12. 2
+	 */
+//	public void updateBatchLog(Integer batchLogSq) {
+//		batchDao.updateBatchLog(batchLogSq);
+//	}
+
+}

+ 46 - 0
style24.batch/src/main/java/com/style24/batch/biz/service/TsbWmsDeliveryService.java

@@ -0,0 +1,46 @@
+package com.style24.batch.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.batch.biz.dao.TsbWmsDeliveryDao;
+import com.style24.batch.support.env.TsbConstants;
+import com.style24.persistence.domain.Delivery;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 배치 Service
+ *
+ * @author moon
+ * @since  2020. 12. 08
+ */
+@Service
+@Slf4j
+public class TsbWmsDeliveryService {
+
+	@Autowired
+	private TsbWmsDeliveryDao wmsDeliveryDao;
+
+
+	/**
+	 * WMS_IF 총알배송 권역정보 조회 
+	 * @param 
+	 * @return Collection<Delivery>
+	 * @author moon
+	 * @since  2020. 12. 08
+	 */
+	//@Transactional("wmsTxnManager")
+	public Collection<Delivery> getWmsIfDailyDeliveryZoneList() {
+
+		Collection<Delivery> list = null;
+		
+		list = wmsDeliveryDao.getWmsIfDailyDeliveryZoneList();
+		
+		return list ;
+	}
+
+}

+ 61 - 0
style24.batch/src/main/java/com/style24/batch/biz/task/TsbDeliveryTask.java

@@ -0,0 +1,61 @@
+package com.style24.batch.biz.task;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import com.style24.batch.biz.job.delivery.TsbDailyDeliveryZoneJob;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 배송 Task
+ * @author moon
+ * @since 2020. 12. 08
+ */
+@Component
+@Slf4j
+public class TsbDeliveryTask {
+
+	@Autowired
+	private TsbDailyDeliveryZoneJob dailyDeliveryZoneJob;
+
+
+
+
+	/**
+	 * 초 분 시 일 월 주(년)
+	 * 0 0 12 * * ?"             : 아무 요일, 매월, 매일 12:00:00
+	 * 0 15 10 ? * *"            : 모든 요일, 매월, 아무 날이나 10:15:00
+	 * 0 15 10 * * ?"            : 아무 요일, 매월, 매일 10:15:00
+	 * 0 15 10 * * ? *"          : 모든 연도, 아무 요일, 매월, 매일 10:15
+	 * 0 15 10 * * ?             : 2005" 2005년 아무 요일이나 매월, 매일 10:15
+	 * 0 * 14 * * ?"             : 아무 요일, 매월, 매일, 14시 매분 0초
+	 * 0 0/5 14 * * ?"           : 아무 요일, 매월, 매일, 14시 매 5분마다 0초
+	 * 0 0/5 14,18 * * ?"        : 아무 요일, 매월, 매일, 14시, 18시 매 5분마다 0초
+	 * 0 0-5 14 * * ?"           : 아무 요일, 매월, 매일, 14:00 부터 매 14:05까지 매 분 0초
+	 * 0 10,44 14 ? 3 WED"       : 3월의 매 주 수요일, 아무 날짜나 14:10:00, 14:44:00
+	 * 0 15 10 ? * MON-FRI"      : 월~금, 매월, 아무 날이나 10:15:00
+	 * 0 15 10 15 * ?"           : 아무 요일, 매월 15일 10:15:00
+	 * 0 15 10 L * ?"            : 아무 요일, 매월 마지막 날 10:15:00
+	 * 0 15 10 ? * 6L"           : 매월 마지막 금요일 아무 날이나 10:15:00
+	 * 0 15 10 ? * 6L 2002-2005" : 2002년부터 2005년까지 매월 마지막 금요일 아무 날이나 10:15:00
+	 * 0 15 10 ? * 6#3"          : 매월 3번째 금요일 아무 날이나 10:15:00
+	 *
+	 * @throws Exception
+	 */
+
+	/**
+	 * 총알배송 권역정보   : 일배치  오전 11시  
+	 *
+	 * @throws Exception
+	 */
+	//@Scheduled(cron = "${cron.delivery.tsbDailyDeliveryZoneJob}")
+	@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbDailyDeliveryZoneJob() throws Exception {
+		dailyDeliveryZoneJob.run("cron.delivery.daily.deliveryZone");
+	}
+
+}

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

@@ -0,0 +1,39 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 배송 Domain
+ *
+ * @author moon
+ * @since 2020. 12. 08
+ */
+@SuppressWarnings("serial")
+@Data
+public class Delivery extends TscBaseDomain {
+
+	
+	private String zipNo;
+	private String pndBran;
+	private String pndBranNm;
+	private String operAboveBran;
+	private String trBranNm;
+	private String cityDo;
+	private String guGun;
+	private String dongYupMeun;
+	private String deliveryTime;
+	private String deliveryProbability;
+	private String deliveryclasscd;
+	private String isuse;
+	
+	private int rtnCd;
+	private String rtnMsg;
+	
+	
+
+	
+}
+
+

+ 58 - 0
style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbDelivery.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.batch.biz.dao.TsbDeliveryDao">
+	
+	<!-- 총알배송 권역정보 등록  -->
+	<insert id="mergeDailyDeliveryZone" parameterType="Delivery" >
+		/*TsbDelivery.mergeDailyDeliveryZone*/
+		
+			INSERT INTO TB_DAILY_DELIVERY_ZONE
+			(
+				  ZIP_NO
+				, PND_BRAN
+				, PND_BRAN_NM
+				, OPER_ABOVE_BRAN
+				, TR_BRAN_NM
+				, CITY_DO
+				, GU_GUN
+				, DONG_YUP_MEUN
+				, DELIVERY_TIME
+				, DELIVERY_PROBABILITY
+				, DELIVERYCLASSCD
+				, ISUSE
+                , DATELASTUPDATE
+			)
+			VALUES
+			(
+			 	  #{zipNo}
+				, #{pndBran}
+				, #{pndBranNm}
+				, #{operAboveBran}
+				, #{trBranNm}
+				, #{cityDo}
+				, #{guGun}
+				, #{dongYupMeun}
+				, #{deliveryTime}
+				, #{deliveryProbability}
+				, #{deliveryclasscd}
+				, #{isuse}
+                , NOW()
+			)
+			ON 
+			DUPLICATE KEY
+			UPDATE
+			  PND_BRAN	            = #{pndBran}
+			, PND_BRAN_NM	        = #{pndBranNm}
+			, OPER_ABOVE_BRAN	    = #{operAboveBran}
+			, TR_BRAN_NM	        = #{trBranNm}
+			, CITY_DO	            = #{cityDo}
+			, GU_GUN	            = #{guGun}
+			, DONG_YUP_MEUN	        = #{dongYupMeun}
+			, DELIVERY_TIME	        = #{deliveryTime}
+			, DELIVERY_PROBABILITY	= #{deliveryProbability}
+			, DELIVERYCLASSCD	    = #{deliveryclasscd}
+			, ISUSE	                = #{isuse}
+            , DATELASTUPDATE        = NOW()
+	</insert>
+
+</mapper>

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

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.batch.biz.dao.TsbWmsDeliveryDao">
+	
+	<!-- WMS 총알배송 권역정보 생성 1  
+	<select id="uspWmsDailyTmlInfoE10" statementType="CALLABLE" parameterType="Delivery" resultType="Delivery"  >
+		/* TsbDelivery.saveOrderDeliveryLocAssign   */
+		{ CALL USP_WMS_DailyTmlInfo_E10( '14', #{rtnCd, mode=OUT, jdbcType=INT, javaType=integer}, #{rtnMsg, mode=OUT, jdbcType=NVARCHAR, javaType=String}) }
+	</select>
+	-->
+	<!-- WMS 총알배송 권역정보 생성 2  
+	<select id="uspWmsDailyTmlInfoE20" statementType="CALLABLE" parameterType="Delivery" resultType="Delivery"  >
+		/* TsbDelivery.saveOrderDeliveryLocAssign   */
+		{ CALL USP_WMS_DailyTmlInfo_E10( '14', #{rtnCd, mode=OUT, jdbcType=INT, javaType=integer}, #{rtnMsg, mode=OUT, jdbcType=NVARCHAR, javaType=String}) }
+	</select>	
+	-->
+	
+	<!-- WMS_IF 총알배송 권역정보 조회   -->	
+	<select id="getWmsIfDailyDeliveryZoneList" resultType="Delivery">
+	/*TsbWmsDelivery.getWmsIfDailyDeliveryZoneList*/
+		SELECT
+			  ZIP_NO	
+			, PND_BRAN	
+			, PND_BRAN_NM	
+			, OPER_ABOVE_BRAN	
+			, TR_BRAN_NM	
+			, CITY_DO	
+			, GU_GUN	
+			, DONG_YUP_MEUN	
+			, DELIVERY_TIME	
+			, DELIVERY_PROBABILITY	
+			, DELIVERYCLASSCD	 
+			, CASE WHEN ISUSE = 0 THEN 'Y' ELSE 'N' END AS ISUSE
+
+		FROM TB_IF_DAILYDELIVERYZONE
+	   WHERE ISUSE = 0
+	/*	WHERE DATELASTUPDATE > CONVERT(datetime,'20200311'+' 00:00:00') */
+	</select>
+	
+</mapper>

+ 5 - 0
style24.batch/src/main/resources/config/application-locd.yml

@@ -54,3 +54,8 @@ cron:
     statistics:
         inflow: 2 22 2 29 2 ?
         inflow.yesterday: 2 22 2 29 2 ?
+    #배송
+    delivery:
+        # 총알배송 권역정보 갱신 (매일 11시)
+        #tsbDailyDeliveryZoneJob: 0 0 11 * * ?
+        tsbDailyDeliveryZoneJob: 2 22 2 29 2 ?