Forráskód Böngészése

샵링커, 제휴몰업로드 작업

jmh 4 éve
szülő
commit
7ca792370b

+ 1 - 1
pom.xml

@@ -121,7 +121,7 @@
 			<artifactId>gagaframework-shoplinker</artifactId>
 			<version>1.7-RELEASE</version>
 			<scope>system</scope>
-			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-shoplinker-1.7-RELEASE.jar</systemPath>
+			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-shoplinker-1.7.2-RELEASE.jar</systemPath>
 		</dependency>
 
 		<!-- /// KCP -->

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

@@ -117,13 +117,13 @@ public interface TsaOcmDao {
 	void updateExtmallOrder(ExtmallOrder extmallOrder);
 
 	/**
-	 * 제휴몰주문등록 - 주문등록 cnt
-	 * @param order
+	 * 제휴몰주문등록 - 주문등록체크정보
+	 * @param extmallOrder
 	 * @return
 	 * @author jmh
 	 * @since 2021. 5. 31
 	 */
-	Order getExtmallOrderCnt(Order order);
+	ExtmallOrder getExtmallOrderInfo(ExtmallOrder extmallOrder);
 
 
 	// ------------------------- 주문등록 소스 -------------------------------------------//
@@ -131,111 +131,111 @@ public interface TsaOcmDao {
 	/**
 	 * 1. 주문기본정보 등록
 	 *
-	 * @param Order - 주문 정보
+	 * @param extmallOrder - 주문 정보
 	 * @return
 	 * @author jmh
 	 * @since 2021. 03. 09
 	 */
-	int createOrder(Order order);
+	int createOrder(ExtmallOrder extmallOrder);
 
 	/**
 	 * 2. 주문배송지정보 등록
 	 *
-	 * @param Order - 주문 정보
+	 * @param extmallOrder - 주문 정보
 	 * @return
 	 * @author jmh
 	 * @since 2021. 03. 09
 	 */
-	int createDeliveryAddr(Order order);
+	int createDeliveryAddr(ExtmallOrder extmallOrder);
 
 	/**
 	 * 3. 주문배송비정보등록 등록
 	 *
-	 * @param Order - 주문 정보
+	 * @param extmallOrder - 주문 정보
 	 * @return
 	 * @author jmh
 	 * @since 2021. 03. 09
 	 */
-	int createDeliveryFee(Order order);
+	int createDeliveryFee(ExtmallOrder extmallOrder);
 
 	/**
 	 * 4. 주문상세정보등록 등록
 	 *
-	 * @param Order - 주문 정보
+	 * @param extmallOrder - 주문 정보
 	 * @return
 	 * @author jmh
 	 * @since 2021. 03. 09
 	 */
-	int createOrderDetail(Order order);
+	int createOrderDetail(ExtmallOrder extmallOrder);
 
 	/**
 	 * 4-2 주문상세 이력 등록
 	 *
-	 * @param Order
+	 * @param extmallOrder
 	 * @return
 	 * @author jmh
 	 * @since 2020. 11. 30
 	 */
-	int createOrderDetailHst(Order order);
+	int createOrderDetailHst(ExtmallOrder extmallOrder);
 
 	/**
 	 * 5. 주문상세단품정보등록 등록
 	 *
-	 * @param Order - 주문 정보
+	 * @param extmallOrder - 주문 정보
 	 * @return
 	 * @author jmh
 	 * @since 2021. 03. 09
 	 */
-	Collection<Order> getOrderDetailItem(Order order);
+	Collection<ExtmallOrder> getOrderDetailItem(ExtmallOrder extmallOrder);
 
 	/**
 	 * 6. 주문상세단품정보등록 등록
 	 *
-	 * @param Order - 주문 정보
+	 * @param extmallOrder - 주문 정보
 	 * @return
 	 * @author jmh
 	 * @since 2021. 03. 09
 	 */
-	int createOrderDetailItem(Order order);
+	int createOrderDetailItem(ExtmallOrder extmallOrder);
 
 	/**
 	 * 7. 주문상세단품이력정보등록 등록
 	 *
-	 * @param Order - 주문 정보
+	 * @param extmallOrder - 주문 정보
 	 * @return
 	 * @author jmh
 	 * @since 2021. 03. 09
 	 */
-	int createOrderDetailItemHst(Order order);
+	int createOrderDetailItemHst(ExtmallOrder extmallOrder);
 
 	/**
 	 * 8. 주문사은품 마스터 정보 등록
 	 *
-	 * @param Order - 주문 정보
+	 * @param extmallOrder - 주문 정보
 	 * @return
 	 * @author jmh
 	 * @since 2021. 03. 09
 	 */
-	int createOrdFreegift(Order order);
+	int createOrdFreegift(ExtmallOrder extmallOrder);
 
 	/**
 	 * 9. 주문사은품 상품 정보 등록
 	 *
-	 * @param Order - 주문 정보
+	 * @param extmallOrder - 주문 정보
 	 * @return
 	 * @author jmh
 	 * @since 2021. 03. 09
 	 */
-	int createOrdFreegiftVal(Order order);
+	int createOrdFreegiftVal(ExtmallOrder extmallOrder);
 
 	/**
 	 * 10. 주문사은품 주문상세 정보 등록
-	 * @param Order - 주문 정보
+	 * @param extmallOrder - 주문 정보
 	 * @return
 	 * @author jmh
 	 * @since 2021. 03. 09
 	 */
-	int createOrdFreegiftDtl(Order order);
+	int createOrdFreegiftDtl(ExtmallOrder extmallOrder);
 
 	/**
 	 * 11. PAYMENT INSERT
@@ -246,21 +246,21 @@ public interface TsaOcmDao {
 
 	/**
 	 * 12. 재고정보등록
-	 * @param Order - 주문 정보
+	 * @param extmallOrder - 주문 정보
 	 * @return
 	 * @author jmh
 	 * @since 2021. 03. 09
 	 */
-	int createSellQty(Order order);
+	int createSellQty(ExtmallOrder extmallOrder);
 
 	/**
 	 * 13. 사은품 남은수량 업데이트
-	 * @param Order - 주문 정보
+	 * @param extmallOrder - 주문 정보
 	 * @return
 	 * @author jmh
 	 * @since 2021. 04. 13
 	 */
-	int updateFreegiftValLeftQty(Order order);
+	int updateFreegiftValLeftQty(ExtmallOrder extmallOrder);
 
 	/**
 	 * 상품 정보 조회
@@ -287,7 +287,7 @@ public interface TsaOcmDao {
 	 * @author jsh77b
 	 * @since 2021. 02. 02
 	 */
-	Collection<Order> getFreeGiftGoodsApplyAmt(Order order);
+	Collection<ExtmallOrder> getFreeGiftGoodsApplyAmt(ExtmallOrder extmallOrder);
 
 	/**
 	 * 사은품 : 2차조건 적용된 사은품상품금액 구간정보조회
@@ -296,7 +296,7 @@ public interface TsaOcmDao {
 	 * @author jsh77b
 	 * @since 2021. 02. 02
 	 */
-	Collection<Order> getFreeGiftGoodsApplySection(Order order);
+	Collection<ExtmallOrder> getFreeGiftGoodsApplySection(ExtmallOrder extmallOrder);
 
 	/**
 	 * 사은품 : 3차조건 적용된 구간정보의 사은품정보조회
@@ -305,7 +305,7 @@ public interface TsaOcmDao {
 	 * @author jsh77b
 	 * @since 2021. 02. 02
 	 */
-	Collection<Order> getFreeGiftGoodsApplyVal(Order order);
+	Collection<ExtmallOrder> getFreeGiftGoodsApplyVal(ExtmallOrder extmallOrder);
 	// ------------------------- 주문등록 소스 끝 -------------------------------------------//
 	// ------------------------- 주문등록 소스 끝 -------------------------------------------//
 

+ 121 - 213
src/main/java/com/style24/admin/biz/service/TsaOcmService.java

@@ -23,9 +23,7 @@ import com.style24.persistence.domain.ExtmallNoti;
 import com.style24.persistence.domain.ExtmallOrder;
 import com.style24.persistence.domain.ExtmallOrigin;
 import com.style24.persistence.domain.ExtmallPriceSync;
-import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsStock;
-import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.Payment;
 
 import lombok.extern.slf4j.Slf4j;
@@ -127,10 +125,6 @@ public class TsaOcmService {
 
 
 
-
-
-
-
     /**
      * 스타일 24 주문정보등록
      * @param Order
@@ -144,10 +138,10 @@ public class TsaOcmService {
     @Transactional("shopTxnManager")
     public void createShoplinkerOrder(String uploadGb) {
 
-    	Collection<Order> orderList = this.sortOrderList(uploadGb);
+    	Collection<ExtmallOrder> orderList = this.sortOrderList(uploadGb);
 
     	if (orderList != null && !orderList.isEmpty()) {
-	    	for( Order order : orderList ) {
+	    	for( ExtmallOrder order : orderList ) {
 
 	    		String ordCheckMsg = this.orderValidationCheck(order);
 
@@ -170,28 +164,23 @@ public class TsaOcmService {
 	                int cancelAmt = 0;
 	                int payAmt = 0;
 	                GagaMap vdMap;
-	                ExtmallOrder exOrdDtl;
-	    			for( Order orderDetail : order.getOrderDetailList()) {
+	    			for( ExtmallOrder orderDetail : order.getOrderDetailList()) {
 
 	    				vdMap = this.saveGoodsInfo(orderDetail);
 
-	    				exOrdDtl = new ExtmallOrder();
-	    				exOrdDtl.setOrdNo(order.getOrdNo());
-						exOrdDtl.setDelvAddrSq(order.getDelvAddrSq());
-	    				exOrdDtl.setVendorId(orderDetail.getVendorId());
-						exOrdDtl.setExtmallId(orderDetail.getExtmallId());
-						exOrdDtl.setAgentOrderId(orderDetail.getAgentOrderId());
-						exOrdDtl.setExtmallOrderId(orderDetail.getExtmallOrderId());
+	    				orderDetail.setOrdNo(order.getOrdNo());
+	    				orderDetail.setDelvAddrSq(order.getDelvAddrSq());
+
 
 	    				if (!"SUCCESS".equals(vdMap.get("message").toString())) {
 	    					cancelGoodsNms += orderDetail.getGoodsNm()+",";
 	    					cancelAmt += orderDetail.getOrdAmt();
 
-	    					exOrdDtl.setUploadStat(TsaConstants.ExtmallUploadStat.FAIL.value());	// 실패
-	    					exOrdDtl.setOrdNo(null);
-	    					exOrdDtl.setUploadFailCd(vdMap.getString("uploadFailCd"));
-	    					exOrdDtl.setUploadFailReason(vdMap.getString("message"));
-	    					ocmDao.updateExtmallOrder(exOrdDtl);
+	    					orderDetail.setUploadStat(TsaConstants.ExtmallUploadStat.FAIL.value());	// 실패
+	    					orderDetail.setOrdNo(null);
+	    					orderDetail.setUploadFailCd(vdMap.getString("uploadFailCd"));
+	    					orderDetail.setUploadFailReason(vdMap.getString("message"));
+	    					ocmDao.updateExtmallOrder(orderDetail);
 
 	    				}else {
 
@@ -203,7 +192,7 @@ public class TsaOcmService {
 
 	                        ocmDao.createOrderDetailHst(orderDetail); // 주문상세이력정보등록
 
-	                        Collection<Order> orderDetailItemList = ocmDao.getOrderDetailItem(orderDetail); // 주문상세단품정보조회
+	                        Collection<ExtmallOrder> orderDetailItemList = ocmDao.getOrderDetailItem(orderDetail); // 주문상세단품정보조회
 
 	                        // 주문상세단품단위 금액 등록
 	                        int length				= orderDetailItemList.size();
@@ -220,7 +209,7 @@ public class TsaOcmService {
 	                        int leftRealOrdAmt 		= orderDetail.getRealOrdAmt();
 	                        int leftGfcdUseAmt 		= orderDetail.getGfcdUseAmt();
 
-	                        for (Order orderDetailItem : orderDetailItemList) {
+	                        for (ExtmallOrder orderDetailItem : orderDetailItemList) {
 	                            int itemPrice 		= orderDetailItem.getItemPrice();
 	                            int optAddPrice 	= orderDetailItem.getOptAddPrice();
 	                            int itemQty 		= orderDetailItem.getItemQty();
@@ -283,8 +272,8 @@ public class TsaOcmService {
 	            				ocmDao.createSellQty(orderDetail);
 
 	                            // 외부몰 정보 업데이트
-	                            exOrdDtl.setUploadStat(TsaConstants.ExtmallUploadStat.SUCC.value());	// 성공
-	        					ocmDao.updateExtmallOrder(exOrdDtl);
+	            				orderDetail.setUploadStat(TsaConstants.ExtmallUploadStat.SUCC.value());	// 성공
+	        					ocmDao.updateExtmallOrder(orderDetail);
 
 	        					dtlNos += orderDetail.getOrdDtlNo()+",";
 	        				}
@@ -306,9 +295,9 @@ public class TsaOcmService {
 	    		    			// 상품코드
 	    		        		String dtlGoodsCds = "";	// 사은품관련 상품코드. 콤마로구분
 	    		        		String[] dtlGoodsCdsArr;
-	    		        		Collection<Order> freegiftApplyAmtList = (Collection<Order>) giftMap.get("freegiftApplyAmtList");
+	    		        		Collection<ExtmallOrder> freegiftApplyAmtList = (Collection<ExtmallOrder>) giftMap.get("freegiftApplyAmtList");
 
-	    		        		for(Order ftMap : freegiftApplyAmtList ) {
+	    		        		for(ExtmallOrder ftMap : freegiftApplyAmtList ) {
 	    		        			dtlGoodsCds += ftMap.getGoodsCd() +",";
 	    		        		}
 
@@ -316,9 +305,9 @@ public class TsaOcmService {
 	    		        		dtlGoodsCdsArr = dtlGoodsCds.split(",");
 	    		        		order.setFreegiftGoodsArr(dtlGoodsCdsArr);
 
-	    		        		Collection<Order> freegiftList = (Collection<Order>) giftMap.get("freegiftList");
+	    		        		Collection<ExtmallOrder> freegiftList = (Collection<ExtmallOrder>) giftMap.get("freegiftList");
 	    		                ArrayList<Integer> fitValSqArr = new ArrayList<Integer>();
-	    		                for(Order ftMap : freegiftList ) {
+	    		                for(ExtmallOrder ftMap : freegiftList ) {
 	    		                	fitValSqArr.add(ftMap.getFreegiftValSq());
 	    		                }
 	    		                int[] freegiftValArr = new int[fitValSqArr.size()];
@@ -335,7 +324,7 @@ public class TsaOcmService {
 	    		                    ocmDao.createOrdFreegiftVal(order);
 
 	    		                    // 7. 주문사은품 주문상세정보 등록
-	    		                    for(Order ftMap : freegiftApplyAmtList ) {
+	    		                    for(ExtmallOrder ftMap : freegiftApplyAmtList ) {
 	    			    		    	order.setFreegiftSq(ftMap.getFreegiftSq());
 	    				    			order.setGoodsCd(ftMap.getGoodsCd());
 	    				    			ocmDao.createOrdFreegiftDtl(order);
@@ -352,12 +341,12 @@ public class TsaOcmService {
 	    			// 7. 결제 TB_PAYMENT
 	                Payment payment = new Payment();
 	                payment.setOrdNo(order.getOrdNo());
-	                payment.setPayMeans(TscConstants.PayMeans.EXTMALL.value());		// 결제수단
+	                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.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);
@@ -387,42 +376,30 @@ public class TsaOcmService {
 	    			}
 
     				// 외부몰 주문등록 상태 업데이트
-    				ExtmallOrder exOrdDtl;
     				GagaMap vdMap;
-    				for( Order orderDetail : order.getOrderDetailList()) {
+    				for( ExtmallOrder orderDetail : order.getOrderDetailList()) {
     					System.out.println("### 전체실패2 :: "+ordCheckMsg);
     					vdMap = this.saveGoodsInfo(orderDetail);
-
-    					exOrdDtl = new ExtmallOrder();
-    					exOrdDtl.setVendorId(orderDetail.getVendorId());
-    					exOrdDtl.setExtmallId(orderDetail.getExtmallId());
-    					exOrdDtl.setAgentOrderId(orderDetail.getAgentOrderId());
-    					exOrdDtl.setExtmallOrderId(orderDetail.getExtmallOrderId());
-    					exOrdDtl.setUploadStat(TsaConstants.ExtmallUploadStat.FAIL.value());	// 실패
-    					exOrdDtl.setOrdNo(vdMap.getInt("ordNo"));	// 실패
-
-    					exOrdDtl.setUploadFailCd(vdMap.getString("uploadFailCd"));
-    					exOrdDtl.setUploadFailReason(vdMap.getString("message"));
-    					ocmDao.updateExtmallOrder(exOrdDtl);
+    					orderDetail.setUploadStat(TsaConstants.ExtmallUploadStat.FAIL.value());	// 실패
+    					orderDetail.setOrdNo(vdMap.getInt("ordNo"));	// 실패
+    					orderDetail.setUploadFailCd(vdMap.getString("uploadFailCd"));
+    					orderDetail.setUploadFailReason(vdMap.getString("message"));
+    					ocmDao.updateExtmallOrder(orderDetail);
     				}
 
 	    		}
 	        }
-
     	}
-
     }
 
     /**
      * 스타일 24 주문정보등록 - 제휴몰주문등록 데이터 정렬
-     * @param Order
-     * @return Order
-     * @author jsh77b
+     * @param uploadGb
+     * @return Collection<ExtmallOrder>
+     * @author jmh
      * @since 2021. 03. 09
     */
-    private Collection<Order> sortOrderList(String uploadGb) {
-    	Collection<Order> orderList = new ArrayList<Order>();
-        Collection<Order> tmpOrdDtlList = new ArrayList<Order>();
+    private Collection<ExtmallOrder> sortOrderList(String uploadGb) {
 
         // 1. 외부몰주문등록 대기목록 조회
         ExtmallOrder params = new ExtmallOrder();
@@ -431,126 +408,64 @@ public class TsaOcmService {
         if("E".equals(uploadGb)) {
         	params.setRegNo(TsaSession.getInfo().getUserNo());					// 등록자(E:엑셀방식일경우 필수)
         }
-
         Collection<ExtmallOrder> exMastList = ocmDao.getExtmallMasterOrderList(params);
         Collection<ExtmallOrder> exList = ocmDao.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 ordMap : exList ) {
-            	if(ordGroup.getVendorId().equals(ordMap.getVendorId())
-            		 && ordGroup.getExtmallId().equals(ordMap.getExtmallId())
-            		 && ordGroup.getExtmallOrderId().equals(ordMap.getExtmallOrderId())
-            		 && ordGroup.getOrdNm().equals(ordMap.getOrdNm())
-            		 && ordGroup.getOrdPhnno().equals(ordMap.getOrdPhnno())
-            		 && ordGroup.getRecipNm().equals(ordMap.getRecipNm())
-            		 && ordGroup.getRecipPhnno().equals(ordMap.getRecipPhnno())
-            		 && ordGroup.getRecipBaseAddr().equals(ordMap.getRecipBaseAddr())
-            		 && ordGroup.getRecipDtlAddr().equals(ordMap.getRecipDtlAddr())
+            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>();
 
-            		tmpList.add(ordMap);
+            		// 상세 추가정보
+            		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());					// 공급업체코드
+                    }
+
+            		tmpList.add(ordDtl);
             		ordGroup.setOrderDetailList(tmpList);
             	}
             }
         }
 
-        // 3. vo 값설정 ExtmallOrder -> Order
-        Order order;
-        for( ExtmallOrder ordGroup : exMastList) {
-        	order = new Order();
-
-        	// 기타 정보
-        	order.setOrdNm(ordGroup.getOrdNm());							// 주문자명
-            order.setOrdPhnno(ordGroup.getOrdPhnno());						// 주문자폰번호
-            order.setOrdDt(ordGroup.getOrdDt());							// 주문일
-            order.setPayDt(ordGroup.getOrdDt());
-            order.setSiteCd(TscConstants.Site.STYLE24.value());
-            order.setVendorId(TsaConstants.VendorId.SHOPLINKER.value());	// 외부몰벤더ID(공통코드G003) - 샵링커
-            order.setExtmallId(ordGroup.getExtmallId());					// 외부몰
-            order.setExtmallOrderId(ordGroup.getExtmallOrderId());		// 외부몰주문번호(=쇼핑몰주문번호)
-
-        	// 주문기본정보 (그룹으로 가져오는 정보)
-        	order.setCustNo(0);												// 고객번호 - 외부몰 0
-            order.setCustNm(ordGroup.getOrdNm());							// 주문자명
-            order.setRecipPhnno(ordGroup.getOrdPhnno());					// 주문자폰번호
-            order.setRecipTelno(ordGroup.getOrdTelno());					// 주문자전화번호
-            order.setFrontGb("P");											// PC
-            order.setRecipNm(ordGroup.getRecipNm());						//수령자명
-            order.setRecipPhnno(ordGroup.getRecipPhnno());					//수령자 폰번호
-            order.setRecipBaseAddr(ordGroup.getRecipBaseAddr());			//수령자기본주소
-            order.setRecipDtlAddr(ordGroup.getRecipDtlAddr());				//수령자상세주소
-
-            order.setDelvFeeGb("G018_10");									// 원주문배송비 코드
-            order.setDelvFeeCd("WMS"); 										// SHOT 자사총알배송 | WMS 자사일반배송 | RES  자사예약배송
-            order.setDelvFee(ordGroup.getDelvFee());						// 배송비
-            order.setDelvCpnDcAmt(0);										// 배송비쿠폰할인금액
-            order.setRealDelvAmt(ordGroup.getDelvFee());					// 배송비실결제금액
-            order.setDelvUsacYn("N");										// 배송비 정산여부
-
-
-            // 주문상세정보
-            order.setOrderDetailList(new ArrayList<Order>());
-            tmpOrdDtlList = new ArrayList<Order>();
-            Collection<ExtmallOrder> orderDetailList = ordGroup.getOrderDetailList();
-            String dtlGoodsCds = "";
-            Order orderDetail;
-            for (ExtmallOrder exOrdDtl : orderDetailList) {
-
-            	orderDetail = new Order();
-                orderDetail.setOrdNo(order.getOrdNo());								// 주문번호
-                orderDetail.setDelvAddrSq(order.getDelvAddrSq());					// 배송지일련번호
-                orderDetail.setOrdExchGb("O");										// 주문교환구분(O:주문,E:교환)
-                orderDetail.setCustNo(order.getCustNo());							// 고객번호
-                orderDetail.setRegNo(order.getCustNo());							// 등록자
-                orderDetail.setOrdDtlStat(TscConstants.OrderDetailStat.PAYMENT_COMPLETE.value());	// 주문상세상태=>결제완료 처리
-
-                dtlGoodsCds += exOrdDtl.getGoodsCd()+",";
-                orderDetail.setGoodsCd(exOrdDtl.getGoodsCd());
-                orderDetail.setCurrPrice(exOrdDtl.getCurrPrice());					// 현재판매가
-                orderDetail.setOrdQty(exOrdDtl.getOrdQty());						// 주문수량
-                orderDetail.setOrdAmt(exOrdDtl.getOrdAmt());						// 주문금액(=(현재판매가 + 옵션추가가격) * 주문수량) // 샵링커에서는 현재판매가 x 주문수량 계산된 금액이 ord_amt에 계산되어 옴
-                orderDetail.setDelvCpnDcAmt(0);										// 1차쿠폰(즉시할인쿠폰)할인금액
-                // orderDetail.setGoodsCpnDcAmt();									// 상품쿠폰할인금액
-                orderDetail.setRealOrdAmt(exOrdDtl.getOrdAmt());					// 실주문금액(주문금액 - 취소반품금액 - 1차쿠폰 - 다다익선1 - 다다익선2 - 상품쿠폰 - 장바구니쿠폰 - 포인트할인금액 - 선포인트할인금액)
-                orderDetail.setVendorId(TsaConstants.VendorId.SHOPLINKER.value());	// 외부몰벤더ID(공통코드G003) - 샵링커
-                orderDetail.setExtmallId(exOrdDtl.getExtmallId());					// 외부몰ID(외부몰)
-                orderDetail.setAgentOrderId(exOrdDtl.getAgentOrderId());			// 에이전트주문번호
-                orderDetail.setExtmallOrderId(exOrdDtl.getExtmallOrderId());		// 외부몰주문번호(=쇼핑몰주문번호)
-                orderDetail.setDelvFeeCd("WMS"); 									// SHOT 자사총알배송 | WMS 자사일반배송 | RES  자사예약배송
-                orderDetail.setShotDelvYn("N");										// 총알배송여부
-                orderDetail.setGiftPackYn("N"); 									// 선물포장여부
-                orderDetail.setGiftAddrInpYn("N");									// 선물주소입력여부
-                orderDetail.setSavePntAmt(0);										// 외부몰주문 포인트 적립금 없음
-
-                orderDetail.setOptCd(exOrdDtl.getOptCd());							// 옵션코드
-                orderDetail.setOrdNm(exOrdDtl.getOrdNm());							// 주문자명
-                orderDetail.setOrdPhnno(exOrdDtl.getOrdPhnno());					// 주문자핸폰
-                orderDetail.setGoodsNm(exOrdDtl.getGoodsNm());
-
-                tmpOrdDtlList.add(orderDetail);										// 상세정보 저장
-                order.setDelvMemo(exOrdDtl.getDelvMemo());							// 배송메모
-                order.setRecipTelno(exOrdDtl.getRecipTelno());						// 수령자 전화번호
-                order.setRecipZipcode(exOrdDtl.getRecipZipcode());					// 수령자우편번호
-                order.setEmail(exOrdDtl.getOrdEmail());								// 주문자이메일
-                if (exOrdDtl.getSupplyCompCd() != null && !exOrdDtl.getSupplyCompCd().isEmpty()) {
-                	order.setSupplyCompCd(exOrdDtl.getSupplyCompCd());					// 공급업체코드
-                }
-            }
-
-            order.setRealOrdSumAmt(ordGroup.getTotalOrdAmt());
-            order.setOrderDetailList(tmpOrdDtlList);
-            orderList.add(order);
-        }
-
-    	return orderList;
+        return exMastList;
     }
 
     /**
@@ -560,15 +475,15 @@ public class TsaOcmService {
 	 * @author jsh77b
 	 * @since 2021. 03. 09
 	 */
-	public String orderValidationCheck(Order order) {
+	public String orderValidationCheck(ExtmallOrder order) {
 		String resultStr	= "SUCCESS";
 
 		// 1. 주문상세체크
-		Collection<Order> orderDetailList = order.getOrderDetailList();
+		Collection<ExtmallOrder> orderDetailList = order.getOrderDetailList();
 
 		int dtlCnt = orderDetailList.size();
 		int succCnt = 0;
-		for (Order orderDetail : orderDetailList) {
+		for (ExtmallOrder orderDetail : orderDetailList) {
 
 			GagaMap resultMap = this.saveGoodsInfo(orderDetail);
 
@@ -601,44 +516,51 @@ public class TsaOcmService {
 	}
 
 	/**
-	 * 상품마스터 정보 및 재고확인    (( 장바구니 저장
+	 * 상품마스터 정보 및 재고확인
 	 * 단품 : goodsCd, optCd, optCd1, optCd2
 	 * 세트 : goodsCd,
 	 * @param params
 	 */
 	@Transactional("shopTxnManager")
-	public GagaMap saveGoodsInfo(Order param) {
+	public GagaMap saveGoodsInfo(ExtmallOrder param) {
 		GagaMap result = new GagaMap();
 		result.put("message", "SUCCESS");
 
-		// 중복저장확인
 		param.setVendorId(TsaConstants.VendorId.SHOPLINKER.value());
-		//int extRegCnt = ocmDao.getExtmallOrderCnt(param);
-		Order dtlOrd = ocmDao.getExtmallOrderCnt(param);
-		if( null != dtlOrd) {
+		ExtmallOrder dtlOrd = ocmDao.getExtmallOrderInfo(param);
+
+		if( null == dtlOrd) {
+			result.put("uploadFailCd", ExtmallUploadFailStat.ETC.value());	// 값이 무조건 존재해야함
+			result.put("message", "오류입니다. 관리자확인요청>"+param.getAgentOrderId());
+			return result;
+
+		}else if( null != dtlOrd.getOrdNo() ){
 			result.put("uploadFailCd", ExtmallUploadFailStat.ORDER.value());
 			result.put("ordNo", dtlOrd.getOrdNo());
 			result.put("message", "동일한 주문건이 존재합니다.");
 			return result;
-		}
 
-		// 상품 마스터 정보 확인
-		Goods goods = new Goods();
-		goods.setGoodsCd(param.getGoodsCd());
-		// goods.setCustNo(0);
-		goods.setShoplinkerFrontGb("P");
-		goods.setSiteCd(TscConstants.Site.STYLE24.value());
-		goods = ocmDao.getGoodsInfo(goods);
+		} else if( null == dtlOrd.getExtmallId()) {
+			result.put("uploadFailCd", ExtmallUploadFailStat.STORE.value());
+			result.put("message", "제휴몰ID 정보가 잘못되었습니다.");
+			return result;
 
-		if (goods == null) {
+		} else if( null == dtlOrd.getGoodsCd()) {
 			result.put("uploadFailCd", ExtmallUploadFailStat.GOODS.value());
-			result.put("message", "상품 정보가 존재하지 않습니다.");
+			result.put("message", "상품코드가 잘못되었습니다.");
 			return result;
-		} else if (TscConstants.GoodsStat.SOLDOUT.value().equals(goods.getGoodsStat())) {
+
+		} else if( null == dtlOrd.getOptCd()) {
+			result.put("uploadFailCd", ExtmallUploadFailStat.SIZE.value());
+			result.put("message", "옵션코드가 잘못되었습니다.");
+			return result;
+
+		} else if (TscConstants.GoodsStat.SOLDOUT.value().equals(dtlOrd.getGoodsStat())) {
 			result.put("uploadFailCd", ExtmallUploadFailStat.STOCK.value());
 			result.put("message", "품절입니다.");
 			return result;
-		} else if (!TscConstants.GoodsStat.SOLDOUT.value().equals(goods.getGoodsStat()) && !TscConstants.GoodsStat.APPR.value().equals(goods.getGoodsStat())) {
+
+		} else if (!TscConstants.GoodsStat.SOLDOUT.value().equals(dtlOrd.getGoodsStat()) && !TscConstants.GoodsStat.APPR.value().equals(dtlOrd.getGoodsStat())) {
 			result.put("uploadFailCd", ExtmallUploadFailStat.STOCK.value());
 			result.put("message", "판매중인 상품이 아닙니다.");
 			return result;
@@ -675,15 +597,6 @@ public class TsaOcmService {
 	 * @since 2021. 01. 28
 	 */
 	public String getCheckStock(GoodsStock param) {
-		// 상품 마스터 정보 확인
-		Goods goodsInfo = new Goods();
-		goodsInfo.setGoodsCd(param.getGoodsCd());
-		goodsInfo.setSiteCd(TscConstants.Site.STYLE24.value());
-		goodsInfo = ocmDao.getGoodsInfo(goodsInfo);
-
-		if (TscConstants.GoodsStat.SOLDOUT.value().equals(goodsInfo.getGoodsStat())) {
-			return param.getGoodsCd() + "는 품절 상품입니다.";
-		}
 
 		GoodsStock stockCheck = new GoodsStock();								// 재고 조회 결과
 		stockCheck.setGoodsCd(param.getGoodsCd());
@@ -713,28 +626,28 @@ public class TsaOcmService {
 	 * @author jsh77b
 	 * @since 2020. 12. 16
 	 */
-	public GagaMap getOrderFreegift(Order order) {
+	public GagaMap getOrderFreegift(ExtmallOrder order) {
 
 		GagaMap resultMap = new GagaMap();
-		Collection<Order> freegiftGoodsList 	= null;
-		Collection<Order> freegiftList 			= null;
+		Collection<ExtmallOrder> freegiftGoodsList 	= null;
+		Collection<ExtmallOrder> freegiftList 			= null;
 
 		// 1. 장바구니 담긴 상품으로 적용된 사은품 프로모션 정보 조회 (with 상품금액)
-		Collection<Order> freegiftApplyAmtList = ocmDao.getFreeGiftGoodsApplyAmt(order);
+		Collection<ExtmallOrder> freegiftApplyAmtList = ocmDao.getFreeGiftGoodsApplyAmt(order);
 
 		// 1.1 장바구니 상품으로 적용된 사은품 여부 판단
 		if (freegiftApplyAmtList.size() > 0) {
 
-			Collection<Order> freegiftGoodsApplyAmtList = new ArrayList<Order>();
+			Collection<ExtmallOrder> freegiftGoodsApplyAmtList = new ArrayList<ExtmallOrder>();
 			int tempFreegiftSq 		= 0;
 			int index				= 0;
 			boolean	temp			 = false;
 
 			// 사은품시퀀스 담기
-			for (Order freegiftApplyAmt : freegiftApplyAmtList) {
+			for (ExtmallOrder freegiftApplyAmt : freegiftApplyAmtList) {
 				temp = true;
 				if (freegiftGoodsApplyAmtList.size() > 0) {
-					for (Order freegiftGoodsApplyAmt : freegiftGoodsApplyAmtList) {
+					for (ExtmallOrder freegiftGoodsApplyAmt : freegiftGoodsApplyAmtList) {
 						if (freegiftApplyAmt.getFreegiftSq() == freegiftGoodsApplyAmt.getFreegiftSq()) {
 							temp = false;
 						}
@@ -750,11 +663,11 @@ public class TsaOcmService {
 
 
 			// 사은품시퀀스(FREEGIFT_SQ), 사은품시퀀스합계금액(FREEGIFT_AMT)
-			for (Order freegiftGoodsApplyAmt : freegiftGoodsApplyAmtList) {
+			for (ExtmallOrder freegiftGoodsApplyAmt : freegiftGoodsApplyAmtList) {
 				// 금액초기화
 				freegiftGoodsApplyAmt.setFreegiftAmt(0);
 
-				for (Order freegiftApplyAmt : freegiftApplyAmtList) {
+				for (ExtmallOrder freegiftApplyAmt : freegiftApplyAmtList) {
 					int ordAmt = (freegiftApplyAmt.getCurrPrice() + freegiftApplyAmt.getOptAddPrice()) * freegiftApplyAmt.getGoodsQty();
 					if (freegiftGoodsApplyAmt.getFreegiftSq() == freegiftApplyAmt.getFreegiftSq()) {
 						freegiftGoodsApplyAmt.setFreegiftAmt(freegiftGoodsApplyAmt.getFreegiftAmt() + ordAmt);
@@ -768,7 +681,7 @@ public class TsaOcmService {
 			index = 0;
 
 			// 사은품시퀀스(FREEGIFT_SQ), 사은품시퀀스합계금액(FREEGIFT_AMT)
-			for (Order fregiftGoodsApplyAmt : freegiftGoodsApplyAmtList) {
+			for (ExtmallOrder fregiftGoodsApplyAmt : freegiftGoodsApplyAmtList) {
 				freegiftSqArr[index] = fregiftGoodsApplyAmt.getFreegiftSq();
 				index++;
 			}
@@ -776,7 +689,7 @@ public class TsaOcmService {
 			order.setFreegiftSqArr(freegiftSqArr);
 
 			// 2. 사은품 적용구간 정보 조회
-			Collection<Order> freegiftGoodsApplySectionList = ocmDao.getFreeGiftGoodsApplySection(order);
+			Collection<ExtmallOrder> freegiftGoodsApplySectionList = ocmDao.getFreeGiftGoodsApplySection(order);
 
 			// 2.1 사은품 적용구간이 있는지 판단
 			if (freegiftGoodsApplySectionList.size() > 0) {
@@ -786,11 +699,11 @@ public class TsaOcmService {
 				int k = 0;
 
 				// 사은품시퀀스(FREEGIFT_SQ), 사은품시퀀스합계금액(FREEGIFT_AMT)
-				for (Order freegiftGoodsApplyAmt : freegiftGoodsApplyAmtList) {
+				for (ExtmallOrder freegiftGoodsApplyAmt : freegiftGoodsApplyAmtList) {
 					int freegiftAmt 	= freegiftGoodsApplyAmt.getFreegiftAmt();
 
 					// 사은풐구간시퀀스(FREEGIFT_SECTION_SQ, 사은품시퀀스(FREEGIFT_SQ), 사은풐구간금액(SECTION_VAL)
-					for (Order freegiftGoodsApplySection : freegiftGoodsApplySectionList) {
+					for (ExtmallOrder freegiftGoodsApplySection : freegiftGoodsApplySectionList) {
 						int freegiftSectionSq 	= freegiftGoodsApplySection.getFreegiftSectionSq();
 						int sectionVal 			= freegiftGoodsApplySection.getSectionVal();
 
@@ -809,13 +722,13 @@ public class TsaOcmService {
 
 				// 3. 사은품 적용구간 의 적용 사은품정보조회
 				order.setFreegiftSectionSqArr(freegiftSectionSqArr);
-				Collection<Order> freegiftGoodsApplyValList = ocmDao.getFreeGiftGoodsApplyVal(order);
+				Collection<ExtmallOrder> freegiftGoodsApplyValList = ocmDao.getFreeGiftGoodsApplyVal(order);
 
 				if (freegiftGoodsApplyValList.size() > 0) {
-					freegiftList 		= new ArrayList<Order>();
-					freegiftGoodsList 	= new ArrayList<Order>();
+					freegiftList 		= new ArrayList<ExtmallOrder>();
+					freegiftGoodsList 	= new ArrayList<ExtmallOrder>();
 
-					for (Order freegiftGoodsApplyVal : freegiftGoodsApplyValList) {
+					for (ExtmallOrder freegiftGoodsApplyVal : freegiftGoodsApplyValList) {
 
 						// 제휴몰 사은품 전체 제공
 						//if (freegiftGoodsApplyVal.getFreegiftSq() != tempFreegiftSq) {
@@ -873,14 +786,9 @@ public class TsaOcmService {
 			String[] params = extmallOrder.getParams();
 			String[] columns = extmallOrder.getColumns();
 
-
-			/*if (index == 0) {
-				vendorId = extmallOrder.getVendorId();
-			}*/
-
 			for (int validation = 0; validation < params.length; validation++) {
-				if( validation != 0 && validation != 15 ) {	// 첫번재열, 이메일 미체크
-					if ("".equals(params[validation]) || params[validation] == null) {
+				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] + "(을)를 입력해 주세요.");
 					}
 				}

+ 329 - 325
src/main/java/com/style24/admin/biz/service/TsaShoplinkerService.java

@@ -12,9 +12,7 @@ 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 org.springframework.transaction.annotation.Transactional;
 
-import com.gagaframework.excel.env.GagaExcelConstants;
 import com.gagaframework.shoplinker.GagaShoplinkertUtil;
 import com.gagaframework.shoplinker.domain.orderlist.Order;
 import com.gagaframework.shoplinker.env.GagaShoplinkerConstants;
@@ -24,12 +22,8 @@ import com.style24.admin.biz.dao.TsaOcmDao;
 import com.style24.admin.biz.dao.TsaShoplinkerDao;
 import com.style24.admin.support.env.TsaConstants;
 import com.style24.admin.support.security.session.TsaSession;
-import com.style24.admin.support.util.TsitUtil;
-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.Goods;
-import com.style24.persistence.domain.GoodsStock;
 import com.style24.persistence.domain.ShoplinkerGoods;
 import com.style24.persistence.domain.ShoplinkerInvoice;
 import com.style24.persistence.domain.ShoplinkerOrder;
@@ -74,10 +68,16 @@ public class TsaShoplinkerService {
 	 * @author jmh
 	 * @since 2020. 5. 28
 	 */
-	public ShoplinkerSearch getCallRunableInfo(ShoplinkerSearch slkSearch ) {
-		return shoplinkerDao.getCallRunableInfo(slkSearch);
+	public ShoplinkerSearch getCallRunableInfo(ShoplinkerSearch slkSearch) {
+		ShoplinkerSearch result = shoplinkerDao.getCallRunableInfo(slkSearch);
+		if( null == result ) {
+			result = new ShoplinkerSearch();
+			result.setRunCnt(0);
+		}
+		return result;
 	}
 
+
 	/**
 	 * 샵링커 api 호출 가능여부 상태 저장
 	 *
@@ -255,6 +255,9 @@ public class TsaShoplinkerService {
 			// 상품기본정보
 			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");
@@ -267,294 +270,7 @@ public class TsaShoplinkerService {
 			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");
-
-			// 상세폼신규사용여부 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");
-
-				sbRequest.append("			<detail_desc>").append(descStr).append("</detail_desc>\n");
-			}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") || -1 <map.getSysImgNm().indexOf("_"+map.getColorCd()+"_M")) { //대표상품 모델컷
-						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") || -1 < map.getSysImgNm().indexOf("_"+map.getColorCd()+"_S")) { //대표상품 패브릭(소재컷?)
-						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");
-
-					sbRequest.append("			<detail_desc>").append(descStr).append("</detail_desc>\n");
-
-				}else {
-
-					String htmlDesc = "";
-					// 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=''>";
-
-	                	String typeCd = "";
-	                	int cnt = 0;
-	                	for(ShoplinkerGoods size : sizeList) {
-	                		typeCd = size.getSizeTypecd();
-	                		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 - 인증대상아님
-	                	}
-	                }
-
-					sbRequest.append("			<detail_desc>").append(htmlDesc).append("</detail_desc>\n");
-				}
-			}
-
+			sbRequest.append("			<detail_desc>").append(detailDesc).append("</detail_desc>\n");
 
 			// 가격연계
 			if( "Y".equals(goodsMap.getSyncYn())) {
@@ -618,6 +334,303 @@ public class TsaShoplinkerService {
 		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. 품목(고시)정보
 	 *
@@ -1137,11 +1150,12 @@ public class TsaShoplinkerService {
 
 			}else {
 				// 테스트용
-				xmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/order/order_real_0430_"+shoplinkerOrder.getOrderPageNo()+".xml";
+				xmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/order/0409/order_real_"+shoplinkerOrder.getOrderPageNo()+".xml";
 
 				try {
 					// API 호출
 					responseXmlData = shoplinkerUtil.callShoplinkerApiByGet(GagaShoplinkerConstants.API_DOMAIN+regMap.getApiSubUrl()+URLEncoder.encode(xmlUrl), "");
+									// shoplinkerUtil.callShoplinkerApiByGet(GagaShoplinkerConstants.API_DOMAIN+regMap.getApiSubUrl()+URLEncoder.encode(xmlUrl), "");
 									//testOrderStr();
 
 					// response 결과
@@ -1355,7 +1369,6 @@ public class TsaShoplinkerService {
 
 		ShoplinkerGoods apiHstMap = new ShoplinkerGoods();
 
-		GagaMap returnMap = new GagaMap();
 		ShoplinkerGoods regMap = new ShoplinkerGoods();
 		regMap.setApiType("INVOICE");
 		regMap.setApiSubUrl(env.getProperty("shoplinker.url.invoice"));
@@ -1364,7 +1377,7 @@ public class TsaShoplinkerService {
 		regMap.setDomainUrl(shoplinkerInvoice.getDomainUrl());
 
 		StringBuilder sbRequest;
-		com.gagaframework.shoplinker.domain.invoice.ResultMessage resultMsg_tmp;
+		com.gagaframework.shoplinker.domain.invoice.ResultMessage resultMsg;
 
 		Collection<ShoplinkerInvoice> sendList = shoplinkerDao.getShoplinkerInvoiceOrdDtlList(shoplinkerInvoice);
 
@@ -1399,7 +1412,6 @@ public class TsaShoplinkerService {
 					String xmlUrl = GagaFileUtil.getConcatenationPath(shoplinkerInvoice.getDomainUrl(), xmlFileName.toString());
 
 					// API 호출
-		//	 		xmlUrl = "http://ts5000.ipdisk.co.kr:8999/shoplinker/invoice.xml"; // test
 					String apiUrl = GagaShoplinkerConstants.API_DOMAIN + regMap.getApiSubUrl() + URLEncoder.encode(xmlUrl);
 					String responseXmlData = shoplinkerUtil.callShoplinkerApiByGet(apiUrl, "");
 
@@ -1407,16 +1419,8 @@ public class TsaShoplinkerService {
 					log.info(shoplinkerInvoice.getApiType()+" ####apiUrl "+apiUrl);
 
 					// response 결과
-					com.gagaframework.shoplinker.domain.goods.result.ResultMessage resultMsg;	//임시
-					resultMsg = (com.gagaframework.shoplinker.domain.goods.result.ResultMessage)shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.goods.result.ResultMessage.class, responseXmlData);
-					//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);
+					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());
@@ -1666,29 +1670,29 @@ public class TsaShoplinkerService {
 		String bbb = "<?xml version=\"1.0\" encoding=\"euc-kr\"?>"
 				+ "<Shoplinker>\r\n"
 				+ "<header>\r\n"
-				+ "<total_count>27</total_count>\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>27</currently_count>\r\n"
+				+ "<currently_count>1</currently_count>\r\n"
 				+ "</header>\r\n"
 
 				+ "<order>\r\n"
-				+ "<shoplinker_order_id>0611683168</shoplinker_order_id>\r\n"
-				+ "<mall_order_id><![CDATA[20210129292734]]></mall_order_id>\r\n"
+				+ "<shoplinker_order_id>1234</shoplinker_order_id>\r\n"
+				+ "<mall_order_id><![CDATA[1234]]></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[]]></order_tel>\r\n"
-				+ "<order_cel><![CDATA[]]></order_cel>\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[]]></receive_tel>\r\n"
-				+ "<receive_cel><![CDATA[]]></receive_cel>\r\n"
-				+ "<receive_zipcode><![CDATA[]]></receive_zipcode>\r\n"
-				+ "<receive_addr><![CDATA[]]></receive_addr>\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"
+				+ "<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>NNW13QPM69</partner_product_id>\r\n"
@@ -1698,8 +1702,8 @@ public class TsaShoplinkerService {
 				+ "<sale_price>47600</sale_price>\r\n"
 				+ "<supply_price>36176</supply_price>\r\n"
 				+ "<sku><![CDATA[NA/160]]></sku>\r\n"
-				+ "<orderdate>20210129132721</orderdate>\r\n"
-				+ "<order_reg_date>20210201004337</order_reg_date>\r\n"
+				+ "<orderdate>20210618132721</orderdate>\r\n"
+				+ "<order_reg_date>20210618132721</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"

+ 10 - 45
src/main/java/com/style24/admin/biz/web/TsaShoplinkerController.java

@@ -148,7 +148,6 @@ public class TsaShoplinkerController extends TsaBaseController {
 		shoplinkerGoods.setExcelFileNm(paramMap.get("excelFileNm"));
 
 		GagaMap rtnMap = new GagaMap();
-		boolean a_bool = true;
 		String profiles = env.getProperty("spring.profiles.active").toLowerCase();
 		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
 		Collection<GagaMap> ecxelGoodsList = new ArrayList<>();
@@ -157,14 +156,8 @@ public class TsaShoplinkerController extends TsaBaseController {
 		ShoplinkerSearch slkSearch = new ShoplinkerSearch();
 		slkSearch.setApiType("GOODS");
 		ShoplinkerSearch runMap = shoplinkerService.getCallRunableInfo(slkSearch);
-		if( null != runMap ) {
-			a_bool = false;
-			// 현재 실행중인값 존재
-			rtnMap.setString("RESULT_TYPE", "RUN");
-			rtnMap.setString("RESULT_MSG", runMap.getRunStdt()+"에 호출한 건이 현재 실행중입니다.");
-		}
 
-		if( a_bool ) {
+		if( runMap.getRunCnt() < 1 ) {
 			try {
 				// 1. API 호출 이력 저장 시작(실행중 재호출 금지하기 위함)
 				slkSearch.setSid(datestr);
@@ -310,8 +303,6 @@ public class TsaShoplinkerController extends TsaBaseController {
 	public void orderReceiveList(@PathVariable("apiStDate") String apiStDate) throws IOException {
 
 		GagaMap rtnMap = new GagaMap();
-
-		boolean a_bool = true;
 		Calendar cal = Calendar.getInstance();
 		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
 		String datestr = sdf.format(cal.getTime());
@@ -338,13 +329,8 @@ public class TsaShoplinkerController extends TsaBaseController {
 		slkSearch.setApiType("ORDER");
 		slkSearch.setRegNo(TsaSession.getInfo().getUserNo());
 		ShoplinkerSearch runMap = shoplinkerService.getCallRunableInfo(slkSearch);
-		if( null != runMap ) {
-			a_bool = false;
-			rtnMap.setString("RESULT_TYPE", "RUN");
-			rtnMap.setString("RESULT_MSG", runMap.getRunStdt()+"에 호출한 건이 현재 실행중입니다.<br>[처리중] "+runMap.getTxt());
-		}
 
-		if( a_bool ) {
+		if( runMap.getRunCnt() < 1 ) {
 			try {
 				// 1. API 호출 이력 저장 시작(실행중 재호출 금지하기 위함)
 				slkSearch.setSid(datestr);
@@ -358,12 +344,12 @@ public class TsaShoplinkerController extends TsaBaseController {
 				rtnMap = shoplinkerService.insertShoplinkerOrderStep1(shoplinkerOrder);
 
 				// 3. 제휴몰 주문등록
-				slkSearch.setTxt("=>제휴몰 주문등록 처리중");
+				slkSearch.setTxt("=>제휴몰 등록중");
 				shoplinkerService.saveCallApiRunable(slkSearch);
 				shoplinkerService.insertShoplinkerOrderStep2(shoplinkerOrder);
 
 				// 4. 스타일24 주문등록 (제휴몰 - 대기상태인 것들)
-				slkSearch.setTxt("=>스타일24 주문등록 처리중");
+				slkSearch.setTxt("=>스타일24 주문등록 중");
 				shoplinkerService.saveCallApiRunable(slkSearch);
 				ocmService.createShoplinkerOrder("S");
 
@@ -447,25 +433,17 @@ public class TsaShoplinkerController extends TsaBaseController {
 	@PostMapping("/invoice/send/register")
 	@ResponseBody
 	public void shoplinkerSendInvoice(@RequestParam(value = "stDate") String stDate, @RequestParam(value = "edDate") String edDate) throws Exception {
+		GagaMap rtnMap = new GagaMap();
 		Calendar cal = Calendar.getInstance();
 		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
 		String datestr = sdf.format(cal.getTime());
 
-		GagaMap rtnMap = new GagaMap();
-		boolean a_bool = true;
-
 		// API 호출 중인건수 있는지 확인
 		ShoplinkerSearch slkSearch = new ShoplinkerSearch();
 		slkSearch.setApiType("INVOICE");
 		ShoplinkerSearch runMap = shoplinkerService.getCallRunableInfo(slkSearch);
-		if( null != runMap ) {
-			a_bool = false;
-			// 현재 실행중인값 존재
-			rtnMap.setString("RESULT_TYPE", "RUN");
-			rtnMap.setString("RESULT_MSG", runMap.getRunStdt()+"에 호출한 건이 현재 실행중입니다.");
-		}
 
-		if( a_bool ) {
+		if( runMap.getRunCnt() < 1 ) {
 			try {
 				// 1. API 호출 이력 저장 시작(실행중 재호출 금지하기 위함)
 				slkSearch.setSid(datestr);
@@ -519,7 +497,6 @@ public class TsaShoplinkerController extends TsaBaseController {
 				shoplinkerService.saveCallApiRunable(slkSearch);
 			}
 		}
-
 	}
 
 	/**
@@ -674,34 +651,22 @@ public class TsaShoplinkerController extends TsaBaseController {
 	/**
 	 * 공통-api 실행여부확인
 	 *
-	 * @param ordNo - 주문번호
+	 * @param slkSearch - 주문번호
 	 * @return ModelAndView
-	 * @author jsh77b
+	 * @author jmh
 	 * @since 2020. 11. 26
 	 */
 	@PostMapping("/check/api_runable")
 	@ResponseBody
-	public GagaMap apiRunable(@RequestBody ShoplinkerSearch slkSearch) throws IOException {
-		GagaMap rtnMap = new GagaMap();
+	public ShoplinkerSearch apiRunable(@RequestBody ShoplinkerSearch slkSearch) throws IOException {
 
 		ShoplinkerSearch runMap = shoplinkerService.getCallRunableInfo(slkSearch);
-
-		if( null != runMap ) {
-			rtnMap.setString("RESULT_TYPE", "RUN");	// 처리중인 목록있음
-			rtnMap.setString("RESULT_MSG", runMap.getRunStdt()+"에 호출한 건이 현재 실행중입니다.");
-			rtnMap.setString("RESULT_TXT", runMap.getTxt());
-
-		}else {
-			rtnMap.setString("RESULT_TYPE", "SUCCESS");	// 가능
-		}
-
-		return rtnMap;
+		return runMap;
 	}
 
 
 
 
-
 	/*
 	 *
 	 * api test

+ 703 - 3
src/main/java/com/style24/persistence/domain/ExtmallOrder.java

@@ -1,8 +1,14 @@
 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;
 
@@ -16,6 +22,7 @@ import lombok.Data;
 @Data
 public class ExtmallOrder extends TscBaseDomain {
 
+	// 제휴몰 주문업로드 컬럼
 	private String vendorId; 			// 벤더ID(공통코드G003)
 	private String vendorNm; 			// 벤더명
 	private String extmallId; 			// 제휴몰ID(외부몰). TB_EXMALL.EXTMALL_ID
@@ -25,7 +32,8 @@ public class ExtmallOrder extends TscBaseDomain {
 	private String extmallProdId; 		// 제휴몰상품ID. SHOPLINKER_ORDER.ORDER_PRODUCT_ID
 	private String extmallProdNm; 		// 제휴몰상품명. SHOPLINKER_ORDER.PRODUCT_NAME
 	private String goodsCd; 			// 상품코드(상품)
-	private String goodsNm;
+	private String goodsNm;				// 상품명
+	private String goodsStat;			// 상품상태
 	private String sku; 				// 옵션명(필수옵션+추가옵션)
 	private Integer currPrice; 			// 현재판매가. SHOPLINKER_ORDER.SALE_PRICE
 	private Integer ordQty; 			// 주문수량. SHOPLINKER_ORDER.QUANTITY
@@ -70,10 +78,702 @@ public class ExtmallOrder extends TscBaseDomain {
 	private String succCnt;				// 엑셀업로드 성공수
 	private String failCnt;				// 엑셀업로드 실패수
 
-
 	Collection<ExtmallOrder> orderDetailList;		// 주문상세목록
 	Collection<ExtmallOrder> delvFeeCdList;		// 배송정보목록
-	// ValidationCheck
+
+	// 스타일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 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 setAllParams(ShoplinkerOrder ord) {
 

+ 50 - 34
src/main/java/com/style24/persistence/mybatis/shop/TsaOcm.xml

@@ -180,12 +180,17 @@
 			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 TOTAL_ORD_AMT
+			, SUM(A.ORD_AMT) AS REAL_ORD_SUM_AMT
 		FROM TB_EXTMALL_ORDER_UPLOAD A
 		WHERE A.UPLOAD_STAT = 'G021_00'
 		AND RECIP_BASE_ADDR IS NOT NULL AND RECIP_BASE_ADDR != ''
@@ -193,7 +198,8 @@
 		<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.RECIP_NM, A.RECIP_PHNNO, A.RECIP_BASE_ADDR, A.RECIP_DTL_ADDR
+		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>
 
@@ -237,9 +243,10 @@
 			, A.UPLOAD_FAIL_REASON
 			, A.ORD_NO
 			, A.DELV_ADDR_SQ
+			, A.OPT_CD
+			, A.UPLOAD_GB
 			, A.REG_NO
 			, A.REG_DT
-			, A.OPT_CD
 		FROM TB_EXTMALL_ORDER_UPLOAD A
 			LEFT OUTER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
 		WHERE 1=1
@@ -374,16 +381,34 @@
 
 	</update>
 
-	<!-- 제휴몰주문등록 - 주문등록 cnt -->
-	<select id="getExtmallOrderCnt" parameterType="Order" resultType="Order">
-	/* TsaOcm.getExtmallOrderCnt */
+	<!-- 제휴몰주문등록 - 주문등록 체크 -->
+	<select id="getExtmallOrderInfo" parameterType="ExtmallOrder" resultType="ExtmallOrder">
+	/* TsaOcm.getExtmallOrderInfo */
 		SELECT
-			*
-		FROM TB_ORDER_DETAIL A
+			 A.AGENT_ORDER_ID
+			, A.EXTMALL_ORDER_ID
+			, B.EXTMALL_ID
+			, GS.GOODS_CD
+			, 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
+
+		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>
 
 
@@ -391,7 +416,7 @@
 <!--***** 주문정보등록 **************************************************************** -->
 <!--***** 주문정보등록 **************************************************************** -->
 	<!-- 1. 주문기본정보등록 -->
-	<insert id="createOrder" parameterType="Order" keyProperty="ordNo">
+	<insert id="createOrder" parameterType="ExtmallOrder" keyProperty="ordNo">
 		/* TsaOrder.createOrder : 주문기본정보등록 */
 		INSERT INTO TB_ORDER (
 		    MALL_GB
@@ -429,7 +454,7 @@
 	</insert>
 
 	<!-- 2. 주문배송주소정보등록-->
-	<insert id="createDeliveryAddr" parameterType="Order" keyProperty="delvAddrSq">
+	<insert id="createDeliveryAddr" parameterType="ExtmallOrder" keyProperty="delvAddrSq">
 		/* TsaOrder.createDeliveryAddr : 주문배송주소정보등록 */
 		INSERT INTO TB_DELIVERY_ADDR (
 		    RECIP_NM
@@ -461,7 +486,7 @@
 	</insert>
 
 	<!-- 3. 주문배송비정보등록-->
-	<insert id="createDeliveryFee" parameterType="Order">
+	<insert id="createDeliveryFee" parameterType="ExtmallOrder">
 		/* TsaOrder.createDeliveryFee : 주문배송비정보등록 */
 		INSERT INTO TB_DELIVERY_FEE (
 		    PAY_SQ
@@ -501,7 +526,7 @@
 	</insert>
 
 	<!-- 4. 주문상세정보등록-->
-	<insert id="createOrderDetail" parameterType="Order" keyProperty="ordDtlNo">
+	<insert id="createOrderDetail" parameterType="ExtmallOrder" keyProperty="ordDtlNo">
 		/* TsaOcm.createOrderDetail : 주문상세정보등록 */
 		INSERT INTO TB_ORDER_DETAIL (
 		    ORD_NO
@@ -654,7 +679,7 @@
 	</insert>
 
 	<!-- 4-2. 주문상세 이력 등록-->
-	<insert id="createOrderDetailHst" parameterType="Order">
+	<insert id="createOrderDetailHst" parameterType="ExtmallOrder">
 		/* TsaOcm.createOrderDetailHst */
 		INSERT INTO TB_ORDER_DETAIL_HST (
 		    ORD_DTL_NO
@@ -809,7 +834,7 @@
 	</insert>
 
 	<!-- 5. 주문상세단품정보등록을 위한 조회 -->
-	<select id="getOrderDetailItem" parameterType="Order" resultType="Order">
+	<select id="getOrderDetailItem" parameterType="ExtmallOrder" resultType="ExtmallOrder">
 		/* TsaOcm.getOrderDetailItem : 주문상세단품정보등록을 위한 조회 */
 		SELECT
 			#{ordDtlNo}                                  AS ORD_DTL_NO
@@ -851,7 +876,7 @@
 	</select>
 
 	<!-- 6. 주문상세단품정보등록 -->
-	<insert id="createOrderDetailItem" parameterType="Order" keyProperty="ordDtlItemSq">
+	<insert id="createOrderDetailItem" parameterType="ExtmallOrder" keyProperty="ordDtlItemSq">
 		/* TsaOrder.createOrderDetailItem : 주문상세단품정보등록 */
 		INSERT INTO TB_ORDER_DETAIL_ITEM (
 		    ORD_DTL_NO
@@ -919,7 +944,7 @@
 	</insert>
 
 	<!-- 7. 주문상세단품이력정보 등록 -->
-	<insert id="createOrderDetailItemHst" parameterType="Order">
+	<insert id="createOrderDetailItemHst" parameterType="ExtmallOrder">
 		/* TsaOrder.createOrderDetailItemHst */
 		INSERT INTO TB_ORDER_DETAIL_ITEM_HST (
 		    ORD_DTL_ITEM_SQ
@@ -991,7 +1016,7 @@
 	</insert>
 
 	<!-- 8. 주문사은품 마스터 정보 등록 -->
-	<insert id="createOrdFreegift" parameterType="Order">
+	<insert id="createOrdFreegift" parameterType="ExtmallOrder">
 		/* TsaOrder.createOrdFreegift */
 		INSERT INTO TB_ORD_FREEGIFT (
 		    ORD_NO
@@ -1021,7 +1046,7 @@
 	</insert>
 
 	<!-- 9. 주문사은품 상품 정보 등록 -->
-	<insert id="createOrdFreegiftVal" parameterType="Order">
+	<insert id="createOrdFreegiftVal" parameterType="ExtmallOrder">
 		/* TsaOrder.createOrdFreegiftVal */
 		INSERT INTO TB_ORD_FREEGIFT_VAL (
 		    ORD_FREEGIFT_SQ
@@ -1074,7 +1099,7 @@
 	</insert>
 
 	<!-- 10. 주문사은품 주문상세 정보 등록 -->
-	<insert id="createOrdFreegiftDtl" parameterType="Order">
+	<insert id="createOrdFreegiftDtl" parameterType="ExtmallOrder">
 		/* TsaOrder.createOrdFreegiftDtl */
 		INSERT INTO TB_ORD_FREEGIFT_DTL (
 		    ORD_FREEGIFT_SQ
@@ -1145,7 +1170,7 @@
 	</insert>
 
 	<!-- 12. 재고정보등록 -->
-	<insert id="createSellQty" parameterType="Order">
+	<insert id="createSellQty" parameterType="ExtmallOrder">
 		/* TsaOcm.createSellQty */
 		INSERT INTO TB_SELL_QTY (
 		    GOODS_CD
@@ -1178,7 +1203,7 @@
 	</insert>
 
 	<!-- 13. 사은품 남은수량 업데이트 -->
-	<update id="updateFreegiftValLeftQty" parameterType="Order">
+	<update id="updateFreegiftValLeftQty" parameterType="ExtmallOrder">
 		/* TsaOrder.updateFreegiftValLeftQty */
 		UPDATE TB_FREEGIFT_VAL FV
 		INNER  JOIN TB_ORD_FREEGIFT_VAL OFV
@@ -1328,7 +1353,7 @@
 	</select>
 
 	<!-- 사은품 : 1차조건 적용된 사음품 정보, 상품 금액 조회 -->
-	<select id="getFreeGiftGoodsApplyAmt" parameterType="Order" resultType="Order">
+	<select id="getFreeGiftGoodsApplyAmt" parameterType="ExtmallOrder" resultType="ExtmallOrder">
 		/* TsaOcm.getFreeGiftGoodsApplyAmt */
 		WITH GOODS_DATA AS (
 			SELECT G.GOODS_CD
@@ -1400,7 +1425,7 @@
 	</select>
 
 	<!-- 사은품 : 2차조건 적용된 사은품상품금액 구간정보조회 -->
-	<select id="getFreeGiftGoodsApplySection" parameterType="Order" resultType="Order">
+	<select id="getFreeGiftGoodsApplySection" parameterType="ExtmallOrder" resultType="ExtmallOrder">
 		/* TsaOcm.getFreeGiftGoodsApplySection */
 		SELECT FGS.FREEGIFT_SECTION_SQ
 		     , FGS.FREEGIFT_SQ
@@ -1418,7 +1443,7 @@
 	</select>
 
 	<!-- 사은품 : 3차조건 적용된 구간정보의 사은품정보조회 -->
-	<select id="getFreeGiftGoodsApplyVal" parameterType="Order" resultType="Order">
+	<select id="getFreeGiftGoodsApplyVal" parameterType="ExtmallOrder" resultType="ExtmallOrder">
 		/* TsaOcm.getFreeGiftGoodsApplyVal */
 		SELECT FGV.FREEGIFT_VAL_SQ
 		     , FG.FREEGIFT_NM
@@ -1714,16 +1739,7 @@
 				, REG_DT
 		 FROM   TB_EXTMALL_ORDER_UPLOAD_TMP A
 		 WHERE A.REG_NO = #{regNo}
-		 /*AND NOT EXISTS (
-                         SELECT 1
-                         FROM   TB_EXTMALL_ORDER_UPLOAD
-                         WHERE  VENDOR_ID = A.VENDOR_ID
-                         AND    EXTMALL_ID = A.EXTMALL_ID
-                         AND    AGENT_ORDER_ID = A.AGENT_ORDER_ID
-                         AND    EXTMALL_ORDER_ID = A.EXTMALL_ORDER_ID
-                         AND    UPLOAD_STAT = 'G021_30'
-                         )
-          */
+
 	</insert>
 
 	<!-- 외부몰주문등록 업로드 후 목록 -->

+ 6 - 6
src/main/java/com/style24/persistence/mybatis/shop/TsaShoplinker.xml

@@ -39,14 +39,16 @@
 	<select id="getCallRunableInfo" parameterType="ShoplinkerSearch" resultType="ShoplinkerSearch">
 		/* TsaShoplinkerDao.getCallRunableInfo */
 		SELECT
-			RUN_STDT
-			, SID
+			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 ) AS RUN_CNT
 		FROM SHOPLINKER_RUNABLE A
 		WHERE A.API_TYPE = #{apiType}
-		AND RUN_EDDT IS NULL
 		ORDER BY RUN_STDT DESC
-		limit 1
+		LIMIT 1
 	</select>
 
 	<!-- 샵링커 api 호출 가능여부 상태 저장  -->
@@ -762,9 +764,7 @@
 			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>
 
 	<!-- 상품 목록 조건 정보 -->

BIN
src/main/webapp/WEB-INF/lib/gagaframework-shoplinker-1.7-RELEASE.jar → src/main/webapp/WEB-INF/lib/gagaframework-shoplinker-1.7.2-RELEASE.jar


+ 12 - 1
src/main/webapp/WEB-INF/views/shoplinker/ShoplinkerGoodsSendForm.html

@@ -302,7 +302,18 @@
 
 	/**************** 엑셀업로드 ********************************************************/
 	$('#btnGoodsUpload').on('click', function() {
-		cfnExcelUploadPopup('shoplinkerUploadGoods', 'shoplinkerUploadGoods');
+
+		var jsonData = JSON.stringify({apiType : "GOODS"});
+		gagajf.ajaxJsonSubmit('/shoplinker/check/api_runable', jsonData, function(result) {
+
+			// 현재실행중인건 없음.
+			if( 0 == result.runCnt){
+				cfnExcelUploadPopup('shoplinkerUploadGoods', 'shoplinkerUploadGoods');
+
+			}else{
+				mcxDialog.alert(result.runStdt+"에 호출한 건이 현재 실행중입니다.<br>"+result.txt);
+			}
+		});
 	});
 
 	var shoplinkerUploadGoods = function(result){

+ 7 - 6
src/main/webapp/WEB-INF/views/shoplinker/ShoplinkerInvoiceSendForm.html

@@ -26,7 +26,6 @@
 		<!-- //메뉴 설명 -->
 
 		<form id="searchForm" name="searchForm" action="#" th:action="@{'/shoplinker/invoice/send/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-			<input type="hidden" name="apiType" value="INVOICE" />
 
 			<!-- 검색조건 영역 -->
 			<div class="panelStyle">
@@ -289,16 +288,18 @@
 			sureBtnText: "확인",
 			sureBtnClick: function() {
 
-				gagajf.ajaxFormSubmit('/shoplinker/check/api_runable', '#searchForm', function(result) {
-					if( "RUN" == result.RESULT_TYPE){
-						// 현재 진행중
-						mcxDialog.alert(result.RESULT_MSG+"<br>"+result.RESULT_TXT);
-					}else{
+				var jsonData = JSON.stringify({apiType : "INVOICE"});
+				gagajf.ajaxJsonSubmit('/shoplinker/check/api_runable', jsonData, function(result) {
 
+					// 현재실행중인건 없음.
+					if( 0 == result.runCnt){
 						var actionUrl = '/shoplinker/invoice/send/register?stDate='+ $("#searchForm input[name=stDate]").val()+"&edDate="+ $("#searchForm input[name=edDate]").val();
 						$.post(actionUrl, null, null, 'json');
 
+					}else{
+						mcxDialog.alert(result.runStdt+"에 호출한 건이 현재 실행중입니다.<br>"+result.txt);
 					}
+
 				});
 			}
 		});

+ 15 - 14
src/main/webapp/WEB-INF/views/shoplinker/ShoplinkerOrderForm.html

@@ -26,7 +26,6 @@
 		<!-- //메뉴 설명 -->
 
 		<form id="orderCollectionForm" name="orderCollectionForm" action="#" th:action="@{'/shoplinker/check/api_runable'}" th:method="post">
-			<input type="hidden" name="apiType" value="ORDER" />
 
 			<div class="panelStyle">
 				<table class="frmStyle">
@@ -48,6 +47,7 @@
 				<p class="cRed">※ 샵링커 주문수집 => 제휴몰 주문등록 => (제휴몰 주문등록 성공목록만) STYLE24에 주문등록이 됩니다.</p>
 				<p class="cRed">※ 샵링커 주문수집 시 동일한 목록은 '제휴몰 주문등록'이 되지 않습니다. </p>
 				<p class="cRed">※ 주문수집 건수가 많아질 수록 대기시간이 오래걸리므로 하루씩 수집합니다.</p>
+				<p class="cRed">※ 옵션코드가없는 상품(딜상품)은 결과목록에서 제외됩니다.</p>
 			</div>
 		</form>
 
@@ -373,17 +373,20 @@
 			sureBtnText: "확인",
 			sureBtnClick: function() {
 
-				gagajf.ajaxFormSubmit($('#orderCollectionForm').prop('action'), '#orderCollectionForm', function(result) {
-					if( "RUN" == result.RESULT_TYPE){
-						// 현재 진행중
-						mcxDialog.alert(result.RESULT_MSG+"<br>"+result.RESULT_TXT);
-					}else{
+				var jsonData = JSON.stringify({apiType : "ORDER"});
+				gagajf.ajaxJsonSubmit('/shoplinker/check/api_runable', jsonData, function(result) {
+
+					// 현재실행중인건 없음.
+					if( 0 == result.runCnt){
 						var actionUrl = '/shoplinker/order/collection/receiveList/' + $('#apiStDate').val();
 						$.post(actionUrl, null, null, 'json');
 
 						setTimeout(function(){
 							fnGetCallRunableInfo();
-						}, 25000 );
+						}, 20000 );
+
+					}else{
+						mcxDialog.alert(result.runStdt+"에 호출한 건이 현재 실행중입니다.<br>"+result.txt);
 					}
 				});
 			}
@@ -394,18 +397,16 @@
 	var fnGetCallRunableInfo = function(){
 
 		gagajf.ajaxFormSubmit($('#orderCollectionForm').prop('action'), '#orderCollectionForm', function(result) {
-			if( "RUN" == result.RESULT_TYPE){
 
-				$(".runable_info").html(result.RESULT_TXT);
+			$(".runable_info").html(result.txt);
+
+			if( 0 == result.runCnt){
+				// 재호출 안함.
+			}else{
 				// 현재 진행중
 				setTimeout(function(){
 					fnGetCallRunableInfo();
 				}, 20000 );
-
-			}else{
-				// 종료처리
-				var str = $(".runable_info").html();
-				$(".runable_info").html(str + "=>FINISH");
 			}
 		});
 	}