소스 검색

Merge remote-tracking branch '112.172.147.34/style' into ST24PRJ-198(다다익선등록오류)

jsh77b 4 년 전
부모
커밋
715f127eb1

+ 13 - 0
pom.xml

@@ -254,6 +254,19 @@
 			<artifactId>emoji-java</artifactId>
 			<version>5.1.1</version>
 		</dependency>
+
+		<!-- /// logback 취약점 대응 -->
+		<dependency>
+			<groupId>ch.qos.logback</groupId>
+			<artifactId>logback-classic</artifactId>
+			<version>1.2.9</version>
+		</dependency>
+		<dependency>
+			<groupId>ch.qos.logback</groupId>
+			<artifactId>logback-core</artifactId>
+			<version>1.2.9</version>
+		</dependency>
+		<!-- \\\ logback 취약점 대응 -->
 	</dependencies>
 	
 	<build>

+ 10 - 0
src/main/java/com/style24/admin/biz/dao/TsaShoplinkerDao.java

@@ -119,6 +119,16 @@ public interface TsaShoplinkerDao {
 	 */
 	Collection<GagaMap> getGoodsSendExcelPlanning(ShoplinkerSearch shoplinkerSearch);
 
+	/**
+	 * 상품등록-미리보기
+	 *
+	 * @param shoplinkerGoods
+	 * @return
+	 * @author jmh
+	 * @since 2021. 12. 20
+	 */
+	ShoplinkerGoods getGoodsSendPreviewInfo(ShoplinkerGoods shoplinkerGoods);
+	
 	/**
 	 * 재고-단품 등록
 	 *

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

@@ -118,6 +118,7 @@ public class TsaShoplinkerService {
 
 				StringBuilder sbRequest;
 				int opCnt = 0;
+				int stockQty = 0;
 				for (ShoplinkerGoods map : list) {
 					opCnt ++;
 					
@@ -134,18 +135,19 @@ public class TsaShoplinkerService {
 					sbRequest.append("			<product_name><![CDATA[").append(map.getOptCd1()+"_"+map.getOptCd2()).append("]]></product_name>\n");
 					// 재고가 0일경우 1로전송
 					if( 0 < map.getQuantity()) {
-						sbRequest.append("			<quantity>").append(map.getQuantity()).append("</quantity>\n");
+						stockQty = map.getQuantity();
 					}else {
-						sbRequest.append("			<quantity>").append("1").append("</quantity>\n");
+						stockQty = 1;
 					}
+					sbRequest.append("			<quantity>").append(stockQty).append("</quantity>\n");
 
 					sbRequest.append("		</product>\n");
 					sbRequest.append("	</productInfo>\n");
 					sbRequest.append("</shoplinker>\n");
 
 					regMap.setOptCd(map.getPartnerProductId());
-					regMap.setQuantity(map.getQuantity());		// 중요!! 재고 기록은 실 재고호 기록한다. 0일경우 샵링커에 전송하지 않기위함.(md가 샵링커에서 몰로 수동전송시 재고가 0일경우 몰에 등록안된다 함)
-
+					regMap.setQuantity(stockQty);	// 21.12.17 가상재고(0일경우 1)로 DB 등록하는 것으로 변경.(신상품 아닌 기존상품 등 계속 품절인 건은 재고 동기화가 안되므로)
+					
 					// api 호출 및 결과 history 저장
 					callGoodsRegApi(regMap , sbRequest, "option_"+opCnt);
 				}
@@ -303,8 +305,6 @@ public class TsaShoplinkerService {
 
 		// 2. 신규 상세내용 (상세폼신규사용여부 N: 기존 정보 / Y : html 형식)
 		if( "Y".equals(goodsMap.getTobeFormYn())){
-			htmlDesc = ""; // 초기화
-
 			String imgPath = env.getProperty("upload.goods.view");
 
 			// 메인컬러에 매칭되는 이미지만 가져옴.(상세,페브릭,라벨등..)
@@ -347,10 +347,12 @@ public class TsaShoplinkerService {
 			}
 
 			// 제대로된 정보 없을 경우, 기존 상세내용으로 보냄
-			if( "".equals(dImgFront)) {
+			if( "".equals(dImgFront) && dImgModelList.size() < 1 && dImgDetailList.size() < 1) {
 				htmlDesc = descStr;
 
 			}else {
+				htmlDesc = ""; // 초기화
+				
 				// 1) 상세내용 - 모델 착용컷
 				String modelDesc = "";
 				if( 0 < dImgModelList.size()) {
@@ -971,7 +973,18 @@ public class TsaShoplinkerService {
 			throw new IllegalStateException(e);
 		}
 	}
-
+	
+	/**
+	 * 상품등록-미리보기
+	 *
+	 * @param shoplinkerGoods
+	 * @return
+	 * @author jmh
+	 * @since 2021. 12. 20
+	 */
+	public ShoplinkerGoods getGoodsSendPreviewInfo(ShoplinkerGoods shoplinkerGoods) {
+		return admShoplinkerDao.getGoodsSendPreviewInfo(shoplinkerGoods);
+	}
 
 	/**
 	 * 재고전송-목록 건수

+ 37 - 0
src/main/java/com/style24/admin/biz/web/TsaShoplinkerController.java

@@ -315,7 +315,44 @@ log.info(" #### SHOPLINKER CHKE 1 - "+runMap.getRunCnt()+" | "+runMap.getSidOver
 
 		return GagaFileUtil.writeFile(request, excelFilenameWithPath);
 	}
+	
+	/**
+	 * 샵링커상품등록 - 상세화면보기
+	 * @param logSq - 로그일련번호
+	 * @return
+	 * @author jmh
+	 * @since 2021. 12. 20
+	 */
+	@GetMapping("/goods/preview/form/{logSq}")
+	@ResponseBody
+	public ModelAndView shoplinkerGoodsSendPreviewForm(@PathVariable long logSq) {
+		ModelAndView mav = new ModelAndView("shoplinker/ShoplinkerGoodsSendPreviewForm");
+		ShoplinkerGoods map = new ShoplinkerGoods();
+		map.setLogSq(logSq);
+		
+		ShoplinkerGoods result = admShoplinkerService.getGoodsSendPreviewInfo(map);
+		String detail = result.getXmlTxt();
+		String html = "";
+		if( null != detail) {
+			int startIdx = detail.indexOf("<detail_desc>");
+			int endIdx = detail.indexOf("</detail_desc>");
+			
+			if( "Y".equals(result.getTobeFormYn())) {
+				html = detail.substring(startIdx+13, endIdx);
+			}else {
+				html = "<div style=\"max-width:1200px; margin:auto;\">" + detail.substring(startIdx+13, endIdx) + "</div>";
+			}
+		}else {
+			html = "<p>표시할 내용이 없습니다.</p>";
+		}
+		
+		result.setXmlTxt(html);
+		
+		// 미리보기 정보
+		mav.addObject("goodsInfo", result);
 
+		return mav;
+	}
 
 	/**
 	 * 재고이력-화면

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

@@ -289,6 +289,17 @@
 		ORDER BY A.API_PRODUCT_ID, OP.DISP_ORD, OP.OPT_CD1, OP.OPT_CD2
 	</select>
 	
+	<!-- 상품등록-미리보기 -->
+	<select id="getGoodsSendPreviewInfo" parameterType="ShoplinkerGoods" resultType="ShoplinkerGoods">
+		/* TsaShoplinker.getGoodsSendPreviewInfo */
+		SELECT
+			SH.*
+			, G.TOBE_FORM_YN
+		FROM SHOPLINKER_SYNC_HST SH
+		INNER JOIN TB_GOODS G ON SH.GOODS_CD = G.GOODS_CD 
+		WHERE SH.LOG_SQ = #{logSq}
+	</select>
+	
 	<!-- 재고-단품 등록 -->
 	<insert id="insertStockOption" parameterType="ShoplinkerGoods">
 		/* TsaShoplinker.insertStockOption */
@@ -311,6 +322,7 @@
 			, now()
 		) ON DUPLICATE KEY UPDATE
 		  	UPD_DT = now()
+		  	, STOCK_QTY = #{quantity}
 	</insert>
 
 	<!-- 재고전송-목록 건수 -->

+ 21 - 37
src/main/webapp/WEB-INF/views/shoplinker/ShoplinkerGoodsSendForm.html

@@ -170,37 +170,14 @@
 				return '<a href="javascript:void(0);">' + params.value + '</a>';
 			}
 		},
-		{headerName: "xml", field: "xmlTxt", width: 100, cellClass: 'text-center', editable: true,
-			cellEditor: 'agLargeTextCellEditor',
-			cellRenderer: function(params) {
-				params.value = '<button type="button"class="btn btn-success">보기</button>';
-				return params.value;
-			}
-		},
-		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
 		{
-			headerName: "전송일자", field: "regDt", width: 150, cellClass: 'text-center',
-			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
-		}
-	];
-
-	let columnDefs2 = [
-		{headerName: "No", width: 60, cellClass: 'text-center',
-			valueGetter: function(params) { return cfnGridNumner('searchForm',params.node.rowIndex, 'A');}
-		},
-		{headerName: "샵링커 상품코드", field: "apiProductId", width: 130, cellClass: 'text-center'},
-		{
-			headerName: "API구분", field: "apiType", width: 100, cellClass: 'text-center',
-			valueFormatter: function (params) { return gagaAgGrid.lookupValue(apiTypeValue, params.value); }
-		},
-		{headerName: "IF결과", field: "apiResult", width: 100, cellClass: 'text-center',
-			valueFormatter: function (params) { return gagaAgGrid.lookupValue(procGbValue, params.value); }
-		},
-		{headerName: "IF결과메세지", field: "apiMessage", width: 300, cellClass: 'text-left'},
-		{headerName: "자사 상품코드", field: "goodsCd", width: 150, cellClass: 'text-center'},
-		{headerName: "상품명", field: "goodsNm", width: 300, cellClass: 'text-left'
-			,cellRenderer: function(params) {
-				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			headerName: "미리보기", field:"preview", width: 100, cellClass: 'text-center',
+			cellRenderer: function(params) { 
+				if("PRODUCT" == params.data.apiType){
+					return '<button="javascript:void(0);" class="btn btn-info btn-sm">미리보기</button>';
+				}else{
+					return "";
+				}
 			}
 		},
 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
@@ -209,13 +186,8 @@
 			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
 		}
 	];
-
-	let gridOptions;
-	if (sessRoleCd == "G001_0000") { // SUPER관리자
-		gridOptions = gagaAgGrid.getGridOptions(columnDefs1);
-	} else {
-		gridOptions = gagaAgGrid.getGridOptions(columnDefs2);
-	}
+	
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs1);
 
 	// Row Click
 	gridOptions.onCellClicked = function(event) {
@@ -225,6 +197,11 @@
 		}else if (event.colDef.field == "goodsCd"){
 
 			//cfnOpenFrontGoodsPopup(goodsCd, event.data.siteCd);
+		}else if (event.colDef.field == 'preview') {
+			// 미리보기 팝업
+			if( "PRODUCT" ==  event.data.apiType){
+				fnOpenPreviewPopup(event.data.logSq);
+			}
 		}
 	}
 
@@ -429,6 +406,13 @@
 	});
 	/**************** 샵링커기획전생성엑셀 // *****************************************************/
 	
+	/**************** 미리보기 *****************************************************/
+	var fnOpenPreviewPopup = function(logSq) {
+		var actionUrl = '/shoplinker/goods/preview/form/' + logSq;
+		cfOpenWindowPopup(actionUrl, 'popupShoplinkerTemplatePreview', 1200, 700);
+	}
+	/**************** 미리보기 // *****************************************************/
+	
 	/**************** 테스트용  *******************************************************/
     // 테스트- 실제 샵링커 호출
 	var fnTest = function(){

+ 59 - 0
src/main/webapp/WEB-INF/views/shoplinker/ShoplinkerGoodsSendPreviewForm.html

@@ -0,0 +1,59 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="ko"
+	xmlns="http://www.w3.org/1999/xhtml"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : ShoplinkerGoodsSendPreviewForm.html
+ * @desc    : 샵링커 상품전송관리 미리보기 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021. 12. 20   jmh     최초 작성
+ *******************************************************************************
+ -->
+<head>
+	<title>::샵링커 상품상세 미리보기::</title>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+</head>
+
+<body>
+
+	<!-- 엑셀다운버튼 -->
+	<div style="text-align: right; margin: 20px;">
+		<button type="button" class="" onclick="fnDownloadHtml();">html 파일다운</button>
+	</div>
+	
+	<!-- 컨텐츠 -->
+	<th:block th:utext="${goodsInfo.xmlTxt}"></th:block>
+	
+
+	<!-- html 파일생성 -->
+	<script th:inline="javascript">
+	/*<![CDATA[*/
+		function fnDownloadHtml() {
+			var filename = [[${goodsInfo.goodsCd}]]+".html";
+			var text = "<!DOCTYPE html><html><body>"+ [[${goodsInfo.xmlTxt}]] + "</body></html>";
+			
+		    var pom = document.createElement('a');
+		    pom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
+		    pom.setAttribute('download', filename);
+		 
+		    if (document.createEvent) {
+		        var event = document.createEvent('MouseEvents');
+		        event.initEvent('click', true, true);
+		        pom.dispatchEvent(event);
+		    }
+		    else {
+		        pom.click();
+		    }
+		}
+	/*]]>*/
+	</script>
+</body>
+</html>
+