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

이태영 - 20210126 시리얼쿠폰, 랜덤쿠폰 완료 / 사은품프로모션 행사기간 시간분까지 지정, 페이징처리 완료

xodud1202 5 лет назад
Родитель
Сommit
0978ce2822

+ 9 - 1
src/main/java/com/style24/admin/biz/dao/TsaCouponDao.java

@@ -194,13 +194,21 @@ public interface TsaCouponDao {
 	void createRandomCouponInfo(Coupon param);
 
 	/**
-	 * 동일 쿠폰명이 존재하는지 확인
+	 * 동일 쿠폰명이 같은 기간에 존재하는지 확인
 	 * @param param
 	 * @author xodud1202
 	 * @since 2021. 01. 26
 	 */
 	int getSerialOverlapCheck(Coupon param);
 
+	/**
+	 * 동일 쿠폰명이 존재하는지 확인
+	 * @param param
+	 * @author xodud1202
+	 * @since 2021. 01. 27
+	 */
+	int getRandomCouponNmCnt(String param);
+
 	/**
 	 * 동일 쿠폰명이 존재하는지 확인
 	 * @param param

+ 18 - 0
src/main/java/com/style24/admin/biz/dao/TsaFreegiftPromotionDao.java

@@ -26,6 +26,24 @@ public interface TsaFreegiftPromotionDao {
 	 */
 	Collection<FreeGoodsPromotion> getFreeGoodsPromotionList(FreeGoodsPromotion param);
 
+	/**
+	 * 사은품 프로모션 리스트 COUNT
+	 * @param param
+	 * @return
+	 * @author xodud1202
+	 * @since 2020. 12. 27
+	 */
+	int getFreeGoodsPromotionListCount(FreeGoodsPromotion param);
+
+	/**
+	 * 사은품 프로모션 디테일
+	 * @param param
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 01. 28
+	 */
+	FreeGoodsPromotion getFreeGoodsPromotionInfo(FreeGoodsPromotion param);
+
 	/**
 	 * 사은품 프로모션 등록 제휴몰 리스트 조회
 	 * @param param

+ 44 - 19
src/main/java/com/style24/admin/biz/service/TsaCouponService.java

@@ -1,25 +1,19 @@
 package com.style24.admin.biz.service;
 
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
+import com.style24.admin.biz.dao.TsaCouponDao;
+import com.style24.admin.support.env.TsaConstants;
+import com.style24.admin.support.security.session.TsaSession;
 import com.style24.persistence.domain.*;
-import org.apache.commons.lang3.StringUtils;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.style24.admin.biz.dao.TsaCouponDao;
-import com.style24.admin.support.security.session.TsaSession;
-
-import lombok.extern.slf4j.Slf4j;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Random;
 
 /**
  * 쿠폰 Service
@@ -45,7 +39,7 @@ public class TsaCouponService {
 	 */
 	@Transactional("shopTxnManager")
 	public String saveCoupon(Coupon params){
-		int cpnId = 0;		// 쿠폰ID
+		int cpnId = params.getCpnId();		// 쿠폰ID (신규생성인지 수정인지 구분하기 위해 params의 cpnId를 먼저 가져옴 > 쿠폰 생성시 cpnId를 저장하기때문임)
 		params.setRegNo(TsaSession.getInfo().getUserNo());
 		params.setUpdNo(TsaSession.getInfo().getUserNo());
 
@@ -153,7 +147,7 @@ public class TsaCouponService {
 		}
 
 		// 수정모드이고 변경된 쿠폰상태가 대기 , 중지 인경우 고객이 발급받은 내용도 변경
-		if(params.getCpnId() != 0 &&
+		if(cpnId != 0 &&
 				(params.getCpnStat().equals("G232_10") || params.getCpnStat().equals("G232_12")) ) {
 
 			CustCoupon custCoupon = new CustCoupon();
@@ -171,10 +165,8 @@ public class TsaCouponService {
 			}
 		}
 
-		log.info("CHECK GUBUN >> " + params.getCpnType() + " / " + params.getDcCdGb() + " / " + params.getTotPubLimitQty());
-
-		// 시리얼 쿠폰 생성
-		if("G230_20".equals(params.getCpnType()) && "G233_10".equals(params.getDcCdGb())) {
+		// 시리얼 쿠폰 생성(최초 쿠폰 생성일 경우에만)
+		if(cpnId == 0 && params.getCpnType().equals(TsaConstants.CpnType.PAY_CPN.value()) && params.getDcCdGb().equals(TsaConstants.DcCdGb.SERIAL.value())) {
 			// 시리얼 쿠폰명이 동일한 쿠폰이 일정 겹치는 부분이 있는지 확인
 			int overlapCheck = couponDao.getSerialOverlapCheck(params);
 			if(overlapCheck < 1) {
@@ -184,6 +176,39 @@ public class TsaCouponService {
 			} else {
 				throw new IllegalStateException("같은 시리얼명이 사용되는 쿠폰이 중복됩니다. 기간을 확인해주세요.");
 			}
+		} else if(cpnId == 0 && params.getCpnType().equals(TsaConstants.CpnType.PAY_CPN.value()) && params.getDcCdGb().equals(TsaConstants.DcCdGb.RANDOM.value())) {
+			Random random = new Random();
+			String prefixRandomCpn = "" + params.getCpnId();		// 랜덤 번호는 쿠폰번호 + 랜덤문자 = 12로 처리함
+			// 랜덤 문자 발급 수 만큼 진행
+			for(int j = 0 ; j < params.getTotPubLimitQty() ; j++) {
+				boolean chk = true;
+				while (chk) {
+					// 대문자+소문자+숫자 조합 10자리 인증번호 생성
+					StringBuilder sb = new StringBuilder();
+					// 쿠폰번호 + 랜덤글자 = 12 글자만큼 생성
+					for (int i = 0; i < 12 - prefixRandomCpn.length(); i++) {
+						int index = random.nextInt(2);
+						switch (index) {
+							case 0:
+								sb.append((char) (random.nextInt(26) + 65));
+								break;
+							case 1:
+								sb.append(random.nextInt(10));
+								break;
+						}
+					}
+
+					// 인증번호 중복 체크
+					int cnt = couponDao.getRandomCouponNmCnt(sb.toString());
+
+					if (cnt == 0) {
+						// 인증번호 설정
+						params.setRdCpnNm(sb.substring(0, 4) + params.getCpnId() + sb.substring(4));
+						couponDao.createRandomCouponInfo(params);
+						chk = false;
+					}
+				}
+			}
 		}
 
 		return "SUCCESS";

+ 26 - 4
src/main/java/com/style24/admin/biz/service/TsaFreegiftPromotionService.java

@@ -38,6 +38,28 @@ public class TsaFreegiftPromotionService {
 		return freegiftPromotionDao.getFreeGoodsPromotionList(param);
 	}
 
+	/**
+	 * 사은품 프로모션 디테일
+	 * @param param
+	 * @return Collection<FreeGoodsPromotion>
+	 * @author xodud1202
+	 * @since 2021. 01. 28
+	 */
+	public FreeGoodsPromotion getFreeGoodsPromotionInfo(FreeGoodsPromotion param) {
+		return freegiftPromotionDao.getFreeGoodsPromotionInfo(param);
+	}
+
+	/**
+	 * 사은품 프로모션 카운트
+	 * @param param
+	 * @return Collection<FreeGoodsPromotion>
+	 * @author xodud1202
+	 * @since 2020. 12. 17
+	 */
+	public int getFreeGoodsPromotionListCount(FreeGoodsPromotion param) {
+		return freegiftPromotionDao.getFreeGoodsPromotionListCount(param);
+	}
+
 	/**
 	 * 사은품 프로모션 디테일 조회
 	 * @param param
@@ -49,12 +71,12 @@ public class TsaFreegiftPromotionService {
 		GagaMap result = new GagaMap();
 
 		// 사은품 프로모션 마스터 정보 조회
-		List<FreeGoodsPromotion> freeGoodsList = (ArrayList<FreeGoodsPromotion>) getFreeGoodsPromotionList(param);
-		// 상세 조회 내역이 없거나, 1개가 아닐 경우
-		if(freeGoodsList == null || freeGoodsList.size() != 1 ) {
+		FreeGoodsPromotion freegift = getFreeGoodsPromotionInfo(param);
+		// 상세 조회 내역이 없경우
+		if(freegift == null || freegift.getFreegiftSq() == 0 ) {
 			return null;
 		}
-		FreeGoodsPromotion freegift = freeGoodsList.get(0);							// 사은품 프로모션 마스터 정보
+
 		freegift.setExtmallList(getFreegiftExtmallList(param));						// 사은품 프로모션 제휴몰 정보
 		freegift.setBrandList(freegiftPromotionDao.getFreegiftBrandList(param));			// 사은품 프로모션 브랜드 정보
 		freegift.setSupplyCompList(freegiftPromotionDao.getFreegiftSupplyCompList(param));	// 사은품 프로모션 공급업체 정보

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

@@ -176,14 +176,12 @@ public class TsaMarketingController extends TsaBaseController {
 	public GagaMap getFreeGoodsPromotionList(@RequestBody FreeGoodsPromotion param) {
 		GagaMap result = new GagaMap();
 
-		List<FreeGoodsPromotion> freeGoodsList = (ArrayList<FreeGoodsPromotion>)freegiftService.getFreeGoodsPromotionList(param);
-
 		param.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
 		param.setPageable(new TscPageRequest(param.getPageNo() - 1, param.getPageSize()));
-		param.getPageable().setTotalCount(freeGoodsList.size());
+		param.getPageable().setTotalCount(freegiftService.getFreeGoodsPromotionListCount(param));
 
 		result.set("pageing", param);
-		result.set("freeGoodsList", freeGoodsList);
+		result.set("freeGoodsList", freegiftService.getFreeGoodsPromotionList(param));
 
 		return result;
 	}
@@ -200,10 +198,37 @@ public class TsaMarketingController extends TsaBaseController {
 	public ModelAndView freeGoodsRegiForm(FreeGoodsPromotion param) {
 		ModelAndView mav = new ModelAndView();
 
-		// 상품상태
-		String[] exceptCds = {"G008_00"};
-		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
+		String num = "";
+		CommonCode temp = new CommonCode();
+
+		// 행사기간 시 리스트 세팅
+		Collection<CommonCode> hhList = new ArrayList<CommonCode>();
+		for (int i = 0; i < 24; i++) {
+			num = "";
+			temp = new CommonCode();
+			if (i < 10) {	num = "0" + i;				}
+			else {			num = String.valueOf(i);	}
+
+			temp.setCd(num);	temp.setCdNm(num + "시");
+			hhList.add(temp);
+		}
+
+		// 행사기간 분 리스트 세팅
+		Collection<CommonCode> mmList = new ArrayList<CommonCode>();
+		for (int i = 0; i < 60; i++) {
+			num = "";
+			temp = new CommonCode();
+			if (i < 10) {	num = "0" + i;				}
+			else {			num = String.valueOf(i);	}
 
+			temp.setCd(num);	temp.setCdNm(num + "분");
+			mmList.add(temp);
+		}
+
+		mav.addObject("hhList", hhList);	// 행사기간 시 리스트 세팅
+		mav.addObject("mmList", mmList);	// 행사기간 분 리스트 세팅
+		String[] exceptCds = {"G008_00"};		// 상품상태
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
 		mav.addObject("param", param);
 
 		mav.setViewName("marketing/FreeGoodsPromotionRegiForm");
@@ -213,7 +238,7 @@ public class TsaMarketingController extends TsaBaseController {
 	/**
 	 * 사은품 프로모션 목록 조회
 	 * @author xodud1202
-	 * @since 2020. 12. 16
+	 * @since 2021. 01. 28
 	 */
 	@PostMapping("/freeGoodsPromotion/detail")
 	@ResponseBody
@@ -338,10 +363,6 @@ public class TsaMarketingController extends TsaBaseController {
 				num = String.valueOf(i);
 			}
 
-			// 상품상태
-			String[] exceptCds = {"G008_00"};
-			mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
-
 			temp.setCd(num);
 			temp.setCdNm(num + "시");
 
@@ -366,6 +387,9 @@ public class TsaMarketingController extends TsaBaseController {
 		mav.addObject("mmList", mmList);
 		// 시간 시 리스트 세팅
 		mav.addObject("hhList", hhList);
+		// 상품상태
+		String[] exceptCds = {"G008_00"};
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
 		// 입점업체 조회
 		mav.addObject("ibSupplyCompList", rendererService.getSupplyCompanyList("", "N"));
 		// 할인 쿠폰 코드 조회

+ 32 - 1
src/main/java/com/style24/admin/support/env/TsaConstants.java

@@ -40,5 +40,36 @@ public class TsaConstants {
 		public String value() {
 			return value;
 		}
-	}	
+	}
+
+	// 쿠폰유형
+	public enum CpnType {
+		CATE_CPN("G230_13"),			// 장바구니쿠폰
+		PAY_CPN("G230_20");			// 주문서쿠폰
+
+		private String value;
+
+		private CpnType(String value) {
+			this.value = value;
+		}
+
+		public String value() {
+			return value;
+		}
+	}
+
+	// 할인 코드 유형
+	public enum DcCdGb {
+		NARMAL("G233_00"),			// 일반 쿠폰 유형
+		SERIAL("G233_10"),			// 시리얼 쿠폰 유형
+		RANDOM("G233_20");			// 랜덤 쿠폰 유형
+
+		private String value;
+
+		private DcCdGb(String value) {	this.value = value;	}
+
+		public String value() {
+			return value;
+		}
+	}
 }

+ 48 - 48
src/main/java/com/style24/persistence/domain/Coupon.java

@@ -17,58 +17,58 @@ import java.util.Collection;
 @Data
 public class Coupon extends TscBaseDomain {
     // TB_COUPON
-    private int     cpnId;					// 쿠폰ID
-    private String  cpnNm;					// 쿠폰명
-    private String  siteCd;					// 사이트코드(공통코드G000)
-    private String  afLinkCd;				// 제휴링크코드
-    private String  usableCustGb;			// 사용가능고객구분(공통코드G100)
-    private String  usableCustGrade;		// 사용가능고객등급(공통코드G110)
-    private String  cpnType;				// 쿠폰유형(공통코드G230)
-    private String  applyScope;				// 적용범위(A:전체, I:개별). "I:개별"이고 쿠폰유형이 "20:장바구니쿠폰" 외 이면 TB_COUPON_REFVAL 참조
-    private String  dcWay;					// 할인방식(공통코드G240)
-    private Integer dcPval;					// 할인값(PC). 할인방식이 금액이면 할인금액, 율이면 할인율
-    private Integer dcMval;					// 할인값(모바일). 할인방식이 금액이면 할인금액, 율이면 할인율
-    private Integer dcAval;					// 할인값(모바일앱)
-    private Integer maxDcAmt;				// 최고할인금액
-    private String  pdGb;					// 기간/일수구분(P:기간, D:일수)
-    private String  availStdt;				// 유효시작일시(기간/일수구분 "P:기간"일 때 사용됨)
-    private String  availEddt;				// 유효종료일시(기간/일수구분 "P:기간"일 때 사용됨)
-    private Integer availDays;				// 유효일수(기간/일수구분 "D:일수"일 때 사용됨)
-    private Integer custPubLimitQty;		// 고객당발행제한수량(0은 무제한)
-    private Integer totPubLimitQty;			// 총발행제한수량(0은 무제한)
-    private Integer onePubQty;				// 1회발행수량(기본은 1)
-    private String  dnGb;					// 다운로드구분(공통코드G058)
-    private String  downStdt;				// 다운로드시작일시
-    private String  downEddt;				// 다운로드종료일시
-    private Integer buyLimitAmt;			// 구매제한금액(0은 제한없음. 그 외는 00 이상 구매 시 사용)
-    private Integer planSq;					// 기획전번호(쿠폰유형이 플러스쿠폰 일 때 사용 기획전번호)
-    private String  reissuance;				// 쿠폰재발급여부(공통코드G231)
-    private String  cpnStat;				// 쿠폰상태(공통코드G232)
-    private String  endAlimYn;				// 만료알림여부
-    private String  firstYn;				// 첫구매여부 (Y:구매이력이없음 | N:구매이력있음)
-    private String  downYn;					// 다운로드가능여부(마이페이지, 상품상세) --> EP쿠폰, 난수쿠폰
-    private String  custJoinStdt;			// 회원가입일자(FROM) 20200101 (신규회원여부의 판단을 가입일자로 설정함)
-    private String  custJoinEddt;			// 회원가입일자(FROM) 20200101 (신규회원여부의 판단을 가입일자로 설정함)
-    private String  buyStdt;				// 회원가입일자(FROM) 20200101 (구매기간일자(FROM) (해당기간에 구매이력이 없으면 다운로드 가능))
-    private String  buyEddt;				// 구매기간일자(TO)
-    private Integer issueCnt;				// 쿠폰발급개수
-    private Integer useCnt;					// 쿠폰사용개수
-    private String  payType;                // 결제수단
-    private String  custJoinYn;             // 신규회원여부
-    private String  afChannel;              // 제휴링크
-    private String  dcCdGb;                 // 할인코드유형 (공통코드G233)
-    private String  rdCpnNm;                // 랜덤쿠폰 사용키 (시리얼명 or 난수)
+    private int    cpnId;					// 쿠폰ID
+    private String cpnNm;					// 쿠폰명
+    private String siteCd;					// 사이트코드(공통코드G000)
+    private String afLinkCd;				// 제휴링크코드
+    private String usableCustGb;			// 사용가능고객구분(공통코드G100)
+    private String usableCustGrade;		    // 사용가능고객등급(공통코드G110)
+    private String cpnType;				    // 쿠폰유형(공통코드G230)
+    private String applyScope;				// 적용범위(A:전체, I:개별). "I:개별"이고 쿠폰유형이 "20:장바구니쿠폰" 외 이면 TB_COUPON_REFVAL 참조
+    private String dcWay;					// 할인방식(공통코드G240)
+    private int    dcPval;					// 할인값(PC). 할인방식이 금액이면 할인금액, 율이면 할인율
+    private int    dcMval;					// 할인값(모바일). 할인방식이 금액이면 할인금액, 율이면 할인율
+    private int    dcAval;					// 할인값(모바일앱)
+    private int    maxDcAmt;				// 최고할인금액
+    private String pdGb;					// 기간/일수구분(P:기간, D:일수)
+    private String availStdt;				// 유효시작일시(기간/일수구분 "P:기간"일 때 사용됨)
+    private String availEddt;				// 유효종료일시(기간/일수구분 "P:기간"일 때 사용됨)
+    private int    availDays;				// 유효일수(기간/일수구분 "D:일수"일 때 사용됨)
+    private int    custPubLimitQty;		    // 고객당발행제한수량(0은 무제한)
+    private int    totPubLimitQty;			// 총발행제한수량(0은 무제한)
+    private int    onePubQty;				// 1회발행수량(기본은 1)
+    private String dnGb;					// 다운로드구분(공통코드G058)
+    private String downStdt;				// 다운로드시작일시
+    private String downEddt;			    // 다운로드종료일시
+    private int    buyLimitAmt;			    // 구매제한금액(0은 제한없음. 그 외는 00 이상 구매 시 사용)
+    private int    planSq;					// 기획전번호(쿠폰유형이 플러스쿠폰 일 때 사용 기획전번호)
+    private String reissuance;				// 쿠폰재발급여부(공통코드G231)
+    private String cpnStat;				    // 쿠폰상태(공통코드G232)
+    private String endAlimYn;				// 만료알림여부
+    private String firstYn;				    // 첫구매여부 (Y:구매이력이없음 | N:구매이력있음)
+    private String downYn;					// 다운로드가능여부(마이페이지, 상품상세) --> EP쿠폰, 난수쿠폰
+    private String custJoinStdt;			// 회원가입일자(FROM) 20200101 (신규회원여부의 판단을 가입일자로 설정함)
+    private String custJoinEddt;			// 회원가입일자(FROM) 20200101 (신규회원여부의 판단을 가입일자로 설정함)
+    private String buyStdt;				    // 회원가입일자(FROM) 20200101 (구매기간일자(FROM) (해당기간에 구매이력이 없으면 다운로드 가능))
+    private String buyEddt;				    // 구매기간일자(TO)
+    private int    issueCnt;				// 쿠폰발급개수
+    private int    useCnt;					// 쿠폰사용개수
+    private String payType;                 // 결제수단
+    private String custJoinYn;              // 신규회원여부
+    private String afChannel;               // 제휴링크
+    private String dcCdGb;                  // 할인코드유형 (공통코드G233)
+    private String rdCpnNm;                 // 랜덤쿠폰 사용키 (시리얼명 or 난수)
 
     // 그리드 파라미터
-    private String  supplyCompList;         // 공급업체 리스트
-    private String  brandList;              // 브랜드 리스트
-    private String  applyGoodsList;         // 적용상품 리스트
-    private String  exceptGoodsList;        // 제외상품 리스트
-    private String  cateList;               // 카테고리 리스트
-    private String  burdenList;             // 업체 분담율 리스트
+    private String supplyCompList;          // 공급업체 리스트
+    private String brandList;               // 브랜드 리스트
+    private String applyGoodsList;          // 적용상품 리스트
+    private String exceptGoodsList;         // 제외상품 리스트
+    private String cateList;                // 카테고리 리스트
+    private String burdenList;              // 업체 분담율 리스트
 
     // TB_COUPON_BAN_GOODS
-    private Integer  cpnBanGoodsSq;         //  제외상품시퀀스
+    private int    cpnBanGoodsSq;           //  제외상품시퀀스
 
     // Pagination
     private TscPageRequest pageable;

+ 10 - 25
src/main/java/com/style24/persistence/mybatis/shop/TsaCoupon.xml

@@ -618,7 +618,7 @@
 
 	<!-- 특정 쿠폰 발급받은 회원 조회-->
 	<select id="getSerialOverlapCheck" parameterType="Coupon" resultType="int">
-		/* TsaCoupon.getSerialOverlapCheck : 중복 시리얼넘버 체크 */
+		/* TsaCoupon.getSerialOverlapCheck : 기간 내 중복 시리얼넘버 체크 */
 		WITH CHECK_DATA AS (
 		    SELECT C.CPN_ID
 				 , C.DOWN_STDT
@@ -646,30 +646,15 @@
 				WHERE 1=1
 				AND C.DOWN_EDDT >= STR_TO_DATE(#{downStdt}, '%Y-%m-%d %H:%i:%s')
 				AND C.DOWN_EDDT <![CDATA[ <= ]]> STR_TO_DATE(#{downEddt}, '%Y-%m-%d %H:%i:%s')
-				UNION
-				SELECT COUNT(1) AS CNT		<!-- 유효 시작일이 겹치는 쿠폰번호 찾기 -->
-				FROM CHECK_DATA C
-				WHERE 1=1
-				AND C.AVAIL_STDT >= STR_TO_DATE(#{downStdt}, '%Y-%m-%d %H:%i:%s')
-				AND C.AVAIL_STDT <![CDATA[ <= ]]> STR_TO_DATE(#{downEddt}, '%Y-%m-%d %H:%i:%s')
-				UNION
-				SELECT COUNT(1) AS CNT		<!-- 유효 종료일이 겹치는 쿠폰번호 찾기 -->
-				FROM CHECK_DATA C
-				WHERE 1=1
-				AND C.AVAIL_EDDT >= STR_TO_DATE(#{downStdt}, '%Y-%m-%d %H:%i:%s')
-				AND C.AVAIL_EDDT <![CDATA[ <= ]]> STR_TO_DATE(#{downEddt}, '%Y-%m-%d %H:%i:%s')
-				UNION
-				SELECT COUNT(1) AS CNT		<!-- 쿠폰 사용 기한이 일수일경우 다운시작일 + 일수가 사용가능일. 해당 기준으로 겹치는 쿠폰번호 찾기 -->
-				FROM CHECK_DATA C
-				WHERE 1=1
-				AND DATE_ADD(C.DOWN_STDT, INTERVAL C.AVAIL_DAYS DAY) >= STR_TO_DATE(#{downStdt}, '%Y-%m-%d %H:%i:%s')
-				AND DATE_ADD(C.DOWN_STDT, INTERVAL C.AVAIL_DAYS DAY) <![CDATA[ <= ]]> STR_TO_DATE(#{downEddt}, '%Y-%m-%d %H:%i:%s')
-				UNION
-				SELECT COUNT(1) AS CNT		<!-- 쿠폰 사용 기한이 일수일경우 다운종료일 + 일수가 사용종료일. 해당 기준으로 겹치는 쿠폰번호 찾기 -->
-				FROM CHECK_DATA C
-				WHERE 1=1
-				AND DATE_ADD(C.DOWN_EDDT, INTERVAL C.AVAIL_DAYS DAY) >= STR_TO_DATE(#{downStdt}, '%Y-%m-%d %H:%i:%s')
-				AND DATE_ADD(C.DOWN_EDDT, INTERVAL C.AVAIL_DAYS DAY) <![CDATA[ <= ]]> STR_TO_DATE(#{downEddt}, '%Y-%m-%d %H:%i:%s') ) A
+		      ) A
+	</select>
+
+	<!-- 특정 쿠폰 발급받은 회원 조회-->
+	<select id="getRandomCouponNmCnt" parameterType="String" resultType="int">
+		/* TsaCoupon.getRandomCouponNmCnt : 중복 시리얼넘버 체크 */
+		SELECT COUNT(1) AS CNT
+		FROM TB_RANDOM_COUPON
+		WHERE RD_CPN_NM = #{value}
 	</select>
 
 	<!-- 고객 쿠폰 발행 -->

+ 77 - 24
src/main/java/com/style24/persistence/mybatis/shop/TsaFreegiftPromotion.xml

@@ -4,41 +4,94 @@
 	<!-- 사은품 프로모션 리스트 조회 -->
 	<select id="getFreeGoodsPromotionList" parameterType="FreeGoodsPromotion" resultType="FreeGoodsPromotion">
 		/* TsaMarketing.getFreeGoodsPromotionList :  사은품 프로모션 리스트 조회 */
-		SELECT FG.FREEGIFT_SQ
-			 , FG.FREEGIFT_NM
-			 , FG.FREEGIFT_STAT
-		     , (SELECT CD_NM FROM TB_COMMON_CODE WHERE CD = FG.FREEGIFT_STAT) AS FREEGIFT_STAT_NM
-		     , FG.SELF_YN
-			 , DATE_FORMAT(FG.FREEGIFT_STDT, '%Y.%m.%d') AS FREEGIFT_STDT
-			 , DATE_FORMAT(FG.FREEGIFT_EDDT, '%Y.%m.%d') AS FREEGIFT_EDDT
-			 , (SELECT USER_NM FROM TB_USER WHERE USER_NO = FG.REG_NO) AS REG_NM
-			 , DATE_FORMAT(FG.REG_DT, '%Y.%m.%d %H:%i:%S') AS REG_DT
-			 , (SELECT USER_NM FROM TB_USER WHERE USER_NO = FG.UPD_NO) AS UPD_NM
-			 , DATE_FORMAT(FG.UPD_DT, '%Y.%m.%d %H:%i:%S') AS UPD_DT
-		  FROM TB_FREEGIFT FG
-		 WHERE 1=1
-		   AND DEL_YN = 'N'
+		SELECT Z.*
+		FROM (SELECT @rownum := @rownum + 1 AS RNUM
+				   , A.*
+				FROM (  SELECT FG.FREEGIFT_SQ
+							 , FG.FREEGIFT_NM
+							 , FG.FREEGIFT_STAT
+							 , (SELECT CD_NM FROM TB_COMMON_CODE WHERE CD = FG.FREEGIFT_STAT) AS FREEGIFT_STAT_NM
+							 , FG.SELF_YN
+							 , DATE_FORMAT(FG.FREEGIFT_STDT, '%Y.%m.%d') AS FREEGIFT_STDT
+							 , DATE_FORMAT(FG.FREEGIFT_EDDT, '%Y.%m.%d') AS FREEGIFT_EDDT
+							 , (SELECT USER_NM FROM TB_USER WHERE USER_NO = FG.REG_NO) AS REG_NM
+							 , DATE_FORMAT(FG.REG_DT, '%Y.%m.%d %H:%i:%S') AS REG_DT
+							 , (SELECT USER_NM FROM TB_USER WHERE USER_NO = FG.UPD_NO) AS UPD_NM
+							 , DATE_FORMAT(FG.UPD_DT, '%Y.%m.%d %H:%i:%S') AS UPD_DT
+						  FROM TB_FREEGIFT FG
+						 WHERE 1=1
+						   AND DEL_YN = 'N'
+						<if test="searchTxt != null and searchTxt != ''">
+							<if test="promotionGubun != null and promotionGubun == 'freegiftSq'">
+						   AND FG.FREEGIFT_SQ = #{searchTxt}
+							</if>
+							<if test="promotionGubun != null and promotionGubun == 'freegiftNm'">
+						   AND FG.FREEGIFT_NM = #{searchTxt}
+							</if>
+						</if>
+						/* 프로모션ID로 검색하면 기간보다 우선하여 검색한다 */
+						<if test="searchTxt == '' or promotionGubun != 'freegiftSq'">
+							<if test="stDate != null and stDate != ''">
+								<if test="edDate != null and edDate != ''">
+							   AND FREEGIFT_STDT BETWEEN STR_TO_DATE(#{stDate},'%Y-%m-%d%H%i%S') AND STR_TO_DATE(CONCAT(#{edDate}, '235959'),'%Y-%m-%d%H%i%S')
+							   AND FREEGIFT_EDDT BETWEEN STR_TO_DATE(#{stDate},'%Y-%m-%d%H%i%S') AND STR_TO_DATE(CONCAT(#{edDate}, '235959'),'%Y-%m-%d%H%i%S')
+								</if>
+							</if>
+						</if>
+				 	 ) A
+				JOIN (SELECT @rownum := 0) R
+				ORDER BY REG_DT DESC
+				) Z
+		WHERE  1=1
+		AND    Z.RNUM BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
+	</select>
+
+	<!-- 사은품 프로모션 리스트 Count 조회 -->
+	<select id="getFreeGoodsPromotionListCount" parameterType="FreeGoodsPromotion" resultType="int">
+		/* TsaMarketing.getFreeGoodsPromotionListCount :  사은품 프로모션 리스트 조회 */
+		SELECT COUNT(1) AS CNT
+		FROM TB_FREEGIFT FG
+		WHERE 1=1
+		AND DEL_YN = 'N'
 		<if test="searchTxt != null and searchTxt != ''">
 			<if test="promotionGubun != null and promotionGubun == 'freegiftSq'">
-		   AND FG.FREEGIFT_SQ = #{searchTxt}
+				AND FG.FREEGIFT_SQ = #{searchTxt}
 			</if>
 			<if test="promotionGubun != null and promotionGubun == 'freegiftNm'">
-		   AND FG.FREEGIFT_NM = #{searchTxt}
+				AND FG.FREEGIFT_NM = #{searchTxt}
 			</if>
 		</if>
 		/* 프로모션ID로 검색하면 기간보다 우선하여 검색한다 */
 		<if test="searchTxt == '' or promotionGubun != 'freegiftSq'">
 			<if test="stDate != null and stDate != ''">
 				<if test="edDate != null and edDate != ''">
-			   AND FREEGIFT_STDT BETWEEN STR_TO_DATE(#{stDate},'%Y-%m-%d%H%i%S') AND STR_TO_DATE(CONCAT(#{edDate}, '235959'),'%Y-%m-%d%H%i%S')
-			   AND FREEGIFT_EDDT BETWEEN STR_TO_DATE(#{stDate},'%Y-%m-%d%H%i%S') AND STR_TO_DATE(CONCAT(#{edDate}, '235959'),'%Y-%m-%d%H%i%S')
+					AND FREEGIFT_STDT BETWEEN STR_TO_DATE(#{stDate},'%Y-%m-%d%H%i%S') AND STR_TO_DATE(CONCAT(#{edDate}, '235959'),'%Y-%m-%d%H%i%S')
+					AND FREEGIFT_EDDT BETWEEN STR_TO_DATE(#{stDate},'%Y-%m-%d%H%i%S') AND STR_TO_DATE(CONCAT(#{edDate}, '235959'),'%Y-%m-%d%H%i%S')
 				</if>
 			</if>
 		</if>
+	</select>
+
+	<!-- 사은품 프로모션 조회 -->
+	<select id="getFreeGoodsPromotionInfo" parameterType="FreeGoodsPromotion" resultType="FreeGoodsPromotion">
+		/* TsaMarketing.getFreeGoodsPromotionInfo :  사은품 프로모션 조회 */
+		SELECT FG.FREEGIFT_SQ
+			 , FG.FREEGIFT_NM
+			 , FG.FREEGIFT_STAT
+			 , (SELECT CD_NM FROM TB_COMMON_CODE WHERE CD = FG.FREEGIFT_STAT) AS FREEGIFT_STAT_NM
+			 , FG.SELF_YN
+			 , DATE_FORMAT(FG.FREEGIFT_STDT, '%Y-%m-%d %H:%i:%S') AS FREEGIFT_STDT
+			 , DATE_FORMAT(FG.FREEGIFT_EDDT, '%Y-%m-%d %H:%i:%S') AS FREEGIFT_EDDT
+			 , (SELECT USER_NM FROM TB_USER WHERE USER_NO = FG.REG_NO) AS REG_NM
+			 , DATE_FORMAT(FG.REG_DT, '%Y.%m.%d %H:%i:%S') AS REG_DT
+			 , (SELECT USER_NM FROM TB_USER WHERE USER_NO = FG.UPD_NO) AS UPD_NM
+			 , DATE_FORMAT(FG.UPD_DT, '%Y.%m.%d %H:%i:%S') AS UPD_DT
+		FROM TB_FREEGIFT FG
+		WHERE 1=1
+		AND DEL_YN = 'N'
 		<if test="freegiftSq != null and freegiftSq != ''">
-		   AND FG.FREEGIFT_SQ = #{freegiftSq}
+			AND FG.FREEGIFT_SQ = #{freegiftSq}
 		</if>
-		 ORDER BY REG_DT DESC
 	</select>
 
 	<!-- 사은품 프로모션 제휴몰 리스트 조회 -->
@@ -195,8 +248,8 @@
 		) VALUES (
 			  #{freegiftNm}
 			, #{freegiftStat}
-			, STR_TO_DATE(#{freegiftStdt},'%Y%m%d%H%i%S')
-			, STR_TO_DATE(CONCAT(#{freegiftEddt}, '235959'),'%Y%m%d%H%i%S')
+			, STR_TO_DATE(#{freegiftStdt},'%Y-%m-%d %H:%i:%S')
+			, STR_TO_DATE(#{freegiftEddt},'%Y-%m-%d %H:%i:%S')
 			, #{selfYn}
 			, #{allYn}
 			, #{regNo}
@@ -311,8 +364,8 @@
 	<update id="updateFreegoodsPromotionInfo" parameterType="FreeGoodsPromotion">
 		/* TsaMarketing.updateFreegoodsPromotionInfo : 사은품 프로모션 마스터 정보 수정 */
 		UPDATE TB_FREEGIFT
-        SET FREEGIFT_STDT = STR_TO_DATE(#{freegiftStdt},'%Y%m%d%H%i%S')
-          , FREEGIFT_EDDT = STR_TO_DATE(CONCAT(#{freegiftEddt}, '235959'),'%Y%m%d%H%i%S')
+        SET FREEGIFT_STDT = STR_TO_DATE(#{freegiftStdt},'%Y-%m-%d %H:%i:%S')
+          , FREEGIFT_EDDT = STR_TO_DATE(#{freegiftEddt},'%Y-%m-%d %H:%i:%S')
           , FREEGIFT_NM = #{freegiftNm}
 		  , SELF_YN = #{selfYn}
 		  , ALL_YN = #{allYn}

+ 1 - 1
src/main/webapp/WEB-INF/views/marketing/CouponListForm.html

@@ -225,7 +225,7 @@
 
 		// 쿠폰등록 팝업창
 		function fnCouponCreateForm(){
-			cfnCouponCreatePopup('');
+			cfnCouponCreatePopup('0');
 		}
 
 		// 초기화 클릭시

+ 53 - 6
src/main/webapp/WEB-INF/views/marketing/CouponPopupForm.html

@@ -78,15 +78,15 @@
 											</td>
 											<th class="randomCpnArea">난수생성수량<em class="required" title="필수"></em></th>
 											<td class="randomCpnArea">
-												<input type="text" name="randomCpnQty" class="w300" required="required" data-valid-name="랜덤쿠폰발급수량" data-valid-type="numeric">
+												<input type="text" name="randomCpnQty" class="w300" required="required" data-valid-name="난수생성수량" data-valid-type="numeric">
 											</td>
 										</tr>
 										<tr class="serialCpnArea" style="display:none;">
-											<th>시리얼<em class="required" title="필수"></em></th>
+											<th>시리얼쿠폰키워드<em class="required" title="필수"></em></th>
 											<td>
-												<input type="text" name="serialCpnNm" class="w300" required="required" data-valid-name="시리얼쿠폰키워드">
+												<input type="text" name="serialCpnNm" class="w300" maxlength="10" required="required" data-valid-name="시리얼쿠폰키워드">
 											</td>
-											<th>쿠폰발급수량<em class="required" title="필수"></em></th>
+											<th>시리얼쿠폰발급수량<em class="required" title="필수"></em></th>
 											<td>
 												<input type="text" name="serialCpnQty" class="w300" required="required" data-valid-name="시리얼쿠폰발급수량" data-valid-type="numeric">
 											</td>
@@ -618,7 +618,10 @@
 				if (!gagajf.validation('#CouponForm')) {
 					return false;
 				}
-				checkValidation();
+				// 데이터 validation 체크
+				if(!checkValidation()) {
+					return false;
+				}
 
 				gagajf.ajaxFormSubmit($('#CouponForm').prop('action'), '#CouponForm', function() {
 					uifnPopupClose('CouponRegForm');
@@ -644,7 +647,9 @@
 				if (!gagajf.validation('#CouponForm')) {
 					return false;
 				}
-				checkValidation();
+				if(!checkValidation()) {
+					return false;
+				}
 
 				gagajf.ajaxFormSubmit($('#CouponForm').prop('action'), '#CouponForm', function() {
 					uifnPopupClose('CouponRegForm');
@@ -728,6 +733,39 @@
 				return false;
 			}
 		}
+
+		// 할인쿠폰 유형에 따른 총 발행수량 수정 (주문서 쿠폰이고 난수쿠폰일 경우)
+		if($('#CouponForm #cpnType').val() == "G230_20" && $('#CouponForm input:radio[name="dcCdGb"]:checked').val() == "G233_20") {
+			if($("#CouponForm input[name=randomCpnQty]").val() == "" || $("#CouponForm input[name=randomCpnQty]").val() < 1) {
+				mcxDialog.alert('쿠폰의 발급 수량을 입력해주세요.');
+				$("#CouponForm input[name=randomCpnQty]").focus();
+				return false;
+			}
+			if($("#CouponForm input[name=randomCpnQty]").val() > 10000) {
+				mcxDialog.alert('쿠폰의 발급 수량은 10000장을 초과할 수 없습니다.');
+				$("#CouponForm input[name=randomCpnQty]").focus();
+				return false;
+			}
+
+		} else if ($('#CouponForm #cpnType').val() == "G230_20" && $('#CouponForm input:radio[name="dcCdGb"]:checked').val() == "G233_10") {		// 주문서 쿠폰이고 시리얼 유형일 경우
+			if($("#CouponForm input[name=serialCpnNm]").val().length > 10) {
+				mcxDialog.alert('시리얼쿠폰키워드는 10글자를 넘을 수 없습니다.');
+				$("#CouponForm input[name=serialCpnNm]").focus();
+				return false;
+			}
+			if($("#CouponForm input[name=serialCpnQty]").val() == "" || $("#CouponForm input[name=serialCpnQty]").val() < 1) {
+				mcxDialog.alert('쿠폰의 발급 수량을 입력해주세요.');
+				$("#CouponForm input[name=serialCpnQty]").focus();
+				return false;
+			}
+			if($("#CouponForm input[name=randomCpnQty]").val() > 10000) {
+				mcxDialog.alert('쿠폰의 발급 수량은 10000장을 초과할 수 없습니다.');
+				$("#CouponForm input[name=serialCpnQty]").focus();
+				return false;
+			}
+		}
+
+		return true;
 	}
 
 	// 할인방식 변경
@@ -786,15 +824,24 @@
 			$("#CouponForm .randomCpnArea").hide();
 			$("#CouponForm #custJoinYn").parent().attr("colspan", "");
 			$("#CouponForm .normalCol").attr("colspan", "5");
+			$('#CouponForm input[name="serialCpnNm"]').attr('required' , false);
+			$('#CouponForm input[name="serialCpnQty"]').attr('required' , false);
+			$('#CouponForm input[name="randomCpnQty"]').attr('required' , false);
 		} else {
 			if(this.value == "G233_10") {		// 시리얼 유형
 				$("#CouponForm .serialCpnArea").show();
 				$("#CouponForm .randomCpnArea").hide();
 				$("#CouponForm .normalCol").attr("colspan", "5");
+				$('#CouponForm input[name="serialCpnNm"]').attr('required' , true);
+				$('#CouponForm input[name="serialCpnQty"]').attr('required' , true);
+				$('#CouponForm input[name="randomCpnQty"]').attr('required' , false);
 			} else {							// 난수 유형
 				$("#CouponForm .serialCpnArea").hide();
 				$("#CouponForm .randomCpnArea").show();
 				$("#CouponForm .normalCol").attr("colspan", "");
+				$('#CouponForm input[name="serialCpnNm"]').attr('required' , false);
+				$('#CouponForm input[name="serialCpnQty"]').attr('required' , false);
+				$('#CouponForm input[name="randomCpnQty"]').attr('required' , true);
 			}
 			$("#CouponForm .dcCdCheck").hide();								// 총발행제한수량, 1회발행수량, 1인당발행제한수량 숨김
 			$("#CouponForm #custJoinYn").parent().attr("colspan", "5");		// 총발행제한 수량을 없애면서 신규회원여부 colspan 수정

+ 25 - 9
src/main/webapp/WEB-INF/views/marketing/FreeGoodsPromotionForm.html

@@ -46,7 +46,7 @@
 						</colgroup>
 
 						<tr>
-							<th>기간</th>
+							<th>기간<em class="required" title="필수"></em></th>
 							<td id="sellTerms"></td>
 						</tr>
 
@@ -87,8 +87,17 @@
 						<button type="button" class="btn btn-info btn-lg" id="btnFreeGoodsRegi" >프로모션등록</button>
 					</li>
 				</ul>
+
 				<!-- 검색결과 영역 -->
-				<div id="gridList" style="width: 100%; height: 700px;" class="ag-theme-balham"></div>
+				<div class="panelContent" style="overflow: hidden;">
+					<div id="gridList" style="width: 100%; height: 700px;" class="ag-theme-balham"></div>
+				</div>
+
+				<ul class="panelBar">
+					<li class="center">
+						<div class="tablePaging" id="freegiftPromotionListPagination"></div>
+					</li>
+				</ul>
 			</div>
 		</form>
 <script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js"></script>
@@ -155,7 +164,7 @@
 	var fnFreeGoodsPromotionListSearch = function() {
 		if(!fnConditionCheck()) return;
 
-		gagaPaging.init('searchForm', fnSearchCallBack, 'freeGoodsListPagination', $('#searchForm').find('#pageSize').val());
+		gagaPaging.init('searchForm', fnSearchCallBack, 'freegiftPromotionListPagination', $('#searchForm').find('#pageSize').val());
 		gagaPaging.load($("#searchForm input[name=pageNo]").val());
 	}
 
@@ -186,12 +195,10 @@
 			}
 
 			// 검색 기간 1년 이내로 지정
-			let stDateArray = fromDate.split("-");
-			let stDate = new Date(stDateArray[0], stDateArray[1] - 1, stDateArray[2]);
-			let edDateArray = toDate.split("-");
-			let edDate = new Date(edDateArray[0], edDateArray[1] - 1, edDateArray[2]);
-			let betweenDate = (edDate.getTime() - stDate.getTime()) / 1000 / 60 / 60 / 24;
-			if(betweenDate > 365) {
+			var sdt = new Date(fromDate);
+			var edt = new Date(toDate);
+			var dateDiff = Math.ceil((edt.getTime()-sdt.getTime())/(1000*3600*24));
+			if(dateDiff > 365) {
 				mcxDialog.alertC("최대 1년까지 선택하실 수 있습니다.", {
 					sureBtnText: "확인",
 					sureBtnClick: function() {
@@ -200,6 +207,15 @@
 				});
 				return false;
 			}
+		} else {
+			/* 기간 입력 확인 > 테스트 중에만 제거
+			mcxDialog.alertC("검색 기간을 입력해주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#searchForm input[name=stDate]').focus();
+				}
+			});
+			return false;*/
 		}
 
 		return true;

+ 116 - 30
src/main/webapp/WEB-INF/views/marketing/FreeGoodsPromotionRegiForm.html

@@ -29,9 +29,9 @@
 					<table class="frmStyle">
 						<colgroup>
 							<col width="10%"/>
-							<col width="50%"/>
+							<col width="60%"/>
 							<col width="10%"/>
-							<col width="40%"/>
+							<col width="30%"/>
 						</colgroup>
 						<tr>
 							<th>프로모션명<em class="required" title="필수"></em></th>
@@ -46,14 +46,28 @@
 						<tr>
 							<th>행사 기간<em class="required" title="필수"></em></th>
 							<td>
-								<input type="text" class="schDate w100" id="freegiftStdt" name="freegiftStdt" maxlength="10" required="required" data-valid-name="시작일자"/>
+								<input type="hidden" id="freegiftStdt" name="freegiftStdt"/>
+								<input type="hidden" id="freegiftEddt" name="freegiftEddt"/>
+
+								<input type="text" class="schDate w100" id="freegiftStDate" name="freegiftStDate" maxlength="10" required="required" data-valid-name="시작일자"/>
+								<select name="freegiftStHH" id="freegiftStHH">
+									<option th:if="${hhList}" th:each="oneData , status : ${hhList}" th:text="${oneData.cdNm}" th:value="${oneData.cd}"></option>
+								</select>
+								<select name="freegiftStMM" id="freegiftStMM">
+									<option th:if="${mmList}" th:each="oneData , status : ${mmList}" th:text="${oneData.cdNm}" th:value="${oneData.cd}"></option>
+								</select>
 								~
-								<input type="text" class="schDate w100" id="freegiftEddt" name="freegiftEddt" maxlength="10" required="required" data-valid-name="종료일자"/>
+								<input type="text" class="schDate w100" id="freegiftEdDate" name="freegiftEdDate" maxlength="10" required="required" data-valid-name="종료일자"/>
+								<select name="freegiftEdHH" id="freegiftEdHH">
+									<option th:if="${hhList}" th:each="oneData , status : ${hhList}" th:text="${oneData.cdNm}" th:value="${oneData.cd}"></option>
+									<option th:text="24시" th:value="24"></option>
+								</select>
+								<select name="freegiftEdMM" id="freegiftEdMM">
+									<option th:if="${mmList}" th:each="oneData , status : ${mmList}" th:text="${oneData.cdNm}" th:value="${oneData.cd}"></option>
+								</select>
 							</td>
-							<!-- <td id="promotionTerms">수정시 행사기간 입력되도록 수정(JAVASCRIPT?) : before</td> -->
 							<th>상태</th>
 							<td>
-								<!-- 상태 입력 : before -->
 								<span name="freegiftStatText"></span>
 							</td>
 						</tr>
@@ -92,7 +106,6 @@
 								<tr>
 									<th>공급업체/브랜드</th>
 									<td>
-										<!-- 수정시 프로모션명 입력 : before -->
 										<div class="padding10" style="display:inline-block;width:49%;">
 											<span>공급업체 설정</span>
 											<div class="padding10 inner-tb-solid">
@@ -108,7 +121,6 @@
 												<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddBrand">브랜드 추가</button>
 												<button type="button" class="btn btnRight btn-success btn-lg" id="btnDeleteBrand">선택삭제</button>
 												<br/>
-												<!-- 브랜드 선택 팝업(단수 선택 팝업... 복수를 새로 만들어야하는지 ? 아니면 변수처리해야하는지 ? -->
 												<div id="gridFGBrandList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
 											</div>
 										</div>
@@ -249,13 +261,11 @@
 
 				<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 fgButton" id="btnFreegoodsPromotionSave">저장</button>
 						<button type="button" class="btn btnRight btn-success btn-lg fgButton" id="btnChangeStatIng">진행</button>
 						<button type="button" class="btn btnRight btn-success btn-lg fgButton" id="btnPromotionDelete">삭제</button>
 						<button type="button" class="btn btnRight btn-success btn-lg fgButton" id="btnPromotionStop">중지</button>
-						<!-- </th:block> -->
 					</li>
 				</ul>
 			</form>
@@ -478,25 +488,48 @@
 				freegiftStatNm = "종료 (" + freegift.freegiftEddt + ")";
 			}
 
+			let stDtArr = freegift.freegiftStdt.split(" ");
+			let edDtArr = freegift.freegiftEddt.split(" ");
+
+			let stDate = stDtArr[0];
+			let stHour = stDtArr[1].split(":")[0];
+			let stMinute = stDtArr[1].split(":")[1];
+			let edDate = edDtArr[0];
+			let edHour = edDtArr[1].split(":")[0];
+			let edMinute = edDtArr[1].split(":")[1];
+
+			if(edDtArr[1] == "23:59:59") {
+				edHour = "24";
+				edMinute = "00";
+				$("#freeGoodsPromotionForm #freegiftEdMM option").hide();
+				$('#freeGoodsPromotionForm #freegiftEdMM option:first').show().prop("selected", true);
+			}
+
 			// 저장된 값 입력
 			$('#freeGoodsPromotionForm input[name=freegiftNm]').val(freegift.freegiftNm);
 			$('#freeGoodsPromotionForm span[name=freegiftSqText]').text(freegift.freegiftSq);
-			$('#freeGoodsPromotionForm input[name=freegiftStdt]').val(freegift.freegiftStdt.split(".").join("-"));
-			$('#freeGoodsPromotionForm input[name=freegiftEddt]').val(freegift.freegiftEddt.split(".").join("-"));
+			$('#freeGoodsPromotionForm input[name=freegiftStDate]').val(stDate);
+			$('#freeGoodsPromotionForm select[name=freegiftStHH]').val(stHour);
+			$('#freeGoodsPromotionForm select[name=freegiftStMM]').val(stMinute);
+			$('#freeGoodsPromotionForm input[name=freegiftEdDate]').val(edDate);
+			$('#freeGoodsPromotionForm select[name=freegiftEdHH]').val(edHour);
+			$('#freeGoodsPromotionForm select[name=freegiftEdMM]').val(edMinute);
 			$('#freeGoodsPromotionForm span[name=freegiftStatText]').text(freegiftStatNm);
 			$('#freeGoodsPromotionForm input[name=sectionVal]').val(freegift.sectionVal);
 			$('#freeGoodsPromotionForm input[name=sectionVal2]').val(freegift.sectionVal2);
 			$("#freeGoodsPromotionForm #regInfo").text(freegift.regNm + "(" + freegift.regDt + ")");
 			$("#freeGoodsPromotionForm #updInfo").text(freegift.updNm + "(" + freegift.updDt + ")");
+
 			// 자사 적용일 경우
 			if(freegift.selfYn == "Y") {
-				$("#freeGoodsPromotionForm input[name=selfYn]").addClass("checked");
+				$("#freeGoodsPromotionForm input[name=selfYn]").prop("checked", true);
 				$("#freeGoodsPromotionForm input[name=selfYn]").parent("label").addClass("checked");
 			}
 
 			// 외부몰 적용일 경우
 			if(freegift.extmallList != null && freegift.extmallList.length > 0) {
 				$("#freeGoodsPromotionForm input[name=extmallYn]").parent("label").addClass("checked");
+				$("#freeGoodsPromotionForm input[name=extmallYn]").prop("checked", true);
 				$("#freeGoodsPromotionForm #extmallCnt").text(freegift.extmallList.length);
 				$("#freeGoodsPromotionForm #allY").prop("checked", true);						// 제휴몰 선택시 지급 방법은 모두 지급으로 한정
 				$("#freeGoodsPromotionForm input[name=allYn]").prop("disabled", true);			// 제휴몰 선택시 지급 방법은 모두 지급에서 수정 불가
@@ -515,16 +548,35 @@
 				$("#freeGoodsPromotionForm #btnChangeStatIng").show();				// 진행
 				$("#freeGoodsPromotionForm #btnPromotionDelete").show();			// 삭제
 			} else {
-				// 진행 상태일 경우
-				if(freegift.freegiftStat == "G232_11") {
-					$("#freeGoodsPromotionForm #btnFreegoodsPromotionSave").show();	// 저장
-					$("#freeGoodsPromotionForm #btnPromotionStop").show();			// 중지
-
+				// 대기 상태일 경우를 제외하면 모든 상태 수정 불가(기획서대로 진행 상태에서 일부 수정 가능할 경우 if문 주석 제거)
+				//if(freegift.freegiftStat == "G232_11") {
 					// 진행 상태일 경우 기간, 적용대상상품, 추가제외상품 외 나머지 항목 수정 불가.
 					$("#freeGoodsPromotionForm input[name=extmallYn]").addClass("formControl");
 					$("#freeGoodsPromotionForm .disabledPoint").prop("disabled", true);
 					$("#freeGoodsPromotionForm .hideButten").hide();
-				}
+
+					// 진행 상태일 경우 전체 수정 불가(전체가 아닌 기획서대로면 아래 내용만 삭제)
+					$("#freeGoodsPromotionForm input[name=extmallYn]").addClass("formControl");
+					$("#freeGoodsPromotionForm .disabledPoint").prop("disabled", true);
+					$("#freeGoodsPromotionForm input").prop("disabled", true);
+					$("#freeGoodsPromotionForm button").hide();
+
+					// 진행 상태일 경우 노출 버튼 (저장 버튼은 중지시 수정 불가처리하기로하여 주석처리. 기획서대로 변경일 경우 주석 제거 및 if 제거)
+					if(freegift.freegiftStat == "G232_11") {	// 진행 상태일 경우
+						// $("#freeGoodsPromotionForm #btnFreegoodsPromotionSave").show();	// 저장
+						$("#freeGoodsPromotionForm #btnPromotionStop").show();				// 중지
+					}
+
+					// 목록 버튼
+					$("#freeGoodsPromotionForm #btnSearchList").show();
+
+					gridOptionsFreeGoods1List.columnApi.getColumn("usePoint").colDef.editable = false;
+					gridOptionsFreeGoods1List.columnApi.getColumn("itemQty").colDef.editable = false;
+					gridOptionsFreeGoods1List.columnApi.getColumn("limitQty").colDef.editable = false;
+					gridOptionsFreeGoods2List.columnApi.getColumn("usePoint").colDef.editable = false;
+					gridOptionsFreeGoods2List.columnApi.getColumn("itemQty").colDef.editable = false;
+					gridOptionsFreeGoods2List.columnApi.getColumn("limitQty").colDef.editable = false;
+				//}
 			}
 
 			gridOptionsFGExtmallList.api.setRowData(freegift.extmallList);
@@ -563,9 +615,13 @@
 
 			// 기간 검색 default 조건 (오늘부터 1주일)
 			let date = new Date();
-			$("#freeGoodsPromotionForm #freegiftStdt").val(date.format("YYYY-MM-DD"));	// 오늘 날짜
-			date.setDate(date.getDate() + 7);											// 등록일 + 7일
-			$("#freeGoodsPromotionForm #freegiftEddt").val(date.format("YYYY-MM-DD"));	// 1주일 후 날짜
+			$("#freeGoodsPromotionForm #freegiftStDate").val(date.format("YYYY-MM-DD"));	// 오늘 날짜
+			date.setDate(date.getDate() + 7);												// 등록일 + 7일
+			$("#freeGoodsPromotionForm #freegiftStDate").val(date.format("YYYY-MM-DD"));	// 1주일 후 날짜
+
+			$('#freeGoodsPromotionForm #freegiftEdHH option:last').prop("selected", true);
+			$("#freeGoodsPromotionForm #freegiftEdMM option").hide();
+			$('#freeGoodsPromotionForm #freegiftEdMM option:first').show().prop("selected", true);
 		} else {
 			fnFreegiftSearch();
 		}
@@ -642,8 +698,10 @@
 	// 저장 후 콜백 함수
 	var fnFreeGoodsPromotionSaveFin = function(result) {
 		if("C" != [[${param.gbn}]]) {
+			fnFreeGoodsPromotionListSearch();
 			fnFreegiftSearch();
 		} else {
+			fnFreeGoodsPromotionListSearch();
 			uifnPopupClose('popupFreeGoodsPromotionRegi');
 		}
 	}
@@ -674,7 +732,14 @@
 
 		if (fromDate > toDate) {
 			mcxDialog.alert("시작일자는 종료일자 보다 늦을 수 없습니다.");
-			$('#freeGoodsPromotionForm input[name=freegiftStdt]').focus();
+			return false;
+		}
+
+		var sdt = new Date(fromDate);
+		var edt = new Date(toDate);
+		var dateDiff = Math.ceil((edt.getTime()-sdt.getTime())/(1000*3600*24));
+		if(dateDiff > 365) {
+			mcxDialog.alert("행사 기간은 1년을 초과 할 수 없습니다.");
 			return false;
 		}
 
@@ -776,26 +841,37 @@
 			mcxDialog.alert("사은품 조건2의 사은품은 최대 5개까지 등록가능합니다.");
 			return false;
 		}
-		if($("#freeGoodsPromotionForm #saleAmt2").val() != "" && $("#freeGoodsPromotionForm #saleAmt2").val() < 1) {
+		if($("#freeGoodsPromotionForm #saleAmt2").val() == "" || $("#freeGoodsPromotionForm #saleAmt2").val() < 1) {
 			if(freeGoods2Cnt > 0) {
 				mcxDialog.alert("사은품 조건2의 구매금액 조건을 설정해주세요.");
 				return false;
 			}
-		} else if (freeGoods2Cnt < 1) {
-			mcxDialog.alert("사은품 조건2의 사은품을 선택해주세요.");
-			return false;
+		} else {
+			if (freeGoods2Cnt < 1) {
+				mcxDialog.alert("사은품 조건2의 사은품을 선택해주세요.");
+				return false;
+			}
 		}
 
-
 		let selfYn = $("#freeGoodsPromotionForm input[name=selfYn]:checked").val();
 		if(!selfYn || selfYn == "") { selfYn = "N"; }
 
+		alert($("#freeGoodsPromotionForm select[name=freegiftEdHH]").val());
+
+		let freegiftStdt = $("#freeGoodsPromotionForm input[name=freegiftStDate]").val() + " " + $("#freeGoodsPromotionForm select[name=freegiftStHH]").val() + ":" + $("#freeGoodsPromotionForm select[name=freegiftStMM]").val() + ":00";
+		let freegiftEddt = $("#freeGoodsPromotionForm input[name=freegiftEdDate]").val();
+		if($("#freeGoodsPromotionForm select[name=freegiftEdHH]").val() == "24") {
+			freegiftEddt += " 23:59:59";
+		} else {
+			freegiftEddt += " " + $("#freeGoodsPromotionForm select[name=freegiftEdHH]").val() + ":" + $("#freeGoodsPromotionForm select[name=freegiftEdMM]").val() + ":00";
+		}
+
 		// var params =  $(formId).serialize();
 		var data = {  gbn : $("#freeGoodsPromotionForm input[name=gbn]").val()
 			        , freegiftSq : $("#freeGoodsPromotionForm input[name=freegiftSq]").val()
 			        , freegiftNm : $("#freeGoodsPromotionForm input[name=freegiftNm]").val()
-					, freegiftStdt : $("#freeGoodsPromotionForm input[name=freegiftStdt]").val().replace(/-/gi, "")
-					, freegiftEddt : $("#freeGoodsPromotionForm input[name=freegiftEddt]").val().replace(/-/gi, "")
+					, freegiftStdt : freegiftStdt
+					, freegiftEddt : freegiftEddt
 					, selfYn : selfYn
 					, extmallYn : $("#freeGoodsPromotionForm input[name=extmallYn]:checked").val()
 					, allYn : $("#freeGoodsPromotionForm input[name=allYn]:checked").val()
@@ -814,6 +890,16 @@
 		gagajf.ajaxJsonSubmit('/marketing/freeGoodsPromotion/save', jsonData, fnFreeGoodsPromotionSaveFin);
 	});
 
+	// 할인방식 변경
+	$("#freeGoodsPromotionForm #freegiftEdHH").bind('click change', function () {
+		if(this.value == 24) {
+			$("#freeGoodsPromotionForm #freegiftEdMM option").hide();
+			$('#freeGoodsPromotionForm #freegiftEdMM option:first').show().prop("selected", true);
+		} else {
+			$("#freeGoodsPromotionForm #freegiftEdMM option").show();
+		}
+	});
+
 	// 목록 버튼 클릭
 	$("#freeGoodsPromotionForm #btnSearchList").on("click", function() {
 		uifnPopupClose('popupFreeGoodsPromotionRegi');