xodud lee il y a 4 ans
Parent
commit
79596dae95
23 fichiers modifiés avec 7491 ajouts et 187 suppressions
  1. BIN
      lib/gagaframework-shoplinker-1.7.2-RELEASE.jar
  2. 8 1
      pom.xml
  3. 340 0
      src/main/java/com/style24/core/biz/dao/TscOrderOcmDao.java
  4. 292 0
      src/main/java/com/style24/core/biz/dao/TscShoplinkerDao.java
  5. 44 0
      src/main/java/com/style24/core/biz/service/TscKakaotalkService.java
  6. 68 12
      src/main/java/com/style24/core/biz/service/TscMailService.java
  7. 44 10
      src/main/java/com/style24/core/biz/service/TscOrderChangeService.java
  8. 855 0
      src/main/java/com/style24/core/biz/service/TscOrderOcmService.java
  9. 14 10
      src/main/java/com/style24/core/biz/service/TscOrderService.java
  10. 1797 0
      src/main/java/com/style24/core/biz/service/TscShoplinkerService.java
  11. 4 3
      src/main/java/com/style24/core/biz/thirdparty/NetpathyMailSender.java
  12. 63 6
      src/main/java/com/style24/core/support/env/TscConstants.java
  13. 2 0
      src/main/java/com/style24/persistence/domain/Alarm.java
  14. 827 0
      src/main/java/com/style24/persistence/domain/ExtmallOrder.java
  15. 138 0
      src/main/java/com/style24/persistence/domain/ShoplinkerGoods.java
  16. 67 0
      src/main/java/com/style24/persistence/domain/ShoplinkerInvoice.java
  17. 121 0
      src/main/java/com/style24/persistence/domain/ShoplinkerOrder.java
  18. 103 0
      src/main/java/com/style24/persistence/domain/ShoplinkerSearch.java
  19. 48 0
      src/main/java/com/style24/persistence/domain/ShoplinkerStock.java
  20. 112 89
      src/main/java/com/style24/persistence/mybatis/shop/TscOrder.xml
  21. 74 56
      src/main/java/com/style24/persistence/mybatis/shop/TscOrderChange.xml
  22. 1570 0
      src/main/java/com/style24/persistence/mybatis/shop/TscOrderOcm.xml
  23. 900 0
      src/main/java/com/style24/persistence/mybatis/shop/TscShoplinker.xml

BIN
lib/gagaframework-shoplinker-1.7.2-RELEASE.jar


+ 8 - 1
pom.xml

@@ -57,7 +57,14 @@
 			<scope>system</scope>
 			<systemPath>${basedir}/lib/gagaframework-excel-1.7.1-RELEASE.jar</systemPath>
 		</dependency>
-		
+		<dependency>
+			<groupId>com.gagaframework</groupId>
+			<artifactId>gagaframework-shoplinker</artifactId>
+			<version>1.7-RELEASE</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/lib/gagaframework-shoplinker-1.7.2-RELEASE.jar</systemPath>
+		</dependency>
+
 		<!-- ///KCP -->
 		<dependency>
 			<groupId>com.kcp</groupId>

+ 340 - 0
src/main/java/com/style24/core/biz/dao/TscOrderOcmDao.java

@@ -0,0 +1,340 @@
+package com.style24.core.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.ExtmallOrder;
+import com.style24.persistence.domain.Payment;
+import com.style24.persistence.domain.ShoplinkerStock;
+
+/**
+ * 영업망관리 Dao
+ *
+ * @author jmh
+ * @since 2021. 06. 25
+ */
+@ShopDs
+public interface TscOrderOcmDao {
+
+	/**
+	 * 제휴몰주문등록 - 주문업로드 그룹별 목록
+	 *
+	 * @param extmallOrder
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 31
+	 */
+	Collection<ExtmallOrder> getExtmallMasterOrderList(ExtmallOrder extmallOrder);
+
+	/**
+	 * 제휴몰주문등록 - 주문업로드 전체 목록
+	 *
+	 * @param extmallOrder
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 31
+	 */
+	Collection<ExtmallOrder> getExtmallOrderList(ExtmallOrder extmallOrder);
+
+	/**
+	 * 제휴몰주문등록 - 주문등록
+	 *
+	 * @param extmallOrder
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 31
+	 */
+	void insertExtmallOrder(ExtmallOrder extmallOrder);
+
+	/**
+	 * 제휴몰주문등록 - 주문등록 상태값 업데이트
+	 * @param extmallOrder
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 01. 28
+	 */
+	void updateExtmallOrder(ExtmallOrder extmallOrder);
+
+	/**
+	 * 제휴몰주문등록 - 주문등록체크정보
+	 * @param extmallOrder
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 31
+	 */
+	ExtmallOrder getExtmallOrderInfo(ExtmallOrder extmallOrder);
+
+
+	// ------------------------- 주문등록 소스 -------------------------------------------//
+	// ------------------------- 주문등록 소스 -------------------------------------------//
+	/**
+	 * 1. 주문기본정보 등록
+	 *
+	 * @param extmallOrder - 주문 정보
+	 * @return
+	 * @author jmh
+	 * @since 2021. 03. 09
+	 */
+	int createOrder(ExtmallOrder extmallOrder);
+
+	/**
+	 * 2. 주문배송지정보 등록
+	 *
+	 * @param extmallOrder - 주문 정보
+	 * @return
+	 * @author jmh
+	 * @since 2021. 03. 09
+	 */
+	int createDeliveryAddr(ExtmallOrder extmallOrder);
+
+	/**
+	 * 3. 주문배송비정보등록 등록
+	 *
+	 * @param extmallOrder - 주문 정보
+	 * @return
+	 * @author jmh
+	 * @since 2021. 03. 09
+	 */
+	int createDeliveryFee(ExtmallOrder extmallOrder);
+
+	/**
+	 * 4. 주문상세정보등록 등록
+	 *
+	 * @param extmallOrder - 주문 정보
+	 * @return
+	 * @author jmh
+	 * @since 2021. 03. 09
+	 */
+	int createOrderDetail(ExtmallOrder extmallOrder);
+
+	/**
+	 * 4-2 주문상세 이력 등록
+	 *
+	 * @param extmallOrder
+	 * @return
+	 * @author jmh
+	 * @since 2020. 11. 30
+	 */
+	int createOrderDetailHst(ExtmallOrder extmallOrder);
+
+	/**
+	 * 5. 주문상세단품정보등록 등록
+	 *
+	 * @param extmallOrder - 주문 정보
+	 * @return
+	 * @author jmh
+	 * @since 2021. 03. 09
+	 */
+	Collection<ExtmallOrder> getOrderDetailItem(ExtmallOrder extmallOrder);
+
+	/**
+	 * 6. 주문상세단품정보등록 등록
+	 *
+	 * @param extmallOrder - 주문 정보
+	 * @return
+	 * @author jmh
+	 * @since 2021. 03. 09
+	 */
+	int createOrderDetailItem(ExtmallOrder extmallOrder);
+
+	/**
+	 * 7. 주문상세단품이력정보등록 등록
+	 *
+	 * @param extmallOrder - 주문 정보
+	 * @return
+	 * @author jmh
+	 * @since 2021. 03. 09
+	 */
+	int createOrderDetailItemHst(ExtmallOrder extmallOrder);
+
+	/**
+	 * 8. 주문사은품 마스터 정보 등록
+	 *
+	 * @param extmallOrder - 주문 정보
+	 * @return
+	 * @author jmh
+	 * @since 2021. 03. 09
+	 */
+	int createOrdFreegift(ExtmallOrder extmallOrder);
+
+	/**
+	 * 9. 주문사은품 상품 정보 등록
+	 *
+	 * @param extmallOrder - 주문 정보
+	 * @return
+	 * @author jmh
+	 * @since 2021. 03. 09
+	 */
+	int createOrdFreegiftVal(ExtmallOrder extmallOrder);
+
+	/**
+	 * 10. 주문사은품 주문상세 정보 등록
+	 * @param extmallOrder - 주문 정보
+	 * @return
+	 * @author jmh
+	 * @since 2021. 03. 09
+	 */
+	int createOrdFreegiftDtl(ExtmallOrder extmallOrder);
+
+	/**
+	 * 11. PAYMENT INSERT
+	 * @param param
+	 * @return
+	 */
+	int insertPayment(Payment param);
+
+	/**
+	 * 12. 재고정보등록
+	 * @param extmallOrder - 주문 정보
+	 * @return
+	 * @author jmh
+	 * @since 2021. 03. 09
+	 */
+	int createSellQty(ExtmallOrder extmallOrder);
+
+	/**
+	 * 13. 사은품 남은수량 업데이트
+	 * @param extmallOrder - 주문 정보
+	 * @return
+	 * @author jmh
+	 * @since 2021. 04. 13
+	 */
+	int updateFreegiftValLeftQty(ExtmallOrder extmallOrder);
+
+	/**
+	 * 상품 재고 조회
+	 * @param shoplinkerStock
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 01. 28
+	 */
+	ShoplinkerStock getGoodsStockInfo(ShoplinkerStock shoplinkerStock);
+
+	/**
+	 * 사은품 : 1차조건 적용된 사음품 정보, 상품 금액 조회
+	 *
+	 * @param Order
+	 * @author jsh77b
+	 * @since 2021. 02. 02
+	 */
+	Collection<ExtmallOrder> getFreeGiftGoodsApplyAmt(ExtmallOrder extmallOrder);
+
+	/**
+	 * 사은품 : 2차조건 적용된 사은품상품금액 구간정보조회
+	 *
+	 * @param Order
+	 * @author jsh77b
+	 * @since 2021. 02. 02
+	 */
+	Collection<ExtmallOrder> getFreeGiftGoodsApplySection(ExtmallOrder extmallOrder);
+
+	/**
+	 * 사은품 : 3차조건 적용된 구간정보의 사은품정보조회
+	 *
+	 * @param Order
+	 * @author jsh77b
+	 * @since 2021. 02. 02
+	 */
+	Collection<ExtmallOrder> getFreeGiftGoodsApplyVal(ExtmallOrder extmallOrder);
+	// ------------------------- 주문등록 소스 끝 -------------------------------------------//
+	// ------------------------- 주문등록 소스 끝 -------------------------------------------//
+
+
+
+
+
+
+
+	/**
+	 * 제휴몰주문 임시 테이블 삭제
+	 *
+	 * @param userNo - 사용자아이디
+	 * @return int
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	int deleteExtmallOrderUploadTmp(int userNo);
+
+	/**
+	 * 외부몰주문등록 테이블 실패목록 데이터 삭제
+	 *
+	 * @param userNo - 사용자아이디
+	 * @return int
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	int deleteExtmallOrderUploadFail(int userNo);
+
+	/**
+	 * 제휴몰주문등록 (TB_EXTMALL_ORDER_UPLOAD_TMP)
+	 *
+	 * @param extmallOrderUpload - 제휴몰주문업로드정보
+	 * @return int
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	int createExtmallOrderUploadTmp(ExtmallOrder extmallOrder);
+
+	/**
+	 * 제휴몰주문등록 업로드 후 목록
+	 *
+	 * @param extmallOrder - 제휴몰주문업로드정보
+	 * @return Collection<ExtmallOrder>
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	Collection<ExtmallOrder> getExtmallOrderUploadTmpList(ExtmallOrder extmallOrder);
+
+	/**
+	 * 제휴몰주문업로드 생성 - 제휴몰 벤더ID 가져오기
+	 *
+	 * @param regId -
+	 * @return String
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	String getVendorId(String regId);
+
+	/**
+	 * 제휴몰주문등록 업로드 후 주문업로드 생성
+	 *
+	 * @param extmallOrderUpload - 제휴몰주문업로드정보
+	 * @return int
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	int createExtmallOrderUploadSecond(ExtmallOrder extmallOrder);
+
+	/**
+	 * 제휴몰주문등록 주문업로드 후 목록
+	 *
+	 * @param extmallOrder - 제휴몰주문업로드정보
+	 * @return Collection<ExtmallOrder>
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	Collection<ExtmallOrder> getExtmallOrderUploadSecondList(ExtmallOrder extmallOrder);
+
+	/**
+	 * 제휴몰 주문 업로드 목록
+	 *
+	 * @param extmallOrder - 외부몰주문업로드 정보
+	 * @return Collection<ExtmallOrder>
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	Collection<ExtmallOrder> getExtmallOrderUploadList(ExtmallOrder extmallOrder);
+
+	/**
+	 * 제휴몰 주문 업로드 결과정보
+	 *
+	 * @param extmallOrder - 외부몰주문업로드 정보
+	 * @return Collection<ExtmallOrder>
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	ExtmallOrder getExtmallOrderUploadResultInfo(ExtmallOrder extmallOrder);
+
+
+	void insertTestNotiInfo(ExtmallOrder extmallOrder);
+}

+ 292 - 0
src/main/java/com/style24/core/biz/dao/TscShoplinkerDao.java

@@ -0,0 +1,292 @@
+package com.style24.core.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.ExtmallOrder;
+import com.style24.persistence.domain.ShoplinkerGoods;
+import com.style24.persistence.domain.ShoplinkerInvoice;
+import com.style24.persistence.domain.ShoplinkerOrder;
+import com.style24.persistence.domain.ShoplinkerSearch;
+
+/**
+ * 샵링커 Dao
+ *
+ * @author jmh
+ * @since 2021. 5. 20
+ */
+@ShopDs
+public interface TscShoplinkerDao {
+
+	/**
+	 * 시퀀스 조회
+	 * @param value - 시퀀스명
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	Integer getNextOrderIfIdx();
+
+	/**
+	 * 샵링커 전송 이력
+	 *
+	 * @param shoplinkerSearch
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	void insertShoplinerApiHst(ShoplinkerGoods shoplinkerGoods);
+
+	/**
+	 *  샵링커 api 호출 가능여부
+	 *
+	 * @param
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	ShoplinkerSearch getCallRunableInfo(ShoplinkerSearch slkSearch);
+
+	/**
+	 * 샵링커 api 호출 가능여부 상태 저장
+	 *
+	 * @param dataMap
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	void saveCallApiRunable(ShoplinkerSearch slkSearch);
+
+	/**
+	 * 샵링커 api 호출 가능여부 상태 수정
+	 *
+	 * @param dataMap
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	void updateCallApiRunable(ShoplinkerSearch slkSearch);
+
+	/**
+	 * 상품등록-단품 목록 조회
+	 *
+	 * @param shoplinkerSearch
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	Collection<ShoplinkerGoods> getOptionList(ShoplinkerGoods shoplinkerSearch);
+
+	/**
+	 * 상품등록-상품 상세
+	 *
+	 * @param shoplinkerSearch
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	ShoplinkerGoods getGoods(ShoplinkerGoods shoplinkerSearch);
+
+	/**
+	 * 상품등록-상품 이미지 조회
+	 *
+	 * @param shoplinkerSearch
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	Collection<ShoplinkerGoods> getGoodsImageList(ShoplinkerGoods shoplinkerSearch);
+
+	/**
+	 * 상품등록-상품 사이즈 조회
+	 *
+	 * @param shoplinkerSearch
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	Collection<ShoplinkerGoods> getGoodsSizeList(ShoplinkerGoods shoplinkerSearch);
+
+	/**
+	 * 상품등록-고시정보
+	 *
+	 * @param shoplinkerSearch
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	Collection<ShoplinkerGoods> getGoodsNotiList(ShoplinkerGoods shoplinkerSearch);
+
+	/**
+	 * 상품등록-인증정보
+	 *
+	 * @param shoplinkerSearch
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	ShoplinkerGoods getCert(ShoplinkerGoods shoplinkerSearch);
+
+	/**
+	 * 상품등록-상품 목록 건수
+	 *
+	 * @param shoplinkerSearch
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	int getGoodsSendListCount(ShoplinkerSearch shoplinkerSearch);
+
+	/**
+	 * 상품등록-상품 목록
+	 *
+	 * @param shoplinkerSearch
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	Collection<ShoplinkerGoods> getGoodsSendList(ShoplinkerSearch shoplinkerSearch);
+
+
+	/**
+	 * 샵링커주문수집-주문수집등록
+	 *
+	 * @param shoplinkerOrder
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	int insertShoplinkerOrder(ShoplinkerOrder shoplinkerOrder);
+
+	/**
+	 * 샵링커주문수집-목록 건수
+	 *
+	 * @param shoplinkerSearch
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	int getShoplinkerOrderListCount(ShoplinkerOrder shoplinkerOrder);
+
+	/**
+	 * 샵링커주문수집-목록
+	 *
+	 * @param shoplinkerSearch
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	Collection<ShoplinkerOrder> getShoplinkerOrderList(ShoplinkerOrder shoplinkerOrder);
+
+	/**
+	 * 샵링커주문수집-상세
+	 *
+	 * @param
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	ShoplinkerOrder getShoplinkerOrderInfo(ShoplinkerOrder shoplinkerOrder);
+
+	/**
+	 * 샵링커주문수집- 제휴몰 주문업로드여부 업데이트
+	 *
+	 * @param shoplinkerOrder
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 31
+	 */
+	void updateShoplinkerOrder(ShoplinkerOrder shoplinkerOrder);
+
+	/**
+	 * 제휴몰 주문등록 상세
+	 *
+	 * @param
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 31
+	 */
+	ExtmallOrder getExtmallOrderInfo(String extmallOrder);
+
+	/**
+	 * 제휴몰 주문등록 대상목록
+	 *
+	 * @param
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 31
+	 */
+	Collection<ShoplinkerOrder> getShoplinkerRegExtmallList();
+
+	/**
+	 * 제휴몰 대기상태건들 실패로 업데이트(오류로인해 성공/실패 처리가 안된건이 있을경우 대비용)
+	 *
+	 * @param
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 31
+	 */
+	void updateShoplinkerExtmallWaitList();
+
+
+	/**
+	 * 송장전송-전송 목록 건수
+	 *
+	 * @param shoplinkerSearch
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	int getSendInvoiceListCount(ShoplinkerInvoice shoplinkerInvoice);
+
+	/**
+	 * 송장전송-전송 목록
+	 *
+	 * @param shoplinkerSearch
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	Collection<ShoplinkerInvoice> getSendInvoiceList(ShoplinkerInvoice shoplinkerInvoice);
+
+	/**
+	 * 송장전송-상세목록
+	 *
+	 * @param
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	Collection<ShoplinkerInvoice> getShoplinkerInvoiceOrdDtlList();
+
+	/**
+	 * 재고-단품 등록
+	 *
+	 * @param shoplinkerGoods
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	void insertStockOption(ShoplinkerGoods shoplinkerGoods);
+
+	/**
+	 * 재고전송-목록 건수
+	 *
+	 * @param shoplinkerSearch
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	int getStockListCount(ShoplinkerSearch shoplinkerSearch);
+
+	/**
+	 * 재고전송-목록
+	 *
+	 * @param shoplinkerSearch
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	Collection<ShoplinkerGoods> getStockListList(ShoplinkerSearch shoplinkerSearch);
+
+}

+ 44 - 0
src/main/java/com/style24/core/biz/service/TscKakaotalkService.java

@@ -1303,4 +1303,48 @@ public class TscKakaotalkService {
 			// Do nothing
 		}
 	}
+
+
+	/**
+	 * 품절알림 - 샵링커, 제휴몰주문업로드
+	 * @param extmallOrder - 고객 정보
+	 * @author jmh
+	 * @since 2021. 06. 23
+	 */
+	@Transactional("shopTxnManager")
+	public void sendShoplinkerOrder(ExtmallOrder extmallOrder, Integer senderNo) {
+
+		SsgDirectMessage dm = new SsgDirectMessage();
+		dm.setFuserid(String.valueOf(senderNo)); // 발송자NO
+		dm.setFdestine(extmallOrder.getOrderPhnno());
+		dm.setFkkoresendtype("LMS");
+
+		GagaMap replaceInfo = new GagaMap();
+		replaceInfo.setString("siteNm", siteNm);
+		replaceInfo.setString("extmallNm", extmallOrder.getExtmallNm());
+		replaceInfo.setString("soldoutGoodsNm", extmallOrder.getSoldoutGoodsNm());
+
+		Integer ansSq = 0;
+		if( "Y".equals(extmallOrder.getCnclAllSoldoutYn())){
+			ansSq = SsgKakaoSender.KakaoAnswerSq.CARD_CANCEL_BY_SOLDOUT.value(); // 전체품절
+		}else {
+			ansSq = SsgKakaoSender.KakaoAnswerSq.AT_CANCEL_BY_SOLDOUT.value(); // 부분품절
+		}
+		kakaoSender.send(ansSq, dm, replaceInfo);
+
+		try {
+			// 고객접촉이력 정보
+			CustContactHst custContactHst = new CustContactHst();
+			custContactHst.setContactType(TscConstants.ContactType.SOLDOUT_INFO.value()); // 접촉유형:주문-결품안내(공통코드G054)
+			custContactHst.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value()); // 접촉방법:알림톡+문자(공통코드G055)
+			custContactHst.setContactContents("샵링커 주문수집("+extmallOrder.getUploadGb()+") 품절안내");
+			custContactHst.setReceiverNo(0);
+			custContactHst.setSenderNo(senderNo);
+			custContactHst.setRegNo(senderNo);
+			coreCustomerService.createCustomerContactHistory(custContactHst);
+		} catch (Exception e) {
+			log.error("error", e);
+			// Do nothing
+		}
+	}
 }

+ 68 - 12
src/main/java/com/style24/core/biz/service/TscMailService.java

@@ -28,24 +28,13 @@ import lombok.extern.slf4j.Slf4j;
 @Service
 @Slf4j
 public class TscMailService {
-	private static final String siteNm = "STYLE24";
-
-	@Autowired
-	private Environment env;
 
 	@Autowired
 	private NetpathyMailSender netpathyMailSender;
 
-	@Autowired
-	private NaverShortUrl shortUrl;
-
 	@Autowired
 	private TscCustomerService coreCustomerService;
 
-	@Autowired
-	private TscMailTemplateService mailTemplateService;
-
-
 
 	/**
 	 * 고객 임시비밀번호 이메일 발송
@@ -143,7 +132,7 @@ public class TscMailService {
 	 * 회원탈퇴
 	 *
 	 * @param customer - 고객 정보
-	 * @param senderNo - 보낸
+	 * @param senderNo - 보낸NO
 	 * @author jsshin
 	 * @since 2021. 06. 02
 	 */
@@ -597,5 +586,72 @@ public class TscMailService {
 			// Do nothing
 		}
 	}
+	
+	/**
+	 * 무통장 입금 요청
+	 *
+	 * @param GagaMap
+	 * @param Integer
+	 * @author jsh77b
+	 * @since 2021. 06. 25
+	 */
+	@Transactional("shopTxnManager")
+	public void sendVaDepositRequest(GagaMap replaceInfo, Integer senderNo) {
+		
+		Order orderInfo = (Order)replaceInfo.get("orderInfo");
+
+		// 주문 결제 완료 메일 발송
+		netpathyMailSender.send(NetpathyMailSender.MailAnswerSq.VA_DEPOSIT_REQUEST.value(), orderInfo.getOrdEmail(), replaceInfo);
 
+		try {
+			if (replaceInfo.getInt("custNo") > 0) {
+				// 고객접촉이력 정보
+				CustContactHst custContactHst = new CustContactHst();
+				custContactHst.setContactType(TscConstants.ContactType.CANCEL_INFO.value());				// 접촉유형:주문-취소안내(공통코드G054)
+				custContactHst.setContactMethod(TscConstants.ContactMethod.EMAIL.value());					// 접촉방법:알림톡+문자(공통코드G055)
+				custContactHst.setContactContents("주문-결제안내");
+				custContactHst.setReceiverNo(replaceInfo.getInt("custNo"));
+				custContactHst.setSenderNo(senderNo);
+				custContactHst.setRegNo(senderNo);
+				coreCustomerService.createCustomerContactHistory(custContactHst);
+			}
+		} catch (Exception e) {
+			log.error("error", e);
+			// Do nothing
+		}
+	}
+
+	/**
+	 * 기본메일
+	 * @param customer - 고객 정보
+	 * @param senderNo
+	 * @author jsshin
+	 * @since 2021. 06. 02
+	 */
+	@Transactional("shopTxnManager")
+	public void sendBasicMail(Customer customer,Integer senderNo) {
+		GagaMap replaceInfo = new GagaMap();
+
+		replaceInfo.setInt("custNo", customer.getCustNo());
+		replaceInfo.setString("custNm", customer.getCustNm());
+		replaceInfo.setString("content", customer.getContent().replaceAll("\\\n", "<br/>"));
+
+		netpathyMailSender.send(NetpathyMailSender.MailAnswerSq.BASIC.value(), customer.getEmail(), replaceInfo);
+
+		try {
+			// 고객접촉이력 정보
+			CustContactHst custContactHst = new CustContactHst();
+			custContactHst.setContactType(TscConstants.ContactType.BASIC_EMAIL.value());
+			custContactHst.setContactMethod(TscConstants.ContactMethod.EMAIL.value());
+			custContactHst.setContactContents("기본EMAIL안내발송");
+			custContactHst.setReceiverNo(customer.getCustNo());
+			custContactHst.setSenderNo(senderNo);
+			custContactHst.setRegNo(senderNo);
+			coreCustomerService.createCustomerContactHistory(custContactHst);
+		} catch (Exception e) {
+			log.error("error", e);
+			// Do nothing
+		}
+
+	}
 }

+ 44 - 10
src/main/java/com/style24/core/biz/service/TscOrderChangeService.java

@@ -1,6 +1,7 @@
 package com.style24.core.biz.service;
 
 import java.text.DecimalFormat;
+import java.text.NumberFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -18,6 +19,7 @@ import com.gagaframework.web.rest.server.GagaResponseStatus;
 import com.style24.core.biz.dao.TscOrderChangeDao;
 import com.style24.core.biz.dao.TscOrderDao;
 import com.style24.core.support.env.TscConstants;
+import com.style24.core.support.env.TscConstants.OrderCancelReason;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.core.support.util.CryptoUtils;
 import com.style24.persistence.domain.DeliveryFee;
@@ -319,6 +321,19 @@ public class TscOrderChangeService {
 							orderDetailItem.setOrdDtlStat(ordDtlStat);
 
 							orderChangeDao.updateOrderDetailItem(orderDetailItem);
+							
+							// 2021.06.25 취소완료 (취소) (정산구분값추가)
+							// 품절취소
+							if (TscConstants.OrderCancelReason.SOLDOUT_CANCEL.value().equals(chgReason)) {
+								orderDetailItem.setOrdDtlStat(TscConstants.OrdDtlItemStat.SALE_RETURN_CANCEL.value());
+							}
+							// 일반취소
+							else {
+								orderDetailItem.setOrdDtlStat(TscConstants.OrdDtlItemStat.SALE_RETURN_CANCEL.value());
+							}
+							orderDetailItem.setCnclRtnQty(vo.getOrdCanChgQty());
+							orderDetailItem.setOrdChgSq(ordChgSq);
+
 							orderChangeDao.createOrderDetailItemHst(orderDetailItem);
 
 							index++;
@@ -1070,8 +1085,8 @@ public class TscOrderChangeService {
 
 			orderChangeDao.createOrderDetailItemForExchange(ordDtlItem);
 
-			// 9. TB_ORDER_DETAIL_ITEM_HST 등록
-			orderChangeDao.createOrderDetailItemHstForExchange(ordDtlItem);
+			// 9. TB_ORDER_DETAIL_ITEM_HST 등록 교환신청시에 등록하지 않음
+			//orderChangeDao.createOrderDetailItemHstForExchange(ordDtlItem);
 		}
 
 		// 10. TB_SELL_QTY 등록
@@ -1152,8 +1167,8 @@ public class TscOrderChangeService {
 			// 3-3. TB_ORDER_DETAIL_ITEM 상태값 변경
 			// orderChangeDao.updateOrderDetailItemForExchangeCancel(exchangeCancel);
 
-			// 3-4. TB_ORDER_DETAIL_ITEM_HST 생성
-			orderChangeDao.createOrderDetailItemHstForExchangeCancel(exchangeCancel);
+		// 3-4. TB_ORDER_DETAIL_ITEM_HST 생성 사용하지않음
+		//orderChangeDao.createOrderDetailItemHstForExchangeCancel(exchangeCancel);
 
 			// 3-5. TB_ORDER_CHANGE_DETAIL 상태값 변경 및 DEL_YN Y로 업데이트
 			orderChangeDao.updateOrderChangeDtlCancel(exchangeCancel);
@@ -2080,10 +2095,13 @@ public class TscOrderChangeService {
 							orderDetailItem.setRegNo(userNo);
 							orderDetailItem.setUpdNo(userNo);
 							orderDetailItem.setOrdDtlStat(ordDtlStat);
-							
-							log.info("ordDtlStat ::: {}", ordDtlStat);
 
 							orderChangeDao.updateOrderDetailItem(orderDetailItem);
+							
+							// 2021.06.25 환불컨펌 (반품완료) (정산구분값추가)
+							orderDetailItem.setOrdDtlStat(TscConstants.OrdDtlItemStat.SALE_RETURN_RETURN_COMPLETE.value());
+							orderDetailItem.setCnclRtnQty(vo.getCnclRtnQty());
+							orderDetailItem.setOrdChgSq(ordChgSq);
 							orderChangeDao.createOrderDetailItemHst(orderDetailItem);
 
 							index++;
@@ -2983,7 +3001,11 @@ public class TscOrderChangeService {
 				DeliveryFee deliveryFee = new DeliveryFee();
 				deliveryFee.setOrdNo(ordNo);
 				deliveryFee.setDelvFeeCd(delvFeeCd);
-				deliveryFee.setOrdChgSq(ordChgSq);
+				
+				// 2021.06.23 주문완료에서 같이 사용하려고 추가 하였음
+				if (ordChgSq != null) {
+					deliveryFee.setOrdChgSq(ordChgSq);
+				}
 
 				Collection<DeliveryFee> deliveryFeeList = deliveryService.getDeliveryFee(deliveryFee);
 
@@ -3264,9 +3286,21 @@ public class TscOrderChangeService {
 			sb.append("																							<span>");
 			sb.append(orderChange.getChgQty());
 			sb.append("개</span>\n");
-			// sb.append("																							<span style=\"width: 12px;padding-left:12px;\"></span>\n");
-			// sb.append("																							<span style=\"display: inline-block; vertical-align: middle; width: 1px; height: 14px; background: #ddd;\"></span>\n");
-			// sb.append("																							<span style=\"width: 12px;padding-right:12px;\"></span>\n");
+			
+			// 2021.06.24 주문완료메일에서 사용하기위해서 적용
+			if (orderChange.getListPrice() > 0) {
+				sb.append("																							<span style=\"width: 12px;padding-left:12px;\"></span>\n");
+				sb.append("																							<span style=\"display: inline-block; vertical-align: middle; width: 1px; height: 14px; background: #ddd;\"></span>\n");
+				sb.append("																							<span style=\"width: 12px;padding-right:12px;\"></span>\n");
+				
+				sb.append("<span style=\"text-decoration: line-through;color: #888888;\"><span>");
+				sb.append(NumberFormat.getInstance().format(orderChange.getListPrice()));
+				sb.append("</span>원</span>");
+				sb.append("&nbsp;&nbsp;<span style=\"font-weight: 500;\"><span>");
+				sb.append(NumberFormat.getInstance().format(orderChange.getOrdAmt()));
+				sb.append("</span>원</span>");
+			}
+			
 			sb.append("																						</td>\n");
 			sb.append("																					</tr>\n");
 			sb.append("																					<tr>\n");

+ 855 - 0
src/main/java/com/style24/core/biz/service/TscOrderOcmService.java

@@ -0,0 +1,855 @@
+package com.style24.core.biz.service;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.util.GagaFileUtil;
+import com.style24.core.biz.dao.TscOrderOcmDao;
+import com.style24.core.support.env.TscConstants;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.ExtmallOrder;
+import com.style24.persistence.domain.Payment;
+import com.style24.persistence.domain.ShoplinkerStock;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 영업망관리 Service
+ * 제휴몰 주문등록
+ *
+ * @author jmh
+ * @since 2021. 6. 25
+ */
+@Service
+@Slf4j
+public class TscOrderOcmService {
+
+    @Autowired
+    private TscMessageByLocale message;
+
+    @Autowired
+	private TscKakaotalkService kakaotalkService;
+
+    @Autowired
+	private Environment env;
+
+    @Autowired
+    private TscOrderOcmDao orderOcmDao;
+
+    @Autowired
+	private ObjectMapper mapper;
+
+    /**
+     * 스타일 24 주문정보등록
+     * @param Order
+     * @return Order
+     * @author jsh77b
+     * @since 2021. 03. 09
+     *
+     * TscOrderService.createPreOrder 참조
+     * 샵링커 주문수집으로 외부몰주문등록된 건 중 '대기'상태인 것들에 대해 주문등록처리를 한다.
+     */
+    public void createShoplinkerOrder(String uploadGb, int userNo) {
+    	Collection<ExtmallOrder> orderList = this.sortOrderList(uploadGb, userNo);
+
+    	if (orderList != null && !orderList.isEmpty()) {
+	    	for( ExtmallOrder order : orderList ) {
+	    		createShoplinkerOrderSub(order);
+	        }
+    	}
+    }
+
+    @SuppressWarnings("unchecked")
+    @Transactional("shopTxnManager")
+    public void createShoplinkerOrderSub(ExtmallOrder order) {
+
+		GagaMap result = this.orderValidationCheck(order);
+
+		// validation 체크 값
+		Collection<ExtmallOrder> newOrderDetailList = (Collection<ExtmallOrder>) result.get("orderDetailList");
+
+		if ("SUCCESS".equals(result.get("message").toString())) {
+			// 1. 주문기본정보등록
+            orderOcmDao.createOrder(order);
+
+            // 2. 주문배송정보등록
+            orderOcmDao.createDeliveryAddr(order);
+
+            // 3. 주문배송비정보등록
+            orderOcmDao.createDeliveryFee(order);
+
+			// 4. 주문상세정보등록
+            String dtlNos = "";			// 주문상세번호
+            String cancelGoodsNms = ""; // 콤마로 구분
+            int cancelAmt = 0;
+            int payAmt = 0;
+            GagaMap vdMap;
+			for( ExtmallOrder orderDetail : newOrderDetailList) {
+
+				//vdMap = this.checkGoodsInfo(orderDetail);
+				orderDetail.setOrdNo(order.getOrdNo());
+				orderDetail.setDelvAddrSq(order.getDelvAddrSq());
+
+
+				if (!"SUCCESS".equals(orderDetail.getUploadFailReason())){
+					cancelGoodsNms += orderDetail.getGoodsNm()+",";
+					cancelAmt += orderDetail.getOrdAmt();
+
+					orderDetail.setUploadStat(TscConstants.ExtmallUploadStat.FAIL.value());	// 실패
+					orderDetail.setOrdNo(null);
+					orderDetail.setUploadFailCd(orderDetail.getUploadFailCd());
+					orderDetail.setUploadFailReason(orderDetail.getUploadFailReason());
+					orderOcmDao.updateExtmallOrder(orderDetail);
+
+				}else {
+
+					orderDetail.setOrdNo(order.getOrdNo());
+					orderDetail.setDelvAddrSq(order.getDelvAddrSq());
+
+					// TODO 총알배송, 구매대행상품여부 체크
+					orderOcmDao.createOrderDetail(orderDetail); // 주문상세정보등록
+                    orderOcmDao.createOrderDetailHst(orderDetail); // 주문상세이력정보등록
+
+                    Collection<ExtmallOrder> orderDetailItemList = orderOcmDao.getOrderDetailItem(orderDetail); // 주문상세단품정보조회
+
+                    // 주문상세단품단위 금액 등록
+                    int length				= orderDetailItemList.size();
+                    int index				= 1;
+                    int leftOrdAmt 			= orderDetail.getOrdAmt();
+                    int leftCpn1DcAmt 		= orderDetail.getCpn1DcAmt();
+                    int leftTmtb1DcAmt 		= orderDetail.getTmtb1DcAmt();
+                    int leftTmtb2DcAmt 		= orderDetail.getTmtb2DcAmt();
+                    int leftGoodsCpnDcAmt 	= orderDetail.getGoodsCpnDcAmt();
+                    int leftCartCpnDcAmt 	= orderDetail.getCartCpnDcAmt();
+                    int leftPntDcAmt 		= orderDetail.getPntDcAmt();
+                    int leftPrePntDcAmt 	= orderDetail.getPrePntDcAmt();
+                    int leftSavePntAmt 		= orderDetail.getSavePntAmt();
+                    int leftRealOrdAmt 		= orderDetail.getRealOrdAmt();
+                    int leftGfcdUseAmt 		= orderDetail.getGfcdUseAmt();
+
+                    for (ExtmallOrder orderDetailItem : orderDetailItemList) {
+                        int itemPrice 		= orderDetailItem.getItemPrice();
+                        int optAddPrice 	= orderDetailItem.getOptAddPrice();
+                        int itemQty 		= orderDetailItem.getItemQty();
+                        double currPrice	= orderDetailItem.getCurrPrice();
+                        double itemOrdAmt	= (itemPrice + optAddPrice) * itemQty;
+                        double tempDivD		= (itemOrdAmt / currPrice) * 100;
+                        int tempDiv 		= Integer.parseInt(String.valueOf(Math.round(tempDivD)));
+
+                        if (index == length) {
+                            orderDetailItem.setOrdAmt(leftOrdAmt);
+                            orderDetailItem.setCpn1DcAmt(leftCpn1DcAmt);
+                            orderDetailItem.setTmtb1DcAmt(leftTmtb1DcAmt);
+                            orderDetailItem.setTmtb2DcAmt(leftTmtb2DcAmt);
+                            orderDetailItem.setGoodsCpnDcAmt(leftGoodsCpnDcAmt);
+                            orderDetailItem.setCartCpnDcAmt(leftCartCpnDcAmt);
+                            orderDetailItem.setPntDcAmt(leftPntDcAmt);
+                            orderDetailItem.setPrePntDcAmt(leftPrePntDcAmt);
+                            orderDetailItem.setSavePntAmt(leftSavePntAmt);
+                            orderDetailItem.setRealOrdAmt(leftRealOrdAmt);
+                            orderDetailItem.setGfcdUseAmt(leftGfcdUseAmt);
+                        } else {
+                            orderDetailItem.setOrdAmt((orderDetail.getOrdAmt() * tempDiv) / 100);
+                            orderDetailItem.setCpn1DcAmt((orderDetail.getCpn1DcAmt() * tempDiv) / 100);
+                            orderDetailItem.setTmtb1DcAmt((orderDetail.getTmtb1DcAmt() * tempDiv) / 100);
+                            orderDetailItem.setTmtb2DcAmt((orderDetail.getTmtb2DcAmt() * tempDiv) / 100);
+                            orderDetailItem.setGoodsCpnDcAmt((orderDetail.getGoodsCpnDcAmt() * tempDiv) / 100);
+                            orderDetailItem.setCartCpnDcAmt((orderDetail.getCartCpnDcAmt() * tempDiv) / 100);
+                            orderDetailItem.setPntDcAmt((orderDetail.getPntDcAmt() * tempDiv) / 100);
+                            orderDetailItem.setPrePntDcAmt((orderDetail.getPrePntDcAmt() * tempDiv) / 100);
+                            orderDetailItem.setSavePntAmt((orderDetail.getSavePntAmt() * tempDiv) / 100);
+                            orderDetailItem.setRealOrdAmt((orderDetail.getRealOrdAmt() * tempDiv) / 100);
+                            orderDetailItem.setGfcdUseAmt((orderDetail.getGfcdUseAmt() * tempDiv) / 100);
+
+                            leftOrdAmt 			= leftOrdAmt 			- ((orderDetail.getOrdAmt() * tempDiv) / 100);
+                            leftCpn1DcAmt 		= leftCpn1DcAmt 		- ((orderDetail.getCpn1DcAmt() * tempDiv) / 100);
+                            leftTmtb1DcAmt 		= leftTmtb1DcAmt 		- ((orderDetail.getTmtb1DcAmt() * tempDiv) / 100);
+                            leftTmtb2DcAmt 		= leftTmtb2DcAmt 		- ((orderDetail.getTmtb2DcAmt() * tempDiv) / 100);
+                            leftGoodsCpnDcAmt 	= leftGoodsCpnDcAmt 	- ((orderDetail.getGoodsCpnDcAmt() * tempDiv) / 100);
+                            leftCartCpnDcAmt 	= leftCartCpnDcAmt 		- ((orderDetail.getCartCpnDcAmt() * tempDiv) / 100);
+                            leftPntDcAmt 		= leftPntDcAmt 			- ((orderDetail.getPntDcAmt() * tempDiv) / 100);
+                            leftPrePntDcAmt 	= leftPrePntDcAmt 		- ((orderDetail.getPrePntDcAmt() * tempDiv) / 100);
+                            leftSavePntAmt 		= leftSavePntAmt 		- ((orderDetail.getSavePntAmt() * tempDiv) / 100);
+                            leftRealOrdAmt 		= leftRealOrdAmt 		- ((orderDetail.getRealOrdAmt() * tempDiv) / 100);
+                            leftGfcdUseAmt 		= leftGfcdUseAmt 		- ((orderDetail.getGfcdUseAmt() * tempDiv) / 100);
+                        }
+
+                        // 2021.05.06 옵션금액 단품 추가
+                        orderDetailItem.setOptAddPrice(optAddPrice);
+                        orderDetailItem.setCustNo(order.getCustNo());
+
+                        orderOcmDao.createOrderDetailItem(orderDetailItem); // 주문상세단품정보등록
+
+                        // 2021.06.25 샵링커 주문수집 결제완료 (정산구분값추가)
+                        orderDetailItem.setOrdDtlStat(TscConstants.OrdDtlItemStat.SALE_PAYMENT_COMPLETE.value());
+                        orderOcmDao.createOrderDetailItemHst(orderDetailItem); // 주문상세단품이력정보등록
+
+                        index++;
+
+                        // 5. 재고등록(샵링커 주문목록을 보면 동일한 몰 주문번호에 동일한 상품(sku)이 수량이 아닌 개별로 있는 데이터가 존재하므로 > 주문번호로 한번에 처리가 아닌 개별로 처리 함)
+        				orderDetail.setSellGb(TscConstants.SellGb.ORDER.value());			// 판매구분(10:주문(-),
+        				orderOcmDao.createSellQty(orderDetail);
+
+                        // 외부몰 정보 업데이트
+        				orderDetail.setUploadStat(TscConstants.ExtmallUploadStat.SUCC.value());	// 성공
+    					orderOcmDao.updateExtmallOrder(orderDetail);
+
+    					dtlNos += orderDetail.getOrdDtlNo()+",";
+    				}
+				}
+        	}
+
+
+			// 6. 주문사은품정보등록
+    		dtlNos = dtlNos.substring(0, dtlNos.length()-1);
+	        String [] dtlNdsArr = dtlNos.split(",");	// 주문상세번호
+	        order.setItemCdArr(dtlNdsArr);
+			order.setOrdDtlStat(TscConstants.OrderDetailStat.PAYMENT_COMPLETE.value());		//주문상세상태 - 결제완료처리
+			GagaMap giftMap = this.getOrderFreegift(order);
+
+	        if( null != giftMap) {
+		        if( null != giftMap.get("freegiftList")) {
+		        	if( !"".equals(giftMap.get("freegiftList"))) {
+
+		    			// 상품코드
+		        		String dtlGoodsCds = "";	// 사은품관련 상품코드. 콤마로구분
+		        		String[] dtlGoodsCdsArr;
+		        		Collection<ExtmallOrder> freegiftApplyAmtList = (Collection<ExtmallOrder>) giftMap.get("freegiftApplyAmtList");
+
+		        		for(ExtmallOrder ftMap : freegiftApplyAmtList ) {
+		        			dtlGoodsCds += ftMap.getGoodsCd() +",";
+		        		}
+
+		        		dtlGoodsCds = dtlGoodsCds.substring(0, dtlGoodsCds.length()-1);
+		        		dtlGoodsCdsArr = dtlGoodsCds.split(",");
+		        		order.setFreegiftGoodsArr(dtlGoodsCdsArr);
+
+		        		Collection<ExtmallOrder> freegiftList = (Collection<ExtmallOrder>) giftMap.get("freegiftList");
+		                ArrayList<Integer> fitValSqArr = new ArrayList<Integer>();
+		                for(ExtmallOrder ftMap : freegiftList ) {
+		                	fitValSqArr.add(ftMap.getFreegiftValSq());
+		                }
+		                int[] freegiftValArr = new int[fitValSqArr.size()];
+		                for( int i=0; i<fitValSqArr.size(); i++) {
+		                	freegiftValArr[i] = fitValSqArr.get(i);
+		                }
+
+		                order.setFreegiftValArr(freegiftValArr);
+		                order.setCustNo(0);
+		                if(order.getFreegiftValArr() != null && order.getFreegiftValArr().length > 0) {
+		                    orderOcmDao.createOrdFreegift(order);
+
+		                    // 6. 주문사은품 상품 정보 등록
+		                    orderOcmDao.createOrdFreegiftVal(order);
+
+		                    // 7. 주문사은품 주문상세정보 등록
+		                    for(ExtmallOrder ftMap : freegiftApplyAmtList ) {
+			    		    	order.setFreegiftSq(ftMap.getFreegiftSq());
+				    			order.setGoodsCd(ftMap.getGoodsCd());
+				    			orderOcmDao.createOrdFreegiftDtl(order);
+			    		    }
+		                }
+
+		                // 14. 사은품 수량 차감 로직 TB_FREEGIFT_VAL LEFT_QTY
+		                orderOcmDao.updateFreegiftValLeftQty(order);
+
+		        	}
+		        }
+	        }
+
+			// 7. 결제 TB_PAYMENT
+            Payment payment = new Payment();
+            payment.setOrdNo(order.getOrdNo());
+            payment.setPayMeans(TscConstants.PayMeans.EXTMALL.value());					// 결제수단
+            payAmt = order.getRealOrdSumAmt() + order.getDelvFee() - cancelAmt;			// 결제금액 = 실결제금액 + 배송비 - 취소금액
+            payment.setPayAmt(payAmt);
+            payment.setPgCpnAmt(0);														// PG쿠폰금액
+            payment.setNpayPntAmt(0);   												// 네이버페이포인트금액
+            payment.setPayGb("O");														// 결제구분(O:주문시결제, D:배송시결제, E:에러(강제 결제 태울 때 또는 에러일 때)
+            payment.setPayStat(TscConstants.PaymentStat.PAYMENT_COMPLETE.value());		// 결제상태 - 결제완료
+            payment.setRegNo(0);
+            payment.setUpdNo(0);
+
+            orderOcmDao.insertPayment(payment);
+
+		}else {
+
+			// 주문등록 전체실패시 상태 업데이트
+			GagaMap vdMap;
+			for( ExtmallOrder orderDetail : order.getOrderDetailList()) {
+				vdMap = this.checkGoodsInfo(orderDetail);
+				orderDetail.setUploadStat(TscConstants.ExtmallUploadStat.FAIL.value());	// 실패
+				orderDetail.setOrdNo(vdMap.getInt("ordNo"));	// 실패
+				orderDetail.setUploadFailCd(vdMap.getString("uploadFailCd"));
+				orderDetail.setUploadFailReason(vdMap.getString("message"));
+				orderOcmDao.updateExtmallOrder(orderDetail);
+			}
+		}
+
+		// 8. 알림톡발송 (임시 히스토리 쌓음. 로컬,개발인경우만)
+		if( "N".equals(order.getCnclsmsSendYn())) {		// Y:제휴몰에서발송, N:자사몰에서발송
+
+			ExtmallOrder testNoti = new ExtmallOrder();
+			testNoti.setUploadGb(order.getUploadGb());
+			testNoti.setExtmallId(order.getExtmallId());
+    		testNoti.setExtmallNm(order.getExtmallNm());
+    		testNoti.setExtmallOrderId(order.getExtmallOrderId());
+    		String soldoutGoodsNm = "";
+
+    		if( "ALL_FAIL".equals(result.getString("sendNotiType"))) {
+    			// 알림톡발송-전체실패
+    			soldoutGoodsNm = result.getString("failGoods") + " (총 "+result.getString("stockFailCnt")+" 건)";
+    			testNoti.setCnclAllSoldoutYn("Y");
+    			testNoti.setSoldoutGoodsNm(soldoutGoodsNm);
+    			if("E".equals(order.getUploadGb())){
+    				//	kakaotalkService.sendShoplinkerOrder(testNoti, 0);
+    			}
+    			testNoti.setSku("미할당 전체품절 > 실패 총 "+result.getString("failCnt")+"건 / 재고실패 "+result.getString("stockFailCnt")+"건 ("+result.getString("failGoods")+")");
+
+    		}else if( "ALL_SUCCESS".equals(result.getString("sendNotiType"))) {
+    			// 전체성공
+    			testNoti.setSku("전체성공");
+    		}else if( "PART_SUCCESS".equals(result.getString("sendNotiType"))) {
+
+    			if( !"".equals(result.getString("failGoods"))) {
+    				// 부분성공 알림톡발송
+    				soldoutGoodsNm = result.getString("failGoods") + " (총 "+result.getString("stockFailCnt")+" 건)";
+    				testNoti.setCnclAllSoldoutYn("N");
+    				testNoti.setSoldoutGoodsNm(soldoutGoodsNm);
+    				if("E".equals(order.getUploadGb())){
+    					//	kakaotalkService.sendShoplinkerOrder(testNoti, 0);
+    				}
+	    			testNoti.setSku("부분결품 품절 > 실패 총 "+result.getString("failCnt")+"건 / 재고실패 "+result.getString("stockFailCnt")+"건 ("+result.getString("failGoods")+")");
+    			}else {
+    				// 전체성공
+	    			testNoti.setSku("성공 > 실패한건이 있지만, 재고로인한건이 아님.");
+    			}
+
+    		}else {
+    			// "NOT" 알림톡 발송안함. 이미 발송한건
+    			testNoti.setSku("알림톡 발송안함. 동일수집건 ");
+    		}
+    		// orderOcmDao.insertTestNotiInfo(testNoti);
+
+		}
+    }
+
+    /**
+     * 스타일 24 주문정보등록 - 제휴몰주문등록 데이터 정렬
+     * @param uploadGb
+     * @return Collection<ExtmallOrder>
+     * @author jmh
+     * @since 2021. 03. 09
+    */
+    private Collection<ExtmallOrder> sortOrderList(String uploadGb, int userNo) {
+
+        // 1. 외부몰주문등록 대기목록 조회
+        ExtmallOrder params = new ExtmallOrder();
+        params.setUploadStat(TscConstants.ExtmallUploadStat.WAIT.value());		// 대기
+        params.setUploadGb(uploadGb);											// 등록위치 (S: 샵링커, E: 엑셀)
+        if("E".equals(uploadGb)) {
+        	params.setRegNo(userNo);					// 등록자(E:엑셀방식일경우 필수)
+        }
+        Collection<ExtmallOrder> exMastList = orderOcmDao.getExtmallMasterOrderList(params);
+        Collection<ExtmallOrder> exList = orderOcmDao.getExtmallOrderList(params);
+        Collection<ExtmallOrder> tmpList = new ArrayList<ExtmallOrder>();
+
+        // 2. 그룹별 주문상세목록 세팅
+        // ※ TB_DELIVERY_FEE.DELV_FEE_CD에는 WMS 로들어가야하고, TB_ORDER_DETAIL.DELV_FEE_CD 에는 TB_GOODS.DELV_FEE_CD 에 있는 정보가 들어가야 함
+        for( ExtmallOrder ordGroup : exMastList) {
+
+        	// TB_ORDER 추가정보 세팅
+        	ordGroup.setSiteCd(TscConstants.Site.STYLE24.value());
+        	ordGroup.setCustNo(0);												// 고객번호 - 외부몰 0
+        	ordGroup.setCustNm(ordGroup.getOrdNm());							// 주문자명
+        	ordGroup.setFrontGb("P");											// PC
+        	ordGroup.setDelvFeeGb("G018_10");									// 원주문배송비 코드
+        	ordGroup.setDelvFeeCd("WMS"); 										// SHOT 자사총알배송 | WMS 자사일반배송 | RES  자사예약배송
+        	ordGroup.setDelvCpnDcAmt(0);										// 배송비쿠폰할인금액
+        	ordGroup.setRealDelvAmt(ordGroup.getDelvFee());						// 배송비실결제금액
+        	ordGroup.setDelvUsacYn("N");										// 배송비 정산여부
+
+            tmpList = new ArrayList<ExtmallOrder>();
+            for(ExtmallOrder ordDtl : exList ) {
+            	if(ordGroup.getVendorId().equals(ordDtl.getVendorId())
+            		 && ordGroup.getExtmallId().equals(ordDtl.getExtmallId())
+            		 && ordGroup.getExtmallOrderId().equals(ordDtl.getExtmallOrderId())
+            		 && ordGroup.getOrdNm().equals(ordDtl.getOrdNm())
+            		 && ordGroup.getOrdPhnno().equals(ordDtl.getOrdPhnno())
+            		 && ordGroup.getRecipNm().equals(ordDtl.getRecipNm())
+            		 && ordGroup.getRecipPhnno().equals(ordDtl.getRecipPhnno())
+            		 && ordGroup.getRecipBaseAddr().equals(ordDtl.getRecipBaseAddr())
+            		 && ordGroup.getRecipDtlAddr().equals(ordDtl.getRecipDtlAddr())
+            	 ) {
+
+            		tmpList = ordGroup.getOrderDetailList();
+            		if( null == tmpList ) tmpList = new ArrayList<ExtmallOrder>();
+
+            		// 상세 추가정보
+            		ordDtl.setOrdExchGb("O");										// 주문교환구분(O:주문,E:교환)
+            		ordDtl.setCustNo(ordGroup.getCustNo());							// 고객번호
+            		ordDtl.setRegNo(ordGroup.getCustNo());							// 등록자
+            		ordDtl.setOrdDtlStat(TscConstants.OrderDetailStat.PAYMENT_COMPLETE.value());	// 주문상세상태=>결제완료 처리
+                	ordDtl.setDelvCpnDcAmt(0);										// 1차쿠폰(즉시할인쿠폰)할인금액
+                	ordDtl.setRealOrdAmt(ordDtl.getOrdAmt());						// 실주문금액(주문금액 - 취소반품금액 - 1차쿠폰 - 다다익선1 - 다다익선2 - 상품쿠폰 - 장바구니쿠폰 - 포인트할인금액 - 선포인트할인금액)
+				    ordDtl.setShotDelvYn("N");										// 총알배송여부
+                	ordDtl.setGiftPackYn("N"); 										// 선물포장여부
+                	ordDtl.setGiftAddrInpYn("N");									// 선물주소입력여부
+                	ordDtl.setSavePntAmt(0);										// 외부몰주문 포인트 적립금 없음
+
+                    if (ordDtl.getSupplyCompCd() != null && !ordDtl.getSupplyCompCd().isEmpty()) {
+                    	ordGroup.setSupplyCompCd(ordDtl.getSupplyCompCd());					// 공급업체코드
+                    }
+                    ordGroup.setExtmallNm(ordDtl.getExtmallNm());							// 제휴몰명
+                    ordGroup.setUploadGb(ordDtl.getUploadGb());								// 업로드타입
+
+            		tmpList.add(ordDtl);
+            		ordGroup.setOrderDetailList(tmpList);
+            	}
+            }
+        }
+
+        return exMastList;
+    }
+
+    /**
+	 * 주문정보유효성체크 >> 개별체크
+	 * @param Order
+	 * @return Order
+	 * @author jsh77b
+	 * @since 2021. 03. 09
+	 */
+	public GagaMap orderValidationCheck(ExtmallOrder order) {
+		GagaMap result = new GagaMap();
+		String failGoods = "";
+
+		// 1. 주문상세체크
+		Collection<ExtmallOrder> orderDetailList = order.getOrderDetailList();
+
+		int dtlCnt = orderDetailList.size();
+		int succCnt = 0;
+		int stockFailCnt = 0;
+		for (ExtmallOrder orderDetail : orderDetailList) {
+
+			GagaMap resultMap = this.checkGoodsInfo(orderDetail);
+
+			orderDetail.setUploadFailCd(resultMap.getString("uploadFailCd"));
+			orderDetail.setUploadFailReason(resultMap.getString("message"));
+
+			if ("SUCCESS".equals(resultMap.get("message").toString())) {
+				succCnt ++;
+			}else {
+				// 알림톡 발송 할 목록
+				if("Y".equals(resultMap.get("sendNotiYn"))){
+					failGoods += resultMap.get("goodsNm") + ",";
+					stockFailCnt ++;
+				}
+			}
+		}
+
+		result.set("orderDetailList", orderDetailList);
+
+		// 주문생성 여부
+		if( 0 < succCnt ) {
+			// 주문등록
+			result.put("message", "SUCCESS");
+		}else {
+			// 주문등록 안함.
+			result.put("message", "FAIL");
+		}
+
+		// 알림톡 발송타입
+		if( succCnt < 0 ) {
+			result.put("sendNotiType", "NOT");				// 알림톡 미발송-이미처리된 건(동일날짜 주문수집시)
+		}else if( 0 == succCnt ) {	// 전체실패
+
+			if( 0 == stockFailCnt ) {
+				result.put("sendNotiType", "NOT");			// 알림톡 미발송- 일반실패 또는 이미처리된 건(동일날짜 주문수집시)
+			}else if(dtlCnt == stockFailCnt) {
+				result.put("sendNotiType", "ALL_FAIL");		// 알림톡발송 - 재고관련 전체실패
+			}else {
+				result.put("sendNotiType", "PART_SUCCESS");	// 알림톡발송 - 부분성공
+			}
+
+		}else if( dtlCnt == succCnt ) {
+			result.put("sendNotiType", "ALL_SUCCESS");		// 알림톡발송 - 전체성공
+		}else {
+			result.put("sendNotiType", "PART_SUCCESS");		// 알림톡발송 - 부분성공
+		}
+
+		// 실패상품목록
+		if( 0 < failGoods.length()) failGoods = failGoods.substring(0, failGoods.length()-1);
+		result.put("failGoods", failGoods);			// 실패상품목록
+		result.put("failCnt", dtlCnt - succCnt );	// 총 실패건수
+		result.put("stockFailCnt", stockFailCnt );	// 재고로인한 실패건수
+
+		return result;
+	}
+
+	/**
+	 * 상품마스터 정보 및 재고확인
+	 * 단품 : goodsCd, optCd, optCd1, optCd2
+	 * 세트 : goodsCd,
+	 * @param params
+	 */
+	public GagaMap checkGoodsInfo(ExtmallOrder param) {
+		GagaMap result = new GagaMap();
+		result.put("message", "SUCCESS");
+
+		param.setVendorId(TscConstants.VendorId.SHOPLINKER.value());
+		ExtmallOrder dtlOrd = orderOcmDao.getExtmallOrderInfo(param);
+
+		if( null == dtlOrd) {
+			result.put("sendNotiYn", "N");	// 알림톡발송 x
+			result.put("uploadFailCd", TscConstants.ExtmallUploadFailStat.ETC.value());	// 값이 무조건 존재해야함
+			result.put("message", "오류입니다. 관리자확인요청>"+param.getAgentOrderId());
+			return result;
+
+		}else if( null != dtlOrd.getOrdNo() ){
+			result.put("sendNotiYn", "N");	// 알림톡발송 x
+			result.put("uploadFailCd", TscConstants.ExtmallUploadFailStat.ORDER.value());
+			result.put("ordNo", dtlOrd.getOrdNo());
+			result.put("message", "동일한 주문건이 존재합니다.");
+			return result;
+
+		}else if( 0 < dtlOrd.getStockFailHstCnt() ){
+			result.put("sendNotiYn", "N");	// 알림톡발송 x
+			result.put("uploadFailCd", TscConstants.ExtmallUploadFailStat.STOCK.value());
+			result.put("message", "이미 재고 부족으로 인한 고객 알림 발송이 완료된 건입니다.(동일수집 실패)");
+			return result;
+
+		} else if( null == dtlOrd.getExtmallId()) {
+			result.put("sendNotiYn", "N");	// 알림톡발송 x
+			result.put("uploadFailCd", TscConstants.ExtmallUploadFailStat.STORE.value());
+			result.put("message", "제휴몰ID 정보가 잘못되었습니다.");
+			return result;
+
+		} else if( null == dtlOrd.getGoodsCd()) {
+			result.put("sendNotiYn", "N");	// 알림톡발송 x
+			result.put("uploadFailCd", TscConstants.ExtmallUploadFailStat.GOODS.value());
+			result.put("message", "상품코드가 잘못되었습니다.");
+			return result;
+
+		} else if( null == dtlOrd.getOptCd()) {
+			result.put("sendNotiYn", "N");	// 알림톡발송 x
+			result.put("uploadFailCd", TscConstants.ExtmallUploadFailStat.SIZE.value());
+			result.put("message", "옵션코드가 잘못되었습니다.");
+			return result;
+
+		} else if (TscConstants.GoodsStat.SOLDOUT.value().equals(dtlOrd.getGoodsStat())) {
+			result.put("goodsNm", dtlOrd.getGoodsNm());
+			result.put("sendNotiYn", "Y");	// 알림톡발송 o
+			result.put("uploadFailCd", TscConstants.ExtmallUploadFailStat.STOCK.value());
+			result.put("message", "품절입니다.");
+			return result;
+
+		} else if (!TscConstants.GoodsStat.SOLDOUT.value().equals(dtlOrd.getGoodsStat()) && !TscConstants.GoodsStat.APPR.value().equals(dtlOrd.getGoodsStat())) {
+			result.put("goodsNm", dtlOrd.getGoodsNm());
+			result.put("sendNotiYn", "Y");	// 알림톡발송 o
+			result.put("uploadFailCd", TscConstants.ExtmallUploadFailStat.STOCK.value());
+			result.put("message", "판매중인 상품이 아닙니다.");
+			return result;
+		}
+
+		//상품 재고 확인
+		ShoplinkerStock checkParam = new ShoplinkerStock();
+		checkParam.setGoodsCd(param.getGoodsCd());
+		checkParam.setOptCd(param.getOptCd());
+		checkParam.setItemCd(param.getItemCd());
+		checkParam.setGoodsQty(param.getGoodsQty());
+		checkParam.setGoodsType(param.getGoodsType());
+		String stockResult = this.getCheckStock(checkParam);
+
+		if (!"SUCCESS".equals(stockResult)) {
+			result.put("goodsNm", dtlOrd.getGoodsNm());
+			result.put("sendNotiYn", "Y");	// 알림톡발송 o
+			result.put("uploadFailCd", TscConstants.ExtmallUploadFailStat.STOCK.value());
+			result.put("message", stockResult);
+			return result;
+		}
+
+		return result;
+	}
+
+	/**
+	 * 상품 재고 체크
+	 * @param param
+	 * goodsCd   (원상품코드) 필수
+	 * goodsType (상품타입) 필수
+	 * optCd     (옵션코드) 필수
+	 * goodsQty  (확인 재고 수량) 필수
+	 * itemCd    (세트 구성 상품코드) 세트
+	 * @return String
+	 * @author xodud1202
+	 * @since 2021. 01. 28
+	 */
+	public String getCheckStock(ShoplinkerStock param) {
+
+		ShoplinkerStock stockCheck = new ShoplinkerStock();								// 재고 조회 결과
+		stockCheck.setGoodsCd(param.getGoodsCd());
+		stockCheck.setOptCd(param.getOptCd());
+
+		stockCheck = orderOcmDao.getGoodsStockInfo(stockCheck);					// 구성 상품 재고 조회
+
+		if (stockCheck == null) {
+			return "재고체크 실패했습니다. 새로고침 후 다시 시도해주세요.";
+		}
+
+		if ("Y".equals(stockCheck.getSoldoutYn())) {
+			return stockCheck.getOptCd2() + " 옵션은 품절입니다.";
+		}
+
+		if (param.getGoodsQty() > stockCheck.getCurrStockQty()) {
+			return "옵션의 재고가 충분하지 않습니다.";
+		}
+
+		return "SUCCESS";
+	}
+
+	/**
+	 * 사은품정보 조회
+	 * @param Order
+	 * @return Order
+	 * @author jsh77b
+	 * @since 2020. 12. 16
+	 */
+	public GagaMap getOrderFreegift(ExtmallOrder order) {
+
+		GagaMap resultMap = new GagaMap();
+		Collection<ExtmallOrder> freegiftGoodsList 	= null;
+		Collection<ExtmallOrder> freegiftList 			= null;
+
+		// 1. 장바구니 담긴 상품으로 적용된 사은품 프로모션 정보 조회 (with 상품금액)
+		Collection<ExtmallOrder> freegiftApplyAmtList = orderOcmDao.getFreeGiftGoodsApplyAmt(order);
+
+		// 1.1 장바구니 상품으로 적용된 사은품 여부 판단
+		if (freegiftApplyAmtList.size() > 0) {
+
+			Collection<ExtmallOrder> freegiftGoodsApplyAmtList = new ArrayList<ExtmallOrder>();
+			int tempFreegiftSq 		= 0;
+			int index				= 0;
+			boolean	temp			 = false;
+
+			// 사은품시퀀스 담기
+			for (ExtmallOrder freegiftApplyAmt : freegiftApplyAmtList) {
+				temp = true;
+				if (freegiftGoodsApplyAmtList.size() > 0) {
+					for (ExtmallOrder freegiftGoodsApplyAmt : freegiftGoodsApplyAmtList) {
+						if (freegiftApplyAmt.getFreegiftSq() == freegiftGoodsApplyAmt.getFreegiftSq()) {
+							temp = false;
+						}
+					}
+
+					if (temp) {
+						freegiftGoodsApplyAmtList.add(freegiftApplyAmt);
+					}
+				} else {
+					freegiftGoodsApplyAmtList.add(freegiftApplyAmt);
+				}
+			}
+
+
+			// 사은품시퀀스(FREEGIFT_SQ), 사은품시퀀스합계금액(FREEGIFT_AMT)
+			for (ExtmallOrder freegiftGoodsApplyAmt : freegiftGoodsApplyAmtList) {
+				// 금액초기화
+				freegiftGoodsApplyAmt.setFreegiftAmt(0);
+
+				for (ExtmallOrder freegiftApplyAmt : freegiftApplyAmtList) {
+					int ordAmt = (freegiftApplyAmt.getCurrPrice() + freegiftApplyAmt.getOptAddPrice()) * freegiftApplyAmt.getGoodsQty();
+					if (freegiftGoodsApplyAmt.getFreegiftSq() == freegiftApplyAmt.getFreegiftSq()) {
+						freegiftGoodsApplyAmt.setFreegiftAmt(freegiftGoodsApplyAmt.getFreegiftAmt() + ordAmt);
+					}
+				}
+			}
+
+
+			// 사은품시퀀스배열생성
+			int[] freegiftSqArr = new int[freegiftGoodsApplyAmtList.size()];
+			index = 0;
+
+			// 사은품시퀀스(FREEGIFT_SQ), 사은품시퀀스합계금액(FREEGIFT_AMT)
+			for (ExtmallOrder fregiftGoodsApplyAmt : freegiftGoodsApplyAmtList) {
+				freegiftSqArr[index] = fregiftGoodsApplyAmt.getFreegiftSq();
+				index++;
+			}
+
+			order.setFreegiftSqArr(freegiftSqArr);
+
+			// 2. 사은품 적용구간 정보 조회
+			Collection<ExtmallOrder> freegiftGoodsApplySectionList = orderOcmDao.getFreeGiftGoodsApplySection(order);
+
+			// 2.1 사은품 적용구간이 있는지 판단
+			if (freegiftGoodsApplySectionList.size() > 0) {
+				int[] freegiftSectionSqArr = new int[freegiftGoodsApplySectionList.size()];
+
+				int tempFreegiftSectionSq = 0;
+				int k = 0;
+
+				// 사은품시퀀스(FREEGIFT_SQ), 사은품시퀀스합계금액(FREEGIFT_AMT)
+				for (ExtmallOrder freegiftGoodsApplyAmt : freegiftGoodsApplyAmtList) {
+					int freegiftAmt 	= freegiftGoodsApplyAmt.getFreegiftAmt();
+
+					// 사은풐구간시퀀스(FREEGIFT_SECTION_SQ, 사은품시퀀스(FREEGIFT_SQ), 사은풐구간금액(SECTION_VAL)
+					for (ExtmallOrder freegiftGoodsApplySection : freegiftGoodsApplySectionList) {
+						int freegiftSectionSq 	= freegiftGoodsApplySection.getFreegiftSectionSq();
+						int sectionVal 			= freegiftGoodsApplySection.getSectionVal();
+
+						// 같은 사은품 프로모션끼리 등록
+						if (freegiftGoodsApplyAmt.getFreegiftSq() == freegiftGoodsApplySection.getFreegiftSq()) {
+							// 2021.05.07 금액체크는 이상일때 수정
+							if (freegiftAmt >= sectionVal) {
+								tempFreegiftSectionSq = freegiftSectionSq;
+							}
+						}
+					}
+
+					freegiftSectionSqArr[k] = tempFreegiftSectionSq;
+					k++;
+				}
+
+				// 3. 사은품 적용구간 의 적용 사은품정보조회
+				order.setFreegiftSectionSqArr(freegiftSectionSqArr);
+				Collection<ExtmallOrder> freegiftGoodsApplyValList = orderOcmDao.getFreeGiftGoodsApplyVal(order);
+
+				if (freegiftGoodsApplyValList.size() > 0) {
+					freegiftList 		= new ArrayList<ExtmallOrder>();
+					freegiftGoodsList 	= new ArrayList<ExtmallOrder>();
+
+					for (ExtmallOrder freegiftGoodsApplyVal : freegiftGoodsApplyValList) {
+
+						// 제휴몰 사은품 전체 제공
+						//if (freegiftGoodsApplyVal.getFreegiftSq() != tempFreegiftSq) {
+							freegiftList.add(freegiftGoodsApplyVal);
+							tempFreegiftSq = freegiftGoodsApplyVal.getFreegiftSq();
+						//}
+
+						freegiftGoodsList.add(freegiftGoodsApplyVal);
+					}
+				}
+			}
+		}
+
+		resultMap.set("freegiftApplyAmtList"		, freegiftApplyAmtList);
+		resultMap.set("freegiftGoodsList"			, freegiftGoodsList);
+		resultMap.set("freegiftList"				, freegiftList);
+
+		return resultMap;
+	}
+
+
+
+
+
+
+	/**
+	 * 제휴몰주문등록 엑셀 저장
+	 *
+	 * @param excelExtmallOrderList - 외부몰주문등록리스트
+	 * @param excelFilename - 엑셀파일명
+	 * @return void
+	 * @author jmh
+	 * @since 2021. 06. 15
+	 */
+	@Transactional("shopTxnManager")
+	public void createExtmallOrderExcelupload(Collection<GagaMap> excelExtmallOrderList, String excelFilename, int userNo) {
+		String targetPath = env.getProperty("upload.excel.target.path");
+
+		if ((excelExtmallOrderList == null || excelExtmallOrderList.isEmpty())) {
+			try {
+				GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, excelFilename));
+			} catch (IOException e) {
+				// Nothing Do
+			}
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+		orderOcmDao.deleteExtmallOrderUploadTmp(userNo);
+
+
+		int dataIndex = 2;
+		int index = 0;
+		String vendorId = "";
+		for (GagaMap gagaMap : excelExtmallOrderList) {
+			ExtmallOrder extmallOrder = mapper.convertValue(gagaMap, ExtmallOrder.class);
+			String[] params = extmallOrder.getParams();
+			String[] columns = extmallOrder.getColumns();
+
+			for (int validation = 0; validation < params.length; validation++) {
+				if( validation != 0 && validation != 15 && validation != 22 ) {	// 첫번재열, 이메일 미체크, 배송MEMO
+					if ("".equals(params[validation]) || params[validation] == null || "null".equals(params[validation])) {
+						throw new IllegalStateException(dataIndex + "행에 " + columns[validation] + "(을)를 입력해 주세요.");
+					}
+				}
+			}
+
+			//extmallOrder.setOrdDt(extmallOrder.getOrdDt().replace("-", ""));
+			//extmallOrder.setPayDt(extmallOrder.getPayDt().replace("-", ""));
+			extmallOrder.setVendorId(TscConstants.VendorId.SHOPLINKER.value());
+			extmallOrder.setOrdAmt( (extmallOrder.getCurrPrice() * extmallOrder.getOrdQty()) - extmallOrder.getCpnDcAmt());
+			extmallOrder.setUploadStat(TscConstants.ExtmallUploadStat.WAIT.value());
+			extmallOrder.setRegNo(userNo);
+			extmallOrder.setUploadGb("E");
+			orderOcmDao.createExtmallOrderUploadTmp(extmallOrder);
+			dataIndex++;
+			index++;
+		}
+
+		// 결과조회시, 실패목록이 여러건 뜨지 않도록 하기위함. => 실패 history가 단건만 생성되도록
+		orderOcmDao.deleteExtmallOrderUploadFail(userNo);
+	}
+
+	/**
+	 * 제휴몰주문등록 업로드 후 목록
+	 *
+	 * @param ExtmallOrder - 외부몰 주문등록 정보
+	 * @return Collection<ExtmallOrder>
+	 * @author Daehyoung
+	 * @since 2020. 02. 13
+	 */
+	public Collection<ExtmallOrder> getExtmallOrderUploadTmpList(int userNo) {
+		ExtmallOrder extmallOrder = new ExtmallOrder();
+		extmallOrder.setRegNo(userNo);
+		return orderOcmDao.getExtmallOrderUploadTmpList(extmallOrder);
+	}
+
+	/**
+	 * 제휴몰주문등록 업로드 후 저장 처리
+	 *
+	 * @param extmallOrderUpload - 외부몰주문업로드 정보
+	 * @return String - 결과값
+	 * @author jmh
+	 * @since 2020. 06. 15
+	 */
+	@Transactional("shopTxnManager")
+	public String saveExtmallorder(ExtmallOrder extmallOrder) {
+
+		int collectCnt = orderOcmDao.createExtmallOrderUploadSecond(extmallOrder);
+		//log.info("STEP2 2.1.외부몰주문업로드 데이터 생성: 성공({} 건)", collectCnt);
+
+		this.createShoplinkerOrder("E", extmallOrder.getRegNo());
+
+		ExtmallOrder resultInfo = orderOcmDao.getExtmallOrderUploadResultInfo(extmallOrder);
+
+		return message.getMessage("SABANGNET_0004", new Object[] {collectCnt, resultInfo.getSuccCnt(), resultInfo.getFailCnt()});
+	}
+
+	/**
+	 * 제휴몰주문등록 업로드 후 목록
+	 *
+	 * @return Collection<ExtmallOrder>
+	 * @author jmh
+	 * @since 2020. 06. 15
+	 */
+	public Collection<ExtmallOrder> getExtmallOrderUploadSecondList(ExtmallOrder extmallOrder) {
+		return orderOcmDao.getExtmallOrderUploadSecondList(extmallOrder);
+	}
+
+
+}

+ 14 - 10
src/main/java/com/style24/core/biz/service/TscOrderService.java

@@ -1581,8 +1581,6 @@ public class TscOrderService {
 
 				orderDao.createOrderDetailItem(orderDetailItem); // 주문상세단품정보등록
 				
-				orderDao.createOrderDetailItemHst(orderDetailItem); // 주문상세단품이력정보등록
-				
 				index++;
 			}
 		}
@@ -1660,8 +1658,10 @@ public class TscOrderService {
 		orderDao.updateOrderDetailItem(order);
 		
 		// 4.1 주문상세단품 이력정보 전체 등록
+		// 2021.06.25 결제완료 (정산구분값추가)
+		order.setOrdDtlStat(TscConstants.OrdDtlItemStat.SALE_PAYMENT_COMPLETE.value());
 		orderDao.createOrderDetailItemAllHst(order);
-		
+
 		// 5. 상품재고처리
 		orderDao.createSellQty(order);
 		
@@ -1846,7 +1846,7 @@ public class TscOrderService {
 		orderDao.updateOrderDetailItem(order);
 		
 		// 3.1 주문상세단품 이력정보 전체 등록
-		orderDao.createOrderDetailItemAllHst(order);
+		//orderDao.createOrderDetailItemAllHst(order);
 		
 		// 4. 사은품 상태값 수정
 		orderDao.updateOrdFreegiftValOrdDtlStat(order);
@@ -1885,6 +1885,7 @@ public class TscOrderService {
 				
 				order.setGiftPackCloseYn(orderInfo.getGiftPackCloseYn());
 				order.setGiftPackCloseDt(orderInfo.getGiftPackCloseDt());
+				order.setOrdDt(orderInfo.getOrdDt());
 			}
 			index++;
 		}
@@ -1895,6 +1896,7 @@ public class TscOrderService {
 		for (Order deliveryAddrInfo : deliveryAddrInfoList) {
 			if (index == 0) {
 				order.setRecipNm(deliveryAddrInfo.getRecipNm());
+				order.setRecipZipcode(deliveryAddrInfo.getRecipZipcode());
 				order.setRecipBaseAddr(deliveryAddrInfo.getRecipBaseAddr());
 				order.setRecipDtlAddr(deliveryAddrInfo.getRecipDtlAddr());
 				order.setRecipPhnno(deliveryAddrInfo.getRecipPhnno());
@@ -1908,7 +1910,7 @@ public class TscOrderService {
 		
 		// 3. 상품정보조회
 		Collection<Order> orderDetailList 			= orderDao.getOrderDetailOrdAmtList(order);
-		Collection<Order> orderDetailDelvFeeCdGrp 	= orderDao.getOrderDetailDelvFeeCdGrp(order);
+		//Collection<Order> orderDetailDelvFeeCdGrp 	= orderDao.getOrderDetailDelvFeeCdGrp(order);
 		
 		int listSumAmt 			= 0; // 상품금액합계(정상가)
 		int goodsSumAmt 		= 0; // 상품금액합계(판매가)
@@ -2071,8 +2073,13 @@ public class TscOrderService {
 			orderChange.setGoodsType(orderDetail.getGoodsType());
 			orderChange.setSysImgNm(orderDetail.getSysFileNm());
 			orderChange.setSupplyCompNm(orderDetail.getSupplyCompNm());
-			orderChange.setDelvFeeCd(orderDetail.getCartDelvFeeCd());
+			orderChange.setDelvFeeCd(orderDetail.getDelvFeeCd());
 			orderChange.setOrdNo(order.getOrdNo());
+			orderChange.setChgQty(orderDetail.getOrdQty());
+			
+			orderChange.setListPrice((orderDetail.getListPrice() + orderDetail.getOptAddPrice()) * orderDetail.getOrdQty());
+			int ordAmt = ((orderDetail.getCurrPrice() + orderDetail.getOptAddPrice()) * orderDetail.getOrdQty()) - orderDetail.getCpn1DcAmt() - (orderDetail.getTmtb1DcAmt() + orderDetail.getTmtb2DcAmt());
+			orderChange.setOrdAmt(ordAmt);
 
 			cancelList.add(orderChange);
 		}
@@ -2081,15 +2088,12 @@ public class TscOrderService {
 		String cancelInfo = orderChangeService.getMailOrderCancelInfo(cancelList);
 		resultMap.set("orderListInfo"		, cancelInfo);				// 주문목록
 		
-		log.info("cancelInfo ::: {}", cancelInfo);
-		
 		// 사은품목록
 		OrderChange oc = new OrderChange();
 		oc.setOrdNo(order.getOrdNo());
 		String freeGiftInfo = orderChangeService.getMailFreeGiftCancelInfo(oc);
 		resultMap.set("orderFreegiftInfo"	, freeGiftInfo);			// 사은품목록
-		
-		log.info("freeGiftInfo ::: {}", freeGiftInfo);
+
 
 		return resultMap;
 	}

+ 1797 - 0
src/main/java/com/style24/core/biz/service/TscShoplinkerService.java

@@ -0,0 +1,1797 @@
+package com.style24.core.biz.service;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URLEncoder;
+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.core.env.Environment;
+import org.springframework.stereotype.Service;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.gagaframework.shoplinker.GagaShoplinkertUtil;
+import com.gagaframework.shoplinker.domain.orderlist.Order;
+import com.gagaframework.shoplinker.env.GagaShoplinkerConstants;
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.util.GagaDateUtil;
+import com.gagaframework.web.util.GagaFileUtil;
+import com.style24.core.biz.dao.TscOrderOcmDao;
+import com.style24.core.biz.dao.TscShoplinkerDao;
+import com.style24.core.support.env.TscConstants;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.ExtmallOrder;
+import com.style24.persistence.domain.ShoplinkerGoods;
+import com.style24.persistence.domain.ShoplinkerInvoice;
+import com.style24.persistence.domain.ShoplinkerOrder;
+import com.style24.persistence.domain.ShoplinkerSearch;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 영업망관리 샵링커 Service
+ *
+ * @author gagamel
+ * @since 2020. 11. 4
+ */
+@Service
+@Slf4j
+@SuppressWarnings("deprecation")
+public class TscShoplinkerService {
+
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TscShoplinkerDao shoplinkerDao;
+
+	//@Autowired
+	//private TsaCommonService commonService;
+
+	@Autowired
+	private TscOrderOcmDao orderOcmDao;
+
+	@Autowired
+	private ObjectMapper mapper;
+
+	private String fileAddNm; // 유저번호_년월일시분초
+
+
+	/**
+	 * 샵링커 api 호출 가능여부
+	 *
+	 * @param
+	 * @return
+	 * @author jmh
+	 * @since 2020. 5. 28
+	 */
+	public ShoplinkerSearch getCallRunableInfo(ShoplinkerSearch slkSearch) {
+		ShoplinkerSearch result = shoplinkerDao.getCallRunableInfo(slkSearch);
+		if( null == result ) {
+			result = new ShoplinkerSearch();
+			result.setRunCnt(0);
+		}
+		return result;
+	}
+
+
+	/**
+	 * 샵링커 api 호출 가능여부 상태 저장
+	 *
+	 * @param shoplinkerOrder
+	 * @return
+	 * @author jmh
+	 * @since 2020. 5. 28
+	 */
+	public void saveCallApiRunable(ShoplinkerSearch slkSearch) {
+		shoplinkerDao.saveCallApiRunable(slkSearch);
+	}
+
+	/**
+	 * 샵링커 api 호출 가능여부 상태 수정
+	 *
+	 * @param shoplinkerOrder
+	 * @return
+	 * @author jmh
+	 * @since 2020. 5. 28
+	 */
+	public void updateCallApiRunable(ShoplinkerSearch slkSearch) {
+		shoplinkerDao.updateCallApiRunable(slkSearch);
+	}
+
+
+	/**
+	 * 샵링커 상품등록
+	 *
+	 * @param shoplinkerGoods
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	public GagaMap createShoplinkerXml(Collection<GagaMap> ecxelGoodsList, ShoplinkerGoods shoplinkerGoods)throws IOException {
+		// 파일명 추가 네이밍 규칙
+		fileAddNm = shoplinkerGoods.getRegNo() +"_"+ GagaDateUtil.getTodayDateTime();
+
+		GagaMap rtnMap = new GagaMap();
+		int optionAll=0, optionSucc=0;
+		int excelCnt= ecxelGoodsList.size();
+		int tProdSucc = 0, productSucc=0, goodsNotiSucc=0, certSucc=0, imageSucc=0;
+
+		for (GagaMap gagaMap : ecxelGoodsList) {
+			if( !"".equals(gagaMap.getString("goodsCd").trim())) {
+				shoplinkerGoods.setGoodsCd(gagaMap.getString("goodsCd"));
+
+				// 1. 단품생성
+				rtnMap = createOptionRegisterXml(shoplinkerGoods);
+				optionAll += rtnMap.getInt("allCnt");
+				optionSucc += rtnMap.getInt("succCnt");
+
+				// 2. 상품생성
+				tProdSucc = createGoodsRegisterXml(shoplinkerGoods);
+				productSucc += tProdSucc;
+
+				// 3. 고시정보(품목정보)
+				goodsNotiSucc += createGoodsNotiRegisterXml(shoplinkerGoods);
+
+				// 4. 인증정보
+				certSucc += createCertRegisterXml(shoplinkerGoods);
+
+				// 5. 상품이미지정보
+				imageSucc += createImageRegisterXml(shoplinkerGoods);
+			}
+		}
+
+		rtnMap = new GagaMap();
+		rtnMap.setInt("excelCnt", excelCnt);
+		rtnMap.setInt("optionAll", optionAll);
+		rtnMap.setInt("optionSucc", optionSucc);
+		rtnMap.setInt("productSucc", productSucc);
+		rtnMap.setInt("goodsNotiSucc", goodsNotiSucc);
+		rtnMap.setInt("certSucc", certSucc);
+		rtnMap.setInt("imageSucc", imageSucc);
+
+		return rtnMap;
+	}
+
+	/**
+	 * 샵링커 상품등록 - 1. 단품생성
+	 *
+	 * @param shoplinkerGoods
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	private GagaMap createOptionRegisterXml(ShoplinkerGoods shoplinkerGoods) throws IOException {
+
+		GagaMap returnMap = new GagaMap();
+		ShoplinkerGoods regMap = new ShoplinkerGoods();
+		regMap.setApiType("OPTION");
+		regMap.setApiSubUrl(env.getProperty("shoplinker.url.option"));
+		regMap.setGoodsCd(shoplinkerGoods.getGoodsCd());
+		regMap.setRegNo(shoplinkerGoods.getRegNo());
+		regMap.setXmlPath(shoplinkerGoods.getXmlPath());
+		regMap.setDomainUrl(shoplinkerGoods.getDomainUrl());
+
+		int succCnt = 0;
+		int allCnt = 0;
+
+		try {
+			// 옵션 목록조회
+			Collection<ShoplinkerGoods> list = shoplinkerDao.getOptionList(shoplinkerGoods);
+			if( null != list && !list.isEmpty()) {
+				allCnt = list.size();
+
+				StringBuilder sbRequest;
+				int opCnt = 0;
+				for (ShoplinkerGoods map : list) {
+					opCnt ++;
+
+					// xml 데이터 세팅
+					sbRequest = new StringBuilder();
+					sbRequest.append("<?xml version=\"1.0\" encoding=\"euc-kr\"?>\n");
+					sbRequest.append("<shoplinker>\n");
+					sbRequest.append("	<productInfo>\n");
+					sbRequest.append("		<product>\n");
+
+					sbRequest.append("			<customer_id>").append(shoplinkerGoods.getCustomerId()).append("</customer_id>\n");
+					sbRequest.append("			<partner_product_id><![CDATA[").append(map.getPartnerProductId()).append("]]></partner_product_id>\n");
+					sbRequest.append("			<attribute_code><![CDATA[").append("999999999").append("]]></attribute_code>\n");
+					sbRequest.append("			<product_name><![CDATA[").append(map.getOptCd1()+"_"+map.getOptCd2()).append("]]></product_name>\n");
+					sbRequest.append("			<quantity>").append(map.getQuantity()).append("</quantity>\n");
+
+					sbRequest.append("		</product>\n");
+					sbRequest.append("	</productInfo>\n");
+					sbRequest.append("</shoplinker>\n");
+
+					regMap.setOptCd(map.getPartnerProductId());
+					regMap.setQuantity(map.getQuantity());
+
+					// api 호출 및 결과 history 저장
+					succCnt += callGoodsRegApi(regMap , sbRequest, "option_"+opCnt);
+				}
+			}
+		}catch(Exception e) {
+			log.error("xml 생성오류 ", e);
+			regMap.setApiResult("error");
+			regMap.setApiMessage("xml 생성오류");
+			shoplinkerDao.insertShoplinerApiHst(regMap);
+		}
+
+		returnMap.setInt("allCnt", allCnt);
+		returnMap.setInt("succCnt", succCnt);
+
+		return returnMap;
+	}
+
+	/**
+	 * 샵링커 상품등록 - 2. 상품생성
+	 *
+	 * @param shoplinkerGoods
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	public int createGoodsRegisterXml(ShoplinkerGoods shoplinkerGoods) throws IOException {
+
+		ShoplinkerGoods regMap = new ShoplinkerGoods();
+		regMap.setApiType("PRODUCT");
+		regMap.setApiSubUrl(env.getProperty("shoplinker.url.product"));
+		regMap.setGoodsCd(shoplinkerGoods.getGoodsCd());
+		regMap.setRegNo(shoplinkerGoods.getRegNo());
+		regMap.setXmlPath(shoplinkerGoods.getXmlPath());
+		regMap.setDomainUrl(shoplinkerGoods.getDomainUrl());
+
+		int succCnt = 0;
+
+		try {
+			// 상품기본정보
+			ShoplinkerGoods goodsMap = shoplinkerDao.getGoods(shoplinkerGoods);
+
+			// 상품상세(퍼블) 세팅
+			String detailDesc = this.setDetailDesc(shoplinkerGoods, goodsMap);
+
+			// xml 데이터 세팅
+			StringBuilder sbRequest = new StringBuilder();
+			sbRequest.append("<?xml version=\"1.0\" encoding=\"euc-kr\"?>\n");
+			sbRequest.append("<shoplinker>\n");
+			sbRequest.append("	<productInfo>\n");
+			sbRequest.append("		<product>\n");
+
+			sbRequest.append("			<customer_id>").append(shoplinkerGoods.getCustomerId()).append("</customer_id>\n");
+			sbRequest.append("			<partner_product_id>").append(goodsMap.getGoodsCd()).append("</partner_product_id>\n");
+			sbRequest.append("			<attribute_title_code>").append("999999999").append("</attribute_title_code>\n");
+			sbRequest.append("			<attribute_partner_product_id>").append(goodsMap.getAttributePartnerProductId()).append("</attribute_partner_product_id>\n");
+			sbRequest.append("			<product_name>").append(goodsMap.getProductName()).append("</product_name>\n");
+			sbRequest.append("			<detail_desc>").append(detailDesc).append("</detail_desc>\n");
+
+			// 가격연계
+			if( "Y".equals(goodsMap.getSyncYn())) {
+				//sbRequest.append("			<new_desc_top>").append(goodsMap.getNewDescTop()).append("</new_desc_top>\n");
+				//sbRequest.append("			<market_price>").append(goodsMap.getMarketPrice()).append("</market_price>\n");
+				sbRequest.append("			<sale_price>").append(goodsMap.getSalePrice()).append("</sale_price>\n");
+				sbRequest.append("			<supply_price>").append(goodsMap.getSupplyPrice()).append("</supply_price>\n");
+				//sbRequest.append("			<market_price_p>").append(goodsMap.getMarketPriceP()).append("</market_price_p>\n");
+				//sbRequest.append("			<sale_price_p>").append(goodsMap.getSalePriceP()).append("</sale_price_p>\n");
+				//sbRequest.append("			<supply_price_p>").append(goodsMap.getSupplyPriceP()).append("</supply_price_p>\n");
+			}else{
+				//sbRequest.append("			<new_desc_top>").append(goodsMap.getNewDescTop()).append("</new_desc_top>\n");
+				//sbRequest.append("			<market_price>").append(goodsMap.getMarketPrice()).append("</market_price>\n");
+				sbRequest.append("			<sale_price>").append(0).append("</sale_price>\n");
+				sbRequest.append("			<supply_price>").append(0).append("</supply_price>\n");
+				//sbRequest.append("			<market_price_p>").append(goodsMap.getMarketPriceP()).append("</market_price_p>\n");
+				//sbRequest.append("			<sale_price_p>").append(goodsMap.getSalePriceP()).append("</sale_price_p>\n");
+				//sbRequest.append("			<supply_price_p>").append(goodsMap.getSupplyPriceP()).append("</supply_price_p>\n");
+			}
+
+			sbRequest.append("			<sale_status>").append("001").append("</sale_status>\n"); // 판매중
+			sbRequest.append("			<tax_yn>").append("001").append("</tax_yn>\n"); // 과세
+			sbRequest.append("			<salearea>전국</salearea>\n");
+			sbRequest.append("			<sex>").append(goodsMap.getSex()).append("</sex>\n");
+			sbRequest.append("			<model>").append(goodsMap.getModel()).append("</model>\n");
+			sbRequest.append("			<model_no>").append(goodsMap.getModelNo()).append("</model_no>\n");
+			sbRequest.append("			<brand>").append(goodsMap.getBrand()).append("</brand>\n");
+			sbRequest.append("			<auth_no>").append(goodsMap.getAuthNo()).append("</auth_no>\n");
+			sbRequest.append("			<expirydate>20991231</expirydate>\n");
+			sbRequest.append("			<maker>").append(goodsMap.getMaker()).append("</maker>\n");
+			sbRequest.append("			<origin>").append(goodsMap.getOrigin()).append("</origin>\n");
+			sbRequest.append("			<adult_info>").append(goodsMap.getAdultInfo()).append("</adult_info>\n");
+			sbRequest.append("			<ccategory_l>").append(goodsMap.getCcategoryL()).append("</ccategory_l>\n");
+			sbRequest.append("			<ccategory_m>").append(goodsMap.getCcategoryM()).append("</ccategory_m>\n");
+			sbRequest.append("			<ccategory_s>").append(goodsMap.getCcategoryS()).append("</ccategory_s>\n");
+			sbRequest.append("			<ccategory_d>").append(goodsMap.getCcategoryD()).append("</ccategory_d>\n");
+
+			sbRequest.append("		</product>\n");
+			sbRequest.append("	</productInfo>\n");
+			sbRequest.append("</shoplinker>\n");
+
+			if( null != goodsMap.getShoplinkerItemkindNm()) {
+				// api 호출 및 결과 history 저장
+				succCnt = callGoodsRegApi(regMap , sbRequest, "product");
+
+			}else {
+				// 품목매핑정보 없음. 전송 안함
+				regMap.setXmlTxt(sbRequest.toString());
+				regMap.setApiResult("error");
+				regMap.setApiMessage("API 전송안함=>샵링커 품목매핑정보가 없습니다. (자사품목코드: "+goodsMap.getItemkindCd()+")");
+				shoplinkerDao.insertShoplinerApiHst(regMap);
+			}
+
+		}catch(Exception e) {
+			log.error("xml 생성오류 ", e);
+			regMap.setApiResult("error");
+			regMap.setApiMessage("xml 생성오류");
+			shoplinkerDao.insertShoplinerApiHst(regMap);
+		}
+
+		return succCnt;
+	}
+
+	/**
+	 * 샵링커 상품등록 - 상세내용 세팅
+	 *
+	 * @param shoplinkerGoods
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	private String setDetailDesc(ShoplinkerGoods shoplinkerGoods, ShoplinkerGoods goodsMap) {
+
+		String htmlDesc = "";
+
+		// 상세폼신규사용여부 N: 기존 정보 / Y : html 형식
+		if( "N".equals(goodsMap.getTobeFormYn())){
+			String descStr = goodsMap.getDetailDesc();
+			descStr = descStr.replace("http://www.istyle24.com/Upload/", "http://image.istyle24.com/Local/")
+					.replace("/Upload", "http://image.istyle24.com/Local")
+					.replace("http://www.istyle24.com/Images", "http://image.istyle24.com/Statics/design/Images");
+
+			htmlDesc = descStr;
+
+		}else {
+
+			String imgPath = env.getProperty("upload.goods.view");
+			imgPath = imgPath.replace("/Upload", "/Local")
+					.replace("http://www.istyle24.com/Upload/", "http://image.istyle24.com/Local/")
+					.replace("http://www.istyle24.com/Images", "http://image.istyle24.com/Statics/design/Images");
+
+			Collection<ShoplinkerGoods> imgList = shoplinkerDao.getGoodsImageList(shoplinkerGoods);
+
+			String dColor = goodsMap.getMainColorEnm(); //대표컬러
+			String dImgFront = "";	//대표상품 앞판컷
+			String dImgBack = ""; 	//대표상품 뒷판컷
+			String dMaterial = ""; //대표상품 패브릭(소재컷?)
+			ArrayList<String> dImgModelList = new ArrayList<String>(); //대표상품 모델컷
+			ArrayList<String> dImgDetailList = new ArrayList<String>(); //대표상품 디테일컷(상세컷)
+			ArrayList<String> dLabelList = new ArrayList<String>(); //대표상품 케어라벨
+			ArrayList<String> dImgOtherList = new ArrayList<String>(); //상품외부몰용
+
+			// 이미지 정보
+			for(ShoplinkerGoods map : imgList) {
+
+				if( -1 < map.getSysImgNm().indexOf("_"+map.getColorCd()+"_01.jpg")) { //대표상품 앞판컷
+					dImgFront = imgPath +"/"+ map.getSysImgNm();
+		        }
+				if( -1 < map.getSysImgNm().indexOf("_"+map.getColorCd()+"_02.jpg")) { //대표상품 뒷판컷
+					dImgBack = imgPath +"/"+ map.getSysImgNm();
+		        }
+				if( -1 < map.getSysImgNm().indexOf("_"+map.getColorCd()+"_C")) { //대표상품 모델컷
+					dImgModelList.add(imgPath +"/"+ map.getSysImgNm());
+		        }
+				if( -1 < map.getSysImgNm().indexOf("_"+map.getColorCd()+"_D")) { //대표상품 디테일컷(상세컷)
+					dImgDetailList.add(imgPath +"/"+ map.getSysImgNm());
+		        }
+				if( -1 < map.getSysImgNm().indexOf("_"+map.getColorCd()+"_F")) { //대표상품 패브릭(소재컷?)
+					dMaterial = imgPath +"/"+ map.getSysImgNm();
+		        }
+				if( -1 < map.getSysImgNm().indexOf("_"+map.getColorCd()+"_L")) { //대표상품 케어라벨
+					dLabelList.add(imgPath +"/"+ map.getSysImgNm());
+		        }
+				if( -1 < map.getSysImgNm().indexOf("_"+map.getColorCd()+"_X")) { //대표상품 디테일컷(상세컷)
+					dImgOtherList.add(imgPath +"/"+ map.getSysImgNm());
+		        }
+			}
+
+			// 제대로된 정보 없을 경우, 기존 상세내용으로 보냄
+			if( "".equals(dImgFront) || "".equals(dImgBack)) {
+				String descStr = goodsMap.getDetailDesc();
+				descStr = descStr.replace("http://www.istyle24.com/Upload/", "http://image.istyle24.com/Local/")
+						.replace("/Upload", "http://image.istyle24.com/Local")
+						.replace("http://www.istyle24.com/Images", "http://image.istyle24.com/Statics/design/Images");
+
+				htmlDesc = descStr;
+
+			}else {
+
+				// 1) 상세내용 - 상품설명
+				htmlDesc = "<div class='st_descrp_box' style='max-height:1100px; overflow:hidden;'>";
+				htmlDesc += "<div class='st_desc_simple' style='position:relative; margin-top:0px; margin-left:auto; margin-right:auto;'>";
+				htmlDesc += "<span class='st_tit_desc' style='display:block; margin-bottom:10px; font-size:18px; font-weight:500; letter-spacing:-0.025em;'>"+goodsMap.getDetailDescNew10()+"</span>";
+				htmlDesc += "<p class='st_ptxt01' style='font-size:16px;font-weight:200;line-height:1.5;word-break:keep-all;color:#666666;'>";
+				htmlDesc += goodsMap.getDetailDescNew20();
+				htmlDesc += "</p>";
+				htmlDesc += "</div>";
+				htmlDesc += "<div class='st_desc_character' style='position:relative; margin-top:40px; margin-left:auto; margin-right:auto;'>";
+				htmlDesc += "<span class='st_tit_desc' style='display:block; margin-bottom:10px; font-size:18px; font-weight:500; letter-spacing:-0.025em;'>상품특징</span>";
+				htmlDesc += "<p class='st_ptxt01' style='font-size:16px;font-weight:200;line-height:1.5;word-break:keep-all;color:#666666;'>";
+				htmlDesc += goodsMap.getDetailDescNew30();
+		        htmlDesc += "</p>";
+        		htmlDesc += "</div>";
+				htmlDesc += "</div>";
+
+				// 2) 상세내용 - 상품옵션별 색상
+				String colorDesc = "";
+				shoplinkerGoods.setColorListYn("Y"); // 상품이미지정보 색상별
+				Collection<ShoplinkerGoods> imgColorList = shoplinkerDao.getGoodsImageList(shoplinkerGoods);
+				colorDesc = "<div class='st_view_option_box' style='margin-top: 100px;text-align: center;'>";
+				String tmpColor = "";
+				for(ShoplinkerGoods ic : imgColorList ) {
+
+					if( !tmpColor.equals(ic.getColorCd())) {
+						colorDesc += "<span class='st_tit_desc' style='display:block; margin-bottom:10px; font-size:18px; font-weight:500; letter-spacing:-0.025em;'>컬러 : ";
+						colorDesc += "<span>"+ ic.getColorKnm() +"</span></span>";
+					}
+					colorDesc += "<div class='st_view' style='margin-top: 40px;'>";
+					colorDesc += "<img src='"+ imgPath+"/"+ic.getSysImgNm()+"' alt='' style='max-width:100%;margin: 10px auto 0;margin-top: 0;display: block;'>";
+					colorDesc += "<img src='"+ imgPath+"/"+ic.getSysImgNm()+"' alt='' style='max-width:100%;display: block;margin: 10px auto 0;'>";
+	                colorDesc += "</div>";
+		            if( !tmpColor.equals(ic.getColorCd())) {
+		            	colorDesc += "<div style='height:100px;'></div>";
+		            	tmpColor = ic.getColorCd();
+					}
+				}
+				colorDesc += "</div>";
+				htmlDesc += colorDesc;
+
+				// 3) 상세내용 - 모델 착용컷
+				String dtlDesc = "";
+				dtlDesc += "<div class='st_view_outfit_box' style='margin-top: 100px;text-align: center;'>";
+				dtlDesc += "<span class='st_tit_view' style='display: block;color: #222;font-size: 32px;font-weight: 300;text-align: center;'>OUTFIT VIEW</span>";
+				dtlDesc += "<span class='st_model_info' style='display: block;margin-top: 20px;color: #666;font-size: 16px;font-weight: 200;text-align: center;'>"+goodsMap.getModelInfo()+"</span>";
+				dtlDesc += "<div class='st_view' style='margin-top: 40px;'>";
+				for(String img : dImgModelList) {
+					dtlDesc += "<img src='"+ img +"' alt='' style='display: block;margin: 10px auto 0;'>";
+				}
+				dtlDesc += "</div>";
+				dtlDesc += "</div>";
+
+				// 4) 상세내용 - 상품컷
+				dtlDesc += "<div class='st_view_detail_box' style='margin-top: 100px;text-align: center;'>";
+				dtlDesc += "<span class='st_tit_view' style='display: block;color: #222;font-size: 32px;font-weight: 300;text-align: center;'>PRODUCT VIEW</span>";
+				dtlDesc += "<div class='st_view' style='margin-top: 40px;'>";
+				for(String img : dImgDetailList) {
+					dtlDesc += "<img src='"+ img +"' alt='' style='display: block;margin: 10px auto 0;'>";
+				}
+                dtlDesc += "</div>";
+        		dtlDesc += " </div>";
+
+        		// 5) 상세내용 - 원단
+        		dtlDesc += "<div class='st_view_fabric_box' style='margin-top: 100px;text-align: center;'>";
+        		dtlDesc += "<span class='st_tit_view' style='display: block;color: #222;font-size: 32px;font-weight: 300;text-align: center;'>FABRIC</span>";
+        		dtlDesc += "<div class='st_view' style='margin-top: 40px;'>";
+        		dtlDesc += "<img src='"+dMaterial +"' alt='' style='display: block;margin: 10px auto 0;margin-top: 0;'>";
+                dtlDesc += "</div>";
+                dtlDesc += "</div>";
+
+                // 6) 상세내용 - 라벨
+                dtlDesc += "<div class='st_view_label_box' style='margin-top: 100px;text-align: center;'>";
+                dtlDesc += "<span class='st_tit_view' style='display: block;color: #222;font-size: 32px;font-weight: 300;text-align: center;'>LABEL INFO</span>";
+                dtlDesc += "<div class='st_view' style='margin-top: 40px;'>";
+                dtlDesc += "<span style='display:inline-block;'>";
+                for(String img : dLabelList) {
+					dtlDesc += "<img src='"+ img +"' alt='' style='float:left; margin-top:0; margin-left:20px;'>";
+				}
+                dtlDesc += "</span>";
+                dtlDesc += "</div>";
+                dtlDesc += "</div>";
+                htmlDesc += dtlDesc;
+
+                // 7) 상세내용 - 사이즈
+                Collection<ShoplinkerGoods> sizeList = shoplinkerDao.getGoodsSizeList(shoplinkerGoods);
+                if (sizeList == null || sizeList.isEmpty()) {
+                	//대표상품 실측정사이즈표 없을경우 > 브랜드 별 표준 이미지
+                	htmlDesc += "<div class='st_view_size_box' style='margin-top: 100px;text-align: center;'>";
+                	htmlDesc += "<span class='st_tit_view' style='display: block;color: #222;font-size: 32px;font-weight: 300;text-align: center;'>사이즈정보</span>";
+                	htmlDesc += "<div class='st_view' style='margin-top: 40px;'>";
+
+                	String brandSizeImg = env.getProperty("upload.image.view") + "/Upload/brandSizeImg/";
+                	if( "Y".equals(goodsMap.getKidsYn())){
+                		brandSizeImg += "kids/"+goodsMap.getBrandEnm() +".jpg";
+                		htmlDesc += "<img src='"+ brandSizeImg +"' alt='ANDEW 표준 사이즈' style='display: block;margin: 10px auto 0;'>";
+                	}else {
+                		brandSizeImg += "casuals/"+goodsMap.getBrandEnm() +".jpg";
+                		htmlDesc += "<img src='"+ brandSizeImg +"' alt='ANDEW 표준 사이즈' style='display: block;margin: 10px auto 0;'>";
+                	}
+                    htmlDesc += "</div>";
+                    htmlDesc += "</div>";
+
+                }else {
+
+                	htmlDesc += "<div class='st_view_size_box' style='margin-top: 100px;text-align: center;'>";
+                	htmlDesc += "<span class='st_tit_view' style='display: block;color: #222;font-size: 32px;font-weight: 300;text-align: center;'>사이즈정보</span>";
+                	htmlDesc += "<div class='st_view' style='margin-top: 40px;'>";
+
+                	htmlDesc += "<div class='st_tbl' style='padding:0; border-top:1px solid #000;'>";
+                	htmlDesc += "<table style='margin:0;padding:0;border-collapse:collapse;border-spacing:0;width:100%;border-top:1px solid #000;word-break:keep-all;'>";
+                	htmlDesc += "<thead style=''>";
+                	htmlDesc += "<tr style=''>";
+
+                	int cnt = 0;
+                	for(ShoplinkerGoods size : sizeList) {
+
+                		if( 0 == cnt ) {
+                			if( "하의".equals(size.getSizeTypecd())) {
+                				htmlDesc += "<th style='position:relative;padding:20px 0;border-bottom:1px solid #ddd;font-weight:500;font-size:16px;letter-spacing:-0.025em;text-align:center;'></th>";
+        	                	htmlDesc += "<th style='position:relative;padding:20px 0;border-bottom:1px solid #ddd;font-weight:500;font-size:16px;letter-spacing:-0.025em;text-align:center;'>허리둘레(cm)</th>";
+        	                	htmlDesc += "<th style='position:relative;padding:20px 0;border-bottom:1px solid #ddd;font-weight:500;font-size:16px;letter-spacing:-0.025em;text-align:center;'>밑위(cm)</th>";
+        	                	htmlDesc += "<th style='position:relative;padding:20px 0;border-bottom:1px solid #ddd;font-weight:500;font-size:16px;letter-spacing:-0.025em;text-align:center;'>엉덩이둘레(cm)</th>";
+        	                	htmlDesc += "<th style='position:relative;padding:20px 0;border-bottom:1px solid #ddd;font-weight:500;font-size:16px;letter-spacing:-0.025em;text-align:center;'>허벅지둘레(cm)</th>";
+        	                	htmlDesc += "<th style='position:relative;padding:20px 0;border-bottom:1px solid #ddd;font-weight:500;font-size:16px;letter-spacing:-0.025em;text-align:center;'>총길이(cm)</th>";
+                			}else {
+                				htmlDesc += "<th style='position:relative;padding:20px 0;border-bottom:1px solid #ddd;font-weight:500;font-size:16px;letter-spacing:-0.025em;text-align:center;'></th>";
+        	                	htmlDesc += "<th style='position:relative;padding:20px 0;border-bottom:1px solid #ddd;font-weight:500;font-size:16px;letter-spacing:-0.025em;text-align:center;'>가슴둘레(cm)</th>";
+        	                	htmlDesc += "<th style='position:relative;padding:20px 0;border-bottom:1px solid #ddd;font-weight:500;font-size:16px;letter-spacing:-0.025em;text-align:center;'>어깨너비(cm)</th>";
+        	                	htmlDesc += "<th style='position:relative;padding:20px 0;border-bottom:1px solid #ddd;font-weight:500;font-size:16px;letter-spacing:-0.025em;text-align:center;'>팔길이(cm)</th>";
+        	                	htmlDesc += "<th style='position:relative;padding:20px 0;border-bottom:1px solid #ddd;font-weight:500;font-size:16px;letter-spacing:-0.025em;text-align:center;'>총길이(cm)</th>";
+                			}
+                			htmlDesc += "</tr>";
+    	                	htmlDesc += "</thead>";
+    	                	htmlDesc += "<tbody style=''>";
+                		}
+
+                		htmlDesc += "<tr style=''>";
+                		htmlDesc += "<th style='position:relative;padding:20px 0;border-bottom:1px solid #ddd;font-weight:500;font-size:16px;letter-spacing:-0.025em;text-align:center;'>"+ size.getOptCd2() +"</th>";
+        				htmlDesc += "<td style='position:relative; padding:20px 0; border-bottom:1px solid #ddd; font-weight:200; font-size:16px; letter-spacing:-0.025em; text-align:center;'>"+ size.getSizeValue1() +"</td>";
+						htmlDesc += "<td style='position:relative; padding:20px 0; border-bottom:1px solid #ddd; font-weight:200; font-size:16px; letter-spacing:-0.025em; text-align:center;'>"+ size.getSizeValue2() +"</td>";
+						htmlDesc += "<td style='position:relative; padding:20px 0; border-bottom:1px solid #ddd; font-weight:200; font-size:16px; letter-spacing:-0.025em; text-align:center;'>"+ size.getSizeValue3() +"</td>";
+						htmlDesc += "<td style='position:relative; padding:20px 0; border-bottom:1px solid #ddd; font-weight:200; font-size:16px; letter-spacing:-0.025em; text-align:center;'>"+ size.getSizeValue4() +"</td>";
+						if( "하의".equals(size.getSizeTypecd())) {
+							htmlDesc += "<td style='position:relative; padding:20px 0; border-bottom:1px solid #ddd; font-weight:200; font-size:16px; letter-spacing:-0.025em; text-align:center;'>"+ size.getSizeValue5() +"</td>";
+						}
+                		cnt ++;
+                	}
+
+                	htmlDesc += "</tbody>";
+                	htmlDesc += "</table>";
+        			htmlDesc += "</div>";
+					htmlDesc += "</div>";
+					htmlDesc += " </div>";
+                }
+
+
+                // 8) 상세내용 - 상품필수정보
+                ShoplinkerGoods certInfo = shoplinkerDao.getCert(shoplinkerGoods);
+                if( null != certInfo) {
+                	if( "G083_1".equals(certInfo.getCertTargetGb())) {	// 인증대상
+
+                		if( "".equals(certInfo.getCertNum())) {
+
+                			htmlDesc += "<div class='st_required_box' style='margin-bottom:80px;'>";
+                			htmlDesc += "<div class='st_area_kcl' style='color:#222;display:block; position:relative; min-height:160px; margin-top:100px; padding:40px 40px 40px 160px; box-sizing:border-box; background:#f5f5f5;'>";
+                			htmlDesc += "<i class='st_ico_kcl' style='position:absolute;left:64px;top:50%;transform:translateY(-50%);z-index:2;background-image: url(/images/pc/ico_kcl.png);width: 32px;height: 50px;display: inline-block;vertical-align: middle;background-repeat: no-repeat;background-size: contain;background-position: 0% 0%;'></i>";
+                			htmlDesc += "<p class='st_tit' style='margin-top:0;color:#222;font-size:16px;font-weight:300;line-height:1;letter-spacing:-0.025em;'>";
+                			htmlDesc += certInfo.getCertTargetNm() +"/"+ certInfo.getCertOrganName();
+                            htmlDesc += "</p>";
+                            htmlDesc += "<p style='margin-top:20px; color:#222; font-size:13px; font-weight: 300; line-height:1; letter-spacing:-0.025em;'>";
+                        	htmlDesc += certInfo.getCertDiv();
+                        	htmlDesc += "</p>";
+                            htmlDesc += "<p class='st_dot_info' style='color: #888888;position:relative;margin-top:20px;font-size:13px;font-weight:300;line-height:1;letter-spacing:-0.025em;'>";
+                            htmlDesc += "<span style='color: #888888 !important;background: #888888 !important;display: inline-block;width: 2px;height: 2px;position: relative;top: -4px;left: 0px;margin-right: 4px;'></span>";
+                            htmlDesc += "해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.";
+                            htmlDesc += "</p>";
+                            htmlDesc += "</div>";
+                            htmlDesc += "</div>";
+                		}else {
+                			htmlDesc += "<div class='st_required_box' style='margin-bottom:80px;'>";
+                			htmlDesc += "<div class='st_area_kcl' style='display:block; position:relative; min-height:160px; margin-top:100px; padding:40px 40px 40px 160px; box-sizing:border-box; background:#f5f5f5;'>";
+                			htmlDesc += "<i class='st_ico_kcl' style='position:absolute;left:64px;top:50%;transform:translateY(-50%);z-index:2;background-image: url(/images/pc/ico_kcl.png);width: 32px;height: 50px;display: inline-block;vertical-align: middle;background-repeat: no-repeat;background-size: contain;background-position: 0% 0%;'></i>";
+                			htmlDesc += "<p class='st_tit' style='margin-top:0;color:#222;font-size:16px;font-weight:300;line-height:1;letter-spacing:-0.025em;'>";
+                			htmlDesc += certInfo.getCertDiv() +"/"+ certInfo.getCertOrganName();
+                            htmlDesc += "</p>";
+                            htmlDesc += "<p style='margin-top:20px; color:#222; font-size:13px; font-weight: 300; line-height:1; letter-spacing:-0.025em;'>";
+                            htmlDesc += "인증번호: "+ certInfo.getCertNum();
+                            htmlDesc += "<a href='http://www.safetykorea.kr/search/searchPop?certNum=XX00000-0000' target='_blank' class='st_linktxt3' style='margin-left:20px; color:#888; font-weight:200; text-decoration:none !important;'>상세보기</a>";
+                            htmlDesc += "</p>";
+                            htmlDesc += "<p class='st_dot_info' style='color: #888888;position:relative;margin-top:20px;font-size:13px;font-weight:300;line-height:1;letter-spacing:-0.025em;'>";
+                            htmlDesc += "<span style='color: #888888 !important;background: #888888 !important;display: inline-block;width: 2px;height: 2px;position: relative;top: -4px;left: 0px;margin-right: 4px;'></span>";
+                            htmlDesc += "해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.";
+                            htmlDesc += "</p>";
+                            htmlDesc += "</div>";
+                            htmlDesc += "</div>";
+                		}
+
+                	}else if( "G083_3".equals(certInfo.getCertTargetGb())) {	// 상세설명별도표기
+                		htmlDesc += "<div class='st_required_box' style='margin-bottom:80px;'>";
+                		htmlDesc += "<div class='st_area_kcl st_no-mark' style='display:block;position:relative;min-height:160px;margin-top:100px;padding:40px 40px 40px 160px;box-sizing:border-box;background:#f5f5f5;padding-left:65px;'>";
+                		htmlDesc += "<p class='st_tit' style='margin-top:0;color:#222;font-size:16px;font-weight:300;line-height:1;letter-spacing:-0.025em;'>";
+                		htmlDesc += certInfo.getCertTargetNm();
+                        htmlDesc += "</p>";
+                        htmlDesc += "<p style='margin-top:20px; color:#222; font-size:13px; font-weight: 300; line-height:1; letter-spacing:-0.025em;'>";
+                        htmlDesc += "제품 상세정보 내 표기되어 있습니다. 상품 정보를 확인해주세요.";
+                        htmlDesc += "</p>";
+                        htmlDesc += "<p class='st_dot_info' style='color: #888888;position:relative;margin-top:20px;font-size:13px;font-weight:300;line-height:1;letter-spacing:-0.025em;'>";
+                        htmlDesc += "<span style='color: #888888 !important;background: #888888 !important;display: inline-block;width: 2px;height: 2px;position: relative;top: -4px;left: 0px;margin-right: 4px;'></span>";
+                        htmlDesc += "해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.";
+                        htmlDesc += "</p>";
+                        htmlDesc += "</div>";
+                        htmlDesc += "</div>";
+                	}else {
+                		// G083_2 - 인증대상아님
+                	}
+                }
+			}
+		}
+		return htmlDesc;
+	}
+
+	/**
+	 * 샵링커 상품등록 - 3. 품목(고시)정보
+	 *
+	 * @param shoplinkerGoods
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	private int createGoodsNotiRegisterXml(ShoplinkerGoods shoplinkerGoods) throws IOException {
+
+		ShoplinkerGoods regMap = new ShoplinkerGoods();
+		regMap.setApiType("NOTI");
+		regMap.setApiSubUrl(env.getProperty("shoplinker.url.good_noti"));
+		regMap.setGoodsCd(shoplinkerGoods.getGoodsCd());
+		regMap.setRegNo(shoplinkerGoods.getRegNo());
+		regMap.setXmlPath(shoplinkerGoods.getXmlPath());
+		regMap.setDomainUrl(shoplinkerGoods.getDomainUrl());
+
+		int succCnt = 0;
+
+		try {
+
+			Collection<ShoplinkerGoods> list = shoplinkerDao.getGoodsNotiList(shoplinkerGoods);
+
+			if(null != list ) {
+				if( 0 < list.size()) {
+
+					// xml 데이터 세팅
+					StringBuilder sbRequest = new StringBuilder();
+					sbRequest.append("<?xml version=\"1.0\" encoding=\"euc-kr\"?>\n");
+					sbRequest.append("<openMarket>\n");
+					sbRequest.append("	<goodsinfo>\n");
+
+					sbRequest.append("		<customer_id>").append(shoplinkerGoods.getCustomerId()).append("</customer_id>\n");
+					sbRequest.append("		<product_id />\n");
+
+					int cnt = 0;
+					for (ShoplinkerGoods map : list) {
+						if( 0 == cnt) {
+							sbRequest.append("		<partner_product_id>").append(map.getPartnerProductId()).append("</partner_product_id>\n");
+							sbRequest.append("		<lclass_id>").append(map.getLclassId()).append("</lclass_id>\n");
+						}
+						cnt ++;
+
+						sbRequest.append("		<item>\n");
+						sbRequest.append("			<item_seq>").append(map.getItemSeq()).append("</item_seq>\n");
+						sbRequest.append("			<item_info><![CDATA[").append(map.getItemInfo()).append("]]></item_info>\n");
+						sbRequest.append("		</item>\n");
+					}
+
+					sbRequest.append("	</goodsinfo>\n");
+					sbRequest.append("</openMarket>\n");
+
+					// api 호출 및 결과 history 저장
+					succCnt = callGoodsRegApi(regMap , sbRequest, "goods");
+				}
+			}
+
+		}catch(Exception e) {
+			log.error("xml 생성오류 ", e);
+			regMap.setApiResult("error");
+			regMap.setApiMessage("xml 생성오류");
+			shoplinkerDao.insertShoplinerApiHst(regMap);
+		}
+		return succCnt;
+	}
+
+	/**
+	 * 샵링커 상품등록 - 4. 인증정보
+	 *
+	 * @param shoplinkerGoods
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	private int createCertRegisterXml(ShoplinkerGoods shoplinkerGoods) throws IOException {
+
+		ShoplinkerGoods regMap = new ShoplinkerGoods();
+		regMap.setApiType("CERT");
+		regMap.setApiSubUrl(env.getProperty("shoplinker.url.cert"));
+		regMap.setGoodsCd(shoplinkerGoods.getGoodsCd());
+		regMap.setRegNo(shoplinkerGoods.getRegNo());
+		regMap.setXmlPath(shoplinkerGoods.getXmlPath());
+		regMap.setDomainUrl(shoplinkerGoods.getDomainUrl());
+
+		int succCnt = 0;
+
+		try {
+
+			ShoplinkerGoods map = shoplinkerDao.getCert(shoplinkerGoods);
+
+			if(null == map ) {
+				map = new ShoplinkerGoods();
+				map.setPartnerProductId(shoplinkerGoods.getGoodsCd());
+				map.setCertNo("");
+				map.setCertOrgan(".");
+			}
+
+			// xml 데이터 세팅
+			StringBuilder sbRequest = new StringBuilder();
+			sbRequest.append("<?xml version=\"1.0\" encoding=\"euc-kr\"?>\n");
+			sbRequest.append("<shoplinker>\n");
+			sbRequest.append("	<product>\n");
+
+			sbRequest.append("		<customer_id>").append(shoplinkerGoods.getCustomerId()).append("</customer_id>\n");
+			sbRequest.append("		<partner_product_id>").append(map.getPartnerProductId()).append("</partner_product_id>\n");
+			sbRequest.append("		<certinfo>\n");
+			sbRequest.append("			<cert>\n");
+
+			//cert_item 의 경우 인증코드 값이 있으면 'C011', 없으면 'C010'
+			if("".equals(map.getCertNo())){
+				sbRequest.append("				<cert_item>").append("C010").append("</cert_item>\n");
+			}else {
+				sbRequest.append("				<cert_item>").append("C011").append("</cert_item>\n");
+			}
+
+			sbRequest.append("				<cert_organ><![CDATA[").append(map.getCertOrgan()).append("]]></cert_organ>\n");
+			sbRequest.append("				<cert_no><![CDATA[").append(map.getCertNo()).append("]]></cert_no>\n");
+			sbRequest.append("			</cert>\n");
+			sbRequest.append("		</certinfo>\n");
+			sbRequest.append("	</product>\n");
+			sbRequest.append("</shoplinker>\n");
+
+			// api 호출 및 결과 history 저장
+			succCnt = callGoodsRegApi(regMap , sbRequest, "cert");
+
+		}catch(Exception e) {
+			log.error("xml 생성오류 ", e);
+			regMap.setApiResult("error");
+			regMap.setApiMessage("xml 생성오류");
+			shoplinkerDao.insertShoplinerApiHst(regMap);
+		}
+
+		return succCnt;
+	}
+
+	/**
+	 * 샵링커 상품등록 - 5. 상품이미지정보
+	 *
+	 * @param shoplinkerGoods
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	private int createImageRegisterXml(ShoplinkerGoods shoplinkerGoods) throws IOException {
+
+		ShoplinkerGoods regMap = new ShoplinkerGoods();
+		regMap.setApiType("IMAGE");
+		regMap.setApiSubUrl(env.getProperty("shoplinker.url.image"));
+		regMap.setGoodsCd(shoplinkerGoods.getGoodsCd());
+		regMap.setRegNo(shoplinkerGoods.getRegNo());
+		regMap.setXmlPath(shoplinkerGoods.getXmlPath());
+		regMap.setDomainUrl(shoplinkerGoods.getDomainUrl());
+
+		int succCnt = 0;
+
+		try {
+
+			// 상품이미지정보
+			shoplinkerGoods.setExtmallImgYn("Y");
+			Collection<ShoplinkerGoods> list = shoplinkerDao.getGoodsImageList(shoplinkerGoods);
+
+			if(null != list) {
+
+				String imgUrl = "";
+				for (ShoplinkerGoods map : list) {
+					imgUrl = map.getSysImgNm();
+					// extmall_yn 이미지를 가져오되, 없는 경우 default 이미지를 가져온다.
+					if( "Y".equals(map.getExtmallImgYn()) && !"".equals(map.getSysImgNm())){
+						break;
+					}
+				}
+
+				// xml 데이터 세팅
+				StringBuilder sbRequest = new StringBuilder();
+				sbRequest.append("<?xml version=\"1.0\" encoding=\"euc-kr\"?>\n");
+				sbRequest.append("<Shoplinker>\n");
+				sbRequest.append("	<product>\n");
+
+				sbRequest.append("		<customer_id>").append(shoplinkerGoods.getCustomerId()).append("</customer_id>\n");
+				sbRequest.append("		<partner_product_id>").append(shoplinkerGoods.getGoodsCd()).append("</partner_product_id>\n");
+				sbRequest.append("		<image_type><![CDATA[").append("URL").append("]]></image_type>\n");
+				sbRequest.append("		<image_info>\n");
+				sbRequest.append("			<image>\n");
+				sbRequest.append("				<image_kind><![CDATA[").append("IMG1").append("]]></image_kind>\n");
+
+				String img_url = env.getProperty("upload.goods.view");
+				if( img_url.toLowerCase().indexOf("http") < 0) {
+					img_url = img_url.replace("//image", "http://image");
+				}
+				sbRequest.append("				<image_content>").append(img_url+"/"+imgUrl).append("</image_content>\n");
+				sbRequest.append("			</image>\n");
+				sbRequest.append("		</image_info>\n");
+
+				sbRequest.append("	</product>\n");
+				sbRequest.append("</Shoplinker>\n");
+
+				// api 호출 및 결과 history 저장
+				succCnt = callGoodsRegApi(regMap , sbRequest, "image");
+			}
+
+		}catch(Exception e) {
+			log.error("xml 생성오류 ", e);
+			regMap.setApiResult("error");
+			regMap.setApiMessage("xml 생성오류");
+			shoplinkerDao.insertShoplinerApiHst(regMap);
+		}
+
+		return succCnt;
+	}
+
+	/**
+	 * 샵링커 상품등록 - 공통 api 호출 & 결과 확인
+	 *
+	 * @param shoplinkerGoods
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	private int callGoodsRegApi(ShoplinkerGoods map, StringBuilder sbRequest, String fileNm) throws IOException {
+
+		int succCnt = 0;
+		com.gagaframework.shoplinker.domain.goods.result.Shoplinker shoplinkerResult;
+		com.gagaframework.shoplinker.domain.goods.result.ResultMessage resultMsg;
+
+		try {
+			GagaShoplinkertUtil shoplinkerUtil = new GagaShoplinkertUtil("MS949");
+
+			// XML 파일 생성
+			StringBuilder xmlFileName = new StringBuilder();
+			xmlFileName.append(fileNm+"_"+fileAddNm).append(".xml");
+			String xmlPath = GagaFileUtil.getConcatenationPath(map.getXmlPath(), xmlFileName.toString());
+			shoplinkerUtil.makeRequestXmlFile(sbRequest.toString(), xmlPath);
+			String xmlUrl = GagaFileUtil.getConcatenationPath(map.getDomainUrl(), xmlFileName.toString());
+
+			// API 호출 URL
+			String apiUrl = GagaShoplinkerConstants.API_DOMAIN + map.getApiSubUrl() + URLEncoder.encode(xmlUrl);
+
+			// API 호출결과
+			String responseXmlData = shoplinkerUtil.callShoplinkerApiByGet(apiUrl, "");
+
+			// response 결과
+			shoplinkerResult = (com.gagaframework.shoplinker.domain.goods.result.Shoplinker)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.goods.result.Shoplinker.class, responseXmlData);
+			resultMsg = shoplinkerResult.getResultMessage();
+
+			String slFolder = GagaFileUtil.getConcatenationPath(env.getProperty("shoplinker.xml.path"));
+			File slPath = new File(slFolder);
+
+			map.setXmlTxt(slPath.exists()+"\n"+xmlPath+"\n"+xmlUrl+"\n\n"+sbRequest.toString());
+			map.setApiProductId(resultMsg.getProductId());
+			map.setApiResult(resultMsg.getResult());
+			map.setApiMessage(resultMsg.getMessage());
+
+			if( "true".equals(resultMsg.getResult())){
+				succCnt = 1;
+
+				// 재고 단품 생성
+				if( "OPTION".equals(map.getApiType())) {
+					shoplinkerDao.insertStockOption(map);
+				}
+			}
+
+			// 생성 파일삭제
+			// GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(map.getXmlPath(), xmlFileName.toString()));
+
+		} catch (Exception e) {
+			log.error("error", e);
+			// 임시
+			StringBuilder xmlFileName = new StringBuilder();
+			xmlFileName.append(fileNm+"_"+fileAddNm).append(".xml");
+			String xmlPath = GagaFileUtil.getConcatenationPath(map.getXmlPath(), xmlFileName.toString());
+			String xmlUrl = GagaFileUtil.getConcatenationPath(map.getDomainUrl(), xmlFileName.toString());
+			String slFolder = GagaFileUtil.getConcatenationPath(env.getProperty("shoplinker.xml.path"));
+			File slPath = new File(slFolder);
+			map.setXmlTxt(slPath.exists()+"\n"+xmlPath+"\n"+xmlUrl+"\n\n"+sbRequest.toString());
+			//map.setXmlTxt(sbRequest.toString());
+			map.setApiResult("error");
+			map.setApiMessage("API 통신오류");
+		}
+
+		// 전송이력 저장
+		shoplinkerDao.insertShoplinerApiHst(map);
+
+		return succCnt;
+	}
+
+	/**
+	 * 상품등록-상품 목록 건수
+	 *
+	 * @param getGoodsSendListCount
+	 * @return
+	 * @author jmh
+	 * @since 2020. 5. 21
+	 */
+	public int getGoodsSendListCount(ShoplinkerSearch shoplinkerSearch) {
+		return shoplinkerDao.getGoodsSendListCount(shoplinkerSearch);
+	}
+
+	/**
+	 * 상품등록-상품 목록
+	 *
+	 * @param getGoodsSendList
+	 * @return
+	 * @author jmh
+	 * @since 2020. 5. 21
+	 */
+	public Collection<ShoplinkerGoods> getGoodsSendList(ShoplinkerSearch shoplinkerSearch) {
+		return shoplinkerDao.getGoodsSendList(shoplinkerSearch);
+	}
+
+	/**
+	 * 샵링커주문수집-목록 건수
+	 *
+	 * @param getGoodsSendListCount
+	 * @return
+	 * @author jmh
+	 * @since 2020. 5. 21
+	 */
+	public int getShoplinkerOrderListCount(ShoplinkerOrder shoplinkerOrder) {
+		return shoplinkerDao.getShoplinkerOrderListCount(shoplinkerOrder);
+	}
+
+	/**
+	 * 샵링커주문수집-목록
+	 *
+	 * @param getGoodsSendList
+	 * @return
+	 * @author jmh
+	 * @since 2020. 5. 21
+	 */
+	public Collection<ShoplinkerOrder> getShoplinkerOrderList(ShoplinkerOrder shoplinkerOrder) {
+		return shoplinkerDao.getShoplinkerOrderList(shoplinkerOrder);
+	}
+
+	/**
+	 * 샵링커주문수집-상세
+	 *
+	 * @param
+	 * @return
+	 * @author jmh
+	 * @since 2020. 5. 28
+	 */
+	public ShoplinkerOrder getShoplinkerOrderInfo(ShoplinkerOrder shoplinkerOrder) {
+		return shoplinkerDao.getShoplinkerOrderInfo(shoplinkerOrder);
+	}
+
+	/**
+	 * 샵링커주문수집-주문수집등록 페이지별 호출
+	 *
+	 * @param shoplinkerGoods
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	public GagaMap insertShoplinkerOrderStep1(ShoplinkerOrder shoplinkerOrder) throws IOException {
+		ShoplinkerSearch slkSearch = new ShoplinkerSearch();
+		slkSearch.setSid(shoplinkerOrder.getSid());
+		slkSearch.setRunStat("RUN");
+
+		// 파일명 뒤에 붙일 시간
+		fileAddNm = GagaDateUtil.getTodayDateTime();
+
+		int totalPage = 0;
+		int totalCount = 0;
+		int currentlyPage = 1;
+		int currListCount = 0;
+
+		// 1. 첫번째 호출
+		shoplinkerOrder.setOrderPageNo(currentlyPage);
+		GagaMap map = this.insertShoplinkerOrderStep1Xml(shoplinkerOrder);
+		totalPage = map.getInt("totalPage");
+		totalCount = map.getInt("totalCount");
+		currentlyPage = map.getInt("currentlyPage");
+		currListCount = map.getInt("currListCount");
+
+		slkSearch.setTxt(shoplinkerOrder.getApiStDate()+ " 총페이지: "+totalPage+ "("+totalCount+"건) || "+currentlyPage);
+		updateCallApiRunable(slkSearch);
+
+		if( currentlyPage < 1 ) currentlyPage = 1;
+		currentlyPage ++;	// 두번째 호출 페이지 수
+
+		// 2. 페이지번호가 존재할 경우, n번째까지 호출(주문수집)
+		//totalPage = 2;
+		for( int i=currentlyPage; i<= totalPage; i++) {
+
+			slkSearch.setTxt("=>"+i);
+			updateCallApiRunable(slkSearch);
+
+			shoplinkerOrder.setOrderPageNo(i);
+			map = this.insertShoplinkerOrderStep1Xml(shoplinkerOrder);
+			currListCount += map.getInt("currListCount");
+		}
+
+		map.setInt("currListCount", currListCount);
+
+		return map;
+	}
+
+	/**
+	 * 샵링커주문수집-주문수집등록
+	 *
+	 * @param shoplinkerGoods
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	public GagaMap insertShoplinkerOrderStep1Xml(ShoplinkerOrder shoplinkerOrder) throws IOException {
+
+		GagaMap returnMap = new GagaMap();
+		ShoplinkerGoods regMap = new ShoplinkerGoods();
+		regMap.setApiSubUrl(env.getProperty("shoplinker.url.order"));
+		regMap.setDomainUrl(shoplinkerOrder.getDomainUrl());
+
+		int totalPage = 0;
+		int currentlyPage = 0;	// 샵링커 header 현재 호출된 페이지번호
+		int totalCount = 0;		// 샵링커 header 총 주문건수
+		int currListCount = 0;  // for문안 목록 건수 건건이
+		try {
+
+			// xml 데이터 세팅
+			String responseXmlData;
+			com.gagaframework.shoplinker.domain.orderlist.Shoplinker shoplinkerResult;
+
+			List<Order> rOrdList;
+			com.gagaframework.shoplinker.domain.orderlist.Header rHeader;
+			StringBuilder sbRequest;
+
+			sbRequest = new StringBuilder();
+			sbRequest.append("<?xml version=\"1.0\" encoding=\"euc-kr\"?>\n");
+			sbRequest.append("<Shoplinker>\n");
+			sbRequest.append("	<OrderInfo>\n");
+			sbRequest.append("		<Order>\n");
+
+			/*
+			sbRequest.append("			<customer_id>").append(shoplinkerOrder.getCustomerId()).append("</customer_id>\n");
+			sbRequest.append("			<shoplinker_id><![CDATA[").append(shoplinkerOrder.getShoplinkerId()).append("]]></shoplinker_id>\n");
+			*/
+			sbRequest.append("			<customer_id>").append("a0021915").append("</customer_id>\n");
+			sbRequest.append("			<shoplinker_id><![CDATA[").append("yes2424").append("]]></shoplinker_id>\n");
+			sbRequest.append("			<order_flag>004</order_flag>\n");// 테스트용
+			sbRequest.append("			<st_date>").append(shoplinkerOrder.getApiStDate().replace("-", "")).append("</st_date>\n");
+			sbRequest.append("			<ed_date>").append(shoplinkerOrder.getApiStDate().replace("-", "")).append("</ed_date>\n");
+			sbRequest.append("			<page_no>").append(shoplinkerOrder.getOrderPageNo()).append("</page_no>\n");
+
+			sbRequest.append("		</Order>\n");
+			sbRequest.append("	</OrderInfo>\n");
+			sbRequest.append("</Shoplinker>\n");
+			log.info("\n\n###################"+ sbRequest.toString());
+
+
+			GagaShoplinkertUtil shoplinkerUtil = new GagaShoplinkertUtil("MS949");
+
+			// XML 파일 생성
+			StringBuilder xmlFileName = new StringBuilder();
+			xmlFileName.append("order"+"_"+fileAddNm).append(".xml");
+			String xmlPath = GagaFileUtil.getConcatenationPath(shoplinkerOrder.getXmlPath(), xmlFileName.toString());
+			shoplinkerUtil.makeRequestXmlFile(sbRequest.toString(), xmlPath);
+			String xmlUrl = GagaFileUtil.getConcatenationPath(shoplinkerOrder.getDomainUrl(), xmlFileName.toString());
+
+			if (!"locd".equals(shoplinkerOrder.getProfiles())) { // 로컬이 아닐때
+				try {
+					// API 호출
+					responseXmlData = shoplinkerUtil.callShoplinkerApiByGet(GagaShoplinkerConstants.API_DOMAIN+regMap.getApiSubUrl()+URLEncoder.encode(xmlUrl), "");
+
+					// response 결과
+					shoplinkerResult = (com.gagaframework.shoplinker.domain.orderlist.Shoplinker)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.orderlist.Shoplinker.class, responseXmlData);
+					rHeader = shoplinkerResult.getHeader();
+					rOrdList = shoplinkerResult.getOrder();
+
+					// 수집정보 존재
+					if( null != rHeader ) {
+						totalCount = rHeader.getTotalCount();
+						totalPage = rHeader.getTotalPage();
+						currentlyPage = rHeader.getCurrentlyPage();
+						ShoplinkerOrder slOrder;
+
+						for(Order ord : rOrdList) {
+							slOrder = mapper.convertValue(ord, ShoplinkerOrder.class);
+							//slOrder.setOrderIfIdx(commonService.getNextSequence("SEQ_SHHOPLINKER_ORD"));
+							slOrder.setOrderIfIdx(shoplinkerDao.getNextOrderIfIdx());
+
+							currListCount ++;
+
+							//1. 샵링커 주문등록
+							try {
+								//*****  테스트 기간동안은 연락처 모두 가공   ************************//
+								slOrder.setOrderTel("011-0000-0000");
+								slOrder.setOrderCel("011-0000-0000");
+								slOrder.setReceiveTel("011-0000-0000");
+								slOrder.setReceiveCel("011-0000-0000");
+								//*****  테스트 기간동안은 연락처 모두 가공   ************************//
+
+								shoplinkerDao.insertShoplinkerOrder(slOrder);
+							}catch(Exception e) {
+								ShoplinkerGoods map = new ShoplinkerGoods();
+								String chkParams = "";
+								chkParams += "SHOPLINKER_ORDER_ID="+ord.getShoplinkerOrderId() +",MALL_ORDER_ID="+ord.getMallOrderId()
+										  + ",ORDER_NAME="+ord.getOrderName() + ",ORDER_TEL="+ord.getOrderTel() + ",ORDER_CEL="+ord.getOrderCel()
+										  + ",RECEIVE="+ord.getReceive() + ",RECEIVE_TEL="+ord.getReceiveTel() + ",RECEIVE_CEL="+ord.getReceiveCel()
+										  + ",RECEIVE_ADDR="+ord.getReceiveAddr() + ",DELIVERY_MSG="+ord.getDeliveryMsg() + ",PRODUCT_NAME="+ord.getProductName()
+										  + ",SKU="+ord.getSku() + ",SUPPLY_ID="+ord.getSupplyId() + ",DELIVERY="+ord.getDelivery() + ",ORDER_USER_ID="+ord.getOrderUserId()
+										  + ",SCRSPIK_USE="+ord.getCrspikUse() + ",DEAL_NO="+ord.getDealNo() + ",ORDER_MAIN_KEY="+ord.getOrderMainKey()
+										  + ",PAN_TYPE="+ord.getPanType() + ",SCHANNEL_TYPE="+ord.getChannelType() + ",SHIP_NO="+ord.getShipNo();
+								map.setApiType("ORDER");
+								map.setXmlTxt(chkParams);
+								map.setApiResult("error");
+								map.setApiMessage("샵링커 주문생성 오류");
+
+								// 오류이력 저장
+								shoplinkerDao.insertShoplinerApiHst(map);
+							}
+						}
+
+						log.debug("Shoplinker API Call: success");
+						log.debug("responseXmlData {}", responseXmlData);
+					}else {
+						// 수집정보 존재안함.
+						com.gagaframework.shoplinker.domain.goods.result.Shoplinker orderFailResult;
+						com.gagaframework.shoplinker.domain.goods.result.ResultMessage orderFailResultMsg;
+						orderFailResult =  (com.gagaframework.shoplinker.domain.goods.result.Shoplinker)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.goods.result.Shoplinker.class, responseXmlData);
+						orderFailResultMsg = orderFailResult.getResultMessage();
+
+						ShoplinkerGoods map = new ShoplinkerGoods();
+						map.setApiType("ORDER");
+						map.setXmlTxt(responseXmlData);
+						map.setApiResult(orderFailResultMsg.getResult());
+						map.setApiMessage(shoplinkerOrder.getApiStDate() + " => "+orderFailResultMsg.getMessage());
+						shoplinkerDao.insertShoplinerApiHst(map);
+					}
+
+				} catch (Exception e) {
+					log.error("error", e);
+					ShoplinkerGoods map = new ShoplinkerGoods();
+					map.setApiType("ORDER");
+					map.setXmlTxt(sbRequest.toString());
+					map.setApiResult("error");
+					map.setApiMessage("API 통신오류 =>"+StringUtils.abbreviate(e.getMessage(), 0 , 120));
+					shoplinkerDao.insertShoplinerApiHst(map);
+				}
+
+			}else {
+				// 테스트용
+				xmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/order/0409/order_real_"+shoplinkerOrder.getOrderPageNo()+".xml";
+				xmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/order/order_time.xml";
+
+				try {
+					// API 호출
+					responseXmlData = testOrderStr(); // shoplinkerUtil.callShoplinkerApiByGet(GagaShoplinkerConstants.API_DOMAIN+regMap.getApiSubUrl()+URLEncoder.encode(xmlUrl), "");
+									// shoplinkerUtil.callShoplinkerApiByGet(GagaShoplinkerConstants.API_DOMAIN+regMap.getApiSubUrl()+URLEncoder.encode(xmlUrl), "");
+									//testOrderStr();
+
+					// response 결과
+					shoplinkerResult = (com.gagaframework.shoplinker.domain.orderlist.Shoplinker)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.orderlist.Shoplinker.class, responseXmlData);
+					rHeader = shoplinkerResult.getHeader();
+					rOrdList = shoplinkerResult.getOrder();
+
+					// 수집정보 존재
+					if( null != rHeader ) {
+						totalCount = rHeader.getTotalCount();
+						totalPage = rHeader.getTotalPage();
+						currentlyPage = rHeader.getCurrentlyPage();
+						ShoplinkerOrder slOrder;
+
+						for(Order ord : rOrdList) {
+							slOrder = mapper.convertValue(ord, ShoplinkerOrder.class);
+							//slOrder.setOrderIfIdx(commonService.getNextSequence("SEQ_SHHOPLINKER_ORD"));
+							slOrder.setOrderIfIdx(shoplinkerDao.getNextOrderIfIdx());
+							currListCount ++;
+
+							//1. 샵링커 주문등록
+							try {
+								//*****  테스트 기간동안은 연락처 모두 가공   ************************//
+								slOrder.setOrderTel("011-0000-0000");
+								slOrder.setOrderCel("011-0000-0000");
+								slOrder.setReceiveTel("011-0000-0000");
+								slOrder.setReceiveCel("011-0000-0000");
+								//*****  테스트 기간동안은 연락처 모두 가공   ************************//
+
+								shoplinkerDao.insertShoplinkerOrder(slOrder);
+							}catch(Exception e) {
+								ShoplinkerGoods map = new ShoplinkerGoods();
+								String chkParams = "";
+								chkParams += "SHOPLINKER_ORDER_ID="+ord.getShoplinkerOrderId() +",MALL_ORDER_ID="+ord.getMallOrderId()
+										  + ",ORDER_NAME="+ord.getOrderName() + ",ORDER_TEL="+ord.getOrderTel() + ",ORDER_CEL="+ord.getOrderCel()
+										  + ",RECEIVE="+ord.getReceive() + ",RECEIVE_TEL="+ord.getReceiveTel() + ",RECEIVE_CEL="+ord.getReceiveCel()
+										  + ",RECEIVE_ADDR="+ord.getReceiveAddr() + ",DELIVERY_MSG="+ord.getDeliveryMsg() + ",PRODUCT_NAME="+ord.getProductName()
+										  + ",SKU="+ord.getSku() + ",SUPPLY_ID="+ord.getSupplyId() + ",DELIVERY="+ord.getDelivery() + ",ORDER_USER_ID="+ord.getOrderUserId()
+										  + ",SCRSPIK_USE="+ord.getCrspikUse() + ",DEAL_NO="+ord.getDealNo() + ",ORDER_MAIN_KEY="+ord.getOrderMainKey()
+										  + ",PAN_TYPE="+ord.getPanType() + ",SCHANNEL_TYPE="+ord.getChannelType() + ",SHIP_NO="+ord.getShipNo();
+								map.setApiType("ORDER");
+								map.setXmlTxt(chkParams);
+								map.setApiResult("error");
+								map.setApiMessage("샵링커 주문생성 오류");
+
+								// 오류이력 저장
+								shoplinkerDao.insertShoplinerApiHst(map);
+							}
+						}
+
+						log.debug("Shoplinker API Call: success");
+						log.debug("responseXmlData {}", responseXmlData);
+					}else {
+						// 수집정보 존재안함.
+						com.gagaframework.shoplinker.domain.goods.result.Shoplinker orderFailResult;
+						com.gagaframework.shoplinker.domain.goods.result.ResultMessage orderFailResultMsg;
+						orderFailResult =  (com.gagaframework.shoplinker.domain.goods.result.Shoplinker)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.goods.result.Shoplinker.class, responseXmlData);
+						orderFailResultMsg = orderFailResult.getResultMessage();
+
+						ShoplinkerGoods map = new ShoplinkerGoods();
+						map.setApiType("ORDER");
+						map.setXmlTxt(responseXmlData);
+						map.setApiResult(orderFailResultMsg.getResult());
+						map.setApiMessage(shoplinkerOrder.getApiStDate() + " => "+orderFailResultMsg.getMessage());
+						shoplinkerDao.insertShoplinerApiHst(map);
+					}
+
+				} catch (Exception e) {
+					log.error("error", e);
+					ShoplinkerGoods map = new ShoplinkerGoods();
+					map.setApiType("ORDER");
+					map.setXmlTxt(sbRequest.toString());
+					map.setApiResult("error");
+					map.setApiMessage("API 통신오류 =>"+StringUtils.abbreviate(e.getMessage(), 0 , 120));
+					shoplinkerDao.insertShoplinerApiHst(map);
+				}
+			}
+
+			returnMap.setString("RESULT_TYPE", "TRUE");
+
+			// 생성 파일삭제
+			GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(shoplinkerOrder.getXmlPath(), xmlFileName.toString()));
+
+		}catch(Exception e) {
+			log.error("xml 생성오류 ", e);
+			returnMap.setString("RESULT_TYPE", "error");
+			returnMap.setString("RESULT_MSG", "xml 생성오류");
+		}
+
+		returnMap.setInt("currListCount", currListCount);
+		returnMap.setInt("totalCount", totalCount);	// 총 주문건수
+		returnMap.setInt("totalPage", totalPage);
+		returnMap.setInt("currentlyPage", currentlyPage);
+
+		return returnMap;
+	}
+
+	/**
+	 * 샵링커주문수집-제휴몰 주문등록
+	 *
+	 * @param shoplinkerOrder
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	public void insertShoplinkerOrderStep2(ShoplinkerOrder shoplinkerOrder) throws IOException {
+
+		// 1. 외부몰 미등록 목록 가져옴
+		Collection<ShoplinkerOrder> slkOrdList = shoplinkerDao.getShoplinkerRegExtmallList();
+
+		ExtmallOrder extmallOrder;
+		GagaMap addrMap; 	//주소 분리
+		GagaMap checkMap;
+		for(ShoplinkerOrder slOrder : slkOrdList) {
+
+			extmallOrder = new ExtmallOrder();
+			extmallOrder.setVendorId(TscConstants.VendorId.SHOPLINKER.value());			// 샵링커
+			extmallOrder.setUploadStat(TscConstants.ExtmallUploadStat.WAIT.value()); 	// 대기
+			extmallOrder.setUploadGb("S");												// 업로드구분(샵링커:S, 엑셀:E)
+			extmallOrder.setRegNo(shoplinkerOrder.getRegNo());
+			extmallOrder.setBasicParams(slOrder);										// 기본세팅파람
+
+			try {
+
+				extmallOrder.setDetailParams(slOrder);									// 상세파람
+
+				if( null != slOrder.getDisPriceCoupon() && !slOrder.getDisPriceCoupon().isEmpty()) {
+					extmallOrder.setCpnDcAmt(Integer.parseInt(slOrder.getDisPriceCoupon()));
+				}else {
+					extmallOrder.setCpnDcAmt(0);
+				}
+
+				if( null != slOrder.getDisPricePoint() && !slOrder.getDisPricePoint().isEmpty()) {
+					extmallOrder.setPntDcAmt(Integer.parseInt(slOrder.getDisPricePoint()));
+				}else {
+					extmallOrder.setPntDcAmt(0);
+				}
+
+				// validation 체크
+				checkMap = getRegOrderValidation(slOrder);
+				if( "FAIL".equals(checkMap.getString("RESULT_MSG"))) {
+					extmallOrder.setUploadStat(checkMap.getString("UploadStat"));	//실패
+					extmallOrder.setUploadFailCd(checkMap.getString("UploadFailCd"));
+					extmallOrder.setUploadFailReason(checkMap.getString("UploadFailReason")); // 실패사유
+
+				}else {
+					// 주소분리
+					addrMap = this.returnChangeAddr(slOrder.getReceiveAddr());
+					extmallOrder.setRecipBaseAddr(addrMap.getString("addrBase"));
+					extmallOrder.setRecipDtlAddr(addrMap.getString("addrDtl"));
+				}
+
+				orderOcmDao.insertExtmallOrder(extmallOrder);
+
+			}catch(Exception e) {
+				log.error("TsaShoplinkerService.insertShoplinkerOrderStep2 Error : "+e);
+				extmallOrder.setUploadStat(TscConstants.ExtmallUploadStat.FAIL.value());	//실패
+				extmallOrder.setUploadFailCd(TscConstants.ExtmallUploadFailStat.ETC.value());
+				extmallOrder.setUploadFailReason("제휴몰 등록오류 :: "+StringUtils.abbreviate(e.getMessage(), 0 , 120)); // 실패사유
+				orderOcmDao.insertExtmallOrder(extmallOrder);
+			}
+
+			// 제휴몰등록여부 업데이트
+			shoplinkerDao.updateShoplinkerOrder(slOrder);
+		}
+	}
+
+	/**
+	 * 샵링커주문수집-제휴몰 대기상태건들 실패로 업데이트(오류로인해 성공/실패 처리가 안된건이 있을경우 대비용)
+	 *
+	 * @param
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	public void updateShoplinkerExtmallWaitList() throws IOException {
+		shoplinkerDao.updateShoplinkerExtmallWaitList();
+	}
+
+	/**
+	 * 샵링커주문수집-validation 체크
+	 *
+	 * @param shoplinkerOrder
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	public GagaMap getRegOrderValidation(ShoplinkerOrder slOrder) {
+
+		GagaMap rMap = new GagaMap();
+		rMap.setString("RESULT_MSG", "FAIL");
+		rMap.setString("UploadStat", TscConstants.ExtmallUploadStat.FAIL.value());
+
+		// 테스트기간은 송장완료된 목록으로 가져옴
+		/*if( !"000".equals(slOrder.getOrderFlag()) && !"007".equals(slOrder.getOrderFlag()) ) {
+		    rMap.setString("UploadFailCd", TsaConstants.ExtmallUploadFailStat.ETC.value());
+			rMap.setString("UploadFailReason", "주문타입 실패. 주문타입:"+slOrder.getOrderFlag()+"(정산확정:002/송장등록:003/송장전송완료:004)");
+			return rMap;
+		}*/
+
+		if( null == slOrder.getReceiveAddr() || slOrder.getReceiveAddr().isEmpty()) {
+			rMap.setString("UploadFailCd", TscConstants.ExtmallUploadFailStat.ETC.value());
+			rMap.setString("UploadFailReason", "주소정보 없음.");
+			return rMap;
+		}
+
+		rMap.setString("RESULT_MSG", "SUCCESS");
+
+		return rMap;
+	}
+
+	/**
+	 * 제휴몰 주문수집 상세
+	 *
+	 * @param
+	 * @return
+	 * @author jmh
+	 * @since 2020. 5. 28
+	 */
+	public ExtmallOrder getExtmallOrderInfo(String extmallOrder) {
+		return shoplinkerDao.getExtmallOrderInfo(extmallOrder);
+	}
+
+
+	/**
+	 * 송장전송-전송예정목록
+	 *
+	 * @param shoplinkerGoods
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	public Collection<ShoplinkerInvoice> getShoplinkerInvoiceOrdDtlList() {
+		return shoplinkerDao.getShoplinkerInvoiceOrdDtlList();
+	}
+
+	/**
+	 * 송장전송-전송
+	 *
+	 * @param shoplinkerGoods
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	public void createShoplinkerInvoiceXml(ShoplinkerInvoice shoplinkerInvoice, Collection<ShoplinkerInvoice> sendList) throws IOException {
+		// 파일명 뒤에 붙일 시간
+		fileAddNm = GagaDateUtil.getTodayDateTime();
+
+		ShoplinkerGoods apiHstMap = new ShoplinkerGoods();
+
+		ShoplinkerGoods regMap = new ShoplinkerGoods();
+		regMap.setApiType("INVOICE");
+		regMap.setApiSubUrl(env.getProperty("shoplinker.url.invoice"));
+		regMap.setRegNo(0);
+		regMap.setXmlPath(shoplinkerInvoice.getXmlPath());
+		regMap.setDomainUrl(shoplinkerInvoice.getDomainUrl());
+
+		StringBuilder sbRequest;
+		com.gagaframework.shoplinker.domain.invoice.ResultMessage resultMsg;
+
+		if( null != sendList && !sendList.isEmpty()) {
+			for(ShoplinkerInvoice info : sendList) {
+				apiHstMap = new ShoplinkerGoods();
+
+				// xml 데이터 세팅
+				sbRequest = new StringBuilder();
+				sbRequest.append("<?xml version=\"1.0\" encoding=\"euc-kr\"?>\n");
+				sbRequest.append("<Shoplinker>\n");
+				sbRequest.append("	<Delivery>\n");
+
+				sbRequest.append("		<customer_id>").append(shoplinkerInvoice.getCustomerId()).append("</customer_id>\n");
+				sbRequest.append("		<order_id>").append(info.getAgentOrderId()).append("</order_id>\n");
+				sbRequest.append("		<delivery_name><![CDATA[").append(info.getDeliveryName()).append("]]></delivery_name>\n");
+				sbRequest.append("		<delivery_invoice><![CDATA[").append(info.getDeliveryInvoice()).append("]]></delivery_invoice>\n");
+
+				sbRequest.append("	</Delivery>\n");
+				sbRequest.append("</Shoplinker>\n");
+
+				// api 호출 및 결과 history 저장
+				try {
+
+					GagaShoplinkertUtil shoplinkerUtil = new GagaShoplinkertUtil("MS949");
+
+					// XML 파일 생성
+					StringBuilder xmlFileName = new StringBuilder();
+					xmlFileName.append("invoice_"+info.getOrdDtlNo()+"_"+fileAddNm).append(".xml");
+					String xmlPath = GagaFileUtil.getConcatenationPath(shoplinkerInvoice.getXmlPath(), xmlFileName.toString());
+					shoplinkerUtil.makeRequestXmlFile(sbRequest.toString(), xmlPath);
+					String xmlUrl = GagaFileUtil.getConcatenationPath(shoplinkerInvoice.getDomainUrl(), xmlFileName.toString());
+
+					// API 호출
+					String apiUrl = GagaShoplinkerConstants.API_DOMAIN + regMap.getApiSubUrl() + URLEncoder.encode(xmlUrl);
+					String responseXmlData = shoplinkerUtil.callShoplinkerApiByGet(apiUrl, "");
+
+					log.info(shoplinkerInvoice.getApiType()+" ####xmlUrl "+xmlUrl);
+					log.info(shoplinkerInvoice.getApiType()+" ####apiUrl "+apiUrl);
+
+					// response 결과
+					resultMsg = (com.gagaframework.shoplinker.domain.invoice.ResultMessage)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.invoice.ResultMessage.class, responseXmlData);
+
+					apiHstMap.setApiType("INVOICE");
+					apiHstMap.setXmlTxt(sbRequest.toString());
+					apiHstMap.setOrdDtlNo(info.getOrdDtlNo());
+					apiHstMap.setApiResult(resultMsg.getResult());
+					apiHstMap.setApiMessage(resultMsg.getMessage());
+
+					// 생성 파일삭제
+					// GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(shoplinkerInvoice.getXmlPath(), xmlFileName.toString()));
+
+				} catch (Exception e) {
+					log.error("error", e);
+					apiHstMap.setApiType("INVOICE");
+					apiHstMap.setXmlTxt(sbRequest.toString());
+					apiHstMap.setOrdDtlNo(info.getOrdDtlNo());
+					apiHstMap.setApiResult("error");
+					apiHstMap.setApiMessage("API 통신오류");
+				}
+
+				// 전송이력 저장
+				shoplinkerDao.insertShoplinerApiHst(apiHstMap);
+			}
+		}
+	}
+
+	/**
+	 * 송장전송-전송 (엑셀용)
+	 *
+	 * @param shoplinkerGoods
+	 * @return
+	 * @author jmh
+	 * @since 2021. 5. 20
+	 */
+	/*********************************************************************************************
+	public void createShoplinkerInvoiceXml(Collection<GagaMap> ecxelGoodsList, ShoplinkerInvoice shoplinkerInvoice) throws IOException {
+		// 파일명 뒤에 붙일 시간
+		Calendar cal = Calendar.getInstance();
+		SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss");
+		fileAddNm = sdf.format(cal.getTime());
+
+		ShoplinkerGoods apiHstMap = new ShoplinkerGoods();
+
+		GagaMap returnMap = new GagaMap();
+		ShoplinkerGoods regMap = new ShoplinkerGoods();
+		regMap.setApiType("INVOICE");
+		regMap.setApiSubUrl(env.getProperty("shoplinker.url.invoice"));
+		regMap.setRegNo(shoplinkerInvoice.getRegNo());
+		regMap.setXmlPath(shoplinkerInvoice.getXmlPath());
+		regMap.setDomainUrl(shoplinkerInvoice.getDomainUrl());
+
+		StringBuilder sbRequest;
+		com.gagaframework.shoplinker.domain.invoice.ResultMessage resultMsg_tmp;
+
+		for (GagaMap gagaMap : ecxelGoodsList) {
+			if( !"".equals(gagaMap.getString("ordNo").trim())) {
+				shoplinkerInvoice.setOrdNo(gagaMap.getInt("ordNo"));
+
+				Collection<ShoplinkerInvoice> list = shoplinkerDao.getShoplinkerInvoiceOrdDtlList(shoplinkerInvoice);
+				for(ShoplinkerInvoice info : list) {
+					apiHstMap = new ShoplinkerGoods();
+
+					// xml 데이터 세팅
+					sbRequest = new StringBuilder();
+					sbRequest.append("<?xml version=\"1.0\" encoding=\"euc-kr\"?>\n");
+					sbRequest.append("<Shoplinker>\n");
+					sbRequest.append("	<Delivery>\n");
+
+					sbRequest.append("		<customer_id>").append(shoplinkerInvoice.getCustomerId()).append("</customer_id>\n");
+					sbRequest.append("		<order_id>").append(info.getAgentOrderId()).append("</order_id>\n");
+					sbRequest.append("		<delivery_name><![CDATA[").append(info.getDeliveryName()).append("]]></delivery_name>\n");
+					sbRequest.append("		<delivery_invoice><![CDATA[").append(info.getDeliveryInvoice()).append("]]></delivery_invoice>\n");
+
+					sbRequest.append("	</Delivery>\n");
+					sbRequest.append("</Shoplinker>\n");
+
+					// api 호출 및 결과 history 저장
+					try {
+
+						GagaShoplinkertUtil shoplinkerUtil = new GagaShoplinkertUtil("MS949");
+
+						// XML 파일 생성
+						StringBuilder xmlFileName = new StringBuilder();
+						xmlFileName.append("invoice_"+info.getOrdDtlNo()+"_"+fileAddNm).append(".xml");
+						String xmlPath = GagaFileUtil.getConcatenationPath(shoplinkerInvoice.getXmlPath(), xmlFileName.toString());
+						shoplinkerUtil.makeRequestXmlFile(sbRequest.toString(), xmlPath);
+						String xmlUrl = GagaFileUtil.getConcatenationPath(shoplinkerInvoice.getDomainUrl(), xmlFileName.toString());
+
+						// API 호출
+						xmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/invoice.xml";
+						String apiUrl = GagaShoplinkerConstants.API_DOMAIN + regMap.getApiSubUrl() + URLEncoder.encode(xmlUrl);
+						String responseXmlData = shoplinkerUtil.callShoplinkerApiByGet(apiUrl, "");
+
+						log.info(shoplinkerInvoice.getApiType()+" ####xmlUrl "+xmlUrl);
+						log.info(shoplinkerInvoice.getApiType()+" ####apiUrl "+apiUrl);
+
+						// response 결과
+						com.style24.admin.support.util.ResultMessage22 resultMsg;
+						resultMsg = (com.style24.admin.support.util.ResultMessage22)shoplinkerUtil.unmarshal(com.style24.admin.support.util.ResultMessage22.class, responseXmlData);
+						System.out.println(" ##### invoice2 : "+resultMsg);
+						System.out.println(" ##### invoice3 : "+resultMsg.getResult());
+						System.out.println(" ##### invoice4 : "+resultMsg.getMessage());
+						System.out.println(" ##### invoice5 : "+resultMsg.getId());
+
+						//resultMsg = (com.gagaframework.shoplinker.domain.invoice.ResultMessage)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.invoice.ResultMessage.class, responseXmlData);
+						apiHstMap.setApiType("INVOICE");
+						apiHstMap.setXmlTxt(sbRequest.toString());
+						apiHstMap.setOrdDtlNo(info.getOrdDtlNo());
+						apiHstMap.setApiResult(resultMsg.getResult());
+						apiHstMap.setApiMessage(resultMsg.getMessage());
+
+						// 생성 파일삭제
+						GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(shoplinkerInvoice.getXmlPath(), xmlFileName.toString()));
+
+					} catch (Exception e) {
+						log.error("error", e);
+						apiHstMap.setApiType("INVOICE");
+						apiHstMap.setXmlTxt(sbRequest.toString());
+						apiHstMap.setOrdDtlNo(info.getOrdDtlNo());
+						apiHstMap.setApiResult("error");
+						apiHstMap.setApiMessage("API 통신오류");
+					}
+
+					// 전송이력 저장
+					shoplinkerDao.insertShoplinerApiHst(apiHstMap);
+				}
+			}
+		}
+	}
+	*******************************************************************************************/
+
+	/**
+	 * 송장전송-목록 건수
+	 *
+	 * @param getGoodsSendListCount
+	 * @return
+	 * @author jmh
+	 * @since 2020. 5. 21
+	 */
+	public int getSendInvoiceListCount(ShoplinkerInvoice shoplinkerInvoice) {
+		return shoplinkerDao.getSendInvoiceListCount(shoplinkerInvoice);
+	}
+
+	/**
+	 * 송장전송-목록
+	 *
+	 * @param getGoodsSendList
+	 * @return
+	 * @author jmh
+	 * @since 2020. 5. 21
+	 */
+	public Collection<ShoplinkerInvoice> getSendInvoiceList(ShoplinkerInvoice shoplinkerInvoice) {
+		return shoplinkerDao.getSendInvoiceList(shoplinkerInvoice);
+	}
+
+	/**
+	 * 재고전송-목록 건수
+	 *
+	 * @param getStockListCount
+	 * @return
+	 * @author jmh
+	 * @since 2020. 5. 21
+	 */
+	public int getStockListCount(ShoplinkerSearch shoplinkerSearch) {
+		return shoplinkerDao.getStockListCount(shoplinkerSearch);
+	}
+
+	/**
+	 * 재고전송-목록
+	 *
+	 * @param getStockListList
+	 * @return
+	 * @author jmh
+	 * @since 2020. 5. 21
+	 */
+	public Collection<ShoplinkerGoods> getStockListList(ShoplinkerSearch shoplinkerSearch) {
+		return shoplinkerDao.getStockListList(shoplinkerSearch);
+	}
+
+	/**
+	 * 제휴몰 주문등록 주소분리
+	 *
+	 * @param addrStr
+	 * @return
+	 * @author jmh
+	 * @since 2020. 5. 21
+	 */
+	public GagaMap returnChangeAddr(String addrStr) {
+		GagaMap rtnMap = new GagaMap();
+
+		String tmpStr = "";
+		String addrBase = "";
+		String addrDtl = "";
+
+		if( -1 < addrStr.indexOf(" ")) {
+			// 공백  있음!
+			String[] addr = addrStr.split(" ");
+			if( addrStr.getBytes().length <= 100) {
+				addrBase = addr[0];
+				addrDtl = addrStr.replace(addr[0], "").trim();
+			}else {
+
+				for( int i=0; i< addr.length; i++) {
+					tmpStr = addrBase + addr[i];
+					if( 100 <  tmpStr.getBytes().length) {
+						break;
+					}else {
+						addrBase += addr[i]+" ";
+					}
+				}
+
+				addrBase = addrBase.trim();
+				addrDtl = addrStr.replace(addrBase, "").trim();
+			}
+
+		}else {
+			// 공백 없음! 무작위로 자르기!!
+			if( addrStr.getBytes().length <= 100) {
+				addrBase = addrStr;
+				addrDtl = null;
+			}else {
+
+				tmpStr = addrStr.substring(0, addrStr.length()/2);
+				if( 100 < tmpStr.getBytes().length ) {
+					tmpStr = tmpStr.substring(0, tmpStr.length()/2);
+				}
+				// 숫자를 기준으로 자름
+				for (char c : tmpStr.toCharArray()) {
+					if (Character.isDigit(c)) {
+			           break;
+			        }else {
+			        	addrBase += c;
+			        }
+			    }
+				addrBase = addrBase.trim();
+				addrDtl = addrStr.replace(addrBase, "").trim();
+			}
+		}
+
+		rtnMap.put("addrBase", addrBase);
+		rtnMap.put("addrDtl", addrDtl);
+
+		return rtnMap;
+	}
+
+	// 테스트데이터
+	private String testOrderStr() {
+		// 성공 "<partner_product_id>NNW13QPM69</partner_product_id>\r\n"
+		//     "<sku_match_code><![CDATA[12112927-3]]></sku_match_code>\r\n"
+		// 실패 "<partner_product_id>MNM0NZNN40</partner_product_id>\r\n"
+		//    "<sku_match_code><![CDATA[10727258-2]]></sku_match_code>\r\n"
+		String bbb = "<?xml version=\"1.0\" encoding=\"euc-kr\"?>"
+				+ "<Shoplinker>\r\n"
+				+ "<header>\r\n"
+				+ "<total_count>1</total_count>\r\n"
+				+ "<total_page>1</total_page>\r\n"
+				+ "<currently_page>1</currently_page>\r\n"
+				+ "<currently_count>1</currently_count>\r\n"
+				+ "</header>\r\n"
+
+				+ "<order>\r\n"
+				+ "<shoplinker_order_id>1234-9</shoplinker_order_id>\r\n"
+				+ "<mall_order_id><![CDATA[1234-9]]></mall_order_id>\r\n"
+				+ "<mall_name><![CDATA[(주)현대홈쇼핑]]></mall_name>\r\n"
+				+ "<baesong_status><![CDATA[송장전송완료]]></baesong_status>\r\n"
+				+ "<order_name><![CDATA[조민혜]]></order_name>\r\n"
+				+ "<order_tel><![CDATA[010-1234-5678]]></order_tel>\r\n"
+				+ "<order_cel><![CDATA[010-1234-5678]]></order_cel>\r\n"
+				+ "<order_email><![CDATA[]]></order_email>\r\n"
+				+ "<receive><![CDATA[조민혜]]></receive>\r\n"
+				+ "<receive_tel><![CDATA[010-1234-5678]]></receive_tel>\r\n"
+				+ "<receive_cel><![CDATA[010-1234-5678]]></receive_cel>\r\n"
+				+ "<receive_zipcode><![CDATA[21387]]></receive_zipcode>\r\n"
+				+ "<receive_addr><![CDATA[인천 부평구 부흥로로로 1234]]></receive_addr>\r\n"
+				+ "<baesong_type><![CDATA[쇼핑몰확인요망]]></baesong_type>\r\n"
+				+ "<baesong_bi>0</baesong_bi>\r\n"
+				+ "<delivery_msg><![CDATA[조심조심]]></delivery_msg>\r\n"
+				+ "<order_product_id>2118602667</order_product_id>\r\n"
+				+ "<shoplinker_product_id>prd143809490</shoplinker_product_id>\r\n"
+				+ "<partner_product_id>MNM0NZNN40</partner_product_id>\r\n"
+				+ "<product_name><![CDATA[[나이키 조던 키즈] 윙스MA-1 재킷B NNW13QPM69 (주니어)]]></product_name>\r\n"
+				+ "<quantity>1</quantity>\r\n"
+				+ "<order_price>47600</order_price>\r\n"
+				+ "<sale_price>47600</sale_price>\r\n"
+				+ "<supply_price>36176</supply_price>\r\n"
+				+ "<sku><![CDATA[NA/160]]></sku>\r\n"
+				+ "<orderdate>20210623132721</orderdate>\r\n"
+				+ "<order_reg_date>20210623132721</order_reg_date>\r\n"
+				+ "<delivery_invoice>339382561300</delivery_invoice>\r\n"
+				+ "<order_flag>004</order_flag>\r\n"
+				+ "<seller_id>hs009583</seller_id>\r\n"
+				+ "<only_sku><![CDATA[]]></only_sku>\r\n"
+				+ "<add_sku><![CDATA[]]></add_sku>\r\n"
+				+ "<mall_id><![CDATA[APISHOP_0015]]></mall_id>\r\n"
+				+ "<dis_price_mall><![CDATA[]]></dis_price_mall>\r\n"
+				+ "<dis_price_seller><![CDATA[]]></dis_price_seller>\r\n"
+				+ "<dis_price_coupon><![CDATA[]]></dis_price_coupon>\r\n"
+				+ "<dis_price_point><![CDATA[]]></dis_price_point>\r\n"
+				+ "<distribution_delivery><![CDATA[001]]></distribution_delivery>\r\n"
+				+ "<sku_match_code><![CDATA[10727258-2]]></sku_match_code>\r\n"
+				+ "<sku_barcode><![CDATA[]]></sku_barcode>\r\n"
+				+ "<order_main_key><![CDATA[]]></order_main_key>\r\n"
+				+ "<order_customs_number><![CDATA[]]></order_customs_number>\r\n"
+				+ "<order_input_type><![CDATA[001]]></order_input_type>\r\n"
+				+ "<supply_id><![CDATA[]]></supply_id>\r\n"
+				+ "<delivery><![CDATA[delv0094]]></delivery>\r\n"
+				+ "<order_user_id><![CDATA[]]></order_user_id>\r\n"
+				+ "<crspik_use><![CDATA[]]></crspik_use>\r\n"
+				+ "<ship_no>20210129292734</ship_no>\r\n"
+				+ "<pan_type><![CDATA[]]></pan_type>\r\n"
+				+ "<exchange_order_yn></exchange_order_yn>\r\n"
+				+ "<channel_type>현대Hmall</channel_type>\r\n"
+				+ "<ship_rsv_date></ship_rsv_date>\r\n"
+				+ "</order>\r\n"
+
+				+ "</Shoplinker>\r\n";
+		return bbb;
+	}
+}

+ 4 - 3
src/main/java/com/style24/core/biz/thirdparty/NetpathyMailSender.java

@@ -49,7 +49,7 @@ public class NetpathyMailSender {
 	private TscMailTemplateService mailTemplateService;
 
 
-		// 알림톡 답변일련번호
+	// 메일 답변일련번호
 	public enum MailAnswerSq {
 		JOIN_CONGRATS(1010),				// 회원가입축하 안내
 		TEMP_PASSWD(1011),				// 임시비밀번호발급 안내
@@ -63,14 +63,15 @@ public class NetpathyMailSender {
 
 		ORDER_COMPLETE(1019),			// 주문완료 안내
 		VA_DEPOSIT_REQUEST(1020),		// 무통장 입금 요청
-		CANCEL_REFUND(1021),				// 주문취소 및 환불 안내
+		CANCEL_REFUND(1021),			// 주문취소 및 환불 안내
 
 		EXCHANGE_REQUEST(1023),			// 교환 접수 안내
 		RETURN_REQUEST(1024),			// 반품 접수 안내
 		MARKETING_MAIL_1(1025),			// 마케팅메일 1단
 		MARKETING_MAIL_2(1026),			// 마케팅메일 2단
 		MARKETING_MAIL_3(1027),			// 마케팅메일 3단
-		MARKETING_MAIL_MIX(1028);		// 마케팅메일 혼합
+		MARKETING_MAIL_MIX(1028),		// 마케팅메일 혼합
+		BASIC(1029);						// 기본메일
 
 		private Integer value;
 

+ 63 - 6
src/main/java/com/style24/core/support/env/TscConstants.java

@@ -69,25 +69,26 @@ public class TscConstants {
 		CERT_NO_SEND("G054_202"),				// 회원/마케팅 -휴대전화인증
 		TEMP_PASSWD("G054_203"), 				// 회원/마케팅 -고객비밀번호발송
 		ONE_TO_ONE_ANSWER("G054_204"),			// 회원/마케팅 -1:1문의답변
-		SECEDE_CUST("G054_205"),				// 회원/마케팅 -가입탈퇴안내
+		SECEDE_CUST("G054_205"),					// 회원/마케팅 -가입탈퇴안내
 		BASIC_LMS("G054_206"),					// 회원/마케팅 -기본LMS안내발송
 		DORMANT_EXPECTED("G054_207"),			// 회원/마케팅 -휴면계정전환예정
 		PRIVACY_POLICY("G054_208"),				// 회원/마케팅 -개인정보 이용내역
-		MARKETING_AGREE("G054_209"),			// 회원/마케팅 -마케팅 정보 수신동의 내역
-		BIRTH_COUPON_NOTICE("G054_210"),		// 회원/마케팅 -생일쿠폰다운로드안내
+		MARKETING_AGREE("G054_209"),				// 회원/마케팅 -마케팅 정보 수신동의 내역
+		BIRTH_COUPON_NOTICE("G054_210"),			// 회원/마케팅 -생일쿠폰다운로드안내
 		GRADE_NOTICE("G054_211"),				// 회원/마케팅 -이달의 등급 혜택 안내
 		DORMANT_EXPECT_COMBACK("G054_212"),		// 회원/마케팅 -휴면/미접속자 방어쿠폰
 		GIFTCARD_EXTNC_EXPECT("G054_213"),		// 회원/마케팅 - 상품권 소멸 예정 안내
-		COUPON_EXTNC_EXPECT("G054_214"),		// 회원/마케팅 - 쿠폰 소멸 예정안내
+		COUPON_EXTNC_EXPECT("G054_214"),			// 회원/마케팅 - 쿠폰 소멸 예정안내
 		POINT_EXTNC_EXPECT("G054_215"),			// 회원/마케팅 - 포인트 소멸 예정안내
 		GOODS_ASK_ANSWER("G054_216"),			// 회원/마케팅 - 상품문의답변
+		BASIC_EMAIL("G054_217"),					// 회원/마케팅 - 기본EMAIL안내발송
 		ORDER_INFO("G054_301"),					// 주문-주문안내
 		BANK_DEPOSIT_INFO("G054_302"),			// 주문-무통장입금안내
 		SOLDOUT_EXPECTED_INFO("G054_303"),		// 주문-결품예정안내
 		SOLDOUT_INFO("G054_304"),				// 주문-결품안내
-		CANCEL_INFO("G054_305"),				// 주문-취소안내
+		CANCEL_INFO("G054_305"),					// 주문-취소안내
 		REPAYMENT_INFO("G054_306"),				// 주문-재결제안내
-		BUY_CONFIRM("G054_307"),				// 주문-구매확정
+		BUY_CONFIRM("G054_307"),					// 주문-구매확정
 		GIFT("G054_308"),						// 주문-선물하기
 		SHIPPING_INFO("G054_401"),				// 배송-주문상품배송안내
 		EXCHANGE_SHIPPING_INFO("G054_402"),		// 배송-교환상품배송안내
@@ -1056,4 +1057,60 @@ public class TscConstants {
 		}
 	}
 
+	// 제휴몰벤더ID
+	public enum VendorId {
+		SHOPLINKER("G003_V001");			// 샵링커
+
+		private String value;
+
+		private VendorId(String value) {
+			this.value = value;
+		}
+
+		public String value() {
+			return value;
+		}
+	}
+
+	// 제휴몰 파일업로드 상태유형
+	public enum ExtmallUploadStat {
+		WAIT("G021_00"),				// 대기
+		CHECK("G021_20"),				// 검증
+		SUCC("G021_30"),				// 성공
+		FAIL("G021_40"),				// 실패
+		NOT("G021_50");					// 미매핑
+
+		private String value;
+
+		private ExtmallUploadStat(String value) {
+			this.value = value;
+		}
+
+		public String value() {
+			return value;
+		}
+	}
+
+	// 제휴몰 파일업로드 실패유형
+	public enum ExtmallUploadFailStat {
+		GOODS("G022_10"),				// 상품코드미매핑
+		SIZE("G022_20"),				// 사이즈미매핑
+		ORD_QTY("G022_30"),				// 주문수량오류
+		PRICE("G022_40"),				// 상품가격이상
+		STORE("G022_50"),				// 판매매장미등록
+		STOCK("G022_60"),				// 가용재고없음
+		ORDER("G022_70"),				// 동일주문수집
+		ETC("G022_90");					// 기타
+
+		private String value;
+
+		private ExtmallUploadFailStat(String value) {
+			this.value = value;
+		}
+
+		public String value() {
+			return value;
+		}
+	}
+
 }

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

@@ -22,4 +22,6 @@ public class Alarm extends TscBaseDomain {
 	private String fuserid;		// 사용자계정
 	private String fcallback;	// 발신자전화번호(회신번호)
 
+	private String batchNm;		// 배치명
+
 }

+ 827 - 0
src/main/java/com/style24/persistence/domain/ExtmallOrder.java

@@ -0,0 +1,827 @@
+package com.style24.persistence.domain;
+
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.core.support.util.CryptoUtils;
+import com.style24.persistence.TscBaseDomain;
+import com.style24.persistence.TscPageRequest;
+
+import lombok.Data;
+
+/**
+ * 외부몰 Domain
+ *
+ * @author jmh
+ * @since 2021. 5. 20
+ */
+@SuppressWarnings("serial")
+@Data
+public class ExtmallOrder extends TscBaseDomain {
+
+	// 제휴몰 주문업로드 컬럼
+	private String vendorId; 			// 벤더ID(공통코드G003)
+	private String vendorNm; 			// 벤더명
+	private String extmallId; 			// 제휴몰ID(외부몰). TB_EXMALL.EXTMALL_ID
+	private String extmallNm; 			// 제휴몰명.SHOPLINKER_ORDER.MALL_NAME
+	private String agentOrderId; 		// 에이전트주문번호.SHOPLINKER_ORDER.SHOPLINKER_ORDER_ID
+	private String extmallOrderId; 		// 제휴몰주문번호(쇼핑몰주문번호).SHOPLINKER_ORDER.MALL_ORDER_ID
+	private String extmallProdId; 		// 제휴몰상품ID. SHOPLINKER_ORDER.ORDER_PRODUCT_ID
+	private String extmallProdNm; 		// 제휴몰상품명. SHOPLINKER_ORDER.PRODUCT_NAME
+	private String goodsCd; 			// 상품코드(상품)
+	private String goodsNm;				// 상품명
+	private String goodsStat;			// 상품상태
+	private String sku; 				// 옵션명(필수옵션+추가옵션)
+	private Integer currPrice; 			// 현재판매가. SHOPLINKER_ORDER.SALE_PRICE
+	private Integer ordQty; 			// 주문수량. SHOPLINKER_ORDER.QUANTITY
+	private Integer ordAmt; 			// 주문금액. SHOPLINKER_ORDER.ORDER_PRICE
+	private Integer cpnDcAmt; 			// 쿠폰할인금액(오픈마켓(인터파크,지마켓,옥션,스토어팜,스마트스토어) + 고도몰 적용). SHOPLINKER_ORDER.DIS_PRICE_COUPON
+	private Integer pntDcAmt; 			// 포인트할인금액(오픈마켓(인터파크,지마켓,옥션,스토어팜,스마트스토어) + 고도몰 적용). SHOPLINKER_ORDER.DIS_PRICE_POINT
+	private int delvFee; 				// 배송비.  SHOPLINKER_ORDER.BAESONG_BI
+	private String ordRecvDt; 			// 주문수집일.SHOPLINKER_ORDER.ORDER_REG_DATE
+	private String ordDt; 				// 주문일.SHOPLINKER_ORDER.ORDERDATE
+	private String ordNm; 				// 주문자명.SHOPLINKER_ORDER.ORDER_NAME
+	private String ordPhnno; 			// 주문자휴대전화번호.SHOPLINKER_ORDER.ORDER_CEL
+	private String ordTelno; 			// 주문자전화번호.SHOPLINKER_ORDER.ORDER_TEL
+	private String ordEmail; 			// 주문자이메일.SHOPLINKER_ORDER.ORDER_EMAIL
+	private String recipNm; 			// 수령자명.SHOPLINKER_ORDER.RECEIVE
+	private String recipPhnno; 			// 수령자휴대전화번호.SHOPLINKER_ORDER.RECEIVE_CEL
+	private String recipTelno; 			// 수령자전화번호.SHOPLINKER_ORDER.RECEIVE_TEL
+	private String recipZipcode; 		// 수령자우편번호.SHOPLINKER_ORDER.RECEIVE_ZIPCODE
+	private String recipBaseAddr;		// 수령자기본주소
+	private String recipDtlAddr;		// 수령자상세주소
+	private String delvMemo; 			// 배송메모.SHOPLINKER_ORDER.DELIVERY_MSG
+	private String uploadStat; 			// 업로드상태(공통코드G021)
+	private String uploadStatNm;
+	private String uploadFailCd; 		// 업로드실패코드(공통코드G022)
+	private String uploadFailNm;
+	private String uploadFailReason; 	// 업로드실패사유
+	private Integer ordNo; 				// 주문번호(주문)
+	private Integer delvAddrSq; 		// 배송지일련번호(배송지)
+	private String optCd;				// 옵션코드
+	private String uploadGb;			// 업로드구분(샵링커:S, 엑셀:E)
+	private String excelFileNm;			// 엑셀업로드 파일명
+	private String procJob;
+	private String warningYn;			// 주의여부(엑셀업로드 결과표시관련)
+	private String supplyCompCd;		// 공급업체코드
+	private Integer totalOrdAmt;		// 총 주문금액
+	private Integer stockFailHstCnt;	// 주문업로드시 재고실패이력 cnt
+	private String cnclsmsSendYn; 		// 알림톡-취소문자발송여부(Y:제휴몰에서발송, N:자사몰에서발송)
+	private String cnclAllSoldoutYn; 	// 알림톡-전체품절취소여부
+	private String soldoutGoodsNm;		// 알림톡-품절상품내용
+
+	private String stDate;
+	private String edDate;
+	private String regNm;				// 자사-등록자명
+	private Integer regNo;				// 자사-등록자번호
+	private String regDt;				// 자사-등록일시
+
+	private String succCnt;				// 엑셀업로드 성공수
+	private String failCnt;				// 엑셀업로드 실패수
+
+	Collection<ExtmallOrder> orderDetailList;		// 주문상세목록
+	Collection<ExtmallOrder> delvFeeCdList;		// 배송정보목록
+
+	// 스타일24 ORDER 컬럼
+	// 주문마스터
+	private String mallGb;							// 몰구분
+	private String mallGbNm;						// 몰구분명
+	private String payDt;							// 결제일자
+	private Integer custNo;							// 고객번호
+	private String siteCd;							// 사이트코드
+	private String siteCdNm;						// 사이트코드명
+	private String npayOrdNo;							// 네이버페이주문번호
+	private String npayOrdDtlNo;						// 네이버페이 상품주문번호(주문상세번호)
+	private String frontGb;							// 프론트구분 (P, M, A)
+	private String frontGbNm;						// 프론트구분명 (PC, MOBILE, APP)
+	private String custNm;							// 회원명
+	private String cellPhnno;						// 회원핸드폰
+	private String email;							// 이메일
+	private String delvAddrNm;						// 배송지명
+	private String ci;								// 회원CI값
+
+	// 주문상세
+	private Integer ordDtlNo;						// 주문상세번호
+	private String ordExchGb;						// 결제, 교환 구분 (O, E)
+	private String ordDtlStat;						// 주문상세상태
+	private int orgOrdDtlNo;						// 실제주문상세번호(교환)
+	private String formalGb;						// 정상,이월구분
+	private String formalGbNm;						// 정상,이월구분명
+	private String goodsType;						// 상품타입
+	private String itemAddPrice;					// 구성상품옵션추가금액
+	private int listPrice;							// 정상가
+	private int orgCurrPrice;						// 판매가
+	private double dcRate;							// 할인율
+	private int optAddPrice;						// 옵션추가금액
+	private int cnclRtnQty;							// 취소/반품수량
+	private int cnclRtnAmt;							// 취소/반품금액
+	private int orgCnclRtnAmt;						// 기취소/반품금액
+	private int cpn1CpnSq;							// 즉시할인쿠폰시퀀스
+	private int cpn1DcAmt;							// 즉시할인쿠폰할인금액
+	private int tmtb1Sq;							// 다다익선1시퀀스(수량)
+	private int tmtb1DcAmt;							// 다다익선1할인금액(수량)
+	private int tmtb2Sq;							// 다다익선2시퀀스(금액)
+	private int tmtb2DcAmt;							// 다다익선2할인금액(금액)
+	private int goodsCpnSq;							// 상품쿠폰시퀀스
+	private int goodsCpnDcAmt;						// 상품쿠폰할인금액
+	private int cartCpnSq;							// 장바구니시퀀스
+	private int cartCpnDcAmt;						// 장바구니할인금액
+	private int gfcdUseAmt;							// 상품권사용금액
+	private int ordDtlItemStat;
+
+	private int prePntDcAmt;						// 선포인트사용금액
+	private int savePntAmt;							// 적립포인트
+	private int orgSavePntAmt;
+
+	private int realOrdAmt;							// 실결제금액
+	private String venderId;						// 벤더ID
+	private String changeableYn;					// 교환가능여부
+	private String changeFeeFreeYn;					// 교환배송비무료여부
+	private String returnableYn;					// 반품가능여부
+	private String returnFeeFreeYn;					// 반품배송비무료여부
+
+	private String soldoutYn;						// 품절여부
+	private String soldoutMemo;						// 품절메모
+	private String soldoutRegNo;					// 품절등록자번호
+	private String soldoutRegDt;					// 품절등록일자
+	private String shotDelvYn;						// 총알배송여부
+	private String shotDelvUseYn;					// 총알배송사용여부(장바구니)
+	private String giftPackYn;						// 선물포장여부
+	private int custDelvAddrSq;
+	private String foreignYn;						// 해외구매대행여부
+
+	private String delvLocCd;						// 출고처코드
+	private String delvLocNm;						// 출고처코드명
+	private String delvAssigngDt;					// 출고처지정일자
+	private String delvAddignStat;					// 출고처지정상태
+	private String dstrbtMemo;						// 출고메모
+	private String delvStdt;						// 배송시작일자
+	private String delvEddt;						// 배송종료일자
+
+	private String shipCompCd;						// 배송업체코드
+	private String invoiceNo;						// 송장번호
+	private String invoiceSendYn;					// 배송지시전송여부
+	private String sellStoreCd;						// 판매매장코드
+	private String naverPayShipCompCd;				// 네이버페이 택배사코드
+	private double sellFeeRate;						// 판매매장수수료
+
+	private String afLinkCd;						// AFLINKCD
+	private String ithrCd;							// ITHRCD
+	private String contentsLoc;						// CONTESTSCLOC
+
+	private Integer planDtlsq;						// 기획전시퀀스
+	private Integer socialSq;						// 소셜시퀀스
+
+	private String condition;						//
+	private String[] conditions = null;				//
+
+	private String searchDateGb;					// 검색일자구분
+	private String orderNm;							// 주문자명
+	private String custId;							// 회원ID
+	private String orderPhnno;						// 주문핸드폰번호
+	private String sizeCd;							// 사이즈코드
+	private String payMeans;						// 결제타입
+	private String chgStat;							// 교환상태
+	private String chgGb;							// 변경구분 (취소신청, 반품신청, 교환요청)
+	private String wdInvoiceSendYn;					// 회수지시전송여부
+	private String goodsCnt;						// 상품수
+
+	private int cancelRequestQty;					// 취소요청수량
+	private int exchangeRequestQty;					// 교환요청수량
+	private int returnRequestQty;					// 반품요청수량
+	private int delvFeeSaveGoodsAmt;				// 최수주문수량 - 상품 수량 금액
+
+	// 상품정보
+	private String imgPath1;						// 이미지경로1
+	private String sysImgNm;						// 이미지명
+	private String brandCd;							// 브랜드코드
+	private String opt;								// 옵션
+	private String optCd1;							// 옵션코드1
+	private String optCd2;							// 옵션코드2
+	private String optCd11;							// 교환옵션코드1
+	private String optCd12;							// 교환옵션코드2
+	private String goodsTypeNm;						// 상품타입명
+	private String brandEnm;						// 브랜드명
+	private String itemCd;							// 아이템코드
+	private String goodsNum;						// 품번
+	private String supplyGoodsCd;					// 공급처코드
+	private String optCd2s;							// 옵션코드(문자)
+	private int currStockQty;						// 현재재고
+	private String currStockQtys;					// 현재재고(문자)
+
+	private int totDcAmt;							// 전체할인금액
+	private String dateGbn;							// 일자구분
+	private String mallCd;							// MALLCD
+	private String search;							// 검색어
+	private int productNo;							// 상품번호
+	private String skuModelNo;						// skuModelNo
+	private String productCode;						// productCode
+
+	private String foreignBuyYn;					// 해외구매대행가능여부
+	private String orderMadeYn;						// 주문제작상품여부
+	private String entryNo;							// 통관번호
+	private int dispOrd;							// 노출순서
+
+	/* Multi CheckBox 항목 */
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiBrand;					// 브랜드코드배열
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiOrdStat;					// 주문상태배열
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiOrdDtlStat;				// 주문상세상태배열
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiChgStat;					// 주문상태배열
+
+	private int sumListPrice;						// 공급가액 합계
+	private int sumOrdAmt;							// 주문금액합계
+	private int sumOrdCnclAmt;						// 주문취소금액합계
+	private int sumRealPayAmt;						// 주문실결제금액합계
+	private int ordNoCnt;							// 주문번호건수
+	private int sumOrdQty;							// 주문건수합계
+	private int sumOrdCnclQty;						// 주문취소건수합계
+
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private int[] ordNoList;						// 주문번호배열
+
+	private String delYn;							// 삭제여부
+	private String recipAddr;						// 배송지주소
+	private String delvAddrEditYn;					// 출고메모수정여부
+	private String exchGbNm;						// 교환구분명
+
+	private String escrowYn;						// 에스크로결제여부
+	private String payMeansNm;						// 결제타입명
+	private String cardNm;							// 카드명
+	private String vaBank;							// 가상계좌
+	private String pgTradeNo;						// PG거래번호
+	private String payStat;							// 결제상태
+	private String payStatNm;						// 결제상태명
+	private int payAmt;								// 결제금액
+	private String vaDeadline;						// 가상계좌입금마감일
+
+	private String delvFeeGb;						// 배송비구분 (원주문배송비, 재결제배송비, 반품배송비, 교환배송비)
+	private String delvFeeGbNm;						// 배송비구분명
+	private int wmsDelvFee;							// 자사 배송비
+	private String delvUsacYn;						// 배송비정산여부
+	private String delvUsacDt;						// 배송비정산일자
+	private Integer delvFeeSq;						// 배송비시퀀스
+
+	private String coundelClsf;
+	private String relGoodsCd;						// 1:1문의상품코드
+	private String questTitle;						// 1:1문의제목
+	private String questDt;							// 1:1문의일자
+	private String ansDt;							// 1:1답변일자
+	private int andNo;								// 1:1답변자
+
+	private Integer ordChgSq;						// 변경시퀀스
+	private String chgGbNm;							// 변경구분명
+	private String chgStatNm;						// 변경상태명
+	private String chgReason;						// 변경사유
+	private String chgReasonNm;						// 변경사유명
+	private String chgMemo;							// 변경메모
+	private String chgerNm;							// 변경자
+	private String chgerPhnno;						// 변경자핸드폰번호
+	private String chgerTelno;						// 변경자전화번호
+	private String chgerZipcode;					// 변경자우편번호
+	private String chgerBaseAddr;					// 변경자기본주소
+	private String chgerDtlAddr;					// 변경자상세주소
+	private String chgerRtnMemo;					// 변경자반품메모
+	private String wdInvoiceNo;						// 회수송장번호
+
+	private String supplyCompNm;					// 공급업체명
+	private String brandKnm;						// 브랜드명(한글)
+	private String ordDtlStatNm;					// 주문상세상태명
+
+	private String custGrade;						// 고객등급
+	private String custGradeNm;						// 고객등급명
+	private String custGb;							// 고객구분(일반, 임직원)
+	private String custGbNm;						// 고객구분명
+	private String managedRsn;
+	private String managedRsnNm;
+
+	private int itemQty;							// 아이템수량
+	private int itemPrice;							// 아이템단가
+	private String itemNm;							// 아이템명
+
+	// Pagination
+	private TscPageRequest pageable;				// 페이징
+	private int pageNo = 1;							// 페이지번호
+	private int pageSize = 50;						// 페이지목록수
+	private int pageUnit = 10;						// 페이지번호수
+
+	// 주문문의 1:1 응답 칼럼
+	private String counselClsfNm;
+	private String ansNo;
+	private String ansNm;
+	private String updNm;
+
+	// 주문메모칼럼
+	private Integer orderMemoSq;
+	private Integer ordMemoSq;
+	private String memo;
+	private String orgFileNm;
+	private String sysFileNm;
+
+	// 사은품칼럼
+	private Integer ordFreegiftSq;
+	private Integer freegiftSq;
+	private String freegiftNm;
+	private Integer freegiftValSq;
+	private int usePoint;
+	private int seq;
+	private String userNm;
+	private String allYn;
+
+	// 환불계좌칼럼
+	private String raBank;
+	private String raBankNm;
+	private String raNo;
+	private String encodedRaNo;
+	private String raNm;
+	private String defaultYn;
+
+	// 주문상세변경내역칼럼
+	private String userId;
+	private String updId;
+	private String shipCompNm;
+	private String shipCompId;
+
+	// 주문쿠폰
+	private int cpnSq;
+	private Integer cpnId;
+	private String cpnType;
+	private String targetCd1;
+	private String targetCd2;
+	private String cpnNm;
+	private String dcWay;
+	private int dcPval;
+	private int dcMval;
+	private int dcAval;
+	private String applyScope;
+	private Integer custCpnSq;
+
+	// 주문포인트
+	private Integer pntHstSq;
+	private int pntRate;
+	private int pntPrate;
+	private int pntMrate;
+	private int pntAmt;
+	private String occurGb;
+	private String occurGbNm;
+	private String occurDtlDesc;
+	private String pntUploadStat;
+
+	// 주문상품권
+	private Integer gfcdHstSq;
+	private Integer custGfcdSq;
+	private String gfcdNm;
+	private String gfcdNo;
+	private int gfcdAmt;
+	private int chgGfcdAmt;
+	private int usGfcdAmt;
+	private int rmGfcdAmt;
+	private int rmPntAmt;
+
+	// 다다익선
+	private Integer tmtbSq;
+	private String tmtbNm;
+	private int tmtbDcAmt;
+
+	// 상태변경
+	private String g20;
+	private String g30;
+	private String g40;
+	private String g50;
+	private String g55;
+	private String g60;
+
+	// 취소요청
+	private String cncWait;
+	private int ordReqChgQty;
+	private int itemReqChgQty;
+	private int itemOrdPrice;
+	private int minOrdAmt;
+	private int orgDelvFee;
+	private String delvFeeCd;
+	private String resDelvFeeCd;
+	private int ordCanChgQty;
+	private String allCanYn;
+	private String lastCanYn;
+
+	private String addDelvFeeYn;
+	private int addDelvFee;
+	private Integer ordDtlItemSq;
+
+	private Integer paySq;
+	private String pgOrdNo;
+	private int refundAmt;
+	private int rfCpn1Amt;
+	private int rfTmtb1Amt;
+	private int rfTmtb2Amt;
+	private int rfGoodsCpnAmt;
+	private int rfCartCpnAmt;
+	private int rfDelvCpnAmt;
+	private int rfPntAmt;
+	private int rfPrePntAmt;
+	private int rfGfcdUseAmt;
+	private int rfDeliveryFee;
+	private int rfCnclAmt;
+	private int rfRealCnclAmt;
+
+	private int pgCpnAmt;
+	private int npayPntAmt;
+	private String payGb;
+	private String pgGb;
+	private String pgTid;
+	private String cardType;
+	private String cardKind;
+	private String cardBank;
+	private String cardMips;
+	private String cardPcableYn;
+	private String vaNo;
+	private String vaNm;
+	private String telecom;
+	private String cashAuthNo;
+	private String cashTradeNo;
+
+	private String accountNo;
+	private String encodedAccountNo;	// 계좌번호 암호화
+	private String accountNm;
+	private String bankCd;
+	private String bankNm;
+
+	public String getAccountNo() {
+		this.accountNo = CryptoUtils.decryptAES(this.accountNo);
+		return this.accountNo;
+	}
+
+	public void encryptData () {
+		this.encodedAccountNo = CryptoUtils.encryptAES(this.accountNo);
+	}
+
+	private int realDelvAmt;
+	private int delvCpnSq;
+	private int delvCpnDcAmt;
+
+	private int chgQty;
+	private int rtnDelvFee;
+	private int excDelvFee;
+
+	private String[] ordDtlStatArr;
+
+	private int[] ordDtlNoArr;
+	private int[] cnclRtnReqQtyArr;
+
+	// 교환요청
+	private String ordChgOpt;
+	private String rtnLocZipcode;
+	private String rtnLocBaseAddr;
+	private String rtnLocDtlAddr;
+	private String rtnLocTelno;
+	private String rtnLocNm;
+	private int exchangeOrdDtlNo;
+	private int exchangeOrdDtlItemSq;
+	private String wdGb;
+	private int addPayCost;
+
+	// 주문서
+	private int wmsCnt;
+	private int resCnt;
+	private int delvCnt;
+	private int delvTotCnt;
+	private int delvFeeTotCnt;
+
+	Collection<Order> shotCartList;					// 자사총알배송목록
+	Collection<Order> wmsCartList;					// 자사일반배송목록
+	Collection<Order> resCartList;					// 자사예약배송목록
+	Collection<Order> delvCartList;					// 입점업체배송목록
+	Collection<Order> delvAllCartList;				// 배송전체목록 sort
+	Collection<Order> cartGoodsList;				// 다다익선적용장바구니목록
+	List<Order> goodsCpnList;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private int[] cartCpnCartSqArr;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private int[] freegiftSqArr;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private int[] freegiftSectionSqArr;
+	int freegiftAmt;
+	Integer freegiftSectionSq;
+
+	// 장바구니
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private int[] cartSqArr;		// 장바구니 일련번호 배열 (일시품절제외 조회)
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] itemNmArr;		// 옵션코드
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] goodsPriceArr;		// 옵션코드
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] optCdArr;		// 옵션코드
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] colorNmArr;	// 컬러명
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] optCd1Arr;		// 옵션코드
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] optCd2Arr;		// 옵션코드
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] itemQtyArr;	// 구성상품번호
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] itemCdArr;		// 옵션코드
+	private String jsessionId;		// SessionId
+	private String colorNm;			// 컬러명
+	private String itemQtyr;		// itemQty GROUP_CONCAT
+	private String delvResDt;		// 예약배송일자
+	private String shotDelvDt;		// 총알 도착 예상 일자
+	private String firstCompYn;		// 업체 중 첫번째 상품 여부
+	private String delvFeeCrite;	// 배송비구분 (G078_10 : 조건부 무료, G078_20 : 무료, G078_30 : 유료)
+	private String shotCanYn;		// 총알배송 가능 여부
+	private String serialCpnNm;		// 시리얼쿠폰명
+	private String cartDelvFeeCd;	// 장바구니 delvFeeCd 구분 (총알, 일반, 업체구분)
+	private String ordCanYn;		// 주문 가능 여부
+	private String quickYn;			// 퀵메뉴 여부
+	private String cartYn;			// 장바구니 여부
+	private Integer cartSq;			// 장바구니 일련번호
+	private int goodsQty;			// 장바구니 등록 수량
+	private int compCnt;			// 장바구니 업체 수
+	private int compSumPrice;		// 업체별 금액 합계
+	private int qtySumCurrPrice;	//
+	private int totDelvFee;			// 배송비 총합
+	private int totCartCnt;			// 장바구니 상품 수량
+	private int maxDcAmt;			// 쿠폰 최대 할인 금액
+	private int buyLimitAmt;		// 쿠폰 적용 최소 구매 금액
+	private int wishCnt;			// 위시리스트 수량
+	private int minOrdQty;			// 최소 주문 수량
+	private int maxOrdQty;			// 최대 주문 수량
+	private int ordCanQty;			// 주문 가능 수량
+	private int saveLimitDay;		// 장바구니 보관기한
+	private int allCartCnt;			// 장바구니 전체 수량(구매불가 포함)
+
+	// 다다익선
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private int[] tmtbSqs;							// 다다익선 일련번호
+	private int qtyTmtbSq;							// 수량 다다익선 적용 일련번호
+	private int amtTmtbSq;							// 금액 다다익선 적용 일련번호
+	private int applyAmtSectionVal;					// 적용 조건
+	private int applyQtySectionVal;					// 적용 조건
+	private int dcVal;								// 할인값
+	private int qtyDcVal;							// 수량 다다익선 할인값
+	private int amtDcVal;							// 금액 다다익선 할인값
+	private int qtyTmtbCnt;							// 수량 다다익선 상품 수
+	private int amtTmtbCnt;							// 금액 다다익선 상품 수
+	private int sectionVal;							// 다다익선 조건
+	private int qtySectionVal;						// 수량 다다익선 조건
+	private int amtSectionVal;						// 금액 다다익선 조건
+	private int tmtbSumQty;							// 장바구니 수량 다다익선 총계
+	private int tmtbSumAmt;							// 장바구니 금액 다다익선 총계
+	private int qtyTmtbSumQty;						// 수량 다다익선 합계 수량
+	private int qtyTmtbSumAmt;						// 수량 다다익선 합계 금액
+	private int amtTmtbSumQty;						// 금액 다다익선 합계 수량
+	private int amtTmtbSumAmt;						// 금액 다다익선 합계 금액
+	private int qtyTmtbMinSectionVal;				// 수량 다다익선 최소 조건
+	private int qtyTmtbMinDcVal;					// 수량 다다익선 최소조건에 대한 할인값
+	private int amtTmtbMinSectionVal;				// 금액 다다익선 최소조건
+	private int amtTmtbMinDcVal;					// 금액 다다익선 최소조건에 대한 할인값
+	private String sectionGb;						// 할인구분
+	private String qtyTmtbNm;						// 수량 적용 다다익선명
+	private String amtTmtbNm;						// 금액 적용 다다익선명
+	private String qtyDcWay;						// 수량 다다익선 할인구분
+	private String amtDcWay;						// 금액 다다익선 할인구분
+	private String qtyGoodsGb;						// 상품 구분 (G800_10(기본), G800_20(적용), G800_30(제외), G800_40(ALL))
+	private String amtGoodsGb;						// 상품 구분 (G800_10(기본), G800_20(적용), G800_30(제외), G800_40(ALL))
+	private String goodsGb;							// 상품 구분 (G800_10(기본), G800_20(적용), G800_30(제외), G800_40(ALL))
+	private String applyGb;							// 다다익선 할인 기준
+	private String applyQtySectionYn;				// 다다익선 적용 여부
+	private String applyAmtSectionYn;				// 다다익선 적용 여부
+
+	// 마이페이지
+	private int itemCnt;
+	private int ordDtlStatCnt;
+	private String delvDesc;
+	private Integer reviewSq;
+	private String selfGoodsYn;
+	private String brandNm;
+	private String brandGroupNm;
+	private String expiredSoon;
+	private int purchaseConfirmDay;
+	private String giftLimitDt;
+	private int giftLimitDay;
+	private String giftCompleteDt;
+	private String vaDeadlineYmd;
+	private String vaDeadlineHms;
+	private int totalDcAmt;
+	private Integer custPntSq;
+	private int orderReceiptCount;
+	private int depositWaitingCount;
+	private int waitingAddPaymentCount;
+	private int paymentCompleteCount;
+	private int goodsPrepareCount;
+	private int shipPrepareCount;
+	private int shippingCount;
+	private int shipCompleteCount;
+	private int cancelCount;
+	private int exchangeCount;
+	private int returnCount;
+	private int confirmCount;
+	private String reviewableYn;
+
+	// 카카오페이 & 네이버페이
+	private int ordGoodsQty;
+
+	// 암호화 대상 복호화 처리
+	public String getCustNm() {
+		this.custNm = CryptoUtils.decryptAES(this.custNm);
+		return this.custNm;
+	}
+
+	public String getEmail() {
+		this.email = CryptoUtils.decryptAES(this.email);
+		return this.email;
+	}
+
+	public String getCellPhnno() {
+		this.cellPhnno = CryptoUtils.decryptAES(this.cellPhnno);
+		return this.cellPhnno;
+	}
+
+	public String getRecipBaseAddr() {
+		this.recipBaseAddr = CryptoUtils.decryptAES(this.recipBaseAddr);
+		return this.recipBaseAddr;
+	}
+
+	public String getRecipDtlAddr() {
+		this.recipDtlAddr = CryptoUtils.decryptAES(this.recipDtlAddr);
+		return this.recipDtlAddr;
+	}
+
+	private String dispYn;
+
+	// 주묹정보등록
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private int[] freegiftValArr;			// 사은품상품 일련번호 배열
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] freegiftGoodsArr;		// 사은품장바구니 일련번호 배열
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] freegiftUsePointArr;	// 사은품사용포인트 배열
+
+	private String prePntDcAmtYn; 			// 선포인트사용여부
+	private String sellGb;					// 판매구분
+	private int usPntAmt;					// 포인트사용금액
+
+	private String payType;					// 결제타입
+	private String delvYn;					// 출고여부
+
+	/* Multi CheckBox 항목 */
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] payTypeArr;
+
+	// 휴대폰 번호 대쉬 붙이기
+	public void setHypenCellPhone() {
+		if (StringUtils.isNotBlank(this.cellPhnno)) {
+			if (this.cellPhnno.length() > 10) {
+				this.cellPhnno = this.cellPhnno.substring(0, 3) + "-" + this.cellPhnno.substring(3, 7) + "-" + this.cellPhnno.substring(7, 11);
+			} else {
+				this.cellPhnno = this.cellPhnno.substring(0, 3) + "-" + this.cellPhnno.substring(3, 6) + "-" + this.cellPhnno.substring(6, 10);
+			}
+		}
+	}
+
+	// 휴대폰 번호 대쉬 붙이기
+	public void setHypenRecipPhone() {
+		if (StringUtils.isNotBlank(this.cellPhnno)) {
+			if (this.recipPhnno.length() > 10) {
+				this.recipPhnno = this.recipPhnno.substring(0, 3) + "-" + this.recipPhnno.substring(3, 7) + "-" + this.recipPhnno.substring(7, 11);
+			} else {
+				this.recipPhnno = this.recipPhnno.substring(0, 3) + "-" + this.recipPhnno.substring(3, 6) + "-" + this.recipPhnno.substring(6, 10);
+			}
+		}
+	}
+
+	private String ifYn;				// 증권 인터페이스 여부 (입금 확인 여부)
+	private String insNo;				// USAFE 보증보험 증권번호
+	private String resultCd;			// 결과코드
+	private String resultMsg;			// 결과메세지
+	private String insuranceYn;			// 보증보험신청여부
+	private String birthYmd;			// 생년월일(탈퇴 시 NULL로 처리)
+	private String sexGb;				// 성별구분(공통코드G007). 탈퇴 시 NULL로 처리
+	private String birthGen;			// 보증보험(생년월일 + 성별)
+
+	public String getBirthYmd() {
+		this.birthYmd = CryptoUtils.decryptAES(this.birthYmd);
+		return this.birthYmd;
+	}
+
+	public String getSexGb() {
+		this.sexGb = CryptoUtils.decryptAES(this.sexGb);
+		return this.sexGb;
+	}
+
+	private String orderGiftYn;			// 선물여부
+	private String giftMsg;				// 선물메세지
+	private String giftAddrInpYn;		// 선물배송지등록여부
+	private String giftPackCloseYn;		// 선물받기 배송기한 지남
+	private String giftPackCloseDt;		// 선물받기 배송기한 날짜
+
+	private int pointUseOrdMinAmt;		// 포인트사용기준
+	private int pointUseMaxLimit;		// 최대사용가능포인트율
+	private String custPayMeans;		// 결제타입설정
+
+	private String backUrl;
+	private String goodsUrl;
+
+	// 2021.05.11 금액정보 체크
+	private int orgGoodsSumAmt;
+	private int cpn1DcSumAmt;
+	private int tmtb1DcSumAmt;
+	private int tmtb2DcSumAmt;
+	private int goodsCpnDcSumAmt;
+	private int cartCpnDcSumAmt;
+	private int prePntDcSumAmt;
+	private int pntDcSumAmt;
+	private int gfcdUseSumAmt;
+	private int realOrdSumAmt;
+	private int delvSumAmt;
+
+	private String delvFeeCdGrp;			// 자사,입점구분을 위해서 생성
+	private Boolean isCustomer;				// 고객사유여부
+	Collection<Order> withdrawConfirmList;	// 입점업체회수컨펌대상목록
+	private String whMemo;					// 회수메모
+	private int cancelQty;
+	private int delvQty;
+
+	private int dtlOrdAmt;
+	private int dtlItemOrdAmt;
+
+	// 네이버페이 주문형
+	private String stdt;
+	private String eddt;
+	private Calendar from;
+	private Calendar to;
+	private String errorReason;
+	private String accessLicense;
+	private String secretKey;
+
+	private String delvExpnYn;
+	private String addDeliveryFeeYn;
+	private int addDeliveryFee;
+	private String wdBfSendYn;
+
+	// 2021.06.17 스윗트래커 정보 조회
+	private String timeTrans;
+	private String delvWhere;
+	private String details;
+	private String telno;
+
+	// 기본항목세팅(오류가 안나는 값들)
+	public void setBasicParams(ShoplinkerOrder ord) {
+		this.extmallId = ord.getMallId();
+		this.extmallNm = ord.getMallName();
+		this.agentOrderId = ord.getShoplinkerOrderId();
+		this.extmallOrderId = ord.getMallOrderId();
+		this.extmallProdId = ord.getOrderProductId();
+		this.extmallProdNm = ord.getProductName();
+		this.ordRecvDt = ord.getOrderRegDate();
+		this.ordDt = ord.getOrderdate();
+	}
+
+	// 기본항목 외 세팅
+	public void setDetailParams(ShoplinkerOrder ord) {
+		this.goodsCd = ord.getPartnerProductId();
+		this.sku = ord.getSku();
+		this.currPrice = Integer.parseInt(ord.getSalePrice());
+		this.ordQty = Integer.parseInt(ord.getQuantity());
+		this.ordAmt = Integer.parseInt(ord.getOrderPrice());
+		this.optCd = ord.getSkuMatchCode();
+		this.delvFee = Integer.parseInt(ord.getBaesongBi());
+		this.ordNm = ord.getOrderName();
+		this.ordPhnno = ord.getOrderCel();
+		this.ordTelno = ord.getOrderTel();
+		this.ordEmail = ord.getOrderEmail();
+		this.recipNm = ord.getReceive();
+		this.recipPhnno = ord.getReceiveCel();
+		this.recipTelno = ord.getReceiveTel();
+		this.recipZipcode = ord.getReceiveZipcode();
+		this.delvMemo = ord.getDeliveryMsg();
+	}
+
+	public String[] getParams() {
+		String[] params = {this.ordDt, this.extmallId, this.extmallOrderId, this.agentOrderId, this.extmallProdId, this.goodsCd, this.sku, this.optCd, this.currPrice+"", this.cpnDcAmt+"", this.ordQty+"", this.delvFee+"", this.ordNm, this.ordTelno, this.ordPhnno, this.ordEmail, this.recipNm, this.recipTelno, this.recipPhnno, this.recipZipcode, this.recipBaseAddr, this.recipDtlAddr, this.delvMemo};
+		return params;
+	}
+
+	public String[] getColumns() {
+		String[] columns = {"주문일", "제휴몰ID", "제휴주문번호", "샵링커주문번호",  "제휴상품코드", "자사상품코드", "상품명", "옵션코드", "판매가", "할인금액", "주문수량", "배송비", "주문자", "주문자전화번호", "주문자휴대폰번호", "주문자이메일", "수령자명", "수령자전화번호", "수령자휴대폰번호", "수령자우편번호", "수령자기본주소", "수령자상세주소", "배송메시지"};
+		return columns;
+	}
+}
+
+
+
+
+

+ 138 - 0
src/main/java/com/style24/persistence/domain/ShoplinkerGoods.java

@@ -0,0 +1,138 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 샵링커 상품정보 Domain
+ *
+ * @author jmh
+ * @since 2021. 05. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class ShoplinkerGoods extends TscBaseDomain {
+
+	// 공통
+	private String customerId; 					// 고객사 코드(샵링커 가입코드)
+	private String partnerProductId;			// 자사 상품코드 (상품관리코드)
+	private String attributeTitleCode;			// 그룹 속성 코드
+	private String attributePartnerProductId;	// 자사 단품코드 (복수시 콤마로 구분)
+	private String productName;					// 상품명  (단품인경우 "옵션1_옵션2" 값임)
+
+	private String domainUrl;					// 이미지 domain url
+	private String excelFileNm;					//엑셀업로드 파일명
+	private String profiles;
+
+	private String xmlPath;
+	private String apiType;						// API구분(10:상품등록API, 11:상품수정API, 12:옵션재고수정API)
+	//private String vendorId;					// 벤더ID
+	private int idx;
+	private String xmlTxt;						// xml내용
+	private String apiSubUrl;					// api url 하위 경로
+
+
+	// 1. 단품(옵션)
+	private String attributeCode;				// (안씀) 단품 속성 코드
+	private int quantity;						// 공급가능수량
+	private String optCd; 						// 옵션1
+	private String optCd1; 						// 옵션1
+	private String optCd2;						// 옵션2
+
+	// 2. 상품
+	private String detailDesc;					// 상세설명
+	private String detailDescNew10;				// 신규상세설명
+	private String detailDescNew20;				// 신규상세설명
+	private String detailDescNew30;				// 신규상세설명
+	private String modelInfo;					// 모델정보
+
+	private String marketPrice;					// (안씀) 쇼핑몰시중가(도서정가)
+	private String salePrice;					// 쇼핑몰판매가
+	private String supplyPrice;					// 쇼핑몰공급가
+	private String marketPriceP;				// (안씀) 매입처 시중가(도서정가)
+	private String salePriceP;					// (안씀) 매입처 판매가
+	private String supplyPriceP;				// (안씀) 매입처 공급가
+	private String saleStatus;					// 상품판매상태
+	private String makerDt;						// 발행일(제조일)
+	private String taxYn;						// 과세
+	private String newDescTop;					// (안씀) 신상세설명
+	private String salearea;					// 판매지역
+	private String sex;							// 남여상품
+	private String model;						// 모델명
+	private String modelNo;						// 모델 NO
+	private String brand;						// 브랜드명
+	private String authNo;						// 인증번호
+	private String expirydate;					// 유효일
+	private String maker;						// 제조업체
+	private String origin;						// 원산지명/코드
+	private String adultInfo;					// 성인상품
+	private String ccategoryL;					// 고객사 카테고리 대분류코드
+	private String ccategoryM;					// 고객사 카테고리 중분류코드
+	private String ccategoryS;					// 고객사 카테고리 소분류코드
+	private String ccategoryD;					// 고객사 카테고리 세분류코드
+	private String selfGoodsYn;					// 자사-자사상품여부
+	private String tobeFormYn;					// 자사-상세폼신규사용여부
+	private String regNm;						// 자사-등록자명
+	private Integer regNo;						// 자사-등록자번호
+	private String regDt;						// 자사-등록일시
+	private String goodsCd;						// 자사-상품코드
+	private String goodsNm;						// 자사-상품명
+	private String brandCd;						// 자사-브랜드코드
+	private String itemkindCd;					// 자사-품목코드
+	private String mainColorCd;					// 자사-대표색상코드
+	private String mainColorEnm;				// 자사-대표색상코드 영문명
+	private String colorKnm;					// 자사-컬러 한글명
+	private String goodsStat;					// 자사-상품상태(공통코드G008)
+	private String allOptCd1;					// 자사-옵션1정보 여러개
+	private String shoplinkerItemkindNm;		// 샵링커 품목매핑명
+	private String syncYn;						// 가격연계여부
+	private String colorListYn;
+	private String kidsYn;						// 아동유무
+	private String brandEnm; 					// 브랜드 영문명
+	private String sizeTypecd;					// 사이즈타입
+	private String sizeValue1;					// 사이즈 값1
+	private String sizeValue2;					// 사이즈 값2
+	private String sizeValue3;					// 사이즈 값3
+	private String sizeValue4;					// 사이즈 값4
+	private String sizeValue5;					// 사이즈 값5
+
+
+
+	// 3. 자사몰 - 품목정보
+	private String lclassId;					// 샵링커 품목 대분류 코드
+	private String itemSeq;						// 항목 상세코드
+	private String itemInfo;					// 항목 상세설명
+
+	// 4. 자사몰 - 인증정보
+	private String certItem;					// 인증 코드
+	private String certOrgan;					// 인증기관명
+	private String certNo;						// 인증 번호
+	private String certTargetGb;				// 인증대상구분
+	private String CertTargetNm;				// 인증대상구분명
+	private String CertFormGb;					// 인증형태구분
+	private String CertFormNm;					// 인증형태구분명
+	private String CertType;					// 인증타입
+	private String CertTypeNm;					// 인증타입명
+	private String CertNum;						// 안전인증번호
+	private String CertState;					// 인증상태(적합,반납,청문실시,기간만료,안저인증취소 등)
+	private String CertDiv;						// 인증구분
+	private String CertOrganName;				// 인증기관
+	private String CertDt;						// 안전인증일
+
+	// 5. 자사몰 - 이미지
+	private String sysImgNm;
+	private String colorCd;
+	private String defaultImgYn;
+	private String extmallImgYn;				// 외부몰이미지 여부
+
+	// 결과
+	private String apiProductId;				// 샵링커 상품코드
+	private String apiResult;					// 결과플래그 (true or false)
+	private String apiMessage;					// 결과
+
+	private Integer ordDtlNo;					// 주문상세번호
+	private String sendYn;
+	private String allUpdYn;
+}
+

+ 67 - 0
src/main/java/com/style24/persistence/domain/ShoplinkerInvoice.java

@@ -0,0 +1,67 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+import com.style24.persistence.TscPageRequest;
+
+import lombok.Data;
+
+/**
+ * 샵링커 상품정보 Domain
+ *
+ * @author jmh
+ * @since 2021. 05. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class ShoplinkerInvoice extends TscBaseDomain {
+
+	// 공통
+	private String customerId; 					// 고객사 코드(샵링커 가입코드)
+	private String productName;					// 상품명  (단품인경우 "옵션1_옵션2" 값임)
+
+	private String domainUrl;					// 이미지 domain url
+	private String excelFileNm;					//엑셀업로드 파일명
+	private String profiles;
+
+	private String xmlPath;
+	private String apiType;						// API구분(10:상품등록API, 11:상품수정API, 12:옵션재고수정API)
+	//private String vendorId;					// 벤더ID
+	private int idx;
+	private String xmlTxt;						// xml내용
+	private String apiSubUrl;					// api url 하위 경로
+
+	private Integer ordNo;						// 주문번호(주문)
+	private Integer ordDtlNo;					// 주문번호(주문)
+	private String deliveryName;				// 택배사명
+	private String deliveryCode;				// 배송업체(택배사코드)
+	private String deliveryInvoice;				// 송장번호
+	private String vendorId;					// 외부몰벤더ID
+	private String extmallId;					// 외부몰ID(외부몰)
+	private String extmallNm;					// 외부몰 명
+	private String agentOrderId;				// 에이전트주문번호
+	private String extmallOrderId;				// 외부몰주문번호
+	private String delvAssignStat;				// 출고지정상태(P:대기,Y:수락,N:거부)
+	private String ordExchGb;					// 주문교환구분
+	private String ordDtlStat;					// 주문상세상태
+	private String ordDtlStatNm;				// 주문상세상태명
+
+	private String stDate;
+	private String edDate;
+	private String uploadFailCd;
+	private String regNm;
+	private String shipCompNm;	// 배송업체
+
+	// Pagination
+	private TscPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
+
+	// 결과
+	private String apiProductId;				// 주문상세번호
+	private String apiResult;					// 결과플래그 (true or false)
+	private String apiMessage;					// 결과
+
+
+}
+

+ 121 - 0
src/main/java/com/style24/persistence/domain/ShoplinkerOrder.java

@@ -0,0 +1,121 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+import com.style24.persistence.TscPageRequest;
+
+import lombok.Data;
+
+/**
+ * 샵링커 상품정보 Domain
+ *
+ * @author jmh
+ * @since 2021. 05. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class ShoplinkerOrder extends TscBaseDomain {
+
+	// Request
+	private String customerId; 					// 고객사 코드(샵링커 가입코드)
+	private String shoplinkerId;
+	private String orderFlag; 					// 주문타입 - 일반[신규OR발주]:000/ 발주확인:007/ 정산확정: 002/ 송장등록:003/ 송장전송완료:004
+	private String stDate;
+	private String edDate;
+	private Integer orderPageNo;
+	private String apiStDate;
+
+	// Response
+	private Integer orderIfIdx; 				// 주문수집차수
+	private String shoplinkerOrderId; 			// 샵링커 주문번호
+	private String mallOrderId; 				// 쇼핑몰 주문번호
+	private String mallName; 					// 쇼핑몰 명
+	private String baesongStatus; 				// 배송상태[발주확인]
+	private String orderName; 					// 주문자명
+	private String orderTel; 					// 주문자 전화번호
+	private String orderCel; 					// 주문자 핸드폰번호
+	private String orderEmail; 					// 주문자 이메일주소
+	private String receive; 					// 수취인명
+	private String receiveTel; 					// 수취인 전화번호
+	private String receiveCel; 					// 수취인 핸드폰번호
+	private String receiveZipcode; 				// 수취인 우편번호
+	private String receiveAddr; 				// 수취인 주소
+	private String baesongType; 				// 배송비결제방식[무료,착불,착불 선결제]
+	private String baesongBi; 					// 배송비
+	private String deliveryMsg; 				// 배송메세지
+	private String orderProductId; 				// 주문 상품번호
+	private String shoplinkerProductId; 		// 샵링커 상품번호
+	private String partnerProductId; 			// 자사 상품코드
+	private String productName; 				// 상품명
+	private String quantity; 					// 주문수량
+	private String orderPrice; 					// 주문금액
+	private String salePrice; 					// 판매단가
+	private String supplyPrice; 				// 공급가
+	private String sku; 						// 옵션명
+	private String orderdate; 					// 주문일자
+	private String orderRegDate; 				// 주문수집일자
+	private String deliveryInvoice; 			// 송장번호
+	private String orderSeq; 					// 묶음주문번호
+	private String totalCount; 					// 총 주문건수
+	private String totalPage; 					// 총 페이지수
+	private String totalStandardCount; 			// 페이지당 노출할 총 갯수
+	private String currentlyPage; 				// 현재 호출된 페이지번호
+	private String currentlyCount; 				// 현재 호출된 주문건수
+	private String sellerId; 					// 쇼핑몰 계정
+	private String onlySku; 					// 필수옵션
+	private String addSku; 						// 추가옵션
+	private String mallId; 						// 샵링커 쇼핑몰 코드
+	private String disPriceMall; 				// 쇼핑몰부담할인액
+	private String disPriceSeller; 				// 판매자부담할인액
+	private String disPriceCoupon; 				// 쿠폰할인액
+	private String disPricePoint; 				// 포인트할인액
+	private String distributionDelivery; 		// 물류배송여부
+	private String skuMatchCode; 				// 옵션매칭코드
+	private String skuBarcode; 					// 옵션바코드
+	private String orderCustomsNumber; 			// 개인고유통관번호
+	private String orderInputType; 				// 주문서 타입
+	private String supplyId; 					// 매입처 아이디
+	private String delivery; 					// 택배사 코드
+	private String orderUserId; 				// 구매자 계정
+	private String crspikUse; 					// 크로스픽 주문
+	private String shipNo; 						// 배송번호
+	private String dealNo; 						// 딜 번호
+	private String exchangeOrderYn; 			// 교환접수 여부
+	private String orderMainKey; 				// 추가상품(인터파크,11번가)
+	private String panType; 					// 네이버페이결제수단
+	private String channelType; 				// 채널구분
+	private String shipRsvDate; 				// 배송예정일
+
+	private String profiles;
+	private String xmlPath;
+	private String domainUrl;					// 이미지 domain url
+	private String apiSubUrl;					// api url 하위 경로
+
+	private String vendorId;
+	private String extmallId;
+	private String extmallNm;
+	private String dtGb;						// 일자검색타입
+	private String uploadStat; 					// 외부몰 주문등록 업로드 상태
+	private String uploadFailCd;				// 외부몰 주문등록 업로드 실패코드
+	private String uploadFailReason;			// 외부몰 주문등록 업로드 실패사유 msg
+	private Integer ordNo;						// 주문번호(주문)
+	private Integer delvAddrSq;					// 배송지일련번호(배송지)
+	private String goodsCd;
+	private String optCd;
+
+	// 검색
+	private int startRow;
+	private int endRow;
+
+	// Pagination
+	private TscPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
+
+	private String sid;
+
+	public ShoplinkerOrder() {
+
+	}
+
+}

+ 103 - 0
src/main/java/com/style24/persistence/domain/ShoplinkerSearch.java

@@ -0,0 +1,103 @@
+package com.style24.persistence.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+import com.style24.persistence.TscPageRequest;
+
+import lombok.Data;
+
+/**
+ * 상품 검색 Domain
+ *
+ * @author jmh
+ * @since 2021. 05. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class ShoplinkerSearch extends TscBaseDomain {
+
+	private int startRow;
+	private int endRow;
+	private String search; // 키워드 종류
+	private String condition; // 키워드 종류별 값
+	private String supplyCompCd;
+	private String brandGrpNm;
+	private String brandCd;
+
+	private String stDate;
+	private String edDate;
+
+	private String regSuccYn;
+	private String searchGb;
+	private String callBackFun;
+	private String applyStdt;
+	private String applyEddt;
+	private String goodsCd;
+	private String goodsNum;
+	private String goodsNm;
+	private String inoutGb;
+	private String applyFlag;
+	private String barcode;
+	private String dateGbn;
+	private String goodsTnmRes;
+	private String searchBrandCd;
+	private String brandList;
+	private String supplyCompList;
+	private String searchTxt;
+
+	private String regNm;
+	private String apiType;
+	private String apiResult;
+	private String apiStDate;
+
+	private Integer remainExtCnt;		// 주문수집시-제휴몰주문업로드 남은수
+	private Integer remainStyleCnt;		// 주문수집시-스타일24주문업로드 남은수
+
+	//@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	//private String[] siteCd;
+
+	/* 상품목록 Multi CheckBox 항목*/
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiBrand;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiItemkindCd;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiGoodsStat;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiStyleYear;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiSeasonCd;
+	/* 상품목록 Multi CheckBox 항목*/
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] conditionList;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrGoodsCd;
+
+	/* 다다익선 Multi 추가 */
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiSupplyCompCd;
+
+	private String pageingYn;
+
+	/* 다다익선 Multi 추가 */
+
+	// Pagination
+	private TscPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
+
+	// api 호출 가능여부 확인
+	private String sid;
+	private String runStdt;
+	private String runEddt;
+	private String runStat;
+	private Integer runCnt;	// 현재 실행중인건수
+	private String txt;
+}

+ 48 - 0
src/main/java/com/style24/persistence/domain/ShoplinkerStock.java

@@ -0,0 +1,48 @@
+package com.style24.persistence.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품옵션
+ *
+ * @author jmh
+ * @since 2021. 05. 11
+ */
+@SuppressWarnings("serial")
+@Data
+public class ShoplinkerStock extends TscBaseDomain {
+	// 재고 정보
+	private Integer productNo;		// ProductNo(WMS)
+	private String goodsCd;			// 상품번호
+	private String optCd;			// 옵션코드
+	private String optCd1;			// 옵션코드1(자사 : 컬러, 입점 : 옵션명1)
+	private String optCd2;			// 옵션코드1(자사 : 사이즈, 입점 : 옵션명2)
+	private String skuModelNo;		// SKUModelNo(WMS)
+	private String productCode;		// ProductCode(WMS)
+	private String soldoutYn;		// 품절여부
+	private int currStockQty;		// 가용재고
+	private int addPrice;			// 추가금액
+	private int dispOrd;			// 표시순서
+	private String colorNm;			// 컬러명
+	private String itemCd;			// 구성상품코드
+	private String goodsType;		// 상품구분
+	private String sysImgNm;		// 상품이미지 명
+	private int goodsQty;			// 안전재고
+	private int stockQty;			// 상품 재고
+	private String selfGoodsYn;		// 자사상품구분
+	private String optNm;			// 옵션명
+	private String goodsStat;		// 상품상태
+	private int minOrdQty;
+	private int maxOrdQty;
+	private int currPrice;
+	private String optCd1Nm;		// 옵션1칼라명(입점은 옵션명)
+	private String dispYn;			// 노출 여부
+	private int qty;				// 구성상품의 기본 수량
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrGoodsOption;
+
+}

+ 112 - 89
src/main/java/com/style24/persistence/mybatis/shop/TscOrder.xml

@@ -1328,7 +1328,9 @@
 			 , OPT_ADD_PRICE
 			 , DISP_ORD
 			 , ORD_AMT
+			 , ORD_QTY
 			 , CNCL_RTN_AMT
+			 , CNCL_RTN_QTY
 			 , CPN1_DC_AMT
 			 , TMTB1_DC_AMT
 			 , TMTB2_DC_AMT
@@ -1344,39 +1346,43 @@
 			 , UPD_NO
 			 , UPD_DT
 		)
-		SELECT ORD_DTL_ITEM_SQ
-			 , ORD_DTL_NO
-			 , ORD_NO
+		SELECT ODI.ORD_DTL_ITEM_SQ
+			 , ODI.ORD_DTL_NO
+			 , ODI.ORD_NO
 			 , #{ordDtlStat}
-			 , ITEM_CD
-			 , OPT_CD
-			 , OPT_CD1
-			 , OPT_CD2
-			 , SKU_MODEL_NO
-			 , PRODUCT_NO
-			 , PRODUCT_CODE
-			 , ITEM_QTY
-			 , ITEM_PRICE
-			 , OPT_ADD_PRICE
-			 , DISP_ORD
-			 , ORD_AMT
-			 , CNCL_RTN_AMT
-			 , CPN1_DC_AMT
-			 , TMTB1_DC_AMT
-			 , TMTB2_DC_AMT
-			 , GOODS_CPN_DC_AMT
-			 , CART_CPN_DC_AMT
-			 , PNT_DC_AMT
-			 , PRE_PNT_DC_AMT
-			 , SAVE_PNT_AMT
-			 , REAL_ORD_AMT
-			 , GFCD_USE_AMT
+			 , ODI.ITEM_CD
+			 , ODI.OPT_CD
+			 , ODI.OPT_CD1
+			 , ODI.OPT_CD2
+			 , ODI.SKU_MODEL_NO
+			 , ODI.PRODUCT_NO
+			 , ODI.PRODUCT_CODE
+			 , ODI.ITEM_QTY
+			 , ODI.ITEM_PRICE
+			 , ODI.OPT_ADD_PRICE
+			 , ODI.DISP_ORD
+			 , ODI.ORD_AMT
+			 , OD.ORD_QTY
+			 , ODI.CNCL_RTN_AMT
+			 , OD.CNCL_RTN_QTY
+			 , ODI.CPN1_DC_AMT
+			 , ODI.TMTB1_DC_AMT
+			 , ODI.TMTB2_DC_AMT
+			 , ODI.GOODS_CPN_DC_AMT
+			 , ODI.CART_CPN_DC_AMT
+			 , ODI.PNT_DC_AMT
+			 , ODI.PRE_PNT_DC_AMT
+			 , ODI.SAVE_PNT_AMT
+			 , ODI.REAL_ORD_AMT
+			 , ODI.GFCD_USE_AMT
 			 , #{regNo}
 			 , NOW()
 			 , #{updNo}
 			 , NOW()
-		FROM TB_ORDER_DETAIL_ITEM
-		WHERE ORD_DTL_NO = #{ordDtlNo}
+		FROM   TB_ORDER_DETAIL_ITEM ODI
+		INNER  JOIN TB_ORDER_DETAIL OD
+		ON     ODI.ORD_DTL_NO = OD.ORD_DTL_NO
+		WHERE  ODI.ORD_DTL_NO = #{ordDtlNo}
 	</insert>
 
 	<!-- 주문상세 > 주문메오 > 주문메모정보조회 -->
@@ -3194,7 +3200,9 @@
 		     , OPT_ADD_PRICE
 		     , DISP_ORD
 		     , ORD_AMT
+		     , ORD_QTY
 		     , CNCL_RTN_AMT
+		     , CNCL_RTN_QTY
 		     , CPN1_DC_AMT
 		     , TMTB1_DC_AMT
 		     , TMTB2_DC_AMT
@@ -3210,40 +3218,44 @@
 		     , UPD_NO
 		     , UPD_DT
 		)
-		SELECT ORD_DTL_ITEM_SQ
-		     , ORD_DTL_NO
-		     , ORD_NO
-		     , ORD_DTL_STAT
-		     , ITEM_CD
-		     , OPT_CD
-		     , OPT_CD1
-		     , OPT_CD2
-		     , SKU_MODEL_NO
-		     , PRODUCT_NO
-		     , PRODUCT_CODE
-		     , ITEM_QTY
-		     , ITEM_PRICE
-		     , OPT_ADD_PRICE
-		     , DISP_ORD
-		     , ORD_AMT
-		     , CNCL_RTN_AMT
-		     , CPN1_DC_AMT
-		     , TMTB1_DC_AMT
-		     , TMTB2_DC_AMT
-		     , GOODS_CPN_DC_AMT
-		     , CART_CPN_DC_AMT
-		     , PNT_DC_AMT
-		     , PRE_PNT_DC_AMT
-		     , SAVE_PNT_AMT
-		     , REAL_ORD_AMT
-		     , GFCD_USE_AMT
-		     , REG_NO
+		SELECT ODI.ORD_DTL_ITEM_SQ
+		     , ODI.ORD_DTL_NO
+		     , ODI.ORD_NO
+		     , #{ordDtlStat}
+		     , ODI.ITEM_CD
+		     , ODI.OPT_CD
+		     , ODI.OPT_CD1
+		     , ODI.OPT_CD2
+		     , ODI.SKU_MODEL_NO
+		     , ODI.PRODUCT_NO
+		     , ODI.PRODUCT_CODE
+		     , ODI.ITEM_QTY
+		     , ODI.ITEM_PRICE
+		     , ODI.OPT_ADD_PRICE
+		     , ODI.DISP_ORD
+		     , ODI.ORD_AMT
+		     , OD.ORD_QTY
+		     , ODI.CNCL_RTN_AMT
+		     , OD.CNCL_RTN_QTY
+		     , ODI.CPN1_DC_AMT
+		     , ODI.TMTB1_DC_AMT
+		     , ODI.TMTB2_DC_AMT
+		     , ODI.GOODS_CPN_DC_AMT
+		     , ODI.CART_CPN_DC_AMT
+		     , ODI.PNT_DC_AMT
+		     , ODI.PRE_PNT_DC_AMT
+		     , ODI.SAVE_PNT_AMT
+		     , ODI.REAL_ORD_AMT
+		     , ODI.GFCD_USE_AMT
+		     , ODI.REG_NO
 		     , NOW()
-		     , UPD_NO
+		     , ODI.UPD_NO
 		     , NOW()
-		  FROM TB_ORDER_DETAIL_ITEM
+		  FROM TB_ORDER_DETAIL_ITEM ODI
+		 INNER JOIN TB_ORDER_DETAIL OD
+		    ON ODI.ORD_DTL_NO = OD.ORD_DTL_NO
 		 WHERE 1=1
-		   AND ORD_DTL_ITEM_SQ = #{ordDtlItemSq}
+		   AND ODI.ORD_DTL_ITEM_SQ = #{ordDtlItemSq}
 	</insert>
 	
 	<!-- 8. 주문사은품 마스터 정보 등록 -->
@@ -3563,7 +3575,7 @@
 	
 	<!-- 33.1 주문상세단품전체 이력정보 등록 -->
 	<insert id="createOrderDetailItemAllHst" parameterType="Order">
-		/* TscOrder.createOrderDetailItemHst */
+		/* TscOrder.createOrderDetailItemAllHst */
 		INSERT INTO TB_ORDER_DETAIL_ITEM_HST (
 		       ORD_DTL_ITEM_SQ
 		     , ORD_DTL_NO
@@ -3581,7 +3593,9 @@
 		     , OPT_ADD_PRICE
 		     , DISP_ORD
 		     , ORD_AMT
+		     , ORD_QTY
 		     , CNCL_RTN_AMT
+		     , CNCL_RTN_QTY
 		     , CPN1_DC_AMT
 		     , TMTB1_DC_AMT
 		     , TMTB2_DC_AMT
@@ -3597,40 +3611,44 @@
 		     , UPD_NO
 		     , UPD_DT
 		)
-		SELECT ORD_DTL_ITEM_SQ
-		     , ORD_DTL_NO
-		     , ORD_NO
-		     , ORD_DTL_STAT
-		     , ITEM_CD
-		     , OPT_CD
-		     , OPT_CD1
-		     , OPT_CD2
-		     , SKU_MODEL_NO
-		     , PRODUCT_NO
-		     , PRODUCT_CODE
-		     , ITEM_QTY
-		     , ITEM_PRICE
-		     , OPT_ADD_PRICE
-		     , DISP_ORD
-		     , ORD_AMT
-		     , CNCL_RTN_AMT
-		     , CPN1_DC_AMT
-		     , TMTB1_DC_AMT
-		     , TMTB2_DC_AMT
-		     , GOODS_CPN_DC_AMT
-		     , CART_CPN_DC_AMT
-		     , PNT_DC_AMT
-		     , PRE_PNT_DC_AMT
-		     , SAVE_PNT_AMT
-		     , REAL_ORD_AMT
-		     , GFCD_USE_AMT
+		SELECT ODI.ORD_DTL_ITEM_SQ
+		     , ODI.ORD_DTL_NO
+		     , ODI.ORD_NO
+		     , #{ordDtlStat}
+		     , ODI.ITEM_CD
+		     , ODI.OPT_CD
+		     , ODI.OPT_CD1
+		     , ODI.OPT_CD2
+		     , ODI.SKU_MODEL_NO
+		     , ODI.PRODUCT_NO
+		     , ODI.PRODUCT_CODE
+		     , ODI.ITEM_QTY
+		     , ODI.ITEM_PRICE
+		     , ODI.OPT_ADD_PRICE
+		     , ODI.DISP_ORD
+		     , ODI.ORD_AMT
+		     , OD.ORD_QTY
+		     , ODI.CNCL_RTN_AMT
+		     , OD.CNCL_RTN_QTY
+		     , ODI.CPN1_DC_AMT
+		     , ODI.TMTB1_DC_AMT
+		     , ODI.TMTB2_DC_AMT
+		     , ODI.GOODS_CPN_DC_AMT
+		     , ODI.CART_CPN_DC_AMT
+		     , ODI.PNT_DC_AMT
+		     , ODI.PRE_PNT_DC_AMT
+		     , ODI.SAVE_PNT_AMT
+		     , ODI.REAL_ORD_AMT
+		     , ODI.GFCD_USE_AMT
 		     , #{custNo}
 		     , NOW()
 		     , #{custNo}
 		     , NOW()
-		  FROM TB_ORDER_DETAIL_ITEM
+		  FROM TB_ORDER_DETAIL_ITEM ODI
+		 INNER JOIN TB_ORDER_DETAIL OD
+		    ON ODI.ORD_DTL_NO = OD.ORD_DTL_NO
 		 WHERE 1=1
-		   AND ORD_NO = #{ordNo}
+		   AND ODI.ORD_NO = #{ordNo}
 	</insert>
 	
 	<!-- 34. 재고정보등록 -->
@@ -3887,6 +3905,7 @@
 		     , A.DELV_FEE_CD_GRP
 		     , A.DELV_FEE_CD_GRP_SORT
 		     , A.SUPPLY_COMP_CD
+		     , A.SUPPLY_COMP_NM
 		     , A.DELV_FEE_CD
 		     , A.SELF_GOODS_YN
 		     , SUM(A.OPT_ADD_PRICE) AS OPT_ADD_PRICE
@@ -3947,6 +3966,9 @@
 		         , OD.DELV_ADDR_SQ
 		         , OD.GIFT_PACK_YN
 		         , OD.SUPPLY_COMP_CD
+		         , (SELECT SUPPLY_COMP_NM
+		            FROM   TB_SUPPLY_COMPANY SC
+		            WHERE  SC.SUPPLY_COMP_CD = OD.SUPPLY_COMP_CD) AS SUPPLY_COMP_NM
 		         , OD.DELV_FEE_CD
 		         , G1.SELF_GOODS_YN
 		    FROM   TB_ORDER_DETAIL OD
@@ -3982,6 +4004,7 @@
 		     , A.DELV_FEE_CD_GRP
 		     , A.DELV_FEE_CD_GRP_SORT
 		     , A.SUPPLY_COMP_CD
+		     , A.SUPPLY_COMP_NM
 		     , A.SYS_IMG_NM
 		     , A.DELV_FEE_CD
 		     , A.SELF_GOODS_YN

+ 74 - 56
src/main/java/com/style24/persistence/mybatis/shop/TscOrderChange.xml

@@ -527,7 +527,9 @@
 		     , OPT_ADD_PRICE
 		     , DISP_ORD
 		     , ORD_AMT
+		     , ORD_QTY
 		     , CNCL_RTN_AMT
+		     , CNCL_RTN_QTY
 		     , CPN1_DC_AMT
 		     , TMTB1_DC_AMT
 		     , TMTB2_DC_AMT
@@ -538,43 +540,49 @@
 		     , SAVE_PNT_AMT
 		     , REAL_ORD_AMT
 		     , GFCD_USE_AMT
+		     , ORD_CHG_SQ
 		     , REG_NO
 		     , REG_DT
 		     , UPD_NO
 		     , UPD_DT
 		)
-		SELECT ORD_DTL_ITEM_SQ
-		     , ORD_DTL_NO
-		     , ORD_NO
+		SELECT ODI.ORD_DTL_ITEM_SQ
+		     , ODI.ORD_DTL_NO
+		     , ODI.ORD_NO
 		     , #{ordDtlStat}
-		     , ITEM_CD
-		     , OPT_CD
-		     , OPT_CD1
-		     , OPT_CD2
-		     , SKU_MODEL_NO
-		     , PRODUCT_NO
-		     , PRODUCT_CODE
-		     , ITEM_QTY
-		     , ITEM_PRICE
-		     , OPT_ADD_PRICE
-		     , DISP_ORD
-		     , ORD_AMT
-		     , CNCL_RTN_AMT
-		     , CPN1_DC_AMT
-		     , TMTB1_DC_AMT
-		     , TMTB2_DC_AMT
-		     , GOODS_CPN_DC_AMT
-		     , CART_CPN_DC_AMT
-		     , PNT_DC_AMT
-		     , PRE_PNT_DC_AMT
-		     , SAVE_PNT_AMT
-		     , REAL_ORD_AMT
-		     , GFCD_USE_AMT
+		     , ODI.ITEM_CD
+		     , ODI.OPT_CD
+		     , ODI.OPT_CD1
+		     , ODI.OPT_CD2
+		     , ODI.SKU_MODEL_NO
+		     , ODI.PRODUCT_NO
+		     , ODI.PRODUCT_CODE
+		     , ODI.ITEM_QTY
+		     , ODI.ITEM_PRICE
+		     , ODI.OPT_ADD_PRICE
+		     , ODI.DISP_ORD
+		     , ODI.ORD_AMT
+		     , OD.ORD_QTY
+		     , #{cnclRtnAmt}
+		     , #{cnclRtnQty}
+		     , #{cpn1DcAmt}
+		     , #{tmtb1DcAmt}
+		     , #{tmtb2DcAmt}
+		     , #{goodsCpnDcAmt}
+		     , #{cartCpnDcAmt}
+		     , #{pntDcAmt}
+		     , #{prePntDcAmt}
+		     , #{savePntAmt}
+		     , #{realOrdAmt}
+		     , #{gfcdUseAmt}
+		     , #{ordChgSq}
 		     , #{regNo}
 		     , NOW()
 		     , #{updNo}
 		     , NOW()
-		  FROM TB_ORDER_DETAIL_ITEM
+		  FROM TB_ORDER_DETAIL_ITEM ODI
+		 INNER JOIN TB_ORDER_DETAIL OD
+		    ON OD.ORD_DTL_NO = ODI.ORD_DTL_NO
 		 WHERE ORD_DTL_ITEM_SQ = #{ordDtlItemSq}
 	</insert>
 	
@@ -1760,7 +1768,9 @@
 		     , OPT_ADD_PRICE
 		     , DISP_ORD
 		     , ORD_AMT
+		     , ORD_QTY
 		     , CNCL_RTN_AMT
+		     , CNCL_RTN_QTY
 		     , CPN1_DC_AMT
 		     , TMTB1_DC_AMT
 		     , TMTB2_DC_AMT
@@ -2089,7 +2099,9 @@
 		     , OPT_ADD_PRICE
 		     , DISP_ORD
 		     , ORD_AMT
+		     , ORD_QTY
 		     , CNCL_RTN_AMT
+		     , CNCL_RTN_QTY
 		     , CPN1_DC_AMT
 		     , TMTB1_DC_AMT
 		     , TMTB2_DC_AMT
@@ -2361,7 +2373,9 @@
 		     , OPT_ADD_PRICE
 		     , DISP_ORD
 		     , ORD_AMT
+		     , ORD_QTY
 		     , CNCL_RTN_AMT
+		     , CNCL_RTN_QTY
 		     , CPN1_DC_AMT
 		     , TMTB1_DC_AMT
 		     , TMTB2_DC_AMT
@@ -2377,39 +2391,43 @@
 		     , UPD_NO
 		     , UPD_DT
 		)
-		SELECT ORD_DTL_ITEM_SQ
-		     , ORD_DTL_NO
-		     , ORD_NO
-		     , #{ordDtlStat}
-		     , ITEM_CD
-		     , OPT_CD
-		     , OPT_CD1
-		     , OPT_CD2
-		     , SKU_MODEL_NO
-		     , PRODUCT_NO
-		     , PRODUCT_CODE
-		     , ITEM_QTY
-		     , ITEM_PRICE
-		     , OPT_ADD_PRICE
-		     , DISP_ORD
-		     , ORD_AMT
-		     , ORD_AMT
-		     , 0
-		     , 0
-		     , 0
-		     , 0
-		     , 0
-		     , 0
-		     , 0
-		     , 0
-		     , 0
-		     , 0
+		SELECT ODI.ORD_DTL_ITEM_SQ
+		     , ODI.ORD_DTL_NO
+		     , ODI.ORD_NO
+		     , 'G720_30'
+		     , ODI.ITEM_CD
+		     , ODI.OPT_CD
+		     , ODI.OPT_CD1
+		     , ODI.OPT_CD2
+		     , ODI.SKU_MODEL_NO
+		     , ODI.PRODUCT_NO
+		     , ODI.PRODUCT_CODE
+		     , ODI.ITEM_QTY
+		     , ODI.ITEM_PRICE
+		     , ODI.OPT_ADD_PRICE
+		     , ODI.DISP_ORD
+		     , ODI.ORD_AMT
+		     , OD.ORD_QTY
+		     , ODI.CNCL_RTN_AMT
+		     , OD.CNCL_RTN_QTY
+		     , ODI.CPN1_DC_AMT
+		     , ODI.TMTB1_DC_AMT
+		     , ODI.TMTB2_DC_AMT
+		     , ODI.GOODS_CPN_DC_AMT
+		     , ODI.CART_CPN_DC_AMT
+		     , ODI.PNT_DC_AMT
+		     , ODI.PRE_PNT_DC_AMT
+		     , ODI.SAVE_PNT_AMT
+		     , ODI.REAL_ORD_AMT
+		     , ODI.GFCD_USE_AMT
 		     , #{regNo}
 		     , NOW()
 		     , #{updNo}
 		     , NOW()
-		  FROM TB_ORDER_DETAIL_ITEM
-		 WHERE ORD_NO = #{ordNo}
+		  FROM TB_ORDER_DETAIL_ITEM ODI
+		 INNER JOIN TB_ORDER_DETAIL OD
+		    ON ODI.ORD_DTL_NO = OD.ORD_DTL_NO
+		 WHERE ODI.ORD_NO = #{ordNo}
 	</insert>
 
 	<!-- 마이페이지 포인트 원복 사용포인트 조회 -->

+ 1570 - 0
src/main/java/com/style24/persistence/mybatis/shop/TscOrderOcm.xml

@@ -0,0 +1,1570 @@
+<?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.core.biz.dao.TscOrderOcmDao">
+
+	<!-- 제휴몰주문등록 - 주문업로드 그룹별 목록 -->
+	<select id="getExtmallMasterOrderList" parameterType="ExtmallOrder" resultType="ExtmallOrder">
+	/* TsaOcm.getExtmallMasterOrderList */
+		SELECT
+			A.VENDOR_ID, A.EXTMALL_ID, A.EXTMALL_ORDER_ID
+			, IFNULL(A.ORD_NM, '') AS ORD_NM
+			, IFNULL(A.ORD_PHNNO, '') AS ORD_PHNNO
+			, IFNULL(A.ORD_TELNO, '') AS ORD_TELNO
+			, IFNULL(A.ORD_EMAIL, '') AS ORD_EMAIL
+			, IFNULL(A.DELV_MEMO, '') AS DELV_MEMO
+			, IFNULL(A.RECIP_NM, '') AS RECIP_NM
+			, IFNULL(A.RECIP_PHNNO, '') AS RECIP_PHNNO
+			, IFNULL(A.RECIP_TELNO, '') AS RECIP_TELNO
+			, IFNULL(A.RECIP_ZIPCODE, '') AS RECIP_ZIPCODE
+			, IFNULL(A.RECIP_BASE_ADDR, '') AS RECIP_BASE_ADDR
+			, IFNULL(A.RECIP_DTL_ADDR, '') AS RECIP_DTL_ADDR
+			, SUM(A.DELV_FEE) AS DELV_FEE
+			, SUM(A.ORD_AMT) AS REAL_ORD_SUM_AMT
+			, (SELECT CNCLSMS_SEND_YN FROM TB_EXTMALL S WHERE S.VENDOR_ID = A.VENDOR_ID
+				AND S.EXTMALL_ID = A.EXTMALL_ID AND S.USE_YN = 'Y') AS CNCLSMS_SEND_YN
+		FROM TB_EXTMALL_ORDER_UPLOAD A
+		WHERE A.UPLOAD_STAT = 'G021_00'
+		AND RECIP_BASE_ADDR IS NOT NULL AND RECIP_BASE_ADDR != ''
+		AND A.UPLOAD_GB = #{uploadGb}
+		<if test="regNo != null and regNo != ''">
+	      AND A.REG_NO = #{regNo}
+	    </if>
+		GROUP BY A.VENDOR_ID, A.EXTMALL_ID, A.EXTMALL_ORDER_ID, A.ORD_NM, A.ORD_PHNNO, A.ORD_TELNO, A.ORD_EMAIL, A.DELV_MEMO
+				 , A.RECIP_NM, A.RECIP_PHNNO, A.RECIP_TELNO, A.RECIP_ZIPCODE, A.RECIP_BASE_ADDR, A.RECIP_DTL_ADDR
+		ORDER BY A.VENDOR_ID, A.EXTMALL_ID, A.EXTMALL_ORDER_ID
+	</select>
+
+	<!-- 제휴몰주문등록 - 주문업로드 전체 목록 -->
+	<select id="getExtmallOrderList" parameterType="ExtmallOrder" resultType="ExtmallOrder">
+	/* TsaOcm.getExtmallOrderList */
+		SELECT
+			 B.GOODS_NM
+			, B.SUPPLY_COMP_CD -- 공급업체코드
+			, B.DELV_FEE_CD -- 배송비정책코드
+			, A.VENDOR_ID
+			, A.EXTMALL_ID
+			, (SELECT S.EXTMALL_NM FROM TB_EXTMALL S WHERE S.USE_YN = 'Y' AND S.EXTMALL_ID = A.EXTMALL_ID) AS EXTMALL_NM
+			, A.AGENT_ORDER_ID
+			, A.EXTMALL_ORDER_ID
+			, A.EXTMALL_PROD_ID
+			, A.EXTMALL_PROD_NM
+			, A.GOODS_CD
+			, A.SKU
+			, A.CURR_PRICE
+			, A.ORD_QTY
+			, A.ORD_AMT
+			, A.CPN_DC_AMT
+			, A.PNT_DC_AMT
+			, A.DELV_FEE
+			, A.ORD_RECV_DT
+			, A.ORD_DT
+			, IFNULL(A.ORD_NM, '') AS ORD_NM
+			, IFNULL(A.ORD_PHNNO, '') AS ORD_PHNNO
+			, A.ORD_TELNO
+			, A.ORD_EMAIL
+			, IFNULL(A.RECIP_NM, '') AS RECIP_NM
+			, IFNULL(A.RECIP_PHNNO, '') AS RECIP_PHNNO
+			, A.RECIP_TELNO
+			, A.RECIP_ZIPCODE
+			, IFNULL(A.RECIP_BASE_ADDR, '') AS RECIP_BASE_ADDR
+			, IFNULL(A.RECIP_DTL_ADDR, '') AS RECIP_DTL_ADDR
+			, A.DELV_MEMO
+			, A.UPLOAD_STAT
+			, A.UPLOAD_FAIL_CD
+			, A.UPLOAD_FAIL_REASON
+			, A.ORD_NO
+			, A.DELV_ADDR_SQ
+			, A.OPT_CD
+			, A.UPLOAD_GB
+			, A.REG_NO
+			, A.REG_DT
+		FROM TB_EXTMALL_ORDER_UPLOAD A
+			LEFT OUTER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
+		WHERE 1=1
+		AND RECIP_BASE_ADDR IS NOT NULL AND RECIP_BASE_ADDR != ''
+		AND A.UPLOAD_GB = #{uploadGb}
+		<if test="regNo != null and regNo != ''">
+	      AND A.REG_NO = #{regNo}
+	    </if>
+		<if test="uploadStat != null and uploadStat != ''">
+	      AND A.UPLOAD_STAT = #{uploadStat}
+	    </if>
+
+		<if test="stDate != null and stDate != ''">
+	      AND A.REG_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+        </if>
+	    <if test="edDate != null and edDate != ''">
+	      <![CDATA[
+	        AND A.REG_DT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+	      ]]>
+	    </if>
+		order by A.VENDOR_ID, A.EXTMALL_ID, A.EXTMALL_ORDER_ID, A.AGENT_ORDER_ID
+	</select>
+
+	<!-- 제휴몰주문등록 - 주문등록  -->
+	<insert id="insertExtmallOrder" parameterType="ExtmallOrder">
+	/* TsaOcm.insertExtmallOrder */
+		INSERT INTO TB_EXTMALL_ORDER_UPLOAD
+		(
+			VENDOR_ID
+			, EXTMALL_ID
+			, EXTMALL_NM
+			, AGENT_ORDER_ID
+			, EXTMALL_ORDER_ID
+			, EXTMALL_PROD_ID
+			, EXTMALL_PROD_NM
+			, GOODS_CD
+			, SKU
+			, CURR_PRICE
+			, ORD_QTY
+			, ORD_AMT
+			, CPN_DC_AMT
+			, PNT_DC_AMT
+			, DELV_FEE
+			, ORD_RECV_DT
+			, ORD_DT
+			, ORD_NM
+			, ORD_PHNNO
+			, ORD_TELNO
+			, ORD_EMAIL
+			, RECIP_NM
+			, RECIP_PHNNO
+			, RECIP_TELNO
+			, RECIP_ZIPCODE
+			, RECIP_BASE_ADDR
+			, RECIP_DTL_ADDR
+			, DELV_MEMO
+			, UPLOAD_STAT
+			, UPLOAD_FAIL_CD
+			, UPLOAD_FAIL_REASON
+			, ORD_NO
+			, DELV_ADDR_SQ
+			, OPT_CD
+			, UPLOAD_GB
+			, REG_NO
+			, REG_DT
+		)
+		SELECT
+			#{vendorId}
+			, #{extmallId}
+			, #{extmallNm}
+			, #{agentOrderId}
+			, #{extmallOrderId}
+			, #{extmallProdId}
+			, #{extmallProdNm}
+			, #{goodsCd}
+			, #{sku}
+			, IFNULL(#{currPrice}, 0)
+			, IFNULL(#{ordQty}, 0)
+			, IFNULL(#{ordAmt}, 0)
+			, IFNULL(#{cpnDcAmt}, 0)
+			, IFNULL(#{pntDcAmt}, 0)
+			, IFNULL(#{delvFee}, 0)
+			, STR_TO_DATE(#{ordRecvDt}, '%Y%m%d%H%i%s')
+			, STR_TO_DATE(#{ordDt}, '%Y%m%d%H%i%s')
+			, IFNULL(#{ordNm}, #{recipNm})
+			, IFNULL(#{ordPhnno}, #{recipPhnno})
+			, IFNULL(#{ordTelno}, #{recipTelno})
+			, #{ordEmail}
+			, #{recipNm}
+			, #{recipPhnno}
+			, #{recipTelno}
+			, replace(#{recipZipcode}, '-', '')
+			, #{recipBaseAddr}
+			, #{recipDtlAddr}
+			, #{delvMemo}
+			, #{uploadStat}
+			, #{uploadFailCd}
+			, #{uploadFailReason}
+			, #{ordNo}
+			, #{delvAddrSq}
+			, #{optCd}
+			, #{uploadGb}
+			, #{regNo}
+			, now()
+		FROM DUAL
+		WHERE NOT EXISTS(
+				SELECT 1 FROM TB_EXTMALL_ORDER_UPLOAD
+				WHERE VENDOR_ID = #{vendorId}
+				AND EXTMALL_ID = #{extmallId}
+				AND AGENT_ORDER_ID = #{agentOrderId}
+				AND EXTMALL_ORDER_ID = #{extmallOrderId}
+				AND UPLOAD_GB = #{uploadGb}
+			  )
+	</insert>
+
+	<!-- 제휴몰주문등록 - 주문등록 상태값 업데이트 -->
+	<update id="updateExtmallOrder" parameterType="ExtmallOrder">
+	/* TsaOcm.updateExtmallOrder */
+		UPDATE TB_EXTMALL_ORDER_UPLOAD
+		SET
+			ORD_NO = #{ordNo}
+			, DELV_ADDR_SQ = #{delvAddrSq}
+			, UPLOAD_STAT = #{uploadStat}
+			, UPLOAD_FAIL_CD = #{uploadFailCd}
+			, UPLOAD_FAIL_REASON = #{uploadFailReason}
+
+		WHERE VENDOR_ID = #{vendorId}
+		AND EXTMALL_ID = #{extmallId}
+		AND AGENT_ORDER_ID = #{agentOrderId}
+		AND EXTMALL_ORDER_ID = #{extmallOrderId}
+		AND UPLOAD_STAT != 'G021_30'
+
+	</update>
+
+	<!-- 제휴몰주문등록 - 주문등록 체크 -->
+	<select id="getExtmallOrderInfo" parameterType="ExtmallOrder" resultType="ExtmallOrder">
+	/* TsaOcm.getExtmallOrderInfo */
+		SELECT
+			 A.AGENT_ORDER_ID
+			, A.EXTMALL_ORDER_ID
+			, B.EXTMALL_ID
+			, GS.GOODS_CD
+			, GS.GOODS_NM
+			, GS.GOODS_STAT
+			, GS.CURR_PRICE
+			, GS.LIST_PRICE
+			, GS.PNT_PRATE
+			, OP.OPT_CD
+			, OP.SOLDOUT_YN
+			, (SELECT MAX(ORD_NO) FROM TB_ORDER_DETAIL OD WHERE A.VENDOR_ID = OD.VENDOR_ID AND A.EXTMALL_ID = OD.EXTMALL_ID
+				AND A.AGENT_ORDER_ID = OD.AGENT_ORDER_ID AND A.EXTMALL_ORDER_ID = OD.EXTMALL_ORDER_ID) AS ORD_NO
+			, (SELECT COUNT(UPLOAD_STAT) FROM TB_EXTMALL_ORDER_UPLOAD S WHERE A.VENDOR_ID = S.VENDOR_ID
+				AND A.EXTMALL_ID = S.EXTMALL_ID AND A.AGENT_ORDER_ID = S.AGENT_ORDER_ID AND A.EXTMALL_ORDER_ID = S.EXTMALL_ORDER_ID
+				AND S.UPLOAD_STAT = 'G021_40' AND UPLOAD_FAIL_CD = 'G022_60') AS STOCK_FAIL_HST_CNT
+		FROM TB_EXTMALL_ORDER_UPLOAD A
+			LEFT OUTER JOIN TB_EXTMALL B ON A.EXTMALL_ID = B.EXTMALL_ID AND B.USE_YN = 'Y'
+			LEFT OUTER JOIN TB_GOODS GS ON A.GOODS_CD = GS.GOODS_CD
+			LEFT OUTER JOIN TB_OPTION OP ON A.OPT_CD = OP.OPT_CD
+		WHERE A.VENDOR_ID = #{vendorId}
+		AND A.EXTMALL_ID = #{extmallId}
+		AND A.AGENT_ORDER_ID = #{agentOrderId}
+		AND A.EXTMALL_ORDER_ID = #{extmallOrderId}
+		AND A.UPLOAD_GB = #{uploadGb}
+		ORDER BY A.REG_DT DESC
+		LIMIT 1
+	</select>
+
+
+
+<!--***** 주문정보등록 **************************************************************** -->
+<!--***** 주문정보등록 **************************************************************** -->
+	<!-- 1. 주문기본정보등록 -->
+	<insert id="createOrder" parameterType="ExtmallOrder" keyProperty="ordNo">
+		/* TsaOrder.createOrder : 주문기본정보등록 */
+		INSERT INTO TB_ORDER (
+		    MALL_GB
+		    , ORD_DT
+		    , PAY_DT
+		    , CUST_NO
+		    , ORD_NM
+		    , ORD_PHNNO
+		    , ORD_TELNO
+		    , ORD_EMAIL
+		    , SITE_CD
+		    , NPAY_ORD_NO
+		    , FRONT_GB
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		) VALUES (
+		     'G011_20'
+		     , NOW()
+		     , NOW()
+		     , #{custNo}
+		     , #{custNm}
+		     , #{recipPhnno}
+		     , #{recipTelno}
+		     , #{email}
+		     , 'G000_10'
+		     , #{npayOrdNo}
+		     , 'P'
+		     , #{custNo}
+		     , NOW()
+		     , #{custNo}
+		     , NOW()
+		)
+	</insert>
+
+	<!-- 2. 주문배송주소정보등록-->
+	<insert id="createDeliveryAddr" parameterType="ExtmallOrder" keyProperty="delvAddrSq">
+		/* TsaOrder.createDeliveryAddr : 주문배송주소정보등록 */
+		INSERT INTO TB_DELIVERY_ADDR (
+		    RECIP_NM
+		    , RECIP_PHNNO
+		    , RECIP_TELNO
+		    , RECIP_ZIPCODE
+		    , RECIP_BASE_ADDR
+		    , RECIP_DTL_ADDR
+		    , DELV_MEMO
+		    , GIFT_MSG
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		) VALUES (
+		    #{recipNm}
+		    , #{recipPhnno}
+		    , #{recipTelno}
+		    , #{recipZipcode}
+		    , #{recipBaseAddr}
+		    , #{recipDtlAddr}
+		    , #{delvMemo}
+		    , #{giftMsg}
+		    , #{custNo}
+		    , NOW()
+		    , #{custNo}
+		    , NOW()
+		)
+	</insert>
+
+	<!-- 3. 주문배송비정보등록-->
+	<insert id="createDeliveryFee" parameterType="ExtmallOrder">
+		/* TsaOrder.createDeliveryFee : 주문배송비정보등록 */
+		INSERT INTO TB_DELIVERY_FEE (
+		    PAY_SQ
+		    , ORD_NO
+		    , DELV_FEE_GB
+		    , DELV_FEE_CD
+		    , DELV_FEE
+		    , DELV_CPN_SQ
+		    , DELV_CPN_DC_AMT
+		    , REAL_DELV_AMT
+		    , ORD_CHG_SQ
+		    , SUPPLY_COMP_CD
+		    , DELV_USAC_YN
+		    , DELV_USAC_DT
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		) VALUES (
+		    NULL
+		    , #{ordNo}
+		    , #{delvFeeGb}
+		    , #{delvFeeCd}
+		    , #{delvFee}
+		    , #{delvCpnSq}
+		    , #{delvCpnDcAmt}
+		    , #{realDelvAmt}
+		    , NULL
+		    , #{supplyCompCd}
+		    , 'N'
+		    , NULL
+		    , #{custNo}
+		    , NOW()
+		    , #{custNo}
+		    , NOW()
+		)
+	</insert>
+
+	<!-- 4. 주문상세정보등록-->
+	<insert id="createOrderDetail" parameterType="ExtmallOrder" keyProperty="ordDtlNo">
+		/* TsaOcm.createOrderDetail : 주문상세정보등록 */
+		INSERT INTO TB_ORDER_DETAIL (
+		    ORD_NO
+		    , ORD_EXCH_GB
+		    , ORD_DTL_STAT
+		    , ORG_ORD_DTL_NO
+		    , SUPPLY_COMP_CD
+		    , GOODS_CD
+		    , DEAL_GOODS_CD
+		    , FORMAL_GB
+		    , GOODS_TYPE
+		    , LIST_PRICE
+		    , CURR_PRICE
+		    , DC_RATE
+		    , OPT_ADD_PRICE
+		    , ORD_QTY
+		    , ORD_AMT
+		    , CNCL_RTN_QTY
+		    , CNCL_RTN_AMT
+		    , CPN1_CPN_SQ
+		    , CPN1_DC_AMT
+		    , TMTB1_SQ
+		    , TMTB1_DC_AMT
+		    , TMTB2_SQ
+		    , TMTB2_DC_AMT
+		    , GOODS_CPN_SQ
+		    , GOODS_CPN_DC_AMT
+		    , CART_CPN_SQ
+		    , CART_CPN_DC_AMT
+		    , BURDEN_RATE
+		    , PNT_DC_AMT
+		    , PRE_PNT_DC_AMT
+		    , SAVE_PNT_AMT
+		    , REAL_ORD_AMT
+		    , GFCD_USE_AMT
+		    , VENDOR_ID
+		    , EXTMALL_ID
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , CHANGEABLE_YN
+		    , CHANGE_FEE_FREE_YN
+		    , RETURNABLE_YN
+		    , RETURN_FEE_FREE_YN
+		    , SOLDOUT_YN
+		    , SOLDOUT_MEMO
+		    , SOLDOUT_REG_NO
+		    , SOLDOUT_REG_DT
+		    , DELV_ADDR_SQ
+		    , DELV_FEE_CD
+		    , SHOT_DELV_YN
+		    , GIFT_PACK_YN
+		    , GIFT_ADDR_INP_YN
+		    , MAKE_GOODS_YN
+		    , ENTRY_NO
+		    , DELV_LOC_CD
+		    , DELV_ASSIGN_DT
+		    , DELV_ASSIGN_STAT
+		    , DSTRBT_NOTE
+		    , DELV_STDT
+		    , DELV_EDDT
+		    , SHIP_COMP_CD
+		    , INVOICE_NO
+		    , INVOICE_SEND_YN
+		    , SELL_STORE_CD
+		    , SELL_FEE_RATE
+		    , AF_LINK_CD
+		    , ITHR_CD
+		    , CONTENTS_LOC
+		    , PLAN_DTL_SQ
+		    , SOCIAL_SQ
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		)
+		SELECT #{ordNo}                     AS ORD_NO
+		     , #{ordExchGb}                 AS ORD_EXCH_GB
+		     , #{ordDtlStat}                AS ORD_DTL_STAT
+		     , NULL                         AS ORG_ORD_DTL_NO
+		     , G.SUPPLY_COMP_CD             AS SUPPLY_COMP_CD
+		     , G.GOODS_CD                  AS GOODS_CD
+		     , null             AS DEAL_GOODS_CD
+		     , G.FORMAL_GB                  AS FORMAL_GB
+		     , G.GOODS_TYPE                 AS GOODS_TYPE
+		     , G.LIST_PRICE                 AS LIST_PRICE
+		     , #{currPrice}                AS CURR_PRICE
+		     , G.DC_RATE                    AS DC_RATE
+		     , #{optAddPrice}               AS OPT_ADD_PRICE
+		     , #{ordQty}                AS GOODS_QTY
+		     , #{ordAmt}                    AS ORD_AMT
+		     , 0                            AS CNCL_RTN_QTY
+		     , 0                            AS CNCLRTN_AMT
+		     , #{cpn1CpnSq}                 AS CPN1_CPN_SQ
+		     , #{cpn1DcAmt}                 AS CPN1_DC_AMT
+		     , #{tmtb1Sq}                   AS TMTB1_SQ
+		     , #{tmtb1DcAmt}                AS TMTB1_DC_AMT
+		     , #{tmtb2Sq}                   AS TMTB2_SQ
+		     , #{tmtb2DcAmt}                AS TMTB2_DC_AMT
+		     , #{goodsCpnSq}                AS GOODS_CPN_SQ
+		     , #{goodsCpnDcAmt}             AS GOODS_CPN_DC_AMT
+		     , #{cartCpnSq}                 AS CART_CPN_SQ
+		     , #{cartCpnDcAmt}              AS CART_CPN_DC_AMT
+		     , 0                            AS BURDEN_RATE
+		     , #{pntDcAmt}                  AS PNT_DC_AMT
+		     , #{prePntDcAmt}               AS PRE_PNT_DC_AMT
+		     , #{savePntAmt}                AS SAVE_PNT_AMT
+		     , #{realOrdAmt}                AS REAL_ORD_AMT
+		     , #{gfcdUseAmt}                AS GFCD_USE_AMT
+		     , #{vendorId}                  AS VENDOR_ID
+		     , #{extmallId}                 AS EXTMALL_ID
+		     , #{agentOrderId}              AS AGENT_ORDER_ID
+		     , #{extmallOrderId}            AS EXTMALL_ORDER_ID
+		     , G.CHANGEABLE_YN              AS CHANGEABLE_YN
+		     , G.CHANGE_FEE_FREE_YN         AS CHANGE_FEE_FREE_YN
+		     , G.RETURNABLE_YN              AS RETURNABLE_YN
+		     , G.RETURN_FEE_FREE_YN         AS RETURN_FEE_FREE_YN
+		     , 'N'                          AS SOLDOUT_YN
+		     , NULL                         AS SOLDOUT_MEMO
+		     , NULL                         AS SOLDOUT_REG_NO
+		     , NULL                         AS SOLDOUT_REG_DT
+		     , #{delvAddrSq}                AS DELV_ADDR_SQ
+		     , #{delvFeeCd}	                AS DELV_FEE_CD
+		     , #{shotDelvYn}                AS SHOT_DELV_YN
+		     , #{giftPackYn}                AS GIFT_PACK_YN
+		     , 'N'                          AS GIFT_ADDR_INP_YN
+		     , G.ORDER_MADE_YN              AS MAKE_GOODS_YN
+		     , #{entryNo}                   AS ENTRY_NO
+		     , NULL                         AS DELV_LOC_CD
+		     , NULL                         AS DELV_ASSIGN_DT
+		     , 'P'                          AS DELV_ASSIGN_STAT
+		     , NULL                         AS DSTRBT_NOTE
+		     , NULL                         AS DELV_STDT
+		     , NULL                         AS DELV_EDDT
+		     , NULL                         AS SHIP_COMP_CD
+		     , NULL                         AS INVOICE_NO
+		     , 'N'                          AS INVOICE_SEND_YN
+		     , NULL                         AS SELL_STORE_CD
+		     , G.SELL_FEE_RATE              AS SELL_FEE_RATE
+		     , null              AS AF_LINK_CD
+		     , null              AS ITHR_CD
+		     , null              AS CONTENTS_LOC
+		     , null              AS PLAN_DTL_SQ
+		     , NULL                         AS SOCIAL_SQ
+		     , #{custNo}                    AS REG_NO
+		     , NOW()                        AS REG_DT
+		     , #{custNo}                    AS UPD_NO
+		     , NOW()                        AS UPD_DT
+		FROM TB_GOODS G
+		WHERE  GOODS_CD = #{goodsCd}
+	</insert>
+
+	<!-- 4-2. 주문상세 이력 등록-->
+	<insert id="createOrderDetailHst" parameterType="ExtmallOrder">
+		/* TsaOcm.createOrderDetailHst */
+		INSERT INTO TB_ORDER_DETAIL_HST (
+		    ORD_DTL_NO
+		    , ORD_NO
+		    , ORD_EXCH_GB
+		    , ORD_DTL_STAT
+		    , ORG_ORD_DTL_NO
+		    , SUPPLY_COMP_CD
+		    , GOODS_CD
+		    , DEAL_GOODS_CD
+		    , FORMAL_GB
+		    , GOODS_TYPE
+		    , LIST_PRICE
+		    , CURR_PRICE
+		    , DC_RATE
+		    , OPT_ADD_PRICE
+		    , ORD_QTY
+		    , ORD_AMT
+		    , CNCL_RTN_QTY
+		    , CNCL_RTN_AMT
+		    , CPN1_CPN_SQ
+		    , CPN1_DC_AMT
+		    , TMTB1_SQ
+		    , TMTB1_DC_AMT
+		    , TMTB2_SQ
+		    , TMTB2_DC_AMT
+		    , GOODS_CPN_SQ
+		    , GOODS_CPN_DC_AMT
+		    , CART_CPN_SQ
+		    , CART_CPN_DC_AMT
+		    , BURDEN_RATE
+		    , PNT_DC_AMT
+		    , PRE_PNT_DC_AMT
+		    , SAVE_PNT_AMT
+		    , REAL_ORD_AMT
+		    , GFCD_USE_AMT
+		    , VENDOR_ID
+		    , EXTMALL_ID
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , CHANGEABLE_YN
+		    , CHANGE_FEE_FREE_YN
+		    , RETURNABLE_YN
+		    , RETURN_FEE_FREE_YN
+		    , SOLDOUT_YN
+		    , SOLDOUT_MEMO
+		    , SOLDOUT_REG_NO
+		    , SOLDOUT_REG_DT
+		    , DELV_ADDR_SQ
+		    , DELV_FEE_CD
+		    , SHOT_DELV_YN
+		    , GIFT_PACK_YN
+		    , GIFT_ADDR_INP_YN
+		    , MAKE_GOODS_YN
+		    , ENTRY_NO
+		    , DELV_LOC_CD
+		    , DELV_ASSIGN_DT
+		    , DELV_ASSIGN_STAT
+		    , DSTRBT_NOTE
+		    , DELV_STDT
+		    , DELV_EDDT
+		    , SHIP_COMP_CD
+		    , INVOICE_NO
+		    , INVOICE_SEND_YN
+		    , SELL_STORE_CD
+		    , SELL_FEE_RATE
+		    , AF_LINK_CD
+		    , ITHR_CD
+		    , CONTENTS_LOC
+		    , PLAN_DTL_SQ
+		    , SOCIAL_SQ
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		)
+		SELECT ORD_DTL_NO
+		     , ORD_NO
+		     , ORD_EXCH_GB
+		     , ORD_DTL_STAT
+		     , ORG_ORD_DTL_NO
+		     , SUPPLY_COMP_CD
+		     , GOODS_CD
+		     , DEAL_GOODS_CD
+		     , FORMAL_GB
+		     , GOODS_TYPE
+		     , LIST_PRICE
+		     , CURR_PRICE
+		     , DC_RATE
+		     , OPT_ADD_PRICE
+		     , ORD_QTY
+		     , ORD_AMT
+		     , CNCL_RTN_QTY
+		     , CNCL_RTN_AMT
+		     , CPN1_CPN_SQ
+		     , CPN1_DC_AMT
+		     , TMTB1_SQ
+		     , TMTB1_DC_AMT
+		     , TMTB2_SQ
+		     , TMTB2_DC_AMT
+		     , GOODS_CPN_SQ
+		     , GOODS_CPN_DC_AMT
+		     , CART_CPN_SQ
+		     , CART_CPN_DC_AMT
+		     , BURDEN_RATE
+		     , PNT_DC_AMT
+		     , PRE_PNT_DC_AMT
+		     , SAVE_PNT_AMT
+		     , REAL_ORD_AMT
+		     , GFCD_USE_AMT
+		     , VENDOR_ID
+		     , EXTMALL_ID
+		     , AGENT_ORDER_ID
+		     , EXTMALL_ORDER_ID
+		     , CHANGEABLE_YN
+		     , CHANGE_FEE_FREE_YN
+		     , RETURNABLE_YN
+		     , RETURN_FEE_FREE_YN
+		     , SOLDOUT_YN
+		     , SOLDOUT_MEMO
+		     , SOLDOUT_REG_NO
+		     , SOLDOUT_REG_DT
+		     , DELV_ADDR_SQ
+		     , DELV_FEE_CD
+		     , SHOT_DELV_YN
+		     , GIFT_PACK_YN
+		     , GIFT_ADDR_INP_YN
+		     , MAKE_GOODS_YN
+		     , ENTRY_NO
+		     , DELV_LOC_CD
+		     , DELV_ASSIGN_DT
+		     , DELV_ASSIGN_STAT
+		     , DSTRBT_NOTE
+		     , DELV_STDT
+		     , DELV_EDDT
+		     , SHIP_COMP_CD
+		     , INVOICE_NO
+		     , INVOICE_SEND_YN
+		     , SELL_STORE_CD
+		     , SELL_FEE_RATE
+		     , AF_LINK_CD
+		     , ITHR_CD
+		     , CONTENTS_LOC
+		     , PLAN_DTL_SQ
+		     , SOCIAL_SQ
+		     , #{regNo}
+		     , NOW()
+		     , #{regNo}
+		     , NOW()
+		  FROM TB_ORDER_DETAIL
+		 WHERE ORD_DTL_NO = #{ordDtlNo}
+	</insert>
+
+	<!-- 5. 주문상세단품정보등록을 위한 조회 -->
+	<select id="getOrderDetailItem" parameterType="ExtmallOrder" resultType="ExtmallOrder">
+		/* TsaOcm.getOrderDetailItem : 주문상세단품정보등록을 위한 조회 */
+		SELECT
+			#{ordDtlNo}                                  AS ORD_DTL_NO
+		     , #{ordNo}                                     AS ORD_NO
+		     , #{ordDtlStat}                                AS ORD_DTL_STAT
+			 , OP.GOODS_CD
+		     , OP.GOODS_CD as ITEM_CD
+		     , OP.OPT_CD
+		     , OP.OPT_CD1
+		     , OP.OPT_CD2
+		     , OP.SKU_MODEL_NO
+		     , OP.PRODUCT_NO
+		     , OP.PRODUCT_CODE
+		     , G.CURR_PRICE
+		     , IFNULL(GC.QTY, 1)                            AS ITEM_QTY
+		     , IFNULL(GC.COMPS_CURR_PRICE, G.CURR_PRICE)    AS ITEM_PRICE
+		     , OP.ADD_PRICE                                 AS OPT_ADD_PRICE
+		    /* , CD.DISP_ORD*/
+		     , 0                                            AS ORD_AMT
+		     , 0                                            AS CNCL_RTN_AMT
+		     , 0                                            AS CPN1_DC_AMT
+		     , 0                                            AS TMTB1_DC_AMT
+		     , 0                                            AS TMTB2_DC_AMT
+		     , 0                                            AS GOODS_CPN_DC_AMT
+		     , 0                                            AS CART_CPN_DC_AMT
+		     , 0                                            AS PNT_DC_AMT
+		     , 0                                            AS PRE_PNT_DC_AMT
+		     , 0                                            AS SAVE_PNT_AMT
+		     , 0                                            AS REAL_ORD_AMT
+		     , 0                                            AS GFCD_USE_AMT
+		FROM   TB_OPTION OP
+		INNER  JOIN TB_GOODS G
+		ON     op.GOODS_CD = G.GOODS_CD
+		LEFT   OUTER JOIN TB_GOODS_COMPOSE GC
+		ON    G.GOODS_CD = GC.GOODS_CD
+		WHERE 1=1
+		and OP.OPT_CD= #{optCd}
+
+	</select>
+
+	<!-- 6. 주문상세단품정보등록 -->
+	<insert id="createOrderDetailItem" parameterType="ExtmallOrder" keyProperty="ordDtlItemSq">
+		/* TsaOrder.createOrderDetailItem : 주문상세단품정보등록 */
+		INSERT INTO TB_ORDER_DETAIL_ITEM (
+		    ORD_DTL_NO
+		    , ORD_NO
+		    , ORD_DTL_STAT
+		    , ITEM_CD
+		    , OPT_CD
+		    , OPT_CD1
+		    , OPT_CD2
+		    , SKU_MODEL_NO
+		    , PRODUCT_NO
+		    , PRODUCT_CODE
+		    , ITEM_QTY
+		    , ITEM_PRICE
+		    , OPT_ADD_PRICE
+		    , DISP_ORD
+		    , ORD_AMT
+		    , CNCL_RTN_AMT
+		    , CPN1_DC_AMT
+		    , TMTB1_DC_AMT
+		    , TMTB2_DC_AMT
+		    , GOODS_CPN_DC_AMT
+		    , CART_CPN_DC_AMT
+		    , PNT_DC_AMT
+		    , PRE_PNT_DC_AMT
+		    , SAVE_PNT_AMT
+		    , REAL_ORD_AMT
+		    , GFCD_USE_AMT
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		) VALUES (
+		    #{ordDtlNo}
+		    , #{ordNo}
+		    , #{ordDtlStat}
+		    , #{itemCd}
+		    , #{optCd}
+		    , #{optCd1}
+		    , #{optCd2}
+		    , #{skuModelNo}
+		    , #{productNo}
+		    , #{productCode}
+		    , #{itemQty}
+		    , #{itemPrice}
+		    , #{optAddPrice}
+		    , #{dispOrd}
+		    , #{ordAmt}
+		    , #{cnclRtnAmt}
+		    , #{cpn1DcAmt}
+		    , #{tmtb1DcAmt}
+		    , #{tmtb2DcAmt}
+		    , #{goodsCpnDcAmt}
+		    , #{cartCpnDcAmt}
+		    , #{pntDcAmt}
+		    , #{prePntDcAmt}
+		    , #{savePntAmt}
+		    , #{realOrdAmt}
+		    , #{gfcdUseAmt}
+		    , #{custNo}
+		    , NOW()
+		    , #{custNo}
+		    , NOW()
+		)
+	</insert>
+
+	<!-- 7. 주문상세단품이력정보 등록 -->
+	<insert id="createOrderDetailItemHst" parameterType="ExtmallOrder">
+		/* TsaOrder.createOrderDetailItemHst */
+		INSERT INTO TB_ORDER_DETAIL_ITEM_HST (
+		    ORD_DTL_ITEM_SQ
+		    , ORD_DTL_NO
+		    , ORD_NO
+		    , ORD_DTL_STAT
+		    , ITEM_CD
+		    , OPT_CD
+		    , OPT_CD1
+		    , OPT_CD2
+		    , SKU_MODEL_NO
+		    , PRODUCT_NO
+		    , PRODUCT_CODE
+		    , ITEM_QTY
+		    , ITEM_PRICE
+		    , OPT_ADD_PRICE
+		    , DISP_ORD
+		    , ORD_AMT
+		    , ORD_QTY
+		    , CNCL_RTN_AMT
+		    , CNCL_RTN_QTY
+		    , CPN1_DC_AMT
+		    , TMTB1_DC_AMT
+		    , TMTB2_DC_AMT
+		    , GOODS_CPN_DC_AMT
+		    , CART_CPN_DC_AMT
+		    , PNT_DC_AMT
+		    , PRE_PNT_DC_AMT
+		    , SAVE_PNT_AMT
+		    , REAL_ORD_AMT
+		    , GFCD_USE_AMT
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		)
+		SELECT ODI.ORD_DTL_ITEM_SQ
+		     , ODI.ORD_DTL_NO
+		     , ODI.ORD_NO
+		     , #{ordDtlStat}
+		     , ODI.ITEM_CD
+		     , ODI.OPT_CD
+		     , ODI.OPT_CD1
+		     , ODI.OPT_CD2
+		     , ODI.SKU_MODEL_NO
+		     , ODI.PRODUCT_NO
+		     , ODI.PRODUCT_CODE
+		     , ODI.ITEM_QTY
+		     , ODI.ITEM_PRICE
+		     , ODI.OPT_ADD_PRICE
+		     , ODI.DISP_ORD
+		     , ODI.ORD_AMT
+		     , OD.ORD_QTY
+		     , ODI.CNCL_RTN_AMT
+		     , OD.CNCL_RTN_QTY
+		     , ODI.CPN1_DC_AMT
+		     , ODI.TMTB1_DC_AMT
+		     , ODI.TMTB2_DC_AMT
+		     , ODI.GOODS_CPN_DC_AMT
+		     , ODI.CART_CPN_DC_AMT
+		     , ODI.PNT_DC_AMT
+		     , ODI.PRE_PNT_DC_AMT
+		     , ODI.SAVE_PNT_AMT
+		     , ODI.REAL_ORD_AMT
+		     , ODI.GFCD_USE_AMT
+		     , ODI.REG_NO
+		     , NOW()
+		     , ODI.UPD_NO
+		     , NOW()
+		  FROM TB_ORDER_DETAIL_ITEM ODI
+		 INNER JOIN TB_ORDER_DETAIL OD
+		    ON ODI.ORD_DTL_NO = OD.ORD_DTL_NO
+		 WHERE 1=1
+		   AND ORD_DTL_ITEM_SQ = #{ordDtlItemSq}
+	</insert>
+
+	<!-- 8. 주문사은품 마스터 정보 등록 -->
+	<insert id="createOrdFreegift" parameterType="ExtmallOrder">
+		/* TsaOrder.createOrdFreegift */
+		INSERT INTO TB_ORD_FREEGIFT (
+		    ORD_NO
+		    , FREEGIFT_SQ
+		    , DEL_YN
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		)
+		SELECT #{ordNo}
+		     , FG.FREEGIFT_SQ
+		     , 'N'
+		     , #{custNo}
+		     , NOW()
+		     , #{custNo}
+		     , NOW()
+		FROM   TB_FREEGIFT_VAL FGV
+		INNER  JOIN TB_FREEGIFT FG
+		ON     FGV.FREEGIFT_SQ = FG.FREEGIFT_SQ
+		WHERE  1=1
+		AND    FREEGIFT_VAL_SQ IN
+		<foreach collection="freegiftValArr" item="item" index="index"  open="(" close=")" separator=",">
+			#{item}
+		</foreach>
+		GROUP  BY FREEGIFT_SQ
+	</insert>
+
+	<!-- 9. 주문사은품 상품 정보 등록 -->
+	<insert id="createOrdFreegiftVal" parameterType="ExtmallOrder">
+		/* TsaOrder.createOrdFreegiftVal */
+		INSERT INTO TB_ORD_FREEGIFT_VAL (
+		    ORD_FREEGIFT_SQ
+		    , ORD_NO
+		    , FREEGIFT_SQ
+		    , FREEGIFT_VAL_SQ
+		    , ORD_DTL_STAT
+		    , USE_POINT
+		    , ITEM_QTY
+		    , PRODUCT_NO
+		    , PRODUCT_CODE
+		    , BRAND_CD
+		    , DEL_YN
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		)
+		SELECT OFG.ORD_FREEGIFT_SQ
+		    , #{ordNo}
+		    , FGV.FREEGIFT_SQ
+		    , FGV.FREEGIFT_VAL_SQ
+		    , #{ordDtlStat}
+		    , CASE WHEN FG.ALL_YN IN ('Y')
+		           THEN 0
+		           ELSE FGV.USE_POINT
+		           END USE_POINT
+		    , FGV.ITEM_QTY
+		    , FGV.PRODUCT_NO
+		    , FRG.PRODUCT_CODE
+		    , FRG.BRAND_CD
+		    , 'N'
+		    , #{custNo}
+		    , NOW()
+		    , #{custNo}
+		    , NOW()
+		FROM   TB_FREEGIFT_VAL FGV
+		INNER  JOIN TB_FREEGIFT FG
+		ON     FGV.FREEGIFT_SQ = FG.FREEGIFT_SQ
+		INNER  JOIN TB_FREE_GOODS FRG
+		ON     FGV.PRODUCT_NO = FRG.PRODUCT_NO
+		INNER  JOIN TB_ORD_FREEGIFT OFG
+		ON     FGV.FREEGIFT_SQ = OFG.FREEGIFT_SQ
+		WHERE  1=1
+		AND    OFG.ORD_NO = #{ordNo}
+		AND    FGV.FREEGIFT_VAL_SQ IN
+		<foreach collection="freegiftValArr" item="item" index="index"  open="(" close=")" separator=",">
+			#{item}
+		</foreach>
+	</insert>
+
+	<!-- 10. 주문사은품 주문상세 정보 등록 -->
+	<insert id="createOrdFreegiftDtl" parameterType="ExtmallOrder">
+		/* TsaOrder.createOrdFreegiftDtl */
+		INSERT INTO TB_ORD_FREEGIFT_DTL (
+		    ORD_FREEGIFT_SQ
+		    , FREEGIFT_SQ
+		    , ORD_NO
+		    , ORD_DTL_NO
+		    , DEL_YN
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		)
+		SELECT OFR.ORD_FREEGIFT_SQ
+		     , OFR.FREEGIFT_SQ
+		     , OD.ORD_NO
+		     , OD.ORD_DTL_NO
+		     , 'N'
+		     , #{custNo}
+		     , NOW()
+		     , #{custNo}
+		     , NOW()
+		FROM   TB_ORDER_DETAIL OD
+		INNER  JOIN TB_ORD_FREEGIFT OFR
+		ON     OD.ORD_NO = OFR.ORD_NO
+		INNER  JOIN TB_ORD_FREEGIFT_VAL OFV
+		ON     OFR.ORD_FREEGIFT_SQ = OFV.ORD_FREEGIFT_SQ
+		WHERE  1=1
+		AND    OD.GOODS_CD = #{goodsCd}
+		AND    OFR.FREEGIFT_SQ = #{freegiftSq}
+		AND    OD.ORD_NO = #{ordNo}
+		GROUP  BY OD.ORD_DTL_NO
+		     , OFR.FREEGIFT_SQ
+		     , OFR.ORD_FREEGIFT_SQ
+	</insert>
+
+	<!-- 11. 결제 PAYMENT INSERT-->
+	<insert id="insertPayment" parameterType="Payment" keyProperty="paySq">
+		/* TsaOcm.insertPayment : PAYMENT INSERT */
+		INSERT INTO TB_PAYMENT (
+			  ORD_NO
+			, PAY_DT
+			, PAY_MEANS
+			, PAY_AMT
+			, PG_CPN_AMT
+			, NPAY_PNT_AMT
+			, PAY_GB
+			, PAY_STAT
+			, CARD_PCABLE_YN
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+		) VALUES (
+			  #{ordNo}
+			, NOW()
+			, #{payMeans}
+			, #{payAmt}
+			, #{pgCpnAmt}
+			, #{npayPntAmt}
+			, #{payGb}
+			, #{payStat}
+			, IFNULL(#{cardPcableYn}, 'Y')
+			, #{regNo}
+			, NOW()
+			, #{updNo}
+			, NOW()
+		)
+	</insert>
+
+	<!-- 12. 재고정보등록 -->
+	<insert id="createSellQty" parameterType="ExtmallOrder">
+		/* TsaOcm.createSellQty */
+		INSERT INTO TB_SELL_QTY (
+		    GOODS_CD
+		    , OPT_CD
+		    , SELL_GB
+		    , ORD_DTL_NO
+		    , ORD_CHG_SQ
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , SELL_QTY
+		    , REG_NO
+		    , REG_DT
+		)
+		SELECT ODI.ITEM_CD
+		     , ODI.OPT_CD
+		     , #{sellGb}
+		     , ODI.ORD_DTL_NO
+		     , NULL
+		     , OD.AGENT_ORDER_ID
+		     , OD.EXTMALL_ORDER_ID
+		     , ODI.ITEM_QTY * OD.ORD_QTY
+		     , #{custNo}
+		     , NOW()
+		FROM   TB_ORDER_DETAIL_ITEM ODI
+		INNER  JOIN TB_ORDER_DETAIL OD
+		ON     ODI.ORD_DTL_NO = OD.ORD_DTL_NO
+		WHERE  1=1
+		AND    ODI.ORD_NO = #{ordNo}
+		AND    ODI.ORD_DTL_NO = #{ordDtlNo}
+	</insert>
+
+	<!-- 13. 사은품 남은수량 업데이트 -->
+	<update id="updateFreegiftValLeftQty" parameterType="ExtmallOrder">
+		/* TsaOrder.updateFreegiftValLeftQty */
+		UPDATE TB_FREEGIFT_VAL FV
+		INNER  JOIN TB_ORD_FREEGIFT_VAL OFV
+		ON     FV.FREEGIFT_VAL_SQ = OFV.FREEGIFT_VAL_SQ
+		SET    FV.LEFT_QTY = FV.LEFT_QTY - FV.ITEM_QTY
+		WHERE  1=1
+		AND    OFV.ORD_NO = #{ordNo}
+		AND    FV.DEL_YN = 'N'
+	</update>
+
+	<!-- 상품 재고 조회 -->
+	<select id="getGoodsStockInfo" parameterType="ShoplinkerStock" resultType="ShoplinkerStock">
+		/* TsaOcm.getGoodsStockInfo */
+		SELECT VS.GOODS_CD
+			 , VS.OPT_CD
+			 , VS.OPT_CD1
+			 , VS.OPT_CD2
+			 , VS.SOLDOUT_YN
+			 , VS.CURR_STOCK_QTY
+		     , VS.ADD_PRICE
+			 , O.SKU_MODEL_NO
+		  FROM VW_STOCK VS
+		 INNER JOIN TB_OPTION O
+		    ON VS.GOODS_CD = O.GOODS_CD
+		   AND VS.OPT_CD = O.OPT_CD
+		 WHERE VS.GOODS_CD = #{goodsCd}
+		   AND VS.OPT_CD = #{optCd}
+	</select>
+
+	<!-- 사은품 : 1차조건 적용된 사음품 정보, 상품 금액 조회 -->
+	<select id="getFreeGiftGoodsApplyAmt" parameterType="ExtmallOrder" resultType="ExtmallOrder">
+		/* TsaOcm.getFreeGiftGoodsApplyAmt */
+		WITH GOODS_DATA AS (
+			SELECT G.GOODS_CD
+			     , G.SUPPLY_COMP_CD
+			     , G.BRAND_CD
+			     , OD.ORD_QTY as GOODS_QTY
+			     , OD.ORD_AMT as CURR_PRICE
+			     , G.GOODS_TYPE
+			FROM   TB_GOODS G
+			INNER JOIN TB_ORDER_DETAIL OD ON OD.GOODS_CD = G.GOODS_CD
+			WHERE OD.ORD_NO = #{ordNo}
+			AND OD.ORD_DTL_NO IN
+			<foreach collection="itemCdArr" item="item" index="index"  open="(" close=")" separator=",">
+				#{item}
+			</foreach>
+
+		)
+		SELECT FGG.FREEGIFT_SQ
+		     , FGG.GOODS_CD
+		     , FGG.CURR_PRICE
+		     , FGG.GOODS_QTY
+		     , FG.FREEGIFT_STDT
+		     , FG.FREEGIFT_EDDT
+		     , FE.*
+		FROM   TB_FREEGIFT FG
+		INNER JOIN TB_FREEGIFT_EXTMALL FE ON FG.FREEGIFT_SQ = FE.FREEGIFT_SQ
+		INNER  JOIN (
+			SELECT FGG.FREEGIFT_SQ
+			    , GD.GOODS_CD
+			    , GD.CURR_PRICE
+			    , GD.GOODS_QTY
+			FROM   TB_FREEGIFT_GOODS FGG
+			INNER  JOIN GOODS_DATA GD
+			ON     FGG.TARGET_VAL = GD.GOODS_CD
+			WHERE  1=1
+			AND    FGG.GOODS_GB = 'G800_20' -- 적용상품
+			AND    FGG.TARGET_GB= 'G260_10' -- 상품
+			AND    FGG.DEL_YN = 'N'
+			UNION
+			SELECT FGG1.FREEGIFT_SQ
+			     , GD.GOODS_CD
+			     , GD.CURR_PRICE
+			     , GD.GOODS_QTY
+			FROM   GOODS_DATA GD
+			INNER  JOIN TB_FREEGIFT_GOODS_APPLY FGG1
+			ON     GD.SUPPLY_COMP_CD = FGG1.TARGET_VAL
+			AND    FGG1.TARGET_GB= 'G260_13' -- 공급처
+			INNER  JOIN TB_FREEGIFT_GOODS_APPLY FGG2
+			ON     GD.BRAND_CD = FGG2.TARGET_VAL
+			AND    FGG2.TARGET_GB= 'G260_12' -- 브랜드
+			AND    FGG1.FREEGIFT_SQ = FGG2.FREEGIFT_SQ
+		) FGG
+		ON     FG.FREEGIFT_SQ = FGG.FREEGIFT_SQ
+		LEFT   OUTER JOIN TB_FREEGIFT_GOODS NOT_APPLY_GOODS
+		ON     FGG.FREEGIFT_SQ = NOT_APPLY_GOODS.FREEGIFT_SQ
+		AND    FGG.GOODS_CD = NOT_APPLY_GOODS.TARGET_VAL
+		AND    NOT_APPLY_GOODS.TARGET_GB = 'G800_30'
+		WHERE  1=1
+		AND    NOT_APPLY_GOODS.FREEGIFT_SQ IS NULL
+		AND    FG.DEL_YN = 'N'
+		AND    FG.SELF_YN = 'N' -- 외부몰
+		AND    FG.FREEGIFT_STAT = 'G232_11' -- 진행
+		AND	   FE.EXTMALL_ID = #{extmallId}
+		AND	   FE.DEL_YN = 'N'
+		AND    FG.FREEGIFT_STDT <![CDATA[<]]> CURRENT_TIMESTAMP
+		AND    FG.FREEGIFT_EDDT > CURRENT_TIMESTAMP
+		ORDER  BY FGG.FREEGIFT_SQ
+
+	</select>
+
+	<!-- 사은품 : 2차조건 적용된 사은품상품금액 구간정보조회 -->
+	<select id="getFreeGiftGoodsApplySection" parameterType="ExtmallOrder" resultType="ExtmallOrder">
+		/* TsaOcm.getFreeGiftGoodsApplySection */
+		SELECT FGS.FREEGIFT_SECTION_SQ
+		     , FGS.FREEGIFT_SQ
+		     , FGS.SECTION_VAL
+		FROM   TB_FREEGIFT_SECTION FGS
+		WHERE  1=1
+		AND    FGS.DEL_YN = 'N'
+		AND    FGS.SECTION_GB = 'G810_11' -- 금액만 처리
+		AND    FGS.FREEGIFT_SQ IN
+		<foreach collection="freegiftSqArr" item="item" index="index"  open="(" close=")" separator=",">
+			#{item}
+		</foreach>
+		ORDER  BY FGS.FREEGIFT_SQ
+		     , FGS.SECTION_VAL
+	</select>
+
+	<!-- 사은품 : 3차조건 적용된 구간정보의 사은품정보조회 -->
+	<select id="getFreeGiftGoodsApplyVal" parameterType="ExtmallOrder" resultType="ExtmallOrder">
+		/* TsaOcm.getFreeGiftGoodsApplyVal */
+		SELECT FGV.FREEGIFT_VAL_SQ
+		     , FG.FREEGIFT_NM
+		     , FGV.FREEGIFT_SECTION_SQ
+		     , FGV.FREEGIFT_SQ
+		     , FGV.USE_POINT
+		     , FGV.ITEM_QTY
+		     , FG.ALL_YN
+		     , G.PRODUCT_NO
+		     , G.PRODUCT_CODE
+		     , G.GOODS_NM
+		     , G.SYS_IMG_NM
+		FROM   TB_FREEGIFT_VAL FGV
+		INNER  JOIN TB_FREEGIFT FG
+		ON     FGV.FREEGIFT_SQ = FG.FREEGIFT_SQ
+		INNER  JOIN TB_FREE_GOODS G
+		ON     FGV.PRODUCT_NO = G.PRODUCT_NO
+		WHERE  1=1
+		AND    FGV.DEL_YN = 'N'
+		AND    FGV.LEFT_QTY <![CDATA[>=]]> FGV.ITEM_QTY
+		AND    FGV.FREEGIFT_SECTION_SQ IN
+		<foreach collection="freegiftSectionSqArr" item="item" index="index"  open="(" close=")" separator=",">
+			#{item}
+		</foreach>
+		ORDER  BY FG.FREEGIFT_SQ
+		        , FGV.FREEGIFT_SECTION_SQ
+		        , FGV.USE_POINT
+	</select>
+<!--***** 주문정보등록 **************************************************************** -->
+<!--***** 주문정보등록 **************************************************************** -->
+
+
+
+
+
+
+
+	<!--외부몰주문등록 전 임시 테이블 삭제-->
+	<delete id="deleteExtmallOrderUploadTmp" parameterType="Integer">
+		/* TsaOcm.deleteExtmallOrderUploadTmp */
+		DELETE
+		FROM  TB_EXTMALL_ORDER_UPLOAD_TMP
+		WHERE REG_NO = #{regNo}
+	</delete>
+
+	<!--외부몰주문등록 테이블 실패목록 데이터 삭제 -->
+	<delete id="deleteExtmallOrderUploadFail" parameterType="Integer">
+		/* TsaOcm.deleteExtmallOrderUploadFail */
+		DELETE
+		FROM  TB_EXTMALL_ORDER_UPLOAD A
+		WHERE REG_NO = #{regNo}
+		AND UPLOAD_GB = 'E'
+		AND UPLOAD_STAT = 'G021_40'
+		AND EXISTS (
+                      SELECT 1
+                      FROM   TB_EXTMALL_ORDER_UPLOAD_TMP B
+                      WHERE  B.VENDOR_ID = A.VENDOR_ID
+                      AND    B.EXTMALL_ID = A.EXTMALL_ID
+                      AND    B.AGENT_ORDER_ID = A.AGENT_ORDER_ID
+                      AND    B.EXTMALL_ORDER_ID = A.EXTMALL_ORDER_ID
+                    )
+	</delete>
+
+	<!-- 외부몰주문등록 (TB_EXTMALL_ORDER_UPLOAD_TMP) 인픽스-->
+	<insert id="createExtmallOrderUploadTmp" parameterType="ExtmallOrder">
+		/* TsaOcm.createExtmallOrderUploadTmp */
+		INSERT INTO TB_EXTMALL_ORDER_UPLOAD_TMP (
+		      VENDOR_ID
+			, EXTMALL_ID
+			, EXTMALL_NM
+			, AGENT_ORDER_ID
+			, EXTMALL_ORDER_ID
+			, EXTMALL_PROD_ID
+			, EXTMALL_PROD_NM
+			, GOODS_CD
+			, SKU
+			, CURR_PRICE
+			, ORD_QTY
+			, ORD_AMT
+			, CPN_DC_AMT
+			, PNT_DC_AMT
+			, DELV_FEE
+			, ORD_RECV_DT
+			, ORD_DT
+			, ORD_NM
+			, ORD_PHNNO
+			, ORD_TELNO
+			, ORD_EMAIL
+			, RECIP_NM
+			, RECIP_PHNNO
+			, RECIP_TELNO
+			, RECIP_ZIPCODE
+			, RECIP_BASE_ADDR
+			, RECIP_DTL_ADDR
+			, DELV_MEMO
+			, UPLOAD_STAT
+			, UPLOAD_FAIL_CD
+			, UPLOAD_FAIL_REASON
+			, ORD_NO
+			, DELV_ADDR_SQ
+			, OPT_CD
+			, UPLOAD_GB
+			, REG_NO
+			, REG_DT
+		)
+		VALUES (
+		     #{vendorId}
+			, #{extmallId}
+			, '-'
+			, #{agentOrderId}
+			, #{extmallOrderId}
+			, #{extmallProdId}
+			, #{extmallProdNm}
+			, #{goodsCd}
+			, #{sku}
+			, IFNULL(#{currPrice}, 0)
+			, IFNULL(#{ordQty}, 0)
+			, IFNULL(#{ordAmt}, 0)
+			, IFNULL(#{cpnDcAmt}, 0)
+			, IFNULL(#{pntDcAmt}, 0)
+			, IFNULL(#{delvFee}, 0)
+			, now()
+			, now()
+			, IFNULL(#{ordNm}, #{recipNm})
+			, IFNULL(#{ordPhnno}, #{recipPhnno})
+			, IFNULL(#{ordTelno}, #{recipTelno})
+			, #{ordEmail}
+			, #{recipNm}
+			, #{recipPhnno}
+			, #{recipTelno}
+			, replace(#{recipZipcode}, '-', '')
+			, #{recipBaseAddr}
+			, #{recipDtlAddr}
+			, #{delvMemo}
+			, #{uploadStat}
+			, #{uploadFailCd}
+			, #{uploadFailReason}
+			, #{ordNo}
+			, #{delvAddrSq}
+			, replace(replace(#{optCd}, '[', ''), ']', '')
+			, #{uploadGb}
+			, #{regNo}
+			, now()
+		)
+	</insert>
+
+	<!-- 외부몰주문등록 업로드 후 목록 -->
+	<select id="getExtmallOrderUploadTmpList" parameterType="ExtmallOrder" resultType="ExtmallOrder">
+	/* TsaOcm.getExtmallOrderUploadTmpList */
+		SELECT T.VENDOR_ID
+			, T.EXTMALL_ID
+			, IFNULL(A.EXTMALL_NM, '(미매핑)') as EXTMALL_NM
+			, T.AGENT_ORDER_ID
+			, T.EXTMALL_ORDER_ID
+			, T.EXTMALL_PROD_ID
+			, T.EXTMALL_PROD_NM
+			, CASE
+				WHEN A.EXTMALL_NM IS NULL OR B.GOODS_CD IS NULL OR B.OPT_CD IS NULL THEN 'Y'
+				ELSE 'N'
+			  END WARNING_YN
+			, CASE
+				WHEN B.GOODS_CD IS NULL THEN CONCAT(T.GOODS_CD , '(미매핑)')
+				ELSE T.GOODS_CD
+			  END AS GOODS_CD
+			, CASE
+				WHEN B.OPT_CD IS NULL THEN CONCAT(T.OPT_CD , '(미매핑)')
+				ELSE T.OPT_CD
+			  END AS OPT_CD
+			, T.SKU
+			, T.CURR_PRICE
+			, T.ORD_QTY
+			, T.ORD_AMT
+			, T.CPN_DC_AMT
+			, T.PNT_DC_AMT
+			, T.DELV_FEE
+			, T.ORD_RECV_DT
+			, T.ORD_DT
+			, T.ORD_NM
+			, T.ORD_PHNNO
+			, T.ORD_TELNO
+			, T.ORD_EMAIL
+			, T.RECIP_NM
+			, T.RECIP_PHNNO
+			, T.RECIP_TELNO
+			, T.RECIP_ZIPCODE
+			, T.RECIP_BASE_ADDR
+			, T.RECIP_DTL_ADDR
+			, T.DELV_MEMO
+			, T.UPLOAD_STAT
+			, T.UPLOAD_FAIL_CD
+			, T.UPLOAD_FAIL_REASON
+			, T.ORD_NO
+			, T.DELV_ADDR_SQ
+			, T.UPLOAD_GB
+			, T.REG_NO
+			, T.REG_DT
+		FROM  TB_EXTMALL_ORDER_UPLOAD_TMP T
+				LEFT OUTER JOIN TB_EXTMALL A ON T.VENDOR_ID = A.VENDOR_ID AND T.EXTMALL_ID = A.EXTMALL_ID AND A.USE_YN = 'Y'
+				LEFT OUTER JOIN TB_OPTION B ON T.GOODS_CD = B.GOODS_CD AND T.OPT_CD = B.OPT_CD
+		WHERE 1=1
+		AND   T.REG_NO = #{regNo}
+
+	</select>
+
+	<select id="getVendorId" parameterType="String" resultType="String">
+		/* TsaOcm.getVendorId */
+		SELECT VENDOR_ID
+		FROM   TB_EXTMALL_ORDER_UPLOAD_TMP
+		WHERE  1=1
+		AND    REG_ID = #{regId}
+		AND    ROWNUM = 1
+	</select>
+
+	<!-- 외부몰 주문업로드 생성 -->
+	<insert id="createExtmallOrderUploadSecond" parameterType="ExtmallOrder" timeout="100">
+		/* TsaOcm.createExtmallOrderUploadSecond */
+		INSERT INTO TB_EXTMALL_ORDER_UPLOAD (
+		       VENDOR_ID
+				, EXTMALL_ID
+				, EXTMALL_NM
+				, AGENT_ORDER_ID
+				, EXTMALL_ORDER_ID
+				, EXTMALL_PROD_ID
+				, EXTMALL_PROD_NM
+				, GOODS_CD
+				, SKU
+				, CURR_PRICE
+				, ORD_QTY
+				, ORD_AMT
+				, CPN_DC_AMT
+				, PNT_DC_AMT
+				, DELV_FEE
+				, ORD_RECV_DT
+				, ORD_DT
+				, ORD_NM
+				, ORD_PHNNO
+				, ORD_TELNO
+				, ORD_EMAIL
+				, RECIP_NM
+				, RECIP_PHNNO
+				, RECIP_TELNO
+				, RECIP_ZIPCODE
+				, RECIP_BASE_ADDR
+				, RECIP_DTL_ADDR
+				, DELV_MEMO
+				, UPLOAD_STAT
+				, UPLOAD_FAIL_CD
+				, UPLOAD_FAIL_REASON
+				, ORD_NO
+				, DELV_ADDR_SQ
+				, OPT_CD
+				, UPLOAD_GB
+				, REG_NO
+				, REG_DT
+		)
+		SELECT
+			   VENDOR_ID
+				, EXTMALL_ID
+				, EXTMALL_NM
+				, AGENT_ORDER_ID
+				, EXTMALL_ORDER_ID
+				, EXTMALL_PROD_ID
+				, EXTMALL_PROD_NM
+				, GOODS_CD
+				, SKU
+				, CURR_PRICE
+				, ORD_QTY
+				, ORD_AMT
+				, CPN_DC_AMT
+				, PNT_DC_AMT
+				, DELV_FEE
+				, ORD_RECV_DT
+				, ORD_DT
+				, ORD_NM
+				, ORD_PHNNO
+				, ORD_TELNO
+				, ORD_EMAIL
+				, RECIP_NM
+				, RECIP_PHNNO
+				, RECIP_TELNO
+				, RECIP_ZIPCODE
+				, RECIP_BASE_ADDR
+				, RECIP_DTL_ADDR
+				, DELV_MEMO
+				, UPLOAD_STAT
+				, UPLOAD_FAIL_CD
+				, UPLOAD_FAIL_REASON
+				, ORD_NO
+				, DELV_ADDR_SQ
+				, OPT_CD
+				, UPLOAD_GB
+				, REG_NO
+				, REG_DT
+		 FROM   TB_EXTMALL_ORDER_UPLOAD_TMP A
+		 WHERE A.REG_NO = #{regNo}
+
+	</insert>
+
+	<!-- 외부몰주문등록 업로드 후 목록 -->
+	<select id="getExtmallOrderUploadSecondList" parameterType="ExtmallOrder" resultType="ExtmallOrder">
+	/* TsaOcm.getExtmallOrderUploadSecondList */
+		SELECT A.*
+		FROM
+		(
+			SELECT
+					ROW_NUMBER() OVER(PARTITION BY A.VENDOR_ID, A.EXTMALL_ID, A.AGENT_ORDER_ID, A.EXTMALL_ORDER_ID ORDER BY A.REG_DT DESC) AS RANKING
+					, A.VENDOR_ID
+					, A.EXTMALL_ID
+					, (SELECT S.EXTMALL_NM FROM TB_EXTMALL S WHERE S.EXTMALL_ID = A.EXTMALL_ID) AS EXTMALL_NM
+					, A.AGENT_ORDER_ID
+					, A.EXTMALL_ORDER_ID
+					, A.EXTMALL_PROD_ID
+					, A.EXTMALL_PROD_NM
+					, A.GOODS_CD
+					, A.SKU
+					, A.CURR_PRICE
+					, A.ORD_QTY
+					, A.ORD_AMT
+					, A.CPN_DC_AMT
+					, A.PNT_DC_AMT
+					, A.DELV_FEE
+					, A.ORD_RECV_DT
+					, A.ORD_DT
+					, A.ORD_NM
+					, A.ORD_PHNNO
+					, A.ORD_TELNO
+					, A.ORD_EMAIL
+					, A.RECIP_NM
+					, A.RECIP_PHNNO
+					, A.RECIP_TELNO
+					, A.RECIP_ZIPCODE
+					, A.RECIP_BASE_ADDR
+					, A.RECIP_DTL_ADDR
+					, A.DELV_MEMO
+					, A.UPLOAD_STAT
+					, FN_GET_CODE_NM('G021', A.UPLOAD_STAT) AS UPLOAD_STAT_NM
+					, A.UPLOAD_FAIL_CD
+					, FN_GET_CODE_NM('G022', A.UPLOAD_FAIL_CD) AS UPLOAD_FAIL_NM
+					, A.UPLOAD_FAIL_REASON
+					, (SELECT MAX(ORD_NO) FROM TB_ORDER_DETAIL OD WHERE A.VENDOR_ID = OD.VENDOR_ID AND A.EXTMALL_ID = OD.EXTMALL_ID
+						AND A.AGENT_ORDER_ID = OD.AGENT_ORDER_ID AND A.EXTMALL_ORDER_ID = OD.EXTMALL_ORDER_ID) AS ORD_NO
+					, A.DELV_ADDR_SQ
+					, A.OPT_CD
+					, A.UPLOAD_GB
+					, A.REG_NO
+					, A.REG_DT
+			FROM   TB_EXTMALL_ORDER_UPLOAD A
+			     , TB_EXTMALL_ORDER_UPLOAD_TMP B
+			WHERE  A.VENDOR_ID = B.VENDOR_ID
+			AND    A.EXTMALL_ID = B.EXTMALL_ID
+			AND    A.AGENT_ORDER_ID = B.AGENT_ORDER_ID
+			AND    A.EXTMALL_ORDER_ID = B.EXTMALL_ORDER_ID
+			AND    A.UPLOAD_GB = 'E'
+			AND    B.REG_NO = #{regNo}
+		) A WHERE A.RANKING = 1
+	</select>
+
+
+	<!-- 외부몰주문등록 업로드 후 결과 수량 -->
+	<select id="getExtmallOrderUploadResultInfo" parameterType="ExtmallOrder" resultType="ExtmallOrder">
+		SELECT
+			 COUNT(IF(UPLOAD_STAT ='G021_40', 1, NULL)) AS FAIL_CNT
+			, COUNT(IF(UPLOAD_STAT = 'G021_30', 1, NULL)) AS SUCC_CNT
+		FROM
+		(
+			SELECT
+				ROW_NUMBER() OVER(PARTITION BY A.VENDOR_ID, A.EXTMALL_ID, A.AGENT_ORDER_ID, A.EXTMALL_ORDER_ID ORDER BY A.REG_DT DESC) AS RANKING
+				, A.VENDOR_ID
+				, A.EXTMALL_ID
+				, A.EXTMALL_NM
+				, A.AGENT_ORDER_ID
+				, A.EXTMALL_ORDER_ID
+				, A.UPLOAD_STAT
+				, A.UPLOAD_FAIL_CD
+			FROM   TB_EXTMALL_ORDER_UPLOAD A
+			     , TB_EXTMALL_ORDER_UPLOAD_TMP B
+			WHERE  A.VENDOR_ID = B.VENDOR_ID
+			AND    A.EXTMALL_ID = B.EXTMALL_ID
+			AND    A.AGENT_ORDER_ID = B.AGENT_ORDER_ID
+			AND    A.EXTMALL_ORDER_ID = B.EXTMALL_ORDER_ID
+			AND    A.UPLOAD_GB = 'E'
+			AND    B.REG_NO = #{regNo}
+		) A  WHERE A.RANKING = 1
+	</select>
+
+	<insert id="insertTestNotiInfo" parameterType="ExtmallOrder">
+		INSERT INTO TEST_SHOPLINKER_NOTI_HST (
+		       EXTMALL_ID
+		     , EXTMALL_ORDER_ID
+		     , NOTI_INFO
+		     , REG_DT
+		)
+		VALUES (
+		     #{extmallId}
+		     , #{extmallOrderId}
+		     , #{sku}
+		     , NOW()
+		)
+
+	</insert>
+
+
+</mapper>

+ 900 - 0
src/main/java/com/style24/persistence/mybatis/shop/TscShoplinker.xml

@@ -0,0 +1,900 @@
+<?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.core.biz.dao.TscShoplinkerDao">
+
+	<!-- 시퀀스 값 조회 -->
+	<select id="getNextOrderIfIdx" parameterType="String" resultType="Integer">
+		/* TscShoplinkerDao.getNextOrderIfIdx */
+		SELECT IFNULL((SELECT
+						MAX(ORDER_IF_IDX) + 1
+					   FROM SHOPLINKER_ORDER
+		              ),0) + 1 AS NEXT_VAL
+	</select>
+
+	<!-- 샵링커 전송 이력 -->
+	<insert id="insertShoplinerApiHst" parameterType="ShoplinkerGoods">
+		/* TscShoplinkerDao.insertShoplinerApiHst */
+		INSERT INTO SHOPLINKER_SYNC_HST (
+		      LOG_SQ
+			, API_TYPE
+			, API_RESULT
+			, API_MESSAGE
+			, API_PRODUCT_ID
+			, GOODS_CD
+			, OPT_CD
+			, QTY
+			, ORD_DTL_NO
+			, XML_TXT
+			, REG_NO
+			, REG_DT
+		)
+		VALUES (
+		      null
+		    , #{apiType}
+			, #{apiResult}
+			, #{apiMessage}
+			, #{apiProductId}
+			, #{goodsCd}
+			, #{optCd}
+			, #{quantity}
+			, #{ordDtlNo}
+			, #{xmlTxt}
+			, #{regNo}
+		    , NOW()
+		)
+	</insert>
+
+	<!-- 샵링커 api 호출 가능여부   -->
+	<select id="getCallRunableInfo" parameterType="ShoplinkerSearch" resultType="ShoplinkerSearch">
+		/* TscShoplinkerDao.getCallRunableInfo */
+		SELECT
+			SID
+			, RUN_STAT
+			, RUN_STDT
+			, RUN_EDDT
+			, TXT
+			, (SELECT COUNT(1) FROM SHOPLINKER_RUNABLE S WHERE S.API_TYPE = A.API_TYPE AND S.RUN_EDDT IS NULL
+				<if test='apiType != null and apiType == "GOODS"'>AND REG_NO = #{regNo}</if>
+			  ) AS RUN_CNT
+			, (SELECT COUNT(1) FROM SHOPLINKER_ORDER S WHERE S.EXTMALL_REG_YN = 'N' AND S.SKU_MATCH_CODE != '') AS REMAIN_EXT_CNT
+			, (SELECT COUNT(1) FROM TB_EXTMALL_ORDER_UPLOAD WHERE UPLOAD_STAT = 'G021_00' AND UPLOAD_GB = 'S') AS REMAIN_STYLE_CNT
+		FROM SHOPLINKER_RUNABLE A
+		WHERE A.API_TYPE = #{apiType}
+		ORDER BY RUN_STDT DESC
+		LIMIT 1
+	</select>
+
+	<!-- 샵링커 api 호출 가능여부 상태 저장  -->
+	<insert id="saveCallApiRunable" parameterType="ShoplinkerSearch">
+		/* TscShoplinkerDao.saveCallApiRunable */
+		INSERT INTO SHOPLINKER_RUNABLE (
+		    SID
+		    , API_TYPE
+			, RUN_STDT
+			, RUN_EDDT
+			, RUN_STAT
+			, REG_NO
+			, TXT
+		)
+		VALUES (
+			#{sid}
+		    , #{apiType}
+			, NOW()
+			, null
+			, 'START'
+			, #{regNo}
+			, null
+		) ON DUPLICATE KEY UPDATE
+		  	RUN_EDDT = NOW()
+			, RUN_STAT = #{runStat}
+			, TXT = CONCAT(ifnull(TXT, ''), #{txt})
+	</insert>
+
+	<!-- 샵링커 api 호출 가능여부 상태 수정  -->
+	<update id="updateCallApiRunable" parameterType="ShoplinkerSearch">
+	/* TscShoplinkerDao.updateCallApiRunable */
+		UPDATE SHOPLINKER_RUNABLE
+		SET
+			RUN_STAT = #{runStat}
+			, TXT = CONCAT(ifnull(TXT, ''), #{txt})
+			<if test='runStat != null and runStat == "END"'>
+			, RUN_EDDT = NOW()
+			</if>
+		WHERE SID = #{sid}
+	</update>
+
+
+	<!-- 상품등록-단품 목록 조회 -->
+	<select id="getOptionList" parameterType="ShoplinkerGoods" resultType="ShoplinkerGoods">
+		/* TscShoplinkerDao.getOptionList */
+		SELECT
+			A.GOODS_CD
+			, B.OPT_CD AS PARTNER_PRODUCT_ID
+			, B.OPT_CD
+			, B.OPT_CD1
+			, B.OPT_CD2
+		   /*, IF(B.CURR_STOCK_QTY - B.BASE_STOCK_QTY <![CDATA[<]]> 1, 1 , B.CURR_STOCK_QTY - B.BASE_STOCK_QTY) AS QUANTITY -- 기준재고(안전재고)수량
+		   , B.STORE_STOCK_QTY -- 매장재고수량
+		   , B.CURR_STOCK_QTY -- 현재고수량
+		   */
+			, A.SELF_GOODS_YN
+			, IF(VS.CURR_STOCK_QTY <![CDATA[<]]> 1, 1, VS.CURR_STOCK_QTY) AS QUANTITY   	-- 현재고
+			, VS.BASE_STOCK_QTY 	-- 안전재고
+		FROM VW_STOCK VS inner join tb_goods A on VS.GOODS_CD = A.GOODS_CD
+		INNER JOIN tb_option B on VS.GOODS_CD = B.GOODS_CD AND A.GOODS_CD = B.GOODS_CD and VS.OPT_CD = B.OPT_CD
+		WHERE VS.GOODS_CD = #{goodsCd}
+
+		ORDER BY cast(REPLACE(B.OPT_CD, '-', '') as unsigned)
+	</select>
+
+	<!-- 상품등록-상품 상세 -->
+	<select id="getGoods" parameterType="ShoplinkerGoods" resultType="ShoplinkerGoods">
+		/* TscShoplinkerDao.getGoods */
+		SELECT
+			GOODS_CD
+			, A.BRAND_CD
+			, IFNULL((SELECT S.SYNC_YN FROM TB_EXTMALL_PRICE_SYNC S WHERE S.VENDOR_ID = 'G003_V001' and S.BRAND_CD = A.BRAND_CD), 'N') as SYNC_YN
+			, (SELECT REPLACE(REPLACE(BRAND_ENM, ' ', '_'), '\'', '') FROM TB_BRAND S WHERE S.BRAND_CD = A.BRAND_CD AND S.USE_YN = 'Y') AS BRAND_ENM
+			, '999999999' AS ATTRIBUTE_TITLE_CODE
+			, (SELECT GROUP_CONCAT(OPT_CD ORDER BY CAST(REPLACE(OPT_CD, '-', '') AS UNSIGNED) SEPARATOR ',')  FROM TB_OPTION S WHERE A.GOODS_CD = S.GOODS_CD) AS ATTRIBUTE_PARTNER_PRODUCT_ID
+			, GOODS_NM AS PRODUCT_NAME
+
+			, TOBE_FORM_YN
+			, (SELECT GOODS_DESC FROM TB_GOODS_DESC S WHERE A.GOODS_CD = S.GOODS_CD AND DESC_GB= '80' LIMIT 1) AS DETAIL_DESC
+			, (SELECT GOODS_DESC FROM TB_GOODS_DESC S WHERE A.GOODS_CD = S.GOODS_CD AND DESC_GB= '10' LIMIT 1) AS DETAIL_DESC_NEW_10
+			, (SELECT GOODS_DESC FROM TB_GOODS_DESC S WHERE A.GOODS_CD = S.GOODS_CD AND DESC_GB= '20' LIMIT 1) AS DETAIL_DESC_NEW_20
+			, (SELECT GOODS_DESC FROM TB_GOODS_DESC S WHERE A.GOODS_CD = S.GOODS_CD AND DESC_GB= '30' LIMIT 1) AS DETAIL_DESC_NEW_30
+			, (SELECT S.MODEL_INFO FROM TB_GOODS_MODEL_INFO S WHERE S.GOODS_CD = A.GOODS_CD) AS MODEL_INFO
+
+			, '' AS MARKET_PRICE -- 쇼핑몰시중가(도서정가)
+			, CURR_PRICE AS SALE_PRICE -- 쇼핑몰판매가
+			, LIST_PRICE AS SUPPLY_PRICE -- 쇼핑몰공급가
+			, '' AS MARKET_PRICE_P -- 매입처 시중가(도서정가)
+			, '' AS SALE_PRICE_P -- 매입처 판매가
+			, '' AS SUPPLY_PRICE_P -- 매입처 공급가
+			, '001' AS SALE_STATUS -- 상품판매상태
+			, MAKE_YMD AS MAKER_DT -- 발행일(제조일)
+			, '001' AS TAX_YN -- 과세
+			, '' AS NEW_DESC_TOP -- 신상세설명
+			, '전국' AS SALEAREA
+			-- , SEX_GB
+			-- , FN_GET_CODE_NM('G007', SEX_GB) AS SEX_NM
+			, (CASE SEX_GB WHEN 'G007_M' THEN '002' WHEN 'G007_F' THEN '003' ELSE '001' END) AS SEX -- 샵링커 성별
+			, GOODS_CD AS MODEL -- 모델명
+			, GOODS_CD AS MODEL_NO -- 모델NO
+			, (SELECT BRAND_ENM FROM TB_BRAND S WHERE A.BRAND_CD = S.BRAND_CD AND USE_YN = 'Y') AS BRAND -- 브랜드명
+			, ( SELECT CERT_NUM FROM TB_GOODS_SAFE_NO S WHERE A.GOODS_CD = S.GOODS_CD ) AS AUTH_NO -- 인증번호
+			, '20991231' AS EXPIRYDATE -- 유효일
+			, (SELECT NI_CONTENT FROM TB_GOODS_NOTI_INFO S WHERE A.GOODS_CD = S.GOODS_CD AND NI_ITEM_CD = 'G005_005') AS MAKER -- 제조업체
+			, IFNULL((select S.EXTMALL_ORIGIN_NM from TB_EXTMALL_ORIGIN S where S.ORIGIN_CD = A.ORIGIN_CD), '') AS ORIGIN -- 원산지명 OR 코드
+			, ADULT_YN AS ADULT_INFO -- 성인상품
+
+			, A.ITEMKIND_CD
+			, C.ITEMKIND_NM AS SHOPLINKER_ITEMKIND_NM
+			, C.SL_CATE1_CD AS CCATEGORY_L
+			, C.SL_CATE2_CD AS CCATEGORY_M
+			, C.SL_CATE3_CD AS CCATEGORY_S
+			, C.SL_CATE4_CD AS CCATEGORY_D
+
+			, MAIN_COLOR_CD
+			, SELF_GOODS_YN
+			, (SELECT COLOR_ENM FROM TB_COLOR WHERE COLOR_CD = MAIN_COLOR_CD) AS MAIN_COLOR_ENM
+			, (SELECT GROUP_CONCAT(opt_cd1 order BY cast(REPLACE(OPT_CD, '-', '') as unsigned) SEPARATOR ',')
+				FROM (
+				    SELECT
+				        GOODS_CD, opt_cd, opt_cd1
+				        , ROW_NUMBER() OVER (PARTITION BY opt_cd1 ORDER BY opt_cd ) AS RankNo
+				    FROM tb_option WHERE GOODS_CD = a.GOODS_CD
+				) T WHERE RankNo = 1
+			 ) as all_opt_cd1
+			, CASE
+				WHEN SUBSTRING(A.ITEMKIND_CD, 1, 2) = '08' || SUBSTRING(A.ITEMKIND_CD, 1, 2) = '09'
+					|| SUBSTRING(A.ITEMKIND_CD, 1, 2) = '10' || SUBSTRING(A.ITEMKIND_CD, 1, 2) = '11'
+					|| SUBSTRING(A.ITEMKIND_CD, 1, 2) = '12' || SUBSTRING(A.ITEMKIND_CD, 1, 2) = '13'
+			  	THEN 'Y'
+			  	ELSE 'N'
+			  END KIDS_YN
+		FROM TB_GOODS A
+			LEFT OUTER JOIN TB_ITEMKIND B ON A.ITEMKIND_CD = B.ITEMKIND_CD
+ 			LEFT OUTER JOIN SHOPLINKER_CATE C ON B.ITEMKIND_CD = C.ITEMKIND_CD AND A.BRAND_CD = C.BRAND_CD
+		WHERE A.GOODS_CD = #{goodsCd}
+		AND A.SELF_GOODS_YN = 'Y'
+		limit 1
+
+	</select>
+
+	<!-- 상품등록-상품 이미지 조회 -->
+	<select id="getGoodsImageList" parameterType="ShoplinkerGoods" resultType="ShoplinkerGoods">
+		/* TscShoplinkerDao.getGoodsImageList */
+		SELECT
+			B.GOODS_CD
+		     , B.COLOR_CD
+		     , C.COLOR_KNM
+		     , B.DISP_ORD
+		     , B.SYS_IMG_NM
+		     , B.DEFAULT_IMG_YN
+		     , B.EXTMALL_IMG_YN
+		FROM   TB_GOODS A INNER JOIN TB_GOODS_IMG B ON A.GOODS_CD = B.GOODS_CD
+				LEFT OUTER JOIN TB_COLOR C ON B.COLOR_CD = C.COLOR_CD
+		WHERE A.GOODS_CD = #{goodsCd}
+		<if test='extmallImgYn != null and extmallImgYn == "Y"'>
+			AND A.MAIN_COLOR_CD = B.COLOR_CD
+        	AND (B.DEFAULT_IMG_YN = 'Y' OR B.EXTMALL_IMG_YN = 'Y')
+        </if>
+        <if test='colorListYn != null and colorListYn == "Y"'>
+
+        </if>
+		ORDER BY B.COLOR_CD, B.DISP_ORD
+	</select>
+
+	<!-- 상품등록-상품 사이즈 조회 -->
+	<select id="getGoodsSizeList" parameterType="ShoplinkerGoods" resultType="ShoplinkerGoods">
+		/* TscShoplinkerDao.getGoodsSizeList */
+		SELECT
+			 A.OPT_CD2
+			, B.TYPECD as SIZE_TYPECD
+			, B.VALUE1 as SIZE_VALUE1
+			, B.VALUE2 as SIZE_VALUE2
+			, B.VALUE3 as SIZE_VALUE3
+			, B.VALUE4 as SIZE_VALUE4
+			, B.VALUE5 as SIZE_VALUE5
+
+		FROM TB_OPTION A INNER JOIN TB_IF_MEASUREMENT B ON A.OPT_CD = B.SKUCODE /*A.PRODUCT_NO = B.PRODUCTNO*/
+		WHERE A.GOODS_CD = #{goodsCd}
+		GROUP BY A.OPT_CD2, B.TYPECD, B.VALUE1, B.VALUE2, B.VALUE3, B.VALUE4, B.VALUE5
+		ORDER BY A.OPT_CD2
+	</select>
+
+
+	<!-- 상품등록-고시정보 -->
+	<select id="getGoodsNotiList" parameterType="ShoplinkerGoods" resultType="ShoplinkerGoods">
+		/* TscShoplinkerDao.getGoodsNotiList */
+		SELECT
+			A.GOODS_CD as partner_product_id
+			, A.GOODS_NM
+			/*, B.NI_CLSF_CD
+			, B.NI_ITEM_CD */
+			, C.NI_CLSF_CD
+			, C.NI_ITEM_CD
+			, C.EXTMALL_NI_CLSF_CD as lclass_id
+			, C.EXTMALL_NI_ITEM_CD as item_seq
+			, B.NI_CONTENT as item_info
+			, FN_GET_CODE_NM('G005', C.NI_ITEM_CD) AS NI_CONTENT_INFO
+			, A.SELF_GOODS_YN = 'Y'
+		FROM TB_GOODS A INNER JOIN TB_GOODS_NOTI_INFO B INNER JOIN TB_EXTMALL_NOTI_INFO C
+		ON A.GOODS_CD = B.GOODS_CD
+		AND B.NI_CLSF_CD = C.NI_CLSF_CD
+		AND B.NI_ITEM_CD = C.NI_ITEM_CD
+		AND A.GOODS_CD = #{goodsCd}
+	</select>
+
+	<!-- 상품등록-인증정보 -->
+	<select id="getCert" parameterType="ShoplinkerGoods" resultType="ShoplinkerGoods">
+		/* TscShoplinkerDao.getCert */
+		SELECT
+			B.GOODS_CD AS PARTNER_PRODUCT_ID
+			, CASE B.CERT_ORGAN_NAME
+				WHEN NULL THEN '.' WHEN '' THEN '.'
+				ELSE B.CERT_ORGAN_NAME
+			 END AS CERT_ORGAN
+			, IFNULL(B.CERT_NUM, '') AS CERT_NO
+			, A.SELF_GOODS_YN
+
+			, B.CERT_TARGET_GB
+			, FN_GET_CODE_NM('G083', CERT_TARGET_GB) AS CERT_TARGET_NM
+			, CERT_FORM_GB
+			, FN_GET_CODE_NM('G084', CERT_FORM_GB) AS CERT_FORM_NM
+			, CERT_TYPE
+			, FN_GET_CODE_NM('G081', CERT_TYPE) AS CERT_TYPE_NM
+			, CERT_NUM
+			, CERT_STATE
+			, CERT_DIV
+			, CERT_ORGAN_NAME
+			, CERT_DT
+		FROM TB_GOODS A INNER JOIN TB_GOODS_SAFE_NO B
+		ON A.GOODS_CD = B.GOODS_CD
+		WHERE A.GOODS_CD = #{goodsCd}
+	</select>
+
+	<!-- 상품등록-상품 목록 건수 -->
+	<select id="getGoodsSendListCount" parameterType="ShoplinkerSearch" resultType="int">
+		/* TscShoplinkerDao.getGoodsSendListCount */
+		SELECT COUNT(1) FROM
+		(
+			SELECT
+				 B.GOODS_NM
+				, B.BRAND_CD
+				, A.*
+				, fn_get_user_nm(A.REG_NO) AS REG_NM
+			FROM SHOPLINKER_SYNC_HST A
+			LEFT OUTER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
+		) A
+		WHERE 1=1
+		<include refid="getListCondition_sql"/>
+	</select>
+
+	<!-- 상품등록-상품 목록 -->
+	<select id="getGoodsSendList" parameterType="ShoplinkerSearch" resultType="ShoplinkerGoods">
+		/* TscShoplinkerDao.getGoodsSendList */
+		SELECT * FROM
+		(
+			SELECT
+				 B.GOODS_NM
+				, B.BRAND_CD
+				, A.*
+				, fn_get_user_nm(A.REG_NO) AS REG_NM
+			FROM SHOPLINKER_SYNC_HST A
+			LEFT OUTER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
+		) A
+		WHERE 1=1
+		<include refid="getListCondition_sql"/>
+
+		ORDER BY REG_DT DESC
+		LIMIT #{pageable.limitStartRow} ,  #{pageable.pageSize}
+	</select>
+
+	<!-- 상품 목록 조건 정보 -->
+	<sql id="getListCondition_sql">
+
+		        <if test="goodsCd != null and goodsCd != ''">
+		        AND UPPER(A.GOODS_CD) LIKE CONCAT('%',UPPER(#{goodsCd}),'%')
+		        </if>
+		        <if test="arrGoodsCd != null and arrGoodsCd.length>0">
+		        AND UPPER(A.GOODS_CD) IN
+		            <foreach collection="arrGoodsCd" item="item" index="index"  open="(" close=")" separator=",">
+		        UPPER(#{item})
+		            </foreach>
+		        </if>
+		         <if test="goodsNm != null and goodsNm != ''">
+		        AND UPPER(A.GOODS_NM) LIKE CONCAT('%',UPPER(#{goodsNm}),'%')
+		        </if>
+		        <if test="brandCd != null and brandCd != ''">
+		        AND A.BRAND_CD = #{brandCd}
+		        </if>
+		        <if test="multiBrand != null and multiBrand != ''">
+		        AND A.BRAND_CD IN
+		            <foreach collection="multiBrand" item="item" index="index"  open="(" close=")" separator=",">
+		        #{item}
+		            </foreach>
+		        </if>
+
+	            <if test="stDate != null and stDate != ''">
+		        AND A.REG_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+	            </if>
+	            <if test="edDate != null and edDate != ''">
+	            <![CDATA[
+		        AND A.REG_DT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+	            ]]>
+	            </if>
+
+		        <if test="apiType != null and apiType != ''">
+		        AND API_TYPE = #{apiType}
+		        </if>
+		        <if test="apiType == null or apiType == ''">
+		        AND API_TYPE in ('OPTION','PRODUCT','NOTI','CERT','IMAGE')
+		        </if>
+
+		        <if test="apiResult != null and apiResult != ''">
+		        AND API_RESULT = #{apiResult}
+		        </if>
+
+	</sql>
+
+
+	<!-- 샵링커주문수집 - 주문수집등록 -->
+	<insert id="insertShoplinkerOrder" parameterType="ShoplinkerOrder">
+		/* TscShoplinkerDao.insertShoplinkerOrder */
+		INSERT INTO SHOPLINKER_ORDER (
+			ORDER_IF_IDX
+		    , SHOPLINKER_ORDER_ID
+			, MALL_ORDER_ID
+			, MALL_NAME
+			, BAESONG_STATUS
+			, ORDER_NAME
+			, ORDER_TEL
+			, ORDER_CEL
+			, ORDER_EMAIL
+			, RECEIVE
+			, RECEIVE_TEL
+			, RECEIVE_CEL
+			, RECEIVE_ZIPCODE
+			, RECEIVE_ADDR
+			, BAESONG_TYPE
+			, BAESONG_BI
+			, DELIVERY_MSG
+			, ORDER_PRODUCT_ID
+			, SHOPLINKER_PRODUCT_ID
+			, PARTNER_PRODUCT_ID
+			, PRODUCT_NAME
+			, QUANTITY
+			, ORDER_PRICE
+			, SALE_PRICE
+			, SUPPLY_PRICE
+			, SKU
+			, ORDERDATE
+			, ORDER_REG_DATE
+			, DELIVERY_INVOICE
+			, ORDER_SEQ
+			, TOTAL_COUNT
+			, TOTAL_PAGE
+			, TOTAL_STANDARD_COUNT
+			, CURRENTLY_PAGE
+			, CURRENTLY_COUNT
+			, SELLER_ID
+			, ONLY_SKU
+			, ADD_SKU
+			, MALL_ID
+			, DIS_PRICE_MALL
+			, DIS_PRICE_SELLER
+			, DIS_PRICE_COUPON
+			, DIS_PRICE_POINT
+			, DISTRIBUTION_DELIVERY
+			, SKU_MATCH_CODE
+			, SKU_BARCODE
+			, ORDER_CUSTOMS_NUMBER
+			, ORDER_INPUT_TYPE
+			, SUPPLY_ID
+			, DELIVERY
+			, ORDER_USER_ID
+			, CRSPIK_USE
+			, SHIP_NO
+			, DEAL_NO
+			, EXCHANGE_ORDER_YN
+			, ORDER_MAIN_KEY
+			, PAN_TYPE
+			, CHANNEL_TYPE
+			, SHIP_RSV_DATE
+			, ORDER_FLAG
+			, EXTMALL_REG_YN
+			, REG_DT
+		)
+		SELECT
+			#{orderIfIdx}
+		    , #{shoplinkerOrderId}
+			, #{mallOrderId}
+			, #{mallName}
+			, #{baesongStatus}
+			, #{orderName}
+			, #{orderTel}
+			, #{orderCel}
+			, #{orderEmail}
+			, #{receive}
+			, #{receiveTel}
+			, #{receiveCel}
+			, #{receiveZipcode}
+			, #{receiveAddr}
+			, #{baesongType}
+			, #{baesongBi}
+			, #{deliveryMsg}
+			, #{orderProductId}
+			, #{shoplinkerProductId}
+			, #{partnerProductId}
+			, #{productName}
+			, #{quantity}
+			, #{orderPrice}
+			, #{salePrice}
+			, #{supplyPrice}
+			, #{sku}
+			, #{orderdate}
+			, #{orderRegDate}
+			, #{deliveryInvoice}
+			, #{orderSeq}
+			, #{totalCount}
+			, #{totalPage}
+			, #{totalStandardCount}
+			, #{currentlyPage}
+			, #{currentlyCount}
+			, #{sellerId}
+			, #{onlySku}
+			, #{addSku}
+			, #{mallId}
+			, #{disPriceMall}
+			, #{disPriceSeller}
+			, #{disPriceCoupon}
+			, #{disPricePoint}
+			, #{distributionDelivery}
+			, #{skuMatchCode}
+			, #{skuBarcode}
+			, #{orderCustomsNumber}
+			, #{orderInputType}
+			, #{supplyId}
+			, #{delivery}
+			, #{orderUserId}
+			, #{crspikUse}
+			, #{shipNo}
+			, #{dealNo}
+			, #{exchangeOrderYn}
+			, #{orderMainKey}
+			, #{panType}
+			, #{channelType}
+			, #{shipRsvDate}
+			, #{orderFlag}
+			, 'N'
+			, NOW()
+		FROM DUAL
+		WHERE NOT EXISTS(SELECT 1 FROM SHOPLINKER_ORDER WHERE SHOPLINKER_ORDER_ID = #{shoplinkerOrderId} )
+
+	</insert>
+
+	<!-- 샵링커주문수집-목록 건수 cnt -->
+	<select id="getShoplinkerOrderListCount" parameterType="ShoplinkerOrder" resultType="int">
+		/* TscShoplinkerDao.getShoplinkerOrderListCount */
+		select count(1) from (
+			SELECT
+				A.*
+				, B.VENDOR_ID
+				, B.EXTMALL_ID
+				, B.EXTMALL_NM
+				, B.AGENT_ORDER_ID
+				, IFNULL(B.UPLOAD_STAT, 'G021_50') AS UPLOAD_STAT
+				, B.UPLOAD_FAIL_CD
+				, B.UPLOAD_FAIL_REASON
+				, IFNULL(B.ORD_NO, '') AS ORD_NO
+				, B.DELV_ADDR_SQ
+			FROM SHOPLINKER_ORDER A
+				LEFT OUTER JOIN TB_EXTMALL_ORDER_UPLOAD B
+					ON A.SHOPLINKER_ORDER_ID = B.AGENT_ORDER_ID
+					AND A.MALL_ORDER_ID = B.EXTMALL_ORDER_ID AND B.UPLOAD_GB = 'S'
+		) A
+		WHERE 1=1
+		<include refid="getSlkOrderListCondition_sql"/>
+
+	</select>
+
+	<!-- 샵링커주문수집-목록 -->
+	<select id="getShoplinkerOrderList" parameterType="ShoplinkerOrder" resultType="ShoplinkerOrder">
+		/* TscShoplinkerDao.getShoplinkerOrderList */
+		SELECT * FROM
+		(
+			SELECT
+				A.*
+				, B.VENDOR_ID
+				, B.EXTMALL_ID
+				, B.EXTMALL_NM
+				, B.AGENT_ORDER_ID
+				, IFNULL(B.UPLOAD_STAT, 'G021_50') AS UPLOAD_STAT
+				, B.UPLOAD_FAIL_CD
+				, B.UPLOAD_FAIL_REASON
+				, IFNULL(B.ORD_NO, '') AS ORD_NO
+				, B.DELV_ADDR_SQ
+			FROM SHOPLINKER_ORDER A
+				LEFT OUTER JOIN TB_EXTMALL_ORDER_UPLOAD B
+					ON A.SHOPLINKER_ORDER_ID = B.AGENT_ORDER_ID
+					AND A.MALL_ORDER_ID = B.EXTMALL_ORDER_ID AND B.UPLOAD_GB = 'S'
+			WHERE 1=1
+
+
+		) A
+		WHERE 1=1
+		<include refid="getSlkOrderListCondition_sql"/>
+
+		ORDER BY REG_DT DESC
+		LIMIT #{pageable.limitStartRow} ,  #{pageable.pageSize}
+
+	</select>
+
+	<!-- 샵링커주문수집-상세 -->
+	<select id="getShoplinkerOrderInfo" parameterType="ShoplinkerOrder" resultType="ShoplinkerOrder">
+		/* TscShoplinkerDao.getShoplinkerOrderInfo */
+		SELECT
+			*
+		FROM SHOPLINKER_ORDER
+		WHERE SHOPLINKER_ORDER_ID = #{shoplinkerOrderId}
+	</select>
+
+	<!-- 샵링커주문수집- 제휴몰 주문업로드여부 업데이트  -->
+	<update id="updateShoplinkerOrder" parameterType="ShoplinkerOrder">
+	/* TscShoplinkerDao.updateShoplinkerOrder */
+		UPDATE SHOPLINKER_ORDER
+		SET
+			EXTMALL_REG_YN = 'Y'
+		WHERE MALL_ID = #{mallId}
+		AND MALL_ORDER_ID = #{mallOrderId}
+		AND SHOPLINKER_ORDER_ID = #{shoplinkerOrderId}
+	</update>
+
+	<!-- 샵링커주문수집 조건 정보 -->
+	<sql id="getSlkOrderListCondition_sql">
+
+			<if test="dtGb != null and dtGb == 'orderRegDate'">
+				<if test="stDate != null and stDate != ''">
+		        AND A.ORDER_REG_DATE >= DATE_FORMAT(replace(#{stDate}, '-', ''), '%Y%m%d%H%i%S')
+	            </if>
+	            <if test="edDate != null and edDate != ''">
+	            <![CDATA[
+		        AND A.ORDER_REG_DATE < DATE_FORMAT(DATE_ADD(replace(#{edDate}, '-', ''), INTERVAL 1 DAY), '%Y%m%d%H%i%S')
+	            ]]>
+	            </if>
+			</if>
+			<if test="dtGb != null and dtGb == 'orderdate'">
+				<if test="stDate != null and stDate != ''">
+		        AND A.ORDERDATE >= DATE_FORMAT(replace(#{stDate}, '-', ''), '%Y%m%d%H%i%S')
+	            </if>
+	            <if test="edDate != null and edDate != ''">
+	            <![CDATA[
+		        AND A.ORDERDATE < DATE_FORMAT(DATE_ADD(replace(#{edDate}, '-', ''), INTERVAL 1 DAY), '%Y%m%d%H%i%S')
+	            ]]>
+	            </if>
+			</if>
+
+			<if test="extmallId != null and extmallId != ''">
+	        AND MALL_ID = #{extmallId}
+	        </if>
+
+			<if test="uploadStat != null and uploadStat != ''">
+	        AND UPLOAD_STAT = #{uploadStat}
+	        </if>
+	        <if test="uploadFailCd != null and uploadFailCd != ''">
+	        AND UPLOAD_FAIL_CD = #{uploadFailCd}
+	        </if>
+
+	        <if test="shoplinkerOrderId != null and shoplinkerOrderId != ''">
+	        AND SHOPLINKER_ORDER_ID = #{shoplinkerOrderId}
+	        </if>
+	        <if test="mallOrderId != null and mallOrderId != ''">
+	        AND MALL_ORDER_ID = #{mallOrderId}
+	        </if>
+	        <if test="ordNo != null and ordNo != ''">
+	        AND ORD_NO = #{ordNo}
+	        </if>
+	</sql>
+
+
+	<!-- 제휴몰 주문등록 상세 -->
+	<select id="getExtmallOrderInfo" parameterType="String" resultType="ExtmallOrder">
+		/* TscShoplinkerDao.getExtmallOrderInfo */
+		SELECT
+			A.*
+			, FN_GET_USER_NM(A.REG_NO) AS REG_NM
+			, FN_GET_CODE_NM('G021', UPLOAD_STAT) AS UPLOAD_STAT_NM
+			, FN_GET_CODE_NM('G022', UPLOAD_FAIL_CD) AS UPLOAD_FAIL_NM
+			, FN_GET_CODE_NM('G003', A.VENDOR_ID) AS VENDOR_NM
+		FROM TB_EXTMALL_ORDER_UPLOAD A
+		WHERE AGENT_ORDER_ID = #{agentOrderId}
+		AND A.UPLOAD_GB = 'S'
+
+	</select>
+
+	<!-- 제휴몰 주문등록 대상목록 SKU_MATCH_CODE가 없는 것은 딜상품(딜상품은 엑셀 수동등록)-->
+	<select id="getShoplinkerRegExtmallList" parameterType="ShoplinkerOrder" resultType="ShoplinkerOrder">
+		/* TscShoplinkerDao.getShoplinkerRegExtmallList */
+		SELECT
+			  A.*
+		FROM SHOPLINKER_ORDER A
+		WHERE A.EXTMALL_REG_YN = 'N'
+		AND A.SKU_MATCH_CODE IS NOT NULL
+		AND A.SKU_MATCH_CODE != ''
+		ORDER BY A.MALL_ID, A.MALL_ORDER_ID, A.SHOPLINKER_ORDER_ID
+	</select>
+
+	<!-- 제휴몰 대기상태건들 실패로 업데이트(오류로인해 성공/실패 처리가 안된건이 있을경우 대비용) -->
+	<update id="updateShoplinkerExtmallWaitList">
+	/* TscShoplinkerDao.updateShoplinkerExtmallWaitList */
+		UPDATE TB_EXTMALL_ORDER_UPLOAD
+			SET UPLOAD_FAIL_CD = 'G022_90'
+				, UPLOAD_FAIL_REASON = '관리자확인요망!! 성공/실패 결과 없음. 오류여부 확인요망'
+		WHERE VENDOR_ID = 'G003_V001'
+		AND UPLOAD_STAT = 'G021_00'
+		AND UPLOAD_GB = 'S'
+	</update>
+
+	<!-- 송장전송-전송 목록 건수 cnt -->
+	<select id="getSendInvoiceListCount" parameterType="ShoplinkerInvoice" resultType="int">
+		/* TscShoplinkerDao.getSendInvoiceListCount */
+		select count(1) from (
+			SELECT
+				OD.ORD_NO
+				, OD.ORD_DTL_NO
+				, (SELECT SHIP_COMP_NM FROM TB_SHIP_COMPANY S WHERE S.SHIP_COMP_CD = OD.SHIP_COMP_CD ) AS SHIP_COMP_NM
+				, OD.SHIP_COMP_CD AS DELIVERY_CODE-- 배송업체(택배사코드)
+				, OD.INVOICE_NO AS DELIVERY_INVOICE-- 송장번호
+
+				, OD.VENDOR_ID -- 외부몰벤더ID
+				, OD.EXTMALL_ID -- 외부몰ID(외부몰)
+				, OD.AGENT_ORDER_ID -- 에이전트주문번호
+				, OD.EXTMALL_ORDER_ID -- 외부몰주문번호
+				, OD.DELV_ASSIGN_STAT -- 출고지정상태(P:대기,Y:수락,N:거부)
+				, OD.ORD_EXCH_GB -- 주문교환구분(O:주문,E:교환)
+				, OD.ORD_DTL_STAT -- 주문상세상태(공통코드G013)
+				, FN_GET_CODE_NM('G013', OD.ORD_DTL_STAT) AS ORD_DTL_STAT_NM
+				, OD.DELV_STDT
+
+				, SL.API_RESULT
+				, SL.API_MESSAGE
+				, SL.XML_TXT
+				, FN_GET_USER_NM(SL.REG_NO) AS REG_NM
+			FROM
+				TB_ORDER_DETAIL OD
+				LEFT OUTER JOIN SHOPLINKER_SYNC_HST SL ON OD.ORD_DTL_NO = SL.ORD_DTL_NO AND SL.API_TYPE = 'INVOICE'
+			WHERE OD.VENDOR_ID = 'G003_V001'
+			ORDER BY OD.ORD_NO, OD.ORD_DTL_NO
+		) A
+		WHERE 1=1
+		<include refid="getSlkInvoiceCondition_sql"/>
+
+	</select>
+
+	<!-- 송장전송-전송 목록 -->
+	<select id="getSendInvoiceList" parameterType="ShoplinkerInvoice" resultType="ShoplinkerInvoice">
+		/* TscShoplinkerDao.getSendInvoiceList */
+		SELECT * FROM
+		(
+			SELECT
+				OD.ORD_NO
+				, OD.ORD_DTL_NO
+				, (SELECT SHIP_COMP_NM FROM TB_SHIP_COMPANY S WHERE S.SHIP_COMP_CD = OD.SHIP_COMP_CD ) AS SHIP_COMP_NM
+				, OD.SHIP_COMP_CD AS DELIVERY_CODE-- 배송업체(택배사코드)
+				, OD.INVOICE_NO AS DELIVERY_INVOICE-- 송장번호
+
+				, OD.VENDOR_ID -- 외부몰벤더ID
+				, OD.EXTMALL_ID -- 외부몰ID(외부몰)
+				, OD.AGENT_ORDER_ID -- 에이전트주문번호
+				, OD.EXTMALL_ORDER_ID -- 외부몰주문번호
+				, OD.DELV_ASSIGN_STAT -- 출고지정상태(P:대기,Y:수락,N:거부)
+				, OD.ORD_EXCH_GB -- 주문교환구분(O:주문,E:교환)
+				, OD.ORD_DTL_STAT -- 주문상세상태(공통코드G013)
+				, FN_GET_CODE_NM('G013', OD.ORD_DTL_STAT) AS ORD_DTL_STAT_NM
+				, OD.DELV_STDT
+
+				, SL.API_RESULT
+				, SL.API_MESSAGE
+				, SL.XML_TXT
+				, SL.REG_DT
+			FROM
+				TB_ORDER_DETAIL OD
+				LEFT OUTER JOIN SHOPLINKER_SYNC_HST SL ON OD.ORD_DTL_NO = SL.ORD_DTL_NO AND SL.API_TYPE = 'INVOICE'
+			WHERE OD.VENDOR_ID = 'G003_V001'
+			ORDER BY OD.ORD_NO, OD.ORD_DTL_NO
+		) A
+		WHERE 1=1
+		<include refid="getSlkInvoiceCondition_sql"/>
+
+		LIMIT #{pageable.limitStartRow} ,  #{pageable.pageSize}
+	</select>
+
+	<!-- 송장전송-상세목록 -->
+	<select id="getShoplinkerInvoiceOrdDtlList" resultType="ShoplinkerInvoice">
+		/* TscShoplinkerDao.getShoplinkerInvoiceOrdDtlList */
+		SELECT
+			B.ORD_NO
+			, B.ORD_DTL_NO
+
+		  	, C.SHIP_COMP_NM AS DELIVERY_NAME -- 택배사명
+			, B.SHIP_COMP_CD AS DELIVERY_CODE-- 배송업체(택배사코드)
+			, B.INVOICE_NO AS DELIVERY_INVOICE-- 송장번호
+
+			, B.VENDOR_ID -- 외부몰벤더ID
+			, B.EXTMALL_ID -- 외부몰ID(외부몰)
+			, (select EXTMALL_NM from tb_extmall te where TE.USE_YN = 'N' and TE.EXTMALL_ID = B.EXTMALL_ID) as EXTMALL_NM
+			, B.AGENT_ORDER_ID -- 에이전트주문번호
+			, B.EXTMALL_ORDER_ID -- 외부몰주문번호
+			, DELV_ASSIGN_STAT -- 출고지정상태(P:대기,Y:수락,N:거부)
+			, ORD_EXCH_GB -- 주문교환구분(O:주문,E:교환)
+			, ORD_DTL_STAT -- 주문상세상태(공통코드G013)
+			, FN_GET_CODE_NM('G013', ORD_DTL_STAT) AS ORD_DTL_STAT_NM
+		from
+			TB_ORDER A
+			inner join TB_ORDER_DETAIL B on A.ORD_NO = B.ORD_NO
+		  	inner join TB_SHIP_COMPANY C on B.SHIP_COMP_CD = C.SHIP_COMP_CD
+
+		WHERE A.MALL_GB = 'G011_20'
+		and B.VENDOR_ID = 'G003_V001'
+	 	and B.INVOICE_NO is not null
+	 	and B.ORD_DTL_STAT = 'G013_50' -- 배송중
+		and B.DELV_STDT IS NOT NULL
+		AND NOT EXISTS(SELECT 1 FROM SHOPLINKER_SYNC_HST S
+			WHERE S.API_TYPE = 'INVOICE' AND S.ORD_DTL_NO = B.ORD_DTL_NO
+			AND API_RESULT = 'true'
+			)
+		ORDER BY ORD_NO, ORD_DTL_NO
+	</select>
+
+	<!-- 상품 목록 조건 정보 -->
+	<sql id="getSlkInvoiceCondition_sql">
+
+			<if test="stDate != null and stDate != ''">
+	        AND DELV_STDT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+            </if>
+            <if test="edDate != null and edDate != ''">
+            <![CDATA[
+	        AND DELV_STDT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+            ]]>
+            </if>
+
+			<if test="extmallId != null and extmallId != ''">
+	        AND EXTMALL_ID = #{extmallId}
+	        </if>
+
+	        <if test="apiResult != null and apiResult != ''">
+	        AND API_RESULT = #{apiResult}
+	        </if>
+
+	        <if test="agentOrderId != null and agentOrderId != ''">
+	        AND AGENT_ORDER_ID = #{agentOrderId}
+	        </if>
+	        <if test="extmallOrderId != null and extmallOrderId != ''">
+	        AND EXTMALL_ORDER_ID = #{extmallOrderId}
+	        </if>
+	        <if test="ordNo != null and ordNo != ''">
+	        AND ORD_NO = #{ordNo}
+	        </if>
+	</sql>
+
+
+	<!-- 재고-단품 등록 -->
+	<insert id="insertStockOption" parameterType="ShoplinkerGoods">
+		/* TscShoplinkerDao.insertStockOption */
+		INSERT INTO SHOPLINKER_STOCK (
+		    GOODS_CD
+			, OPT_CD
+			, STOCK_QTY
+			, SEND_YN
+			, SEND_DT
+			, REG_DT
+			, UPD_DT
+		)
+		VALUES (
+			#{goodsCd}
+			, #{optCd}
+			, #{quantity}
+			, 'Y'
+			, now()
+			, now()
+			, now()
+		) ON DUPLICATE KEY UPDATE
+		  	UPD_DT = now()
+	</insert>
+
+	<!-- 재고전송-목록 건수 -->
+	<select id="getStockListCount" parameterType="ShoplinkerSearch" resultType="int">
+		/* TscShoplinkerDao.getStockListCount */
+		SELECT COUNT(1) FROM (
+			SELECT
+				A.*
+				, B.GOODS_NM
+				, C.OPT_CD1
+				, C.OPT_CD2
+			FROM
+				SHOPLINKER_SYNC_HST A
+				INNER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
+				INNER JOIN TB_OPTION C ON A.GOODS_CD = C.GOODS_CD AND A.OPT_CD = C.OPT_CD
+			WHERE A.API_TYPE = 'STOCK'
+			ORDER BY A.REG_DT DESC, A.GOODS_CD, A.OPT_CD
+		) A
+		WHERE 1=1
+		<include refid="getListCondition_sql"/>
+
+	</select>
+
+	<!-- 재고전송-목록 -->
+	<select id="getStockListList" parameterType="ShoplinkerSearch" resultType="ShoplinkerGoods">
+		/* TscShoplinkerDao.getStockListList */
+		SELECT * FROM
+		(
+			SELECT
+				A.API_TYPE
+				, A.API_RESULT
+				, A.API_MESSAGE
+				, A.GOODS_CD
+				, A.OPT_CD
+				, A.QTY as QUANTITY
+				, A.REG_DT
+				, B.GOODS_NM
+				, C.OPT_CD1
+				, C.OPT_CD2
+			FROM
+				SHOPLINKER_SYNC_HST A
+				INNER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
+				INNER JOIN TB_OPTION C ON A.GOODS_CD = C.GOODS_CD AND A.OPT_CD = C.OPT_CD
+			WHERE A.API_TYPE = 'STOCK'
+			ORDER BY A.REG_DT DESC, A.GOODS_CD, A.OPT_CD
+		) A
+		WHERE 1=1
+		<include refid="getListCondition_sql"/>
+
+		LIMIT #{pageable.limitStartRow} ,  #{pageable.pageSize}
+	</select>
+
+</mapper>
+
+