Browse Source

Merge branch 'develop' of http://112.172.147.34:4936/style24/STYLE24.git
into develop

Conflicts:
style24.front/target/m2e-wtp/web-resources/META-INF/maven/com.style24.front/style24.front/pom.properties

jsh77b 5 years ago
parent
commit
fa07f79cfa
36 changed files with 2387 additions and 147 deletions
  1. 51 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaDisplayDao.java
  2. 9 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java
  3. 56 5
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaMarketingDao.java
  4. 59 0
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaDisplayService.java
  5. 12 0
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaGoodsService.java
  6. 71 0
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaMarketingService.java
  7. 83 0
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaDisplayController.java
  8. 10 2
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaGoodsController.java
  9. 142 4
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
  10. 28 31
      style24.admin/src/main/java/com/style24/persistence/domain/Category.java
  11. 23 0
      style24.admin/src/main/java/com/style24/persistence/domain/ItemkindCategory.java
  12. 35 1
      style24.admin/src/main/java/com/style24/persistence/domain/MoreBetter.java
  13. 29 0
      style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterBurden.java
  14. 92 0
      style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterGoods.java
  15. 32 0
      style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterSection.java
  16. 10 4
      style24.admin/src/main/java/com/style24/persistence/domain/WmsGoods.java
  17. 102 0
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml
  18. 35 5
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  19. 119 2
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaMarketing.xml
  20. 292 0
      style24.admin/src/main/webapp/WEB-INF/views/display/ItemkindCategoryForm.html
  21. 32 1
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsWmsIncomelotForm.html
  22. 4 4
      style24.admin/src/main/webapp/WEB-INF/views/marketing/MorebetterListForm.html
  23. 736 0
      style24.admin/src/main/webapp/WEB-INF/views/marketing/MorebetterRegForm.html
  24. 9 0
      style24.batch/src/main/java/com/style24/batch/biz/dao/TsbGoodsDao.java
  25. 10 0
      style24.batch/src/main/java/com/style24/batch/biz/dao/TsbWmsGoodsDao.java
  26. 3 3
      style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsBrandproviderJob.java
  27. 69 0
      style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsProductJob.java
  28. 25 25
      style24.batch/src/main/java/com/style24/batch/biz/service/TsbGoodsService.java
  29. 68 10
      style24.batch/src/main/java/com/style24/batch/biz/service/TsbWmsGoodsService.java
  30. 2 3
      style24.batch/src/main/java/com/style24/batch/biz/task/TsbDeliveryTask.java
  31. 17 3
      style24.batch/src/main/java/com/style24/batch/biz/task/TsbGoodsTask.java
  32. 31 0
      style24.batch/src/main/java/com/style24/persistence/domain/IfProduct.java
  33. 64 44
      style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml
  34. 19 0
      style24.batch/src/main/java/com/style24/persistence/mybatis/wms/TsbWmsGoods.xml
  35. 1 0
      style24.batch/src/main/resources/config/application-locd.yml
  36. 7 0
      style24.front/target/m2e-wtp/web-resources/META-INF/maven/com.style24.front/style24.front/pom.properties

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

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

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

@@ -1068,6 +1068,15 @@ public interface TsaGoodsDao {
 	 */
 	public void updateFreeGoods(FreeGoods freeGoods);
 
+	/**
+	 * WMS입고상품관리 목록 건수
+	 * @param goodsSearch
+	 * @return Collection<WmsGoods>
+	 * @author eskim
+	 * @since 2021. 01. 04
+	 */
+	int getGoodsWmsIncomelotListCount(WmsGoods wmsGoods);
+
 	/**
 	 * WMS입고상품관리 목록 조회
 	 * @param goodsSearch

+ 56 - 5
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaMarketingDao.java

@@ -1,10 +1,7 @@
 package com.style24.admin.biz.dao;
 
 import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Coupon;
-import com.style24.persistence.domain.FreeGoodsPromotion;
-import com.style24.persistence.domain.Itemkind;
-import com.style24.persistence.domain.MoreBetter;
+import com.style24.persistence.domain.*;
 import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
@@ -54,12 +51,66 @@ public interface TsaMarketingDao {
 
 	/* CSB 진행 */
 	/**
-	 * 사은품 프로모션 리스트
+	 * 다다익선 프로모션 리스트
 	 * @param MoreBetter
 	 * @return
 	 * @author bin2107
 	 * @since 2020. 12. 28
 	 */
 	Collection<MoreBetter> getMorebetterList(MoreBetter param);
+
+	/**
+	 * 다다익선 마스터(TB_TMTB) 저장
+	 * @param MoreBetter
+	 * @return
+	 * @author bin2107
+	 * @since 2020. 12. 28
+	 */
+	void saveMorebetterMst(MoreBetter tmtb);
+
+	/**
+	 * 다다익선 할인구간설정 2차조건(TB_TMTB_SECTION) 저장
+	 * @param MoreBetter
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 6
+	 */
+	void saveMorebetterSection(MoreBetterSection regSection);
+
+	/**
+	 * 다다익선 조건에 따른 할인혜택(금액할인) 설정(TB_TMTB_VAL) 저장
+	 * @param MoreBetter
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 6
+	 */
+	void saveMorebetterVal(MoreBetterSection regSection);
+
+	/**
+	 * 다다익선 업체분담율(TB_TMTB_BURDEN) 저장
+	 * @param MoreBetter
+	 * @return
+	 * @author bin2107
+	 * @since 2020. 12. 28
+	 */
+	void saveMorebetterBurden(MoreBetterBurden regBurden);
+
+	/**
+	 * 다다익선 할인구간설정(TB_TMTB_SECTION) 삭제
+	 * @param MoreBetter
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 6
+	 */
+	void deleteTmtbSectionList(MoreBetterSection sectionVal);
+
+	/**
+	 * 다다익선 조건에 따른 할인혜택(금액할인) 설정(TB_TMTB_VAL) 삭제
+	 * @param MoreBetter
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 6
+	 */
+	void deleteTmtbValList(MoreBetterSection sectionVal);
 	/* // CSB 진행 */
 }

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

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

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

@@ -2654,6 +2654,18 @@ public class TsaGoodsService {
 		goodsDao.updateFreeGoods(freeGoods);
 	}
 
+	/**
+	 * WMS입고상품관리 목록 건수
+	 *
+	 * @param goodsSearch
+	 * @return Collection<WmsGoods>
+	 * @author eskim
+	 * @since 2021. 01. 04
+	 */
+	public int getGoodsWmsIncomelotListCount(WmsGoods wmsGoods) {
+		return goodsDao.getGoodsWmsIncomelotListCount(wmsGoods);
+	}
+
 	/**
 	 * WMS입고상품관리 목록 조회
 	 *

+ 71 - 0
style24.admin/src/main/java/com/style24/admin/biz/service/TsaMarketingService.java

@@ -124,5 +124,76 @@ public class TsaMarketingService {
 	public Collection<MoreBetter> getMorebetterList(MoreBetter param) {
 		return marketingDao.getMorebetterList(param);
 	}
+
+	/**
+	 * 다다익선 저장
+	 * @param tmtb
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 5
+	 */
+	@Transactional("shopTxnManager")
+	public void saveMoreBetterDetail(MoreBetter tmtb) {
+		// <,> replace 처리
+		tmtb.setRegNo(TsaSession.getInfo().getUserNo());
+		tmtb.setUdpNo(TsaSession.getInfo().getUserNo());
+
+
+		// TMTB 마스터(TB_TMTB) 저장
+		marketingDao.saveMorebetterMst(tmtb);
+
+		// 다다익선 할인구간 저장
+		Collection<MoreBetterSection> sectionGbList = tmtb.getSectionGbListNew();
+		for(MoreBetterSection regSection : sectionGbList){
+			// 다다익선 할인구간설정 2차조건(TB_TMTB_SECTION) 저장
+			// tmtbSectionSq 생성
+			Integer tmtbSectionSq =  commonService.getNextSequence("SEQ_TMTB_SECTION");
+			regSection.setTbTmtbSectionSq(tmtbSectionSq);
+
+			// 다다익선 조건에 따른 할인혜택(금액할인) 설정(TB_TMTB_VAL) 저장
+			// tmtbValSq 생성
+			Integer tmtbValSq =  commonService.getNextSequence("SEQ_TMTB_VAL");
+			regSection.setTbTmtbValSq(tmtbValSq);
+			regSection.setTmtbSq(tmtb.getTmtbSq());
+			regSection.setRegNo(tmtb.getRegNo());//udpNo UdpNo
+			regSection.setUdpNo(tmtb.getUdpNo());
+
+			marketingDao.saveMorebetterSection(regSection);
+			marketingDao.saveMorebetterVal(regSection);
+		}
+
+		// 다다익선 업체분담율(TB_TMTB_BURDEN) 저장
+		Collection<MoreBetterBurden> burdenList = tmtb.getBurdenListNew();
+		for (MoreBetterBurden regBurden : burdenList) {
+			// tmtbBurdenSq 생성
+			Integer tmtbBurdenSq =  commonService.getNextSequence("SEQ_TMTB_BURDEN");
+			regBurden.setTbTmtbBurdenSq(tmtbBurdenSq);
+			regBurden.setTmtbSq(tmtb.getTmtbSq());
+			regBurden.setRegNo(tmtb.getRegNo());//udpNo UdpNo
+			regBurden.setUdpNo(tmtb.getUdpNo());
+
+			log.info("MoreBetterBurden regBurden ::" +regBurden);
+
+			marketingDao.saveMorebetterBurden(regBurden);
+		}
+
+		log.info("newBurdenSq = {}, newTmtbSq = {}, newSupplyCd = {}, newBurdenRate = {} , newUseYn = {}");
+
+	}
+
+	/**
+	 * 다다익선 다다익선 할인구간 삭제
+	 * @param tmtb
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 5
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteSectionValList(Collection<MoreBetterSection> sectionValList) {
+		for (MoreBetterSection sectionVal : sectionValList) {
+			marketingDao.deleteTmtbSectionList(sectionVal);
+			marketingDao.deleteTmtbValList(sectionVal);
+		}
+	}
 	/* // CSB 진행 */
 }

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

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

+ 10 - 2
style24.admin/src/main/java/com/style24/admin/biz/web/TsaGoodsController.java

@@ -1271,9 +1271,17 @@ public class TsaGoodsController extends TsaBaseController {
 	 */
 	@PostMapping("/wms/incomelot/list")
 	@ResponseBody
-	public Collection<WmsGoods> getGoodsWmsIncomelotList(@RequestBody WmsGoods wmsGoods) {
+	public GagaMap getGoodsWmsIncomelotList(@RequestBody WmsGoods wmsGoods) {
 
-		return goodsService.getGoodsWmsIncomelotList(wmsGoods);
+		GagaMap result = new GagaMap();
+
+		wmsGoods.setPageable(new TsaPageRequest(wmsGoods.getPageNo() - 1, wmsGoods.getPageSize()));
+		wmsGoods.getPageable().setTotalCount(goodsService.getGoodsWmsIncomelotListCount(wmsGoods));
+
+		result.set("pageing", wmsGoods);
+		result.set("goodsList", goodsService.getGoodsWmsIncomelotList(wmsGoods));
+
+		return result;
 	}
 
 	/**

+ 142 - 4
style24.admin/src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -1,16 +1,16 @@
 package com.style24.admin.biz.web;
 
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponse;
 import com.style24.admin.biz.service.*;
 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.TsaPageRequest;
-import com.style24.persistence.domain.CommonCode;
-import com.style24.persistence.domain.Coupon;
-import com.style24.persistence.domain.FreeGoodsPromotion;
+import com.style24.persistence.domain.*;
 
-import com.style24.persistence.domain.MoreBetter;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
@@ -243,6 +243,7 @@ public class TsaMarketingController extends TsaBaseController {
 	@GetMapping("/morebetter/form")
 	public ModelAndView morebetterForm() {
 		ModelAndView mav = new ModelAndView();
+
 		mav.setViewName("marketing/MorebetterListForm");
 		return mav;
 	}
@@ -268,5 +269,142 @@ public class TsaMarketingController extends TsaBaseController {
 
 		return result;
 	}
+
+	/**
+	 * 다다익선 등록 화면
+	 *
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2020. 12. 29
+	 */
+	@ResponseBody
+	@GetMapping("/morebetterRegPopup/form")
+	public ModelAndView morebetterRegForm(MoreBetter tmtb) {
+		ModelAndView mav = new ModelAndView();
+
+		// 상품상태 : 등록일때는 '대기'
+		String[] exceptCds = {"G008_00"};
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
+		log.info("CHECK param goodsStatList>>"+rendererService.getCommonCodeList("G008", "Y", exceptCds));
+
+		// 할인구간 목록
+		mav.addObject("sectionGbList", rendererService.getAvailCommonCodeList("G810"));
+		log.info("CHECK param sectionGbList>>"+rendererService.getAvailCommonCodeList("G810"));
+		// 할인구분 목록
+		mav.addObject("dcWayList", rendererService.getAvailCommonCodeList("G240"));
+		log.info("CHECK param dcWayList>>"+rendererService.getAvailCommonCodeList("G240"));
+
+
+		String tmtbStat = "G232_10";
+		tmtb.setTmtbStat(tmtbStat);
+
+		//tmtb sq 자동생성 추가해야함
+		Integer tmtbSq;
+		tmtbSq =  commonService.getNextSequence("SEQ_TMTB");
+		tmtb.setTmtbSq(tmtbSq);
+
+		mav.addObject("params", tmtb);
+		log.info("CHECK param tmtbSq>>"+tmtb.getTmtbSq());
+		mav.setViewName("marketing/MorebetterRegForm");
+		return mav;
+	}
+
+	/**
+	 * 다다익선 등록
+	 *
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 5
+	 */
+	@PostMapping("/morebetter/save")
+	@ResponseBody
+	public GagaResponse saveMorebetterDetail(@RequestBody MoreBetter tmtb) {
+		Collection<MoreBetterGoods> tmtbCompList = null;
+		Collection<MoreBetterGoods> tmtbBrandList = null;
+		Collection<MoreBetterBurden> tmtbBurdenList = null;
+		Collection<MoreBetterSection> tmtbSectionGbList = null;
+		ObjectMapper mapper = new ObjectMapper();
+
+		/*
+		// 공급업체
+		try {
+			if (tmtb.getSupplyCompList() != null) {
+				tmtbCompList = mapper.readValue(tmtb.getSupplyCompList(), new TypeReference<Collection<MoreBetterComp>>() {
+				});
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		*/
+/*
+		// 브랜드
+		try {
+			if (tmtb.getBrandList() != null) {
+				tmtbBrandList = mapper.readValue(tmtb.getBrandList(), new TypeReference<Collection<MoreBetterBrand>>() {
+				});
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+*/
+		// 할인구간
+		try {
+			if (tmtb.getSectionGbList() != null) {
+				log.info("getSectionGbList here1");
+				tmtbSectionGbList = mapper.readValue(tmtb.getSectionGbList(), new TypeReference<Collection<MoreBetterSection>>() {
+				});
+				log.info("getSectionGbList here2");
+			}
+			log.info("getSectionGbList here123");
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		// 업체분담율
+		try {
+			if (tmtb.getBurdenList() != null) {
+				log.info("here1");
+				tmtbBurdenList = mapper.readValue(tmtb.getBurdenList(), new TypeReference<Collection<MoreBetterBurden>>() {
+				});
+				log.info("here2");
+			}
+			log.info("here123");
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		log.info("tmtb::"+tmtb);
+
+		// html에서 SectionVal -> DcVal 안되서...여기서 set 왜지..?
+		//tmtb.setDcVal(tmtb.getSectionVal());
+
+		//tmtb.setSupplyCompListNew(tmtbCompList);
+		//tmtb.setBrandListNew(tmtbBrandList);
+		tmtb.setSectionGbListNew(tmtbSectionGbList);
+		tmtb.setBurdenListNew(tmtbBurdenList);
+
+		marketingService.saveMoreBetterDetail(tmtb);
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+	/**
+	 * 다다익선 할인구간 삭제
+	 *
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 5
+	 */
+	@PostMapping("/morebetter/sectionVal/delete")
+	@ResponseBody
+	public GagaResponse deleteSectionValList(@RequestBody Collection<MoreBetterSection> sectionValList) {
+		// 추후에 더 개발 ㅠㅠ
+		log.info("[deleteSectionValList]");
+		marketingService.deleteSectionValList(sectionValList);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
 	/* // CSB 진행 */
 }

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

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

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

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

+ 35 - 1
style24.admin/src/main/java/com/style24/persistence/domain/MoreBetter.java

@@ -4,6 +4,8 @@ import com.style24.persistence.TsaPageRequest;
 import com.style24.persistence.TscBaseDomain;
 import lombok.Data;
 
+import java.util.Collection;
+
 /**
  * 품목 Domain
  *
@@ -13,12 +15,13 @@ import lombok.Data;
 @SuppressWarnings("serial")
 @Data
 public class MoreBetter extends TscBaseDomain {
-	// 사은품 프로모션
+	// 다다익선 마스터
 	private int tmtbSq;				// 프로모션ID
 	private String tmtbNm;			// 프로모션명
 	private String tmtbStat;		// 프로모션 상태
 	private String tmtbStdt;		// 프로모션 시작일
 	private String tmtbEddt;		// 프로모션 종료일
+	private String multiYn;			// 복수,단수설정
 	private String delYn;			// 삭제여부
 	private Integer regNo;			// 등록자
 	private String  regDt;			// 등록일시
@@ -28,6 +31,37 @@ public class MoreBetter extends TscBaseDomain {
 	private String searchTxt;		// 프로모션 검색 조건
 	private String gbn;				// 팝업 구분 : C=등록, U=수정
 
+	// 다다익선 할인구간설정 2차조건(TB_TMTB_SECTION)
+	private int tmtbSectionSq;		// 다다익선 할인구간 시퀀스
+	private String sectionGb;		// 구간설정 구분값(G810_10:수량,G810_11:금액)
+	private int sectionVal;		// 구간설정값, 구간할인시작(수량이상, 금액이상)
+
+	// 다다익선 조건에 따른 할인혜택(금액할인)(TB_TMTB_VAL)
+	private int tmtbValSq;			// 다다익선 할인값 시퀀스
+	private String dcWay;			// 할인방식(G240_10:할인금액,G240_11:할인율)
+	private int dcVal;				// 할인값
+
+	// 다다익선 업체분담율(TB_TMTB_BURDEN)
+	private int tbTmtbBurdenSq;		// 업체분담율Sq
+	private String tmtbSupplyCd;	// 업체코드
+	private String tmtbBurdenRate;	// 업체분담율
+	//private String burdenRate;	// 업체분담율
+	private String useYn;			// 사용여부
+
+	private Collection<MoreBetterGoods> supplyCompListNew;
+	private Collection<MoreBetterGoods> brandListNew;
+	private Collection<MoreBetterGoods> applyGoodsListNew;
+	private Collection<MoreBetterGoods> exceptGoodsListNew;
+	private Collection<MoreBetterBurden> burdenListNew;
+	private Collection<MoreBetterSection> sectionGbListNew;
+
+	private String supplyCompList;
+	private String brandList;
+	private String applyGoodsList;
+	private String exceptGoodsList;
+	private String burdenList;
+	private String sectionGbList;
+
 	// Pagination
 	private TsaPageRequest pageable;
 	private int pageNo = 1;

+ 29 - 0
style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterBurden.java

@@ -0,0 +1,29 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+import lombok.Data;
+
+/**
+ * 품목 Domain
+ *
+ * @author bin2107
+ * @since 2021. 1.
+ */
+@SuppressWarnings("serial")
+@Data
+public class MoreBetterBurden extends TscBaseDomain {
+	// 다다익선 업체 분담율
+	private Integer tbTmtbBurdenSq;		// 업체분담율Sq
+	private Integer tmtbSq;				// 프로모션Sq
+	private String tmtbSupplyCd;	// 업체코드
+	private String tmtbBurdenRate;	// 업체분담율
+	private String useYn;			// 사용여부
+	private Integer regNo;			// 등록자
+	private String  regDt;			// 등록일시
+	private Integer udpNo;			// 수정자
+	private String  udtDt;			// 수정일시
+
+	//private String supplyCompCd;
+	private String burdenRate;
+
+}

+ 92 - 0
style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterGoods.java

@@ -0,0 +1,92 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TsaPageRequest;
+import com.style24.persistence.TscBaseDomain;
+import lombok.Data;
+
+import java.util.Collection;
+
+/**
+ * 품목 Domain
+ *
+ * @author bin2107
+ * @since 2021. 1.
+ */
+@SuppressWarnings("serial")
+@Data
+public class MoreBetterGoods extends TscBaseDomain {
+	// 다다익선 적용대상
+	private int tbTmtbGoodsSq;		// 업체분담율Sq
+	private int tmtbSq;				// 프로모션Sq
+	private String goodsGb;
+	private String targetGb;
+	private String targetVal;
+	private String delYn;
+	private Integer regNo;			// 등록자
+	private String  regDt;			// 등록일시
+	private Integer udpNo;			// 수정자
+	private String  udtDt;			// 수정일시
+
+	// 공급업체
+	private String supplyCompCd;
+	private String supplyCompNm;
+	private int provierNo;
+	private String bizGb;				// 사업자구분
+	private String bizNo;				// 사업자번호
+	private String bizKind;				// 업종
+	private String bizType;				// 업태
+	private String ownerNm;				// 대표자명
+	private String bizZipcode;			// 사업장우편번호
+	private String bizBaseAddr;			// 사업장기본주소
+	private String bizDtlAddr;			// 사업장상세주소
+	private String mainTelno;			// 대표전화번호
+	private String mainFaxno;			// 대표팩스번호
+	private String homepageUrl;			// 홈페이지URL
+	private String selfYn;				// 자사여부(Y:자사, N:입점)
+	private String distributionGb;		// 유통구분(공통코드G065)
+	private String shotDelvYn;			// 총알배송여부
+	private String supplyStat;			// 입점상태(공통코드G010)
+	private int minOrdAmt;				// 무료배송비최소주문금액
+	private int delvFee;				// 배송비
+	private float sellFeeRate;			// 판매수수료율
+	private String settleDay;			// 정산일(매월)
+	private String bankCd;				// 은행코드
+	private String accountNo;			// 계좌번호
+	private String depositorNm;			// 예금주명
+	private String csChargeNm;			// CS담당자명
+	private String csChargeTelno;		// CS담당자전화번호
+	private String settleChargeNm;		// 정산담당자명
+	private String settleChargeTelno;	// 정산담당자전화번호
+	private String settleChargeEmail;	// 정산담당자이메일
+	private String billEmail;			// 계산서이메일
+	private String econtractYn;			// 전자계약여부
+	private String remarks;				// 비고
+	private String supplyStatNm;		// 입점상태명
+
+	// 브랜드
+	private String brandGb;			// 브랜드구분
+	private String brandCd;			// 브랜드코드
+	private String brandEnm;		// 브랜드영문명
+	private String brandKnm;		// 브랜드한글명
+	private String dispNmLang;		// 노출명언어
+	private String rgbCd;			// RGB코드(front 브랜드메인 GNB 색상)
+	private String brandGrpNm;		// 브랜드그룹명
+	private String delvLocCd;		// 출고처코드(출고처)
+	private String delvLocNm;		// 출고처명
+	private String erpBrandCd;		// ERP브랜드코드
+	private String delvFeeCd;		// 배송비정책코드
+	private float pntPrate10;		// 포인트적립율(PC정상)
+	private float pntMrate10;		// 포인트적립율(모바일정상)
+	private float pntPrate20;		// 포인트적립율(PC이월)
+	private float pntMrate20;		// 포인트적립율(모바일이월)
+	private String logoFileNm;		// 로고파일명
+	private int dispOrd;			// 표시순서
+	private String useYn;			// 사용여부(Y:사용)
+	private int brandNo;			// 브랜드번호(WMS 연동용)
+	private String newSysFileNm;	//신규이미지파일명
+
+	// 검색조건
+	private String searchGb;			// 검색구분
+	private String searchTxt;			// 검색어
+	private String callbackFn;			// 콜백함수
+}

+ 32 - 0
style24.admin/src/main/java/com/style24/persistence/domain/MoreBetterSection.java

@@ -0,0 +1,32 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+import lombok.Data;
+
+/**
+ * 품목 Domain
+ *
+ * @author bin2107
+ * @since 2021. 1.
+ */
+@SuppressWarnings("serial")
+@Data
+public class MoreBetterSection extends TscBaseDomain {
+	// 다다익선 상품
+	private Integer tmtbSq;
+	private Integer tbTmtbSectionSq;	// 업체분담율Sq
+	private Integer tbTmtbValSq;		// 업체분담율Sq
+
+	private String  sectionGb;		// 구간설정구분값(G810_10:수량,G810_11:금액)
+	private Integer sectionVal;		// 구간설정값/구간할인시작(수량이상,금액이상)
+
+	private String  dcWay;			// 할인방식(G240_10:할인금액,G240_11:할인율)
+	private Integer dcVal;			// 할인값
+
+	private String  delYn;			// 삭제여부
+	private Integer regNo;			// 등록자
+	private String  regDt;			// 등록일시
+	private Integer udpNo;			// 수정자
+	private String  udtDt;			// 수정일시
+
+}

+ 10 - 4
style24.admin/src/main/java/com/style24/persistence/domain/WmsGoods.java

@@ -1,5 +1,6 @@
 package com.style24.persistence.domain;
 
+import com.style24.persistence.TsaPageRequest;
 import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
@@ -17,10 +18,6 @@ public class WmsGoods extends TscBaseDomain {
 	private Integer productNo;		//wms상품번호
 	private int productCode;		//wms상품코드
 	private String productName;		//상품명
-	private String skucode;			//옵션번호
-	private int normalQty;			//일반수량
-	private int brokenQty;			//불량수량
-	private int totalQty;			//총수량
 	private String modelNo;			//모델번호
 	private int providerNo;			//공급처번호
 	private String providerName;	//공급처명
@@ -35,4 +32,13 @@ public class WmsGoods extends TscBaseDomain {
 	private String stDate;
 	private String edDate;
 
+	private int startRow;
+	private int endRow;
+	private String goodsPriceYn;
+	// Pagination
+	private TsaPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
+
 }

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

@@ -449,4 +449,106 @@
 		FROM   VW_CATE_4SRCH
 	</insert>
 	
+	<!-- 카테고리구분 목록 -->
+	<select id="getCategoryGbList" parameterType="String" resultType="Category">
+		/* TsaDisplay.getCategoryGbList */
+		SELECT CATE_GB                                        /*카테고리구분*/
+		     , LEAF_CATE_NO                    AS CATE_NO     /*카테고리번호*/
+		     , CASE WHEN LEAF_CATE_NO = CATE5_NO THEN CATE5_NM
+		            WHEN LEAF_CATE_NO = CATE4_NO THEN CATE4_NM
+		            WHEN LEAF_CATE_NO = CATE3_NO THEN CATE3_NM
+		            WHEN LEAF_CATE_NO = CATE2_NO THEN CATE2_NM
+		            WHEN LEAF_CATE_NO = CATE1_NO THEN CATE1_NM
+		       END                             AS CATE_NM     /*카테고리명*/
+		     , FULL_CATE_NO                                   /*FULL카테고리번호*/
+		     , FULL_CATE_NM                                   /*FULL카테고리명*/
+		     , CASE WHEN LEAF_CATE_NO = CATE5_NO THEN 5
+		            WHEN LEAF_CATE_NO = CATE4_NO THEN 4
+		            WHEN LEAF_CATE_NO = CATE3_NO THEN 3
+		            WHEN LEAF_CATE_NO = CATE2_NO THEN 2
+		            WHEN LEAF_CATE_NO = CATE1_NO THEN 1
+		       END                             AS CLS_LVL     /*분류레벨*/
+		     , REPLACE(FULL_CATE_NO,' > ','/') AS TREE_PATH   /*AG-GRID트리패스(ag-Grid미사용시 필요 없음)*/
+		FROM   TB_CATE_4SRCH C4
+		WHERE  CATE_GB = #{cateGb}
+		AND    CATE_TYPE = 'G031_10' /*상품분류카테고리*/
+		ORDER  BY DISP_ORD
+	</select>
+	
+	<!-- 품목카테고리매핑 생성  -->
+	<insert id="createItemkindCategoryMapping" parameterType="ItemkindCategory">
+		/* TsaDisplay.createItemkindCategoryMapping */
+		INSERT INTO TB_ITEMKIND_CATE (
+		       ITEMKIND_CD
+		     , CATE_NO
+		     , REG_NO
+		     , REG_DT
+		)
+		VALUES (
+		       #{itemkindCd}
+		     , #{cateNo}
+		     , #{regNo}
+		     , NOW()
+		)
+	</insert>
+	
+	<!-- 품목카테고리매핑에 의한 카테고리상품 생성  -->
+	<insert id="createCategoryGoodsByItemkindCategoryMapping" parameterType="ItemkindCategory">
+		/* TsaDisplay.createCategoryGoodsByItemkindCategoryMapping */
+		INSERT INTO TB_CATE_GOODS (
+		       CATE_NO
+		     , GOODS_CD
+		     , DISP_ORD
+		     , REG_NO
+		     , REG_DT
+		)
+		SELECT #{cateNo} AS CATE_NO
+		     , GOODS_CD
+		     , 100       AS DISP_ORD
+		     , #{regNo}  AS REG_NO
+		     , NOW()     AS REG_DT
+		FROM   TB_GOODS A
+		WHERE  ITEMKIND_CD = #{itemkindCd}
+		AND    GOODS_STAT NOT IN ('G008_95','G008_99') /*시즌아웃,DROP(삭제)가 아닌넘*/
+		AND    NOT EXISTS (SELECT 1
+		                   FROM   TB_CATE_GOODS
+		                   WHERE  CATE_NO = #{cateNo}
+		                   AND    GOODS_CD = A.GOODS_CD
+		                  )
+	</insert>
+
+	<!-- 품목카테고리매핑 삭제  -->
+	<delete id="deleteItemkindCategoryMapping" parameterType="ItemkindCategory">
+		/* TsaDisplay.deleteItemkindCategoryMapping */
+		DELETE FROM TB_ITEMKIND_CATE
+		WHERE  ITEMKIND_CD = #{itemkindCd}
+		AND    CATE_NO = #{cateNo}
+	</delete>
+	
+	<!-- 품목카테고리매핑에 의한 카테고리상품 삭제  -->
+	<delete id="deleteCategoryGoodsByItemkindCategoryMapping" parameterType="ItemkindCategory">
+		/* TsaDisplay.deleteCategoryGoodsByItemkindCategoryMapping */
+		DELETE FROM TB_CATE_GOODS
+		WHERE  CATE_NO = #{cateNo}
+		AND    GOODS_CD IN (SELECT GOODS_CD
+		                    FROM   TB_GOODS
+		                    WHERE  ITEMKIND_CD = #{itemkindCd}
+		                   )
+	</delete>
+	
+	<!-- 품목카테고리매핑 목록 -->
+	<select id="getItemkindCategoryMappingList" parameterType="String" resultType="ItemkindCategory">
+		/* TsaDisplay.getItemkindCategoryMappingList */
+		SELECT IC.ITEMKIND_CD             /*품목코드*/
+		     , C4.CATE_GB                 /*카테고리구분*/
+		     , C4.LEAF_CATE_NO AS CATE_NO /*카테고리번호*/
+		     , C4.FULL_CATE_NO            /*FULL카테고리번호*/
+		     , C4.FULL_CATE_NM            /*FULL카테고리명*/
+		FROM   TB_ITEMKIND_CATE IC
+		     , TB_CATE_4SRCH C4
+		WHERE  IC.CATE_NO = C4.LEAF_CATE_NO
+		AND    IC.ITEMKIND_CD = #{itemkindCd}
+		ORDER  BY C4.CATE_GB, C4.LEAF_CATE_NO
+	</select>
+	
 </mapper>

+ 35 - 5
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -3650,16 +3650,44 @@
 		WHERE PRODUCT_NO = #{productNo}
 	</update>
 	
+	<!-- WMS입고상품 목록 건수 -->
+	<select id="getGoodsWmsIncomelotListCount" parameterType="WmsGoods" resultType="int">
+		/* TsaGoods.getGoodsWmsIncomelotListCount */
+		SELECT COUNT(*)
+		FROM TB_WMS_GOODS A
+		LEFT OUTER JOIN TB_BRAND B ON A.BRAND_NO = B.BRAND_NO 
+		LEFT OUTER JOIN TB_SUPPLY_COMPANY S ON A.PROVIDER_NO = S.PROVIDER_NO
+		WHERE GOODS_REG_GB IS NULL   /* 온라인 미등록 상품 */
+		<if test="modelNo != null and modelNo != ''">
+		AND UPPER(A.MODEL_NO) LIKE CONCAT('%',UPPER(#{modelNo}),'%') 
+		</if>
+		<if test="stDate != null and stDate != ''">
+		AND A.REG_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		</if>
+		<if test="edDate != null and edDate != ''">
+		<![CDATA[
+		AND A.REG_DT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		]]>
+		</if>
+		<if test="supplyCompCd != null and supplyCompCd != ''">
+		AND UPPER(S.SUPPLY_COMP_CD) = UPPER(#{supplyCompCd}) 
+		</if>
+		<if test="brandCd != null and brandCd != ''">
+		AND UPPER(B.BRAND_CD) = UPPER(#{brandCd}) 
+		</if>
+		ORDER BY A.UPD_DT DESC
+	</select>
+	
 	<!-- WMS입고상품 목록 -->
 	<select id="getGoodsWmsIncomelotList" parameterType="WmsGoods" resultType="WmsGoods">
 		/* TsaGoods.getGoodsWmsIncomelotList */
+		SELECT Q.* FROM (
+		SELECT Z.* FROM (
+		SELECT A.*, @rownum := @rownum + 1 AS RNUM 
+		    FROM (
 		SELECT A.PRODUCT_NO
 		     , A.PRODUCT_CODE
 		     , A.PRODUCT_NAME
-		     , A.SKUCODE
-		     , A.NORMAL_QTY
-		     , A.BROKEN_QTY
-		     , A.TOTAL_QTY
 		     , A.MODEL_NO
 		     , A.PROVIDER_NO
 		     , A.PROVIDER_NAME
@@ -3676,11 +3704,12 @@
 		     , FN_GET_USER_NM(A.UPD_NO) AS UPD_NM
 		     , DATE_FORMAT(A.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
 		FROM TB_WMS_GOODS A
+		JOIN ( SELECT @rownum := 0) R
 		LEFT OUTER JOIN TB_BRAND B ON A.BRAND_NO = B.BRAND_NO 
 		LEFT OUTER JOIN TB_SUPPLY_COMPANY S ON A.PROVIDER_NO = S.PROVIDER_NO
 		WHERE GOODS_REG_GB IS NULL   /* 온라인 미등록 상품 */
 		<if test="modelNo != null and modelNo != ''">
-		AND UPPER(A.MODEL_NO) = CONCAT('%',UPPER(#{modelNo}),'%') 
+		AND UPPER(A.MODEL_NO) LIKE CONCAT('%',UPPER(#{modelNo}),'%') 
 		</if>
 		<if test="stDate != null and stDate != ''">
 		AND A.REG_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
@@ -3697,6 +3726,7 @@
 		AND UPPER(B.BRAND_CD) = UPPER(#{brandCd}) 
 		</if>
 		ORDER BY A.UPD_DT DESC
+		<include refid="getListPagingCondition_sql"/>
 	</select>
 	
 	<!-- 사은품 등록 -->

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

@@ -137,6 +137,7 @@
 
 	<!-- // CSB 진행 -->
 	<select id="getMorebetterList" parameterType="MoreBetter" resultType="MoreBetter">
+		/* TsaMarketing.getMorebetterList */
 		SELECT TMTB_SQ
 			 , TMTB_NM
 			 , FN_GET_CODE_NM('G232',TMTB_STAT) as TMTB_STAT
@@ -150,8 +151,8 @@
 		FROM TB_TMTB
 		WHERE 1=1
 		<if test="tmtbStdt != null and tmtbStdt != '' and tmtbEddt != null and tmtbEddt != ''">
-			AND TMTB_ST_DT >= DATE_FORMAT(#{tmtbStdt} , '%Y-%m-%d')
-			AND TMTB_ED_DT <![CDATA[ <= ]]> DATE_FORMAT(#{tmtbEddt} , '%Y-%m-%d')
+			AND DATE_FORMAT(TMTB_ST_DT,'%Y%m%d%H%i%S') >= DATE_FORMAT(#{tmtbStdt} , '%Y%m%d%H%i%S')
+			AND DATE_FORMAT(TMTB_ED_DT,'%Y%m%d%H%i%S') <![CDATA[ <= ]]> DATE_FORMAT(#{tmtbEddt} , '%Y%m%d%H%i%S')
 		</if>
 		<if test="searchTxt != null and searchTxt != ''">
 			<if test="searchGubun != null and searchGubun == 'tmtbSq'">
@@ -163,5 +164,121 @@
 		</if>
 		ORDER BY REG_DT DESC
 	</select>
+
+	<insert id="saveMorebetterMst" parameterType="MoreBetter" >
+		/* TsaMarketing.saveMorebetterMst */
+		INSERT INTO TB_TMTB(
+					 TMTB_SQ
+					,TMTB_NM
+					,TMTB_STAT
+					,TMTB_ST_DT
+					,TMTB_ED_DT
+					,MULTI_YN
+					,DEL_YN
+					,REG_NO
+					,REG_DT
+					,UDP_NO
+					,UDT_DT
+			)
+			VALUES (
+			         #{tmtbSq}
+					,#{tmtbNm}
+				    ,#{tmtbStat}
+				    ,#{tmtbStdt}
+				    ,#{tmtbEddt}
+				    ,#{multiYn}
+				    ,'N'
+				    ,#{regNo}
+				    ,NOW()
+				    ,#{udpNo}
+				    ,NOW()
+				   )
+	</insert>
+
+	<insert id="saveMorebetterSection" parameterType="MoreBetterSection" >
+		/* TsaMarketing.saveMorebetterSection */
+		INSERT INTO TB_TMTB_SECTION(
+					 TMTB_SECTION_SQ
+					,TMTB_SQ
+					,SECTION_GB
+					,SECTION_VAL
+					,DEL_YN
+					,REG_NO
+					,REG_DT
+					,UDP_NO
+					,UDT_DT
+			)
+			VALUES (
+					 #{tbTmtbSectionSq}
+					,#{tmtbSq}
+					,#{sectionGb}
+				    ,#{sectionVal}
+				    ,'N'
+				    ,#{regNo}
+				    ,NOW()
+				    ,#{udpNo}
+				    ,NOW()
+				   )
+	</insert>
+
+	<insert id="saveMorebetterVal" parameterType="MoreBetterSection" >
+		/* TsaMarketing.saveMorebetterVal */
+		INSERT INTO TB_TMTB_VAL(
+					 TMTB_VAL_SQ
+					,TMTB_SQ
+					,TMTB_SECTION_SQ
+					,DC_WAY
+					,DC_VAL
+					,DEL_YN
+					,REG_NO
+					,REG_DT
+					,UDP_NO
+					,UDT_DT
+			)
+			VALUES (
+					#{tbTmtbValSq}
+				   ,#{tmtbSq}
+				   ,#{tbTmtbSectionSq}
+				   ,#{dcWay}
+				   ,#{dcVal}
+				   ,'N'
+				   ,#{regNo}
+				   ,NOW()
+				   ,#{udpNo}
+				   ,NOW()
+				   )
+	</insert>
+
+	<insert id="saveMorebetterBurden" parameterType="MoreBetterBurden" >
+		/* TsaMarketing.saveMorebetterBurden */
+		INSERT INTO TB_TMTB_BURDEN(
+					 TB_TMTB_BURDEN_SQ
+					,TMTB_SQ
+					,TMTB_SUPPLY_CD
+					,TMTB_BURDEN_RATE
+					,USE_YN
+					,REG_NO
+					,REG_DT
+					,UDP_NO
+					,UDT_DT
+			)
+			VALUES (
+			         #{tbTmtbBurdenSq}
+			        ,#{tmtbSq}
+			        ,#{tmtbSupplyCd}
+			        ,#{tmtbBurdenRate}
+			        ,#{useYn}
+				    ,#{regNo}
+				    ,NOW()
+				    ,#{udpNo}
+				    ,NOW()
+				   )
+		ON DUPLICATE KEY UPDATE
+					 TMTB_SUPPLY_CD = #{tmtbSupplyCd}
+					,TMTB_BURDEN_RATE = #{tmtbBurdenRate}
+					,USE_YN = #{useYn}
+					,UDP_NO = #{udpNo}
+					,UDT_DT = NOW()
+	</insert>
 	<!--// CSB 진행 -->
 </mapper>

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

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

+ 32 - 1
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsWmsIncomelotForm.html

@@ -72,6 +72,15 @@
 			<ul class="panelBar">
 				<li class="right">
 					<button type="button" class="btn btn-primary btn-lg"  id="btnCreateFreeGoods">사은품 등록</button>
+					검색결과 : <strong><span id="gridRowTotalCount">0</span> 건</strong>&nbsp;
+					쪽번호 <span id="pgNo">0</span>/ <strong id="endPgNo">0</strong>&nbsp;&nbsp;
+					<select id="pageSize" name="pageSize">
+						<option value="50" selected="selected">50개씩 보기</option>
+						<option value="100">100개씩 보기</option>
+						<option value="500">500개씩 보기</option>
+						<option value="1000">1000개씩 보기</option>
+					</select>
+					<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
 				</li>
 			</ul>
 			<!-- 검색결과 영역 -->
@@ -151,6 +160,7 @@
 	
 	// 조회클릭시
 	$('#btnSearch').on('click', function() {
+		$("#goodsWmsIncomelotForm input[name=pageNo]").val('1');
 		fnGoodsWmsIncomelotListSearch('BASIC');
 	});
 
@@ -165,9 +175,30 @@
 		
 		if(!fnConditionCheck()) return;
 		
-		gagaAgGrid.fetch($('#goodsWmsIncomelotForm').prop('action'), gridOptions, '#goodsWmsIncomelotForm');
+		//gagaAgGrid.fetch($('#goodsWmsIncomelotForm').prop('action'), gridOptions, '#goodsWmsIncomelotForm');
+		
+		gagaPaging.init('goodsWmsIncomelotForm', fnSearchCallBack, 'goodsListPagination', $('#goodsWmsIncomelotForm').find('#pageSize').val());
+		gagaPaging.load($("#goodsWmsIncomelotForm input[name=pageNo]").val());
 	}
 
+	var fnSearchCallBack = function(result){
+
+		$('#goodsWmsIncomelotForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
+		$('#goodsWmsIncomelotForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
+		$('#goodsWmsIncomelotForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
+		$('#goodsWmsIncomelotForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
+		gridOptions.api.setRowData(result.goodsList);
+		gagaPaging.createPagination(result.pageing.pageable);
+		
+	}
+	
+	//페이징
+	$('#goodsWmsIncomelotForm select[name=pageSize]').on('change', function() {
+		$("#goodsWmsIncomelotForm input[name=pageNo]").val('1');
+		fnGoodsWmsIncomelotListSearch($("#goodsWmsIncomelotForm input[name=searchGb]").val());
+	});
+	
+	
 	//검색 조건 확인
 	var fnConditionCheck = function(){
 		var formId = '#goodsWmsIncomelotForm';

+ 4 - 4
style24.admin/src/main/webapp/WEB-INF/views/marketing/MorebetterListForm.html

@@ -89,7 +89,7 @@
 				</ul>
 				<div class="panelBar">
 					<div class="right">
-						<button type="button" class="btn btn-info btn-lg" id="btnFreeGoodsRegi" >프로모션등록</button>
+						<button type="button" class="btn btn-info btn-lg" id="btnMorebetterReg" >다다익선 등록</button>
 					</div>
 				</div>
 				<!-- 검색결과 영역 -->
@@ -103,7 +103,7 @@
 	var columnDefs = [];
 	columnDefs = [
 		{headerName: "프로모션ID", field: "tmtbSq", width: 80, cellClass: 'text-center'},
-		{headerName: "프로모션명", field: "tmtbNm", width: 130, cellClass: 'text-center'},
+		{headerName: "프로모션명", field: "tmtbNm", width: 200, cellClass: 'text-center'},
 		{headerName: "상태", field: "tmtbStat", width: 140, cellClass: 'text-center'},
 		{headerName: "시작일", field: "tmtbStdt", width: 140, cellClass: 'text-center'},
 		{headerName: "종료일", field: "tmtbEddt", width: 140, cellClass: 'text-center'},
@@ -205,8 +205,8 @@
 		
 	}
 
-	// 조회클릭시
-	$('#btnMorebetterRegi').on('click', function() {
+	// 등록클릭시
+	$('#btnMorebetterReg').on('click', function() {
 		cfnOpenMorebetterSetPopup();
 	});
 

+ 736 - 0
style24.admin/src/main/webapp/WEB-INF/views/marketing/MorebetterRegForm.html

@@ -0,0 +1,736 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : MorebetterRegForm.html
+ * @desc    : 다다익선 등록 화면
+ *============================================================================
+ * SISUN
+ * Copyright(C) 2019 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.12.29   bin2107     최초 작성
+ *******************************************************************************
+ -->	
+	<div class="modalPopup frGoodsPro" data-width="1100">
+		<div class="panelStyle" style="max-height:900px;overflow-y:scroll;">
+			<div class="panelTitle">
+				<h2>다다익선 등록</h2>
+				<button type="button" class="close" onclick="fnMorebetterFormClose()"><i class="fa fa-times"></i></button>
+			</div>
+
+			<form id="moreBetterForm" name="moreBetterForm" action="#" th:action="@{'/marketing/morebetter/save'}"> <!--th:method="post" >-->
+				<input type="hidden" name="gbn" th:value="${params.gbn}" />				<!-- 신규/수정 구분 -->
+				<input type="hidden" name="supplyCompList"/>			<!-- 공급업체 리스트 -->
+				<input type="hidden" name="brandList"/>					<!-- 브랜드 리스트 -->
+				<input type="hidden" name="applyGoodsList"/>			<!-- 적용상품 리스트 -->
+				<input type="hidden" name="exceptGoodsList"/>			<!-- 제외상품 리스트 -->
+				<input type="hidden" name="burdenList"/>				<!-- 업체 분담율 리스트 -->
+				<input type="hidden" name="sectionGbList"/>				<!-- 다다익선 구간/혜택 리스트 -->
+
+				<div class="panelContent">
+					<ul class="notice">
+						<li>구성상품 등록시 기본값&nbsp;
+							<!-- 아이콘 툴팁 -->
+							<div class="iconTooltip">
+								<i class="fa fa-info" aria-hidden="true"></i>
+								<span class="left" style="width:400px; text-align:left;">
+									<!-- class="left" 또는 class="right" -->
+									- 상품상태 : 정보부족<br/>
+									- 정상가 : 구성상품의 정상가 합<br/>
+									- 판매가 : 구성상품 판매가 입력값의 합<br/>
+									- 브랜드코드 : 구성상품의 기준여부 'Y'상품의 브랜드코드<br/>
+									- 품목코드 : 구성상품의 기준여부 'Y'상품의 품목코드<br/>
+									- 포인트 : 구성상품의 기준여부 'Y'상품의 브랜드 포인트<br/>
+									- 배송비정책 : 구성상품의 기준여부 'Y'상품의 브랜드 배송비정책<br/>
+								</span>
+							</div>
+							<!-- //아이콘 툴팁 -->
+						</li>
+					</ul>
+					<table class="frmStyle">
+						<colgroup>
+							<col width="10%"/>
+							<col width="40%"/>
+							<col width="10%"/>
+							<col width="40%"/>
+						</colgroup>
+						<tr>
+							<th>프로모션명<em class="required" title="필수"></em></th>
+							<td>
+								<!-- 수정시 프로모션명 입력 : before -->
+								<input class="w50p" type="text" id="tmtbNm" name="tmtbNm" maxlength="30" required="required" data-valid-name="프로모션명"/>
+							</td>
+							<th>프로모션ID</th>
+							<td>
+								<!-- 프로모션 ID 입력 : before -->
+								<input class="w50p" type="text" id="disTmtbSq" name="disTmtbSq" maxlength="30" th:value="${params.tmtbSq}"  disabled=""/>
+								<input type="hidden" id="tmtbSq" name="tmtbSq"/>
+							</td>
+						</tr>
+						<tr>
+							<th>행사 기간<em class="required" title="필수"></em></th>
+							<td>
+								<input type="text" class="schDate w100" name="tmtbStdt" maxlength="10" required="required" data-valid-name="시작일자"/>
+								~
+								<input type="text" class="schDate w100" name="tmtbEddt" maxlength="10" required="required" data-valid-name="종료일자"/>
+							</td>
+							<th>상태</th>
+							<td>
+								<!-- 상태 입력 : before -->
+								<input class="w50p" type="text" id="disTmtbStat" name="disTmtbStat" maxlength="30" th:value="${params.tmtbStat}" disabled=""/>
+								<input type="hidden" id="tmtbStat" name="tmtbStat"/>
+							</td>
+						</tr>
+						<tr>
+							<th>할인 구간<em class="required" title="필수"></em></th>
+							<td>
+								<label class="rdoBtn"><input type="radio" name="sectionGb" id="sectionGbQty" value="G810_10" checked="checked"/>수량</label>
+								<label class="rdoBtn"><input type="radio" name="sectionGb" id="sectionGbAmt" value="G810_11"/>금액</label>
+							</td>
+							<th>할인 구분<em class="required" title="필수"></em></th>
+							<td>
+								<label class="rdoBtn"><input type="radio" name="dcWay" id="dcWayQty" value="G240_10" checked="checked"/>할인금액</label>
+								<label class="rdoBtn"><input type="radio" name="dcWay" id="dcWayAmt" value="G240_11"/>할인율</label>
+							</td>
+						</tr>
+						<tr>
+							<th>상품여부<em class="required" title="필수"></em></th>
+							<td>
+								<label class="rdoBtn"><input type="radio" name="multiYn" id="multiYnY" value="Y" checked="checked"/>복합상품</label>
+								<label class="rdoBtn"><input type="radio" name="multiYn" id="multiYnN" value="N"/>단일상품</label>
+							</td>
+
+						</tr>
+
+					</table>
+				</div>
+
+				<div class="panelStyle" style="margin:unset;">
+					<!-- TITLE -->
+					<div class="panelTitle">
+						<h2>적용 대상 상품 등록</h2>
+						<span class="panelControl">
+							<i class="fa inner-fa-chevron-up"></i>    <!-- 열림/닫힘 화살표 -->
+						</span>
+					</div>
+					<!-- //TITLE -->
+					<div class="inner-panelContent">
+						<!--<div><i class="fa fa-info-circle"></i> 브랜드/공급업체/상품 중 1가지는 필수로 지정하셔야 합니다.</div>
+						<div><i class="fa fa-info-circle"></i> 브랜드와 공급업체는 지정 시, 해당 브랜드의 공급처와 같은 AND조건으로 적용됩니다.(예시:A브랜드 상품 중 B업체 상품만)</div>
+						<div><i class="fa fa-info-circle"></i> 공급업체와 브랜드를 적용하시더라도 적용상품은 별개로 등록된 상품을 기준으로 사은품 지급기준으로 적용하실 수 있습니다.</div>-->
+
+						<div class="panelContent">
+							<table class="frmStyle">
+								<colgroup>
+									<col width="10%"/>
+									<col width="90%"/>
+								</colgroup>
+								<tr>
+									<th>공급업체/브랜드</th>
+									<td>
+										<!-- 수정시 프로모션명 입력 : before -->
+										<div class="padding10 wid45">
+											<span>공급업체 설정</span>
+											<div class="padding10 inner-tb-solid">
+												<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddCompany">업체 추가</button>
+												<button type="button" class="btn btnRight btn-success btn-lg" id="btnDeleteCompany">선택삭제</button>
+												<span>선택 : 00개</span>
+												<br/>
+												<div id="gridFGPromotionCompanyList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+											</div>
+										</div>
+										<div class="padding10 wid45">
+											<span>브랜드 설정</span>
+											<div class="padding10 inner-tb-solid">
+												<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddBrand">브랜드 추가</button>
+												<button type="button" class="btn btnRight btn-success btn-lg" id="btnDeleteBrand">선택삭제</button>
+												<span>선택 : 00개</span>
+												<br/>
+												<!-- 브랜드 선택 팝업(단수 선택 팝업... 복수를 새로 만들어야하는지 ? 아니면 변수처리해야하는지 ? -->
+												<div id="gridFGBrandList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+											</div>
+										</div>
+									</td>
+								</tr>
+								<tr>
+									<th>적용상품</th>
+									<td>
+										<div class="padding10">
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddApplyGoods">상품 추가</button>
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnDeleteApplyGoods">선택삭제</button>
+											<span>선택 : 00개</span>
+											<br/>
+											<div id="gridFGApplyGoodsList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+										</div>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</div>
+				</div>
+
+				<div class="panelStyle" style="margin:unset;">
+					<!-- TITLE -->
+					<div class="panelTitle">
+						<h2>제외 대상 상품</h2>
+						<span class="panelControl">
+							<i class="fa inner-fa-chevron-up"></i>    <!-- 열림/닫힘 화살표 -->
+						</span>
+					</div>
+					<!-- //TITLE -->
+					<div class="inner-panelContent">
+						<div class="panelContent">
+							<table class="frmStyle">
+								<colgroup>
+									<col width="10%"/>
+									<col width="90%"/>
+								</colgroup>
+								<tr>
+									<th>제외 대상</th>
+									<td>
+										<div class="padding10">
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddExceptGoods">상품 추가</button>
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnDeleteExtGoods">선택삭제</button>
+											<span>선택 : 00개</span>
+											<br/>
+											<div id="gridFGExceptGoodsList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+										</div>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</div>
+				</div>
+
+				<div class="panelStyle" style="margin:unset;">
+					<!-- TITLE -->
+					<div class="panelTitle">
+						<h2>할인 구간</h2>
+						<span class="panelControl">
+						<i class="fa inner-fa-chevron-up"></i>    <!-- 열림/닫힘 화살표 -->
+					</span>
+					</div>
+					<!-- //TITLE -->
+					<div class="inner-panelContent">
+						<div class="panelContent">
+							<table class="frmStyle">
+								<colgroup>
+									<col width="10%"/>
+									<col width="90%"/>
+								</colgroup>
+								<tr>
+									<th>할인 구간</th>
+									<td>
+										<div class="padding10">
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddSectionRow">행추가</button>
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnDelSectionRow">행삭제</button>
+											<span>선택 : 00개</span>
+											<br/>
+											<div id="gridSectionGbList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+										</div>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</div>
+				</div>
+
+				<div class="panelStyle" style="margin:unset;">
+					<!-- TITLE -->
+					<div class="panelTitle">
+						<h2>업체 분담율</h2>
+						<span class="panelControl">
+						<i class="fa inner-fa-chevron-up"></i>    <!-- 열림/닫힘 화살표 -->
+					</span>
+					</div>
+					<!-- //TITLE -->
+					<div class="inner-panelContent">
+						<div class="panelContent">
+							<table class="frmStyle">
+								<colgroup>
+									<col width="10%"/>
+									<col width="90%"/>
+								</colgroup>
+								<tr>
+									<th>업체 분담율</th>
+									<td>
+										<div class="padding10">
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddApplyBurden">업체추가</button>
+											<button type="button" class="btn btnRight btn-success btn-lg" id="btnDelApplyBurden">선택삭제</button>
+											<span>선택 : 00개</span>
+											<br/>
+											<div id="gridApplyBurdenList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+										</div>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</div>
+				</div>
+			</form>
+
+			<ul class="panelBar">
+				<li  class="right">
+					<!-- <th:block th:if="${sessionInfo.roleCd == 'G001_0000' OR sessionInfo.roleCd == 'G001_A000' OR sessionInfo.roleCd == 'G001_A101' OR sessionInfo.roleCd == 'G001_A100' OR sessionInfo.roleCd == 'G001_A001'}"> -->
+						<!--<button type="button" class="btn btnRight btn-success btn-lg" id="btnSearchList">목록</button>-->
+						<button type="button" class="btn btnRight btn-success btn-lg" id="btnMorebetterSave">저장</button>
+					<!--<button type="button" class="btn btnRight btn-success btn-lg" id="btnChangeStatIng">진행</button>
+                    	<button type="button" class="btn btnRight btn-success btn-lg" id="btnPromotionDelete">삭제</button>
+                    	<button type="button" class="btn btnRight btn-success btn-lg" id="btnPromotionStop">중지</button>-->
+                	<!-- </th:block> -->
+				</li>
+			</ul>
+		</div>	
+	</div>
+
+	<script th:inline="javascript">
+		var FGAddGoodsStatList = gagajf.convertToArray([[${goodsStatList}]]);		// 상품 상태 리스트
+		var sectionGbList = gagajf.convertToArray([[${sectionGbList}]]);	// 할인구간 리스트
+		var dcWayList = gagajf.convertToArray([[${dcWayList}]]);	// 할인구분 리스트
+
+		// 공급업체 리스트 설정
+		var columnFGCompanyList = [
+			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{headerName: "공급처ID", field: "supplyCompCd", width: 120, cellClass: 'text-center'},
+			{headerName: "공급업체명", field: "supplyCompNm", width: 150, cellClass: 'text-center'}
+		];
+		// 브랜드 리스트 설정
+		var columnBrandList = [
+			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{headerName: "브랜드ID", field: "brandCd", width: 120, cellClass: 'text-center'},
+			{headerName: "공급업체명", field: "brandEnm", width: 150, cellClass: 'text-center'}
+		];
+		// 적용상품 리스트 설정
+		var columnApplyGoodsList = [
+			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{headerName: "Product ID", field: "goodsCd", width: 120, cellClass: 'text-center'},
+			{headerName: "브랜드명", field: "brandEnm", width: 150, cellClass: 'text-center'},
+			{headerName: "상품명", field: "goodsNm", width: 120, cellClass: 'text-center'},
+			{headerName: "판매상태", field: "goodsStat" , width: 120, cellClass: 'text-center',
+				cellEditorParams: { values: gagaAgGrid.extractValues(FGAddGoodsStatList) },
+				valueFormatter: function (params) { return gagaAgGrid.lookupValue(FGAddGoodsStatList, params.value); },
+				valueParser: function (params) { return gagaAgGrid.lookupKey(FGAddGoodsStatList, params.newValue); }
+			},
+			{headerName: "정상가", field: "listPrice", width: 120, cellClass: 'text-center', valueFormatter: function(params) {return params.value.addComma();}},
+			{headerName: "판매가", field: "currPrice", width: 120, cellClass: 'text-center', valueFormatter: function(params) {return params.value.addComma();}}
+		];
+		// 제외상품 리스트 설정
+		var columnExceptGoodsList = [
+			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{headerName: "Product ID", field: "goodsCd", width: 120, cellClass: 'text-center'},
+			{headerName: "브랜드명", field: "brandEnm", width: 150, cellClass: 'text-center'},
+			{headerName: "상품명", field: "goodsNm", width: 120, cellClass: 'text-center'},
+			{headerName: "판매상태", field: "goodsStat" , width: 120, cellClass: 'text-center',
+				cellEditorParams: { values: gagaAgGrid.extractValues(FGAddGoodsStatList) },
+				valueFormatter: function (params) { return gagaAgGrid.lookupValue(FGAddGoodsStatList, params.value); },
+				valueParser: function (params) { return gagaAgGrid.lookupKey(FGAddGoodsStatList, params.newValue); }
+			},
+			{headerName: "정상가", field: "listPrice", width: 120, cellClass: 'text-center',valueFormatter: function(params) {return params.value.addComma();}},
+			{headerName: "판매가", field: "currPrice", width: 120, cellClass: 'text-center',valueFormatter: function(params) {return params.value.addComma();}}
+		];
+
+		// 업체분담율 리스트 설정
+		var columnApplyBurdenList = [
+			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{headerName: "업체ID", field: "tmtbSupplyCd" , width: 120, cellClass: 'text-center'},
+			{headerName: "분담율(%)", field: "tmtbBurdenRate" , width: 120, cellClass: 'text-center',editable: true, required: true},
+			{headerName: "사용여부", field: "useYn" , width: 120, cellClass: 'text-center'}
+		];
+
+		// 구간 할인/혜택 설정
+		var columnSectionGbList = [
+			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+			{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+			{headerName: "시퀀스", field: "tmtbSq", width: 100, cellClass: 'text-center'},
+			{headerName: "할인구간", field: "sectionGb", width: 100, cellClass: 'text-center',
+				cellEditor: 'agRichSelectCellEditor',
+				cellEditorParams: { values: gagaAgGrid.extractValues(sectionGbList), required: true },
+				valueFormatter: function (params) { return gagaAgGrid.lookupValue(sectionGbList, params.value); },
+				valueParser: function (params) { return gagaAgGrid.lookupKey(sectionGbList, params.newValue); }
+			},
+			{headerName: "구간값", field: "sectionVal", width: 100, cellClass: 'text-right',
+				cellEditor: 'textCellEditor',
+				cellEditorParams: { maxlength: 50, required: true }
+			},
+			{headerName: "할인구분", field: "dcWay", width: 100, cellClass: 'text-center',
+				cellEditor: 'agRichSelectCellEditor',
+				cellEditorParams: { values: gagaAgGrid.extractValues(dcWayList), required: true },
+				valueFormatter: function (params) { return gagaAgGrid.lookupValue(dcWayList, params.value); },
+				valueParser: function (params) { return gagaAgGrid.lookupKey(dcWayList, params.newValue); }
+			},
+			{headerName: "할인값", field: "dcVal", width: 100, cellClass: 'text-right',
+				cellEditor: 'textCellEditor',
+				cellEditorParams: { maxlength: 50, required: true }
+			}
+		];
+
+		// 공급업체 리스트 설정
+		var gridOptionsFGCompanyList = gagaAgGrid.getGridOptions(columnFGCompanyList);
+		gridOptionsFGCompanyList.rowSelection = "multiple";
+		// 브랜드 리스트 설정
+		var gridOptionsFGBrandList = gagaAgGrid.getGridOptions(columnBrandList);
+		gridOptionsFGBrandList.rowSelection = "multiple";
+		// 적용상품 리스트 설정
+		var gridOptionsFGApplyGoodsList = gagaAgGrid.getGridOptions(columnApplyGoodsList);
+		gridOptionsFGApplyGoodsList.rowSelection = "multiple";
+		// 제외상품 리스트 설정
+		var gridOptionsFGExceptGoodsList = gagaAgGrid.getGridOptions(columnExceptGoodsList);
+		gridOptionsFGExceptGoodsList.rowSelection = "multiple";
+		// 업체분담율 리스트 설정
+		var gridOptionsApplyBurdenList = gagaAgGrid.getGridOptions(columnApplyBurdenList);
+		gridOptionsApplyBurdenList.rowSelection = "multiple";
+		// 구간 할인/혜택 설정
+		var gridOptionsSectionGbList = gagaAgGrid.getGridOptions(columnSectionGbList);
+		// Grid editable
+		gridOptionsSectionGbList.defaultColDef.editable = true;
+		// Add on options
+		gridOptionsSectionGbList.suppressRowClickSelection = true;
+		gridOptionsSectionGbList.rowSelection = "multiple";
+		gridOptionsSectionGbList.stopEditingWhenGridLosesFocus = true;
+
+		$(document).ready(function() {
+			gagaAgGrid.createGrid("gridFGPromotionCompanyList", gridOptionsFGCompanyList);
+			gagaAgGrid.createGrid("gridFGBrandList", gridOptionsFGBrandList);
+			gagaAgGrid.createGrid("gridFGApplyGoodsList", gridOptionsFGApplyGoodsList);
+			gagaAgGrid.createGrid("gridFGExceptGoodsList", gridOptionsFGExceptGoodsList);
+			gagaAgGrid.createGrid("gridApplyBurdenList", gridOptionsApplyBurdenList);
+			gagaAgGrid.createGrid("gridSectionGbList", gridOptionsSectionGbList);
+
+			cfnCreateCalendar('#tmtbTerms', 'tmtbStdt', 'tmtbEddt', true, '행사기간', 'X');
+		});
+
+		// 저장 버튼 클릭시
+		$('#btnMorebetterSave').on('click', function() {
+			console.log('save 1818');
+			// 각 ag-grid list 수량
+			let supplyCompCnt = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList).length;
+			let brandCnt = gagaAgGrid.getAllRowData(gridOptionsFGBrandList).length;
+			let applyGoodsCnt = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList).length;
+			let exceptGoodsCnt = gagaAgGrid.getAllRowData(gridOptionsFGExceptGoodsList).length;
+			let applyBurdenCnt = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList).length;
+			let sectionGbCnt = gagaAgGrid.getAllRowData(gridOptionsSectionGbList).length;
+			console.log('supplyCompCnt>>'+supplyCompCnt);
+			console.log('brandCnt>>'+brandCnt);
+			console.log('applyGoodsCnt>>'+applyGoodsCnt);
+			console.log('exceptGoodsCnt>>'+exceptGoodsCnt);
+			console.log('applyBurdenCnt>>'+applyBurdenCnt);
+			console.log('sectionGbCnt>>'+sectionGbCnt);
+
+			// 행사기간 확인
+			let fromDate = $('#moreBetterForm input[name=tmtbStdt]').val();
+			let toDate = $('#moreBetterForm input[name=tmtbEddt]').val();
+
+			if (gagajf.isNull(fromDate) || gagajf.isNull(toDate)) {
+				mcxDialog.alert("행사 기간 시작일자와 종료일자를 입력하세요.");
+				$('#moreBetterForm input[name=tmtbStdt]').focus();
+				return false;
+			}
+
+			if (fromDate > toDate) {
+				mcxDialog.alert("시작일자는 종료일자 보다 클 수 없습니다.");
+				$('#moreBetterForm input[name=tmtbStdt]').focus();
+				return false;
+			}
+
+
+			// validation
+			if (!gagajf.validation('#moreBetterForm'))
+				return false;
+
+			// disabled 값 넘겨주기
+			$('#moreBetterForm input[name=tmtbSq]').val($('#moreBetterForm input[name=disTmtbSq]').val());
+			$('#moreBetterForm input[name=tmtbStat]').val($('#moreBetterForm input[name=disTmtbStat]').val());
+
+
+			mcxDialog.confirm('저장하시겠습니까?', {
+				cancelBtnText: "취소",
+				sureBtnText: "확인",
+				sureBtnClick: function(){
+					var comp_idx = 0;
+					var brand_idx = 0;
+					var apply_idx = 0;
+					var except_idx = 0;
+					var burden_idx = 0;
+
+					var compAllData = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList);
+					/*$.each(compAllData, function(comp_idx, item) {
+						item.dispOrd = comp_idx+1;
+					});*/
+
+					var brandAllData = gagaAgGrid.getAllRowData(gridOptionsFGBrandList);
+					/*$.each(brandAllData, function(brand_idx, item) {
+						item.dispOrd = brand_idx+1;
+					});*/
+
+					var applyAllData = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList);
+					/*$.each(applyAllData, function(apply_idx, item) {
+						item.dispOrd = apply_idx+1;
+					});*/
+
+					var exceptAllData = gagaAgGrid.getAllRowData(gridOptionsFGExceptGoodsList);
+					/*$.each(exceptAllData, function(except_idx, item) {
+						item.dispOrd = except_idx+1;
+					});*/
+
+					var burdenAllData = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList);
+					/*$.each(burdenAllData, function(burden_idx, item) {
+						item.dispOrd = burden_idx+1;
+					});*/
+
+					var sectionGbAllData = gagaAgGrid.getAllRowData(gridOptionsSectionGbList);
+
+					var jsonSupplyCompData = JSON.stringify(compAllData);
+					$('#moreBetterForm input[name=supplyCompList]').val(jsonSupplyCompData);
+					var jsonBrandData = JSON.stringify(brandAllData);
+					$('#moreBetterForm input[name=brandList]').val(jsonBrandData);
+					var jsonApplyData = JSON.stringify(applyAllData);
+					$('#moreBetterForm input[name=applyGoodsList]').val(jsonApplyData);
+					var jsonExceptData = JSON.stringify(exceptAllData);
+					$('#moreBetterForm input[name=exceptGoodsList]').val(jsonExceptData);
+					var jsonBurdenData = JSON.stringify(burdenAllData);
+					$('#moreBetterForm input[name=burdenList]').val(jsonBurdenData);
+
+					var jsonSectionGbData = JSON.stringify(sectionGbAllData);
+					$('#moreBetterForm input[name=sectionGbList]').val(jsonSectionGbData);
+
+					var jsonData = JSON.stringify($('#moreBetterForm').serializeObject());
+					gagajf.ajaxJsonSubmit($('#moreBetterForm').prop('action'), jsonData, function() {
+						//$('#btnSearch').trigger('click');
+						//$('#btnNew').trigger('click');
+						console.log('save 11111');
+					});
+				}
+			});
+
+		});
+
+		// 공급업체 설정 / 업체 추가 콜백함수
+		var fnSetPopupComapnyInfo = function(result) {
+			// 기존 리스트 데이터 for
+			for(let i = 0 ; i < result.length ; i++) {
+				let addChk = true, gridListValue = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList);		// 받아온 모든 데이터
+
+				// 받아온 data for
+				for(let j = 0 ; j < gridListValue.length ; j++) {
+					// 동일한 data는 추가하지 않음
+					if(gridListValue[j].supplyCompCd == result[i].supplyCompCd) {	addChk = false;	}		// 중복체크
+				}
+
+				// 중복되지 않은 데이터 리스트에 추가
+				if(addChk) {	gagaAgGrid.addRowData(gridOptionsFGCompanyList, result[i], "supplyCompCd");	}
+			}
+		};
+
+		// 브랜드 설정 / 브랜드 추가 콜백함수 (단수로 가져오므로 복수일 경우에 수정 확인 필요)
+		var fnSetPopupBrandInfo = function(result) {
+			for(let i = 0 ; i < result.length ; i++) {
+				let addChk = true, gridListValue = gagaAgGrid.getAllRowData(gridOptionsFGBrandList);		// 받아온 모든 데이터
+
+				// 받아온 data for
+				for(let j = 0 ; j < gridListValue.length ; j++) {
+					if(gridListValue[j].brandCd == result[i].brandCd) {	addChk = false;	}					// 중복체크
+				}
+
+				// 중복되지 않은 데이터 리스트에 추가
+				if(addChk) {	gagaAgGrid.addRowData(gridOptionsFGBrandList, result[i], "brandCd");	}
+			}
+		};
+
+		// 분담업체율 설정 / 업체 추가 콜백함수
+		var fnSetPopupApplyBurdenInfo = function(result) {
+			// 기존 리스트 데이터 for
+			for(let i = 0 ; i < result.length ; i++) {
+				console.log('old i::'+i+"::"+result[i].supplyCompCd);
+				let addChk = true, gridListValue = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList);		// 받아온 모든 데이터
+
+				// 받아온 data for
+				for(let j = 0 ; j < gridListValue.length ; j++) {
+					console.log('new add j::'+j+":supplyCompCd:"+gridListValue[j].tmtbSupplyCd);
+					// 동일한 data는 추가하지 않음
+					if(gridListValue[j].tmtbSupplyCd == result[i].supplyCompCd) {	addChk = false;	}		// 중복체크
+				}
+
+				// 중복되지 않은 데이터 리스트에 추가
+				if(addChk) {
+					//gagaAgGrid.addRowData(gridOptionsApplyBurdenList, result[i], "tmtbSupplyCd");
+					console.log('add compCd>>'+result[i].supplyCompCd);
+					console.log('add useYn>>'+result[i].useYn);
+					gagaAgGrid.addRowData(gridOptionsApplyBurdenList, {"tmtbSupplyCd" : result[i].supplyCompCd, "useYn" : result[i].useYn});
+				}
+			}
+		};
+
+		// 적용 상품 리스트 콜백함수
+		var fnSetPopupApplyGoodsInfo = function(result) {
+			gridAddGoodsList(gridOptionsFGApplyGoodsList, result);
+		};
+
+		// 제외 상품 리스트 콜백함수
+		var fnSetPopupExceptGoodsInfo = function(result) {
+			gridAddGoodsList(gridOptionsFGExceptGoodsList, result);
+		};
+
+
+		// ag-grid 상품관련 list 콜백함수
+		function gridAddGoodsList(OriginGridListOption, result) {
+			for(let i = 0 ; i < result.length ; i++) {
+				let addChk = true, gridListValue = gagaAgGrid.getAllRowData(OriginGridListOption);		// 받아온 모든 데이터
+
+				// 받아온 data for
+				for(let j = 0 ; j < gridListValue.length ; j++) {
+					if(gridListValue[j].goodsCd == result[i].goodsCd) {	addChk = false;	}				// 중복체크
+				}
+
+				// 중복되지 않은 데이터 리스트에 추가
+				if(addChk) {	gagaAgGrid.addRowData(OriginGridListOption, result[i], "goodsCd");	}
+			}
+		}
+
+		// 공급업체 설정 업체 추가 버튼 클릭시
+		$('#moreBetterForm #btnAddCompany').on('click', function() {
+			cfnOpenCompanyListPopup("fnSetPopupComapnyInfo");
+		});
+
+		// 브랜드 추가 버튼 클릭시 (복수 브랜드때 수정 필요)
+		$('#moreBetterForm #btnAddBrand').on('click', function() {
+			cfnOpenBrandListPopup("fnSetPopupBrandInfo", "M");
+		});
+
+		// 적용 상품 추가 버튼 클릭시
+		$('#moreBetterForm #btnAddApplyGoods').on('click', function() {
+			cfnOpenGoodsPopup("fnSetPopupApplyGoodsInfo");
+		});
+		// 제외 상품 추가 버튼 클릭시
+		$('#moreBetterForm #btnAddExceptGoods').on('click', function() {
+			cfnOpenGoodsPopup("fnSetPopupExceptGoodsInfo");
+		});
+		// 업체분담율 추가 버튼 클릭시
+		$('#moreBetterForm #btnAddApplyBurden').on('click', function() {
+			//cfnOpenApplyBurdenPopup("fnSetPopupApplyBurdenInfo");
+			cfnOpenCompanyListPopup("fnSetPopupApplyBurdenInfo");
+		});
+
+		// 공급업체 설정 선택삭제 버튼 클릭시
+		$('#moreBetterForm #btnDeleteCompany').on('click', function() {
+			gridOptionsFGCompanyList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsFGCompanyList)});
+		});
+		// 브랜드 설정 선택삭제 버튼 클릭시
+		$('#moreBetterForm #btnDeleteBrand').on('click', function() {
+			gridOptionsFGBrandList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsFGBrandList)});
+		});
+		// 적용상품 선택삭제 버튼 클릭시
+		$('#moreBetterForm #btnDeleteApplyGoods').on('click', function() {
+			gridOptionsFGApplyGoodsList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsFGApplyGoodsList)});
+		});
+		// 제외상품 선택삭제 버튼 클릭시
+		$('#moreBetterForm #btnDeleteExtGoods').on('click', function() {
+			gridOptionsFGExceptGoodsList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsFGExceptGoodsList)});
+		});
+		// 업체분담율 선택삭제 버튼 클릭시
+		$('#moreBetterForm #btnDelApplyBurden').on('click', function() {
+			gridOptionsApplyBurdenList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsApplyBurdenList)});
+		});
+
+		//패널영역 줄이기
+		$(document).on("click",".panelControl .inner-fa-chevron-up", function() {
+			$(this).parent().parent().parent().find(".inner-panelContent").slideUp(100);
+			$(this).attr("class","fa inner-fa-chevron-down");
+		});
+		//패널영역 펼치기
+		$(document).on("click",".panelControl .inner-fa-chevron-down", function() {
+			$(this).parent().parent().parent().find(".inner-panelContent").slideDown(100);
+			$(this).attr("class","fa inner-fa-chevron-up");
+		});
+
+		// 창 닫기
+		var fnMorebetterFormClose = function(){
+			uifnPopupClose('popupMorebetterReg');
+		}
+
+		// 행추가
+		$('#btnAddSectionRow').on('click', function() {
+			var tmtbSq = $('#moreBetterForm input[name=disTmtbSq]').val();
+			var sectionGbValue = $('input:radio[name="sectionGb"]:checked').val();
+			var dcWayValue = $('input:radio[name="dcWay"]:checked').val();
+
+			var data = { tmtbSq: tmtbSq ,sectionGb: sectionGbValue, sectionVal: null, dcWay: dcWayValue, dcVal: null };
+			gagaAgGrid.addRowData(gridOptionsSectionGbList, data, "sectionVal");
+		});
+
+		// 행삭제
+		$('#btnDelSectionRow').on('click', function() {
+			var selectedData = gridOptionsSectionGbList.api.getSelectedRows();
+			var removedData = gagaAgGrid.removeRowData(gridOptionsSectionGbList);
+
+			if (selectedData.length == 0) {
+				mcxDialog.alert('선택된 행이 없습니다.');
+				return;
+			}
+
+			if (removedData.length > 0) {
+
+				mcxDialog.confirm('삭제하시겠습니까?', {
+					cancelBtnText: "취소",
+					sureBtnText: "확인",
+					sureBtnClick: function(){
+						var deleteData = [];
+
+						$.each(removedData, function(idx, item) {
+							deleteData.push(item);
+						});
+
+						var jsonData = JSON.stringify(deleteData);
+						gagajf.ajaxJsonSubmit('/morebetter/sectionVal/delete', jsonData, fnSearch);
+					}
+				});
+			}
+		});
+
+		// 할인구간 선택 시 기본 조건 변경
+		$("#moreBetterForm input[name=sectionGb]").bind('click change', function () {
+			var sectionGbValue = $(this).val();
+			var dcWayValue = $('input:radio[name="dcWay"]:checked').val();
+			var loopRowData = gagaAgGrid.getAllRowData(gridOptionsSectionGbList);
+
+			if (loopRowData.length == 0) {
+				mcxDialog.alert('ROW 데이터가 없습니다.');
+				return;
+			}
+
+			for(i=0; i<loopRowData.length; i++){
+				loopRowData[i].sectionGb = sectionGbValue;
+				loopRowData[i].sectionVal = "";
+				loopRowData[i].dcWay = dcWayValue;
+				loopRowData[i].dcVal = "";
+			}
+			gridOptionsSectionGbList.api.setRowData(loopRowData);
+		});
+
+		// 할인구분 선택 시 기본 조건 변경
+		$("#moreBetterForm input[name=dcWay]").bind('click change', function () {
+			var sectionGbValue = $('input:radio[name="sectionGb"]:checked').val();
+			var dcWayValue = $(this).val();
+			var loopRowData = gagaAgGrid.getAllRowData(gridOptionsSectionGbList);
+
+			if (loopRowData.length == 0) {
+				mcxDialog.alert('ROW 데이터가 없습니다.');
+				return;
+			}
+
+			for(i=0; i<loopRowData.length; i++){
+				loopRowData[i].sectionGb = sectionGbValue;
+				loopRowData[i].sectionVal = "";
+				loopRowData[i].dcWay = dcWayValue;
+				loopRowData[i].dcVal = "";
+			}
+			gridOptionsSectionGbList.api.setRowData(loopRowData);
+		});
+
+		$(document).ready(function() {
+
+		});
+	</script>
+</html>

+ 9 - 0
style24.batch/src/main/java/com/style24/batch/biz/dao/TsbGoodsDao.java

@@ -11,6 +11,7 @@ import com.style24.persistence.domain.GoodsIfMeasurement;
 import com.style24.persistence.domain.GoodsSafeNo;
 import com.style24.persistence.domain.GoodsSummary;
 import com.style24.persistence.domain.IfBrand;
+import com.style24.persistence.domain.IfProduct;
 import com.style24.persistence.domain.IfProvider;
 
 /**
@@ -292,4 +293,12 @@ public interface TsbGoodsDao {
 	 */
 	Collection<IfBrand> getBrandList();
 
+	/**
+	 * 상품 정보 조회
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	Collection<IfProduct> getGoodsList();
+
 }

+ 10 - 0
style24.batch/src/main/java/com/style24/batch/biz/dao/TsbWmsGoodsDao.java

@@ -7,6 +7,7 @@ import com.style24.persistence.domain.GoodsIfIncomelot;
 import com.style24.persistence.domain.GoodsIfIncomelotitem;
 import com.style24.persistence.domain.GoodsIfMeasurement;
 import com.style24.persistence.domain.IfBrand;
+import com.style24.persistence.domain.IfProduct;
 import com.style24.persistence.domain.IfProvider;
 
 /**
@@ -72,4 +73,13 @@ public interface TsbWmsGoodsDao {
 	 */
 	void saveWmsBrandProviderXref(IfBrand ifBrand);
 
+	/**
+	 * WMS 상품 정보 송신
+	 *
+	 * @param ifProduct
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	void saveWmsProduct(IfProduct ifProduct);
+
 }

+ 3 - 3
style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsBrandproviderJob.java

@@ -5,7 +5,7 @@ import org.springframework.stereotype.Component;
 
 import com.style24.batch.biz.job.TsbAbstractJob;
 import com.style24.batch.biz.service.TsbCommonService;
-import com.style24.batch.biz.service.TsbGoodsService;
+import com.style24.batch.biz.service.TsbWmsGoodsService;
 import com.style24.persistence.domain.IfBrand;
 
 import lombok.extern.slf4j.Slf4j;
@@ -23,7 +23,7 @@ import com.gagaframework.web.util.GagaDateUtil;
 public class TsbGoodsWmsBrandproviderJob extends TsbAbstractJob<IfBrand, IfBrand, IfBrand> {
 
 	@Autowired
-	private TsbGoodsService goodsService;
+	private TsbWmsGoodsService wmsGoodsService;
 
 	@Autowired
 	private TsbCommonService commonService;
@@ -52,7 +52,7 @@ public class TsbGoodsWmsBrandproviderJob extends TsbAbstractJob<IfBrand, IfBrand
 	@Override
 	public IfBrand write(IfBrand ifBrand) throws Exception {
 
-		goodsService.saveWmsBrandProvider();
+		wmsGoodsService.saveWmsBrandProvider();
 
 		return ifBrand;
 	}

+ 69 - 0
style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsProductJob.java

@@ -0,0 +1,69 @@
+package com.style24.batch.biz.job.goods;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbCommonService;
+import com.style24.batch.biz.service.TsbWmsGoodsService;
+import com.style24.persistence.domain.IfProduct;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.util.GagaDateUtil;
+
+/**
+ * WMS 입고 연용
+ *
+ * @author eskim
+ * @since 2021. 01. 01
+ */
+@Component
+@Slf4j
+public class TsbGoodsWmsProductJob extends TsbAbstractJob<IfProduct, IfProduct, IfProduct> {
+
+	@Autowired
+	private TsbWmsGoodsService wmsGoodsService;
+
+	@Autowired
+	private TsbCommonService commonService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+	private String jobdate = "";
+
+	@Override
+	public IfProduct read() throws Exception {
+
+		// WMS 동기화 옵션 여부 확인
+		String wmsSyncYn = commonService.getWmsSyncYn();
+		if ("N".equals(wmsSyncYn)) {
+			log.info("WMS 정보 동기화 미실행 {}, 연동여부 : {}", GagaDateUtil.getToday("yyyy-MM-dd HH:mm:ss"), wmsSyncYn);
+			return null;
+		}
+		IfProduct ifProduct = new IfProduct();
+		return ifProduct;
+	}
+
+	@Override
+	public IfProduct process(IfProduct ifProduct) throws Exception {
+		return ifProduct;
+	}
+
+	@Override
+	public IfProduct write(IfProduct ifProduct) throws Exception {
+
+		jobdate = GagaDateUtil.getOffsetDate(-1);	//전일자
+
+		//온라인 상품정보 조회 처리
+		wmsGoodsService.saveGoodsWmsProduct(jobdate);
+
+		return ifProduct;
+	}
+
+	@Override
+	public void notify(IfProduct ifProduct) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 25 - 25
style24.batch/src/main/java/com/style24/batch/biz/service/TsbGoodsService.java

@@ -19,6 +19,7 @@ import com.style24.persistence.domain.GoodsIfMeasurement;
 import com.style24.persistence.domain.GoodsSafeNo;
 import com.style24.persistence.domain.GoodsSummary;
 import com.style24.persistence.domain.IfBrand;
+import com.style24.persistence.domain.IfProduct;
 import com.style24.persistence.domain.IfProvider;
 
 import io.netty.util.internal.StringUtil;
@@ -409,40 +410,39 @@ public class TsbGoodsService {
 	}
 
 	/**
-	 * WMS 브랜드/업체정보 송신
+	 * 업체정보 조회
 	 *
 	 * @return
 	 * @author eskim
 	 * @since 2021. 01. 01
 	 */
-	//@Transactional("wmsTxnManager")
-	public void saveWmsBrandProvider() {
-
-		//업체정보 송신(수정일 7일)
-		/*
-		 * 매핑 확인건
-		G065_10	자사-제조
-		G065_11	자사-사입
-		G065_12	자사-위탁
-		 */
+	public Collection<IfProvider> getSupplyCompanyList() {
+		return goodsDao.getSupplyCompanyList();
+	}
 
-		Collection<IfProvider> ifProviderList = goodsDao.getSupplyCompanyList();
+	/**
+	 * 브랜드정보 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	public Collection<IfBrand> getBrandList() {
+		return goodsDao.getBrandList();
+	}
 
-		for (IfProvider ifProvider : ifProviderList) {
-			ifProvider.setRegNo(TsbConstants.REG_NO);
-			ifProvider.setUpdNo(TsbConstants.REG_NO);
-			wmsGoodsService.saveWmsProvider(ifProvider);
-		}
 
-		//브랜드, 브랜드/업체 관계정보 송신
-		Collection<IfBrand> ifBrandList = goodsDao.getBrandList();
+	/**
+	 * 상품 정보 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	public Collection<IfProduct> getGoodsList() {
+		return goodsDao.getGoodsList();
+	}
 
-		for (IfBrand ifBrand : ifBrandList) {
-			ifBrand.setRegNo(TsbConstants.REG_NO);
-			ifBrand.setUpdNo(TsbConstants.REG_NO);
-			wmsGoodsService.saveWmsBrand(ifBrand);
-		}
 
-	}
 
 }

+ 68 - 10
style24.batch/src/main/java/com/style24/batch/biz/service/TsbWmsGoodsService.java

@@ -4,12 +4,15 @@ import java.util.Collection;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import com.style24.batch.biz.dao.TsbWmsGoodsDao;
+import com.style24.batch.support.env.TsbConstants;
 import com.style24.persistence.domain.GoodsIfIncomelot;
 import com.style24.persistence.domain.GoodsIfIncomelotitem;
 import com.style24.persistence.domain.GoodsIfMeasurement;
 import com.style24.persistence.domain.IfBrand;
+import com.style24.persistence.domain.IfProduct;
 import com.style24.persistence.domain.IfProvider;
 
 import lombok.extern.slf4j.Slf4j;
@@ -27,6 +30,9 @@ public class TsbWmsGoodsService {
 	@Autowired
 	private TsbWmsGoodsDao wmsGoodsDao;
 
+	@Autowired
+	private TsbGoodsService goodsService;
+
 	/**
 	 * WMS 실측사이즈 연용
 	 *
@@ -67,23 +73,75 @@ public class TsbWmsGoodsService {
 	 * @author eskim
 	 * @since 2021. 01. 05
 	 */
-	//@Transactional("wmsTxnManager")
-	public void saveWmsProvider(IfProvider ifProvider) {
-		wmsGoodsDao.saveWmsProvider(ifProvider);
+	@Transactional("wmsTxnManager")
+	public void saveWmsBrand(IfBrand ifBrand) {
+		//브랜드 정보 송신
+		wmsGoodsDao.saveWmsBrand(ifBrand);
+		//WMS 브랜드업체관계정보 송신
+		wmsGoodsDao.saveWmsBrandProviderXref(ifBrand);
 	}
 
+
 	/**
-	 * WMS 업체정보 송신
+	 * WMS 브랜드/업체정보 송신
 	 *
 	 * @return
 	 * @author eskim
-	 * @since 2021. 01. 05
+	 * @since 2021. 01. 01
 	 */
-	public void saveWmsBrand(IfBrand ifBrand) {
-		//브랜드 정보 송신
-		wmsGoodsDao.saveWmsBrand(ifBrand);
-		//WMS 브랜드업체관계정보 송신
-		wmsGoodsDao.saveWmsBrandProviderXref(ifBrand);
+	@Transactional("wmsTxnManager")
+	public void saveWmsBrandProvider() {
+
+		//업체정보 송신(수정일 7일)
+		/*
+		 * 매핑 확인건
+		G065_10	자사-제조
+		G065_11	자사-사입
+		G065_12	자사-위탁
+		 */
+
+		Collection<IfProvider> ifProviderList = goodsService.getSupplyCompanyList();
+
+		for (IfProvider ifProvider : ifProviderList) {
+			ifProvider.setRegNo(TsbConstants.REG_NO);
+			ifProvider.setUpdNo(TsbConstants.REG_NO);
+			wmsGoodsDao.saveWmsProvider(ifProvider);
+		}
+
+		//브랜드, 브랜드/업체 관계정보 송신
+		Collection<IfBrand> ifBrandList = goodsService.getBrandList();
+
+		for (IfBrand ifBrand : ifBrandList) {
+			ifBrand.setRegNo(TsbConstants.REG_NO);
+			ifBrand.setUpdNo(TsbConstants.REG_NO);
+			//브랜드 정보 송신
+			wmsGoodsDao.saveWmsBrand(ifBrand);
+			//WMS 브랜드업체관계정보 송신
+			wmsGoodsDao.saveWmsBrandProviderXref(ifBrand);
+		}
+
+	}
+
+	/**
+	 * WMS 상품정보 송신
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 06
+	 */
+	@Transactional("wmsTxnManager")
+	public void saveGoodsWmsProduct(String jobdate) {
+		//상품 정보 송신
+		Collection<IfProduct> ifGoodsList = goodsService.getGoodsList();
+
+		for (IfProduct ifProduct : ifGoodsList) {
+			ifProduct.setRegNo(TsbConstants.REG_NO);
+			ifProduct.setUpdNo(TsbConstants.REG_NO);
+			//상품 정보 송신
+			wmsGoodsDao.saveWmsProduct(ifProduct);
+
+		}
+
 	}
 
 }

+ 2 - 3
style24.batch/src/main/java/com/style24/batch/biz/task/TsbDeliveryTask.java

@@ -2,7 +2,6 @@ package com.style24.batch.biz.task;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import com.style24.batch.biz.job.delivery.TsbDailyDeliveryZoneJob;
@@ -47,12 +46,12 @@ public class TsbDeliveryTask {
 	 */
 
 	/**
-	 * 총알배송 권역정보   : 일배치  오전 11시  
+	 * 총알배송 권역정보   : 일배치  오전 11시
 	 *
 	 * @throws Exception
 	 */
 	//@Scheduled(cron = "${cron.delivery.tsbDailyDeliveryZoneJob}")
-	@Scheduled(fixedDelay = 3500000)
+	//@Scheduled(fixedDelay = 3500000)
 	@Async
 	public void tsbDailyDeliveryZoneJob() throws Exception {
 		dailyDeliveryZoneJob.run("cron.delivery.daily.deliveryZone");

+ 17 - 3
style24.batch/src/main/java/com/style24/batch/biz/task/TsbGoodsTask.java

@@ -15,6 +15,7 @@ import com.style24.batch.biz.job.goods.TsbGoodsTnmJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsBrandproviderJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsIncomelotJob;
 import com.style24.batch.biz.job.goods.TsbGoodsWmsMeasurementJob;
+import com.style24.batch.biz.job.goods.TsbGoodsWmsProductJob;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -57,7 +58,8 @@ public class TsbGoodsTask {
 	@Autowired
 	private TsbGoodsWmsBrandproviderJob goodsWmsBrandproviderJob;
 
-
+	@Autowired
+	private TsbGoodsWmsProductJob goodsWmsProductJob;
 
 	/**
 	 * 초 분 시 일 월 주(년)
@@ -185,7 +187,7 @@ public class TsbGoodsTask {
 	 * @throws Exception
 	 */
 	@Scheduled(cron = "${cron.goods.wms.incomelot}")
-	//@Scheduled(fixedDelay = 3500000)
+	@Scheduled(fixedDelay = 3500000)
 	@Async
 	public void tsbGoodsWmsIncomelotJob() throws Exception {
 		goodsWmsIncomelotJob.runById("cron.goods.wms.incomelot");
@@ -197,11 +199,23 @@ public class TsbGoodsTask {
 	 * @throws Exception
 	 */
 	@Scheduled(cron = "${cron.goods.wms.brandprovider}")
-	@Scheduled(fixedDelay = 3500000)
+	//@Scheduled(fixedDelay = 3500000)
 	@Async
 	public void tsbGoodsWmsBrandproviderJob() throws Exception {
 		goodsWmsBrandproviderJob.runById("cron.goods.wms.brandprovider");
 	}
 
+	/**
+	 * WMS 상품정보 송신 적용 주기 : 일배치 - 03시 15분
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.wms.product}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsWmsProductJob() throws Exception {
+		goodsWmsProductJob.runById("cron.goods.wms.product");
+	}
+
 
 }

+ 31 - 0
style24.batch/src/main/java/com/style24/persistence/domain/IfProduct.java

@@ -0,0 +1,31 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * wms 연동 상품정보 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 05
+ */
+@SuppressWarnings("serial")
+@Data
+public class IfProduct extends TscBaseDomain {
+
+	private Integer productno;			//상품번호
+	private String productcode;			//상품코드
+	private String productname;			//상품명
+	private int brandno;				//브랜드번호
+	private String brandname;			//브랜드명
+	private int providerno;				//공급처번호
+	private String statuscd;			//관리상태
+	private String producttypecd;		//상품타입
+	private String vendorproductcode;	//업체상품코드
+	private String goodsCd;				//온라인상품코드
+	private String brandCd;				//온라인브랜드코드
+	private String supplyCompCd;		//온라인공급업체코드
+	private String sysImgNm;			//온라인상품이미지
+
+}

+ 64 - 44
style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml

@@ -1088,7 +1088,7 @@
 		     , USERLASTMODIFIED
 		     , UPD_DT
 		)
-		(
+		VALUES(
 		       #{skucode}
 		     , #{productno}
 		     , #{productcode}
@@ -1100,8 +1100,8 @@
 		     , NVL(#{value4},0)
 		     , NVL(#{value5},0)
 		     , #{memo}
-		     , CONVERT(VARCHAR,#{dateinserted},20)  /* yyyy-mm-dd hh:mi:ss */
-		     , CONVERT(VARCHAR,#{datelastmodified},20) 
+		     , DATE_FORMAT(#{dateinserted}, '%Y-%m-%d %H:%i:%S')
+		     , DATE_FORMAT(#{datelastmodified}, '%Y-%m-%d %H:%i:%S')
 		     , NVL(#{isuse},'1')
 		     , #{userlastmodified}
 		     , NOW()
@@ -1114,15 +1114,15 @@
 		     , VALUE4 = NVL(#{value4},0)
 		     , VALUE5 = NVL(#{value5},0)
 		     , MEMO = #{memo}
-		     , DATEINSERTED = CONVERT(VARCHAR,#{dateinserted},20)  /* yyyy-mm-dd hh:mi:ss */
-		     , DATELASTMODIFIED = CONVERT(VARCHAR,#{datelastmodified},20) 
+		     , DATEINSERTED = DATE_FORMAT(#{dateinserted}, '%Y-%m-%d %H:%i:%S')
+		     , DATELASTMODIFIED = DATE_FORMAT(#{datelastmodified}, '%Y-%m-%d %H:%i:%S')
 		     , ISUSE = NVL(#{isuse},'1')
 		     , USERLASTMODIFIED = #{userlastmodified}
 		     , UPD_DT = NOW()
 	</insert>
 	
 	<!--입고 저장-->
-	<insert id="saveGoodsIfIncomelot" parameterType="GoodsIfMeasurement">
+	<insert id="saveGoodsIfIncomelot" parameterType="GoodsIfIncomelot">
 		/* TsbGoods.saveGoodsIfIncomelot */
 		INSERT INTO TB_IF_INCOMELOT (
 		       LOTNO
@@ -1134,14 +1134,14 @@
 		     , DATEINCOME
 		     , UPD_DT
 		)
-		(
+		VALUES (
 		       #{lotno}
 		     , #{purchaseno}
 		     , #{providerno}
 		     , #{providername}
 		     , #{brandno}
 		     , #{brandname}
-		     , CONVERT(VARCHAR,#{dateincome},20)  /* yyyy-mm-dd hh:mi:ss */
+		     , DATE_FORMAT(#{dateincome}, '%Y-%m-%d %H:%i:%S')
 		     , NOW()
 		)
 		ON DUPLICATE KEY UPDATE
@@ -1150,12 +1150,12 @@
 		     , PROVIDERNAME = #{providername}
 		     , BRANDNO = #{brandno}
 		     , BRANDNAME = #{brandname}
-		     , DATEINCOME = CONVERT(VARCHAR,#{dateincome},20)
+		     , DATEINCOME = DATE_FORMAT(#{dateincome}, '%Y-%m-%d %H:%i:%S')
 		     , UPD_DT = NOW()
 	</insert>
 	
 	<!--입고상품 저장-->
-	<insert id="saveGoodsIfIncomelotitem" parameterType="GoodsIfMeasurement">
+	<insert id="saveGoodsIfIncomelotitem" parameterType="GoodsIfIncomelotitem">
 		/* TsbGoods.saveGoodsIfIncomelotitem */
 		INSERT INTO TB_IF_INCOMELOTITEM (
 		       LOTNO
@@ -1172,11 +1172,11 @@
 		     , MODELNO
 		     , UPD_DT
 		)
-		(
+		VALUES (
 		       #{lotno}
 		     , #{itemno}
 		     , #{wmsitemno}
-		     , CONVERT(VARCHAR,#{dateincome},20)  /* yyyy-mm-dd hh:mi:ss */
+		     , DATE_FORMAT(#{dateincome}, '%Y-%m-%d %H:%i:%S')
 		     , #{productno}
 		     , #{productcode}
 		     , #{productname}
@@ -1189,7 +1189,7 @@
 		)
 		ON DUPLICATE KEY UPDATE
 		       WMSITEMNO = #{wmsitemno}
-		     , DATEINCOME = CONVERT(VARCHAR,#{dateincome},20)
+		     , DATEINCOME = DATE_FORMAT(#{dateincome}, '%Y-%m-%d %H:%i:%S')
 		     , PRODUCTNO = #{productno}
 		     , PRODUCTCODE = #{productcode}
 		     , PRODUCTNAME = #{productname}
@@ -1205,18 +1205,14 @@
 	<insert id="saveWmsGoods" parameterType="GoodsIfIncomelot" >
 		/* TsbGoods.saveWmsGoods */
 		INSERT INTO TB_WMS_GOODS (
-		       PRODUCTNO 
-		     , PRODUCTCODE 
-		     , PRODUCTNAME 
-		     , SKUCODE 
-		     , NORMALQTY 
-		     , BROKENQTY 
-		     , TOTALQTY 
-		     , MODELNO 
-		     , PROVIDERNO
-		     , PROVIDERNAME
-		     , BRANDNO
-		     , BRANDNAME
+		       PRODUCT_NO 
+		     , PRODUCT_CODE 
+		     , PRODUCT_NAME 
+		     , MODEL_NO 
+		     , PROVIDER_NO
+		     , PROVIDER_NAME
+		     , BRAND_NO
+		     , BRAND_NAME
 		     , REG_NO
 		     , REG_DT
 		     , UPD_NO
@@ -1225,11 +1221,7 @@
 		SELECT B.PRODUCTNO 
 		     , B.PRODUCTCODE 
 		     , B.PRODUCTNAME 
-		     , B.SKUCODE 
-		     , B.NORMALQTY 
-		     , B.BROKENQTY 
-		     , B.TOTALQTY 
-		     , B.MODELNO 
+		     , LEFT(B.MODELNO,10) AS MODELNO 
 		     , A.PROVIDERNO
 		     , A.PROVIDERNAME
 		     , A.BRANDNO
@@ -1243,28 +1235,25 @@
 		WHERE 1 = 1
 		<choose>
 		    <when test='jobdate != null and jobdate != ""'>
-		AND A.UPD_DT >= DATE_FORMAT(DATE_FORMAT(#{jobdate}, '%Y%m%d'), '%Y%m%d%H%i%S') 
+		AND A.DATEINCOME >= DATE_FORMAT(DATE_FORMAT(#{jobdate}, '%Y%m%d'), '%Y%m%d%H%i%S') 
 		<![CDATA[
-		AND A.UPD_DT < DATE_FORMAT(DATE_ADD(DATE_FORMAT(#{jobdate}, '%Y%m%d'), INTERVAL 1 DAY), '%Y%m%d%H%i%S')
+		AND A.DATEINCOME < DATE_FORMAT(DATE_ADD(DATE_FORMAT(#{jobdate}, '%Y%m%d'), INTERVAL 1 DAY), '%Y%m%d%H%i%S')
 		]]>
 		    </when>
 		    <otherwise>
-		AND A.UPD_DT >= DATE_FORMAT(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 DAY), '%Y%m%d'), '%Y%m%d%H%i%S') 
+		AND A.DATEINCOME >= DATE_FORMAT(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 DAY), '%Y%m%d'), '%Y%m%d%H%i%S') 
 		<![CDATA[
-		AND A.UPD_DT < DATE_FORMAT(DATE_ADD(DATE_FORMAT(NOW(), '%Y%m%d'), INTERVAL 1 DAY), '%Y%m%d%H%i%S')
+		AND A.DATEINCOME < DATE_FORMAT(DATE_ADD(DATE_FORMAT(NOW(), '%Y%m%d'), INTERVAL 1 DAY), '%Y%m%d%H%i%S')
 		]]>
 		    </otherwise>
 		</choose>
 		ON DUPLICATE KEY UPDATE
-		       PRODUCTNAME = IF(GOODS_REG_GB IS NULL, B.PRODUCTNAME, TB_WMS_GOODS.PRODUCTNAME)
-		     , NORMALQTY = IF(GOODS_REG_GB IS NULL, B.NORMALQTY, TB_WMS_GOODS.NORMALQTY)
-		     , BROKENQTY = IF(GOODS_REG_GB IS NULL, B.BROKENQTY, TB_WMS_GOODS.BROKENQTY)
-		     , TOTALQTY = IF(GOODS_REG_GB IS NULL, B.TOTALQTY, TB_WMS_GOODS.TOTALQTY)
-		     , MODELNO = IF(GOODS_REG_GB IS NULL, B.MODELNO, TB_WMS_GOODS.MODELNO)
-		     , PROVIDERNO = IF(GOODS_REG_GB IS NULL, A.PROVIDERNO, TB_WMS_GOODS.PROVIDERNO)
-		     , PROVIDERNAME = IF(GOODS_REG_GB IS NULL, A.PROVIDERNAME, TB_WMS_GOODS.PROVIDERNAME)
-		     , BRANDNO = IF(GOODS_REG_GB IS NULL, A.BRANDNO, TB_WMS_GOODS.BRANDNO)
-		     , BRANDNAME = IF(GOODS_REG_GB IS NULL, A.BRANDNAME, TB_WMS_GOODS.BRANDNAME)
+		       PRODUCT_NAME = IF(GOODS_REG_GB IS NULL, B.PRODUCTNAME, TB_WMS_GOODS.PRODUCT_NAME)
+		     , MODEL_NO = IF(GOODS_REG_GB IS NULL, B.MODELNO, TB_WMS_GOODS.MODEL_NO)
+		     , PROVIDER_NO = IF(GOODS_REG_GB IS NULL, A.PROVIDERNO, TB_WMS_GOODS.PROVIDER_NO)
+		     , PROVIDER_NAME = IF(GOODS_REG_GB IS NULL, A.PROVIDERNAME, TB_WMS_GOODS.PROVIDER_NAME)
+		     , BRAND_NO = IF(GOODS_REG_GB IS NULL, A.BRANDNO, TB_WMS_GOODS.BRAND_NO)
+		     , BRAND_NAME = IF(GOODS_REG_GB IS NULL, A.BRANDNAME, TB_WMS_GOODS.BRAND_NAME)
 		     , UPD_NO = #{updNo}
 		     , UPD_DT = NOW()
 	</insert>
@@ -1291,7 +1280,7 @@
 		]]>
 	</select>
 	
-	<!-- 공급업체 목록 -->
+	<!-- 브랜드 목록 -->
 	<select id="getBrandList" resultType="IfBrand">
 		/* TsbGoods.getBrandList */
 		SELECT A.BRAND_NO AS BRANDNO
@@ -1311,4 +1300,35 @@
 		]]>
 	</select>
 	
+	<!-- 상품 목록 -->
+	<select id="getGoodsList" resultType="IfProduct">
+		/* TsbGoods.getGoodsList */
+		SELECT G.PRODUCT_NO AS PRODUCTNO
+		     , G.PRODUCT_CODE AS PRODUCTCODE
+		     , G.GOODS_NM AS PRODUCTNAME
+		     , B.BRAND_NO AS BRANDNO
+		     , B.BRAND_ENM AS BRANDNAME
+		     , C.PROVIDER_NO AS PROVIDERNO
+		     , (CASE G.GOODS_STAT WHEN 'G008_20' THEN '승인보류' 
+		                         WHEN 'G008_40' THEN '승인대기' 
+		                         WHEN 'G008_70' THEN '품절'
+		                         WHEN 'G008_99' THEN '삭제'
+		                         WHEN 'G008_95' THEN '판매중지'
+		                         ELSE '판매중'
+		        END) AS STATUSCD
+		     , G.SUPPLY_GOODS_CD AS VENDORPRODUCTCODE
+		     , G.GOODS_CD
+		     , G.BRAND_CD
+		     , G.SUPPLY_COMP_CD
+		     , (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
+		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		INNER JOIN TB_SUPPLY_COMPANY C ON G.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD
+		WHERE  G.SELF_GOODS_YN  = 'Y'  /* 자사 */
+		AND G.UPD_DT >= DATE_FORMAT(DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 DAY), '%Y%m%d'), '%Y%m%d%H%i%S') 
+		<![CDATA[
+		AND G.UPD_DT < DATE_FORMAT(DATE_FORMAT(NOW(), '%Y%m%d'), '%Y%m%d%H%i%S')
+		]]>
+	</select>
+	
 </mapper>

+ 19 - 0
style24.batch/src/main/java/com/style24/persistence/mybatis/wms/TsbWmsGoods.xml

@@ -68,6 +68,7 @@
 		     , NORMALQTY
 		     , BROKENQTY
 		     , TOTALQTY
+		     , MODELNO
 		FROM TB_IF_INCOMELOTITEM
 		WHERE 1 = 1 
 		<choose>
@@ -194,4 +195,22 @@
 		           );
 	</insert>
 	
+	<!--WMS 상품정보 송신-->
+	<update id="saveWmsProduct" parameterType="IfProduct" >
+		/* TsbWmsGoods.saveWmsProduct */
+		UPDATE TB_IF_PRODUCT
+		SET PRODUCTNAME = #{productname}
+		  , BRANDNO = #{brandno}
+		  , BRANDNAME = #{brandname}
+		  , PROVIDERNO = #{providerno}
+		  , STATUSCD = #{statuscd}
+		  , VENDORPRODUCTCODE = #{vendorproductcode}
+		  , GOODS_CD = #{goodsCd}
+		  , BRAND_CD = #{brandCd }
+		  , SUPPLY_COMP_CD = #{supplyCompCd}
+		  , SYS_IMG_NM = #{sysImgNm}
+		  , DATElASTMODIFIED = GETDATE()
+		WHERE PRODUCTCODE = #{productcode}
+	</update>
+	
 </mapper>

+ 1 - 0
style24.batch/src/main/resources/config/application-locd.yml

@@ -52,6 +52,7 @@ cron:
         wms.measurement: 2 22 2 29 2 ?
         wms.incomelot: 2 22 2 29 2 ?
         wms.brandprovider: 2 22 2 29 2 ?
+        wms.product: 2 22 2 29 2 ?
     
     #통계
     statistics:

+ 7 - 0
style24.front/target/m2e-wtp/web-resources/META-INF/maven/com.style24.front/style24.front/pom.properties

@@ -1,5 +1,12 @@
 #Generated by Maven Integration for Eclipse
+<<<<<<< HEAD
 #Wed Jan 06 14:17:20 KST 2021
+=======
+#Wed Jan 06 15:15:11 KST 2021
+version=0.0.1-SNAPSHOT
+groupId=com.style24.front
+m2e.projectName=style24.front
+>>>>>>> branch 'develop' of http://112.172.147.34:4936/style24/STYLE24.git
 m2e.projectLocation=D\:\\WIDE\\workspace\\webapps\\style24\\STYLE24\\style24.front
 m2e.projectName=style24.front
 groupId=com.style24.front