Jelajahi Sumber

상품상세 코디 탭 개발

eskim 5 tahun lalu
induk
melakukan
212ac8c771

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

@@ -334,4 +334,20 @@ public interface TsaGoodsDao {
 	 */
 	void saveStock(Option option);
 
+	/**
+	 * 코드상품 저장
+	 * @param codiGoods
+	 * @author eskim
+	 * @since 2020. 10. 28
+	 */
+	void saveCodiGoods(CodiGoods codiGoods);
+
+	/**
+	 * 코드상품 삭제
+	 * @param codiGoods
+	 * @author eskim
+	 * @since 2020. 10. 28
+	 */
+	void deleteCodiGoods(CodiGoods codiGoods);
+
 }

+ 34 - 3
style24.admin/src/main/java/com/style24/admin/biz/service/TsaGoodsService.java

@@ -216,7 +216,7 @@ public class TsaGoodsService {
 	 * @since 2020. 10. 21
 	 */
 	public void getGoodsInfoExcelList(GoodsSearch goodsSearch, String excelFilenameWithPath) {
-		log.info("getGoodsInfoExcelList goodsSearch ={}", goodsSearch);
+
 		if ("Y".equals(goodsSearch.getImageViewYn())) {
 			// 헤더 title 설정
 			String[] listTitles = {"이미지", "상품코드", "업체명", "브랜드명", "상품명", "품목", "재고", "상품상태", "스타일년도", "시즌",
@@ -800,9 +800,10 @@ public class TsaGoodsService {
 			this.saveGoodsDetailDesc(goods);
 		}
 
+		int idx = 1;
 		// 구성상품 변경
 		if (!"G056_N".equals(goods.getGoodsType())) {
-			int idx = 1;
+
 			Collection<GoodsCompose> goodsExtendList = goods.getGoodsComposeListNew();
 			for (GoodsCompose regGoodsExtend : goodsExtendList) {
 				regGoodsExtend.setDispOrd(idx);
@@ -821,6 +822,19 @@ public class TsaGoodsService {
 
 		// 상품 정보고시 변경
 		this.saveGoodsNotiInfo(goods);
+
+		// 코디상품 변경
+		idx = 1;
+		Collection<CodiGoods> codiGoodsList = goods.getCodiGoodsListNew();
+		for (CodiGoods codiGoods : codiGoodsList) {
+			codiGoods.setDispOrd(idx);
+			codiGoods.setDelYn("N");
+			codiGoods.setRegNo(TsaSession.getInfo().getUserNo());
+			codiGoods.setUpdNo(TsaSession.getInfo().getUserNo());
+			goodsDao.saveCodiGoods(codiGoods); // 구성상품기본 저장
+
+			idx++;
+		}
 	}
 
 	/**
@@ -971,7 +985,7 @@ public class TsaGoodsService {
 		stock.setUpdNo(goods.getUpdNo());
 		stock.setRegNo(goods.getRegNo());
 		goodsDao.createStockHst(stock);
-		log.info("[saveStock] goods=>{}",goods);
+
 		for (String optCd : goods.getOptCd()) {
 			Option goodsStock = new Option();
 			goodsStock.setGoodsCd(goods.getCompsGoodsCd()[index]); // 구성상품 코드
@@ -1017,4 +1031,21 @@ public class TsaGoodsService {
 			}
 		}
 	}
+
+	/**
+	 * 코드상품 삭제
+	 *
+	 * @param codiGoodsList
+	 * @author eskim
+	 * @since 2020. 10. 28
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteCodiGoods(Collection<CodiGoods> codiGoodsList) {
+		for (CodiGoods codiGoods : codiGoodsList) {
+			codiGoods.setDelYn("Y");
+			codiGoods.setUpdNo(TsaSession.getInfo().getUserNo());
+			goodsDao.deleteCodiGoods(codiGoods);
+		}
+	}
+
 }

+ 38 - 5
style24.admin/src/main/java/com/style24/admin/biz/web/TsaGoodsController.java

@@ -953,21 +953,54 @@ public class TsaGoodsController extends TsaBaseController {
 
 		Collection<GoodsNotiInfo> notiList = null;
 		Collection<GoodsCompose> goodComposeList = null;
+		Collection<CodiGoods> codiGoodList = null;
 		ObjectMapper mapper = new ObjectMapper();
 		try {
-			notiList = mapper.readValue(goods.getNotiList(), new TypeReference<Collection<GoodsNotiInfo>>() {
-			});
-			goodComposeList = mapper.readValue(goods.getGoodsComposeList(), new TypeReference<Collection<GoodsCompose>>() {
-			});
-
+			if (goods.getNotiList() != null) {
+				notiList = mapper.readValue(goods.getNotiList(), new TypeReference<Collection<GoodsNotiInfo>>() {
+				});
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		try {
+			if (goods.getCodiGoodsList() != null) {
+				codiGoodList = mapper.readValue(goods.getCodiGoodsList(), new TypeReference<Collection<CodiGoods>>() {
+				});
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		try {
+			if (goods.getGoodsComposeList() != null) {
+				goodComposeList = mapper.readValue(goods.getGoodsComposeList(), new TypeReference<Collection<GoodsCompose>>() {
+				});
+			}
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
 
+
 		goods.setNotiListNew(notiList);
 		goods.setGoodsComposeListNew(goodComposeList);
+		goods.setCodiGoodsListNew(codiGoodList);
+		log.info("[saveGoodsDetail] goods = {}", goods);
 		goodsService.saveGoodsDetail(goods);
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 
+	/**
+	 * 코드상품 삭제
+	 *
+	 * @param codiGoodsList
+	 * @author eskim
+	 * @since 2020. 10. 28
+	 */
+	@PostMapping("/codi/delete")
+	@ResponseBody
+	public GagaResponse deleteCodiGoods(@RequestBody Collection<CodiGoods> codiGoodsList) {
+		log.info("codiGoodsList = {}", codiGoodsList);
+		goodsService.deleteCodiGoods(codiGoodsList);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
 }

+ 1 - 0
style24.admin/src/main/java/com/style24/persistence/domain/CodiGoods.java

@@ -18,6 +18,7 @@ public class CodiGoods extends TscBaseDomain {
 	private int dispOrd;
 	private String delYn;
 
+	private String goodsNm;
 	private int currPrice;
 	private String goodsStat;
 	private String formalGb;

+ 3 - 1
style24.admin/src/main/java/com/style24/persistence/domain/Goods.java

@@ -153,9 +153,11 @@ public class Goods extends TscBaseDomain {
 //	private String delvLocCd;
 
 	private Collection<GoodsCompose> goodsComposeListNew; // 상품 구성상품
-
 	private String goodsComposeList; // 상품 구성상품
 
+	private Collection<CodiGoods> codiGoodsListNew; // 코디 상품
+	private String codiGoodsList; // 코디 상품
+
 	// Pagination
 	private TsaPageRequest pageable;
 	private int pageNo = 1;

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

@@ -1439,4 +1439,44 @@
 		      </if>
 	</update>
 	
+	<!-- 코디상품 저장 -->
+	<insert id="saveCodiGoods" parameterType="CodiGoods">
+		/* TsaGoods.saveCodiGoods */
+		INSERT INTO TB_CODI_GOODS (
+		    GOODS_CD
+		  , CODI_GOODS_CD
+		  , DISP_ORD
+		  , DEL_YN
+		  , REG_NO
+		  , REG_DT
+		  , UPD_NO
+		  , UPD_DT
+		) VALUES(
+		    #{goodsCd}
+		  , #{codiGoodsCd}
+		  , #{dispOrd}
+		  , #{delYn}
+		  , #{regNo}
+		  , NOW()
+		  , #{updNo}
+		  , NOW()
+		)
+		ON DUPLICATE KEY UPDATE 
+		      DISP_ORD = #{dispOrd}
+		    , DEL_YN = #{delYn} 
+		    , UPD_NO = #{updNo}
+		    , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 코디상품 삭제 -->
+	<delete id="deleteCodiGoods" parameterType="CodiGoods">
+		/* TsaGoods.deleteCodiGoods */
+		UPDATE TB_CODI_GOODS SET
+		      DEL_YN = #{delYn} 
+		    , UPD_NO = #{updNo}
+		    , UPD_DT = NOW()
+		WHERE GOODS_CD = #{goodsCd}
+		AND CODI_GOODS_CD = #{codiGoodsCd}
+	</delete>
+	
 </mapper>

+ 50 - 27
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html

@@ -33,7 +33,7 @@
 				<input type="hidden" id="niClsfNm" name="niClsfNm" />
 				<input type="hidden" id="uploadGoodsUrl" name="uploadGoodsUrl" th:value="${@environment.getProperty('upload.goods.view')}"/>
 				<input type="hidden" id="goodsType" name="goodsType" />
-				<input type="hidden" id="extmallGoodsPriceList" name="extmallGoodsPriceList" />
+				<input type="hidden" id="codiGoodsList" name="codiGoodsList" />
 				<input type="hidden" id="GoodsComposeList" name="GoodsComposeList" />
 				<table class="frmStyle">
 					<colgroup>
@@ -386,6 +386,9 @@
 							<div class="panelStyle">
 								<!-- 내용 삽입 -->
 								<ul class="panelBar">
+									<li class="left">
+										<button type="button" class="btn btn-danger btn-lg" id="btnCodiGoodsDelete">삭제</button>
+									</li>
 									<li class="right">
 										<button type="button" class="btn btn-default btn-lg" onclick="cfnDownloadSampleFile('SF003');">양식다운로드</button>
 										<button type="button" class="btn btn-success btn-lg" id="btnCodiGoodsExcel">엑셀조회</button>
@@ -403,11 +406,13 @@
 							<!-- TAB6 CONTENTS AREA -->
 							<div class="panelStyle">
 								<!-- 내용 삽입 -->
-								<div class="padB20 aR" id="GoodsComposeBtnArea">
-									<button type="button" class="btn btn-default btn-lg" onclick="cfnDownloadSampleFile('SF003');">양식다운로드</button>
-									<button type="button" class="btn btn-success btn-lg" id="btnGoodsDealSearchExcel">엑셀조회</button>
-									<button type="button" class="btn btn-base btn-lg" onclick="fnOpenGoodsDetailPopup()">상품조회</button>
-								</div>
+								<ul class="panelBar"  id="GoodsComposeBtnArea">
+									<li class="right">
+										<button type="button" class="btn btn-default btn-lg" onclick="cfnDownloadSampleFile('SF003');">양식다운로드</button>
+										<button type="button" class="btn btn-success btn-lg" id="btnGoodsDealSearchExcel">엑셀조회</button>
+										<button type="button" class="btn btn-base btn-lg" onclick="fnOpenGoodsDetailPopup()">상품조회</button>
+									</li>
+								</ul>
 								<div id="gridGoodsComposeList" style="height: 550px;" class="ag-theme-balham lh60"></div>
 								<!-- 내용 삽입 -->
 							</div>
@@ -575,6 +580,7 @@
 	
 	// specify the columns - 코디상품
 	var columnCodiGoodsDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
 		{headerName: "정렬", field: "dispOrd", width: 70 ,hide: false, cellClass: 'text-center',  rowDrag: true },
 		{headerName: "CRUD", field: "crud", width: 75, minWidth: 75, hide: true},
 		//{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
@@ -597,7 +603,7 @@
 			}
 		},
 		{headerName: "상품코드", field: "codiGoodsCd" , width: 130, cellClass: 'text-center'},
-		{headerName: "상품명", field: "goodsNm" , width: 250, cellClass: 'text-left'},
+		{headerName: "상품명", field: "goodsNm" , width: 300, cellClass: 'text-left'},
 		{headerName: "판매가", field: "currPrice" , width: 100, cellClass: 'text-right'
 			,valueFormatter: function(params) { return Number(params.value).addComma();}
 		},
@@ -606,18 +612,11 @@
 			valueFormatter: function (params) { return gagaAgGrid.lookupValue(goodsStatList, params.value); },
 			valueParser: function (params) { return gagaAgGrid.lookupKey(goodsStatList, params.newValue); }
 		},
-		{headerName: "상품명", field: "goodsNm" , width: 180, cellClass: 'text-left'},
 		{headerName: "정상이월구분", field: "formalGb" , width: 100, cellClass: 'text-center',
 			cellEditorParams: { values: gagaAgGrid.extractValues(formalGbList) },
 			valueFormatter: function (params) { return gagaAgGrid.lookupValue(formalGbList, params.value); },
 			valueParser: function (params) { return gagaAgGrid.lookupKey(formalGbList, params.newValue); }
 		},
-		{headerName: "수정일시", field: "updDt", width: 150, cellClass: 'text-center' ,
-			cellRenderer: function(params) {
-				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
-			}
-		},
-		{headerName: "수정자", field: "updNm", width: 100, cellClass: 'text-center'},
 		{headerName: "Master상품코드", field: "goodsCd", width: 150, cellClass: 'text-center', hide: true}
 		
 	];
@@ -1611,27 +1610,20 @@
 					$("#goodsDetailForm input[name=chDataYn]").val('N');
 				}
 				
-				/* var changedPriceData = gagaAgGrid.getChangedData(gridGoodsExtmallPriceOptions);
-				var jsonDataPrice = JSON.stringify(changedPriceData);
-				$('#goodsDetailForm input[name=extmallGoodsPriceList]').val(jsonDataPrice); */
+				// 코디 상품
+				var codiGoodsData = gagaAgGrid.getAllRowData(gridCodiGoodsOptions);
+				var jsonDataCodiGoods = JSON.stringify(codiGoodsData);
+				$('#goodsDetailForm input[name=codiGoodsList]').val(jsonDataCodiGoods);
 				
 				//구성상품
 				var allData = gagaAgGrid.getAllRowData(gridGoodsComposeOptions);
-				//var allData = gagaAgGrid.getChangedData(gridGoodsComposeOptions);
-				/* var changedData = [];
-
-				$.each(allData, function(idx, item) {
-					//item.dispOrd = idx+1;
-					changedData.push(item);
-				}); */
-				
 				var jsonData = JSON.stringify(allData);
 				$('#goodsDetailForm input[name=GoodsComposeList]').val(jsonData);
 				
 				$('#goodsDetailForm input[name=goodsNm]').val($('#goodsDetailForm input[name=goodsNm]').val().trim().replace(/\n|\r/g, "<br/>").replace(/\"/gi, "&quot;").replace(/\'/gi, "&#39;"));
 				$('#goodsDetailForm input[name=goodsTnm]').val($('#goodsDetailForm input[name=goodsTnm]').val().trim().replace(/\n|\r/g, "<br/>").replace(/\"/gi, "&quot;").replace(/\'/gi, "&#39;"));
 				$('#goodsDetailForm input[name=goodsSnm1]').val($('#goodsDetailForm input[name=goodsSnm1]').val().trim().replace(/\n|\r/g, "<br/>").replace(/\"/gi, "&quot;").replace(/\'/gi, "&#39;"));
-
+	
 				gagajf.ajaxFormSubmit("/goods/detail/save", "#goodsDetailForm", fnGoodsSaveCallBack); 
 			}
 		});
@@ -1916,7 +1908,6 @@
 						, dispOrd: idx
 						, delYn: 'N'
 						, goodsStat : goods.goodsStat
-						, useYn: 'Y'
 						, goodsNm : goods.goodsNm
 						, currPrice : goods.currPrice
 						, formalGb : goods.formalGb
@@ -1933,6 +1924,38 @@
 		gridGoodsComposeOptions.api.refreshCells();
 	}
 
+	// 코디 상품 삭제
+	$('#btnCodiGoodsDelete').on('click', function() {
+		var selectedData = gridCodiGoodsOptions.api.getSelectedRows();
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+
+		//화면에서 삭제
+		//var removedData_1 = gagaAgGrid.removeRowData(gridCodiGoodsOptions, false);
+
+		var removedData = gagaAgGrid.removeRowData(gridCodiGoodsOptions, false);
+		
+		if (removedData.length > 0) {
+
+			mcxDialog.confirm('삭제하시겠습니까?', {
+				cancelBtnText: "취소",
+				sureBtnText: "확인",
+				sureBtnClick: function(){
+					var deleteData = [];
+
+					$.each(removedData, function(idx, item) {
+						deleteData.push(item);
+					});
+
+					var jsonData = JSON.stringify(deleteData);
+					gagajf.ajaxJsonSubmit('/goods/codi/delete', jsonData);
+				}
+			});
+		}
+	});
+	
 	//엑셀 상품 조회
 	$('#btnGoodsDealSearchExcel').on('click', function() {
 		cfnExcelUploadPopup('goodsDetailExcelUpload', 'goodsDetailExcelUpload');