Просмотр исходного кода

Merge remote-tracking branch 'origin/develop' into develop

이태영 5 лет назад
Родитель
Сommit
99779a3028
45 измененных файлов с 2646 добавлено и 285 удалено
  1. 19 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaCommonDao.java
  2. 66 5
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaDisplayDao.java
  3. 19 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java
  4. 20 0
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaOrderDao.java
  5. 23 1
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaCommonService.java
  6. 67 5
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaDisplayService.java
  7. 56 22
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaGoodsService.java
  8. 7 2
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaOrderService.java
  9. 64 5
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaDisplayController.java
  10. 17 2
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaGoodsController.java
  11. 5 3
      style24.admin/src/main/java/com/style24/persistence/domain/Category.java
  12. 3 1
      style24.admin/src/main/java/com/style24/persistence/domain/Goods.java
  13. 20 0
      style24.admin/src/main/java/com/style24/persistence/domain/Sequence.java
  14. 37 0
      style24.admin/src/main/java/com/style24/persistence/domain/WmsGoods.java
  15. 17 0
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaCommon.xml
  16. 421 93
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml
  17. 68 1
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  18. 41 17
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml
  19. 80 79
      style24.admin/src/main/resources/i18n/messages/message_ko_KR.properties
  20. 433 0
      style24.admin/src/main/webapp/WEB-INF/views/display/CategoryForm.html
  21. 62 10
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html
  22. 4 4
      style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsWmsIncomelotForm.html
  23. 1 1
      style24.batch/.classpath
  24. 57 0
      style24.batch/src/main/java/com/style24/batch/biz/dao/TsbCommonDao.java
  25. 33 0
      style24.batch/src/main/java/com/style24/batch/biz/dao/TsbGoodsDao.java
  26. 46 0
      style24.batch/src/main/java/com/style24/batch/biz/dao/TsbWmsGoodsDao.java
  27. 72 0
      style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsIncomelotJob.java
  28. 66 0
      style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsMeasurementJob.java
  29. 57 0
      style24.batch/src/main/java/com/style24/batch/biz/service/TsbCommonService.java
  30. 67 1
      style24.batch/src/main/java/com/style24/batch/biz/service/TsbGoodsService.java
  31. 61 0
      style24.batch/src/main/java/com/style24/batch/biz/service/TsbWmsGoodsService.java
  32. 30 0
      style24.batch/src/main/java/com/style24/batch/biz/task/TsbGoodsTask.java
  33. 28 0
      style24.batch/src/main/java/com/style24/persistence/domain/GoodsIfIncomelot.java
  34. 30 0
      style24.batch/src/main/java/com/style24/persistence/domain/GoodsIfIncomelotitem.java
  35. 33 0
      style24.batch/src/main/java/com/style24/persistence/domain/GoodsIfMeasurement.java
  36. 33 0
      style24.batch/src/main/java/com/style24/persistence/domain/GoodsIfProductsku.java
  37. 64 0
      style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbCommon.xml
  38. 204 1
      style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml
  39. 83 0
      style24.batch/src/main/java/com/style24/persistence/mybatis/wms/TsbWmsGoods.xml
  40. 1 1
      style24.front/target/m2e-wtp/web-resources/META-INF/maven/com.style24.front/style24.front/pom.properties
  41. 3 1
      style24.scm/src/main/java/com/style24/persistence/domain/Goods.java
  42. 22 0
      style24.scm/src/main/java/com/style24/persistence/mybatis/shop/TssGoods.xml
  43. 8 0
      style24.scm/src/main/java/com/style24/scm/biz/dao/TssGoodsDao.java
  44. 42 22
      style24.scm/src/main/java/com/style24/scm/biz/service/TssGoodsService.java
  45. 56 8
      style24.scm/src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html

+ 19 - 0
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaCommonDao.java

@@ -2,6 +2,7 @@ package com.style24.admin.biz.dao;
 
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.SearchData;
+import com.style24.persistence.domain.Sequence;
 
 /**
  * 공용 Dao
@@ -12,6 +13,24 @@ import com.style24.persistence.domain.SearchData;
 @ShopDs
 public interface TsaCommonDao {
 
+	/**
+	 * 시퀀스 조회
+	 * @param value - 시퀀스명
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	Integer getNextSequence(String value);
+
+	/**
+	 * 시퀀스 생성
+	 * @param sequence - 시퀀스정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void createNextSequence(Sequence sequence);
+
 	/**
 	 * 엑셀조회를 위한 SEARCH 테이블 삭제
 	 *

+ 66 - 5
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaDisplayDao.java

@@ -15,13 +15,74 @@ import com.style24.persistence.domain.Category;
 public interface TsaDisplayDao {
 
 	/**
-	 * 카테고리관리 목록
-	 *
-	 * @param category
+	 * 카테고리 목록
+	 * @param category - 카테고리 정보
 	 * @return
-	 * @author eskim
-	 * @since 2020. 12. 16
+	 * @author gagamel
+	 * @since 2021. 1. 4
 	 */
 	Collection<Category> getCategoryList(Category category);
 
+	/**
+	 * 카테고리1 저장
+	 * @param category - 카테고리 정보
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void saveCategory1(Category category);
+
+	/**
+	 * 카테고리2 저장
+	 * @param category - 카테고리 정보
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void saveCategory2(Category category);
+
+	/**
+	 * 카테고리3 저장
+	 * @param category - 카테고리 정보
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void saveCategory3(Category category);
+
+	/**
+	 * 카테고리4 저장
+	 * @param category - 카테고리 정보
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void saveCategory4(Category category);
+
+	/**
+	 * 카테고리5 저장
+	 * @param category - 카테고리 정보
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void saveCategory5(Category category);
+
+	/**
+	 * 상위카테고리 단말여부 "N" 처리
+	 * @param category - 카테고리 정보
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void updateUpperCategoryLeafNo(Category category);
+
+	/**
+	 * 카테고리4SRCH truncate
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void truncateCategory4Srch();
+
+	/**
+	 * 카테고리4SRCH 생성
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void createCategory4Srch();
+
 }

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

@@ -29,6 +29,7 @@ import com.style24.persistence.domain.Option;
 import com.style24.persistence.domain.ReinboundInform;
 import com.style24.persistence.domain.Video;
 import com.style24.persistence.domain.WmsColorMapping;
+import com.style24.persistence.domain.WmsGoods;
 import com.style24.persistence.domain.WmsSeasonMapping;
 import com.style24.persistence.domain.WmsStyleYearMapping;
 
@@ -386,6 +387,14 @@ public interface TsaGoodsDao {
 	 */
 	void deleteGoodsDesc(GoodsDesc godsDesc);
 
+	/**
+	 * 상품 상세 정보 이력 생성
+	 * @param createGoodsDetailDesc
+	 * @author eskim
+	 * @since 2021. 01. 04
+	 */
+	public void createGoodsDetailDescHst(GoodsDesc godsDesc);
+
 	/**
 	 * 상품 상세정보 등록
 	 *
@@ -1059,4 +1068,14 @@ public interface TsaGoodsDao {
 	 */
 	public void updateFreeGoods(FreeGoods freeGoods);
 
+
+
+	/**
+	 * WMS입고상품관리 목록 조회
+	 * @param goodsSearch
+	 * @return Collection<WmsGoods>
+	 * @author eskim
+	 * @since 2021. 01. 04
+	 */
+	Collection<WmsGoods> getGoodsWmsIncomelotList(WmsGoods wmsGoods);
 }

+ 20 - 0
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaOrderDao.java

@@ -399,6 +399,26 @@ public interface TsaOrderDao {
 	 */
 	int createOrderDetailItemHst(Order order);
 	
+	/**
+	 * 주문상세 > 주문취소신청 > 주문상세정보 수정
+	 *
+	 * @param Order - 주문 정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2020. 12. 22
+	 */
+	int updateOrderDetail(Order order);
+	
+	/**
+	 * 주문상세 > 주문취소신청 > 주문상세정보 수정
+	 *
+	 * @param Order - 주문 정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2020. 12. 22
+	 */
+	int createOrderDetailhst(Order order);
+	
 	
 }
 

+ 23 - 1
style24.admin/src/main/java/com/style24/admin/biz/service/TsaCommonService.java

@@ -2,9 +2,13 @@ package com.style24.admin.biz.service;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import com.style24.admin.biz.dao.TsaCommonDao;
 import com.style24.persistence.domain.SearchData;
+import com.style24.persistence.domain.Sequence;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -21,6 +25,25 @@ public class TsaCommonService {
 	@Autowired
 	private TsaCommonDao commonDao;
 
+	/**
+	 * 시퀀스 조회(중첩트랜잭션으로 처리. 부모 트랜잭션의 커밋과 롤백에는 영향을 받지만 자신의 커밋과 롤백은 부모 트랜잭션에게 영향을 주지 않는다.)
+	 * @param sequenceNm - 시퀀스명
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	@Transactional(value = "shopTxnManager", isolation = Isolation.SERIALIZABLE, propagation = Propagation.NESTED)
+	public Integer getNextSequence(String sequenceNm) {
+		Integer nextVal = commonDao.getNextSequence(sequenceNm);
+
+		Sequence sequence = new Sequence();
+		sequence.setSequenceNm(sequenceNm);
+		sequence.setNextVal(nextVal);
+		commonDao.createNextSequence(sequence);
+
+		return sequence.getNextVal();
+	}
+
 	/**
 	 * 엑셀조회를 위한 SEARCH 테이블 삭제
 	 *
@@ -80,5 +103,4 @@ public class TsaCommonService {
 		return commonDao.getErpSyncYn();
 	}
 
-
 }

+ 67 - 5
style24.admin/src/main/java/com/style24/admin/biz/service/TsaDisplayService.java

@@ -3,9 +3,12 @@ package com.style24.admin.biz.service;
 import java.util.Collection;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.stereotype.Service;
+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 lombok.extern.slf4j.Slf4j;
@@ -23,17 +26,76 @@ public class TsaDisplayService {
 	@Autowired
 	private TsaDisplayDao displayDao;
 
+	@Autowired
+	private TsaCommonService commonService;
+
 	/**
-	 * 카테고리관리 목록
-	 *
-	 * @param category
+	 * 카테고리 목록
+	 * @param category - 카테고리 정보
 	 * @return
-	 * @author sasa004
-	 * @since 2020.01.07
+	 * @author gagamel
+	 * @since 2021. 1. 4
 	 */
 	public Collection<Category> getCategoryList(Category category) {
 		return displayDao.getCategoryList(category);
 	}
 
+	/**
+	 * 카테고리 저장
+	 * @param category - 카테고리 정보
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	@Transactional("shopTxnManager")
+	public void saveCategory(Category category) {
+		category.setRegNo(TsaSession.getInfo().getUserNo());
+		category.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		Integer selLvl = category.getSelLvl();
+
+		// 카테고리번호
+		Integer cateNo = category.getCateNo();
+		if (cateNo == null) {
+			cateNo = commonService.getNextSequence("SEQ_CATE");
+		}
+
+		if (selLvl == 1) {
+			category.setCate1No(cateNo);
+			category.setCate1Nm(category.getCateNm());
+			displayDao.saveCategory1(category);
+		} else if (selLvl == 2) {
+			category.setCate2No(cateNo);
+			category.setCate2Nm(category.getCateNm());
+			displayDao.saveCategory2(category);
+		} else if (selLvl == 3) {
+			category.setCate3No(cateNo);
+			category.setCate3Nm(category.getCateNm());
+			displayDao.saveCategory3(category);
+		} else if (selLvl == 4) {
+			category.setCate4No(cateNo);
+			category.setCate4Nm(category.getCateNm());
+			displayDao.saveCategory4(category);
+		} else if (selLvl == 5) {
+			category.setCate5No(cateNo);
+			category.setCate5Nm(category.getCateNm());
+			displayDao.saveCategory5(category);
+		}
+
+		if (selLvl >= 2) {
+			displayDao.updateUpperCategoryLeafNo(category);
+		}
+	}
+
+	/**
+	 * 카테고리 갱신
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	@Transactional("shopTxnManager")
+	@CacheEvict(value = "cate", allEntries = true)
+	public void refreshCategory() {
+		displayDao.truncateCategory4Srch();
+		displayDao.createCategory4Srch();
+	}
 
 }

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

@@ -47,6 +47,7 @@ import com.style24.persistence.domain.ReinboundInform;
 import com.style24.persistence.domain.SearchData;
 import com.style24.persistence.domain.Video;
 import com.style24.persistence.domain.WmsColorMapping;
+import com.style24.persistence.domain.WmsGoods;
 import com.style24.persistence.domain.WmsSeasonMapping;
 import com.style24.persistence.domain.WmsStyleYearMapping;
 
@@ -481,27 +482,38 @@ public class TsaGoodsService {
 		GoodsDesc goods = new GoodsDesc();
 		goods.setGoodsCd(resultGoods.getGoodsCd());
 
-		//		goods.setDescGb("10");
-		//		String goodsDesc = this.getGoodsDescList(goods);
-		//		resultGoods.setGoodsDesc(goodsDesc);
+		// 상품 상세 타이틀
+		goods.setDescGb("10");
+		String goodsTitlesDesc = this.getGoodsDescList(goods);
+		resultGoods.setGoodsTitlesDesc(goodsTitlesDesc);
 
-		// 상품 상세 pc 상단
+		// 상품 상세 내용
 		goods.setDescGb("20");
+		String goodsContentsDesc = this.getGoodsDescList(goods);
+		resultGoods.setGoodsContentsDesc(goodsContentsDesc);
+
+		// 상품 상세 특징
+		goods.setDescGb("30");
+		String goodsCharacterDesc = this.getGoodsDescList(goods);
+		resultGoods.setGoodsCharacterDesc(goodsCharacterDesc);
+
+		// 상품 상세 pc 상단
+		goods.setDescGb("40");
 		String goodsPcTopDesc = this.getGoodsDescList(goods);
 		resultGoods.setGoodsPcTopDesc(goodsPcTopDesc);
 
 		// 상품 상세  pc 하단
-		goods.setDescGb("30");
+		goods.setDescGb("50");
 		String goodsPcDownDesc = this.getGoodsDescList(goods);
 		resultGoods.setGoodsPcDownDesc(goodsPcDownDesc);
 
 		// 상품 상세 mobile 상단
-		goods.setDescGb("40");
+		goods.setDescGb("60");
 		String goodsMobileTopDesc = this.getGoodsDescList(goods);
 		resultGoods.setGoodsMobileTopDesc(goodsMobileTopDesc);
 
-		// 상품 상세 mpbile 하단
-		goods.setDescGb("50");
+		// 상품 상세 mobile 하단
+		goods.setDescGb("70");
 		String goodsMobileDownDesc = this.getGoodsDescList(goods);
 		resultGoods.setGoodsMobileDownDesc(goodsMobileDownDesc);
 
@@ -523,6 +535,8 @@ public class TsaGoodsService {
 			for (GoodsDesc tmpGoodsDesc : goodsDescList) {
 				goodsDescSb.append(tmpGoodsDesc.getGoodsDesc());
 			}
+		}else {
+			goodsDescSb.append("");
 		}
 		return goodsDescSb.toString();
 	}
@@ -1088,40 +1102,47 @@ public class TsaGoodsService {
 	 * @since 2020. 10. 27.
 	 */
 	private void saveGoodsDetailDesc(Goods goods) {
-		// 상품상세 구분(10:상품설명, 20:상위컨텐츠, 30:하위컨텐츠, 40:하위컨텐츠-모바일, 50:상위컨텐츠-모바일)
+		// 상품상세 구분(10:상품타이틀,20:상품타이틀내용,30:상품특징,40:상위컨텐츠,50:하위컨텐츠,60:하위컨텐츠-모바일,70:상위컨텐츠-모바일)
 		GoodsDesc goodsDesc = new GoodsDesc();
 		goodsDesc.setGoodsCd(goods.getGoodsCd());
 		goodsDesc.setRegNo(goods.getRegNo());
 		goodsDesc.setUpdNo(goods.getUpdNo());
 
-		// PC 상단
+		// AS-IS 상세 정보 이력 처리
+		goodsDao.createGoodsDetailDescHst(goodsDesc);
+
+		// 상세 타이틀
 		goodsDesc.setDescGb("10");
-		goodsDesc.setGoodsDesc(goods.getGoodsPcTopDesc());
+		goodsDesc.setGoodsDesc(goods.getGoodsTitlesDesc());
 		this.saveGoodsDesc(goodsDesc);
 
-		// PC 하단
+		// 상세 내용
 		goodsDesc.setDescGb("20");
-		goodsDesc.setGoodsDesc(goods.getGoodsPcTopDesc());
+		goodsDesc.setGoodsDesc(goods.getGoodsContentsDesc());
 		this.saveGoodsDesc(goodsDesc);
 
-		// 공용 하단
+		// 상세 특징
 		goodsDesc.setDescGb("30");
-		goodsDesc.setGoodsDesc(goods.getGoodsPcDownDesc());
+		goodsDesc.setGoodsDesc(goods.getGoodsCharacterDesc());
 		this.saveGoodsDesc(goodsDesc);
 
-		// MO 상단
+		// PC 상단
 		goodsDesc.setDescGb("40");
-		goodsDesc.setGoodsDesc(goods.getGoodsMobileTopDesc());
+		goodsDesc.setGoodsDesc(goods.getGoodsPcTopDesc());
 		this.saveGoodsDesc(goodsDesc);
 
-		//		// 상품상세 저장
+		// PC 하단
+		goodsDesc.setDescGb("50");
+		goodsDesc.setGoodsDesc(goods.getGoodsPcDownDesc());
+		this.saveGoodsDesc(goodsDesc);
 
-		//
-		//		// 세트상품의 구서상품으로 있을경우 처리
-		//		this.saveGoodsSetDesc(goodsDesc);
+		// MO 상단
+		goodsDesc.setDescGb("60");
+		goodsDesc.setGoodsDesc(goods.getGoodsMobileTopDesc());
+		this.saveGoodsDesc(goodsDesc);
 
 		// MO 하단
-		goodsDesc.setDescGb("50");
+		goodsDesc.setDescGb("70");
 		goodsDesc.setGoodsDesc(goods.getGoodsMobileDownDesc());
 		this.saveGoodsDesc(goodsDesc);
 
@@ -2634,4 +2655,17 @@ public class TsaGoodsService {
 
 	}
 
+	/**
+	 * WMS입고상품관리 목록 조회
+	 *
+	 * @param goodsSearch
+	 * @return Collection<WmsGoods>
+	 * @author eskim
+	 * @since 2021. 01. 04
+	 */
+	public Collection<WmsGoods> getGoodsWmsIncomelotList(WmsGoods wmsGoods) {
+		return goodsDao.getGoodsWmsIncomelotList(wmsGoods);
+	}
+
+
 }

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

@@ -738,7 +738,6 @@ public class TsaOrderService {
 				cancelDelvRefundList.add(delvObj);
 			}
 			
-			
 			spanSumRealOrdAmt	+= oneData.getRealOrdAmt();
 			spanPntDcAmt		+= orderObj.getPntDcAmt();
 			spanPrePntDcAmt		+= orderObj.getPrePntDcAmt();
@@ -886,12 +885,18 @@ public class TsaOrderService {
 				// 4.2.2 주문변경상세정보 등록
 				orderDao.createOrderChangeDetail(po);
 				
-				// 4.2.3 주문상세단품정보 변경
+				// 4.2.3 주문상세단품정보 수정
 				orderDao.updateOrderDetailItem(vo);
 				
 				// 4.2.4 주문상세단품정보 이력 등록
 				orderDao.createOrderDetailItemHst(vo);
 				
+				// 4.2.5 주문변경상세정보 수정
+				orderDao.updateOrderDetail(vo);
+				
+				// 4.2.6 주문변경상세정보 이력 등록
+				orderDao.createOrderDetailhst(vo);
+				
 				int a = 100/0;
 			}
 		}

+ 64 - 5
style24.admin/src/main/java/com/style24/admin/biz/web/TsaDisplayController.java

@@ -4,17 +4,23 @@ 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.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
 
 import com.style24.admin.biz.service.TsaDisplayService;
+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 lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.rest.server.GagaResponse;
+
 /**
  * 전시 Controller
  *
@@ -26,16 +32,42 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 public class TsaDisplayController extends TsaBaseController {
 
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TsaRendererService rendererService;
+
 	@Autowired
 	private TsaDisplayService displayService;
 
 	/**
-	 * 카테고리관리 조회
-	 *
-	 * @param category
+	 * 카테고리관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	@GetMapping("/category/form")
+	public ModelAndView categoryForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+		mav.addObject("cateGbList", rendererService.getAvailCommonCodeList("G032"));
+		mav.addObject("cateTypeList", rendererService.getAvailCommonCodeList("G031"));
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+		mav.addObject("conentsLocList", rendererService.getAvailCommonCodeList("G028"));
+
+		mav.setViewName("display/CategoryForm");
+
+		return mav;
+	}
+
+	/**
+	 * 카테고리 목록
+	 * @param category - 카테고리 정보
 	 * @return
-	 * @author eskim
-	 * @since 2020. 12. 16
+	 * @author gagamel
+	 * @since 2021. 1. 4
 	 */
 	@PostMapping("/category/list")
 	@ResponseBody
@@ -43,4 +75,31 @@ public class TsaDisplayController extends TsaBaseController {
 		return displayService.getCategoryList(category);
 	}
 
+	/**
+	 * 카테고리 저장
+	 * @param category - 카테고리 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	@PostMapping("/category/save")
+	@ResponseBody
+	public GagaResponse saveCategory(@RequestBody Category category) {
+		displayService.saveCategory(category);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 카테고리 갱신
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	@PostMapping("/category/refresh")
+	@ResponseBody
+	public GagaResponse refreshCategory() {
+		displayService.refreshCategory();
+		return super.ok(message.getMessage("SUCC_0010"));
+	}
+
 }

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

@@ -57,6 +57,7 @@ import com.style24.persistence.domain.ReinboundInform;
 import com.style24.persistence.domain.User;
 import com.style24.persistence.domain.Video;
 import com.style24.persistence.domain.WmsColorMapping;
+import com.style24.persistence.domain.WmsGoods;
 import com.style24.persistence.domain.WmsSeasonMapping;
 import com.style24.persistence.domain.WmsStyleYearMapping;
 
@@ -1243,7 +1244,7 @@ public class TsaGoodsController extends TsaBaseController {
 	 * @author eskim
 	 * @since 2020. 10. 16
 	 */
-	@GetMapping("/wms/instock/form")
+	@GetMapping("/wms/incomelot/form")
 	public ModelAndView wmsInstockForm() {
 		ModelAndView mav = new ModelAndView();
 
@@ -1256,11 +1257,25 @@ public class TsaGoodsController extends TsaBaseController {
 		// 품목
 		mav.addObject("itemkindList", rendererService.getAllItemkindList());
 
-		mav.setViewName("goods/GoodsWmsInstockForm");
+		mav.setViewName("goods/GoodsWmsIncomelotForm");
 
 		return mav;
 	}
 
+	/**
+	 * WMS입고상품관리 목록 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 04
+	 */
+	@PostMapping("/wms/incomelot/list")
+	@ResponseBody
+	public Collection<WmsGoods> getGoodsWmsIncomelotList(@RequestBody WmsGoods wmsGoods) {
+
+		return goodsService.getGoodsWmsIncomelotList(wmsGoods);
+	}
+
 	/**
 	 * 상품품목변경관리 화면
 	 *

+ 5 - 3
style24.admin/src/main/java/com/style24/persistence/domain/Category.java

@@ -19,7 +19,7 @@ public class Category extends TscBaseDomain {
 //	private String upperCateCode;
 	private String cateNm;
 	private Integer clsLvl;
-	private String selLvl;
+
 	private Integer dispOrd;
 	private String dispYn;
 	private String useYn;
@@ -33,8 +33,6 @@ public class Category extends TscBaseDomain {
 //
 //	private String fullCateCd;
 //	private String fullCateNm;
-//
-	private String siteCd;
 //
 //	private String brandGrpNm;
 //
@@ -49,4 +47,8 @@ public class Category extends TscBaseDomain {
 	private Integer cate5No;
 	private String cate5Nm;
 
+	// 검색조건
+	private String siteCd;
+	private Integer selLvl;
+
 }

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

@@ -78,11 +78,13 @@ public class Goods extends TscBaseDomain {
 	private String brandGrpNm;		//브랜드그룹명
 	private int brandNo;			// 브랜드번호
 
-	private String goodsDesc;
 	private String goodsPcTopDesc;
 	private String goodsPcDownDesc;
 	private String goodsMobileTopDesc;
 	private String goodsMobileDownDesc;
+	private String goodsTitlesDesc;
+	private String goodsContentsDesc;
+	private String goodsCharacterDesc;
 	private String chkDescKeep = "N";
 //
 	private String chDataYn = "N";

+ 20 - 0
style24.admin/src/main/java/com/style24/persistence/domain/Sequence.java

@@ -0,0 +1,20 @@
+package com.style24.persistence.domain;
+
+import java.io.Serializable;
+
+import lombok.Data;
+
+/**
+ * SEQUENCE Domain
+ * 
+ * @author gagamel
+ * @since 2021. 1. 4
+ */
+@SuppressWarnings("serial")
+@Data
+public class Sequence implements Serializable {
+
+	private String sequenceNm;	// 시퀀스명
+	private Integer nextVal;	// 다음값
+
+}

+ 37 - 0
style24.admin/src/main/java/com/style24/persistence/domain/WmsGoods.java

@@ -0,0 +1,37 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * wms 상품 정보 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 04
+ */
+@SuppressWarnings("serial")
+@Data
+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;	//공급처명
+	private int brandNo;			//브랜드번호
+	private String brandName;		//브랜드명
+	private String goodsRegDt;		//상품등록일시
+	private String goodsRegGb;		//상품등록구분(G:상품, F:사은품)
+
+	private String supplyCompCd;
+	private String brandCd;
+	private String stDate;
+	private String edDate;
+
+}

+ 17 - 0
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaCommon.xml

@@ -2,6 +2,22 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.style24.admin.biz.dao.TsaCommonDao">
 
+	<!-- 시퀀스 값 조회 -->
+	<select id="getNextSequence" parameterType="String" resultType="Integer">
+		/* TsaCommon.getNextSequence */
+		SELECT IFNULL((SELECT NEXT_VAL
+		               FROM   TB_SEQUENCE
+		               WHERE  SEQUENCE_NM = #{sequenceNm}
+		              ),0) + 1 AS NEXT_VAL
+	</select>
+
+	<!-- 시퀀스 생성 -->
+	<insert id="createNextSequence" parameterType="Sequence">
+		/* TsaCommon.createNextSequence */
+		INSERT INTO TB_SEQUENCE (SEQUENCE_NM, NEXT_VAL) VALUES (#{sequenceNm}, #{nextVal})
+		ON DUPLICATE KEY UPDATE NEXT_VAL = #{nextVal}
+	</insert>
+	
 	<!-- 엑셀조회를 위한 SEARCH 테이블 삭제  -->
 	<delete id="deleteExceluploadSearCh" parameterType="SearchData">
 		/* TsaCommon.deleteExceluploadSearCh */
@@ -71,4 +87,5 @@
 		WHERE CD_GB = 'G077'
 		AND CD = 'ERPSYNCYN'
 	</select>
+	
 </mapper>

+ 421 - 93
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml

@@ -2,123 +2,451 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.style24.admin.biz.dao.TsaDisplayDao">
 
-	<!-- 카테고리관리 목록 -->
+	<!-- 카테고리 목록 -->
 	<select id="getCategoryList" parameterType="Category" resultType="Category">
 		/* TsaDisplay.getCategoryList */
 		<if test='selLvl != null and selLvl != ""'>
-		<choose>
-		<when test='selLvl == "1"'>
-		SELECT SITE_CD
-		     , CATE_GB
-		     , '' AS CATE1_NO
-		     , '' AS CATE2_NO
-		     , '' AS CATE3_NO
-		     , '' AS CATE4_NO
-		     , '' AS CATE5_NO
-		     , '' AS CATE_NO
-		     , '' AS CATE_NM
-		     , '' AS CATE_TYPE     /*카테고리유형*/
-		     , 'N' AS LEAF_YN      /*단말여부*/
-		     , '' AS DISP_ORD      /*우선순위*/
-		     , '' AS FORMAL_GB     /*정상이월구분*/
-		     , '' AS CONTENTS_LOC  /*컨텐츠위치코드*/
-		     , 'N' AS DISP_YN   /*전시여부*/
-		     , 'Y' AS USE_YN   /*사용여부*/
-		FROM TB_CATE1
-		WHERE SITE_CD =  #{siteCd}
-		AND USE_YN = 'Y'
-		GROUP BY SITE_CD, CATE_GB
-		</when>
-		<otherwise>
-		SELECT SITE_CD
-		     , CATE_GB
+		SELECT SITE_CD                 /*사이트코드*/
+		     , CATE_GB                 /*카테고리구분*/
+		    <if test='selLvl == 1'>
 		     , CATE1_NO
-		     <if test='selLvl == "2"'>
-		     , '' AS CATE2_NO
-		     , '' AS CATE3_NO
-		     , '' AS CATE4_NO
-		     , '' AS CATE5_NO
-		     , CATE1_NO AS CATE_NO     /*카테고리코드*/
+		     , NULL     AS CATE2_NO
+		     , NULL     AS CATE3_NO
+		     , NULL     AS CATE4_NO
+		     , NULL     AS CATE5_NO
+		     , CATE1_NO AS CATE_NO     /*카테고리번호*/
 		     , CATE1_NM AS CATE_NM     /*카테고리명*/
-		     </if>
-		     <if test='selLvl == "3"'>
+		    </if>
+		    <if test='selLvl == 2'>
 		     , CATE2_NO
-		     , '' AS CATE3_NO
-		     , '' AS CATE4_NO
-		     , '' AS CATE5_NO
-		     , CATE2_NO AS CATE_NO     /*카테고리코드*/
+		     , NULL     AS CATE3_NO
+		     , NULL     AS CATE4_NO
+		     , NULL     AS CATE5_NO
+		     , CATE2_NO AS CATE_NO     /*카테고리번호*/
 		     , CATE2_NM AS CATE_NM     /*카테고리명*/
-		     </if>
-		     <if test='selLvl == "4"'>
+		    </if>
+		    <if test='selLvl == 3'>
 		     , CATE2_NO
 		     , CATE3_NO
-		     , '' AS CATE4_NO
-		     , '' AS CATE5_NO
-		     , CATE3_NO AS CATE_NO     /*카테고리코드*/
+		     , NULL     AS CATE4_NO
+		     , NULL     AS CATE5_NO
+		     , CATE3_NO AS CATE_NO     /*카테고리번호*/
 		     , CATE3_NM AS CATE_NM     /*카테고리명*/
-		     </if>
-		     <if test='selLvl == "5"'>
+		    </if>
+		    <if test='selLvl == 4'>
 		     , CATE2_NO
 		     , CATE3_NO
 		     , CATE4_NO
-		     , '' AS CATE5_NO
-		     , CATE4_NO AS CATE_NO     /*카테고리코드*/
+		     , NULL     AS CATE5_NO
+		     , CATE4_NO AS CATE_NO     /*카테고리번호*/
 		     , CATE4_NM AS CATE_NM     /*카테고리명*/
-		     </if>
-		     <if test='selLvl == "6"'>
+		    </if>
+		    <if test='selLvl == 5'>
 		     , CATE2_NO
 		     , CATE3_NO
 		     , CATE4_NO
 		     , CATE5_NO
-		     , CATE5_NO AS CATE_NO     /*카테고리코드*/
+		     , CATE5_NO AS CATE_NO     /*카테고리번호*/
 		     , CATE5_NM AS CATE_NM     /*카테고리명*/
-		     </if>
-		     , CATE_TYPE    /*카테고리유형*/
-		     , LEAF_YN      /*단말여부*/
-		     , DISP_ORD     /*우선순위*/
-		     , FORMAL_GB    /*정상이월구분*/
-		     , CONTENTS_LOC /*컨텐츠위치코드*/
-		     , DISP_YN      /*전시여부*/
-		     , USE_YN       /*사용여부*/
-		<if test='selLvl == "2"'>
-		  FROM TB_CATE1
-		 WHERE SITE_CD = #{siteCd}
-		   AND CATE_GB = #{cateGb}
+		    </if>
+		     , CATE_TYPE               /*카테고리유형*/
+		     , LEAF_YN                 /*단말여부*/
+		     , DISP_ORD                /*노출순서*/
+		     , FORMAL_GB               /*정상이월구분*/
+		     , CONTENTS_LOC            /*컨텐츠위치*/
+		     , DISP_YN                 /*전시여부*/
+		     , USE_YN                  /*사용여부*/
+		    <if test='selLvl == 1'>
+		FROM   TB_CATE1
+		WHERE  SITE_CD = #{siteCd}
+		AND    CATE_GB = #{cateGb}
+		    </if>
+		    <if test='selLvl == 2'>
+		FROM   TB_CATE2
+		WHERE  SITE_CD = #{siteCd}
+		AND    CATE_GB = #{cateGb}
+		AND    CATE1_NO = #{cate1No}
+		    </if>
+		    <if test='selLvl == 3'>
+		FROM   TB_CATE3
+		WHERE  SITE_CD = #{siteCd}
+		AND    CATE_GB = #{cateGb}
+		AND    CATE1_NO = #{cate1No}
+		AND    CATE2_NO = #{cate2No}
+		    </if>
+		    <if test='selLvl == 4'>
+		FROM   TB_CATE4
+		WHERE  SITE_CD = #{siteCd}
+		AND    CATE_GB = #{cateGb}
+		AND    CATE1_NO = #{cate1No}
+		AND    CATE2_NO = #{cate2No}
+		AND    CATE3_NO = #{cate3No}
+		    </if>
+		    <if test='selLvl == 5'>
+		FROM   TB_CATE5
+		WHERE  SITE_CD = #{siteCd}
+		AND    CATE_GB = #{cateGb}
+		AND    CATE1_NO = #{cate1No}
+		AND    CATE2_NO = #{cate2No}
+		AND    CATE3_NO = #{cate3No}
+		AND    CATE4_NO = #{cate4No}
+		    </if>
+		ORDER  BY DISP_ORD
+		</if>
+	</select>
+	
+	<!-- 카테고리1 저장 -->
+	<insert id="saveCategory1" parameterType="Category">
+		/* TsaDisplay.saveCategory1 */
+		INSERT INTO TB_CATE1 (
+		       SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE1_NM
+		     , CATE_TYPE
+		     , LEAF_YN
+		     , DISP_ORD
+		     , FORMAL_GB
+		     , CONTENTS_LOC
+		     , DISP_YN
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{siteCd}
+		     , #{cateGb}
+		     , #{cate1No}
+		     , #{cate1Nm}
+		     , #{cateType}
+		     , 'Y'
+		     , #{dispOrd}
+		     , #{formalGb}
+		     , #{contentsLoc}
+		     , #{dispYn}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       CATE1_NM = #{cate1Nm}
+		     , CATE_TYPE = #{cateType}
+		     , DISP_ORD = #{dispOrd}
+		     , FORMAL_GB = #{formalGb}
+		     , CONTENTS_LOC = #{contentsLoc}
+		     , DISP_YN = #{dispYn}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 카테고리2 저장 -->
+	<insert id="saveCategory2" parameterType="Category">
+		/* TsaDisplay.saveCategory2 */
+		INSERT INTO TB_CATE2 (
+		       SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE2_NO
+		     , CATE2_NM
+		     , CATE_TYPE
+		     , LEAF_YN
+		     , DISP_ORD
+		     , FORMAL_GB
+		     , CONTENTS_LOC
+		     , DISP_YN
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{siteCd}
+		     , #{cateGb}
+		     , #{cate1No}
+		     , #{cate2No}
+		     , #{cate2Nm}
+		     , #{cateType}
+		     , 'Y'
+		     , #{dispOrd}
+		     , #{formalGb}
+		     , #{contentsLoc}
+		     , #{dispYn}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       CATE1_NO = #{cate1No}
+		     , CATE2_NM = #{cate2Nm}
+		     , CATE_TYPE = #{cateType}
+		     , DISP_ORD = #{dispOrd}
+		     , FORMAL_GB = #{formalGb}
+		     , CONTENTS_LOC = #{contentsLoc}
+		     , DISP_YN = #{dispYn}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 카테고리3 저장 -->
+	<insert id="saveCategory3" parameterType="Category">
+		/* TsaDisplay.saveCategory3 */
+		INSERT INTO TB_CATE3 (
+		       SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE2_NO
+		     , CATE3_NO
+		     , CATE3_NM
+		     , CATE_TYPE
+		     , LEAF_YN
+		     , DISP_ORD
+		     , FORMAL_GB
+		     , CONTENTS_LOC
+		     , DISP_YN
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{siteCd}
+		     , #{cateGb}
+		     , #{cate1No}
+		     , #{cate2No}
+		     , #{cate3No}
+		     , #{cate3Nm}
+		     , #{cateType}
+		     , 'Y'
+		     , #{dispOrd}
+		     , #{formalGb}
+		     , #{contentsLoc}
+		     , #{dispYn}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       CATE2_NO = #{cate2No}
+		     , CATE3_NM = #{cate3Nm}
+		     , CATE_TYPE = #{cateType}
+		     , DISP_ORD = #{dispOrd}
+		     , FORMAL_GB = #{formalGb}
+		     , CONTENTS_LOC = #{contentsLoc}
+		     , DISP_YN = #{dispYn}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 카테고리4 저장 -->
+	<insert id="saveCategory4" parameterType="Category">
+		/* TsaDisplay.saveCategory4 */
+		INSERT INTO TB_CATE4 (
+		       SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE2_NO
+		     , CATE3_NO
+		     , CATE4_NO
+		     , CATE4_NM
+		     , CATE_TYPE
+		     , LEAF_YN
+		     , DISP_ORD
+		     , FORMAL_GB
+		     , CONTENTS_LOC
+		     , DISP_YN
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{siteCd}
+		     , #{cateGb}
+		     , #{cate1No}
+		     , #{cate2No}
+		     , #{cate3No}
+		     , #{cate4No}
+		     , #{cate4Nm}
+		     , #{cateType}
+		     , 'Y'
+		     , #{dispOrd}
+		     , #{formalGb}
+		     , #{contentsLoc}
+		     , #{dispYn}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       CATE3_NO = #{cate3No}
+		     , CATE4_NM = #{cate4Nm}
+		     , CATE_TYPE = #{cateType}
+		     , DISP_ORD = #{dispOrd}
+		     , FORMAL_GB = #{formalGb}
+		     , CONTENTS_LOC = #{contentsLoc}
+		     , DISP_YN = #{dispYn}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 카테고리5 저장 -->
+	<insert id="saveCategory5" parameterType="Category">
+		/* TsaDisplay.saveCategory5 */
+		INSERT INTO TB_CATE5 (
+		       SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE2_NO
+		     , CATE3_NO
+		     , CATE4_NO
+		     , CATE5_NO
+		     , CATE5_NM
+		     , CATE_TYPE
+		     , LEAF_YN
+		     , DISP_ORD
+		     , FORMAL_GB
+		     , CONTENTS_LOC
+		     , DISP_YN
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{siteCd}
+		     , #{cateGb}
+		     , #{cate1No}
+		     , #{cate2No}
+		     , #{cate3No}
+		     , #{cate4No}
+		     , #{cate5No}
+		     , #{cate5Nm}
+		     , #{cateType}
+		     , 'Y'
+		     , #{dispOrd}
+		     , #{formalGb}
+		     , #{contentsLoc}
+		     , #{dispYn}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       CATE4_NO = #{cate4No}
+		     , CATE5_NM = #{cate5Nm}
+		     , CATE_TYPE = #{cateType}
+		     , DISP_ORD = #{dispOrd}
+		     , FORMAL_GB = #{formalGb}
+		     , CONTENTS_LOC = #{contentsLoc}
+		     , DISP_YN = #{dispYn}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 상위카테고리 단말여부 "N" 처리-->
+	<update id="updateUpperCategoryLeafNo" parameterType="Category">
+		/* TsaDisplay.updateUpperCategoryLeafNo */
+		<if test='selLvl == 2'>
+		UPDATE TB_CATE1
 		</if>
-		<if test='selLvl == "3"'>
-		  FROM TB_CATE2
-		 WHERE SITE_CD = #{siteCd}
-		   AND CATE_GB = #{cateGb}
-		   AND CATE1_NO = #{cate1No}
+		<if test='selLvl == 3'>
+		UPDATE TB_CATE2
 		</if>
-		<if test='selLvl == "4"'>
-		  FROM TB_CATE3
-		 WHERE SITE_CD = #{siteCd}
-		   AND CATE_GB = #{cateGb}
-		   AND CATE1_NO = #{cate1No}
-		   AND CATE2_NO = #{cate2No}
+		<if test='selLvl == 4'>
+		UPDATE TB_CATE3
 		</if>
-		<if test='selLvl == "5"'>
-		  FROM TB_CATE4
-		 WHERE SITE_CD = #{siteCd}
-		   AND CATE_GB = #{cateGb}
-		   AND CATE1_NO = #{cate1No}
-		   AND CATE2_NO = #{cate2No}
-		   AND CATE3_NO = #{cate3No}
+		<if test='selLvl == 5'>
+		UPDATE TB_CATE4
 		</if>
-		<if test='selLvl == "6"'>
-		  FROM TB_CATE5
-		 WHERE SITE_CD = #{siteCd}
-		   AND CATE_GB = #{cateGb}
-		   AND CATE1_NO = #{cate1No}
-		   AND CATE2_NO = #{cate2No}
-		   AND CATE3_NO = #{cate3No}
-		   AND CATE4_NO = #{cate4No}
+		SET    LEAF_YN = 'N'
+		WHERE  SITE_CD = #{siteCd}
+		AND    CATE_GB = #{cateGb}
+		<if test='selLvl gte 2'>
+		AND    CATE1_NO = #{cate1No}
 		</if>
-		 ORDER BY SITE_CD, DISP_ORD
-		</otherwise>
-		</choose>
+		<if test='selLvl gte 3'>
+		AND    CATE2_NO = #{cate2No}
 		</if>
-	</select>
+		<if test='selLvl gte 4'>
+		AND    CATE3_NO = #{cate3No}
+		</if>
+		<if test='selLvl gte 5'>
+		AND    CATE4_NO = #{cate4No}
+		</if>
+		AND    LEAF_YN = 'Y'
+	</update>
+	
+	<!-- 카테고리4SRCH truncate -->
+	<delete id="truncateCategory4Srch">
+		/* TsaDisplay.truncateCategory4Srch */
+		TRUNCATE TABLE TB_CATE_4SRCH
+	</delete>
+	
+	<!-- 카테고리4SRCH 생성 -->
+	<insert id="createCategory4Srch">
+		/* TsaDisplay.createCategory4Srch */
+		INSERT INTO TB_CATE_4SRCH (
+		       SITE_CD
+		     , CATE_GB
+		     , LEAF_CATE_NO
+		     , CATE_TYPE
+		     , CATE1_NO
+		     , CATE1_NM
+		     , CATE2_NO
+		     , CATE2_NM
+		     , CATE3_NO
+		     , CATE3_NM
+		     , CATE4_NO
+		     , CATE4_NM
+		     , CATE5_NO
+		     , CATE5_NM
+		     , FULL_CATE_NO
+		     , FULL_CATE_NM
+		     , DISP_ORD
+		     , FORMAL_GB
+		     , CONTENTS_LOC
+		)
+		SELECT SITE_CD
+		     , CATE_GB
+		     , LEAF_CATE_NO
+		     , CATE_TYPE
+		     , CATE1_NO
+		     , CATE1_NM
+		     , CATE2_NO
+		     , CATE2_NM
+		     , CATE3_NO
+		     , CATE3_NM
+		     , CATE4_NO
+		     , CATE4_NM
+		     , CATE5_NO
+		     , CATE5_NM
+		     , FULL_CATE_NO
+		     , FULL_CATE_NM
+		     , DISP_ORD
+		     , FORMAL_GB
+		     , CONTENTS_LOC
+		FROM   VW_CATE_4SRCH
+	</insert>
 	
 </mapper>

+ 68 - 1
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -1638,6 +1638,28 @@
 		WHERE GOODS_CD = #{goodsCd}
 	</update>
 	
+	<!-- 상품 상세 정보 이력 생성 -->
+	<insert id="createGoodsDetailDescHst" parameterType="GoodsDesc">
+		/* TsaGoods.createGoodsDetailDescHst */
+		INSERT INTO TB_GOODS_DESC_HST (
+		    GOODS_CD
+		  , DESC_GB
+		  , SEQ
+		  , GOODS_DESC
+		  , REG_NO
+		  , REG_DT
+		)
+		SELECT GOODS_CD
+		     , DESC_GB
+		     , SEQ
+		     , GOODS_DESC
+		     , #{regNo}
+		     , NOW()
+		FROM TB_GOODS_DESC
+		WHERE GOODS_CD = #{goodsCd}
+		ORDER BY DESC_GB, DESC_GB
+	</insert>
+	
 	<!-- 상품 상세정보 삭제 -->
 	<delete id="deleteGoodsDesc" parameterType="GoodsDesc">
 		/* TsaGoods.deleteGoodsDesc */
@@ -3626,5 +3648,50 @@
 		  , UPD_NO = #{updNo}
 		  , UPD_DT = NOW()
 		WHERE PRODUCT_NO = #{productNo}
-	</update>
+	</update>
+	
+	<!-- WMS입고상품 목록 -->
+	<select id="getGoodsWmsIncomelotList" parameterType="WmsGoods" resultType="WmsGoods">
+		/* TsaGoods.getGoodsWmsIncomelotList */
+		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
+		     , A.BRAND_NO
+		     , A.BRAND_NAME
+		     , A.GOODS_REG_DT
+		     , A.GOODS_REG_GB
+		     , FN_GET_USER_NM(A.REG_NO) AS REG_NM
+		     , DATE_FORMAT(A.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
+		     , 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
+		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}),'%') 
+		</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>
 </mapper>

+ 41 - 17
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml

@@ -1795,24 +1795,24 @@
 	<update id="updateOrderDetailItem" parameterType="Order">
 		/* Order.updateOrderDetailItem */
 		UPDATE TB_ORDER_DETAIL_ITEM
-		SET    ORD_AMT = ORD_AMT - #{cnclRtnAmt}
-		     , CNCL_RTN_AMT = CNCL_RTN_AMT + #{cnclRtnAmt}
-		     , CPN1_DC_AMT = CPN1_DC_AMT - #{cpn1DcAmt}
-		     , TMTB1_DC_AMT = TMTB1_DC_AMT - #{tmtb1DcAmt}
-		     , TMTB2_DC_AMT = TMTB1_DC_AMT - #{tmtb2DcAmt}
-		     , GOODS_CPN_DC_AMT = GOODS_CPN_DC_AMT - #{goodsCpnDcAmt}
-		     , CART_CPN_DC_AMT = CART_CPN_DC_AMT - #{cartCpnDcAmt}
-		     , PNT_DC_AMT = PNT_DC_AMT - #{pntDcAmt}
-		     , PRE_PNT_DC_AMT = PRE_PNT_DC_AMT - #{prePntDcAmt}
-		     , SAVE_PNT_AMT = SAVE_PNT_AMT - #{savePntAmt}
-		     , REAL_ORD_AMT = REAL_ORD_AMT - #{realOrdAmt}
-		     , GFCD_USE_AMT = GFCD_USE_AMT - #{gfcdUseAmt}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = SYSDATE()
+		SET    ORD_AMT 				= ORD_AMT 				- #{cnclRtnAmt}
+		     , CNCL_RTN_AMT 		= CNCL_RTN_AMT 			+ #{cnclRtnAmt}
+		     , CPN1_DC_AMT 			= CPN1_DC_AMT 			- #{cpn1DcAmt}
+		     , TMTB1_DC_AMT 		= TMTB1_DC_AMT 			- #{tmtb1DcAmt}
+		     , TMTB2_DC_AMT 		= TMTB1_DC_AMT 			- #{tmtb2DcAmt}
+		     , GOODS_CPN_DC_AMT 	= GOODS_CPN_DC_AMT 		- #{goodsCpnDcAmt}
+		     , CART_CPN_DC_AMT 		= CART_CPN_DC_AMT 		- #{cartCpnDcAmt}
+		     , PNT_DC_AMT 			= PNT_DC_AMT 			- #{pntDcAmt}
+		     , PRE_PNT_DC_AMT 		= PRE_PNT_DC_AMT 		- #{prePntDcAmt}
+		     , SAVE_PNT_AMT 		= SAVE_PNT_AMT 			- #{savePntAmt}
+		     , REAL_ORD_AMT 		= REAL_ORD_AMT 			- #{realOrdAmt}
+		     , GFCD_USE_AMT 		= GFCD_USE_AMT 			- #{gfcdUseAmt}
+		     , UPD_NO 				= #{updNo}
+		     , UPD_DT 				= SYSDATE()
 		WHERE  1=1
-		AND    ORD_NO = #{ordNo} 
-		AND    ORD_DTL_NO = #{ordDtlNo} 
-		AND    ORD_DTL_ITEM_SQ = #{ordDtlItemSq}
+		AND    ORD_NO 				= #{ordNo} 
+		AND    ORD_DTL_NO 			= #{ordDtlNo} 
+		AND    ORD_DTL_ITEM_SQ 		= #{ordDtlItemSq}
 	</update>
 	
 	<!-- 주문상세 > 주문취소신청 > 주문상세단품정보 이력 등록 -->
@@ -1888,6 +1888,30 @@
 		AND    ORD_DTL_NO = #{ordDtlNo} 
 		AND    ORD_DTL_ITEM_SQ = #{ordDtlItemSq}
 	</insert>
+	
+	<!-- 주문상세 > 주문취소신청 > 주문상세정보 수정 -->
+	<update id="updateOrderDetail" parameterType="Order">
+		/* Order.updateOrderDetail */
+		UPDATE TB_ORDER_DETAIL
+		SET    ORD_AMT 				= ORD_AMT 				- #{cnclRtnAmt}
+		     , CNCL_RTN_AMT 		= CNCL_RTN_AMT 			+ #{cnclRtnAmt}
+		     , CPN1_DC_AMT 			= CPN1_DC_AMT 			- #{cpn1DcAmt}
+		     , TMTB1_DC_AMT 		= TMTB1_DC_AMT 			- #{tmtb1DcAmt}
+		     , TMTB2_DC_AMT 		= TMTB1_DC_AMT 			- #{tmtb2DcAmt}
+		     , GOODS_CPN_DC_AMT 	= GOODS_CPN_DC_AMT 		- #{goodsCpnDcAmt}
+		     , CART_CPN_DC_AMT 		= CART_CPN_DC_AMT 		- #{cartCpnDcAmt}
+		     , PNT_DC_AMT 			= PNT_DC_AMT 			- #{pntDcAmt}
+		     , PRE_PNT_DC_AMT 		= PRE_PNT_DC_AMT 		- #{prePntDcAmt}
+		     , SAVE_PNT_AMT 		= SAVE_PNT_AMT 			- #{savePntAmt}
+		     , REAL_ORD_AMT 		= REAL_ORD_AMT 			- #{realOrdAmt}
+		     , GFCD_USE_AMT 		= GFCD_USE_AMT 			- #{gfcdUseAmt}
+		     , UPD_NO 				= #{updNo}
+		     , UPD_DT 				= SYSDATE()
+		WHERE  1=1
+		AND    ORD_NO 				= #{ordNo} 
+		AND    ORD_DTL_NO 			= #{ordDtlNo} 
+		AND    ORD_DTL_ITEM_SQ 		= #{ordDtlItemSq}
+	</update>
 	
 </mapper>
 

+ 80 - 79
style24.admin/src/main/resources/i18n/messages/message_ko_KR.properties

@@ -1,79 +1,80 @@
-## -----------------------------------------------------------------------------
-## Message properties
-## -----------------------------------------------------------------------------
-SUCC_0001=\uc131\uacf5\uc801\uc73c\ub85c \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0002=\uc131\uacf5\uc801\uc73c\ub85c \uc218\uc815\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0003=\uc131\uacf5\uc801\uc73c\ub85c \uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0004=\uc131\uacf5\uc801\uc73c\ub85c \ucc98\ub9ac\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0005=\uc131\uacf5\uc801\uc73c\ub85c \ubc1c\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0006=\uc131\uacf5\uc801\uc73c\ub85c \ubc1c\ud589\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0007=\uc131\uacf5\uc801\uc73c\ub85c \uc5c5\ub85c\ub4dc \ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-#SUCC_0008=\uc131\uacf5\uc801\uc73c\ub85c \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0009=\uc131\uacf5\uc801\uc73c\ub85c \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-
-FAIL_0001=\uc624\ub958\ub85c \uc778\ud574 \uc800\uc7a5\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0002=\uc624\ub958\ub85c \uc778\ud574 \uc218\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0003=\uc624\ub958\ub85c \uc778\ud574 \uc0ad\uc81c\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0004=\uc624\ub958\ub85c \uc778\ud574 \ucc98\ub9ac\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0005=\uc624\ub958\ub85c \uc778\ud574 \ubc1c\uc1a1\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0006=\uc624\ub958\ub85c \uc778\ud574 \ubc1c\ud589\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0007=\uc624\ub958\ub85c \uc778\ud574 \uc5c5\ub85c\ub4dc \ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-#FAIL_0008=\uc624\ub958\ub85c \uc778\ud574 \ub4f1\ub85d\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0009=\uc624\ub958\ub85c \uc778\ud574 \ubcc0\uacbd\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_1001=\uc800\uc7a5\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
-FAIL_1002=\uc804\uc1a1\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
-FAIL_1003=\uc5d1\uc140\ub2e4\uc6b4\ub85c\ub4dc\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
-FAIL_1004=\uc0ad\uc81c\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
-
-LOGN_0001=\uc785\ub825\ud558\uc2e0 \uc815\ubcf4\ub85c \uac00\uc785\ub41c \ub0b4\uc5ed\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
-LOGN_0002=\ube44\ubc00\ubc88\ud638\uac00 \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
-LOGN_0003=\ub85c\uadf8\uc778 \uc0c1\ud0dc\uac00 \uc544\ub2d9\ub2c8\ub2e4. \ub2e4\uc2dc \ub85c\uadf8\uc778 \ud574\uc8fc\uc138\uc694.
-LOGN_0004=\ube44\ubc00\ubc88\ud638\ub97c \ubcc0\uacbd\ud55c \ub0a0\ub85c\ubd80\ud130 3\uac1c\uc6d4\uc774 \uacbd\uacfc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-
-##\uc8fc\ubb38
-ORDER_0001=\uc8fc\ubb38\uc815\ubcf4\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
-ORDER_0002=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uacb0\uc81c\uc644\ub8cc][\ucd9c\uace0\uc644\ub8cc] \uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uc0c1\ud488\uc900\ube44\uc911\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
-ORDER_0003=\ud574\ub2f9 \uc0c1\ud488 \ube0c\ub79c\ub4dc \uc218\uc815 \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
-ORDER_0004=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uc0c1\ud488\uc900\ube44\uc911][\uad6c\ub9e4\ud655\uc815] \uc0c1\ud0dc\uc5d0\ub9cc \uc1a1\uc7a5\ubc88\ud638\ub97c \uc785\ub825\ud558\uc2e4\uc218 \uc788\uc2b5\ub2c8\ub2e4.
-ORDER_0005=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucd9c\uace0\uc644\ub8cc]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad6c\ub9e4\ud655\uc815 \uc0c1\ud0dc\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
-ORDER_0006=\uad6c\ub9e4\ud655\uc815\uc744 \ud558\uc2e4\uc218 \uc788\ub294 \uc0c1\ud488\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \n\ubc18\ud488\uc774\ub098 \uad50\ud658\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.
-ORDER_0007=\uc8fc\ubb38 \uc804\uccb4\ucde8\uc18c\ub97c \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uad50\ud658,\ubc18\ud488,\ucde8\uc18c\uc911\uc778 \uc0c1\ud488\uc774 \uc788\ub294\uc9c0 \ud655\uc778 \ubc14\ub78d\ub2c8\ub2e4.
-ORDER_0008=\ud0c0 \uc5c5\uccb4\uc758 \uc0c1\ud488\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc804\uccb4 \ubc18\ud488\uc744 \uc9c4\ud589\ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-ORDER_0009=\ud3ec\uc778\ud2b8 \uc6d0\ubcf5 \ucc98\ub9ac\ub97c \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4.
-ORDER_0010=\uacb0\uc81c \ucde8\uc18c\ub97c \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4.
-ORDER_0011=\uce74\ub4dc \uacb0\uc81c\uc778 \uacbd\uc6b0\uc5d0\ub9cc \ubd80\ubd84\ucde8\uc18c\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0012=\ucde8\uc18c\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694. \ucde8\uc18c\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
-ORDER_0013=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uacb0\uc81c\uc644\ub8cc][\uc0c1\ud488\uc900\ube44\uc911]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubd80\ubd84\ucde8\uc18c\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0014=\ucd9c\uace0\uc644\ub8cc\ub97c \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uc8fc\ubb38 \ucde8\uc18c\uc2e0\uccad\ub41c \uc8fc\ubb38\uc744 \uba3c\uc800 \ucc98\ub9ac\ud574\uc8fc\uc2dc\uae30\ubc14\ub78d\ub2c8\ub2e4.
-ORDER_0015=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucd9c\uace0\uc644\ub8cc]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uc8fc\ubb38\uad50\ud658\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0016=\uad50\ud658\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694.\uad50\ud658\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
-ORDER_0017=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\uc9c4\ud589\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0018=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc9c4\ud589]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0019=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0020=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\uc9c4\ud589\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0021=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc9c4\ud589]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0022=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0023=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucde8\uc18c\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ucde8\uc18c\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0024=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucde8\uc18c\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ucde8\uc18c\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0025=\ubc18\ud488\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694. \ubc18\ud488\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
-ORDER_0026=\uc8fc\ubb38 \uc804\uccb4\ubc18\ud488\uc744 \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uad50\ud658,\ubc18\ud488,\ucde8\uc18c\uc911\uc778 \uc0c1\ud488\uc774 \uc788\ub294\uc9c0 \ud655\uc778 \ubc14\ub78d\ub2c8\ub2e4.
-ORDER_0027=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uc0c1\ud488\uc900\ube44\uc911] \uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uacb0\uc81c\uc644\ub8cc \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
-ORDER_0028=\uacb0\uc81c \uc644\ub8cc \uc0c1\ud0dc\ub85c \ubcc0\uacbd\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\ucde8\uc18c,\ubc18\ud488\uc774 \uc644\ub8cc\ub41c \uc8fc\ubb38\uc785\ub2c8\ub2e4.
-ORDER_0029=\uc8fc\ubb38 \uc0c1\ud0dc\ub97c \ud655\uc778\ud574 \uc8fc\uc138\uc694. [\ucd9c\uace0\uc911][\uad6c\ub9e4\ud655\uc815]\uc0c1\ud0dc\uc778 \uc8fc\ubb38\uac74\uc774 \uc788\uc2b5\ub2c8\ub2e4.
-ORDER_0030=\ud544\uc218\uac12\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
-ORDER_0031=\uc8fc\ubb38\uc804\uccb4\ucde8\uc18c \ucc98\ub9ac\uac00 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-
-#\uc0ac\ubc29\ub137
-SABANGNET_0001=\uc131\uacf5\uc801\uc73c\ub85c \uc0c1\ud488 \uc815\ubcf4\uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
-SABANGNET_0002=\uc131\uacf5\uc801\uc73c\ub85c \uc1fc\ud551\ubab0\ubcc4 DATA \uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
-SABANGNET_0003=\uc131\uacf5\uc801\uc73c\ub85c \uc0c1\ud488 \uc694\uc57d \uc815\ubcf4\uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
-SABANGNET_0004=\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5, \uc2e4\ud328: {2}\uac74)
-SABANGNET_0005=\uc131\uacf5\uc801\uc73c\ub85c \uc1a1\uc7a5\ubc88\ud638\uac00 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SABANGNET_0006=\ucde8\uc18c\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
-SABANGNET_0007=\uad50\ud658\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
-SABANGNET_0008=\ubc18\ud488\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
-SABANGNET_0009=\uc720\ud6a8\uc131 \uac80\uc99d \uc2e4\ud328\ub85c \ucc98\ub9ac\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-SABANGNET_0010=\ucd9c\uace0\ub97c \uc704\ud574 ERP\ub85c \uc804\uc1a1\ud558\uc600\uc2b5\ub2c8\ub2e4.(\uc131\uacf5: {0}\uac74, \uc2e4\ud328: {1}\uac74)
-
-#\ubc30\uc1a1
-DELIVERY_0001=\ub4f1\ub85d \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. \uc774\ubbf8 \ub4f1\ub85d\ub41c \ucd9c\uace0\uae08\uc9c0 \uc0c1\ud488\uc774 \uc788\uc2b5\ub2c8\ub2e4.
+## -----------------------------------------------------------------------------
+## Message properties
+## -----------------------------------------------------------------------------
+SUCC_0001=\uc131\uacf5\uc801\uc73c\ub85c \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0002=\uc131\uacf5\uc801\uc73c\ub85c \uc218\uc815\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0003=\uc131\uacf5\uc801\uc73c\ub85c \uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0004=\uc131\uacf5\uc801\uc73c\ub85c \ucc98\ub9ac\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0005=\uc131\uacf5\uc801\uc73c\ub85c \ubc1c\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0006=\uc131\uacf5\uc801\uc73c\ub85c \ubc1c\ud589\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0007=\uc131\uacf5\uc801\uc73c\ub85c \uc5c5\ub85c\ub4dc \ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+#SUCC_0008=\uc131\uacf5\uc801\uc73c\ub85c \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0009=\uc131\uacf5\uc801\uc73c\ub85c \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0010=\uc131\uacf5\uc801\uc73c\ub85c \uac31\uc2e0\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+
+FAIL_0001=\uc624\ub958\ub85c \uc778\ud574 \uc800\uc7a5\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0002=\uc624\ub958\ub85c \uc778\ud574 \uc218\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0003=\uc624\ub958\ub85c \uc778\ud574 \uc0ad\uc81c\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0004=\uc624\ub958\ub85c \uc778\ud574 \ucc98\ub9ac\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0005=\uc624\ub958\ub85c \uc778\ud574 \ubc1c\uc1a1\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0006=\uc624\ub958\ub85c \uc778\ud574 \ubc1c\ud589\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0007=\uc624\ub958\ub85c \uc778\ud574 \uc5c5\ub85c\ub4dc \ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+#FAIL_0008=\uc624\ub958\ub85c \uc778\ud574 \ub4f1\ub85d\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0009=\uc624\ub958\ub85c \uc778\ud574 \ubcc0\uacbd\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_1001=\uc800\uc7a5\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
+FAIL_1002=\uc804\uc1a1\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
+FAIL_1003=\uc5d1\uc140\ub2e4\uc6b4\ub85c\ub4dc\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
+FAIL_1004=\uc0ad\uc81c\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
+
+LOGN_0001=\uc785\ub825\ud558\uc2e0 \uc815\ubcf4\ub85c \uac00\uc785\ub41c \ub0b4\uc5ed\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
+LOGN_0002=\ube44\ubc00\ubc88\ud638\uac00 \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
+LOGN_0003=\ub85c\uadf8\uc778 \uc0c1\ud0dc\uac00 \uc544\ub2d9\ub2c8\ub2e4. \ub2e4\uc2dc \ub85c\uadf8\uc778 \ud574\uc8fc\uc138\uc694.
+LOGN_0004=\ube44\ubc00\ubc88\ud638\ub97c \ubcc0\uacbd\ud55c \ub0a0\ub85c\ubd80\ud130 3\uac1c\uc6d4\uc774 \uacbd\uacfc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+
+##\uc8fc\ubb38
+ORDER_0001=\uc8fc\ubb38\uc815\ubcf4\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
+ORDER_0002=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uacb0\uc81c\uc644\ub8cc][\ucd9c\uace0\uc644\ub8cc] \uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uc0c1\ud488\uc900\ube44\uc911\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
+ORDER_0003=\ud574\ub2f9 \uc0c1\ud488 \ube0c\ub79c\ub4dc \uc218\uc815 \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
+ORDER_0004=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uc0c1\ud488\uc900\ube44\uc911][\uad6c\ub9e4\ud655\uc815] \uc0c1\ud0dc\uc5d0\ub9cc \uc1a1\uc7a5\ubc88\ud638\ub97c \uc785\ub825\ud558\uc2e4\uc218 \uc788\uc2b5\ub2c8\ub2e4.
+ORDER_0005=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucd9c\uace0\uc644\ub8cc]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad6c\ub9e4\ud655\uc815 \uc0c1\ud0dc\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
+ORDER_0006=\uad6c\ub9e4\ud655\uc815\uc744 \ud558\uc2e4\uc218 \uc788\ub294 \uc0c1\ud488\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \n\ubc18\ud488\uc774\ub098 \uad50\ud658\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.
+ORDER_0007=\uc8fc\ubb38 \uc804\uccb4\ucde8\uc18c\ub97c \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uad50\ud658,\ubc18\ud488,\ucde8\uc18c\uc911\uc778 \uc0c1\ud488\uc774 \uc788\ub294\uc9c0 \ud655\uc778 \ubc14\ub78d\ub2c8\ub2e4.
+ORDER_0008=\ud0c0 \uc5c5\uccb4\uc758 \uc0c1\ud488\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc804\uccb4 \ubc18\ud488\uc744 \uc9c4\ud589\ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
+ORDER_0009=\ud3ec\uc778\ud2b8 \uc6d0\ubcf5 \ucc98\ub9ac\ub97c \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4.
+ORDER_0010=\uacb0\uc81c \ucde8\uc18c\ub97c \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4.
+ORDER_0011=\uce74\ub4dc \uacb0\uc81c\uc778 \uacbd\uc6b0\uc5d0\ub9cc \ubd80\ubd84\ucde8\uc18c\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0012=\ucde8\uc18c\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694. \ucde8\uc18c\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
+ORDER_0013=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uacb0\uc81c\uc644\ub8cc][\uc0c1\ud488\uc900\ube44\uc911]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubd80\ubd84\ucde8\uc18c\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0014=\ucd9c\uace0\uc644\ub8cc\ub97c \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uc8fc\ubb38 \ucde8\uc18c\uc2e0\uccad\ub41c \uc8fc\ubb38\uc744 \uba3c\uc800 \ucc98\ub9ac\ud574\uc8fc\uc2dc\uae30\ubc14\ub78d\ub2c8\ub2e4.
+ORDER_0015=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucd9c\uace0\uc644\ub8cc]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uc8fc\ubb38\uad50\ud658\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0016=\uad50\ud658\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694.\uad50\ud658\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
+ORDER_0017=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\uc9c4\ud589\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0018=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc9c4\ud589]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0019=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0020=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\uc9c4\ud589\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0021=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc9c4\ud589]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0022=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0023=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucde8\uc18c\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ucde8\uc18c\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0024=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucde8\uc18c\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ucde8\uc18c\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0025=\ubc18\ud488\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694. \ubc18\ud488\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
+ORDER_0026=\uc8fc\ubb38 \uc804\uccb4\ubc18\ud488\uc744 \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uad50\ud658,\ubc18\ud488,\ucde8\uc18c\uc911\uc778 \uc0c1\ud488\uc774 \uc788\ub294\uc9c0 \ud655\uc778 \ubc14\ub78d\ub2c8\ub2e4.
+ORDER_0027=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uc0c1\ud488\uc900\ube44\uc911] \uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uacb0\uc81c\uc644\ub8cc \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
+ORDER_0028=\uacb0\uc81c \uc644\ub8cc \uc0c1\ud0dc\ub85c \ubcc0\uacbd\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\ucde8\uc18c,\ubc18\ud488\uc774 \uc644\ub8cc\ub41c \uc8fc\ubb38\uc785\ub2c8\ub2e4.
+ORDER_0029=\uc8fc\ubb38 \uc0c1\ud0dc\ub97c \ud655\uc778\ud574 \uc8fc\uc138\uc694. [\ucd9c\uace0\uc911][\uad6c\ub9e4\ud655\uc815]\uc0c1\ud0dc\uc778 \uc8fc\ubb38\uac74\uc774 \uc788\uc2b5\ub2c8\ub2e4.
+ORDER_0030=\ud544\uc218\uac12\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
+ORDER_0031=\uc8fc\ubb38\uc804\uccb4\ucde8\uc18c \ucc98\ub9ac\uac00 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+
+#\uc0ac\ubc29\ub137
+SABANGNET_0001=\uc131\uacf5\uc801\uc73c\ub85c \uc0c1\ud488 \uc815\ubcf4\uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
+SABANGNET_0002=\uc131\uacf5\uc801\uc73c\ub85c \uc1fc\ud551\ubab0\ubcc4 DATA \uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
+SABANGNET_0003=\uc131\uacf5\uc801\uc73c\ub85c \uc0c1\ud488 \uc694\uc57d \uc815\ubcf4\uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
+SABANGNET_0004=\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5, \uc2e4\ud328: {2}\uac74)
+SABANGNET_0005=\uc131\uacf5\uc801\uc73c\ub85c \uc1a1\uc7a5\ubc88\ud638\uac00 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SABANGNET_0006=\ucde8\uc18c\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
+SABANGNET_0007=\uad50\ud658\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
+SABANGNET_0008=\ubc18\ud488\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
+SABANGNET_0009=\uc720\ud6a8\uc131 \uac80\uc99d \uc2e4\ud328\ub85c \ucc98\ub9ac\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
+SABANGNET_0010=\ucd9c\uace0\ub97c \uc704\ud574 ERP\ub85c \uc804\uc1a1\ud558\uc600\uc2b5\ub2c8\ub2e4.(\uc131\uacf5: {0}\uac74, \uc2e4\ud328: {1}\uac74)
+
+#\ubc30\uc1a1
+DELIVERY_0001=\ub4f1\ub85d \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. \uc774\ubbf8 \ub4f1\ub85d\ub41c \ucd9c\uace0\uae08\uc9c0 \uc0c1\ud488\uc774 \uc788\uc2b5\ub2c8\ub2e4.

+ 433 - 0
style24.admin/src/main/webapp/WEB-INF/views/display/CategoryForm.html

@@ -0,0 +1,433 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CategoryForm.html
+ * @desc    : 카테고리관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.12.30   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/display/category/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col width="10%"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>카테고리</th>
+						<td>
+							<input type="hidden" name="selLvl"/>
+							<select name="siteCd">
+<!-- 								<option value="">[사이트]</option> -->
+								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<select name="cateGb" id="selCate1" onchange="fnChangeSearchCondition($(this).val(), 1);">
+								<option value="">[카테고리구분]</option>
+								<option th:if="${cateGbList}" th:each="oneData, status : ${cateGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<select name="cate1No" id="selCate2" onchange="fnChangeSearchCondition($(this).val(), 2);">
+								<option value="">[카테고리1]</option>
+							</select>
+							<select name="cate2No" id="selCate3" onchange="fnChangeSearchCondition($(this).val(), 3);">
+								<option value="">[카테고리2]</option>
+							</select>
+							<select name="cate3No" id="selCate4" onchange="fnChangeSearchCondition($(this).val(), 4);">
+								<option value="">[카테고리3]</option>
+							</select>
+							<select name="cate4No" id="selCate5" onchange="fnChangeSearchCondition($(this).val(), 5);">
+								<option value="">[카테고리4]</option>
+							</select>
+						</td>
+					</tr>
+				</table>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+		
+		<!-- 등록/수정 -->
+		<div class="panelStyle">
+			<form id="detailForm" name="detailForm" action="#" th:action="@{'/display/category/save'}">
+				<table class="frmStyle" aria-describedby="등록/수정 폼">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:23%;"/>
+						<col style="width:10%;"/>
+						<col style="width:23%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>카테고리번호</th>
+						<td>
+							<input type="text" class="w200" name="cateNo" placeholder="자동생성" readonly="readonly"/>
+						</td>
+						<th>카테고리명<i class="required" title="필수"></i></th>
+						<td class="infoTxt">
+							<input type="text" class="w200" name="cateNm" maxlength="50" required="required" data-valid-name="카테고리명"/>
+						</td>
+						<th>카테고리유형<i class="required" title="필수"></i></th>
+						<td>
+							<select name="cateType" data-valid-name="카테고리유형">
+								<option th:if="${cateTypeList}" th:each="oneData, status : ${cateTypeList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>상위카테고리<i class="required" title="필수"></i></th>
+						<td colspan="5">
+							<input type="hidden" name="selLvl"/>
+							<select name="siteCd" data-valid-name="사이트">
+<!-- 								<option value="">[사이트]</option> -->
+								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<select name="cateGb" id="cateLvl1" data-valid-name="카테고리구분" onchange="fnChangeUpperCategory($(this).val(), 1);">
+								<option value="">[카테고리구분]</option>
+								<option th:if="${cateGbList}" th:each="oneData, status : ${cateGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<select name="cate1No" id="cateLvl2" data-valid-name="카테고리1" onchange="fnChangeUpperCategory($(this).val(), 2);">
+								<option value="">[카테고리1]</option>
+							</select>
+							<select name="cate2No" id="cateLvl3" data-valid-name="카테고리2" onchange="fnChangeUpperCategory($(this).val(), 3);">
+								<option value="">[카테고리2]</option>
+							</select>
+							<select name="cate3No" id="cateLvl4" data-valid-name="카테고리3" onchange="fnChangeUpperCategory($(this).val(), 4);">
+								<option value="">[카테고리3]</option>
+							</select>
+							<select name="cate4No" id="cateLvl5" data-valid-name="카테고리4" onchange="fnChangeUpperCategory($(this).val(), 5);">
+								<option value="">[카테고리4]</option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>노출순서<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="aR w100" name="dispOrd" maxlength="5" required="required" data-valid-type="integer" data-valid-name="노출순서"/>
+						</td>
+						<th>정상이월구분</th>
+						<td>
+							<select name="formalGb">
+								<option value="">[선택]</option>
+								<option th:if="${formalGbList}" th:each="oneData, status : ${formalGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>컨텐츠위치</th>
+						<td>
+							<select name="contentsLoc">
+								<option value="">[선택]</option>
+								<option th:if="${contentsLocList}" th:each="oneData, status : ${contentsLocList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>노출여부<i class="required" title="필수"></i></th>
+						<td>
+<!-- 							<input type="hidden" name="useYn"/> -->
+<!-- 							<label class="chkBox checked"><input type="checkbox" name="chkUseYn" value="Y" checked="checked"/>사용</label> -->
+							<label class="rdoBtn"><input type="radio" name="dispYn" value="Y" checked="checked">노출</label>
+							<label class="rdoBtn"><input type="radio" name="dispYn" value="N">미노출</label>
+						</td>
+						<th>사용여부<i class="required" title="필수"></i></th>
+						<td colspan="3">
+							<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked">사용</label>
+							<label class="rdoBtn"><input type="radio" name="useYn" value="N">미사용</label>
+						</td>
+					</tr>
+				</table>
+			</form>
+			
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
+					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+					<button type="button" class="btn btn-base btn-lg" id="btnRefresh4Srch" th:if="${sessionInfo.roleCd == 'G001_0000'}">4SRCH 갱신</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+		</div>
+		<!-- 등록/수정 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let siteList = gagajf.convertToArray([[${siteList}]]);
+	let cateGbList = gagajf.convertToArray([[${cateGbList}]]);
+	let cateTypeList = gagajf.convertToArray([[${cateTypeList}]]);
+	let formalGbList = gagajf.convertToArray([[${formalGbList}]]);
+	let conentsLocList = gagajf.convertToArray([[${conentsLocList}]]);
+
+	let columnDefs = [
+		{
+			headerName: "사이트", field: "siteCd", width: 150, cellClass: 'text-center',
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(siteList, params.value); }
+		},
+		{
+			headerName: "카테고리구분", field: "cateGb", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.lookupValue(cateGbList, params.value); }
+		},
+		{headerName: "카테고리번호", field: "cateNo", width: 150, cellClass: 'text-center'},
+		{
+			headerName: "카테고리명", field: "cateNm", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{
+			headerName: "카테고리유형", field: "cateType", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { gagaAgGrid.lookupValue(cateTypeList, params.value); }
+		},
+		{headerName: "말단여부", field: "leafYn", width: 80, cellClass: 'text-center'},
+		{headerName: "노출순서", field: "dispOrd", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "정상이월구분", field: "formalGb", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.lookupValue(formalGbList, params.value); }
+		},
+		{
+			headerName: "컨텐츠위치", field: "contentsLoc", width: 200, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.lookupValue(conentsLocList, params.value); }
+		},
+		{headerName: "노출여부", field: "dispYn", width: 80, cellClass: 'text-center'},
+		{headerName: "사용여부", field: "useYn", width: 80, cellClass: 'text-center'}
+	];
+	
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	
+	// Cell click
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field != 'cateNm')
+			return;
+		
+		$("#btnNew").click();
+		$('#detailForm input[name=siteCd]').val(event.data.siteCd);
+		$('#detailForm input[name=cateNo]').val(event.data.cateNo);
+		$('#detailForm input[name=cateNm]').val(event.data.cateNm);
+		$('#detailForm select[name=cateType]').val(event.data.cateType);
+		
+		// 상위카테고리
+		var selLvl = $("#searchForm input[name=selLvl]").val();
+		for (let i = 1; i <= 5; i++) {
+			$("#cateLvl" + i).html($("#selCate" + i).html());
+			$("#cateLvl" + i).val($("#selCate" + i).val());
+			if (i >= selLvl) {
+				$("#cateLvl" + i).hide();
+			} else {
+				$("#cateLvl" + i).show();
+			}
+		}
+		$('#detailForm input[name=selLvl]').val(selLvl);
+		
+		$('#detailForm input[name=dispOrd]').val(event.data.dispOrd);
+		$('#detailForm select[name=formalGb]').val(event.data.formalGb);
+		$('#detailForm select[name=contentsLoc]').val(event.data.contentsLoc);
+		
+		// 카테고리유형에 따른 컨텐츠위치 설정 변경
+		if (event.data.cateType == 'G031_10') {
+			$('#detailForm select[name=contentsLoc]').prop('disabled', true);
+		} else if (event.data.cateType == 'G031_20') {
+			$('#detailForm select[name=contentsLoc]').prop('disabled', false);
+		}
+		
+		$('#detailForm input:radio[name=dispYn]:input[value=' + event.data.dispYn + ']').click();
+		$('#detailForm input:radio[name=useYn]:input[value=' + event.data.useYn + ']').click();
+	}
+
+	/**
+	 * 검색폼의 카테고리 선택 시
+	 */
+	var fnChangeSearchCondition = function(val, selLvl) {
+		if (gagajf.isNull(val)) {
+			if (selLvl > 1) {
+				selLvl = selLvl - 1;
+			} else {
+				selLvl = 1;
+			}
+		}
+		$('#searchForm input[name=selLvl]').val(selLvl);
+		
+		// Fetch data
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm', function(data) {
+			let selLvl = Number($('#searchForm input[name=selLvl]').val()) + 1;
+			
+			for (let i = 2; i <= 5; i++) {
+				if (i >= selLvl) {
+					$('#selCate' + i).html('<option value="">[카테고리' + (i - 1) + ']</option>');
+				}
+			}
+			
+			let tag = '';
+			for (let i = 0; i < data.length; i++) {
+				if (data[i].useYn == 'Y') {
+					tag += '<option value="' + data[i].cateNo + '">[' + data[i].cateNo + '] ' + data[i].cateNm + '</option>';
+				}
+			}
+			
+			$("#selCate" + selLvl).append(tag);
+			$("#btnNew").click();
+		});
+	}
+	
+	// 카테고리유형 변경 시
+	$('#detailForm select[name=cateType]').on('change', function() {
+		if ($(this).val() == 'G031_10') { // 상품분류카테고리
+			$("#detailForm select[name=contentsLoc]").prop('disabled', true);
+		} else if ($(this).val() == 'G031_20') { // 컨텐츠카테고리
+			$("#detailForm select[name=contentsLoc]").prop('disabled', false);
+		}
+	});
+	
+	// 등록/수정폼의 상위카테고리 선택 시
+	var fnChangeUpperCategory = function(val, selLvl) {
+		if (gagajf.isNull(val)) {
+			if (selLvl > 1) {
+				selLvl = selLvl - 1;
+			} else {
+				selLvl = 1;
+			}
+		}
+		$('#detailForm input[name=selLvl]').val(selLvl);
+		
+		gagajf.ajaxFormSubmit($('#searchForm').prop('action'), "#detailForm", function(data) {
+			let selLvl = Number($('#detailForm input[name=selLvl]').val()) + 1;
+			
+			for (let i = 2; i <= 5; i++) {
+				if (i >= selLvl) {
+					$('#cateLvl' + i).html('<option value="">[카테고리' + (i - 1) + ']</option>');
+				}
+			}
+			
+			let tag = '';
+			for (let i = 0; i < data.length; i++) {
+				if (data[i].useYn == 'Y') {
+					tag += '<option value="' + data[i].cateNo + '">[' + data[i].cateNo + '] ' + data[i].cateNm + '</option>';
+				}
+			}
+			
+			$("#cateLvl" + selLvl).append(tag);
+		});
+	}
+	
+	// 신규
+	$('#btnNew').on('click', function(){
+		$("#detailForm")[0].reset();
+// 		$("#detailForm input[name=selLvl]").val('');
+		for (let i = 2; i <= 5; i++) {
+			$("#cateLvl" + i).show();
+		}
+	});
+	
+	// 저장
+	$('#btnSave').on('click', function() {
+		// 입력 값 체크
+		if (!gagajf.validation('#detailForm'))
+			return false;
+		
+		let selLvl = Number($('#detailForm input[name=selLvl]').val());
+		if (gagajf.isNull($('#detailForm select[name=cate1No]').val())) {
+			if (selLvl > 2) {
+				mcxDialog.alertC('카테고리1을 선택해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#detailForm select[name=cate1No]').focus();
+					}
+				});
+				return;
+			}
+		}
+		
+		if (gagajf.isNull($('#detailForm select[name=cate2No]').val())) {
+			if (selLvl > 3) {
+				mcxDialog.alertC('카테고리2를 선택해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#detailForm select[name=cate2No]').focus();
+					}
+				});
+				return;
+			}
+		}
+		
+		if (gagajf.isNull($('#detailForm select[name=cate3No]').val())) {
+			if (selLvl > 4) {
+				mcxDialog.alertC('카테고리3을 선택해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#detailForm select[name=cate3No]').focus();
+					}
+				});
+				return;
+			}
+		}
+		
+		if (gagajf.isNull($('#detailForm select[name=cate4No]').val())) {
+			if (selLvl > 5) {
+				mcxDialog.alertC('카테고리4를 선택해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#detailForm select[name=cate4No]').focus();
+					}
+				});
+				return;
+			}
+		}
+		
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				$("#detailForm select[name=contentsLoc]").prop('disabled', false);
+				
+				var jsonData = JSON.stringify($('#detailForm').serializeObject());
+				gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {
+					$('#btnNew').trigger('click');
+				});
+			}
+		});
+	});
+	
+	// 카테고리 갱신
+	$("#btnRefresh4Srch").on("click", function() {
+		mcxDialog.confirm('갱신하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxJsonSubmit('/display/category/refresh', null);
+			}
+		});
+	});
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+		
+		$("#detailForm select[name=contentsLoc]").prop('disabled', false);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 62 - 10
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html

@@ -14,13 +14,12 @@
  * 1.0  2020.10.23   eskim       최초 작성
  *******************************************************************************
  -->
-	<div class="modalPopup" data-width="1500"> <!-- data-width="1500" data-height="870" -->
+	<div class="modalPopup" data-width="1500" > <!-- data-width="1500" data-height="870" -->
 		<div class="panelStyle">
 			<div class="panelTitle">
 				<h2>상품상세</h2>
 				<button type="button" class="close" onclick="fnGoodsDetailClose()"><i class="fa fa-times"></i></button>
 			</div>
-			<div class="panelContent">
 			<form id="goodsDetailForm" name="goodsDetailForm" action="#" th:method="post">
 				<input type="hidden" id="mode" name="mode" th:value="${params.mode}"/>
 				<input type="hidden" id="goodsCd" name="goodsCd" th:value="${params.goodsCd}"/>
@@ -36,6 +35,7 @@
 				<input type="hidden" id="goodsType" name="goodsType" />
 				<input type="hidden" id="goodsComposeList" name="goodsComposeList" />
 				<input type="hidden" id="repGoodsCd" name="repGoodsCd" /> <!-- 대표상품(딜 가격) -->
+			<div class="panelContent">
 				<table class="frmStyle">
 					<colgroup>
 						<col width="11%"/>
@@ -372,12 +372,31 @@
 						<li class="tab" id="goodstab3">
 							<!-- TAB3 CONTENTS AREA -->
 							<div class="panelStyle">
+								<table class="frmStyle">
+									<colgroup>
+										<col width="12%"/>
+										<col/>
+									</colgroup>
+									<tr>
+										<th>상세설명</th>
+										<td><label class="chkBox"><input type="checkbox" name="chkDescKeep" checked="checked" value="Y">정보유지<span></span></label>
+										</td>
+									</tr>
+								</table>
 								<!-- TABS SPACE -->
 								<div class="tabsJr">
+									<!-- TABS NAVI -->
+									<ul class="tabsJrNav">
+										<li class="on"><a href="#goodstab11">타이틀/내용/특징</a></li>
+										<li><a href="#goodstab12">상세html</a></li>
+									</ul>
+									<!-- //TABS NAVI -->
 									<!-- TABS CONTENT -->
 									<ul class="tabsJrCont">
+										<!-- TAB11 CONTENTS AREA -->
 										<!-- TAB -->
 										<li class="tabJr on" id="goodstab11">
+											<div class="panelStyle">
 											<!-- TAB11 CONTENTS AREA -->
 											<table class="frmStyle">
 											<colgroup>
@@ -385,10 +404,35 @@
 												<col/>
 											</colgroup>
 											<tr>
-												<th>상세설명</th>
-												<td><label class="chkBox"><input type="checkbox" name="chkDescKeep" checked="checked" value="Y">정보유지<span></span></label>
+												<th>타이틀</th>
+												<td><input type="text" class= "w100p" id="goodsTitlesDesc" name="goodsTitlesDesc" maxlength="100" />
+												</td>
+											</tr>
+											<tr>
+												<th>내용</th>
+												<td><div class="tabJrContArea">
+													<textarea class="textareaR3 summernote" name="goodsContentsDesc" id="goodsContentsDesc"></textarea>
+													</div>
 												</td>
 											</tr>
+											<tr>
+												<th>상품 특징</th>
+												<td><div class="tabJrContArea">
+													<textarea class="textareaR3 summernote" name="goodsCharacterDesc" id="goodsCharacterDesc"></textarea>
+													</div>
+												</td>
+											</tr>
+											</table>
+											</div>
+										</li>
+										<li class="tabJr" id="goodstab12">
+											<div class="panelStyle">
+												<!-- TAB11 CONTENTS AREA -->
+												<table class="frmStyle">
+											<colgroup>
+												<col width="12%"/>
+												<col/>
+											</colgroup>
 											<tr>
 												<th>상위(PC)</th>
 												<td><div class="tabJrContArea">
@@ -418,6 +462,7 @@
 												</td>
 											</tr>
 											</table>
+											</div>
 										</li>
 										<!-- //TAB -->
 									</ul>
@@ -502,8 +547,9 @@
 					<!-- //TABS BUTTON AREA -->
 				</div>
 				<!-- //TABS SPACE -->
-			</form>
+			
 			</div>	<!--  class=panelContent -->
+			</form>
 		</div>	<!--  class=panelStyle -->
 	</div> <!--  class=modalPopup -->
 <script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020103001"></script>
@@ -893,12 +939,18 @@
 			$('#goodsDetailForm input[name=certNum]').val(result.certNum);
 			$('#goodsDetailForm input[name=certNumOrg]').val(result.certNum);
 			
+			
+			
 			//상품상세
+			$('#goodsDetailForm input[name=goodsTitlesDesc]').val(result.goodsTitlesDesc);
 			// Summernote에 값 세팅
-			gagaSn.setContents('#goodsPcTopDesc', result.goodsPcTopDesc);
-			gagaSn.setContents('#goodsMobileTopDesc', result.goodsMobileTopDesc);
-			gagaSn.setContents('#goodsPcDownDesc', result.goodsPcDownDesc);
-			gagaSn.setContents('#goodsMobileDownDesc', result.goodsMobileDownDesc);
+			gagaSn.setContents('#goodsContentsDesc', result.goodsContentsDesc); 
+			gagaSn.setContents('#goodsCharacterDesc', result.goodsCharacterDesc);
+			gagaSn.setContents('#goodsPcTopDesc', result.goodsPcTopDesc); 
+			gagaSn.setContents('#goodsMobileTopDesc', result.goodsMobileTopDesc); 
+			gagaSn.setContents('#goodsPcDownDesc', result.goodsPcDownDesc); 
+			gagaSn.setContents('#goodsMobileDownDesc', result.goodsMobileDownDesc); 
+			
 
 			if (!gagajf.isNull(result.niClsfNm)){
 				$('#goodsDetailForm').find('#itemkindNoti').html('품목기준 고시분류 : ' + result.niClsfNm);
@@ -1692,7 +1744,7 @@
 		//대표여부 Y  존재하는지 확인
 		var checkRepYn = false;
 		optCheck = false;
-		$.each(allData, function(index, item) { debugger;
+		$.each(allData, function(index, item) { 
 			if (index == 0){
 				comSelfGoodsYn = item.selfGoodsYn;
 				comSupplyCompCd = item.supplyCompCd;

+ 4 - 4
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsWmsInstockForm.html → style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsWmsIncomelotForm.html

@@ -3,7 +3,7 @@
 	xmlns:th="http://www.thymeleaf.org">
 <!--
  *******************************************************************************
- * @source  : GoodsWmsInstockForm.html
+ * @source  : GoodsWmsIncomelotForm.html
  * @desc    : WMS입고상품관리 화면
  *============================================================================
  * SISUN
@@ -22,7 +22,7 @@
 		<!-- 메뉴 설명 -->
 		<div class="infoBox menu-desc">
 		</div>
-		<form id="goodsUnregisterListForm" name="goodsUnregisterListForm" action="#" th:action="@{'/goods/unregister/list'}">
+		<form id="goodsUnregisterListForm" name="goodsUnregisterListForm" action="#" th:action="@{'/goods/wms/incomelot/list'}">
 		<input type="hidden" id="searchGb" name="searchGb" />
 		<input type="hidden" id="dateGbn" name="dateGbn" value="R" />
  		<!-- 패널 영역1 -->
@@ -49,9 +49,9 @@
 								<option value="">[전체]</option>
 							</select>
 						</td>
-						<th>상품코드<i class="star"></i></th>
+						<th>모델번호<i class="star"></i></th>
 						<td>
-							<input id="goodsCd" name=goodsCd type="text" class="w150"  maxlength="20"/>
+							<input id="modelNo" name=modelNo type="text" class="w150"  maxlength="20"/>
 						</td>
 					</tr>
 					<tr>

+ 1 - 1
style24.batch/.classpath

@@ -10,7 +10,7 @@
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
-	</classpathentry>
+	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>

+ 57 - 0
style24.batch/src/main/java/com/style24/batch/biz/dao/TsbCommonDao.java

@@ -0,0 +1,57 @@
+package com.style24.batch.biz.dao;
+
+import org.springframework.stereotype.Repository;
+
+import com.style24.core.support.annotation.ShopDs;
+
+/**
+ * 공통 Dao
+ *
+ * @author eskim
+ * @since 2021. 01. 04
+ */
+@ShopDs
+@Repository
+public interface TsbCommonDao {
+
+//	/**
+//	 * 시퀀스 조회
+//	 *
+//	 * @param value - 시퀀스명
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2019. 8. 5
+//	 */
+//	String getNextSequence(String value);
+
+	/**
+	 * WMS 연동 여부
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 04
+	 */
+	String getWmsSyncYn();
+
+//	/**
+//	 * 기본답변문구내용 조회
+//	 *
+//	 * @param basicAnswer - 답변일련번호
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2020. 3. 30
+//	 */
+//	TsbBasicAnswer getBasicAnswer(TsbBasicAnswer basicAnswer);
+//
+//	/**
+//	 * 공통코드 목록
+//	 *
+//	 * @param commoncode - 공통코드
+//	 * @return Collection<TsbCommonCode> - 공통코드
+//	 * @author  card007
+//	 * @since  2020. 07. 07
+//	 */
+//	Collection<TsbCommonCode> getCommonCodeList(TsbCommonCode commoncode);
+
+}

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

@@ -5,6 +5,9 @@ import java.util.Collection;
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsIfIncomelot;
+import com.style24.persistence.domain.GoodsIfIncomelotitem;
+import com.style24.persistence.domain.GoodsIfMeasurement;
 import com.style24.persistence.domain.GoodsSafeNo;
 import com.style24.persistence.domain.GoodsSummary;
 
@@ -239,5 +242,35 @@ public interface TsbGoodsDao {
 	 */
 	void saveGoodsSafeNo(GoodsSafeNo goodsSafeNo);
 
+	/**
+	 * 실측사이즈 저장
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	void saveGoodsIfMeasurement(GoodsIfMeasurement goodsMeasurement);
+
+	/**
+	 * 입고 저장
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	void saveGoodsIfIncomelot(GoodsIfIncomelot ㅎoodsIfIncomelot);
 
+	/**
+	 * 입고상품 저장
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	void saveGoodsIfIncomelotitem(GoodsIfIncomelotitem goodsIfIncomelotitem);
+
+	/**
+	 * 온라인 입고 상품 처리
+	 *
+	 * @author eskim
+	 * @since 2021. 01. 04
+	 */
+	void saveWmsGoods(GoodsIfIncomelot goodsIfIncomelot);
 }

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

@@ -0,0 +1,46 @@
+package com.style24.batch.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.GoodsIfIncomelot;
+import com.style24.persistence.domain.GoodsIfIncomelotitem;
+import com.style24.persistence.domain.GoodsIfMeasurement;
+
+/**
+ * WMS 상품 연동Dao
+ *
+ * @author eskim
+ * @since 2021. 01. 01
+ */
+@ShopDs
+public interface TsbWmsGoodsDao {
+
+	/**
+	 * 실측사이즈 연동
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	Collection<GoodsIfMeasurement> getWmsMeasurementList(String jobdate);
+
+	/**
+	 * 입고 목록
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	Collection<GoodsIfIncomelot> getWmsIncomelotList(String jobdate);
+
+	/**
+	 * 입고 상품목록
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	Collection<GoodsIfIncomelotitem> getWmsIncomelotitemList(String jobdate);
+
+}

+ 72 - 0
style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsIncomelotJob.java

@@ -0,0 +1,72 @@
+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.TsbGoodsService;
+import com.style24.persistence.domain.GoodsIfIncomelotitem;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.util.GagaDateUtil;
+
+/**
+ * WMS 입고 연용
+ *
+ * @author eskim
+ * @since 2021. 01. 01
+ */
+@Component
+@Slf4j
+public class TsbGoodsWmsIncomelotJob extends TsbAbstractJob<GoodsIfIncomelotitem, GoodsIfIncomelotitem, GoodsIfIncomelotitem> {
+
+	@Autowired
+	private TsbGoodsService goodsService;
+
+	@Autowired
+	private TsbCommonService commonService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+	private String jobdate = "";
+
+	@Override
+	public GoodsIfIncomelotitem 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;
+		}
+		GoodsIfIncomelotitem goodsIfIncomelotitem = new GoodsIfIncomelotitem();
+		return goodsIfIncomelotitem;
+	}
+
+	@Override
+	public GoodsIfIncomelotitem process(GoodsIfIncomelotitem goodsIfIncomelotitem) throws Exception {
+		return goodsIfIncomelotitem;
+	}
+
+	@Override
+	public GoodsIfIncomelotitem write(GoodsIfIncomelotitem goodsIfIncomelotitem) throws Exception {
+
+		jobdate = GagaDateUtil.getOffsetDate(-1);	//전일자
+
+		//wms 입고 정보 처리
+		goodsService.saveGoodsWmsIncomelot(jobdate);
+
+		//온라인 입고 상품 처리
+		goodsService.saveWmsGoods(jobdate);
+
+		return goodsIfIncomelotitem;
+	}
+
+	@Override
+	public void notify(GoodsIfIncomelotitem goodsIfIncomelotitem) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 66 - 0
style24.batch/src/main/java/com/style24/batch/biz/job/goods/TsbGoodsWmsMeasurementJob.java

@@ -0,0 +1,66 @@
+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.TsbGoodsService;
+import com.style24.persistence.domain.GoodsIfMeasurement;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.util.GagaDateUtil;
+
+/**
+ * WMS 실측사이즈 연용
+ *
+ * @author eskim
+ * @since 2020. 12. 31
+ */
+@Component
+@Slf4j
+public class TsbGoodsWmsMeasurementJob extends TsbAbstractJob<GoodsIfMeasurement, GoodsIfMeasurement, GoodsIfMeasurement> {
+
+	@Autowired
+	private TsbGoodsService goodsService;
+
+	@Autowired
+	private TsbCommonService commonService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+	private String jobdate = "";
+
+	@Override
+	public GoodsIfMeasurement 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;
+		}
+		GoodsIfMeasurement goodsIfMeasurement = new GoodsIfMeasurement();
+		return goodsIfMeasurement;
+	}
+
+	@Override
+	public GoodsIfMeasurement process(GoodsIfMeasurement goodsIfMeasurement) throws Exception {
+		return goodsIfMeasurement;
+	}
+
+	@Override
+	public GoodsIfMeasurement write(GoodsIfMeasurement goodsIfMeasurement) throws Exception {
+
+		jobdate = GagaDateUtil.getOffsetDate(-1);	//전일자
+		goodsService.saveGoodsWmsMeasurement(jobdate);
+		return goodsIfMeasurement;
+	}
+
+	@Override
+	public void notify(GoodsIfMeasurement goodsIfMeasurement) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+
+}

+ 57 - 0
style24.batch/src/main/java/com/style24/batch/biz/service/TsbCommonService.java

@@ -0,0 +1,57 @@
+package com.style24.batch.biz.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.batch.biz.dao.TsbCommonDao;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 공통 Service
+ *
+ * @author eskim
+ * @since 2021. 01. 04
+ */
+@Service
+@Slf4j
+public class TsbCommonService {
+
+	@Autowired
+	private TsbCommonDao commonDao;
+//
+//	/**
+//	 * 시퀀스 조회
+//	 *
+//	 * @param sequenceName - 시퀀스명
+//	 * @return String
+//	 * @author gagamel
+//	 * @since 2019. 8. 25
+//	 */
+//	public String getNextSequence(String sequenceName) {
+//		return commonDao.getNextSequence(sequenceName);
+//	}
+
+	/**
+	 * ERP Sync 옵션
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 04
+	 */
+	public String getWmsSyncYn() {
+		return commonDao.getWmsSyncYn();
+	}
+
+//	/**
+//	 * 공통코드 목록
+//	 *
+//	 * @param TsbCommonCode - 공통코드
+//	 * @return Collection<TsbCommonCode> - 공통코드
+//	 * @author card007
+//	 * @since 2020. 07. 07
+//	 */
+//	public Collection<TsbCommonCode> getCommonCodeList(TsbCommonCode commonCode) {
+//		return commonDao.getCommonCodeList(commonCode);
+//	}
+}

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

@@ -13,6 +13,9 @@ import com.style24.core.biz.service.TscEnvsetService;
 import com.style24.core.biz.thirdparty.SafetyKoreaApi;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsIfIncomelot;
+import com.style24.persistence.domain.GoodsIfIncomelotitem;
+import com.style24.persistence.domain.GoodsIfMeasurement;
 import com.style24.persistence.domain.GoodsSafeNo;
 import com.style24.persistence.domain.GoodsSummary;
 
@@ -41,6 +44,8 @@ public class TsbGoodsService {
 	@Autowired
 	private SafetyKoreaApi safetyKoreaApi;
 
+	@Autowired
+	private TsbWmsGoodsService wmsGoodsService;
 
 	/**
 	 * 상품 타이틀예약 작업
@@ -323,7 +328,7 @@ public class TsbGoodsService {
 		// 1. 대상 상품 조회
 		Collection<GoodsSafeNo> goodsSafeNoList = goodsDao.getGoodsSafeNoList();
 		// 2. 인증테이블 적용
-		for(GoodsSafeNo goodsSafeNo: goodsSafeNoList) {
+		for (GoodsSafeNo goodsSafeNo : goodsSafeNoList) {
 			try {
 				GagaMap result = safetyKoreaApi.getKoreaCertifyNo(goodsSafeNo.getGoodsNum()); // 품번으로 처리
 				if (result != null || !StringUtil.isNullOrEmpty(result.get("certNum").toString())) {
@@ -341,4 +346,65 @@ public class TsbGoodsService {
 		}
 	}
 
+	/**
+	 * WMS 실측사이즈 연용
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsWmsMeasurement(String jobdate) {
+
+		// wms 대상건 조회 (등록, 수정건 조회)
+		Collection<GoodsIfMeasurement> goodsMeasurementList = wmsGoodsService.getWmsMeasurementList(jobdate);
+
+		for (GoodsIfMeasurement goodsMeasurement : goodsMeasurementList) {
+			goodsDao.saveGoodsIfMeasurement(goodsMeasurement);
+		}
+	}
+
+	/**
+	 * WMS 입고정보 연용
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsWmsIncomelot(String jobdate) {
+
+		// wms 입고목록 조회 (등록, 수정건 조회)
+		Collection<GoodsIfIncomelot> goodsIfIncomelotList = wmsGoodsService.getWmsIncomelotList(jobdate);
+
+		for (GoodsIfIncomelot goodsIfIncomelot : goodsIfIncomelotList) {
+			goodsDao.saveGoodsIfIncomelot(goodsIfIncomelot);
+		}
+
+		// wms 입고상품목록 조회 (등록, 수정건 조회)
+		Collection<GoodsIfIncomelotitem> goodsIfIncomelotitemList = wmsGoodsService.getWmsIncomelotitemList(jobdate);
+
+		for (GoodsIfIncomelotitem goodsIfIncomelotitem : goodsIfIncomelotitemList) {
+			goodsDao.saveGoodsIfIncomelotitem(goodsIfIncomelotitem);
+		}
+	}
+
+	/**
+	 * 온라인 입고 상품 처리
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	@Transactional("shopTxnManager")
+	public void saveWmsGoods(String jobdate) {
+		GoodsIfIncomelot goodsIfIncomelot = new GoodsIfIncomelot();
+		goodsIfIncomelot.setRegNo(TsbConstants.REG_NO);
+		goodsIfIncomelot.setUpdNo(TsbConstants.REG_NO);
+		goodsIfIncomelot.setJobdate(jobdate);
+		goodsDao.saveWmsGoods(goodsIfIncomelot);
+
+	}
+
+
 }

+ 61 - 0
style24.batch/src/main/java/com/style24/batch/biz/service/TsbWmsGoodsService.java

@@ -0,0 +1,61 @@
+package com.style24.batch.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.batch.biz.dao.TsbWmsGoodsDao;
+import com.style24.persistence.domain.GoodsIfIncomelot;
+import com.style24.persistence.domain.GoodsIfIncomelotitem;
+import com.style24.persistence.domain.GoodsIfMeasurement;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * WMS 상품 연동  Service
+ *
+ * @author eskim
+ * @since 2021. 01. 01
+ */
+@Service
+@Slf4j
+public class TsbWmsGoodsService {
+
+	@Autowired
+	private TsbWmsGoodsDao wmsGoodsDao;
+
+	/**
+	 * WMS 실측사이즈 연용
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	public Collection<GoodsIfMeasurement> getWmsMeasurementList(String jobdate) {
+		return wmsGoodsDao.getWmsMeasurementList(jobdate);
+	}
+
+	/**
+	 * WMS 입고 목록
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	public Collection<GoodsIfIncomelot> getWmsIncomelotList(String jobdate) {
+		return wmsGoodsDao.getWmsIncomelotList(jobdate);
+	}
+
+	/**
+	 * WMS 입고 상품목록
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 01
+	 */
+	public Collection<GoodsIfIncomelotitem> getWmsIncomelotitemList(String jobdate) {
+		return wmsGoodsDao.getWmsIncomelotitemList(jobdate);
+	}
+
+}

+ 30 - 0
style24.batch/src/main/java/com/style24/batch/biz/task/TsbGoodsTask.java

@@ -12,6 +12,8 @@ import com.style24.batch.biz.job.goods.TsbGoodsRelateScoreJob;
 import com.style24.batch.biz.job.goods.TsbGoodsSnmJob;
 import com.style24.batch.biz.job.goods.TsbGoodsSummaryJob;
 import com.style24.batch.biz.job.goods.TsbGoodsTnmJob;
+import com.style24.batch.biz.job.goods.TsbGoodsWmsIncomelotJob;
+import com.style24.batch.biz.job.goods.TsbGoodsWmsMeasurementJob;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -45,6 +47,11 @@ public class TsbGoodsTask {
 	@Autowired
 	private TsbGoodsInfantsSafeNoJob goodsInfantsSafeNoJob;
 
+	@Autowired
+	private TsbGoodsWmsMeasurementJob goodsWmsMeasurementJob;
+
+	@Autowired
+	private TsbGoodsWmsIncomelotJob goodsWmsIncomelotJob;
 
 	/**
 	 * 초 분 시 일 월 주(년)
@@ -154,5 +161,28 @@ public class TsbGoodsTask {
 		goodsInfantsSafeNoJob.run("cron.goods.infants.safe");
 	}
 
+	/**
+	 * WMS 실측사이즈 연동 적용 주기 : 일배치 - 03시
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.wms.measurement}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsWmsMeasurementJob() throws Exception {
+		goodsWmsMeasurementJob.runById("cron.goods.wms.measurement");
+	}
+
+	/**
+	 * WMS 입고상품 연동 적용 주기 : 일배치 - 03시 10분
+	 *
+	 * @throws Exception
+	 */
+	@Scheduled(cron = "${cron.goods.wms.incomelot}")
+	//@Scheduled(fixedDelay = 3500000)
+	@Async
+	public void tsbGoodsWmsIncomelotJob() throws Exception {
+		goodsWmsIncomelotJob.runById("cron.goods.wms.incomelot");
+	}
 
 }

+ 28 - 0
style24.batch/src/main/java/com/style24/persistence/domain/GoodsIfIncomelot.java

@@ -0,0 +1,28 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 wms 입고정보 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 01
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsIfIncomelot extends TscBaseDomain {
+
+	private Integer lotno;	//입고번호
+	private int purchaseno;	//발주번호
+	private int providerno;	//공급처번호
+	private String providername;	//공급처명
+	private int brandno;	//브랜드번호
+	private String brandname;	//브랜드명
+	private String dateincome;	//wms생성일
+
+
+	private String jobdate; 	// 작업일 YYYYMMDD
+
+}

+ 30 - 0
style24.batch/src/main/java/com/style24/persistence/domain/GoodsIfIncomelotitem.java

@@ -0,0 +1,30 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 wms 입고상품정보 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 01
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsIfIncomelotitem extends TscBaseDomain {
+
+	private Integer lotno;	//입고번호
+	private Integer itemno;	//입고항목번호
+	private int wmsitemno;
+	private String dateincome;	//wms생성일
+	private int productno;	//상품번호
+	private String productcode;	//상품코드
+	private String productname;	//상품명
+	private String skucode;	//옵션번호
+	private int normalqty;	//일반수량
+	private int brokenqty;	//불량수량
+	private int totalqty;	//총수량
+	private String modelno;	//모델번호
+
+}

+ 33 - 0
style24.batch/src/main/java/com/style24/persistence/domain/GoodsIfMeasurement.java

@@ -0,0 +1,33 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 실측사이즈 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 01
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsIfMeasurement extends TscBaseDomain {
+
+	private String skucode;		//옵션번호
+	private int productno;	//상품 번호
+	private int productcode;	//상품 코드
+	private String typecd;	//상하의 타입
+	private String washingmethod;	//세탁방법
+	private float value1;	//치수1
+	private float value2;	//치수2
+	private float value3;	//치수3
+	private float value4;	//치수4
+	private float value5;	//치수5
+	private String memo;	//메모
+	private String dateinserted;	//등록일 yyyy-mm-dd hh:mi:ss
+	private String datelastmodified;	//수정일 yyyy-mm-dd hh:mi:ss
+	private String isuse;	//사용여부(1:Y, 0 N)
+	private int userlastmodified;	//수정자
+
+}

+ 33 - 0
style24.batch/src/main/java/com/style24/persistence/domain/GoodsIfProductsku.java

@@ -0,0 +1,33 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 WMS 옵션재고 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 04
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsIfProductsku extends TscBaseDomain {
+
+	private String skucode;		//옵션번호
+	private String skumodelno;	//옵션모델번호
+	private int productno;		//상품번호
+	private String productcode;	//상품코드
+	private String option1;		//옵션1(색상)
+	private String option2;		//옵션2(사이즈)
+	private String option3;		//옵션3(스타일)-미사용
+	private int sellingstockamount;	//판매재고수량
+	private String sellingstocktypecd;	//판매재고유형
+	private int limitstockamount;		//
+	private String vendorskumodelno;	//업체옵션모델번호
+	private String vendorskucode;		//업체옵션코드
+	private String isvirtualstock;		//
+	private String datevirtualstock;	//
+	private String skucode88;			//88코드
+
+}

+ 64 - 0
style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbCommon.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.batch.biz.dao.TsbCommonDao">
+	
+	<!-- 시퀀스 값 조회 -->
+	<select id="getNextSequence" parameterType="String" resultType="String">
+		/* TsbCommon.getNextSequence */
+		SELECT ${value}.NEXTVAL AS SQ
+		FROM   DUAL
+	</select>
+	
+	<!-- WMS 연동 여부 -->
+	<select id="getWmsSyncYn" resultType="String">
+		/* TsbCommon.getWmsSyncYn */
+		SELECT UPPER(NVL(USE_YN,'N')) AS WMS_SYNC_YN
+		FROM TB_COMMON_CODE
+		WHERE CD_GB = 'G077'
+		AND CD = 'WMSSYNCYN'
+	</select>
+	
+	<!-- 기본답변문구 조회 -->
+	<select id="getBasicAnswer" parameterType="TsbBasicAnswer" resultType="TsbBasicAnswer">
+		/* TsbCommon.getBasicAnswer */
+		SELECT ANS_TITLE   --답변제목
+		     , ANS_CONTENT --답변내용
+		FROM   TB_BASIC_ANS
+		WHERE   USE_YN = 'Y'
+		<if test="ansSq != null and ansSq != ''">
+		AND     ANS_SQ = #{ansSq}
+		</if>
+		<if test="kkoCd != null and kkoCd != ''">
+		AND     KKO_CD = #{kkoCd}
+		</if>
+	</select>
+
+	<select id="getCommonCodeList" parameterType="TsbCommonCode" resultType="TsbCommonCode">
+		/* TsbCommon.getCommonCodeList */
+		SELECT CD
+		, CD_NM
+		FROM   TB_COMMON_CODE
+		WHERE  1 = 1
+		<if test="useYn != null and useYn != ''">
+			AND    USE_YN = #{useYn}
+		</if>
+		AND    CD_GB = #{cdGb}
+		<if test="cd != null and cd != ''">
+			AND    CD = #{cd}
+		</if>
+		<if test="cdNm != null and cdNm != ''">
+			AND    CD_NM = #{cdNm}
+		</if>
+		<if test="cdDesc != null and cdDesc != ''">
+			AND    CD_DESC = #{cdDesc}
+		</if>
+		<if test="exceptCds != null and exceptCds != ''">
+			AND    CD NOT IN
+			<foreach collection="exceptCds" item="item" index="index"  open="(" close=")" separator=",">
+				#{item}
+			</foreach>
+		</if>
+		ORDER  BY CD_GB, DISP_ORD
+	</select>
+	
+</mapper>

+ 204 - 1
style24.batch/src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml

@@ -4,7 +4,7 @@
 	
 	<!-- 상품 기본정보 이력 생성 -->
 	<insert id="createGoodsHst" parameterType="Goods">
-		/* AdmGoods.createGoodsHst */
+		/* TsbGoods.createGoodsHst */
 		INSERT INTO TB_GOODS_HST 
 		(       GOODS_CD
 		      , PRODUCT_NO
@@ -445,6 +445,7 @@
 	
 	<!-- 사용자검색어가 있는 상품 조회  -->
 	<select id="getGoodsByGooodsSnm1List"  resultType="Goods">
+		/* TsbGoods.getGoodsByGooodsSnm1List */
 		WITH RECURSIVE TMP_COLOR_GOODS AS (
 		    SELECT Z.GOODS_CD
 		         , REPLACE(CONCAT(GROUP_CONCAT(COLOR_GRP_CD),';',GROUP_CONCAT(COLOR_ENM),';',GROUP_CONCAT(CD_NM)),',',';') AS COLOR_INFO
@@ -1066,4 +1067,206 @@
 		     , UPD_DT = NOW()
 	</insert>
 	
+	<!--실측사이즈 저장-->
+	<insert id="saveGoodsIfMeasurement" parameterType="GoodsIfMeasurement">
+		/* TsbGoods.saveGoodsIfMeasurement */
+		INSERT INTO TB_IF_MEASUREMENT (
+		       SKUCODE
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , TYPECD
+		     , WASHINGMETHOD
+		     , VALUE1
+		     , VALUE2
+		     , VALUE3
+		     , VALUE4
+		     , VALUE5
+		     , MEMO
+		     , DATEINSERTED
+		     , DATELASTMODIFIED
+		     , ISUSE
+		     , USERLASTMODIFIED
+		     , UPD_DT
+		)
+		(
+		       #{skucode}
+		     , #{productno}
+		     , #{productcode}
+		     , #{typecd}
+		     , #{washingmethod}
+		     , NVL(#{value1},0)
+		     , NVL(#{value2},0)
+		     , NVL(#{value3},0)
+		     , NVL(#{value4},0)
+		     , NVL(#{value5},0)
+		     , #{memo}
+		     , CONVERT(VARCHAR,#{dateinserted},20)  /* yyyy-mm-dd hh:mi:ss */
+		     , CONVERT(VARCHAR,#{datelastmodified},20) 
+		     , NVL(#{isuse},'1')
+		     , #{userlastmodified}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       WASHINGMETHOD = #{washingmethod}
+		     , VALUE1 = NVL(#{value1},0)
+		     , VALUE2 = NVL(#{value2},0)
+		     , VALUE3 = NVL(#{value3},0)
+		     , 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) 
+		     , ISUSE = NVL(#{isuse},'1')
+		     , USERLASTMODIFIED = #{userlastmodified}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!--입고 저장-->
+	<insert id="saveGoodsIfIncomelot" parameterType="GoodsIfMeasurement">
+		/* TsbGoods.saveGoodsIfIncomelot */
+		INSERT INTO TB_IF_INCOMELOT (
+		       LOTNO
+		     , PURCHASENO
+		     , PROVIDERNO
+		     , PROVIDERNAME
+		     , BRANDNO
+		     , BRANDNAME
+		     , DATEINCOME
+		     , UPD_DT
+		)
+		(
+		       #{lotno}
+		     , #{purchaseno}
+		     , #{providerno}
+		     , #{providername}
+		     , #{brandno}
+		     , #{brandname}
+		     , CONVERT(VARCHAR,#{dateincome},20)  /* yyyy-mm-dd hh:mi:ss */
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       PURCHASENO = #{purchaseno}
+		     , PROVIDERNO = #{providerno}
+		     , PROVIDERNAME = #{providername}
+		     , BRANDNO = #{brandno}
+		     , BRANDNAME = #{brandname}
+		     , DATEINCOME = CONVERT(VARCHAR,#{dateincome},20)
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!--입고상품 저장-->
+	<insert id="saveGoodsIfIncomelotitem" parameterType="GoodsIfMeasurement">
+		/* TsbGoods.saveGoodsIfIncomelotitem */
+		INSERT INTO TB_IF_INCOMELOTITEM (
+		       LOTNO
+		     , ITEMNO
+		     , WMSITEMNO
+		     , DATEINCOME
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , PRODUCTNAME
+		     , SKUCODE
+		     , NORMALQTY
+		     , BROKENQTY
+		     , TOTALQTY
+		     , MODELNO
+		     , UPD_DT
+		)
+		(
+		       #{lotno}
+		     , #{itemno}
+		     , #{wmsitemno}
+		     , CONVERT(VARCHAR,#{dateincome},20)  /* yyyy-mm-dd hh:mi:ss */
+		     , #{productno}
+		     , #{productcode}
+		     , #{productname}
+		     , #{skucode}
+		     , #{normalqty}
+		     , #{brokenqty}
+		     , #{totalqty}
+		     , #{modelno}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       WMSITEMNO = #{wmsitemno}
+		     , DATEINCOME = CONVERT(VARCHAR,#{dateincome},20)
+		     , PRODUCTNO = #{productno}
+		     , PRODUCTCODE = #{productcode}
+		     , PRODUCTNAME = #{productname}
+		     , SKUCODE = #{skucode}
+		     , NORMALQTY = #{normalqty}
+		     , BROKENQTY = #{brokenqty}
+		     , TOTALQTY = #{totalqty}
+		     , MODELNO = #{modelno}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!--WMS 상품 저장-->
+	<insert id="saveWmsGoods" parameterType="GoodsIfIncomelot" >
+		/* TsbGoods.saveWmsGoods */
+		INSERT INTO TB_WMS_GOODS (
+		       PRODUCTNO 
+		     , PRODUCTCODE 
+		     , PRODUCTNAME 
+		     , SKUCODE 
+		     , NORMALQTY 
+		     , BROKENQTY 
+		     , TOTALQTY 
+		     , MODELNO 
+		     , PROVIDERNO
+		     , PROVIDERNAME
+		     , BRANDNO
+		     , BRANDNAME
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT 
+		)
+		SELECT B.PRODUCTNO 
+		     , B.PRODUCTCODE 
+		     , B.PRODUCTNAME 
+		     , B.SKUCODE 
+		     , B.NORMALQTY 
+		     , B.BROKENQTY 
+		     , B.TOTALQTY 
+		     , B.MODELNO 
+		     , A.PROVIDERNO
+		     , A.PROVIDERNAME
+		     , A.BRANDNO
+		     , A.BRANDNAME 
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		FROM TB_IF_INCOMELOT  A
+		INNER JOIN TB_IF_INCOMELOTITEM B ON A.LOTNO = B.LOTNO 
+		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') 
+		<![CDATA[
+		AND A.UPD_DT < 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') 
+		<![CDATA[
+		AND A.UPD_DT < 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)
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
 </mapper>

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

@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.batch.biz.dao.TsbWmsGoodsDao">
+	
+	<!-- wms 실측 사이즈 목록   -->
+	<select id="getWmsMeasurementList"  resultType="GoodsIfMeasurement">
+		/* TsbWmsGoods.getWmsMeasurementList */
+		SELECT SKUCODE
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , TYPECD
+		     , WASHINGMETHOD
+		     , VALUE1
+		     , VALUE2
+		     , VALUE3
+		     , VALUE4
+		     , VALUE5
+		     , MEMO
+		     , CONVERT(CHAR(19),DATEINSERTED,120) AS DATEINSERTED  /* yyyy-mm-dd hh:mi:ss */
+		     , CONVERT(CHAR(19),DATELASTMODIFIED,120) AS DATELASTMODIFIED 
+		     , ISUSE
+		     , USERLASTMODIFIED
+		FROM TB_IF_MEASUREMENT
+		WHERE 1 = 1 
+		<choose>
+		    <when test='jobdate != null and jobdate != ""'>
+		AND CONVERT(CHAR(8),DATELASTMODIFIED,112) = #{jobdate}
+		    </when>
+		    <otherwise>
+		AND CONVERT(CHAR(8),DATELASTMODIFIED,112) = CONVERT(CHAR(8),DATEADD(day,-1, GETDATE()),112)
+		    </otherwise>
+		</choose>
+	</select>
+	
+	<!-- wms 입고 목록   -->
+	<select id="getWmsIncomelotList"  parameterType="String" resultType="GoodsIfIncomelot">
+		/* TsbWmsGoods.getWmsIncomelotList */
+		SELECT LOTNO
+		     , PURCHASENO
+		     , PROVIDERNO
+		     , PROVIDERNAME
+		     , BRANDNO
+		     , BRANDNAME
+		     , CONVERT(CHAR(19),DATEINCOME,120) AS DATEINCOME  /* yyyy-mm-dd hh:mi:ss */
+		FROM TB_IF_INCOMELOT
+		WHERE 1 = 1 
+		<choose>
+		    <when test='jobdate != null and jobdate != ""'>
+		AND CONVERT(CHAR(8),DATEINCOME,112) = #{jobdate}
+		    </when>
+		    <otherwise>
+		AND CONVERT(CHAR(8),DATEINCOME,112) = CONVERT(CHAR(8),DATEADD(day,-1, GETDATE()),112)
+		    </otherwise>
+		</choose>
+	</select>
+	
+	<!-- wms 입고 상품목록   -->
+	<select id="getWmsIncomelotitemList" parameterType="String"  resultType="GoodsIfIncomelotitem">
+		/* TsbWmsGoods.getWmsIncomelotitemList */
+		SELECT LOTNO
+		     , ITEMNO
+		     , WMSITEMNO
+		     , CONVERT(CHAR(19),DATEINCOME,120) AS DATEINCOME  /* yyyy-mm-dd hh:mi:ss */
+		     , PRODUCTNO
+		     , PRODUCTCODE
+		     , PRODUCTNAME
+		     , SKUCODE
+		     , NORMALQTY
+		     , BROKENQTY
+		     , TOTALQTY
+		FROM TB_IF_INCOMELOTITEM
+		WHERE 1 = 1 
+		<choose>
+		    <when test='jobdate != null and jobdate != ""'>
+		AND CONVERT(CHAR(8),DATEINCOME,112) = #{jobdate}
+		    </when>
+		    <otherwise>
+		AND CONVERT(CHAR(8),DATEINCOME,112) = CONVERT(CHAR(8),DATEADD(day,-1, GETDATE()),112)
+		    </otherwise>
+		</choose>
+	</select>
+
+</mapper>

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

@@ -1,5 +1,5 @@
 #Generated by Maven Integration for Eclipse
-#Mon Dec 28 15:27:40 KST 2020
+#Mon Jan 04 10:43:31 KST 2021
 version=0.0.1-SNAPSHOT
 groupId=com.style24.front
 m2e.projectName=style24.front

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

@@ -78,11 +78,13 @@ public class Goods extends TscBaseDomain {
 	private String brandGrpNm;		//브랜드그룹명
 	private int brandNo;			// 브랜드번호
 
-	private String goodsDesc;
 	private String goodsPcTopDesc;
 	private String goodsPcDownDesc;
 	private String goodsMobileTopDesc;
 	private String goodsMobileDownDesc;
+	private String goodsTitlesDesc;
+	private String goodsContentsDesc;
+	private String goodsCharacterDesc;
 	private String chkDescKeep = "N";
 //
 	private String chDataYn = "N";

+ 22 - 0
style24.scm/src/main/java/com/style24/persistence/mybatis/shop/TssGoods.xml

@@ -1254,6 +1254,28 @@
 		WHERE GOODS_CD = #{goodsCd}
 	</update>
 	
+	<!-- 상품 상세 정보 이력 생성 -->
+	<insert id="createGoodsDetailDescHst" parameterType="GoodsDesc">
+		/* TsaGoods.createGoodsDetailDescHst */
+		INSERT INTO TB_GOODS_DESC_HST (
+		    GOODS_CD
+		  , DESC_GB
+		  , SEQ
+		  , GOODS_DESC
+		  , REG_NO
+		  , REG_DT
+		)
+		SELECT GOODS_CD
+		     , DESC_GB
+		     , SEQ
+		     , GOODS_DESC
+		     , #{regNo}
+		     , NOW()
+		FROM TB_GOODS_DESC
+		WHERE GOODS_CD = #{goodsCd}
+		ORDER BY DESC_GB, DESC_GB
+	</insert>
+	
 	<!-- 상품 상세정보 삭제 -->
 	<delete id="deleteGoodsDesc" parameterType="GoodsDesc">
 		/* TssGoods.deleteGoodsDesc */

+ 8 - 0
style24.scm/src/main/java/com/style24/scm/biz/dao/TssGoodsDao.java

@@ -195,6 +195,14 @@ public interface TssGoodsDao {
 	 */
 	void deleteGoodsDesc(GoodsDesc godsDesc);
 
+	/**
+	 * 상품 상세 정보 이력 생성
+	 * @param createGoodsDetailDesc
+	 * @author eskim
+	 * @since 2021. 01. 04
+	 */
+	public void createGoodsDetailDescHst(GoodsDesc godsDesc);
+
 	/**
 	 * 상품 상세정보 등록
 	 *

+ 42 - 22
style24.scm/src/main/java/com/style24/scm/biz/service/TssGoodsService.java

@@ -307,27 +307,38 @@ public class TssGoodsService {
 		GoodsDesc goods = new GoodsDesc();
 		goods.setGoodsCd(resultGoods.getGoodsCd());
 
-		//		goods.setDescGb("10");
-		//		String goodsDesc = this.getGoodsDescList(goods);
-		//		resultGoods.setGoodsDesc(goodsDesc);
+		// 상품 상세 타이틀
+		goods.setDescGb("10");
+		String goodsTitlesDesc = this.getGoodsDescList(goods);
+		resultGoods.setGoodsTitlesDesc(goodsTitlesDesc);
 
-		// 상품 상세 pc 상단
+		// 상품 상세 내용
 		goods.setDescGb("20");
+		String goodsContentsDesc = this.getGoodsDescList(goods);
+		resultGoods.setGoodsContentsDesc(goodsContentsDesc);
+
+		// 상품 상세 특징
+		goods.setDescGb("30");
+		String goodsCharacterDesc = this.getGoodsDescList(goods);
+		resultGoods.setGoodsCharacterDesc(goodsCharacterDesc);
+
+		// 상품 상세 pc 상단
+		goods.setDescGb("40");
 		String goodsPcTopDesc = this.getGoodsDescList(goods);
 		resultGoods.setGoodsPcTopDesc(goodsPcTopDesc);
 
 		// 상품 상세  pc 하단
-		goods.setDescGb("30");
+		goods.setDescGb("50");
 		String goodsPcDownDesc = this.getGoodsDescList(goods);
 		resultGoods.setGoodsPcDownDesc(goodsPcDownDesc);
 
 		// 상품 상세 mobile 상단
-		goods.setDescGb("40");
+		goods.setDescGb("60");
 		String goodsMobileTopDesc = this.getGoodsDescList(goods);
 		resultGoods.setGoodsMobileTopDesc(goodsMobileTopDesc);
 
-		// 상품 상세 mpbile 하단
-		goods.setDescGb("50");
+		// 상품 상세 mobile 하단
+		goods.setDescGb("70");
 		String goodsMobileDownDesc = this.getGoodsDescList(goods);
 		resultGoods.setGoodsMobileDownDesc(goodsMobileDownDesc);
 
@@ -349,6 +360,8 @@ public class TssGoodsService {
 			for (GoodsDesc tmpGoodsDesc : goodsDescList) {
 				goodsDescSb.append(tmpGoodsDesc.getGoodsDesc());
 			}
+		}else {
+			goodsDescSb.append("");
 		}
 		return goodsDescSb.toString();
 	}
@@ -649,40 +662,47 @@ public class TssGoodsService {
 	 * @since 2020. 10. 27.
 	 */
 	private void saveGoodsDetailDesc(Goods goods) {
-		// 상품상세 구분(10:상품설명, 20:상위컨텐츠, 30:하위컨텐츠, 40:하위컨텐츠-모바일, 50:상위컨텐츠-모바일)
+		// 상품상세 구분(10:상품타이틀,20:상품타이틀내용,30:상품특징,40:상위컨텐츠,50:하위컨텐츠,60:하위컨텐츠-모바일,70:상위컨텐츠-모바일)
 		GoodsDesc goodsDesc = new GoodsDesc();
 		goodsDesc.setGoodsCd(goods.getGoodsCd());
 		goodsDesc.setRegNo(goods.getRegNo());
 		goodsDesc.setUpdNo(goods.getUpdNo());
 
-		// PC 상단
+		// AS-IS 상세 정보 이력 처리
+		goodsDao.createGoodsDetailDescHst(goodsDesc);
+
+		// 상세 타이틀
 		goodsDesc.setDescGb("10");
-		goodsDesc.setGoodsDesc(goods.getGoodsPcTopDesc());
+		goodsDesc.setGoodsDesc(goods.getGoodsTitlesDesc());
 		this.saveGoodsDesc(goodsDesc);
 
-		// PC 하단
+		// 상세 내용
 		goodsDesc.setDescGb("20");
-		goodsDesc.setGoodsDesc(goods.getGoodsPcTopDesc());
+		goodsDesc.setGoodsDesc(goods.getGoodsContentsDesc());
 		this.saveGoodsDesc(goodsDesc);
 
-		// 공용 하단
+		// 상세 특징
 		goodsDesc.setDescGb("30");
-		goodsDesc.setGoodsDesc(goods.getGoodsPcDownDesc());
+		goodsDesc.setGoodsDesc(goods.getGoodsCharacterDesc());
 		this.saveGoodsDesc(goodsDesc);
 
-		// MO 상단
+		// PC 상단
 		goodsDesc.setDescGb("40");
-		goodsDesc.setGoodsDesc(goods.getGoodsMobileTopDesc());
+		goodsDesc.setGoodsDesc(goods.getGoodsPcTopDesc());
 		this.saveGoodsDesc(goodsDesc);
 
-		//		// 상품상세 저장
+		// PC 하단
+		goodsDesc.setDescGb("50");
+		goodsDesc.setGoodsDesc(goods.getGoodsPcDownDesc());
+		this.saveGoodsDesc(goodsDesc);
 
-		//
-		//		// 세트상품의 구서상품으로 있을경우 처리
-		//		this.saveGoodsSetDesc(goodsDesc);
+		// MO 상단
+		goodsDesc.setDescGb("60");
+		goodsDesc.setGoodsDesc(goods.getGoodsMobileTopDesc());
+		this.saveGoodsDesc(goodsDesc);
 
 		// MO 하단
-		goodsDesc.setDescGb("50");
+		goodsDesc.setDescGb("70");
 		goodsDesc.setGoodsDesc(goods.getGoodsMobileDownDesc());
 		this.saveGoodsDesc(goodsDesc);
 	}

+ 56 - 8
style24.scm/src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html

@@ -20,7 +20,6 @@
 				<h2>상품상세</h2>
 				<button type="button" class="close" onclick="fnGoodsDetailClose()"><i class="fa fa-times"></i></button>
 			</div>
-			<div class="panelContent">
 			<form id="goodsDetailForm" name="goodsDetailForm" action="#" th:method="post">
 				<input type="hidden" id="mode" name="mode" th:value="${params.mode}"/>
 				<input type="hidden" id="goodsCd" name="goodsCd" th:value="${params.goodsCd}"/>
@@ -37,6 +36,7 @@
 				<input type="hidden" id="goodsType" name="goodsType" />
 				<input type="hidden" id="goodsComposeList" name="goodsComposeList" />
 				<input type="hidden" id="costPrice" name="costPrice" />
+			<div class="panelContent">
 				<table class="frmStyle">
 					<colgroup>
 						<col width="11%"/>
@@ -362,12 +362,31 @@
 						<li class="tab" id="goodstab3">
 							<!-- TAB3 CONTENTS AREA -->
 							<div class="panelStyle">
+								<table class="frmStyle">
+									<colgroup>
+										<col width="12%"/>
+										<col/>
+									</colgroup>
+									<tr>
+										<th>상세설명</th>
+										<td><label class="chkBox"><input type="checkbox" name="chkDescKeep" checked="checked" value="Y">정보유지<span></span></label>
+										</td>
+									</tr>
+								</table>
 								<!-- TABS SPACE -->
 								<div class="tabsJr">
+									<!-- TABS NAVI -->
+									<ul class="tabsJrNav">
+										<li class="on"><a href="#goodstab11">타이틀/내용/특징</a></li>
+										<li><a href="#goodstab12">상세html</a></li>
+									</ul>
+									<!-- //TABS NAVI -->
 									<!-- TABS CONTENT -->
 									<ul class="tabsJrCont">
+										<!-- TAB11 CONTENTS AREA -->
 										<!-- TAB -->
 										<li class="tabJr on" id="goodstab11">
+											<div class="panelStyle">
 											<!-- TAB11 CONTENTS AREA -->
 											<table class="frmStyle">
 											<colgroup>
@@ -375,10 +394,35 @@
 												<col/>
 											</colgroup>
 											<tr>
-												<th>상세설명</th>
-												<td><label class="chkBox"><input type="checkbox" name="chkDescKeep" checked="checked" value="Y">정보유지<span></span></label>
+												<th>타이틀</th>
+												<td><input type="text" class= "w100p" id="goodsTitlesDesc" name="goodsTitlesDesc" maxlength="100" />
 												</td>
 											</tr>
+											<tr>
+												<th>내용</th>
+												<td><div class="tabJrContArea">
+													<textarea class="textareaR3 summernote" name="goodsContentsDesc" id="goodsContentsDesc"></textarea>
+													</div>
+												</td>
+											</tr>
+											<tr>
+												<th>상품 특징</th>
+												<td><div class="tabJrContArea">
+													<textarea class="textareaR3 summernote" name="goodsCharacterDesc" id="goodsCharacterDesc"></textarea>
+													</div>
+												</td>
+											</tr>
+											</table>
+											</div>
+										</li>
+										<li class="tabJr" id="goodstab12">
+											<div class="panelStyle">
+												<!-- TAB11 CONTENTS AREA -->
+												<table class="frmStyle">
+											<colgroup>
+												<col width="12%"/>
+												<col/>
+											</colgroup>
 											<tr>
 												<th>상위(PC)</th>
 												<td><div class="tabJrContArea">
@@ -408,6 +452,7 @@
 												</td>
 											</tr>
 											</table>
+											</div>
 										</li>
 										<!-- //TAB -->
 									</ul>
@@ -492,8 +537,8 @@
 					<!-- //TABS BUTTON AREA -->
 				</div>
 				<!-- //TABS SPACE -->
-			</form>
 			</div>	<!--  class=panelContent -->
+			</form>
 		</div>	<!--  class=panelStyle -->
 	</div> <!--  class=modalPopup -->
 <script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020103001"></script>
@@ -739,11 +784,14 @@
 			$('#goodsDetailForm input[name=delvFeeCdOrg]').val(result.delvFeeCd);
 			
 			//상품상세
+			$('#goodsDetailForm input[name=goodsTitlesDesc]').val(result.goodsTitlesDesc);
 			// 공지내용. Summernote에 값 세팅
-			gagaSn.setContents('#goodsPcTopDesc', result.goodsPcTopDesc);
-			gagaSn.setContents('#goodsMobileTopDesc', result.goodsMobileTopDesc);
-			gagaSn.setContents('#goodsPcDownDesc', result.goodsPcDownDesc);
-			gagaSn.setContents('#goodsMobileDownDesc', result.goodsMobileDownDesc);
+			gagaSn.setContents('#goodsContentsDesc', result.goodsContentsDesc); 
+			gagaSn.setContents('#goodsCharacterDesc', result.goodsCharacterDesc);
+			gagaSn.setContents('#goodsPcTopDesc', result.goodsPcTopDesc); 
+			gagaSn.setContents('#goodsMobileTopDesc', result.goodsMobileTopDesc); 
+			gagaSn.setContents('#goodsPcDownDesc', result.goodsPcDownDesc); 
+			gagaSn.setContents('#goodsMobileDownDesc', result.goodsMobileDownDesc); 
 
 			if (!gagajf.isNull(result.niClsfNm)){
 				$('#goodsDetailForm').find('#itemkindNoti').html('품목기준 고시분류 : ' + result.niClsfNm);