瀏覽代碼

이태영 - 20210119 develop source update

xodud1202 5 年之前
父節點
當前提交
a6e820b852
共有 47 個文件被更改,包括 3523 次插入332 次删除
  1. 25 0
      src/main/java/com/style24/admin/biz/dao/TsaBusinessDao.java
  2. 2 0
      src/main/java/com/style24/admin/biz/dao/TsaCounselDao.java
  3. 9 0
      src/main/java/com/style24/admin/biz/dao/TsaCustomerDao.java
  4. 24 0
      src/main/java/com/style24/admin/biz/dao/TsaDisplayDao.java
  5. 25 0
      src/main/java/com/style24/admin/biz/service/TsaBusinessService.java
  6. 11 0
      src/main/java/com/style24/admin/biz/service/TsaCustomerService.java
  7. 93 0
      src/main/java/com/style24/admin/biz/service/TsaDisplayService.java
  8. 2 2
      src/main/java/com/style24/admin/biz/service/TsaGoodsService.java
  9. 100 15
      src/main/java/com/style24/admin/biz/web/TsaBusinessController.java
  10. 100 1
      src/main/java/com/style24/admin/biz/web/TsaCustomerController.java
  11. 57 8
      src/main/java/com/style24/admin/biz/web/TsaDisplayController.java
  12. 1 3
      src/main/java/com/style24/admin/biz/web/TsaGoodsController.java
  13. 21 0
      src/main/java/com/style24/persistence/domain/CategoryGoods.java
  14. 1 0
      src/main/java/com/style24/persistence/domain/CustomerSearch.java
  15. 3 2
      src/main/java/com/style24/persistence/domain/Goods.java
  16. 1 1
      src/main/java/com/style24/persistence/domain/GoodsNotiInfo.java
  17. 1 0
      src/main/java/com/style24/persistence/domain/Itemkind.java
  18. 1 1
      src/main/java/com/style24/persistence/domain/NotiInfo.java
  19. 1 1
      src/main/java/com/style24/persistence/domain/Option.java
  20. 5 4
      src/main/java/com/style24/persistence/domain/SupplyCompany.java
  21. 1 1
      src/main/java/com/style24/persistence/domain/WmsColorMapping.java
  22. 1 1
      src/main/java/com/style24/persistence/domain/WmsSeasonMapping.java
  23. 1 1
      src/main/java/com/style24/persistence/domain/WmsStyleYearMapping.java
  24. 149 83
      src/main/java/com/style24/persistence/mybatis/shop/TsaBusiness.xml
  25. 217 4
      src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml
  26. 207 10
      src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml
  27. 42 37
      src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  28. 4 4
      src/main/resources/log/logback-locd.xml
  29. 49 6
      src/main/webapp/WEB-INF/views/business/BrandForm.html
  30. 60 43
      src/main/webapp/WEB-INF/views/business/SupplyCompanyForm.html
  31. 282 0
      src/main/webapp/WEB-INF/views/business/SupplyVendorForm.html
  32. 142 0
      src/main/webapp/WEB-INF/views/business/SupplyVendorPopupForm.html
  33. 24 22
      src/main/webapp/WEB-INF/views/customer/CustomerActiveListForm.html
  34. 1471 0
      src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html
  35. 5 6
      src/main/webapp/WEB-INF/views/customer/CustomerDormantListForm.html
  36. 7 8
      src/main/webapp/WEB-INF/views/customer/CustomerSecedeListForm.html
  37. 81 0
      src/main/webapp/WEB-INF/views/display/CategoryGoodsForm.html
  38. 224 26
      src/main/webapp/WEB-INF/views/display/GoodsCategoryForm.html
  39. 1 1
      src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html
  40. 1 1
      src/main/webapp/WEB-INF/views/goods/GoodsItemkindForm.html
  41. 2 2
      src/main/webapp/WEB-INF/views/goods/GoodsListForm.html
  42. 10 10
      src/main/webapp/WEB-INF/views/goods/NotiinfoForm.html
  43. 8 7
      src/main/webapp/WEB-INF/views/goods/WmsColorMappingForm.html
  44. 7 6
      src/main/webapp/WEB-INF/views/goods/WmsSeasonMappingForm.html
  45. 7 6
      src/main/webapp/WEB-INF/views/goods/WmsStyleYearMappingForm.html
  46. 4 4
      src/main/webapp/WEB-INF/views/marketing/CouponRetrievePopupForm.html
  47. 33 5
      src/main/webapp/ux/js/admin.popup.js

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

@@ -23,6 +23,31 @@ import com.style24.persistence.domain.SupplyCompany;
 @ShopDs
 public interface TsaBusinessDao {
 
+	/**
+	 * 공급벤더 목록
+	 * @param supplyComp - 공급업체 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 18
+	 */
+	Collection<SupplyCompany> getSupplyVendorList(SupplyCompany supplyComp);
+
+	/**
+	 * 공급벤더 생성
+	 * @param supplyComp - 공급업체 정보
+	 * @author gagamel
+	 * @since 2021. 1. 18
+	 */
+	void createSupplyVendor(SupplyCompany supplyComp);
+
+	/**
+	 * 공급벤더 수정
+	 * @param supplyComp - 공급업체 정보
+	 * @author gagamel
+	 * @since 2021. 1. 18
+	 */
+	void updateSupplyVendor(SupplyCompany supplyComp);
+
 	/**
 	 * 공급업체 목록
 	 * @param supplyComp - 공급업체 정보

+ 2 - 0
src/main/java/com/style24/admin/biz/dao/TsaCounselDao.java

@@ -4,6 +4,7 @@ import java.util.Collection;
 
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Counsel;
+import org.springframework.stereotype.Repository;
 
 /**
  * 상담(1:1문의) Dao
@@ -12,6 +13,7 @@ import com.style24.persistence.domain.Counsel;
  * @since 2020. 12. 24
  */
 @ShopDs
+@Repository
 public interface TsaCounselDao {
 
 	/**

+ 9 - 0
src/main/java/com/style24/admin/biz/dao/TsaCustomerDao.java

@@ -26,6 +26,15 @@ public interface TsaCustomerDao {
 	 */
 	Collection<Customer> getCustomerActiveList(CustomerSearch customerSearch);
 
+	/**
+	 * 회원 정보
+	 * @param custNo - 고객번호
+	 * @return Customer
+	 * @author jsshin
+	 * @since 2020. 01. 18
+	 */
+	Customer getCustomerInfo(String custNo);
+
 	/**
 	 * 탈퇴회원 목록
 	 * @param customerSearch - 검색조건

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

@@ -152,4 +152,28 @@ public interface TsaDisplayDao {
 	 * @since 2021. 1. 15
 	 */
 	Collection<Goods> getGoodsCategoryList(GoodsCategory goodsCategory);
+
+	/**
+	 * 상품별카테고리전시 저장
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 17
+	 */
+	void saveGoodsCategory(GoodsCategory goodsCategory);
+
+	/**
+	 * 상품별카테고리 리스트 조회
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 18
+	 */
+	Collection<GoodsCategory> getGoodsCategoryViewList(String goodsCd);
+
+	/**
+	 * 상품별카테고리 삭제
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 18
+	 */
+	void deleteGoodsCategory(GoodsCategory goodsCategory);
 }

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

@@ -48,6 +48,31 @@ public class TsaBusinessService {
 	@Autowired
 	private TsaBusinessDao businessDao;
 
+	/**
+	 * 공급벤더 목록
+	 * @param supplyComp - 공급업체 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 18
+	 */
+	public Collection<SupplyCompany> getSupplyVendorList(SupplyCompany supplyComp) {
+		return businessDao.getSupplyVendorList(supplyComp);
+	}
+
+	/**
+	 * 공급벤더 저장 처리
+	 * @param supplyComp - 공급업체 정보
+	 * @author gagamel
+	 * @since 2021. 1. 18
+	 */
+	public void saveSupplyVendor(SupplyCompany supplyComp) {
+		if (!StringUtils.isEmpty(supplyComp.getSupplyVendorCd())) {
+			businessDao.updateSupplyVendor(supplyComp);
+		} else {
+			businessDao.createSupplyVendor(supplyComp);
+		}
+	}
+
 	/**
 	 * 공급업체 목록
 	 * @param supplyComp - 공급업체 정보

+ 11 - 0
src/main/java/com/style24/admin/biz/service/TsaCustomerService.java

@@ -33,6 +33,17 @@ public class TsaCustomerService {
 		return customerDao.getCustomerActiveList(customerSearch);
 	}
 
+	/**
+	 * 회원 정보
+	 * @param custNo - 고객번호
+	 * @return Customer
+	 * @author jsshin
+	 * @since 2020. 01. 18
+	 */
+	public Customer getCustomerInfo(String custNo) {
+		return customerDao.getCustomerInfo(custNo);
+	}
+
 	/**
 	 * 탈퇴회원 목록
 	 * @param customerSearch - 검색조건

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

@@ -3,6 +3,7 @@ package com.style24.admin.biz.service;
 import java.util.Collection;
 
 import com.style24.persistence.domain.*;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.stereotype.Service;
@@ -177,4 +178,96 @@ public class TsaDisplayService {
 	public Collection<Goods> getGoodsCategoryList(GoodsCategory goodsCategory) {
 		return displayDao.getGoodsCategoryList(goodsCategory);
 	}
+
+	/**
+	 * 상품별카테고리전시 저장
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 17
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsCategory(GoodsCategory goodsCategory) {
+		goodsCategory.setRegNo(TsaSession.getInfo().getUserNo());
+		goodsCategory.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		if(StringUtils.isNotEmpty(goodsCategory.getGoodsCds())){
+			String[] goodsCdArr = goodsCategory.getGoodsCds().split(",");
+			for (String goodsCd : goodsCdArr) {
+				goodsCategory.setGoodsCd(goodsCd);
+				int cnt = 0;
+				for (String cateCd : goodsCategory.getCateCdArr()) {
+					if(StringUtils.isNotEmpty(cateCd)){
+						goodsCategory.setCateCd(cateCd);
+						goodsCategory.setCateGb(goodsCategory.getCateGbArr()[cnt]);
+						goodsCategory.setCateType(goodsCategory.getCateTypeArr()[cnt]);
+						displayDao.saveGoodsCategory(goodsCategory);
+
+						if(!"G031_20".equals(goodsCategory.getCateType())){
+							if(StringUtils.isNotEmpty(goodsCategory.getCateCd3Arr()[cnt])){
+								String[] cate3Array = goodsCategory.getCateCd3Arr()[cnt].split(",");
+								if(cate3Array[1].equals("N")){
+									goodsCategory.setCateCd(cate3Array[0]);
+									displayDao.saveGoodsCategory(goodsCategory);
+								}
+							}
+
+							if(StringUtils.isNotEmpty(goodsCategory.getCateCd2Arr()[cnt])){
+								String[] cate2Array = goodsCategory.getCateCd2Arr()[cnt] .split(",");
+								if(cate2Array[1].equals("N")){
+									goodsCategory.setCateCd(cate2Array[0]);
+									displayDao.saveGoodsCategory(goodsCategory);
+								}
+							}
+
+							if(StringUtils.isNotEmpty(goodsCategory.getCateCd1Arr()[cnt])){
+								String[] cate1Array = goodsCategory.getCateCd1Arr()[cnt] .split(",");
+								if(cate1Array[1].equals("N")){
+									goodsCategory.setCateCd(cate1Array[0]);
+									displayDao.saveGoodsCategory(goodsCategory);
+								}
+							}
+						}
+					}
+					cnt++;
+				}
+			}
+		}
+	}
+
+	/**
+	 * 상품별카테고리 리스트 조회
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 18
+	 */
+	public Collection<GoodsCategory> getGoodsCategoryViewList(String goodsCd) {
+		return displayDao.getGoodsCategoryViewList(goodsCd);
+	}
+
+	/**
+	 * 상품별카테고리 삭제
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 18
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteGoodsCategoryList(GoodsCategory goodsCategory) {
+		for (int i=0; i<goodsCategory.getCateCdArr().length; i++){
+			GoodsCategory goodsCategoryData = new GoodsCategory();
+			goodsCategoryData.setGoodsCd(goodsCategory.getGoodsCd());
+			goodsCategoryData.setCateCd(goodsCategory.getCateCdArr()[i]);
+			goodsCategoryData.setCateCd1(goodsCategory.getCateCd1Arr()[i]);
+			goodsCategoryData.setCateCd2(goodsCategory.getCateCd2Arr()[i]);
+			goodsCategoryData.setCateCd3(goodsCategory.getCateCd3Arr()[i]);
+			goodsCategoryData.setCateCd4(goodsCategory.getCateCd4Arr()[i]);
+			goodsCategoryData.setCateType(goodsCategory.getCateTypeArr()[i]);
+			this.deleteGoodsCategory(goodsCategoryData);
+		}
+	}
+
+	@Transactional("shopTxnManager")
+	public void deleteGoodsCategory(GoodsCategory goodsCategory) {
+		displayDao.deleteGoodsCategory(goodsCategory);
+	}
+
 }

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

@@ -1264,7 +1264,7 @@ public class TsaGoodsService {
 			goodsStock.setOptCd2(goods.getOptCd2()[index]);
 			goodsStock.setBaseStockQty(Integer.parseInt(goods.getBaseStockQty()[index]));
 			goodsStock.setSoldoutYn(goods.getSoldoutYn()[index]);
-			goodsStock.setDispOrd(goods.getDispOrd()[index]);
+			goodsStock.setDispOrd(Integer.parseInt(goods.getDispOrd()[index]));
 			goodsStock.setDispYn(goods.getDispYn()[index]);
 			goodsStock.setRegNo(goods.getRegNo());
 			goodsStock.setUpdNo(goods.getUpdNo());
@@ -1566,7 +1566,7 @@ public class TsaGoodsService {
 		String goodsCd = "";
 		Goods goods = new Goods();
 		goodsDao.createGoodsSequence(goods);
-		String goodsSeq = GagaStringUtil.getLPadding(Integer.toString(goods.getGoodsSq()), 9, "0");
+		String goodsSeq = GagaStringUtil.getLPadding(Integer.toString(goods.getGoodsSq()), 8, "0");
 		if ("S".equals(goodsType) || "D".equals(goodsType)) {
 			goodsCd = SELF_GOOODS_AFTER + goodsCdAfter + goodsSeq;
 

+ 100 - 15
src/main/java/com/style24/admin/biz/web/TsaBusinessController.java

@@ -1,6 +1,19 @@
 package com.style24.admin.biz.web;
 
-import com.gagaframework.web.rest.server.GagaResponse;
+import java.util.Collection;
+
+import org.apache.commons.lang3.StringUtils;
+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;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
 import com.style24.admin.biz.service.TsaBusinessService;
 import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.support.controller.TsaBaseController;
@@ -8,16 +21,20 @@ import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.biz.service.TscEnvsetService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.persistence.domain.*;
+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.DelvFeePolicy;
+import com.style24.persistence.domain.SellStore;
+import com.style24.persistence.domain.ShipCompany;
+import com.style24.persistence.domain.SiteBrand;
+import com.style24.persistence.domain.StockSyncBase;
+import com.style24.persistence.domain.SupplyCompany;
+
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.servlet.ModelAndView;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
+import com.gagaframework.web.rest.server.GagaResponse;
 
 /**
  * 영업관리 Controller
@@ -42,6 +59,74 @@ public class TsaBusinessController extends TsaBaseController {
 	@Autowired
 	private TscEnvsetService cenvsetService;
 
+	/**
+	 * 공급벤더관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 18
+	 */
+	@GetMapping("/supply/vendor/form")
+	public ModelAndView supplyVendorForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("/business/SupplyVendorForm");
+
+		return mav;
+	}
+
+	/**
+	 * 공급벤더 목록
+	 * @param supplyComp - 공급벤더 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 18
+	 */
+	@PostMapping("/supply/vendor/list")
+	@ResponseBody
+	public Collection<SupplyCompany> getSupplyVendorList(@RequestBody SupplyCompany supplyComp) {
+		return businessService.getSupplyVendorList(supplyComp);
+	}
+
+	/**
+	 * 공급벤더 저장 처리
+	 * @param supplyComp - 공급벤더 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 14
+	 */
+	@PostMapping("/supply/vendor/save")
+	@ResponseBody
+	public GagaResponse saveSupplyVendor(@RequestBody SupplyCompany supplyComp) {
+		supplyComp.setRegNo(TsaSession.getInfo().getUserNo());
+		supplyComp.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		businessService.saveSupplyVendor(supplyComp);
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 공급벤더팝업 화면
+	 * @param returnCode - 반환할코드. 필수
+	 * @param returnName - 반환할명칭. 필수
+	 * @param supplyVendorNm - 공급업체명. 옵션
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 18
+	 */
+	@GetMapping("/supply/vendor/popup/form")
+	public ModelAndView supplyVendorPopupForm(@RequestParam(value = "returnCode") String returnCode, @RequestParam(value = "returnName") String returnName, @RequestParam(value = "supplyVendorNm", required = false) String supplyVendorNm) {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("returnCode", returnCode);
+		mav.addObject("returnName", returnName);
+		mav.addObject("supplyVendorNm", StringUtils.defaultString(supplyVendorNm, ""));
+
+		mav.setViewName("/business/SupplyVendorPopupForm");
+
+		return mav;
+	}
+
 	/**
 	 * 공급업체관리 화면
 	 * @return
@@ -70,20 +155,20 @@ public class TsaBusinessController extends TsaBaseController {
 	}
 
 	/**
-	 * 공급업체관리 목록
+	 * 공급업체 목록
+	 * @param supplyComp - 공급업체 정보
 	 * @return
 	 * @author gagamel
 	 * @since 2020. 10. 14
 	 */
 	@PostMapping("/supply/company/list")
 	@ResponseBody
-	public List<SupplyCompany> getCompanyList(@RequestBody SupplyCompany supplyComp) {
-		List<SupplyCompany> result = (ArrayList<SupplyCompany>) businessService.getSupplyCompanyList(supplyComp);
-		return result;
+	public Collection<SupplyCompany> getSupplyCompanyList(@RequestBody SupplyCompany supplyComp) {
+		return businessService.getSupplyCompanyList(supplyComp);
 	}
 
 	/**
-	 * 공급업체관리 저장 처리
+	 * 공급업체 저장 처리
 	 * @param supplyComp - 공급업체 정보
 	 * @return
 	 * @author gagamel
@@ -91,7 +176,7 @@ public class TsaBusinessController extends TsaBaseController {
 	 */
 	@PostMapping("/supply/company/save")
 	@ResponseBody
-	public GagaResponse saveSupplyInfo(@RequestBody SupplyCompany supplyComp) {
+	public GagaResponse saveSupplyCompany(@RequestBody SupplyCompany supplyComp) {
 		supplyComp.setRegNo(TsaSession.getInfo().getUserNo());
 		supplyComp.setUpdNo(TsaSession.getInfo().getUserNo());
 

+ 100 - 1
src/main/java/com/style24/admin/biz/web/TsaCustomerController.java

@@ -3,6 +3,7 @@ package com.style24.admin.biz.web;
 import java.util.Collection;
 
 import com.style24.admin.biz.service.TsaCustomerService;
+import com.style24.core.support.session.TscSession;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.CustomerSearch;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -254,6 +255,9 @@ public class TsaCustomerController extends TsaBaseController {
 		// 사이트 목록
 		mav.addObject("siteList", rendererService.getCommonCodeList("G000", "Y"));
 
+		// 성별
+		mav.addObject("genderGbList", rendererService.getCommonCodeList("G007", "Y"));
+
 		// 회원 구분
 		mav.addObject("custGbList", rendererService.getCommonCodeList("G100", "Y"));
 
@@ -278,9 +282,100 @@ public class TsaCustomerController extends TsaBaseController {
 	@PostMapping("/active/list")
 	@ResponseBody
 	public Collection<Customer> getCustomerActiveList(@RequestBody CustomerSearch customerSearch) {
+		TscSession.setAttribute("maskingYn", TsaSession.getInfo().getMaskingYn());
 		return customerService.getCustomerActiveList(customerSearch);
 	}
 
+	/**
+	 * 회원상세 목록
+	 * @param custNo - 고객번호
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2020. 01. 14
+	 */
+	@GetMapping("/detail/form/{custNo}")
+	public ModelAndView getCustomerDetailForm(@PathVariable String custNo) {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트 목록
+		mav.addObject("siteList", rendererService.getCommonCodeList("G000"));
+
+		// 몰구분
+		mav.addObject("mallGbList", rendererService.getCommonCodeList("G011"));
+
+		// 성별
+		mav.addObject("genderGbList", rendererService.getCommonCodeList("G007"));
+
+		// 회원 구분
+		mav.addObject("custGbList", rendererService.getCommonCodeList("G100"));
+
+		// 회원 등급
+		mav.addObject("custGradeList", rendererService.getCommonCodeList("G110"));
+
+		// 관리대상
+		mav.addObject("managedRsnList", rendererService.getCommonCodeList("G103"));
+
+		// 전화번호국번
+		mav.addObject("nationalNumberList", rendererService.getCommonCodeList("G095"));
+
+		// 휴대폰번호국번
+		mav.addObject("nationalHpNumberList", rendererService.getCommonCodeList("G096"));
+
+		// 이메일도메인
+		mav.addObject("emailDomainList", rendererService.getCommonCodeList("G097"));
+
+		// 상담분류
+		mav.addObject("counselClsfList", rendererService.getCommonCodeList("G059"));
+
+		// 회원접촉유형 목록
+		mav.addObject("contactTypeList", rendererService.getCommonCodeList("G054"));
+
+		// 회원접촉방법 목록
+		mav.addObject("contactMethodList", rendererService.getCommonCodeList("G055"));
+
+		// 주문상태
+		mav.addObject("orderStatList", rendererService.getCommonCodeList("G012"));
+
+		// 주문상세상태
+		mav.addObject("orderDtlStatList", rendererService.getCommonCodeList("G013"));
+
+		// 쿠폰유형
+		mav.addObject("cpnType", rendererService.getCommonCodeList("G230"));
+
+		// 쿠폰할인방식
+		//mav.addObject("dcWayList", rendererService.getCommonCodeList("G240"));
+
+		// 쿠폰발행사유
+		mav.addObject("pubReasonList", rendererService.getCommonCodeList("G597"));
+
+		// 포인트반영상태
+		mav.addObject("pntOccurGbList", rendererService.getCommonCodeList("G069"));
+
+		// 포인트반영상태
+		mav.addObject("pntUploadStatList", rendererService.getCommonCodeList("G070"));
+
+
+		mav.addObject("custNo", custNo);
+
+		mav.setViewName("customer/CustomerDetailForm");
+
+		return mav;
+	}
+
+	/**
+	 * 회원 정보
+	 * @param custNo - 고객번호
+	 * @return Customer
+	 * @author jsshin
+	 * @since 2020. 01. 18
+	 */
+	@GetMapping("/info/{custNo}")
+	@ResponseBody
+	public Customer getCustomerInfo(@PathVariable String custNo) {
+		TscSession.setAttribute("maskingYn", TsaSession.getInfo().getMaskingYn());
+		return customerService.getCustomerInfo(custNo);
+	}
+
 	/**
 	 * 탈퇴회원
 	 * @return ModelAndView
@@ -295,7 +390,7 @@ public class TsaCustomerController extends TsaBaseController {
 		mav.addObject("siteList", rendererService.getCommonCodeList("G000", "Y"));
 
 		// 탈퇴 구분
-		mav.addObject("secedeGbList", rendererService.getCommonCodeList("G111", "Y"));
+		mav.addObject("secedeRsnList", rendererService.getCommonCodeList("G102", "Y"));
 
 		mav.setViewName("customer/CustomerSecedeListForm");
 
@@ -312,6 +407,7 @@ public class TsaCustomerController extends TsaBaseController {
 	@PostMapping("/secede/list")
 	@ResponseBody
 	public Collection<Customer> getCustomerSecedeList(@RequestBody CustomerSearch customerSearch) {
+		TscSession.setAttribute("maskingYn", TsaSession.getInfo().getMaskingYn());
 		return customerService.getCustomerSecedeList(customerSearch);
 	}
 
@@ -343,7 +439,10 @@ public class TsaCustomerController extends TsaBaseController {
 	@PostMapping("/dormant/list")
 	@ResponseBody
 	public Collection<Customer>getCustomerDormantList(@RequestBody CustomerSearch customerSearch) {
+		TscSession.setAttribute("maskingYn", TsaSession.getInfo().getMaskingYn());
 		return customerService.getCustomerDormantList(customerSearch);
 	}
 
+
+
 }

+ 57 - 8
src/main/java/com/style24/admin/biz/web/TsaDisplayController.java

@@ -9,12 +9,7 @@ import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.*;
 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;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.style24.admin.biz.service.TsaDisplayService;
@@ -190,7 +185,7 @@ public class TsaDisplayController extends TsaBaseController {
 
 	/**
 	 * 카테고리 목록 화면(팝업)
-	 * @param Category
+	 * @param category
 	 * @return
 	 * @author xyzp1539
 	 * @since 2021. 01. 11
@@ -255,7 +250,6 @@ public class TsaDisplayController extends TsaBaseController {
 	@ResponseBody
 	public GagaMap getGoodsCategoryList(@RequestBody GoodsCategory goodsCategory) {
 		GagaMap result = new GagaMap();
-		log.info("[getGoodsCategoryList GoodsCategory]{}",goodsCategory);
 
 		goodsCategory.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
 		goodsCategory.setPageable(new TscPageRequest(goodsCategory.getPageNo() - 1, goodsCategory.getPageSize()));
@@ -267,4 +261,59 @@ public class TsaDisplayController extends TsaBaseController {
 		return result;
 	}
 
+	/**
+	 * 상품별카테고리전시 저장
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 17
+	 */
+	@PostMapping("/goods/category/save")
+	@ResponseBody
+	public GagaResponse saveGoodsCategory(@RequestBody GoodsCategory goodsCategory) {
+		displayService.saveGoodsCategory(goodsCategory);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 상품별카테고리 리스트 조회
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 18
+	 */
+	@GetMapping("/goods/category/view/list")
+	@ResponseBody
+	public Collection<GoodsCategory> getGoodsCategoryViewList(@RequestParam(value = "goodsCd")String goodsCd) {
+		return displayService.getGoodsCategoryViewList(goodsCd);
+	}
+
+	/**
+	 * 상품별카테고리 삭제
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 18
+	 */
+	@PostMapping("/goods/category/delete")
+	@ResponseBody
+	public GagaResponse deleteGoodsCategory(@RequestBody GoodsCategory goodsCategory) {
+		displayService.deleteGoodsCategoryList(goodsCategory);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
+	/**
+	 * 카테고리별상품전시관리 화면
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 19
+	 */
+	@GetMapping("/category/goods/form")
+	public ModelAndView CategoryGoodsForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+		// 카테고리구분
+		mav.addObject("cateGbList", rendererService.getAvailCommonCodeList("G032"));
+		mav.setViewName("display/CategoryGoodsForm");
+
+		return mav;
+	}
 }

+ 1 - 3
src/main/java/com/style24/admin/biz/web/TsaGoodsController.java

@@ -7,7 +7,6 @@ import java.util.Collection;
 
 import javax.servlet.http.HttpServletRequest;
 
-import com.style24.persistence.TscPageRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.core.io.InputStreamResource;
@@ -32,6 +31,7 @@ import com.style24.admin.biz.service.TsaSystemService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.AdKeyword;
 import com.style24.persistence.domain.AdKeywordGoods;
 import com.style24.persistence.domain.Color;
@@ -617,7 +617,6 @@ public class TsaGoodsController extends TsaBaseController {
 					//고시정보
 					GoodsNotiInfo goodsNotiInfo = new GoodsNotiInfo();
 					goodsNotiInfo.setGoodsCd(tmpGoods.getGoodsCd());
-					goodsNotiInfo.setSupplyCompCd(tmpGoods.getSupplyCompCd());
 					goodsNotiInfo.setNiClsfCd(tmpGoods.getNiClsfCd());
 					Collection<GoodsNotiInfo> goodsNotiInfoList = goodsService.getGoodsNotiInfoList(goodsNotiInfo);
 					if (goodsNotiInfoList == null || goodsNotiInfoList.isEmpty()) {
@@ -845,7 +844,6 @@ public class TsaGoodsController extends TsaBaseController {
 		GoodsNotiInfo goodsInfo = new GoodsNotiInfo();
 		goodsInfo.setGoodsCd(goods.getGoodsCd());
 		goodsInfo.setNiClsfCd(goods.getNiClsfCd());
-		goodsInfo.setSupplyCompCd(goods.getSupplyCompCd());
 
 		return goodsService.getGoodsNotiInfoList(goodsInfo);
 	}

+ 21 - 0
src/main/java/com/style24/persistence/domain/CategoryGoods.java

@@ -0,0 +1,21 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+import lombok.Data;
+
+/**
+ * 카테고리 Domain
+ *
+ * @author bin2107
+ * @since 2021. 1. 19
+ */
+@SuppressWarnings("serial")
+@Data
+public class CategoryGoods extends TscBaseDomain {
+
+	private Integer cateNo;		// 카테고리번호
+
+
+	
+
+}

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

@@ -28,5 +28,6 @@ public class CustomerSearch extends TscBaseDomain {
 	private String smsAgreeYn;
 	private String emailAgreeYn;
 	private String appAgreeYn;
+	private String secedeRsn;
 
 }

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

@@ -4,8 +4,8 @@ import java.util.Collection;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
-
 import com.style24.persistence.TscPageRequest;
+
 import lombok.Data;
 
 /**
@@ -76,7 +76,8 @@ public class Goods extends TscBaseDomain {
 
 	private String brandEnm;		//브랜드영문명
 	private String brandGrpNm;		//브랜드그룹명
-	private int brandNo;			// 브랜드번호
+	private int brandNo;			//브랜드번호
+	private String supplyVendorCd;	//벤더코드
 
 	private String goodsPcTopDesc;
 	private String goodsPcDownDesc;

+ 1 - 1
src/main/java/com/style24/persistence/domain/GoodsNotiInfo.java

@@ -23,6 +23,6 @@ public class GoodsNotiInfo extends TscBaseDomain {
 	private String reqYn;
 
 	private String niItemNm;
-	private String supplyCompCd;
+	private String supplyVendorCd;
 
 }

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

@@ -19,6 +19,7 @@ public class Itemkind extends TscBaseDomain {
 	//private String itemkindEnm;		// 품목영문명
 	private String niClsfCd;		// 고시분류코드
 	private String useYn;			// 사용여부
+	private String itemkindLeafNm;		// leaf 품목명
 
 //	private String index;
 

+ 1 - 1
src/main/java/com/style24/persistence/domain/NotiInfo.java

@@ -15,7 +15,7 @@ import lombok.Data;
 @Data
 public class NotiInfo extends TscBaseDomain {
 
-	private String supplyCompCd;
+	private String supplyVendorCd;
 	private String niClsfCd;
 	private String niClsfNm;
 	private String niItemCd;

+ 1 - 1
src/main/java/com/style24/persistence/domain/Option.java

@@ -26,7 +26,7 @@ public class Option extends TscBaseDomain {
 	private int currStockQty;
 	private int addPrice;
 	private String soldoutYn;
-	private String dispOrd;
+	private int dispOrd;
 	private String dispYn;
 
 	private int rnum;

+ 5 - 4
src/main/java/com/style24/persistence/domain/SupplyCompany.java

@@ -16,7 +16,8 @@ public class SupplyCompany extends TscBaseDomain {
 
 	private String supplyCompCd;		// 공급업체코드
 	private String supplyCompNm;		// 공급업체명
-	private String supplyVendorCd;		// 상위공급업체코드
+	private String supplyVendorCd;		// 공급벤더코드
+	private String supplyVendorNm;		// 공급벤더명
 	private int provierNo;				// ProvierNo(WMS)
 	private String bizGb;				// 사업자구분
 	private String bizNo;				// 사업자번호
@@ -33,8 +34,9 @@ public class SupplyCompany extends TscBaseDomain {
 	private String distributionGb;		// 유통구분(공통코드G065)
 	private String shotDelvYn;			// 총알배송여부
 	private String supplyStat;			// 입점상태(공통코드G010)
-	private int minOrdAmt;				// 무료배송비최소주문금액
-	private int delvFee;				// 배송비
+	private String supplyStatNm;		// 입점상태명
+//	private int minOrdAmt;				// 무료배송비최소주문금액
+//	private int delvFee;				// 배송비
 	private float sellFeeRate;			// 판매수수료율
 	private String settleDay;			// 정산일(매월)
 	private String bankCd;				// 은행코드
@@ -52,7 +54,6 @@ public class SupplyCompany extends TscBaseDomain {
 	private String econtractYn;			// 전자계약여부
 	private String remarks;				// 비고
 	private String useYn;				// 사용여부
-	private String supplyStatNm;		// 입점상태명
 
 	// 검색조건
 	private String searchGb;			// 검색구분

+ 1 - 1
src/main/java/com/style24/persistence/domain/WmsColorMapping.java

@@ -14,7 +14,7 @@ import lombok.Data;
 @Data
 public class WmsColorMapping extends TscBaseDomain {
 
-	private String supplyCompCd;
+	private String supplyVendorCd;
 	private String wmsColorCd;
 	private String wmsColorNm;
 	private String colorCd;

+ 1 - 1
src/main/java/com/style24/persistence/domain/WmsSeasonMapping.java

@@ -14,7 +14,7 @@ import lombok.Data;
 @Data
 public class WmsSeasonMapping extends TscBaseDomain {
 
-	private String supplyCompCd;
+	private String supplyVendorCd;
 	private String wmsSeasonCd;
 	private String wmsSeasonNm;
 	private String seasonCd;

+ 1 - 1
src/main/java/com/style24/persistence/domain/WmsStyleYearMapping.java

@@ -14,7 +14,7 @@ import lombok.Data;
 @Data
 public class WmsStyleYearMapping extends TscBaseDomain {
 
-	private String supplyCompCd;
+	private String supplyVendorCd;
 	private String wmsStyleYearCd;
 	private String wmsStyleYearNm;
 	private String styleYear;

+ 149 - 83
src/main/java/com/style24/persistence/mybatis/shop/TsaBusiness.xml

@@ -2,61 +2,166 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.style24.admin.biz.dao.TsaBusinessDao">
 
+	<!-- 공급벤더 목록 -->
+	<select id="getSupplyVendorList" parameterType="SupplyCompany" resultType="SupplyCompany">
+		/* TsaBusiness.getSupplyVendorList */
+		SELECT SUPPLY_VENDOR_CD /*공급벤더코드*/
+		     , SUPPLY_VENDOR_NM /*공급벤더명*/
+		     , BIZ_GB           /*사업자구분*/
+		     , BIZ_NO           /*사업자등록번호*/
+		     , BIZ_KIND         /*업종*/
+		     , BIZ_TYPE         /*업태*/
+		     , OWNER_NM         /*대표자명*/
+		     , BIZ_ZIPCODE      /*사업장우편번호*/
+		     , BIZ_BASE_ADDR    /*사업장기본주소*/
+		     , BIZ_DTL_ADDR     /*사업장상세주소*/
+		     , MAIN_TELNO       /*대표전화번호*/
+		     , MAIN_FAXNO       /*대표팩스번호*/
+		     , HOMEPAGE_URL     /*홈페이지URL*/
+		     , USE_YN           /*사용여부*/
+		FROM   TB_SUPPLY_VENDOR
+		WHERE  1 = 1
+		<if test="searchTxt != null and searchTxt != ''">
+		    <if test='searchGb == "NAME"'>
+		AND    UPPER(SUPPLY_VENDOR_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		    </if>
+		    <if test='searchGb == "OWNER"'>
+		AND    UPPER(OWNER_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		    </if>
+		</if>
+		<if test="supplyVendorNm != null and supplyVendorNm != ''"> <!-- 공급벤더팝업에서 사용 -->
+		AND    UPPER(SUPPLY_VENDOR_NM) LIKE CONCAT('%',UPPER(#{supplyVendorNm}),'%')
+		</if>
+	</select>
+	
+	<!-- 공급벤더 생성 -->
+	<insert id="createSupplyVendor" parameterType="SupplyCompany">
+		/* TsaBusiness.createSupplyVendor */
+		INSERT INTO TB_SUPPLY_VENDOR (
+		       SUPPLY_VENDOR_CD
+		     , SUPPLY_VENDOR_NM
+		     , BIZ_GB
+		     , BIZ_NO
+		     , BIZ_KIND
+		     , BIZ_TYPE
+		     , OWNER_NM
+		     , BIZ_ZIPCODE
+		     , BIZ_BASE_ADDR
+		     , BIZ_DTL_ADDR
+		     , MAIN_TELNO
+		     , MAIN_FAXNO
+		     , HOMEPAGE_URL
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       (SELECT CONCAT('SV',IFNULL(LPAD(SUBSTRING(MAX(SUPPLY_VENDOR_CD),3) + 1,4,'0'),'0000'))
+		        FROM   TB_SUPPLY_VENDOR Z
+		       )
+		     , #{supplyVendorNm}
+		     , #{bizGb}
+		     , #{bizNo}
+		     , #{bizKind}
+		     , #{bizType}
+		     , #{ownerNm}
+		     , #{bizZipcode}
+		     , #{bizBaseAddr}
+		     , #{bizDtlAddr}
+		     , #{mainTelno}
+		     , #{mainFaxno}
+		     , #{homepageUrl}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+	</insert>
+	
+	<!-- 공급벤더 수정 -->
+	<update id="updateSupplyVendor" parameterType="SupplyCompany">
+		/* TsaBusiness.updateSupplyVendor */
+		UPDATE TB_SUPPLY_VENDOR
+		SET    SUPPLY_VENDOR_NM = #{supplyVendorNm}
+		     , BIZ_GB = #{bizGb}
+		     , BIZ_NO = #{bizNo}
+		     , BIZ_KIND = #{bizKind}
+		     , BIZ_TYPE = #{bizType}
+		     , OWNER_NM = #{ownerNm}
+		     , BIZ_ZIPCODE = #{bizZipcode}
+		     , BIZ_BASE_ADDR = #{bizBaseAddr}
+		     , BIZ_DTL_ADDR = #{bizDtlAddr}
+		     , MAIN_TELNO = #{mainTelno}
+		     , MAIN_FAXNO = #{mainFaxno}
+		     , HOMEPAGE_URL = #{homepageUrl}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  SUPPLY_VENDOR_CD = #{supplyVendorCd}
+	</update>
+	
 	<!-- 공급업체 목록 -->
 	<select id="getSupplyCompanyList" parameterType="SupplyCompany" resultType="SupplyCompany">
 		/* TsaBusiness.getSupplyCompanyList */
-		SELECT SC.SUPPLY_COMP_CD       /*공급업체코드*/
-		     , SC.SUPPLY_COMP_NM       /*공급업체명*/
-		     , SC.SUPPLY_VENDOR_CD     /*상위공급업체코드*/
-		     -- , SC.BIZ_GB               /*사업자구분*/
-		     -- , SC.BIZ_NO               /*사업자등록번호*/
-		     -- , SC.BIZ_KIND             /*업종*/
-		     -- , SC.BIZ_TYPE             /*업태*/
-		     -- , SC.OWNER_NM             /*대표자명*/
-		     -- , SC.BIZ_ZIPCODE          /*사업장우편번호*/
-		     -- , SC.BIZ_BASE_ADDR        /*사업장기본주소*/
-		     -- , SC.BIZ_DTL_ADDR         /*사업장상세주소*/
-		     -- , SC.MAIN_TELNO           /*대표전화번호*/
-		     -- , SC.MAIN_FAXNO           /*대표팩스번호*/
-		     -- , SC.HOMEPAGE_URL         /*홈페이지URL*/
-		     , SC.DISTRIBUTION_GB      /*유통구분*/
-		     , SC.SHOT_DELV_YN         /*총알배송여부*/
-		     , SC.SUPPLY_STAT          /*입점상태*/
-		     , (SELECT CD_NM FROM TB_COMMON_CODE CC WHERE SC.SUPPLY_STAT = CC.CD AND CC.CD_GB = 'G010') AS SUPPLY_STAT_NM
-		    --  , SC.MIN_ORD_AMT          /*무료배송비최소주문금액*/
-		     -- , SC.DELV_FEE             /*배송비*/
-		     -- , SC.SELL_FEE_RATE        /*판매수수료율*/
-		     , SC.SETTLE_DAY           /*정산일*/
-		     , SC.BANK_CD              /*은행코드*/
-		     , SC.ACCOUNT_NO           /*계좌번호*/
-		     , SC.DEPOSITOR_NM         /*예금주명*/
-		     , SC.CS_CHARGE_NM         /*CS담당자명*/
-		     , SC.CS_CHARGE_TELNO      /*CS담당자전화번호*/
-		     , SC.SETTLE_CHARGE_NM     /*정산담당자명*/
-		     , SC.SETTLE_CHARGE_TELNO  /*정산담당자전화번호*/
-		     , SC.SETTLE_CHARGE_EMAIL  /*정산담당자이메일*/
-		     , SC.BILL_EMAIL           /*계산서이메일*/
-		     , SC.ECONTRACT_YN         /*전자계약여부*/
-		     , SC.REMARKS              /*비고*/
-		     , SC.USE_YN               /*사용여부*/
+		SELECT SC.SUPPLY_COMP_CD                                       /*공급업체코드*/
+		     , SC.SUPPLY_COMP_NM                                       /*공급업체명*/
+		     , SC.SUPPLY_VENDOR_CD                                     /*공급벤더코드*/
+		     , SV.SUPPLY_VENDOR_NM                                     /*공급벤더명*/
+		     , SV.BIZ_GB                                               /*사업자구분*/
+		     , SV.BIZ_NO                                               /*사업자등록번호*/
+		     , SV.BIZ_KIND                                             /*업종*/
+		     , SV.BIZ_TYPE                                             /*업태*/
+		     , SV.OWNER_NM                                             /*대표자명*/
+		     , SV.BIZ_ZIPCODE                                          /*사업장우편번호*/
+		     , SV.BIZ_BASE_ADDR                                        /*사업장기본주소*/
+		     , SV.BIZ_DTL_ADDR                                         /*사업장상세주소*/
+		     , SV.MAIN_TELNO                                           /*대표전화번호*/
+		     , SV.MAIN_FAXNO                                           /*대표팩스번호*/
+		     , SV.HOMEPAGE_URL                                         /*홈페이지URL*/
+		     , SC.DISTRIBUTION_GB                                      /*유통구분*/
+		     , SC.SHOT_DELV_YN                                         /*총알배송여부*/
+		     , SC.SUPPLY_STAT                                          /*입점상태*/
+		     , FN_GET_CODE_NM('G010',SC.SUPPLY_STAT) AS SUPPLY_STAT_NM /*입점상태명*/
+		     , SC.SELL_FEE_RATE                                        /*판매수수료율*/
+		     , SC.SETTLE_DAY                                           /*정산일*/
+		     , SC.BANK_CD                                              /*은행코드*/
+		     , SC.ACCOUNT_NO                                           /*계좌번호*/
+		     , SC.DEPOSITOR_NM                                         /*예금주명*/
+		     , SC.CS_CHARGE_NM                                         /*CS담당자명*/
+		     , SC.CS_CHARGE_TELNO                                      /*CS담당자전화번호*/
+		     , SC.SETTLE_CHARGE_NM                                     /*정산담당자명*/
+		     , SC.SETTLE_CHARGE_TELNO                                  /*정산담당자전화번호*/
+		     , SC.SETTLE_CHARGE_EMAIL                                  /*정산담당자이메일*/
+		     , SC.BILL_EMAIL                                           /*계산서이메일*/
+		     , SC.ECONTRACT_YN                                         /*전자계약여부*/
+		     , SC.REMARKS                                              /*비고*/
+		     , SC.USE_YN                                               /*사용여부*/
 		FROM   TB_SUPPLY_COMPANY SC
-		WHERE  1 = 1
+		     , TB_SUPPLY_VENDOR SV
+		WHERE  SC.SUPPLY_VENDOR_CD = SV.SUPPLY_VENDOR_CD
 		<if test="supplyStat != null and supplyStat != ''">
-		AND    SUPPLY_STAT = #{supplyStat}
+		AND    SC.SUPPLY_STAT = #{supplyStat}
 		</if>
 		<if test="searchTxt != null and searchTxt != ''">
 		    <if test='searchGb == "NAME"'>
-		AND    UPPER(SUPPLY_COMP_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		AND    (
+		        UPPER(SC.SUPPLY_COMP_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		        OR
+		        UPPER(SV.SUPPLY_VENDOR_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		       )
 		    </if>
 		    <if test='searchGb == "OWNER"'>
-		AND    UPPER(OWNER_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		AND    UPPER(SV.OWNER_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
 		    </if>
 		</if>
 		<if test="econtractYn != null and econtractYn != ''">
-		AND    ECONTRACT_YN = #{econtractYn}
+		AND    SC.ECONTRACT_YN = #{econtractYn}
 		</if>
 		<if test="supplyCompCd != null and supplyCompCd != ''"> <!-- 브랜드관리 화면에서 사용 -->
-		AND    SUPPLY_COMP_CD = #{supplyCompCd}
+		AND    SC.SUPPLY_COMP_CD = #{supplyCompCd}
 		</if>
 	</select>
 	
@@ -66,24 +171,11 @@
 		INSERT INTO TB_SUPPLY_COMPANY (
 		       SUPPLY_COMP_CD
 		     , SUPPLY_COMP_NM
-		     , SUPPLY_COMP_UCD
+		     , SUPPLY_VENDOR_CD
 		     , PROVIDER_NO
-		     , BIZ_GB
-		     , BIZ_NO
-		     , BIZ_KIND
-		     , BIZ_TYPE
-		     , OWNER_NM
-		     , BIZ_ZIPCODE
-		     , BIZ_BASE_ADDR
-		     , BIZ_DTL_ADDR
-		     , MAIN_TELNO
-		     , MAIN_FAXNO
-		     , HOMEPAGE_URL
 		     , DISTRIBUTION_GB
 		     , SHOT_DELV_YN
 		     , SUPPLY_STAT
-		     , MIN_ORD_AMT
-		     , DELV_FEE
 		     , SELL_FEE_RATE
 		     , SETTLE_DAY
 		     , BANK_CD
@@ -108,7 +200,7 @@
 		        FROM   TB_SUPPLY_COMPANY Z
 		       )
 		     , #{supplyCompNm}
-		     , #{supplyCompUcd}
+		     , #{supplyVendorCd}
 		     , (SELECT CASE WHEN MAX(PROVIDER_NO) IS NULL THEN
 		                        40000 /* AS-IS 최대 수보다 크게 수정해야함*/
 		                    ELSE
@@ -117,22 +209,9 @@
 		        FROM   TB_SUPPLY_COMPANY Z
 		        WHERE  PROVIDER_NO > 40000 /* AS-IS 최대 수보다 크게 크게 수정해야함*/
 		       )
-		     , #{bizGb}
-		     , #{bizNo}
-		     , #{bizKind}
-		     , #{bizType}
-		     , #{ownerNm}
-		     , #{bizZipcode}
-		     , #{bizBaseAddr}
-		     , #{bizDtlAddr}
-		     , #{mainTelno}
-		     , #{mainFaxno}
-		     , #{homepageUrl}
 		     , #{distributionGb}
 		     , #{shotDelvYn}
 		     , #{supplyStat}
-		     , IFNULL(#{minOrdAmt},0)
-		     , IFNULL(#{delvFee},0)
 		     , IFNULL(#{sellFeeRate},0.0)
 		     , #{settleDay}
 		     , #{bankCd}
@@ -159,23 +238,10 @@
 		/* TsaBusiness.updateSupplyCompany */
 		UPDATE TB_SUPPLY_COMPANY
 		SET    SUPPLY_COMP_NM = #{supplyCompNm}
-		     , SUPPLY_COMP_UCD = #{supplyCompUcd}
-		     , BIZ_GB = #{bizGb}
-		     , BIZ_NO = #{bizNo}
-		     , BIZ_KIND = #{bizKind}
-		     , BIZ_TYPE = #{bizType}
-		     , OWNER_NM = #{ownerNm}
-		     , BIZ_ZIPCODE = #{bizZipcode}
-		     , BIZ_BASE_ADDR = #{bizBaseAddr}
-		     , BIZ_DTL_ADDR = #{bizDtlAddr}
-		     , MAIN_TELNO = #{mainTelno}
-		     , MAIN_FAXNO = #{mainFaxno}
-		     , HOMEPAGE_URL = #{homepageUrl}
+		     , SUPPLY_VENDOR_CD = #{supplyVendorCd}
 		     , DISTRIBUTION_GB = #{distributionGb}
 		     , SHOT_DELV_YN = #{shotDelvYn}
 		     , SUPPLY_STAT = #{supplyStat}
-		     , MIN_ORD_AMT = IFNULL(#{minOrdAmt},0)
-		     , DELV_FEE = IFNULL(#{delvFee},0)
 		     , SELL_FEE_RATE = IFNULL(#{sellFeeRate},0.0)
 		     , SETTLE_DAY = #{settleDay}
 		     , BANK_CD = #{bankCd}
@@ -603,7 +669,7 @@
 		            ELSE 'N'
 		       END
 		     , #{erpBrandCd}
-		     , #{DELV_FEE_CD}
+		     , #{delvFeeCd}
 		     , #{delvLocCd}
 		     , IFNULL(#{sellFeeRate},0)
 		     , IFNULL(#{pntPrate10},0)

+ 217 - 4
src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml

@@ -47,10 +47,10 @@
 		     , DATE_FORMAT(AUTH_DT, '%Y%m%d%H%i%S') AS AUTH_DT
 		     , MANAGED_RSN
 		     , MANAGED_DTL_RSN
-		     , MANAGED_DT
+		     , DATE_FORMAT(MANAGED_DT, '%Y%m%d%H%i%S') AS MANAGED_DT
 		     , SECEDE_RSN
 		     , SECEDE_DTL_RSN
-		     , SECEDE_DT
+		     , DATE_FORMAT(SECEDE_DT, '%Y%m%d%H%i%S') AS SECEDE_DT
 		     , FN_GET_USER_NM(REG_NO)              AS REG_NM
 		     , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
 		     , FN_GET_USER_NM(UPD_NO)              AS UPD_NM
@@ -105,14 +105,227 @@
 		</if>
 	</select>
 
+	<!-- 회원기본정보 -->
+	<select id="getCustomerInfo" parameterType="String" resultType="Customer">
+		/* TsaCustomer.getCustomerInfo */
+		SELECT CUST_NO
+		     , CUST_ID
+		     , CUST_NM
+		     , PASSWD
+		     , BIRTH_YMD
+		     , BIRTH_SM
+		     , SEX_GB
+		     , CELL_PHNNO
+		     , APP_AGREE_YN
+		     , DATE_FORMAT(APP_AGREE_DT, '%Y%m%d%H%i%S') AS APP_AGREE_DT
+		     , SMS_AGREE_YN
+		     , DATE_FORMAT(SMS_AGREE_DT, '%Y%m%d%H%i%S') AS SMS_AGREE_DT
+		     , EMAIL
+		     , EMAIL_AGREE_YN
+		     , DATE_FORMAT(EMAIL_AGREE_DT, '%Y%m%d%H%i%S') AS EMAIL_AGREE_DT
+		     , HOME_POST_NO
+		     , HOME_BASE_ADDR
+		     , HOME_DTL_ADDR
+		     , SITE_CD
+		     , FRONT_GB
+		     , AF_LINK_CD
+		     , CUST_GB
+		     , CUST_GRADE
+		     , DATE_FORMAT(JOIN_DT, '%Y%m%d%H%i%S') AS JOIN_DT
+		     , FOREIGNER_YN
+		     , CUST_STAT
+		     , DATE_FORMAT(PASSWD_CHG_DT, '%Y%m%d%H%i%S') AS PASSWD_CHG_DT
+		     , TEMP_PASSWD_YN
+		     , DATE_FORMAT(LOGIN_LDT, '%Y%m%d%H%i%S') AS LOGIN_LDT
+		     , NV_JOIN_ID
+		     , NV_ACCESS_TOKEN
+		     , DATE_FORMAT(NV_JOIN_DT, '%Y%m%d%H%i%S') AS NV_JOIN_DT
+		     , KK_JOIN_ID
+		     , KK_ACCESS_TOKEN
+		     , DATE_FORMAT(KK_JOIN_DT, '%Y%m%d%H%i%S') AS KK_JOIN_DT
+		     , YS_JOIN_ID
+		     , YS_ACCESS_TOKEN
+		     , DATE_FORMAT(YS_JOIN_DT, '%Y%m%d%H%i%S') AS YS_JOIN_DT
+		     , CI
+		     , DATE_FORMAT(AUTH_DT, '%Y%m%d%H%i%S') AS AUTH_DT
+		     , MANAGED_RSN
+		     , MANAGED_DTL_RSN
+		     , DATE_FORMAT(MANAGED_DT, '%Y%m%d%H%i%S') AS MANAGED_DT
+		     , SECEDE_RSN
+		     , SECEDE_DTL_RSN
+		     , DATE_FORMAT(SECEDE_DT, '%Y%m%d%H%i%S') AS SECEDE_DT
+		     , FN_GET_USER_NM(REG_NO)              AS REG_NM
+		     , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		     , FN_GET_USER_NM(UPD_NO)              AS UPD_NM
+		     , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
+		FROM   TB_CUSTOMER
+		WHERE  CUST_NO = #{custNo}
+	</select>
+
 	<!-- 탈퇴회원목록 -->
 	<select id="getCustomerSecedeList" parameterType="CustomerSearch" resultType="Customer">
-		SELECT '1111'
+		/* TsaCustomer.getSecedeCustomerList */
+		SELECT CUST_NO
+		     , CUST_ID
+		     , CUST_NM
+		     , PASSWD
+		     , BIRTH_YMD
+		     , BIRTH_SM
+		     , SEX_GB
+		     , CELL_PHNNO
+		     , APP_AGREE_YN
+		     , DATE_FORMAT(APP_AGREE_DT, '%Y%m%d%H%i%S') AS APP_AGREE_DT
+		     , SMS_AGREE_YN
+		     , DATE_FORMAT(SMS_AGREE_DT, '%Y%m%d%H%i%S') AS SMS_AGREE_DT
+		     , EMAIL
+		     , EMAIL_AGREE_YN
+		     , DATE_FORMAT(EMAIL_AGREE_DT, '%Y%m%d%H%i%S') AS EMAIL_AGREE_DT
+		     , HOME_POST_NO
+		     , HOME_BASE_ADDR
+		     , HOME_DTL_ADDR
+		     , SITE_CD
+		     , FRONT_GB
+		     , AF_LINK_CD
+		     , CUST_GB
+		     , CUST_GRADE
+		     , DATE_FORMAT(JOIN_DT, '%Y%m%d%H%i%S') AS JOIN_DT
+		     , FOREIGNER_YN
+		     , CUST_STAT
+		     , DATE_FORMAT(PASSWD_CHG_DT, '%Y%m%d%H%i%S') AS PASSWD_CHG_DT
+		     , TEMP_PASSWD_YN
+		     , DATE_FORMAT(LOGIN_LDT, '%Y%m%d%H%i%S') AS LOGIN_LDT
+		     , NV_JOIN_ID
+		     , NV_ACCESS_TOKEN
+		     , DATE_FORMAT(NV_JOIN_DT, '%Y%m%d%H%i%S') AS NV_JOIN_DT
+		     , KK_JOIN_ID
+		     , KK_ACCESS_TOKEN
+		     , DATE_FORMAT(KK_JOIN_DT, '%Y%m%d%H%i%S') AS KK_JOIN_DT
+		     , YS_JOIN_ID
+		     , YS_ACCESS_TOKEN
+		     , DATE_FORMAT(YS_JOIN_DT, '%Y%m%d%H%i%S') AS YS_JOIN_DT
+		     , CI
+		     , DATE_FORMAT(AUTH_DT, '%Y%m%d%H%i%S') AS AUTH_DT
+		     , MANAGED_RSN
+		     , MANAGED_DTL_RSN
+		     , DATE_FORMAT(MANAGED_DT, '%Y%m%d%H%i%S') AS MANAGED_DT
+		     , SECEDE_RSN
+		     , SECEDE_DTL_RSN
+		     , DATE_FORMAT(SECEDE_DT, '%Y%m%d%H%i%S') AS SECEDE_DT
+		     , FN_GET_USER_NM(REG_NO)              AS REG_NM
+		     , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		     , FN_GET_USER_NM(UPD_NO)              AS UPD_NM
+		     , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
+		FROM   TB_SECEDE_CUST
+		WHERE  CUST_STAT = 'G104_30'
+		<if test="searchTxt != null and searchTxt != ''">
+		    <if test="searchGb == 'custNo'">
+		AND    CUST_NO = #{searchTxt}
+		    </if>
+		    <if test="searchGb == 'custNm'">
+		AND    LOWER(CUST_NM) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		    </if>
+		    <if test="searchGb == 'email'">
+		AND    LOWER(EMAIL) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		    </if>
+		    <if test="searchGb == 'custNo'">
+		AND    LOWER(CUST_NO) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		    </if>
+		</if>
+		<if test="siteCd != null and siteCd != ''">
+		AND    SITE_CD = #{siteCd}
+		</if>
+		<if test="cellPhnno != null and cellPhnno != ''">
+		AND    CELL_PHNNO = #{cellPhnno}
+		</if>
+		<if test="secedeRsn != null and secedeRsn != ''">
+		AND    SECEDE_RSN = #{secedeRsn}
+		</if>
+		<if test="stDate != null and stDate != '' and edDate != null and edDate != ''">
+		AND    SECEDE_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		AND    SECEDE_DT <![CDATA[<]]> DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		</if>
 	</select>
 
 	<!-- 휴면회원목록 -->
 	<select id="getCustomerDormantList" parameterType="CustomerSearch" resultType="Customer">
-		SELECT '1111'
+		/* TsaCustomer.getDormantCustomerList */
+		SELECT CUST_NO
+		     , CUST_ID
+		     , CUST_NM
+		     , PASSWD
+		     , BIRTH_YMD
+		     , BIRTH_SM
+		     , SEX_GB
+		     , CELL_PHNNO
+		     , APP_AGREE_YN
+		     , DATE_FORMAT(APP_AGREE_DT, '%Y%m%d%H%i%S') AS APP_AGREE_DT
+		     , SMS_AGREE_YN
+		     , DATE_FORMAT(SMS_AGREE_DT, '%Y%m%d%H%i%S') AS SMS_AGREE_DT
+		     , EMAIL
+		     , EMAIL_AGREE_YN
+		     , DATE_FORMAT(EMAIL_AGREE_DT, '%Y%m%d%H%i%S') AS EMAIL_AGREE_DT
+		     , HOME_POST_NO
+		     , HOME_BASE_ADDR
+		     , HOME_DTL_ADDR
+		     , SITE_CD
+		     , FRONT_GB
+		     , AF_LINK_CD
+		     , CUST_GB
+		     , CUST_GRADE
+		     , DATE_FORMAT(JOIN_DT, '%Y%m%d%H%i%S') AS JOIN_DT
+		     , FOREIGNER_YN
+		     , CUST_STAT
+		     , DATE_FORMAT(PASSWD_CHG_DT, '%Y%m%d%H%i%S') AS PASSWD_CHG_DT
+		     , TEMP_PASSWD_YN
+		     , DATE_FORMAT(LOGIN_LDT, '%Y%m%d%H%i%S') AS LOGIN_LDT
+		     , NV_JOIN_ID
+		     , NV_ACCESS_TOKEN
+		     , DATE_FORMAT(NV_JOIN_DT, '%Y%m%d%H%i%S') AS NV_JOIN_DT
+		     , KK_JOIN_ID
+		     , KK_ACCESS_TOKEN
+		     , DATE_FORMAT(KK_JOIN_DT, '%Y%m%d%H%i%S') AS KK_JOIN_DT
+		     , YS_JOIN_ID
+		     , YS_ACCESS_TOKEN
+		     , DATE_FORMAT(YS_JOIN_DT, '%Y%m%d%H%i%S') AS YS_JOIN_DT
+		     , CI
+		     , AUTH_DT
+		     , MANAGED_RSN
+		     , MANAGED_DTL_RSN
+		     , DATE_FORMAT(MANAGED_DT, '%Y%m%d%H%i%S') AS MANAGED_DT
+		     , SECEDE_RSN
+		     , SECEDE_DTL_RSN
+		     , DATE_FORMAT(SECEDE_DT, '%Y%m%d%H%i%S') AS SECEDE_DT
+		     , FN_GET_USER_NM(REG_NO)              AS REG_NM
+		     , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		     , FN_GET_USER_NM(UPD_NO)              AS UPD_NM
+		     , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
+		     , DATE_FORMAT(DORMANT_DT, '%Y%m%d%H%i%S') AS DORMANT_DT
+		FROM   TB_DORMANT_CUST
+		WHERE  CUST_STAT = 'G104_20'
+		<if test="searchTxt != null and searchTxt != ''">
+		    <if test="searchGb == 'custNo'">
+		AND    CUST_NO = #{searchTxt}
+		    </if>
+		    <if test="searchGb == 'custNm'">
+		AND    LOWER(CUST_NM) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		    </if>
+		    <if test="searchGb == 'email'">
+		AND    LOWER(EMAIL) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		    </if>
+		    <if test="searchGb == 'custNo'">
+		AND    LOWER(CUST_NO) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		    </if>
+		</if>
+		<if test="siteCd != null and siteCd != ''">
+		AND    SITE_CD = #{siteCd}
+		</if>
+		<if test="cellPhnno != null and cellPhnno != ''">
+		AND    CELL_PHNNO = #{cellPhnno}
+		</if>
+		<if test="stDate != null and stDate != '' and edDate != null and edDate != ''">
+		AND    DORMANT_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		AND    DORMANT_DT <![CDATA[<]]> DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		</if>
 	</select>
 
 </mapper>

+ 207 - 10
src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml

@@ -555,15 +555,31 @@
 	<select id="getGoodsCategoryListCount" parameterType="GoodsCategory" resultType="int">
 		/* TsaDisplay.getGoodsCategoryListCount */
 		SELECT  COUNT(*) AS TOTCNT
-		FROM	TB_GOODS G
-		WHERE	1=1
-		<if test="searchGb == null or searchGb =='BASIC' or searchGb =='EXTEND' or searchGb =='MASTER'" >
-			<include refid="getGoodsCategoryListCondition_sql"/>
+		FROM
+		<if test="searchGb == null or searchGb =='BASIC'">
+				TB_GOODS G
+			WHERE	1=1
+			<if test="searchGb == null or searchGb =='BASIC' or searchGb =='EXTEND' or searchGb =='MASTER'" >
+				<include refid="getGoodsCategoryListCondition_sql"/>
+			</if>
+		</if>
+		<if test="searchGb != null and searchGb =='EXCEL'">
+			 (SELECT C.*
+				, TMP_DISP_ORD
+				FROM TB_GOODS C
+				, (SELECT SEARCH_CD, MIN(DISP_ORD) AS TMP_DISP_ORD
+					FROM TB_SEARCH_DATA
+					WHERE REG_NO = #{regNo}
+					GROUP BY SEARCH_CD) D
+				WHERE C.GOODS_CD LIKE D.SEARCH_CD||'%'
+				OR C.SUPPLY_GOODS_CD LIKE D.SEARCH_CD||'%'
+			) A
+			WHERE 1 = 1
 		</if>
 	</select>
 
 	<!-- 상품별카테고리전시관리 목록 조회 -->
-	<select id="getGoodsCategoryList" parameterType="GoodsCategory" resultType="Goods">
+	<select id="getGoodsCategoryList" parameterType="GoodsCategory" resultType="GoodsCategory">
 		SELECT	Z.*
 		FROM	(
 			SELECT	@rownum := @rownum + 1 AS RNUM
@@ -572,7 +588,8 @@
 					ELSE (SELECT NVL(SUM(CURR_STOCK_QTY), 0) - NVL(SUM(BASE_STOCK_QTY), 0) AS CURR_STOCK_QTY FROM VW_STOCK WHERE GOODS_CD = A.GOODS_CD)
 					END AS CURR_STOCK_QTY
 			FROM	(
-				SELECT	G.GOODS_CD
+				SELECT	'카테고리확인' AS FULL_CATE_NM
+						, G.GOODS_CD
 						, G.GOODS_NM
 						, G.DC_RATE
 						, G.TAG_PRICE
@@ -597,10 +614,28 @@
 						, G.SEASON_CD
 						, (SELECT BRAND_GRP_NM FROM TB_BRAND WHERE BRAND_CD = G.BRAND_CD) AS BRAND_GRP_NM
 						, (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG  WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = G.MAIN_COLOR_CD AND DEFAULT_IMG_YN = 'Y' ) AS SYS_IMG_NM
-				FROM	TB_GOODS G
-				JOIN ( SELECT @rownum := 0) R
-				WHERE 1=1
-				<include refid="getGoodsCategoryListCondition_sql"/>
+				FROM
+				<if test="searchGb == null or searchGb =='BASIC'">
+						TB_GOODS G
+						JOIN ( SELECT @rownum := 0) R
+						WHERE 1=1
+						<include refid="getGoodsCategoryListCondition_sql"/>
+				</if>
+				<if test="searchGb != null and searchGb =='EXCEL'">
+					(SELECT C.*
+						, TMP_DISP_ORD
+						FROM TB_GOODS C
+						, (SELECT SEARCH_CD, MIN(DISP_ORD) AS TMP_DISP_ORD
+							FROM TB_SEARCH_DATA
+							WHERE REG_NO = #{regNo}
+							GROUP BY SEARCH_CD
+							) D
+						WHERE C.GOODS_CD LIKE D.SEARCH_CD||'%'
+						OR C.SUPPLY_GOODS_CD LIKE D.SEARCH_CD||'%'
+					) G
+					JOIN ( SELECT @rownum := 0) R
+					WHERE 1 = 1
+				</if>
 				ORDER BY G.REG_DT DESC, G.GOODS_CD
 			<include refid="getListPagingCondition_sql"/>
 	</select>
@@ -738,4 +773,166 @@
 			</choose>
 		</if>
 	</sql>
+
+	<!-- 상품별카테고리전시 저장 -->
+	<insert id="saveGoodsCategory" parameterType="GoodsCategory">
+		/* TsaDisplay.saveGoodsCategory */
+		INSERT INTO TB_CATE_GOODS(
+					CATE_NO
+					,GOODS_CD
+					,DISP_ORD
+					,REG_NO
+					,REG_DT
+				)
+				VALUES (
+				    #{cateCd}
+				    ,#{goodsCd}
+				    ,(SELECT	NVL((MAX(DISP_ORD) + 1), 1) AS DISP_ORD
+				        FROM	TB_CATE_GOODS ALIAS_FOR_SUBQUERY
+				        WHERE   CATE_NO = #{cateCd})
+				    ,#{regNo}
+				    ,NOW()
+				)
+				ON DUPLICATE KEY UPDATE
+					 REG_NO = #{regNo}
+					,REG_DT = NOW()
+	</insert>
+
+	<!-- 상품별카테고리 리스트 조회 -->
+	<select id="getGoodsCategoryViewList" parameterType="String" resultType="GoodsCategory">
+		/* TsaDisplay.getGoodsCategoryViewList */
+		SELECT CONCAT(FN_GET_CODE_NM('G032', B.CATE_GB ), ' > ',B.FULL_CATE_NM ) AS FULL_CATE_NM
+			 , A.CATE_NO AS CATE_CD
+			 , B.CATE_TYPE
+			 , A.GOODS_CD
+			 , B.CATE1_NO AS CATE_CD1
+			 , B.CATE2_NO AS CATE_CD2
+			 , B.CATE3_NO AS CATE_CD3
+			 , B.CATE4_NO AS CATE_CD4
+		FROM TB_CATE_GOODS A
+		   , TB_CATE_4SRCH B
+		WHERE A.CATE_NO = B.LEAF_CATE_NO
+		  AND A.GOODS_CD = #{goodsCd}
+		ORDER BY B.CATE_TYPE, A.CATE_NO, B.DISP_ORD
+	</select>
+
+	<!-- 상품별 전시카테고리 삭제-->
+	<delete id="deleteGoodsCategory" parameterType="GoodsCategory">
+		/* TsaDisplay.deleteGoodsCategory */
+		DELETE
+		FROM TB_CATE_GOODS
+		WHERE GOODS_CD = #{goodsCd}
+		<choose>
+		<when test="cateType == 'G031_20' and cateCd != null and cateCd != ''">
+		AND CATE_NO = #{cateCd}
+		</when>
+		<otherwise>
+		AND CATE_NO IN (
+			SELECT CATE_CD FROM
+			(
+				SELECT CATE1_NO AS CATE_CD
+				, CATE1_NO
+				, CATE2_NO
+				, CATE3_NO
+				, CATE4_NO
+				, CATE_TYPE
+				FROM TB_CATE_4SRCH
+				<if test="cateCd != null and cateCd1 != cateCd">
+				WHERE EXISTS (
+					SELECT 1 FROM (
+						SELECT COUNT(*) AS CATE_CNT
+						 FROM (
+							SELECT CATE_NO
+							FROM TB_CATE_GOODS
+							WHERE GOODS_CD = #{goodsCd}
+							AND CATE_NO IN (
+							    	SELECT LEAF_CATE_NO
+									FROM TB_CATE_4SRCH
+									WHERE CATE1_NO  = #{cateCd1}
+								)
+							) ALIAS_FOR_SUBQUERY
+						) ALIAS_FOR_SUBQUERY
+					<![CDATA[WHERE CATE_CNT < 2 ]]>
+				)
+				</if>
+				UNION ALL
+				SELECT CATE2_NO AS CATE_CD
+					, CATE1_NO
+					, CATE2_NO
+					, CATE3_NO
+					, CATE4_NO
+					, CATE_TYPE
+				FROM TB_CATE_4SRCH
+				<if test="cateCd != null and cateCd1 != cateCd and cateCd2 != cateCd">
+				WHERE EXISTS (
+					SELECT 1 FROM (
+						SELECT COUNT(*) AS CATE_CNT
+						FROM (
+							SELECT CATE_NO
+							FROM TB_CATE_GOODS
+							WHERE GOODS_CD = #{goodsCd}
+							AND CATE_NO IN (
+							    SELECT LEAF_CATE_NO
+								FROM TB_CATE_4SRCH
+								WHERE CATE2_NO = #{cateCd2}
+							)
+						) ALIAS_FOR_SUBQUERY
+					) ALIAS_FOR_SUBQUERY
+					<![CDATA[WHERE CATE_CNT < 2 ]]>
+				)
+				</if>
+				UNION ALL
+				SELECT CATE3_NO AS CATE_CD
+					, CATE1_NO
+					, CATE2_NO
+					, CATE3_NO
+					, CATE4_NO
+					, CATE_TYPE
+				FROM TB_CATE_4SRCH
+				<if test="cateCd != null and cateCd == cateCd4">
+				WHERE EXISTS (
+					SELECT 1 FROM (
+						SELECT COUNT(*) AS CATE_CNT
+						FROM (
+							SELECT CATE_NO
+							FROM TB_CATE_GOODS
+							WHERE GOODS_CD = #{goodsCd}
+							AND CATE_NO IN (
+							    	SELECT LEAF_CATE_NO
+									FROM TB_CATE_4SRCH
+									WHERE CATE3_NO = #{cateCd3}
+							)
+						) ALIAS_FOR_SUBQUERY
+					) ALIAS_FOR_SUBQUERY
+					<![CDATA[WHERE CATE_CNT < 2 ]]>
+				)
+				</if>
+				UNION ALL
+				SELECT CATE4_NO AS CATE_CD
+				, CATE1_NO
+				, CATE2_NO
+				, CATE3_NO
+				, CATE4_NO
+				, CATE_TYPE
+				FROM TB_CATE_4SRCH
+			) ALIAS_FOR_SUBQUERY
+			<if test="cateCd != null and cateCd1 == cateCd">
+				WHERE CATE1_NO = #{cateCd}
+			</if>
+			<if test="cateCd != null and cateCd2 == cateCd">
+				WHERE CATE2_NO = #{cateCd}
+			</if>
+			<if test="cateCd != null and cateCd3 == cateCd">
+				WHERE CATE3_NO = #{cateCd}
+			</if>
+			<if test="cateCd != null and cateCd4 == cateCd">
+				WHERE CATE4_NO = #{cateCd}
+			</if>
+			<if test="cateCd == null or cateCd == ''">
+				WHERE CATE_TYPE = 'G031_10'
+			</if>
+		)
+		</otherwise>
+		</choose>
+	</delete>
 </mapper>

+ 42 - 37
src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -7,9 +7,9 @@
 		/* TsaGoods.getItemkindList */
 		SELECT ITEMKIND_CD
 		     , ITEMKIND_NM
-		     /* , ITEMKIND_ENM*/
 		     , NI_CLSF_CD
 		     , USE_YN
+		     , REPLACE(SUBSTRING_INDEX(ITEMKIND_NM, '>', -2) ,'>','') AS ITEMKIND_LEAF_NM
 		FROM TB_ITEMKIND
 		WHERE 1 = 1
 		<if test="itemkindCd != null and itemkindCd != ''">
@@ -127,15 +127,15 @@
 	<!-- 정보고시분류 목록 -->
 	<select id="getNotiInfoList" parameterType="NotiInfo" resultType="NotiInfo">
 		/* TsaGoods.getNotiInfoList */
-		SELECT DISTINCT B.SUPPLY_COMP_CD
+		SELECT DISTINCT B.SUPPLY_VENDOR_CD
 		     , B.NI_CLSF_CD
 		     , C.CD_NM AS NI_CLSF_NM
 		     , C.DISP_ORD
 		FROM TB_NOTI_INFO B
 		INNER JOIN TB_COMMON_CODE C ON B.NI_CLSF_CD = C.CD 
-		WHERE B.SUPPLY_COMP_CD = CASE #{supplyCompCd} 
-		                         WHEN 'S0001' THEN 'S0001'
-		                         WHEN 'S0002' THEN 'S0002'
+		WHERE B.SUPPLY_VENDOR_CD = CASE #{supplyVendorCd} 
+		                         WHEN 'SV0001' THEN 'SV0001'
+		                         WHEN 'SV0002' THEN 'SV0002'
 		                         ELSE 'E' END 
 		AND C.CD_GB = 'G004'   /*고시정보*/
 		ORDER BY C.DISP_ORD
@@ -144,7 +144,7 @@
 	<!-- 정보고시 상세 목록 -->
 	<select id="getNotiInfoItemList" parameterType="NotiInfo" resultType="NotiInfo">
 		/* TsaGoods.getNotiInfoItemList */
-		SELECT B.SUPPLY_COMP_CD
+		SELECT B.SUPPLY_VENDOR_CD
 		     , B.NI_CLSF_CD
 		     , B.NI_ITEM_CD
 		     , FN_GET_CODE_NM('G005', B.NI_ITEM_CD) AS NI_ITEM_NM
@@ -153,9 +153,9 @@
 		     , B.REQ_YN
 		     , B.DISP_YN
 		FROM TB_NOTI_INFO B
-		WHERE B.SUPPLY_COMP_CD = CASE #{supplyCompCd} 
-		                         WHEN 'S0001' THEN 'S0001'
-		                         WHEN 'S0002' THEN 'S0002'
+		WHERE B.SUPPLY_VENDOR_CD = CASE #{supplyVendorCd} 
+		                         WHEN 'SV0001' THEN 'SV0001'
+		                         WHEN 'SV0002' THEN 'SV0002'
 		                         ELSE 'E' END 
 		<if test="niClsfCd != null and niClsfCd != ''">
 		AND B.NI_CLSF_CD = #{niClsfCd}
@@ -167,7 +167,7 @@
 	<insert id="saveNotiInfo" parameterType="NotiInfo">
 		/* TsaGoods.saveNotiInfo */
 		INSERT INTO TB_NOTI_INFO (
-		       SUPPLY_COMP_CD
+		       SUPPLY_VENDOR_CD
 		     , NI_CLSF_CD
 		     , NI_ITEM_CD
 		     , NI_CONTENT
@@ -178,7 +178,7 @@
 		     , UPD_DT
 		)
 		VALUES (
-		       #{supplyCompCd}
+		       #{supplyVendorCd}
 		     , #{niClsfCd}
 		     , #{niItemCd}
 		     , #{niContent}
@@ -198,7 +198,7 @@
 	<!-- WMS 색상 매핑 조회 -->
 	<select id="getWmsColorMappingList" parameterType="WmsColorMapping" resultType="WmsColorMapping" >
 		/* TsaGoods.getWmsColorMappingList */
-		SELECT SUPPLY_COMP_CD
+		SELECT SUPPLY_VENDOR_CD
 		     , WMS_COLOR_CD
 		     , WMS_COLOR_NM
 		     , COLOR_CD
@@ -208,7 +208,7 @@
 		     , FN_GET_USER_NM(UPD_NO) AS UPD_NM
 		     , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
 		FROM TB_WMS_COLOR_MAPPING
-		WHERE SUPPLY_COMP_CD = #{supplyCompCd}
+		WHERE SUPPLY_VENDOR_CD = #{supplyVendorCd}
 		ORDER BY WMS_COLOR_CD
 	</select>
 	
@@ -216,7 +216,7 @@
 	<update id="saveWmsColorMapping" parameterType="WmsColorMapping">
 		/* TsaGoods.saveWmsColorMapping */
 		INSERT INTO TB_WMS_COLOR_MAPPING (
-		       SUPPLY_COMP_CD
+		       SUPPLY_VENDOR_CD
 		     , WMS_COLOR_CD
 		     , WMS_COLOR_NM
 		     , COLOR_CD
@@ -227,7 +227,7 @@
 		     , UPD_DT
 		)
 		VALUES (
-		       #{supplyCompCd}
+		       #{supplyVendorCd}
 		     , #{wmsColorCd}
 		     , #{wmsColorNm}
 		     , #{colorCd}
@@ -247,7 +247,7 @@
 	<!-- WMS 스타일년도 매핑 조회 -->
 	<select id="getWmsStyleYearMappingList" parameterType="WmsStyleYearMapping" resultType="WmsStyleYearMapping" >
 		/* TsaGoods.getWmsStyleYearMappingList */
-		SELECT SUPPLY_COMP_CD
+		SELECT SUPPLY_VENDOR_CD
 		     , WMS_STYLE_YEAR_CD
 		     , WMS_STYLE_YEAR_NM
 		     , STYLE_YEAR
@@ -257,7 +257,7 @@
 		     , FN_GET_USER_NM(UPD_NO) AS UPD_NM
 		     , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
 		FROM TB_WMS_STYLE_YEAR_MAPPING
-		WHERE SUPPLY_COMP_CD = #{supplyCompCd}
+		WHERE SUPPLY_VENDOR_CD = #{supplyVendorCd}
 		ORDER BY WMS_STYLE_YEAR_CD
 	</select>
 	
@@ -265,7 +265,7 @@
 	<update id="saveWmsStyleYearMapping" parameterType="WmsStyleYearMapping">
 		/* TsaGoods.saveWmsStyleYearMapping */
 		INSERT INTO TB_WMS_STYLE_YEAR_MAPPING (
-		       SUPPLY_COMP_CD
+		       SUPPLY_VENDOR_CD
 		     , WMS_STYLE_YEAR_CD
 		     , WMS_STYLE_YEAR_NM
 		     , STYLE_YEAR
@@ -276,7 +276,7 @@
 		     , UPD_DT
 		)
 		VALUES (
-		       #{supplyCompCd}
+		       #{supplyVendorCd}
 		     , #{wmsStyleYearCd}
 		     , #{wmsStyleYearNm}
 		     , #{styleYear}
@@ -296,7 +296,7 @@
 	<!-- WMS 시즌 매핑 조회 -->
 	<select id="getWmsSeasonMappingList" parameterType="WmsSeasonMapping" resultType="WmsSeasonMapping" >
 		/* TsaGoods.getWmsSeasonMappingList */
-		SELECT SUPPLY_COMP_CD
+		SELECT SUPPLY_VENDOR_CD
 		     , WMS_SEASON_CD
 		     , WMS_SEASON_NM
 		     , SEASON_CD
@@ -306,7 +306,7 @@
 		     , FN_GET_USER_NM(UPD_NO) AS UPD_NM
 		     , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
 		FROM TB_WMS_SEASON_MAPPING
-		WHERE SUPPLY_COMP_CD = #{supplyCompCd}
+		WHERE SUPPLY_VENDOR_CD = #{supplyVendorCd}
 		ORDER BY WMS_SEASON_CD
 	</select>
 	
@@ -314,7 +314,7 @@
 	<update id="saveWmsSeasonMapping" parameterType="WmsSeasonMapping">
 		/* TsaGoods.saveWmsSeasonMapping */
 		INSERT INTO TB_WMS_STYLE_YEAR_MAPPING (
-		       SUPPLY_COMP_CD
+		       SUPPLY_VENDOR_CD
 		     , WMS_SEASON_CD
 		     , WMS_SEASON_NM
 		     , SEASON_CD
@@ -325,7 +325,7 @@
 		     , UPD_DT
 		)
 		VALUES (
-		       #{supplyCompCd}
+		       #{supplyVendorCd}
 		     , #{wmsSeasonCd}
 		     , #{wmsSeasonNm}
 		     , #{seasonCd}
@@ -947,12 +947,15 @@
 		     , A.DISP_YN
 		     , A.REQ_YN
 		FROM TB_GOODS_NOTI_INFO C
+		INNER JOIN TB_GOODS B ON C.GOODS_CD = B.GOODS_CD
+        INNER JOIN TB_SUPPLY_COMPANY D ON B.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
 		INNER JOIN TB_NOTI_INFO A ON C.NI_CLSF_CD = A.NI_CLSF_CD
 		                          AND C.NI_ITEM_CD = A.NI_ITEM_CD
-		                          AND A.SUPPLY_COMP_CD = CASE #{supplyCompCd} 
-		                                                 WHEN 'S0001' THEN 'S0001'
-		                                                 WHEN 'S0002' THEN 'S0002'
-		                                                 ELSE 'E' END
+		                          AND A.SUPPLY_VENDOR_CD = CASE D.SUPPLY_VENDOR_CD
+		                                                        WHEN 'SV0001' THEN 'SV0001'
+		                                                        WHEN 'SV0002' THEN 'SV0002'
+		                                                        ELSE 'E' 
+		                                                   END
 		WHERE C.GOODS_CD = #{goodsCd}
 		AND C.NI_CLSF_CD = #{niClsfCd}
 		ORDER BY C.DISP_ORD
@@ -961,7 +964,7 @@
 	<!-- 상품의 정보고시 항목 목록 -->
 	<select id="getNotiGoodsInfoList" parameterType="NotiInfo" resultType="NotiInfo">
 		/* TsaGoods.getNotiGoodsInfoList */
-		SELECT  N.SUPPLY_COMP_CD
+		SELECT  N.SUPPLY_VENDOR_CD
 		      , N.NI_CLSF_CD
 		      , N.NI_ITEM_CD
 		      , FN_GET_CODE_NM('G005', N.NI_ITEM_CD) AS NI_ITEM_NM
@@ -970,7 +973,6 @@
 		             WHEN NI_ITEM_CD = 'G005_006' THEN NVL(FN_GET_CODE_NM('G076', G.ORIGIN_CD),N.NI_CONTENT)
 		             WHEN NI_ITEM_CD = 'G005_097' AND FN_GET_CODE_NM('G076', G.ORIGIN_CD) IN ('대한민국', '한국', 'KOREA') THEN 'N'
 		             WHEN NI_ITEM_CD = 'G005_097' AND FN_GET_CODE_NM('G076', G.ORIGIN_CD) NOT IN ('대한민국', '한국', 'KOREA') THEN 'Y'
-		             WHEN NI_ITEM_CD = 'G005_005' AND G.BRAND_CD= 'T007' THEN G.SUPPLY_COMP_NM
 		             WHEN NI_ITEM_CD = 'G005_009' THEN NVL(G.MAKE_YMD, N.NI_CONTENT)
 		        ELSE N.NI_CONTENT
 		        END
@@ -981,13 +983,12 @@
 		 FROM (
 		     SELECT G.GOODS_CD
 		         , G.ITEMKIND_CD
-		         , G.SUPPLY_COMP_CD
+		         , (SELECT SUPPLY_VENDOR_CD FROM TB_SUPPLY_COMPANY SC WHERE SC.SUPPLY_COMP_CD = G.SUPPLY_COMP_CD) AS SUPPLY_VENDOR_CD
 		         , G.ORIGIN_CD
 		         , G.MAKE_YMD
 		         , (SELECT GROUP_CONCAT(DISTINCT T.OPT_CD1) FROM TB_OPTION T WHERE T.GOODS_CD = G.GOODS_CD)  AS COLOR_NM
 		         , (SELECT GROUP_CONCAT(DISTINCT T.OPT_CD2) FROM TB_OPTION T WHERE T.GOODS_CD = G.GOODS_CD)  AS SIZE_NAME
 		         , G.BRAND_CD
-		         , (SELECT SUPPLY_COMP_NM FROM tb_supply_company SC WHERE SC.SUPPLY_COMP_CD = G.SUPPLY_COMP_CD) AS SUPPLY_COMP_NM 
 		     FROM TB_GOODS G
 		     WHERE 1=1
 		     AND G.GOODS_CD = #{goodsCd}
@@ -995,10 +996,11 @@
 		  , TB_NOTI_INFO N
 		 WHERE 1 = 1
 		 AND N.NI_CLSF_CD = #{niClsfCd}
-		 AND N.SUPPLY_COMP_CD =  CASE G.SUPPLY_COMP_CD
-		                              WHEN 'S0001' THEN 'S0001'
-		                              WHEN 'S0002' THEN 'S0002'
-		                         ELSE 'E' END 
+		 AND N.SUPPLY_VENDOR_CD =  CASE G.SUPPLY_VENDOR_CD
+		                                WHEN 'SV0001' THEN 'SV0001'
+		                                WHEN 'SV0002' THEN 'SV0002'
+		                                ELSE 'E' 
+		                           END 
 		 ORDER BY  G.GOODS_CD , N.NI_CLSF_CD, N.DISP_ORD
 	</select>
 	
@@ -1320,7 +1322,7 @@
 		       FROM TB_NOTI_INFO A
 		          , TB_ITEMKIND B
 		       WHERE A.NI_CLSF_CD = B.NI_CLSF_CD
-		       AND A.SUPPLY_COMP_CD = #{supplyCompCd}
+		       AND A.SUPPLY_VENDOR_CD = #{supplyVendorCd}
 		       AND B.ITEMKIND_CD = #{itemkindCd}
 		     ) D
 		    LEFT OUTER JOIN (
@@ -1433,9 +1435,12 @@
 		FROM (
 		      SELECT A.GOODS_CD 
 		           , A.MAIN_COLOR_CD 
-		           , B.OPT_CD1 
+		           , NVL(B.OPT_CD1,'00') AS OPT_CD1
 		      FROM TB_GOODS A
 		      LEFT OUTER JOIN TB_OPTION B ON A.GOODS_CD = B.GOODS_CD
+		                                  AND 1 = (CASE WHEN A.SELF_GOODS_YN = 'Y' THEN 1
+		                                                ELSE 2 END
+		                                          )
 		      WHERE A.GOODS_CD  = #{goodsCd}
 		      GROUP BY A.GOODS_CD , B.OPT_CD1
 		     ) A 

+ 4 - 4
src/main/resources/log/logback-locd.xml

@@ -10,19 +10,19 @@
 			<pattern>[%d] [%thread] %-5level %logger{32} : %msg%n</pattern>
 		</encoder>
 	</appender>
-	
+
 	<logger name="org.springframework" level="ERROR"/>
-	
+
 	<!-- SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다. -->
 	<logger name="jdbc.sqlonly" level="${LOG_LEVEL}">
 		<appender-ref ref="CONSOLE"/>
 	</logger>
-	
+
 	<!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. -->
 	<logger name="jdbc.sqltiming" level="${LOG_LEVEL}">
 		<appender-ref ref="CONSOLE"/>
 	</logger>
-	
+
 	<!-- ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. -->
 	<!-- 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다. -->
 	<!-- <logger name="jdbc.audit" level="ERROR">

+ 49 - 6
src/main/webapp/WEB-INF/views/business/BrandForm.html

@@ -135,9 +135,15 @@
 					<tr>	
 						<th>공급업체<i class="required" title="필수"></i></th>
 						<td>
-							<select name="supplyCompCd" required="required" data-valid-name="공급업체">
+
+<!-- 							<select name="supplyCompCd" required="required" data-valid-name="공급업체">
 								<option value="">[선택]</option>
 							</select>
+ -->							
+							<input type="text" class="w100" name="searchTxt" id="searchTxt" maxlength="20" />
+							<button type="button" class="btn icn" id="btnSearchSupplyComp"><i class="fa fa-search"></i></button>
+							<input type="text" class="w100" name="supplyCompNm" readonly="readonly"/>
+							<input type="hidden" class="w100" name="supplyCompCd" />
 						</td>
 						<th>유통구분<i class="required" title="필수"></i></th>
 						<td>
@@ -339,7 +345,9 @@
 		$("#detailForm input[name=brandGrpNm]").val(event.data.brandGrpNm);
 		$("#detailForm input[name=erpBrandCd]").val(event.data.erpBrandCd);
 		$("#detailForm select[name=distributionGb]").val(event.data.distributionGb);
-		fnGetSupplyCompCdList(event.data.supplyCompCd, event.data.delvFeeCd);
+		$("#detailForm input[name=supplyCompCd]").val(event.data.supplyCompCd);
+		$("#detailForm input[name=supplyCompNm]").val(event.data.supplyCompNm);
+		//fnGetSupplyCompCdList(event.data.supplyCompCd, event.data.delvFeeCd);
 		
 		// 출고처 정보
 		$.getJSON('/renderer/delvloc/list/' + event.data.supplyCompCd
@@ -354,6 +362,9 @@
 			}
 		);
 		
+		// 배송비 정책
+		cfnCreateCombo('/renderer/delvFee/list/' + event.data.supplyCompCd, $('#detailForm select[name=delvFeeCd]'), "[선택]", event.data.delvFeeCd);
+		
 		$("#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);
@@ -415,7 +426,7 @@
 	$('#detailForm select[name=brandGb]').on('change', function() {
 		// 구매포인트적립율 설정
 		fnSetPntRate($(this).val());
-		
+/*		
 		$.getJSON('/renderer/supply/company/list/' + $(this).val()
 			, function(result, status) {
 				$('#detailForm select[name=supplyCompCd]').empty().append('<option value="">[선택]</option>');
@@ -425,10 +436,11 @@
 				});
 				$('#detailForm select[name=supplyCompCd]').trigger('change');
 			});
+*/			
 	});
 	
 	// 공급업체 변경 시
-	$('#detailForm select[name=supplyCompCd]').on('change', function() {
+/*	$('#detailForm select[name=supplyCompCd]').on('change', function() {
 		if (gagajf.isNull($(this).val())) {
 			$('#detailForm select[name=delvLocCd]').empty().append('<option value="">[선택]</option>');
 			return;
@@ -463,9 +475,9 @@
 			
 		});
 	});
-	
+*/	
 	// 해당공급업체 조회
-	var fnGetSupplyCompCdList = function(supplyCompCd, delvFeeCd){
+/*	var fnGetSupplyCompCdList = function(supplyCompCd, delvFeeCd){
 		$.getJSON('/renderer/supply/company/list/' + $('#detailForm select[name=brandGb]').val()
 			, function(result, status) {
 				$('#detailForm select[name=supplyCompCd]').empty().append('<option value="">[선택]</option>');
@@ -478,7 +490,37 @@
 		
 		cfnCreateCombo('/renderer/delvFee/list/' + supplyCompCd, $('#detailForm select[name=delvFeeCd]'), "[선택]", delvFeeCd);
 	}
+*/	
+	// 공급업체 선택시
+	$('#btnSearchSupplyComp').on('click', function() {
+/*
+		if (gagajf.isNull($("#detailForm input[name=searchTxt]").val())){
+			mcxDialog.alert('공급업체 검색어를 입력하세요.');
+			return false;
+		}
+*/		
+		cfnOpenCompanyListPopup('fnSetSupplyCompInfo', 'S', $("#detailForm input[name=searchTxt]").val());
+		
+	});
 	
+	// 공급업체 조회 팝업에서 호출
+	var fnSetSupplyCompInfo = function(result) {
+		$("#detailForm input[name=supplyCompCd]").val(result[0].supplyCompCd);
+		$("#detailForm input[name=supplyCompNm]").val(result[0].supplyCompNm);
+		
+		// 출고처 정보
+		$.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);
+				});
+			}
+		);
+		
+		cfnCreateCombo('/renderer/delvFee/list/' + result[0].supplyCompCd, $('#detailForm select[name=delvFeeCd]'), "[선택]");
+	}
 	
 	// 브랜드담당MD 목록
 	var fnGetBrandMdList = function(brandCd) {
@@ -645,6 +687,7 @@
 		$("#detailForm select[name=brandGb]").trigger('change');
 		$("#detailForm select[name=brandGb]").removeAttr("disabled");
 		$('#detailForm select[name=delvLocCd]').empty().append('<option value="">[선택]</option>');
+		$('#detailForm select[name=delvFeeCd]').empty().append('<option value="">[선택]</option>');
 		
 		$("#detailForm input[type=checkbox]").removeClass("checked");
 		$("#detailForm input[type=checkbox]").parent("label").removeClass("checked");

+ 60 - 43
src/main/webapp/WEB-INF/views/business/SupplyCompanyForm.html

@@ -112,62 +112,67 @@
 						<td>
 							<input type="text" name="supplyCompNm" maxlength="100" required="required" data-valid-name="업체명"/>
 						</td>
-						<th>사업자구분<i class="required" title="필수"></i></th>
-						<td>
-							<label class="rdoBtn"><input type="radio" name="bizGb" value="C" checked="checked"/>법인<span></span></label>
-							<label class="rdoBtn"><input type="radio" name="bizGb" value="P"/>개인<span></span></label>
-						</td>
-						<th>사업자등록번호<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" class="w150" name="bizNo" maxlength="20" required="required" data-valid-name="사업자등록번호"/>
-							<button type="button" class="btn btn-info btn-sm" onclick="fnCertifyBizNo();">인증</button>
+						<th>공급벤더<i class="required" title="필수"></i></th>
+						<td colspan="3">
+							<input type="text" class="w200" name="supplyVendorNm" onkeypress="if (window.event.keyCode == 13) { fnOpenSupplyVendorPopup('input[name=supplyVendorCd]', 'input[name=supplyVendorNm]'); }"/>
+							<button type="button" class="btn icn" onclick="fnOpenSupplyVendorPopup('input[name=supplyVendorCd]', 'input[name=supplyVendorNm]');"><i class="fa fa-search cpn" aria-hidden="true"></i></button>
+							<input name="supplyVendorCd" type="text" class="w100" maxlength="20" readonly="readonly"/>
+							<button type="button" class="btn icn" onclick="$('input[name=supplyVendorCd], input[name=supplyVendorNm]').val('');"><i class="fa fa-eraser" aria-hidden="true"></i></button>
 						</td>
 					</tr>
 					<tr>
-						<th>업종<i class="required" title="필수"></i></th>
+						<th>사업자구분</th>
 						<td>
-							<input type="text" name="bizKind" maxlength="100" required="required" data-valid-name="업종"/>
+							<label class="rdoBtn"><input type="radio" name="bizGb" value="C" checked="checked" readonly="readonly"/>법인<span></span></label>
+							<label class="rdoBtn"><input type="radio" name="bizGb" value="P" readonly="readonly"/>개인<span></span></label>
 						</td>
-						<th>업태<i class="required" title="필수"></i></th>
+						<th>사업자등록번호</th>
 						<td>
-							<input type="text" name="bizType" maxlength="100" required="required" data-valid-name="업태"/>
+							<input type="text" name="bizNo" maxlength="20" readonly="readonly"/>
 						</td>
-						<th>입점상태<i class="required" title="필수"></i></th>
+						<th>업종</th>
 						<td>
-							<select name="supplyStat" id="supplyStat" required="required" data-valid-name="입점상태">
-								<option value="">[선택]</option>
-								<option th:if="${supplyStatList}" th:each="oneData, status : ${supplyStatList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
+							<input type="text" name="bizKind" maxlength="100" readonly="readonly"/>
 						</td>
-						<th>대표자명<i class="required" title="필수"></i></th>
+						<th>업태</th>
 						<td>
-							<input type="text" name="ownerNm" maxlength="50" required="required" data-valid-name="대표자명"/>
+							<input type="text" name="bizType" maxlength="100" readonly="readonly"/>
 						</td>
 					</tr>
 					<tr>
-						<th rowspan="2">사업장주소<i class="required" title="필수"></i></th>
-						<td colspan="3" rowspan="2">
-							<input type="text" name="bizZipcode"  class="w100" data-valid-name="우편번호" readonly="readonly"/>
-							<button type="button" class="btn btn-info btn-sm" onclick="fnOpenDaumAddr();">우편번호찾기</button>
-							<input type="text" name="bizBaseAddr" class="w300" maxlength="200" required="required" data-valid-name="사업장주소" readonly="readonly"/><br>
-							<input type="text" name="bizDtlAddr" class="w300" maxlength="200"/>
+						<th>대표자명</th>
+						<td>
+							<input type="text" name="ownerNm" maxlength="50" readonly="readonly"/>
 						</td>
-						<th>홈페이지URL</th>
+						<th>대표전화</th>
+						<td>
+							<input type="text" name="mainTelno" maxlength="20" readonly="readonly"/>
+						</td>
+						<th>대표팩스번호</th>
 						<td colspan="3">
-							<input type="text" name="homepageUrl" data-valid-name="홈페이지URL"/>
+							<input type="text" class="w200" name="mainFaxno" maxlength="20" readonly="readonly"/>
 						</td>
 					</tr>
 					<tr>
-						<th>대표전화<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" name="mainTelno" placeholder="02-0000-0000" maxlength="20" required="required" data-valid-name="대표전화"/>
+						<th>사업장주소</th>
+						<td colspan="5">
+							<input type="text" name="bizZipcode"  class="w100" data-valid-name="우편번호" readonly="readonly"/>
+							<input type="text" name="bizBaseAddr" class="w300" maxlength="200" readonly="readonly"/>
+							<input type="text" name="bizDtlAddr" class="w300" maxlength="200" readonly="readonly"/>
 						</td>
-						<th>대표팩스번호</th>
+						<th>홈페이지URL</th>
 						<td>
-							<input type="text" name="mainFaxno" placeholder="02-0000-0000" maxlength="20" data-valid-name="대표팩스번호"/>
+							<input type="text" name="homepageUrl" readonly="readonly"/>
 						</td>
 					</tr>
 					<tr>
+						<th>입점상태<i class="required" title="필수"></i></th>
+						<td>
+							<select name="supplyStat" id="supplyStat" required="required" data-valid-name="입점상태">
+								<option value="">[선택]</option>
+								<option th:if="${supplyStatList}" th:each="oneData, status : ${supplyStatList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
 						<th>유통구분<i class="required" title="필수"></i></th>
 						<td>
 							<select name="distributionGb" required="required" data-valid-name="유통구분">
@@ -179,11 +184,6 @@
 						<td>
 							<input type="text" name="sellFeeRate" class="w100 aR" placeholder="0.0" maxlength="5" required="required" data-valid-type="real" data-valid-name="판매수수료율"/>%
 						</td>
-						<th>사용여부<i class="required" title="필수"></i></th>
-						<td>
-							<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked"/>Yes<span></span></label>
-							<label class="rdoBtn"><input type="radio" name="useYn" value="N"/>No<span></span></label>
-						</td>
 						<th>총알배송여부<i class="required" title="필수"></i></th>
 						<td>
 							<label class="rdoBtn"><input type="radio" name="shotDelvYn" value="Y"/>Yes<span></span></label>
@@ -193,19 +193,19 @@
 					<tr>
 						<th>CS담당자</th>
 						<td>
-							<input type="text" name="csChargeNm" class="w100 aR" maxlength="50"/>
+							<input type="text" name="csChargeNm" class="w100" maxlength="50"/>
 						</td>
 						<th>CS담당자 연락처</th>
 						<td>
-							<input type="text" name="csChargeTelno" placeholder="02-0000-0000" maxlength="20"/>
+							<input type="text" name="csChargeTelno" placeholder="02-0000-0000" maxlength="13"/>
 						</td>
 						<th>정산담당자</th>
 						<td>
-							<input type="text" name="settleChargeNm" class="w100 aR" maxlength="50"/>
+							<input type="text" name="settleChargeNm" class="w100" maxlength="50"/>
 						</td>
 						<th>정산담당자 연락처</th>
 						<td>
-							<input type="text" name="settleChargeTelno" placeholder="02-0000-0000" maxlength="20"/>
+							<input type="text" name="settleChargeTelno" placeholder="02-0000-0000" maxlength="13"/>
 						</td>
 					</tr>
 					<tr>
@@ -243,9 +243,14 @@
 							<input type="text" name="accountNo" maxlength="20"/>
 						</td>
 						<th>예금주명</th>
-						<td colspan="3">
+						<td>
 							<input type="text" class="w100" name="depositorNm" maxlength="50"/>
 						</td>
+						<th>사용여부<i class="required" title="필수"></i></th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked"/>Yes<span></span></label>
+							<label class="rdoBtn"><input type="radio" name="useYn" value="N"/>No<span></span></label>
+						</td>
 					</tr>
 					<tr>
 						<th>비고</th>
@@ -324,6 +329,8 @@
 				return '<a href="javascript:void(0);">' + params.value + '</a>';
 			}
 		},
+		{ headerName: "공급벤더코드", field: "supplyVendorCd", width: 100, cellClass: 'text-center', hide: true },
+		{ headerName: "공급벤더명", field: "supplyVendorNm", width: 150, cellClass: 'text-center', hide: true },
 		{
 			headerName: "사업자구분", field: "bizGb", width: 100, cellClass: 'text-center',
 			valueGetter: function (params) { return params.data.bizGb == 'C' ? '법인' : '개인'; }
@@ -407,6 +414,8 @@
 		
 		$('#detailForm input[name=supplyCompCd]').val(event.data.supplyCompCd);
 		$('#detailForm input[name=supplyCompNm]').val(event.data.supplyCompNm);
+		$('#detailForm input[name=supplyVendorCd]').val(event.data.supplyVendorCd);
+		$('#detailForm input[name=supplyVendorNm]').val(event.data.supplyVendorNm);
 		$('#detailForm select[name=supplyStat]').val(event.data.supplyStat);
 		$('#detailForm input[name=ownerNm]').val(event.data.ownerNm);
 		
@@ -469,6 +478,14 @@
 		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
 	});
 	
+	// 공급벤더 팝업
+	var fnOpenSupplyVendorPopup = function(strReturnCode, strReturnName) {
+		var oParam = new Object();
+		oParam.returnCode = strReturnCode;
+		oParam.returnName = strReturnName;
+		cfnOpenSupplyVendorPopup($(strReturnName).val(), oParam);
+	}
+	
 	// 신규버튼
 	$('#btnNew').on('click', function() {
 		$("#detailForm")[0].reset();

+ 282 - 0
src/main/webapp/WEB-INF/views/business/SupplyVendorForm.html

@@ -0,0 +1,282 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : SupplyVendorForm.html
+ * @desc    : 공급벤더관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.18   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/supply/vendor/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>검색어</th>
+						<td>
+							<select name="searchGb">
+								<option value="NAME">벤더명</option>
+								<option value="OWNER">대표자명</option>
+							</select>
+							<input type="text" name="searchTxt" class="w300" maxlength="20"/>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 버튼 배치 영역 -->
+			<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/supply/vendor/save'}">
+				<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 style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+					</colgroup>
+					<tr>
+						<th>벤더코드</th>
+						<td>
+							<input type="text" class="w150" name="supplyVendorCd" placeholder="자동생성" maxlength="6" data-valid-name="벤더코드" readonly="readonly"/>
+						</td>
+						<th>벤더명<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" name="supplyVendorNm" maxlength="100" required="required" data-valid-name="벤더명"/>
+						</td>
+						<th>사업자구분<i class="required" title="필수"></i></th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="bizGb" value="C" checked="checked"/>법인<span></span></label>
+							<label class="rdoBtn"><input type="radio" name="bizGb" value="P"/>개인<span></span></label>
+						</td>
+						<th>사업자등록번호<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w150" name="bizNo" maxlength="20" required="required" data-valid-name="사업자등록번호"/>
+							<button type="button" class="btn btn-info btn-sm" onclick="fnCertifyBizNo();">인증</button>
+						</td>
+					</tr>
+					<tr>
+						<th>업종<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" name="bizKind" maxlength="100" required="required" data-valid-name="업종"/>
+						</td>
+						<th>업태<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" name="bizType" maxlength="100" required="required" data-valid-name="업태"/>
+						</td>
+						<th>대표자명<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" name="ownerNm" maxlength="50" required="required" data-valid-name="대표자명"/>
+						</td>
+						<th>대표전화<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" name="mainTelno" placeholder="02-0000-0000" maxlength="20" required="required" data-valid-name="대표전화"/>
+						</td>
+					</tr>
+					<tr>
+						<th>대표팩스번호</th>
+						<td>
+							<input type="text" name="mainFaxno" placeholder="02-0000-0000" maxlength="20" data-valid-name="대표팩스번호"/>
+						</td>
+						<th>사업장주소<i class="required" title="필수"></i></th>
+						<td colspan="5">
+							<input type="text" name="bizZipcode"  class="w100" data-valid-name="우편번호" readonly="readonly"/>
+							<button type="button" class="btn btn-info btn-sm" onclick="fnOpenDaumAddr();">우편번호찾기</button>
+							<input type="text" name="bizBaseAddr" class="w300" maxlength="200" required="required" data-valid-name="사업장주소" readonly="readonly"/>
+							<input type="text" name="bizDtlAddr" class="w300" maxlength="200"/>
+						</td>
+					</tr>
+					<tr>
+						<th>홈페이지URL</th>
+						<td colspan="5">
+							<input type="text" class="w300" name="homepageUrl" data-valid-name="홈페이지URL"/>
+						</td>
+						<th>사용여부<i class="required" title="필수"></i></th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked"/>Yes<span></span></label>
+							<label class="rdoBtn"><input type="radio" name="useYn" value="N"/>No<span></span></label>
+						</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 columnDefs = [
+		{ headerName: "벤더코드", field: "supplyVendorCd", width: 100, cellClass: 'text-center' },
+		{
+			headerName: "벤더명", field: "supplyVendorNm", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{
+			headerName: "사업자구분", field: "bizGb", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) { return params.data.bizGb == 'C' ? '법인' : '개인'; }
+		},
+		{ headerName: "사업자등록번호", field: "bizNo", width: 120, cellClass: 'text-center' },
+		{ headerName: "업종", field: "bizKind", width: 150, cellClass: 'text-center' },
+		{ headerName: "업태", field: "bizType", width: 150, cellClass: 'text-center' },
+		{ headerName: "대표자명", field: "ownerNm", width: 100, cellClass: 'text-center' },
+		{ headerName: "대표전화번호", field: "mainTelno", width: 120, cellClass: 'text-center' },
+		{ headerName: "대표팩스번호", field: "mainFaxno", width: 120, cellClass: 'text-center' },
+		{ headerName: "우편번호", field: "bizZipcode", width: 80, cellClass: 'text-center' },
+		{ headerName: "기본주소", field: "bizBaseAddr", width: 250 },
+		{ headerName: "상세주소", field: "bizDtlAddr", width: 150 },
+		{ headerName: "홈페이지URL", field: "homepageUrl", width: 200 }
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// Cell click
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field != 'supplyVendorNm')
+			return;
+		
+		$('#detailForm input[name=supplyVendorCd]').val(event.data.supplyVendorCd);
+		$('#detailForm input[name=supplyVendorNm]').val(event.data.supplyVendorNm);
+		
+		if (event.data.bizGb == 'C') {
+			$('#detailForm input:radio[name=bizGb]').eq(0).trigger('click');
+		} else {
+			$('#detailForm input:radio[name=bizGb]').eq(1).trigger('click');
+		}
+		
+		$('#detailForm input[name=bizNo] ').val(event.data.bizNo);
+		$('#detailForm input[name=bizKind]').val(event.data.bizKind);
+		$('#detailForm input[name=bizType]').val(event.data.bizType);
+		$('#detailForm input[name=ownerNm]').val(event.data.ownerNm);
+		$('#detailForm input[name=mainTelno]').val(event.data.mainTelno);
+		$('#detailForm input[name=mainFaxno]').val(event.data.mainFaxno);
+		$('#detailForm input[name=bizZipcode]').val(event.data.bizZipcode);
+		$('#detailForm input[name=bizBaseAddr]').val(event.data.bizBaseAddr);
+		$('#detailForm input[name=bizDtlAddr]').val(event.data.bizDtlAddr);
+		$('#detailForm input[name=homepageUrl]').val(event.data.homepageUrl);
+		
+		if (event.data.useYn == 'Y') {
+			$('#detailForm input:radio[name=useYn]').eq(0).trigger('click');
+		} else {
+			$('#detailForm input:radio[name=useYn]').eq(1).trigger('click');
+		}
+	}
+
+	// 검색
+	$('#btnSearch').on('click', function() {
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+	
+	// 신규버튼
+	$('#btnNew').on('click', function() {
+		$("#detailForm")[0].reset();
+	});
+
+	// 저장
+	$("#btnSave").on("click", function() {
+		// 필수값 체크
+		if (!gagajf.validation('#detailForm'))
+			return false;
+
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {
+					$('#btnNew').trigger('click');
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('공급벤더 목록', gridOptions);
+	});
+
+	/**
+	 * DAUM을 이용한 우편번호 팝업 레이어
+	 */
+	var fnOpenDaumAddr = function() {
+		let daumZip = new daum.Postcode({
+			oncomplete: function(data) {
+				// 우편번호와 주소 정보를 해당 필드에 넣는다.
+				$('#detailForm input[name=bizZipcode]').val(data.zonecode);
+				$('#detailForm input[name=bizBaseAddr]').val(cfnGetDaumRoadAddr(data));
+				$('#detailForm input[name=bizDtlAddr]').focus();
+				
+				cfnCloseDaumAddr();
+			},
+			width: '100%'
+		});
+		
+		cfnOpenDaumAddr(daumZip);
+	}
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 142 - 0
src/main/webapp/WEB-INF/views/business/SupplyVendorPopupForm.html

@@ -0,0 +1,142 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : SupplyVendorPopupForm.html
+ * @desc    : 공급벤더 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.18   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1200" id="popupSupplyVendor">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong>쿠폰 조회</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupSupplyVendor');"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+		
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<form id="searchSupplyVendorForm" name="searchSupplyVendorForm" action="#" th:action="@{'/business/supply/vendor/list'}" th:method="post">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>벤더명</th>
+							<td>
+								<input type="text" name="supplyVendorNm" class="w300" maxlength="50" th:value="${supplyVendorNm}"/>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearchSupplyVendor">조회</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- //CONTENT -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelContent">
+			<div id="gridSupplyVendorList" 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="btnConfirmSupplyVendor">확인</button>
+			</li>
+		</ul>
+		<!-- //버튼 배치 영역 -->
+	</div>
+</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let returnCode = [[${returnCode}]];
+	let returnName = [[${returnName}]];
+
+	let columnDefsSupplyVendorList = [
+// 		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{ headerName: "벤더코드", field: "supplyVendorCd", width: 100, cellClass: 'text-center' },
+		{ headerName: "벤더명", field: "supplyVendorNm", width: 150, cellClass: 'text-center'},
+		{
+			headerName: "사업자구분", field: "bizGb", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) { return params.data.bizGb == 'C' ? '법인' : '개인'; }
+		},
+		{ headerName: "사업자등록번호", field: "bizNo", width: 120, cellClass: 'text-center' },
+		{ headerName: "업종", field: "bizKind", width: 150, cellClass: 'text-center' },
+		{ headerName: "업태", field: "bizType", width: 150, cellClass: 'text-center' },
+		{ headerName: "대표자명", field: "ownerNm", width: 100, cellClass: 'text-center' },
+		{ headerName: "대표전화번호", field: "mainTelno", width: 120, cellClass: 'text-center', hide: true },
+		{ headerName: "대표팩스번호", field: "mainFaxno", width: 120, cellClass: 'text-center', hide: true },
+		{ headerName: "우편번호", field: "bizZipcode", width: 80, cellClass: 'text-center' },
+		{ headerName: "기본주소", field: "bizBaseAddr", width: 250 },
+		{ headerName: "상세주소", field: "bizDtlAddr", width: 150 },
+		{ headerName: "홈페이지URL", field: "homepageUrl", width: 200 }
+	];
+
+	let gridOptionsSupplyVendorList = gagaAgGrid.getGridOptions(columnDefsSupplyVendorList);
+	
+	gridOptionsSupplyVendorList.rowSelection = 'single';
+	gridOptionsSupplyVendorList.rowMultiSelectWithClick = true; // 클릭으로 선택 가능
+	
+// 	// Row double click
+// 	gridOptionsSupplyVendorList.onRowDoubleClicked = function(event) {
+// 		$('#btnConfirmSupplyVendor').trigger('click');
+// 	}
+
+	// 조회
+	$('#btnSearchSupplyVendor').on('click', function() {
+		// Fetch data
+		gagaAgGrid.fetch($('#searchSupplyVendorForm').prop('action'), gridOptionsSupplyVendorList, '#searchSupplyVendorForm', function(result) {
+			if (result.length == 1) {
+				// TODO: row를 클릭한 것처럼 활성화 하고, $('#btnConfirmSupplyVendor').trigger('click');
+			}
+		});
+	});
+	
+	// 부모창에 값을 설정
+	let fnSetSupplyVendorValueToOpener = function(rowData) {
+		$(returnCode).val(rowData.supplyVendorCd);
+		$(returnName).val(rowData.supplyVendorNm);
+
+		uifnPopupClose('popupSupplyVendor');
+	}
+	
+	// 확인
+	$('#btnConfirmSupplyVendor').on('click', function() {
+		var selectedData = gagaAgGrid.selectedRowData(gridOptionsSupplyVendorList);
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 항목이 없습니다.');
+			return false;
+		}
+		
+		fnSetSupplyVendorValueToOpener(selectedData[0]);
+	});
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridSupplyVendorList', gridOptionsSupplyVendorList);
+		
+		$('#btnSearchSupplyVendor').trigger('click');
+	});
+/*]]>*/
+</script>
+
+</html>

+ 24 - 22
src/main/webapp/WEB-INF/views/customer/CustomerActiveListForm.html

@@ -44,7 +44,6 @@
 					<td class="dashR">
 						<select name="searchGb">
 							<option value="">선택</option>
-							<option value="custNo">회원번호 </option>
 							<option value="custNm">회원명 </option>
 							<option value="email">이메일</option>
 							<option value="custId">아이디</option>
@@ -132,16 +131,12 @@
 
 <script th:inline="javascript">
 	/*<![CDATA[*/
-	// 사이트목록
-	const siteList = gagajf.convertToArray([[${siteList}]]);
-	// 회원구분
-	const custGbList = gagajf.convertToArray([[${custGbList}]]);
-	// 회원등급
-	const custGradeList = gagajf.convertToArray([[${custGradeList}]]);
-	// 관리대상
-	const managedRsnList = gagajf.convertToArray([[${managedRsnList}]]);
-	// 성별
-	const genderGb = {"G007_F":"여성", "G007_M":"남성"};
+
+	const siteList = gagajf.convertToArray([[${siteList}]]);				// 사이트목록
+	const custGbList = gagajf.convertToArray([[${custGbList}]]);			// 회원구분
+	const custGradeList = gagajf.convertToArray([[${custGradeList}]]);		// 회원등급
+	const managedRsnList = gagajf.convertToArray([[${managedRsnList}]]);	// 관리대상
+	const genderGbList = gagajf.convertToArray([[${genderGbList}]]);		// 성별
 
 	// specify the columns
 	const columnDefs = [
@@ -149,11 +144,12 @@
 			headerName: "사이트", field:'siteCd', width:100, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.lookupValue(siteList, params.data.siteCd); }
 		},
-		{headerName: "회원ID", field:'custId', width:120, cellClass: 'text-center'},
-		{headerName: "회원NO", field:'custNo', width:100, cellClass: 'text-center'},
+		{headerName: "회원ID", field:'maskingCustId', width:120, cellClass: 'text-left',
+			valueGetter: function (params) { return params.data.maskingCustId; }
+		},
 		{
-			headerName: "회원명", field:'custNm', width:100, cellClass: 'text-center',
-			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+			headerName: "회원명", field:'maskingCustNm', width:100, cellClass: 'text-center',
+			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.data.maskingCustNm + '</a>'; }
 		},
 		{
 			headerName: "회원구분", field:'custGb', width:100, cellClass: 'text-center',
@@ -175,16 +171,21 @@
 			headerName: "로그인일자", field:'loginLdt', width:120, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.toDateFormat(params.data.loginLdt); }
 		},
-		{headerName: "핸드폰", field:'cellPhnno', width:140, cellClass: 'text-center'},
-		{headerName: "이메일", field:'email', width:220, cellClass: 'text-center'},
+		{
+			headerName: "핸드폰", field:'maskingCellPhnno', width:140, cellClass: 'text-center',
+			valueGetter: function (params) { return params.data.maskingCellPhnno; }
+		},
+		{
+			headerName: "이메일", field:'maskingEmail', width:220, cellClass: 'text-left',
+			valueGetter: function (params) { return params.data.maskingEmail; }
+		},
 		{
 			headerName: "성별", field:'sexGb', width:50, cellClass: 'text-center',
-			valueGetter: function (params) { return gagaAgGrid.lookupValue(genderGb, params.data.sexGb); }
+			valueGetter: function (params) { return gagaAgGrid.lookupValue(genderGbList, params.data.sexGb); }
 		},
-		{headerName: "기본주소", field:'homeBaseAddr', width:350, cellClass: 'text-center'},
-		{headerName: "상세주소", field:'homeDtlAddr', width:250, cellClass: 'text-center'},
 		{headerName: "수신동의(SMS)", field:'smsAgreeYn', width:110, cellClass: 'text-center'},
-		{headerName: "수신동의(메일)", field:'emailAgreeYn', width:110, cellClass: 'text-center'}
+		{headerName: "수신동의(Email)", field:'emailAgreeYn', width:110, cellClass: 'text-center'},
+		{headerName: "수신동의(APP)", field:'appAgreeYn', width:110, cellClass: 'text-center', hide: true},
 	];
 
 	// Get GridOptions
@@ -192,7 +193,7 @@
 
 	// 셀 클릭 이벤트
 	gridOptions.onCellClicked = function(event) {
-		 if (event.colDef.field == 'custNm') {
+		 if (event.colDef.field === 'maskingCustNm') {
 			// 고객 상세
 			cfnOpenCustDetailPopup(event.data.custNo);
 		}
@@ -239,6 +240,7 @@
 			}
 
 		}
+
 		if (!isSearchVaild) {
 			mcxDialog.alertC(validationMessage, {
 				sureBtnText: "확인",

+ 1471 - 0
src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html

@@ -0,0 +1,1471 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CustomerDetailForm.html
+ * @desc    : 회원 상세 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.01.18   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" id="popupCustomerDetail">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong>회원상세</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupCustomerDetail');"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<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 style="width:15%;"/>
+				</colgroup>
+				<tbody>
+				<th>이름</th>
+				<td>
+					<span name="custNm"></span>
+					<span name="managedRsnNm" class="infoTxt cRed" style="font-size:15px;"></span>
+				</td>
+				<th>아이디</th>
+				<td><span name="custId"></span>
+					<th:block th:if="${sessionInfo.userId == 'jsshin'}">
+						<button type="button" class="btn btnRight btn-success btn-lg" id="btnLogin">Login</button>
+					</th:block>
+				</td>
+				<!--<th>등급</th>-->
+				<!--<td><span name="custGradeNm"></span></td>-->
+				<th>가입사이트</th>
+				<td><span name="siteNm"></span></td>
+				</tbody>
+			</table>
+
+			<!-- TABS SPACE -->
+			<div class="tabs">
+				<!-- TABS NAVI -->
+				<ul class="tabsNav">
+					<li class="on"><a href="#tab1" onclick="fnSearchCustInfo();">기본정보</a></li>
+					<li><a href="#tab2" onclick="fnSearchOrder();">주문내역</a></li>
+					<li><a href="#tab3" onclick="fnSearchCounsel();">1:1문의내역</a></li>
+					<li><a href="#tab4" onclick="fnSearchGoodsQna();">상품문의내역</a></li>
+					<li><a href="#tab5" onclick="fnSearchCoupon();">쿠폰내역</a></li>
+					<li><a href="#tab6" onclick="fnSearchPoint();">포인트내역</a></li>
+					<li><a href="#tab7" onclick="fnSearchReview();">상품평내역</a></li>
+					<li><a href="#tab8" onclick="fnSearchChangeGrade();">회원등급변경이력</a></li>
+					<li><a href="#tab9" onclick="fnSearchDelivery();">배송지정보</a></li>
+					<li><a href="#tab10" onclick="fnSearchContact();">회원접촉이력</a></li>
+				</ul>
+				<!-- //TABS NAVI -->
+				<!-- TABS CONTENTS -->
+				<ul class="tabsCont">
+					<!-- TAB1 : 회원정보 -->
+					<li class="tab on" id="tab1">
+						<form id="custInfo">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<input type="hidden" name="custNm"/>
+							<input type="hidden" name="homeTelno" data-valid-name="전화번호"/>
+							<input type="hidden" name="cellPhnno" data-valid-name="휴대전화"/>
+							<input type="hidden" name="email" data-valid-name="이메일"/>
+							<input type="hidden" name="orgCustGrade"/>
+							<input type="hidden" name="orgManagedRsn"/>
+							<input type="hidden" name="changeManagedYn" value="N">
+							<input type="hidden" name="changeGradeYn" value="N">
+							<input type="hidden" name="crtfdNoYn" value="N">
+							<!-- TAB1 CONTENTS AREA -->
+							<div class="tabContArea">
+								<h4>기본정보</h4>
+								<table class="frmStyle">
+									<colgroup>
+										<col style="width:10%;"/>
+										<col style="width:40%;"/>
+										<col style="width:10%;"/>
+										<col/>
+									</colgroup>
+									<tbody>
+									<tr>
+										<th class="dashR">회원구분<i class="star"></i></th>
+										<td class="dashR">
+											<select name="custGb">
+												<option th:if="${custGbList}" th:each="oneData, status : ${custGbList}" th:value="${oneData.cd}"
+														th:text="|${oneData.cdNm}|"></option>
+											</select>
+										</td>
+										<th class="dashR">회원등급<i class="star"></i></th>
+										<td class="dashR">
+											<select name="custGrade">
+												<option th:if="${custGradeList}" th:each="oneData, status : ${custGradeList}" th:value="${oneData.cd}"
+														th:text="|${oneData.cdNm}|"></option>
+											</select>
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">관리대상</th>
+										<td class="dashR">
+											<select name="managedRsn">
+												<option value="">일반</option>
+												<option th:if="${managedRsnList}" th:each="oneData, status : ${managedRsnList}" th:value="${oneData.cd}"
+														th:text="|${oneData.cdNm}|"></option>
+											</select>
+											<span class="infoTxt cRed" style="font-size:15px;" name="managedRsnDp"></span>
+										</td>
+										<th class="dashR">관리대상 지정 날짜</th>
+										<td class="dashR" name="managedDt">
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">관리대상 지정 사유</th>
+										<td class="dashR" colspan="3">
+											<input type="text" class="w600" name="managedDtlRsn" id="managedDtlRsn"/>
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">비밀번호</th>
+										<td class="dashR" colspan="3">
+											*******
+											<button type="button" class="btn btn-info btn-lg" id="btnCustPasswordReset">초기화</button>
+											<span class="infoTxt cBlue"><i class="fa fa-info-circle"></i>회원에게 임시비밀번호를 발송합니다. (이메일, 알림톡)</span>
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">생년월일</th>
+										<td class="dashR">
+											<input type="text" name="birthYmd" id="birthYmd" class="schDate w100" data-valid-name="생년월일"/>
+										</td>
+										<th class="dashR">성별</th>
+										<td class="dashR" name="sexGb"></td>
+									</tr>
+									<tr>
+										<th class="dashR">자택주소</th>
+										<td class="dashR" colspan="3">
+											<input type="text" name="homePostNo" class="w100" readonly="readonly"/>
+											<button type="button" class="btn btn-info btn-lg" onclick="fnOpenDaumAddr('custInfo');">우편번호찾기</button>
+											<br/>
+											<input type="text" name="homeBaseAddr" class="w300" readonly="readonly"/>
+											<input type="text" name="homeDtlAddr" class="w300"/>
+										</td>
+
+									</tr>
+									<tr>
+										<th class="dashR">휴대전화번호<i class="star"></i></th>
+										<td class="dashR">
+											<select name="cellPhnno1">
+												<option value="">선택</option>
+												<option th:if="${nationalHpNumberList}" th:each="oneData, status : ${nationalHpNumberList}"
+														th:value="${oneData.cd}" th:text="|${oneData.cd}|"></option>
+											</select> -
+											<input type="text" class="w50" name="cellPhnno2" id="cellPhnno2" maxlength="4" required="required"
+												   data-valid-type="numeric" data-valid-name="휴대전화번호"/> -
+											<input type="text" class="w50" name="cellPhnno3" id="cellPhnno3" maxlength="4" required="required"
+												   data-valid-type="numeric" data-valid-name="휴대전화번호"/>
+											<button type="button" class="btn btn-info btn-lg" id="btnCustSendLms">LMS전송</button>
+											<button type="button" class="btn btn-info btn-lg" id="btnCustCrtfd">번호변경</button>
+											<input type="text" class="w200" name="crtfdNo" placeholder="인증번호 입력" style="display: none;">
+											<button type="button" class="btn btn-info btn-lg" id="btnSendCustCrtfdNo" style="display: none;">전송</button>
+											<button type="button" class="btn btn-info btn-lg" id="btnCustCrtfdNo" style="display: none;">확인</button>
+											<span class="infoTxt cBlue" style="display: none;" name="message"></span>
+											<span id="expln" class="infoTxt cBlue"><i class="fa fa-info-circle"></i>인증번호 확인 후 번호변경가능</span>
+											<span id="explnPhone" class="infoTxt cBlue"><i class="fa fa-info-circle"></i>변경 해야 할 휴대폰번호 입력 후 전송</span>
+										</td>
+										<th class="dashR">SMS수신여부<i class="star"></i></th>
+										<td class="dashR">
+											<label class="rdoBtn"><input type="radio" name="smsAgreeYn" value="Y"/>수신</label>
+											<label class="rdoBtn"><input type="radio" name="smsAgreeYn" value="N"/>미수신</label>
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">이메일<i class="star"></i></th>
+										<td class="dashR">
+											<input type="text" class="w300" name="email1"/>
+											@
+											<input type="text" class="w150" name="email2"/>
+											<select name="emailDomain">
+												<option value="">선택하세요</option>
+												<option th:if="${emailDomainList}" th:each="oneData, status : ${emailDomainList}" th:value="${oneData.cd}"
+														th:text="|${oneData.cdNm}|"></option>
+											</select>
+											<button type="button" class="btn btn-info btn-lg" id="btnCustSendEmail">이메일발송</button>
+										</td>
+										<th class="dashR">메일수신여부<i class="star"></i></th>
+										<td class="dashR">
+											<label class="rdoBtn"><input type="radio" name="emailAgreeYn" value="Y"/>수신</label>
+											<label class="rdoBtn"><input type="radio" name="emailAgreeYn" value="N"/>미수신</label>
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">가입일시</th>
+										<td class="dashR" name="joinDt"></td>
+										<th class="dashR">최종로그인일시</th>
+										<td class="dashR" name="loginDt"></td>
+									</tr>
+									<tr>
+										<th class="dashR">내외국인</th>
+										<td class="dashR" name="foreignerYn"></td>
+										<th class="dashR">탈퇴여부</th>
+										<td class="dashR" name="secedeRsnYn"></td>
+									</tr>
+									<tr>
+										<th class="dashR">SNS가입유형</th>
+										<td class="dashR" name="snsType" colspan="3"></td>
+									</tr>
+									</tbody>
+								</table>
+								<div class="aR" style="margin-top:10px;">
+									<button type="button" class="btn btn-success btn-lg" id="btnCustInfoSave">저장</button>
+								</div>
+							</div>
+							<!-- //TAB1 CONTENTS AREA -->
+						</form>
+					</li>
+					<!-- //TAB1 : 회원정보 -->
+
+					<!-- TAB2 : 주문내역 -->
+					<li class="tab" id="tab2">
+						<!-- TAB2 CONTENTS AREA -->
+						<form id="custOrder">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<div class="tabContArea">
+								<h4>주문내역</h4>
+								<div id="custOrderList" style="width: 100%; height: 510px;" class="ag-theme-balham"></div>
+							</div>
+							<!-- //TAB2 CONTENTS AREA -->
+						</form>
+					</li>
+					<!-- //TAB2 : 주문내역 -->
+
+					<!-- TAB3 : 1:1문의 내역 -->
+					<li class="tab" id="tab3">
+						<!-- TAB3 CONTENTS AREA -->
+						<form id="custOnetoOne">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<div class="tabContArea">
+								<h4>1:1문의 내역</h4>
+								<div id="custCounselList" style="width: 100%; height: 510px;" class="ag-theme-balham"></div>
+							</div>
+						</form>
+						<!-- //TAB3 CONTENTS AREA -->
+					</li>
+					<!-- //TAB3 : 1:1문의 내역 -->
+
+					<!-- TAB4 : 상품문의 내역 -->
+					<li class="tab" id="tab4">
+						<!-- TAB3 CONTENTS AREA -->
+						<form id="custGoodsQna">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<div class="tabContArea">
+								<h4>상품문의 내역</h4>
+								<div id="custGoodsQnaList" style="width: 100%; height: 510px;" class="ag-theme-balham"></div>
+							</div>
+						</form>
+						<!-- //TAB4 CONTENTS AREA -->
+					</li>
+					<!-- //TAB4 : 상품문의 내역 -->
+
+					<!-- TAB5 : 쿠폰 내역 -->
+					<li class="tab" id="tab5">
+						<!-- TAB5 CONTENTS AREA -->
+						<form id="custCoupon">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<div class="tabContArea">
+								<h4>쿠폰 내역</h4>
+								<div id="custCouponList" style="width: 100%; height: 510px;" class="ag-theme-balham"></div>
+								<div class="panelBtnB" style="padding-top: 10px;">
+								<span class="btnLeft">
+									<button type="button" class="btn btn-danger btn-lg"id="btnCustCouponDelete">쿠폰삭제</button>
+								</span>
+									<span class="btnRight"><button type="button" class="btn btn-info btn-lg" id="btnCustCouponCreate">쿠폰발급</button></span>
+								</div>
+							</div>
+						</form>
+						<!-- //TAB5 CONTENTS AREA -->
+					</li>
+					<!-- //TAB5 : 쿠폰 내역 -->
+
+					<!-- TAB6 : 포인트 내역 -->
+					<li class="tab" id="tab6">
+						<!-- TAB6 CONTENTS AREA -->
+						<form id="custPoint">
+							<div class="tabContArea">
+								<input type="hidden" name="custNo" th:value="${custNo}"/>
+								<h4>포인트 내역</h4>
+								<table class="tableStyle">
+									<colgroup>
+										<col style="width:20%;"/>
+										<col style="width:20%;"/>
+										<col style="width:20%;"/>
+										<col style="width:20%;"/>
+										<col style="width:20%;"/>
+									</colgroup>
+									<tbody>
+									<tr>
+										<th>가용포인트</th>
+										<th>누적 포인트</th>
+										<th>사용포인트</th>
+										<th>적립예정포인트</th>
+										<th>소멸예정포인트(30일)</th>
+									</tr>
+									<tr>
+										<td name="availPntAmt">0 P</td>
+										<td name="accumPntAmt">0 P</td>
+										<td name="usePntAmt">0 P</td>
+										<td name="expectedPntAmt">0 P</td>
+										<td name="expectedExpirePntAmt">0 P</td>
+									</tr>
+									</tbody>
+								</table>
+								<br/>
+								<div id="custPointList" style="width: 100%; height: 420px;" class="ag-theme-balham"></div>
+								<div class="panelBtnB aR" style="padding-top: 10px;">
+									<button type="button" class="btn btn-info btn-lg" id="btnCustPointCreate">포인트부여</button>
+								</div>
+							</div>
+						</form>
+						<!-- //TAB6 CONTENTS AREA -->
+					</li>
+					<!-- //TAB6 : 포인트 내역 -->
+
+					<!-- TAB7 : 상품평 -->
+					<li class="tab" id="tab7">
+						<!-- TAB7 CONTENTS AREA -->
+						<form id="custReview">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<div class="tabContArea">
+								<h4>상품평 내역</h4>
+								<div id="custReviewList" style="width: 100%; height: 510px;" class="ag-theme-balham"></div>
+							</div>
+						</form>
+						<!-- //tab7 CONTENTS AREA -->
+					</li>
+					<!-- //TAB7 : 상품평 내역 -->
+
+					<!-- TAB8 : 등급변경이력 -->
+					<li class="tab" id="tab8">
+						<!-- TAB8 CONTENTS AREA -->
+						<form id="custGrade">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<div class="tabContArea">
+								<h4>등급변경이력</h4>
+								<div id="custGradeList" style="width: 100%; height: 510px;" class="ag-theme-balham"></div>
+							</div>
+						</form>
+						<!-- //tab8 CONTENTS AREA -->
+					</li>
+					<!-- //TAB8 : 등급변경이력 -->
+
+					<!-- TAB9 : 배송지정보 -->
+					<li class="tab" id="tab9">
+						<!-- TAB9 CONTENTS AREA -->
+						<form id="custAddr">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<input type="hidden" name="custDelvAddrSq" value=""/>
+							<input type="hidden" name="recipPhnno" value="">
+							<input type="hidden" name="recipTelno" value="">
+							<div class="tabContArea" style="height: 365px;">
+								<h4>배송지정보</h4>
+								<div id="custAddrList" style="width: 100%; height: 300px;" class="ag-theme-balham"></div>
+							</div>
+
+							<div class="aR" style="margin-bottom: 10px;">
+								<button type="button" class="btn btn-info btn-lg" id="btnCustAddrNew">신규</button>
+								<button type="button" class="btn btn-success btn-lg" id="btnCustAddrSave">저장</button>
+							</div>
+
+							<table class="frmStyle">
+								<colgroup>
+									<col style="width:5%;"/>
+									<col style="width:25%;"/>
+									<col style="width:5%;"/>
+									<col style="width:25%;"/>
+									<col style="width:5%;"/>
+									<col style="width:25%;"/>
+									<col/>
+								</colgroup>
+								<tbody>
+								<tr>
+									<th>배송지명<i class="star"></i></th>
+									<td>
+										<input type="text" class="w200" name="delvAddrNm" maxlength="30" required="required" data-valid-name="배송지명"/>
+										<label><input type="checkbox" name="defaultYn" value="Y"/>기본</label>
+									</td>
+
+									<th>이메일</th>
+									<td>
+										<input type="text" class="w200" name="recipEmail" maxlength="50" data-valid-type="email" data-valid-name="이메일"/>
+									</td>
+
+									<th>삭제여부</th>
+									<td>
+										<label><input type="checkbox" name="delYn" value="Y"/></label>
+									</td>
+								</tr>
+								<tr>
+									<th>수령인<i class="star"></i></th>
+									<td>
+										<input type="text" class="w200" name="recipNm" maxlength="10" required="required" data-valid-name="수령인"/>
+									</td>
+
+									<th>전화번호</th>
+									<td>
+										<input type="text" class="w100" name="recipTelno1" maxlength="4" data-valid-type="numeric"
+											   data-valid-name="전화번호"/> -
+										<input type="text" class="w100" name="recipTelno2" maxlength="4" data-valid-type="numeric"
+											   data-valid-name="전화번호"/> -
+										<input type="text" class="w100" name="recipTelno3" maxlength="4" data-valid-type="numeric"
+											   data-valid-name="전화번호"/>
+									</td>
+
+									<th>휴대전화번호<i class="star"></i></th>
+									<td>
+										<input type="text" class="w100" name="recipPhnno1" maxlength="4" required="required" data-valid-type="numeric"
+											   data-valid-name="휴대전화번호"/> -
+										<input type="text" class="w100" name="recipPhnno2" maxlength="4" required="required" data-valid-type="numeric"
+											   data-valid-name="휴대전화번호"/> -
+										<input type="text" class="w100" name="recipPhnno3" maxlength="4" required="required" data-valid-type="numeric"
+											   data-valid-name="휴대전화번호"/>
+									</td>
+								</tr>
+								<tr>
+									<th>주소<i class="star"></i></th>
+									<td colspan="5">
+										<input type="text" name="recipPostNo" class="w100" maxlength="10" required="required" data-valid-name="주소"/>
+										<button type="button" class="btn btn-info btn-lg" onclick="fnOpenDaumAddr('custAddr');">우편번호찾기</button>
+										<br/>
+										<input type="text" name="recipBaseAddr" class="w300" maxlength="50" required="required" data-valid-name="주소"/>
+										<input type="text" name="recipDtlAddr" class="w300" maxlength="30" required="required" data-valid-name="상세주소"/>
+									</td>
+								</tr>
+								</tbody>
+							</table>
+						</form>
+						<!-- //TAB9 CONTENTS AREA -->
+					</li>
+
+					<!-- TAB10 : 회원접촉이력 -->
+					<li class="tab" id="tab10">
+						<!-- TAB10 CONTENTS AREA -->
+						<form id="custContact">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<div class="tabContArea" style="height: 454px;">
+								<h4>회원접촉이력</h4>
+								<table class="frmStyle">
+									<colgroup>
+										<col style="width:3%;"/>
+										<col style="width:7%;"/>
+										<col style="width:6%;"/>
+										<col style="width:5%;"/>
+										<col style="width:6%;"/>
+										<col style="width:29%;"/>
+										<col/>
+									</colgroup>
+									<tbody>
+									<tr>
+										<th>접촉유형<i class="star"></i></th>
+										<td>
+											<select class="w150" name="contactType" required="required" data-valid-type="select" data-valid-name="접촉유형">
+												<option value="">[선택]</option>
+												<option th:if="${contactTypeList}" th:each="oneData, status : ${contactTypeList}" th:value="${oneData.cd}"
+														th:text="${oneData.cdNm}"></option>
+											</select>
+										</td>
+										<th>접촉방법<i class="star"></i></th>
+										<td>
+											<select class="w150" name="contactMethod" required="required" data-valid-type="select" data-valid-name="접촉방법">
+												<option value="">[선택]</option>
+												<option th:if="${contactMethodList}" th:each="oneData, status : ${contactMethodList}"
+														th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+											</select>
+										</td>
+										<th>내용<i class="star"></i></th>
+										<td>
+											<textarea class="textareaR2 w600" name="contactContents" required="required" data-valid-name="내용"></textarea>
+											<button type="button" class="btn btn-success btn-lg" id="btnSaveContact">저장</button>
+										</td>
+									</tr>
+									</tbody>
+								</table>
+								<br/>
+								<div id="custContactList" style="width: 100%; height: 420px;" class="ag-theme-balham"></div>
+							</div>
+						</form>
+						<!-- //TAB10 CONTENTS AREA -->
+					</li>
+					<!-- //TAB10 : 회원접촉이력 -->
+
+				</ul>
+				<!-- //TABS CONTENTS -->
+			</div>
+			<!-- // TABS SPACE -->
+
+		</div>
+		<!-- //CONTENT -->
+
+	</div>
+</div>
+
+<script th:inline="javascript">
+	/*<![CDATA[*/
+
+	const custNo = [[${custNo}]];													//고객번호
+	const siteList = gagajf.convertToArray([[${siteList}]]);						//사이트목록
+	//const custGbList = gagajf.convertToArray([[${custGbList}]]);					//회원구분
+	const custGradeList = gagajf.convertToArray([[${custGradeList}]]);				//회원등급
+	//const managedRsnList = gagajf.convertToArray([[${managedRsnList}]]);			//관리대상
+	const mallGbList = gagajf.convertToArray([[${mallGbList}]]);					//몰구분
+	const orderStatList = gagajf.convertToArray([[${orderStatList}]]);				//주문상태
+	const orderDtlStatList = gagajf.convertToArray([[${orderDtlStatList}]]);		//주문상세상태
+	const cpnType = gagajf.convertToArray([[${cpnType}]]);							//쿠폰유형
+	//const dcWayList = gagajf.convertToArray([[${dcWayList}]]);					//쿠폰할인방식
+	const pubReasonList = gagajf.convertToArray([[${pubReasonList}]]);				//쿠폰발행사유
+	const pntOccurGbList = gagajf.convertToArray([[${pntOccurGbList}]]);			//포인트반영구분
+	const pntUploadStatList = gagajf.convertToArray([[${pntUploadStatList}]]);		//포인트반영상태
+	const counselClsfList = gagajf.convertToArray([[${counselClsfList}]]);			//상담분류
+	const contactTypeList = gagajf.convertToArray([[${contactTypeList}]]);			//회원접촉유형
+	const contactMethodList = gagajf.convertToArray([[${contactMethodList}]]);		//회원접촉방법
+	const genderGbList = gagajf.convertToArray([[${genderGbList}]]);				// 성별
+
+	//구매내역 그리드
+	const columnOrderDefs = [
+		{
+			headerName: "주문번호", field: "ordNo", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "주문상세번호", field: "ordDtlNo", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "몰구분", field: "mallGb", width: 100, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(mallGbList, params.value);
+			}
+		},
+		{
+			headerName: "결제일시", field: "payDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{
+			headerName: "배송완료일시", field: "delvEddt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "주문자전화번호", field: "orderTelno", width: 120, cellClass: 'text-center'},
+		{headerName: "주문자휴대폰", field: "orderPhnno", width: 130, cellClass: 'text-center'},
+		{
+			headerName: "주문상세상태", field: "ordDtlStat", width: 100, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(orderDtlStatList, params.value);
+			}
+		},
+		{headerName: "수령인", field: "recipNm", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "상품코드", field: "goodsCd", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "사이즈", field: "sizeCd", width: 100, cellClass: 'text-center'},
+		{headerName: "상품명", field: "goodsNm", width: 250, cellClass: 'text-left'},
+		{headerName: "주문수량", field: "ordQty", width: 100, cellClass: 'text-center'},
+		{headerName: "판매상품가격", field: "currPrice", width: 100, cellClass: 'text-center'},
+		{headerName: "총 판매 상품가격", field: "totCurrPrice", width: 150, cellClass: 'text-center'}
+	];
+
+	// 1:1문의 내역 그리드
+	const columnCounselDefs = [
+		{
+			headerName: "상담분류", field: "counselClsf", width: 100, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(counselClsfList, params.value);
+			}
+		},
+		{headerName: "상담상세분류", field: "counselDclsf", width: 200, cellClass: 'text-center'},
+		{headerName: "주문번호", field: "relOrdNo", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "질문제목", field: "questTitle", width: 300, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{
+			headerName: "등록일시", field: "questDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{
+			headerName: "답변일시", field: "ansTransDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "확인ID", field: "ansId", width: 100, cellClass: 'text-center'},
+		{headerName: "확인자", field: "userNm", width: 100, cellClass: 'text-center'}
+	];
+
+	// 상품문의 내역 그리드
+	const columnGoodsQnaDefs = [
+		{headerName: "상품코드", field: "relGoodsCd", width: 200, cellClass: 'text-center'},
+		{
+			headerName: "질문제목", field: "questTitle", width: 300, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{
+			headerName: "등록일시", field: "questDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{
+			headerName: "답변일시", field: "ansTransDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "확인ID", field: "ansId", width: 100, cellClass: 'text-center'},
+		{headerName: "확인자", field: "userNm", width: 100, cellClass: 'text-center'}
+	];
+
+	//쿠폰내역 그리드
+	const columnCouponDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', pinned: 'left', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "회원쿠폰SQ", field: "custCpnSq", width: 100, cellClass: 'text-center', hide: true},
+		{headerName: "쿠폰ID", field: "cpnId", width: 100, cellClass: 'text-center'},
+		{headerName: "쿠폰명", field: "cpnNm", width: 300, cellClass: 'text-center'},
+		{
+			headerName: "유효기간 시작일시", field: "availStdt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{
+			headerName: "유효기간 종료일시", field: "availEddt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "주문번호", field: "ordNo", width: 130, cellClass: 'text-center'},
+		{
+			headerName: "사용일시", field: "usedDt", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{
+			headerName: "쿠폰발행 사유", field: "pubReason", width: 200, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(pubReasonList, params.value);
+			}
+		},
+		{headerName: "쿠폰발행 상세사유", field: "pubReasonDtl", width: 300, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regId", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		}
+	];
+
+	//포인트내역 그리드
+	const columnPointDefs = [
+		{
+			headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{
+			headerName: "반영일시", field: "pntUploadDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "주문번호", field: "ordNo", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "반영상태", field: "pntUploadStat", width: 100, cellClass: 'text-center',
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(pntUploadStatList, params.value); }
+		},
+		{
+			headerName: "포인트", field: "pntAmt", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
+			}
+		},
+		{
+			headerName: "포인트사유", field: "occurGb", width: 300, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(pntOccurGbList, params.value);
+			}
+		},
+		{headerName: "포인트상세사유", field: "occurDtlDesc", width: 300, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regId", width: 100, cellClass: 'text-center'}
+	];
+
+	//상품평 그리드
+	const columnReviewDefs = [
+		{headerName: "상품코드", field: "goodsCd", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "제목", field: "reviewTitle", width: 300, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "만족도", field: "score", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "작성일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{
+			headerName: "지급일시", field: "confirmDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "지급ID", field: "confirmId", width: 130, cellClass: 'text-center'},
+		{headerName: "게시여부", field: "dispYn", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "지급예정포인트", field: "giveDuePnt", width: 120, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
+			}
+		},
+		{
+			headerName: "포인트지급상태", field: "pntGiveStat", width: 120, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(pntUploadStatList, params.value);
+			}
+		}
+	];
+
+	//등급변경 그리드
+	const columnGradeDefs = [
+		{headerName: "적용연월일", field: "applyYmd", width: 150, cellClass: 'text-center'},
+		{headerName: "고객ID", field: "custId", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "이전회원등급", field: "gradeBcd", width: 100, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(custGradeList, params.value);
+			}
+		},
+		{
+			headerName: "변경회원등급", field: "gradeAcd", width: 100, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(custGradeList, params.value);
+			}
+		},
+		{
+			headerName: "3개월간 총 주문건수", field: "ordCnt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
+			}
+		},
+		{
+			headerName: "3개월간 총 결제금액", field: "realOrdAmt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
+			}
+		}
+	];
+
+	//주소정보 그리드
+	const columnAddrDefs = [
+		{
+			headerName: "배송지명", field: "delvAddrNm", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "수령자", field: "recipNm", width: 100, cellClass: 'text-center'},
+		{headerName: "전화번호", field: "recipTelno", width: 130, cellClass: 'text-center'},
+		{headerName: "휴대전화번호", field: "recipPhnno", width: 130, cellClass: 'text-center'},
+		{headerName: "이메일", field: "recipEmail", width: 150, cellClass: 'text-center'},
+		{headerName: "우편번호", field: "recipPostNo", width: 100, cellClass: 'text-center'},
+		{headerName: "기본주소", field: "recipBaseAddr", width: 300, cellClass: 'text-left'},
+		{headerName: "상세주소", field: "recipDtlAddr", width: 150, cellClass: 'text-left'},
+		{
+			headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "삭제", field: "delYn", width: 50, cellClass: 'text-center'},
+		{headerName: "수정자", field: "updId", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "수정일시", field: "updDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "기본배송지", field: "defaultYn", width: 90, cellClass: 'text-center'}
+	];
+
+	//회원접촉이력 그리드
+	const columnContactDefs = [
+		{
+			headerName: "접촉유형", field: "contactType", width: 150, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(contactTypeList, params.value);
+			}
+		},
+		{
+			headerName: "접촉방법", field: "contactMethod", width: 120, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(contactMethodList, params.value);
+			}
+		},
+		{headerName: "내용", field: "contactContents", width: 1000, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regId", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "등록일", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		}
+	];
+
+	let gridOrderOptions = gagaAgGrid.getGridOptions(columnOrderDefs);		//구매내역 그리드
+	let gridCounselOptions = gagaAgGrid.getGridOptions(columnCounselDefs);	//1:1문의내역 그리드
+	let gridGoodsQnaOptions = gagaAgGrid.getGridOptions(columnGoodsQnaDefs);//상품문의내역 그리드
+	let gridCouponOptions = gagaAgGrid.getGridOptions(columnCouponDefs);	//쿠폰내역 그리드
+	let gridPointOptions = gagaAgGrid.getGridOptions(columnPointDefs);		//포인트내역 그리드
+	let gridReviewOptions = gagaAgGrid.getGridOptions(columnReviewDefs);	//상품평 그리드
+	let gridGradeOptions = gagaAgGrid.getGridOptions(columnGradeDefs);		//등급변경 그리드
+	let gridAddrOptions = gagaAgGrid.getGridOptions(columnAddrDefs);		//주소정보 그리드
+	let gridContactOptions = gagaAgGrid.getGridOptions(columnContactDefs);	//회원접촉이력 그리드
+
+	gridCouponOptions.rowSelection = 'multiple';
+
+	// 비밀번호 초기화 버튼
+	$('#btnCustPasswordReset').on('click', function () {
+		//이메일
+		if (!fnCheckValidationEmail('#custInfo'))
+			return false;
+		let jsonData = JSON.stringify($('#custInfo').serializeObject());
+		mcxDialog.confirm("초기화 하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				gagajf.ajaxJsonSubmit('/customer/reset/password/save', jsonData, fnSearchCustInfo);
+			}
+		});
+
+	});
+
+	// LMS발송 버튼
+	$('#btnCustSendLms').on('click', function () {
+		let param = {};
+		param.elementCellPhnno = '#custInfo input[name=cellPhnno]';
+		param.elementCustNo = '#custInfo input[name=custNo]';
+		cfnOpenLmsPopup(param);
+	});
+
+	// 인증버튼
+	$('#btnCustCrtfd').on('click', function () {
+		$('#btnSendCustCrtfdNo').show();
+		$('#btnCustCrtfdNo').show();
+		$('#custInfo input[name=crtfdNo]').show();
+		$('#expln').hide();
+		$('#explnPhone').show();
+	});
+
+	// 인증번호 전송
+	$('#btnSendCustCrtfdNo').on('click', function () {
+		//휴대폰번호
+		if (!fnCheckValidationPhnno('#custInfo'))
+			return false;
+
+		mcxDialog.confirm("인증번호를 전송 하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				let jsonData = JSON.stringify($('#custInfo').serializeObject());
+				gagajf.ajaxJsonSubmit('/customer/certno/send', jsonData, function () {
+				});
+			}
+		});
+	});
+
+	// 인증확인버튼
+	$('#btnCustCrtfdNo').on('click', function () {
+		let jsonData = JSON.stringify($('#custInfo').serializeObject());
+		gagajf.ajaxJsonSubmit('/customer/certno/confirm', jsonData, fnCertificationResult);
+	});
+
+	// 이메일발송 버튼
+	$('#btnCustSendEmail').on('click', function () {
+		let param = {};
+		param.elementRecipEmail = '#custInfo input[name=email]';
+		param.elementCustNm = '#custInfo input[name=custNm]';
+		param.elementCustNo = '#custInfo input[name=custNo]';
+		cfnOpenEmailPopup(param);
+	});
+
+	// 이메일 도메인 선택 이벤트
+	$('#custInfo select[name=emailDomain]').on('change', function () {
+
+		let domain = $(this).val();
+		let $email2 = $('#custInfo input[name=email2]');
+		if (domain === '99') {  //기타(직접입력)
+			$email2.val('');
+		} else if (domain !== '99' && !gagajf.isNull(domain)) {
+			$email2.val(domain);
+		}
+
+	});
+
+	// 저장 버튼
+	$('#btnCustInfoSave').on('click', function () {
+
+		//휴대폰번호
+		if (!fnCheckValidationPhnno('#custInfo'))
+			return false;
+		//이메일
+		if (!fnCheckValidationEmail('#custInfo'))
+			return false;
+
+		// 관리대상 변경 여부 및 관리대상 지정 사유
+		let managedRsn = $('#custInfo select[name=managedRsn]').val();
+		let	orgManagedRsn = $('#custInfo input[name=orgManagedRsn]').val();
+		let	managedDtlRsn = $('#custInfo input[name=managedDtlRsn]').val();
+
+		if (managedRsn !== orgManagedRsn && !gagajf.isNull(managedRsn)) { // 관리대상 값 변경시 체크
+			$('#custInfo input[name=changeManagedYn]').val('Y');
+		} else {
+			$('#custInfo input[name=changeManagedYn]').val('N');
+		}
+
+		if (!gagajf.isNull(managedRsn) && gagajf.isNull(managedDtlRsn)) {
+			mcxDialog.alert("관리대상 지정 사유를 입력해주세요");
+			return;
+		}
+
+		// 등급 변경 여부 판단
+		let custGrade = $('#custInfo select[name=custGrade]').val();
+		let orgCustGrade = $('#custInfo input[name=orgCustGrade]').val();
+		let $changeGradeYn = $('#custInfo input[name=changeGradeYn]');
+
+		if (custGrade !== orgCustGrade) { // 등급 변경시 값 체크
+			$changeGradeYn.val('Y');
+		} else {
+			$changeGradeYn.val('Y');
+		}
+		mcxDialog.confirm("기본정보를 수정 하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				let jsonData = JSON.stringify($('#custInfo').serializeObject());
+				//console.log(jsonData);
+				gagajf.ajaxJsonSubmit('/customer/info/update', jsonData, fnSearchCustInfo);
+			}
+		});
+	});
+
+	// 쿠폰삭제 버튼
+	$('#btnCustCouponDelete').on('click', function () {
+		let removedData = gagaAgGrid.removeRowData(gridCouponOptions);
+
+		if (removedData.length < 1) {
+			mcxDialog.alert("선택된 데이터가 없습니다.");
+			return;
+		}
+		mcxDialog.confirm("삭제 하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				let updatedData = [];
+
+				$.each(removedData, function (idx, item) {
+					let param = {};
+					param.custCpnSq = item.custCpnSq;
+					param.custNo = item.custNo;
+					updatedData.push(param);
+				});
+
+				let jsonData = JSON.stringify(updatedData);
+				gagajf.ajaxJsonSubmit('/marketing/coupon/cust/delete', jsonData, fnSearchCoupon);
+			}
+		});
+	});
+
+	// 포인트부여 버튼
+	$('#btnCustPointCreate').on('click', function () {
+		cfnGrantPointPopup();
+	});
+
+	// 쿠폰발급 버튼
+	$('#btnCustCouponCreate').on('click', function () {
+		cfnCpnPubForCustPopup();
+	});
+
+	// 배송지정보 신규
+	$('#btnCustAddrNew').on('click', function () {
+		$('#custAddr')[0].reset();
+		$('#custAddr input[name=custDelvAddrSq]').val('');
+		$('#custAddr input[name=recipPhnno]').val('');
+		$('#custAddr input[name=recipTelno]').val('');
+	});
+
+	// 배송지정보 저장
+	$('#btnCustAddrSave').on('click', function () {
+
+		if (!gagajf.validation('#custAddr'))
+			return false;
+
+		// 전화번호
+		let recipTelno1 = $('#custAddr input[name=recipTelno1]').val();
+		let recipTelno2 = $('#custAddr input[name=recipTelno2]').val();
+		let recipTelno3 = $('#custAddr input[name=recipTelno3]').val();
+
+		$('#custAddr input[name=recipTelno]').val(recipTelno1 + '-' + recipTelno2 + '-' + recipTelno3);
+
+
+		// 핸드폰번호 필수값 validation 함수에서 null 체크
+		let recipPhnno1 = $('#custAddr input[name=recipPhnno1]').val();
+		let recipPhnno2 = $('#custAddr input[name=recipPhnno2]').val();
+		let recipPhnno3 = $('#custAddr input[name=recipPhnno3]').val();
+		$('#custAddr input[name=recipPhnno]').val(recipPhnno1 + '-' + recipPhnno2 + '-' + recipPhnno3);
+
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				gagajf.removeCommaAtNumberFormattedInput('#custAddr');
+				let jsonData = JSON.stringify($('#custAddr').serializeObject());
+				gagajf.ajaxJsonSubmit('/customer/delivery/addr/save', jsonData, fnSearchDelivery);
+			}
+		});
+
+	});
+
+	// 회원접촉이력 저장
+	$('#btnSaveContact').on('click', function () {
+		if (!gagajf.validation('#custContact')) {
+			return;
+		}
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				var jsonData = JSON.stringify($('#custContact').serializeObject());
+				gagajf.ajaxJsonSubmit('/customer/contact/create', jsonData, fnSearchContact);
+			}
+		});
+	});
+
+	// 주문내역 셀 클릭 이벤트
+	gridOrderOptions.onCellClicked = function (event) {
+		if (event.colDef.field === 'goodsCd') {
+			let goodsCd = event.data.goodsCd;
+			cfnOpenGoodsDetailPopup('U', goodsCd);
+		}
+		if (event.colDef.field === 'ordNo') {
+			let ordNo = event.data.ordNo;
+			cfnOpenOrderDetailPopup(ordNo);
+		}
+	};
+
+	// 1:1문의 내역 셀 클릭 이벤트
+	gridCounselOptions.onCellClicked = function (event) {
+		if (event.colDef.field === 'questTitle') {
+			let counselSq = event.data.counselSq;
+			cfnOpenOneToOneQnaDetailPopup(counselSq);
+		}
+	};
+
+	// 상품문의 내역 셀 클릭 이벤트
+	gridGoodsQnaOptions.onCellClicked = function (event) {
+		if (event.colDef.field === 'questTitle') {
+			let counselSq = event.data.counselSq;
+			cfnOpenGoodsQnaDetailPopup(counselSq);
+		}
+	};
+
+	// 상품평내역 셀 클릭 이벤트
+	gridReviewOptions.onCellClicked = function (event) {
+		if (event.colDef.field === 'reviewTitle') {
+			let reviewSq = event.data.reviewSq;
+			cfnOpenReviewDetailPopup(reviewSq);
+		}
+	};
+
+	// 주소지 셀 클릭 이벤트
+	gridAddrOptions.onCellClicked = function (event) {
+		if (event.colDef.field !== 'delvAddrNm')
+			return;
+
+		if (!gagajf.isNull(event.data)) {
+			$('#custAddr input[name=custDelvAddrSq]').val(event.data.custDelvAddrSq);
+			$('#custAddr input[name=delvAddrNm]').val(event.data.delvAddrNm);
+			$('#custAddr input[name=recipEmail]').val(event.data.recipEmail);
+			$('#custAddr input[name=recipNm]').val(event.data.recipNm);
+
+			if (!gagajf.isNull(event.data.recipPhnno)) {
+				let recipPhnno = event.data.recipPhnno.split("-");
+				$('#custAddr input[name=recipPhnno1]').val(recipPhnno[0]);
+				$('#custAddr input[name=recipPhnno2]').val(recipPhnno[1]);
+				$('#custAddr input[name=recipPhnno3]').val(recipPhnno[2]);
+			}
+
+			if (!gagajf.isNull(event.data.recipTelno)) {
+				let recipTelno = event.data.recipTelno.split("-");
+				$('#custAddr input[name=recipTelno1]').val(recipTelno[0]);
+				$('#custAddr input[name=recipTelno2]').val(recipTelno[1]);
+				$('#custAddr input[name=recipTelno3]').val(recipTelno[2]);
+			}
+
+			$('#custAddr input[name=recipPostNo]').val(event.data.recipPostNo);
+			$('#custAddr input[name=recipBaseAddr]').val(event.data.recipBaseAddr);
+			$('#custAddr input[name=recipDtlAddr]').val(event.data.recipDtlAddr);
+
+			let defaultYn = event.data.defaultYn === 'Y' ? true : false;
+			let delYn = event.data.delYn === 'Y' ? true : false;
+
+			$('#custAddr input:checkbox[name=defaultYn]').prop('checked', defaultYn);
+			$('#custAddr input:checkbox[name=delYn]').prop('checked', delYn);
+
+		}
+	};
+
+	// 회원정보 조회
+	var fnSearchCustInfo = function () {
+		$.get('/customer/info/' + custNo
+			, function (data) {
+				if (!gagajf.isNull(data)) {
+					$('span[name=custNm]').text(data.maskingCustNm);
+					$('span[name=custId]').text(data.maskingCustId);
+					$('span[name=siteNm]').text(gagaAgGrid.lookupValue(siteList, data.siteCd));
+					$('span[name=custNo]').text(data.custNo);
+					$('span[name=custGradeNm]').text(data.custGradeNm);
+					$('#custInfo select[name=custGrade]').val(data.custGrade);
+					$('#custInfo select[name=custGb]').val(data.custGb);
+					$('#custInfo select[name=managedRsn]').val(data.managedRsn);
+					$('#custInfo input[name=orgManagedRsn]').val(data.managedRsn);
+					$('#custInfo input[name=managedDtlRsn]').val(data.managedDtlRsn);
+					$('#custInfo td[name=managedDt]').text(gagaAgGrid.toDateTimeFormat(data.managedDt));
+					$('#custInfo td[name=joinDt]').text(gagaAgGrid.toDateTimeFormat(data.joinDt));
+
+					if (gagajf.isNull(data.loginDt)) {
+						$('#custInfo td[name=loginDt]').text("로그인 이력이 없습니다.");
+					} else {
+						$('#custInfo td[name=loginDt]').text(gagaAgGrid.toDateTimeFormat(data.loginDt));
+					}
+					$('#custInfo td[name=foreignerYn]').text(data.foreignerYn == 'Y' ? '외국인' : '내국인');
+					let secedeRsnYn = gagajf.isNull(data.secedeRsn) ? '아니요' : '예';
+					if (data.custStat == '10') {
+						secedeRsnYn = secedeRsnYn + '<button type="button" class="btn btn-danger btn-lg" style="margin-left: 5px;" onClick="fnCustomerSecede();">회원탈퇴</button>';
+					}
+					$('#custInfo td[name=secedeRsnYn]').html(secedeRsnYn);
+					let snsType = '';
+					if (!gagajf.isNull(data.nvJoinId)) {
+						snsType = 'NAVER'
+					}
+					if (!gagajf.isNull(data.kkJoinId)) {
+						if (!gagajf.isNull(snsType)) {
+							snsType += ','
+						}
+						snsType += 'KAKAO';
+					}
+					if (!gagajf.isNull(data.ysJoinId)) {
+						if (!gagajf.isNull(snsType)) {
+							snsType += ','
+						}
+						snsType += 'YES24';
+					}
+					$('#custInfo td[name=snsType]').text(snsType);
+					$('#custInfo input[name=homePostNo]').val(data.homePostNo);
+					$('#custInfo input[name=homeBaseAddr]').val(data.homeBaseAddr);
+					$('#custInfo input[name=homeDtlAddr]').val(data.homeDtlAddr);
+					$('#custInfo input[name=cellPhnno]').val(data.cellPhnno);
+					$('#custInfo input[name=custNm]').val(data.custNm);
+					$('#custInfo input[name=email]').val(data.email);
+					$('#custInfo input[name=orgCustGrade]').val(data.custGrade);
+					$('#custInfo td[name=sexGb]').text(gagaAgGrid.lookupValue(genderGbList, data.sexGb));
+
+					const $managedRsnNm = $('span[name=managedRsnNm]');
+					const $managedRsnDp = $('span[name=managedRsnDp]');
+
+					$managedRsnNm.text('');
+					$managedRsnNm.hide();
+					$managedRsnDp.text('');
+					$managedRsnDp.hide();
+					if (!gagajf.isNull(data.managedRsnNm)) {
+						let html = '<i class="fa fa-info-circle"></i>';
+						$managedRsnNm.html(html);
+						$managedRsnNm.show();
+						$managedRsnDp.html(html);
+						$managedRsnDp.show();
+					}
+
+					if (!gagajf.isNull(data.birthYmd)) {
+						$('#custInfo input[name=birthYmd]').val(data.birthYmd.toDate('YYYYMMDD').format("YYYY-MM-DD"));
+					}
+
+					if (!gagajf.isNull(data.maskingCellPhnno)) {
+						let cellPhnno = data.maskingCellPhnno.split("-");
+						$('#custInfo select[name=cellPhnno1]').val(cellPhnno[0]);
+						$('#custInfo input[name=cellPhnno2]').val(cellPhnno[1]);
+						$('#custInfo input[name=cellPhnno3]').val(cellPhnno[2]);
+					}
+
+					if (!gagajf.isNull(data.maskingEmail)) {
+						let email = data.maskingEmail.split("@");
+						$('#custInfo input[name=email1]').val(email[0]);
+						$('#custInfo input[name=email2]').val(email[1]);
+					}
+					const $emailAgreeYn = $('#custInfo input:radio[name=emailAgreeYn]');
+					let emailAgreeYn = data.emailAgreeYn === 'Y' ? 0 : 1;
+					$emailAgreeYn.eq(emailAgreeYn).prop('checked', true);
+					$emailAgreeYn.eq(emailAgreeYn).parent().addClass('checked');
+
+					const $smsAgreeYn = $('#custInfo input:radio[name=smsAgreeYn]');
+					let smsAgreeYn = data.smsAgreeYn === 'Y' ? 0 : 1;
+					$smsAgreeYn.eq(smsAgreeYn).prop('checked', true);
+					$smsAgreeYn.eq(smsAgreeYn).parent().addClass('checked');
+
+				}
+			});
+		const $crtfdNo = $('#custInfo input[name=crtfdNo]');
+		const $message = $('#custInfo span[name=message]');
+
+		$crtfdNo.val('');
+		$crtfdNo.hide();
+		$message.text('');
+		$message.hide();
+		$('#custInfo input[name=crtfdNoYn]').val('N');
+		$('#btnCustCrtfdNo').hide();
+		$('#btnSendCustCrtfdNo').hide();
+		$('#explnPhone').hide();
+	};
+
+	// 구매내역 조회
+	var fnSearchOrder = function () {
+		const actionUrl = "/customer/order/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridOrderOptions);
+	};
+
+	//	1:1문의 내역 조회
+	var fnSearchCounsel = function () {
+		const actionUrl = "/customer/counsel/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridCounselOptions);
+	};
+
+	//	상품문의 내역 조회
+	var fnSearchGoodsQna = function () {
+		const actionUrl = "/customer/goodsQna/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridGoodsQnaOptions);
+	};
+
+	//	쿠폰내역 조회
+	var fnSearchCoupon = function () {
+		const actionUrl = "/customer/coupon/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridCouponOptions);
+	};
+
+	// 	포인트내역 조회
+	var fnSearchPoint = function () {
+		$.get('/customer/point/' + custNo
+			, function (data) {
+				if (!gagajf.isNull(data)) {
+					$('#custPoint td[name=availPntAmt]').text(data.availPntAmt.addComma() + ' P');
+					$('#custPoint td[name=accumPntAmt]').text(data.accumPntAmt.addComma() + ' P');
+					$('#custPoint td[name=usePntAmt]').text(data.usePntAmt.addComma() + ' P');
+					$('#custPoint td[name=expectedPntAmt]').text(data.expectedPntAmt.addComma() + ' P');
+					$('#custPoint td[name=expectedExpirePntAmt]').text(data.expirePntAmt.addComma() + ' P');
+				}
+			});
+		const actionUrl = "/customer/point/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridPointOptions);
+	};
+
+	// 상품평내역 조회
+	var fnSearchReview = function () {
+		const actionUrl = "/customer/review/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridReviewOptions);
+	};
+
+	// 회원등급변경이력 조회
+	var fnSearchChangeGrade = function () {
+		const actionUrl = "/customer/change/grade/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridGradeOptions);
+	};
+
+	// 주소정보 조회
+	var fnSearchDelivery = function () {
+		const actionUrl = "/customer/delivery/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridAddrOptions);
+		$('#btnCustAddrNew').trigger('click');
+	};
+
+	// 회원접촉이력 조회
+	var fnSearchContact = function () {
+		const actionUrl = "/customer/contact/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridContactOptions);
+	};
+
+
+	/**
+	 * DAUM을 이용한 우편번호 팝업 레이어
+	 */
+	var fnOpenDaumAddr = function(id) {
+		let daumZip = new daum.Postcode({
+			oncomplete: function(data) {
+				// 우편번호와 주소 정보를 해당 필드에 넣는다.
+				if (id == 'custInfo') {
+					let formId = '#' + id;
+					$(formId + ' input[name=homePostNo]').val(data.zonecode);
+					$(formId + ' input[name=homeBaseAddr]').val(cfnGetDaumRoadAddr(data));
+					$(formId + ' input[name=homeDtlAddr]').focus();
+				}
+
+				if (id == 'custAddr') {
+					let formId = '#' + id;
+					$(formId + ' input[name=recipPostNo]').val(data.zonecode);
+					$(formId + ' input[name=recipBaseAddr]').val(cfnGetDaumRoadAddr(data));
+				}
+
+				cfnCloseDaumAddr();
+			},
+			width: '100%'
+		});
+
+		cfnOpenDaumAddr(daumZip);
+	}
+
+	// 휴대전화 유효성체크
+	var fnCheckValidationPhnno = function (formId) {
+		let result = true;
+		let cellPhnno1 = $(formId + ' select[name=cellPhnno1]').val();
+		let cellPhnno2 = $(formId + ' input[name=cellPhnno2]').val();
+		let cellPhnno3 = $(formId + ' input[name=cellPhnno3]').val();
+		let cellPhnno  = cellPhnno1 + '-' + cellPhnno2 + '-' + cellPhnno3;
+		$(formId + ' input[name=cellPhnno]').val(cellPhnno);
+
+		// 휴대전화번호
+		if (!gagajf.testRegexp($(formId + ' input[name=cellPhnno]'), /^(01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4})$/)) {
+			result = false;
+		}
+
+		return result;
+	};
+
+	// 이메일 체크
+	var fnCheckValidationEmail = function (formId) {
+		let result = true;
+
+		let email1 = $(formId + ' input[name=email1]').val();
+		let email2 = $(formId + ' input[name=email2]').val();
+
+		const $email = $(formId + ' input[name=email]');
+		$email.val(email1 + '@' + email2);
+
+		if (!gagajf.testRegexp($email, /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/)) {
+			result = false;
+		}
+
+		return result;
+	};
+
+	var fnCertificationResult = function (data) {
+		const $message = $('#custInfo span[name=message]');
+
+		if (data.crtfdNoYn === 'Y') {
+			mcxDialog.alert("인증이 완료되었습니다.");
+			$message.text('');
+			$message.hide();
+		} else {
+			$message.text('인증번호가 일치하지 않습니다.\n확인 후 다시 입력해 주세요.');
+			$message.show();
+		}
+
+		$('#custInfo input[name=crtfdNoYn]').val(data.crtfdNoYn);
+	};
+
+	var fnCustomerSecede = function () {
+
+		if (gagajf.isNull(custNo)) {
+			mcxDialog.alert("탈퇴시킬 회원번호가 없습니다.");
+			return;
+		}
+
+		const actionUrl = "/customer/info/secede/form";
+		let paramsStr = "?custNo=" + custNo;
+		paramsStr += "&callBackFn=" + 'fnCustomerNotUseAfter';
+
+		cfnOpenModalPopup(actionUrl + paramsStr, 'popupCustSecede');
+	};
+
+	var fnCustomerNotUseAfter = function () {
+
+		if (!gagajf.isNull(fnSearch) && typeof fnSearch == "function") {
+			fnSearch();
+		}
+
+		uifnPopupClose('popupCustomerDetail');
+
+	};
+
+	$('#btnLogin').on('click', function () {
+		let custId = $('span[name=custId]').text();
+		const actionUrl = _frontUrl + '/customer/front/login?custId=' + custId;
+		let popupWidth = window.screen.width;
+		let popupHeight = window.screen.height;
+		window.open(actionUrl);
+	})
+
+	$(document).ready(function () {
+		// 생년월일 달력 설정
+		const $birthYmd = $('#custInfo input[name=birthYmd]');
+		let currentYear = new Date().format('YYYY');
+		$birthYmd.datepicker("destroy");
+		$birthYmd.datepicker({
+			changeMonth: true,
+			changeYear: true,
+			yearRange: (currentYear - 100) + ' : ' + (currentYear - 14),
+			defaultDate: $birthYmd.val()
+		});
+
+		//회원정보 조회
+		fnSearchCustInfo();
+
+		gagaAgGrid.createGrid('custOrderList', gridOrderOptions);		// 주문내역
+
+		gagaAgGrid.createGrid('custCounselList', gridCounselOptions);	// 1:1문의 내역
+
+		gagaAgGrid.createGrid('custGoodsQnaList', gridGoodsQnaOptions);	// 상품문의 내역
+
+		gagaAgGrid.createGrid('custCouponList', gridCouponOptions);		// 쿠폰내역
+
+		gagaAgGrid.createGrid('custPointList', gridPointOptions);		// 포인트내역 그리드
+
+		gagaAgGrid.createGrid('custReviewList', gridReviewOptions);		// 상품평 그리드
+
+		gagaAgGrid.createGrid('custGradeList', gridGradeOptions);		// 등급변경 그리드
+
+		gagaAgGrid.createGrid('custAddrList', gridAddrOptions);			// 주소정보 그리드
+
+		gagaAgGrid.createGrid('custContactList', gridContactOptions);	// 회원접촉이력 그리드
+	});
+
+
+	/*]]>*/
+</script>
+
+</html>

+ 5 - 6
src/main/webapp/WEB-INF/views/customer/CustomerDormantListForm.html

@@ -44,7 +44,6 @@
 					<td class="dashR">
 						<select name="searchGb">
 							<option value="">선택</option>
-							<option value="custNo">회원번호 </option>
 							<option value="custNm">회원명 </option>
 							<option value="email">이메일</option>
 							<option value="custId">아이디</option>
@@ -99,9 +98,10 @@
 			headerName: "사이트", field:'siteCd', width:100, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.lookupValue(siteList, params.data.siteCd); }
 		},
-		{headerName: "회원ID", field:'custId', width:120, cellClass: 'text-center'},
-		{headerName: "회원명", field:'custNm', width:100, cellClass: 'text-center'},
-		{headerName: "핸드폰", field:'cellPhnno', width:140, cellClass: 'text-center'},
+		{headerName: "회원ID", field:'maskingCustId', width:120, cellClass: 'text-left'},
+		{headerName: "회원명", field:'maskingCustNm', width:100, cellClass: 'text-left'},
+		{headerName: "핸드폰", field:'maskingCellPhnno', width:140, cellClass: 'text-center'},
+		{headerName: "이메일", field:'maskingEmail', width:220, cellClass: 'text-left'},
 		{
 			headerName: "생년월일", field:'birthYmd', width:90, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.toDateFormat(params.data.birthYmd); }
@@ -109,8 +109,7 @@
 		{
 			headerName: "휴면일자", field:'dormantDt', width:120, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.toDateFormat(params.data.dormantDt); }
-		},
-		{headerName: "이메일", field:'email', width:220, cellClass: 'text-center'}
+		}
 	];
 
 	// Get GridOptions

+ 7 - 8
src/main/webapp/WEB-INF/views/customer/CustomerSecedeListForm.html

@@ -44,7 +44,6 @@
 					<td class="dashR">
 						<select name="searchGb">
 							<option value="">선택</option>
-							<option value="custNo">회원번호 </option>
 							<option value="custNm">회원명 </option>
 							<option value="email">이메일</option>
 							<option value="custId">아이디</option>
@@ -62,9 +61,9 @@
 				<tr>
 					<th class="dashR">탈퇴사유</th>
 					<td class="dashR">
-						<select name="secedeGb" class="w200">
+						<select name="secedeRsn" class="w200">
 							<option value="">전체</option>
-							<option th:if="${secedeGbList}" th:each="oneData, status : ${secedeGbList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+							<option th:if="${secedeRsnList}" th:each="oneData, status : ${secedeRsnList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
 						</select>
 					</td>
 					<th class="dashR">휴대폰번호(숫자만)</th>
@@ -108,9 +107,10 @@
 			headerName: "사이트", field:'siteCd', width:100, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.lookupValue(siteList, params.data.siteCd); }
 		},
-		{headerName: "회원ID", field:'custId', width:120, cellClass: 'text-center'},
-		{headerName: "회원명", field:'custNm', width:100, cellClass: 'text-center'},
-		{headerName: "핸드폰", field:'cellPhnno', width:140, cellClass: 'text-center'},
+		{headerName: "회원ID", field:'maskingCustId', width:120, cellClass: 'text-left'},
+		{headerName: "회원명", field:'maskingCustNm', width:100, cellClass: 'text-left'},
+		{headerName: "핸드폰", field:'maskingCellPhnno', width:140, cellClass: 'text-center'},
+		{headerName: "이메일", field:'maskingEmail', width:220, cellClass: 'text-left'},
 		{
 			headerName: "생년월일", field:'birthYmd', width:90, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.toDateFormat(params.data.birthYmd); }
@@ -118,8 +118,7 @@
 		{
 			headerName: "탈퇴일자", field:'secedeDt', width:120, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.toDateFormat(params.data.secedeDt); }
-		},
-		{headerName: "이메일", field:'email', width:220, cellClass: 'text-center'}
+		}
 	];
 
 	// Get GridOptions

+ 81 - 0
src/main/webapp/WEB-INF/views/display/CategoryGoodsForm.html

@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CategoryGoodsForm.html
+ * @desc    : 카테고리별상품전시관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.19   bin2107     최초 작성
+ *******************************************************************************
+ -->
+	<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="@{'/display/category/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col width="10%"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>카테고리</th>
+						<td>
+							<input type="hidden" name="selLvl"/>
+							<select name="siteCd">
+<!-- 								<option value="">[사이트]</option> -->
+								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<select name="cateGb" id="selCate1" onchange="fnChangeSearchCondition($(this).val(), 1);">
+								<option value="">[카테고리구분]</option>
+								<option th:if="${cateGbList}" th:each="oneData, status : ${cateGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<select name="cate1No" id="selCate2" onchange="fnChangeSearchCondition($(this).val(), 2);">
+								<option value="">[카테고리1]</option>
+							</select>
+							<select name="cate2No" id="selCate3" onchange="fnChangeSearchCondition($(this).val(), 3);">
+								<option value="">[카테고리2]</option>
+							</select>
+							<select name="cate3No" id="selCate4" onchange="fnChangeSearchCondition($(this).val(), 4);">
+								<option value="">[카테고리3]</option>
+							</select>
+							<select name="cate4No" id="selCate5" onchange="fnChangeSearchCondition($(this).val(), 5);">
+								<option value="">[카테고리4]</option>
+							</select>
+						</td>
+					</tr>
+				</table>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+
+/*]]>*/
+</script>
+
+</html>

+ 224 - 26
src/main/webapp/WEB-INF/views/display/GoodsCategoryForm.html

@@ -172,7 +172,7 @@
 			<ul class="panelBar">
 				<li>
 					<button type="button" class="btn btn-default btn-lg" onclick="cfnDownloadSampleFile('SF003');">상품엑셀조회 양식 다운로드</button>
-					<button type="button" class="btn btn-base btn-lg" id="btnGoodsExcelUpLoad">엑셀조회</button>
+					<button type="button" class="btn btn-base btn-lg" id="btnGoodsExcelSearch">엑셀조회</button>
 				</li>
 				<li class="aR">
 					검색결과 : <strong><span id="gridRowTotalCount">0</span> 건</strong>&nbsp;
@@ -215,30 +215,29 @@
 				</tr>
 				<th:block th:each="num, index  : ${#numbers.sequence(1,4)}">
 					<tr>
-						<input type="hidden" name="selLvl" th:id="selLvl_+${num}"/>
 						<td>
-							<select name="cateGb" th:id="selCate1_+${num}" th:idx="${num}" th:onchange="|fnChangeSelect($(this).val(), ${num}, 1);|">
+							<select th:id="selCate+${num}+1" th:onchange="|fnChangeSelect($(this).val(), ${num}, 1);|">
 								<option value="">[선택]</option>
 								<option th:if="${cateGbList}" th:each="oneData, status : ${cateGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
 						</td>
 						<td>
-							<select name="cate1No" th:id="selCate2_+${num}" th:onchange="|fnChangeSelect($(this).val(), ${num}, 2);|">
+							<select name="cateCd1Arr" th:id="selCate+${num}+2" th:onchange="|fnChangeSelect($(this).val(), ${num}, 2);|">
 								<option value="">[선택]</option>
 							</select>
 						</td>
 						<td>
-							<select name="cate2No" th:id="selCate3_+${num}" th:onchange="|fnChangeSelect($(this).val(), ${num}, 3);|">
+							<select name="cateCd2Arr" th:id="selCate+${num}+3" th:onchange="|fnChangeSelect($(this).val(), ${num}, 3);|">
 								<option value="">[선택]</option>
 							</select>
 						</td>
 						<td>
-							<select name="cate3No" th:id="selCate4_+${num}" th:onchange="|fnChangeSelect($(this).val(), ${num}, 4);|">
+							<select name="cateCd3Arr" th:id="selCate+${num}+4" th:onchange="|fnChangeSelect($(this).val(), ${num}, 4);|">
 								<option value="">[선택]</option>
 							</select>
 						</td>
 						<td>
-							<select name="cate4No" th:id="selCate5_+${num}" th:onchange="|fnChangeSelect($(this).val(), ${num}, 5);|">
+							<select name="cateCd4Arr" th:id="selCate+${num}+5" th:onchange="|fnChangeSelect($(this).val(), ${num}, 5);|">
 								<option value="">[선택]</option>
 							</select>
 							<input type="hidden" th:id='cateCd+${num}' name='cateCdArr' value='' />
@@ -249,20 +248,49 @@
 					</tr>
 				</th:block>
 			</table>
+			<ul class="panelBar">
+				<li class="center">
+					<button type="button" class="btn btn-default btn-lg" id="btnCateInit">초기화</button>
+					<button type="button" class="btn btn-success btn-lg" id="btnCateSave">전시저장</button>
+					<input type="hidden" id='goodsCds' name='goodsCds' value='' />
+					<input type="hidden" name='selLvl' value='' />
+					<input type="hidden" name='cateIndex' value='' />
+				</li>
+			</ul>
+		</form>
+	</div>
+
+	<!-- 카테고리 리스트 영역 -->
+	<div class="panelStyle">
+		<form id="deleteForm" name="deleteForm" action="#" th:action="@{'/display/goods/category/delete'}">
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-danger btn-lg" id="btnCateDelete">전시삭제</button>
+					<input type="hidden" name='goodsCd' value='' />
+				</li>
+			</ul>
+			<div id="gridCategoryList" style="width: 100%; height: 500px;" class="ag-theme-balham"></div>
 		</form>
 	</div>
+	<!-- //카테고리 리스트 영역 -->
 
 
 	<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=2019072202"></script>
 	<script th:inline="javascript">
 		/*<![CDATA[*/
 		var goodsStatList = gagajf.convertToArray([[${goodsStatList}]]);
+		var cateGbList = gagajf.convertToArray([[${cateGbList}]]);
 		var columnDefs = [];
 		columnDefs = [
 			{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
 			{headerName: 'No', width: 60, cellClass: 'text-center',
 				valueGetter: function(params) { return cfnGridNumner('goodsSearchForm',params.node.rowIndex, 'A');}
 			},
+			{headerName: "카테고리", field: "fullCateNm", width: 140, cellClass: 'text-center'
+				,cellRenderer: function(params) {
+					return '<a href="javascript:void(0);">'+params.value+'</a>';
+				}
+			},
 			{headerName: "이미지", field: "sysImgNm", width: 100, height: 60, cellClass: 'text-center'
 				,cellRenderer: function(params) {
 					return '<img width="60" src="'+ _goodsUrl+ "/" + params.value + '" alt=""  onerror="this.src=\'/image/no.gif\';"/>';
@@ -297,16 +325,44 @@
             }*/
 		];
 
+		var columCategoryDefs = [
+			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{headerName: "자동전시카테고리코드", field: "cateCd", width: 150, cellClass: 'text-center'},
+			{headerName: "자동전시카테고리", field: "fullCateNm", width: 400, cellClass: 'text-left'},
+			{headerName: "카테고리1", field: "cateCd1", width: 150, cellClass: 'text-left', hide: true},
+			{headerName: "카테고리2", field: "cateCd2", width: 150, cellClass: 'text-left', hide: true},
+			{headerName: "카테고리3", field: "cateCd3", width: 150, cellClass: 'text-left', hide: true},
+			{headerName: "카테고리4", field: "cateCd4", width: 150, cellClass: 'text-left', hide: true}
+		];
+
 		// Get GridOptions
 		var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+		var gridCategoryOptions = gagaAgGrid.getGridOptions(columCategoryDefs);
 
 		// 중복 선택 가능
 		gridOptions.rowSelection = 'multiple';
 		gridOptions.suppressRowClickSelection = true;
 		gridOptions.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
-
 		gridOptions.stopEditingWhenGridLosesFocus = true;
 
+		gridCategoryOptions.rowSelection = 'multiple';
+		gridCategoryOptions.suppressRowClickSelection = true;
+
+		gridOptions.onCellClicked = function(event) {
+			if(event.colDef.field == "fullCateNm"){
+				$('#deleteForm input[name=goodsCd]').val(event.data.goodsCd);
+				fnDisplayCategorySearch();
+				$(window).scrollTop($(window).height());
+			}
+		}
+
+		// 상품별 전시카테고리 조회
+		var fnDisplayCategorySearch = function(){
+			var goodsCd = $('#deleteForm input[name=goodsCd]').val();
+			var actionUrl = "/display/goods/category/view/list?goodsCd=" + goodsCd;
+			gagaAgGrid.fetch(actionUrl, gridCategoryOptions);
+		}
+
 		// 조회
 		$('#btnSearch').on('click', function() {
 			if(gagajf.isNull($("#goodsSearchForm select[name=supplyCompCd]").val())
@@ -348,9 +404,6 @@
 
 		// 카테고리 selectBox 변경
 		var fnChangeSelect = function(val, cateIndex, selLvl){
-			console.log('val:::'+val);
-			console.log('cateIndex:::'+cateIndex);
-			console.log('selLvl:::'+selLvl);
 			$("#cateCd"+cateIndex).val('');
 			$("#cateGb"+cateIndex).val('');
 			$("#leafYn"+cateIndex).val('');
@@ -365,8 +418,8 @@
 				} else {
 					//selLvl = 1;
 					var html = '<option value="">[선택]</option>';
-					for(var i=1; i<5; i++){
-						$("#selCate"+i+'_'+cateIndex).html(html);
+					for(var i=2; i<6; i++){
+						$("#selCate"+cateIndex+''+i).html(html);
 					}
 					return;
 				}
@@ -374,14 +427,15 @@
 				$("#cateCd"+cateIndex).val(val.split(',')[0]);
 				$("#leafYn"+cateIndex).val(val.split(',')[1]);
 			}
-			$("#goodsCateForm input[name=selLvl]").val(selLvl);
+			$("#goodsCateForm input[name=selLvl]").val(selLvl+1);
 			$("#goodsCateForm input[name=cateIndex]").val(cateIndex);
 
-			var cateGb = $('#selCate1_'+cateIndex).val();
-			var cate1No = $('#selCate2_'+cateIndex).val().split(',')[0];
-			var cate2No = $('#selCate3_'+cateIndex).val().split(',')[0];
-			var cate3No = $('#selCate4_'+cateIndex).val().split(',')[0];
-			var cate4No = $('#selCate5_'+cateIndex).val().split(',')[0];
+			var cateGb = $('#selCate'+cateIndex+'1').val();
+			var cate1No = $('#selCate'+cateIndex+'2').val().split(',')[0];
+			var cate2No = $('#selCate'+cateIndex+'3').val().split(',')[0];
+			var cate3No = $('#selCate'+cateIndex+'4').val().split(',')[0];
+			var cate4No = $('#selCate'+cateIndex+'5').val().split(',')[0];
+
 			$("#cateGb"+cateIndex).val(cateGb);
 			if(selLvl==5 || (val=='' && selLvl==4)){
 				return;
@@ -401,26 +455,28 @@
 		}
 
 		var fnChangeCate = function(data){
-			console.log('hereeeeeeeeeeeee');
-			/*
-			var selLvl = $("#saveForm input[name=selLvl]").val();
-			var cateIndex = $("#saveForm input[name=cateIndex]").val();
+			var selLvl = $("#goodsCateForm input[name=selLvl]").val();
+			var cateIndex = $("#goodsCateForm input[name=cateIndex]").val();
 			var html = '<option value="">[선택]</option>';
-			for(var i=1; i<6; i++){
+
+			for(var i=0; i<6; i++){
+				i = i+1;
 				if(i>selLvl){
 					$("#selCate"+cateIndex+''+i).html(html);
 				}
 			}
+
 			for(var i=0; i<data.length; i++){
 				var cd = '';
 				var nm = '';
 				var leafYn = '';
+
 				if(data[i].useYn=='Y'){
 					if(selLvl=='1'){
 						cd = data[i].cateGb;
 						nm = gagaAgGrid.lookupValue(cateGbList, cd);
 					}else{
-						cd = data[i].cateCd;
+						cd = data[i].cateNo;
 						nm = data[i].cateNm;
 						leafYn = ','+data[i].leafYn;
 						$("#cateType"+cateIndex).val(data[i].cateType);
@@ -429,13 +485,155 @@
 				}
 			}
 			$("#selCate"+cateIndex+''+selLvl).html(html);
-			*/
+		}
+
+		// 카테고리 저장
+		$("#btnCateSave").on('click', function() {
+			var data = gridOptions.api.getSelectedRows();
+			if(data.length == 0){
+				mcxDialog.alert('상품을 선택하세요.');
+				return false;
+			}
+
+			var msgArr = ['', '첫 번째', '두 번째', '세 번째', '네 번째'];
+			var cateCdBool = false;
+
+			for(var i=1; i<5; i++){
+				if($("#cateCd"+i).val()!=''){
+					cateCdBool = true;
+					if($("#leafYn"+i).val()!='Y'){
+						mcxDialog.alert(msgArr[i]+' 행의 leaf카테고리를 선택하세요.');
+						return;
+					}
+				}else if($("#cateGb"+i).val()!=''){
+					mcxDialog.alert(msgArr[i]+' 행의 leaf카테고리를 선택하세요.');
+					return;
+				}
+			}
+			if(!cateCdBool){
+				mcxDialog.alert('전시할 카테고리를 선택하세요.');
+				return;
+			}
+			var goodsCdS = '';
+			data.forEach(function(row){
+				if (goodsCdS!=''){
+					goodsCdS += ','
+				}
+				goodsCdS += row.goodsCd;
+			});
+			$("#goodsCds").val(goodsCdS);
+
+			mcxDialog.confirm('저장하시겠습니까?', {
+				cancelBtnText: "취소",
+				sureBtnText: "확인",
+				sureBtnClick: function(){ //debugger;
+					gagajf.ajaxFormSubmit($('#goodsCateForm').prop('action'), "#goodsCateForm", fnGoodsCateSaveCallBack);
+				}
+			});
+		});
+
+		var fnGoodsCateSaveCallBack = function(){
+			console.log('save success@');
+			$('#btnCateInit').click();
+		};
+
+		// 검색조건 초기화
+		$('#btnCateInit').on('click', function() {
+			$("#goodsCateForm")[0].reset();
+			var html = '<option value="">[선택]</option>';
+			for(var i=2; i<5; i++){
+				for(var j=1; j<5; j++){
+					$("#selCate"+j+''+i).html(html);
+				}
+			}
+			for(var i=1; i<5; i++){
+				$("#cateCd"+i).val('');
+				$("#cateGb"+i).val('');
+				$("#leafYn"+i).val('');
+			}
+		});
+
+		// 전시카테고리 삭제
+		$("#btnCateDelete").on("click", function(){
+			var data = gridCategoryOptions.api.getSelectedRows();
+			if(data.length == 0){
+				mcxDialog.alert('삭제할 카테고리를 선택하세요.');
+				return false;
+			}
+
+			var goodsCd = '';
+			var cateCdArr = [];
+			var cateCd1Arr = [];
+			var cateCd2Arr = [];
+			var cateCd3Arr = [];
+			var cateCd4Arr = [];
+			var cateTypeArr = [];
+			data.forEach(function(row){
+				console.log('goodsCd:'+row.goodsCd);
+				console.log('cateType:'+row.cateType);
+				console.log('cateCd:'+row.cateCd);
+
+				console.log('catecd1:'+row.cateCd1);
+				console.log('catecd2:'+row.cateCd2);
+				console.log('catecd3:'+row.cateCd3);
+				console.log('catecd4:'+row.cateCd4);
+
+				cateCdArr.push(row.cateCd);
+				cateCd1Arr.push(row.cateCd1);
+				cateCd2Arr.push(row.cateCd2);
+				cateCd3Arr.push(row.cateCd3);
+				cateCd4Arr.push(row.cateCd4);
+				goodsCd = row.goodsCd;
+				cateTypeArr.push(row.cateType);
+			});
+
+			applyData = {cateCdArr : cateCdArr
+				, cateCd1Arr : cateCd1Arr
+				, cateCd2Arr : cateCd2Arr
+				, cateCd3Arr : cateCd3Arr
+				, cateCd4Arr : cateCd4Arr
+				, goodsCd : goodsCd
+				, cateTypeArr : cateTypeArr
+			};
+
+			var jsonData = JSON.stringify(applyData);
+			mcxDialog.confirm('삭제하시겠습니까?', {
+				cancelBtnText: "취소",
+				sureBtnText: "확인",
+				sureBtnClick: function(){
+					gagajf.ajaxJsonSubmit($('#deleteForm').prop('action'), jsonData, fnGoodsCateDeleteCallBack);
+				}
+			});
+		});
+
+		var fnGoodsCateDeleteCallBack = function(){
+			$('#btnCateInit').click();
+			fnDisplayCategorySearch();
+		};
+
+		// 엑셀 상품 조회
+		$("#btnGoodsExcelSearch").on('click', function(){
+			cfnExcelUploadPopup('goodsExcelUpload', 'goodsExcelUpload');
+		});
+
+		var goodsExcelUpload = function(result){
+			var data = {procJob : result.procJob
+				,excelFileNm : result.excelFileNm
+			};
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit('/goods/search/excelupload/save', jsonData, fnGoodsExcelUploadCallBack);
+		}
+
+		var fnGoodsExcelUploadCallBack = function(result){
+			$("#goodsSearchForm input[name=searchGb]").val("EXCEL");
+			fnSearch();
 		}
 
 		$(document).ready(function() {
 			cfnCreateCalendar('#sellTerms', 'stDate', 'edDate', true, '기간', 'X');
 			// Create a agGrid
 			gagaAgGrid.createGrid('gridList', gridOptions);
+			gagaAgGrid.createGrid('gridCategoryList', gridCategoryOptions);
 		});
 
 		/*]]>*/

+ 1 - 1
src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html

@@ -1250,7 +1250,7 @@
 
 			// SUPER관리자, 어드민관리자, 계정관리자. 총괄관리자, MD 를 제외하고 승인처리 할수 없음
 			if ("G001_0000" != sessRoleCd && "G001_A000" != sessRoleCd && "G001_A001" != sessRoleCd && "G001_A100" != sessRoleCd && "G001_A101" != sessRoleCd ){
-				if ($("#goodsDetailForm select[name=goodsStat]").val() == "G008_90" &&  $("#goodsDetailForm select[name=goodsStatOrg]").val() != "G008_90"){
+				if ($("#goodsDetailForm select[name=goodsStat]").val() == "G008_90" &&  $("#goodsDetailForm input[name=goodsStatOrg]").val() != "G008_90"){
 					mcxDialog.alert(" '승인완료' 상태로 변경할 권한이 없습니다.");
 					return false;
 				}

+ 1 - 1
src/main/webapp/WEB-INF/views/goods/GoodsItemkindForm.html

@@ -196,7 +196,7 @@
 		{headerName: "기존품목코드", field: "itemkindCd", width: 150, cellClass: 'text-center' },
 		{headerName: "변경품목코드", field: "itemkindCdNew", width: 150, cellClass: 'text-center', editable : true,
 			cellEditor: 'textCellEditor',
-			cellEditorParams: { maxlength: 5, required: true, onblur: '$(this).val($(this).val().toUpperCase())' }
+			cellEditorParams: { maxlength: 9, required: true, onblur: '$(this).val($(this).val().toUpperCase())' }
 		}
 	];
 

+ 2 - 2
src/main/webapp/WEB-INF/views/goods/GoodsListForm.html

@@ -1079,10 +1079,10 @@
 	// 브랜드 조회 선택시
 	$('#btnSearchBrand').on('click', function() {
 
-		if (gagajf.isNull($("#searchForm input[name=searchTxt]").val())){
+		/* if (gagajf.isNull($("#searchForm input[name=searchTxt]").val())){
 			mcxDialog.alert('브랜드 검색어를 입력하세요.');
 			return false;
-		}
+		} */
 		
 		cfnOpenBrandListPopup('fnSetBrandInfo', 'S', $("#searchForm input[name=searchTxt]").val());
 		

+ 10 - 10
src/main/webapp/WEB-INF/views/goods/NotiinfoForm.html

@@ -32,10 +32,10 @@
 			<ul class="boxContent">
 				<li class="boxContentBtnT">
 					<span style="padding:5.5px 15px; background:#e9ecfb; border-top:1px solid #dae0fd; border-bottom:0.5px solid #dae0fd;">업체</span>
-					<select name="supplyCompCd" id="supplyCompCd">
-						<option value="S0001" th:if="${sessionInfo.roleCd != 'G001_B000' }" th:selected="${sessionInfo.roleCd != 'G001_B000'}">한세엠케이</option>
-						<option value="S0002" th:if="${sessionInfo.roleCd != 'G001_B000' }">한세드림</option>
-						<option value="E" th:selected="${sessionInfo.roleCd == 'G001_B000'}">입점</option>
+					<select name="supplyVendorCd" id="supplyVendorCd">
+						<option value="SV0001" selected="selected">한세엠케이</option>
+						<option value="SV0002">한세드림</option>
+						<option value="E" >입점</option>
 					</select>
 				</li>
 				<li class="boxContentTop">
@@ -121,7 +121,7 @@
 		{headerName: "등록일자", field: "regDt" , width: 150, cellClass: 'text-center', hide: true},
 		{headerName: "수정일자", field: "udtDt", width: 150, cellClass: 'text-center', hide: true},
 		{headerName: "niClsfCd", field: "niClsfCd", hide: true},
-		{headerName: "supplyCompCd", field: "supplyCompCd", hide: true}
+		{headerName: "supplyVendorCd", field: "supplyVendorCd", hide: true}
 	];
 
 	// Get GridOptions
@@ -150,11 +150,11 @@
 		var formId = '#searchForm';
 		$('#searchForm input[name=niClsfCd]').val('');
 		
-		if (gagajf.isNull($('#searchForm select[name=supplyCompCd]').val())){
+		if (gagajf.isNull($('#searchForm select[name=supplyVendorCd]').val())){
 			mcxDialog.alertC("업체를 선택해 주세요.", {
 				sureBtnText: "확인",
 				sureBtnClick: function() {
-					$('#searchForm select[name=supplyCompCd]').focus();
+					$('#searchForm select[name=supplyVendorCd]').focus();
 				}
 			});
 			return;
@@ -192,9 +192,9 @@
 		});
 		
 		var niClsfCd = $('#searchForm input[name=niClsfCd]').val();
-		var supplyCompCd = $('#searchForm select[name=supplyCompCd]').val();
+		var supplyVendorCd = $('#searchForm select[name=supplyVendorCd]').val();
 		
-		var data = { crud: "C", niItemCd: "", niContent: "", dispOrd: Number(maxDispOrd)+1, niClsfCd: niClsfCd, supplyCompCd: supplyCompCd};
+		var data = { crud: "C", niItemCd: "", niContent: "", dispOrd: Number(maxDispOrd)+1, niClsfCd: niClsfCd, supplyVendorCd: supplyVendorCd};
 		
 		//그리드 마지막에 추가해야함
 		gridNotiItemlOptions.api.updateRowData({add: [data], addIndex: 0});
@@ -299,7 +299,7 @@
 		fnNotiItemlSearch($('#searchForm input[name=niClsfCd]').val());
 	}
 	
-	$("#supplyCompCd").on("change", function(){
+	$("#supplyVendorCd").on("change", function(){
 		fnSearch();
 	});
 	

+ 8 - 7
src/main/webapp/WEB-INF/views/goods/WmsColorMappingForm.html

@@ -30,9 +30,9 @@
 				<ul class="panelBar">
 					<li>
 						<h3>업체명</h3>
-						<select name="supplyCompCd" id="supplyCompCd">
-							<option value="S0001" selected="selected">한세엠케이</option>
-							<option value="S0002">한세드림</option>
+						<select name="supplyVendorCd" id="supplyVendorCd">
+							<option value="SV0001" selected="selected">한세엠케이</option>
+							<option value="SV0002">한세드림</option>
 							<option value="S006">FRJ</option>
 						</select>
 						<button type="button" class="btn btn-dark btn-sm" id="btnAddRow">행추가</button>
@@ -65,7 +65,7 @@
 			cellEditor: 'textCellEditor',
 			cellEditorParams: { maxlength: 50, required: true }
 		},
-		{headerName: "색상코드", field: "colorCd", width: 100, cellClass: 'text-center',editable: true,
+		{headerName: "온라인 색상", field: "colorCd", width: 100, cellClass: 'text-center',editable: true,
 			cellEditor: 'agRichSelectCellEditor',
 			cellEditorParams: { values: gagaAgGrid.extractValues(colorList) },
 			valueFormatter: function (params) { return gagaAgGrid.lookupValue(colorList, params.value); },
@@ -88,7 +88,8 @@
 			cellRenderer: function(params) {
 				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
 			}
-		}
+		},
+		{headerName: "supplyVendorCd", field: "supplyVendorCd", hide: true}
 	];
 
 	// Get GridOptions
@@ -106,7 +107,7 @@
 
 	// 행추가
 	$('#btnAddRow').on('click', function() {
-		var data = { wmsColorCd: null, wmsColorNm: null, colorCd: null, useYn: "Y", supplyCompCd: $('#supplyCompCd').val() };
+		var data = { wmsColorCd: null, wmsColorNm: null, colorCd: null, useYn: "Y", supplyVendorCd: $('#supplyVendorCd').val() };
 		gagaAgGrid.addRowData(gridOptions, data, "wmsColorCd");
 	});
 
@@ -163,7 +164,7 @@
 	});
 	
 	//업체변경시
-	$("#supplyCompCd").on("change", function(){
+	$("#supplyVendorCd").on("change", function(){
 		fnSearch();
 	});
 	

+ 7 - 6
src/main/webapp/WEB-INF/views/goods/WmsSeasonMappingForm.html

@@ -30,9 +30,9 @@
 				<ul class="panelBar">
 					<li>
 						<h3>업체명</h3>
-						<select name="supplyCompCd" id="supplyCompCd">
-							<option value="S0001" selected="selected">한세엠케이</option>
-							<option value="S0002">한세드림</option>
+						<select name="supplyVendorCd" id="supplyVendorCd">
+							<option value="SV0001" selected="selected">한세엠케이</option>
+							<option value="SV0002">한세드림</option>
 							<option value="S006">FRJ</option>
 						</select>
 						<button type="button" class="btn btn-dark btn-sm" id="btnAddRow">행추가</button>
@@ -88,7 +88,8 @@
 			cellRenderer: function(params) {
 				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
 			}
-		}
+		},
+		{headerName: "supplyVendorCd", field: "supplyVendorCd", hide: true}
 	];
 
 	// Get GridOptions
@@ -106,7 +107,7 @@
 
 	// 행추가
 	$('#btnAddRow').on('click', function() {
-		var data = { wmsSeasonCd: null, wmsSeasonNm: null, seasonCd: null, useYn: "Y", supplyCompCd: $('#supplyCompCd').val() };
+		var data = { wmsSeasonCd: null, wmsSeasonNm: null, seasonCd: null, useYn: "Y", supplyVendorCd: $('#supplyVendorCd').val() };
 		gagaAgGrid.addRowData(gridOptions, data, "wmsSeasonCd");
 	});
 
@@ -163,7 +164,7 @@
 	});
 	
 	//업체변경시
-	$("#supplyCompCd").on("change", function(){
+	$("#supplyVendorCd").on("change", function(){
 		fnSearch();
 	});
 	

+ 7 - 6
src/main/webapp/WEB-INF/views/goods/WmsStyleYearMappingForm.html

@@ -30,9 +30,9 @@
 				<ul class="panelBar">
 					<li>
 						<h3>업체명</h3>
-						<select name="supplyCompCd" id="supplyCompCd">
-							<option value="S0001" selected="selected">한세엠케이</option>
-							<option value="S0002">한세드림</option>
+						<select name="supplyVendorCd" id="supplyVendorCd">
+							<option value="SV0001" selected="selected">한세엠케이</option>
+							<option value="SV0002">한세드림</option>
 							<option value="S006">FRJ</option>
 						</select>
 						<button type="button" class="btn btn-dark btn-sm" id="btnAddRow">행추가</button>
@@ -88,7 +88,8 @@
 			cellRenderer: function(params) {
 				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
 			}
-		}
+		},
+		{headerName: "supplyVendorCd", field: "supplyVendorCd", hide: true}
 	];
 
 	// Get GridOptions
@@ -106,7 +107,7 @@
 
 	// 행추가
 	$('#btnAddRow').on('click', function() {
-		var data = { wmsStyleYearCd: null, wmsStyleYearNm: null, colorCd: null, useYn: "Y", supplyCompCd: $('#supplyCompCd').val() };
+		var data = { wmsStyleYearCd: null, wmsStyleYearNm: null, colorCd: null, useYn: "Y", supplyVendorCd: $('#supplyVendorCd').val() };
 		gagaAgGrid.addRowData(gridOptions, data, "wmsStyleYearCd");
 	});
 
@@ -163,7 +164,7 @@
 	});
 	
 	//업체변경시
-	$("#supplyCompCd").on("change", function(){
+	$("#supplyVendorCd").on("change", function(){
 		fnSearch();
 	});
 	

+ 4 - 4
src/main/webapp/WEB-INF/views/marketing/CouponRetrievePopupForm.html

@@ -171,10 +171,10 @@
 	gridOptionsCouponList.rowSelection = 'single';
 	gridOptionsCouponList.rowMultiSelectWithClick = true; // 클릭으로 선택 가능
 	
-	// Row double click
-	gridOptionsCouponList.onRowDoubleClicked = function(event) {
-		$('#btnConfirmCoupon').trigger('click');
-	}
+// 	// Row double click
+// 	gridOptionsCouponList.onRowDoubleClicked = function(event) {
+// 		$('#btnConfirmCoupon').trigger('click');
+// 	}
 
 	// 조회
 	$('#btnSearchCouponRetrieve').on('click', function() {

+ 33 - 5
src/main/webapp/ux/js/admin.popup.js

@@ -521,8 +521,8 @@ var cfnOpenLookbookBannerPopup = function(lookbookSq, lookbookTitle) {
  * @author : jsshin
  */
 var cfnOpenCustDetailPopup = function(custNo) {
-	var actionUrl = "/customer/detail/form?custNo=" + custNo;
-	cfnOpenModalPopup(actionUrl,'popupCustDetail');
+	var actionUrl = "/customer/detail/form/" + custNo;
+	cfnOpenModalPopup(actionUrl,'popupCustomerDetail');
 }
 
 /**
@@ -789,9 +789,9 @@ var cfnOpenMorebetterSetPopup = function(mode ,tmtbSeq) {
 /**
  * @type   : function
  * @access : public
- * @desc   : 제휴몰 조회 팝업
+ * @desc   : 외부몰 조회 팝업
  * <pre>
- *     cfnOpenCompanyListPopup();
+ *     cfnOpenExtmallListPopup();
  * </pre>
  * @since  : 2020/12/23
  * @author : xodud1202
@@ -801,4 +801,32 @@ var cfnOpenExtmallListPopup = function(callbackfn) {
 	if (typeof(callbackfn) != 'undefined') actionUrl += "?callbackFn=" + callbackfn;
 	uifnPopupClose('popupExtmallList');
 	cfnOpenModalPopup(actionUrl, 'popupExtmallList');
-}
+}
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 공급벤더 팝업
+ * <pre>
+ *     var oParam = new Object();
+ *     oParam.returnCode = 'input[name=supplyVendorCd]'; // 반환할코드
+ *     oParam.returnName = 'input[name=supplyVendorNm]'; // 반환할코드명칭
+ *     cfnOpenSupplyVendorPopup($('input[name=supplyVendorNm]').val(), oParam);
+ * </pre>
+ * @param sName - 명칭. 필수
+ * @param oParam - 파라미터 오브젝트. 필수
+ * @since  : 2021/01/18
+ * @author : gagamel
+ */
+var cfnOpenSupplyVendorPopup = function(sName, oParam) {
+	var oEvt = window.event;
+	if (oEvt.type == 'click') sName = '';
+	var returnCode = oParam.returnCode;
+	var returnName = oParam.returnName;
+
+	var actionUrl = '/business/supply/vendor/popup/form?supplyVendorNm=' + encodeURIComponent(sName)
+			+ '&returnCode=' + encodeURIComponent(returnCode)
+			+ '&returnName=' + encodeURIComponent(returnName);
+
+	cfnOpenModalPopup(actionUrl, 'popupSupplyVendor');
+}