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

Merge branch 'develop' into jsshin

jsshin 5 лет назад
Родитель
Сommit
73fc5c4925
26 измененных файлов с 3120 добавлено и 330 удалено
  1. 28 0
      src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java
  2. 17 0
      src/main/java/com/style24/admin/biz/dao/TsaMorebetterDao.java
  3. 798 0
      src/main/java/com/style24/admin/biz/service/TsaGoodsService.java
  4. 24 0
      src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java
  5. 63 0
      src/main/java/com/style24/admin/biz/web/TsaGoodsController.java
  6. 36 15
      src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
  7. 49 10
      src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java
  8. 102 0
      src/main/java/com/style24/persistence/domain/GoodsMass.java
  9. 8 0
      src/main/java/com/style24/persistence/domain/MoreBetter.java
  10. 335 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  11. 81 23
      src/main/java/com/style24/persistence/mybatis/shop/TsaMorebetter.xml
  12. 21 9
      src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml
  13. 1 1
      src/main/java/com/style24/persistence/mybatis/shop/TsaOrderChange.xml
  14. 1 1
      src/main/webapp/WEB-INF/views/goods/GoodsDetailSizeStockForm.html
  15. 36 102
      src/main/webapp/WEB-INF/views/goods/GoodsMassRegisterForm.html
  16. 3 3
      src/main/webapp/WEB-INF/views/goods/GoodsWmsIncomelotForm.html
  17. 10 4
      src/main/webapp/WEB-INF/views/marketing/MorebetterListForm.html
  18. 292 140
      src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html
  19. 0 0
      src/main/webapp/WEB-INF/views/order/CancelRequestFormBack01.html
  20. 2 2
      src/main/webapp/WEB-INF/views/order/CancelRequestFormBack02.html
  21. 1054 0
      src/main/webapp/WEB-INF/views/order/CnclReqForm.html
  22. 139 0
      src/main/webapp/WEB-INF/views/order/CnclReqViewForm.html
  23. 2 2
      src/main/webapp/WEB-INF/views/order/ExchangeRequestForm.html
  24. 10 10
      src/main/webapp/WEB-INF/views/order/OrderDetailForm.html
  25. 2 2
      src/main/webapp/WEB-INF/views/order/OrderDetailFormBack20210122.html
  26. 6 6
      src/main/webapp/WEB-INF/views/order/ReturnRequestForm.html

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

@@ -13,6 +13,7 @@ import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsEpSkip;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsImg;
+import com.style24.persistence.domain.GoodsMass;
 import com.style24.persistence.domain.GoodsNaverLowestPrice;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
@@ -1129,4 +1130,31 @@ public interface TsaGoodsDao {
 	 */
 	void createCategoryGoods(Goods goods);
 
+	/**
+	 * 상품 등록 로그 생성
+	 *
+	 * @param goodsMass
+	 * @author eskim
+	 * @since 2021. 01. 25
+	 */
+	void createGoodsRegLog(GoodsMass goodsMass);
+
+	/**
+	 * 상품 기본 정보 수정 - 대량엑셀
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2021. 1. 25
+	 */
+	void updateGoodsMass(Goods goods);
+
+	/**
+	 * 상품등록로그 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 25
+	 */
+	Collection<GoodsMass> getGoodsRegLogList(GoodsSearch goodsSearch);
 }

+ 17 - 0
src/main/java/com/style24/admin/biz/dao/TsaMorebetterDao.java

@@ -18,6 +18,15 @@ import java.util.Collection;
 @Component
 public interface TsaMorebetterDao {
     /* CSB 진행 */
+    /**
+     * 다다익선 리스트 건수
+     * @param moreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 26
+     */
+    int getMorebetterListCount(MoreBetter moreBetter);
+
     /**
      * 다다익선 프로모션 리스트
      * @param moreBetter
@@ -222,5 +231,13 @@ public interface TsaMorebetterDao {
      */
     Collection<MoreBetterGoods> getMorebetterDuplicateList(MoreBetterGoods moreBetterGoods);
 
+    /**
+     * 다다익선 진행 상태 변경
+     * @param
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 26
+     */
+    void updateMorebetterStat(MoreBetter moreBetter);
     /* // CSB 진행 */
 }

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

@@ -2,6 +2,7 @@ package com.style24.admin.biz.service;
 
 import java.io.IOException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Collection;
 
 import org.apache.commons.lang3.StringUtils;
@@ -22,6 +23,7 @@ import com.style24.persistence.domain.AdKeyword;
 import com.style24.persistence.domain.AdKeywordGoods;
 import com.style24.persistence.domain.Brand;
 import com.style24.persistence.domain.Color;
+import com.style24.persistence.domain.CommonCode;
 import com.style24.persistence.domain.DelvFeePolicy;
 import com.style24.persistence.domain.FreeGoods;
 import com.style24.persistence.domain.Goods;
@@ -31,6 +33,7 @@ import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsEpSkip;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsImg;
+import com.style24.persistence.domain.GoodsMass;
 import com.style24.persistence.domain.GoodsNaverLowestPrice;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
@@ -96,6 +99,9 @@ public class TsaGoodsService {
 	@Autowired
 	private TsaDisplayService displayService;
 
+	@Autowired
+	private TsaRendererService rendererService;
+
 	@Autowired
 	private SafetyKoreaApi safetyKoreaApi;
 
@@ -107,6 +113,8 @@ public class TsaGoodsService {
 
 	private static final String NUMBER_PATTERN = "^[0-9]+$";
 
+	private static final String UPDATE_NO_PATTERN = "X";
+
 	private static final String SELF_GOOODS_AFTER = "STY";
 
 	/**
@@ -2717,4 +2725,794 @@ public class TsaGoodsService {
 		return goodsDao.getNotiClsfColumnInfo(niClsfCd);
 	}
 
+	/**
+	 * 상품대량수정 엑셀 저장
+	 *
+	 * @param ecxelGoodsList, procJob(updateGoods)
+	 * @return
+	 * @author eskim
+	 * @since 2021. 01. 25
+	 */
+	@Transactional("shopTxnManager")
+	public String updateMassExceluploadGoods(GagaMap gagaMap, String procJob) {
+
+		GoodsMass goodsMass = mapper.convertValue(gagaMap, GoodsMass.class);
+
+		if (StringUtils.isBlank(goodsMass.getGoodsCd())) {
+			throw new IllegalStateException("상품코드가 없습니다.");
+		}
+
+		// 상품기본정보
+		Goods goodsData = new Goods();
+		goodsData.setGoodsCd(goodsMass.getGoodsCd().trim().toUpperCase());
+		Goods goodsOrigin = goodsDao.getGoods(goodsData);
+		if (goodsOrigin == null) {
+			goodsData.setGoodsRegMsg("미등록 상품코드");
+			goodsData.setGoodsStat("10");
+			this.setGoodsRegResult(goodsData, goodsMass, procJob);
+			return goodsData.getGoodsStat();
+		}
+		Goods goods = this.updateMassGoodsInfo(goodsMass, procJob, goodsOrigin);
+
+		if ("10".equals(goods.getGoodsStat())) { // 정보 오류
+			this.setGoodsRegResult(goods, goodsMass, procJob);
+			return goods.getGoodsStat();
+		}
+
+		// 상품 고시
+		Collection<GoodsNotiInfo> newGoodsNotiList = new ArrayList<>(); //적용할 고시 정보
+		goods = this.getUpdateMassGoodsNotiCheck(goods, gagaMap, goodsOrigin, newGoodsNotiList);
+		if ("10".equals(goods.getGoodsStat())) { // 정보 오류
+			this.setGoodsRegResult(goods, goodsMass, procJob);
+			return goods.getGoodsStat();
+		}
+
+		// 상품상세 (html, as-is/입점)
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getGoodsContent().trim())) {
+			if (goodsMass.getGoodsContent().toLowerCase().indexOf("script") >= 0) {
+				goods.setGoodsRegMsg("상품상세 html script 선언 오류");
+				goods.setGoodsStat("10");
+				this.setGoodsRegResult(goods, goodsMass, procJob);
+				return goods.getGoodsStat();
+			}
+			goods.setChkDescKeep("Y");
+		}
+
+		if ("N".equals(goods.getChDataYn()) && "N".equals(goods.getChkDescKeep()) && "N".equals(goods.getChNotiYn())) {
+			goods.setGoodsRegMsg("변경정보 없음");
+			goods.setGoodsStat("10");
+			this.setGoodsRegResult(goods, goodsMass, procJob);
+			return goods.getGoodsStat();
+		}
+
+		//상품 기본정보 변경여부 와 촬영업체가 아닌경우
+		if ("Y".equals(goods.getChDataYn()) && !"G001_E000".equals(TsaSession.getInfo().getRoleCd())) {
+
+			goodsDao.createGoodsHst(goods); // 이력생성
+			goodsDao.updateGoodsMass(goods); // 상품기본 저장
+
+			if (!StringUtils.isBlank(goods.getGoodsSnm1()) && !UPDATE_NO_PATTERN.equals(goods.getGoodsSnm1())) {
+				// 사용자 검색어를 검색어에 적용
+				String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
+
+				String[] arrGoodsSnm = goods.getGoodsSnm1().split(";");
+				StringBuilder tempGoodsSnm = new StringBuilder();
+				for (String loopGoodsSnm : arrGoodsSnm) {
+					if (goodsSnm.toUpperCase().indexOf(loopGoodsSnm.toUpperCase()) <= -1) {
+						tempGoodsSnm.append(loopGoodsSnm).append(";");
+					}
+				}
+				goods.setGoodsSnm(tempGoodsSnm.toString() + goodsSnm);
+				goodsDao.updateGoodsSnm(goods);
+			}
+		}
+
+		//상품 상세 변경여부 와 촬영업체가 아닌경우
+		if ("Y".equals(goods.getChkDescKeep()) && !"G001_E000".equals(TsaSession.getInfo().getRoleCd())) {
+			GoodsDesc goodsDesc = new GoodsDesc();
+			goodsDesc.setGoodsCd(goods.getGoodsCd());
+			goodsDesc.setRegNo(goods.getRegNo());
+			goodsDesc.setUpdNo(goods.getUpdNo());
+
+			goodsDesc.setDescGb("80");
+			goodsDesc.setGoodsDesc(goodsMass.getGoodsContent().trim());
+			this.saveGoodsDesc(goodsDesc);
+		}
+
+		// 상품고시정보 적용
+		if ("Y".equals(goods.getChNotiYn()) && newGoodsNotiList != null && !newGoodsNotiList.isEmpty()) {
+
+			int index = 0;
+			for (GoodsNotiInfo goodsNotiInfo : newGoodsNotiList) {
+
+				if (index == 0) {
+					goodsDao.deleteGoodsNotiInfo(goods);
+				}
+				goodsDao.saveGoodsNotiInfo(goodsNotiInfo);
+				index++;
+			}
+		}
+
+		// 품목변경시 카테고리 자동 전시
+		if (!UPDATE_NO_PATTERN.equals(goods.getItemkindCd().trim())) {
+			GoodsCategory goodsCategory = new GoodsCategory();
+			goodsCategory.setRegNo(TsaSession.getInfo().getUserNo());
+			goodsCategory.setUpdNo(TsaSession.getInfo().getUserNo());
+			goodsCategory.setGoodsCd(goods.getGoodsCd());
+			goodsCategory.setCateType("G031_10");	//상품분류카테고리
+			displayService.deleteGoodsCategory(goodsCategory);
+			goodsDao.createCategoryGoods(goods);
+
+		}
+
+		this.setGoodsRegResult(goods, goodsMass, procJob);
+
+		return goods.getGoodsStat();
+	}
+
+	/**
+	 * 상품 대량 등록 결과 정보
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2021. 01. 25
+	 */
+	private void setGoodsRegResult(Goods goods, GoodsMass goodsMass, String procJob) {
+		// 결과 저장
+		goodsMass.setBrandCd(goods.getBrandCd());
+		goodsMass.setGoodsStat(goods.getGoodsStat());
+		goodsMass.setRegSuccYn("Y");
+		goodsMass.setRegFailRsn(goods.getGoodsRegMsg());
+		goodsMass.setRegNo(TsaSession.getInfo().getUserNo());
+		//model은 string 테이블은 number 형이라 ,,,
+//		if (StringUtils.isBlank(goodsMass.getListPrice())) {
+//			goodsMass.setListPrice("0");
+//		}
+//		if (UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice()) || StringUtils.isBlank(goodsMass.getCurrPrice())) {
+//			goodsMass.setCurrPrice("0");
+//		}
+//		if (StringUtils.isBlank(goodsMass.getCostPrice())) {
+//			goodsMass.setCostPrice("0");
+//		}
+//		if ("10".equals(goods.getGoodsStat())) {
+//			goodsMass.setRegSuccYn("N");
+//		}
+		goodsMass.setProcGb("C");
+		if ("updateGoods".equals(procJob)) {
+			goodsMass.setProcGb("U");
+		}
+		goodsDao.createGoodsRegLog(goodsMass);
+	}
+
+	/**
+	 * 상품대량수정 - 상품기본정보
+	 *
+	 * @param goodsMass
+	 * @param excelFilename
+	 * @author eskim
+	 * @since 2021. 1. 20
+	 */
+	private Goods updateMassGoodsInfo(GoodsMass goodsMass, String procJob, Goods goodsOrigin) {
+
+		Goods goods = new Goods();
+		goods.setChDataYn("N"); // 데이터 변경여부
+		goods.setGoodsRegMsg("상품정보 변경");
+		goods.setRegNo(TsaSession.getInfo().getUserNo());
+		goods.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		goods.setGoodsCd(goodsMass.getGoodsCd().toUpperCase().trim().toUpperCase()); // 상품코드
+
+		if (StringUtils.isBlank(goodsMass.getGoodsNm())) {
+			goods.setGoodsRegMsg("상품명 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setGoodsNm(goodsMass.getGoodsNm().trim()); // 상품명
+		if (!UPDATE_NO_PATTERN.equals(goods.getGoodsNm())) {
+			goods.setGoodsNm(goods.getGoodsNm().replaceAll("(\\r\\n|\\r|\\n|\\n\\r)", "")); // 상품명
+			goods.setChDataYn("Y");
+		}
+		goods.setGoodsTnm(goodsMass.getGoodsTnm().trim()); // 상품 타이틀
+		if (!UPDATE_NO_PATTERN.equals(goods.getGoodsTnm())) {
+			goods.setChDataYn("Y");
+			if (!StringUtils.isBlank(goods.getGoodsTnm())) {
+				goods.setGoodsTnm(goods.getGoodsTnm().replaceAll("(\\r\\n|\\r|\\n|\\n\\r)", "")); // 상품 타이틀
+			}
+		}
+		goods.setGoodsSnm1(goodsMass.getGoodsSnm1().trim()); // 상품 사용자 검색어
+		if (!UPDATE_NO_PATTERN.equals(goods.getGoodsSnm1())) {
+			goods.setChDataYn("Y");
+			if (!StringUtils.isBlank(goods.getGoodsSnm1())) {
+				goods.setGoodsSnm1(goods.getGoodsSnm1().replaceAll("(\\r\\n|\\r|\\n|\\n\\r|\\s)", "")); // 상품 사용자 검색어
+			}
+		}
+		// 품목확인
+		if (StringUtils.isBlank(goodsMass.getItemkindCd())) {
+			goods.setGoodsRegMsg("품목코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setItemkindCd(goodsMass.getItemkindCd().trim().toUpperCase()); // 품목
+
+		if (!UPDATE_NO_PATTERN.equals(goods.getItemkindCd())) {
+			Itemkind itemkind = new Itemkind();
+			itemkind.setItemkindCd(goods.getItemkindCd());
+			itemkind.setUseYn("Y");
+			Collection<Itemkind> itemkindList = goodsDao.getItemkindList(itemkind);
+			if (itemkindList == null || itemkindList.isEmpty()) {
+				goods.setGoodsRegMsg("품목 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		CommonCode commonCode = new CommonCode();
+		commonCode.setUseYn("Y");
+		// 시즌코드
+		if (StringUtils.isBlank(goodsMass.getSeasonCd())) {
+			goods.setGoodsRegMsg("시즌코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setSeasonCd(goodsMass.getSeasonCd().trim().toUpperCase());
+		if (!UPDATE_NO_PATTERN.equals(goods.getSeasonCd())) {
+			commonCode.setCdGb("G006"); // 시즌
+			commonCode.setCd(goods.getSeasonCd());
+			Collection<CommonCode> seassonList = rendererService.getCommonCodeList(commonCode);
+			if (seassonList == null || seassonList.isEmpty()) {
+				goods.setGoodsRegMsg("시즌 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+		// 성별
+		if (StringUtils.isBlank(goodsMass.getSexGb())) {
+			goods.setGoodsRegMsg("성별코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setSexGb(goodsMass.getSexGb().trim().toUpperCase());
+		// 성별
+		if (!UPDATE_NO_PATTERN.equals(goods.getSexGb())) {
+			commonCode.setCdGb("G007"); // 성별
+			commonCode.setCd(goods.getSexGb());
+			Collection<CommonCode> genderList = rendererService.getCommonCodeList(commonCode);
+			if (genderList == null || genderList.isEmpty()) {
+				goods.setGoodsRegMsg("성별 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+		//판매가
+		if (StringUtils.isBlank(goodsMass.getCurrPrice())) {
+			goods.setGoodsRegMsg("판매가 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice().trim())) {
+			goods.setCurrPrice(0);
+		} else {
+
+			if (!GagaStringUtil.replace(goodsMass.getCurrPrice().trim(), ",", "").matches(NUMBER_PATTERN)) {
+				goods.setGoodsRegMsg("판매가 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			if (Integer.parseInt(goodsMass.getCurrPrice().trim()) == 0) {
+				goods.setGoodsRegMsg("판매가 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+		//판매수수료율
+		if (StringUtils.isBlank(goodsMass.getSellFeeRate())) {
+			goods.setGoodsRegMsg("판매수수료율 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		float sellFeeRate = 0f;
+		if (UPDATE_NO_PATTERN.equals(goodsMass.getSellFeeRate().trim())) {
+			goods.setSellFeeRate(0);
+		} else {
+			try {
+				sellFeeRate = Float.valueOf(goodsMass.getSellFeeRate().trim());
+				//goods.setSellFeeRate(sellFeeRate);
+			} catch (Exception e) {
+				goods.setGoodsRegMsg("판매수수료율 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+
+			//비교값 크면 1, 같으면 0, 작은면 -1 리턴
+			if (Float.compare(sellFeeRate, 0) == 0) {
+				goods.setGoodsRegMsg("판매수수료율 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+
+			if (Float.compare(sellFeeRate, 100) >= 0) {
+				goods.setGoodsRegMsg("판매수수료율 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+
+		//판매가나 판매수수료율이 변경되었을 때
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice().trim()) || !UPDATE_NO_PATTERN.equals(goodsMass.getSellFeeRate().trim())) {
+			//자사
+			if ("Y".equals(goodsOrigin.getSelfGoodsYn())) {
+				//판매가 변경시
+				if (!UPDATE_NO_PATTERN.equals(goodsMass.getCurrPrice().trim())) {
+					goods.setCurrPrice(Integer.parseInt(GagaStringUtil.replace(goodsMass.getCurrPrice().trim(), ",", ""))); // 판매가
+					goods.setCurrBprice(goodsOrigin.getCurrPrice());
+					goods.setDcRate((int)(this.getDcRate(goodsOrigin.getListPrice(), goods.getCurrPrice())));
+					goods.setChDataYn("Y");
+				}
+				//판매수수료율 변경시
+				if (!UPDATE_NO_PATTERN.equals(goodsMass.getSellFeeRate().trim())) {
+					goods.setSellFeeRate(sellFeeRate); // 판매수수료율
+					goods.setChDataYn("Y");
+				}
+			} else {
+				//입점
+				GoodsPriceRes goodsPriceRes = new GoodsPriceRes();
+				goodsPriceRes.setGoodsCd(goods.getGoodsCd());
+				if (goods.getCurrPrice() != goodsOrigin.getCurrPrice()) {
+					goodsPriceRes.setResGoodsPrice(goods.getCurrPrice());
+					goodsPriceRes.setEndGoodsPrice(goods.getCurrPrice());
+				}
+				if (goods.getSellFeeRate() != goodsOrigin.getSellFeeRate()) {
+					goodsPriceRes.setSellFeeRate(sellFeeRate);
+				}
+				goodsPriceRes.setApplyStdt(GagaDateUtil.getTodayDateTime());	//yyyymmddhhmiss
+				int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) + 4;
+				goodsPriceRes.setApplyEddt(Integer.toString(toYear) + "1231235959");	//yyyymmddhhmiss
+				goodsPriceRes.setCfrmYn("N");
+				goodsPriceRes.setApplyYn("N");
+				goodsPriceRes.setRegNo(goods.getRegNo());
+				goodsPriceRes.setUpdNo(goods.getUpdNo());
+				goodsDao.createGoodPriceRes(goodsPriceRes);
+
+				// 상품테이블에 바로 변경하지 않고 입점상품가격관리에서 승인해야함
+				goods.setCurrPrice(goodsOrigin.getCurrPrice());
+				goods.setSellFeeRate(goodsOrigin.getSellFeeRate());
+			}
+		}
+
+		// 상품구분
+		if (StringUtils.isBlank(goodsMass.getGoodsGb())) {
+			goods.setGoodsRegMsg("상품구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setSexGb(goodsMass.getGoodsGb().trim().toUpperCase());
+		// 상품구분
+		if (!UPDATE_NO_PATTERN.equals(goods.getGoodsGb())) {
+			commonCode.setCdGb("G073"); // 상품구분
+			commonCode.setCd(goods.getGoodsGb());
+			Collection<CommonCode> goodsGbList = rendererService.getCommonCodeList(commonCode);
+			if (goodsGbList == null || goodsGbList.isEmpty()) {
+				goods.setGoodsRegMsg("상품구분 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//정상이월구분
+		if (StringUtils.isBlank(goodsMass.getFormalGb())) {
+			goods.setGoodsRegMsg("정상이월구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setFormalGb(goodsMass.getFormalGb().trim().toUpperCase()); // 정상이월
+		if (!UPDATE_NO_PATTERN.equals(goods.getFormalGb())
+			&& !"G009_10".equals(goods.getFormalGb())
+			&& !"G009_20".equals(goods.getFormalGb())) {
+			goods.setGoodsRegMsg("정상이월구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		if (!UPDATE_NO_PATTERN.equals(goods.getFormalGb())) {
+			goods.setPntPrate(goodsOrigin.getPntPrate()); // 포인트적립율(PC)
+			goods.setPntMrate(goodsOrigin.getPntMrate()); // 포인트적립율(MOBILE)
+			Brand brand = new Brand();
+			brand.setBrandCd(goodsOrigin.getBrandCd());
+			Collection<Brand> brandList = businessService.getBrandList(brand);
+			if (brandList != null && !brandList.isEmpty()) {
+				// 브랜드 확인
+				float pntPrate = 0f;
+				float pntMrate = 0f;
+				for (Brand tmpBrand : brandList) {
+					if ("G009_10".equals(goods.getFormalGb())) {
+						pntPrate = tmpBrand.getPntPrate10();
+						pntMrate = tmpBrand.getPntMrate10();
+					} else {
+						pntPrate = tmpBrand.getPntPrate20();
+						pntMrate = tmpBrand.getPntMrate20();
+					}
+				}
+				goods.setPntPrate(pntPrate); // 포인트적립율(PC)
+				goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//최소주문수량
+		if (UPDATE_NO_PATTERN.equals(goodsMass.getMinOrdQty().trim())) {
+			goods.setMinOrdQty(0);
+		} else {
+			if (!goodsMass.getMinOrdQty().trim().matches(NUMBER_PATTERN) || Integer.parseInt(goodsMass.getMinOrdQty().trim()) == 0) {
+				goods.setGoodsRegMsg("최소주문수량 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setMinOrdQty(Integer.parseInt(goodsMass.getMinOrdQty().trim()));
+			goods.setChDataYn("Y");
+		}
+		//최대주문수량
+		if (UPDATE_NO_PATTERN.equals(goodsMass.getMaxOrdQty().trim())) {
+			goods.setMaxOrdQty(0);
+		} else {
+			if (!goodsMass.getMaxOrdQty().trim().matches(NUMBER_PATTERN) || Integer.parseInt(goodsMass.getMaxOrdQty().trim()) == 0) {
+				goods.setGoodsRegMsg("최대주문수량 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setMaxOrdQty(Integer.parseInt(goodsMass.getMaxOrdQty().trim()));
+			goods.setChDataYn("Y");
+		}
+		//ID당1일최대주문수량
+		if (UPDATE_NO_PATTERN.equals(goodsMass.getDayMaxOrdQty().trim())) {
+			goods.setMaxOrdQty(0);
+		} else {
+			if (!goodsMass.getDayMaxOrdQty().trim().matches(NUMBER_PATTERN) || Integer.parseInt(goodsMass.getDayMaxOrdQty().trim()) == 0) {
+				goods.setGoodsRegMsg("ID당1일최대주문수량 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setDayMaxOrdQty(Integer.parseInt(goodsMass.getDayMaxOrdQty().trim()));
+			goods.setChDataYn("Y");
+		}
+
+		if (goods.getMinOrdQty() > goods.getMaxOrdQty()) {
+			goods.setGoodsRegMsg("최소주문수량 오류(최대주문수량보다 클 수 없음)");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		if (goods.getMaxOrdQty() > goods.getDayMaxOrdQty()) {
+			goods.setGoodsRegMsg("최대주문수량 오류(ID당1일최대구매수량보다 클 수 없음)");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		//선물주문가능여부
+		if (StringUtils.isBlank(goodsMass.getGiftPackYn())) {
+			goods.setGoodsRegMsg("선물주문가능여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if ("Y".equals(goodsOrigin.getSelfGoodsYn())) {
+			if (!UPDATE_NO_PATTERN.equals(goodsMass.getGiftPackYn().trim().toUpperCase())) {
+				goods.setGiftPackYn(goodsMass.getGiftPackYn().trim().toUpperCase());
+				if (!"Y".equals(goods.getGiftPackYn()) && !"N".equals(goods.getGiftPackYn())) {
+					goods.setGoodsRegMsg("선물주문가능여부 오류");
+					goods.setGoodsStat("10");
+					return goods;
+				}
+				goods.setChDataYn("Y");
+			}
+		} else {
+			goods.setGiftPackYn(goodsOrigin.getGiftPackYn().trim().toUpperCase());
+		}
+
+		//신규가입구매가능여부
+		if (StringUtils.isBlank(goodsMass.getNewCustOrdYn())) {
+			goods.setGoodsRegMsg("신규가입구매가능여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if ("Y".equals(goodsOrigin.getSelfGoodsYn())) {
+			if (!UPDATE_NO_PATTERN.equals(goodsMass.getNewCustOrdYn().trim().toUpperCase())) {
+				goods.setNewCustOrdYn(goodsMass.getNewCustOrdYn().trim().toUpperCase());
+				if (!"Y".equals(goods.getNewCustOrdYn()) && !"N".equals(goods.getNewCustOrdYn())) {
+					goods.setGoodsRegMsg("신규가입구매가능여부 오류");
+					goods.setGoodsStat("10");
+					return goods;
+				}
+				goods.setChDataYn("Y");
+			}
+		} else {
+			goods.setNewCustOrdYn(goodsOrigin.getNewCustOrdYn().toUpperCase());
+		}
+
+		//반품여부
+		if (StringUtils.isBlank(goodsMass.getReturnableYn())) {
+			goods.setGoodsRegMsg("반품여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setReturnableYn(goodsMass.getReturnableYn().trim().toUpperCase());
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getReturnableYn().trim())) {
+			if (!"Y".equals(goods.getReturnableYn()) && !"N".equals(goods.getReturnableYn())) {
+				goods.setGoodsRegMsg("반품여부 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//교환여부
+		if (StringUtils.isBlank(goodsMass.getChangeableYn())) {
+			goods.setGoodsRegMsg("교환여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setChangeableYn(goodsMass.getChangeableYn().trim().toUpperCase());
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getChangeableYn().trim())) {
+			if (!"Y".equals(goods.getChangeableYn()) && !"N".equals(goods.getChangeableYn())) {
+				goods.setGoodsRegMsg("교환여부 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//과세구분
+		if (StringUtils.isBlank(goodsMass.getTaxGb())) {
+			goods.setGoodsRegMsg("과세구분 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setTaxGb(goodsMass.getTaxGb().trim().toUpperCase());
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getTaxGb().trim())) {
+			if (!"Y".equals(goods.getTaxGb()) && !"N".equals(goods.getTaxGb())) {
+				goods.setGoodsRegMsg("과세구분 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//상품연령
+		if (StringUtils.isBlank(goodsMass.getAgeGrpCd())) {
+			goods.setGoodsRegMsg("상품연령 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setAgeGrpCd(goodsMass.getAgeGrpCd().trim().toUpperCase());
+		if (!UPDATE_NO_PATTERN.equals(goods.getAgeGrpCd())) {
+			commonCode.setCdGb("G023");
+			commonCode.setCd(goods.getAgeGrpCd());
+			Collection<CommonCode> ageGrpCdList = rendererService.getCommonCodeList(commonCode);
+			if (ageGrpCdList == null || ageGrpCdList.isEmpty()) {
+				goods.setGoodsRegMsg("상품연령 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//성인용품여부
+		if (StringUtils.isBlank(goodsMass.getAdultYn())) {
+			goods.setGoodsRegMsg("성인용품여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setAdultYn(goodsMass.getAdultYn().trim().toUpperCase());
+		if (!UPDATE_NO_PATTERN.equals(goods.getAdultYn())) {
+			if (!"Y".equals(goods.getAdultYn()) && !"N".equals(goods.getAdultYn())) {
+				goods.setGoodsRegMsg("성인용품여부 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		//PC포인트적립율
+		if (StringUtils.isBlank(goodsMass.getPntPrate())) {
+			goods.setGoodsRegMsg("PC포인트적립율 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getPntPrate().trim())) {
+			try {
+				float pntPrate = Float.valueOf(goodsMass.getPntPrate().trim());
+				goods.setPntPrate(pntPrate);
+			} catch (Exception e) {
+				goods.setGoodsRegMsg("PC포인트적립율 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		if (StringUtils.isBlank(goodsMass.getPrePpntUsableYn())) {
+			goods.setGoodsRegMsg("PC선포인트 사용여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getPrePpntUsableYn().trim())) {
+			if ("Y".equals(goodsMass.getPrePpntUsableYn().trim()) || "N".equals(goodsMass.getPrePpntUsableYn().trim())) {
+				goods.setPrePpntUsableYn(goodsMass.getPrePpntUsableYn().trim());
+				goods.setChDataYn("Y");
+			} else {
+				goods.setGoodsRegMsg("PC선포인트 사용여부 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+
+		if (StringUtils.isBlank(goodsMass.getPntMrate())) {
+			goods.setGoodsRegMsg("모바일포인트적립율 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getPntMrate().trim())) {
+			try {
+				int pntMrate = Integer.parseInt(goodsMass.getPntMrate().trim());
+				goods.setPntMrate(pntMrate);
+			} catch (Exception e) {
+				goods.setGoodsRegMsg("모바일포인트적립율 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			goods.setChDataYn("Y");
+		}
+
+		if (StringUtils.isBlank(goodsMass.getPreMpntUsableYn())) {
+			goods.setGoodsRegMsg("모바일선포인트 사용여부 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getPreMpntUsableYn().trim())) {
+			if ("Y".equals(goodsMass.getPreMpntUsableYn().trim()) || "N".equals(goodsMass.getPreMpntUsableYn().trim())) {
+				goods.setPreMpntUsableYn(goodsMass.getPreMpntUsableYn().trim());
+				goods.setChDataYn("Y");
+			} else {
+				goods.setGoodsRegMsg("모바일선포인트 사용여부 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+
+		// 배송비 정책 확인
+		if (StringUtils.isBlank(goodsMass.getDelvFeeCd())) {
+			goods.setGoodsRegMsg("배송비정책코드 오류");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+		goods.setDelvFeeCd(goodsMass.getDelvFeeCd().trim().toUpperCase());
+		if (!UPDATE_NO_PATTERN.equals(goods.getDelvFeeCd())) {
+
+			DelvFeePolicy delvFeePolicy = new DelvFeePolicy();
+			delvFeePolicy.setSupplyCompCd(goods.getSupplyCompCd());
+			delvFeePolicy.setDelvFeeCd(goods.getDelvFeeCd());
+			delvFeePolicy.setUseYn("Y");
+			Collection<DelvFeePolicy> deliveryFeePolicyList =  businessService.getDeliveryFeePolicyList(delvFeePolicy);
+			if (deliveryFeePolicyList != null && !deliveryFeePolicyList.isEmpty()) {
+				goods.setGoodsRegMsg("배송비정책코드 오류");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+		}
+
+		return goods;
+	}
+
+	/**
+	 * 상품대량수정 - 상품고시정보 check
+	 *
+	 * @param goods
+	 * @param excelMap
+	 * @param goodsOrigin
+	 * @param newGoodsNotiList
+	 * @return Goods
+	 * @author eskim
+	 * @since 2021. 01. 25
+	 */
+	private Goods getUpdateMassGoodsNotiCheck(Goods goods, GagaMap excelMap, Goods goodsOrigin, Collection<GoodsNotiInfo> newGoodsNotiList) {
+
+		goods.setChNotiYn("N");
+		String oldNiClsfCd = "";
+		String newNiClsfCd = "";
+
+		newNiClsfCd = excelMap.getString("niClsfCd").trim();
+		for (int i = 0; i < 28; i++) {
+			if (StringUtils.isBlank(excelMap.getString("niContent" + (i + 1)))) {
+				goods.setGoodsRegMsg("고시항목정보 없음 (" + (i + 1) + "번째 항목)");
+				goods.setGoodsStat("10");
+				return goods;
+			}
+			if (!UPDATE_NO_PATTERN.equals(excelMap.getString("niContent" + (i + 1)).trim())) {
+				goods.setChNotiYn("Y");
+			}
+		}
+		// 변경사항이 있는지 확인
+		if (UPDATE_NO_PATTERN.equals(newNiClsfCd) && "N".equals(goods.getChNotiYn())) {
+			return goods;
+		}
+
+		Collection<GoodsNotiInfo> goodsNotiList = new ArrayList<>();
+		//고시분류 코드의 고시항목 조회
+		NotiInfo notiInfo = new NotiInfo();
+		notiInfo.setSupplyVendorCd(goodsOrigin.getSupplyVendorCd());
+		if (!UPDATE_NO_PATTERN.equals(newNiClsfCd)) {
+			notiInfo.setNiClsfCd(newNiClsfCd);
+		} else {
+			GoodsNotiInfo goodsNotiInfo = new GoodsNotiInfo();
+			goodsNotiInfo.setGoodsCd(goods.getGoodsCd());
+			goodsNotiList = goodsDao.getGoodsNotiInfoList(goodsNotiInfo);
+			if (goodsNotiList != null && !goodsNotiList.isEmpty()) {
+				oldNiClsfCd = goodsNotiList.iterator().next().getNiClsfCd();
+			}
+			notiInfo.setNiClsfCd(oldNiClsfCd);
+			newNiClsfCd = oldNiClsfCd;
+		}
+		Collection<NotiInfo> notiInfolist = goodsDao.getNotiInfoItemList(notiInfo);  // 항목별 기본값 조회
+		// 상품의 고시 분류코드 조회
+		if (notiInfolist == null || notiInfolist.isEmpty()) {
+			goods.setGoodsRegMsg("고시분류정보 없음");
+			goods.setGoodsStat("10");
+			return goods;
+		}
+
+		int index = 0;
+		// 같은 고시분류 일경우 기존 고시항목 정보 적용
+		if (oldNiClsfCd.equals(newNiClsfCd)) {
+			for (NotiInfo notiInfoData : notiInfolist) {
+				for (GoodsNotiInfo goodsNotiInfoTemp : goodsNotiList) {
+					if (notiInfoData.getNiItemCd().equals(goodsNotiInfoTemp.getNiItemCd())) {
+						notiInfoData.setNiContent(goodsNotiInfoTemp.getNiContent());
+						break;
+					}
+				}
+				index++;
+			}
+		}
+
+		index = 0;
+		for (NotiInfo notiInfoTmp : notiInfolist) {
+			GoodsNotiInfo goodsNotiInfoTmp = new GoodsNotiInfo();
+			goodsNotiInfoTmp.setGoodsCd(goods.getGoodsCd());
+			goodsNotiInfoTmp.setNiClsfCd(notiInfoTmp.getNiClsfCd());
+			goodsNotiInfoTmp.setNiItemCd(notiInfoTmp.getNiItemCd());
+			goodsNotiInfoTmp.setDispOrd(index + 1);
+			goodsNotiInfoTmp.setRegNo(TsaSession.getInfo().getUserNo());
+			goodsNotiInfoTmp.setUpdNo(TsaSession.getInfo().getUserNo());
+			if (UPDATE_NO_PATTERN.equals(excelMap.getString("niContent" + (index + 1)))) {
+				goodsNotiInfoTmp.setNiContent(notiInfoTmp.getNiContent());
+			} else {
+				goodsNotiInfoTmp.setNiContent(excelMap.getString("niContent" + (index + 1)));
+			}
+
+			newGoodsNotiList.add(goodsNotiInfoTmp);
+			index++;
+		}
+
+		return goods;
+	}
+
+	/**
+	 * 상품등록로그 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 01. 25
+	 */
+	public Collection<GoodsMass> getGoodsRegLogList(GoodsSearch goodsSearch) {
+
+		// 입점업체담당자는 업체코드 설정
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd()) || "G001_E000".equals(TsaSession.getInfo().getRoleCd())) {
+			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
+			goodsSearch.setRegNo(TsaSession.getInfo().getUserNo());
+		}
+		return goodsDao.getGoodsRegLogList(goodsSearch);
+	}
 }

+ 24 - 0
src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java

@@ -39,6 +39,17 @@ public class TsaMorebetterService {
     private TsaCommonService commonService;
 
     /* CSB 진행 */
+    /**
+     * 다다익선 리스트 건수
+     * @param moreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 26
+     */
+    public int getMorebetterListCount(MoreBetter moreBetter) {
+        return morebetterDao.getMorebetterListCount(moreBetter);
+    }
+
     /**
      * 다다익선 리스트
      * @param param
@@ -342,5 +353,18 @@ public class TsaMorebetterService {
         return morebetterDao.getMorebetterDuplicateList(moreBetterGoods);
     }
 
+    /**
+     * 다다익선 진행 상태 변경
+     * @param
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 26
+     */
+    @Transactional("shopTxnManager")
+    public void updateMorebetterStat(MoreBetter moreBetter) {
+        moreBetter.setUpdNo(TsaSession.getInfo().getUserNo());
+        morebetterDao.updateMorebetterStat(moreBetter);
+    }
+
     /* // CSB 진행 */
 }

+ 63 - 0
src/main/java/com/style24/admin/biz/web/TsaGoodsController.java

@@ -41,6 +41,7 @@ import com.style24.persistence.domain.GoodsCompose;
 import com.style24.persistence.domain.GoodsEpSkip;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsImg;
+import com.style24.persistence.domain.GoodsMass;
 import com.style24.persistence.domain.GoodsNaverLowestPrice;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
@@ -2540,4 +2541,66 @@ public class TsaGoodsController extends TsaBaseController {
 		goodsService.updateFreeGoods(freeGoods);
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
+
+	/**
+	 * 상품대량수정 엑셀 저장
+	 *
+	 * @param goodsMass
+	 * @return
+	 * @throws Exception
+	 * @author eskim
+	 * @since 2021. 1. 25
+	 */
+	@PostMapping("/mass/excelupload/update")
+	@ResponseBody
+	public GagaResponse updateMassExceluploadGoods(@RequestBody GoodsMass goodsMass) throws Exception {
+
+		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
+		Collection<GagaMap> ecxelGoodsList = new ArrayList<>();
+
+		// 상품수장
+		// DB 처리 시 사용되는 파라미터명(셀명) 설정 -
+		String[] goodsNames = {"goodsCd", "goodsNm", "goodsTnm", "goodsSnm1", "itemkindCd", "seasonCd",
+			"sexGb", "currPrice", "sellFeeRate", "goodsGb", "formalGb", "minOrdQty", "maxOrdQty", "dayMaxOrdQty",
+			"giftPackYn", "newCustOrdYn","pntPrate","prePpntUsableYn", "pntMrate","preMpntUsableYn",
+			"returnableYn", "changeableYn","taxGb", "ageGrpCd", "adultYn", "delvFeeCd", "goodsContent",
+			"niClsfCd", "niContent1", "niContent2",
+			"niContent3", "niContent4", "niContent5", "niContent6", "niContent7", "niContent8", "niContent9",
+			"niContent10", "niContent11", "niContent12", "niContent13", "niContent14", "niContent15", "niContent16",
+			"niContent17", "niContent18", "niContent19", "niContent20", "niContent21", "niContent22", "niContent23",
+			"niContent24", "niContent25", "niContent26", "niContent27", "niContent28"};
+
+		ecxelGoodsList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, goodsMass.getExcelFileNm()), 0, goodsNames, 0);
+
+		// 입점담당자, 촬영업체
+		if (!"G001_0000".equals(TsaSession.getInfo().getRoleCd()) && !"G001_A000".equals(TsaSession.getInfo().getRoleCd()) &&
+			!"G001_A001".equals(TsaSession.getInfo().getRoleCd()) && !"G001_A100".equals(TsaSession.getInfo().getRoleCd()) &&
+			!"G001_A101".equals(TsaSession.getInfo().getRoleCd()) ) {
+			throw new IllegalStateException("권한이 없습니다.");
+		}
+
+		for (GagaMap gagaMap : ecxelGoodsList) {
+			goodsService.updateMassExceluploadGoods(gagaMap, goodsMass.getProcJob());
+		}
+
+		// 파일 삭제
+		GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, goodsMass.getExcelFileNm()));
+
+		return super.ok("");
+	}
+
+	/**
+	 * 상품 대량등록 결과 조회
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 01. 25
+	 */
+	@PostMapping("/reg/log/list")
+	@ResponseBody
+	public Collection<GoodsMass> getGoodsRegLogList(@RequestBody GoodsSearch goodsSearch) {
+		return goodsService.getGoodsRegLogList(goodsSearch);
+	}
+
 }

+ 36 - 15
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -1,8 +1,7 @@
 package com.style24.admin.biz.web;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -565,14 +564,12 @@ public class TsaMarketingController extends TsaBaseController {
 	public GagaMap getMorebetterList(@RequestBody MoreBetter param) {
 		GagaMap result = new GagaMap();
 
-		List<MoreBetter> tmtbList = (ArrayList<MoreBetter>)morebetterService.getMorebetterList(param);
-
 		param.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
 		param.setPageable(new TscPageRequest(param.getPageNo() - 1, param.getPageSize()));
-		param.getPageable().setTotalCount(tmtbList.size());
+		param.getPageable().setTotalCount(morebetterService.getMorebetterListCount(param));
 
 		result.set("pageing", param);
-		result.set("morebetterList", tmtbList);
+		result.set("morebetterList", morebetterService.getMorebetterList(param));
 
 		return result;
 	}
@@ -610,13 +607,6 @@ public class TsaMarketingController extends TsaBaseController {
 		// 다다익선 상태 목록
 		mav.addObject("tmtbStatList", rendererService.getAvailCommonCodeList("G232"));
 
-		//tmtb sq 자동생성
-		Integer tmtbSq;
-		/*if ("N".equals(mode)) {
-			tmtbSq = commonService.getNextSequence("SEQ_TMTB");
-			moreBetter.setTmtbSq(tmtbSq);
-		}*/
-
 		if ("U".equals(mode)) {
 			// 다다익선 정보
 			mav.addObject("tmtbMstInfo", morebetterService.getMorebetterMstInfo(tmtbSeq));
@@ -634,12 +624,22 @@ public class TsaMarketingController extends TsaBaseController {
 			mav.addObject("tmtbExceptGoodsList", new MoreBetterGoods());
 			mav.addObject("tmtbSectionValList", new MoreBetterSection());
 			mav.addObject("tmtbBurdenList", new MoreBetterBurden());
+			// 날짜형식
+			MoreBetter moreBetter1 = new MoreBetter();
+			Calendar calendar = Calendar.getInstance();
+			calendar.add(Calendar.DAY_OF_MONTH, 1);
+
+			moreBetter1.setEventStdt(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
+			moreBetter1.setEventEdHH(new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime()));
+			moreBetter1.setEventEdHH("23");
+			moreBetter1.setEventEdMM("59");
+			mav.addObject("tmtbMstInfo", moreBetter1);
 		}
 
 		mav.addObject("mode", mode);
 		mav.addObject("tmtbSeq", tmtbSeq);
 		mav.addObject("params", moreBetter);
-		log.info("CHECK param tmtbSq::{}", moreBetter.getTmtbSq());
+		log.info("MorebetterPopupForm tmtbSeq::{}", tmtbSeq);
 		mav.setViewName("marketing/MorebetterPopupForm");
 		return mav;
 	}
@@ -754,6 +754,27 @@ public class TsaMarketingController extends TsaBaseController {
 		morebetterService.deleteTmtbBurdenList(moreBetterBurden);
 		return super.ok(message.getMessage("SUCC_0003"));
 	}
+
+	/**
+	 * 다다익선 진행 상태 변경
+	 *
+	 * @param
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 1. 26
+	 */
+	@PostMapping("/morebetter/changeStat")
+	@ResponseBody
+	public GagaResponse updateMorebetterStat(@RequestBody MoreBetter moreBetter) {
+		try {
+			morebetterService.updateMorebetterStat(moreBetter);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return super.error(message.getMessage("FAIL_0001"));
+		}
+
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
 	/* // CSB 진행 */
 
 	/**

+ 49 - 10
src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java

@@ -4,7 +4,6 @@ import java.util.Collection;
 import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -17,7 +16,6 @@ import org.springframework.web.servlet.ModelAndView;
 import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.rest.server.GagaResponse;
 import com.gagaframework.web.rest.server.GagaResponseStatus;
-import com.style24.admin.biz.service.TsaDeliveryService;
 import com.style24.admin.biz.service.TsaOrderChangeService;
 import com.style24.admin.biz.service.TsaOrderService;
 import com.style24.admin.biz.service.TsaRendererService;
@@ -27,7 +25,6 @@ import com.style24.core.biz.service.TscOrderChangeService;
 import com.style24.core.biz.service.TscOrderRefundService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.persistence.domain.Delivery;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.OrderChange;
 
@@ -71,13 +68,48 @@ public class TsaOrderChangeController extends TsaBaseController {
 	 * @author jsh77b
 	 * @since 2020. 12. 22
 	 */
-	@GetMapping("/cancel/request/form")
-	public ModelAndView cancelRequestFrom(@RequestParam(value = "ordNo") int ordNo) {
+	@GetMapping("/cncl/req/form")
+	public ModelAndView cnclReqForm(@RequestParam(value = "ordNo") int ordNo) {
+
+		Order order = new Order();
+		ModelAndView mav = new ModelAndView();
+		order.setOrdNo(ordNo);
+				
+		// 취소가능 주문상세상탭값 설정
+		String[] ordDtlStatArr = new String[4];
+		ordDtlStatArr[0] = TscConstants.OrderDetailStat.DEPOSIT_WAIT.value();
+		ordDtlStatArr[1] = TscConstants.OrderDetailStat.PAYMENT_COMPLETE.value();
+		ordDtlStatArr[2] = TscConstants.OrderDetailStat.GOODS_PREPARE.value();
+		ordDtlStatArr[3] = TscConstants.OrderDetailStat.DELIVERY_PREPARE.value();
+		order.setOrdDtlStatArr(ordDtlStatArr);
+
+		mav.addObject("chgReasonList"				, rendererService.getAvailCommonCodeList("G686"));				// 취소사유
+		mav.addObject("cancelRequestTargetList"		, coreOrderChangeService.getCancelRequestTargetList(order));	// 취소요청대상목록
+		mav.addObject("orderInfoList"				, orderService.getOrderInfoList(order));						// 주문정보
+		mav.addObject("ordNo"						, ordNo);														// 주문번호
+
+		mav.setViewName("order/CnclReqForm");
+		
+		return mav;
+	}
+	
+	/**
+	 * 취소요청 화면 (관리자)
+	 * 
+	 * @param ordNo - 주문번호
+	 * @param cncWait - 취소대기요청 구분
+	 * @return ModelAndView
+	 * @author jsh77b
+	 * @since 2020. 12. 22
+	 */
+	@GetMapping("/cncl/req/view/form")
+	public ModelAndView cnclReqViewForm(@RequestParam(value = "ordNo") int ordNo ,@RequestParam(value = "ordChgSq") int ordChgSq) {
 
 		Order order = new Order();
 		ModelAndView mav = new ModelAndView();
 		
 		order.setOrdNo(ordNo);
+		order.setOrdChgSq(ordChgSq);
 		
 		// 취소가능 주문상세상탭값 설정
 		String[] ordDtlStatArr = new String[4];
@@ -91,8 +123,10 @@ public class TsaOrderChangeController extends TsaBaseController {
 		mav.addObject("cancelRequestTargetList"		, coreOrderChangeService.getCancelRequestTargetList(order));	// 취소요청대상목록
 		mav.addObject("orderInfoList"				, orderService.getOrderInfoList(order));						// 주문정보
 		mav.addObject("ordNo"						, ordNo);														// 주문번호
+		mav.addObject("ordChgSq"					, ordChgSq);													// 주문변경번호
+		mav.addObject("orderChangeList"				, orderService.getOrderChangeList(order));						// 취소/반품/교환 요청 정보
 
-		mav.setViewName("order/CancelRequestForm");
+		mav.setViewName("order/CnclReqViewForm");
 		
 		return mav;
 	}
@@ -235,7 +269,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 	 * @author jsh77b
 	 * @since 2020. 12. 22
 	 */
-	@GetMapping("/return/request/form")
+	@GetMapping("/rtn/req/form")
 	public ModelAndView returnRequestFrom(@RequestParam(value = "ordNo") int ordNo) {
 
 		Order order = new Order();
@@ -304,7 +338,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 		// 4. 주문변경 회수지정보 추가
 		mav.set("chgerNm"		, rtnReq.getChgerNm());				// 변경자명
 		mav.set("chgerEmail"	, rtnReq.getChgerEmail());			// 변경자이메일주소
-		mav.set("chgerZipNo"	, rtnReq.getChgerZipNo());			// 회수지우편번호
+		mav.set("chgerZipcode"	, rtnReq.getChgerZipcode());		// 회수지우편번호
 		mav.set("chgerBaseAddr"	, rtnReq.getChgerBaseAddr());		// 회수지기본주소
 		mav.set("chgerDtlAddr"	, rtnReq.getChgerDtlAddr());		// 회수지상세주소
 		mav.set("chgerPhnno"	, rtnReq.getChgerPhnno());			// 변경자핸드폰번호
@@ -490,9 +524,14 @@ public class TsaOrderChangeController extends TsaBaseController {
 			return result;
 		}
 
+		// 세션 회원번호 설정
+		int userNo = TsaSession.getInfo().getUserNo();
+		excReq.setUpdNo(userNo);
+		excReq.setRegNo(userNo);
+
 		log.info("excReq >>> {}", excReq);
-		// orderChangeService.changeRequest()
-		// result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		result = coreOrderChangeService.exchReq(excReq);
 
 		return result;
 	}

+ 102 - 0
src/main/java/com/style24/persistence/domain/GoodsMass.java

@@ -0,0 +1,102 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 대량등록 Domain
+ *
+ * @author eskim
+ * @since 2021. 01. 12
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsMass extends TscBaseDomain {
+
+	private String goodsCd;
+	private String goodsNum;
+	private String brandCd;		//브랜드코드
+	private String itemkindCd;	//품목코드
+	private String goodsNm;		//상품명
+	private String styleYear;	//스타일연도
+	private String seasonCd;	//시즌코드(공통코드G006)
+	private String sexGb;		//성별구분(공통코드G007)
+	private String listPrice;	//정상가(최초판매가)
+	private String currPrice;	//현재판매가
+	private String costPrice;	//원가
+	private String delvFeeCd;	//배송비정책코드
+	private String originCd;	//제조국(원산지)
+	private String makeYmd;		//제조연월일
+
+	private String supplyCompCd;	//공급업체코드
+	private String supplyGoodsCd;	//공급업체상품코드(원코드)
+	private String goodsTnm;		//상품타이틀명
+	private String goodsSnm1;		//상품검색명1(사용자등록용)
+	private String goodsGb;			//상품구분(공콩코드 G073)
+	private String formalGb; 		//정상이월구분(공통코드G009)
+//	private String distributionGb;	//유통구분(공콩코드 G065)
+	private String taxGb;			//과세구분(10:과세, 20:비과세)
+	private String ageGrpCd;		//상품연령코드(공통코드G023)
+	private String adultYn;			//성인용품여부 'Y', 'N'
+
+	private String pntPrate;		//포인트적립율(PC)
+	private String pntMrate;		//포인트적립율(모바일)
+	private String prePpntUsableYn;	//선포인트사용가능여부(PC)
+	private String preMpntUsableYn;	//선포인트사용가능여부(모바일)
+	private String sellFeeRate;		//판매수수료율
+	private String changeableYn;	//교환가능여부
+	private String returnableYn;	//반품가능여부
+	private String minOrdQty;		//최소주문수량
+	private String maxOrdQty;		//최대주문수량
+	private String dayMaxOrdQty;	//ID당1일최대구매수량
+	private String giftPackYn;		//선물포장여부
+	private String newCustOrdYn;	//신규고객 구매가능여부(Y:신규고객만 구매가능)
+
+	private String optStr;			//옵션(입점용)
+	private String opt1Str;			//옵션1
+	private String opt2Str;			//옵션2
+	private String goodsContent;	//상품상세 html(입점용)
+
+	private String niClsfCd;
+	private String niContent1;
+	private String niContent2;
+	private String niContent3;
+	private String niContent4;
+	private String niContent5;
+	private String niContent6;
+	private String niContent7;
+	private String niContent8;
+	private String niContent9;
+	private String niContent10;
+	private String niContent11;
+	private String niContent12;
+	private String niContent13;
+	private String niContent14;
+	private String niContent15;
+	private String niContent16;
+	private String niContent17;
+	private String niContent18;
+	private String niContent19;
+	private String niContent20;
+	private String niContent21;
+	private String niContent22;
+	private String niContent23;
+	private String niContent24;
+	private String niContent25;
+	private String niContent26;
+	private String niContent27;
+	private String niContent28;
+
+	private String excelFileNm;
+	private String procJob;
+	private String procGb;
+
+	private int goodsRegSq;
+	private String regSuccYn;
+	private String regFailRsn;
+	private String goodsStat;		//상품상태(공통코드G008)
+
+	private String mainColorCd;
+
+}

+ 8 - 0
src/main/java/com/style24/persistence/domain/MoreBetter.java

@@ -65,6 +65,14 @@ public class MoreBetter extends TscBaseDomain {
 	List<MoreBetterBurden> burdenList;
 	List<MoreBetterSection> sectionGbList;
 
+	// 날짜+시간
+	private String eventStdt;				// 다다익선시작일시
+	private String eventStHH;				// 다다익선시작일시
+	private String eventStMM;				// 다다익선시작일시
+	private String eventEddt;				// 다다익선종료일시
+	private String eventEdHH;				// 다다익선종료일시
+	private String eventEdMM;				// 다다익선종료일시
+
 	// Pagination
 	private TscPageRequest pageable;
 	private int pageNo = 1;

+ 335 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -3947,4 +3947,339 @@
 		                AND GOODS_CD = A.GOODS_CD
 		                )
 	</insert>
+	
+	<!-- 상품  등록 로그 생성 -->
+	<insert id="createGoodsRegLog" parameterType="GoodsMass">
+		/* TsaGoods.createGoodsRegLog */
+		INSERT INTO TB_GOODS_REG_LOG (
+		    PROC_GB
+		  , GOODS_CD
+		  , SUPPLY_COMP_CD
+		  , GOODS_NM
+		  , GOODS_TNM
+		  , GOODS_SNM1
+		  , ORIGIN_CD
+		  , MAKE_YMD
+		  , BRAND_CD
+		  , ITEMKIND_CD
+		  , STYLE_YEAR
+		  , SEASON_CD
+		  , SEX_GB
+		  , GOODS_NUM
+		  , LIST_PRICE
+		  , CURR_PRICE
+		  , COST_PRICE
+		  , SUPPLY_GOODS_CD
+		  , FORMAL_GB
+		  , SELL_FEE_RATE
+		  , GOODS_GB
+		  , TAX_GB
+		  , ADULT_YN
+		  , MIN_ORD_QTY
+		  , MAX_ORD_QTY
+		  , DAY_MAX_ORD_QTY
+		  , PNT_PRATE
+		  , PNT_MRATE
+		  , PRE_PPNT_USABLE_YN
+		  , PRE_MPNT_USABLE_YN
+		  , CHANGEABLE_YN
+		  , RETURNABLE_YN
+		  , GIFT_PACK_YN
+		  , NEW_CUST_ORD_YN
+		  , OPT_STR
+		  , GOODS_CONTENT
+		  , NI_CLSF_CD
+		  , NI_CONTENT1
+		  , NI_CONTENT2
+		  , NI_CONTENT3
+		  , NI_CONTENT4
+		  , NI_CONTENT5
+		  , NI_CONTENT6
+		  , NI_CONTENT7
+		  , NI_CONTENT8
+		  , NI_CONTENT9
+		  , NI_CONTENT10
+		  , NI_CONTENT11
+		  , NI_CONTENT12
+		  , NI_CONTENT13
+		  , NI_CONTENT14
+		  , NI_CONTENT15
+		  , NI_CONTENT16
+		  , NI_CONTENT17
+		  , NI_CONTENT18
+		  , NI_CONTENT19
+		  , NI_CONTENT20
+		  , NI_CONTENT21
+		  , NI_CONTENT22
+		  , NI_CONTENT23
+		  , NI_CONTENT24
+		  , NI_CONTENT25
+		  , NI_CONTENT26
+		  , NI_CONTENT27
+		  , NI_CONTENT28
+		  , REG_SUCC_YN
+		  , REG_FAIL_RSN
+		  , REG_NO
+		  , REG_DT
+		)
+		VALUES(
+		    #{procGb}
+		  , #{goodsCd}
+		  , #{supplyCompCd}
+		  , #{goodsNm}
+		  , #{goodsTnm}
+		  , #{goodsSnm1}
+		  , #{originCd}
+		  , #{makeYmd}
+		  , #{brandCd}
+		  , #{itemkindCd}
+		  , #{styleYear}
+		  , #{seasonCd}
+		  , #{sexGb}
+		  , #{goodsNum}
+		  , #{listPrice}
+		  , #{currPrice}
+		  , #{costPrice}
+		  , #{supplyGoodsCd}
+		  , #{formalGb}
+		  , #{sellFeeRate}
+		  , #{goodsGb}
+		  , #{taxGb}
+		  , #{adultYn}
+		  , #{minOrdQty}
+		  , #{maxOrdQty}
+		  , #{dayMaxOrdQty}
+		  , #{pntPrate}
+		  , #{pntMrate}
+		  , #{prePpntUsableYn}
+		  , #{preMpntUsableYn}
+		  , #{changeableYn}
+		  , #{returnableYn}
+		  , #{giftPackYn}
+		  , #{newCustOrdYn}
+		  , #{optStr}
+		  , #{goodsContent}
+		  , #{niClsfCd}
+		  , #{niContent1}
+		  , #{niContent2}
+		  , #{niContent3}
+		  , #{niContent4}
+		  , #{niContent5}
+		  , #{niContent6}
+		  , #{niContent7}
+		  , #{niContent8}
+		  , #{niContent9}
+		  , #{niContent10}
+		  , #{niContent11}
+		  , #{niContent12}
+		  , #{niContent13}
+		  , #{niContent14}
+		  , #{niContent15}
+		  , #{niContent16}
+		  , #{niContent17}
+		  , #{niContent18}
+		  , #{niContent19}
+		  , #{niContent20}
+		  , #{niContent21}
+		  , #{niContent22}
+		  , #{niContent23}
+		  , #{niContent24}
+		  , #{niContent25}
+		  , #{niContent26}
+		  , #{niContent27}
+		  , #{niContent28}
+		  , #{regSuccYn}
+		  , #{regFailRsn}
+		  , #{regNo}
+		  , NOW()
+		)
+	</insert>
+	
+	<!-- 상품 기본 정보 수정  - 대량엑셀 -->
+	<update id="updateGoodsMass" parameterType="Goods">
+		/* TsaGoods.updateGoodsMass */
+		UPDATE TB_GOODS
+		SET UPD_NO = #{updNo}
+		  , UPD_DT = NOW()
+		<if test='goodsNm != null and goodsNm != "X"'>
+		  , GOODS_NM = #{goodsNm} 
+		</if>
+		<if test='goodsTnm != null and goodsTnm != "X"'>
+		  , GOODS_TNM = #{goodsTnm}
+		</if>
+		<if test='goodsSnm1 != null and goodsSnm1 != "X"'>
+		  , GOODS_SNM1 = #{goodsSnm1}
+		</if>
+		<if test='itemkindCd != null and itemkindCd != "X"'>
+		  , ITEMKIND_CD = #{itemkindCd}
+		</if>
+		<if test='seasonCd != null and seasonCd != "X"'>
+		  , SEASON_CD = #{seasonCd}
+		</if>
+		<if test='sexGb != null and sexGb != "X"'>
+		  , SEX_GB = #{sexGb}
+		</if>
+		<if test="currPrice != null and currPrice > 0">
+		  , CURR_PRICE = #{currPrice}
+		  , CURR_BPRICE = #{currBprice}
+		  , PRICE_UPD_DT = NOW()
+		  , DC_RATE = #{dcRate}
+		</if>
+		<if test="sellFeeRate != null and sellFeeRate > 0">
+		  , SELL_FEE_RATE = #{sellFeeRate}
+		</if>
+		<if test='goodsGb != null and goodsGb != "X"'>
+		  , GOODS_GB = #{goodsGb}
+		</if>
+		<if test='formalGb != null and formalGb != "X"'>
+		  , FORMAL_GB = #{formalGb}
+		  , PNT_PRATE = NVL(#{pntPrate}, PNT_PRATE)
+		  , PNT_MRATE = NVL(#{pntMrate}, PNT_MRATE)
+		</if>
+		<if test="minOrdQty != null and minOrdQty > 0">
+		  , MIN_ORD_QTY = #{minOrdQty}
+		</if>
+		<if test="maxOrdQty != null and maxOrdQty > 0">
+		  , MAX_ORD_QTY = #{maxOrdQty}
+		</if>
+		<if test="dayMaxOrdQty != null and dayMaxOrdQty > 0">
+		  , DAY_MAX_ORD_QTY = #{dayMaxOrdQty}
+		</if>
+		<if test='giftPackYn != null and giftPackYn != "X"'>
+		  , GIFT_PACK_YN = #{giftPackYn}
+		</if>
+		<if test='newCustOrdYn != null and newCustOrdYn != "X"'>
+		  , NEW_CUST_ORD_YN = #{newCustOrdYn}
+		</if>
+		<if test='returnableYn != null and returnableYn != "X"'>
+		  , RETURNABLE_YN = #{returnableYn}
+		</if>
+		<if test='changeableYn != null and changeableYn != "X"'>
+		  , CHANGEABLE_YN = #{changeableYn}
+		</if>
+		<if test='taxGb != null and taxGb != "X"'>
+		  , TAX_GB = #{taxGb}
+		</if>
+		<if test='ageGrpCd != null and ageGrpCd != "X"'>
+		  , AGE_GRP_CD = #{ageGrpCd}
+		</if>
+		<if test='adultYn != null and adultYn != "X"'>
+		  , ADULT_YN = #{adultYn}
+		</if>
+		<if test='pntPrate != null and pntPrate >= 0'>
+		  , PNT_PRATE = #{pntPrate}
+		</if>
+		<if test='prePpntUsableYn != null and prePpntUsableYn != "X"'>
+		  , PRE_PPNT_USABLE_YN = DECODE(#{prePpntUsableYn}, 'Y', 'Y', 'N', 'N', PRE_PPNT_USABLE_YN)
+		</if>
+		<if test='pntMrate != null and pntMrate >= 0'>
+		  , PNT_MRATE = #{pntMrate}
+		</if>
+		<if test='makeYmd != preMpntUsableYn and preMpntUsableYn != "X"'>
+		  , PRE_MPNT_USABLE_YN = DECODE(#{preMpntUsableYn}, 'Y', 'Y', 'N', 'N', PRE_MPNT_USABLE_YN)
+		</if>
+		WHERE GOODS_CD = #{goodsCd}
+	</update>
+	
+	<!-- 상품등록로그 목록 조회 -->
+	<select id="getGoodsRegLogList" parameterType="GoodsSearch" resultType="GoodsMass">
+		/* TsaGoods.getGoodsRegLogList */
+		SELECT A.GOODS_REG_SQ
+		     , A.PROC_GB
+		     , A.GOODS_CD
+		     , A.SUPPLY_COMP_CD
+		     , A.GOODS_NM
+		     , A.GOODS_TNM
+		     , A.GOODS_SNM1
+		     , A.ORIGIN_CD
+		     , A.MAKE_YMD
+		     , A.BRAND_CD
+		     , A.ITEMKIND_CD
+		     , A.STYLE_YEAR
+		     , A.SEASON_CD
+		     , A.SEX_GB
+		     , A.GOODS_NUM
+		     , A.LIST_PRICE
+		     , A.CURR_PRICE
+		     , A.COST_PRICE
+		     , A.SUPPLY_GOODS_CD
+		     , A.FORMAL_GB
+		     , A.GOODS_GB
+		     , A.TAX_GB
+		     , A.ADULT_YN
+		     , A.SELL_FEE_RATE
+		     , A.MIN_ORD_QTY
+		     , A.MAX_ORD_QTY
+		     , A.DAY_MAX_ORD_QTY
+		     , A.PNT_PRATE
+		     , A.PNT_MRATE
+		     , A.PRE_PPNT_USABLE_YN
+		     , A.PRE_MPNT_USABLE_YN
+		     , A.CHANGEABLE_YN
+		     , A.RETURNABLE_YN
+		     , A.GIFT_PACK_YN
+		     , A.NEW_CUST_ORD_YN
+		     , A.OPT_STR
+		     , A.GOODS_CONTENT
+		     , A.NI_CLSF_CD
+		     , A.NI_CONTENT1
+		     , A.NI_CONTENT2
+		     , A.NI_CONTENT3
+		     , A.NI_CONTENT4
+		     , A.NI_CONTENT5
+		     , A.NI_CONTENT6
+		     , A.NI_CONTENT7
+		     , A.NI_CONTENT8
+		     , A.NI_CONTENT9
+		     , A.NI_CONTENT10
+		     , A.NI_CONTENT11
+		     , A.NI_CONTENT12
+		     , A.NI_CONTENT13
+		     , A.NI_CONTENT14
+		     , A.NI_CONTENT15
+		     , A.NI_CONTENT16
+		     , A.NI_CONTENT17
+		     , A.NI_CONTENT18
+		     , A.NI_CONTENT19
+		     , A.NI_CONTENT20
+		     , A.NI_CONTENT21
+		     , A.NI_CONTENT22
+		     , A.NI_CONTENT23
+		     , A.NI_CONTENT24
+		     , A.NI_CONTENT25
+		     , A.NI_CONTENT26
+		     , A.NI_CONTENT27
+		     , A.NI_CONTENT28
+		     , A.REG_SUCC_YN
+		     , A.REG_FAIL_RSN
+		     , A.REG_NO
+		     , FN_GET_USER_NM(A.REG_NO) AS REG_NM 
+		     , DATE_FORMAT(A.REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		FROM TB_GOODS_REG_LOG A
+		-- LEFT OUTER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
+		WHERE 1 = 1 
+		<if test='condition != null and condition != "" '>
+		AND (UPPER(A.GOODS_NUM) LIKE CONCAT('%',UPPER(#{condition}),'%')
+		     OR 
+		     UPPER(A.GOODS_CD) LIKE CONCAT('%',UPPER(#{condition}),'%')
+		     OR 
+		     UPPER(A.SUPPLY_GOODS_CD) LIKE CONCAT('%',UPPER(#{condition}),'%')
+		    )
+		</if>
+		<if test='regSuccYn != null and regSuccYn != "" '>
+		AND A.REG_SUCC_YN  = #{regSuccYn}
+		</if>
+		<if test='regNo != null and regNo != "" '>
+		AND A.REG_No = #{regNo}
+		</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>
+		ORDER BY A.REG_DT DESC, A.GOODS_CD
+	</select>
 </mapper>

+ 81 - 23
src/main/java/com/style24/persistence/mybatis/shop/TsaMorebetter.xml

@@ -2,52 +2,98 @@
 <!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.TsaMorebetterDao">
 	<!-- // CSB 진행 -->
-	<select id="getMorebetterList" parameterType="MoreBetter" resultType="MoreBetter">
-		/* TsaMarketing.getMorebetterList */
-		SELECT TMTB_SQ
-			 , TMTB_NM
-			 , FN_GET_CODE_NM('G232',TMTB_STAT) as TMTB_STAT
-			 , DATE_FORMAT(TMTB_ST_DT, '%Y.%m.%d') AS TMTB_STDT
-			 , DATE_FORMAT(TMTB_ED_DT, '%Y.%m.%d') AS TMTB_EDDT
-			 , DEL_YN
-			 , FN_GET_USER_NM(REG_NO) AS REG_NM
-			 , DATE_FORMAT(REG_DT, '%Y.%m.%d %H:%i:%S') AS REG_DT
-			 , FN_GET_USER_NM(UPD_NO) AS UPD_NM
-			 , DATE_FORMAT(UPD_DT, '%Y.%m.%d %H:%i:%S') AS UPD_DT
-		FROM TB_TMTB
-		WHERE 1=1
+	<select id="getMorebetterListCount" parameterType="MoreBetter" resultType="int">
+		/* TsaMarketing.getMorebetterListCount */
+		SELECT  COUNT(*) AS TOTCNT
+		FROM	TB_TMTB T
+		WHERE	1=1
 		<if test="tmtbStdt != null and tmtbStdt != '' and tmtbEddt != null and tmtbEddt != ''">
-			AND DATE_FORMAT(TMTB_ST_DT,'%Y%m%d%H%i%S') >= DATE_FORMAT(#{tmtbStdt} , '%Y%m%d%H%i%S')
-			AND DATE_FORMAT(TMTB_ED_DT,'%Y%m%d%H%i%S') <![CDATA[ <= ]]> DATE_FORMAT(#{tmtbEddt} , '%Y%m%d%H%i%S')
+			AND T.TMTB_ST_DT BETWEEN STR_TO_DATE(#{tmtbStdt}, '%Y-%m-%d%H%i%S') AND STR_TO_DATE(CONCAT(#{tmtbEddt}, '235959'),'%Y-%m-%d%H%i%S')
 		</if>
 		<if test="searchTxt != null and searchTxt != ''">
 			<if test="searchGubun != null and searchGubun == 'tmtbSq'">
-				AND TMTB_SQ = #{searchTxt}
+				AND T.TMTB_SQ = #{searchTxt}
 			</if>
 			<if test="searchGubun != null and searchGubun == 'tmtbNm'">
-				AND TMTB_NM = #{searchTxt}
+				AND T.TMTB_NM = #{searchTxt}
 			</if>
 		</if>
-		ORDER BY REG_DT DESC
 	</select>
 
+	<select id="getMorebetterList" parameterType="MoreBetter" resultType="MoreBetter">
+		/* TsaMarketing.getMorebetterList */
+		SELECT Z.*
+		FROM(
+			SELECT @rownum := @rownum + 1 AS RNUM
+					,A.*
+			FROM (
+				SELECT T.TMTB_SQ
+					 , T.TMTB_NM
+					 , FN_GET_CODE_NM('G232',T.TMTB_STAT) as TMTB_STAT
+					 , DATE_FORMAT(T.TMTB_ST_DT, '%Y.%m.%d') AS TMTB_STDT
+					 , DATE_FORMAT(T.TMTB_ED_DT, '%Y.%m.%d') AS TMTB_EDDT
+					 , T.DEL_YN
+					 , FN_GET_USER_NM(T.REG_NO) AS REG_NM
+					 , DATE_FORMAT(T.REG_DT, '%Y.%m.%d %H:%i:%S') AS REG_DT
+					 , FN_GET_USER_NM(T.UPD_NO) AS UPD_NM
+					 , DATE_FORMAT(T.UPD_DT, '%Y.%m.%d %H:%i:%S') AS UPD_DT
+				FROM TB_TMTB T
+				JOIN ( SELECT @rownum := 0) R
+				WHERE 1=1
+				<if test="tmtbStdt != null and tmtbStdt != '' and tmtbEddt != null and tmtbEddt != ''">
+					AND T.TMTB_ST_DT BETWEEN STR_TO_DATE(#{tmtbStdt}, '%Y-%m-%d%H%i%S') AND STR_TO_DATE(CONCAT(#{tmtbEddt}, '235959'),'%Y-%m-%d%H%i%S')
+				</if>
+				<if test="searchTxt != null and searchTxt != ''">
+					<if test="searchGubun != null and searchGubun == 'tmtbSq'">
+						AND T.TMTB_SQ = #{searchTxt}
+					</if>
+					<if test="searchGubun != null and searchGubun == 'tmtbNm'">
+						AND T.TMTB_NM = #{searchTxt}
+					</if>
+				</if>
+				ORDER BY T.REG_DT DESC
+			<include refid="getListPagingCondition_sql"/>
+	</select>
+
+	<sql id="getListPagingCondition_sql">
+		<choose>
+			<when test="pageable != null">
+				) A
+				)Z
+				WHERE RNUM BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
+			</when>
+			<otherwise>
+				) A
+				)Z
+			</otherwise>
+		</choose>
+	</sql>
+
 	<select id="getMorebetterMstInfo" parameterType="Integer" resultType="MoreBetter">
 		/* TsaMarketing.getMorebetterMstInfo */
 		SELECT	   	   TT.TMTB_SQ
 					 , TT.TMTB_NM
 					 , TT.TMTB_STAT
-					 , DATE_FORMAT(TT.TMTB_ST_DT , '%Y-%m-%d') AS TMTB_ST_DT
-					 , DATE_FORMAT(TT.TMTB_ED_DT , '%Y-%m-%d') AS TMTB_ED_DT
+					 , TT.TMTB_ST_DT
+					 , TT.TMTB_ED_DT
 					 , TT.MULTI_YN
 					 , TT.DEL_YN
 					 , TT.REG_NO
+					 , FN_GET_USER_NM(TT.REG_NO) AS REG_NM
 					 , TT.REG_DT
 					 , TT.UPD_NO
+					 , FN_GET_USER_NM(TT.UPD_NO) AS UPD_NM
 					 , TT.UPD_DT
 					 , TS.SECTION_GB
 					 , TS.SECTION_VAL
 					 , TV.DC_WAY
 					 , TV.DC_VAL
+					 , DATE_FORMAT(TT.TMTB_ST_DT , '%Y-%m-%d') AS EVENT_STDT
+					 , DATE_FORMAT(TT.TMTB_ST_DT , '%H') AS EVENT_STHH
+					 , DATE_FORMAT(TT.TMTB_ST_DT , '%i') AS EVENT_STMM
+					 , DATE_FORMAT(TT.TMTB_ED_DT , '%Y-%m-%d') AS EVENT_EDDT
+					 , DATE_FORMAT(TT.TMTB_ED_DT , '%H') AS EVENT_EDHH
+					 , DATE_FORMAT(TT.TMTB_ED_DT , '%i') AS EVENT_EDMM
 		FROM 	TB_TMTB TT
 		INNER 	JOIN TB_TMTB_SECTION TS
 		ON 		TT.TMTB_SQ = TS.TMTB_SQ
@@ -218,8 +264,8 @@
 			#{tmtbSq}
 		    ,#{tmtbNm}
 			,#{tmtbStat}
-			,#{tmtbStdt}
-			,#{tmtbEddt}
+			,DATE_FORMAT(#{tmtbStdt},'%Y-%m-%d %H:%i:%s')
+			,DATE_FORMAT(#{tmtbEddt},'%Y-%m-%d %H:%i:%s')
 			,#{applyGb}
 			,#{multiYn}
 			,'N'
@@ -544,5 +590,17 @@
 						</if>
 				)
 	</select>
+
+	<update id="updateMorebetterStat" parameterType="MoreBetter">
+		/* TsaMarketing.updateMorebetterStat */
+		UPDATE TB_TMTB SET
+			TMTB_STAT = #{tmtbStat}
+		<if test="tmtbStat == 'G232_14'">
+			, DEL_YN = 'Y'
+		</if>
+			, UPD_NO = #{updNo}
+			, UPD_DT = NOW()
+		WHERE TMTB_SQ = #{tmtbSq}
+	</update>
 	<!--// CSB 진행 -->
 </mapper>

+ 21 - 9
src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml

@@ -613,7 +613,7 @@
 		     , Z.RECIP_NM
 		     , Z.RECIP_PHNNO
 		     , Z.RECIP_TELNO
-		     , Z.RECIP_ZIP_NO
+		     , Z.RECIP_ZIPCODE
 		     , Z.RECIP_BASE_ADDR
 		     , Z.RECIP_DTL_ADDR
 		     , Z.ORD_EMAIL
@@ -632,7 +632,7 @@
 			     , DA.RECIP_NM 
 			     , DA.RECIP_PHNNO 
 			     , DA.RECIP_TELNO 
-			     , DA.RECIP_ZIP_NO 
+			     , DA.RECIP_ZIPCODE 
 			     , DA.RECIP_BASE_ADDR
 			     , DA.RECIP_DTL_ADDR
 			     , O.ORD_EMAIL
@@ -720,7 +720,7 @@
 		     , OC.CHG_MEMO
 		     , OC.CHGER_NM
 		     , OC.CHGER_PHNNO 
-		     , OC.CHGER_ZIP_NO
+		     , OC.CHGER_ZIPCODE
 		     , OC.CHGER_BASE_ADDR
 		     , OC.CHGER_DTL_ADDR
 		     , OC.WD_INVOICE_SEND_YN
@@ -730,10 +730,22 @@
 		ON     OC.ORD_CHG_SQ = OCD.ORD_CHG_SQ 
 		INNER  JOIN TB_ORDER_DETAIL OD
 		ON     OCD.ORD_DTL_NO = OD.ORD_DTL_NO 
-		INNER  JOIN TB_ORDER_DETAIL_ITEM ODI
-		ON     OD.ORD_DTL_NO = ODI.ORD_DTL_NO 
+		INNER  JOIN (
+			SELECT X.ORD_DTL_ITEM_SQ
+			     , X.ORD_DTL_NO
+			     , X.ITEM_CD
+			     , X.OPT_CD
+			     , X.OPT_CD1
+			     , X.OPT_CD2
+			FROM   TB_ORDER_DETAIL_ITEM X
+			WHERE  X.ORD_NO = #{ordNo}
+			LIMIT  1
+		) ODI 
 		WHERE  1=1
 		AND    OD.ORD_NO = #{ordNo}
+		<if test='ordChgSq != null and ordChgSq != ""'>
+		AND    OCD.ORD_CHG_SQ = #{ordChgSq}	
+		</if>
 		AND    OCD.DEL_YN = 'N'
 		ORDER  BY OC.ORD_CHG_SQ
 		     , OCD.ORD_DTL_NO 
@@ -831,7 +843,7 @@
 		     , O.ORD_PHNNO 
 		     , DA.RECIP_NM 
 		     , DA.RECIP_PHNNO 
-		     , DA.RECIP_ZIP_NO 
+		     , DA.RECIP_ZIPCODE 
 		     , DA.RECIP_BASE_ADDR 
 		     , DA.RECIP_DTL_ADDR 
 		     , G2.SUPPLY_GOODS_CD
@@ -1115,7 +1127,7 @@
 		     , O.ORD_PHNNO 
 		     , DA.RECIP_NM 
 		     , DA.RECIP_PHNNO 
-		     , DA.RECIP_ZIP_NO 
+		     , DA.RECIP_ZIPCODE 
 		     , DA.RECIP_BASE_ADDR 
 		     , DA.RECIP_DTL_ADDR 
 		     , G2.SUPPLY_GOODS_CD
@@ -1545,7 +1557,7 @@
 		SET    RECIP_NM        	= #{recipNm}
 		     , RECIP_PHNNO     	= #{recipPhnno}
 		     , RECIP_TELNO     	= #{recipTelno}
-		     , RECIP_ZIP_NO    	= #{recipZipNo}
+		     , RECIP_ZIPCODE    = #{recipZipcode}
 		     , RECIP_BASE_ADDR 	= #{recipBaseAddr}
 		     , RECIP_DTL_ADDR  	= #{recipDtlAddr}
 		     , DELV_MEMO       	= #{delvMemo}
@@ -1558,7 +1570,7 @@
 	<update id="updateOrderChange" parameterType="Order">
 		/* order.updateOrderChange : 반품/교환 > 회수지 정보 수정 */
 		UPDATE TB_ORDER_CHANGE
-		SET    CHGER_ZIP_NO    	= #{chgerZipNo}
+		SET    CHGER_ZIPCODE    = #{chgerZipCode}
 		     , CHGER_BASE_ADDR 	= #{chgerBaseAddr}
 		     , CHGER_DTL_ADDR  	= #{chgerDtlAddr}
 		     , UPD_NO          	= #{updNo}

+ 1 - 1
src/main/java/com/style24/persistence/mybatis/shop/TsaOrderChange.xml

@@ -152,7 +152,7 @@
 			, CHGER_PHNNO
 			, CHGER_TELNO
 			, CHGER_EMAIL
-			, CHGER_ZIP_NO
+			, CHGER_ZIPCODE
 			, CHGER_BASE_ADDR
 			, CHGER_DTL_ADDR
 			, CHGER_RTN_MEMO

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

@@ -67,7 +67,7 @@
 			<col width="7%"/>
 		</colgroup>
 		<tr th:if="${goods.selfGoodsYn == 'Y' and goods.goodsType == 'G056_N'}">
-			<th colspan="2">WMS재고연동여부<i class="star"></i></th>
+			<th colspan="2">WMS재고연동여부<em class="required" title="필수"></em></th>
 			<td colspan="2">
 				<label class="rdoBtn"><input type="radio" name="erpStockLinkYn" id="erpStockLinkYnY" value="Y" th:checked="${goods.erpStockLinkYn == 'Y'}"/>Y</label>
 				<label class="rdoBtn"><input type="radio" name="erpStockLinkYn" id="erpStockLinkYnN" value="N" th:checked="${goods.erpStockLinkYn == 'N'}"/>N</label>

+ 36 - 102
src/main/webapp/WEB-INF/views/goods/GoodsMassRegisterForm.html

@@ -32,24 +32,6 @@
 			</ul>
 			<ul class="panelBar">
 				<li class="center">
-					<!-- <th:block th:if="${sessionInfo.roleCd == 'G001_0000' 
-									or sessionInfo.roleCd == 'G001_A000' 
-									or sessionInfo.roleCd == 'G001_A001' 
-									or sessionInfo.roleCd == 'G001_A100' 
-									or sessionInfo.roleCd == 'G001_A101'
-									}">
-						<button type="button" class="btn btn-default btn-lg" id="btnInit" onclick="cfnDownloadSampleFile('SF001');">자사상품 등록양식 다운로드</button>
-						<button th:if="${wmsSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsSelfCreate" >자사상품 등록</button>
-					</th:block>
-					<th:block th:if="${sessionInfo.roleCd == 'G001_0000' 
-									or sessionInfo.roleCd == 'G001_A000' 
-									or sessionInfo.roleCd == 'G001_A001' 
-									or sessionInfo.roleCd == 'G001_A100' 
-									or sessionInfo.roleCd == 'G001_A101'
-									}">
-						<button type="button" class="btn btn-default btn-lg" id="btnInit" onclick="cfnDownloadSampleFile('SF005');">입점상품 등록양식 다운로드</button>
-						<button th:if="${wmsSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsCreate" >입점상품 등록</button> -->
-					</th:block>
 					<label class="off"><a href="javascript:void(0);" id="excelList" style="display: none;">엑셀다운로드</a></label>
 					<!--  추후 대량 수정 권한-->
 					<span th:if="${sessionInfo.roleCd == 'G001_0000' 
@@ -59,7 +41,7 @@
 									or sessionInfo.roleCd == 'G001_A101'
 								}" 
 							th:style="'padding-left:80px;'">
-						<button type="button" class="btn btn-default btn-lg" id="btnInit" onclick="cfnDownloadSampleFile('SF014');">상품대량수정 등록양식 다운로드</button>
+						<button type="button" class="btn btn-default btn-lg" onclick="cfnDownloadSampleFile('SF014');">상품대량수정 등록양식 다운로드</button>
 						<button th:if="${wmsSyncYn == 'Y'}" type="button" class="btn btn-primary btn-lg" id="btnGoodsUpdate" >상품 수정</button>
 					</span>
 				</li>
@@ -68,7 +50,7 @@
 		<div class="panelStyle" >
 			<!-- 검색조건 영역 -->
 			<div class="panelTitle">
-				<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 하나를 꼭 입력해 주세요.</h3>
+				<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 상품코드나 등록일을 꼭 입력해 주세요.</h3>
 			</div>
 			<div class="panelContent">
 				<table class="frmStyle">
@@ -79,7 +61,7 @@
 						<col/>
 					</colgroup>
 					<tr>
-						<th>상품코드<i class="star"></i></th>
+						<th>상품코드<em class="required" title="필수"></em></th>
 						<td><input type="text" class="w130" name="condition" id="condition" maxlength="50"/></td>
 						<th>등록여부</th>
 						<td>
@@ -90,7 +72,7 @@
 						</td>
 					</tr>
 					<tr>
-						<th>등록일<i class="star"></i></th>
+						<th>등록일<em class="required" title="필수"></em></th>
 						<td colspan="3" id="sellTerms"></td>
 					</tr>
 				</table>
@@ -113,22 +95,22 @@
 						<i class="fa fa-info" aria-hidden="true"></i>
 						<span class="left aL" style="width:580px;">
 						<!-- class="left" 또는 class="right" -->
-							<em>상품미등록</em><br/>
-							- 상품코드 오류 : 빈값, 온라인상품코드 미존재<br/>
-							- 업체 오류 : 빈값, 'S0001'나 'S0002' 가 아닌경우<br/>
-							- 상품명 오류 : 빈값<br/>
-							- 스타일 연도 오류 : 온라인에서 관리되지 않는 스타일 연도<br/>
-							- 성별 오류 : 온라인에서 관리되지 않는 성별<br/>
-							- 컬러 오류 : 온라인에서 관리되지 않는 컬러<br/>
-							- 품목 오류 : 온라인에서 관리되지 않는 품목<br/>
+							<em>* 상품미등록 *</em><br/>
+							- 품번 오류(자사) : 빈값, 길이 10이 아닐경우, FRJ는 '-'제외한 길이<br/>
+							- 제조년월일 오류 : 빈값, 날짜형식이 맞는지<br/>
+							- WMS 미존재 품번코드(자사) : 온라인 입고테이블에 품번이 없는 경우<br/>
+							- 상품코드 중복등록요청 : 등록된 상품코드 등록요청<br/>
+							- 항목별 오류 : 온라인에서 관리되지 않는 공통코드<br/>
 							- 품목의 고시정보 없음 : 품목의 고시분류 매핑이 안되어 있는 경우<br/>
+							- 고시분류 오류 : 등록요청 고시분류 와 온라인에서 품목과 매핑된 고시분류가 다른 경우<br/>
+							<br/>
+							<em>* 상품등록 *</em><br/>
+							- WMS 상품 사이즈 정보 없음 : WMS에 상품코드의 사이즈가 없을 경우<br/>
+							- 고시항목 필수 항목 오류 : 필수 고시항목의 값이 없을 경우<br/>
 						</span>
 					</div>
 					<!-- //아이콘 툴팁 -->
 				</li>
-				<li class="right">
-					<button type="button" class="btn btn-default btn-lg" id="btnGoodsRegExcelDownLoad">엑셀다운로드</button>
-				</li>
 			</ul>
 			<!-- //상단버튼 영역  -->
 			<div id="gridList" style="width: 100%; height: 500px;" class="ag-theme-balham"></div>
@@ -144,42 +126,33 @@
 	var columnDefs = [
 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
 		{headerName: "작업일시", field: "regDt", width: 150, cellClass: 'text-center'},
+		{headerName: "작업자", field: "regNm", width: 120, cellClass: 'text-center'},
 		{headerName: "상품등록여부", field: "regSuccYn", width: 100, cellClass: 'text-center'},
 		{headerName: "등록결과메세지", field: "regFailRsn", width: 200, cellClass: 'text-left'},
-		{headerName: "등록브랜드코드", field: "brandCd", width: 120, cellClass: 'text-center'},
-		{headerName: "업체코드", field: "supplyCompCd", width: 130, cellClass: 'text-center'},
+		{headerName: "품번", field: "goodsNum", width: 100, cellClass: 'text-center'},
+		{headerName: "브랜드코드", field: "brandCd", width: 100, cellClass: 'text-center'},
+		{headerName: "공급업체상품코드", field: "supplyGoodsCd", width: 130, cellClass: 'text-center'},
+		{headerName: "공급업체코드", field: "supplyCompCd", width: 100, cellClass: 'text-center'},
 		{headerName: "상품코드", field: "goodsCd", width: 130, cellClass: 'text-center'},
 		{headerName: "상품명", field: "goodsNm", width: 150, cellClass: 'text-left'},
 		{headerName: "상품타이틀", field: "goodsTnm", width: 150, cellClass: 'text-left'},
 		{headerName: "검색어", field: "goodsSnm1", width: 150, cellClass: 'text-left'},
-		{headerName: "제조국", field: "makeNm", width: 100, cellClass: 'text-center'},
+		{headerName: "원산지", field: "originCd", width: 100, cellClass: 'text-center'},
 		{headerName: "제조일", field: "makeYmd", width: 100, cellClass: 'text-center'},
-		{headerName: "이지미타입", field: "imgType", width: 100, cellClass: 'text-center'},
-		{headerName: "이미지경로1", field: "imgPath1", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로2", field: "imgPath2", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로3", field: "imgPath3", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로4", field: "imgPath4", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로5", field: "imgPath5", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로6", field: "imgPath6", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로7", field: "imgPath7", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로8", field: "imgPath8", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로9", field: "imgPath9", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로10", field: "imgPath10", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로11", field: "imgPath11", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로12", field: "imgPath12", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로13", field: "imgPath13", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로14", field: "imgPath14", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로15", field: "imgPath15", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로16", field: "imgPath16", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로17", field: "imgPath17", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로18", field: "imgPath18", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로19", field: "imgPath19", width: 200, cellClass: 'text-left'},
-		{headerName: "이미지경로20", field: "imgPath20", width: 200, cellClass: 'text-left'},
-		{headerName: "고시분류코드", field: "niClsfCd", width: 200, cellClass: 'text-center',
-			cellEditorParams: { values: gagaAgGrid.extractValues(niClsfCdList) },
-			valueFormatter: function (params) { return gagaAgGrid.lookupValue(niClsfCdList, params.value); },
-			valueParser: function (params) { return gagaAgGrid.lookupKey(niClsfCdList, params.newValue); }
-		},
+		{headerName: "품목", field: "itemkindCd", width: 100, cellClass: 'text-center'},
+		{headerName: "스타일연도", field: "styleYear", width: 100, cellClass: 'text-center'},
+		{headerName: "시즌", field: "seasonCd", width: 100, cellClass: 'text-center'},
+		{headerName: "성별", field: "sexGb", width: 100, cellClass: 'text-center'},
+		{headerName: "정상가", field: "listPrice", width: 100, cellClass: 'text-center'},
+		{headerName: "판매가", field: "currPrice", width: 100, cellClass: 'text-center'},
+		{headerName: "원가", field: "costPrice", width: 100, cellClass: 'text-center'},
+		{headerName: "정상이월", field: "formalGb", width: 100, cellClass: 'text-center'},
+		{headerName: "상품구분", field: "goodsGb", width: 100, cellClass: 'text-center'},
+		{headerName: "과세구분", field: "taxGb", width: 100, cellClass: 'text-center'},
+		{headerName: "성인용품여부", field: "adultYn", width: 100, cellClass: 'text-center'},
+		{headerName: "옵션정보", field: "optStr", width: 150, cellClass: 'text-center'},
+		{headerName: "상품상세 html", field: "goodsContent", width: 150, cellClass: 'text-center'},
+		{headerName: "고시분류코드", field: "niClsfCd", width: 100, cellClass: 'text-center'},
 		{headerName: "고시내용1", field: "niContent1", width: 200, cellClass: 'text-left'},
 		{headerName: "고시내용2", field: "niContent2", width: 200, cellClass: 'text-left'},
 		{headerName: "고시내용3", field: "niContent3", width: 200, cellClass: 'text-left'},
@@ -207,21 +180,7 @@
 		{headerName: "고시내용25", field: "niContent25", width: 200, cellClass: 'text-left'},
 		{headerName: "고시내용26", field: "niContent26", width: 200, cellClass: 'text-left'},
 		{headerName: "고시내용27", field: "niContent27", width: 200, cellClass: 'text-left'},
-		{headerName: "고시내용28", field: "niContent28", width: 200, cellClass: 'text-left'},
-		{headerName: "브랜드", field: "brandCd", width: 100, cellClass: 'text-center'},
-		{headerName: "품목", field: "itemkindCd", width: 100, cellClass: 'text-center'},
-		{headerName: "스타일연도", field: "styleYear", width: 100, cellClass: 'text-center'},
-		{headerName: "시즌", field: "seasonCd", width: 80, cellClass: 'text-center'},
-		{headerName: "성별", field: "sexGb", width: 80, cellClass: 'text-center'},
-		{headerName: "품번", field: "goodsNum", width: 100, cellClass: 'text-center'},
-		{headerName: "정상가", field: "listPrice", width: 100, cellClass: 'text-center'},
-		{headerName: "판매가", field: "currPrice", width: 100, cellClass: 'text-center'},
-		{headerName: "공급업체상품코드", field: "supplyGoodsCd", width: 130, cellClass: 'text-center'},
-		{headerName: "정상이월", field: "formalGb", width: 100, cellClass: 'text-center'},
-		/* {headerName: "옵션문자열", field: "optStr", width: 200, cellClass: 'text-center'},
-		{headerName: "안전재고문자열", field: "baseStockStr", width: 200, cellClass: 'text-center'},
-		{headerName: "현재고문자열", field: "currStockStr", width: 200, cellClass: 'text-center'}, */
-		{headerName: "매입유형", field: "buyingType", width: 80, cellClass: 'text-center'}
+		{headerName: "고시내용28", field: "niContent28", width: 200, cellClass: 'text-left'}
 	];
 
 	// Get GridOptions
@@ -297,31 +256,6 @@
 		fnGoodsListSearch();
 	}
 	
-	$('#btnGoodsRegExcelDownLoad').on('click', function() {
-		
-		var date = new Date().format("YYYYMMDDHHmmss");
-		var params = {
-			
-			fileName : "상품대량등록결과_"+ date,
-			sheetName: "DATA"
-		}
-		gridOptions.excelStyles = [
-			{
-				id: 'text-center',
-				dataType: 'string',
-				font: {size : 10, bold: false}
-			},
-			{
-				id: 'text-left',
-				dataType: 'string',
-				font: {size : 10, bold: false}
-			}
-		]
-		
-		gridOptions.api.exportDataAsExcel(params);
-		
-	});
-	
 	// 초기화 클릭시
 	$('#btnInit').on('click', function() {
 		$('#massForm')[0].reset();

+ 3 - 3
src/main/webapp/WEB-INF/views/goods/GoodsWmsIncomelotForm.html

@@ -38,7 +38,7 @@
 						<col/>
 					</colgroup>
 					<tr>
-						<th>업체/브랜드<i class="star"></i></th>
+						<th>업체/브랜드<em class="required" title="필수"></em></th>
 						<td>
 							<select name="supplyCompCd" id="supplyCompCd">
 								<option value="" th:if="${sessionInfo.roleCd} != 'B000'">[전체]</option>
@@ -48,13 +48,13 @@
 								<option value="">[전체]</option>
 							</select>
 						</td>
-						<th>모델번호<i class="star"></i></th>
+						<th>모델번호<em class="required" title="필수"></em></th>
 						<td>
 							<input id="modelNo" name=modelNo type="text" class="w150"  maxlength="20"/>
 						</td>
 					</tr>
 					<tr>
-						<th>등록일<i class="star"></i></th>
+						<th>등록일<em class="required" title="필수"></em></th>
 						<td colspan="3" id="sellTerms"></td>
 					</tr>
 				</table>

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

@@ -97,6 +97,11 @@
 				<!-- 검색결과 영역 -->
 				<!--<div id="gridList" style="width: 100%; height: 700px;" class="ag-theme-balham lh60"></div>-->
 				<div id="gridList" style="width: 100%; height: 570px" class="ag-theme-balham"></div>
+				<ul class="panelBar">
+					<li class="center">
+						<div class="tablePaging" id="morebetterListPagination"></div>
+					</li>
+				</ul>
 			</div>
 		</form>
 <script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=2019072202"></script>
@@ -104,6 +109,9 @@
 /*<![CDATA[*/
 	var columnDefs = [];
 	columnDefs = [
+		{headerName: 'No', width: 60, cellClass: 'text-center',
+			valueGetter: function(params) { return cfnGridNumner('searchForm',params.node.rowIndex, 'A');}
+		},
 		{headerName: "프로모션ID", field: "tmtbSq", width: 80, cellClass: 'text-center',
 			cellRenderer: function(params) {
 				return "<a href=\"javascript:void(0);\" onclick=\"cfnOpenMorebetterSetPopup('U','" + params.value + "');\">" + params.value + "</a>";
@@ -157,16 +165,14 @@
 
 	// 조회클릭시
 	$('#btnSearch').on('click', function() {
-		$("#searchForm input[name=pageNo]").val('1');
+		if(!fnConditionCheck()) return;
 		fnMorebetterListSearch();
 	});
 
 	// 조회
 	var fnMorebetterListSearch = function() {
-		if(!fnConditionCheck()) return;
-
 		gagaPaging.init('searchForm', fnSearchCallBack, 'morebetterListPagination', $('#searchForm').find('#pageSize').val());
-		gagaPaging.load($("#searchForm input[name=pageNo]").val());
+		gagaPaging.load(1);
 	}
 
 	//검색 조건 확인

+ 292 - 140
src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html

@@ -48,7 +48,7 @@
 						<td>
 							<!-- 프로모션 ID 입력 : before -->
 							<label th:if="${mode == 'N'}">
-								<input class="w50p" type="text" id="disTmtbSq1" name="disTmtbSq" maxlength="30" th:value="${params.tmtbSq}" disabled=""/>
+								<input class="w50p" type="text" id="disTmtbSq1" name="disTmtbSq" maxlength="30" th:value="${params.tmtbSq}" disabled=""/> *자동생성
 							</label>
 							<label th:if="${mode == 'U'}">
 								<input class="w50p" type="text" id="disTmtbSq2" name="disTmtbSq" maxlength="30" th:value="${tmtbSeq}" disabled=""/>
@@ -57,18 +57,35 @@
 						</td>
 					</tr>
 					<tr>
-						<th>행사 기간<em class="required" title="필수"></em></th>
+						<th>시작일<em class="required" title="필수"></em></th>
 						<td>
-							<input type="text" class="schDate w100" name="tmtbStdt" maxlength="10" required="required" data-valid-name="시작일자"/>
-							~
-							<input type="text" class="schDate w100" name="tmtbEddt" maxlength="10" required="required" data-valid-name="종료일자"/>
+							<input type="hidden" name="tmtbStdt" id="tmtbStdt" required="required" data-valid-name="다다익선시작일시">
+							<input type="text" class="schDate w100" name="eventStdt" id="eventStdt" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
+							<select name="eventStHH" data-valid-name="다다익선시작(시)" style="width: 65px;"> <!--th:disabled="${mode == 'U'}"-->
+								<th:block th:each="num, index : ${#numbers.sequence(0,23)}">
+									<option  th:value="${#numbers.formatInteger(num,2)}" th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="${tmtbMstInfo.eventStHH == #numbers.formatInteger(num,2)}">시간</option>
+								</th:block>
+							</select>
+							<select name="eventStMM" data-valid-name="다다익선시작(분)" style="width: 65px;">
+								<th:block th:each="num, index : ${#numbers.sequence(0,59)}">
+									<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}분|" th:selected="${tmtbMstInfo.eventStMM == #numbers.formatInteger(num,2)}">분</option>
+								</th:block>
+							</select>
 						</td>
-						<th>상태<em class="required" title="필수"></em></th>
+						<th>종료일<em class="required" title="필수"></em></th>
 						<td>
-							<!-- 상태 입력 : before
-                            <input class="w50p" type="text" id="disTmtbStat" name="disTmtbStat" maxlength="30" th:value="${params.tmtbStat}" disabled=""/>-->
-							<label class="rdoBtn" th:if="${tmtbStatList}" th:each="oneData, status : ${tmtbStatList}" ><input type="radio" id="disTmtbStat" name="disTmtbStat" th:value="${oneData.cd}" th:text="${oneData.cdNm}" data-valid-name="상태"/></label>
-							<input type="hidden" id="tmtbStat" name="tmtbStat"/>
+							<input type="hidden" name="tmtbEddt" id="tmtbEddt" required="required" data-valid-name="다다익선종료일시">
+							<input type="text" class="schDate w100" name="eventEddt" id="eventEddt" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
+							<select name="eventEdHH" data-valid-name="다다익선종료(시)" style="width: 65px;">
+								<th:block th:each="num, index : ${#numbers.sequence(0,23)}">
+									<option  th:value="${#numbers.formatInteger(num,2)}" th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="${tmtbMstInfo.eventEdHH == #numbers.formatInteger(num,2)}">시간</option>
+								</th:block>
+							</select>
+							<select name="eventEdMM" data-valid-name="다다익선종료(분)" style="width: 65px;">
+								<th:block th:each="num, index : ${#numbers.sequence(0,59)}">
+									<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}분|" th:selected="${tmtbMstInfo.eventEdMM == #numbers.formatInteger(num,2)}">분</option>
+								</th:block>
+							</select>
 						</td>
 					</tr>
 					<tr>
@@ -90,12 +107,48 @@
 							<label class="rdoBtn"><input type="radio" name="multiYn" id="multiYnY" value="Y" checked="checked"/>복합상품</label>
 							<label class="rdoBtn"><input type="radio" name="multiYn" id="multiYnN" value="N"/>단일상품</label>
 						</td>
-
+						<th>상태<em class="required" title="필수"></em></th>
+						<td>
+							<!-- 상태 입력 : before
+                            <input class="w50p" type="text" id="disTmtbStat" name="disTmtbStat" maxlength="30" th:value="${params.tmtbStat}" disabled=""/>-->
+							<label class="rdoBtn" th:if="${tmtbStatList}" th:each="oneData, status : ${tmtbStatList}" ><input type="radio" id="disTmtbStat" name="disTmtbStat" th:value="${oneData.cd}" th:text="${oneData.cdNm}" data-valid-name="상태" disabled="disabled"/></label>
+							<input type="hidden" id="tmtbStat" name="tmtbStat"/>
+						</td>
 					</tr>
 
 				</table>
 			</div>
-
+			<div class="panelStyle" style="margin:unset;">
+				<!-- TITLE -->
+				<div class="panelTitle">
+					<h2>할인 구간</h2>
+					<span class="panelControl">
+						<i class="fa inner-fa-chevron-up"></i>    <!-- 열림/닫힘 화살표 -->
+					</span>
+				</div>
+				<!-- //TITLE -->
+				<div class="inner-panelContent">
+					<div class="panelContent">
+						<table class="frmStyle">
+							<colgroup>
+								<col width="10%"/>
+								<col width="90%"/>
+							</colgroup>
+							<tr>
+								<th>할인 구간</th>
+								<td>
+									<div class="padding10">
+										<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddSectionRow">행추가</button>
+										<button type="button" class="btn btnRight btn-success btn-lg" id="btnDelSectionRow">행삭제</button>
+										<br/>
+										<div id="gridSectionGbList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+									</div>
+								</td>
+							</tr>
+						</table>
+					</div>
+				</div>
+			</div>
 			<div class="panelStyle" style="margin:unset;">
 				<!-- TITLE -->
 				<div class="panelTitle">
@@ -152,10 +205,10 @@
 									</div>
 								</td>
 							</tr>
-							<tr > <!--class="off"-->
+							<tr class="off"> <!---->
 								<th>업체&브랜드상품</th>
 								<td>
-									<div class="padding10" > <!--style="display: none;"-->
+									<div class="padding10" style="display: none;"> <!---->
 										<div id="gridDuplicateGoodsList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
 									</div>
 								</td>
@@ -200,7 +253,7 @@
 			<div class="panelStyle" style="margin:unset;">
 				<!-- TITLE -->
 				<div class="panelTitle">
-					<h2>할인 구간</h2>
+					<h2>업체 분담율</h2>
 					<span class="panelControl">
 						<i class="fa inner-fa-chevron-up"></i>    <!-- 열림/닫힘 화살표 -->
 					</span>
@@ -214,13 +267,13 @@
 								<col width="90%"/>
 							</colgroup>
 							<tr>
-								<th>할인 구간</th>
+								<th>업체 분담율</th>
 								<td>
 									<div class="padding10">
-										<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddSectionRow">행추가</button>
-										<button type="button" class="btn btnRight btn-success btn-lg" id="btnDelSectionRow">행삭제</button>
+										<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddApplyBurden">업체추가</button>
+										<button type="button" class="btn btnRight btn-success btn-lg" id="btnDelApplyBurden">선택삭제</button>
 										<br/>
-										<div id="gridSectionGbList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+										<div id="gridApplyBurdenList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
 									</div>
 								</td>
 							</tr>
@@ -229,31 +282,24 @@
 				</div>
 			</div>
 
-			<div class="panelStyle" style="margin:unset;">
-				<!-- TITLE -->
-				<div class="panelTitle">
-					<h2>업체 분담율</h2>
-					<span class="panelControl">
-						<i class="fa inner-fa-chevron-up"></i>    <!-- 열림/닫힘 화살표 -->
-					</span>
-				</div>
-				<!-- //TITLE -->
+			<div class="panelStyle" style="margin:unset;" th:if="${mode == 'U'}">
 				<div class="inner-panelContent">
 					<div class="panelContent">
 						<table class="frmStyle">
 							<colgroup>
 								<col width="10%"/>
-								<col width="90%"/>
+								<col width="40%"/>
+								<col width="10%"/>
+								<col width="40%"/>
 							</colgroup>
 							<tr>
-								<th>업체 분담율</th>
+								<th>등록자</th>
 								<td>
-									<div class="padding10">
-										<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddApplyBurden">업체추가</button>
-										<button type="button" class="btn btnRight btn-success btn-lg" id="btnDelApplyBurden">선택삭제</button>
-										<br/>
-										<div id="gridApplyBurdenList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
-									</div>
+									<span id="regInfo">등록자이름(연.월.일 시간:분:초)</span>
+								</td>
+								<th>최종수정자</th>
+								<td>
+									<span id="updInfo">수정자이름(연.월.일 시간:분:초)</span>
 								</td>
 							</tr>
 						</table>
@@ -264,15 +310,13 @@
 
 		<ul class="panelBar">
 			<li  class="right">
-				<!-- <th:block th:if="${sessionInfo.roleCd == 'G001_0000' OR sessionInfo.roleCd == 'G001_A000' OR sessionInfo.roleCd == 'G001_A101' OR sessionInfo.roleCd == 'G001_A100' OR sessionInfo.roleCd == 'G001_A001'}"> -->
-				<!--<button type="button" class="btn btnRight btn-success btn-lg" id="btnSearchList">목록</button>-->
-				<button type="button" class="btn btnRight btn-success btn-lg" id="btnMorebetterSave">저장</button>
+				<button type="button" class="btn btnRight btn-success btn-lg" id="btnSearchList">목록</button>
+				<button type="button" class="btn btnRight btn-success btn-lg tmtbButton" id="btnMorebetterSave">저장</button>
 				<!--<button type="button" th:if="${mode == 'N'}" class="btn btnRight btn-success btn-lg" id="btnMorebetterSave">저장</button>
 				<button type="button" th:if="${mode == 'U'}" class="btn btnRight btn-success btn-lg" id="btnMorebetterUpdate">수정</button>-->
-				<!--<button type="button" class="btn btnRight btn-success btn-lg" id="btnChangeStatIng">진행</button>
-                    <button type="button" class="btn btnRight btn-success btn-lg" id="btnPromotionDelete">삭제</button>
-                    <button type="button" class="btn btnRight btn-success btn-lg" id="btnPromotionStop">중지</button>-->
-				<!-- </th:block> -->
+				<button type="button" class="btn btnRight btn-success btn-lg tmtbButton" id="btnChangeStatIng">진행</button>
+				<button type="button" class="btn btnRight btn-success btn-lg tmtbButton" id="btnMorebetterDelete">삭제</button>
+				<button type="button" class="btn btnRight btn-success btn-lg tmtbButton" id="btnMorebetterStop">중지</button>
 			</li>
 		</ul>
 	</div>
@@ -280,6 +324,7 @@
 
 <script th:inline="javascript">
 	// 상세 조회시 데이터 리스트
+	let confirmBtnText = ["확인", "취소"];
 	var mode = [[${mode}]];
 	var tmtbMstInfo = [[${tmtbMstInfo}]];
 	var tmtbSectionValList = [[${tmtbSectionValList}]];
@@ -349,6 +394,7 @@
 		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
 		{headerName: "업체ID", field: "tmtbSupplyCd" , width: 120, cellClass: 'text-center'},
 		{headerName: "분담율(%)", field: "tmtbBurdenRate" , width: 120, cellClass: 'text-center',required: true
+			,editable: true
 			,valueFormatter: function(params) {
 				if(params.value && params.value > 0) {
 					return params.value.addComma();
@@ -356,7 +402,7 @@
 					return '0';
 				}
 			},
-			cellEditor: 'textCellEditor',
+			//cellEditor: 'textCellEditor',
 			cellEditorParams: { maxlength: 3, validType: 'numeric'}
 		},
 		{headerName: "사용여부", field: "useYn" , width: 120, cellClass: 'text-center'},
@@ -368,7 +414,7 @@
 		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
 		{headerName: "시퀀스", field: "tmtbSq", width: 100, cellClass: 'text-center', hide: true},
-		{headerName: "할인구간", field: "sectionGb", width: 100, cellClass: 'text-center',
+		{headerName: "할인구간", field: "sectionGb", width: 100, cellClass: 'text-center', editable: false,
 			cellEditor: 'agRichSelectCellEditor',
 			cellEditorParams: { values: gagaAgGrid.extractValues(sectionGbList), required: true },
 			valueFormatter: function (params) { return gagaAgGrid.lookupValue(sectionGbList, params.value); },
@@ -382,10 +428,9 @@
 					return '0';
 				}
 			},
-			cellEditor: 'textCellEditor',
 			cellEditorParams: { maxlength: 14, validType: 'numeric'}
 		},
-		{headerName: "할인구분", field: "dcWay", width: 100, cellClass: 'text-center',
+		{headerName: "할인구분", field: "dcWay", width: 100, cellClass: 'text-center', editable: false,
 			cellEditor: 'agRichSelectCellEditor',
 			cellEditorParams: { values: gagaAgGrid.extractValues(dcWayList), required: true },
 			valueFormatter: function (params) { return gagaAgGrid.lookupValue(dcWayList, params.value); },
@@ -394,12 +439,18 @@
 		{headerName: "할인값", field: "dcVal", width: 100, cellClass: 'text-right', required: true
 			,valueFormatter: function(params) {
 				if(params.value && params.value > 0) {
+					if(params.data.dcWay == "G240_11"){
+						if(params.value.length > 2){
+							mcxDialog.alert('할인율은 100이하로 설정해주세요.');
+							params.data.dcVal = '0';
+							return '0';
+						}
+					}
 					return params.value.addComma();
 				} else {
 					return '0';
 				}
 			},
-			cellEditor: 'textCellEditor',
 			cellEditorParams: { maxlength: 14, validType: 'numeric'}
 		},
 		{headerName: "구간시퀀스", field: "tmtbSectionSq", width: 150, cellClass: 'text-center', hide: true},
@@ -435,9 +486,9 @@
 	// Grid editable
 	gridOptionsSectionGbList.defaultColDef.editable = true;
 	// Add on options
-	gridOptionsSectionGbList.suppressRowClickSelection = true;
+	//gridOptionsSectionGbList.suppressRowClickSelection = true;
 	gridOptionsSectionGbList.rowSelection = "multiple";
-	gridOptionsSectionGbList.stopEditingWhenGridLosesFocus = true;
+	//gridOptionsSectionGbList.stopEditingWhenGridLosesFocus = true;
 
 	// 다른 다다익선 사용중인 중복상품 엑셀 리스트 설정
 	var gridOptionsDuplicateGoodsList = gagaAgGrid.getGridOptions(columnDuplicateGoodsList);
@@ -453,6 +504,9 @@
 		gagaAgGrid.createGrid("gridSectionGbList", gridOptionsSectionGbList);
 		gagaAgGrid.createGrid("gridDuplicateGoodsList", gridOptionsDuplicateGoodsList);
 
+		// 일단 버튼 숨김
+		$(".tmtbButton").hide();
+
 		// 2. 그리드 데이터 바인딩
 		if(mode == "U"){
 			gridOptionsFGCompanyList.api.setRowData(tmtbSupplyCompList);
@@ -465,78 +519,30 @@
 			$('#moreBetterForm input[name=tmtbNm]').val(tmtbMstInfo.tmtbNm);
 			$('#moreBetterForm input[name=tmtbStdt]').val(tmtbMstInfo.tmtbStdt);
 			$('#moreBetterForm input[name=tmtbEddt]').val(tmtbMstInfo.tmtbEddt);
+			$('#moreBetterForm #regInfo').text(tmtbMstInfo.regNm + "(" + tmtbMstInfo.regDt + ")");
+			$('#moreBetterForm #updInfo').text(tmtbMstInfo.updNm + "(" + tmtbMstInfo.updDt + ")");
 			$("input:radio[name='disTmtbStat']:radio[value="+tmtbMstInfo.tmtbStat+"]").prop('checked', true); // 선택하기
 			$("input:radio[name='sectionGb']:radio[value="+tmtbMstInfo.sectionGb+"]").prop('checked', true); // 선택하기
 			$("input:radio[name='dcWay']:radio[value="+tmtbMstInfo.dcWay+"]").prop('checked', true); // 선택하기
 			$("input:radio[name='multiYn']:radio[value="+tmtbMstInfo.multiYn+"]").prop('checked', true); // 선택하기
 
+			if(tmtbMstInfo.tmtbStat == "G232_10"){
+				$("#btnMorebetterSave").show();		// 저장버튼
+				$("#btnChangeStatIng").show();		// 진행버튼
+				$("#btnMorebetterDelete").show();	// 삭제버튼
+			}else if(tmtbMstInfo.tmtbStat == "G232_11"){
+				$("#btnMorebetterSave").show();		// 저장버튼
+				$("#btnMorebetterStop").show();		// 중지버튼
+			}
 		}
 
 		// 구분 -> 대기로 체크
 		if(mode=="N"){
 			$("input:radio[name='disTmtbStat']:radio[value='G232_10']").prop('checked', true); // 선택하기
+			$("#btnMorebetterSave").show();	// 저장버튼
 		}
-		cfnCreateCalendar('#tmtbTerms', 'tmtbStdt', 'tmtbEddt', true, '행사기간', 'X');
-	});
-
-	// 수정 버튼 클릭시
-	$('#btnMorebetterUpdate').on('click', function() {
-		// validation
-		if (!gagajf.validation('#moreBetterForm'))
-			return false;
-
-		// 행사기간 확인
-		let fromDate = $('#moreBetterForm input[name=tmtbStdt]').val();
-		let toDate = $('#moreBetterForm input[name=tmtbEddt]').val();
-
-		if (gagajf.isNull(fromDate) || gagajf.isNull(toDate)) {
-			mcxDialog.alert("행사 기간 시작일자와 종료일자를 입력하세요.");
-			$('#moreBetterForm input[name=tmtbStdt]').focus();
-			return false;
-		}
-
-		if (fromDate > toDate) {
-			mcxDialog.alert("시작일자는 종료일자 보다 클 수 없습니다.");
-			$('#moreBetterForm input[name=tmtbStdt]').focus();
-			return false;
-		}
-
-		// disabled 값 넘겨주기
-		$('#moreBetterForm input[name=tmtbSq]').val($('#moreBetterForm input[name=disTmtbSq]').val());
-		$('#moreBetterForm input[name=tmtbStat]').val($('input:radio[name="disTmtbStat"]:checked').val());
-
-		mcxDialog.confirm('수정하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function(){
-				var compAllData = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList);	//selectedRowData
-				var brandAllData = gagaAgGrid.getAllRowData(gridOptionsFGBrandList);
-				var applyAllData = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList);
-				var exceptAllData = gagaAgGrid.getAllRowData(gridOptionsFGExceptGoodsList);
-				var burdenAllData = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList);
-				var sectionGbAllData = gagaAgGrid.getAllRowData(gridOptionsSectionGbList);
-
-				var jsonSupplyCompData = JSON.stringify(compAllData);
-				$('#moreBetterForm input[name=supplyCompList]').val(jsonSupplyCompData);
-				var jsonBrandData = JSON.stringify(brandAllData);
-				$('#moreBetterForm input[name=brandList]').val(jsonBrandData);
-				var jsonApplyData = JSON.stringify(applyAllData);
-				$('#moreBetterForm input[name=applyGoodsList]').val(jsonApplyData);
-				var jsonExceptData = JSON.stringify(exceptAllData);
-				$('#moreBetterForm input[name=exceptGoodsList]').val(jsonExceptData);
-				var jsonSectionGbData = JSON.stringify(sectionGbAllData);
-				$('#moreBetterForm input[name=sectionGbList]').val(jsonSectionGbData);
-				var jsonBurdenData = JSON.stringify(burdenAllData);
-				$('#moreBetterForm input[name=burdenList]').val(jsonBurdenData);
-
-				var jsonData = JSON.stringify($('#moreBetterForm').serializeObject());
-				gagajf.ajaxJsonSubmit($('#moreBetterForm').prop('action'), jsonData, function() {
-					fnMorebetterFormClose();
-					$('#btnInit').trigger('click');
-					$('#btnSearch').trigger('click');
-				});
-			}
-		});
+		//cfnCreateCalendar('#tmtbTerms', 'tmtbStdt', 'tmtbEddt', true, '행사기간', 'X');
+		cfnCreateCalendar('#tmtbTerms', 'eventStdt', 'eventEddt', true, '행사기간', 'X');
 	});
 
 	var fnGoodsGbCheck = function (){
@@ -547,12 +553,23 @@
 				checkCnt++;
 			}
 		});
-		console.log('checkCnt>>'+checkCnt);
+
 		if(checkCnt < 1){
 			mcxDialog.alert("기본상품을 1개 이상 지정해주세요.");
 			return false;
-		}else{
-			console.log('통과');
+		}
+	};
+
+	var fnBurdenValueCheck = function (){
+		let burdenData = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList);
+		let totalValue = 0;
+		$.each(burdenData, function(idx, item) {
+			totalValue += parseInt(item.tmtbBurdenRate);
+		});
+
+		if(totalValue > 100) {
+			mcxDialog.alert("업체분담율의 합이 100을 넘을수 없습니다.");
+			return false;
 		}
 	};
 
@@ -563,15 +580,23 @@
 			return false;
 
 		// 행사기간 확인
-		let fromDate = $('#moreBetterForm input[name=tmtbStdt]').val();
-		let toDate = $('#moreBetterForm input[name=tmtbEddt]').val();
-
-		if (gagajf.isNull(fromDate) || gagajf.isNull(toDate)) {
+		if (gagajf.isNull($('#moreBetterForm input[name=eventStdt]').val()) || gagajf.isNull($('#moreBetterForm input[name=eventEddt]').val())) {
 			mcxDialog.alert("행사 기간 시작일자와 종료일자를 입력하세요.");
 			$('#moreBetterForm input[name=tmtbStdt]').focus();
 			return false;
 		}
 
+		var eventStDt = $('#moreBetterForm input[name=eventStdt]').val()+$('#moreBetterForm select[name=eventStHH]').val()+$('#moreBetterForm select[name=eventStMM]').val()+'00';
+		var eventEdDt = $('#moreBetterForm input[name=eventEddt]').val()+$('#moreBetterForm select[name=eventEdHH]').val()+$('#moreBetterForm select[name=eventEdMM]').val()+'59';
+
+		eventStDt = eventStDt.replace(/[^0-9]/g, '');
+		eventEdDt = eventEdDt.replace(/[^0-9]/g, '');
+		console.log('2.eventStDt>>'+eventStDt);
+		console.log('3.eventEdDt>>'+eventEdDt);
+
+		let fromDate = $('#moreBetterForm input[name=tmtbStdt]').val(eventStDt);
+		let toDate = $('#moreBetterForm input[name=tmtbEddt]').val(eventEdDt);
+
 		if (fromDate > toDate) {
 			mcxDialog.alert("시작일자는 종료일자 보다 클 수 없습니다.");
 			$('#moreBetterForm input[name=tmtbStdt]').focus();
@@ -607,6 +632,9 @@
 		// 적용상품 그리드에 기본상품 1개이상 있는지 체크
 		fnGoodsGbCheck();
 
+		// 업체분담율 토탈 100% 넘는지 체크
+		fnBurdenValueCheck();
+
 		var data = {
 			mode : $('#moreBetterForm input[name=mode]').val()
 			, tmtbSq : $('#moreBetterForm input[name=disTmtbSq]').val()
@@ -628,7 +656,7 @@
 
 		var jsonData = JSON.stringify(data);
 
-		gagajf.ajaxJsonSubmit($('#moreBetterForm').prop('action'), jsonData, fnMorebetterSaveCollback);
+		//gagajf.ajaxJsonSubmit($('#moreBetterForm').prop('action'), jsonData, fnMorebetterSaveCollback);
 	});
 
 	var fnMorebetterSaveCollback = function(result){
@@ -643,7 +671,7 @@
 
 			return;
 		}else{
-			mcxDialog.alert(result.msg);
+			//mcxDialog.alert(result.message);
 			fnMorebetterFormClose();
 			$('#btnInit').trigger('click');
 			$('#btnSearch').trigger('click');
@@ -742,20 +770,31 @@
 			goodsGbVal = "G800_30";
 		}
 
+		let addCnt = 0;
+		let failCnt = 0;
+		let dupliCnt = 0;
+
 		for(let i = 0 ; i < result.length ; i++) {
 			let addChk = true, gridListValue = gagaAgGrid.getAllRowData(OriginGridListOption);		// 받아온 모든 데이터
 
 			// 받아온 data for
 			for(let j = 0 ; j < gridListValue.length ; j++) {
-				if(gridListValue[j].goodsCd == result[i].goodsCd) {	addChk = false;	}				// 중복체크
+				if(gridListValue[j].goodsCd == result[i].goodsCd) { // 중복체크
+					addChk = false;
+					dupliCnt++;
+				}
 			}
 
 			// 중복되지 않은 데이터 리스트에 추가
 			if(addChk) {
 				//gagaAgGrid.addRowData(OriginGridListOption, result[i], "goodsCd");
 				gagaAgGrid.addRowData(OriginGridListOption, {"goodsGb": goodsGbVal, "goodsCd" : result[i].goodsCd, "goodsNm" : result[i].goodsNm, "targetGb" : "G260_10"});
+				addCnt++;
 			}
 		}
+		uifnPopupClose('popupGoods');
+		failCnt = result.length - addCnt - dupliCnt;
+		mcxDialog.alert("데이터가 적용되었습니다.<br/>" + addCnt + "건 성공, "+ dupliCnt + "건 중복, " + failCnt + "건 실패");
 	}
 
 	// 공급업체 설정 업체 추가 버튼 클릭시
@@ -869,18 +908,19 @@
 		var dcWayValue = $('input:radio[name="dcWay"]:checked').val();
 		var loopRowData = gagaAgGrid.getAllRowData(gridOptionsSectionGbList);
 
-		if (loopRowData.length == 0) {
+		/*if (loopRowData.length == 0) {
 			mcxDialog.alert('ROW 데이터가 없습니다.');
 			return;
+		}*/
+		if(loopRowData.length > 0) {
+			for (i = 0; i < loopRowData.length; i++) {
+				loopRowData[i].sectionGb = sectionGbValue;
+				loopRowData[i].sectionVal = "";
+				loopRowData[i].dcWay = dcWayValue;
+				loopRowData[i].dcVal = "";
+			}
+			gridOptionsSectionGbList.api.setRowData(loopRowData);
 		}
-
-		for(i=0; i<loopRowData.length; i++){
-			loopRowData[i].sectionGb = sectionGbValue;
-			loopRowData[i].sectionVal = "";
-			loopRowData[i].dcWay = dcWayValue;
-			loopRowData[i].dcVal = "";
-		}
-		gridOptionsSectionGbList.api.setRowData(loopRowData);
 	});
 
 	// 할인구분 선택 시 기본 조건 변경
@@ -889,18 +929,19 @@
 		var dcWayValue = $(this).val();
 		var loopRowData = gagaAgGrid.getAllRowData(gridOptionsSectionGbList);
 
-		if (loopRowData.length == 0) {
+		/*if (loopRowData.length == 0) {
 			mcxDialog.alert('ROW 데이터가 없습니다.');
 			return;
+		}*/
+		if(loopRowData.length > 0) {
+			for (i = 0; i < loopRowData.length; i++) {
+				loopRowData[i].sectionGb = sectionGbValue;
+				loopRowData[i].sectionVal = "";
+				loopRowData[i].dcWay = dcWayValue;
+				loopRowData[i].dcVal = "";
+			}
+			gridOptionsSectionGbList.api.setRowData(loopRowData);
 		}
-
-		for(i=0; i<loopRowData.length; i++){
-			loopRowData[i].sectionGb = sectionGbValue;
-			loopRowData[i].sectionVal = "";
-			loopRowData[i].dcWay = dcWayValue;
-			loopRowData[i].dcVal = "";
-		}
-		gridOptionsSectionGbList.api.setRowData(loopRowData);
 	});
 
 	// 공급업체 행삭제
@@ -1038,8 +1079,119 @@
 		}
 	});
 
-	$(document).ready(function() {
 
+	// 수정 버튼 클릭시
+	$('#btnMorebetterUpdate').on('click', function() {
+		// validation
+		if (!gagajf.validation('#moreBetterForm'))
+			return false;
+
+		// 행사기간 확인
+		let fromDate = $('#moreBetterForm input[name=tmtbStdt]').val();
+		let toDate = $('#moreBetterForm input[name=tmtbEddt]').val();
+
+		if (gagajf.isNull(fromDate) || gagajf.isNull(toDate)) {
+			mcxDialog.alert("행사 기간 시작일자와 종료일자를 입력하세요.");
+			$('#moreBetterForm input[name=tmtbStdt]').focus();
+			return false;
+		}
+
+		if (fromDate > toDate) {
+			mcxDialog.alert("시작일자는 종료일자 보다 클 수 없습니다.");
+			$('#moreBetterForm input[name=tmtbStdt]').focus();
+			return false;
+		}
+
+		// disabled 값 넘겨주기
+		$('#moreBetterForm input[name=tmtbSq]').val($('#moreBetterForm input[name=disTmtbSq]').val());
+		$('#moreBetterForm input[name=tmtbStat]').val($('input:radio[name="disTmtbStat"]:checked').val());
+
+		mcxDialog.confirm('수정하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var compAllData = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList);	//selectedRowData
+				var brandAllData = gagaAgGrid.getAllRowData(gridOptionsFGBrandList);
+				var applyAllData = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList);
+				var exceptAllData = gagaAgGrid.getAllRowData(gridOptionsFGExceptGoodsList);
+				var burdenAllData = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList);
+				var sectionGbAllData = gagaAgGrid.getAllRowData(gridOptionsSectionGbList);
+
+				var jsonSupplyCompData = JSON.stringify(compAllData);
+				$('#moreBetterForm input[name=supplyCompList]').val(jsonSupplyCompData);
+				var jsonBrandData = JSON.stringify(brandAllData);
+				$('#moreBetterForm input[name=brandList]').val(jsonBrandData);
+				var jsonApplyData = JSON.stringify(applyAllData);
+				$('#moreBetterForm input[name=applyGoodsList]').val(jsonApplyData);
+				var jsonExceptData = JSON.stringify(exceptAllData);
+				$('#moreBetterForm input[name=exceptGoodsList]').val(jsonExceptData);
+				var jsonSectionGbData = JSON.stringify(sectionGbAllData);
+				$('#moreBetterForm input[name=sectionGbList]').val(jsonSectionGbData);
+				var jsonBurdenData = JSON.stringify(burdenAllData);
+				$('#moreBetterForm input[name=burdenList]').val(jsonBurdenData);
+
+				var jsonData = JSON.stringify($('#moreBetterForm').serializeObject());
+				gagajf.ajaxJsonSubmit($('#moreBetterForm').prop('action'), jsonData, function() {
+					fnMorebetterFormClose();
+					$('#btnInit').trigger('click');
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+
+	// 목록 버튼 클릭
+	$("#moreBetterForm #btnSearchList").on("click", function() {
+		uifnPopupClose('popupMorebetterReg');
+	});
+
+	// 진행 버튼 클릭
+	$("#moreBetterForm #btnChangeStatIng").on("click", function() {
+		mcxDialog.confirmC("프로모션을 진행하시겠습니까?<br/>진행 후에는 수정이 제한될 수 있습니다.", {
+			btn: confirmBtnText,
+			btnClick: function(index) {
+				if(index == 1) {
+					let data = { tmtbStat : "G232_11"				// 진행
+						, tmtbSq : $('#moreBetterForm input[name=disTmtbSq]').val()
+					}
+					var jsonData = JSON.stringify(data);
+					gagajf.ajaxJsonSubmit('/marketing/morebetter/changeStat', jsonData, fnMorebetterFormClose);
+				}
+			}
+		});
+	});
+
+	// 진행 버튼 클릭
+	$("#moreBetterForm #btnMorebetterStop").on("click", function() {
+		mcxDialog.confirmC("프로모션을 중지하시겠습니까?<br/>중지 후에는 진행으로 복원하실 수 없습니다.", {
+			btn: confirmBtnText,
+			btnClick: function(index) {
+				if(index == 1) {
+					let data = { tmtbStat : "G232_12"			// 중지
+						, tmtbSq : $('#moreBetterForm input[name=disTmtbSq]').val()
+					}
+					var jsonData = JSON.stringify(data);
+					gagajf.ajaxJsonSubmit('/marketing/morebetter/changeStat', jsonData, fnMorebetterFormClose);
+				}
+			}
+		});
 	});
+
+	// 삭제 버튼 클릭
+	$("#btnMorebetterDelete").on("click", function() {
+		mcxDialog.confirmC("프로모션을 삭제하시겠습니까?<br/>삭제한 프로모션은 복원하실 수 없습니다.", {
+			btn: confirmBtnText,
+			btnClick: function(index) {
+				if(index == 1) {
+					let data = { tmtbStat: "G232_14"			// 삭제
+						, tmtbSq : $('#moreBetterForm input[name=disTmtbSq]').val()
+					}
+					var jsonData = JSON.stringify(data);
+					gagajf.ajaxJsonSubmit('/marketing/morebetter/changeStat', jsonData, fnMorebetterFormClose);
+				}
+			}
+		});
+	});
+
 </script>
 </html>

+ 0 - 0
src/main/webapp/WEB-INF/views/order/CancelRequestFormBack.html → src/main/webapp/WEB-INF/views/order/CancelRequestFormBack01.html


+ 2 - 2
src/main/webapp/WEB-INF/views/order/CancelRequestForm.html → src/main/webapp/WEB-INF/views/order/CancelRequestFormBack02.html

@@ -888,7 +888,7 @@ var fnChangeChgReason = function(reasonCd){
 }
 
 // 취소신청/완료
-var fnCnclComplete = function (reqGbn) {
+var fnCnclReq = function (reqGbn) {
 	
 	var temp 		= false;
 	var ordDtlStat	= cancelRequestTargetList[0].ordDtlStat; 
@@ -962,7 +962,7 @@ var fnCnclComplete = function (reqGbn) {
 		,"isCustomer" 		: isCustomer
 		,"chgerNm"			: chgerNm
 		,"chgerEmail"		: chgerEmail
-		,"chgerZipNo"		: ""
+		,"chgerZipcode"		: ""
 		,"chgerBaseAddr"	: ""
 		,"chgerDtlAddr"		: ""
 		,"chgerPhnno"		: chgerPhnno

+ 1054 - 0
src/main/webapp/WEB-INF/views/order/CnclReqForm.html

@@ -0,0 +1,1054 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CancelRequestForm.html
+ * @desc    : 취소요청 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2019 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.12.12   jsh77b       최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1400" data-height="600">
+	<div class="panelStyle">
+		<div class="panelTitle">
+			<h2>취소요청</h2>
+			<button type="button" class="close" onclick="uifnPopupClose('popupCancelRequestForm');"><i class="fa fa-times"></i></button>
+		</div>
+			
+		<div class="panelContent" style="height:90%; overflow-y:auto; padding:0px 20px !important; ">
+			<form id="cancelRequestFrm" name="cancelRequestFrm" action="/orderChange/cancel" method="post" target="hdFrameForOrderCancel">
+				<input type="hidden" name="ordNo" th:value="${ordNo}"/>
+				<input type="hidden" name="chgReason" value=""/>
+				<input type="hidden" name="chgReasonDesc" value=""/>
+				
+				<h4>주문정보</h4>
+				<div id="gridOrderCancelRequestList" style="width:100%; height: 200px;" class="ag-theme-balham"></div>
+
+				<h4>취소정보</h4>
+				<div id="gridOrderCancelRequestToBeList" style="width:100%; height: 200px;" class="ag-theme-balham"></div>
+				
+				<h4>배송비정보</h4>
+				<div id="gridDelvCdList" style="width:100%; height: 140px;" class="ag-theme-balham"></div>
+				
+				<div style="text-align:right; padding-bottom:5px; padding-top:5px;">
+					<button type="button" class="btn btn-success" onclick="fnCnclReq('req');">취소신청</button>
+					<button type="button" class="btn btn-success" onclick="fnCnclReq('complete');">취소완료</button>
+				</div>
+				
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:160px;" />
+						<col style="width:320px;" />
+						<col style="width:160px;" />
+						<col />
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>취소사유 <i class="star"></i></th>
+							<td>
+								<select name="selectChgReason" onchange="fnChangeChgReason($(this).val());">
+									<option value="">[선택하세요]</option>
+									<option th:if="${chgReasonList}" th:each="oneData, status : ${chgReasonList}" th:value="|${oneData.cd}:${oneData.cdNm}|" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+								</select>
+							</td>
+							<th>귀책사유</th>
+							<td><span id="imputeReason"></span></td>
+						</tr>
+						<tr>
+							<th>요청메모</th>
+							<td colspan="3">
+								<textarea id="chgMemo" name="chgMemo" style="height:80px;" placeholder="취소사유를 300자내외로 작성해 주세요"></textarea>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+				
+				<h4>환불예정금액</h4>
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:20%;"/>
+						<col style="width:30%;"/>
+						<col style="width:20%;"/>
+						<col style="width:30%;"/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>총 결제 금액</th>
+							<td colspan="3"><span id="spanPayAmt"></span>원 (상품 실결제 금액 : <span id="spanSumRealOrdAmt"></span>원, 배송금액 : <span id="spanSumDeliveryFee"></span>원) </td>
+						</tr>
+						<tr>
+							<th>주문 상품 금액</th>
+							<td><span id="spanOrdAmt"></span>원</td>
+							<th>취소 상품 금액</th>
+							<td><span id="spanCnclRtnAmt"></span>원</td>
+						</tr>
+						<tr>
+							<th>취소 사용 포인트</th>
+							<td colspan="3"><span id="spanTotPntDcAmt"></span>원 (고객 포인트 : <span id="spanPntDcAmt"></span>원 + 상품 선포인트 : <span id="spanPrePntDcAmt"></span>원) </td>
+						</tr>
+						<tr>
+							<th>취소 사용 쿠폰금액</th>
+							<td colspan="3"><span id="spanCpnDcAmt"></span>원 (즉시할인쿠폰 : <span id="spanCpn1DcAmt"></span>원 + 상품쿠폰 : <span id="spanGoodsCpnDcAmt"></span>원 + 장바구니쿠폰 : <span id="spanCartCpnDcAmt"></span>원)</td>
+						</tr>
+						<tr>
+							<th>취소 다다익선 금액</th>
+							<td colspan="3"><span id="spanTmtbDcAmt"></span>원 (수량할인 : <span id="spanTmtb1DcAmt"></span>원 + 금액할인 : <span id="spanTmtb2DcAmt"></span>원)</td>
+						</tr>
+						
+						<tr>
+							<th>취소 고객 상품권 금액</th>
+							<td colspan="3"><span id="spanGfcdUseAmt"></span>원</td>
+						</tr>
+						
+						<tr>
+							<th>취소 상품 실결제 금액</th>
+							<td><span id="spanRealCnclRtnAmt"></span>원</td>
+							<th>추가 배송 금액</th>
+							<td><span id="spanTotDeliveryFee"></span>원 </td>
+						</tr>
+						
+						<tr>
+							<th>환불 금액 합계</th>
+							<td colspan="3"><span id="spanRefundAmt"></span>원</td>
+						</tr>
+					</tbody>
+				</table>
+				
+				<div id="wrapRefundAccount" style="width:50%;">
+					<h4>환불계좌정보</h4>
+					<button type="button" id="btnSaveAccount" class="btn btnRight btn-base btn-sm" style="margin-left:10px;" onclick="fnCreateOrderRfAccount();">등록</button>
+					<div id="gridRefundAccountInfo" style="height: 150px;" class="ag-theme-balham"></div>
+				</div>
+				
+			</form>
+		</div>
+	</div>
+</div>
+
+<!-- data -->
+<script th:inline="javascript">
+/*<![CDATA[*/
+var cancelRequestTargetList = [[${cancelRequestTargetList}]];				// 취소대상목록
+var ordNo 					= [[${ordNo}]];									// 주문번호
+var orderInfoList 			= [[${orderInfoList}]];							// 주문기본정보
+var payMeans 				= orderInfoList[0].payMeans;					// 결제수단
+
+var temp1 = true;
+var temp2 = false;
+
+// 1. 주문정보(반품대상)
+var columnCancelReqList = [
+	{
+		headerName	: "주문상세정보",
+		children	: [
+			{headerName: "주문번호"		, field: "ordNo"			, width: 80		, cellClass: 'text-center', hide: temp1},
+			{headerName: "주문상세"		, field: "ordDtlNo"			, width: 80		, cellClass: 'text-center'},
+			{headerName: "주문상세"		, field: "ordDtlStat"		, width: 80		, cellClass: 'text-center', hide: temp1},
+			{headerName: "주문상세상태"		, field: "ordDtlStatNm"		, width: 100	, cellClass: 'text-center', hide: temp1},
+			{headerName: "상품코드"		, field: "goodsCd"			, width: 100	, cellClass: 'text-center', hide: temp1},
+			{headerName: "상품명"			, field: "goodsNm"			, width: 200	, cellClass: 'text-center', hide: temp1},
+			{headerName: "상품타입"		, field: "goodsTypeNm"		, width: 100	, cellClass: 'text-center', hide: temp2}
+		]
+	},
+	{
+		headerName	: "주문상세단품정보",
+		children	: [
+			{headerName: "단품번호"		, field: "ordDtlItemSq"		, width: 100	, cellClass: 'text-center', hide: temp2},
+			{headerName: "단품코드"		, field: "itemCd"			, width: 100	, cellClass: 'text-center', hide: temp2},
+			{headerName: "단품명"			, field: "itemNm"			, width: 200	, cellClass: 'text-center', hide: temp2},
+			{headerName: "옵션1"			, field: "optCd1"			, width: 80		, cellClass: 'text-center', hide: temp1},
+			{headerName: "옵션2"			, field: "optCd2"			, width: 80		, cellClass: 'text-center', hide: temp2},
+			{
+				headerName		: "단품수량"		
+				, field			: "itemQty"			
+				, width			: 80		
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "단품금액"		
+				, field			: "itemPrice"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "단품옵션금액"		
+				, field			: "optAddPrice"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			}
+		]
+	},
+	{
+		headerName	: "주문상세수량",
+		children	: [
+			{
+				headerName		: "주문"		
+				, field			: "ordQty"			
+				, width			: 80		
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "취소/요청"		
+				, field			: "cnclRtnQty"			
+				, width			: 80		
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					var cnclRtnReqQty = parseInt(params.data.cnclRtnQty) + parseInt(params.data.ordReqChgQty);
+					return cnclRtnReqQty;
+				}
+			},
+			{
+				headerName		: "취소/반품"		
+				, field			: "ordCanChgQty"			
+				, width			: 100		
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					var ordQty 			= parseInt(params.data.ordQty);
+					var cnclRtnQty 		= parseInt(params.data.cnclRtnQty);
+					var ordReqChgQty 	= parseInt(params.data.ordReqChgQty);
+					var ordCanChgQty 	= ordQty - (cnclRtnQty +  ordReqChgQty);
+					
+					var strVal 			= "";
+					strVal += "<select class='ordCanChgQty' name='ordCanChgQty' ordDtlNo='"+params.data.ordDtlNo+"' onChange='fnCalculateRefundAmt(this);'>";
+					
+					for (i=0 ; i<=ordCanChgQty ; i++) {
+						if (i == params.data.ordCanChgQty) {
+							strVal += "	<option value='"+i+"' selected>"+i+"</option>";
+						} else {
+							strVal += "	<option value='"+i+"'>"+i+"</option>";
+						}
+					}
+				
+					strVal += "</select>";
+					return strVal;
+				}
+			}
+		]
+	},
+	{
+		headerName	: "주문단품금액",
+		children	: [
+			{
+				headerName		: "주문"
+				, field			: "ordAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "취소"		
+				, field			: "cnclRtnAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "즉시할인"		
+				, field			: "cpn1DcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "다다익선1"		
+				, field			: "tmtb1DcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "다다익선2"		
+				, field			: "tmtb2DcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "상품쿠폰"		
+				, field			: "goodsCpnDcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "장바구니쿠폰"		
+				, field			: "cartCpnDcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "포인트"		
+				, field			: "pntDcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "선포인트"		
+				, field			: "prePntDcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "상품권"		
+				, field			: "gfcdUseAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "실결제금액"		
+				, field			: "realOrdAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			}
+		]
+	},
+	{
+		headerName	: "주문배송비정보",
+		children	: [
+			{
+				headerName		: "배송비"		
+				, field			: "delvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{headerName: "업체"			, field: "supplyCompCd"		, width: 100	, cellClass: 'text-center', hide: temp2},
+			{headerName: "배송비코드"		, field: "delvFeeCd"		, width: 100	, cellClass: 'text-center', hide: temp2},
+			{
+				headerName		: "무료배송비"		
+				, field			: "minOrdAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "기본배송비"		
+				, field			: "orgDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "반품배송비"		
+				, field			: "rtnDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "교환배송비"		
+				, field			: "excDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{headerName: "전체취소가능"		, field: "allCanYn"			, width: 100	, cellClass: 'text-center', hide: temp2},
+		]
+	}
+];
+var gridOptionsCancelReqList = gagaAgGrid.getGridOptions(columnCancelReqList);
+
+// Add on options
+gridOptionsCancelReqList.suppressRowClickSelection = true;
+gridOptionsCancelReqList.rowSelection = 'multiple';
+
+// 2. 취소정보(환불정보)
+var columnCancelReqToBeList = [
+	{
+		headerName	: "주문상세정보",
+		children	: [
+			{headerName: "주문번호"		, field: "ordNo"			, width: 80		, cellClass: 'text-center', hide: temp1},
+			{headerName: "주문상세"		, field: "ordDtlNo"			, width: 80		, cellClass: 'text-center'},
+			{headerName: "주문상세"		, field: "ordDtlStat"		, width: 80		, cellClass: 'text-center', hide: temp1},
+			{headerName: "주문상세상태"		, field: "ordDtlStatNm"		, width: 100	, cellClass: 'text-center', hide: temp1},
+			{headerName: "상품코드"		, field: "goodsCd"			, width: 100	, cellClass: 'text-center', hide: temp1},
+			{headerName: "상품명"			, field: "goodsNm"			, width: 200	, cellClass: 'text-center', hide: temp1},
+			{headerName: "상품타입"		, field: "goodsTypeNm"		, width: 100	, cellClass: 'text-center', hide: temp2}
+		]
+	},
+	{
+		headerName	: "주문상세단품정보",
+		children	: [
+			{headerName: "단품번호"		, field: "ordDtlItemSq"		, width: 100	, cellClass: 'text-center', hide: temp2},
+			{headerName: "단품코드"		, field: "itemCd"			, width: 100	, cellClass: 'text-center', hide: temp2},
+			{headerName: "단품명"			, field: "itemNm"			, width: 200	, cellClass: 'text-center', hide: temp2},
+			{headerName: "칼라코드"		, field: "optCd1"			, width: 80		, cellClass: 'text-center', hide: temp1},
+			{headerName: "사이즈코드"		, field: "optCd2"			, width: 80		, cellClass: 'text-center', hide: temp2},
+			{
+				headerName		: "단품수량"		
+				, field			: "itemQty"			
+				, width			: 80		
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "단품금액"		
+				, field			: "itemPrice"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "단품옵션금액"		
+				, field			: "optAddPrice"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			}
+		]
+	},
+	{
+		headerName	: "주문상세수량",
+		children	: [
+			{
+				headerName		: "주문"		
+				, field			: "ordQty"			
+				, width			: 80		
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "취소/요청"		
+				, field			: "cnclRtnQty"			
+				, width			: 80		
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					var cnclRtnReqQty = parseInt(params.data.cnclRtnQty) + parseInt(params.data.ordReqChgQty);
+					return cnclRtnReqQty;
+				}
+			},
+			{
+				headerName		: "취소/반품"		
+				, field			: "ordCanChgQty"			
+				, width			: 100		
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			}
+		]
+	},
+	{
+		headerName	: "주문단품금액",
+		children	: [
+			{
+				headerName		: "주문"
+				, field			: "ordAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "취소"		
+				, field			: "cnclRtnAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "즉시할인"		
+				, field			: "cpn1DcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "다다익선1"		
+				, field			: "tmtb1DcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "다다익선2"		
+				, field			: "tmtb2DcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "상품쿠폰"		
+				, field			: "goodsCpnDcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "장바구니쿠폰"		
+				, field			: "cartCpnDcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "포인트"		
+				, field			: "pntDcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "선포인트"		
+				, field			: "prePntDcAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "상품권"		
+				, field			: "gfcdUseAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "환불금액"		
+				, field			: "realOrdAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			}
+		]
+	},
+	{
+		headerName	: "주문배송비정보",
+		children	: [
+			{
+				headerName		: "배송비"		
+				, field			: "delvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{headerName: "업체"			, field: "supplyCompCd"		, width: 100	, cellClass: 'text-center', hide: temp2},
+			{headerName: "배송비코드"		, field: "delvFeeCd"		, width: 100	, cellClass: 'text-center', hide: temp2},
+			{
+				headerName		: "무료배송비"		
+				, field			: "minOrdAmt"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "기본배송비"		
+				, field			: "orgDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "반품배송비"		
+				, field			: "rtnDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "교환배송비"		
+				, field			: "excDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{headerName: "전체취소가능"		, field: "allCanYn"			, width: 100	, cellClass: 'text-center', hide: temp2},
+		]
+	}
+];
+var gridOptionsCancelReqToBeList = gagaAgGrid.getGridOptions(columnCancelReqToBeList);
+
+// 3. 배송비정보(환불정보)
+var columnDelvCdList = [
+	{
+		headerName	: "배송코드기준금액",
+		children	: [
+			{headerName: "업체"			, field: "supplyCompCd"		, width: 100	, cellClass: 'text-center', hide: temp2},
+			{headerName: "배송비코드"		, field: "delvFeeCd"		, width: 100	, cellClass: 'text-center', hide: temp2},
+			{
+				headerName		: "주문"
+				, field			: "ordAmt"			
+				, width			: 100		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "취소"		
+				, field			: "cnclRtnAmt"			
+				, width			: 100		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "환불"		
+				, field			: "realOrdAmt"			
+				, width			: 100		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			}
+		]
+	},
+	{
+		headerName	: "배송비정보",
+		children	: [
+			{
+				headerName		: "배송비"		
+				, field			: "delvFee"			
+				, width			: 100		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "무료배송비"		
+				, field			: "minOrdAmt"			
+				, width			: 100		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "기본배송비"		
+				, field			: "orgDelvFee"			
+				, width			: 100		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "반품배송비"		
+				, field			: "rtnDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{
+				headerName		: "교환배송비"		
+				, field			: "excDelvFee"			
+				, width			: 80		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{headerName: "추가배송비여부"		, field: "addDelvFeeYn"		, width: 140	, cellClass: 'text-center', hide: temp2},
+			{
+				headerName		: "추가배송비"		
+				, field			: "addDelvFee"			
+				, width			: 100		
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+				, hide			: temp2
+			},
+			{headerName: "전체취소가능"		, field: "allCanYn"			, width: 100	, cellClass: 'text-center', hide: temp2},
+		]
+	}
+];
+var gridOptionsDelvCdList = gagaAgGrid.getGridOptions(columnDelvCdList);
+
+// 4. 무통장 계좌정보
+var columnDefsRefundAccountInfo = [
+	{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: false, checkboxSelection: true, filter: false},
+	{headerName: "은행명"		, field: "bankNm"		, width: 140	, cellClass: 'text-center'},
+	{headerName: "은행코드"	, field: "bankCd"		, width: 120	, cellClass: 'text-center', hidden:true},
+	{headerName: "계좌번호"	, field: "accountNo"	, width: 150	, cellClass: 'text-center'},
+	{headerName: "예금주"		, field: "accountNm"	, width: 120	, cellClass: 'text-center'},
+	{headerName: "기본"		, field: "defaultYn"	, width: 100	, cellClass: 'text-center'}
+];
+
+var gridOptionsRefundAccountInfo = gagaAgGrid.getGridOptions(columnDefsRefundAccountInfo);
+</script>
+
+<script>
+// 현재 사유는 고객 입니다.
+var isCustomer = true;
+
+// 취소정보계산
+var fnCalculateRefundAmt = function (obj) {
+	// 취소정보담은목록
+	var cancelRequestTargetToBeList = [];
+
+	if (obj != null) {
+		for (i=0 ; i<cancelRequestTargetList.length ; i++) {
+			var orDtlNo 		= $(obj).attr("ordDtlNo");
+			var ordCanChgQty 	= $(obj).val();
+			
+			if (cancelRequestTargetList[i].ordDtlNo == orDtlNo) {
+				cancelRequestTargetList[i].ordCanChgQty = ordCanChgQty;
+			}
+		}
+		// 주문정보 다시 셋팅 (체크해봐야할문제)
+		gridOptionsCancelReqList.api.setRowData(cancelRequestTargetList);
+	}
+	
+	if (cancelRequestTargetList.length == 0) {
+		alert("요청 대상정보가 존재 하지 않습니다.");
+		uifnPopupClose('popupCancelRequestForm');
+		return false;
+	}
+	
+	// 환불금액계산호출
+	var jsonData = JSON.stringify(cancelRequestTargetList);
+	gagajf.ajaxJsonSubmit(
+		'/orderChange/cancel/refundAmt'
+		, jsonData
+		, function(result) {
+			gridOptionsCancelReqToBeList.api.setRowData(result.cancelOrderRefundList);
+			gridOptionsDelvCdList.api.setRowData(result.cancelDelvRefundList);
+			
+			$("#spanPayAmt").text(result.spanPayAmt.addComma());					//총 결제 금액
+			$("#spanSumRealOrdAmt").text(result.spanSumRealOrdAmt.addComma());		//상품 실결제 금액
+			$("#spanSumDeliveryFee").text(result.spanSumDeliveryFee.addComma());	//배송금액
+			
+			$("#spanOrdAmt").text(result.spanOrdAmt.addComma());					//주문 상품 금액
+			$("#spanCnclRtnAmt").text(result.spanCnclRtnAmt.addComma());			//취소 상품 금액
+			
+			$("#spanTotPntDcAmt").text(result.spanTotPntDcAmt.addComma());			//취소 사용 포인트
+			$("#spanPntDcAmt").text(result.spanPntDcAmt.addComma());				//고객 포인트
+			$("#spanPrePntDcAmt").text(result.spanPrePntDcAmt.addComma());			//상품 선포인트
+			
+			$("#spanCpnDcAmt").text(result.spanCpnDcAmt.addComma());				//취소 사용 쿠폰금액
+			$("#spanCpn1DcAmt").text(result.spanCpn1DcAmt.addComma());				//즉시할인쿠폰
+			$("#spanGoodsCpnDcAmt").text(result.spanGoodsCpnDcAmt.addComma());		//상품쿠폰
+			$("#spanCartCpnDcAmt").text(result.spanCartCpnDcAmt.addComma());		//장바구니쿠폰
+			
+			$("#spanTmtbDcAmt").text(result.spanTmtbDcAmt.addComma());				//취소 다다익선 금액
+			$("#spanTmtb1DcAmt").text(result.spanTmtb1DcAmt.addComma());			//수량할인
+			$("#spanTmtb2DcAmt").text(result.spanTmtb2DcAmt.addComma());			//금액할인
+			
+			$("#spanGfcdUseAmt").text(result.spanGfcdUseAmt.addComma());			//취소 고객 상품권 금액
+			
+			$("#spanRealCnclRtnAmt").text(result.spanRealCnclRtnAmt.addComma());	//취소 상품 실결제 금액
+			$("#spanTotDeliveryFee").text(result.spanTotDeliveryFee.addComma());	//취소 환불 배송 금액
+			
+			$("#spanTotRtnDelvFee").text(result.spanTotRtnDelvFee.addComma());		//반품 환불 배송 금액
+			$("#spanTotExcDelvFee").text(result.spanTotExcDelvFee.addComma());		//교환 환불 배송 금액
+			
+			if (result.spanRealCnclRtnAmt > 0) {
+				// 고객사유 : 환불금액계산 = (취소금액 + 배송비) - 추가배송비
+				if (isCustomer) {
+					result.spanRefundAmt = (result.spanRealCnclRtnAmt + result.sumDeliveryFee) - result.spanTotDeliveryFee;
+				} 
+				// 회사사유 : 환불금액계산 = (취소금액 + 배송비)
+				else {
+					result.spanRefundAmt = (result.spanRealCnclRtnAmt + result.sumDeliveryFee);
+				}
+			}
+			
+			$("#spanRefundAmt").text(result.spanRefundAmt.addComma());				//환불 금액 합계
+		}
+	);
+}
+
+//  사유
+var fnChangeChgReason = function(reasonCd){
+	var arrReasonCd = reasonCd.split(":");
+	var customerReasonArr = ['G686_10'];
+
+	isCustomer = false;
+	
+	// 취소, 반품, 교환 사유 판단
+	for (i=0 ; i<customerReasonArr.length ; i++) {
+		if (customerReasonArr[i] == arrReasonCd[0]) {
+			isCustomer = true;
+		}
+	}
+	
+	// 귀책사유설정 회사, 고객
+	if (isCustomer) {
+		$("#imputeReason").text("고객");
+	} else {
+		$("#imputeReason").text("회사");
+	}
+
+	$('#cancelRequestFrm input[name=chgReason]').val(arrReasonCd[0]);
+	$('#cancelRequestFrm input[name=chgReasonDesc]').val(arrReasonCd[1]);
+
+	fnCalculateRefundAmt();			//환불예정금액 계산.
+}
+
+// 취소신청/완료
+var fnCnclReq = function (reqGbn) {
+	
+	var temp 		= false;
+	var ordDtlStat	= cancelRequestTargetList[0].ordDtlStat; 
+	var allCanYn 	= "N";
+	
+	// 1. 취소수량 체크
+	for (i=0 ; i<cancelRequestTargetList.length ; i++) {		
+		if (cancelRequestTargetList[i].ordCanChgQty > 0) {
+			temp = true;
+		}
+	}
+	
+	if (temp == false) {
+		mcxDialog.alert('취소신청수량을 입력하세요.');
+		return;
+	}
+	
+	// 2. 입금대기건 & 전체취소 체크
+	if (ordDtlStat == "G013_10" && $("#spanPayAmt").text() != $("#spanRefundAmt").text()) {
+		alert("입금대기건은 전체 취소만 가능합니다.");
+		return;
+	}
+	
+	// 2.1 전체취소 여부 적용
+	if (ordDtlStat == "G013_10" && $("#spanPayAmt").text() == $("#spanRefundAmt").text()) {
+		allCanYn = "Y";	
+	}
+	
+	// 3. 취소사유 체크
+	var chgReason = $("#cancelRequestFrm select[name=selectChgReason]").val();
+	
+	if (gagajf.isNull(chgReason)) {
+		mcxDialog.alert("취소사유를 입력하세요."); 
+		return ;
+	}
+	
+	// 4. 환불계좌 체크
+	var accountNo 	= "";
+	var accountNm 	= "";
+	var bankCd 		= "";
+	
+	// 결제타입 무통장입금시 환불계좌 등록
+	if (payMeans == 'G014_20') {
+		var refundAccount = gridOptionsRefundAccountInfo.api.getSelectedRows();
+		
+		if (refundAccount.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		accountNo 	= refundAccount[0].accountNo;
+		accountNm 	= refundAccount[0].accountNm;
+		bankCd 		= refundAccount[0].bankCd;
+	}
+	
+	// 5. 추가정보설정
+	var chgerNm 	= orderInfoList[0].ordNm;
+	var chgerEmail 	= orderInfoList[0].ordEmail;
+	var chgerPhnno 	= orderInfoList[0].ordPhnno;
+	var chgerTelno 	= orderInfoList[0].ordTelno;
+	
+	var jsonObj = {
+		"ordNo"				: $('#cancelRequestFrm input[name=ordNo]').val()
+		,"chgReason" 		: $('#cancelRequestFrm input[name=chgReason]').val()
+		,"chgMemo"			: $('#chgMemo').val()
+		,"cancelReqList" 	: cancelRequestTargetList
+		,"accountNo" 		: accountNo
+		,"accountNm" 		: accountNm
+		,"bankCd" 			: bankCd
+		,"allCanYn" 		: allCanYn
+		,"isCustomer" 		: isCustomer
+		,"chgerNm"			: chgerNm
+		,"chgerEmail"		: chgerEmail
+		,"chgerZipcode"		: ""
+		,"chgerBaseAddr"	: ""
+		,"chgerDtlAddr"		: ""
+		,"chgerPhnno"		: chgerPhnno
+		,"chgerTelno"		: chgerTelno
+	}
+	
+	// 6. 취소신청, 취소완료 여부 체크
+	// 취소완료
+	if (reqGbn == "complete") {
+		cnclUrl = '/orderChange/cnclComplete/';
+	}
+	// 취소신청
+	else if (reqGbn == "req") {
+		cnclUrl = '/orderChange/cnclReq/';
+	}
+	// 취소신청 완료
+	else if (reqGbn == "reqComplete"){
+		cnclUrl = '/orderChange/cnclReqComplete/';
+	}
+
+	// 주문번호, 취소사유, 취소메모, (취소, 반품, 교환 신청 정보 목록), 환불계좌
+	var jsonData = JSON.stringify(jsonObj);
+	
+	mcxDialog.confirm('취소요청하시겠습니까?', {
+		cancelBtnText		: "취소",
+		sureBtnClick		: function(){
+			// 취소 실행
+			gagajf.ajaxJsonSubmit(
+				cnclUrl
+				, jsonData
+				, function() {
+					uifnPopupClose('popupOrderDetail');
+					fnReOpenOrderDetailPopup();
+					uifnPopupClose('popupCancelRequestForm');
+				}
+			);
+		}
+	});
+}
+
+// 환불계좌 등록
+var fnCreateOrderRfAccount = function () {	
+	var actionUrl = "/orderChange/refund/account/create/form?ordNo=" + ordNo ;
+	cfnOpenModalPopup(actionUrl, 'popupCreateRefundAccount');
+};
+
+// 환불계좌 정보
+var fnBindOrderRfAccountInfo = function () {
+	gagaAgGrid.fetch(
+		"/orderChange/refund/account/info/list?ordNo=" + ordNo
+		, gridOptionsRefundAccountInfo
+		, null
+		, function (result) {
+		}
+	)
+};
+
+$(document).ready(function() {
+	// 1. 그리드생성
+	gagaAgGrid.createGrid('gridOrderCancelRequestList'		, gridOptionsCancelReqList);			// 주문정보
+	gagaAgGrid.createGrid('gridOrderCancelRequestToBeList'	, gridOptionsCancelReqToBeList);		// 취소정보
+	gagaAgGrid.createGrid('gridDelvCdList'					, gridOptionsDelvCdList);				// 배송비정보
+	gagaAgGrid.createGrid('gridRefundAccountInfo'			, gridOptionsRefundAccountInfo);		// 환불계좌정보
+	
+	// 2. 그리드 데이타 싱크작업
+	gridOptionsCancelReqList.api.setRowData(cancelRequestTargetList);								// 주문정보
+	
+	// 2.1 TOTAL ROWS 없애기
+	gagaAgGrid.hideStatusBar('gridOrderCancelRequestList');
+	gagaAgGrid.hideStatusBar('gridOrderCancelRequestToBeList');
+	gagaAgGrid.hideStatusBar('gridDelvCdList');
+	gagaAgGrid.hideStatusBar('gridRefundAccountInfo');
+	
+	// 3. 환불정보계산
+	fnCalculateRefundAmt(null);
+	
+	// 4. 무통장입금아일때 환불계좌 그리드 숨김처리
+	if (payMeans !== 'G014_20') {
+		$('#wrapRefundAccount').addClass("off");
+		fnBindOrderRfAccountInfo();
+	}
+});
+</script>
+</html>
+
+
+
+
+

+ 139 - 0
src/main/webapp/WEB-INF/views/order/CnclReqViewForm.html

@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CancelRequestForm.html
+ * @desc    : 취소요청 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2019 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.12.12   jsh77b       최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1400" data-height="400">
+	<div class="panelStyle">
+		<div class="panelTitle">
+			<h2>취소요청정보</h2>
+			<button type="button" class="close" onclick="uifnPopupClose('popupCancelRequestForm');"><i class="fa fa-times"></i></button>
+		</div>
+			
+		<div class="panelContent" style="height:90%; overflow-y:auto; padding:0px 20px !important; ">
+			<form id="cancelRequestFrm" name="cancelRequestFrm" action="/orderChange/cancel" method="post" target="hdFrameForOrderCancel">
+				<input type="hidden" name="ordNo" th:value="${ordNo}"/>
+				<input type="hidden" name="ordChgSq" th:value="${ordChgSq}"/>
+				<input type="hidden" name="chgReason" value=""/>
+				<input type="hidden" name="chgReasonDesc" value=""/>
+
+				<h4>(취소/반품/교환) 요청 정보</h4>
+				<div id="gridOrderChangeList" style="width:100%; height: 180px; min-height:99px;" class="ag-theme-balham"></div>
+				
+				<div style="text-align:right; padding-bottom:5px; padding-top:5px;">
+					<button type="button" class="btn btn-success" onclick="fnCnclReq('cancel');">취소철회</button>
+					<button type="button" class="btn btn-success" onclick="fnCnclReq('confirm');">취소승인</button>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+
+<!-- data -->
+<script th:inline="javascript">
+/*<![CDATA[*/
+var ordNo 					= [[${ordNo}]];									// 주문번호
+var orderInfoList 			= [[${orderInfoList}]];							// 주문기본정보
+var payMeans 				= orderInfoList[0].payMeans;					// 결제수단
+var orderChangeList 		= [[${orderChangeList}]];						// 취소/반품/교환요청 정보
+var chgReason				= orderChangeList[0].chgReason;					// 변경사유코드
+var chgMemo					= orderChangeList[0].chgMemo;					// 변경사유메모
+
+var temp1 = true;
+var temp2 = false;
+
+// 6. 반품/교환 정보
+var columnDefsOrderChangeList = [
+	{
+		headerName		: "요청번호"		
+		, field			: "ordChgSq"		
+		, width			: 100	
+		, cellClass		: 'text-center'
+		, cellRenderer	: function(params) {
+			var rtnStr = "";
+			
+			// 취소요청, 교환요청, 반품요청 일때는 요청 정보 확인 팝업 정보
+			if (params.data.chgStat == 'G685_20' || params.data.chgStat == 'G685_30' || params.data.chgStat == 'G685_40') {
+				rtnStr = '<a href="javascript:void(0);" onclick="fnChgReqInfo(\'' + params.value + '\');">' + params.value + '</a>';
+			} else {
+				rtnStr = params.value;
+			}
+			
+			return  rtnStr;
+		}
+	},
+	{headerName: "요청구분"		, field: "chgGbNm"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "상품코드"		, field: "goodsCd"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "옵션1"			, field: "optCd1"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "옵션2"			, field: "optCd2"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "수량"			, field: "chgQty"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "요청상태"		, field: "chgStatNm"	, width: 100	, cellClass: 'text-center'},
+	{
+		headerName		: "요청일자"		
+		, field			: "regDt"		
+		, width			: 150		
+		, cellClass		: 'text-center'
+		, cellRenderer	: function(params) {
+			return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmm").format("YYYY-MM-DD HH:mm") : '';
+		}
+	},
+	{headerName: "변경사유"		, field: "chgReasonNm"	, width: 100	, cellClass: 'text-center'},
+	{headerName: "요청메모"		, field: "chgMemo"		, width: 150	, cellClass: 'text-center'},
+	{headerName: "변경자명"		, field: "chgerNm"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "변경자핸드폰"		, field: "chgerPhnno"	, width: 120	, cellClass: 'text-center'},
+	{
+		headerName		: "우편번호"		
+		, field			: "chgerZipcode"
+		, width			: 220
+		, cellClass		: 'text-center'
+	},
+	{headerName: "주소(기본)"		, field: "chgerBaseAddr"	, width: 220, cellClass: 'text-left'},
+	{headerName: "주소(상세)"		, field: "chgerDtlAddr"	, width: 150	, cellClass: 'text-center'},
+	{
+		headerName		: "택배사전송"
+		, field			: "wdInvoiceSendYn"
+		, width			: 120
+		, cellClass		: 'text-center'
+		, cellRenderer	: function (params) {
+			return (params.value == 'N') ? '미전송' : '전송';
+		}
+	},
+	{
+		headerName		: "회수지시전송"
+		, field			: "wdInvoiceSendYn"
+		, width			: 120
+		, cellClass		: 'text-center'
+	},
+	{headerName: "회수송장번호", field: "wdInvoiceNo", width: 90, cellClass: 'text-center'}
+];
+var gridOptionsOrderChangeList = gagaAgGrid.getGridOptions(columnDefsOrderChangeList);
+</script>
+
+<script>
+$(document).ready(function() {
+	// 1. 그리드생성
+	gagaAgGrid.createGrid('gridOrderChangeList'				, gridOptionsOrderChangeList);			// 취소/반품/교환 요청 정보
+	
+	// 2. 그리드 데이타 싱크작업
+	gridOptionsOrderChangeList.api.setRowData(orderChangeList);										// 취소/반품/교환요청 정보
+	
+	// 2.1 TOTAL ROWS 없애기
+	gagaAgGrid.hideStatusBar('gridOrderChangeList');
+});
+</script>
+</html>
+
+
+
+
+

+ 2 - 2
src/main/webapp/WEB-INF/views/order/ExchangeRequestForm.html

@@ -288,7 +288,7 @@ var columnExchangeReqList = [
 			{headerName: "재고수량"	, field: "currStockQty"			, width: 100			, cellClass: 'text-center', hide: temp2},
 			{
 				headerName		: "교환신청수량"
-				, field			: "ordCanChgQty"
+				, field			: "chgQty"
 				, width			: 100
 				, cellClass		: 'text-center'
 				, cellRenderer	: function (params) {
@@ -298,7 +298,7 @@ var columnExchangeReqList = [
 					var ordCanChgQty 	= ordQty - (cnclRtnQty +  ordReqChgQty);
 					
 					var strVal 			= "";
-					strVal += '<select class="ordCanChgQty ' + params.data.ordDtlNo + '" name="ordCanChgQty" ordDtlNo="'+params.data.ordDtlNo+'" onchange="fnChangeQty(this)">';
+					strVal += '<select class="ordCanChgQty ' + params.data.ordDtlNo + '" name="chgQty" ordDtlNo="'+params.data.ordDtlNo+'" onchange="fnChangeQty(this)">';
 					
 					for (i=0 ; i<=ordCanChgQty ; i++) {
 						if (i == params.data.ordCanChgQty) {

+ 10 - 10
src/main/webapp/WEB-INF/views/order/OrderDetailForm.html

@@ -507,7 +507,7 @@ var columnDefsDeliveryInfo = [
 	{headerName: "전화번호"		, field: "recipTelno"		, width: 120, cellClass: 'text-left', editable: true},
 	{
 		headerName		: "우편번호"		
-		, field			: "recipZipNo"
+		, field			: "recipZipcode"
 		, width			: 220
 		, cellClass		: 'text-center'
 		, cellRenderer	: function (params) {
@@ -615,8 +615,7 @@ var columnDefsOrderChangeInfo = [
 			
 			// 취소요청, 교환요청, 반품요청 일때는 요청 정보 확인 팝업 정보
 			if (params.data.chgStat == 'G685_20' || params.data.chgStat == 'G685_30' || params.data.chgStat == 'G685_40') {
-				rtnStr = "<a href='javascript:void(0);' onclick='fnChgReqInfo(" + params.value + ");>" + params.value + "</a>";
-				//rtnStr = '<a href="javascript:void(0);" onclick="fnChgReqInfo(\'' + params.value + '\');">' + params.value + '</a>';
+				rtnStr = '<a href="javascript:void(0);" onclick="fnChgReqInfo(\'' + params.value + '\');">' + params.value + '</a>';
 			} else {
 				rtnStr = params.value;
 			}
@@ -645,7 +644,7 @@ var columnDefsOrderChangeInfo = [
 	{headerName: "변경자핸드폰"		, field: "chgerPhnno"	, width: 120	, cellClass: 'text-center', editable: true},
 	{
 		headerName		: "우편번호"		
-		, field			: "chgerZipNo"
+		, field			: "chgerZipcode"
 		, width			: 220
 		, cellClass		: 'text-center'
 		, cellRenderer	: function (params) {
@@ -996,13 +995,13 @@ var fnUpdateOrderAddr = function (rowIdx) {
 
 // 취소요청
 var fnCancelRequest = function () {
-	var actionUrl = "/orderChange/cancel/request/form?ordNo=" + ordNo;
+	var actionUrl = "/orderChange/cncl/req/form?ordNo=" + ordNo;
 	cfnOpenModalPopup(actionUrl, 'popupCancelRequestForm');
 };
 
 // 반품요청
 var fnReturnRequest = function () {
-	var actionUrl = "/orderChange/return/request/form?ordNo=" + ordNo;
+	var actionUrl = "/orderChange/rtn/req/form?ordNo=" + ordNo;
 	cfnOpenModalPopup(actionUrl, 'popupReturnRequestForm');
 };
 
@@ -1012,9 +1011,10 @@ var fnExchangeRequest = function () {
 	cfnOpenModalPopup(actionUrl, 'popupExchangeRequestForm');
 };
 
+// 2021.01.25 추가
 // 취소요청, 교환요청, 반품요청 일때는 요청 정보 확인 팝업 정보
-var fnChgReqInfo = function () {
-	var actionUrl = "/orderChange/cancel/request/form?ordNo=" + ordNo;
+var fnChgReqInfo = function (ordChgSq) {
+	var actionUrl = "/orderChange/cncl/req/view/form?ordNo=" + ordNo + "&ordChgSq=" + ordChgSq;
 	cfnOpenModalPopup(actionUrl, 'popupCancelRequestForm');
 };
 
@@ -1393,14 +1393,14 @@ var fnOpenDaumAddr = function(idx, addrGb) {
 			// 배송지주소 수정
 			if ("ADDR" == addrGb) {
 				gridOptionsDeliveryInfo.api.gre
-				gridOptionsDeliveryInfo.api.getRowNode(idx).data.recipZipNo 		= data.zonecode;
+				gridOptionsDeliveryInfo.api.getRowNode(idx).data.recipZipcode 		= data.zonecode;
 				gridOptionsDeliveryInfo.api.getRowNode(idx).data.recipBaseAddr 		= cfnGetDaumRoadAddr(data);
 				gridOptionsDeliveryInfo.api.getRowNode(idx).data.recipDtlAddr 		= "";
 				gridOptionsDeliveryInfo.api.refreshCells();
 			}
 			// 회수지주소 수정
 			else {
-				gridOptionsOrderChangeInfo.api.getRowNode(idx).data.chgerZipNo 		= data.zonecode;
+				gridOptionsOrderChangeInfo.api.getRowNode(idx).data.chgerZipcode	= data.zonecode;
 				gridOptionsOrderChangeInfo.api.getRowNode(idx).data.chgerBaseAddr 	= cfnGetDaumRoadAddr(data);
 				gridOptionsOrderChangeInfo.api.getRowNode(idx).data.chgerDtlAddr 	= "";
 				gridOptionsOrderChangeInfo.api.refreshCells();

+ 2 - 2
src/main/webapp/WEB-INF/views/order/OrderDetailFormBack20210122.html

@@ -976,13 +976,13 @@ var fnUpdateOrderAddr = function (rowIdx) {
 
 // 취소요청
 var fnCancelRequest = function () {
-	var actionUrl = "/orderChange/cancel/request/form?ordNo=" + ordNo;
+	var actionUrl = "/orderChange/cncl/req/form?ordNo=" + ordNo;
 	cfnOpenModalPopup(actionUrl, 'popupCancelRequestForm');
 };
 
 // 반품요청
 var fnReturnRequest = function () {
-	var actionUrl = "/orderChange/return/request/form?ordNo=" + ordNo;
+	var actionUrl = "/orderChange/rtn/req/form?ordNo=" + ordNo;
 	cfnOpenModalPopup(actionUrl, 'popupReturnRequestForm');
 };
 

+ 6 - 6
src/main/webapp/WEB-INF/views/order/ReturnRequestForm.html

@@ -141,7 +141,7 @@
 						<tr>
 							<th>회수지주소 <i class="star"></i></th>
 							<td colspan="3">
-								<input type="text" name ="chgerZipNo" class="w100" readonly="readonly"/>
+								<input type="text" name ="chgerZipcode" class="w100" readonly="readonly"/>
 								<button type="button" class="btn btn-info" onclick="fnOpenDaumAddr('delvLoc');">우편번호찾기</button>
 								<input type="text" name ="chgerBaseAddr" class="w300"/>
 								<input type="text" name ="chgerDtlAddr" class="w300"/>
@@ -998,7 +998,7 @@ var fnCancelRequestPartOk = function () {
 	
 	// 5. 회수지정보설정
 	var chgerNm			= $("#cancelRequestFrm input[name=chgerNm]").val();
-	var chgerZipNo		= $("#cancelRequestFrm input[name=chgerZipNo]").val();
+	var chgerZipcode	= $("#cancelRequestFrm input[name=chgerZipcode]").val();
 	var chgerBaseAddr	= $("#cancelRequestFrm input[name=chgerBaseAddr]").val();
 	var chgerDtlAddr	= $("#cancelRequestFrm input[name=chgerDtlAddr]").val();
 	
@@ -1010,7 +1010,7 @@ var fnCancelRequestPartOk = function () {
 	var chgerTelno2		= $("#cancelRequestFrm input[name=chgerTelno2]").val();
 	var chgerTelno3		= $("#cancelRequestFrm input[name=chgerTelno3]").val();
 
-	if (gagajf.isNull(chgerZipNo)) {
+	if (gagajf.isNull(chgerZipcode)) {
 		mcxDialog.alert("회수지주소를 입력하세요."); return;
 	}
 	if (gagajf.isNull(chgerBaseAddr)) {
@@ -1046,7 +1046,7 @@ var fnCancelRequestPartOk = function () {
 		,"isCustomer"		: isCustomer
 		,"chgerNm"			: chgerNm
 		,"chgerEmail"		: chgerEmail
-		,"chgerZipNo"		: chgerZipNo
+		,"chgerZipcode"		: chgerZipcode
 		,"chgerBaseAddr"	: chgerBaseAddr
 		,"chgerDtlAddr"		: chgerDtlAddr
 		,"chgerPhnno"		: chgerPhnno
@@ -1095,7 +1095,7 @@ var fnOpenDaumAddr = function() {
 	let daumZip = new daum.Postcode({
 		oncomplete: function(data) {			
 			// 우편번호와 주소 정보를 해당 필드에 넣는다.
-			$('#cancelRequestFrm input[name=chgerZipNo]').val(data.zonecode);
+			$('#cancelRequestFrm input[name=chgerZipcode]').val(data.zonecode);
 			$('#cancelRequestFrm input[name=chgerBaseAddr]').val(cfnGetDaumRoadAddr(data));
 			$('#cancelRequestFrm input[name=chgerDtlAddr]').focus();
 			
@@ -1114,7 +1114,7 @@ var fnSetChger = function(){
 	var spRecipTelno = (data.recipTelno != null) ? data.recipTelno.split('-') : null;
 	
 	$("#cancelRequestFrm input[name=chgerNm]").val(data.recipNm);
-	$("#cancelRequestFrm input[name=chgerZipNo]").val(data.recipZipNo);
+	$("#cancelRequestFrm input[name=chgerZipcode]").val(data.recipZipcode);
 	$("#cancelRequestFrm input[name=chgerBaseAddr]").val(data.recipBaseAddr);
 	$("#cancelRequestFrm input[name=chgerDtlAddr]").val(data.recipDtlAddr);