Explorar o código

Merge branch 'develop' into card007

card007 %!s(int64=4) %!d(string=hai) anos
pai
achega
7e69dcea41
Modificáronse 24 ficheiros con 1098 adicións e 211 borrados
  1. 97 1
      src/main/java/com/style24/admin/biz/dao/TsaOcmDao.java
  2. 5 1
      src/main/java/com/style24/admin/biz/service/TsaGoodsService.java
  3. 169 37
      src/main/java/com/style24/admin/biz/service/TsaOcmService.java
  4. 3 1
      src/main/java/com/style24/admin/biz/service/TsaPlanService.java
  5. 6 6
      src/main/java/com/style24/admin/biz/service/TsaShoplinkerService.java
  6. 94 14
      src/main/java/com/style24/admin/biz/web/TsaOcmController.java
  7. 19 0
      src/main/java/com/style24/admin/biz/web/TsaOrderController.java
  8. 1 11
      src/main/java/com/style24/admin/biz/web/TsaShoplinkerController.java
  9. 18 0
      src/main/java/com/style24/admin/support/env/TsaConstants.java
  10. 23 10
      src/main/java/com/style24/persistence/domain/ExtmallOrder.java
  11. 7 6
      src/main/java/com/style24/persistence/domain/Goods.java
  12. 7 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  13. 406 18
      src/main/java/com/style24/persistence/mybatis/shop/TsaOcm.xml
  14. 1 1
      src/main/java/com/style24/persistence/mybatis/shop/TsaPlan.xml
  15. 4 1
      src/main/java/com/style24/persistence/mybatis/shop/TsaShoplinker.xml
  16. 2 2
      src/main/webapp/WEB-INF/views/display/MainContentsPopupForm.html
  17. 8 8
      src/main/webapp/WEB-INF/views/display/MainGnbContentsPopupForm.html
  18. 3 0
      src/main/webapp/WEB-INF/views/goods/GoodsDealForm.html
  19. 36 4
      src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html
  20. 3 0
      src/main/webapp/WEB-INF/views/goods/GoodsSetForm.html
  21. 61 72
      src/main/webapp/WEB-INF/views/ocm/ExtmallOrderRegisterForm.html
  22. 46 6
      src/main/webapp/WEB-INF/views/order/OrderDetailForm.html
  23. 3 12
      src/main/webapp/WEB-INF/views/order/OrderListForm.html
  24. 76 0
      src/main/webapp/WEB-INF/views/order/SweetTrackerDeliveryList.html

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

@@ -123,7 +123,7 @@ public interface TsaOcmDao {
 	 * @author jmh
 	 * @since 2021. 5. 31
 	 */
-	int getExtmallOrderCnt(Order order);
+	Order getExtmallOrderCnt(Order order);
 
 
 	// ------------------------- 주문등록 소스 -------------------------------------------//
@@ -308,4 +308,100 @@ public interface TsaOcmDao {
 	Collection<Order> getFreeGiftGoodsApplyVal(Order order);
 	// ------------------------- 주문등록 소스 끝 -------------------------------------------//
 	// ------------------------- 주문등록 소스 끝 -------------------------------------------//
+
+
+
+
+
+
+
+	/**
+	 * 제휴몰주문 임시 테이블 삭제
+	 *
+	 * @param userNo - 사용자아이디
+	 * @return int
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	int deleteExtmallOrderUploadTmp(int userNo);
+
+	/**
+	 * 외부몰주문등록 테이블 실패목록 데이터 삭제
+	 *
+	 * @param userNo - 사용자아이디
+	 * @return int
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	int deleteExtmallOrderUploadFail(int userNo);
+
+	/**
+	 * 제휴몰주문등록 (TB_EXTMALL_ORDER_UPLOAD_TMP)
+	 *
+	 * @param extmallOrderUpload - 제휴몰주문업로드정보
+	 * @return int
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	int createExtmallOrderUploadTmp(ExtmallOrder extmallOrder);
+
+	/**
+	 * 제휴몰주문등록 업로드 후 목록
+	 *
+	 * @param extmallOrder - 제휴몰주문업로드정보
+	 * @return Collection<ExtmallOrder>
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	Collection<ExtmallOrder> getExtmallOrderUploadTmpList(ExtmallOrder extmallOrder);
+
+	/**
+	 * 제휴몰주문업로드 생성 - 제휴몰 벤더ID 가져오기
+	 *
+	 * @param regId -
+	 * @return String
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	String getVendorId(String regId);
+
+	/**
+	 * 제휴몰주문등록 업로드 후 주문업로드 생성
+	 *
+	 * @param extmallOrderUpload - 제휴몰주문업로드정보
+	 * @return int
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	int createExtmallOrderUploadSecond(ExtmallOrder extmallOrder);
+
+	/**
+	 * 제휴몰주문등록 주문업로드 후 목록
+	 *
+	 * @param extmallOrder - 제휴몰주문업로드정보
+	 * @return Collection<ExtmallOrder>
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	Collection<ExtmallOrder> getExtmallOrderUploadSecondList(ExtmallOrder extmallOrder);
+
+	/**
+	 * 제휴몰 주문 업로드 목록
+	 *
+	 * @param extmallOrder - 외부몰주문업로드 정보
+	 * @return Collection<ExtmallOrder>
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	Collection<ExtmallOrder> getExtmallOrderUploadList(ExtmallOrder extmallOrder);
+
+	/**
+	 * 제휴몰 주문 업로드 결과정보
+	 *
+	 * @param extmallOrder - 외부몰주문업로드 정보
+	 * @return Collection<ExtmallOrder>
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	ExtmallOrder getExtmallOrderUploadResultInfo(ExtmallOrder extmallOrder);
 }

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

@@ -1372,6 +1372,7 @@ public class TsaGoodsService {
 		regGoods.setGoodsGb("G073_11"); // 자사상품은 신규
 		//regGoods.setDistributionGb("G065_12"); // 유통구분
 		regGoods.setTaxGb("10"); // 과세구분
+		regGoods.setTobeFormYn("Y"); 
 		regGoods.setGoodsNum(goodsCd);
 
 		Collection<GoodsCompose> goodsComposeList = null;
@@ -1402,12 +1403,13 @@ public class TsaGoodsService {
 				regGoods.setSupplyCompCd(extendGoods.getSupplyCompCd());
 				regGoods.setFormalGb(extendGoods.getFormalGb());
 				regGoods.setSelfGoodsYn(extendGoods.getSelfGoodsYn());
+				regGoods.setDelvLocCd(extendGoods.getDelvLocCd()); //출고처
 			}
 
 			if ("Y".equals(goodsCompose.getRepYn())) {
 				regGoods.setListPrice(extendGoods.getCurrPrice());
 				regGoods.setCurrPrice(extendGoods.getCurrPrice());
-				regGoods.setDcRate((int)(this.getDcRate(goods.getCurrPrice(), goods.getCurrPrice())));
+				regGoods.setDcRate((int)(this.getDcRate(regGoods.getListPrice(), regGoods.getCurrPrice())));
 			}
 		}
 
@@ -1451,6 +1453,7 @@ public class TsaGoodsService {
 		regGoods.setGoodsGb("G073_11"); // 자사상품은 신규
 		//regGoods.setDistributionGb("G065_12"); // 유통구분
 		regGoods.setTaxGb("10"); // 과세구분
+		regGoods.setTobeFormYn("Y"); 
 		regGoods.setGoodsNum(goodsCd);
 
 		Collection<GoodsCompose> goodsComposeList = null;
@@ -1485,6 +1488,7 @@ public class TsaGoodsService {
 				regGoods.setSupplyCompCd(extendGoods.getSupplyCompCd());
 				regGoods.setFormalGb(extendGoods.getFormalGb());
 				regGoods.setSelfGoodsYn(extendGoods.getSelfGoodsYn());
+				regGoods.setDelvLocCd(extendGoods.getDelvLocCd()); //출고처
 			}
 		}
 

+ 169 - 37
src/main/java/com/style24/admin/biz/service/TsaOcmService.java

@@ -1,18 +1,21 @@
 package com.style24.admin.biz.service;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.util.GagaFileUtil;
 import com.style24.admin.biz.dao.TsaOcmDao;
 import com.style24.admin.support.env.TsaConstants;
 import com.style24.admin.support.env.TsaConstants.ExtmallUploadFailStat;
 import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.biz.service.TscOrderChangeService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.Extmall;
@@ -40,9 +43,15 @@ public class TsaOcmService {
     @Autowired
     private TscMessageByLocale message;
 
+    @Autowired
+	private Environment env;
+
     @Autowired
     private TsaOcmDao ocmDao;
 
+    @Autowired
+	private ObjectMapper mapper;
+
     /**
      * 제휴몰 목록
      * @param extmall - 제휴몰 정보
@@ -133,9 +142,9 @@ public class TsaOcmService {
      * 샵링커 주문수집으로 외부몰주문등록된 건 중 '대기'상태인 것들에 대해 주문등록처리를 한다.
      */
     @Transactional("shopTxnManager")
-    public void createShoplinkerOrder() {
+    public void createShoplinkerOrder(String uploadGb) {
 
-    	Collection<Order> orderList = this.sortOrderList();
+    	Collection<Order> orderList = this.sortOrderList(uploadGb);
 
     	if (orderList != null && !orderList.isEmpty()) {
 	    	for( Order order : orderList ) {
@@ -178,7 +187,7 @@ public class TsaOcmService {
 	    					cancelGoodsNms += orderDetail.getGoodsNm()+",";
 	    					cancelAmt += orderDetail.getOrdAmt();
 
-	    					exOrdDtl.setUploadStat("G021_40");	// 실패
+	    					exOrdDtl.setUploadStat(TsaConstants.ExtmallUploadStat.FAIL.value());	// 실패
 	    					exOrdDtl.setOrdNo(null);
 	    					exOrdDtl.setUploadFailCd(vdMap.getString("uploadFailCd"));
 	    					exOrdDtl.setUploadFailReason(vdMap.getString("message"));
@@ -274,7 +283,7 @@ public class TsaOcmService {
 	            				ocmDao.createSellQty(orderDetail);
 
 	                            // 외부몰 정보 업데이트
-	                            exOrdDtl.setUploadStat("G021_30");	// 성공
+	                            exOrdDtl.setUploadStat(TsaConstants.ExtmallUploadStat.SUCC.value());	// 성공
 	        					ocmDao.updateExtmallOrder(exOrdDtl);
 
 	        					dtlNos += orderDetail.getOrdDtlNo()+",";
@@ -302,7 +311,7 @@ public class TsaOcmService {
 	    		        		for(Order ftMap : freegiftApplyAmtList ) {
 	    		        			dtlGoodsCds += ftMap.getGoodsCd() +",";
 	    		        		}
-	    		        		System.out.println("hmj 2dtlGoodsCds ; "+dtlGoodsCds );
+
 	    		        		dtlGoodsCds = dtlGoodsCds.substring(0, dtlGoodsCds.length()-1);
 	    		        		dtlGoodsCdsArr = dtlGoodsCds.split(",");
 	    		        		order.setFreegiftGoodsArr(dtlGoodsCdsArr);
@@ -359,45 +368,44 @@ public class TsaOcmService {
 	                // 8. 알림톡 발송
 	                if( 0 == cancelAmt ) {
 	                	// 전체성공
-	                	System.out.println(" hmj :: 전체성공 !! ");
+	                	System.out.println(" ######  :: 전체성공 !! ");
 
 	                }else {
 	                	// 부분품절 - 제휴몰에서 자동 취소 문자 발송을 하지 않는 경우에만 발송
 	                	// coupang, WEMAPE, ST11TH, GMARKET, AUCTION, Fashion Plus, 판다코리아, 예스24, 홈플러스, LOTTE ON
 	                	cancelGoodsNms = cancelGoodsNms.substring(0, cancelGoodsNms.length()-1);
-	                	System.out.println(" hmj :: 부분성공  (실패 상품명 : "+cancelGoodsNms);
+	                	System.out.println(" ######  :: 부분성공  (실패 상품명 : "+cancelGoodsNms);
 	                }
 
 
 	    		}else {
-
+	    			System.out.println("### 전체실패 :: "+ordCheckMsg);
 	    			if( "ALL_FAIL".equals(ordCheckMsg) ) {	// NOT = 이미 등록된 주문건
 	    				// 전체실패 일때만 알림톡 발송
 	    				// 제휴몰에서 자동 취소 문자 발송을 하지 않는 경우에만 발송
 	        			// coupang, WEMAPE, ST11TH, GMARKET, AUCTION, Fashion Plus, 판다코리아, 예스24, 홈플러스, LOTTE ON
+	    			}
 
+    				// 외부몰 주문등록 상태 업데이트
+    				ExtmallOrder exOrdDtl;
+    				GagaMap vdMap;
+    				for( Order 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);
+    				}
 
-	    				// 외부몰 주문등록 상태 업데이트
-	    				ExtmallOrder exOrdDtl;
-	    				GagaMap vdMap;
-	    				for( Order orderDetail : order.getOrderDetailList()) {
-
-	    					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("G021_40");	// 실패
-
-	    					exOrdDtl.setUploadFailCd(vdMap.getString("uploadFailCd"));
-	    					exOrdDtl.setUploadFailReason(vdMap.getString("message"));
-	    					ocmDao.updateExtmallOrder(exOrdDtl);
-	    				}
-
-
-	    			}
 	    		}
 	        }
 
@@ -412,15 +420,19 @@ public class TsaOcmService {
      * @author jsh77b
      * @since 2021. 03. 09
     */
-    private Collection<Order> sortOrderList() {
+    private Collection<Order> sortOrderList(String uploadGb) {
     	Collection<Order> orderList = new ArrayList<Order>();
         Collection<Order> tmpOrdDtlList = new ArrayList<Order>();
 
         // 1. 외부몰주문등록 대기목록 조회
         ExtmallOrder params = new ExtmallOrder();
-        params.setUploadStat("G021_00");	// 대기
-        Collection<ExtmallOrder> exMastList = ocmDao.getExtmallMasterOrderList(params);
+        params.setUploadStat(TsaConstants.ExtmallUploadStat.WAIT.value());		// 대기
+        params.setUploadGb(uploadGb);											// 등록위치 (S: 샵링커, E: 엑셀)
+        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>();
 
@@ -564,7 +576,7 @@ public class TsaOcmService {
 				succCnt ++;
 			}
 
-			// 동일한 주문건이 있을경우, 전체 중지
+			// 동일한 주문건이 있을경우, 전체 중지 (이미 알림톡 결과발송을 했으므로)
 			if (ExtmallUploadFailStat.ORDER.value().equals(resultMap.get("uploadFailCd").toString())) {
 				succCnt = -1;	// 알림톡 발송도 안함.
 				break;
@@ -601,9 +613,11 @@ public class TsaOcmService {
 
 		// 중복저장확인
 		param.setVendorId(TsaConstants.VendorId.SHOPLINKER.value());
-		int extRegCnt = ocmDao.getExtmallOrderCnt(param);
-		if( 0 < extRegCnt) {
+		//int extRegCnt = ocmDao.getExtmallOrderCnt(param);
+		Order dtlOrd = ocmDao.getExtmallOrderCnt(param);
+		if( null != dtlOrd) {
 			result.put("uploadFailCd", ExtmallUploadFailStat.ORDER.value());
+			result.put("ordNo", dtlOrd.getOrdNo());
 			result.put("message", "동일한 주문건이 존재합니다.");
 			return result;
 		}
@@ -612,7 +626,7 @@ public class TsaOcmService {
 		Goods goods = new Goods();
 		goods.setGoodsCd(param.getGoodsCd());
 		// goods.setCustNo(0);
-		goods.setFrontGb("P");
+		goods.setShoplinkerFrontGb("P");
 		goods.setSiteCd(TscConstants.Site.STYLE24.value());
 		goods = ocmDao.getGoodsInfo(goods);
 
@@ -823,4 +837,122 @@ public class TsaOcmService {
 	}
 
 
+
+
+
+
+	/**
+	 * 외부몰주문등록 엑셀 저장
+	 *
+	 * @param excelExtmallOrderList - 외부몰주문등록리스트
+	 * @param excelFilename - 엑셀파일명
+	 * @return void
+	 * @author Daehyoung
+	 * @since 2020. 02. 13
+	 */
+	@Transactional("shopTxnManager")
+	public void createExtmallOrderExcelupload(Collection<GagaMap> excelExtmallOrderList, String excelFilename) {
+		String targetPath = env.getProperty("upload.excel.target.path");
+		int userNo = TsaSession.getInfo().getUserNo();
+		if ((excelExtmallOrderList == null || excelExtmallOrderList.isEmpty())) {
+			try {
+				GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, excelFilename));
+			} catch (IOException e) {
+				// Nothing Do
+			}
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+		ocmDao.deleteExtmallOrderUploadTmp(userNo);
+
+
+		int dataIndex = 2;
+		int index = 0;
+		String vendorId = "";
+		for (GagaMap gagaMap : excelExtmallOrderList) {
+			ExtmallOrder extmallOrder = mapper.convertValue(gagaMap, ExtmallOrder.class);
+			String[] params = extmallOrder.getParams();
+			String[] columns = extmallOrder.getColumns();
+
+
+			/*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) {
+						throw new IllegalStateException(dataIndex + "행에 " + columns[validation] + "(을)를 입력해 주세요.");
+					}
+				}
+			}
+
+			//extmallOrder.setOrdDt(extmallOrder.getOrdDt().replace("-", ""));
+			//extmallOrder.setPayDt(extmallOrder.getPayDt().replace("-", ""));
+			extmallOrder.setVendorId(TsaConstants.VendorId.SHOPLINKER.value());
+			extmallOrder.setOrdAmt( (extmallOrder.getCurrPrice() * extmallOrder.getOrdQty()) - extmallOrder.getCpnDcAmt());
+			extmallOrder.setUploadStat(TsaConstants.ExtmallUploadStat.WAIT.value());
+			extmallOrder.setRegNo(userNo);
+			extmallOrder.setUploadGb("E");
+			ocmDao.createExtmallOrderUploadTmp(extmallOrder);
+			dataIndex++;
+			index++;
+		}
+
+		// 결과조회시, 실패목록이 여러건 뜨지 않도록 하기위함. => 실패 history가 단건만 생성되도록
+		ocmDao.deleteExtmallOrderUploadFail(userNo);
+	}
+
+	/**
+	 * 외부몰주문등록 업로드 후 목록
+	 *
+	 * @param ExtmallOrder - 외부몰 주문등록 정보
+	 * @return Collection<ExtmallOrder>
+	 * @author Daehyoung
+	 * @since 2020. 02. 13
+	 */
+	public Collection<ExtmallOrder> getExtmallOrderUploadTmpList() {
+		ExtmallOrder extmallOrder = new ExtmallOrder();
+		extmallOrder.setRegNo(TsaSession.getInfo().getUserNo());
+		return ocmDao.getExtmallOrderUploadTmpList(extmallOrder);
+	}
+
+	/**
+	 * 외부몰주문등록 업로드 후 저장 처리
+	 *
+	 * @param extmallOrderUpload - 외부몰주문업로드 정보
+	 * @return String - 결과값
+	 * @author jmh
+	 * @since 2020. 02. 17
+	 */
+	@Transactional("shopTxnManager")
+	public String saveExtmallorder(ExtmallOrder extmallOrder) {
+
+		int userNo = TsaSession.getInfo().getUserNo();
+		extmallOrder.setRegNo(userNo);
+		extmallOrder.setVendorId(TsaConstants.VendorId.SHOPLINKER.value());
+
+		int collectCnt = ocmDao.createExtmallOrderUploadSecond(extmallOrder);
+		//log.info("STEP2 2.1.외부몰주문업로드 데이터 생성: 성공({} 건)", collectCnt);
+
+		this.createShoplinkerOrder("E");
+
+		ExtmallOrder resultInfo = ocmDao.getExtmallOrderUploadResultInfo(extmallOrder);
+
+		return message.getMessage("SABANGNET_0004", new Object[] {collectCnt, resultInfo.getSuccCnt(), resultInfo.getFailCnt()});
+	}
+
+	/**
+	 * 외부몰주문등록 업로드 후 목록
+	 *
+	 * @return Collection<ExtmallOrder>
+	 * @author jmh
+	 * @since 2020. 02. 17
+	 */
+	public Collection<ExtmallOrder> getExtmallOrderUploadSecondList() {
+		ExtmallOrder extmallOrder = new ExtmallOrder();
+		extmallOrder.setRegNo(TsaSession.getInfo().getUserNo());
+		return ocmDao.getExtmallOrderUploadSecondList(extmallOrder);
+	}
+
+
 }

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

@@ -459,6 +459,7 @@ public class TsaPlanService {
 		param.setRegNo(userNo);
 		param.setUpdNo(userNo);
 		planDao.createPlanCopy(param);
+		Integer prePlanSq = param.getPlanSq();
 		
 		plan.setRegNo(userNo);
 		plan.setUpdNo(userNo);
@@ -526,7 +527,8 @@ public class TsaPlanService {
 			plan.setBasDays(attendInfo.getBasDays());
 			planDao.createPlanAttendBenefitCopy(plan);
 		}
-
+		// 복사한 기획전 번호 셋팅
+		plan.setPlanSq(prePlanSq);
 		return plan;
 	}
 	

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

@@ -1249,8 +1249,9 @@ public class TsaShoplinkerService {
 			extmallOrder = new ExtmallOrder();
 			extmallOrder.setAllParams(slOrder);
 			extmallOrder.setVendorId(TsaConstants.VendorId.SHOPLINKER.value());	// 샵링커
-			extmallOrder.setUploadStat("G021_00"); // 대기
+			extmallOrder.setUploadStat(TsaConstants.ExtmallUploadStat.WAIT.value()); 	// 대기
 			extmallOrder.setRegNo(TsaSession.getInfo().getUserNo());
+			extmallOrder.setUploadGb("S");										// 업로드구분(샵링커:S, 엑셀:E)
 
 			try {
 
@@ -1284,9 +1285,8 @@ public class TsaShoplinkerService {
 
 			}catch(Exception e) {
 				log.error("TsaShoplinkerService.insertShoplinkerOrderStep2 Error : "+e);
-				extmallOrder.setUploadStat("G021_40");	//실패
-				extmallOrder.setUploadFailCd("G022_90");
-				//extmallOrder.setUploadFailCd(xmlUrl);
+				extmallOrder.setUploadStat(TsaConstants.ExtmallUploadStat.FAIL.value());	//실패
+				extmallOrder.setUploadFailCd(TsaConstants.ExtmallUploadFailStat.ETC.value());
 				extmallOrder.setUploadFailReason("제휴몰 등록오류 :: "+StringUtils.abbreviate(e.getMessage(), 0 , 120)); // 실패사유
 				ocmDao.insertExtmallOrder(extmallOrder);
 			}
@@ -1308,7 +1308,7 @@ public class TsaShoplinkerService {
 
 		GagaMap rMap = new GagaMap();
 		rMap.setString("RESULT_MSG", "FAIL");
-		rMap.setString("UploadStat", "G021_40");
+		rMap.setString("UploadStat", TsaConstants.ExtmallUploadStat.FAIL.value());
 
 		/*if( null != slOrder.getDeliveryInvoice() && !slOrder.getDeliveryInvoice().isEmpty()) {
 		    rMap.setString("UploadFailCd", "G022_70");
@@ -1317,7 +1317,7 @@ public class TsaShoplinkerService {
 		}*/
 
 		if( null == slOrder.getReceiveAddr() || slOrder.getReceiveAddr().isEmpty()) {
-			rMap.setString("UploadFailCd", "G022_90");
+			rMap.setString("UploadFailCd", TsaConstants.ExtmallUploadFailStat.ETC.value());
 			rMap.setString("UploadFailReason", "주소정보 없음.");
 			return rMap;
 		}

+ 94 - 14
src/main/java/com/style24/admin/biz/web/TsaOcmController.java

@@ -1,8 +1,10 @@
 package com.style24.admin.biz.web;
 
+import java.util.ArrayList;
 import java.util.Collection;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -11,15 +13,18 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
+import com.gagaframework.excel.GagaExcelUtil;
+import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.rest.server.GagaResponse;
+import com.gagaframework.web.util.GagaFileUtil;
 import com.style24.admin.biz.service.TsaOcmService;
 import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.support.controller.TsaBaseController;
-import com.style24.admin.support.env.TsaConstants;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.Extmall;
 import com.style24.persistence.domain.ExtmallNoti;
+import com.style24.persistence.domain.ExtmallOrder;
 import com.style24.persistence.domain.ExtmallOrigin;
 import com.style24.persistence.domain.ExtmallPriceSync;
 
@@ -39,12 +44,16 @@ public class TsaOcmController extends TsaBaseController {
 	@Autowired
 	private TscMessageByLocale message;
 
+	@Autowired
+	private Environment env;
+
 	@Autowired
 	private TsaOcmService ocmService;
 
 	@Autowired
 	private TsaRendererService rendererService;
 
+
 	/**
 	 * 제휴몰관리 화면
 	 * @return
@@ -226,8 +235,14 @@ public class TsaOcmController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 
+
+
+
+
+
+
 	/**
-	 * 주문업로드 화면
+	 * 제휴몰주문업로드 화면
 	 * @param
 	 * @return
 	 * @author jmh
@@ -237,22 +252,87 @@ public class TsaOcmController extends TsaBaseController {
 	public ModelAndView extmallOrderUploadForm() {
 		ModelAndView mav = new ModelAndView();
 
-		// 제휴몰벤더
-		mav.addObject("vendorList", rendererService.getCommonCodeList("G003", "Y", TsaSession.getInfo().getSupplyCompCd()));
+		mav.setViewName("ocm/ExtmallOrderRegisterForm");
 
-		// 제휴몰
-		Extmall extmall = new Extmall();
-		extmall.setVendorId(TsaConstants.VendorId.SHOPLINKER.value()); // 샵링커
-		mav.addObject("extmallList", ocmService.getExtmallList(extmall));
+		return mav;
+	}
 
-		// 업로드상태 콤보박스 목록
-		mav.addObject("uploadStatList", rendererService.getCommonCodeList("G021"));
 
-		// 업로드실패사유 콤보박스 목록
-		mav.addObject("uploadFailList", rendererService.getCommonCodeList("G022"));
+	/**
+	 * 제휴몰주문업로드 엑셀 업로드
+	 *
+	 * @param extmallOrder - 외부몰주문정보
+	 * @return GagaResponse
+	 * @throws Exception -exception
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	@PostMapping("/extmallorder/excelupload/save")
+	@ResponseBody
+	public GagaResponse saveExtmallorderExcelupload(@RequestBody ExtmallOrder extmallOrder) throws Exception {
 
-		mav.setViewName("ocm/ExtmallOrderRegisterForm");
+		String targetPath = env.getProperty("upload.excel.target.path") + "/excel/";
+		Collection<GagaMap> ecxelGoodsList = new ArrayList<>();
 
-		return mav;
+		// 외부몰주문등록
+		if ("createExtmallOrder".equals(extmallOrder.getProcJob())) {
+			// DB 처리 시 사용되는 파라미터명(셀명) 설정
+			String[] extMallOrderNames = {"ordDt", "extmallId", "extmallOrderId", "agentOrderId", "extmallProdId", "goodsCd", "sku", "optCd", "currPrice", "cpnDcAmt", "ordQty", "delvFee", "ordNm", "ordTelno", "ordPhnno", "ordEmail", "recipNm", "recipTelno", "recipPhnno", "recipZipcode", "recipBaseAddr", "recipDtlAddr", "delvMemo"};
+
+			ecxelGoodsList = GagaExcelUtil.getList(
+				GagaFileUtil.getConcatenationPath(targetPath, extmallOrder.getExcelFileNm()), 0, extMallOrderNames, 0);
+		}
+		ocmService.createExtmallOrderExcelupload(ecxelGoodsList, extmallOrder.getExcelFileNm());
+
+		// 파일 삭제
+		GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, extmallOrder.getExcelFileNm()));
+
+		return super.ok(message.getMessage("SUCC_0007"));
+	}
+
+	/**
+	 * 제휴몰주문업로드 업로드 후 목록
+	 *
+	 * @return Collection<ExtmallOrder>
+	 * @throws Exception -exception
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	@PostMapping("/extmallorder/upload/tmp/list")
+	@ResponseBody
+	public Collection<ExtmallOrder> getExtmallOrderUploadTmpList() throws Exception {
+		return ocmService.getExtmallOrderUploadTmpList();
+	}
+
+	/**
+	 * 제휴몰주문업로드 업로드 후 저장 처리
+	 *
+	 * @param extmallOrder - 외부몰주문업로드 정보
+	 * @return GagaResponse
+	 * @throws Exception -exception
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	@PostMapping("/extmallorder/save")
+	@ResponseBody
+	public GagaResponse saveExtmallorder(@RequestBody ExtmallOrder extmallOrder) {
+		String resultMsg = ocmService.saveExtmallorder(extmallOrder);
+		return super.ok(resultMsg);
 	}
+
+	/**
+	 * 제휴몰주문업로드 업로드 후 목록(결과확인)
+	 *
+	 * @return Collection<ExtmallOrder>
+	 * @throws Exception -exception
+	 * @author jmh
+	 * @since 2021. 06. 17
+	 */
+	@PostMapping("/extmallorder/upload/second/list")
+	@ResponseBody
+	public Collection<ExtmallOrder> getExtmallOrderUploadSecondList() {
+		return ocmService.getExtmallOrderUploadSecondList();
+	}
+
+
 }

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

@@ -803,6 +803,25 @@ public class TsaOrderController extends TsaBaseController {
 		Collection<Order> orderList = orderService.getOrderSellerUnorderList(order);
 		return orderList;
 	}
+	
+	/**
+	 * 스윗트래커 정보 조회
+	 *
+	 * @return ModelAndView
+	 * @author jsh77b
+	 * @since 2021. 06. 17
+	 */
+	@GetMapping("/delivery/sweetTrackerDeliveryInfo")
+	public ModelAndView sweetTrackerDeliveryInfo(Order order) {
+		ModelAndView mav = new ModelAndView();
+
+		Collection<Order> sweetTrackerDeliveryList = orderService.getSweetTrackerDeliveryInfo(order);
+		mav.addObject("sweetTrackerDeliveryList"	, sweetTrackerDeliveryList); // 택배사 목록
+		
+		mav.setViewName("order/SweetTrackerDeliveryList");
+
+		return mav;
+	}
 }
 
 

+ 1 - 11
src/main/java/com/style24/admin/biz/web/TsaShoplinkerController.java

@@ -365,7 +365,7 @@ public class TsaShoplinkerController extends TsaBaseController {
 				// 4. 스타일24 주문등록 (제휴몰 - 대기상태인 것들)
 				slkSearch.setTxt("=>스타일24 주문등록 처리중");
 				shoplinkerService.saveCallApiRunable(slkSearch);
-				ocmService.createShoplinkerOrder();
+				ocmService.createShoplinkerOrder("S");
 
 			}catch (Exception e) {
 
@@ -735,16 +735,6 @@ public class TsaShoplinkerController extends TsaBaseController {
 					+ "<message><![CDATA[택배사 명칭이 일치하지 않거나 코드가 일치하지 않습니다. 재전송 바랍니다.]]></message>\r\n"
 					+ "</ResultMessage>";
 
-			String responseXmlData2 = "<?xml version=\"1.0\" encoding=\"euc-kr\"?>\r\n"
-					+ "			<Shoplinker>\r\n"
-					+ "				<ResultMessage>\r\n"
-					+ "					<result>true</result>\r\n"
-					+ "					<product_id>P1524578</product_id>\r\n"
-					+ "					<message>등록성공</message>\r\n"
-					+ "				</ResultMessage>\r\n"
-					+ "			</Shoplinker>";
-
-
 
 			//xx invoceMsg = (com.gagaframework.shoplinker.domain.invoice.ResultMessage) shoplinkerUtil.unmarshal(null, responseXmlData);
 			//xx obf = (com.gagaframework.shoplinker.domain.invoice.ObjectFactory) shoplinkerUtil.unmarshal(com.gagaframework.shoplinker.domain.invoice.ObjectFactory.class, responseXmlData);

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

@@ -106,6 +106,24 @@ public class TsaConstants {
 		}
 	}
 
+	// 제휴몰 파일업로드 상태유형
+	public enum ExtmallUploadStat {
+		WAIT("G021_00"),				// 대기
+		CHECK("G021_20"),				// 검증
+		SUCC("G021_30"),				// 성공
+		FAIL("G021_40");				// 실패
+
+		private String value;
+
+		private ExtmallUploadStat(String value) {
+			this.value = value;
+		}
+
+		public String value() {
+			return value;
+		}
+	}
+
 	// 제휴몰 파일업로드 실패유형
 	public enum ExtmallUploadFailStat {
 		GOODS("G022_10"),				// 상품코드미매핑

+ 23 - 10
src/main/java/com/style24/persistence/domain/ExtmallOrder.java

@@ -2,7 +2,6 @@ package com.style24.persistence.domain;
 
 import java.util.Collection;
 
-import com.gagaframework.shoplinker.domain.orderlist.Order;
 import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
@@ -19,12 +18,12 @@ public class ExtmallOrder extends TscBaseDomain {
 
 	private String vendorId; 			// 벤더ID(공통코드G003)
 	private String vendorNm; 			// 벤더명
-	private String extmallId; 			// 외부몰ID(외부몰). TB_EXMALL.EXTMALL_ID
-	private String extmallNm; 			// 외부몰명.SHOPLINKER_ORDER.MALL_NAME
+	private String extmallId; 			// 제휴몰ID(외부몰). TB_EXMALL.EXTMALL_ID
+	private String extmallNm; 			// 제휴몰명.SHOPLINKER_ORDER.MALL_NAME
 	private String agentOrderId; 		// 에이전트주문번호.SHOPLINKER_ORDER.SHOPLINKER_ORDER_ID
-	private String extmallOrderId; 		// 외부몰주문번호(쇼핑몰주문번호).SHOPLINKER_ORDER.MALL_ORDER_ID
-	private String extmallProdId; 		// 외부몰상품ID. SHOPLINKER_ORDER.ORDER_PRODUCT_ID
-	private String extmallProdNm; 		// 외부몰상품명. SHOPLINKER_ORDER.PRODUCT_NAME
+	private String extmallOrderId; 		// 제휴몰주문번호(쇼핑몰주문번호).SHOPLINKER_ORDER.MALL_ORDER_ID
+	private String extmallProdId; 		// 제휴몰상품ID. SHOPLINKER_ORDER.ORDER_PRODUCT_ID
+	private String extmallProdNm; 		// 제휴몰상품명. SHOPLINKER_ORDER.PRODUCT_NAME
 	private String goodsCd; 			// 상품코드(상품)
 	private String goodsNm;
 	private String sku; 				// 옵션명(필수옵션+추가옵션)
@@ -55,17 +54,21 @@ public class ExtmallOrder extends TscBaseDomain {
 	private Integer ordNo; 				// 주문번호(주문)
 	private Integer delvAddrSq; 		// 배송지일련번호(배송지)
 	private String optCd;				// 옵션코드
-
-	private String stDate;
-	private String edDate;
-
+	private String uploadGb;			// 업로드구분(샵링커:S, 엑셀:E)
+	private String excelFileNm;			// 엑셀업로드 파일명
+	private String procJob;
+	private String warningYn;			// 주의여부(엑셀업로드 결과표시관련)
 	private String supplyCompCd;		// 공급업체코드
 	private Integer totalOrdAmt;		// 총 주문금액
 
+	private String stDate;
+	private String edDate;
 	private String regNm;				// 자사-등록자명
 	private Integer regNo;				// 자사-등록자번호
 	private String regDt;				// 자사-등록일시
 
+	private String succCnt;				// 엑셀업로드 성공수
+	private String failCnt;				// 엑셀업로드 실패수
 
 
 	Collection<ExtmallOrder> orderDetailList;		// 주문상세목록
@@ -99,6 +102,16 @@ public class ExtmallOrder extends TscBaseDomain {
 		this.recipZipcode = ord.getReceiveZipcode();
 		this.delvMemo = ord.getDeliveryMsg();
 	}
+
+	public String[] getParams() {
+		String[] params = {this.ordDt, this.extmallId, this.extmallOrderId, this.agentOrderId, this.extmallProdId, this.goodsCd, this.sku, this.optCd, this.currPrice+"", this.cpnDcAmt+"", this.ordQty+"", this.delvFee+"", this.ordNm, this.ordTelno, this.ordPhnno, this.ordEmail, this.recipNm, this.recipTelno, this.recipPhnno, this.recipZipcode, this.recipBaseAddr, this.recipDtlAddr, this.delvMemo};
+		return params;
+	}
+
+	public String[] getColumns() {
+		String[] columns = {"주문일", "제휴몰ID", "제휴주문번호", "샵링커주문번호",  "제휴상품코드", "자사상품코드", "상품명", "옵션코드", "판매가", "할인금액", "주문수량", "배송비", "주문자", "주문자전화번호", "주문자휴대폰번호", "주문자이메일", "수령자명", "수령자전화번호", "수령자휴대폰번호", "수령자우편번호", "수령자기본주소", "수령자상세주소", "배송메시지"};
+		return columns;
+	}
 }
 
 

+ 7 - 6
src/main/java/com/style24/persistence/domain/Goods.java

@@ -50,6 +50,7 @@ public class Goods extends TscBaseDomain {
 	private String supplyCompCd;		//공급업체코드
 	private String supplyGoodsCd;		//공급업체상품코드(원코드)
 	private String ageGrpCd;		//상품연령대(공통코드 G023)
+	private String delvLocCd;		//출고처코드
 	private String delvFeeCd;	//배송비정책코드
 	private int delvFee;		//배송비
 	private int minOrdAmt;		//무료배송비최소구매금액
@@ -146,9 +147,9 @@ public class Goods extends TscBaseDomain {
 
 	private int goodsSq;
 	private String sizeGb;
-	private String colorCd;
-	private String frontGb;
-	private Integer custNo;
+	private String shoplinkerColorCd;		// 샵링커용
+	private String shoplinkerFrontGb;		// 샵링커용
+	private Integer shoplinkerCustNo;		// 샵링커용
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] arrGoodsCd;
@@ -174,10 +175,10 @@ public class Goods extends TscBaseDomain {
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] currStockQty; // wms가용재고
-	
+
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] storeStockQty; // 매장가용재고
-	
+
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] storeMaxQty; // wms, 매장 재고중 최대값
 
@@ -209,5 +210,5 @@ public class Goods extends TscBaseDomain {
 	private int pageNo = 1;
 	private int pageSize = 50;
 	private int pageUnit = 10;
-	
+
 }

+ 7 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -457,6 +457,7 @@
 		              , G.RETURNABLE_YN
 		              , G.NEW_CUST_ORD_YN
 		              , G.GIFT_PACK_YN
+		              , G.DELV_LOC_CD
 		              , G.DELV_FEE_CD
 		              , G.MAIN_COLOR_CD
 		              , DATE_FORMAT(G.FRST_CFRM_DT, '%Y%m%d%H%i%S') AS FRST_CFRM_DT
@@ -945,6 +946,7 @@
 		     , G.SUPPLY_COMP_CD
 		     , G.SUPPLY_GOODS_CD
 		     , G.AGE_GRP_CD
+		     , G.DELV_LOC_CD
 		     , G.DELV_FEE_CD
 		     , D.DELV_FEE
 		     , D.MIN_ORD_AMT
@@ -1126,6 +1128,7 @@
 		      , SUPPLY_COMP_CD
 		      , SUPPLY_GOODS_CD
 		      , AGE_GRP_CD
+		      , DELV_LOC_CD
 		      , DELV_FEE_CD
 		      , PNT_PRATE
 		      , PNT_MRATE
@@ -1187,6 +1190,7 @@
 		     , SUPPLY_COMP_CD      
 		     , SUPPLY_GOODS_CD     
 		     , AGE_GRP_CD          
+		     , DELV_LOC_CD
 		     , DELV_FEE_CD            
 		     , PNT_PRATE           
 		     , PNT_MRATE           
@@ -1617,6 +1621,7 @@
 		  , SUPPLY_COMP_CD
 		  , SUPPLY_GOODS_CD
 		  , AGE_GRP_CD
+		  , DELV_LOC_CD
 		  , DELV_FEE_CD
 		  , PNT_PRATE
 		  , PNT_MRATE
@@ -1662,6 +1667,7 @@
 		  , #{supplyCompCd}
 		  , #{supplyGoodsCd}
 		  , #{ageGrpCd}
+		  , #{delvLocCd}
 		  , #{delvFeeCd}
 		  , #{pntPrate}
 		  , #{pntMrate}
@@ -1721,6 +1727,7 @@
 		  , FOREIGN_BUY_YN = #{foreignBuyYn}
 		  , PARALLEL_IMPORT_YN = #{parallelImportYn}
 		  , ORDER_MADE_YN = #{orderMadeYn}
+		  , DELV_LOC_CD = #{delvLocCd}
 		  , DELV_FEE_CD = #{delvFeeCd}
 		  , PNT_PRATE = #{pntPrate}
 		  , PNT_MRATE = #{pntMrate}

+ 406 - 18
src/main/java/com/style24/persistence/mybatis/shop/TsaOcm.xml

@@ -189,6 +189,10 @@
 		FROM TB_EXTMALL_ORDER_UPLOAD A
 		WHERE A.UPLOAD_STAT = 'G021_00'
 		AND RECIP_BASE_ADDR IS NOT NULL AND RECIP_BASE_ADDR != ''
+		AND A.UPLOAD_GB = #{uploadGb}
+		<if test="regNo != null and regNo != ''">
+	      AND A.REG_NO = #{regNo}
+	    </if>
 		GROUP BY A.VENDOR_ID, A.EXTMALL_ID, A.EXTMALL_ORDER_ID, A.ORD_NM, A.ORD_PHNNO, A.RECIP_NM, A.RECIP_PHNNO, A.RECIP_BASE_ADDR, A.RECIP_DTL_ADDR
 		ORDER BY A.VENDOR_ID, A.EXTMALL_ID, A.EXTMALL_ORDER_ID
 	</select>
@@ -240,6 +244,10 @@
 			LEFT OUTER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
 		WHERE 1=1
 		AND RECIP_BASE_ADDR IS NOT NULL AND RECIP_BASE_ADDR != ''
+		AND A.UPLOAD_GB = #{uploadGb}
+		<if test="regNo != null and regNo != ''">
+	      AND A.REG_NO = #{regNo}
+	    </if>
 		<if test="uploadStat != null and uploadStat != ''">
 	      AND A.UPLOAD_STAT = #{uploadStat}
 	    </if>
@@ -293,9 +301,10 @@
 			, UPLOAD_FAIL_REASON
 			, ORD_NO
 			, DELV_ADDR_SQ
+			, OPT_CD
+			, UPLOAD_GB
 			, REG_NO
 			, REG_DT
-			, OPT_CD
 		)
 		SELECT
 			#{vendorId}
@@ -331,9 +340,10 @@
 			, #{uploadFailReason}
 			, #{ordNo}
 			, #{delvAddrSq}
+			, #{optCd}
+			, #{uploadGb}
 			, #{regNo}
 			, now()
-			, #{optCd}
 		FROM DUAL
 		WHERE NOT EXISTS(
 				SELECT 1 FROM TB_EXTMALL_ORDER_UPLOAD
@@ -341,6 +351,7 @@
 				AND EXTMALL_ID = #{extmallId}
 				AND AGENT_ORDER_ID = #{agentOrderId}
 				AND EXTMALL_ORDER_ID = #{extmallOrderId}
+				AND UPLOAD_GB = #{uploadGb}
 			  )
 	</insert>
 
@@ -359,20 +370,16 @@
 		AND EXTMALL_ID = #{extmallId}
 		AND AGENT_ORDER_ID = #{agentOrderId}
 		AND EXTMALL_ORDER_ID = #{extmallOrderId}
+		AND UPLOAD_STAT != 'G021_30'
 
 	</update>
 
 	<!-- 제휴몰주문등록 - 주문등록 cnt -->
-	<select id="getExtmallOrderCnt" parameterType="Order" resultType="int">
+	<select id="getExtmallOrderCnt" parameterType="Order" resultType="Order">
 	/* TsaOcm.getExtmallOrderCnt */
 		SELECT
-			COUNT(1)
+			*
 		FROM TB_ORDER_DETAIL A
-				LEFT OUTER JOIN TB_EXTMALL_ORDER_UPLOAD B
-					ON A.VENDOR_ID = B.VENDOR_ID
-					AND A.EXTMALL_ID = B.EXTMALL_ID
-					AND A.AGENT_ORDER_ID = B.AGENT_ORDER_ID
-					AND A.EXTMALL_ORDER_ID = B.EXTMALL_ORDER_ID
 		WHERE A.VENDOR_ID = #{vendorId}
 		AND A.EXTMALL_ID = #{extmallId}
 		AND A.AGENT_ORDER_ID = #{agentOrderId}
@@ -413,7 +420,7 @@
 		     , #{email}
 		     , 'G000_10'
 		     , #{npayOrdNo}
-		     , #{frontGb}
+		     , 'P'
 		     , #{custNo}
 		     , NOW()
 		     , #{custNo}
@@ -1204,11 +1211,11 @@
 		     , G.ITEMKIND_CD
 		     , G.FORMAL_GB
 		     , G.LIST_PRICE
-		     , FN_GET_APPLY_CPN1_PRICE(G.GOODS_CD, #{frontGb})  AS CURR_PRICE
+		     , FN_GET_APPLY_CPN1_PRICE(G.GOODS_CD, #{shoplinkerFrontGb})  AS CURR_PRICE
 		     , G.SELF_GOODS_YN
 		     , G.GOODS_STAT
-		     , (CASE WHEN #{frontGb} = 'P' THEN G.PNT_PRATE ELSE G.PNT_MRATE END) AS PNT_RATE
-		     , (CASE WHEN #{frontGb} = 'P' THEN G.PRE_PPNT_USABLE_YN ELSE G.PRE_MPNT_USABLE_YN END) AS PRE_PNT_USABLE_YN
+		     , (CASE WHEN #{shoplinkerFrontGb} = 'P' THEN G.PNT_PRATE ELSE G.PNT_MRATE END) AS PNT_RATE
+		     , (CASE WHEN #{shoplinkerFrontGb} = 'P' THEN G.PRE_PPNT_USABLE_YN ELSE G.PRE_MPNT_USABLE_YN END) AS PRE_PNT_USABLE_YN
 		     , G.MIN_ORD_QTY
 		     , G.MAX_ORD_QTY
 		     , G.DAY_MAX_ORD_QTY
@@ -1223,7 +1230,7 @@
 		        FROM TB_ITEMKIND
 		        WHERE ITEMKIND_CD = G.ITEMKIND_CD) AS NI_CLSF_CD
 		     , G.MAIN_COLOR_CD
-		     , (IFNULL(NULLIF(#{colorCd},'') , G.MAIN_COLOR_CD )) AS COLOR_CD
+		     , (IFNULL(NULLIF(#{shoplinkerColorCd},'') , G.MAIN_COLOR_CD )) AS COLOR_CD
 		     , G.SUPPLY_COMP_CD
 		     , G.SELF_MALL_YN
 		     , G.AGE_GRP_CD
@@ -1239,8 +1246,8 @@
 		     , FN_GET_CODE_NM('G008',G.GOODS_STAT) AS GOODS_STAT_NM
 		     , DATE_FORMAT(G.REG_DT ,'%Y%m%d%H%i%S') AS REG_DT
 		     , DATE_FORMAT(G.UPD_DT ,'%Y%m%d%H%i%S') AS UPD_DT
-		     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(#{colorCd}, IFNULL(G.MAIN_COLOR_CD,'XX')) AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
-		     , (SELECT COLOR_KNM FROM TB_COLOR C WHERE COLOR_CD = IFNULL(NULLIF(#{colorCd},'') , G.MAIN_COLOR_CD ) AND USE_YN  = 'Y') AS COLOR_NM
+		     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(#{shoplinkerColorCd}, IFNULL(G.MAIN_COLOR_CD,'XX')) AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
+		     , (SELECT COLOR_KNM FROM TB_COLOR C WHERE COLOR_CD = IFNULL(NULLIF(#{shoplinkerColorCd},'') , G.MAIN_COLOR_CD ) AND USE_YN  = 'Y') AS COLOR_NM
 		     -- , BP.CURR_PRICE AS BENEFIT_PRICE
 		     , (CASE WHEN W.GOODS_CD IS NULL THEN 'N' ELSE 'Y' END) AS WISH_YN
 		     , (CASE WHEN G.GOODS_TYPE = 'G056_N' THEN (SELECT IFNULL(MAX(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
@@ -1249,7 +1256,7 @@
 		                                                FROM  VW_STOCK
 		                                                WHERE GOODS_CD = G.GOODS_CD
 		                                                AND OPT_CD1 =  (CASE WHEN G.SELF_GOODS_YN = 'N' THEN OPT_CD1
-		                                                                    ELSE  IFNULL(#{colorCd}, IFNULL(G.MAIN_COLOR_CD,'XX')) END)
+		                                                                    ELSE  IFNULL(#{shoplinkerColorCd}, IFNULL(G.MAIN_COLOR_CD,'XX')) END)
 		                                                GROUP BY GOODS_CD )
 		            ELSE (SELECT IFNULL(MAX(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
 		                                      ELSE CURR_STOCK_QTY
@@ -1293,7 +1300,7 @@
 		INNER JOIN TB_DELV_FEE_POLICY E ON G.SUPPLY_COMP_CD = E.SUPPLY_COMP_CD
 		                                     AND G.DELV_FEE_CD =  E.DELV_FEE_CD
 		LEFT OUTER JOIN TB_WISHLIST W ON G.GOODS_CD = W.GOODS_CD
-		                              AND IFNULL(#{custNo}, 0) = W.CUST_NO
+		                              AND IFNULL(#{shoplinkerCustNo}, 0) = W.CUST_NO
 		LEFT OUTER JOIN TB_GOODS_SHOT_DELV_SKIP DS ON G.GOODS_CD =DS.GOODS_CD
 		WHERE G.GOODS_CD = #{goodsCd}
 		AND NOW() BETWEEN SELL_STDT AND SELL_EDDT	/*판매기간 확인*/
@@ -1444,4 +1451,385 @@
 <!--***** 주문정보등록 **************************************************************** -->
 
 
+
+
+
+
+
+	<!--외부몰주문등록 전 임시 테이블 삭제-->
+	<delete id="deleteExtmallOrderUploadTmp" parameterType="Integer">
+		/* TsaOcm.deleteExtmallOrderUploadTmp */
+		DELETE
+		FROM  TB_EXTMALL_ORDER_UPLOAD_TMP
+		WHERE REG_NO = #{regNo}
+	</delete>
+
+	<!--외부몰주문등록 테이블 실패목록 데이터 삭제 -->
+	<delete id="deleteExtmallOrderUploadFail" parameterType="Integer">
+		/* TsaOcm.deleteExtmallOrderUploadFail */
+		DELETE
+		FROM  TB_EXTMALL_ORDER_UPLOAD A
+		WHERE REG_NO = #{regNo}
+		AND UPLOAD_GB = 'E'
+		AND UPLOAD_STAT = 'G021_40'
+		AND EXISTS (
+                      SELECT 1
+                      FROM   TB_EXTMALL_ORDER_UPLOAD_TMP B
+                      WHERE  B.VENDOR_ID = A.VENDOR_ID
+                      AND    B.EXTMALL_ID = A.EXTMALL_ID
+                      AND    B.AGENT_ORDER_ID = A.AGENT_ORDER_ID
+                      AND    B.EXTMALL_ORDER_ID = A.EXTMALL_ORDER_ID
+                    )
+	</delete>
+
+	<!-- 외부몰주문등록 (TB_EXTMALL_ORDER_UPLOAD_TMP) 인픽스-->
+	<insert id="createExtmallOrderUploadTmp" parameterType="ExtmallOrder">
+		/* TsaOcm.createExtmallOrderUploadTmp */
+		INSERT INTO TB_EXTMALL_ORDER_UPLOAD_TMP (
+		      VENDOR_ID
+			, EXTMALL_ID
+			, EXTMALL_NM
+			, AGENT_ORDER_ID
+			, EXTMALL_ORDER_ID
+			, EXTMALL_PROD_ID
+			, EXTMALL_PROD_NM
+			, GOODS_CD
+			, SKU
+			, CURR_PRICE
+			, ORD_QTY
+			, ORD_AMT
+			, CPN_DC_AMT
+			, PNT_DC_AMT
+			, DELV_FEE
+			, ORD_RECV_DT
+			, ORD_DT
+			, ORD_NM
+			, ORD_PHNNO
+			, ORD_TELNO
+			, ORD_EMAIL
+			, RECIP_NM
+			, RECIP_PHNNO
+			, RECIP_TELNO
+			, RECIP_ZIPCODE
+			, RECIP_BASE_ADDR
+			, RECIP_DTL_ADDR
+			, DELV_MEMO
+			, UPLOAD_STAT
+			, UPLOAD_FAIL_CD
+			, UPLOAD_FAIL_REASON
+			, ORD_NO
+			, DELV_ADDR_SQ
+			, OPT_CD
+			, UPLOAD_GB
+			, REG_NO
+			, REG_DT
+		)
+		VALUES (
+		     #{vendorId}
+			, #{extmallId}
+			, '-'
+			, #{agentOrderId}
+			, #{extmallOrderId}
+			, #{extmallProdId}
+			, #{extmallProdNm}
+			, #{goodsCd}
+			, #{sku}
+			, IFNULL(#{currPrice}, 0)
+			, IFNULL(#{ordQty}, 0)
+			, IFNULL(#{ordAmt}, 0)
+			, IFNULL(#{cpnDcAmt}, 0)
+			, IFNULL(#{pntDcAmt}, 0)
+			, IFNULL(#{delvFee}, 0)
+			, now()
+			, now()
+			, IFNULL(#{ordNm}, #{recipNm})
+			, IFNULL(#{ordPhnno}, #{recipPhnno})
+			, IFNULL(#{ordTelno}, #{recipTelno})
+			, #{ordEmail}
+			, #{recipNm}
+			, #{recipPhnno}
+			, #{recipTelno}
+			, replace(#{recipZipcode}, '-', '')
+			, #{recipBaseAddr}
+			, #{recipDtlAddr}
+			, #{delvMemo}
+			, #{uploadStat}
+			, #{uploadFailCd}
+			, #{uploadFailReason}
+			, #{ordNo}
+			, #{delvAddrSq}
+			, replace(replace(#{optCd}, '[', ''), ']', '')
+			, #{uploadGb}
+			, #{regNo}
+			, now()
+		)
+	</insert>
+
+	<!-- 외부몰주문등록 업로드 후 목록 -->
+	<select id="getExtmallOrderUploadTmpList" parameterType="ExtmallOrder" resultType="ExtmallOrder">
+	/* TsaOcm.getExtmallOrderUploadTmpList */
+		SELECT T.VENDOR_ID
+			, T.EXTMALL_ID
+			, IFNULL(A.EXTMALL_NM, '(미매핑)') as EXTMALL_NM
+			, T.AGENT_ORDER_ID
+			, T.EXTMALL_ORDER_ID
+			, T.EXTMALL_PROD_ID
+			, T.EXTMALL_PROD_NM
+			, CASE
+				WHEN A.EXTMALL_NM IS NULL OR B.GOODS_CD IS NULL OR B.OPT_CD IS NULL THEN 'Y'
+				ELSE 'N'
+			  END WARNING_YN
+			, CASE
+				WHEN B.GOODS_CD IS NULL THEN CONCAT(T.GOODS_CD , '(미매핑)')
+				ELSE T.GOODS_CD
+			  END AS GOODS_CD
+			, CASE
+				WHEN B.OPT_CD IS NULL THEN CONCAT(T.OPT_CD , '(미매핑)')
+				ELSE T.OPT_CD
+			  END AS OPT_CD
+			, T.SKU
+			, T.CURR_PRICE
+			, T.ORD_QTY
+			, T.ORD_AMT
+			, T.CPN_DC_AMT
+			, T.PNT_DC_AMT
+			, T.DELV_FEE
+			, T.ORD_RECV_DT
+			, T.ORD_DT
+			, T.ORD_NM
+			, T.ORD_PHNNO
+			, T.ORD_TELNO
+			, T.ORD_EMAIL
+			, T.RECIP_NM
+			, T.RECIP_PHNNO
+			, T.RECIP_TELNO
+			, T.RECIP_ZIPCODE
+			, T.RECIP_BASE_ADDR
+			, T.RECIP_DTL_ADDR
+			, T.DELV_MEMO
+			, T.UPLOAD_STAT
+			, T.UPLOAD_FAIL_CD
+			, T.UPLOAD_FAIL_REASON
+			, T.ORD_NO
+			, T.DELV_ADDR_SQ
+			, T.UPLOAD_GB
+			, T.REG_NO
+			, T.REG_DT
+		FROM  TB_EXTMALL_ORDER_UPLOAD_TMP T
+				LEFT OUTER JOIN TB_EXTMALL A ON T.VENDOR_ID = A.VENDOR_ID AND T.EXTMALL_ID = A.EXTMALL_ID AND A.USE_YN = 'Y'
+				LEFT OUTER JOIN TB_OPTION B ON T.GOODS_CD = B.GOODS_CD AND T.OPT_CD = B.OPT_CD
+		WHERE 1=1
+		AND   T.REG_NO = #{regNo}
+
+	</select>
+
+	<select id="getVendorId" parameterType="String" resultType="String">
+		/* TsaOcm.getVendorId */
+		SELECT VENDOR_ID
+		FROM   TB_EXTMALL_ORDER_UPLOAD_TMP
+		WHERE  1=1
+		AND    REG_ID = #{regId}
+		AND    ROWNUM = 1
+	</select>
+
+	<!-- 외부몰 주문업로드 생성 -->
+	<insert id="createExtmallOrderUploadSecond" parameterType="ExtmallOrder" timeout="100">
+		/* TsaOcm.createExtmallOrderUploadSecond */
+		INSERT INTO TB_EXTMALL_ORDER_UPLOAD (
+		       VENDOR_ID
+				, EXTMALL_ID
+				, EXTMALL_NM
+				, AGENT_ORDER_ID
+				, EXTMALL_ORDER_ID
+				, EXTMALL_PROD_ID
+				, EXTMALL_PROD_NM
+				, GOODS_CD
+				, SKU
+				, CURR_PRICE
+				, ORD_QTY
+				, ORD_AMT
+				, CPN_DC_AMT
+				, PNT_DC_AMT
+				, DELV_FEE
+				, ORD_RECV_DT
+				, ORD_DT
+				, ORD_NM
+				, ORD_PHNNO
+				, ORD_TELNO
+				, ORD_EMAIL
+				, RECIP_NM
+				, RECIP_PHNNO
+				, RECIP_TELNO
+				, RECIP_ZIPCODE
+				, RECIP_BASE_ADDR
+				, RECIP_DTL_ADDR
+				, DELV_MEMO
+				, UPLOAD_STAT
+				, UPLOAD_FAIL_CD
+				, UPLOAD_FAIL_REASON
+				, ORD_NO
+				, DELV_ADDR_SQ
+				, OPT_CD
+				, UPLOAD_GB
+				, REG_NO
+				, REG_DT
+		)
+		SELECT
+			   VENDOR_ID
+				, EXTMALL_ID
+				, EXTMALL_NM
+				, AGENT_ORDER_ID
+				, EXTMALL_ORDER_ID
+				, EXTMALL_PROD_ID
+				, EXTMALL_PROD_NM
+				, GOODS_CD
+				, SKU
+				, CURR_PRICE
+				, ORD_QTY
+				, ORD_AMT
+				, CPN_DC_AMT
+				, PNT_DC_AMT
+				, DELV_FEE
+				, ORD_RECV_DT
+				, ORD_DT
+				, ORD_NM
+				, ORD_PHNNO
+				, ORD_TELNO
+				, ORD_EMAIL
+				, RECIP_NM
+				, RECIP_PHNNO
+				, RECIP_TELNO
+				, RECIP_ZIPCODE
+				, RECIP_BASE_ADDR
+				, RECIP_DTL_ADDR
+				, DELV_MEMO
+				, UPLOAD_STAT
+				, UPLOAD_FAIL_CD
+				, UPLOAD_FAIL_REASON
+				, ORD_NO
+				, DELV_ADDR_SQ
+				, OPT_CD
+				, UPLOAD_GB
+				, REG_NO
+				, REG_DT
+		 FROM   TB_EXTMALL_ORDER_UPLOAD_TMP A
+		 WHERE A.REG_NO = #{regNo}
+		 /*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>
+
+	<!-- 외부몰주문등록 업로드 후 목록 -->
+	<select id="getExtmallOrderUploadSecondList" parameterType="ExtmallOrder" resultType="ExtmallOrder">
+	/* TsaOcm.getExtmallOrderUploadSecondList */
+		SELECT A.*
+		FROM
+		(
+			SELECT
+					ROW_NUMBER() OVER(PARTITION BY A.VENDOR_ID, A.EXTMALL_ID, A.AGENT_ORDER_ID, A.EXTMALL_ORDER_ID ORDER BY A.REG_DT DESC) AS RANKING
+					, A.VENDOR_ID
+					, A.EXTMALL_ID
+					, A.EXTMALL_NM
+					, A.AGENT_ORDER_ID
+					, A.EXTMALL_ORDER_ID
+					, A.EXTMALL_PROD_ID
+					, A.EXTMALL_PROD_NM
+					, A.GOODS_CD
+					, A.SKU
+					, A.CURR_PRICE
+					, A.ORD_QTY
+					, A.ORD_AMT
+					, A.CPN_DC_AMT
+					, A.PNT_DC_AMT
+					, A.DELV_FEE
+					, A.ORD_RECV_DT
+					, A.ORD_DT
+					, A.ORD_NM
+					, A.ORD_PHNNO
+					, A.ORD_TELNO
+					, A.ORD_EMAIL
+					, A.RECIP_NM
+					, A.RECIP_PHNNO
+					, A.RECIP_TELNO
+					, A.RECIP_ZIPCODE
+					, A.RECIP_BASE_ADDR
+					, A.RECIP_DTL_ADDR
+					, A.DELV_MEMO
+					, A.UPLOAD_STAT
+					, FN_GET_CODE_NM('G021', A.UPLOAD_STAT) AS UPLOAD_STAT_NM
+					, A.UPLOAD_FAIL_CD
+					, FN_GET_CODE_NM('G022', A.UPLOAD_FAIL_CD) AS UPLOAD_FAIL_NM
+					, A.UPLOAD_FAIL_REASON
+					, A.ORD_NO
+					, A.DELV_ADDR_SQ
+					, A.OPT_CD
+					, A.UPLOAD_GB
+					, A.REG_NO
+					, A.REG_DT
+			FROM   TB_EXTMALL_ORDER_UPLOAD A
+			     , TB_EXTMALL_ORDER_UPLOAD_TMP B
+			WHERE  A.VENDOR_ID = B.VENDOR_ID
+			AND    A.EXTMALL_ID = B.EXTMALL_ID
+			AND    A.AGENT_ORDER_ID = B.AGENT_ORDER_ID
+			AND    A.EXTMALL_ORDER_ID = B.EXTMALL_ORDER_ID
+			AND    A.UPLOAD_GB = 'E'
+			AND    B.REG_NO = #{regNo}
+		) A WHERE A.RANKING = 1
+	</select>
+
+
+	<!-- 외부몰주문등록 업로드 후 결과 수량 -->
+	<select id="getExtmallOrderUploadResultInfo" parameterType="ExtmallOrder" resultType="ExtmallOrder">
+		SELECT
+			 COUNT(IF(UPLOAD_STAT ='G021_40', 1, NULL)) AS FAIL_CNT
+			, COUNT(IF(UPLOAD_STAT = 'G021_30', 1, NULL)) AS SUCC_CNT
+		FROM
+		(
+			SELECT
+				ROW_NUMBER() OVER(PARTITION BY A.VENDOR_ID, A.EXTMALL_ID, A.AGENT_ORDER_ID, A.EXTMALL_ORDER_ID ORDER BY A.REG_DT DESC) AS RANKING
+				, A.VENDOR_ID
+				, A.EXTMALL_ID
+				, A.EXTMALL_NM
+				, A.AGENT_ORDER_ID
+				, A.EXTMALL_ORDER_ID
+				, A.UPLOAD_STAT
+				, A.UPLOAD_FAIL_CD
+			FROM   TB_EXTMALL_ORDER_UPLOAD A
+			     , TB_EXTMALL_ORDER_UPLOAD_TMP B
+			WHERE  A.VENDOR_ID = B.VENDOR_ID
+			AND    A.EXTMALL_ID = B.EXTMALL_ID
+			AND    A.AGENT_ORDER_ID = B.AGENT_ORDER_ID
+			AND    A.EXTMALL_ORDER_ID = B.EXTMALL_ORDER_ID
+			AND    A.UPLOAD_GB = 'E'
+			AND    B.REG_NO = #{regNo}
+		) A  WHERE A.RANKING = 1
+	</select>
+
+	<!-- 외부몰주문업로드 선처리 -->
+	<update id="updateExtmallOrderUploadPrehandle" parameterType="ExtmallOrder">
+		/* TsaOcm.updateExtmallOrderUploadPrehandle */
+		UPDATE TB_EXTMALL_ORDER_UPLOAD
+		SET    UPLOAD_STAT = '20' --유효성검증
+		WHERE  VENDOR_ID = #{vendorId}
+		AND    REG_NO = #{regNo}
+		AND    UPLOAD_GB = 'E'
+		<choose>
+		    <when test="agentOrderId != null and agentOrderId != '' and extmallOrderId != null and extmallOrderId != ''"> <!-- 주문수집 출고 수작업 처리 시 -->
+		AND    AGENT_ORDER_ID = #{agentOrderId}
+		AND    EXTMALL_ORDER_ID = #{extmallOrderId}
+		AND    UPLOAD_STAT = '40' --실패
+		    </when>
+		    <otherwise>
+		AND    UPLOAD_STAT = '00' --대기
+		    </otherwise>
+		</choose>
+	</update>
+
 </mapper>

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

@@ -344,7 +344,7 @@
 	</select>
 
 	<!-- 기획전 복사 -->
-	<insert id="createPlanCopy" parameterType="Plan">
+	<insert id="createPlanCopy" parameterType="Plan" useGeneratedKeys="true" keyProperty="planSq">
 		/* TsaPlan.createPlanCopy */
 		<selectKey keyProperty="planSq" resultType="Integer" order="AFTER">
 			SELECT LAST_INSERT_ID()	/* 기획전 일련번호  */

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

@@ -180,7 +180,7 @@
 			  	ELSE 'N'
 			  END KIDS_YN
 		FROM TB_GOODS A
-			LEFT OUTER JOIN TEMP_ITEMKIND B ON A.ITEMKIND_CD = B.ITEMKIND_CD
+			LEFT OUTER JOIN TB_ITEMKIND B ON A.ITEMKIND_CD = B.ITEMKIND_CD
  			LEFT OUTER JOIN SHOPLINKER_CATE C ON B.ITEMKIND_CD = C.ITEMKIND_CD AND A.BRAND_CD = C.BRAND_CD
 		WHERE A.GOODS_CD = #{goodsCd}
 		AND A.SELF_GOODS_YN = 'Y'
@@ -520,6 +520,7 @@
 					AND A.MALL_ORDER_ID = B.EXTMALL_ORDER_ID
 			WHERE A.SKU_MATCH_CODE IS NOT NULL
 			AND A.SKU_MATCH_CODE != ''
+			AND B.UPLOAD_GB = 'S'
 		) A
 		WHERE 1=1
 		<include refid="getSlkOrderListCondition_sql"/>
@@ -548,6 +549,7 @@
 					AND A.MALL_ORDER_ID = B.EXTMALL_ORDER_ID
 			WHERE A.SKU_MATCH_CODE IS NOT NULL
 			AND A.SKU_MATCH_CODE != ''
+			AND B.UPLOAD_GB = 'S'
 		) A
 		WHERE 1=1
 		<include refid="getSlkOrderListCondition_sql"/>
@@ -634,6 +636,7 @@
 			, FN_GET_CODE_NM('G003', A.VENDOR_ID) AS VENDOR_NM
 		FROM TB_EXTMALL_ORDER_UPLOAD A
 		WHERE AGENT_ORDER_ID = #{agentOrderId}
+		AND A.UPLOAD_GB = 'S'
 
 	</select>
 

+ 2 - 2
src/main/webapp/WEB-INF/views/display/MainContentsPopupForm.html

@@ -1279,8 +1279,8 @@
 	var fnAddLinkPopRow = function (param){
 		var val = typeof param=='object'?'#':param;
 		var html = '<tr name="linkPopRow">';
-		html += '<th>링크 (없으면 #)</th>';
-		html += '<td><input name="link" type="text" maxlength="200" required="required" data-valid-name="링크" value="'+val+'"/></td>';
+		html += '<th>링크 (없으면 #)<br>(메인은 /)</th>';
+		html += '<td><input name="link" type="text" maxlength="200" required="required" data-valid-name="링크" placeholder="외부 URL 입력시 https:// 붙여주세요. ex)https://www.levis-kids.co.kr" value="'+val+'"/></td>';
 		if(contentsLoc!='SMM001' && contentsLoc!='SOM001' && contentsLoc!='SCM001' && contentsLoc!='SBM004'){
 			html += '<td class="aL"><button type="button" class="btn icn" onclick="fnDeleteTrRow(this);"><i class="fa fa-times" aria-hidden="true"></i></button></td>';
 		}

+ 8 - 8
src/main/webapp/WEB-INF/views/display/MainGnbContentsPopupForm.html

@@ -152,8 +152,8 @@
 			html += '		<td><input name="title" type="text" maxlength="200" data-valid-name="타이틀" value=""/></td>';
 			html += '	</tr>';
 			html += '	<tr name="tabLinkRow">';
-			html += '		<th>링크 (없으면 #)</th>';
-			html += '		<td><input name="link" type="text" maxlength="200" data-valid-name="링크" value=""/></td>';
+			html += '		<th>링크 (없으면 #)<br>(메인은 /)</th>';
+			html += '		<td><input name="link" type="text" maxlength="200" placeholder="외부 URL 입력시 https:// 붙여주세요. ex)https://www.levis-kids.co.kr" data-valid-name="링크" value=""/></td>';
 			html += '	</tr>';
 		}else{
 			html += '	<tr name="tabCateRow" style="display:none;">';
@@ -172,8 +172,8 @@
 			html += '		<td><input name="title" type="text" maxlength="200" data-valid-name="타이틀" value=""/></td>';
 			html += '	</tr>';
 			html += '	<tr name="tabLinkRow" style="display:none;">';
-			html += '		<th>링크 (없으면 #)</th>';
-			html += '		<td><input name="link" type="text" maxlength="200" data-valid-name="링크" value=""/></td>';
+			html += '		<th>링크 (없으면 #)<br>(메인은 /)</th>';
+			html += '		<td><input name="link" type="text" maxlength="200" placeholder="외부 URL 입력시 https:// 붙여주세요. ex)https://www.levis-kids.co.kr" data-valid-name="링크" value=""/></td>';
 			html += '	</tr>';
 		}
 		html += '	</tbody>';
@@ -743,8 +743,8 @@
 				html += '		<td><input name="title" type="text" maxlength="200" data-valid-name="타이틀" value="'+result[i].gtabNm+'"/></td>';
 				html += '	</tr>';
 				html += '	<tr name="tabLinkRow">';
-				html += '		<th>링크 (없으면 #)</th>';
-				html += '		<td><input name="link" type="text" maxlength="200" data-valid-name="링크" value="'+result[i].linkUrl+'"/></td>';
+				html += '		<th>링크 (없으면 #)<br>(메인은 /)</th>';
+				html += '		<td><input name="link" type="text" maxlength="200" placeholder="외부 URL 입력시 https:// 붙여주세요. ex)https://www.levis-kids.co.kr" data-valid-name="링크" value="'+result[i].linkUrl+'"/></td>';
 				html += '	</tr>';
 			}else{
 				if(result[i].contentsType=='C'){
@@ -769,8 +769,8 @@
 					html += '		<td><input name="title" type="text" maxlength="200" data-valid-name="타이틀" value="'+result[i].gtabNm+'"/></td>';
 					html += '	</tr>';
 					html += '	<tr name="tabLinkRow">';
-					html += '		<th>링크 (없으면 #)</th>';
-					html += '		<td><input name="link" type="text" maxlength="200" data-valid-name="링크" value="'+result[i].linkUrl+'"/></td>';
+					html += '		<th>링크 (없으면 #)<br>(메인은 /)</th>';
+					html += '		<td><input name="link" type="text" maxlength="200" placeholder="외부 URL 입력시 https:// 붙여주세요. ex)https://www.levis-kids.co.kr" data-valid-name="링크" value="'+result[i].linkUrl+'"/></td>';
 					html += '	</tr>';
 				}
 			}

+ 3 - 0
src/main/webapp/WEB-INF/views/goods/GoodsDealForm.html

@@ -154,6 +154,8 @@
 			valueParser: function (params) { return gagaAgGrid.lookupKey(goodsStatList, params.newValue); }
 		},
 		{headerName: "수량", field: "qty" , width: 80, cellClass: 'text-right',hide:true}
+		,
+		{headerName: "출고처", field: "delvLocCd" , width: 80, cellClass: 'text-right',hide:true}
 	];
 
 	// Get GridOptions
@@ -278,6 +280,7 @@
 						, currPrice : goods.currPrice
 						, selfGoodsYn : goods.selfGoodsYn
 						, sysImgNm : goods.sysImgNm
+						, delvLocCd : goods.delvLocCd
 						};
 				//그리드 마지막에 추가해야함
 				gridGoodsDealOptions.api.updateRowData({add: [data], addIndex: idx});

+ 36 - 4
src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html

@@ -275,9 +275,11 @@
 											<button type="button" class="btn btn-success btn-lg" id="btnGoodsItemkindChange">품목변경</button>
 											</th:block>
 										</td>
-										<th>원가</th>
-										<td><input type="text" class="w80p aR" id="costPrice" name="costPrice" maxlength="10" data-valid-type="numeric"/> 원
-											<input type="hidden" id="costPriceOrg" name="costPriceOrg"/>
+										<th>출고처<em class="required" title="필수"></em></th>
+										<td>
+											<select name="delvLocCd"  id="delvLocCd">
+											</select>
+											<input type="hidden" id="delvLocCdOrg" name="delvLocCdOrg"/>
 										</td>
 									</tr>
 									<tr>
@@ -388,6 +390,10 @@
 											</select>
 											<input name="sellEddt" id="sellEddt" type="hidden" />
 										</td>
+										<th>원가</th>
+										<td><input type="text" class="w80p aR" id="costPrice" name="costPrice" maxlength="10" data-valid-type="numeric"/> 원
+											<input type="hidden" id="costPriceOrg" name="costPriceOrg"/>
+										</td>
 									</tr>
 									</tbody>
 								</table>
@@ -1073,6 +1079,8 @@
 			
 			cfnCreateCombo('/renderer/delvFee/list/' + result.supplyCompCd, $('#goodsDetailForm select[name=delvFeeCd]'), "[선택]", result.delvFeeCd);
 			$('#goodsDetailForm input[name=delvFeeCdOrg]').val(result.delvFeeCd);
+			cfnCreateCombo('/renderer/delvloc/list/' + result.supplyCompCd, $('#goodsDetailForm select[name=delvLocCd]'), "[선택]", result.delvLocCd);
+			$('#goodsDetailForm input[name=delvLocdOrg]').val(result.delvLocCd);
 			
 		//	$('#goodsDetailForm input[name=certNum]').val(result.certNum);
 		//	$('#goodsDetailForm input[name=certNumOrg]').val(result.certNum);
@@ -1526,6 +1534,14 @@
 				});
 			}
 			
+			// 상품상세 - 입점
+			if ("N" == $("#goodsDetailForm input[name=selfGoodsYn]").val() && $("#goodsDetailForm input[name=goodsType]").val() == "G056_N"){ 
+				if (gagajf.isNull($("#goodsDetailForm textarea[name=goodsDesc]").val()) || "<p><br></p>" == $("#goodsDetailForm textarea[name=goodsDesc]").val() ){
+					mcxDialog.alert("상품상세정보탭의 상품상세내용을 입력해주세요.");
+					return false;
+				}
+			}
+			
 			// 자사일 경우 대표색상 선택 여부
 			if ("Y" == $('#goodsDetailForm input[name=selfGoodsYn]').val()){
 				
@@ -1661,6 +1677,17 @@
 			return false;
 		}
 		
+		// 출고처
+		if(gagajf.isNull($("#goodsDetailForm select[name=delvLocCd]").val())){
+			mcxDialog.alertC("출고처를 선택해 주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsDetailForm select[name=delvLocCd]").focus();
+				}
+			});
+			return;
+		}
+		
 		// 배송비구분
 		if(gagajf.isNull($("#goodsDetailForm select[name=delvFeeCd]").val())){
 			mcxDialog.alertC("배송비정책을 선택해 주세요.", {
@@ -1671,6 +1698,7 @@
 			});
 			return;
 		}
+		
 		// 포인트
 		if ( gagajf.isNull($("#goodsDetailForm input[name=pntPrate]").val())) {
 			mcxDialog.alertC("PC 포인트를 입력해 주세요.", {
@@ -1804,7 +1832,7 @@
 			});	
 			return false;
 		}
-
+		
 		idx = 0;
 
 		//재고 옵션 관련 확인
@@ -2271,6 +2299,10 @@
 		if ($("#goodsDetailForm input[name=delvFeeCdOrg]").val() != $("#goodsDetailForm select[name=delvFeeCd]").val()){
 			return true;
 		}
+		// 출고처
+		if ($("#goodsDetailForm input[name=delvLocCdOrg]").val() != $("#goodsDetailForm select[name=delvLocCd]").val()){
+			return true;
+		}
 		// 교환가능여부
 		if ($("#goodsDetailForm input[name=changeableYnOrg]").val() != $("#goodsDetailForm input[name=changeableYn]:checked").val()){
 			return true;

+ 3 - 0
src/main/webapp/WEB-INF/views/goods/GoodsSetForm.html

@@ -156,6 +156,8 @@
 			valueParser: function (params) { return gagaAgGrid.lookupKey(goodsStatList, params.newValue); }
 		},
 		{headerName: "업체", field: "supplyCompCd" , width: 80, cellClass: 'text-right',hide: true}
+		,
+		{headerName: "출고처", field: "delvLocCd" , width: 80, cellClass: 'text-right',hide:true}
 		
 	];
 
@@ -282,6 +284,7 @@
 						, selfGoodsYn : goods.selfGoodsYn
 						, supplyCompCd : goods.supplyCompCd
 						, sysImgNm : goods.sysImgNm
+						, delvLocCd : goods.delvLocCd
 						};
 				setGoodsCurrPrice += Number(goods.currPrice);
 				//그리드 마지막에 추가해야함

+ 61 - 72
src/main/webapp/WEB-INF/views/ocm/ExtmallOrderRegisterForm.html

@@ -25,14 +25,14 @@
 		</div>
 		<!-- //메뉴 설명 -->
 
-
-		<form id="searchForm" name="searchForm" action="#" th:action="@{'/shoplinker/order/collection/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+		<!-- <form id="searchForm" name="searchForm" action="#" th:action="@{'/shoplinker/order/collection/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;"> -->
+		<form id="extmallOrderForm" name="extmallOrderForm" >
 			<!-- 검색조건 영역 -->
 			<div class="panelStyle">
 				<ul class="lrStyle">
 					<li>
 						<p class="dot">주문등록샘플 엑셀파일을 다운로드 할 경우 <font color="red">[샘플다운로드]</font> 버튼을 클릭한다.</p>
-						<p class="dot"><font color="red">[엑셀업로드]</font> 버튼을 눌러 데이터를 업로드 한다. 업로드 된 데이터가 목록에 나타난다.</p>
+						<p class="dot"><font color="red">[엑셀업로드]</font> 버튼을 눌러 데이터를 업로드 한다. 업로드 된 데이터가 목록에 나타난다.(※ 미매핑이 표시될경우 주문등록이 실패처리된다.)</p>
 						<p class="dot"><font color="red">[주문등록]</font> 버튼을 눌러 주문등록을 완료한다.</p>
 						<p class="dot"><font color="red">주문등록 처리는 몇 분이 소요되기도 하며</font> 결과는 <font color="red">[결과확인]</font> 버튼을 눌러 확인할 수 있다.</p>
 					</li>
@@ -40,7 +40,7 @@
 
 				<ul class="panelBar padT20">
 					<li class="center">
-						<input type="button" class="btn btn-default btn-lg" id="btnExcelDown" onclick="cfnDownloadSampleFile('SF003');" value="외부몰 주문등록양식 다운로드" />
+						<input type="button" class="btn btn-default btn-lg" id="btnExcelDown" onclick="cfnDownloadSampleFile('SF003');" value="제휴몰 주문등록양식 다운로드" />
 						<input type="button" class="btn btn-primary btn-lg" id="btnExcelUpload" value="엑셀업로드"/>
 						<input type="button" class="btn btn-success btn-lg" id="btnSaveExtmallOrderUpload" value="주문등록"/>
 						<input type="button" class="btn btn-danger btn-lg" id="btnSearchExtmallOrderUpload" value="결과확인"/>
@@ -60,98 +60,87 @@
 
 	</div>
 
-<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=20210114"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
-	var sessRoleCd 		= [[${sessionInfo.roleCd}]];
-
-	var statusValue = {"Y":"판매중", "N":"판매중지"};
-	var apiGbValue = {"10":"상품등록", "11":"상품수정"};
-	var procGbValue = {"1":"전송완료", "0":"전송실패"};
-
-	let vendorList = gagajf.convertToArray([[${vendorList}]]);
-	let extmallList = gagajf.convertToArray([[${extmallList}]]);
-	let uploadStatList = gagajf.convertToArray([[${uploadStatList}]]);
-	let uploadFailList = gagajf.convertToArray([[${uploadFailList}]]);
-
 	var columnDefs = [
-		{headerName: "업로드상태",			field: "uploadStat",			width: 150, cellClass: 'text-center'},
-		{headerName: "업로드실패사유",		field: "uploadFailCd",			width: 150, cellClass: 'text-center'},
+		{headerName: "업로드상태",			field: "uploadStatNm",			width: 150, cellClass: 'text-center'},
+		{headerName: "업로드실패사유",		field: "uploadFailNm",			width: 150, cellClass: 'text-center'},
 		{headerName: "업로드실패사유상세",	field: "uploadFailReason",		width: 200, cellClass: 'text-center'},
-		{headerName: "샵링커주문번호",		field: "agentOrderId", 			width: 150, cellClass: 'text-center'},
+		{headerName: "제휴몰ID",			field: "extmallId",				width: 130, cellClass: 'text-center'},
+		{headerName: "제휴몰명",			field: "extmallNm",				width: 130, cellClass: 'text-center'},
 		{headerName: "쇼핑몰주문번호",		field: "extmallOrderId",		width: 150, cellClass: 'text-center'},
-		{headerName: "쇼핑몰주문일련번호",	field: "extmallOrderDtlId",		width: 150, cellClass: 'text-center'},
-		{headerName: "수집일시",			field: "regDt",					width: 150, cellClass: 'text-center'},
-		{headerName: "주문일시",			field: "ordDt",					width: 150, cellClass: 'text-center'},
-		{headerName: "결제일시",			field: "payDt",					width: 150, cellClass: 'text-center'},
-		{headerName: "외부몰벤더ID",		field: "vendorId",				width: 100, cellClass: 'text-center'},
-		{headerName: "외부몰ID",			field: "extmallId",				width: 100, cellClass: 'text-center'},
-		{headerName: "외부몰사용자ID",		field: "extmallUserId",			width: 100, cellClass: 'text-center'},
-		{headerName: "외부몰명",			field: "extmallNm",				width: 130, cellClass: 'text-center'},
+		{headerName: "샵링커주문번호",		field: "agentOrderId", 			width: 150, cellClass: 'text-center'},
+		{headerName: "제휴상품코드",		field: "extmallProdId",			width: 150, cellClass: 'text-center'},
 		{headerName: "상품코드",			field: "goodsCd",				width: 150, cellClass: 'text-center'},
-		{headerName: "사이즈코드",			field: "sizeCd",				width: 150, cellClass: 'text-center'},
+		{headerName: "상품명",			field: "sku",					width: 150, cellClass: 'text-center'},
+		{headerName: "옵션코드",			field: "optCd",					width: 150, cellClass: 'text-center'},
+		{headerName: "판매금액",			field: "currPrice",				width: 100, cellClass: 'text-center'},
+		{headerName: "할인금액",			field: "cpnDcAmt",				width: 100, cellClass: 'text-center'},
 		{headerName: "주문수량",			field: "ordQty",				width: 100, cellClass: 'text-center'},
-		{headerName: "판매금액",			field: "ordAmt",				width: 100, cellClass: 'text-center'},
-		{headerName: "실판매금액",			field: "realOrdAmt",			width: 100, cellClass: 'text-center'},
-		{headerName: "배송비",			field: "delvFee",				width: 200, cellClass: 'text-center'},
-		{headerName: "주문자명",			field: "orderNm",				width: 200, cellClass: 'text-center'},
-		{headerName: "주문자핸드폰번호",		field: "orderPhnno",			width: 200, cellClass: 'text-center'},
-		{headerName: "주문자전화번호",		field: "orderTelno",			width: 200, cellClass: 'text-center'},
-		{headerName: "주문자이메일",		field: "orderEmail",			width: 200, cellClass: 'text-center'},
-		{headerName: "수령자명",			field: "recipNm",				width: 200, cellClass: 'text-center'},
-		{headerName: "수령자핸드폰번호",		field: "recipPhnno",			width: 200, cellClass: 'text-center'},
-		{headerName: "수령자전화번호",		field: "recipTelno",			width: 200, cellClass: 'text-center'},
-		{headerName: "수령자이메일",		field: "recipEmail",			width: 200, cellClass: 'text-center'},
-		{headerName: "수령자우편번호",		field: "recipPostNo",			width: 200, cellClass: 'text-center'},
+		{headerName: "주문금액",			field: "ordAmt",				width: 200, cellClass: 'text-center'},
+		{headerName: "배송비",			field: "delvFee",				width: 100, cellClass: 'text-center'},
+		{headerName: "주문자",			field: "ordNm",					width: 100, cellClass: 'text-center'},
+		{headerName: "주문자전화번호",		field: "ordTelno",				width: 130, cellClass: 'text-center'},
+		{headerName: "주문자핸드폰번호",		field: "ordPhnno",				width: 130, cellClass: 'text-center'},
+		{headerName: "주문자이메일",		field: "ordEmail",				width: 130, cellClass: 'text-center'},
+		{headerName: "수령자",			field: "recipNm",				width: 100, cellClass: 'text-center'},
+		{headerName: "수령자전화번호",		field: "recipTelno",			width: 130, cellClass: 'text-center'},
+		{headerName: "수령자핸드폰번호",		field: "recipPhnno",			width: 130, cellClass: 'text-center'},
+		{headerName: "수령자우편번호",		field: "recipZipcode",			width: 130, cellClass: 'text-center'},
 		{headerName: "수령자기본주소",		field: "recipBaseAddr",			width: 300, cellClass: 'text-center'},
 		{headerName: "수령자상세주소",		field: "recipDtlAddr",			width: 200, cellClass: 'text-center'},
 		{headerName: "배송메모",			field: "delvMemo",				width: 200, cellClass: 'text-center'},
-		{headerName: "주문번호",			field: "ordNo",					width: 200, cellClass: 'text-center'}
+		{headerName: "주문번호",			field: "ordNo",					width: 130, cellClass: 'text-center'}
+		// {headerName: "수집일시",		field: "regDt",					width: 150, cellClass: 'text-center'},
+		// {headerName: "주문일시",		field: "ordDt",					width: 150, cellClass: 'text-center'},
+		// {headerName: "결제일시",		field: "payDt",					width: 150, cellClass: 'text-center'},
 	];
 
 
 	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
 
-	// Cell click
-	gridOptions.onCellClicked = function(event) {
-		if (event.colDef.field != 'extmallId')
-			return;
-
-		$('#detailForm select[name=vendorId]').val(event.data.vendorId);
-		$('#detailForm input[name=extmallId]').val(event.data.extmallId);
-		$('#detailForm input[name=extmallUserId]').val(event.data.extmallUserId);
-		$('#detailForm input[name=extmallNm]').val(event.data.extmallNm);
-		$('#detailForm select[name=supplyCompCd]').val(event.data.supplyCompCd);
-		$('#detailForm input[name=sellStoreCd]').val(event.data.sellStoreCd);
-		$('#detailForm input[name=stockSellRate]').val(event.data.stockSellRate);
-		$('#detailForm input[name=priceAcceptRate]').val(event.data.priceAcceptRate);
-
-		if (event.data.dwdpYn == 'Y') {
-			$('#detailForm input:radio[name=dwdpYn]').eq(0).trigger('click');
-		} else {
-			$('#detailForm input:radio[name=dwdpYn]').eq(1).trigger('click');
-		}
-
-		if (event.data.cnclsmsSendYn == 'Y') {
-			$('#detailForm input:radio[name=cnclsmsSendYn]').eq(0).trigger('click');
-		} else {
-			$('#detailForm input:radio[name=cnclsmsSendYn]').eq(1).trigger('click');
-		}
-
-		if (event.data.useYn == 'Y') {
-			$('#detailForm input:radio[name=useYn]').eq(0).trigger('click');
-		} else {
-			$('#detailForm input:radio[name=useYn]').eq(1).trigger('click');
+	gridOptions.getRowStyle = function(params) {
+		if ("Y" == params.data.warningYn) {
+			return { background: '#FF8383' };
 		}
 	}
 
 	$(document).ready(function() {
-
 		// Create a agGrid
 		gagaAgGrid.createGrid('gridList', gridOptions);
 
 	});
 
+	//엑셀업로드 클릭 시
+	$('#btnExcelUpload').on('click', function() {
+		cfnExcelUploadPopup('createExtmallOrder', 'createExtmallOrder');
+	});
+
+	//주문등록 클릭 시
+	$('#btnSaveExtmallOrderUpload').on('click', function() {
+		var jsonData = JSON.stringify($('#extmallOrderForm').serializeObject());
+		gagajf.ajaxJsonSubmit('/ocm/extmallorder/save', jsonData);
+	});
+
+	$('#btnSearchExtmallOrderUpload').on('click', function() {
+		var url = '/ocm/extmallorder/upload/second/list';
+		gagaAgGrid.fetch(url, gridOptions, 'extmallOrderForm');
+		gridOptions.columnApi.setColumnsVisible(['uploadStatNm','uploadFailNm','uploadFailReason','ordAmt','ordNo'], true);
+	});
+
+	var createExtmallOrder = function(result){
+		var data = {procJob : result.procJob
+					,excelFileNm : result.excelFileNm
+					};
+		var jsonData = JSON.stringify(data);
+		gagajf.ajaxJsonSubmit('/ocm/extmallorder/excelupload/save', jsonData, fnExtmallOrderCreateCallBack);
+	}
+
+	var fnExtmallOrderCreateCallBack = function(result){
+		var url = '/ocm/extmallorder/upload/tmp/list';
+		gagaAgGrid.fetch(url, gridOptions, 'extmallOrderForm');
+		gridOptions.columnApi.setColumnsVisible(['uploadStatNm','uploadFailNm','uploadFailReason','ordAmt','ordNo'], false);
+	}
 
 /*]]>*/
 </script>

+ 46 - 6
src/main/webapp/WEB-INF/views/order/OrderDetailForm.html

@@ -172,6 +172,7 @@ var orderFreeGiftCnt		= [[${orderFreeGiftInfo.size()}]];		// 주문사은품정
 var orderDeliveryAddrCnt	= [[${orderDeliveryAddrInfo.size()}]];	// 배송정보
 var orderChangeCnt 			= [[${orderChangeInfo.size()}]];		// 취소/반품/교환요청 정보
 var orderRefundCnt 			= [[${orderRefundInfo.size()}]];		// 환불정보
+var roleCd 					= [[${sessionInfo.roleCd}]];			// 권한코드 
 
 // 2021.05.12 
 var hiddenTemp				= true;
@@ -192,7 +193,16 @@ var columnDefsGoodsInfo = [
 		children	: [
 			{headerName: "상세번호"	, field: "ordDtlNo"		, width: 80, cellClass: 'text-center'},
 			{headerName: "주문구분"	, field: "exchGbNm"		, width: 80, cellClass: 'text-center'},
-			{headerName: "상품코드"	, field: "goodsCd"		, width: 80, cellClass: 'text-center'},
+			{
+				headerName: "상품코드", field: "goodsCd", width: 120, cellClass: 'text-center', sortable: true,
+				cellRenderer: function (params) {
+					if (roleCd.indexOf("C") < 0) {
+						return "<a href=\"javascript:void(0);\" onclick=\"cfnOpenGoodsDetailPopup('U','" + params.value + "');\">" + params.value + "</a>";
+					} else {
+						return params.value;
+					}
+				}
+			},
 			{
 				headerName		: "상품명"
 				, field			: "goodsNm"
@@ -202,7 +212,17 @@ var columnDefsGoodsInfo = [
 					return '<a href="javascript:void(0);" onclick="cfnOpenFrontGoodsPopup(\'' + params.data.goodsCd + '\',\'' + params.data.siteCd + '\');">' + params.value + '</a>';
 				}
 			},
-			{headerName: "상품타입"	, field: "goodsTypeNm"	, width: 100, cellClass: 'text-center'},
+			{headerName: "상품타입"	, field: "goodsTypeNm"	, width: 130, cellClass: 'text-center',
+				cellRenderer: function (params) {
+					var option;
+					if (params.data.goodsType == 'G056_S') {
+						option = "<a href=\"javascript:void(0);\" onclick=\"fnOrderDetailItemForm('" + params.data.ordDtlNo + "');\">" + params.value + "</a>";
+					} else {
+						option = params.value
+					}
+					return option;
+				}
+			},
 			{headerName: "브랜드"		, field: "brandGroupNm"	, width: 100, cellClass: 'text-center'},
 			{headerName: "옵션1"		, field: "colorNm"		, width: 80, cellClass: 'text-center'},
 			{headerName: "옵션2"		, field: "optCd2"		, width: 80, cellClass: 'text-center'},
@@ -454,15 +474,20 @@ var columnDefsGoodsInfo = [
 	{
 		headerName	: "배송",
 		children	: [
-			{headerName: "품절여부", field: "soldoutYn", width: 90, cellClass: 'text-center'},
+			{headerName: "품절여부"	, field: "soldoutYn"	, width: 90, cellClass: 'text-center'},
+			{headerName: "택배사코드"	, field: "shipCompCd"	, width: 150, cellClass: 'text-center',  hide: true},
+			{headerName: "출고택배사"	, field: "shipCompNm"	, width: 150, cellClass: 'text-center'},
 			{
 				headerName		: "송장번호"
 				, field			: "invoiceNo"
-				, width			: 100
+				, width			: 150
 				, cellClass		: 'text-center'
 				, cellRenderer	: function (params) {
 					var retStr = '';
-					if (!gagajf.isNull(params.value)) retStr = '<a href="javascript:void(0);" onclick="fnSearchDelivery(\'' + params.data.trackingUrl + '\',\'' + params.data.invoiceNo + '\');">' + params.value + '</a>';
+					if (!gagajf.isNull(params.value)) {
+						//retStr = '<a href="javascript:void(0);" onclick="fnSearchDelivery(\'' + params.data.trackingUrl + '\',\'' + params.data.invoiceNo + '\');">' + params.value + '</a>';
+						retStr = '<a href="javascript:void(0);" onclick="fnSweetTracker(\'' + params.data.shipCompCd + '\',\'' + params.data.invoiceNo + '\');">' + params.value + '</a>';
+					}
 					return retStr;
 				}
 			},
@@ -920,7 +945,7 @@ var columnDefsOrderMemoInfo = [
 			}
 			return retStr;
 		}
-	},
+	}
 ];
 var gridOptionsOrderMemoInfo = gagaAgGrid.getGridOptions(columnDefsOrderMemoInfo);
 </script>
@@ -1389,6 +1414,14 @@ var fnSearchDelivery = function (url, invoiceNo) {
 	window.open(fullUrl, '_blank');
 };
 
+// 2021.06.17스윗트래커 송장조회
+var fnSweetTracker = function (shipCompCd, invoiceNo) {
+	var actionUrl = "/order/delivery/sweetTrackerDeliveryInfo?shipCompCd=" + shipCompCd + "&invoiceNo=" + invoiceNo;
+	cfnOpenModalPopup(actionUrl, 'popupSweetTrackerDeliveryInfo');
+	
+};
+
+
 // 카드전표 영수증 조회
 var fnReceiptPage = function (tid) {
 	var fullUrl = "https://npg.nicepay.co.kr/issue/IssueLoader.do?TID=" + tid + "&type=0";
@@ -1496,6 +1529,13 @@ var fnOpenDaumAddr = function(idx, addrGb) {
 	
 	cfnOpenDaumAddr(daumZip);
 }
+
+
+// 2021.06.17 구성상품 내역 팝업 호출 
+var fnOrderDetailItemForm = function (ordDtlNo) {
+	var actionUrl = "/delivery/detail/item/form/" + ordDtlNo;
+	cfnOpenModalPopup(actionUrl, 'popupDeliveryDetailItemForm');
+}
 </script>
 
 </html>

+ 3 - 12
src/main/webapp/WEB-INF/views/order/OrderListForm.html

@@ -379,7 +379,7 @@ var columnDefsOrderList = [
 		, cellClass		: 'text-center'
 		, sortable		: true
 	},
-	{headerName: "출고처", field: "delvLocNm", width: 110, cellClass: 'text-center', sortable: true, hide:true},
+	{headerName: "출고처"		, field: "delvLocNm"	, width: 110	, cellClass: 'text-center'	, sortable: true, hide:true},
 	{headerName: "상품코드"	, field: "goodsCd"		, width: 100	, cellClass: 'text-center'	, sortable: true},
 	{headerName: "브랜드"		, field: "brandGroupNm"	, width: 100	, cellClass: 'text-center'	, sortable: true},
 	{headerName: "구성유형"	, field: "goodsTypeNm"	, width: 100	, cellClass: 'text-center'	, sortable: true},
@@ -481,24 +481,15 @@ var columnDefsOrderList = [
 			return gagaAgGrid.toDateTimeFormat(params.data.delvAssignDt); 
 		}
 	},
-	{
-		headerName		: "송장출력일시"
-		, field			: "invoiceDt"
-		, width			: 150
-		, cellClass		: 'text-center'
-		, valueGetter	: function (params) { 
-			return gagaAgGrid.toDateTimeFormat(params.data.invoiceDt); 
-		}
-	},
 	{headerName: "출고택배사"		, field: "shipCompNm"	, width: 150, cellClass: 'text-center'},
 	{headerName: "출고송장"		, field: "invoiceNo"	, width: 150, cellClass: 'text-center'},
 	{
 		headerName		: "출고일시"
-		, field			: "delvResDt"
+		, field			: "delvStDt"
 		, width			: 150
 		, cellClass		: 'text-center'
 		, valueGetter: function (params) { 
-			return gagaAgGrid.toDateTimeFormat(params.data.delvResDt); 
+			return gagaAgGrid.toDateTimeFormat(params.data.delvStDt); 
 		}
 	},
 	{headerName: "품절여부"		, field: "soldoutYn"	, width: 90		, cellClass: 'text-center', sortable: true},

+ 76 - 0
src/main/webapp/WEB-INF/views/order/SweetTrackerDeliveryList.html

@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : DeliveryDetailItemForm.html
+ * @desc    : 배송정보이력
+ *============================================================================
+ * ISTYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.06.17   jsh77b       최초 작성
+ *******************************************************************************
+ -->
+
+
+<div class="modalPopup" data-width="750" >
+	<div class="panelStyle">
+		<div class="panelTitle">
+			<h2>배송정보이력</h2>
+			<button type="button" class="close" onclick="uifnPopupClose('popupSweetTrackerDeliveryInfo')"><i class="fa fa-times"></i></button>
+		</div>
+				
+		<div class="panelContent" style="overflow-y:auto;">
+			<form id="DeliveryDetailItemFrm">
+				<div id="gridDelvDetailItemInfo" style="width:100%; height: 260px;" class="ag-theme-balham"></div>
+			</form>
+		</div>
+	</div>
+</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+
+var sweetTrackerDeliveryList = [[${sweetTrackerDeliveryList}]];
+
+// specify the columns
+var columnDefsDelvDetailItemInfo = [
+		{headerName: "택배사처리시간"	, field: "timeTrans"	, width: 150	, cellClass: 'text-center'},
+		{headerName: "택배위치"		, field: "delvWhere"	, width: 160	, cellClass: 'text-left'},
+		{headerName: "배송상세정보"	, field: "details"		, width: 240	, cellClass: 'text-left'},
+		{
+			headerName		: "연락처"
+			, field			: "telno"
+			, width			: 130
+			, cellClass		: 'text-center'
+			, cellRenderer	: function (params) {
+				var retStr = '';
+				
+				if (!gagajf.isNull(params.value)) {
+					retStr = params.value.replace(/[^0-9]/g, "").replace(/(^02|^0505|^1[0-9]{3}|^0[0-9]{2})([0-9]+)?([0-9]{4})$/,"$1-$2-$3").replace("--", "-");
+				}
+				return retStr;
+			}
+		}
+];
+
+$(document).ready(function() {
+	// Get GridOptions
+	var gridDelvDetailItemInfo = gagaAgGrid.getGridOptions(columnDefsDelvDetailItemInfo);
+	gagaAgGrid.createGrid('gridDelvDetailItemInfo', gridDelvDetailItemInfo);
+	gridDelvDetailItemInfo.api.setRowData(sweetTrackerDeliveryList);
+	$('.ag-status-bar').hide();
+});
+	
+//2021.04.09 하이픈처리
+$(document).on("keyup", "#deliveryModifyForm input[name=recipPhnno]", function() { 
+	$(this).val( $(this).val().replace(/[^0-9]/g, "").replace(/(^02|^0505|^1[0-9]{3}|^0[0-9]{2})([0-9]+)?([0-9]{4})$/,"$1-$2-$3").replace("--", "-") ); 
+});
+	
+/*]]>*/
+</script>
+
+</html>