Kaynağa Gözat

광고키워드 관리

eskim 5 yıl önce
ebeveyn
işleme
69af269b57

+ 51 - 0
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java

@@ -3,6 +3,8 @@ package com.style24.admin.biz.dao;
 import java.util.Collection;
 
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.AdKeyword;
+import com.style24.persistence.domain.AdKeywordGoods;
 import com.style24.persistence.domain.Color;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsCompose;
@@ -920,5 +922,54 @@ public interface TsaGoodsDao {
 	 */
 	void createGoodsCustGrade(Goods goods);
 
+	/**
+	 * 광고 키워드 목록
+	 *
+	 * @param adKeyword
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 14
+	 */
+	Collection<AdKeyword> getAdKeywordList(AdKeyword adKeyword);
+
+	/**
+	 * 광고 키워드 저장
+	 *
+	 * @param adKeywordGoods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 14
+	 */
+	void saveAdKeyword(AdKeyword adKeyword);
+
+	/**
+	 * 광고 키워드 상품 목록
+	 *
+	 * @param adKeyword
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 14
+	 */
+	Collection<AdKeywordGoods> getAdKeywordGoodsList(AdKeyword adKeyword);
+
+	/**
+	 * 광고 키워드 상품 저장
+	 *
+	 * @param adKeywordGoods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 14
+	 */
+	void saveAdKeywordGoods(AdKeywordGoods adKeywordGoods);
+
+	/**
+	 * 광고 키워드 상품 삭제
+	 *
+	 * @param noticeGoods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 14
+	 */
+	void deleteAdKeywordGoods(AdKeywordGoods adKeywordGoods);
 
 }

+ 96 - 0
style24.admin/src/main/java/com/style24/admin/biz/service/TsaGoodsService.java

@@ -18,6 +18,8 @@ import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.biz.thirdparty.NaverLowestPriceApi;
 import com.style24.core.biz.thirdparty.SafetyKoreaApi;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.AdKeyword;
+import com.style24.persistence.domain.AdKeywordGoods;
 import com.style24.persistence.domain.Brand;
 import com.style24.persistence.domain.Color;
 import com.style24.persistence.domain.Goods;
@@ -2392,4 +2394,98 @@ public class TsaGoodsService {
 		}
 	}
 
+	/**
+	 * 광고 키워드 목록
+	 *
+	 * @param adKeyword
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	public Collection<AdKeyword> getAdKeywordList(AdKeyword adKeyword) {
+		return goodsDao.getAdKeywordList(adKeyword);
+	}
+
+	/**
+	 * 광고 키워드 상품 목록
+	 *
+	 * @param adKeyword
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	public Collection<AdKeywordGoods> getAdKeywordGoodsList(AdKeyword adKeyword) {
+		return goodsDao.getAdKeywordGoodsList(adKeyword);
+	}
+
+	/**
+	 * 광고 키워드 저장
+	 * @param adKeyword
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	@Transactional("shopTxnManager")
+	public void saveAdKeywordGoods(AdKeyword adKeyword) {
+		adKeyword.setRegNo(TsaSession.getInfo().getUserNo());
+		adKeyword.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		// 신규 일때
+		if (adKeyword.getAdKeywordSq() == null) {
+			// 공지사항 저장
+			goodsDao.saveAdKeyword(adKeyword);
+
+			// 등록된 사용자번호 값 가져오기
+			Integer noticeSq = adKeyword.getAdKeywordSq();
+
+			adKeyword.setAdKeywordSq(noticeSq);
+
+		} else {
+			// 공지사항 수정
+			goodsDao.saveAdKeyword(adKeyword);
+		}
+
+		if (!StringUtils.isEmpty(adKeyword.getGoodsList())) {
+			Collection<AdKeywordGoods> adKeywordGoodsList = null;
+			try {
+				adKeywordGoodsList = mapper.readValue(adKeyword.getGoodsList(), new TypeReference<Collection<AdKeywordGoods>>() {
+				});
+			} catch (Exception e) {
+				e.printStackTrace();
+				throw new IllegalStateException(message.getMessage("광고 키워드 저장 중 오류로 인해 저장되지 않았습니다."));
+			}
+			log.info("adKeywordGoodsList: {}", adKeywordGoodsList);
+
+			int idx = 0;
+			for (AdKeywordGoods adKeywordGoods : adKeywordGoodsList) {
+				if (idx == 0) goodsDao.deleteAdKeywordGoods(adKeywordGoods); // 전체 상품 삭제
+				adKeywordGoods.setAdKeywordSq(adKeyword.getAdKeywordSq());
+				adKeywordGoods.setRegNo(TsaSession.getInfo().getUserNo());
+				adKeywordGoods.setUpdNo(TsaSession.getInfo().getUserNo());
+
+				goodsDao.saveAdKeywordGoods(adKeywordGoods);
+				idx++;
+			}
+		}
+	}
+
+	/**
+	 * 광고 키워드 상품 삭제
+	 * @param adKeywordGoods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteAdKeywordGoods(AdKeywordGoods adKeywordGoods) {
+
+		if (adKeywordGoods == null || (adKeywordGoods.getArrGoodsCd() == null && adKeywordGoods.getArrGoodsCd().length <= 0)) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		if (adKeywordGoods.getArrGoodsCd().length > 0) {
+			goodsDao.deleteAdKeywordGoods(adKeywordGoods);
+		}
+	}
+
 }

+ 60 - 0
style24.admin/src/main/java/com/style24/admin/biz/web/TsaGoodsController.java

@@ -29,6 +29,8 @@ import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.TsaPageRequest;
+import com.style24.persistence.domain.AdKeyword;
+import com.style24.persistence.domain.AdKeywordGoods;
 import com.style24.persistence.domain.Color;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsCompose;
@@ -2128,4 +2130,62 @@ public class TsaGoodsController extends TsaBaseController {
 		return mav;
 	}
 
+	/**
+	 * 광고 키워드 목록
+	 * @param adKeyword
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	@PostMapping("/ad/keyword/list")
+	@ResponseBody
+	public Collection<AdKeyword> getAdKeywordList(@RequestBody AdKeyword adKeyword) {
+		return goodsService.getAdKeywordList(adKeyword);
+	}
+
+	/**
+	 * 광고 키워드 상품목록
+	 * @param adKeywordSq
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	@GetMapping("/ad/keyword/goods/list/{adKeywordSq}")
+	@ResponseBody
+	public Collection<AdKeywordGoods> getAdKeywordGoodsList(@PathVariable Integer adKeywordSq) {
+		AdKeyword adKeyword = new AdKeyword();
+		adKeyword.setAdKeywordSq(adKeywordSq);
+		return goodsService.getAdKeywordGoodsList(adKeyword);
+	}
+
+	/**
+	 * 광고 키워드 저장/등록
+	 *
+	 * @param adKeyword
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	@PostMapping("/ad/keyword/save")
+	@ResponseBody
+	public GagaResponse saveAdKeywordGoods(@RequestBody AdKeyword adKeyword) {
+		goodsService.saveAdKeywordGoods(adKeyword);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 광고 키워드 상품 삭제
+	 *
+	 * @param adKeywordGoods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	@PostMapping("/ad/keyword/goods/delete")
+	@ResponseBody
+	public GagaResponse deleteAdKeywordGoods(@RequestBody AdKeywordGoods adKeywordGoods) {
+		goodsService.deleteAdKeywordGoods(adKeywordGoods);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
 }

+ 7 - 2
style24.admin/src/main/java/com/style24/persistence/domain/AdKeyword.java

@@ -1,5 +1,7 @@
 package com.style24.persistence.domain;
 
+import java.util.Collection;
+
 import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
@@ -21,6 +23,9 @@ public class AdKeyword extends TscBaseDomain {
 	private String useYn;
 
 	private String goodsCd;
-	private int dispOrd;
-	private String delYn;
+	private String stDate;
+	private String edDate;
+
+	private String goodsList;
+	private Collection<AdKeywordGoods> goodsListNew;
 }

+ 28 - 0
style24.admin/src/main/java/com/style24/persistence/domain/AdKeywordGoods.java

@@ -0,0 +1,28 @@
+package com.style24.persistence.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 광고 키워드 Domain
+ *
+ * @author eskim
+ * @since 2020. 12. 14
+ */
+@SuppressWarnings("serial")
+@Data
+public class AdKeywordGoods extends TscBaseDomain {
+
+	private Integer adKeywordSq;
+	private String goodsCd;
+	private int dispOrd;
+	private String delYn;
+
+	private String goodsNm;
+	private String crud;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrGoodsCd;
+}

+ 47 - 13
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -2500,6 +2500,8 @@
 		)
 		ON DUPLICATE KEY UPDATE
 		       GOODS_CD = #{goodsCd}
+		      ,UPD_NO = #{updNo}
+		      ,UPD_DT = NOW()
 	</insert>
 	
 	<!-- 상품상세 공지사항 상품 삭제 -->
@@ -3266,8 +3268,41 @@
 		ORDER  BY A.AD_KEYWORD_SQ DESC
 	</select>
 	
+	<!-- 광고 키워드 저장 -->
+	<insert id="saveAdKeyword" parameterType="AdKeyword">
+		/* TsaGoods.saveAdKeyword */
+		INSERT INTO TB_AD_KEYWORD (
+		       AD_KEYWORD_SQ
+		     , AD_KEYWORD
+		     , AD_KEYWORD_STDT
+		     , AD_KEYWORD_EDDT
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{adKeywordSq}
+		     , #{adKeyword}
+		     , #{adKeywordStdt}
+		     , #{adKeywordEddt}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       AD_KEYWORD_STDT = #{adKeywordStdt}
+		      ,AD_KEYWORD_EDDT = #{adKeywordEddt}
+		      ,USE_YN = #{useYn}
+		      ,UPD_NO = #{updNo}
+		      ,UPD_DT = NOW()
+	</insert>
+	
 	<!-- 광고 키워드 상품 목록 -->
-	<select id="getAdKeywordGoodsList" parameterType="AdKeyword" resultType="AdKeyword">
+	<select id="getAdKeywordGoodsList" parameterType="AdKeyword" resultType="AdKeywordGoods">
 		/* TsaGoods.getAdKeywordGoodsList */
 		SELECT A.AD_KEYWORD_SQ
 		     , A.GOODS_CD
@@ -3276,18 +3311,16 @@
 		FROM TB_AD_KEYWORD_GOODS A
 		INNER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
 		WHERE AD_KEYWORD_SQ = #{adKeywordSq}
-		AND A.DEL_YN = 'Y'
-		ORDER BY A.GOODS_CD
+		ORDER BY A.DISP_ORD, A.GOODS_CD
 	</select>
 	
 	<!-- 광고 키워드 상품저장 -->
-	<insert id="saveAdKeywordGoods" parameterType="AdKeyword">
+	<insert id="saveAdKeywordGoods" parameterType="AdKeywordGoods">
 		/* TsaGoods.saveAdKeywordGoods */
 		INSERT INTO TB_AD_KEYWORD_GOODS (
 		       AD_KEYWORD_SQ
 		     , GOODS_CD
 		     , DISP_ORD
-		     , DEL_YN
 		     , REG_NO
 		     , REG_DT
 		     , UPD_NO
@@ -3297,23 +3330,24 @@
 		       #{adKeywordSq}
 		     , #{goodsCd}
 		     , #{dispOrd}
-		     , #{delYn}
 		     , #{regNo}
 		     , NOW()
 		     , #{updNo}
 		     , NOW()
 		)
-		ON DUPLICATE KEY UPDATE
-		       DISP_ORD = #{dispOrd}
-		      ,DEL_YN = ${delYn}
 	</insert>
 	
 	<!-- 광고 키워드 삭제 -->
-	<delete id="deleteAdKeywordGoods" parameterType="AdKeyword">
-		/* TsaGoods.deleteNoticeGoods */
-		 TB_AD_KEYWORD_GOODS 
+	<delete id="deleteAdKeywordGoods" parameterType="AdKeywordGoods">
+		/* TsaGoods.deleteAdKeywordGoods */
+		DELETE FROM TB_AD_KEYWORD_GOODS 
 		WHERE AD_KEYWORD_SQ =  #{adKeywordSq}
-		AND GOODS_CD = #{goodsCd}
+		<if test="arrGoodsCd != null and arrGoodsCd.length>0">
+		AND GOODS_CD IN
+		    <foreach collection="arrGoodsCd" item="item" index="index"  open="(" close=")" separator=",">
+		#{item}
+		    </foreach>
+		</if>
 	</delete>
 	
 </mapper>

+ 26 - 18
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsAdKeywordForm.html

@@ -112,7 +112,7 @@
 										<th>사용여부</th>
 										<td>
 											<input type="hidden" name="useYn"/>
-											<label class="chkBox"><input type="checkbox" name="chkUseYn" checked="checked" value="Y"/>사용</label>
+											<label class="chkBox checked"><input type="checkbox" name="chkUseYn" checked="checked" value="Y"/>사용</label>
 										</td>
 									</tr>
 									<tr>
@@ -163,9 +163,6 @@
 		<!-- 등록/수정 -->
 		</form>
 	</div>
-
-<script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020103001"></script>
-<script type="text/javascript" src="/ux/plugins/gaga/gaga.summernote.js?v=2020103001"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
 
@@ -193,11 +190,12 @@
 	];
 	
 	var columnKeywordeGoodsDefs = [
+		{width: 40, cellClass: 'text-center', filter: false, rowDrag: true},
 		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
 		{headerName: "CRUD", field: "crud", width: 75, minWidth: 75, hide: true},
 		{headerName: "상품코드", field: "goodsCd", width: 140, cellClass: 'text-center'},
-		{headerName: "상품명", field: "goodsNm", width: 260, cellClass: 'text-left'}
+		{headerName: "상품명", field: "goodsNm", width: 350, cellClass: 'text-left'}
 	];
 
 	var gridKeywordOptions = gagaAgGrid.getGridOptions(columnKeywordDefs);
@@ -206,9 +204,13 @@
 	gridKeywordGoodsOptions.rowSelection = 'multiple';
 	gridKeywordGoodsOptions.suppressRowClickSelection = true;
 	
+	// 드래그
+	gridKeywordGoodsOptions.rowDragManaged = true;
+	gridKeywordGoodsOptions.stopEditingWhenGridLosesFocus = true;
+	
 	// Cell click
 	gridKeywordOptions.onCellClicked = function(event) {
-		if (event.colDef.field != 'adKeywordTitle')
+		if (event.colDef.field != 'adKeyword')
 			return;
 		
 		$('#goodsAdkeywordForm input[name=adKeywordSq]').val(event.data.adKeywordSq);
@@ -222,7 +224,7 @@
 		
 		$('#goodsAdkeywordForm input[name=adKeywordStdt]').val(event.data.adKeywordStdt);
 		$('#goodsAdkeywordForm input[name=adKeywordEddt]').val(event.data.adKeywordEddt);
-		$('#goodsAdkeywordForm input[name=adKeywordTitle]').val(event.data.adKeywordTitle);
+		$('#goodsAdkeywordForm input[name=adKeyword]').val(event.data.adKeyword);
 
 		// 상품 목록
 		fnGetadKeywordGoodsList(event.data.adKeywordSq);
@@ -290,24 +292,24 @@
 	
 	// 상품 목록 조회
 	var fnGetadKeywordGoodsList = function(adKeywordSq) {
-		var actionUrl = '/goods/adKeyword/goods/list/' + adKeywordSq;
+		var actionUrl = '/goods/ad/keyword/goods/list/' + adKeywordSq;
 		gagaAgGrid.fetch(actionUrl, gridKeywordGoodsOptions);
 	}
 	
 	//엑셀 상품 조회
 	$('#btnSearchExcel').on('click', function() {
-		cfnExcelUploadPopup('goodsadKeywordExcelUpload', 'goodsadKeywordExcelUpload');
+		cfnExcelUploadPopup('goodsAdKeywordExcelUpload', 'goodsAdKeywordExcelUpload');
 	});
 
-	var goodsadKeywordExcelUpload = function(result){
+	var goodsAdKeywordExcelUpload = function(result){
 		var data = {procJob : result.procJob
 			,excelFileNm : result.excelFileNm
 		};
 		var jsonData = JSON.stringify(data);
-		gagajf.ajaxJsonSubmit('/goods/search/excelupload/save', jsonData, fnGoodsadKeywordExcelUploadCallBack);
+		gagajf.ajaxJsonSubmit('/goods/search/excelupload/save', jsonData, fnGoodsAdKeywordExcelUploadCallBack);
 	}
 	
-	var fnGoodsadKeywordExcelUploadCallBack = function(result){
+	var fnGoodsAdKeywordExcelUploadCallBack = function(result){
 		gagajf.ajaxJsonSubmit('/goods/excel/upload/goods/list', '', fnExcelSearchCallBack);
 	}
 	
@@ -371,7 +373,7 @@
 		
 		var removedData = gagaAgGrid.removeRowData(gridKeywordGoodsOptions, false);
 		
-		// 신규 상세 공지일경우 화면에서만 삭제
+		// 신규경우 화면에서만 삭제
 		if (gagajf.isNull($('#goodsAdkeywordForm input[name=adKeywordSq]').val())){
 			return;
 		}
@@ -390,7 +392,7 @@
 			};
 			
 			var jsonData = JSON.stringify(data);
-			gagajf.ajaxJsonSubmit('/goods/adKeyword/goods/delete', jsonData);
+			gagajf.ajaxJsonSubmit('/goods/ad/keyword/goods/delete', jsonData);
 			}
 		});
 	});
@@ -405,6 +407,10 @@
 		$('#goodsAdkeywordForm input[name=adKeywordSq]').val('');
 		$('#goodsAdkeywordForm input[name=adKeywordStdt]').val(_today);
 		$('#goodsAdkeywordForm input[name=adKeywordEddt]').val(_today);
+		
+		$('#goodsAdkeywordForm input[name=chkUseYn]').prop("checked", true);
+		$('#goodsAdkeywordForm input[name=chkUseYn]').parent("label").addClass("checked");
+		
 	});
 	
 	// 저장
@@ -447,9 +453,11 @@
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
 			sureBtnClick: function(){
-				
-				//var goodsAllData = gagaAgGrid.getAllRowData(gridKeywordGoodsOptions);
-				var goodsAllData = gagaAgGrid.getChangedData(gridKeywordGoodsOptions);
+				var idx = 0;
+				var goodsAllData = gagaAgGrid.getAllRowData(gridKeywordGoodsOptions);
+				$.each(goodsAllData, function(idx, item) {
+					item.dispOrd = idx+1;
+				});
 				
 				var jsonGoodsData = JSON.stringify(goodsAllData);
 				$('#goodsAdkeywordForm input[name=goodsList]').val(jsonGoodsData);
@@ -457,7 +465,7 @@
 				var jsonData = JSON.stringify($('#goodsAdkeywordForm').serializeObject());
 				gagajf.ajaxJsonSubmit($('#goodsAdkeywordForm').prop('action'), jsonData, function() {
 					$('#btnSearch').trigger('click');
-					//fnGetadKeywordGoodsList($('#goodsAdkeywordForm input[name=adKeywordSq]').val());
+					$('#btnNew').trigger('click');
 					
 				});
 			}