Bläddra i källkod

출고처재고연계관리 추가

gagamel 5 år sedan
förälder
incheckning
509b0b28f9

+ 27 - 0
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaBusinessDao.java

@@ -10,6 +10,7 @@ import com.style24.persistence.domain.DeliveryLoc;
 import com.style24.persistence.domain.SellStore;
 import com.style24.persistence.domain.ShipCompany;
 import com.style24.persistence.domain.SiteBrand;
+import com.style24.persistence.domain.StockSyncBase;
 import com.style24.persistence.domain.SupplyCompany;
 
 /**
@@ -138,6 +139,32 @@ public interface TsaBusinessDao {
 	 */
 	void saveDeliveryLoc(DeliveryLoc delvLoc);
 
+	/**
+	 * 재고연계관리 - 출고처 목록
+	 * @param delvLoc - 출고처 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	Collection<DeliveryLoc> getStockSyncDeliveryLocList(DeliveryLoc delvLoc);
+
+	/**
+	 * 재고연계관리 - 재고연계기준 목록
+	 * @param stockSyncBase - 재고연계기준 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	Collection<StockSyncBase> getStockSyncBaseList(StockSyncBase stockSyncBase);
+
+	/**
+	 * 재고연계관리 - 재고연계기준 저장
+	 * @param stockSyncBase - 재고연계기준 정보
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	void saveStockSyncBase(StockSyncBase stockSyncBase);
+
 	/**
 	 * 판매매장 목록
 	 * @param sellStore - 판매매장 정보

+ 18 - 0
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaOcmDao.java

@@ -5,6 +5,7 @@ import java.util.Collection;
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Extmall;
 import com.style24.persistence.domain.ExtmallNoti;
+import com.style24.persistence.domain.ExtmallPriceSync;
 
 /**
  * 영업망관리 Dao
@@ -41,4 +42,21 @@ public interface TsaOcmDao {
 	 */
 	Collection<ExtmallNoti> getExtmallNotiinfoList(ExtmallNoti extmallNoti);
 
+	/**
+	 * 제휴몰가격연계 목록
+	 * @param extmallPriceSync - 제휴몰가격연계 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	Collection<ExtmallPriceSync> getExtmallPriceSyncList(ExtmallPriceSync extmallPriceSync);
+
+	/**
+	 * 제휴몰가격연계 등록/수정
+	 * @param extmallPriceSync - 제휴몰가격연계 정보
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	void saveExtmallPriceSync(ExtmallPriceSync extmallPriceSync);
+
 }

+ 37 - 0
style24.admin/src/main/java/com/style24/admin/biz/service/TsaBusinessService.java

@@ -17,6 +17,7 @@ import com.style24.persistence.domain.DeliveryLoc;
 import com.style24.persistence.domain.SellStore;
 import com.style24.persistence.domain.ShipCompany;
 import com.style24.persistence.domain.SiteBrand;
+import com.style24.persistence.domain.StockSyncBase;
 import com.style24.persistence.domain.SupplyCompany;
 
 import lombok.extern.slf4j.Slf4j;
@@ -179,6 +180,42 @@ public class TsaBusinessService {
 		}
 	}
 
+	/**
+	 * 재고연계관리 - 출고처 목록
+	 * @param delvLoc - 출고처 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	public Collection<DeliveryLoc> getStockSyncDeliveryLocList(DeliveryLoc delvLoc) {
+		return businessDao.getStockSyncDeliveryLocList(delvLoc);
+	}
+
+	/**
+	 * 재고연계관리 - 재고연계기준 목록
+	 * @param stockSyncBase - 재고연계기준 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	public Collection<StockSyncBase> getStockSyncBaseList(StockSyncBase stockSyncBase) {
+		return businessDao.getStockSyncBaseList(stockSyncBase);
+	}
+
+	/**
+	 * 재고연계관리 - 재고연계기준 저장
+	 * @param stockSyncBase - 재고연계기준 정보
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	public void saveStockSyncBaseList(Collection<StockSyncBase> stockSyncBaseList) {
+		for (StockSyncBase stockSyncBase : stockSyncBaseList) {
+			stockSyncBase.setRegNo(TsaSession.getInfo().getUserNo());
+			stockSyncBase.setUpdNo(TsaSession.getInfo().getUserNo());
+			businessDao.saveStockSyncBase(stockSyncBase);
+		}
+	}
+
 	/**
 	 * 판매매장 목록
 	 * @param sellStore - 판매매장 정보

+ 26 - 0
style24.admin/src/main/java/com/style24/admin/biz/service/TsaOcmService.java

@@ -11,6 +11,7 @@ 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.ExtmallPriceSync;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -65,4 +66,29 @@ public class TsaOcmService {
 		return ocmDao.getExtmallNotiinfoList(extmallNoti);
 	}
 
+	/**
+	 * 제휴몰가격연계 목록
+	 * @param extmallPriceSync - 제휴몰가격연계 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	public Collection<ExtmallPriceSync> getExtmallPriceSyncList(ExtmallPriceSync extmallPriceSync) {
+		return ocmDao.getExtmallPriceSyncList(extmallPriceSync);
+	}
+
+	/**
+	 * 제휴몰가격연계 등록/수정
+	 * @param extmallPriceSyncList - 제휴몰가격연계 목록
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	public void saveExtmallPriceSync(Collection<ExtmallPriceSync> extmallPriceSyncList) {
+		for (ExtmallPriceSync extmallPriceSync : extmallPriceSyncList) {
+			extmallPriceSync.setRegNo(TsaSession.getInfo().getUserNo());
+			extmallPriceSync.setUpdNo(TsaSession.getInfo().getUserNo());
+			ocmDao.saveExtmallPriceSync(extmallPriceSync);
+		}
+	}
+
 }

+ 74 - 0
style24.admin/src/main/java/com/style24/admin/biz/web/TsaBusinessController.java

@@ -27,6 +27,7 @@ import com.style24.persistence.domain.DeliveryLoc;
 import com.style24.persistence.domain.SellStore;
 import com.style24.persistence.domain.ShipCompany;
 import com.style24.persistence.domain.SiteBrand;
+import com.style24.persistence.domain.StockSyncBase;
 import com.style24.persistence.domain.SupplyCompany;
 
 import lombok.extern.slf4j.Slf4j;
@@ -313,6 +314,79 @@ public class TsaBusinessController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 
+	/**
+	 * 재고연계관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	@GetMapping("/stock/sync/form")
+	public ModelAndView stockSyncForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 자사공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd(), "Y"));
+
+		// 출고처 분류
+		String[] exceptCds = {"G024_20", "G024_30"};
+		mav.addObject("delvLocClsfList", rendererService.getCommonCodeList("G024", "Y", exceptCds));
+
+		// 정상이월구분
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+
+		mav.setViewName("business/StockSyncForm");
+
+		return mav;
+	}
+
+	/**
+	 * 재고연계관리 - 출고처 목록
+	 * @param delvLoc - 출고처 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	@PostMapping("/stock/sync/delvloc/list")
+	@ResponseBody
+	public Collection<DeliveryLoc> getStockSyncDeliveryLocList(@RequestBody DeliveryLoc delvLoc) {
+		return businessService.getStockSyncDeliveryLocList(delvLoc);
+	}
+
+	/**
+	 * 재고연계관리 - 재고연계기준 목록
+	 * @param supplyCompCd - 공급업체코드
+	 * @param delvLocCd - 출고처코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	@GetMapping("/stock/sync/base/list/{supplyCompCd}/{delvLocCd}")
+	@ResponseBody
+	public Collection<StockSyncBase> getStockSyncBaseList(@PathVariable String supplyCompCd, @PathVariable String delvLocCd) {
+		StockSyncBase stockSyncBase = new StockSyncBase();
+		stockSyncBase.setSupplyCompCd(supplyCompCd);
+		stockSyncBase.setDelvLocCd(delvLocCd);
+		return businessService.getStockSyncBaseList(stockSyncBase);
+	}
+
+	/**
+	 * 재고연계관리 - 재고연계기준 목록 저장 처리
+	 * @param stockSyncBaseList - 재고연계기준 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	@PostMapping("/stock/sync/base/save")
+	@ResponseBody
+	public GagaResponse saveStockSyncBaseList(@RequestBody Collection<StockSyncBase> stockSyncBaseList) {
+		if (stockSyncBaseList == null || stockSyncBaseList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		businessService.saveStockSyncBaseList(stockSyncBaseList);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
 	/**
 	 * 판매매장관리 화면
 	 * @return

+ 54 - 1
style24.admin/src/main/java/com/style24/admin/biz/web/TsaOcmController.java

@@ -18,6 +18,7 @@ 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.ExtmallPriceSync;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -79,7 +80,7 @@ public class TsaOcmController extends TsaBaseController {
 
 	/**
 	 * 제휴몰 등록/수정 처리
-	 * @param extmall - 외부몰 정보
+	 * @param extmall - 제휴몰 정보
 	 * @return
 	 * @author gagamel
 	 * @since 2020. 11. 5
@@ -122,4 +123,56 @@ public class TsaOcmController extends TsaBaseController {
 		return ocmService.getExtmallNotiinfoList(extmallNoti);
 	}
 
+	/**
+	 * 제휴몰가격연계관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	@GetMapping("/extmall/price/sync/form")
+	public ModelAndView extmallPriceSyncForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 제휴몰벤더
+		mav.addObject("vendorList", rendererService.getCommonCodeList("G003", "Y", TsaSession.getInfo().getSupplyCompCd()));
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
+
+		mav.setViewName("ocm/ExtmallPriceSyncForm");
+
+		return mav;
+	}
+
+	/**
+	 * 제휴몰가격연계 목록
+	 * @param extmallPriceSync - 제휴몰가격연계 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	@PostMapping("/extmall/price/sync/list")
+	@ResponseBody
+	public Collection<ExtmallPriceSync> getExtmallPriceSyncList(@RequestBody ExtmallPriceSync extmallPriceSync) {
+		return ocmService.getExtmallPriceSyncList(extmallPriceSync);
+	}
+
+	/**
+	 * 제휴몰가격연계 등록/수정 처리
+	 * @param extmallPriceSyncList - 제휴몰가격연계 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	@PostMapping("/extmall/price/sync/save")
+	@ResponseBody
+	public GagaResponse saveExtmallPriceSync(@RequestBody Collection<ExtmallPriceSync> extmallPriceSyncList) {
+		if (extmallPriceSyncList == null || extmallPriceSyncList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		ocmService.saveExtmallPriceSync(extmallPriceSyncList);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
 }

+ 4 - 0
style24.admin/src/main/java/com/style24/persistence/domain/DeliveryLoc.java

@@ -34,4 +34,8 @@ public class DeliveryLoc extends TscBaseDomain {
 	private String invoicePrintType;	// 송장출력형태(공통코드G025)
 	private String useYn;				// 사용여부
 
+	// 검색조건
+	private String searchGb;
+	private String searchTxt;
+
 }

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

@@ -0,0 +1,23 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 외부몰가격연계 Domain
+ *
+ * @author gagamel
+ * @since 2020. 11. 7
+ */
+@SuppressWarnings("serial")
+@Data
+public class ExtmallPriceSync extends TscBaseDomain {
+
+	private String vendorId;	// 벤더ID
+	private String brandCd;		// 브랜드코드
+	private String brandKnm;	// 브랜드국문명
+	private String brandEnm;	// 브랜드영문명
+	private String syncYn;		// 연계여부
+
+}

+ 31 - 0
style24.admin/src/main/java/com/style24/persistence/domain/StockSyncBase.java

@@ -0,0 +1,31 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 재고연계기준 Domain
+ *
+ * @author gagamel
+ * @since 2020. 11. 7
+ */
+@SuppressWarnings("serial")
+@Data
+public class StockSyncBase extends TscBaseDomain {
+
+	private String delvLocCd;		// 출고처코드
+	private String erpBrandCd;		// ERP브랜드코드
+	private String brandKnm;		// 브랜드국문명
+	private String brandEnm;		// 브랜드영문명
+	private String brandCd;			// 브랜드코드
+	private String formalGb;		// 정상이월구분
+	private String prevStockSyncYn;	// 이전재고연계여부
+	private String stockSyncYn;		// 재고연계여부
+	private String prevDelvSyncYn;	// 이전출고연계여부
+	private String delvSyncYn;		// 출고연계여부
+
+	// 검색조건
+	private String supplyCompCd;	// 공급업체코드
+
+}

+ 88 - 0
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaBusiness.xml

@@ -557,6 +557,94 @@
 		WHERE  BRAND_CD = #{brandCd}
 	</insert>
 	
+	<!-- 재고연계관리 - 출고처 목록 -->
+	<select id="getStockSyncDeliveryLocList" parameterType="DeliveryLoc" resultType="DeliveryLoc">
+		/* TsaBusiness.getStockSyncDeliveryLocList */
+		SELECT SUPPLY_COMP_CD
+		     , DELV_LOC_CD
+		     , DELV_LOC_NM
+		     , DELV_LOC_CLSF
+		     , FN_GET_CODE_NM('G024',DELV_LOC_CLSF) AS DELV_LOC_CLSF_NM
+		FROM   TB_DELIVERY_LOC
+		WHERE  SUPPLY_COMP_CD = #{supplyCompCd}
+		AND    DELV_LOC_CLSF IN ('G024_10','G024_21') /*물류창고,직송매장*/
+		<if test="delvLocClsf != null and delvLocClsf != ''">
+		AND    DELV_LOC_CLSF = #{delvLocClsf}
+		</if>
+		<if test="searchTxt != null and searchTxt != ''">
+		    <if test="searchGb == 'CODE'">
+		AND    DELV_LOC_CD = #{delvLocCd}
+		    </if>
+		    <if test="searchGb == 'NAME'">
+		AND    DELV_LOC_NM like CONCAT('%',#{delvLocNm},'%')
+		    </if>
+		</if>
+		AND    USE_YN = 'Y'
+		ORDER  BY DELV_LOC_NM
+	</select>
+
+	<!-- 재고연계관리 - 재고연계기준 목록 -->
+	<select id="getStockSyncBaseList" parameterType="StockSyncBase" resultType="StockSyncBase">
+		/* TsaBusiness.getStockSyncBaseList */
+		SELECT X.DELV_LOC_CD
+		     , X.BRAND_CD
+		     , X.ERP_BRAND_CD
+		     , X.BRAND_KNM
+		     , X.BRAND_ENM
+		     , IFNULL(Y.STOCK_SYNC_YN,'N') AS PREV_STOCK_SYNC_YN /*이전재고연계여부*/
+		     , IFNULL(Y.STOCK_SYNC_YN,'N') AS STOCK_SYNC_YN      /*재고연계여부*/
+		     , IFNULL(Y.DELV_SYNC_YN,'N')  AS PREV_DELV_SYNC_YN  /*이전출고연계여부*/
+		     , IFNULL(Y.DELV_SYNC_YN,'N')  AS DELV_SYNC_YN       /*출고연계여부*/
+		FROM   (
+		        SELECT A.DELV_LOC_CD
+		             , B.BRAND_CD
+		             , B.ERP_BRAND_CD
+		             , B.BRAND_KNM
+		             , B.BRAND_ENM
+		        FROM   TB_DELIVERY_LOC A
+		             , TB_BRAND B
+		        WHERE  A.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD
+		        AND    A.SUPPLY_COMP_CD = #{supplyCompCd}
+		        AND    A.DELV_LOC_CD = #{delvLocCd}
+		        AND    A.USE_YN = 'Y'
+		       ) X
+		LEFT OUTER JOIN TB_STOCK_SYNC_BASE Y ON X.DELV_LOC_CD = Y.DELV_LOC_CD
+		                                    AND X.BRAND_CD = Y.BRAND_CD
+		ORDER BY X.DELV_LOC_CD, X.BRAND_CD
+	</select>
+
+	<!-- 재고연계관리 - 재고연계기준 저장 -->
+	<insert id="saveStockSyncBase" parameterType="StockSyncBase">
+		/* TsaBusiness.saveStockSyncBase */
+		INSERT INTO TB_STOCK_SYNC_BASE (
+		       DELV_LOC_CD
+		     , BRAND_CD
+		     , FORMAL_GB
+		     , STOCK_SYNC_YN
+		     , DELV_SYNC_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{delvLocCd}
+		     , #{brandCd}
+		     , IFNULL(#{formalGb},'G009_10')
+		     , #{stockSyncYn}
+		     , #{delvSyncYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       STOCK_SYNC_YN = #{stockSyncYn}
+		     , DELV_SYNC_YN = #{delvSyncYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+
 	<!-- 판매매장 목록  -->
 	<select id="getSellStoreList" parameterType="SellStore" resultType="SellStore">
 		/* TsaBusiness.getSellStoreList */

+ 42 - 0
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaOcm.xml

@@ -97,4 +97,46 @@
 		ORDER  BY A.EXTMALL_NI_CLSF_CD, A.EXTMALL_NI_ITEM_CD
 	</select>
 	
+	<!-- 외부몰가격연계 목록 -->
+	<select id="getExtmallPriceSyncList" parameterType="ExtmallPriceSync" resultType="ExtmallPriceSync">
+		/* TsaOcm.getExtmallPriceSyncList */
+		SELECT #{vendorId}           AS VENDOR_ID /*벤더ID*/
+		     , A.BRAND_CD                         /*브랜드코드*/
+		     , A.BRAND_KNM                        /*브랜드국문명*/
+		     , A.BRAND_ENM                        /*브랜드영문명*/
+		     , IFNULL(B.SYNC_YN,'N') AS SYNC_YN   /*연계여부*/
+		FROM   TB_BRAND A
+		LEFT OUTER JOIN TB_EXTMALL_PRICE_SYNC B ON A.BRAND_CD = B.BRAND_CD
+		                                       AND B.VENDOR_ID = #{vendorId}
+		WHERE  A.SELF_YN = 'Y' /*자사브랜드만*/
+		ORDER  BY 1, 2
+	</select>
+	
+	<!-- 외부몰가격연계 등록/수정 -->
+	<insert id="saveExtmallPriceSync" parameterType="ExtmallPriceSync">
+		/* TsaOcm.saveExtmallPriceSync */
+		INSERT INTO TB_EXTMALL_PRICE_SYNC (
+		       VENDOR_ID
+		     , BRAND_CD
+		     , SYNC_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{vendorId}
+		     , #{brandCd}
+		     , #{syncYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       SYNC_YN = #{syncYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
 </mapper>

+ 2 - 2
style24.admin/src/main/webapp/WEB-INF/views/business/MdListForm.html

@@ -74,8 +74,8 @@
 
 	let gridOptionsMdList = gagaAgGrid.getGridOptions(columnDefsMdList);
 
-	// Cell click
-	gridOptionsMdList.onCellDoubleClicked = function(event) {
+	// Row double click
+	gridOptionsMdList.onRowDoubleClicked = function(event) {
 		$('#btnConfirmMd').trigger('click');
 	}
 

+ 214 - 0
style24.admin/src/main/webapp/WEB-INF/views/business/StockSyncForm.html

@@ -0,0 +1,214 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : StockSyncForm.html
+ * @desc    : 출고처재고연계관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.11.07   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<!-- Search -->
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/business/stock/sync/delvloc/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>공급업체</th>
+						<td>
+							<select name="supplyCompCd">
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>출고처분류</th>
+						<td>
+							<select name="delvLocClsf">
+								<option value="">[전체]</option>
+								<option th:if="${delvLocClsfList}" th:each="oneData, status : ${delvLocClsfList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>검색어</th>
+						<td>
+							<select name="searchGb">
+								<option value="CODE">출고처코드</option>
+								<option value="NAME">출고처명</option>
+							</select>
+							<input type="text" name="searchTxt" class="w200" maxlength="20"/>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- //검색조건 영역 -->
+		
+		<div class="panelStyle">
+			<!-- 다중 TABLE 배치 -->
+			<ul class="division">
+				<li style="width: 30%">
+					<div class="panelBar">
+						<h4>출고처</h4>
+					</div>
+					<div id="gridList1" style="width: 100%; height: 570px" class="ag-theme-balham"></div>
+				</li>
+				<li>
+					<ul class="panelBar">
+						<li>
+							<h4 id="grid2Title">재고연계</h4>
+						</li>
+						<li class="right">
+							<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+						</li>
+					</ul>
+					<div id="gridList2" style="width: 100%; height: 570px" class="ag-theme-balham"></div>
+				</li>
+			</ul>
+			<!--//다중 TABLE 배치 -->
+		</div>
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let delvLocClsfList = gagajf.convertToArray([[${delvLocClsfList}]]);
+	let formalGbList = gagajf.convertToArray([[${formalGbList}]]);
+	
+	// specify the columns
+	let columnDefs1 = [
+		{headerName: "공급업체코드", field: "supplyCompCd", width: 100, cellClass: 'text-center', hide: true},
+		{
+			headerName: "출고처코드", field: "delvLocCd", width: 100, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "출고처명", field: "delvLocNm", width: 150, cellClass: 'text-center'},
+		{
+			headerName: "출고처분류", field: "delvLocClsf", width: 120, cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(delvLocClsfList, params.data.delvLocClsf);
+			}
+		}
+	];
+	
+	let columnDefs2 = [
+		{headerName: "CRUD", field: "crud", width: 75, hide: true},
+		{headerName: "출고처코드", field: "delvLocCd", hide: true},
+		{headerName: "브랜드코드", field: "brandCd", width: 100, cellClass: 'text-center'},
+		{headerName: "브랜드국문명", field: "brandKnm", width: 150, cellClass: 'text-center' },
+		{headerName: "브랜드영문명", field: "brandEnm", width: 150, cellClass: 'text-center' },
+		{headerName: "ERP브랜드", field: "erpBrandCd", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "정상이월구분", field: "formalGb", width: 110, cellClass: 'text-center', hide: true,
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(formalGbList, params.data.formalGb);
+			}
+		},
+		{headerName: "이전재고연계", field: "prevStockSyncYn", width: 120, cellClass: 'text-center', hide: true},
+		{
+			headerName: "재고연계", field: "stockSyncYn", width: 120, cellClass: 'text-center',
+			headerComponent: 'ComboboxHeaderComponent', cellRenderer: 'ComboboxCellRenderer', filter: false, editable: false
+		},
+		{headerName: "이전출고지정", field: "prevDelvSyncYn", width: 120, cellClass: 'text-center', hide: true},
+		{
+			headerName: "출고지정", field: "delvSyncYn", width: 120, cellClass: 'text-center',
+			headerComponent: 'ComboboxHeaderComponent', cellRenderer: 'ComboboxCellRenderer', filter: false, editable: false
+		}
+	];
+	
+	// Get GridOptions
+	let gridOptions1 = gagaAgGrid.getGridOptions(columnDefs1);
+	let gridOptions2 = gagaAgGrid.getGridOptions(columnDefs2);
+	
+	// 중복 선택 가능
+	gridOptions2.rowSelection = 'multiple';
+	
+	// Cell Click
+	let delvData = '';
+	gridOptions1.onCellClicked = function(event) {
+		if (event.colDef.field != 'delvLocCd')
+			return;
+
+		delvData = event.data;
+		fnGetStockSyncBaseList();
+	}
+	
+	// 출고처 조회
+	$('#btnSearch').on('click', function() {
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions1, '#searchForm');
+	});
+	
+	var fnGetStockSyncBaseList = function() {
+		$('#grid2Title').html('[' + delvData.delvLocNm + '] 재고연계');
+		let actionUrl = "/business/stock/sync/base/list/" + delvData.supplyCompCd + '/' + delvData.delvLocCd;
+		gagaAgGrid.fetch(actionUrl, gridOptions2);
+	}
+	
+	// 저장
+	$('#btnSave').on('click', function() {
+		// 전체 데이터
+		var allData = gagaAgGrid.getAllRowData(gridOptions2);
+		
+		var changedData = [];
+		allData.forEach(function(item, index) {
+			if (item.prevStockSyncYn != item.stockSyncYn || item.prevDelvSyncYn != item.delvSyncYn) {
+				changedData.push(item);
+			}
+		});
+		
+		if (changedData.length == 0) {
+			mcxDialog.alert('변경된 데이터가 없습니다.');
+			return;
+		}
+		
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(changedData);
+				gagajf.ajaxJsonSubmit('/business/stock/sync/base/save', jsonData, function() {
+					fnGetStockSyncBaseList();
+				});
+			}
+		});
+	});
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList1', gridOptions1);
+		gagaAgGrid.createGrid('gridList2', gridOptions2);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 144 - 0
style24.admin/src/main/webapp/WEB-INF/views/ocm/ExtmallPriceSyncForm.html

@@ -0,0 +1,144 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : ExtmallPriceSyncForm.html
+ * @desc    : 제휴몰가격연계관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.11.07   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/ocm/extmall/price/sync/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>제휴몰벤더</th>
+						<td>
+							<select name="vendorId">
+								<option th:if="${vendorList}" th:each="oneData, status : ${vendorList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li>
+					<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>"연계여부" 항목을 변경 후 저장할 수 있습니다.</span>
+				</li>
+				<li class="right">
+					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+			
+			<div id="gridList" style="width: 100%; height: 570px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let vendorList = gagajf.convertToArray([[${vendorList}]]);
+	let ynList = { "Y":"Yes", "N":"No" };
+
+	let columnDefs = [
+		{headerName: "CRUD", field: "crud", width: 75, hide: true},
+		{
+			headerName: "제휴몰벤더", field: "vendorId", width: 200, cellClass: 'text-center',
+			valueGetter: function (params) { return gagaAgGrid.lookupValue(vendorList, params.data.vendorId); }
+		},
+		{headerName: "브랜드코드", field: "brandCd", width: 100, cellClass: 'text-center'},
+		{headerName: "브랜드국문명", field: "brandKnm", width: 200, cellClass: 'text-center'},
+		{headerName: "브랜드영문명", field: "brandEnm", width: 200, cellClass: 'text-center'},
+		{
+			headerName: "연계여부", field: "syncYn", width: 100, cellClass: 'text-center',
+			editable: true, cellEditor: 'agRichSelectCellEditor',
+			cellStyle: { color: '#fffff', 'background-color': '#aaaaff' },
+			cellEditorParams: { values: gagaAgGrid.extractValues(ynList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(ynList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(ynList, params.newValue); }
+		}
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 검색
+	$('#btnSearch').on('click', function() {
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+	
+	// 저장
+	$('#btnSave').on('click', function() {
+		// 변경된 데이터
+		var changedData = gagaAgGrid.getChangedData(gridOptions);
+		
+		if (changedData.length == 0) {
+			mcxDialog.alert('변경된 데이터가 없습니다.');
+			return;
+		}
+		
+		// Validation
+		if (!gagaAgGrid.validation(gridOptions, changedData))
+			return;
+		
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(changedData);
+				gagajf.ajaxJsonSubmit('/ocm/extmall/price/sync/save', jsonData, function() {
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('제휴몰가격연계 목록', gridOptions);
+	});
+
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>