ソースを参照

품목카테고리관리 구현

gagamel 5 年 前
コミット
450c9256ca

+ 35 - 0
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaDisplayDao.java

@@ -4,6 +4,7 @@ import java.util.Collection;
 
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Category;
+import com.style24.persistence.domain.ItemkindCategory;
 
 /**
  * 전시 Dao
@@ -85,4 +86,38 @@ public interface TsaDisplayDao {
 	 */
 	void createCategory4Srch();
 
+	/**
+	 * 카테고리구분 목록
+	 * @param cateGb - 카테고리구분
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 6
+	 */
+	Collection<Category> getCategoryGbList(String cateGb);
+
+	/**
+	 * 품목카테고리매핑 저장
+	 * @param itemkindCate - 품목카테고리 정보
+	 * @author gagamel
+	 * @since 2021. 1. 6
+	 */
+	void saveItemkindCategoryMapping(ItemkindCategory itemkindCate);
+
+	/**
+	 * 품목카테고리매핑 삭제
+	 * @param itemkindCate - 품목카테고리 정보
+	 * @author gagamel
+	 * @since 2021. 1. 6
+	 */
+	void deleteItemkindCategoryMapping(ItemkindCategory itemkindCate);
+
+	/**
+	 * 품목카테고리매핑 목록
+	 * @param itemkindCd - 품목코드
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 5
+	 */
+	Collection<ItemkindCategory> getItemkindCategoryMappingList(String itemkindCd);
+
 }

+ 50 - 0
style24.admin/src/main/java/com/style24/admin/biz/service/TsaDisplayService.java

@@ -10,6 +10,7 @@ import org.springframework.transaction.annotation.Transactional;
 import com.style24.admin.biz.dao.TsaDisplayDao;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.persistence.domain.Category;
+import com.style24.persistence.domain.ItemkindCategory;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -98,4 +99,53 @@ public class TsaDisplayService {
 		displayDao.createCategory4Srch();
 	}
 
+	/**
+	 * 카테고리구분 목록
+	 * @param cateGb - 카테고리구분
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 6
+	 */
+	public Collection<Category> getCategoryGbList(String cateGb) {
+		return displayDao.getCategoryGbList(cateGb);
+	}
+
+	/**
+	 * 품목카테고리매핑 저장
+	 * @param itemkindCateList - 품목카테고리 목록
+	 * @author gagamel
+	 * @since 2021. 1. 6
+	 */
+	@Transactional("shopTxnManager")
+	public void saveItemkindCategoryMappingList(Collection<ItemkindCategory> itemkindCateList) {
+		for (ItemkindCategory itemkindCate : itemkindCateList) {
+			itemkindCate.setRegNo(TsaSession.getInfo().getUserNo());
+			displayDao.saveItemkindCategoryMapping(itemkindCate);
+		}
+	}
+
+	/**
+	 * 품목카테고리매핑 삭제
+	 * @param itemkindCateList - 품목카테고리 목록
+	 * @author gagamel
+	 * @since 2021. 1. 6
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteItemkindCategoryMappingList(Collection<ItemkindCategory> itemkindCateList) {
+		for (ItemkindCategory itemkindCate : itemkindCateList) {
+			displayDao.deleteItemkindCategoryMapping(itemkindCate);
+		}
+	}
+
+	/**
+	 * 품목카테고리매핑 목록
+	 * @param itemkindCd - 품목코드
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 5
+	 */
+	public Collection<ItemkindCategory> getItemkindCategoryMappingList(String itemkindCd) {
+		return displayDao.getItemkindCategoryMappingList(itemkindCd);
+	}
+
 }

+ 86 - 0
style24.admin/src/main/java/com/style24/admin/biz/web/TsaDisplayController.java

@@ -5,6 +5,7 @@ import java.util.Collection;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -16,6 +17,7 @@ import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.Category;
+import com.style24.persistence.domain.ItemkindCategory;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -102,4 +104,88 @@ public class TsaDisplayController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0010"));
 	}
 
+	/**
+	 * 품목카테고리매핑관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 5
+	 */
+	@GetMapping("/itemkind/category/mapping/form")
+	public ModelAndView itemkindCategoryMappingForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 카테고리구분
+		mav.addObject("cateGbList", rendererService.getAvailCommonCodeList("G032"));
+
+		// 카테고리유형
+		mav.addObject("cateTypeList", rendererService.getAvailCommonCodeList("G031"));
+
+		mav.setViewName("display/ItemkindCategoryForm");
+
+		return mav;
+	}
+
+	/**
+	 * 카테고리구분 목록
+	 * @param cateGb - 카테고리구분
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 6
+	 */
+	@GetMapping("/category/gb/list/{cateGb}")
+	@ResponseBody
+	public Collection<Category> getCategoryGbList(@PathVariable String cateGb) {
+		return displayService.getCategoryGbList(cateGb);
+	}
+
+	/**
+	 * 품목카테고리매핑 저장
+	 * @param itemkindCateList - 품목카테고리 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 6
+	 */
+	@PostMapping("/itemkind/category/mapping/save")
+	@ResponseBody
+	public GagaResponse saveItemkindCategoryMappingList(@RequestBody Collection<ItemkindCategory> itemkindCateList) {
+		if (itemkindCateList == null || itemkindCateList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		displayService.saveItemkindCategoryMappingList(itemkindCateList);
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 품목카테고리매핑 삭제
+	 * @param itemkindCateList - 품목카테고리 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 6
+	 */
+	@PostMapping("/itemkind/category/mapping/delete")
+	@ResponseBody
+	public GagaResponse deleteItemkindCategoryMappingList(@RequestBody Collection<ItemkindCategory> itemkindCateList) {
+		if (itemkindCateList == null || itemkindCateList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1004"));
+		}
+
+		displayService.deleteItemkindCategoryMappingList(itemkindCateList);
+
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
+	/**
+	 * 품목카테고리매핑 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 5
+	 */
+	@GetMapping("/itemkind/category/mapping/list/{itemkindCd}")
+	@ResponseBody
+	public Collection<ItemkindCategory> getItemkindCategoryMappingList(@PathVariable String itemkindCd) {
+		return displayService.getItemkindCategoryMappingList(itemkindCd);
+	}
+
 }

+ 28 - 31
style24.admin/src/main/java/com/style24/persistence/domain/Category.java

@@ -14,41 +14,38 @@ import lombok.Data;
 @Data
 public class Category extends TscBaseDomain {
 
-	private Integer cateNo;
-	private String cateType;
-//	private String upperCateCode;
-	private String cateNm;
-	private Integer clsLvl;
-
-	private Integer dispOrd;
-	private String dispYn;
-	private String useYn;
-	private String cateGb;
-	private String formalGb;
-	private String leafYn;
-	private String contentsLoc;
-//	private String treePath;
+	private Integer cateNo;		// 카테고리번호
+	private String cateNm;		// 카테고리명
+	private String cateGb;		// 카테고리구분
+	private String cateType;	// 카테고리유형
+	private Integer cate1No;	// 카테고리1번호
+	private String cate1Nm;		// 카테고리1명
+	private Integer cate2No;	// 카테고리2번호
+	private String cate2Nm;		// 카테고리2명
+	private Integer cate3No;	// 카테고리3번호
+	private String cate3Nm;		// 카테고리3명
+	private Integer cate4No;	// 카테고리4번호
+	private String cate4Nm;		// 카테고리4명
+	private Integer cate5No;	// 카테고리5번호
+	private String cate5Nm;		// 카테고리5명
+	private String leafYn;		// 단말여부
+	private String formalGb;	// 정상이월구분
+	private String contentsLoc;	// 컨텐츠위치
+	private Integer dispOrd;	// 표시순서
+	private String dispYn;		// 노출여부
+	private String useYn;		// 사용여부
 
 //	private String clocPrefix;      // 메인전시 컨텐츠 위치 프리픽스
-//
-//	private String fullCateCd;
-//	private String fullCateNm;
-//
 //	private String brandGrpNm;
-//
-	private Integer cate1No;
-	private String cate1Nm;
-	private Integer cate2No;
-	private String cate2Nm;
-	private Integer cate3No;
-	private String cate3Nm;
-	private Integer cate4No;
-	private String cate4Nm;
-	private Integer cate5No;
-	private String cate5Nm;
 
 	// 검색조건
-	private String siteCd;
-	private Integer selLvl;
+	private String siteCd;		// 사이트코드
+	private Integer selLvl;		// 선택레벨
+
+	// 품목카테고리매핑관리 화면에서 사용
+	private String fullCateNo;	// FULL카테고리번호
+	private String fullCateNm;	// FULL카테고리명
+	private Integer clsLvl;		// 분류레벨
+	private String treePath;	// AG-GRID트리패스(ag-Grid미사용시 필요 없음)
 
 }

+ 23 - 0
style24.admin/src/main/java/com/style24/persistence/domain/ItemkindCategory.java

@@ -0,0 +1,23 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 품목카테고리 Domain
+ *
+ * @author gagamel
+ * @since 2021. 1. 5
+ */
+@SuppressWarnings("serial")
+@Data
+public class ItemkindCategory extends TscBaseDomain {
+
+	private String itemkindCd;	// 품목코드
+	private String cateGb;		// 카테고리구분
+	private Integer cateNo;		// 카테고리번호
+	private String fullCateNo;	// FULL카테고리번호
+	private String fullCateNm;	// FULL카테고리명
+
+}

+ 66 - 0
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml

@@ -449,4 +449,70 @@
 		FROM   VW_CATE_4SRCH
 	</insert>
 	
+	<!-- 카테고리구분 목록 -->
+	<select id="getCategoryGbList" parameterType="String" resultType="Category">
+		/* TsaDisplay.getCategoryGbList */
+		SELECT CATE_GB                                        /*카테고리구분*/
+		     , LEAF_CATE_NO                    AS CATE_NO     /*카테고리번호*/
+		     , CASE WHEN LEAF_CATE_NO = CATE5_NO THEN CATE5_NM
+		            WHEN LEAF_CATE_NO = CATE4_NO THEN CATE4_NM
+		            WHEN LEAF_CATE_NO = CATE3_NO THEN CATE3_NM
+		            WHEN LEAF_CATE_NO = CATE2_NO THEN CATE2_NM
+		            WHEN LEAF_CATE_NO = CATE1_NO THEN CATE1_NM
+		       END                             AS CATE_NM     /*카테고리명*/
+		     , FULL_CATE_NO                                   /*FULL카테고리번호*/
+		     , FULL_CATE_NM                                   /*FULL카테고리명*/
+		     , CATE_TYPE                                      /*카테고리유형*/
+		     , CASE WHEN LEAF_CATE_NO = CATE5_NO THEN 5
+		            WHEN LEAF_CATE_NO = CATE4_NO THEN 4
+		            WHEN LEAF_CATE_NO = CATE3_NO THEN 3
+		            WHEN LEAF_CATE_NO = CATE2_NO THEN 2
+		            WHEN LEAF_CATE_NO = CATE1_NO THEN 1
+		       END                             AS CLS_LVL     /*분류레벨*/
+		     , REPLACE(FULL_CATE_NO,' > ','/') AS TREE_PATH   /*AG-GRID트리패스(ag-Grid미사용시 필요 없음)*/
+		FROM   TB_CATE_4SRCH C4
+		WHERE  CATE_GB = #{cateGb}
+		ORDER  BY DISP_ORD
+	</select>
+	
+	<!-- 품목카테고리매핑 저장  -->
+	<insert id="saveItemkindCategoryMapping" parameterType="ItemkindCategory" >
+		/* TsaDisplay.saveItemkindCategoryMapping */
+		INSERT INTO TB_ITEMKIND_CATE (
+		       ITEMKIND_CD
+		     , CATE_NO
+		     , REG_NO
+		     , REG_DT
+		)
+		VALUES (
+		       #{itemkindCd}
+		     , #{cateNo}
+		     , #{regNo}
+		     , NOW()
+		)
+	</insert>
+
+	<!-- 품목카테고리매핑 삭제  -->
+	<delete id="deleteItemkindCategoryMapping" parameterType="ItemkindCategory">
+		/* TsaDisplay.deleteItemkindCategoryMapping */
+		DELETE FROM TB_ITEMKIND_CATE
+		WHERE  ITEMKIND_CD = #{itemkindCd}
+		AND    CATE_NO = #{cateNo}
+	</delete>
+	
+	<!-- 품목카테고리매핑 목록 -->
+	<select id="getItemkindCategoryMappingList" parameterType="String" resultType="ItemkindCategory">
+		/* TsaDisplay.getItemkindCategoryMappingList */
+		SELECT IC.ITEMKIND_CD             /*품목코드*/
+		     , C4.CATE_GB                 /*카테고리구분*/
+		     , C4.LEAF_CATE_NO AS CATE_NO /*카테고리번호*/
+		     , C4.FULL_CATE_NO            /*FULL카테고리번호*/
+		     , C4.FULL_CATE_NM            /*FULL카테고리명*/
+		FROM   TB_ITEMKIND_CATE IC
+		     , TB_CATE_4SRCH C4
+		WHERE  IC.CATE_NO = C4.LEAF_CATE_NO
+		AND    IC.ITEMKIND_CD = #{itemkindCd}
+		ORDER  BY C4.CATE_GB, C4.LEAF_CATE_NO
+	</select>
+	
 </mapper>

+ 293 - 0
style24.admin/src/main/webapp/WEB-INF/views/display/ItemkindCategoryForm.html

@@ -0,0 +1,293 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : ItemkindCategoryForm.html
+ * @desc    : 품목카테고리관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.06   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<div class="panelStyle">
+			<!-- 다중 TABLE 배치 -->
+			<ul class="division">
+				<li style="width: 40%">
+					<form id="searchForm" name="searchForm" action="#" th:action="@{'/goods/itemkind/base/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+						<ul class="panelBar">
+							<li>
+								<h4 class="marR10">품목 목록</h4>
+								<input type="text" class="w300" name="itemkindNm" placeholder="품목명" maxlength="50"/>
+								<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+							</li>
+						</ul>
+					</form>
+					<div id="gridList1" style="width: 100%; height: 670px" class="ag-theme-balham"></div>
+				</li>
+				<li style="width: 60%">
+					<form id="searchForm2" name="searchForm2" action="#" th:action="@{'/display/category/gb/list'}">
+						<ul class="panelBar">
+							<li>
+								<h4 class="marR10">카테고리 목록</h4>
+								<select name="cateGb">
+									<option value="">[카테고리구분]</option>
+									<option th:if="${cateGbList}" th:each="oneData, status : ${cateGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+								</select>
+								<button type="button" class="btn btn-info btn-lg" id="btnApply">품목카테고리매핑 목록에 추가</button>
+							</li>
+						</ul>
+					</form>
+					<div id="gridList2" style="width: 100%; height: 340px" class="ag-theme-balham"></div>
+					
+					<ul class="panelBar">
+						<li>
+							<h4>품목카테고리매핑 목록<span id="itemkindCd" style="display: none;"></span></h4>
+						</li>
+						<li class="right">
+							<button type="button" class="btn btn-danger btn-lg" id="btnDelete">삭제</button>
+							<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+						</li>
+					</ul>
+					<div id="gridList3" style="width: 100%; height: 270px" class="ag-theme-balham"></div>
+				</li>
+			</ul>
+		</div>
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let cateGbList = gagajf.convertToArray([[${cateGbList}]]);
+	let cateTypeList = gagajf.convertToArray([[${cateTypeList}]]);
+
+	let columnDefs1 = [
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{
+			headerName: "품목코드", field: "itemkindCd", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
+		{headerName: "품목명", field: "itemkindNm", width: 300}
+	];
+	
+	let columnDefs2 = [
+		{headerName: "카데고리명", field: "cateNm", width: 150, cellClass: 'text-center'},
+		{
+			headerName: "카테고리유형", field: "cateType", width: 200, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.lookupValue(cateTypeList, params.value); }
+		},
+		{headerName: "카테고리구분", field: "cateGb", hide: true},
+		{headerName: "분류레벨", field: "clsLvl", hide: true},
+		{headerName: "FULL카테고리번호", field: "fullCateNo", hide: true},
+		{headerName: "FULL카테고리명", field: "fullCateNm", hide: true}
+	];
+	
+	let columnDefs3 = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "CRUD", field: "crud", width: 75, cellClass: 'text-center', hide: true},
+		{headerName: "품목코드", field: "itemkindCd", cellClass: 'text-center', hide: true},
+		{
+			headerName: "카테고리구분", field: "cateGb", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.lookupValue(cateGbList, params.value); }
+		},
+		{headerName: "카테고리번호", field: "cateNo", width: 150, cellClass: 'text-center'},
+		{headerName: "FULL카테고리번호", field: "fullCateNo", width: 200},
+		{headerName: "FULL카테고리명", field: "fullCateNm", width: 400}
+	];
+	
+	let gridOptions1 = gagaAgGrid.getGridOptions(columnDefs1);
+	let gridOptions2 = gagaAgGrid.getGridOptions(columnDefs2);
+	let gridOptions3 = gagaAgGrid.getGridOptions(columnDefs3);
+	
+	// Add on options
+	gridOptions2.suppressRowClickSelection = true;
+	gridOptions2.rowSelection = 'multiple';
+	gridOptions2.treeData = true; // enable Tree Data mode
+	gridOptions2.groupDefaultExpanded = -1; // expand all groups by default
+	gridOptions2.getDataPath = function(data) { // just return the hierarchy, no conversion required
+		return data.treePath.split("/");
+	};
+	gridOptions2.autoGroupColumnDef = {
+		headerName: "카데고리번호", field: "cateNo", width: 200,
+		cellRendererParams: {
+			suppressCount: true, // 하위의 항목 건수 표시 안 함
+			checkbox: function (params) {
+				if (!gagajf.isNull(params.data)) {
+					return true;
+				}
+			}
+		}
+	};
+	
+	gridOptions3.rowSelection = 'multiple';
+	
+	// Cell click
+	gridOptions1.onCellClicked = function(event) {
+		if (event.colDef.field != 'itemkindCd') {
+			return;
+		}
+		
+		// 품목카테고리매핑 조회
+		fnSearchItemkindCategoryMapping(event.data.itemkindCd);
+	}
+
+	// 검색 버튼 클릭 시
+	$('#btnSearch').on('click', function() {
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions1, '#searchForm');
+	});
+	
+	// 카테고리구분 변경 시
+	$('select[name=cateGb]').on('change', function() {
+		if (gagajf.isNull($(this).val())) {
+			mcxDialog.alert("카테고리구분을 선택해 주세요.");
+			$(this).focus();
+			return false;
+		}
+		
+		let actionUrl = $('#searchForm2').prop('action') + '/' + $(this).val();
+		gagaAgGrid.fetch(actionUrl, gridOptions2);
+	});
+	
+	// 적용 버튼 클릭 시
+	$('#btnApply').on('click', function() {
+		if (gagajf.isNull($('#itemkindCd').val())) {
+			mcxDialog.alert("선택된 품목이 없습니다. 먼저 품목 목록을 조회하고 [품목코드]를 선택 후 진행해 주세요.");
+			return false;
+		}
+		
+		let selectedData = gridOptions2.api.getSelectedRows();
+		
+		if (selectedData.length == 0) {
+			mcxDialog.alert("선택된 데이터가 없습니다.");
+			return false;
+		}
+		
+		var applyData = [];
+		
+		selectedData.forEach(function(item) {
+			if (item.clsLvl >= 3) {
+				applyData.push(item);
+			}
+		});
+		
+		fnAddCategory(applyData);
+	});
+	
+	// 선택된 카테고리를 품목카테고리매핑 그리드에 추가
+	var fnAddCategory = function(cateData) {
+		var isExist = false;
+		
+		cateData.forEach(function(item) {
+			isExist = false;
+			
+			gridOptions3.api.forEachNode(function(rowNode, index) {
+				if (item.cateNo == rowNode.data.cateNo) {
+					isExist = true;
+				}
+			});
+			
+			if (!isExist) {
+				var data = {
+						cateGb : item.cateGb,
+						cateNo : item.cateNo,
+						fullCateNo : item.fullCateNo,
+						fullCateNm : item.fullCateNm,
+						itemkindCd : $('#itemkindCd').val()
+				};
+				
+				gagaAgGrid.addRowData(gridOptions3, data, "cateNo");
+			}
+		});
+	}
+	
+	// 품목카테고리매핑 조회
+	var fnSearchItemkindCategoryMapping = function(itemkindCd) {
+		$('#itemkindCd').val(itemkindCd);
+		
+		let actionUrl = "/display/itemkind/category/mapping/list/" + itemkindCd;
+		gagaAgGrid.fetch(actionUrl, gridOptions3);
+	}
+	
+	// 품목카테고리매핑 삭제
+	$('#btnDelete').on('click', function() {
+		// 추가된 ROW만 삭제하는 경우 DB 처리를 하지 않도록
+		let selectedData = gagaAgGrid.selectedRowData(gridOptions3);
+		let iTotCnt = 0;
+		let iCnt = 0;
+		selectedData.forEach(function(item, idx) {
+			iTotCnt++;
+			if (item.crud == "C") {
+				gridOptions3.api.updateRowData({remove: [item]});
+				iCnt ++;
+			}
+		});
+		if (iTotCnt > 0 && iTotCnt == iCnt) { return; }
+		// 추가된 ROW만 삭제하는 경우 DB 처리를 하지 않도록
+		
+		var removedData = gagaAgGrid.removeRowData(gridOptions3);
+		
+		if (removedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		mcxDialog.confirm('삭제하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(removedData);
+				gagajf.ajaxJsonSubmit('/display/itemkind/category/mapping/delete', jsonData, function() {
+					// 품목카테고리매핑 조회
+					fnSearchItemkindCategoryMapping($('#itemkindCd').val());
+				});
+			}
+		});
+	});
+	
+	// 품목카테고리매핑 저장
+	$('#btnSave').on('click', function() {
+		// 변경된 데이터
+		var changedData = gagaAgGrid.getChangedData(gridOptions3);
+		
+		if (changedData.length == 0) {
+			mcxDialog.alert('변경된 데이터가 없습니다.');
+			return;
+		}
+		
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var jsonData = JSON.stringify(changedData);
+				gagajf.ajaxJsonSubmit('/display/itemkind/category/mapping/save', jsonData, function() {
+					// 품목카테고리매핑 조회
+					fnSearchItemkindCategoryMapping($('#itemkindCd').val());
+				});
+			}
+		});
+	});
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList1', gridOptions1);
+		gagaAgGrid.createGrid('gridList2', gridOptions2);
+		gagaAgGrid.createGrid('gridList3', gridOptions3);
+	});
+/*]]>*/
+</script>
+
+</html>