Browse Source

Merge branch 'develop' into eskim

eskim 5 years ago
parent
commit
69a649c899
39 changed files with 1968 additions and 1690 deletions
  1. 27 3
      src/main/java/com/style24/admin/biz/dao/TsaCouponDao.java
  2. 0 9
      src/main/java/com/style24/admin/biz/dao/TsaCustomerDao.java
  3. 17 0
      src/main/java/com/style24/admin/biz/dao/TsaMorebetterDao.java
  4. 39 20
      src/main/java/com/style24/admin/biz/service/TsaCouponService.java
  5. 48 22
      src/main/java/com/style24/admin/biz/service/TsaCustomerService.java
  6. 24 0
      src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java
  7. 34 0
      src/main/java/com/style24/admin/biz/web/TsaCustomerController.java
  8. 77 24
      src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
  9. 65 47
      src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java
  10. 3 1
      src/main/java/com/style24/persistence/domain/Coupon.java
  11. 1 1
      src/main/java/com/style24/persistence/domain/CouponBurden.java
  12. 1 1
      src/main/java/com/style24/persistence/domain/CouponRefval.java
  13. 4 1
      src/main/java/com/style24/persistence/domain/CustCoupon.java
  14. 20 0
      src/main/java/com/style24/persistence/domain/MoreBetter.java
  15. 11 1
      src/main/java/com/style24/persistence/domain/MoreBetterGoods.java
  16. 2 2
      src/main/java/com/style24/persistence/domain/Order.java
  17. 150 46
      src/main/java/com/style24/persistence/mybatis/shop/TsaCoupon.xml
  18. 20 87
      src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml
  19. 1 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaFreegiftPromotion.xml
  20. 91 27
      src/main/java/com/style24/persistence/mybatis/shop/TsaMorebetter.xml
  21. 16 4
      src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml
  22. 1 1
      src/main/java/com/style24/persistence/mybatis/shop/TsaOrderChange.xml
  23. 60 52
      src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html
  24. 122 0
      src/main/webapp/WEB-INF/views/customer/CustomerSecedePopupForm.html
  25. 132 42
      src/main/webapp/WEB-INF/views/marketing/CouponPopupForm.html
  26. 1 1
      src/main/webapp/WEB-INF/views/marketing/CouponPubForCustPopupForm.html
  27. 10 4
      src/main/webapp/WEB-INF/views/marketing/MorebetterListForm.html
  28. 316 139
      src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html
  29. 524 0
      src/main/webapp/WEB-INF/views/marketing/RandomCouponList.html
  30. 0 0
      src/main/webapp/WEB-INF/views/order/CancelRequestFormBack01.html
  31. 0 0
      src/main/webapp/WEB-INF/views/order/CancelRequestFormBack02.html
  32. 30 27
      src/main/webapp/WEB-INF/views/order/CnclReqForm.html
  33. 61 940
      src/main/webapp/WEB-INF/views/order/CnclReqViewForm.html
  34. 27 14
      src/main/webapp/WEB-INF/views/order/ExchangeRequestForm.html
  35. 2 1
      src/main/webapp/WEB-INF/views/order/OrderDetailChangeHst.html
  36. 25 57
      src/main/webapp/WEB-INF/views/order/OrderDetailForm.html
  37. 2 39
      src/main/webapp/WEB-INF/views/order/OrderDetailGiftcardHst.html
  38. 2 38
      src/main/webapp/WEB-INF/views/order/OrderDetailPointHst.html
  39. 2 39
      src/main/webapp/WEB-INF/views/order/OrderDetailTmtbHst.html

+ 27 - 3
src/main/java/com/style24/admin/biz/dao/TsaCouponDao.java

@@ -84,7 +84,7 @@ public interface TsaCouponDao {
 	 * @author xyzp1539
 	 * @since 2021-01-15
 	 */
-    Coupon getCouponDetail(String cpnId);
+    Coupon getCouponDetail(int cpnId);
 
 	/**
 	 * 쿠폰 발급개수 조회
@@ -93,7 +93,7 @@ public interface TsaCouponDao {
 	 * @author xyzp1539
 	 * @since 2021-01-15
 	 */
-	int getCouponIssueCnt(String cpnId);
+	int getCouponIssueCnt(int cpnId);
 
 	/**
 	 * 쿠폰 적용 대상 - 제외상품
@@ -147,7 +147,7 @@ public interface TsaCouponDao {
 	 * @author xyzp1539
 	 * @since 2021-01-18
 	 */
-	ArrayList<Coupon> getCouponBurdenList(String cpnId);
+	ArrayList<Coupon> getCouponBurdenList(int cpnId);
 
 	/**
 	 * 쿠폰 적용대상 삭제
@@ -184,4 +184,28 @@ public interface TsaCouponDao {
 	 * @since 2021-01-21
 	 */
 	void updateCustCouponAvailEddt(CustCoupon issueCust);
+
+	/**
+	 * 난수, 시리얼 쿠폰 등록
+	 * @param param
+	 * @author xodud1202
+	 * @since 2021. 01. 26
+	 */
+	void createRandomCouponInfo(Coupon param);
+
+	/**
+	 * 동일 쿠폰명이 존재하는지 확인
+	 * @param param
+	 * @author xodud1202
+	 * @since 2021. 01. 26
+	 */
+	int getSerialOverlapCheck(Coupon param);
+
+	/**
+	 * 동일 쿠폰명이 존재하는지 확인
+	 * @param param
+	 * @author xodud1202
+	 * @since 2021. 01. 26
+	 */
+	ArrayList<CustCoupon> getRandomCouponInfo(int cpnId);
 }

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

@@ -37,15 +37,6 @@ public interface TsaCustomerDao {
 	 */
 	Collection<Customer> getCustomerActiveList(CustomerSearch customerSearch);
 
-	/**
-	 * 회원 정보
-	 * @param custNo - 고객번호
-	 * @return Customer
-	 * @author jsshin
-	 * @since 2021. 01. 18
-	 */
-	Customer getCustomerInfo(Integer custNo);
-
 	/**
 	 * 회원정보 수정
 	 * @param customer - 고객정보

+ 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 진행 */
 }

+ 39 - 20
src/main/java/com/style24/admin/biz/service/TsaCouponService.java

@@ -44,20 +44,11 @@ public class TsaCouponService {
 	 * @since  2021-01-11
 	 */
 	@Transactional("shopTxnManager")
-	public void saveCoupon(Coupon params) {
-		String cpnId = "";		// 쿠폰ID
+	public String saveCoupon(Coupon params){
+		int cpnId = 0;		// 쿠폰ID
 		params.setRegNo(TsaSession.getInfo().getUserNo());
 		params.setUpdNo(TsaSession.getInfo().getUserNo());
 
-		// 자동생성이면 시퀀스 가져오기
-		if(StringUtils.isBlank(params.getCpnId())) {
-			Integer sequence = commonService.getNextSequence("SEQ_COUPON");
-			cpnId = "CPN"+sequence;
-		} else {
-			cpnId = params.getCpnId();
-		}
-		params.setCpnId(cpnId);
-
 		couponDao.couponInsert(params);
 
 		Gson gson = new Gson();
@@ -162,7 +153,7 @@ public class TsaCouponService {
 		}
 
 		// 수정모드이고 변경된 쿠폰상태가 대기 , 중지 인경우 고객이 발급받은 내용도 변경
-		if(!StringUtils.isBlank(params.getCpnId()) &&
+		if(params.getCpnId() != 0 &&
 				(params.getCpnStat().equals("G232_10") || params.getCpnStat().equals("G232_12")) ) {
 
 			CustCoupon custCoupon = new CustCoupon();
@@ -179,6 +170,23 @@ public class TsaCouponService {
 				}
 			}
 		}
+
+		log.info("CHECK GUBUN >> " + params.getCpnType() + " / " + params.getDcCdGb() + " / " + params.getTotPubLimitQty());
+
+		// 시리얼 쿠폰 생성
+		if("G230_20".equals(params.getCpnType()) && "G233_10".equals(params.getDcCdGb())) {
+			// 시리얼 쿠폰명이 동일한 쿠폰이 일정 겹치는 부분이 있는지 확인
+			int overlapCheck = couponDao.getSerialOverlapCheck(params);
+			if(overlapCheck < 1) {
+				for(int i = 0 ; i < params.getTotPubLimitQty() ; i++) {
+					couponDao.createRandomCouponInfo(params);
+				}
+			} else {
+				throw new IllegalStateException("같은 시리얼명이 사용되는 쿠폰이 중복됩니다. 기간을 확인해주세요.");
+			}
+		}
+
+		return "SUCCESS";
 	}
 
 	/**
@@ -232,7 +240,7 @@ public class TsaCouponService {
 	 * @author xyzp1539
 	 * @since 2021-01-15
 	 */
-    public Coupon getCouponDetail(String cpnId) { return couponDao.getCouponDetail(cpnId);}
+    public Coupon getCouponDetail(int cpnId) { return couponDao.getCouponDetail(cpnId);}
 
 	/**
 	 * 쿠폰 발급 개수 조회
@@ -241,7 +249,7 @@ public class TsaCouponService {
 	 * @author xyzp1539
 	 * @since 2021-01-15
 	 */
-	public int getCouponIssueCnt(String cpnId) {
+	public int getCouponIssueCnt(int cpnId) {
 		return couponDao.getCouponIssueCnt(cpnId);
 	}
 
@@ -252,7 +260,7 @@ public class TsaCouponService {
 	 * @author xyzp1539
 	 * @since 2021-01-18
 	 */
-	public ArrayList<CouponRefval> getCouponRefvalExceptGoodsList(String cpnId ) {
+	public ArrayList<CouponRefval> getCouponRefvalExceptGoodsList(int cpnId ) {
 		CouponRefval cpnRefval = new CouponRefval();
 		cpnRefval.setCpnId(cpnId);
 		cpnRefval.setCpnTarget("G260_14");
@@ -266,7 +274,7 @@ public class TsaCouponService {
 	 * @author xyzp1539
 	 * @since 2021-01-18
 	 */
-	public ArrayList<CouponRefval> getCouponRefvalBrandList(String cpnId ) {
+	public ArrayList<CouponRefval> getCouponRefvalBrandList(int cpnId ) {
 		CouponRefval cpnRefval = new CouponRefval();
 		cpnRefval.setCpnId(cpnId);
 		cpnRefval.setCpnTarget("G260_12");
@@ -280,7 +288,7 @@ public class TsaCouponService {
 	 * @author xyzp1539
 	 * @since 2021-01-18
 	 */
-	public ArrayList<CouponRefval> getCouponRefvalCategoryList(String cpnId) {
+	public ArrayList<CouponRefval> getCouponRefvalCategoryList(int cpnId) {
 		CouponRefval cpnRefval = new CouponRefval();
 		cpnRefval.setCpnId(cpnId);
 		cpnRefval.setCpnTarget("G260_11");
@@ -294,7 +302,7 @@ public class TsaCouponService {
 	 * @author xyzp1539
 	 * @since 2021-01-18
 	 */
-	public ArrayList<CouponRefval> getCouponRefvalGoodsList(String cpnId , String cpnTarget) {
+	public ArrayList<CouponRefval> getCouponRefvalGoodsList(int cpnId , String cpnTarget) {
 		CouponRefval cpnRefval = new CouponRefval();
 		cpnRefval.setCpnId(cpnId);
 		cpnRefval.setCpnTarget(cpnTarget);
@@ -308,7 +316,7 @@ public class TsaCouponService {
 	 * @author xyzp1539
 	 * @since 2021-01-18
 	 */
-	public ArrayList<CouponRefval> getCouponRefvalSupplyCompList(String cpnId) {
+	public ArrayList<CouponRefval> getCouponRefvalSupplyCompList(int cpnId) {
 		CouponRefval cpnRefval = new CouponRefval();
 		cpnRefval.setCpnId(cpnId);
 		cpnRefval.setCpnTarget("G260_13");
@@ -322,7 +330,7 @@ public class TsaCouponService {
 	 * @author xyzp1539
 	 * @since 2021-01-18
 	 */
-	public ArrayList<Coupon> getCouponBurdenList(String cpnId) {
+	public ArrayList<Coupon> getCouponBurdenList(int cpnId) {
 		return couponDao.getCouponBurdenList(cpnId);
 	}
 
@@ -364,4 +372,15 @@ public class TsaCouponService {
 			couponDao.saveCouponCustPub(custPub);
 		}
 	}
+
+	/**
+	 * 랜덤쿠폰 생성 리스트 조회
+	 * @param
+	 * @return
+	 * @author xodud1202
+	 * @since 2021-01-26
+	 */
+	public ArrayList<CustCoupon> getRandomCouponInfo(int cpnId) {
+		return couponDao.getRandomCouponInfo(cpnId);
+	}
 }

+ 48 - 22
src/main/java/com/style24/admin/biz/service/TsaCustomerService.java

@@ -1,9 +1,10 @@
 package com.style24.admin.biz.service;
 
+import com.gagaframework.web.parameter.GagaMap;
 import com.style24.admin.biz.dao.TsaCustomerDao;
 import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.biz.dao.TscCustomerDao;
 import com.style24.core.biz.service.TscCustomerService;
+import com.style24.core.support.env.TscConstants;
 import com.style24.persistence.domain.Counsel;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.CustContactHst;
@@ -17,6 +18,7 @@ import com.style24.persistence.domain.Point;
 import com.style24.persistence.domain.Review;
 
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -44,7 +46,7 @@ public class TsaCustomerService {
 	 * @param customerSearch - 검색조건
 	 * @return Collection<Customer>
 	 * @author jsshin
-	 * @since 2020. 01. 12
+	 * @since 2021. 1. 12
 	 */
 	public Collection<Customer> getCustomerActiveList(CustomerSearch customerSearch) {
 		return customerDao.getCustomerActiveList(customerSearch);
@@ -55,25 +57,38 @@ public class TsaCustomerService {
 	 * @param custNo - 고객번호
 	 * @return Customer
 	 * @author jsshin
-	 * @since 2020. 01. 18
+	 * @since 2021. 1. 18
 	 */
 	public Customer getCustomerInfo(Integer custNo) {
-		return customerDao.getCustomerInfo(custNo);
+		Customer customer = new Customer();
+		customer.setCustNo(custNo);
+		customer.setCustStat(TscConstants.CustStat.ACTIVE.value());
+		return coreCustomerService.getCustomerInfo(customer);
 	}
 
 	/**
 	 * 회원정보 수정
 	 * @param customer - 고객정보
 	 * @author jsshin
-	 * @since 2020. 01. 20
+	 * @since 2021. 1. 20
 	 */
 	@Transactional("shopTxnManager")
 	public void saveCustomerInfo(Customer customer) {
 		Integer userNo = TsaSession.getInfo().getUserNo();
 		customer.setRegNo(userNo);
 		customer.setUpdNo(userNo);
+
 		// 고객 이력 생성
 		coreCustomerService.createCustomerHistory(customer);
+
+		// 마케팅수신동의 이력 화면단에서 수신 변경이 없으면 ''처리
+		if (StringUtils.isNotBlank(customer.getSmsAgreeYn())
+				|| StringUtils.isNotBlank(customer.getSmsAgreeYn())
+				|| StringUtils.isNotBlank(customer.getAppAgreeYn()) ){
+
+			coreCustomerService.createCustomerMarketHst(customer);
+		}
+
 		// 정보 수정
 		customerDao.updateCustomerInfo(customer);
 	}
@@ -82,7 +97,7 @@ public class TsaCustomerService {
 	 * 회원 비밀번호 수정
 	 * @param customer - 고객정보
 	 * @author jsshin
-	 * @since 2020. 01. 20
+	 * @since 2021. 1. 20
 	 */
 	@Transactional("shopTxnManager")
 	public void updateCustomerPassword(Customer customer) {
@@ -93,7 +108,7 @@ public class TsaCustomerService {
 	 * 회원 휴대전화번호 수정
 	 * @param customer - 고객정보
 	 * @author jsshin
-	 * @since 2020. 01. 25
+	 * @since 2021. 1. 25
 	 */
 	@Transactional("shopTxnManager")
 	public void updateCustomerCellphnno(Customer customer) {
@@ -104,12 +119,24 @@ public class TsaCustomerService {
 		customerDao.updateCustomerCellPhnno(customer);
 	}
 
+	/**
+	 * 회원 탈퇴처리
+	 * @param customer - 고객정보
+	 * @author jsshin
+	 * @since 2021. 1. 26
+	 */
+	@Transactional("shopTxnManager")
+	public GagaMap saveCustomerSecede(Customer customer) {
+		customer.setCustStat(TscConstants.CustStat.SECEDE.value());
+		return coreCustomerService.saveCustomerSecede(customer);
+	}
+
 	/**
 	 * 회원 주문내역
 	 * @param custNo - 고객번호
 	 * @return Collection<Order>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<Order> getCustomerOrderList(Integer custNo) {
 		return customerDao.getCustomerOrderList(custNo);
@@ -121,7 +148,7 @@ public class TsaCustomerService {
 	 * @param custNo - 고객번호
 	 * @return Collection<Delivery>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<Delivery> getCustomerDeliveryAddrList(Integer custNo) {
 		return customerDao.getCustomerDeliveryAddrList(custNo);
@@ -151,7 +178,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Collection<Coupon>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<Coupon> getCustomerCouponList(Integer custNo) {
 		return customerDao.getCustomerCouponList(custNo);
@@ -163,7 +190,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Point
 	 * @author jsshin
-	 * @since 2021. 01. 25
+	 * @since 2021. 1. 25
 	 */
 	public Point getCustomerPoint(Integer custNo){
 		return customerDao.getCustomerPoint(custNo);
@@ -175,7 +202,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Collection<Coupon>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<Point> getCustomerPointList(Integer custNo) {
 		return customerDao.getCustomerPointList(custNo);
@@ -187,7 +214,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Collection<GiftCard>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<GiftCard> getCustomerGiftCardList(Integer custNo) {
 		return customerDao.getCustomerGiftCardList(custNo);
@@ -199,7 +226,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Collection<Review>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<Review> getCustomerReviewList(Integer custNo) {
 		return customerDao.getCustomerReviewList(custNo);
@@ -211,7 +238,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Collection<Counsel>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<Counsel> getCustomerCounselList(Integer custNo) {
 		return customerDao.getCustomerCounselList(custNo);
@@ -223,7 +250,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Collection<Counsel>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<Counsel> getCustomerGoodsQnaList(Integer custNo) {
 		return customerDao.getCustomerGoodsQnaList(custNo);
@@ -235,7 +262,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Collection<Counsel>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<CustGrade> getCustomerChangeGradeList(Integer custNo) {
 		return customerDao.getCustomerChangeGradeList(custNo);
@@ -247,7 +274,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Collection<Counsel>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<CustContactHst> getCustomerContactList(Integer custNo) {
 		return customerDao.getCustomerContactList(custNo);
@@ -259,7 +286,7 @@ public class TsaCustomerService {
 	 * @param custContactHst -고객정보
 	 * @return void
 	 * @author jsshin
-	 * @since 2021. 01. 25
+	 * @since 2021. 1. 25
 	 */
 	@Transactional("shopTxnManager")
 	public void createCustomerContactHistory(CustContactHst custContactHst) {
@@ -276,7 +303,7 @@ public class TsaCustomerService {
 	 * @param customerSearch - 검색조건
 	 * @return Collection<Customer>
 	 * @author jsshin
-	 * @since 2020. 01. 14
+	 * @since 2020. 0. 14
 	 */
 	public Collection<Customer> getCustomerSecedeList(CustomerSearch customerSearch) {
 		return customerDao.getCustomerSecedeList(customerSearch);
@@ -287,12 +314,11 @@ public class TsaCustomerService {
 	 * @param customerSearch - 검색조건
 	 * @return Collection<Customer>
 	 * @author jsshin
-	 * @since 2020. 01. 14
+	 * @since 2020. 1. 14
 	 */
 	public Collection<Customer> getCustomerDormantList(CustomerSearch customerSearch) {
 		return customerDao.getCustomerDormantList(customerSearch);
 	}
 
 
-
 }

+ 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 진행 */
 }

+ 34 - 0
src/main/java/com/style24/admin/biz/web/TsaCustomerController.java

@@ -401,6 +401,7 @@ public class TsaCustomerController extends TsaBaseController {
 	@ResponseBody
 	public Customer getCustomerInfo(@PathVariable Integer custNo) {
 		TscSession.setAttribute("maskingYn", TsaSession.getInfo().getMaskingYn());
+
 		return customerService.getCustomerInfo(custNo);
 	}
 
@@ -433,6 +434,7 @@ public class TsaCustomerController extends TsaBaseController {
 		String tempPasswd = systemService.getTemporaryPassword(10);
 		log.info("tempPasswd  ====> {}", tempPasswd);
 
+		customer.setTempPasswdYn("Y"); // 임시비밀번호여부
 		customer.setPasswd(tempPasswd);
 		customer.setEncodedPasswd(passwordEncoder.encodeSha256(tempPasswd));
 		customer.setRegNo(TsaSession.getInfo().getRegNo());
@@ -646,6 +648,38 @@ public class TsaCustomerController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0005"));
 	}
 
+	/**
+	 * 회원탈퇴처리
+	 *
+	 * @param elementCustNo - 고객일련번호
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@GetMapping("/secede/popup/form")
+	public ModelAndView emailPopupForm( @RequestParam(value = "elementCustNo") String elementCustNo) {
+
+		ModelAndView mav = new ModelAndView();
+
+		// 고객일련번호
+		mav.addObject("elementCustNo", elementCustNo);
+
+		// 탈퇴 구분
+		mav.addObject("secedeRsnList", rendererService.getCommonCodeList("G102", "Y"));
+
+		mav.setViewName("customer/CustomerSecedePopupForm");
+
+		return mav;
+	}
+	@PostMapping("/secede/save")
+	@ResponseBody
+	public GagaMap saveCustomerSecede(@RequestBody Customer customer) {
+		Integer userNo = TsaSession.getInfo().getUserNo();
+		customer.setRegNo(userNo);
+		customer.setUpdNo(userNo);
+		return customerService.saveCustomerSecede(customer);
+	}
+
 	/**
 	 * 회원상세-주문내역목록
 	 *

+ 77 - 24
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;
@@ -322,7 +321,7 @@ public class TsaMarketingController extends TsaBaseController {
 	 */
 	@GetMapping("/coupon/popup/form")
 	@ResponseBody
-	public ModelAndView couponCreatePopup(@RequestParam(value = "cpnId") String cpnId) {
+	public ModelAndView couponCreatePopup(@RequestParam(value = "cpnId") int cpnId) {
 		ModelAndView mav = new ModelAndView();
 		String num = "";
 		String mode = "N";
@@ -369,6 +368,8 @@ public class TsaMarketingController extends TsaBaseController {
 		mav.addObject("hhList", hhList);
 		// 입점업체 조회
 		mav.addObject("ibSupplyCompList", rendererService.getSupplyCompanyList("", "N"));
+		// 할인 쿠폰 코드 조회
+		mav.addObject("dcCdList", rendererService.getCommonCodeList("G233", "Y"));
 		// 정상/이월 조회
 		mav.addObject("formalGbList", rendererService.getCommonCodeList("G009"));
 		// 카테고리 구분 조회
@@ -397,7 +398,7 @@ public class TsaMarketingController extends TsaBaseController {
 		mav.addObject("upperAfLinkCdList", rendererService.getCommonCodeList("G053"));
 
 		// 이미 쿠폰 아이디가 있으면 적용대상 조회
-		if (!StringUtils.isBlank(cpnId)) {
+		if (cpnId != 0) {
 			mode = "U";
 			issueCnt = couponService.getCouponIssueCnt(cpnId);
 			// 쿠폰상세조회
@@ -414,6 +415,8 @@ public class TsaMarketingController extends TsaBaseController {
 			mav.addObject("cpnDtlRefvalExceptGoodsList", couponService.getCouponRefvalGoodsList(cpnId, "G260_14"));
 			// 쿠폰 입점업체분담율 조회
 			mav.addObject("cpnDtlBurdenList", couponService.getCouponBurdenList(cpnId));
+			// 시리얼 및 난수 쿠폰 조회
+			mav.addObject("randomCpnList", couponService.getRandomCouponInfo(cpnId));
 		}
 
 		//issueCnt = 3;
@@ -437,7 +440,10 @@ public class TsaMarketingController extends TsaBaseController {
 	public GagaResponse saveCoupon(@RequestBody Coupon coupon) {
 		log.info("couponSave : {}", coupon);
 
-		couponService.saveCoupon(coupon);
+		String result = couponService.saveCoupon(coupon);
+		if(!"SUCCESS".equals(result)) {
+			return super.error(message.getMessage(result));
+		}
 
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
@@ -565,14 +571,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 +614,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 +631,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;
 	}
@@ -654,15 +661,40 @@ public class TsaMarketingController extends TsaBaseController {
 	 */
 	@PostMapping("/morebetter/save")
 	@ResponseBody
-	public GagaResponse saveMorebetterDetail(@RequestBody MoreBetter moreBetter){
-		try {
-			morebetterService.saveMoreBetterDetail(moreBetter);
+	public GagaMap saveMorebetterDetail(@RequestBody MoreBetter moreBetter){
+		String result = "";
+		GagaMap map = new GagaMap();
+
+		try{
+			MoreBetterGoods moreBetterGoods = new MoreBetterGoods();
+			moreBetterGoods.setMultiSupplyCompCd(moreBetter.getMultiSupplyCompCd());
+			moreBetterGoods.setMultiBrand(moreBetter.getMultiBrand());
+			moreBetterGoods.setMultiApplyGoods(moreBetter.getMultiApplyGoods());
+			moreBetterGoods.setMultiExceptGoods(moreBetter.getMultiExceptGoods());
+
+			// TMTB_GOODS_TEMP TABLE TRUNCATE -> 다른 다다에서 사용중인 상품 조회 -> INSERT
+			morebetterService.createMorebetterGoodsTemp(moreBetterGoods);
+			// 다른 다다에서 사용중인 상품 조회
+			Collection<MoreBetterGoods> duplicateGoodsList = morebetterService.getMorebetterDuplicateList(moreBetterGoods);
+
+			// SELECT -> 지금 내가 선택한 업체&브랜드 + 적용상품에 해당하는 상품 조회 MINUS TMTB_GOODS_TEMP 상품
+			// 조회 건수 있으면 -> 해당 상품코드 엑셀로 던져주기
+			if(duplicateGoodsList.size() > 0){
+				map.set("duplicateYn","Y");
+				//map.set("message", result);
+				map.set("duplicateGoodsList",duplicateGoodsList);
+			}else{
+				// 조회 건수 없으면 -> 저장으로 넘어감
+				morebetterService.saveMoreBetterDetail(moreBetter);
+				map.set("duplicateYn","N");
+				map.set("message", message.getMessage("SUCC_0001"));
+			}
 		} catch(Exception e) {
 			e.printStackTrace();
-			return super.error(message.getMessage("FAIL_0001"));
+			map.set("message", message.getMessage("FAIL_0001"));
+			return map;
 		}
-		return super.ok(message.getMessage("SUCC_0001"));
-
+		return map;
 	}
 
 	/**
@@ -754,6 +786,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 진행 */
 
 	/**

+ 65 - 47
src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java

@@ -60,7 +60,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 	private TscOrderRefundService coreOrderRefundService;
 	
 	/**
-	 * 취소요청 화면 (관리자)
+	 * 취소요청, 취소완료 통합 화면 (관리자)
 	 * 
 	 * @param ordNo - 주문번호
 	 * @param cncWait - 취소대기요청 구분
@@ -69,11 +69,16 @@ public class TsaOrderChangeController extends TsaBaseController {
 	 * @since 2020. 12. 22
 	 */
 	@GetMapping("/cncl/req/form")
-	public ModelAndView cnclReqForm(@RequestParam(value = "ordNo") int ordNo) {
+	public ModelAndView cnclReqForm(@RequestParam(value = "ordNo") int ordNo, @RequestParam(value = "ordChgSq") int ordChgSq) {
 
 		Order order = new Order();
 		ModelAndView mav = new ModelAndView();
 		order.setOrdNo(ordNo);
+		
+		// 2021.01.26 변경시퀀스가 있을때 담기
+		if (ordChgSq > 0) {
+			order.setOrdChgSq(ordChgSq);
+		}
 				
 		// 취소가능 주문상세상탭값 설정
 		String[] ordDtlStatArr = new String[4];
@@ -82,55 +87,30 @@ public class TsaOrderChangeController extends TsaBaseController {
 		ordDtlStatArr[2] = TscConstants.OrderDetailStat.GOODS_PREPARE.value();
 		ordDtlStatArr[3] = TscConstants.OrderDetailStat.DELIVERY_PREPARE.value();
 		order.setOrdDtlStatArr(ordDtlStatArr);
-
+		
+		// 2021.01.26 취소요청 화면, 취소요청정보확인 화면 합 
 		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");
+		mav.addObject("ordChgSq"					, ordChgSq);													// 주문변경번호
+		mav.addObject("orderChangeList"				, orderService.getOrderChangeList(order));						// 취소/반품/교환 요청 정보
 		
-		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 viewName = "";
 		
-		// 취소가능 주문상세상탭값 설정
-		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"						, ordChgSq);														// 주문번호
+		if (ordChgSq > 0) {
+			viewName = "order/CnclReqViewForm";	// 변경요청정보화면 (취소요청정보화면)
+		} else {
+			viewName = "order/CnclReqForm";		// 변경요청화면 (취소요청화면)
+		}
 
-		mav.setViewName("order/cnclReqViewForm");
+		mav.setViewName(viewName);
 		
 		return mav;
 	}
 	
 	/**
-	 * 취소신청 (ADMIN, NAPY, 외부몰) (배치)
+	 * 취소요청 (ADMIN, NAPY, 외부몰) (배치) (사용안함)
 	 * 
 	 * @param OrderChange - 주문취소신청정보
 	 * @return
@@ -178,15 +158,46 @@ public class TsaOrderChangeController extends TsaBaseController {
 		mav.set("chgerEmail"	, cnclReq.getChgerEmail());			// 변경자이메일주소
 		mav.set("chgerPhnno"	, cnclReq.getChgerPhnno());			// 변경자핸드폰번호
 		mav.set("chgerTelno"	, cnclReq.getChgerTelno());			// 변경자전화번호
-				
+		
+		mav.set("reqGbn"		, cnclReq.getReqGbn());				// 신청구분
+						
 		// 5. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL, TB_REFUND)
-		coreOrderChangeService.cnclReq(mav, userNo);
+		//coreOrderChangeService.cnclReq(mav, userNo);
+		coreOrderChangeService.cnclComplete(mav, userNo);
 		
 		return super.ok("성공");
 	}
 	
 	/**
-	 * 취소요청컨펌 (NAPY, 외부몰) (관리자)
+	 * 취소요청철회 (NAPY, 외부몰) (관리자)
+	 * @param OrderChange - 주문취소신청정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 01. 20
+	 */
+	@PostMapping("/cnclReqCancel")
+	@ResponseBody
+	public GagaResponse cnclReqCancel(@RequestBody OrderChange cnclReq) {
+		
+		if (cnclReq== null) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+		
+		// 1. 세션회원조회
+		int userNo = TsaSession.getInfo().getUserNo();
+		
+		GagaMap mav = new GagaMap();
+		mav.set("ordNo"			, cnclReq.getOrdNo());
+		mav.set("ordChgSq"		, cnclReq.getOrdChgSq());
+		
+		// 2.취소요청철회 
+		mav = coreOrderChangeService.cnclReqCancel(mav, userNo);
+		
+		return super.ok("성공");
+	}
+	
+	/**
+	 * 취소요청승인 (NAPY, 외부몰) (관리자)
 	 * @param OrderChange - 주문취소신청정보
 	 * @return
 	 * @author jsh77b
@@ -204,7 +215,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 	}
 	
 	/**
-	 * 취소완료 (관리자)
+	 * 취소 요청, 완료 통합 (관리자)
 	 * @param Collection<Order> - 주문취소신청목록
 	 * @return
 	 * @author jsh77b
@@ -214,12 +225,12 @@ public class TsaOrderChangeController extends TsaBaseController {
 	@ResponseBody
 	public GagaResponse cnclComplete(@RequestBody OrderChange cnclReq) {
 		
-		GagaMap mav = new GagaMap();
-		
 		if (cnclReq== null) {
 			throw new IllegalStateException(message.getMessage("FAIL_1001"));
 		}
 		
+		GagaMap mav = new GagaMap();
+		
 		List<Order> cnclReqList = cnclReq.getCancelReqList(); // 취소요청정보목록
 		
 		// To Do List
@@ -251,6 +262,8 @@ public class TsaOrderChangeController extends TsaBaseController {
 		mav.set("chgerEmail"	, cnclReq.getChgerEmail());			// 변경자이메일주소
 		mav.set("chgerPhnno"	, cnclReq.getChgerPhnno());			// 변경자핸드폰번호
 		mav.set("chgerTelno"	, cnclReq.getChgerTelno());			// 변경자전화번호
+		
+		mav.set("reqGbn"		, cnclReq.getReqGbn());				// 신청구분
 				
 		// 5. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL)
 		coreOrderChangeService.cnclComplete(mav, userNo);
@@ -522,9 +535,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;
 	}

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

@@ -17,7 +17,7 @@ import java.util.Collection;
 @Data
 public class Coupon extends TscBaseDomain {
     // TB_COUPON
-    private String  cpnId;					// 쿠폰ID
+    private int     cpnId;					// 쿠폰ID
     private String  cpnNm;					// 쿠폰명
     private String  siteCd;					// 사이트코드(공통코드G000)
     private String  afLinkCd;				// 제휴링크코드
@@ -56,6 +56,8 @@ public class Coupon extends TscBaseDomain {
     private String  payType;                // 결제수단
     private String  custJoinYn;             // 신규회원여부
     private String  afChannel;              // 제휴링크
+    private String  dcCdGb;                 // 할인코드유형 (공통코드G233)
+    private String  rdCpnNm;                // 랜덤쿠폰 사용키 (시리얼명 or 난수)
 
     // 그리드 파라미터
     private String  supplyCompList;         // 공급업체 리스트

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

@@ -13,7 +13,7 @@ import lombok.Data;
 @Data
 public class CouponBurden extends TscBaseDomain {
     // TB_COUPON_REFVAL
-    private String  cpnId;					// 쿠폰ID
+    private int  cpnId;					// 쿠폰ID
     private String  supplyCompCd;           // 공급업체코드
     private Integer burdenRate;             // 업체분담율
     private String  delYn;                  // 삭제여부

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

@@ -14,7 +14,7 @@ import lombok.Data;
 @Data
 public class CouponRefval extends TscBaseDomain {
     // TB_COUPON_REFVAL
-    private String  cpnId;					// 쿠폰ID
+    private int  cpnId;					    // 쿠폰ID
     private String  cpnTarget;              // 쿠폰대상구분(공통코드G260)
     private String  refVal;                 // 관련값(쿠폰대상이 "10:상품"일 때는 상품코드, "20:브랜드"일 때는 브랜드코드, "30:카테고리"일 때는 카테고리코드, "40:제외상품"일 때는 상품코드)
     private Integer cpnRefvalSq;            // 쿠폰대상일련번호

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

@@ -15,7 +15,7 @@ import org.codehaus.groovy.runtime.dgmimpl.arrays.IntegerArrayGetAtMetaMethod;
 public class CustCoupon extends TscBaseDomain {
     private Integer custCpnSq;              // 고객쿠폰일련번호
     private Integer custNo;                 // 고객번호
-    private String  cpnId;                  // 쿠폰아이디
+    private int     cpnId;                  // 쿠폰아이디
     private String  availStdt;              // 유효시작일시
     private String  availEddt;              // 유효종료일시
     private String  pubReason;              // 발행사유(공통코드G250)
@@ -23,6 +23,9 @@ public class CustCoupon extends TscBaseDomain {
     private String  usedDt;                 // 사용된일시
     private String  endAlimSendYn;          // 만료알림발송여부
     private String  useYn;                  // 사용여부
+    private String  rdCpnNm;                // 랜덤쿠폰 및 시리얼쿠폰 키
+    private String  custId;                 // 고객 아이디
+    private String  custNm;                 // 고객명
 
     // 그리드 컬럼
     private String  custList;

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

@@ -65,6 +65,26 @@ public class MoreBetter extends TscBaseDomain {
 	List<MoreBetterBurden> burdenList;
 	List<MoreBetterSection> sectionGbList;
 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiSupplyCompCd;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiBrand;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiApplyGoods;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiExceptGoods;
+
+	// 날짜+시간
+	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;

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

@@ -4,6 +4,8 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
 import lombok.Data;
 
+import java.util.List;
+
 
 /**
  * 품목 Domain
@@ -49,5 +51,13 @@ public class MoreBetterGoods extends TscBaseDomain {
 	private String[] multiBrand;
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] multiGoods;
+	private String[] multiApplyGoods;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiExceptGoods;
+/*
+	List<MoreBetterGoods> multiSupplyCompCd;
+	List<MoreBetterGoods> multiBrand;
+	List<MoreBetterGoods> multiGoods;
+	List<MoreBetterGoods> multiExceptGoods;*/
 }

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

@@ -166,7 +166,7 @@ public class Order extends TscBaseDomain {
 	private String delYn;
 	private String recipPhnno;
 	private String recipTelno;
-	private String recipZipNo;
+	private String recipZipcode;
 	private String recipBaseAddr;
 	private String recipDtlAddr;
 	private String ordEmail;
@@ -206,7 +206,7 @@ public class Order extends TscBaseDomain {
 	private String chgMemo;
 	private String chgerNm;
 	private String chgerPhnno;
-	private String chgerZipNo;
+	private String chgerZipcode;
 	private String chgerBaseAddr;
 	private String chgerDtlAddr;
 	private String wdInvoiceNo;

+ 150 - 46
src/main/java/com/style24/persistence/mybatis/shop/TsaCoupon.xml

@@ -106,9 +106,11 @@
 	<!-- 쿠폰 등록 -->
 	<insert id="couponInsert" parameterType="Coupon">
 		/* TsaCoupon.couponInsert*/
+		<selectKey keyProperty="cpnId" resultType="int" order="AFTER">
+			SELECT LAST_INSERT_ID()
+		</selectKey>
 		INSERT INTO TB_COUPON (
-			CPN_ID
-		  , CPN_NM
+		    CPN_NM
 		  , SITE_CD
 		  , AF_LINK_CD
 		  , USABLE_CUST_GB
@@ -128,6 +130,7 @@
 		  , TOT_PUB_LIMIT_QTY
 		  , ONE_PUB_QTY
 		  , DN_GB
+		  , DC_CD_GB
 		  , DOWN_STDT
 		  , DOWN_EDDT
 		  , BUY_LIMIT_AMT
@@ -150,8 +153,7 @@
 		  </if>
 		  , CUST_JOIN_YN
 		) VALUES (
-		    #{cpnId}
-		  , #{cpnNm}
+		    #{cpnNm}
 		  , #{siteCd}
 		  , #{afLinkCd}
 		  , #{usableCustGb}
@@ -180,6 +182,7 @@
 		  , #{totPubLimitQty}
 		  , #{onePubQty}
 		  , #{dnGb}
+		  , #{dcCdGb}
 		  , DATE_FORMAT(#{downStdt} , '%Y-%m-%d %H:%i:%s')
 		  , DATE_FORMAT(#{downEddt} , '%Y-%m-%d %H:%i:%s')
 		  , #{buyLimitAmt}
@@ -218,8 +221,7 @@
 		  </if>
 		  , #{custJoinYn}
 		) ON DUPLICATE KEY UPDATE
-		    CPN_ID = #{cpnId}
-		  ,	CPN_NM = #{cpnNm}
+		    CPN_NM = #{cpnNm}
 		  , SITE_CD = #{siteCd}
 		  , AF_LINK_CD = #{afLinkCd}
 		  , USABLE_CUST_GB = #{usableCustGb}
@@ -407,53 +409,61 @@
 	</select>
 
 	<!-- 쿠폰 상세 조회-->
-	<select id="getCouponDetail" parameterType="String" resultType="Coupon">
+	<select id="getCouponDetail" parameterType="int" resultType="Coupon">
 		/* TsaCoupon.getCouponDetail */
-		SELECT CPN_ID
-			 , CPN_NM
-			 , SITE_CD
-			 , AF_LINK_CD
-			 , USABLE_CUST_GB
-			 , USABLE_CUST_GRADE
-			 , CPN_TYPE
-			 , APPLY_SCOPE
-			 , DC_WAY
-			 , DC_PVAL
-			 , DC_MVAL
-			 , DC_AVAL
-			 , MAX_DC_AMT
-			 , PD_GB
-			 , AVAIL_STDT
-			 , AVAIL_EDDT
-			 , AVAIL_DAYS
-			 , CUST_PUB_LIMIT_QTY
-			 , TOT_PUB_LIMIT_QTY
-			 , ONE_PUB_QTY
-			 , DN_GB
-			 , DOWN_STDT
-			 , DOWN_EDDT
-			 , BUY_LIMIT_AMT
-			 , PLAN_SQ
-			 , REISSUANCE
-			 , CPN_STAT
-			 , END_ALIM_YN
-			 , FIRST_YN
-			 , DOWN_YN
-			 , CUST_JOIN_STDT
-			 , CUST_JOIN_EDDT
-			 , BUY_STDT
-			 , BUY_EDDT
-			 , PAY_TYPE
-			 , CUST_JOIN_YN
+		SELECT B.CPN_ID
+			 , B.CPN_NM
+			 , B.SITE_CD
+			 , B.AF_LINK_CD
+			 , B.USABLE_CUST_GB
+			 , B.USABLE_CUST_GRADE
+			 , B.CPN_TYPE
+			 , B.APPLY_SCOPE
+			 , B.DC_WAY
+			 , B.DC_PVAL
+			 , B.DC_MVAL
+			 , B.DC_AVAL
+			 , B.MAX_DC_AMT
+			 , B.PD_GB
+			 , B.AVAIL_STDT
+			 , B.AVAIL_EDDT
+			 , B.AVAIL_DAYS
+			 , B.CUST_PUB_LIMIT_QTY
+			 , B.TOT_PUB_LIMIT_QTY
+			 , B.ONE_PUB_QTY
+			 , B.DN_GB
+			 , B.DOWN_STDT
+			 , B.DOWN_EDDT
+			 , B.BUY_LIMIT_AMT
+			 , B.PLAN_SQ
+			 , B.REISSUANCE
+			 , B.CPN_STAT
+			 , B.END_ALIM_YN
+			 , B.FIRST_YN
+			 , B.DOWN_YN
+		     , B.DC_CD_GB
+			 , B.CUST_JOIN_STDT
+			 , B.CUST_JOIN_EDDT
+			 , B.BUY_STDT
+			 , B.BUY_EDDT
+			 , B.PAY_TYPE
+			 , B.CUST_JOIN_YN
 			 , (SELECT AF_CHANNEL
 			      FROM TB_AF_LINK A
 			     WHERE A.AF_LINK_CD = B.AF_LINK_CD) AS AF_CHANNEL
+			 , RC.RD_CPN_NM AS RD_CPN_NM
   		  FROM TB_COUPON B
-    	 WHERE CPN_ID = #{value}
+		  LEFT OUTER JOIN (SELECT CPN_ID
+		  						, RD_CPN_NM
+							 FROM TB_RANDOM_COUPON
+		    				GROUP BY CPN_ID, RD_CPN_NM) RC
+		    ON B.CPN_ID = RC.CPN_ID
+		   AND B.DC_CD_GB = 'G233_10'		<!-- 시리얼 유형일 경우에만 랜덤쿠폰 검색 검색 -->
+    	 WHERE B.CPN_ID = #{value}
 	</select>
 
 	<!-- 쿠폰 발급 개수 조회 -->
-	<select id="getCouponIssueCnt" parameterType="String" resultType="int">
+	<select id="getCouponIssueCnt" parameterType="int" resultType="int">
 		/* TsaCoupon.getCouponIssueCnt*/
 		SELECT COUNT(1)
 		  FROM TB_CUST_COUPON
@@ -526,7 +536,7 @@
 	</select>
 
 	<!-- 쿠폰 입점업체 분담율 조회-->
-	<select id="getCouponBurdenList" parameterType="String" resultType="CouponBurden">
+	<select id="getCouponBurdenList" parameterType="int" resultType="CouponBurden">
 		/* TsaCoupon.getCouponBurdenList */
 		SELECT SUPPLY_COMP_CD
 			 , BURDEN_RATE
@@ -606,4 +616,98 @@
 		   AND CUST_CPN_SQ = #{custCpnSq}
 	</update>
 
+	<!-- 특정 쿠폰 발급받은 회원 조회-->
+	<select id="getSerialOverlapCheck" parameterType="Coupon" resultType="int">
+		/* TsaCoupon.getSerialOverlapCheck : 중복 시리얼넘버 체크 */
+		WITH CHECK_DATA AS (
+		    SELECT C.CPN_ID
+				 , C.DOWN_STDT
+		    	 , C.DOWN_EDDT
+		    	 , C.AVAIL_STDT
+		    	 , C.AVAIL_EDDT
+		    	 , C.AVAIL_DAYS
+		    FROM TB_COUPON C
+			INNER JOIN (SELECT CPN_ID
+							 , RD_CPN_NM
+						FROM TB_RANDOM_COUPON
+						WHERE RD_CPN_NM = #{rdCpnNm}
+						GROUP BY CPN_ID, RD_CPN_NM ) RC
+		    ON C.CPN_ID = RC.CPN_ID
+		)
+		SELECT SUM(A.CNT) AS CNT
+		FROM ( SELECT COUNT(1) AS CNT		<!-- 다운 시작일이 겹치는 쿠폰번호 찾기 -->
+				FROM CHECK_DATA C
+				WHERE 1=1
+				AND C.DOWN_STDT >= STR_TO_DATE(#{downStdt}, '%Y-%m-%d %H:%i:%s')
+				AND C.DOWN_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.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
+	</select>
+
+	<!-- 고객 쿠폰 발행 -->
+	<insert id="createRandomCouponInfo" parameterType="Coupon">
+		/* TsaCoupon.createRandomCouponInfo */
+		INSERT INTO TB_RANDOM_COUPON (
+			  RD_CPN_NM
+			, CPN_ID
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+		) VALUES (
+			  #{rdCpnNm}
+			, #{cpnId}
+			, #{regNo}
+			, CURRENT_TIMESTAMP()
+			, #{updNo}
+			, CURRENT_TIMESTAMP()
+		)
+	</insert>
+
+	<!-- 특정 쿠폰 발급받은 회원 조회-->
+	<select id="getRandomCouponInfo" parameterType="int" resultType="CustCoupon">
+		/* TsaCoupon.getRandomCouponInfo */
+		SELECT RC.CPN_ID
+			 , RC.RD_CPN_NM
+		     , C.CUST_NO
+			 , C.CUST_ID
+			 , C.CUST_NM
+			 , DATE_FORMAT(CC.REG_DT, '%Y-%m-%d %H:%i:%s') AS REG_DT
+			 , DATE_FORMAT(CC.USED_DT, '%Y-%m-%d %H:%i:%s') AS USED_DT
+		FROM TB_RANDOM_COUPON RC
+		LEFT OUTER JOIN TB_CUSTOMER C
+		ON RC.CUST_NO = C.CUST_NO
+		LEFT OUTER JOIN TB_CUST_COUPON CC
+		ON RC.CPN_ID = CC.CPN_ID
+		AND C.CUST_NO = CC.CUST_NO
+		WHERE RC.CPN_ID = #{cpnId}
+	</select>
 </mapper>

+ 20 - 87
src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml

@@ -114,119 +114,52 @@
 		</if>
 	</select>
 
-	<!-- 회원기본정보 -->
-	<select id="getCustomerInfo" parameterType="Integer" resultType="Customer">
-		/* TsaCustomer.getCustomerInfo */
-		SELECT CUST_NO
-		     , CUST_ID
-		     , CUST_NM
-		     , PASSWD
-		     , BIRTH_YMD
-		     , BIRTH_SM
-		     , SEX_GB
-		     , CELL_PHNNO
-		     , APP_AGREE_YN
-		     , DATE_FORMAT(APP_AGREE_DT, '%Y%m%d%H%i%S') AS APP_AGREE_DT
-		     , SMS_AGREE_YN
-		     , DATE_FORMAT(SMS_AGREE_DT, '%Y%m%d%H%i%S') AS SMS_AGREE_DT
-		     , EMAIL
-		     , EMAIL_AGREE_YN
-		     , DATE_FORMAT(EMAIL_AGREE_DT, '%Y%m%d%H%i%S') AS EMAIL_AGREE_DT
-		     , HOME_ZIPCODE
-		     , HOME_BASE_ADDR
-		     , HOME_DTL_ADDR
-		     , SITE_CD
-		     , FRONT_GB
-		     , AF_LINK_CD
-		     , CUST_GB
-		     , CUST_GRADE
-		     , DATE_FORMAT(JOIN_DT, '%Y%m%d%H%i%S') AS JOIN_DT
-		     , FOREIGNER_YN
-		     , CUST_STAT
-		     , DATE_FORMAT(PASSWD_CHG_DT, '%Y%m%d%H%i%S') AS PASSWD_CHG_DT
-		     , TEMP_PASSWD_YN
-		     , DATE_FORMAT(LOGIN_LDT, '%Y%m%d%H%i%S') AS LOGIN_LDT
-		     , NV_JOIN_ID
-		     , NV_ACCESS_TOKEN
-		     , DATE_FORMAT(NV_JOIN_DT, '%Y%m%d%H%i%S') AS NV_JOIN_DT
-		     , KK_JOIN_ID
-		     , KK_ACCESS_TOKEN
-		     , DATE_FORMAT(KK_JOIN_DT, '%Y%m%d%H%i%S') AS KK_JOIN_DT
-		     , YS_JOIN_ID
-		     , YS_ACCESS_TOKEN
-		     , DATE_FORMAT(YS_JOIN_DT, '%Y%m%d%H%i%S') AS YS_JOIN_DT
-		     , CI
-		     , DATE_FORMAT(AUTH_DT, '%Y%m%d%H%i%S') AS AUTH_DT
-		     , MANAGED_RSN
-		     , MANAGED_DTL_RSN
-		     , DATE_FORMAT(MANAGED_DT, '%Y%m%d%H%i%S') AS MANAGED_DT
-		     , SECEDE_RSN
-		     , SECEDE_DTL_RSN
-		     , DATE_FORMAT(SECEDE_DT, '%Y%m%d%H%i%S') AS SECEDE_DT
-		     , FN_GET_USER_NM(REG_NO)              AS REG_NM
-		     , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
-		     , FN_GET_USER_NM(UPD_NO)              AS UPD_NM
-		     , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
-		FROM   TB_CUSTOMER
-		WHERE  CUST_NO = #{custNo}
-	</select>
-
 	<!--회원정보 수정-->
 	<update id="updateCustomerInfo" parameterType="Customer">
 		/* TsaCustomer.updateCustomerInfo */
 		UPDATE TB_CUSTOMER
 		<set>
-		    <if test="custGb != null and custGb != ''">
-		     CUST_GB = #{custGb},
-		    </if>
-		    <if test="custGrade != null and custGrade !=''">
-		     CUST_GRADE = #{custGrade},
-		    </if>
+		      CUST_GB = #{custGb}
+		    , CUST_GRADE = #{custGrade}
 		    <if test="emailAgreeYn != null and emailAgreeYn != ''">
-		     EMAIL_AGREE_DT = CASE WHEN EMAIL_AGREE_YN = #{emailAgreeYn}
-		                      THEN EMAIL_AGREE_DT
-		                      ELSE NOW()
-		                      END,
-		     EMAIL_AGREE_YN = #{emailAgreeYn},
+		    , EMAIL_AGREE_DT = NOW()
+		    , EMAIL_AGREE_YN = #{emailAgreeYn}
 		    </if>
 		    <if test="smsAgreeYn != null and smsAgreeYn != ''">
-		     SMS_AGREE_DT = CASE WHEN SMS_AGREE_YN = #{smsAgreeYn}
-		                    THEN SMS_AGREE_DT
-		                    ELSE NOW()
-		                    END,
-		     SMS_AGREE_YN = #{smsAgreeYn},
+		    , SMS_AGREE_DT = NOW()
+		    , SMS_AGREE_YN = #{smsAgreeYn}
 		    </if>
 		    <if test="homeZipcode != null and homeZipcode != ''">
-		     HOME_ZIPCODE = #{homeZipcode},
+		    , HOME_ZIPCODE = #{homeZipcode}
 		    </if>
 		    <if test="homeBaseAddr != null and homeBaseAddr != ''">
-		     HOME_BASE_ADDR = #{homeBaseAddr},
+		    , HOME_BASE_ADDR = #{homeBaseAddr}
 		    </if>
 		    <if test="homeDtlAddr != null and homeDtlAddr != ''">
-		     HOME_DTL_ADDR = #{homeDtlAddr},
+		    , HOME_DTL_ADDR = #{homeDtlAddr}
 		    </if>
 		    <if test="birthYmd != null and birthYmd != ''">
-		     BIRTH_YMD = REPLACE(#{birthYmd}, '-', ''),
+		    , BIRTH_YMD = REPLACE(#{birthYmd}, '-', '')
 		    </if>
 		    <if test="email != null and email != ''">
-		     EMAIL = #{email},
+		    , EMAIL = #{email}
 		    </if>
 		    <if test="managedRsn != null and managedRsn != ''">
-		     MANAGED_DT = CASE WHEN MANAGED_RSN = #{managedRsn}
+		    , MANAGED_DT = CASE WHEN MANAGED_RSN = #{managedRsn}
 		                       AND  MANAGED_DTL_RSN = #{managedDtlRsn}
 		                  THEN MANAGED_DT
 		                  ELSE NOW()
-		                  END,
-		     MANAGED_RSN = #{managedRsn},
-		     MANAGED_DTL_RSN = #{managedDtlRsn},
+		                  END
+		    , MANAGED_RSN = #{managedRsn}
+		    , MANAGED_DTL_RSN = #{managedDtlRsn}
 		    </if>
 		    <if test="managedRsn == null or managedRsn == ''">
-		     MANAGED_RSN = NULL,
-		     MANAGED_DTL_RSN =  NULL,
-		     MANAGED_DT = NULL,
+		    , MANAGED_RSN = NULL
+		    , MANAGED_DTL_RSN =  NULL
+		    , MANAGED_DT = NULL
 		    </if>
-		     UPD_NO = #{updNo},
-		     UPD_DT = NOW()
+		    , UPD_NO = #{updNo}
+		    , UPD_DT = NOW()
 		</set>
 		WHERE CUST_NO = #{custNo}
 	</update>

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

@@ -162,6 +162,7 @@
 		     , FV.USE_POINT
 		     , FV.ITEM_QTY
 		     , FV.LIMIT_QTY
+			 , FV.LEFT_QTY
 		     , FV.ITEM_CD
 			 , FG.PRODUCT_NO
 			 , FG.GOODS_NM

+ 91 - 27
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'
@@ -524,25 +570,43 @@
 				   SELECT  G.GOODS_CD
 					 FROM  TB_GOODS G
 					WHERE  1=1
-						<if test="multiSupplyCompCd != null and multiSupplyCompCd != ''">
+						<if test="multiSupplyCompCd != null and multiSupplyCompCd.length>0">
 							AND G.SUPPLY_COMP_CD IN
 							<foreach collection="multiSupplyCompCd" item="item" index="index"  open="(" close=")" separator=",">
 								#{item}
 							</foreach>
 						</if>
-						<if test="multiBrand != null and multiBrand != ''">
+						<if test="multiBrand != null and multiBrand.length>0">
 							AND G.BRAND_CD IN
 							<foreach collection="multiBrand" item="item" index="index"  open="(" close=")" separator=",">
 								#{item}
 							</foreach>
 						</if>
-						<if test="multiGoods != null and multiGoods != ''">
+						<if test="multiApplyGoods != null and multiApplyGoods.length>0">
 							OR G.GOODS_CD IN
-							<foreach collection="multiGoods" item="item" index="index"  open="(" close=")" separator=",">
+							<foreach collection="multiApplyGoods" item="item" index="index"  open="(" close=")" separator=",">
 								#{item}
 							</foreach>
 						</if>
 				)
+		   <if test="multiExceptGoods != null and multiExceptGoods.length>0">
+		   AND TMP.GOODS_CD NOT IN
+			   <foreach collection="multiExceptGoods" item="item" index="index"  open="(" close=")" separator=",">
+				   #{item}
+			   </foreach>
+		   </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>

+ 16 - 4
src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml

@@ -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 
@@ -1550,7 +1562,7 @@
 		     , RECIP_DTL_ADDR  	= #{recipDtlAddr}
 		     , DELV_MEMO       	= #{delvMemo}
 		     , UPD_NO          	= #{updNo}
-		     , UPD_DT          	= SYSDATE()
+		     , UPD_DT          	= NOW()
 		WHERE  DELV_ADDR_SQ 	= #{delvAddrSq}
 	</update>
 
@@ -1562,7 +1574,7 @@
 		     , CHGER_BASE_ADDR 	= #{chgerBaseAddr}
 		     , CHGER_DTL_ADDR  	= #{chgerDtlAddr}
 		     , UPD_NO          	= #{updNo}
-		     , UPD_DT          	= SYSDATE()
+		     , UPD_DT          	= NOW()
 		WHERE  ORD_CHG_SQ 		= #{ordChgSq}
 	</update>
 

+ 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

+ 60 - 52
src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html

@@ -92,14 +92,14 @@
 									</colgroup>
 									<tbody>
 									<tr>
-										<th class="dashR">회원구분<i class="star"></i></th>
+										<th class="dashR">회원구분<em class="required" title="필수"></em></th>
 										<td class="dashR">
 											<select id="custGb" name="custGb">
 												<option th:if="${custGbList}" th:each="oneData, status : ${custGbList}" th:value="${oneData.cd}"
 														th:text="|${oneData.cdNm}|"></option>
 											</select>
 										</td>
-										<th class="dashR">회원등급<i class="star"></i></th>
+										<th class="dashR">회원등급<em class="required" title="필수"></em></th>
 										<td class="dashR">
 											<select id="custGrade" name="custGrade">
 												<option th:if="${custGradeList}" th:each="oneData, status : ${custGradeList}" th:value="${oneData.cd}"
@@ -156,7 +156,7 @@
 										</td>
 									</tr>
 									<tr>
-										<th class="dashR">휴대전화번호<i class="star"></i></th>
+										<th class="dashR">휴대전화번호<em class="required" title="필수"></em></th>
 										<td class="dashR">
 											<input type="hidden" name="cellPhnno" data-valid-name="휴대전화"/>
 											<select id="firstNo" name="firstNo">
@@ -171,14 +171,14 @@
 											<button type="button" id="btnCustSendLms" class="btn btn-info btn-lg">LMS전송</button>
 											<button type="button" id="btnCustCrtfd" class="btn btn-info btn-lg">번호변경</button>
 										</td>
-										<th class="dashR">SMS수신여부<i class="star"></i></th>
+										<th class="dashR">SMS수신여부<em class="required" title="필수"></em></th>
 										<td class="dashR">
 											<label class="rdoBtn"><input type="radio" name="smsAgreeYn" value="Y"/>수신</label>
 											<label class="rdoBtn"><input type="radio" name="smsAgreeYn" value="N"/>미수신</label>
 										</td>
 									</tr>
 									<tr>
-										<th class="dashR">이메일<i class="star"></i></th>
+										<th class="dashR">이메일<em class="required" title="필수"></em></th>
 										<td class="dashR">
 											<input type="hidden" name="email" data-valid-name="이메일"/>
 											<input type="text" id="emailId" name="emailId" class="w300"/>
@@ -191,7 +191,7 @@
 											</select>
 											<button type="button" id="btnCustSendEmail" class="btn btn-info btn-lg" >이메일발송</button>
 										</td>
-										<th class="dashR">메일수신여부<i class="star"></i></th>
+										<th class="dashR">메일수신여부<em class="required" title="필수"></em></th>
 										<td class="dashR">
 											<label class="rdoBtn"><input type="radio" name="emailAgreeYn" value="Y"/>수신</label>
 											<label class="rdoBtn"><input type="radio" name="emailAgreeYn" value="N"/>미수신</label>
@@ -207,7 +207,12 @@
 										<th class="dashR">내외국인</th>
 										<td class="dashR" id="foreignerYn" name="foreignerYn"></td>
 										<th class="dashR">탈퇴여부</th>
-										<td class="dashR" id="secedeRsnYn" name="secedeRsnYn"></td>
+										<td class="dashR">
+											<spna id="secedeRsnYn" name="secedeRsnYn" ></spna>
+											<button type="button" id="btnCustSecede" class="btn btn-danger btn-lg marL5" style="display: none">
+												회원탈퇴
+											</button>
+										</td>
 									</tr>
 									<tr>
 										<th class="dashR">SNS가입유형</th>
@@ -258,14 +263,14 @@
 									</colgroup>
 									<tbody>
 									<tr>
-										<th>배송지명<i class="star"></i></th>
+										<th>배송지명<em class="required" title="필수"></em></th>
 										<td>
 											<input type="text" class="w200" name="delvAddrNm" maxlength="30" required="required" data-valid-name="배송지명"/>
 											<label class="chkBox">
 												<input type="checkbox" name="defaultYn" value="Y"/>기본
 											</label>
 										</td>
-										<th>수령인<i class="star"></i></th>
+										<th>수령인<em class="required" title="필수"></em></th>
 										<td>
 											<input type="text" class="w200" name="recipNm" maxlength="10" required="required" data-valid-name="수령인"/>
 										</td>
@@ -290,7 +295,7 @@
 											<input type="text" class="w100" name="telLastNo" maxlength="4" data-valid-type="numeric"
 												   data-valid-name="전화번호"/>
 										</td>
-										<th>휴대전화번호<i class="star"></i></th>
+										<th>휴대전화번호<em class="required" title="필수"></em></th>
 										<td colspan="4">
 											<input type="hidden" id="recipPhnno" name="recipPhnno"/>
 											<select class="w100" id="recipFirstNo" name="recipFirstNo">
@@ -305,7 +310,7 @@
 										</td>
 									</tr>
 									<tr>
-										<th>주소<i class="star"></i></th>
+										<th>주소<em class="required" title="필수"></em></th>
 										<td colspan="5">
 											<input type="text" id="recipZipcode" name="recipZipcode" class="w100" maxlength="10" required="required" data-valid-name="주소"/>
 											<button type="button" class="btn btn-info btn-lg" onclick="fnOpenDaumAddr('custAddrForm');">우편번호찾기</button>
@@ -454,7 +459,7 @@
 								</colgroup>
 								<tbody>
 								<tr>
-									<th>접촉유형<i class="star"></i></th>
+									<th>접촉유형<em class="required" title="필수"></em></th>
 									<td>
 										<select name="contactType" class="w150" required="required" data-valid-type="select" data-valid-name="접촉유형">
 											<option value="">[선택]</option>
@@ -462,7 +467,7 @@
 													th:text="${oneData.cdNm}"></option>
 										</select>
 									</td>
-									<th>접촉방법<i class="star"></i></th>
+									<th>접촉방법<em class="required" title="필수"></em></th>
 									<td>
 										<select name="contactMethod" class="w150" required="required" data-valid-type="select" data-valid-name="접촉방법">
 											<option value="">[선택]</option>
@@ -470,7 +475,7 @@
 													th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
 										</select>
 									</td>
-									<th>내용<i class="star"></i></th>
+									<th>내용<em class="required" title="필수"></em></th>
 									<td>
 										<textarea class="textareaR2 w600" name="contactContents" required="required" data-valid-name="내용"></textarea>
 										<button type="button" id="btnSaveContact" class="btn btn-success btn-lg">저장</button>
@@ -529,6 +534,7 @@
 	const contactTypeList = gagajf.convertToArray([[${contactTypeList}]]);			//회원접촉유형
 	const contactMethodList = gagajf.convertToArray([[${contactMethodList}]]);		//회원접촉방법
 	const genderGbList = gagajf.convertToArray([[${genderGbList}]]);				// 성별
+	let orgData;
 
 	//구매내역 그리드
 	const columnOrderDefs = [
@@ -948,35 +954,61 @@
 
 	});
 
+	$('#btnCustSecede').on('click', function () {
+		let custNo = $('#custInfoForm input[name=custNo]').val();
+		if (gagajf.isNull(custNo)) {
+			mcxDialog.alert("탈퇴시킬 회원번호가 없습니다.");
+			return;
+		}
+
+		let elementCustNo ='#custInfoForm input[name=custNo]';
+
+		const actionUrl = '/customer/secede/popup/form?elementCustNo='+ encodeURIComponent(elementCustNo)
+
+		cfnOpenModalPopup(actionUrl, 'popupCustSecedeForm');
+	});
+
+
 	// 기본정보 - 저장버튼
 	$('#btnCustInfoSave').on('click', function () {
-		let custInfoFrom = '#custInfoForm';
 
 		//휴대폰번호
-		if (!fnCheckValidationPhnno(custInfoFrom))
+		if (!fnCheckValidationPhnno('#custInfoForm'))
 			return false;
 
 		//이메일
-		if (!fnCheckValidationEmail(custInfoFrom))
+		if (!fnCheckValidationEmail('#custInfoForm'))
 			return false;
 
-		let managedRsn = $('#managedRsn').val();
-		let	managedDtlRsn = $('#managedDtlRsn').val();
+		let customer = $('#custInfoForm').serializeObject();
 
-		if (!gagajf.isNull(managedRsn) && gagajf.isNull(managedDtlRsn)) {
+		if (!gagajf.isNull(customer.managedRsn) && gagajf.isNull(customer.managedDtlRsn)) {
 			mcxDialog.alert("관리대상 지정 사유를 입력해주세요");
 			return;
 		}
 
+		// 데이터 변경 없으면 공배처리
+		if (customer.emailAgreeYn === orgData.emailAgreeYn) {
+			customer.emailAgreeYn = '';
+		}
+		// 데이터 변경 없으면 공배처리
+		if (customer.smsAgreeYn === orgData.smsAgreeYn) {
+			customer.smsAgreeYn = '';
+		}
+
+		// 마케팅 수신여부가 기존하고 바꼈는지 확인
+
+
 		mcxDialog.confirm("기본정보를 수정 하시겠습니까?", {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
 			sureBtnClick: function () {
-				let jsonData = JSON.stringify($(custInfoFrom).serializeObject());
+				let jsonData = JSON.stringify(customer);
 				//console.log(jsonData);
 				gagajf.ajaxJsonSubmit('/customer/info/save', jsonData, fnSearchCustInfo);
 			}
 		});
+
 	});
 
 	// 배송지정보 - 신규버튼
@@ -1159,8 +1191,7 @@
 					let foreignerYn = data.foreignerYn === 'Y' ? '외국인' : '내국인';
 					$('#foreignerYn').text(foreignerYn);
 
-					let secedeRsnYn = fnGetSecedeRsnYn(data.custStat, data.secedeRsn);
-					$('#secedeRsnYn').html(secedeRsnYn);
+					fnGetSecedeRsnYn(data.custStat, data.secedeRsn);	// 탈퇴여부
 
 					let snsType = fnGetSnsType(data.nvJoinId, data.kkJoinId, data.ysJoinId);
 					$('#snsType').text(snsType);
@@ -1176,6 +1207,8 @@
 					fnDisplayCellPhnno(data.maskingCellPhnno);		// 핸드폰
 					fnDisplayManaged(data.managedRsn);				// 관리대상
 
+					orgData = data;									// 기존 데이터
+
 				}
 			});
 	};
@@ -1313,30 +1346,6 @@
 	};
 
 
-	var fnCustomerSecede = function () {
-
-		if (gagajf.isNull(custNo)) {
-			mcxDialog.alert("탈퇴시킬 회원번호가 없습니다.");
-			return;
-		}
-
-		const actionUrl = "/customer/info/secede/form";
-		let paramsStr = "?custNo=" + custNo;
-		paramsStr += "&callBackFn=" + 'fnCustomerNotUseAfter';
-
-		cfnOpenModalPopup(actionUrl + paramsStr, 'popupCustSecede');
-	};
-
-	var fnCustomerNotUseAfter = function () {
-
-		if (!gagajf.isNull(fnSearch) && typeof fnSearch == "function") {
-			fnSearch();
-		}
-
-		uifnPopupClose('popupCustomerDetail');
-
-	};
-
 	// 관리대상
 	var fnDisplayManaged = function (managedRsn) {
 		const $managedRsnNm = $('#managedRsnNm');
@@ -1357,13 +1366,12 @@
 
 	// 탈퇴여부
 	var fnGetSecedeRsnYn = function (custStat, secedeRsn) {
+		const activeCustomer = 'G104_10';
 		let secedeRsnYn = gagajf.isNull(secedeRsn) ? '아니요' : '예';
-		if (custStat === '10') {
-			secedeRsnYn += '<button type="button" class="btn btn-danger btn-lg marL5" onClick="fnCustomerSecede();">';
-			secedeRsnYn += ' 회원탈퇴';
-			secedeRsnYn += '</button>';
+		$('#secedeRsnYn').text(secedeRsnYn);
+		if (custStat === activeCustomer) {
+			$('#btnCustSecede').show();
 		}
-		return secedeRsnYn;
 	}
 
 	// 휴대전화번호

+ 122 - 0
src/main/webapp/WEB-INF/views/customer/CustomerSecedePopupForm.html

@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CustomerSecedePopupForm.html
+ * @desc    : 회원탈퇴처리 화면 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.26   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="800">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong>회원탈퇴처리</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupCustSecedeForm')"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<div class="panelStyle">
+				<form id="custSecedeForm" name="custSecedeForm">
+					<input type="hidden" name="custNo"/>
+					<table class="frmStyle">
+						<colgroup>
+							<col style="width:10%;"/>
+							<col style="width:20%;"/>
+							<col style="width:10%;"/>
+							<col style="width:15%;"/>
+							<col style="width:10%;"/>
+							<col style="width:20%;"/>
+							<col/>
+						</colgroup>
+						<tbody>
+						<tr>
+							<th class="dashR">탈퇴사유</th>
+							<td class="dashR" colspan="5">
+								<select name="secedeRsn" > <!-- 탈퇴사유 (공통코드G102) -->
+									<option value="">전체</option>
+									<option th:if="${secedeRsnList}" th:each="oneData, status : ${secedeRsnList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<th class="dashR">탈퇴 상세 사유</th>
+							<td class="dashR" colspan="5">
+								<input type="text" class="w600" id="secedeDtlRsn" name="secedeDtlRsn" />
+							</td>
+						</tr>
+						</tbody>
+					</table>
+				</form>
+			</div>
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" id="btnSaveSecede" class="btn btn-success btn-lg">탈퇴처리</button>
+				</li>
+			</ul>
+		</div>
+		<!-- //CONTENT -->
+	</div>
+</div>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	const elementCustNo = [[${elementCustNo}]];
+
+	// 회원탈퇴
+	$("#btnSaveSecede").on("click",function() {
+		let custSecedeForm = $('#custSecedeForm').serializeObject();
+
+		if(gagajf.isNull(custSecedeForm.secedeRsn)){
+			mcxDialog.alert("탈퇴 사유를 선택해주세요.");
+			return;
+		}
+
+		mcxDialog.confirm('회원 탈퇴를 진행하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				gagajf.ajaxFormSubmit('/customer/secede/save', '#custSecedeForm', fnSaveCall);
+			}
+		});
+
+	});
+
+	var fnSaveCall = function (data) {
+		console.log('typeof', typeof data.isSuccess);
+		if (data.isSuccess) {
+			mcxDialog.alertC(data.resultMessage, {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					uifnPopupClose('popupCustSecedeForm');
+					uifnPopupClose('popupCustomerDetail');
+				}
+			});
+		} else {
+			mcxDialog.alert(data.resultMessage);
+			return;
+		}
+	}
+
+	var fnInitDataSet = function () {
+		let custNo = $(elementCustNo).val();
+		if(!gagajf.isNull(custNo)) {
+			$('#custSecedeForm input[name=custNo]').val(custNo);
+		}
+	}
+
+	$(document).ready(function() {
+
+		fnInitDataSet();
+
+	});
+	/*]]>*/
+</script>
+</html>

+ 132 - 42
src/main/webapp/WEB-INF/views/marketing/CouponPopupForm.html

@@ -28,7 +28,8 @@
 				<input type="hidden" name="exceptGoodsList" id="excepGoodsList">
 				<input type="hidden" name="burdenList" id="burdenList">
 				<input type="hidden" name="cateList" id="cateList">
-				<input type="hidden" name="cpnId2" id="cpnId2" th:if="${cpnDetail}" th:value="${cpnDetail.cpnId}">
+				<input type="hidden" name="rdCpnNm" id="rdCpnNm">
+				<input type="hidden" name="cpnId" id="cpnId" th:if="${cpnDetail}" th:value="${cpnDetail.cpnId}">
 
 				<div class="tabs">
 					<div class="tabsNav">
@@ -36,6 +37,7 @@
 							<li class="on"><a href="#coupontab1">기본정보</a></li>
 							<li><a href="#coupontab2">적용대상</a></li>
 							<li><a href="#coupontab3">입점업체분담율</a></li>
+							<li class="randomCpnTab" style="display:none;"><a href="#coupontab4">시리얼및난수</a></li>
 						</ul>
 					</div>
 					<ul class="tabsCont">
@@ -49,14 +51,10 @@
 										<col style="width:40%;">
 									</colgroup>
 									<tbody>
-										<tr>
-											<th>쿠폰번호<em class="required" title="필수"></em></th>
+										<tr th:if="${cpnDetail}">
+											<th>쿠폰번호</th>
 											<td colspan="5">
-												<input type="hidden" name="copyCpnId" maxlength="50" value="">
-												<input type="text" name="cpnId" id="cpnId" maxlength="50"  style="width:70%;" disabled="true" readonly="readonly" placeholder="자동생성" data-valid-name="쿠폰번호">
-												<label class="chkBox checked" onclick="clickCreateChk(this);">
-													<input type="checkbox" name="cpnCreateType" value="true" class="type-check" checked />쿠폰번호 자동생성
-												</label>
+												<span th:if="${cpnDetail}" th:text="${cpnDetail.cpnId}"></span>
 											</td>
 										</tr>
 										<tr>
@@ -72,6 +70,27 @@
 												<label class="rdoBtn" th:if="${cpnTypeList}" th:each="oneData, status : ${cpnTypeList}"> <input type="radio" name="rdoCpnType"  th:text="${oneData.cdNm}" th:value="${oneData.cd}"/></label>
 											</td>
 										</tr>
+										<tr class="dcCdGb" style="display:none;">
+											<th>할인쿠폰유형<em class="required" title="필수"></em></th>
+											<td class="normalCol">
+												<input type="hidden" id="dcCd" required="required"  data-valid-name="할인쿠폰유형">
+												<label class="rdoBtn" th:if="${dcCdList}" th:each="oneData, status : ${dcCdList}"> <input type="radio" name="dcCdGb"  th:text="${oneData.cdNm}" th:value="${oneData.cd}"/></label>
+											</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">
+											</td>
+										</tr>
+										<tr class="serialCpnArea" style="display:none;">
+											<th>시리얼명<em class="required" title="필수"></em></th>
+											<td>
+												<input type="text" name="serialCpnNm" class="w300" required="required" data-valid-name="시리얼쿠폰키워드">
+											</td>
+											<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>
+										</tr>
 										<tr>
 											<th>사용가능고객구분<em class="required" title="필수"></em></th>
 											<td>
@@ -247,8 +266,8 @@
 													<option value="N" selected="selected">N</option>
 												</select>
 											</td>
-											<th>총발행제한수량<em class="required" title="필수"></em></th>
-											<td>
+											<th class="dcCdCheck">총발행제한수량<em class="required" title="필수"></em></th>
+											<td class="dcCdCheck">
 												<input type="text" class="w200" name="totPubLimitQty" id="totPubLimitQty" value="0" required="required" data-valid-name="총발행제한수량" data-valid-type="numeric" style="text-align: right;">개<span class="cRed" id="totPubLimitQtySpan"> *제한없음</span>
 											</td>
 										</tr>
@@ -275,7 +294,7 @@
 												</select>
 											</td>
 										</tr>
-										<tr>
+										<tr class="dcCdCheck">
 											<th>1인당발행제한수량<em class="required" title="필수"></em></th>
 											<td>
 												<input type="text" class="w200" name="custPubLimitQty" id="custPubLimitQty" value="0" required="required" data-valid-name="1인당발행제한수량" data-valid-type="numeric" style="text-align: right;">개<span class="cRed" id="custPubLimitQtySpan"> *제한없음</span>
@@ -325,7 +344,7 @@
 									</tbody>
 								</table>
 								<div class="mdPopBtnB aR">
-									<button type="button" class="btn btn-info btn-lg" onclick="fnCustomerIssuePopUp();" th:if="${mode == 'U'}">쿠폰발행</button>
+									<button type="button" class="btn btn-info btn-lg" onclick="fnCustomerIssuePopUp();" th:if="${mode == 'U' && cpnDetail.dcCdGb == 'G233_00'}">쿠폰발행</button>  <!-- 난수유형과 시리얼 유형에서는 쿠폰발행기능 X -->
 									<button type="button" class="btn btn-info btn-lg" onclick="fnCouponCreate();" th:if="${mode == 'N'}">등록</button>
 									<button type="button" class="btn btn-info btn-lg" onclick="fnCouponUpdate();" th:if="${mode == 'U'}">수정</button>
 								</div>
@@ -431,12 +450,19 @@
 										<button type="button" class="btn btn-danger btn-lg" id="btnDelRow">행삭제</button>
 									</li>
 								</ul>
-
 								<div id="inComGridList" style="width: 100%; height: 570px" class="ag-theme-balham"></div>
-
 							</div>
 						</li>
 						<!-- 입점업체분담끝-->
+						<!-- 난수 및 네임쿠폰 설정 -->
+						<li class="tab" id="coupontab4">
+							<div class="panelStyle">
+								<span>
+									<div id="randomCpnList" style="width: 100%; height: 500px" class="ag-theme-balham"></div>
+								</span>
+							</div>
+						</li>
+						<!-- 난수 및 네임쿠폰 설정-->
 					</ul>
 				</div>
 			</form>
@@ -454,6 +480,7 @@
 	var cpnDtlRefvalBrandList = [[${cpnDtlRefvalBrandList}]];
 	var cpnDtlRefvalExceptGoodsList = [[${cpnDtlRefvalExceptGoodsList}]];
 	var cpnDtlBurdenList = [[${cpnDtlBurdenList}]];
+	var randomCpnList = [[${randomCpnList}]];
 	var issueCnt = [[${issueCnt}]];
 
 	// 공통코드 리스트
@@ -551,12 +578,23 @@
 		{ headerName: "쿠폰대상일련번호"  , field: "cpnRefvalSq" , width: 120 , cellClass: 'text-center' , hide:true}
 	];
 
+	// ag-grid 시리얼 및 난수 리스트
+	var randomCouponDefs = [
+		{ headerName : "생성쿠폰키워드" , field: "rdCpnNm" , width:150, cellClass: 'text-center'} ,
+		{ headerName: "지급고객번호" , field: "custNm" , width:150, cellClass: 'text-center'},
+		{ headerName: "고객아이디" , field: "custId" , width:150, cellClass: 'text-center'},
+		{ headerName: "고객명" , field: "custNm" , width:150, cellClass: 'text-center'},
+		{ headerName: "지급일" , field: "regDt" , width:150, cellClass: 'text-center'},
+		{ headerName: "쿠폰사용일" , field: "usedDt" , width:150, cellClass: 'text-center'}
+	];
+
 	var inComGridOptions = gagaAgGrid.getGridOptions(columnDefs);
 	var cateGridOptions = gagaAgGrid.getGridOptions(cateSelColumnDefs);
 	var goodsGridOptions = gagaAgGrid.getGridOptions(goodsSelColumnDefs);
 	var brandGridOptions = gagaAgGrid.getGridOptions(brandSelColumnDefs);
 	var supplyGridOptions = gagaAgGrid.getGridOptions(supplyColumnDefs);
 	var excepGoodsGridOptions = gagaAgGrid.getGridOptions(excepGoodsColumnDefs);
+	var randomCouponGridOptions = gagaAgGrid.getGridOptions(randomCouponDefs);
 
 	inComGridOptions.defaultColDef.editable = true;
 	inComGridOptions.rowSelection = "multiple";
@@ -727,16 +765,42 @@
 
 		// 주문서 쿠폰 선택시 결제수단 노출
 		if(radioValue == 'G230_20') {
-			$('.payTypeTr').css('display' , '');
+			$('#CouponForm .payTypeTr').show();
 			$('#CouponForm #payType').attr('required' , true);
+			$("#CouponForm .dcCdGb").show();		// 할인쿠폰유형 노출
 		} else {
-			$('.payTypeTr').css('display' , 'none');
+			$('#CouponForm .payTypeTr').hide();
 			$('#CouponForm #payType').attr('required' , false );
+			$("#CouponForm .dcCdGb").hide();		// 할인쿠폰유형 숨김
+			$("#CouponForm input:radio[name='dcCdGb']:radio[value='G233_00']").prop('checked', true);		// 주문서 쿠폰이 아닐 경우 일반 쿠폰으로 설정
 		}
 
 		$('#CouponForm #cpnType').val(radioValue);
 	});
 
+	// 할인 쿠폰 유형 변경
+	$("#CouponForm input[name=dcCdGb]").bind('click change', function () {
+		if(this.value == "G233_00") {			// 일반 유형
+			$("#CouponForm .dcCdCheck").show();
+			$("#CouponForm .serialCpnArea").hide();
+			$("#CouponForm .randomCpnArea").hide();
+			$("#CouponForm #custJoinYn").parent().attr("colspan", "");
+			$("#CouponForm .normalCol").attr("colspan", "5");
+		} else {
+			if(this.value == "G233_10") {		// 시리얼 유형
+				$("#CouponForm .serialCpnArea").show();
+				$("#CouponForm .randomCpnArea").hide();
+				$("#CouponForm .normalCol").attr("colspan", "5");
+			} else {							// 난수 유형
+				$("#CouponForm .serialCpnArea").hide();
+				$("#CouponForm .randomCpnArea").show();
+				$("#CouponForm .normalCol").attr("colspan", "");
+			}
+			$("#CouponForm .dcCdCheck").hide();								// 총발행제한수량, 1회발행수량, 1인당발행제한수량 숨김
+			$("#CouponForm #custJoinYn").parent().attr("colspan", "5");		// 총발행제한 수량을 없애면서 신규회원여부 colspan 수정
+		}
+	});
+
 	// 적용대상 - 브랜드 추가 버튼시
 	$('#btnBrandAdd').on('click' , function(){
 		cfnOpenBrandListPopup("fnSetPopupBrandInfo", "M");
@@ -1105,31 +1169,6 @@
 		inComGridOptions.api.updateRowData({remove:gagaAgGrid.selectedRowData(inComGridOptions)});
 	});
 
-
-
-	// 쿠폰번호 자동생성 클릭시
-	function clickCreateChk(){
-		var flag = $('#CouponForm input[name=cpnCreateType]').prop("checked");
-		// 발급받은 이력이 있으면 수정 안됨
-		if(issueCnt > 0 ) {
-			return false;
-		}
-
-		if(!flag) {
-			$("#CouponForm input[name=cpnId]").prop("disabled", true);
-			$("#CouponForm input[name=cpnId]").attr("required", false);
-			$("#CouponForm input[name=cpnId]").attr("readonly", true);
-			$("#CouponForm input[name=cpnId]").attr("placeholder", "자동생성");
-			$('#CouponForm input[name=cpnCreateType]').prop("checked" , false);
-		} else{
-			$("#CouponForm input[name=cpnId]").prop("disabled", false);
-			$("#CouponForm input[name=cpnId]").attr("required", true);
-			$("#CouponForm input[name=cpnId]").attr("placeholder", "");
-			$("#CouponForm input[name=cpnId]").attr("readonly", false);
-			$('#CouponForm input[name=cpnCreateType]').prop("checked" , true);
-		}
-	}
-
 	// 제휴링크채널 수정 (제휴링크가 꼭필요한지 확인필요)
 	function fnChangeAfLinkCdList(){
 		var actionUrl = "/business/aflink/list" + '?' + $('#afChannel').serialize();
@@ -1180,6 +1219,19 @@
 		// 신규회원기간 세팅
 		$('#CouponForm #custJoinStdt').val($('#CouponForm #custJoinStDay').val() + " " + $('#CouponForm #custJoinStHH').val() + ":" + $('#CouponForm #custJoinStMM').val() + ":00");
 		$('#CouponForm #custJoinEddt').val($('#CouponForm #custJoinEdDay').val() + " " + $('#CouponForm #custJoinEdHH').val() + ":" + $('#CouponForm #custJoinEdMM').val() + ":59");
+
+		// 할인쿠폰 유형에 따른 총 발행수량 수정 (주문서 쿠폰이고 난수쿠폰일 경우)
+		if($('#CouponForm #cpnType').val() == "G230_20" && $('#CouponForm input:radio[name="dcCdGb"]:checked').val() == "G233_20") {
+			$('#CouponForm input[name="totPubLimitQty"]').val($('#CouponForm input[name="randomCpnQty"]').val());	// 총 발행수량 난수 생성수량으로 변경
+			$('#CouponForm input[name="custPubLimitQty"]').val(1);		// 1인당 발행제한수량 1개 고정
+			$('#CouponForm input[name="onePubQty"]').val(1);			// 1회발행수량 1개 고정
+		} else if ($('#CouponForm #cpnType').val() == "G230_20" && $('#CouponForm input:radio[name="dcCdGb"]:checked').val() == "G233_10") {		// 주문서 쿠폰이고 시리얼 유형일 경우
+			$('#CouponForm input[name="rdCpnNm"]').val($('#CouponForm input[name="serialCpnNm"]').val());			// 시리얼유형쿠폰명 저장
+			$('#CouponForm input[name="totPubLimitQty"]').val($('#CouponForm input[name="serialCpnQty"]').val());	// 총 발행수량 랜덤쿠폰발급수량으로 변경
+			$('#CouponForm input[name="custPubLimitQty"]').val(1);		// 1인당 발행제한수량 1개 고정
+			$('#CouponForm input[name="onePubQty"]').val(1);			// 1회발행수량 1개 고정
+		}
+
 		// 적용대상 - 공급처 그리드 전체값 세팅
 		var supplyAllData = gagaAgGrid.getAllRowData(supplyGridOptions);
 		var jsonSupplyCompData = JSON.stringify(supplyAllData);
@@ -1214,10 +1266,12 @@
 		gagaAgGrid.createGrid('supplyGridList', supplyGridOptions);
 		gagaAgGrid.createGrid('goodsGridList', goodsGridOptions);
 		gagaAgGrid.createGrid('excepGoodsGridList', excepGoodsGridOptions);
+		gagaAgGrid.createGrid('randomCpnList', randomCouponGridOptions);
 
 		// 초기화시 데이터 세팅
 		if (mode == "N") {
 			$('input[name=rdoCpnType]').eq(0).attr("checked", true);
+			$('input[name=dcCdGb]').eq(0).attr("checked", true);
 			$('input[name=rdoDcWay]').eq(0).attr("checked", true);
 			$('input[name=rdoApplyScope]').eq(0).attr("checked", true)
 			$('#CouponForm #availEdHH option:last').attr("selected", "selected");
@@ -1229,6 +1283,8 @@
 			$('#buyEdHH option:last').attr("selected", "selected");
 			$('#buyEdMM option:last').attr("selected", "selected");
 			$("#CouponForm #afChannel option:first").attr("selected" , "selected");
+			$("#CouponForm .normalCol").attr("colspan", "5");
+			$("#CouponForm .randomCpnArea").hide();
 		} else {
 			// 수정모드시 그리드 세팅
 			inComGridOptions.api.setRowData(cpnDtlBurdenList);
@@ -1237,6 +1293,7 @@
 			excepGoodsGridOptions.api.setRowData(cpnDtlRefvalExceptGoodsList);
 			brandGridOptions.api.setRowData(cpnDtlRefvalBrandList);
 			cateGridOptions.api.setRowData(cpnDtlRefvalCateList);
+			randomCouponGridOptions.api.setRowData(randomCpnList);
 			// 기본정보 세팅
 			$("#CouponForm input:radio[name='rdoDcWay']:radio[value=" + cpnDetail.dcWay + "]").prop('checked', true);
 			$("#CouponForm input:radio[name='rdoCpnType']:radio[value=" + cpnDetail.cpnType + "]").prop('checked', true);
@@ -1264,6 +1321,40 @@
 			$("#CouponForm #buyLimitAmt").val(cpnDetail.buyLimitAmt);
 			$("#CouponForm #cpnId").val(cpnDetail.cpnId);
 
+			// 한번 저장되면 쿠폰유형, 할인쿠폰유형, 난수 생성수량, 시리얼명, 시리얼쿠폰발급수량 수정 불가 처리
+			$("#CouponForm input:radio[name='rdoCpnType']").attr('readonly', true);
+			$("#CouponForm input:radio[name='rdoCpnType']").prop('disabled', true);
+			$("#CouponForm input:radio[name='rdoCpnType']").parent().prop('disabled', true);
+			$("#CouponForm input:radio[name='dcCdGb']").attr('readonly', true);
+			$("#CouponForm input:radio[name='dcCdGb']").prop('disabled', true);
+			$("#CouponForm input:radio[name='dcCdGb']").parent().prop('disabled', true);
+			$("#CouponForm input:radio[name='dcCdGb']:radio[value=" + cpnDetail.dcCdGb + "]").prop('checked', true);
+			$("#CouponForm input[name='serialCpnNm']").prop("disabled", true);
+			$("#CouponForm input[name='serialCpnQty']").prop("disabled", true);
+			$("#CouponForm input[name='randomCpnQty']").prop("disabled", true);
+
+			// 주문서 쿠폰이면 할인쿠폰유형 노출
+			if(cpnDetail.cpnType == "G230_20") {
+				$("#CouponForm .dcCdGb").show();
+			}
+			// 할인코드유형이 일반유형이 아니면
+			if(cpnDetail.dcCdGb != "G233_00" ) {
+				$("#CouponForm .randomCpnTab").show();							// 시리얼 및 난수 TAB 노출
+				$("#CouponForm .dcCdCheck").hide();								// 총발행제한수량, 1회발행수량, 1인당발행제한수량 숨김
+				if(cpnDetail.dcCdGb == "G233_10") {		// 시리얼 유형
+					$("#CouponForm input[name='serialCpnQty']").val(cpnDetail.totPubLimitQty);
+					$("#CouponForm input[name='serialCpnNm']").val(cpnDetail.rdCpnNm);
+					$("#CouponForm .normalCol").attr("colspan", "5");
+					$("#CouponForm .serialCpnArea").show();
+					$("#CouponForm .randomCpnArea").hide();
+				} else if (cpnDetail.dcCdGb == "G233_20") {
+					$("#CouponForm input[name='randomCpnQty']").val(cpnDetail.totPubLimitQty);
+					$("#CouponForm .normalCol").attr("colspan", "");
+					$("#CouponForm .randomCpnArea").show();
+					$("#CouponForm .serialCpnArea").hide();
+				}
+			}
+
 			/*
 			$("#CouponForm input:checkbox[name='cpnCreateType']").parent("label").addClass("formControl");
 			$("#CouponForm input:checkbox[name='cpnCreateType']").parent("label").prop('disabled', true);
@@ -1318,7 +1409,6 @@
 				$("#CouponForm #downStMM").attr('disabled', true);
 				$("#CouponForm #buyLimitAmt").attr('readonly', true);
 				$("#CouponForm input:radio[name='rdoDcWay']").attr('readonly', true);
-				$("#CouponForm input:radio[name='rdoCpnType']").attr('readonly', true);
 				$("#CouponForm input:radio[name='rdoApplyScope']").attr('readonly', true);
 				$("#CouponForm .rdoBtn").css('cursor', 'auto');
 				$("#CouponForm #cpnId").attr('readonly', true);

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

@@ -227,7 +227,7 @@
 		var custAllData = gagaAgGrid.getAllRowData(pubCustGridOptions);
 		var jsonCustPubData = JSON.stringify(custAllData);
 		$("#pubRegForm #custList").val(jsonCustPubData);
-		$("#pubRegForm #cpnId").val($("#CouponForm #cpnId2").val());
+		$("#pubRegForm #cpnId").val($("#CouponForm #cpnId").val());
 	}
 
 	$(document).ready(function(){

+ 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);
 	}
 
 	//검색 조건 확인

+ 316 - 139
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,30 @@
 		// 적용상품 그리드에 기본상품 1개이상 있는지 체크
 		fnGoodsGbCheck();
 
+		// 업체분담율 토탈 100% 넘는지 체크
+		fnBurdenValueCheck();
+
+		// 공급업체+브랜드 상품조회
+		var multiSupplyCompCd = [];
+		$.each(allSupplyCompData, function(idx, item) {
+			multiSupplyCompCd.push(item.supplyCompCd);
+		});
+
+		var multiBrand = [];
+		$.each(allBrandData, function(idx, item) {
+			multiBrand.push(item.brandCd);
+		});
+
+		var multiApplyGoods = [];
+		$.each(allApplyGoodsData, function(idx, item) {
+			multiApplyGoods.push(item.goodsCd);
+		});
+
+		var multiExceptGoods = [];
+		$.each(allExceptGoodsData, function(idx, item) {
+			multiExceptGoods.push(item.goodsCd);
+		});
+
 		var data = {
 			mode : $('#moreBetterForm input[name=mode]').val()
 			, tmtbSq : $('#moreBetterForm input[name=disTmtbSq]').val()
@@ -624,6 +673,10 @@
 			, exceptGoodsList : allExceptGoodsData
 			, burdenList : allApplyBurdenData
 			, sectionGbList : allSectionGbData
+			, multiSupplyCompCd : multiSupplyCompCd
+			, multiBrand : multiBrand
+			, multiApplyGoods : multiApplyGoods
+			, multiExceptGoods : multiExceptGoods
 		};
 
 		var jsonData = JSON.stringify(data);
@@ -643,7 +696,7 @@
 
 			return;
 		}else{
-			mcxDialog.alert(result.msg);
+			//mcxDialog.alert(result.message);
 			fnMorebetterFormClose();
 			$('#btnInit').trigger('click');
 			$('#btnSearch').trigger('click');
@@ -742,20 +795,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 +933,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 +954,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 +1104,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>

+ 524 - 0
src/main/webapp/WEB-INF/views/marketing/RandomCouponList.html

@@ -0,0 +1,524 @@
+<!DOCTYPE html>
+<html lang="ko"
+      xmlns:th="http://www.thymeleaf.org">
+<!--
+ *************************************************************************
+ * @source  : RandomCouponList.html
+ * @desc    : 쿠폰난수관리 Page
+ *------------------------------------------------------------------------
+ * TSIT
+ * Copyright(c) 2020 TSIT, All rights reserved.
+ *------------------------------------------------------------------------
+ * VER  DATE        AUTHOR      DESCRIPTION
+ * ---  ----------- ----------  -----------------------------------------
+ * 1.0  2021.01.22  xodud1202   쿠폰난수관리
+ *************************************************************************
+-->
+<div id="main">
+    <!-- 메인타이틀 영역 -->
+    <div class="main-title"></div>
+
+    <!-- 메뉴 설명 -->
+    <div class="infoBox menu-desc"></div>
+    
+    <form id="searchForm" name="searchForm" th:action="@{'/marketing/coupon/random/list/paging'}" th:onsubmit="fnSearch(); return false;" >
+
+        <!-- 패널 영역1 -->
+        <div class="boxStyle">
+			<span class="boxControl">
+				<i class="fa fa-chevron-up" data-view="show"></i>
+                <!-- <i class="fa fa-times" data-view="show"></i> -->
+			</span>
+            <!-- 검색조건 영역 -->
+            <div class="boxTitle">검색조건</div>
+            <ul class="boxContent">
+                <li class="boxContentTop">
+                    <table class="frmStyle">
+                        <col width="8%">
+                        <col width="12%">
+                        <col width="8%">
+                        <col width="12%">
+                        <col width="8%">
+                        <col width="12%">
+                        <col width="8%">
+                        <col width="12%">
+                        <col width="8%">
+                        <col width="12%">
+                        <tr>
+                            <th>쿠폰명</th>
+                            <td>
+                                <input type="text" name="cpnNm" maxlength="40" class="type-text" style="width: 100%;"/>
+                            </td>
+                            <th>등록가능기간</th>
+                            <td colspan="10" id="terms" class="availTerm">
+                            </td>
+                        </tr>
+                    </table>
+                    <div class="panelBtnB">
+                        <input type="button" value="조회" class="btn btn-base btn-lg btn-info" id="btnSearch" onclick="fnSearch();"/>
+                        <input type="button" value="초기화" class="btn btn-dark btn-lg " onclick="$('#searchForm')[0].reset(); fnInitCalendar();" />
+                    </div>
+                </li>
+            </ul>
+            <!-- //검색조건 영역 -->
+        </div>
+        <!-- 패널 영역1 -->
+        <div class="panelStyle2">
+            <!-- 검색결과 영역 -->
+            <!-- 상단버튼 영역  -->
+            <ul class="lrStyle">
+                <li class="aR">
+                    검색결과 : <strong><span id="gridRowTotalCount">0</span> 건</strong>&nbsp;
+                    쪽번호 <span id="pgNo">0</span>/ <strong id="endPgNo">0</strong>&nbsp;&nbsp;
+                    <select id="pageSize" name="pageSize">
+                        <option value="50" selected="selected">50개씩 보기</option>
+                        <option value="100">100개씩 보기</option>
+                        <option value="500">500개씩 보기</option>
+                        <option value="1000">1000개씩 보기</option>
+                    </select>
+                    <input type="hidden" name="pageNo" id="pageNo" value ="1"/>
+                </li>
+            </ul>
+
+            <!-- //상단버튼 영역  -->
+            <div class="panelContent">
+                <div id="gridList" style="width: 100%;height: 400px;" class="ag-theme-balham"></div>
+            </div>
+            <div class="panelBtnB">
+                <!-- Paging -->
+                <div class="tablePaging" id="couponPagination"></div>
+                <!-- //Paging -->
+            </div>
+            <!-- 검색결과 영역 -->
+        </div>
+    </form>
+    <!-- //패널 영역2 -->
+    <!-- 등록/수정 -->
+    <div class="panelStyle2">
+        <ul class="lrStyle">
+            <li>
+                <span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>쿠폰시작문자(단일)의 경우에는 중복된 코드를 삽입할 수 없습니다.</span>
+            </li>
+        </ul>
+        <form id="detailForm" name="detailForm" action="#" th:action="@{'/marketing/coupon/random/save'}">
+            <input type="hidden" name="rdCpnSq"/>
+            <table class="frmStyle">
+                <colgroup>
+                    <col style="width:10%;"/>
+                    <col style="width:23.3%;"/>
+                    <col style="width:10%;"/>
+                    <col style="width:23.3%;"/>
+                    <col style="width:10%;"/>
+                    <col/>
+                </colgroup>
+                <tr>
+                    <th>쿠폰명<i class="star"></i></th>
+                    <td>
+                        <input type="text" class="w200" name="rdCpnNm" maxlength="50" data-valid-name="랜덤쿠폰명"/>
+                    </td>
+                    <th>쿠폰생성수량<i class="star"></i></th>
+                    <td>
+                        <input type="text" class="w200" name="rdCpnIdQty" maxlength="8" data-valid-name="랜덤쿠폰생성수량" data-valid-type="numeric"/>
+                    </td>
+                    <th>쿠폰시작문자<i class="star"></i></th>
+                    <td>
+                        <select name="rdCpnPrefixGb" data-valid-name="쿠폰시작문자구분" onchange="onChangePrefixGb(this.value);">
+                            <option value="R">랜덤</option>
+                            <option value="S">단일</option>
+                        </select>
+                        <input type="text" class="w200" name="rdCpnPrefix" maxlength="4" required="required" data-valid-name="쿠폰시작문자" data-valid-type="alphaNumeric" style="text-transform: uppercase;"/>
+                    </td>
+                </tr>
+                <tr>
+                    <th>지급구분(<font color="RED">*</font>)
+                    </th>
+                    <td>
+                        <label class="rdoBox" th:if="${rdcpnGbList}" th:each="oneData, status : ${rdcpnGbList}" >
+                            <input type="radio" name="rdcpnGb" class="type-radio" th:value="${oneData.cd}" th:text="${oneData.cdNm}" onchange="onChangePdGb(this.value);"/>
+                        </label>
+                    </td>
+                    <th class="rdcpnGbCpn">적용쿠폰ID<i class="star"></i></th>
+                    <td class="rdcpnGbCpn">
+                        <input name="cpnName" type="text" class="w150" onkeypress="if (window.event.keyCode == 13) { fnOpenCouponRetrievePopup('input[name=cpnId]', 'input[name=cpnName]'); }"/>
+                        <button type="button" class="btn icn" th:onclick="fnOpenCouponRetrievePopup('input[name=cpnId]', 'input[name=cpnName]')"><i class="fa fa-search cpn" aria-hidden="true"></i></button>
+                        <input name="cpnId" type="text" class="w100" maxlength="20" readonly/>
+                    </td>
+                    <th class="rdcpnGbCpn">쿠폰발급수량<i class="star"></i></th>
+                    <td class="rdcpnGbCpn">
+                        <input type="text" class="w200" name="cpnCnt" maxlength="20" data-valid-name="쿠폰발급수량" data-valid-type="numeric"/>
+                    </td>
+                    <th class="rdcpnGbPnt">적용포인트<i class="star"></i></th>
+                    <td class="rdcpnGbPnt">
+                        <input type="text" class="w200" name="pointAmt" maxlength="20" data-valid-name="적용포인트금액" data-valid-type="numeric"/>
+                    </td>
+                    <th class="rdcpnGbPnt">포인트만료일시<i class="star"></i></th>
+                    <td  class="rdcpnGbPnt">
+                        <input name="pointExpireDt" type="text" class="w80 schDate" maxlength="10" data-valid-name="포인트만료일시" />
+                    </td>
+                </tr>
+                <tr>
+                    <th>등록기간<i class="star"></i></th>
+                    <td class="dashR">
+                        <input name="regPossibleStdt" type="text" class="w80 schDate" maxlength="10" required data-valid-name="등록가능시작일자" />
+                        ~
+                        <input name="regPossibleEddt" type="text" class="w80 schDate" maxlength="10" required data-valid-name="등록가능종료일자" />
+                    </td>
+                    <th>중복사용가능여부<i class="star"></i></th>
+                    <td>
+                        <select name="dupUsableYn" required data-valid-name="중복사용가능여부">
+                            <option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
+                        </select>
+                    </td>
+                    <th>사용여부<i class="star"></i></th>
+                    <td>
+                        <select name="useYn" required data-valid-name="사이트">
+                            <option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
+                        </select>
+                    </td>
+                </tr>
+            </table>
+
+            <div class="panelBtnB">
+                <button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
+                <button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+            </div>
+        </form>
+    </div>
+</div>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=2019072202"></script>
+<script th:inline="javascript">
+    /*<![CDATA[*/
+
+    var columnDefs = [
+        {width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false, editable: false,pinned: 'left'}
+        ,{field: "rdCpnSq"       ,headerName:"랜덤쿠폰일련번호"     		,width:150   ,cellClass:"text-center",hide:true}
+        ,{field: "rdCpnNm"		,headerName:"쿠폰명"					,width:200	,cellClass:"text-center"
+            ,cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+        }
+        ,{field: "rdCpnIdQty"         ,headerName:"생성수량"     		,width:90   ,cellClass:"text-center"
+            ,cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+        }
+        ,{field: "rdCpnPrefix"        ,headerName:"랜덤쿠폰시작문자"          		,width:120   ,cellClass:"text-center",hide:true}
+        ,{field: "rdCpnPrefixGb"        ,headerName:"랜덤쿠폰시작문자구분"          		,width:120   ,cellClass:"text-center",hide:true}
+        ,{field: "regPossibleStdt"    ,headerName:"등록가능시작일시"    		,width:150   ,cellClass:"text-center"
+            ,cellRenderer: function(params) {T
+                return !gagajf.isNull(params.value) ? gagaAgGrid.toDateTimeFormat(params.value) : '';
+            }
+        }
+        ,{field: "regPossibleEddt"    ,headerName:"등록가능종료일시"           	,width:150   ,cellClass:"text-center"
+            ,cellRenderer: function(params) {
+                return !gagajf.isNull(params.value) ? gagaAgGrid.toDateTimeFormat(params.value) : '';
+            }
+        }
+        ,{field: "dupUsableYn"        ,headerName:"중복사용가능여부"          		,width:120   ,cellClass:"text-center"}
+        ,{field: "rdcpnGb"            ,headerName:"구분"            	,width:80   ,cellClass:"text-center",hide:true}
+        ,{field: "rdcpnGbNm"            ,headerName:"구분"            	,width:100   ,cellClass:"text-center"}
+        ,{field: "cpnId"              ,headerName:"적용쿠폰ID"          		,width:100   ,cellClass:"text-center"}
+        ,{field: "cpnCnt"             ,headerName:"쿠폰발급수량"            ,width:100   ,cellClass:"text-center"
+            , cellRenderer: function(params) {
+                return params.value.addComma();
+            }
+        }
+        ,{field: "pointAmt"             ,headerName:"적용포인트금액"        ,width:120   ,cellClass:"text-center"
+            , cellRenderer: function(params) {
+                return params.value.addComma();
+            }
+        }
+        ,{field: "pointExpireDt"           ,headerName:"포인트만료일시"          	,width:150   ,cellClass:"text-center"
+            ,cellRenderer: function(params) {
+                return !gagajf.isNull(params.value) ? gagaAgGrid.toDateTimeFormat(params.value) : '';
+            }
+        }
+        ,{field: "useYn"             ,headerName:"사용여부"        	,width:80   ,cellClass:"text-center"}
+        ,{field: "regId"              ,headerName:"등록자"           		,width:100   ,cellClass:"text-center"}
+        ,{field: "regDt"              ,headerName:"등록일시"            	,width:150   ,cellClass:"text-center"
+            ,cellRenderer: function(params) {
+                return !gagajf.isNull(params.value) ? gagaAgGrid.toDateTimeFormat(params.value) : '';
+            }
+        }
+        ,{field: "updId"              ,headerName:"수정자ID"           		,width:100   ,cellClass:"text-center",hide:true}
+        ,{field: "updDt"              ,headerName:"수정일시"            	,width:150   ,cellClass:"text-center",hide:true
+            ,cellRenderer: function(params) {
+                return !gagajf.isNull(params.value) ? gagaAgGrid.toDateTimeFormat(params.value) : '';
+            }
+        }
+    ];
+
+    var cpnListOpt = gagaAgGrid.getGridOptions(columnDefs);
+    cpnListOpt.rowSelection = 'multiple';
+    cpnListOpt.suppressRowClickSelection = true;
+
+    // 셀 클릭 이벤트
+    cpnListOpt.onCellClicked = function(event) {
+        var field = event.colDef.field;
+        if (event.colDef.field == "rdCpnIdQty"){
+            var rdCpnSq = event.data.rdCpnSq;
+            var actionUrl = "/marketing/coupon/random/cpnUseDetail/popup/form?rdCpnSq="+rdCpnSq;
+            cfnOpenModalPopup(actionUrl,'RandomCpnDetailPopup');
+        }
+
+        if (event.colDef.field == "rdCpnNm"){
+            var formId = '#detailForm';
+
+            // 기본정보 입력
+            $(formId + ' input[name=rdCpnSq]').val(event.data.rdCpnSq);
+            $(formId + ' input[name=rdCpnNm]').val(event.data.rdCpnNm);
+            $(formId + ' input[name=rdCpnIdQty]').val(event.data.rdCpnIdQty.addComma());
+            $(formId + ' select[name=dupUsableYn]').val(event.data.dupUsableYn);
+            $(formId + ' input[name=cpnId]').val(event.data.cpnId);
+            $(formId + ' input[name=cpnCnt]').val(event.data.cpnCnt.addComma());
+            $(formId + ' input[name=pointAmt]').val(event.data.pointAmt.addComma());
+            $(formId + ' select[name=useYn]').val(event.data.useYn);
+            $(formId + ' input[name=rdCpnPrefix]').val(event.data.rdCpnPrefix);
+            $(formId + ' select[name=rdCpnPrefixGb]').val(event.data.rdCpnPrefixGb);
+
+            $("input[name=rdcpnGb][value="+event.data.rdcpnGb+"]").prop('checked', true);
+            onChangePdGb(event.data.rdcpnGb);
+
+            // 등록 기간 설정
+            var stDate = event.data.regPossibleStdt.split(" ")[0];
+            var edDate = event.data.regPossibleEddt.split(" ")[0];
+            var exDate = '';
+            if(!gagajf.isNull(event.data.pointExpireDt)) {
+                exDate = event.data.pointExpireDt.split(" ")[0];
+            }
+
+            $(formId + ' input[name=regPossibleStdt]').val(stDate);
+            $(formId + ' input[name=regPossibleEddt]').val(edDate);
+            $(formId + ' input[name=pointExpireDt]').val(exDate);
+
+            //setComma("detailForm", true);
+
+        }
+    }
+
+    $(document).ready(function() {
+        var hideList = [];
+        cfnCreateCalendar('#terms', 'availStdt', 'availEddt', true, '지급일', '');
+        //$('.btnToday').trigger('click');
+
+        //대상구분 초기화
+        $("input[name=rdcpnGb][value=C]").prop('checked', true);
+        onChangePdGb("C");
+
+        $("select[name=dupUsableYn]").val("N");
+        $("select[name=rdCpnPrefixGb]").val("R");
+
+        setComma("detailForm", true);
+
+        // Create a agGrid
+        gagaAgGrid.createGrid('gridList', cpnListOpt);
+
+        uifnFitGrid('auto');
+
+        // fnSearch();
+    });
+
+    var fnInitCalendar = function() {
+        //$(".btnToday").trigger('click');
+    }
+
+    /**
+     * 목록 조회
+     */
+
+    function fnSearch() {
+        gagaPaging.init('searchForm', fnSearchCallBack, 'couponPagination', $('#searchForm').find('#pageSize').val());
+        gagaPaging.load(1);
+    }
+
+    var fnSearchCallBack = function(result) {
+        $('#searchForm').find('#gridRowTotalCount').html(result.paging.totalCount.addComma());
+        $('#searchForm').find('#pageNo').val(result.paging.pageNo.addComma());
+        $('#searchForm').find('#pgNo').html(result.paging.pageNo.addComma());
+        $('#searchForm').find('#endPgNo').html(result.paging.totalPage.addComma());
+        cpnListOpt.api.setRowData(result.CouponList);
+        gagaPaging.createPagination(result.paging);
+    }
+
+    //페이징
+    $('#searchForm select[name=pageSize]').on('change', function() {
+        $("#searchForm input[name=pageNo]").val('1');
+        $('#btnSearch').click();
+    });
+
+    $("#btnNew").on("click", function(){
+        $("#detailForm")[0].reset();
+        setComma("detailForm", false);
+        $("input[name=rdcpnGb][value=C]").prop('checked', true);
+        onChangePdGb("C");
+        $("select[name=dupUsableYn]").val("N");
+        $("select[name=rdCpnPrefixGb]").val("R");
+        setComma("detailForm", true);
+    });
+
+    $("#btnSave").on("click", function(){
+        var formId = '#detailForm';
+        var formJson = $(formId).serializeObject();
+
+        if(gagajf.isNull(formJson.rdCpnNm)){
+            mcxDialog.alert("쿠폰명을 입력해주세요");
+            return;
+        }
+
+        if(gagajf.isNull(formJson.rdCpnIdQty) || formJson.rdCpnIdQty < 1){
+            mcxDialog.alert("쿠폰생성수량을 입력해주세요");
+            return;
+        }
+
+        if(formJson.rdcpnGb == "C"){
+            if(gagajf.isNull(formJson.cpnId)){
+                mcxDialog.alert("적용할 쿠폰ID를 입력해주세요");
+                return;
+            }
+            if(gagajf.isNull(formJson.cpnCnt) || formJson.cpnCnt < 1){
+                mcxDialog.alert("쿠폰발급수량을 입력해주세요");
+                return;
+            }
+        }else if(formJson.rdcpnGb == "P"){
+            if(gagajf.isNull(formJson.pointAmt)){
+                mcxDialog.alert("적용할 포인트를 입력해주세요");
+                return;
+            }
+            if(gagajf.isNull(formJson.pointExpireDt)){
+                mcxDialog.alert("포인트만료일자를 입력해주세요");
+                return;
+            }
+        }
+
+        /*
+                if(formJson.rdCpnPrefixGb == "S" && formJson.rdCpnIdQty > 1){
+                    mcxDialog.alert("단일문자일 경우 쿠폰생성수량은 1개만 가능합니다.");
+                    return;
+                }
+        */
+
+        // 날짜 유효성 체크
+        var st = formJson.regPossibleStdt.replaceAll("-", "");
+        var ed = formJson.regPossibleEddt.replaceAll("-", "");
+
+        if (Number(st) > Number(ed)) {
+            mcxDialog.alert('등록시작일은 등록종료일보다 클 수 없습니다.');
+            return;
+        }
+
+        setComma("detailForm", false); // 숫자타입 콤마 제거
+
+        if(!gagajf.isNull(formJson.cpnId)){
+            $("input[name=cpnId]").val($("input[name=cpnId]").val().toUpperCase());
+        }
+        if(!gagajf.isNull(formJson.rdCpnPrefix)){
+            $("input[name=rdCpnPrefix]").val($("input[name=rdCpnPrefix]").val().toUpperCase());
+        }
+
+        mcxDialog.confirm('저장하시겠습니까?', {
+            cancelBtnText: "취소",
+            sureBtnText: "확인",
+            sureBtnClick: function(){
+                gagajf.ajaxFormSubmit($(formId).prop('action'), formId, fnSaveCallback);
+            }
+        });
+    });
+
+    function setComma(formId, pBoolean){
+        //숫자타입 콤마 찍어주기
+        $("#"+formId+" [data-valid-type=numeric]").each(function(){
+            $(this).change(function(){
+                if(pBoolean){
+                    $(this).val($(this).val().addComma());
+                }else{
+                    $(this).val($(this).val().removeComma());
+                }
+            });
+            if(pBoolean){
+                $(this).val($(this).val().addComma());
+            }else{
+                $(this).val($(this).val().removeComma());
+            }
+        });
+    }
+
+    function fnSaveCallback(){
+        $("#btnNew").trigger('click');
+        //setComma("detailForm", true);
+        fnSearch();
+    }
+
+    function fnCouponCreate(){
+        cfnCouponCreatePopup();
+    }
+
+    function fnCouponCopy(){
+        var selectedData = cpnListOpt.api.getSelectedRows();
+
+        if (selectedData.length == 0) {
+            mcxDialog.alert('선택된 행이 없습니다.');
+            return;
+        }
+        if (selectedData.length > 1) {
+            mcxDialog.alert('하나의 쿠폰만 선택하세요.');
+            return;
+        }
+        var cpnId = selectedData[0].cpnId;
+        var mode = "copy"
+        var actionUrl = "/marketing/coupon/popup/form?cpnId="+cpnId;
+        actionUrl += "&mode="+mode;
+        cfnOpenModalPopup(actionUrl,'CouponCreatePopup');
+    }
+
+    function fnCouponDetail(cpnId){
+        var actionUrl = "/marketing/coupon/popup/form?cpnId="+cpnId;
+        cfnOpenModalPopup(actionUrl,'CouponCreatePopup');
+    }
+
+    function fnCpnUseDetail(cpnId){
+        var actionUrl = "/marketing/coupon/cpnUseDetail/popup/form?cpnId="+cpnId;
+        cfnOpenModalPopup(actionUrl,'CpnUseDetailPopup');
+    }
+
+    // 쿠폰조회 팝업
+    var fnOpenCouponRetrievePopup = function(strReturnCode, strReturnName) {
+        var oParam = new Object();
+        oParam.returnCode = strReturnCode;
+        oParam.returnName = strReturnName;
+        cfnOpenCouponRetrievePopup($(strReturnName).val(), oParam);
+    }
+
+    /*유효기간구분온체인지이벤트*/
+    function onChangePdGb(val){
+        if(val == "C"){
+            $(".rdcpnGbCpn").show();
+            $(".rdcpnGbPnt").hide();
+        }else{
+            $(".rdcpnGbCpn").hide();
+            $(".rdcpnGbPnt").show();
+        }
+
+    }
+
+    function onChangePrefixGb(val){
+        $("input[name=rdCpnPrefix]").val('');
+        if(val == "S"){
+            $("input[name=rdCpnPrefix]").attr("maxlength", 10);
+            $("input[name=rdCpnPrefix]").attr("data-valid-type", "");
+        }else{
+            $("input[name=rdCpnPrefix]").attr("maxlength", 4);
+        }
+
+    }
+
+    var fnCouponExcelDownLoad = function(){
+        var selectedData = cpnListOpt.api.getSelectedRows();
+
+        if (selectedData.length == 0) {
+            mcxDialog.alert('선택된 행이 없습니다.');
+            return;
+        }
+
+        gagaAgGrid.exportToExcel('쿠폰목록', cpnListOpt, true);
+    }
+
+    /*]]>*/
+</script>
+
+</html>

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


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


+ 30 - 27
src/main/webapp/WEB-INF/views/order/CnclReqForm.html

@@ -36,8 +36,8 @@
 				<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>
+					<button type="button" class="btn btn-success" onclick="fnCnclReq('cnclReq');">취소신청</button>
+					<button type="button" class="btn btn-success" onclick="fnCnclReq('cnclComplete');">취소완료</button>
 				</div>
 				
 				<table class="frmStyle">
@@ -949,47 +949,50 @@ var fnCnclReq = function (reqGbn) {
 	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") {
+	if (reqGbn == "cnclComplete") {
 		cnclUrl = '/orderChange/cnclComplete/';
 	}
 	// 취소신청
-	else if (reqGbn == "req") {
+	else if (reqGbn == "cnclReq") {
 		cnclUrl = '/orderChange/cnclReq/';
 	}
-	// 취소신청 완료
-	else if (reqGbn == "reqComplete"){
+	// 취소신청완료
+	else if (reqGbn == "cnclReqComplete") {
 		cnclUrl = '/orderChange/cnclReqComplete/';
 	}
 
+	// 2021.01.26 화면통합
+	cnclUrl = '/orderChange/cnclComplete/';
+	
+	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
+			,"reqGbn"			: reqGbn
+		}
+
 	// 주문번호, 취소사유, 취소메모, (취소, 반품, 교환 신청 정보 목록), 환불계좌
 	var jsonData = JSON.stringify(jsonObj);
 	
 	mcxDialog.confirm('취소요청하시겠습니까?', {
 		cancelBtnText		: "취소",
 		sureBtnClick		: function(){
-			// 취소 실행
 			gagajf.ajaxJsonSubmit(
 				cnclUrl
 				, jsonData

File diff suppressed because it is too large
+ 61 - 940
src/main/webapp/WEB-INF/views/order/CnclReqViewForm.html


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

@@ -89,7 +89,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"/>
@@ -115,6 +115,12 @@
 								- <input type="text" name ="chgerPhnno3" class="w60" value="0000" />
 							</td>
 						</tr>
+						<tr>
+							<th>반품메모</th>
+							<td colspan="3">
+								<textarea id="chgerRtnMemo" name="chgerRtnMemo" style="height:80px;" placeholder="반품메모(수거시요청사항)를 300자내외로 작성해 주세요"></textarea>
+							</td>
+						</tr>
 					</tbody>
 				</table>
 
@@ -134,7 +140,7 @@
 					<tr>
 						<th>교환지주소 <i class="star"></i></th>
 						<td colspan="3">
-							<input type="text" name ="recipZipNo" class="w100" readonly="readonly"/>
+							<input type="text" name ="recipZipcode" class="w100" readonly="readonly"/>
 							<button type="button" class="btn btn-info" onclick="fnOpenDaumAddr('delvLoc');">우편번호찾기</button>
 							<input type="text" name ="recipBaseAddr" class="w300"/>
 							<input type="text" name ="recipDtlAddr" class="w300"/>
@@ -160,6 +166,12 @@
 							- <input type="text" name ="recipPhnno3" class="w60" value="0000" />
 						</td>
 					</tr>
+					<tr>
+						<th>배송메모</th>
+						<td colspan="3">
+							<textarea id="delvMemo" name="delvMemo" style="height:80px;" placeholder="배송메모를 300자내외로 작성해 주세요"></textarea>
+						</td>
+					</tr>
 					</tbody>
 				</table>
 			</form>
@@ -288,7 +300,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 +310,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) {
@@ -577,7 +589,7 @@ var fnExchange = function () {
 	// 5. 회수지정보설정
 	if (wdGb == 'W') {
 		var chgerNm			= $("#exchangeRequestFrm input[name=chgerNm]").val();
-		var chgerZipNo		= $("#exchangeRequestFrm input[name=chgerZipNo]").val();
+		var chgerZipcode	= $("#exchangeRequestFrm input[name=chgerZipcode]").val();
 		var chgerBaseAddr	= $("#exchangeRequestFrm input[name=chgerBaseAddr]").val();
 		var chgerDtlAddr	= $("#exchangeRequestFrm input[name=chgerDtlAddr]").val();
 		
@@ -589,7 +601,7 @@ var fnExchange = function () {
 		var chgerTelno2		= $("#exchangeRequestFrm input[name=chgerTelno2]").val();
 		var chgerTelno3		= $("#exchangeRequestFrm input[name=chgerTelno3]").val();
 	
-		if (gagajf.isNull(chgerZipNo)) {
+		if (gagajf.isNull(chgerZipcode)) {
 			mcxDialog.alert("회수지주소를 입력하세요."); return;
 		}
 		if (gagajf.isNull(chgerBaseAddr)) {
@@ -616,7 +628,7 @@ var fnExchange = function () {
 
 	// 교환지정보 설정
 	var recipNm			= $("#exchangeRequestFrm input[name=recipNm]").val();
-	var recipZipNo		= $("#exchangeRequestFrm input[name=recipZipNo]").val();
+	var recipZipcode	= $("#exchangeRequestFrm input[name=recipZipcode]").val();
 	var recipBaseAddr	= $("#exchangeRequestFrm input[name=recipBaseAddr]").val();
 	var recipDtlAddr	= $("#exchangeRequestFrm input[name=recipDtlAddr]").val();
 
@@ -628,7 +640,7 @@ var fnExchange = function () {
 	var recipTelno2		= $("#exchangeRequestFrm input[name=recipTelno2]").val();
 	var recipTelno3		= $("#exchangeRequestFrm input[name=recipTelno3]").val();
 	
-	if (gagajf.isNull(recipZipNo)) {
+	if (gagajf.isNull(recipZipcode)) {
 		mcxDialog.alert("교환지주소를 입력하세요."); return;
 	}
 	if (gagajf.isNull(recipBaseAddr)) {
@@ -662,14 +674,14 @@ var fnExchange = function () {
 		,"addPayCost"		: addDelvFee
 		,"chgerNm"			: chgerNm
 		,"chgerEmail"		: chgerEmail
-		,"chgerZipNo"		: chgerZipNo
+		,"chgerZipcode"		: chgerZipcode
 		,"chgerBaseAddr"	: chgerBaseAddr
 		,"chgerDtlAddr"		: chgerDtlAddr
 		,"chgerPhnno"		: chgerPhnno
 		,"chgerTelno"		: chgerTelno
 		,"recipNm"			: recipNm
 		,"recipEmail"		: recipEmail
-		,"recipZipNo"		: recipZipNo
+		,"recipZipcode"		: recipZipcode
 		,"recipBaseAddr"	: recipBaseAddr
 		,"recipDtlAddr"		: recipDtlAddr
 		,"recipPhnno"		: recipPhnno
@@ -702,11 +714,11 @@ var fnOpenDaumAddr = function(loc) {
 		oncomplete: function(data) {
 			// 우편번호와 주소 정보를 해당 필드에 넣는다.
 			if (loc == 'withdraw') {
-				$('#exchangeRequestFrm input[name=chgerZipNo]').val(data.zonecode);
+				$('#exchangeRequestFrm input[name=chgerZipcode]').val(data.zonecode);
 				$('#exchangeRequestFrm input[name=chgerBaseAddr]').val(cfnGetDaumRoadAddr(data));
 				$('#exchangeRequestFrm input[name=chgerDtlAddr]').focus();
 			} else if (loc == 'exchange') {
-				$('#exchangeRequestFrm input[name=recipZipNo]').val(data.zonecode);
+				$('#exchangeRequestFrm input[name=recipZipcode]').val(data.zonecode);
 				$('#exchangeRequestFrm input[name=recipBaseAddr]').val(cfnGetDaumRoadAddr(data));
 				$('#exchangeRequestFrm input[name=recipDtlAddr]').focus();
 			}
@@ -726,7 +738,7 @@ var fnSetChger = function(){
 	var spRecipTelno = (data.recipTelno != null) ? data.recipTelno.split('-') : null;
 	
 	$("#exchangeRequestFrm input[name=chgerNm]").val(data.recipNm);
-	$("#exchangeRequestFrm input[name=chgerZipNo]").val(data.recipZipNo);
+	$("#exchangeRequestFrm input[name=chgerZipcode]").val(data.recipZipcode);
 	$("#exchangeRequestFrm input[name=chgerBaseAddr]").val(data.recipBaseAddr);
 	$("#exchangeRequestFrm input[name=chgerDtlAddr]").val(data.recipDtlAddr);
 	
@@ -750,9 +762,10 @@ var fnSetExchangeAddr = function(){
 	var spRecipTelno = (data.recipTelno != null) ? data.recipTelno.split('-') : null;
 	
 	$("#exchangeRequestFrm input[name=recipNm]").val(data.recipNm);
-	$("#exchangeRequestFrm input[name=recipZipNo]").val(data.recipZipNo);
+	$("#exchangeRequestFrm input[name=recipZipcode]").val(data.recipZipcode);
 	$("#exchangeRequestFrm input[name=recipBaseAddr]").val(data.recipBaseAddr);
 	$("#exchangeRequestFrm input[name=recipDtlAddr]").val(data.recipDtlAddr);
+	$("#exchangeRequestFrm textarea[name=delvMemo]").val(data.delvMemo);
 	
 	if (spRecipPhnno) {
 		$("#exchangeRequestFrm select[name=recipPhnno1]").val(spRecipPhnno[0]);

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

@@ -53,12 +53,13 @@ var columnDefs4OrderDetailChangeHstList = [
 	{headerName: "택배사"			, field: "shipCompNm"	, width: 130	, cellClass: 'text-center'}
 ];
 
-var gridOptions4OrderDetailChangeHstList = orderAgGrid.getGridOptions(columnDefs4OrderDetailChangeHstList);
+var gridOptions4OrderDetailChangeHstList = gagaAgGrid.getGridOptions(columnDefs4OrderDetailChangeHstList);
 
 $(document).ready(function() {	
 	// Create a agGrid
 	gagaAgGrid.createGrid('gridOrderDetailChangeHstList', gridOptions4OrderDetailChangeHstList);
 	gridOptions4OrderDetailChangeHstList.api.setRowData(orderDetailHstList);
+	gagaAgGrid.hideStatusBar('gridOrderDetailChangeHstList');
 });
 /*]]>*/
 

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

@@ -615,7 +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="fnCancelRequest(\'' + params.value + '\');">' + params.value + '</a>';
 			} else {
 				rtnStr = params.value;
 			}
@@ -674,6 +674,7 @@ var columnDefsOrderChangeInfo = [
 			return (params.value == 'N') ? '미전송' : '전송';
 		}
 	},
+	/*
 	{
 		headerName		: "요청취소"
 		, field			: "ordDtlNo"
@@ -693,6 +694,7 @@ var columnDefsOrderChangeInfo = [
 			return retStr;
 		}
 	},
+	*/
 	{
 		headerName		: "회수지시전송"
 		, field			: "wdInvoiceSendYn"
@@ -919,12 +921,17 @@ $(document).ready(function () {
 		
 		// 입금대기, 결제완료, 상품준비중, 배송준비중 일때 취소가능
 		if (rowNode.data.ordDtlStat == 'G013_10' || rowNode.data.ordDtlStat == 'G013_20' || rowNode.data.ordDtlStat == 'G013_30' || rowNode.data.ordDtlStat == 'G013_40') {
-			$("#btnCancel").removeClass("off");	//취소요청
+			// 주문수량 > 취소수량 + 취소신청수량 클때 취소가능
+			if (rowNode.data.ordQty > (rowNode.data.cnclRtnQty + rowNode.data.ordReqChgQty)) {
+				$("#btnCancel").removeClass("off");	//취소요청	
+			}
 		}
-		
+
 		// 배송중, 출고완료, 배송완료 일때 반품, 교환 가능
 		if ((rowNode.data.ordDtlStat == 'G013_50' || rowNode.data.ordDtlStat == 'G013_55' || rowNode.data.ordDtlStat == 'G013_60') && rowNode.data.ordQty > rowNode.data.ordReqChgQty) {
-			$("#btnReturn, #btnExchange").removeClass("off");
+			if (rowNode.data.ordQty > (rowNode.data.cnclRtnQty + rowNode.data.ordReqChgQty)) {
+				$("#btnReturn, #btnExchange").removeClass("off");
+			}
 		}
 		
 		// 입금대기, 결제완료, 상품준비중, 배송준비중 일때 취소가능
@@ -944,7 +951,7 @@ $(document).ready(function () {
 	
 	// 취소요청
 	$('#btnCancel').on('click', function () {
-		fnCancelRequest(ordNo, 'N');
+		fnCancelRequest();
 	});
 	// 반품요청
 	$('#btnReturn').on('click', function () {
@@ -993,12 +1000,22 @@ var fnUpdateOrderAddr = function (rowIdx) {
 	});
 }
 
-// 취소요청
-var fnCancelRequest = function () {
-	var actionUrl = "/orderChange/cncl/req/form?ordNo=" + ordNo;
+// 2021.01.25 추가
+// 취소요청, 교환요청, 반품요청 일때는 요청 정보 확인 팝업 정보
+var fnCancelRequest = function (ordChgSq) {
+	
+	// 취소요청 구분 (orChgSq null 이면 취소요청화면 있으면 취소요청정보화면)
+	if (ordChgSq == null) {
+		ordChgSq = 0;
+	}
+	
+	var actionUrl = "/orderChange/cncl/req/form?ordNo=" + ordNo + "&ordChgSq=" + ordChgSq;
+	
 	cfnOpenModalPopup(actionUrl, 'popupCancelRequestForm');
 };
 
+
+
 // 반품요청
 var fnReturnRequest = function () {
 	var actionUrl = "/orderChange/rtn/req/form?ordNo=" + ordNo;
@@ -1011,56 +1028,7 @@ var fnExchangeRequest = function () {
 	cfnOpenModalPopup(actionUrl, 'popupExchangeRequestForm');
 };
 
-// 2021.01.25 추가
-// 취소요청, 교환요청, 반품요청 일때는 요청 정보 확인 팝업 정보
-var fnChgReqInfo = function (ordChgSq) {
-	var actionUrl = "/orderChange/cncl/req/view/form?ordNo=" + ordNo + "&ordChgSq=" + ordChgSq;
-	cfnOpenModalPopup(actionUrl, 'popupCancelRequestForm');
-};
-
-// 취소승인
-var fnCancelConfirmRequest = function (ordChgSq) {
-	mcxDialog.confirm("요청번호 [" + ordChgSq + "] 에 대한 취소승인 처리를 하시겠습니까?", {
-		cancelBtnText	: "취소",
-		sureBtnText		: "확인",
-		sureBtnClick	: function () {
-			var data = new Object();
-			data.ordNo 		= ordNo;	//전역변수
-			data.ordChgSq 	= ordChgSq;
 
-			var jsonData = JSON.stringify(data);
-			gagajf.ajaxJsonSubmit(
-				'/orderChange/cancel/confirm'
-				, jsonData
-				, function (result) {
-					uifnPopupClose('popupOrderDetail');
-					fnReOpenOrderDetailPopup();
-				}
-			);
-		}
-	});
-};
-
-// 취소요청철회
-var fnCancelConfirmRequestCancel = function (ordChgSq) {
-	mcxDialog.confirm("요청번호 [" + ordChgSq + "] 에 대한 요청철회 처리를 하시겠습니까?", {
-		cancelBtnText	: "취소",
-		sureBtnText		: "확인",
-		sureBtnClick	: function () {
-			var data = new Object();
-			data.ordChgSq = ordChgSq;
-			
-			var jsonData = JSON.stringify(data);
-			gagajf.ajaxJsonSubmit(
-				'/orderChange/cancel/wait/cancel'
-				, jsonData
-				, function (result) {
-					uifnPopupClose('popupOrderDetail');
-					fnReOpenOrderDetailPopup();
-			});
-		}
-	});
-}
 
 // 주문상품 상세 변경 이력 팝업
 var fnOrderDetailChangeHst = function (ordDtlNo) {

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

@@ -87,53 +87,16 @@ var columnDefsOrderGiftcardInfo = [
 		}
 ];
 
-var gridOptionsOrderGiftcardInfo = orderAgGrid.getGridOptions(columnDefsOrderGiftcardInfo);
+var gridOptionsOrderGiftcardInfo = gagaAgGrid.getGridOptions(columnDefsOrderGiftcardInfo);
 
 $(document).ready(function() {	
 	// Create a agGrid
 	gagaAgGrid.createGrid('gridOrderGiftcardInfo', gridOptionsOrderGiftcardInfo);
 	gridOptionsOrderGiftcardInfo.api.setRowData(orderGiftcardHstList);
+	gagaAgGrid.hideStatusBar('gridOrderGiftcardInfo');
 });
 /*]]>*/
 
-</script>
-
-<!-- AgGrid 컬럼 세팅 -->
-<script>
-// 공통1. 주문상세 그리드 옵션 정보 적용
-var orderAgGrid = {
-	getGridOptions : function(colDefs) {
-		return {
-			columnDefs					: colDefs
-			, detailCellRendererParams	: {
-				detailGridOptions	: {
-					columnDefs				: []
-					, defaultColDef			: {
-						resizable: true
-					}
-					, suppressLoadingOverlay: false
-					, onGridReady			: function (params) {
-						params.api.setDomLayout('autoHeight');
-					}
-					, onFirstDataRendered	: function (params) {
-						params.api.sizeColumnsToFit();
-					}
-				}
-				, getDetailRowData: function (params) {
-					params.successCallback(params.data.orderDetailList);
-				}
-			}
-			, defaultColDef: {
-				resizable: true
-			}
-			, isRowMaster: function (dataItem) {
-				return dataItem ? dataItem.orderDetailList.length > 1 : false;
-			}
-			, suppressRowTransform: true
-			, enableRangeSelection: true
-		};
-	}
-}
 </script>
 </html>
 

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

@@ -77,54 +77,18 @@ var columnDefsOrderPointInfo = [
 		}
 ];
 
-var gridOptionsOrderPointInfo = orderAgGrid.getGridOptions(columnDefsOrderPointInfo);
+var gridOptionsOrderPointInfo = gagaAgGrid.getGridOptions(columnDefsOrderPointInfo);
 
 $(document).ready(function() {	
 	// Create a agGrid
 	gagaAgGrid.createGrid('gridOrderPointInfo', gridOptionsOrderPointInfo);
 	gridOptionsOrderPointInfo.api.setRowData(orderPointHstList);
+	gagaAgGrid.hideStatusBar('gridOrderPointInfo');
 });
 /*]]>*/
 
 </script>
 
-<!-- AgGrid 컬럼 세팅 -->
-<script>
-// 공통1. 주문상세 그리드 옵션 정보 적용
-var orderAgGrid = {
-	getGridOptions : function(colDefs) {
-		return {
-			columnDefs					: colDefs
-			, detailCellRendererParams	: {
-				detailGridOptions	: {
-					columnDefs				: []
-					, defaultColDef			: {
-						resizable: true
-					}
-					, suppressLoadingOverlay: false
-					, onGridReady			: function (params) {
-						params.api.setDomLayout('autoHeight');
-					}
-					, onFirstDataRendered	: function (params) {
-						params.api.sizeColumnsToFit();
-					}
-				}
-				, getDetailRowData: function (params) {
-					params.successCallback(params.data.orderDetailList);
-				}
-			}
-			, defaultColDef: {
-				resizable: true
-			}
-			, isRowMaster: function (dataItem) {
-				return dataItem ? dataItem.orderDetailList.length > 1 : false;
-			}
-			, suppressRowTransform: true
-			, enableRangeSelection: true
-		};
-	}
-}
-</script>
 </html>
 
 

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

@@ -59,53 +59,16 @@ var columnDefsOrderGiftcardInfo = [
 		}
 ];
 
-var gridOptionsOrderTmtbInfo = orderAgGrid.getGridOptions(columnDefsOrderGiftcardInfo);
+var gridOptionsOrderTmtbInfo = gagaAgGrid.getGridOptions(columnDefsOrderGiftcardInfo);
 
 $(document).ready(function() {	
 	// Create a agGrid
 	gagaAgGrid.createGrid('gridOrderTmtbInfo', gridOptionsOrderTmtbInfo);
 	gridOptionsOrderTmtbInfo.api.setRowData(orderTmtbHstList);
+	gagaAgGrid.hideStatusBar('gridOrderTmtbInfo');
 });
 /*]]>*/
 
-</script>
-
-<!-- AgGrid 컬럼 세팅 -->
-<script>
-// 공통1. 주문상세 그리드 옵션 정보 적용
-var orderAgGrid = {
-	getGridOptions : function(colDefs) {
-		return {
-			columnDefs					: colDefs
-			, detailCellRendererParams	: {
-				detailGridOptions	: {
-					columnDefs				: []
-					, defaultColDef			: {
-						resizable: true
-					}
-					, suppressLoadingOverlay: false
-					, onGridReady			: function (params) {
-						params.api.setDomLayout('autoHeight');
-					}
-					, onFirstDataRendered	: function (params) {
-						params.api.sizeColumnsToFit();
-					}
-				}
-				, getDetailRowData: function (params) {
-					params.successCallback(params.data.orderDetailList);
-				}
-			}
-			, defaultColDef: {
-				resizable: true
-			}
-			, isRowMaster: function (dataItem) {
-				return dataItem ? dataItem.orderDetailList.length > 1 : false;
-			}
-			, suppressRowTransform: true
-			, enableRangeSelection: true
-		};
-	}
-}
 </script>
 </html>
 

Some files were not shown because too many files changed in this diff