فهرست منبع

브랜드관리 관련 추가

gagamel 5 سال پیش
والد
کامیت
f034d7235f
18فایلهای تغییر یافته به همراه1547 افزوده شده و 946 حذف شده
  1. 61 10
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaBusinessDao.java
  2. 11 9
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaRendererDao.java
  3. 78 11
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaBusinessService.java
  4. 38 25
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaRendererService.java
  5. 167 2
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaBusinessController.java
  6. 28 15
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaRendererController.java
  7. 0 20
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaSystemController.java
  8. 32 18
      style24.admin/src/main/java/com/style24/persistence/domain/Brand.java
  9. 25 0
      style24.admin/src/main/java/com/style24/persistence/domain/BrandMd.java
  10. 23 0
      style24.admin/src/main/java/com/style24/persistence/domain/SiteBrand.java
  11. 168 54
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaBusiness.xml
  12. 2 2
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaRenderer.xml
  13. 746 0
      style24.admin/src/main/webapp/WEB-INF/views/business/BrandForm.html
  14. 128 0
      style24.admin/src/main/webapp/WEB-INF/views/business/MdListForm.html
  15. 0 560
      style24.admin/src/main/webapp/WEB-INF/views/system/SitePolicyForm.html
  16. 0 180
      style24.admin/src/main/webapp/WEB-INF/views/system/UserListForm.html
  17. 11 11
      style24.admin/src/main/webapp/ux/js/admin.popup.js
  18. 29 29
      style24.core/src/main/java/com/style24/core/biz/service/TscEnvsetService.java

+ 61 - 10
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaBusinessDao.java

@@ -5,9 +5,11 @@ import java.util.Collection;
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Aflink;
 import com.style24.persistence.domain.Brand;
+import com.style24.persistence.domain.BrandMd;
 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.SupplyCompany;
 
 /**
@@ -53,6 +55,65 @@ public interface TsaBusinessDao {
 	 */
 	Collection<DeliveryLoc> getDeliveryLocList(DeliveryLoc delvLoc);
 
+	/**
+	 * 브랜드 목록
+	 * @param brand - 브랜드 정보
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	Collection<Brand> getBrandList(Brand brand);
+
+	/**
+	 * 담당MD 목록
+	 * @param brandMd - 담당MD 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	Collection<BrandMd> getMdList(BrandMd brandMd);
+
+	/**
+	 * 브랜드담당MD 목록
+	 * @param brandCd - 브랜드코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	Collection<BrandMd> getBrandMdList(String brandCd);
+
+	/**
+	 * 브랜드담당MD 삭제
+	 * @param brandCd - 브랜드코드
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	void deleteBrandMd(String brandCd);
+
+	/**
+	 * 브랜드담당MD 등록
+	 * @param brandMd - 브랜드담당MD 정보
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	void createBrandMd(BrandMd brandMd);
+
+	/**
+	 * 브랜드 노출사이트 목록
+	 * @param brandCd - 브랜드코드
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	Collection<SiteBrand> getBrandSiteList(String brandCd);
+
+	/**
+	 * 브랜드 노출사이트 등록/수정
+	 * @param siteBrand - 사이트브랜드 정보
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	void saveBrandSite(SiteBrand siteBrand);
+
 	/**
 	 * 출고처관리 저장
 	 * @param delvLoc - 출고처 정보
@@ -127,14 +188,4 @@ public interface TsaBusinessDao {
 	 */
 	void deleteShipCompany(ShipCompany shipComp);
 
-	/**
-	 * 브랜드 목록
-	 *
-	 * @param brand - 브랜드 정보
-	 * @return 브랜드 목록
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	Collection<Brand> getBrandList(Brand brand);
-
 }

+ 11 - 9
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaRendererDao.java

@@ -6,6 +6,7 @@ import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Brand;
 import com.style24.persistence.domain.Color;
 import com.style24.persistence.domain.CommonCode;
+import com.style24.persistence.domain.DeliveryLoc;
 import com.style24.persistence.domain.Itemkind;
 import com.style24.persistence.domain.SupplyCompany;
 
@@ -89,15 +90,15 @@ public interface TsaRendererDao {
 	 */
 	Collection<CommonCode> getAuthBrandList(int userNo);
 
-//	/**
-//	 * 출고처 목록
-//	 * @param params - 출고처 정보
-//	 * @return 출고처 목록
-//	 * @author sasa004
-//	 * @since 2019. 12. 12
-//	 */
-//	Collection<CommonCode> getDeliveryLocList(AdmDeliveryLoc params);
-//
+	/**
+	 * 출고처 목록
+	 * @param delvLoc - 출고처 정보
+	 * @return 출고처 목록
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	Collection<CommonCode> getDeliveryLocList(DeliveryLoc delvLoc);
+
 //	/**
 //	 * 정보고시 목록
 //	 * @param goodsCd
@@ -133,6 +134,7 @@ public interface TsaRendererDao {
 	 * @since 2020. 10. 16
 	 */
 	Collection<CommonCode> getColorList(Color color);
+
 //
 //	/**
 //	 * 사용중 대카테고리 목록

+ 78 - 11
style24.admin/src/main/java/com/style24/admin/biz/service/TsaBusinessService.java

@@ -12,9 +12,11 @@ import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.Aflink;
 import com.style24.persistence.domain.Brand;
+import com.style24.persistence.domain.BrandMd;
 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.SupplyCompany;
 
 import lombok.extern.slf4j.Slf4j;
@@ -86,6 +88,82 @@ public class TsaBusinessService {
 		businessDao.saveDeliveryLoc(delvLoc);
 	}
 
+	/**
+	 * 브랜드 목록
+	 * @param brand - 브랜드 정보
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	public Collection<Brand> getBrandList(Brand brand) {
+		return businessDao.getBrandList(brand);
+	}
+
+	/**
+	 * 담당MD 목록
+	 * @param brandMd - 담당MD 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	public Collection<BrandMd> getMdList(BrandMd brandMd) {
+		return businessDao.getMdList(brandMd);
+	}
+
+	/**
+	 * 브랜드담당MD 목록
+	 * @param brandCd - 브랜드코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	public Collection<BrandMd> getBrandMdList(String brandCd) {
+		return businessDao.getBrandMdList(brandCd);
+	}
+
+	/**
+	 * 브랜드담당MD 목록 등록/수정 처리
+	 * @param brandMdList - 브랜드담당MD 목록
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@Transactional("shopTxnManager")
+	public void saveBrandMdList(Collection<BrandMd> brandMdList) {
+		businessDao.deleteBrandMd(brandMdList.iterator().next().getBrandCd());
+
+		for (BrandMd brandMd : brandMdList) {
+			brandMd.setRegNo(TsaSession.getInfo().getUserNo());
+			brandMd.setUpdNo(TsaSession.getInfo().getUserNo());
+			businessDao.createBrandMd(brandMd);
+		}
+	}
+
+	/**
+	 * 브랜드 노출사이트 목록
+	 * @param brandCd - 브랜드코드
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	public Collection<SiteBrand> getBrandSiteList(String brandCd) {
+		return businessDao.getBrandSiteList(brandCd);
+	}
+
+	/**
+	 * 브랜드 노출사이트 등록/수정 처리
+	 * @param siteBrandList - 브랜드사이트 목록
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@Transactional("shopTxnManager")
+	public void saveBrandSiteList(Collection<SiteBrand> siteBrandList) {
+		for (SiteBrand siteBrand : siteBrandList) {
+			siteBrand.setRegNo(TsaSession.getInfo().getUserNo());
+			siteBrand.setUpdNo(TsaSession.getInfo().getUserNo());
+//			siteBrand.setTcateCd(businessDao.getTcateCdByBrand(siteBrand));
+			businessDao.saveBrandSite(siteBrand);
+		}
+	}
+
 	/**
 	 * 판매매장 목록
 	 * @param sellStore - 판매매장 정보
@@ -193,15 +271,4 @@ public class TsaBusinessService {
 		}
 	}
 
-	/**
-	 * 브랜드 목록 조회
-	 *
-	 * @param brand - 브랜드 정보
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	public Collection<Brand> getBrandList(Brand brand) {
-		return businessDao.getBrandList(brand);
-	}
-
 }

+ 38 - 25
style24.admin/src/main/java/com/style24/admin/biz/service/TsaRendererService.java

@@ -10,6 +10,7 @@ import com.style24.admin.biz.dao.TsaRendererDao;
 import com.style24.persistence.domain.Brand;
 import com.style24.persistence.domain.Color;
 import com.style24.persistence.domain.CommonCode;
+import com.style24.persistence.domain.DeliveryLoc;
 import com.style24.persistence.domain.Itemkind;
 import com.style24.persistence.domain.SupplyCompany;
 
@@ -116,6 +117,18 @@ public class TsaRendererService {
 		return this.getSupplyCompanyList(supplyCompany);
 	}
 
+	/**
+	 * 입점공급업체 목록
+	 * @return 입점공급업체 목록
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	public Collection<CommonCode> getEntrSupplyCompanyList() {
+		SupplyCompany supplyCompany = new SupplyCompany();
+		supplyCompany.setSelfYn("N");
+		return this.getSupplyCompanyList(supplyCompany);
+	}
+
 	/**
 	 * 공통코드 목록 - 어드민 공통코드 캐시 미적용 - 상품등록시 시즌년도 캐쉬로 인한 정보 오류로 수정 2020.06.02
 	 * @param commoncode - 공통코드 정보
@@ -296,17 +309,17 @@ public class TsaRendererService {
 		return rendererDao.getAuthBrandList(userNo);
 	}
 
-//	/**
-//	 * 출고처 목록
-//	 * @param params - 출고처 정보
-//	 * @return 출고처 목록
-//	 * @author gagamel
-//	 * @since 2020. 5. 4
-//	 */
-//	public Collection<CommonCode> getDeliveryLocList(AdmDeliveryLoc params) {
-//		return rendererDao.getDeliveryLocList(params);
-//	}
-//
+	/**
+	 * 출고처 목록
+	 * @param delvLoc - 출고처 정보
+	 * @return 출고처 목록
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	public Collection<CommonCode> getDeliveryLocList(DeliveryLoc delvLoc) {
+		return rendererDao.getDeliveryLocList(delvLoc);
+	}
+
 //	/**
 //	 * 출고처 목록
 //	 * @return 출고처 목록
@@ -317,20 +330,20 @@ public class TsaRendererService {
 //		AdmDeliveryLoc params = new AdmDeliveryLoc();
 //		return this.getDeliveryLocList(params);
 //	}
-//
-//	/**
-//	 * 출고처 목록
-//	 * @param supplyCompCd - 공급업체코드
-//	 * @return 출고처 목록
-//	 * @author gagamel
-//	 * @since 2019. 12. 12
-//	 */
-//	public Collection<CommonCode> getDeliveryLocList(String supplyCompCd) {
-//		AdmDeliveryLoc params = new AdmDeliveryLoc();
-//		params.setSupplyCompCd(supplyCompCd);
-//		return this.getDeliveryLocList(params);
-//	}
-//
+
+	/**
+	 * 출고처 목록
+	 * @param supplyCompCd - 공급업체코드
+	 * @return 출고처 목록
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	public Collection<CommonCode> getDeliveryLocList(String supplyCompCd) {
+		DeliveryLoc delvLoc = new DeliveryLoc();
+		delvLoc.setSupplyCompCd(supplyCompCd);
+		return this.getDeliveryLocList(delvLoc);
+	}
+
 //	/**
 //	 * 직송매장 목록
 //	 * @return

+ 167 - 2
style24.admin/src/main/java/com/style24/admin/biz/web/TsaBusinessController.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,11 +17,15 @@ import com.style24.admin.biz.service.TsaBusinessService;
 import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.biz.service.TscEnvsetService;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.Aflink;
+import com.style24.persistence.domain.Brand;
+import com.style24.persistence.domain.BrandMd;
 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.SupplyCompany;
 
 import lombok.extern.slf4j.Slf4j;
@@ -47,6 +52,9 @@ public class TsaBusinessController extends TsaBaseController {
 	@Autowired
 	private TsaRendererService rendererService;
 
+	@Autowired
+	private TscEnvsetService cenvsetService;
+
 	/**
 	 * 공급업체관리 화면
 	 * @return
@@ -154,6 +162,163 @@ public class TsaBusinessController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 
+	/**
+	 * 브랜드관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@GetMapping("/brand/form")
+	public ModelAndView supplyCompanyBrandForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
+
+		// 유통구분
+		mav.addObject("distributionGbList", rendererService.getAvailCommonCodeList("G065"));
+
+		// 사이트
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+
+//		// 포인트 정책
+//		Brand brand = new Brand();
+//		brand.setSelfGoodsPcPntRate10(cenvsetService.getSelfGoodsPcPointRate10("10"));
+//		brand.setSelfGoodsPcPntRate20(cenvsetService.getSelfGoodsPcPointRate20("10"));
+//		brand.setSelfGoodsMobPntRate10(cenvsetService.getSelfGoodsMobPointRate10("10"));
+//		brand.setSelfGoodsMobPntRate20(cenvsetService.getSelfGoodsMobPointRate20("10"));
+//		brand.setEntrGoodsPcPntRate10(cenvsetService.getEntrGoodsPcPointRate10("10"));
+//		brand.setEntrGoodsPcPntRate20(cenvsetService.getEntrGoodsPcPointRate20("10"));
+//		brand.setEntrGoodsMobPntRate10(cenvsetService.getEntrGoodsMobPointRate10("10"));
+//		brand.setEntrGoodsMobPntRate20(cenvsetService.getEntrGoodsMobPointRate20("10"));
+//		mav.addObject("brand", brand);
+
+		mav.setViewName("business/BrandForm");
+
+		return mav;
+	}
+
+	/**
+	 * 브랜드 목록
+	 * @param brand - 브랜드 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@PostMapping("/brand/list")
+	@ResponseBody
+	public Collection<Brand> getBrandList(@RequestBody Brand brand) {
+		return businessService.getBrandList(brand);
+	}
+
+	/**
+	 * 담당MD 목록 화면
+	 * @param brandMd - 담당MD 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@GetMapping("/md/list/form")
+	public ModelAndView mdListForm(BrandMd brandMd) {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("params", brandMd);
+
+		mav.setViewName("business/MdListForm");
+
+		return mav;
+	}
+
+	/**
+	 * 브랜드담당MD 목록
+	 * @param brandCd - 브랜드코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@PostMapping("/md/list")
+	@ResponseBody
+	public Collection<BrandMd> getMdList(@RequestBody BrandMd brandMd) {
+		return businessService.getMdList(brandMd);
+	}
+
+	/**
+	 * 브랜드담당MD 목록
+	 * @param brandCd - 브랜드코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@GetMapping("/brand/md/list/{brandCd}")
+	@ResponseBody
+	public Collection<BrandMd> getBrandMdList(@PathVariable String brandCd) {
+		return businessService.getBrandMdList(brandCd);
+	}
+
+	/**
+	 * 브랜드 담당MD 등록/수정 처리
+	 * @param brandMdList - 브랜드담당MD 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@PostMapping("/brand/md/list/save")
+	@ResponseBody
+	public GagaResponse saveBrandMdList(@RequestBody Collection<BrandMd> brandMdList) {
+		if (brandMdList == null || brandMdList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		businessService.saveBrandMdList(brandMdList);
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 브랜드 노출사이트 목록
+	 * @param brandCd - 브랜드코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@GetMapping("/brand/site/list/{brandCd}")
+	@ResponseBody
+	public Collection<SiteBrand> getBrandSiteList(@PathVariable String brandCd) {
+		return businessService.getBrandSiteList(brandCd);
+	}
+
+	/**
+	 * 브랜드 노출사이트 등록/수정 처리
+	 * @param brandSiteList - 브랜드사이트 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@PostMapping("/brand/site/list/save")
+	@ResponseBody
+	public GagaResponse saveBrandSiteList(@RequestBody Collection<SiteBrand> brandSiteList) {
+		if (brandSiteList == null || brandSiteList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		businessService.saveBrandSiteList(brandSiteList);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+//	/**
+//	 * 브랜드 등록/수정 처리
+//	 * @param brand - 브랜드 정보
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2020. 11. 4
+//	 */
+//	@PostMapping("/brand/save")
+//	@ResponseBody
+//	public GagaResponse saveBrand(@RequestBody Brand brand) {
+//		businessService.saveBrand(brand);
+//		return super.ok(message.getMessage("SUCC_0001"));
+//	}
+
 	/**
 	 * 판매매장관리 화면
 	 * @return
@@ -238,7 +403,7 @@ public class TsaBusinessController extends TsaBaseController {
 	}
 
 	/**
-	 * 제휴링크 저장 처리
+	 * 제휴채널 저장 처리
 	 * @param aflink - 제휴링크 정보
 	 * @return
 	 * @author gagamel
@@ -252,7 +417,7 @@ public class TsaBusinessController extends TsaBaseController {
 	}
 
 	/**
-	 * 제휴링크 목록 사용안함 처리
+	 * 제휴채널 목록 사용안함 처리
 	 * @param aflinkList - 제휴링크 목록
 	 * @return
 	 * @author gagamel

+ 28 - 15
style24.admin/src/main/java/com/style24/admin/biz/web/TsaRendererController.java

@@ -30,6 +30,19 @@ public class TsaRendererController extends TsaBaseController {
 	@Autowired
 	private TsaRendererService rendererService;
 
+	/**
+	 * 공급업체 목록
+	 * @param selfYn - 자사여부(Y:자사브랜드, N:입점브랜드)
+	 * @return
+	 * @author gagamel
+	 * @since 2019. 11. 4
+	 */
+	@GetMapping("/supply/company/list/{selfYn}")
+	@ResponseBody
+	public Collection<CommonCode> getSupplyCompanyList(@PathVariable String selfYn) {
+		return selfYn.equals("Y") ? rendererService.getSelfSupplyCompanyList() : rendererService.getEntrSupplyCompanyList();
+	}
+
 	/**
 	 * 입점업체브랜드 목록
 	 * @param supplyCompCd - 입점업체관리일련번호
@@ -42,6 +55,7 @@ public class TsaRendererController extends TsaBaseController {
 	public Collection<CommonCode> getSupplyCompanyBrandList(@PathVariable String supplyCompCd) {
 		return rendererService.getSupplyCompanyBrandList(supplyCompCd);
 	}
+
 //
 //	/**
 //	 * 브랜드그룹별 브랜드 목록
@@ -67,21 +81,20 @@ public class TsaRendererController extends TsaBaseController {
 //	public Collection<AdmCommonCode> getAuthBrandList() {
 //		return rendererService.getAuthBrandList(AdmSession.getInfo().getUserId());
 //	}
-//
-//	/**
-//	 * 출고처 목록
-//	 * @param supplyCompCd - 공급업체코드
-//	 * @return
-//	 * @throws Exception
-//	 * @author sasa004
-//	 * @since 2019. 12.12
-//	 */
-//	@GetMapping("/deliveryLoc/list/{supplyCompCd}")
-//	@ResponseBody
-//	public Collection<AdmCommonCode> getDeliveryLocList(@PathVariable String supplyCompCd) {
-//		return rendererService.getDeliveryLocList(supplyCompCd);
-//	}
-//
+
+	/**
+	 * 출고처 목록
+	 * @param supplyCompCd - 공급업체코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@GetMapping("/delvloc/list/{supplyCompCd}")
+	@ResponseBody
+	public Collection<CommonCode> getDeliveryLocList(@PathVariable String supplyCompCd) {
+		return rendererService.getDeliveryLocList(supplyCompCd);
+	}
+
 //	/**
 //	 * 벤더외부몰 목록
 //	 * @param vendorId - 벤더ID

+ 0 - 20
style24.admin/src/main/java/com/style24/admin/biz/web/TsaSystemController.java

@@ -94,26 +94,6 @@ public class TsaSystemController extends TsaBaseController {
 		return systemService.getUserList(user);
 	}
 
-	/**
-	 * 사용자 목록 팝업
-	 * @param user - 사용자 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@GetMapping("/user/list/form")
-	public ModelAndView userListForm(User user) {
-		ModelAndView mav = new ModelAndView();
-
-		mav.addObject("userList", systemService.getUserList(user));
-
-		mav.addObject("params", user);
-
-		mav.setViewName("system/UserListForm");
-
-		return mav;
-	}
-
 	/**
 	 * 사용자 목록 삭제 처리
 	 * @param userList - 사용자 목록

+ 32 - 18
style24.admin/src/main/java/com/style24/persistence/domain/Brand.java

@@ -21,24 +21,38 @@ public class Brand extends TscBaseDomain {
 //	private String refVal;		//관련값(쿠폰유형이 "10:상품쿠폰"일 때는 상품코드, "11:브랜드쿠폰"일 때는 브랜드코드, "12:카테고리쿠폰"일 때는 카테고리코드)
 //	private String delYn;		//삭제여부
 
-	private String brandCd;		//브랜드코드
-	private String brandEnm;		//브랜드영문명
-	private String brandKnm;		//브랜드한글명
-	private String brandGrpNm;		//브랜드그룹명
-	private String supplyCompCd;		//공급업체코드(공급업체)
-	private String distributionGb;		//유통구분(공통코드 G065)
-	private String selfYn;		//자사여부(Y:자사, N:입점)
-	private String erpBrandCd;		//ERP브랜드코드
-	private int minOrdAmt;		//무료배송비최소주문금액
-	private int delvFee;		//배송비
-	private String delvLocCd;		//출고처코드(출고처)
-	private float sellFeeRate;		//판매수수료율
-	private float pntPrate10;		//포인트적립율(PC정상)
-	private float pntMrate10;		//포인트적립율(모바일정상)
-	private float pntPrate20;		//포인트적립율(PC이월)
-	private float pntMrate20;		//포인트적립율(모바일이월)
-	private int dispOrd;		//표시순서
-	private String useYn;		//사용여부(Y:사용)
+	private String brandCd;			// 브랜드코드
+	private String brandEnm;		// 브랜드영문명
+	private String brandKnm;		// 브랜드한글명
+	private String brandGrpNm;		// 브랜드그룹명
+	private String supplyCompCd;	// 공급업체코드
+	private String supplyCompNm;	// 공급업체명
+	private String delvLocCd;		// 출고처코드(출고처)
+	private String delvLocNm;		// 출고처명
+	private String erpBrandCd;		// ERP브랜드코드
+	private String selfYn;			// 자사여부(Y:자사, N:입점)
+	private int delvFee;			// 기본배송비
+	private int minOrdAmt;			// 무료배송비최소주문금액
+	private float sellFeeRate;		// 판매수수료율
+	private float pntPrate10;		// 포인트적립율(PC정상)
+	private float pntMrate10;		// 포인트적립율(모바일정상)
+	private float pntPrate20;		// 포인트적립율(PC이월)
+	private float pntMrate20;		// 포인트적립율(모바일이월)
+	private String distributionGb;	// 유통구분(공통코드 G065)
+	private int dispOrd;			// 표시순서
+	private String useYn;			// 사용여부(Y:사용)
+
+	// 검색조건
+	private String searchTxt;	// 검색어
+
+	private float selfGoodsPcPntRate10;		// 자사상품PC포인트(정상)
+	private float selfGoodsPcPntRate20;		// 자사상품PC포인트(이월)
+	private float selfGoodsMobPntRate10;	// 자사상품모바일포인트(정상)
+	private float selfGoodsMobPntRate20;	// 자사상품모바일포인트(이월)
+	private float entrGoodsPcPntRate10;		// 입점상품PC포인트(정상)
+	private float entrGoodsPcPntRate20;		// 입점상품PC포인트(이월)
+	private float entrGoodsMobPntRate10;	// 입점상품모바일포인트(정상)
+	private float entrGoodsMobPntRate20;	// 입점상품모바일포인트(이월)
 
 //	//TB_SUPPLY_COMPANY
 //	private String supplyCompCd; /*공급업체코드*/

+ 25 - 0
style24.admin/src/main/java/com/style24/persistence/domain/BrandMd.java

@@ -0,0 +1,25 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 브랜드담당MD Domain
+ *
+ * @author gagamel
+ * @since 2020. 11. 4
+ */
+@SuppressWarnings("serial")
+@Data
+public class BrandMd extends TscBaseDomain {
+
+	private String brandCd;		// 브랜드코드
+	private String formalGb;	// 정상이월구분
+	private String mdNo;		// MD번호
+
+	// 담당MD 화면에서 사용
+	private String mdNm;		// MD명
+	private String callbackFn;	// 콜백함수
+
+}

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

@@ -0,0 +1,23 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 사이트별브랜드 Domain
+ *
+ * @author gagamel
+ * @since 2020. 11. 4
+ */
+@SuppressWarnings("serial")
+@Data
+public class SiteBrand extends TscBaseDomain {
+
+	private String siteCd;		// 사이트코드
+	private String brandCd;		// 브랜드코드
+	private int dispOrd;		// 표시순서
+	private String useYn;		// 사용여부
+	private Integer cate1No;	// 카테고리번호1
+
+}

+ 168 - 54
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaBusiness.xml

@@ -42,16 +42,19 @@
 		AND    SUPPLY_STAT = #{supplyStat}
 		</if>
 		<if test="searchTxt != null and searchTxt != ''">
-			<if test='searchGb == "NAME"'>
-			AND    UPPER(SUPPLY_COMP_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
-			</if>
-			<if test='searchGb == "OWNER"'>
-			AND    UPPER(OWNER_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
-			</if>
+		    <if test='searchGb == "NAME"'>
+		AND    UPPER(SUPPLY_COMP_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		    </if>
+		    <if test='searchGb == "OWNER"'>
+		AND    UPPER(OWNER_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		    </if>
 		</if>
 		<if test="econtractYn != null and econtractYn != ''">
 		AND    ECONTRACT_YN = #{econtractYn}
 		</if>
+		<if test="supplyCompCd != null and supplyCompCd != ''"> <!-- 브랜드관리 화면에서 사용 -->
+		AND    SUPPLY_COMP_CD = #{supplyCompCd}
+		</if>
 	</select>
 	
 	<!-- 공급업체 생성 -->
@@ -305,6 +308,165 @@
 		     , UPD_DT = NOW()
 	</insert>
 	
+	<!-- 브랜드 목록 -->
+	<select id="getBrandList" parameterType="Brand" resultType="Brand">
+		/* TsaBusiness.getBrandList */
+		SELECT A.BRAND_CD        /*브랜드코드*/
+		     , A.BRAND_ENM       /*브랜드영문명*/
+		     , A.BRAND_KNM       /*브랜드한글명*/
+		     , A.BRAND_GRP_NM    /*브랜드그룹명*/
+		     , A.DISTRIBUTION_GB /*유통구분*/
+		     , A.SUPPLY_COMP_CD  /*업체코드*/
+		     , B.SUPPLY_COMP_NM  /*업체명*/
+		     , A.DELV_LOC_CD     /*출고처코드*/
+		     , C.DELV_LOC_NM     /*출고처명*/
+		     , A.ERP_BRAND_CD    /*ERP브랜드코드*/
+		     , A.SELF_YN         /*자사여부*/
+		     , A.DELV_FEE        /*기본배송비*/
+		     , A.MIN_ORD_AMT     /*무료배송비기준*/
+		     , A.SELL_FEE_RATE   /*판매수수료율*/
+		     , A.USE_YN          /*사용여부*/
+		     , A.PNT_PRATE10     /*포인트적립율(PC)*/
+		     , A.PNT_MRATE10     /*포인트적립율(모바일)*/
+		     , A.PNT_PRATE20     /*포인트적립율(PC)*/
+		     , A.PNT_MRATE20     /*포인트적립율(모바일)*/
+		     , A.DISP_ORD        /*표시순서*/
+		FROM   TB_BRAND A
+		INNER JOIN TB_SUPPLY_COMPANY B ON A.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD
+		LEFT OUTER JOIN TB_DELIVERY_LOC C ON A.DELV_LOC_CD = C.DELV_LOC_CD
+		WHERE  1 = 1
+		<if test='supplyCompCd != null and supplyCompCd != ""'>
+		AND    A.SUPPLY_COMP_CD = #{supplyCompCd}
+		</if>
+		<if test='distributionGb != null and distributionGb != ""'>
+		AND    A.DISTRIBUTION_GB = #{distributionGb}
+		</if>
+		<if test='erpBrandCd != null and erpBrandCd != ""'>
+		AND    A.ERP_BRAND_CD =  #{erpBrandCd}
+		</if>
+		<if test='brandCd != null and brandCd != ""'>
+		AND    A.BRAND_CD = #{brandCd}
+		</if>
+		<if test='searchTxt != null and searchTxt != ""'>
+		AND    (
+		        A.BRAND_CD LIKE CONCAT('%',#{searchTxt},'%')
+		        OR
+		        A.BRAND_ENM LIKE CONCAT('%',#{searchTxt},'%')
+		        OR
+		        A.BRAND_KNM LIKE CONCAT('%',#{searchTxt},'%')
+		        OR
+		        A.BRAND_GRP_NM LIKE CONCAT('%',#{searchTxt},'%')
+		       )
+		</if>
+		<if test='useYn != null and useYn != ""'>
+		AND    A.USE_YN = #{useYn}
+		</if>
+		ORDER  BY A.SELF_YN DESC, A.SUPPLY_COMP_CD, A.DISP_ORD
+	</select>
+	
+	<!-- 담당MD 목록 -->
+	<select id="getMdList" parameterType="String" resultType="BrandMd">
+		/* TsaBusiness.getMdList */
+		SELECT USER_NO AS MD_NO
+		     , USER_NM AS MD_NM
+		FROM   TB_USER
+		WHERE  ROLE_CD = 'G001_A101' /*MD권한*/
+		<if test="mdNm != null and mdNm != ''">
+		AND    LOWER(USER_NM) LIKE CONCAT('%',LOWER(#{mdNm}),'%')
+		</if>
+		AND    USE_YN  = 'Y'
+		ORDER  BY USER_NM
+	</select>
+	
+	<!-- 브랜드담당MD 목록 -->
+	<select id="getBrandMdList" parameterType="String" resultType="BrandMd">
+		/* TsaBusiness.getBrandMdList */
+		SELECT A.FORMAL_GB           /*정상이월구분*/
+		     , A.MD_NO               /*담당MD번호*/
+		     , B.USER_NM    AS MD_NM /*담당MD명*/
+		FROM   TB_BRAND_MD A
+		     , TB_USER B
+		WHERE  A.MD_NO = B.USER_NO
+		AND    A.BRAND_CD = #{brandCd}
+	</select>
+	
+	<!-- 브랜드담당MD 삭제 -->
+	<delete id="deleteBrandMd" parameterType="String">
+		/* TsaBusiness.deleteBrandMd */
+		DELETE
+		FROM   TB_BRAND_MD
+		WHERE  BRAND_CD = #{brandCd}
+	</delete>
+
+	<!-- 브랜드담당MD 등록 -->
+	<insert id="createBrandMd" parameterType="BrandMd">
+		/* TsaBusiness.createBrandMd */
+		INSERT INTO TB_BRAND_MD (
+		       BRAND_CD
+		     , FORMAL_GB
+		     , MD_NO
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT #{brandCd}  AS BRAND_CD
+		     , CD          AS FORMAL_GB
+		     , #{mdNo}     AS MD_NO
+		     , #{regNo}    AS REG_NO
+		     , NOW()       AS REG_DT
+		     , #{updNo}    AS UPD_NO
+		     , NOW()       AS UPD_DT
+		FROM   TB_COMMON_CODE
+		WHERE  CD_GB = 'G009' /*정상이월구분*/
+		AND    CD IN ('G009_10','G009_20') /*정상,이월*/
+		AND    USE_YN = 'Y'
+	</insert>
+	
+	<!-- 브랜드 노출사이트 목록 -->
+	<select id="getBrandSiteList" parameterType="String" resultType="SiteBrand">
+		/* TsaBusiness.getBrandSiteList */
+		SELECT BRAND_CD
+		     , SITE_CD
+		     , DISP_ORD
+		     , USE_YN
+		     , CATE1_NO
+		FROM   TB_SITE_BRAND
+		WHERE  BRAND_CD = #{brandCd}
+		AND    USE_YN ='Y'
+	</select>
+	
+	<!-- 브랜드 노출사이트 등록/수정 -->
+	<insert id="saveBrandSite" parameterType="SiteBrand">
+		/* TsaBusiness.saveBrandSite */
+		INSERT INTO TB_SITE_BRAND (
+		       SITE_CD
+		     , BRAND_CD
+		     , DISP_ORD
+		     , USE_YN
+		     , CATE1_NO
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{siteCd}
+		     , #{brandCd}
+		     , #{dispOrd}
+		     , #{useYn}
+		     , #{cate1No}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
 	<!-- 판매매장 목록  -->
 	<select id="getSellStoreList" parameterType="SellStore" resultType="SellStore">
 		/* TsaBusiness.getSellStoreList */
@@ -463,53 +625,5 @@
 		     , UPD_DT = NOW()
 		WHERE  SHIP_COMP_CD=  #{shipCompCd}
 	</update>
-
-	<!-- 브랜드 목록 -->
-	<select id="getBrandList" parameterType="Brand" resultType="Brand">
-		/* TsaBusiness.getBrandList */
-		SELECT A.BRAND_CD                         /*브랜드코드*/
-		     , A.BRAND_ENM                        /*브랜드영문명*/
-		     , A.BRAND_KNM                        /*브랜드한글명*/
-		     , A.BRAND_GRP_NM                     /*브랜드그룹명*/
-		     , A.SUPPLY_COMP_CD                   /*업체코드*/
-		     , B.SUPPLY_COMP_NM                   /*업체명*/
-		     , A.DELV_LOC_CD                      /*출고처코드*/
-		     , C.DELV_LOC_NM                      /*출고처명*/
-		     , A.ERP_BRAND_CD                     /*ERP브랜드 코드*/
-		     , A.DELV_FEE                         /*기본배송비*/
-		     , A.MIN_ORD_AMT                      /*무료배송비기준*/
-		     , A.SELL_FEE_RATE                    /*판매수수료율*/
-		     , A.USE_YN                           /*사용여부*/
-		     , A.PNT_PRATE10                        /*포인트적립율(PC)*/
-		     , A.PNT_MRATE10                        /*포인트적립율(모바일)*/
-		     , A.PNT_PRATE20                        /*포인트적립율(PC)*/
-		     , A.PNT_MRATE20                        /*포인트적립율(모바일)*/
-		     , A.DISP_ORD
-		     , A.SELF_YN
-		FROM TB_BRAND A
-		INNER JOIN TB_SUPPLY_COMPANY B ON A.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD
-		LEFT OUTER JOIN TB_DELIVERY_LOC C ON A.DELV_LOC_CD = C.DELV_LOC_CD
-		WHERE  1 = 1
-		<if test='supplyCompCd != null and supplyCompCd != ""'>
-		AND    A.SUPPLY_COMP_CD = #{supplyCompCd}
-		</if>
-		<if test='erpBrandCd != null and erpBrandCd != ""'>
-		AND    A.ERP_BRAND_CD =  #{erpBrandCd}
-		</if>
-		<if test='brandCd != null and brandCd != ""'>
-		AND    A.BRAND_CD = #{brandCd}
-		</if>
-		<if test='brandEnm != null and brandEnm != ""'>
-		AND    (
-		        A.BRAND_ENM LIKE CONCAT('%',#{brandEnm},'%')
-		        OR
-		        A.BRAND_KNM LIKE CONCAT('%',#{brandEnm},'%')
-		       )
-		</if>
-		<if test='useYn != null and useYn != ""'>
-		AND    A.USE_YN = #{useYn}
-		</if>
-		ORDER BY A.SELF_YN DESC, A.SUPPLY_COMP_CD, A.DISP_ORD
-	</select>
 	
 </mapper>

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaRenderer.xml

@@ -5,8 +5,8 @@
 	<!-- 공급업체 목록 -->
 	<select id="getSupplyCompanyList" parameterType="SupplyCompany" resultType="CommonCode">
 		/* TsaRenderer.getSupplyCompanyList */
-		SELECT SUPPLY_COMP_CD AS CD
-		     , SUPPLY_COMP_NM AS CD_NM
+		SELECT SUPPLY_COMP_CD  AS CD
+		     , SUPPLY_COMP_NM  AS CD_NM
 		FROM   TB_SUPPLY_COMPANY
 		WHERE  USE_YN = 'Y'
 		<if test='supplyCompCd != null and supplyCompCd != ""'>

+ 746 - 0
style24.admin/src/main/webapp/WEB-INF/views/business/BrandForm.html

@@ -0,0 +1,746 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : BrandForm.html
+ * @desc    : 브랜드관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.11.04   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="@{'/business/brand/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col/>
+						<col style="width:10%;"/>
+						<col style="width:8%;"/>
+					</colgroup>
+					<tr>
+						<th>공급업체</th>
+						<td>
+							<select name="supplyComp">
+								<option value="">[전체]</option>
+								<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="distributionGb">
+								<option value="">[전체]</option>
+								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>검색어</th>
+						<td>
+							<input type="text" name="searchTxt" placeholder="브랜드코드/브랜드국문명/브랜드영문명/브랜드그룹명" maxlength="20"/>
+						</td>
+						<th>사용여부</th>
+						<td>
+							<select name="useYn">
+								<option value="">[전체]</option>
+								<option value="Y">[Y] Yes</option>
+								<option value="N">[N] No</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 class="right">
+					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+			
+			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+		
+		<!-- 등록/수정 -->
+		<div class="panelStyle">
+			<form id="detailForm" name="detailForm" action="#" th:action="@{'/business/brand/save'}">
+				<input type="hidden" name="mode" value="C"/>
+				
+				<table class="frmStyle" aria-describedby="등록/수정 폼">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:40%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>브랜드코드</th>
+						<td>
+							<select name="brandGb">
+								<option value="Y">자사브랜드</option>
+								<option value="N">입점브랜드</option>
+							</select>
+							<input type="text" class="w100" name="brandCd" placeholder="자동생성" maxlength="5" required="required" data-valid-name="브랜드코드" disabled="disabled"/>
+							<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> 자사브랜드인 경우 먼저 WMS에 등록되어 있는지를 확인해야 합니다.</span>
+						</td>
+						<th>브랜드명<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w200" name="brandEnm" placeholder="브랜드영문명" maxlength="50" required="required" data-valid-name="브랜드영문명"/> / 
+							<input type="text" class="w200" name="brandKnm" placeholder="브랜드국문명" maxlength="50" required="required" data-valid-name="브랜드국문명"/>
+						</td>
+					</tr>
+					<tr>
+						<th>브랜드그룹명<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w200" name="brandGrpNm" maxlength="50" required="required" data-valid-name="브랜드그룹명"/>
+						</td>
+						<th>공급업체<i class="required" title="필수"></i></th>
+						<td>
+							<select name="supplyCompCd" required="required" data-valid-name="공급업체">
+								<option value="">[선택]</option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>유통구분<i class="required" title="필수"></i></th>
+						<td>
+							<select name="distributionGb" required="required" data-valid-name="유통구분">
+								<option value="">[선택]</option>
+								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>출고처<i class="required" title="필수"></i></th>
+						<td>
+							<select name="delvLocCd">
+								<option value="">[선택]</option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>기본배송비<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w100 aR" name="delvFee" maxlength="6" required="required" data-valid-name="기본배송비" data-valid-type="integer"/>원
+							<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> 변경된 배송비는 이후 등록된 상품부터 적용됩니다.</span>
+						</td>
+						<th>무료배송기준<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w100 aR" name="minOrdAmt" maxlength="7" required="required" data-valid-name="무료배송기준" data-valid-type="integer"/>원 이상 구매시
+						</td>
+					</tr>
+					<tr>
+						<th>포인트적립율(PC정상)<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w100 aR" name="pntPrate10" maxlength="3" required="required" data-valid-name="포인트적립율(PC정상)" data-valid-type="numeric"/>%
+						</td>
+						<th>포인트적립율(모바일정상)<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w100 aR" name="pntMrate10" maxlength="3" required="required" data-valid-name="포인트적립율(모바일정상)" data-valid-type="numeric"/>%
+						</td>
+					</tr>
+					<tr>
+						<th>포인트적립율(PC이월)<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w100 aR" name="pntPrate20" maxlength="3" required="required" data-valid-name="포인트적립율(PC이월)" data-valid-type="numeric"/>%
+						</td>
+						<th>포인트적립율(모바일이월)<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w100 aR" name="pntMrate20" maxlength="3" required="required" data-valid-name="포인트적립율(모바일이월)" data-valid-type="numeric"/>%
+						</td>
+					</tr>
+					<tr id="sellFeeRateTr" class="off">
+						<th>판매수수료율<i class="required" title="필수"></i></th>
+						<td colspan="3">
+							<input type="text" class="w100 aR" name="sellFeeRate" maxlength="3" required="required" data-valid-name="판매수수료율" data-valid-type="numeric"/>%
+						</td>
+					</tr>
+					<tr id="brandMdArea" class="off">
+						<th>담당MD</th>
+						<td colspan="3" id="tdBrandMd">
+							<div>
+								<input type="text" class="w100" name="mdNm" onkeypress="if( event.keyCode==13 ){$('#mdIdx').val(0); cfnOpenMdListPopup('fnMdSearchCallback', $(this).val());}"/>
+								<button type="button" class="btn btn-info btn-lg" id="btnSearchBrandMd" onclick="$('#mdIdx').val(0); cfnOpenMdListPopup('fnMdSearchCallback');">조회</button>
+								<input type="text" class="w100" name="mdNo" readonly="readonly"/>
+								<span class="marL10 cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i> 정상/이월 모두 관리합니다.</span>
+								<button type="button" class="btn btn-base btn-lg" id="btnAddBrandMd">추가</button>
+								<button type="button" class="btn btn-success btn-lg" id="btnUpdateBrandMd">담당MD 수정</button>
+								<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> [담당MD 수정] 버튼을 눌러야 적용됩니다.</span>
+								<input type="hidden" id="mdIdx" />
+							</div>
+						</td>
+					</tr>
+<!-- 					<tr> -->
+<!-- 						<th>브랜드이미지</th> -->
+<!-- 						<td colspan="3"> -->
+<!-- 							<div class="uFile w300"> -->
+<!-- 								<input id="file" name="file" type="file" class="uFileInput w300"/> -->
+<!-- 								<label for="file" class="uFileLabel">파일선택</label> -->
+<!-- 								<input type="hidden" name="imgFileNm" id="imgFileNm"/> -->
+<!-- 							</div> -->
+<!-- 							<input type="hidden" name="uploadDefaultUrl" id="uploadDefaultUrl" th:value="${@environment.getProperty('upload.default.view') + '/display/'}"/> -->
+<!-- 							<div id="imgView" class="off"> -->
+<!-- 								<img id="bannerPreViewUrl" src="" style="height:100px"/> -->
+<!-- 							</div> -->
+<!-- 						</td> -->
+<!-- 					</tr> -->
+					<tr id="siteArea" class="off">
+						<th>전시사이트</th>
+						<td colspan="3">
+							<label class="chkBox" th:if="${siteList}" th:each="oneData, status : ${siteList}" ><input type="checkbox" name="siteCd" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/></label>
+							<button type="button" class="btn btn-success btn-lg" id="btnSiteBrandSave">전시사이트 수정</button>
+						</td>
+					</tr>
+					<tr>
+						<th>노출순서<i class="required" title="필수"></i></th>
+						<td class="infoTxt">
+							<input type="text" class="w100 aR" name="dispOrd" maxlength="5" required="required" data-valid-name="노출순서" data-valid-type="numeric"/>
+						</td>
+						<th>사용여부<i class="required" title="필수"></i></th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked">Yes</label>
+							<label class="rdoBtn"><input type="radio" name="useYn" value="N">No</label>
+							<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> No에 체크하면 "프론트"에 노출되지 않습니다.</span>
+						</td>
+					</tr>
+				</table>
+			</form>
+			
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
+					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+		</div>
+		<!-- 등록/수정 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
+	let distributionGbList = gagajf.convertToArray([[${distributionGbList}]]);
+	
+	let columnDefs = [
+		{
+			headerName: "브랜드코드", field: "brandCd", width: 100, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "브랜드영문명", field: "brandEnm", width: 150, cellClass: 'text-center'},
+		{headerName: "브랜드국문명", field: "brandKnm", width: 150, cellClass: 'text-center'},
+		{headerName: "브랜드그룹명", field: "brandGrpNm", width: 150, cellClass: 'text-center'},
+		{
+			headerName: "공급업체", field: "supplyCompCd", width: 150, cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(supplyCompList, params.data.supplyCompCd);
+			}
+		},
+		{
+			headerName: "유통구분", field: "distributionGb", width: 150, cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(distributionGbList, params.data.distributionGb);
+			}
+		},
+		{headerName: "출고처코드", field: "delvLocCd", width: 120, cellClass: 'text-center'},
+		{headerName: "출고처명", field: "delvLocNm", width: 150, cellClass: 'text-center'},
+		{headerName: "ERP브랜드코드", field: "erpBrandCd", width: 120, cellClass: 'text-center', hide: true},
+		{
+			headerName: "무료배송비기준",
+			children : [
+				{headerName: "기본배송비", field: "delvFee", width: 120, cellClass: 'text-center', valueFormatter: function(params) { return Number(params.value).addComma(); }},
+				{headerName: "최소주문금액", field: "minOrdAmt", width: 120, cellClass: 'text-center', valueFormatter: function(params) { return Number(params.value).addComma(); }}
+			]
+		},
+		{headerName: "판매수수료율(%)", field: "sellFeeRate", width: 150, cellClass: 'text-center'},
+		{
+			headerName: "포인트적립율(%)",
+			children : [
+				{headerName: "PC정상", field: "pntPrate10", width: 100, cellClass: 'text-center'},
+				{headerName: "모바일정상", field: "pntMrate10", width: 100, cellClass: 'text-center'},
+				{headerName: "PC이월", field: "pntPrate20", width: 100, cellClass: 'text-center'},
+				{headerName: "모바일이월", field: "pntMrate20", width: 100, cellClass: 'text-center'}
+			]
+		},
+		{headerName: "브랜드이미지", field: "brandImg", width: 150, cellClass: 'text-center', hide: true},
+		{headerName: "노출순서", field: "dispOrd", width: 150, cellClass: 'text-center', hide: true},
+		{headerName: "사용여부", field: "useYn", width: 80, cellClass: 'text-center'}
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// Cell click
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field != 'brandCd')
+			return;
+		
+		$("#detailForm select[name=brandGb]").attr("disabled", "disabled");
+		$("#detailForm input[name=brandCd]").val(event.data.brandCd);
+		$("#detailForm input[name=brandEnm]").val(event.data.brandEnm);
+		$("#detailForm input[name=brandKnm]").val(event.data.brandKnm);
+		$("#detailForm input[name=brandGrpNm]").val(event.data.brandGrpNm);
+		$("#detailForm input[name=erpBrandCd]").val(event.data.erpBrandCd);
+		$("#detailForm select[name=supplyCompCd]").val(event.data.supplyCompCd);
+		$("#detailForm select[name=distributionGb]").val(event.data.distributionGb);
+		$("#detailForm select[name=delvLocCd]").val(event.data.delvLocCd);
+		$("#detailForm input[name=delvFee]").val(Number(event.data.delvFee).addComma());
+		$("#detailForm input[name=minOrdAmt]").val(Number(event.data.minOrdAmt).addComma());
+		$("#detailForm input[name=sellFeeRate]").val(event.data.sellFeeRate);
+		$("#detailForm input[name=pntPrate10]").val(event.data.pntPrate10);
+		$("#detailForm input[name=pntMrate10]").val(event.data.pntMrate10);
+		$("#detailForm input[name=pntPrate20]").val(event.data.pntPrate20);
+		$("#detailForm input[name=pntMrate20]").val(event.data.pntMrate20);
+		$("#detailForm input:radio[name=useYn]:input[value=" + event.data.useYn + "]").click();
+		$("#detailForm input[name=dispOrd]").val(event.data.dispOrd);
+		
+		// 담당MD 영역 노출
+		$("#brandMdArea").removeClass("off").addClass("on");
+		fnGetBrandMdList(event.data.brandCd);
+		
+		$("#detailForm input[name=mode]").val("U");
+		
+// 		// 브랜드이미지 영역 노출
+// 		var brandImg = event.data.brandImg;
+// 		if (!gagajf.isNull(brandImg)) {
+// 			$("#imgFileNm").val(brandImg);
+// 			$("#bannerPreViewUrl").attr('src', $("#uploadDefaultUrl").val()+brandImg);
+// 			$("#imgView").removeClass("off").addClass("on");
+// 		} else {
+// 			$("#imgFileNm").val('');
+// 		}
+// 		$('#detailForm input[name=file]').closest('div').find('label').text('파일선택');
+		
+		// 전시사이트 영역 노출
+		$("#siteArea").removeClass("off").addClass("on");
+		fnGetBrandSiteList(event.data.brandCd);
+	}
+
+	// 조회
+	$('#btnSearch').on('click', function() {
+		// Fetch data
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+	
+	// 브랜드구분 변경 시
+	$('#detailForm select[name=brandGb]').on('change', function() {
+		$.getJSON('/renderer/supply/company/list/' + $(this).val()
+			, function(result, status) {
+				$('#detailForm select[name=supplyCompCd]').empty().append('<option value="">[선택]</option>');
+				$.each(result, function(idx, item) {
+					var optionHtml = '<option value="' + item.cd + '">[' + item.cd + '] '+ item.cdNm + '</option>\n';
+					$('#detailForm select[name=supplyCompCd]').append(optionHtml);
+				});
+				$('#detailForm select[name=supplyCompCd]').trigger('change');
+			});
+	});
+	
+	// 공급업체 변경 시
+	$('#detailForm select[name=supplyCompCd]').on('change', function() {
+		if (gagajf.isNull($(this).val())) {
+			return;
+		}
+		
+		var data = { supplyCompCd : $(this).val() };
+		var jsonData = JSON.stringify(data);
+		gagajf.ajaxJsonSubmit('/business/supply/company/list', jsonData, function(result) {
+			if (result.length == 0) {
+				$("#detailForm input[name=delvFee]").val(0);
+				$("#detailForm input[name=minOrdAmt]").val(0);
+				$("#detailForm input[name=sellFeeRate]").val(0);
+				return;
+			}
+			
+			$("#detailForm input[name=delvFee]").val(Number(result[0].delvFee).addComma());
+			$("#detailForm input[name=minOrdAmt]").val(Number(result[0].minOrdAmt).addComma());
+			$("#detailForm input[name=sellFeeRate]").val(result[0].sellFeeRate);
+			
+			// 출고처 정보
+			$.getJSON('/renderer/delvloc/list/' + result[0].supplyCompCd
+				, function(delvLocList, status) {
+					$('#detailForm select[name=delvLocCd]').empty().append('<option value="">[선택]</option>');
+					$.each(delvLocList, function(idx, item) {
+						var optionHtml = '<option value="' + item.cd + '">[' + item.cd + '] '+ item.cdNm + '</option>\n';
+						$('#detailForm select[name=delvLocCd]').append(optionHtml);
+					});
+				}
+			);
+		});
+	});
+	
+	// 브랜드담당MD 목록
+	var fnGetBrandMdList = function(brandCd) {
+		$.getJSON('/business/brand/md/list/' + brandCd
+			, function(result, status) {
+				$("#tdBrandMd input[name=mdNm]").val('');
+				$("#tdBrandMd input[name=mdNo]").val('');
+				
+				$("#tdBrandMd div").each(function(idx) {
+					if (idx > 0) {
+						$(this).remove();
+					}
+				});
+				
+				for (var i = 0; i < result.length; i++) {
+					if (result[i].formalGb == '10') {
+						if (i == 0) {
+							$("#brandMdArea input[name=mdNm]").val(result[i].mdNm);
+							$("#brandMdArea input[name=mdNo]").val(result[i].mdNo);
+						} else {
+							$("#tdBrandMd").append(getBrandMdTag(result[i].mdNo, result[i].mdNm));
+						}
+					}
+				}
+			});
+	}
+
+	// 브랜드 노출사이트 목록
+	var fnGetBrandSiteList = function(brandCd) {
+		$.getJSON('/business/brand/site/list/' + brandCd
+			, function(result, status) {
+				$("#detailForm input[type=checkbox]").removeClass("checked");
+				$("#detailForm input[type=checkbox]").attr("checked", false);
+				result.forEach(function(item) {
+					$("#siteArea label").each(function() {
+						if (item.siteCd == $(this).find("input:checkbox[name=siteCd]").val()) {
+							$(this).find("input:checkbox[name=siteCd]").attr("checked", true);
+						}
+					});
+				});
+			
+				$("#detailForm input[type=checkbox][checked]").parent("label").addClass("checked");
+		});
+	}
+	
+	// 업체 변경 정보
+	var fnChangeSupplyComp = function(brandGb){
+// 		let pntRate = [[${pntRate}]];
+// 		$("#detailForm select[name=delvLocCd]").html('<option value="">[선택]</option>');
+// 		$("#detailForm select[name=delvLocCd]").val('');
+// 		var supplyCompCd = $("#supplyCompCdTd" + brandGb + " select[name=supplyCompCd]").val();
+// 		var formId = '#detailForm';
+// 		if(typeof supplyCompCd!='undefined' && supplyCompCd!=''){
+// 			if(brandGb=="S"){
+// 				$("#detailForm input[name=pntPrate10]").val(policy.sgoodsPntPrate10);
+// 				$("#detailForm input[name=pntMrate10]").val(policy.sgoodsPntMrate10);
+// 				$("#detailForm input[name=pntPrate20]").val(policy.sgoodsPntPrate20);
+// 				$("#detailForm input[name=pntMrate20]").val(policy.sgoodsPntMrate20);
+// 			}else if(brandGb=="E"){
+// 				$("#detailForm input[name=pntPrate10]").val(policy.egoodsPntPrate10);
+// 				$("#detailForm input[name=pntMrate10]").val(policy.egoodsPntMrate10);
+// 				$("#detailForm input[name=pntPrate20]").val(policy.egoodsPntPrate20);
+// 				$("#detailForm input[name=pntMrate20]").val(policy.egoodsPntMrate20);
+// 			}
+// 			var data = {'supplyCompCd' : supplyCompCd};
+// 			var jsonData = JSON.stringify(data);
+// 			gagajf.ajaxJsonSubmit('/business/supply/company/list', jsonData, fnSupplyCompCallback);
+// 		}else{
+// 			$("#detailForm input[name=delvFee]").val('');
+// 			$("#detailForm input[name=minOrdAmt]").val('');
+// 			$("#detailForm input[name=sellFeeRate]").val('');
+// 			$("#detailForm input[name=pntPrate10]").val('');
+// 			$("#detailForm input[name=pntMrate10]").val('');
+// 			$("#detailForm input[name=pntPrate20]").val('');
+// 			$("#detailForm input[name=pntMrate20]").val('');
+// 		}
+	}
+	
+// 	//이미지 클릭시 미리보기
+// 	$("#bannerPreViewUrl").click(function(){
+// 		cfnOpenImagePreViewPopup('bannerPreimgView',$('#bannerPreViewUrl').attr('src'));
+// 	});
+	
+// 	//첨부파일 등록
+// 	$('#detailForm input[name=file]').on('change', function() {
+// 		var file = this.files[0];
+// 		file.name = 'test';
+// 		if (typeof(file) == 'undefined'){
+// 			return;
+// 		}
+		
+// 		gagajf.ajaxFileUpload('/common/file/upload?subDir=/display'
+// 				, file
+// 				, function(result) {
+// 					$('#detailForm input[name=imgFileNm]').val(result.newFileName);
+// 					$("#bannerPreViewUrl").attr('src', $("#uploadDefaultUrl").val()+result.newFileName);
+// 					$("#imgView").removeClass("off").addClass("on");
+// 					uifnFitGrid();
+// 				}
+// 				, 'image'
+// 		);
+// 	});
+	
+	var fnMdSearchCallback = function(result) {
+		var ind = $('#mdIdx').val();
+		$("#tdBrandMd input[name=mdNo]").eq(ind).val(result.userNo);
+		$("#tdBrandMd input[name=mdNm]").eq(ind).val(result.userNm);
+	}
+	
+	// 브랜드담당MD 수정
+	$("#btnUpdateBrandMd").on("click", function() {
+		var arrData = [];
+		var brandCd = $("#detailForm input[name=brandCd]").val();
+		var mdCnt = 0;
+		
+		$("#tdBrandMd div").each(function() {
+			var mdNo = $(this).find("input[name=mdNo]").val();
+			if (!gagajf.isNull(mdNo)) {
+				mdCnt++;
+			}
+			
+			var data = { brandCd : brandCd, mdNo : mdNo };
+			arrData.push(data);
+		});
+		
+		if (mdCnt == 0) {
+			mcxDialog.alert('담당MD가 선택되지 않았습니다.');
+			return false;
+		}
+		
+		mcxDialog.confirmC('담당MD를 수정하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(arrData);
+				gagajf.ajaxJsonSubmit('/business/brand/md/save', jsonData);
+			}
+		});
+	});
+	
+	// 전시사이트 수정
+	$("#btnSiteBrandSave").on("click", function() {
+		var arrSiteBrand = [];
+		var brandCd = $("#detailForm input[name=brandCd]").val();
+		var brandGrpNm = $("#detailForm input[name=brandGrpNm]").val();
+		var checkCnt = 0;
+		
+		$("#siteArea label").each(function() {
+			let ele = $(this).find("input:checkbox[name=siteCd]");
+			let siteCd = $(ele).val();
+			let useYn = 'N';
+			
+			if ($(ele).is(':checked')) {
+				useYn = 'Y';
+				checkCnt++;
+			}
+		
+			var data = { brandCd : brandCd, siteCd : siteCd, useYn : useYn, brandGrpNm : brandGrpNm };
+			arrSiteBrand.push(data);
+		});
+		
+		if (checkCnt <= 0) {
+			mcxDialog.alert('전시될 사이트를 선택해 주세요.');
+			return false;
+		}
+		
+		mcxDialog.confirmC('전시될 사이트를 수정하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(arrSiteBrand);
+				gagajf.ajaxJsonSubmit('/business/brand/site/save', jsonData);
+			}
+		});
+	});
+	
+	// 담당MD 추가 클릭 시
+	$("#btnAddBrandMd").on("click", function() {
+		$("#tdBrandMd").append(getBrandMdTag());
+	});
+	
+	// 담당MD 태그
+	var getBrandMdTag = function(mdNo, mdNm) {
+		var tag = '<div>\n';
+		tag += '	<input type="text" class="w100" name="mdNm" value="' + mdNm + '" onkeypress="if (event.keyCode == 13) { $(\'#mdIdx\').val(' + i + '); cfnOpenMdListPopup(\'fnMdSearchCallback\', $(this).val());}"/>\n';
+		tag += '	<button type="button" class="btn btn-info btn-lg" id="btnSearchBrandMd" onclick="$(\'#mdIdx\').val(' + i + '); cfnOpenMdListPopup(\'fnMdSearchCallback\');">조회</button>\n';
+		tag += '	<input type="text" class="w100" name="mdNo" value="' + mdNo + '" readonly="readonly"/>\n';
+		tag += '	<button type="button" class="btn icn" onclick="fnDeleteRow(this);"><i class="fa fa-times" aria-hidden="true"></i></button>\n';
+		tag += '</div>\n';
+		return tag;
+	}
+	
+	// 담당MD 삭제 시
+	var fnDeleteRow = function(obj) {
+		$(obj).closest('div').remove();
+	}
+	
+	var fnSaveCallback = function() {
+		$('#btnSearch').click();
+		$("#btnNew").click();
+	}
+	
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('브랜드 목록', gridOptions);
+	});
+	
+	// 신규 버튼 클릭
+	$("#btnNew").on("click", function() {
+		$("#detailForm")[0].reset();
+// 		$("#detailForm input[name=mode]").val("C");
+		$("#detailForm select[name=brandGb]").trigger('change');
+		$("#detailForm select[name=brandGb]").removeAttr("disabled");
+		$('#detailForm select[name=delvLocCd]').empty().append('<option value="">[선택]</option>');
+		
+		// 브랜드담당MD 영역은 수정 시 노출
+		$("#brandMdArea").removeClass("on").addClass("off");
+		
+		// 브랜드이미지 영역은 수정 시 노출
+// 		$("#bannerPreViewUrl").attr('src', '');
+// 		$("#imgView").removeClass("on").addClass("off");
+// 		$("#imgFileNm").val('');
+// 		$('#detailForm input[name=file]').val('');
+// 		$('#detailForm input[name=file]').closest('div').find('label').text('파일선택');
+
+		// 전시사이트 영역은 수정 시 노출
+		$("#siteArea").removeClass("on").addClass("off");
+	});
+
+	// 저장
+	$("#btnSave").on("click", function() {
+		var formId = '#detailForm';
+		var brandGb = $("#detailForm input:radio[name=brandGb]:checked").val();
+		var brandEnm = $("#detailForm input[name=brandEnm]").val();
+		var brandCd = $("#detailForm input[name=brandCd]").val();
+		var erpBrandCd = $("#detailForm input[name=erpBrandCd]").val();
+		var brandKnm = $("#detailForm input[name=brandKnm]").val();
+		var brandGrpNm = $("#detailForm input[name=brandGrpNm]").val();
+		var supplyCompCd = $("#supplyCompCdTd" + brandGb + " select[name=supplyCompCd]").val();
+		var delvLocCd = $("#detailForm select[name=delvLocCd]").val();
+		var delvFee = $("#detailForm input[name=delvFee]").val().removeComma();
+		var minOrdAmt = $("#detailForm input[name=minOrdAmt]").val().removeComma();
+		var sellFeeRate = $("#detailForm input[name=sellFeeRate]").val();
+		var pntPrate10 = $("#detailForm input[name=pntPrate10]").val();
+		var pntMrate10 = $("#detailForm input[name=pntMrate10]").val();
+		var pntPrate20 = $("#detailForm input[name=pntPrate20]").val();
+		var pntMrate20 = $("#detailForm input[name=pntMrate20]").val();
+		var dispOrd = $("#detailForm input[name=dispOrd]").val();
+		var useYn = $("#detailForm input:radio[name=useYn]:checked").val();
+		var brandImg = $("#imgFileNm").val();
+		var mode = $("#detailForm input[name=mode]").val();
+		
+		if(brandEnm==''){
+			gagajf.alertMessage("#detailForm input[name=brandEnm]", 'input');
+			return;
+		}
+		if(brandGb=='S' && erpBrandCd==''){
+			gagajf.alertMessage("#detailForm input[name=erpBrandCd]", 'input');
+			return;
+		}
+		if(brandKnm==''){
+			gagajf.alertMessage("#detailForm input[name=brandKnm]", 'input');
+			return;
+		}
+		if(brandGrpNm==''){
+			gagajf.alertMessage("#detailForm input[name=brandGrpNm]", 'input');
+			return;
+		}
+		if(supplyCompCd==''){
+			gagajf.alertMessage("#supplyCompCdTd" + brandGb + " select[name=supplyCompCd]", 'select');
+			return;
+		}
+		if(delvFee==''){
+			gagajf.alertMessage("#detailForm input[name=delvFee]", 'input');
+			return;
+		}
+		if(minOrdAmt==''){
+			gagajf.alertMessage("#detailForm input[name=minOrdAmt]", 'input');
+			return;
+		}
+		if(brandGb!='S' && sellFeeRate==''){
+			gagajf.alertMessage("#detailForm input[name=sellFeeRate]", 'input');
+			return;
+		}
+		if(pntPrate10==''){
+			gagajf.alertMessage("#detailForm input[name=pntPrate10]", 'input');
+			return;
+		}
+		if(pntMrate10==''){
+			gagajf.alertMessage("#detailForm input[name=pntMrate10]", 'input');
+			return;
+		}
+		if(pntPrate20==''){
+			gagajf.alertMessage("#detailForm input[name=pntPrate20]", 'input');
+			return;
+		}
+		if(pntMrate20==''){
+			gagajf.alertMessage("#detailForm input[name=pntMrate20]", 'input');
+			return;
+		}
+		if(dispOrd==''){
+			gagajf.alertMessage("#detailForm input[name=dispOrd]", 'input');
+			return;
+		}
+		
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var data = {brandGb : brandGb
+						,brandEnm : brandEnm
+						,brandCd : brandCd
+						,erpBrandCd : erpBrandCd
+						,brandKnm : brandKnm
+						,brandGrpNm : brandGrpNm
+						,supplyCompCd : supplyCompCd
+						,delvLocCd : delvLocCd
+						,delvFee : delvFee
+						,minOrdAmt : minOrdAmt
+						,sellFeeRate : sellFeeRate
+						,pntPrate10 : pntPrate10
+						,pntMrate10 : pntMrate10
+						,pntPrate20 : pntPrate20
+						,pntMrate20 : pntMrate20
+						,dispOrd:dispOrd
+						,useYn : useYn
+						,brandImg : brandImg
+						,mode : mode
+				};
+				var jsonData = JSON.stringify(data);
+				gagajf.ajaxJsonSubmit($(formId).prop('action'), jsonData, fnSaveCallback);
+			}
+		});
+	});
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+		
+		$('#detailForm select[name=brandGb]').trigger('change');
+	});
+/*]]>*/
+</script>
+
+</html>

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

@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : MdListForm.html
+ * @desc    : 담당MD 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.11.04   sasa004     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="340" id="popupMdList">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong>담당MD 목록</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupMdList');"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+		
+		<!-- 검색 조건 -->
+		<div class="panelContent">
+			<form id="searchMdListForm" name="searchMdListForm" action="#" th:action="@{'/business/md/list'}" onsubmit="$('#btnSearchMdList').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:15%;"/>
+						<col/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>담당MD명</th>
+							<td>
+								<input type="text" name="mdNm" th:value="${params.mdNm}" maxlength="20" onkeypress="if (event.keyCode == 13) { $('#btnSearchMdList').trigger('click'); }"/>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearchMdList">조회</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- //검색 조건 -->
+		
+		<!-- 리스트 영역 -->
+		<div class="panelContent">
+			<div id="gridMdList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+		
+		<!-- 버튼 배치 영역 -->
+		<ul class="panelBar">
+			<li class="right">
+				<button type="button" class="btn btn-info btn-lg" id="btnConfirmMd">확인</button>
+			</li>
+		</ul>
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let columnDefsMdList = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "담당MD번호", field: "mdNo", width: 120, cellClass: 'text-center'},
+		{headerName: "담당MD명", field: "mdNm", width: 120, cellClass: 'text-center'}
+	];
+
+	let gridOptionsMdList = gagaAgGrid.getGridOptions(columnDefsMdList);
+
+	// Cell click
+	gridOptionsMdList.onCellDoubleClicked = function(event) {
+		$('#btnConfirmMd').trigger('click');
+	}
+
+	// 조회
+	$('#btnSearchMdList').on('click', function() {
+		// Fetch data
+		gagaAgGrid.fetch($('#searchMdListForm').prop('action'), gridOptionsMdList, '#searchMdListForm');
+	});
+	
+	// 확인
+	$('#btnConfirmMd').on('click', function() {
+		var selectedData = gagaAgGrid.selectedRowData(gridOptionsMdList);
+		
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 담당MD가 없습니다.');
+			return false;
+		}
+		
+		var callbackFn = [[${params.callbackFn}]];
+
+		var jsonData = JSON.stringify(selectedData);
+
+		if (typeof callbackFn != 'undefined' && callbackFn) {
+			if (typeof callbackFn == 'function') {
+				callbackFn(jsonData);
+			} else {
+				if (callbackFn) {
+					if (callbackFn.indexOf("(") == -1) {
+						eval(callbackFn + "(" + jsonData + ")");
+					} else {
+						eval(callbackFn(jsonData));
+					}
+				}
+			}
+			uifnPopupClose('popupMdList');
+		}
+	});
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridMdList', gridOptionsMdList);
+		
+		$('#btnSearchMdList').trigger('click');
+	});
+/*]]>*/
+</script>
+
+</div>
+
+</html>

+ 0 - 560
style24.admin/src/main/webapp/WEB-INF/views/system/SitePolicyForm.html

@@ -1,560 +0,0 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : SitePolicyForm.html
- * @desc    : 사이트정책관리 Page
- *============================================================================
- * SISUN
- * Copyright(C) 2019 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.01.13   jaewonHo   최초 작성
- *******************************************************************************
- -->
-<head>
-	<style>
-		input[type="text"]{
-			width:70%;
-		}
-		select{
-			width:80.7%;
-		}
-		.frmStyle th {
-		    padding: 2px 15px;
-		    height: 36px;
-		    line-height: 24px;
-		    white-space: nowrap;
-		    text-align: center;
-		    background: #e9ecfb;
-		    line-height: normal;
-		}
-	</style>
-</head>
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle2">
-			<!-- Search -->
-			<form id="searchForm" name="searchForm" action="#" th:action="@{'/system/site/policy/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<table class="frmStyle">
-					<colgroup>
-						<col style="width:10%;"/>
-					</colgroup>
-					<tbody>
-						<tr>
-							<th>사이트</th>
-							<td>
-								<select name="siteCd" class="w150">
-									<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-								</select>
-							</td>
-						</tr>
-					</tbody>
-				</table>
-				<div class="panelBtnB">
-					<button type="button" class="btn btn-base btn-lg" id="btnSearch" onclick="fnSearch('#searchForm');">조회</button>
-				</div>
-			</form>
-		</div>
-		<!-- //검색조건 영역 -->
-		<!-- 테이블 영역 -->
-		<div class="panelStyle2">
-			<form id="detailForm" name="detailForm" action="#" th:action="@{'/system/site/policy/save'}"  onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<table class="frmStyle">
-					<colgroup>
-						<col style="width:9.5%;"/>
-						<col style="width:16.5%;"/>
-						<col style="width:9.5%;"/>
-						<col style="width:14.5%;"/>
-						<col style="width:9.5%;"/>
-						<col style="width:15.5%;"/>
-						<col style="width:9.5%;"/>
-						<col style="width:15.5%;"/>
-					</colgroup>
-					<tbody>
-						<tr>
-							<th>정책일련번호</th>
-							<td colspan = "3">
-								<input name="policySq" type="text" class="w100 aR" style="width:28% !important;" readonly/>
-								<em><font color="red"><i class="fa fa-info-circle"></i>현재 적용되고 있는 사이트 정책입니다.</font></em>
-							</td>
-							<th>사이트<i class="star"></i></th>
-							<td colspan = "3">
-								<select name="siteCd" required="required" data-valid-name="사이트" class="w150">
-									<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-								</select>
-							</td>
-						</tr>
-						<tr>
-							<th rowspan="2">혜택구분<i class="star"></i></th>
-							<td rowspan="2">
-								<select name="benefitGb" onchange="fnBenefitGb(this.value)" data-valid-name="혜택구분" required>
-									<option value='C'>[C] 쿠폰</option>
-									<option value='P'>[P] 포인트</option>
-									<option value='B'>[B] 쿠폰/포인트</option>
-								</select>
-							</td>
-
-							<th>가입축하쿠폰</th>
-							<td colspan="3">
-								<input name="joinCpnNm" type="text" class="cpn" onkeyup="fnJoinCpnOnKeyUp(this);" style="width:150px;"/>
-								<button type="button" class="btn icn cpn" id="joinCpnIdBtn" onclick="fnCouponSerch('J')"><i class="fa fa-search cpn" aria-hidden="true"></i></button>
-								<input name="joinCpnId" type="text" style="width:80px;" readonly/>
-								<button type="button" class="btn icn" onclick="$('input[name=joinCpnId],input[name=joinCpnNm]').val('')"><i class="fa fa-eraser"></i></button>
-							</td>
-							<th>가입축하포인트</th>
-							<td>
-								<input name="joinPnt" type="text" class="aR point"  maxlength="5" />
-							</td>
-						</tr>
-						<tr>
-							<th>생일축하쿠폰</th>
-							<td colspan="3">
-								<input name="birthCpnNm" type="text" class="cpn" onkeyup="fnBirthCpnOnKeyUp(this);" style="width:150px;"/>
-								<button type="button" class="btn icn cpn" id="birthCpnIdBtn" onclick="fnCouponSerch('B')"><i class="fa fa-search" aria-hidden="true"></i></button>
-								<input name="birthCpnId" type="text" style="width:80px;" readonly/>
-								<button type="button" class="btn icn" onclick="$('input[name=birthCpnId],input[name=birthCpnNm]').val('')"><i class="fa fa-eraser"></i></button>
-							</td>
-							<th>생일축하포인트</th>
-							<td>
-								<input name="birthPnt" type="text" class="aR point"  maxlength="5" />
-							</td>
-						</tr>
-						<tr>
-							<th>가용포인트전환대기일수<i class="star"></i></th>
-							<td>
-								<input name="usablePntPendingDays" type="text" class="aR"  maxlength="5" required="required" data-valid-name="가용포인트전환대기일수"/>일
-							</td>
-							<th>텍스트상품평포인트<i class="star"></i></th>
-							<td>
-								<input name="textReviewPnt" type="text" class="aR"  maxlength="5" required="required" data-valid-name="텍스트상품평포인트"/>
-							</td>
-							<th>포토상품평포인트<i class="star"></i></th>
-							<td>
-								<input name="photoReviewPnt" type="text" class="aR"  maxlength="5" required="required" data-valid-name="일반상품평포인트"/>
-							</td>
-							<th>앱최초설치포인트<i class="star"></i></th>
-							<td>
-								<input name="appFsetupPnt" type="text" class="aR" required="required" data-valid-name="앱최초설치포인트"/>
-							</td>
-						</tr>
-						<tr>
-							<th>자사상품포인트적립율(PC정상)<i class="star"></i></th>
-							<td>
-								<input name="sgoodsPntPrate10" type="text" class="aR"  maxlength="5" required="required" data-valid-name="자사상품포인트적립율(PC정상)"/>%
-							</td>
-							<th>자사상품포인트적립율(모바일정상)<i class="star"></i></th>
-							<td>
-								<input name=sgoodsPntMrate10 type="text" class="aR"  maxlength="5" required="required" data-valid-name="자사상품포인트적립율(모바일정상)"/>%
-							</td>
-							<th>자사상품포인트적립율(PC이월)<i class="star"></i></th>
-							<td>
-								<input name="sgoodsPntPrate20" type="text" class="aR"  maxlength="5" required="required" data-valid-name="자사상품포인트적립율(PC이월)"/>%
-							</td>
-							<th>자사상품포인트적립율(모바일이월)<i class="star"></i></th>
-							<td>
-								<input name="sgoodsPntMrate20" type="text" class="aR"  maxlength="5" required="required" data-valid-name="자사상품포인트적립율(모바일이월)"/>%
-							</td>
-						</tr>
-						<tr>
-							<th>입점상품포인트적립율(PC정상)<i class="star"></i></th>
-							<td>
-								<input name="egoodsPntPrate10" type="text" class="aR"  maxlength="5" required="required" data-valid-name="입점상품포인트적립율(PC정상)"/>%
-							</td>
-							<th>입점상품포인트적립율(모바일정상)<i class="star"></i></th>
-							<td>
-								<input name="egoodsPntMrate10" type="text" class="aR"  maxlength="5" required="required" data-valid-name="입점상품포인트적립율(모바일정상)"/>%
-							</td>
-							<th>입점상품포인트적립율(PC이월)<i class="star"></i></th>
-							<td>
-								<input name="egoodsPntPrate20" type="text" class="aR"  maxlength="5" required="required" data-valid-name="입점상품포인트적립율(PC이월)"/>%
-							</td>
-							<th>입점상품포인트적립율(모바일이월)<i class="star"></i></th>
-							<td>
-								<input name="egoodsPntMrate20" type="text" class="aR"  maxlength="5" required="required" data-valid-name="입점상품포인트적립율(모바일이월"/>%
-							</td>
-						</tr>
-						<tr>
-							<th>배송지연보상기준일수<i class="star"></i></th>
-							<td>
-								<input name="shipDelayBaseDays" type="text" class="aR"  maxlength="5" required="required" data-valid-name="배송지연보상기준일수"/>일
-							</td>
-							<th>배송지연보상포인트<i class="star"></i></th>
-							<td>
-								<input name="shipDelayPnt" type="text" class="aR"  maxlength="5" required="required" data-valid-name="배송지연보상포인트"/>
-							</td>
-							<th>품절보상기준일수<i class="star"></i></th>
-							<td>
-								<input name="soldoutBaseDays" type="text" class="aR"  maxlength="5" required="required" data-valid-name="품절보상기준일수"/>일
-							</td>
-							<th>품절보상포인트<i class="star"></i></th>
-							<td>
-								<input name="soldoutPnt" type="text" class="aR"  maxlength="5" required="required" data-valid-name="품정보상포인트"/>
-							</td>
-						</tr>
-						<tr>
-							<th>사용가능포인트구분<i class="star"></i></th>
-							<td>
-								<label class="rdoBox"><input type="radio" name="usePossibPntGb" value="A" checked="checked" onclick="fnUsePntGb('A');">정액<span></span></label>
-								<label class="rdoBox"><input type="radio" name="usePossibPntGb" value="R" onclick="fnUsePntGb('R');">정율<span></span></label>
-							</td>
-							<th>사용가능최대포인트<i class="star"></i></th>
-							<td>
-								<input name="usePossibMaxPnt" type="text" class="aR"  maxlength="5" required="required" data-valid-name="사용가능최대포인트"/>
-								<span id="pntR">%</span>
-							</td>
-							<th>사용포인트단위<i class="star"></i></th>
-							<td>
-								<select name="usePntUnit" required="required" data-valid-name="사용포인트단위">
-									<option value=''>선택</option>
-									<option value='10'>원단위절사</option>
-									<option value='100'>십원단위절사</option>
-									<option value='1000'>백원단위절사</option>
-								</select>
-							</td>
-							<th>무료배송비최소주문금액<i class="star"></i></th>
-							<td>
-								<input name="minOrdAmt" type="text" class="aR"  maxlength="5" required="required" data-valid-name="사용가능최대포인트"/>
-							</td>
-						</tr>
-					</tbody>
-				</table>
-				<div class="panelBtnB">
-					<button type="button" class="btn btn-success btn-lg" id="btnSave" onclick="fnSave('#detailForm');">저장</button>
-				</div>
-			</form>
-		</div>
-		<!-- 리스트 영역 -->
-		<div class="panelStyle2">
-			<div class="panelContent" style="overflow: hidden;">
-				<div id="gridList" style="width: 100%; height: 500px;" class="ag-theme-balham"></div>
-			</div>
-		</div>
-		<!-- //리스트 영역 -->
-	</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-
-	var siteList = gagajf.convertToArray([[${siteList}]]);
-	var benefitGbList = {"C":"쿠폰", "P":"포인트", "B":"쿠폰/포인트"};
-	var usePntUnitList = {"10" :"10:원단위절사", "100" :"100:원단위절사", "1000" :"1000:원단위절사"};
-	var usePossibPntGbList = {"A" : "정액", "R" : "정율"};
-
-	// specify the columns
-	var columnDefs = [
-		{headerName: "정책일련번호"					, field: "policySq"			, width: 100 , cellClass: 'text-center', pinned: 'left' },
-		{headerName: "사이트"						, field: "siteCd"			, width: 120 , cellClass: 'text-center', pinned: 'left' ,
-			valueFormatter: function (params) {
-				return gagaAgGrid.lookupValue(siteList, params.value);
-			}
-		},
-		{headerName: "혜택구분"					, field: "benefitGb"			, width: 90 , cellClass: 'text-center', pinned: 'left',
-			valueFormatter: function (params) {
-				return gagaAgGrid.lookupValue(benefitGbList, params.value);
-			}
-		},
-		{headerName: "가입축하쿠폰ID"				, field: "joinCpnId"			, width: 140 , cellClass: 'text-center', pinned: 'left' },
-		{headerName: "가입축하포인트"				, field: "joinPnt"				, width: 120 , cellClass: 'text-center', pinned: 'left' },
-		{headerName: "생일축하쿠폰ID"				, field: "birthCpnId"			, width: 140 , cellClass: 'text-center', pinned: 'left' },
-		{headerName: "생일축하포인트"				, field: "birthPnt"				, width: 120 , cellClass: 'text-center', pinned: 'left' },
-		{headerName: "가용포인트전환대기일수"			, field: "usablePntPendingDays"	, width: 150 , cellClass: 'text-center' },
-		{headerName: "자사상품포인트적립율(PC정상)"	, field: "sgoodsPntMrate10"		, width: 150 , cellClass: 'text-center'
-			,valueFormatter: function(params) { return Number(params.value).addComma();}
-		},
-		{headerName: "자사상품포인트적립율(모바일정상)"	, field: "sgoodsPntMrate10"		, width: 150 , cellClass: 'text-center'
-			,valueFormatter: function(params) { return Number(params.value).addComma();}
-		},
-		{headerName: "자사상품포인트적립율(PC이월)"	, field: "sgoodsPntPrate20"		, width: 150 , cellClass: 'text-center'
-			,valueFormatter: function(params) { return Number(params.value).addComma();}
-		},
-		{headerName: "자사상품포인트적립율(모바일이월)"	, field: "sgoodsPntMrate20"		, width: 150 , cellClass: 'text-center'
-			,valueFormatter: function(params) { return Number(params.value).addComma();}
-		},
-		{headerName: "입점상품포인트적립율(PC정상)"	, field: "egoodsPntPrate10"		, width: 150 , cellClass: 'text-center'
-			,valueFormatter: function(params) { return Number(params.value).addComma();}
-		},
-		{headerName: "입점상품포인트적립율(모바일정상)"	, field: "egoodsPntMrate10"		, width: 150 , cellClass: 'text-center'
-			,valueFormatter: function(params) { return Number(params.value).addComma();}
-		},
-		{headerName: "입점상품포인트적립율(PC이월)"	, field: "egoodsPntPrate20"		, width: 150 , cellClass: 'text-center'
-			,valueFormatter: function(params) { return Number(params.value).addComma();}
-		},
-		{headerName: "입점상품포인트적립율(모바일이월)"	, field: "egoodsPntMrate20"		, width: 150 , cellClass: 'text-center'
-			,valueFormatter: function(params) { return Number(params.value).addComma();}
-		},
-		{headerName: "텍스트상품평포인트"				, field: "textReviewPnt"		, width: 150 , cellClass: 'text-center'
-			,valueFormatter: function(params) { return Number(params.value).addComma();}
-		},
-		{headerName: "포토상품평포인트"				, field: "photoReviewPnt"		, width: 150 , cellClass: 'text-center'
-			,valueFormatter: function(params) { return Number(params.value).addComma();}
-		},
-		{headerName: "최소주문금액"					, field: "minOrdAmt"			, width: 150 , cellClass: 'text-center'
-			,valueFormatter: function(params) { return Number(params.value).addComma();}
-		},
-		{headerName: "배송지연보상기준일수"			, field: "shipDelayBaseDays"	, width: 150 , cellClass: 'text-center' },
-		{headerName: "배송지연보상포인트"				, field: "shipDelayPnt"			, width: 150 , cellClass: 'text-center'
-			,valueFormatter: function(params) { return Number(params.value).addComma();}
-		},
-		{headerName: "품절보상기준일수"				, field: "soldoutBaseDays"		, width: 150 , cellClass: 'text-center' },
-		{headerName: "품절보상포인트"				, field: "soldoutPnt"			, width: 150 , cellClass: 'text-center'
-			,valueFormatter: function(params) { return Number(params.value).addComma();}
-		},
-		{headerName: "사용가능포인트구분"				, field: "usePossibPntGb"		, width: 140 , cellClass: 'text-center',
-			valueFormatter: function (params) {
-				return gagaAgGrid.lookupValue(usePossibPntGbList, params.value);
-			}
-		},
-		{headerName: "사용가능최대포인트"				, field: "usePossibMaxPnt"		, width: 110 , cellClass: 'text-center'
-			,valueFormatter: function(params) { return Number(params.value).addComma();}
-		},
-		{headerName: "사용포인트단위"				, field: "usePntUnit"			, width: 140 , cellClass: 'text-center',
-			valueFormatter: function (params) {
-				return gagaAgGrid.lookupValue(usePntUnitList, params.value);
-			}
-		},
-		{headerName: "등록아이디"					, field: "regId"				, width: 110 , cellClass: 'text-center' },
-		{headerName: "등록일"						, field: "regDt"				, width: 110 , cellClass: 'text-center',
-			cellRenderer: function(params) {
-				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDD").format("YYYY-MM-DD") : '';
-			}
-		}
-	];
-
-	var gridOptionsPolicy = gagaAgGrid.getGridOptions(columnDefs);
-
-	//조회
-	var fnSearch = function() {
-		$('#detailForm')[0].reset();
-
-		var siteCd = $('#searchForm select[name=siteCd]').val();
-		var actionUrl = $('#searchForm').prop('action') +'/'+siteCd;
-		gagaAgGrid.fetch(actionUrl, gridOptionsPolicy, '#searchForm', fnSearchCallBack);
-	}
-	var fnSearchCallBack = function(){
-		fnBindDetail(gridOptionsPolicy.api.getRowNode(0).data);
-
-		//혜택구분 쿠폰/포인트 초기화
-		fnBenefitGb(gridOptionsPolicy.api.getRowNode(0).data.benefitGb);
-	}
-
-	// 셀클릭시 바인딩
-	gridOptionsPolicy.onCellClicked = function(event) {
-		fnBindDetail(event.data);
-		fnBenefitGb(event.data.fnBenefitGb);
-	}
-
-	//로우클릭시 셋팅
-	fnBindDetail = function(rowData){
-		formId = '#detailForm';
-		$(formId + ' input[name=policySq]').val(rowData.policySq);
-		$(formId + ' select[name=siteCd]').val(rowData.siteCd).prop("selected", true);
-		$(formId + ' select[name=benefitGb]').val(rowData.benefitGb).prop("selected", true);
-
-		$(formId + ' input[name=joinCpnId]').val(rowData.joinCpnId);
-		$(formId + ' input[name=joinCpnNm]').val(rowData.joinCpnNm);
-		$(formId + ' input[name=joinPnt]').val(rowData.joinPnt);
-
-		$(formId + ' input[name=birthCpnId]').val(rowData.birthCpnId);
-		$(formId + ' input[name=birthCpnNm]').val(rowData.birthCpnNm);
-		$(formId + ' input[name=birthPnt]').val(rowData.birthPnt);
-
-		$(formId + ' input[name=sgoodsPntPrate10]').val(rowData.sgoodsPntPrate10.addComma());
-		$(formId + ' input[name=sgoodsPntMrate10]').val(rowData.sgoodsPntMrate10.addComma());
-		$(formId + ' input[name=sgoodsPntPrate20]').val(rowData.sgoodsPntPrate20.addComma());
-		$(formId + ' input[name=sgoodsPntMrate20]').val(rowData.sgoodsPntMrate20.addComma());
-		$(formId + ' input[name=egoodsPntPrate10]').val(rowData.egoodsPntPrate10.addComma());
-		$(formId + ' input[name=egoodsPntMrate10]').val(rowData.egoodsPntMrate10.addComma());
-		$(formId + ' input[name=egoodsPntPrate20]').val(rowData.egoodsPntPrate20.addComma());
-		$(formId + ' input[name=egoodsPntMrate20]').val(rowData.egoodsPntMrate20.addComma());
-		$(formId + ' input[name=appFsetupPnt]').val(rowData.appFsetupPnt.addComma());
-		$(formId + ' input[name=usablePntPendingDays]').val(rowData.usablePntPendingDays);
-		$(formId + ' input[name=textReviewPnt]').val(rowData.textReviewPnt.addComma());
-		$(formId + ' input[name=photoReviewPnt]').val(rowData.photoReviewPnt.addComma());
-		$(formId + ' input[name=usePossibMaxPnt]').val(rowData.usePossibMaxPnt.addComma());
-		$(formId + ' input[name=minOrdAmt]').val(rowData.minOrdAmt.addComma());
-		$(formId + ' input[name=shipDelayBaseDays]').val(rowData.shipDelayBaseDays);
-		$(formId + ' input[name=shipDelayPnt]').val(rowData.shipDelayPnt.addComma());
-		$(formId + ' input[name=soldoutBaseDays]').val(rowData.soldoutBaseDays);
-		$(formId + ' input[name=soldoutPnt]').val(rowData.soldoutPnt.addComma());
-		$(formId + ' select[name=usePntUnit]').val(rowData.usePntUnit).prop("selected", true);
-		$(formId + " input:radio[name=usePossibPntGb]:input[value="+rowData.usePossibPntGb+"]").click();
-	}
-
-	// 사용가능포인트 구분시 사용가능최대포인트 %
-	var fnUsePntGb = function(pntGb) {
-		if(pntGb == "A") {
-			$("#pntR").html("원");
-		}else if(pntGb == "R") {
-			$("#pntR").html("%");
-		}
-
-	}
-
-	// 혜택구분(C:쿠폰, P:포인트, B:둘다) 선택시 이벤트
-	var fnBenefitGb = function(pVal) {
-		// 가입축하쿠폰ID(혜택구분이 "C:쿠폰" 또는 "B:둘다"일 때 사용)
-		if(pVal == "C") {
-			$(".cpn").each(function(){
-				$(this).attr("disabled", false);
-			});
-			$(".point").each(function(){
-				$(this).attr("disabled", true);
-			});
-		}else if(pVal == "P"){
-			$(".cpn").each(function(){
-				$(this).attr("disabled", true);
-			});
-			$(".point").each(function(){
-				$(this).attr("disabled", false);
-			});
-		}else if(pVal == "B"){
-			$(".cpn").each(function(){
-				$(this).attr("disabled", false);
-			});
-			$(".point").each(function(){
-				$(this).attr("disabled", false);
-			});
-		}
-	}
-
-	// 쿠폰가지고 오기
-	var fnCouponSerch = function(type) {
-		var actionUrl = "/marketing/policy/coupon/popup/form?callBackFun=fnResult&type="+type;
-		cfnOpenModalPopup(actionUrl,'popupCoupon');
-	}
-
-	// 가지고온 쿠폰값 셋팅
-	var fnResult = function(result) {
-		if(result[0].type == 'J'){
-			$('#detailForm input[name=joinCpnId]').val(result[0].cpnId);
-		}else if(result[0].type == 'B'){
-			$('#detailForm input[name=birthCpnId]').val(result[0].cpnId);
-		}
-	}
-
-	//저장
-	fnSave = function(){
-
-		var formId = '#detailForm';
-		// 입력 값 체크
-		if (!gagajf.validation(formId))
-			return false;
-
-		var siteCd = 					$(formId + " select[name=siteCd]").val();                      //사이트
-		var joinCpnId = 				$(formId + " input[name=joinCpnId]").val();                    //가입쿠폰ID
-		var birthCpnId = 				$(formId + " input[name=birthCpnId]").val();                   //생일쿠폰ID
-		var joinPnt = 					$(formId + " input[name=joinPnt]").val().removeComma();              //가입포인트
-		var birthPnt = 					$(formId + " input[name=birthPnt]").val().removeComma();             //생일포인트
-		var benefitGb = 				$(formId + " select[name=benefitGb]").val();                   //해택구분
-		var appFsetupPnt =				$(formId + " input[name=appFsetupPnt]").val().removeComma();         //앱최초설치포인트
-		var sgoodsPntMrate10 = 			$(formId + " input[name=sgoodsPntMrate10]").val().removeComma();     //자사상품포인트적립율(PC정상)
-		var sgoodsPntMrate20 = 			$(formId + " input[name=sgoodsPntMrate20]").val().removeComma();     //자사상품포인트적립율(모바일정상)
-		var sgoodsPntPrate10 = 			$(formId + " input[name=sgoodsPntPrate10]").val().removeComma();     //자사상품포인트적립율(PC이월)
-		var sgoodsPntPrate20 = 			$(formId + " input[name=sgoodsPntPrate20]").val().removeComma();     //자사상품포인트적립율(모바일이월)
-		var egoodsPntMrate10 = 			$(formId + " input[name=egoodsPntMrate10]").val().removeComma();     //입점상품포인트적립율(PC정상)
-		var egoodsPntMrate20 = 			$(formId + " input[name=egoodsPntMrate20]").val().removeComma();     //입점상품포인트적립율(모바일정상)
-		var egoodsPntPrate10 = 			$(formId + " input[name=egoodsPntPrate10]").val().removeComma();     //입점상품포인트적립율(PC이월)
-		var egoodsPntPrate20 = 			$(formId + " input[name=egoodsPntPrate20]").val().removeComma();     //입점상품포인트적립율(모바일이월)
-		var usablePntPendingDays = 		$(formId + " input[name=usablePntPendingDays]").val().removeComma(); //가용포인트전환대기일수
-		var textReviewPnt = 			$(formId + " input[name=textReviewPnt]").val().removeComma();        //텍스트상품평포인트
-		var photoReviewPnt = 			$(formId + " input[name=photoReviewPnt]").val().removeComma();       //포토상품평포인트
-		var usePossibMaxPnt = 			$(formId + " input[name=usePossibMaxPnt]").val().removeComma();      //사용가능최대포인트
-		var minOrdAmt = 				$(formId + " input[name=minOrdAmt]").val().removeComma();            //무료배송비최소주문금액
-		var shipDelayBaseDays = 		$(formId + " input[name=shipDelayBaseDays]").val();            //배송지연보상기준일수
-		var shipDelayPnt = 				$(formId + " input[name=shipDelayPnt]").val().removeComma();         //배송지연보상포인트
-		var soldoutBaseDays = 			$(formId + " input[name=soldoutBaseDays]").val();              //품절보상기준일수
-		var soldoutPnt = 				$(formId + " input[name=soldoutPnt]").val().removeComma();           //품절보상포인트
-		var usePntUnit =				$(formId + " select[name=usePntUnit]").val();                  //사용포인트단위
-		var usePossibPntGb = 			$(formId + " input:radio[name=usePossibPntGb]:checked").val(); //사용가능포인트구분
-
-		mcxDialog.confirm("저장하시겠습니까?", {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				var data = {
-						formId : formId
-						,siteCd  				: siteCd
-						,joinCpnId  			: joinCpnId
-						,birthCpnId  			: birthCpnId
-						,joinPnt  				: joinPnt
-						,birthPnt  				: birthPnt
-						,benefitGb  			: benefitGb
-						,appFsetupPnt 			: appFsetupPnt
-						,sgoodsPntMrate10 		: sgoodsPntMrate10
-						,sgoodsPntMrate20 		: sgoodsPntMrate20
-						,sgoodsPntPrate10 		: sgoodsPntPrate10
-						,sgoodsPntPrate20 		: sgoodsPntPrate20
-						,egoodsPntMrate10 		: egoodsPntMrate10
-						,egoodsPntMrate20 		: egoodsPntMrate20
-						,egoodsPntPrate10 		: egoodsPntPrate10
-						,egoodsPntPrate20 		: egoodsPntPrate20
-						,usablePntPendingDays 	: usablePntPendingDays
-						,textReviewPnt  		: textReviewPnt
-						,photoReviewPnt  		: photoReviewPnt
-						,usePossibMaxPnt  		: usePossibMaxPnt
-						,minOrdAmt  			: minOrdAmt
-						,shipDelayBaseDays		: shipDelayBaseDays
-						,shipDelayPnt  			: shipDelayPnt
-						,soldoutBaseDays  		: soldoutBaseDays
-						,soldoutPnt  			: soldoutPnt
-						,usePntUnit 			: usePntUnit
-						,usePossibPntGb  		: usePossibPntGb
-				};
-				var jsonData = JSON.stringify(data);
-				gagajf.ajaxJsonSubmit($(formId).prop('action'), jsonData, fnSaveCallback);
-			}
-		});
-	}
-
-	var fnSaveCallback = function () {
-		fnSearch();
-		$("#detailForm")[0].reset();
-	}
-
-	$(document).ready(function() {
-		gagaAgGrid.createGrid('gridList', gridOptionsPolicy);
-
-		//혜택구분 쿠폰/포인트 초기화
-		fnBenefitGb('B');
-
-		$(":input[name=benefitGb]").change();
-
-		fnSearch();
-	});
-
-
-	/*가입축하쿠폰 온키업 이벤트*/
-	var fnJoinCpnOnKeyUp = function(pThis){
-		if(window.event.keyCode == 13){
-			var actionUrl = "/marketing/policy/coupon/popup/form?callBackFunc=fnJoinCallBack&cpnNm="+$(pThis).val();
-			cfnOpenModalPopup(actionUrl,'popupCoupon');
-		}
-	}
-	var fnJoinCallBack = function(params){
-		$("input[name=joinCpnId]").val(params[0].cpnId);
-		$("input[name=joinCpnNm]").val(params[0].cpnNm);
-	}
-
-	//생일축하쿠폰 온키업 이벤트
-	var fnBirthCpnOnKeyUp = function(pThis){
-		if(window.event.keyCode == 13){
-			var actionUrl = "/marketing/policy/coupon/popup/form?callBackFunc=fnBirthCallBack&cpnNm="+$(pThis).val();
-			cfnOpenModalPopup(actionUrl,'popupCoupon');
-		}
-	}
-	var fnBirthCallBack = function(params){
-		$("input[name=birthCpnId]").val(params[0].cpnId);
-		$("input[name=birthCpnNm]").val(params[0].cpnNm);
-	}
-
-
-/*]]>*/
-</script>
-</html>

+ 0 - 180
style24.admin/src/main/webapp/WEB-INF/views/system/UserListForm.html

@@ -1,180 +0,0 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : UserListForm.html
- * @desc    : 사용자 조회 팝업 Page
- *============================================================================
- * Wivismall
- * Copyright(C) 2019 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2019.12.10   sasa004     최초 작성
- *******************************************************************************
- -->
-<ul class="popup modal" data-width="600" data-height="670">
-	<li class="mdPopTitle">
-		<strong>관리자 신청자</strong>
-		<button type="button" class="close" onclick="uifnPopupClose('popupUserList');"><em class="fa fa-times"></em></button>
-	</li>
-	
-	<li class="mdPopContent">
-		<form id="userSearchForm" name="userSearchForm">
-			<table class="frmStyle" aria-describedby="검색조건">
-				<colgroup>
-					<col style="width:10%;">
-					<col>
-				</colgroup>
-				<tbody><tr>
-					<th>신청자</th>
-					<td>
-						<input type="text" class="" name="searchTxt" maxlength="20" onkeypress="if( event.keyCode==13 ){fnSearch();}"/>
-						<input type="text" class="off"/>
-					</td>
-				</tr>
-			</tbody></table>
-		</form>
-	</li>
-	
-	<li class="mdPopBtnB aR">
-		<button type="button" class="btn btn-info btn-lg" onclick="fnSearch();">조회</button>
-		<button type="button" class="btn btn-info btn-lg" onclick="fnSaveUser();">확인</button>
-	</li>
-		
-	<li class="mdPopContent">
-		<div class="yScroll" style="height: 500px;">
-			<form id="userListForm" name="userListForm" action="#" th:action="@{'/system/user/list'}" th:method="post">
-				<table class="tableStyle" aria-describedby="사용자 목록">
-					<colgroup>
-						<col style="width: 20%"/>
-						<col style="width: 40%"/>
-						<col style="width: 40%"/>
-					</colgroup>
-					<thead>
-						<tr>
-							<th>선택</th>
-							<th>신청자명</th>
-							<th>신청자ID</th>
-						</tr>
-					</thead>
-					<tbody id="tbodyUserList">
-						<tr th:unless="${userList}">
-							<td colspan="4">조회 결과가 없습니다.</td>
-						</tr>
-						<tr th:each="oneData : ${userList}">
-							<input type="hidden" name="userNm" th:value="${oneData.userNm}"/>
-							<input type="hidden" name="userId" th:value="${oneData.userId}"/>
-							<td><label><input type="checkbox" name="chkUseYn" onclick="fnCheck(this);"/></label></td>
-							<td style="text-align: center" th:text="${oneData.userNm}"></td>
-							<td style="text-align: center" th:text="${oneData.userId}"></td>
-						</tr>
-					</tbody>
-				</table>
-			</form>
-		</div>
-	</li>
-	
-</ul>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	
-	// 체크버튼 라디오버튼화
-	var fnCheck = function(obj) {
-		var $el = $('#userListForm input:checkbox[name=chkUseYn]');
-		
-		$.each($el, function(idx, item) {
-			$(this).prop('checked', false);
-			$(this).parent('label').removeClass('checked');
-		});
-		$(obj).parent('label').addClass('checked');
-		$(obj).prop('checked', true);
-	}
-	
-	var fnSearch = function() {
-		var searchData = []; 
-		var searchTxt = $('#userSearchForm input[name=searchTxt]').val();
-		
-		searchData = {searchGb : 'userNm'
-				,searchTxt : searchTxt
-		};
-		
-		var jsonData = JSON.stringify(searchData);
-		gagajf.ajaxJsonSubmit($('#userListForm').prop('action'), jsonData, fnSearchResult);
-	}
-	
-	var fnSearchResult = function(result){
-		
-		var resultLn = result.length;
-		var html = '';
-		if(resultLn==0){
-			html += '<tr th:unless="${userList}">';
-			html += '<td colspan="4">조회 결과가 없습니다.</td>';
-			html += '</tr>';
-		}else{
-			for(var i=0; i<resultLn; i++){
-				html += '<tr th:unless="${userList}">';
-				html += '<input type="hidden" name="userNm" value="'+result[i].userNm+'"/>';
-				html += '<input type="hidden" name="userId" value="'+result[i].userId+'"/>';
-				html += '<td><label><input type="checkbox" name="chkUseYn" onclick="fnCheck(this);"/></label></td>';
-				html += '<td style="text-align: center">'+result[i].userNm+'</td>';
-				html += '<td style="text-align: center">'+result[i].userId+'</td>';
-				html += '</tr>';
-			}
-		}
-		$("#tbodyUserList").html(html);
-		
-		fnRowSizeOne();
-	}
-	
-	// 확인
-	var fnSaveUser = function() {
-		var changedData = [];
-		
-		$('#tbodyUserList tr').each(function(idx) {
-			if ($(this).find('input:checkbox[name=chkUseYn]').is(':checked')) {
-				userId = $(this).find('input[name=userId]').val();
-				userNm = $(this).find('input[name=userNm]').val();
-				changedData = {userId : userId
-						,userNm : userNm
-				};
-			}
-		});
-		var callback = [[${params.callBackFun}]];
-
-		var jsonData = JSON.stringify(changedData);
-
-		if( typeof callback != 'undefined' && callback){
-
-			if (typeof callback == 'function') {
-				callback(jsonData);
-			}else{
-				if( callback ) {
-					if( callback.indexOf("(") == -1 ) eval( callback +"(" + jsonData+")");
-					else eval( callback(jsonData) );
-				}
-			}
-			uifnPopupClose('popupUserList');
-		}
-	}
-	
-	var fnRowSizeOne = function(){
-		var rowSize = $('#tbodyUserList tr').length;
-		if(rowSize==1){
-			if(typeof $('#userListForm input[name=userNm]').val()!='undefined'){
-				$('#userListForm input:checkbox[name=chkUseYn]').parent('label').addClass('checked');
-				$('#userListForm input:checkbox[name=chkUseYn]').prop('checked', true);
-				fnSaveUser();
-			}
-		}
-	}
-	
-	$(document).ready(function() {
-		fnRowSizeOne();
-	});
-/*]]>*/
-</script>
-
-</html>

+ 11 - 11
style24.admin/src/main/webapp/ux/js/admin.popup.js

@@ -55,22 +55,22 @@ var cfnOpenModalPopup = function(actionUrl, oTarget) {
 /**
  * @type   : function
  * @access : public
- * @desc   : 사용자 정보 목록 팝업
+ * @desc   : MD 목록 팝업
  * <pre>
- *     cfnOpenUserListPopup();
+ *     cfnOpenMdListPopup();
  *     or
- *     cfnOpenUserListPopup('fnResult');
+ *     cfnOpenMdListPopup('fnResult');
  *     or
- *     cfnOpenUserListPopup('fnResult', '홍길동');
+ *     cfnOpenMdListPopup('fnResult', '홍길동');
  * </pre>
- * @since  : 2019/12/10
- * @author : sasa004
+ * @since  : 2020/11/04
+ * @author : gagamel
  */
-var cfnOpenUserListPopup = function(callbackfun, userNm) {
-	var actionUrl = '/system/user/list/form';
-	if (typeof(callbackfun) != 'undefined') actionUrl += "?callBackFun=" + callbackfun;
-	if (typeof(userNm) != 'undefined') actionUrl+= "&searchTxt="+ userNm+'&searchGb=userNm';
-	cfnOpenModalPopup(actionUrl, "popupUserList");
+var cfnOpenMdListPopup = function(callbackfn, userNm) {
+	var actionUrl = '/business/md/list/form';
+	if (typeof(callbackfn) != 'undefined') actionUrl += "?callbackFn=" + callbackfn;
+	if (typeof(userNm) != 'undefined') actionUrl += "&mdNm=" + encodeURIComponent(userNm) + '&searchGb=userNm';
+	cfnOpenModalPopup(actionUrl, "popupMdList");
 }
 
 /**

+ 29 - 29
style24.core/src/main/java/com/style24/core/biz/service/TscEnvsetService.java

@@ -57,99 +57,99 @@ public class TscEnvsetService {
 	}
 
 	/**
-	 * 자사상품정상포인트(PC) 가져오기
+	 * 자사상품정상PC포인트율 가져오기
 	 * @param siteCd - 사이트코드
 	 * @return
 	 * @author gagamel
 	 * @since 2020. 10. 21
 	 */
-	public int getSelfGoodsPcPoint10(String siteCd) {
+	public float getSelfGoodsPcPointRate10(String siteCd) {
 		Envset envset = this.getEnvset(siteCd, "C15");
-		return Integer.parseInt(envset.getStrSetVal1());
+		return (envset == null) ? 0.0f : Float.parseFloat(envset.getStrSetVal1());
 	}
 
 	/**
-	 * 자사상품정상포인트(모바일) 가져오기
+	 * 자사상품정상모바일포인트율 가져오기
 	 * @param siteCd - 사이트코드
 	 * @return
 	 * @author gagamel
 	 * @since 2020. 10. 21
 	 */
-	public int getSelfGoodsMobilePoint10(String siteCd) {
+	public float getSelfGoodsMobPointRate10(String siteCd) {
 		Envset envset = this.getEnvset(siteCd, "C15");
-		return Integer.parseInt(envset.getStrSetVal2());
+		return (envset == null) ? 0.0f : Float.parseFloat(envset.getStrSetVal2());
 	}
 
 	/**
-	 * 자사상품이월포인트(PC) 가져오기
+	 * 자사상품이월PC포인트율 가져오기
 	 * @param siteCd - 사이트코드
 	 * @return
 	 * @author gagamel
 	 * @since 2020. 10. 21
 	 */
-	public int getSelfGoodsPcPoint20(String siteCd) {
+	public float getSelfGoodsPcPointRate20(String siteCd) {
 		Envset envset = this.getEnvset(siteCd, "C15");
-		return Integer.parseInt(envset.getStrSetVal3());
+		return (envset == null) ? 0.0f : Float.parseFloat(envset.getStrSetVal3());
 	}
 
 	/**
-	 * 자사상품이월포인트(모바일) 가져오기
+	 * 자사상품이월모바일포인트율 가져오기
 	 * @param siteCd - 사이트코드
 	 * @return
 	 * @author gagamel
 	 * @since 2020. 10. 21
 	 */
-	public int getSelfGoodsMobilePoint20(String siteCd) {
+	public float getSelfGoodsMobPointRate20(String siteCd) {
 		Envset envset = this.getEnvset(siteCd, "C15");
-		return Integer.parseInt(envset.getStrSetVal4());
+		return (envset == null) ? 0.0f : Float.parseFloat(envset.getStrSetVal4());
 	}
 
 	/**
-	 * 입점상품정상포인트(PC) 가져오기
+	 * 입점상품정상PC포인트율 가져오기
 	 * @param siteCd - 사이트코드
 	 * @return
 	 * @author gagamel
 	 * @since 2020. 10. 21
 	 */
-	public int getEntrGoodsPcPoint10(String siteCd) {
+	public float getEntrGoodsPcPointRate10(String siteCd) {
 		Envset envset = this.getEnvset(siteCd, "C15");
-		return Integer.parseInt(envset.getStrSetVal5());
+		return (envset == null) ? 0.0f : Float.parseFloat(envset.getStrSetVal5());
 	}
 
 	/**
-	 * 입점상품정상포인트(모바일) 가져오기
+	 * 입점상품정상모바일포인트율 가져오기
 	 * @param siteCd - 사이트코드
 	 * @return
 	 * @author gagamel
 	 * @since 2020. 10. 21
 	 */
-	public int getEntrGoodsMobilePoint10(String siteCd) {
+	public float getEntrGoodsMobPointRate10(String siteCd) {
 		Envset envset = this.getEnvset(siteCd, "C15");
-		return Integer.parseInt(envset.getStrSetVal6());
+		return (envset == null) ? 0.0f : Float.parseFloat(envset.getStrSetVal6());
 	}
 
 	/**
-	 * 입점상품이월포인트(PC) 가져오기
+	 * 입점상품이월PC포인트율 가져오기
 	 * @param siteCd - 사이트코드
 	 * @return
 	 * @author gagamel
 	 * @since 2020. 10. 21
 	 */
-	public int getEntrGoodsPcPoint20(String siteCd) {
+	public float getEntrGoodsPcPointRate20(String siteCd) {
 		Envset envset = this.getEnvset(siteCd, "C15");
-		return Integer.parseInt(envset.getStrSetVal7());
+		return (envset == null) ? 0.0f : Float.parseFloat(envset.getStrSetVal7());
 	}
 
 	/**
-	 * 입점상품이월포인트(모바일) 가져오기
+	 * 입점상품이월모바일포인트율 가져오기
 	 * @param siteCd - 사이트코드
 	 * @return
 	 * @author gagamel
 	 * @since 2020. 10. 21
 	 */
-	public int getEntrGoodsMobilePoint20(String siteCd) {
+	public float getEntrGoodsMobPointRate20(String siteCd) {
 		Envset envset = this.getEnvset(siteCd, "C15");
-		return Integer.parseInt(envset.getStrSetVal8());
+		return (envset == null) ? 0.0f : Float.parseFloat(envset.getStrSetVal8());
 	}
 
 	/**
@@ -161,7 +161,7 @@ public class TscEnvsetService {
 	 */
 	public int getTextReviewPoint(String siteCd) {
 		Envset envset = this.getEnvset(siteCd, "C16");
-		return Integer.parseInt(envset.getStrSetVal3());
+		return (envset == null) ? 0 : Integer.parseInt(envset.getStrSetVal3());
 	}
 
 	/**
@@ -173,7 +173,7 @@ public class TscEnvsetService {
 	 */
 	public int getPhotoReviewPoint(String siteCd) {
 		Envset envset = this.getEnvset(siteCd, "C16");
-		return Integer.parseInt(envset.getStrSetVal4());
+		return (envset == null) ? 0 : Integer.parseInt(envset.getStrSetVal4());
 	}
 
 	/**
@@ -185,7 +185,7 @@ public class TscEnvsetService {
 	 */
 	public int getFirstTextReviewPoint(String siteCd) {
 		Envset envset = this.getEnvset(siteCd, "C16");
-		return Integer.parseInt(envset.getStrSetVal5());
+		return (envset == null) ? 0 : Integer.parseInt(envset.getStrSetVal5());
 	}
 
 	/**
@@ -197,7 +197,7 @@ public class TscEnvsetService {
 	 */
 	public int getFirstPhotoReviewPoint(String siteCd) {
 		Envset envset = this.getEnvset(siteCd, "C16");
-		return Integer.parseInt(envset.getStrSetVal6());
+		return (envset == null) ? 0 : Integer.parseInt(envset.getStrSetVal6());
 	}
 
 	/**
@@ -209,7 +209,7 @@ public class TscEnvsetService {
 	 */
 	public int getBestReviewPoint(String siteCd) {
 		Envset envset = this.getEnvset(siteCd, "C16");
-		return Integer.parseInt(envset.getStrSetVal7());
+		return (envset == null) ? 0 : Integer.parseInt(envset.getStrSetVal7());
 	}
 
 }