Kaynağa Gözat

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

Conflicts:
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

gagamel 5 yıl önce
ebeveyn
işleme
ab7a9ed834
31 değiştirilmiş dosya ile 2645 ekleme ve 609 silme
  1. 1 1
      src/main/java/com/style24/admin/biz/dao/TsaBusinessDao.java
  2. 97 0
      src/main/java/com/style24/admin/biz/dao/TsaCustomerDao.java
  3. 6 6
      src/main/java/com/style24/admin/biz/dao/TsaMorebetterDao.java
  4. 2 2
      src/main/java/com/style24/admin/biz/service/TsaBusinessService.java
  5. 136 0
      src/main/java/com/style24/admin/biz/service/TsaCustomerService.java
  6. 28 7
      src/main/java/com/style24/admin/biz/service/TsaGoodsService.java
  7. 43 31
      src/main/java/com/style24/admin/biz/service/TsaKakaoService.java
  8. 5 4
      src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java
  9. 3 1
      src/main/java/com/style24/admin/biz/web/TsaBusinessController.java
  10. 118 81
      src/main/java/com/style24/admin/biz/web/TsaCustomerController.java
  11. 81 118
      src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
  12. 77 47
      src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java
  13. 1 1
      src/main/java/com/style24/persistence/domain/Brand.java
  14. 1 1
      src/main/java/com/style24/persistence/domain/Delivery.java
  15. 1 0
      src/main/java/com/style24/persistence/domain/MoreBetter.java
  16. 3 0
      src/main/java/com/style24/persistence/domain/MoreBetterGoods.java
  17. 1 14
      src/main/java/com/style24/persistence/mybatis/shop/TsaBusiness.xml
  18. 145 70
      src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml
  19. 20 7
      src/main/java/com/style24/persistence/mybatis/shop/TsaMorebetter.xml
  20. 4 4
      src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml
  21. 17 12
      src/main/webapp/WEB-INF/views/business/BrandForm.html
  22. 135 0
      src/main/webapp/WEB-INF/views/customer/CellphoneChangePopupForm.html
  23. 142 65
      src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html
  24. 38 46
      src/main/webapp/WEB-INF/views/customer/EmailPopupForm.html
  25. 31 47
      src/main/webapp/WEB-INF/views/customer/LmsPopupForm.html
  26. 9 20
      src/main/webapp/WEB-INF/views/goods/GoodsDealForm.html
  27. 7 10
      src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html
  28. 42 3
      src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html
  29. 24 7
      src/main/webapp/WEB-INF/views/order/CancelRequestForm.html
  30. 30 4
      src/main/webapp/WEB-INF/views/order/OrderDetailForm.html
  31. 1397 0
      src/main/webapp/WEB-INF/views/order/OrderDetailFormBack20210122.html

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

@@ -80,7 +80,7 @@ public interface TsaBusinessDao {
 	 * @author gagamel
 	 * @since 2020. 11. 24
 	 */
-	Collection<DelvFeePolicy> getDeliveryFeePolicyList(String supplyCompCd);
+	Collection<DelvFeePolicy> getDeliveryFeePolicyList(DelvFeePolicy delvFeePolicy);
 
 	/**
 	 * 배송비정책 생성

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

@@ -1,14 +1,22 @@
 package com.style24.admin.biz.dao;
 
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Counsel;
 import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.CustContactHst;
+import com.style24.persistence.domain.CustGrade;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.CustomerSearch;
 import com.style24.persistence.domain.Delivery;
+import com.style24.persistence.domain.GiftCard;
 import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.Point;
+import com.style24.persistence.domain.Review;
+
 import org.springframework.stereotype.Repository;
 
 import java.util.Collection;
+import java.util.concurrent.CompletionException;
 
 /**
  * 회원 Dao
@@ -46,6 +54,15 @@ public interface TsaCustomerDao {
 	 */
 	void updateCustomerInfo(Customer customer);
 
+
+	/**
+	 * 회원 휴대전화번호 수정
+	 * @param customer - 고객정보
+	 * @author jsshin
+	 * @since 2021. 01. 25
+	 */
+	void updateCustomerCellPhnno(Customer customer);
+
 	/**
 	 * 회원 주문내역
 	 * @param custNo - 고객번호
@@ -93,6 +110,86 @@ public interface TsaCustomerDao {
 	 */
 	Collection<Coupon> getCustomerCouponList(Integer custNo);
 
+	/**
+	 * 회원상세-포인트
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Point
+	 * @author jsshin
+	 * @since 2021. 01. 25
+	 */
+	Point getCustomerPoint(Integer custNo);
+
+	/**
+	 * 회원상세-포인트내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Coupon>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	Collection<Point> getCustomerPointList(Integer custNo);
+
+	/**
+	 * 회원상세-상품권내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<GiftCard>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	Collection<GiftCard> getCustomerGiftCardList(Integer custNo);
+
+	/**
+	 * 회원상세-상품평내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Review>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	Collection<Review> getCustomerReviewList(Integer custNo);
+
+	/**
+	 * 회원상세- 1:1문의 내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Counsel>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	Collection<Counsel> getCustomerCounselList(Integer custNo);
+
+	/**
+	 * 회원상세- 상품문의 내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Counsel>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	Collection<Counsel> getCustomerGoodsQnaList(Integer custNo);
+
+	/**
+	 * 회원상세- 등급변경 내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Counsel>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	Collection<CustGrade> getCustomerChangeGradeList(Integer custNo);
+
+	/**
+	 * 회원상세- 접촉내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Counsel>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	Collection<CustContactHst> getCustomerContactList(Integer custNo);
+
 	/**
 	 * 탈퇴회원 목록
 	 * @param customerSearch - 검색조건

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

@@ -1,10 +1,9 @@
 package com.style24.admin.biz.dao;
 
+import com.gagaframework.excel.xssf.GagaExcelResultHandler;
 import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.MoreBetter;
-import com.style24.persistence.domain.MoreBetterBurden;
-import com.style24.persistence.domain.MoreBetterGoods;
-import com.style24.persistence.domain.MoreBetterSection;
+import com.style24.persistence.domain.*;
+import org.apache.ibatis.session.ResultHandler;
 import org.springframework.stereotype.Component;
 
 import java.util.Collection;
@@ -203,7 +202,7 @@ public interface TsaMorebetterDao {
      * @author bin2107
      * @since 2021. 1. 22
      */
-    void deleteTmtbGoodsTemp();
+    void deleteTmtbGoodsTemp(MoreBetterGoods moreBetterGoods);
 
     /**
      * 다다익선 - 진행중인 다다익선 상품 조회 insert
@@ -212,7 +211,7 @@ public interface TsaMorebetterDao {
      * @author bin2107
      * @since 2021. 1. 22
      */
-    void createTmtbGoodsTemp();
+    void createTmtbGoodsTemp(MoreBetterGoods moreBetterGoods);
 
     /**
      * 다다익선 중복 상품 조회
@@ -222,5 +221,6 @@ public interface TsaMorebetterDao {
      * @since 2021. 1. 12
      */
     Collection<MoreBetterGoods> getMorebetterDuplicateList(MoreBetterGoods moreBetterGoods);
+
     /* // CSB 진행 */
 }

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

@@ -107,8 +107,8 @@ public class TsaBusinessService {
 	 * @author gagamel
 	 * @since 2020. 11. 24
 	 */
-	public Collection<DelvFeePolicy> getDeliveryFeePolicyList(String supplyCompCd) {
-		return businessDao.getDeliveryFeePolicyList(supplyCompCd);
+	public Collection<DelvFeePolicy> getDeliveryFeePolicyList(DelvFeePolicy delvFeePolicy) {
+		return businessDao.getDeliveryFeePolicyList(delvFeePolicy);
 	}
 
 	/**

+ 136 - 0
src/main/java/com/style24/admin/biz/service/TsaCustomerService.java

@@ -4,11 +4,18 @@ 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.persistence.domain.Counsel;
 import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.CustContactHst;
+import com.style24.persistence.domain.CustGrade;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.CustomerSearch;
 import com.style24.persistence.domain.Delivery;
+import com.style24.persistence.domain.GiftCard;
 import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.Point;
+import com.style24.persistence.domain.Review;
+
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -82,6 +89,21 @@ public class TsaCustomerService {
 		coreCustomerService.updateCustomerPassword(customer);
 	}
 
+	/**
+	 * 회원 휴대전화번호 수정
+	 * @param customer - 고객정보
+	 * @author jsshin
+	 * @since 2020. 01. 25
+	 */
+	@Transactional("shopTxnManager")
+	public void updateCustomerCellphnno(Customer customer) {
+		Integer userNo = TsaSession.getInfo().getUserNo();
+		customer.setRegNo(userNo);
+		customer.setUpdNo(userNo);
+		coreCustomerService.createCustomerHistory(customer);
+		customerDao.updateCustomerCellPhnno(customer);
+	}
+
 	/**
 	 * 회원 주문내역
 	 * @param custNo - 고객번호
@@ -135,6 +157,120 @@ public class TsaCustomerService {
 		return customerDao.getCustomerCouponList(custNo);
 	}
 
+	/**
+	 * 회원상세-포인트
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Point
+	 * @author jsshin
+	 * @since 2021. 01. 25
+	 */
+	public Point getCustomerPoint(Integer custNo){
+		return customerDao.getCustomerPoint(custNo);
+	}
+
+	/**
+	 * 회원상세-포인트내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Coupon>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	public Collection<Point> getCustomerPointList(Integer custNo) {
+		return customerDao.getCustomerPointList(custNo);
+	}
+
+	/**
+	 * 회원상세-상품권내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<GiftCard>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	public Collection<GiftCard> getCustomerGiftCardList(Integer custNo) {
+		return customerDao.getCustomerGiftCardList(custNo);
+	}
+
+	/**
+	 * 회원상세-상품평내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Review>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	public Collection<Review> getCustomerReviewList(Integer custNo) {
+		return customerDao.getCustomerReviewList(custNo);
+	}
+
+	/**
+	 * 회원상세- 1:1문의 내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Counsel>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	public Collection<Counsel> getCustomerCounselList(Integer custNo) {
+		return customerDao.getCustomerCounselList(custNo);
+	}
+
+	/**
+	 * 회원상세- 상품문의 내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Counsel>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	public Collection<Counsel> getCustomerGoodsQnaList(Integer custNo) {
+		return customerDao.getCustomerGoodsQnaList(custNo);
+	}
+
+	/**
+	 * 회원상세- 등급변경 내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Counsel>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	public Collection<CustGrade> getCustomerChangeGradeList(Integer custNo) {
+		return customerDao.getCustomerChangeGradeList(custNo);
+	}
+
+	/**
+	 * 회원상세- 접촉내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Counsel>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	public Collection<CustContactHst> getCustomerContactList(Integer custNo) {
+		return customerDao.getCustomerContactList(custNo);
+	}
+
+	/**
+	 * 회원상세-회원접촉이력 생성
+	 *
+	 * @param custContactHst -고객정보
+	 * @return void
+	 * @author jsshin
+	 * @since 2021. 01. 25
+	 */
+	@Transactional("shopTxnManager")
+	public void createCustomerContactHistory(CustContactHst custContactHst) {
+		Integer userNo = TsaSession.getInfo().getUserNo();
+		custContactHst.setRegNo(userNo);
+		custContactHst.setUpdNo(userNo);
+		custContactHst.setSenderNo(userNo);
+		custContactHst.setReceiverNo(custContactHst.getCustNo());
+		coreCustomerService.createCustomerContactHistory(custContactHst);
+	}
+
 	/**
 	 * 탈퇴회원 목록
 	 * @param customerSearch - 검색조건

+ 28 - 7
src/main/java/com/style24/admin/biz/service/TsaGoodsService.java

@@ -22,6 +22,7 @@ import com.style24.persistence.domain.AdKeyword;
 import com.style24.persistence.domain.AdKeywordGoods;
 import com.style24.persistence.domain.Brand;
 import com.style24.persistence.domain.Color;
+import com.style24.persistence.domain.DelvFeePolicy;
 import com.style24.persistence.domain.FreeGoods;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsCategory;
@@ -46,6 +47,7 @@ import com.style24.persistence.domain.NoticeGoods;
 import com.style24.persistence.domain.Option;
 import com.style24.persistence.domain.ReinboundInform;
 import com.style24.persistence.domain.SearchData;
+import com.style24.persistence.domain.SupplyCompany;
 import com.style24.persistence.domain.Video;
 import com.style24.persistence.domain.WmsColorMapping;
 import com.style24.persistence.domain.WmsGoods;
@@ -873,7 +875,7 @@ public class TsaGoodsService {
 			}
 			goodsDao.updateGoodsSnm(goods);
 
-			//상품 등록후에는 고시정보는 품목과 상관없이 변경처리 가능하게 
+			//상품 등록후에는 고시정보는 품목과 상관없이 변경처리 가능하게
 //			Collection<GoodsNotiInfo> goodsNotiInfoList = goodsDao.getNewNotiInfo(goods);
 //			goodsDao.deleteGoodsNotiInfo(goods);
 //
@@ -1353,6 +1355,11 @@ public class TsaGoodsService {
 				regGoods.setSupplyCompCd(extendGoods.getSupplyCompCd());
 				regGoods.setFormalGb(extendGoods.getFormalGb());
 			}
+
+			if ("Y".equals(goodsCompose.getRepYn())) {
+				regGoods.setListPrice(extendGoods.getCurrPrice());
+				regGoods.setCurrPrice(extendGoods.getCurrPrice());
+			}
 		}
 
 		this.createGoodsExtend(regGoods, goodsComposeList); // 딜상품 관련 정보 저장
@@ -1459,8 +1466,6 @@ public class TsaGoodsService {
 
 		float pntPrate = 0f;
 		float pntMrate = 0f;
-		float sellFeeRate = 0f;
-		//String delvFeeCd = "";
 		for (Brand tmpBrand : brandList) {
 
 			if ("10".equals(regGoods.getFormalGb())) {
@@ -1470,15 +1475,31 @@ public class TsaGoodsService {
 				pntPrate = tmpBrand.getPntPrate20();
 				pntMrate = tmpBrand.getPntMrate20();
 			}
-			sellFeeRate = tmpBrand.getSellFeeRate();
-			//delvFeeCd = tmpBrand.getDelvFeeCd();
 		}
-		//regGoods.setDelvFeeCd(delvFeeCd);// 배송비전책코드
+
 		regGoods.setPntPrate(pntPrate); // 포인트적립율(PC)
 		regGoods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
-		regGoods.setSellFeeRate(sellFeeRate); // 판매수수료율
+
 		regGoods.setSelfGoodsYn("Y");
 
+		SupplyCompany supplyCompany = new SupplyCompany();
+		supplyCompany.setSupplyCompCd(regGoods.getSupplyCompCd());
+		Collection<SupplyCompany> supplyCompanyList = businessService.getSupplyCompanyList(supplyCompany);
+		if (supplyCompanyList == null || supplyCompanyList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("구성상품 중 기준 상품의 업체(판매수수율를 확인해 주세요."));
+		}
+		regGoods.setSellFeeRate(supplyCompanyList.iterator().next().getSellFeeRate()); // 판매수수료율
+
+
+		DelvFeePolicy delvFeePolicy = new DelvFeePolicy();
+		delvFeePolicy.setSupplyCompCd(regGoods.getSupplyCompCd());
+		Collection<DelvFeePolicy> deliveryFeePolicyList = businessService.getDeliveryFeePolicyList(delvFeePolicy);
+		if (deliveryFeePolicyList == null || deliveryFeePolicyList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("구성상품 중 기준 상품의 업체(배송비정책)를 확인해 주세요."));
+		}
+		regGoods.setDelvFeeCd(deliveryFeePolicyList.iterator().next().getDelvFeeCd());// 배송비정책코드
+
+
 		// 스타일 연도
 		regGoods.setStyleYear(regGoods.getStyleYear());
 

+ 43 - 31
src/main/java/com/style24/admin/biz/service/TsaKakaoService.java

@@ -59,6 +59,8 @@ public class TsaKakaoService {
 			custContactHst.setContactContents("고객 임시비밀번호 발송");
 			custContactHst.setReceiverNo(customer.getCustNo());
 			custContactHst.setSenderNo(userNo);
+			custContactHst.setRegNo(userNo);
+			custContactHst.setUpdNo(userNo);
 			coreCustomerService.createCustomerContactHistory(custContactHst);
 		} catch (Exception e) {
 			log.error("error", e);
@@ -86,12 +88,51 @@ public class TsaKakaoService {
 
 		try {
 			// 고객접촉이력 정보
+			Integer userNo = TsaSession.getInfo().getUserNo();
 			CustContactHst custContactHst = new CustContactHst();
 			custContactHst.setContactType(TscConstants.ContactType.BASIC_LMS.value()); // 접촉유형:회원-기본LMS안내발송
 			custContactHst.setContactMethod(TscConstants.ContactMethod.LMS.value()); // 접촉방법:LMS(공통코드G055)
 			custContactHst.setContactContents("기본LMS안내발송");
 			custContactHst.setReceiverNo(customer.getCustNo());
-			custContactHst.setSenderNo(TsaSession.getInfo().getUserNo());
+			custContactHst.setSenderNo(userNo);
+			custContactHst.setRegNo(userNo);
+			custContactHst.setUpdNo(userNo);
+			coreCustomerService.createCustomerContactHistory(custContactHst);
+		} catch (Exception e) {
+			log.error("error", e);
+			// Do nothing
+		}
+	}
+
+	/**
+	 * 인증번호발송
+	 * @param customer - 인증번호 발송
+	 * @author jsshin
+	 * @since 2021. 01. 25
+	 */
+	public void sendCustomerCertNo(Customer customer) {
+		SsgDirectMessage dm = new SsgDirectMessage();
+		dm.setFdestine(customer.getCellPhnno());
+		dm.setFkkoresendtype("LMS");
+
+		GagaMap replaceInfo = new GagaMap();
+		replaceInfo.setString("siteNm", TscConstants.Style24Infomation.SITE_NAME.value());
+		replaceInfo.setString("custNm", customer.getCustNm());
+		replaceInfo.setString("certNo", customer.getCertNo());
+
+		kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.CertNoSend.value(), dm, replaceInfo);
+
+		try {
+			// 고객접촉이력 정보
+			Integer userNo = TsaSession.getInfo().getUserNo();
+			CustContactHst custContactHst = new CustContactHst();
+			custContactHst.setContactType(TscConstants.ContactType.CELLPHONE_AUTHENTICATION.value()); // 접촉유형:회원-휴대전화인증(공통코드G054)
+			custContactHst.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value()); // 접촉방법:알림톡+문자(공통코드G055)
+			custContactHst.setContactContents("인증번호");
+			custContactHst.setReceiverNo(customer.getCustNo());
+			custContactHst.setSenderNo(userNo);
+			custContactHst.setRegNo(userNo);
+			custContactHst.setUpdNo(userNo);
 			coreCustomerService.createCustomerContactHistory(custContactHst);
 		} catch (Exception e) {
 			log.error("error", e);
@@ -134,36 +175,7 @@ public class TsaKakaoService {
 //		}
 //	}
 //
-//	/**
-//	 * 인증번호발송
-//	 * @param customer - 인증번호 발송
-//	 * @author jsshin
-//	 * @since 2020. 4. 8
-//	 */
-//	public void sendCustomerCertNo(AdmCustomer customer) {
-//		SsgDirectMessage dm = new SsgDirectMessage();
-//		dm.setFdestine(customer.getCellPhnno());
-//		dm.setFkkoresendtype("LMS");
-//
-//		GagaMap replaceInfo = new GagaMap();
-//		replaceInfo.setString("siteNm", customer.getSiteNm());
-//		replaceInfo.setString("custNm", customer.getCustNm());
-//		replaceInfo.setString("certNo", customer.getCertNo());
-//
-//		kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.CertNoSend.value(), dm, replaceInfo);
-//
-//		try {
-//			// 고객접촉이력 정보
-//			customer.setContactType("209"); // 접촉유형:1:1문의답변(공통코드G054)
-//			customer.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value()); // 접촉방법:알림톡+문자(공통코드G055)
-//			customer.setContactContents("인증번호");
-//			customer.setReceiverId(customer.getCustNo());
-//			customerService.createCustomerContactHistory(customer);
-//		} catch (Exception e) {
-//			log.error("error", e);
-//			// Do nothing
-//		}
-//	}
+
 //
 //	/**
 //	 * 품절에의한 주문취소 안내

+ 5 - 4
src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java

@@ -398,10 +398,11 @@ public class TsaMorebetterService {
      * @since 2021. 1. 22
      */
     @Transactional("shopTxnManager")
-    public void createMorebetterGoodsTemp(){
-        log.info("[deleteTmtbGoodsTemp a]{}");
-        morebetterDao.deleteTmtbGoodsTemp();
-        //morebetterDao.createTmtbGoodsTemp();
+    public void createMorebetterGoodsTemp(MoreBetterGoods moreBetterGoods){
+        moreBetterGoods.setRegNo(TsaSession.getInfo().getUserNo());
+
+        morebetterDao.deleteTmtbGoodsTemp(moreBetterGoods);
+        morebetterDao.createTmtbGoodsTemp(moreBetterGoods);
     }
 
     /**

+ 3 - 1
src/main/java/com/style24/admin/biz/web/TsaBusinessController.java

@@ -249,7 +249,9 @@ public class TsaBusinessController extends TsaBaseController {
 	@GetMapping("/delivery/fee/policy/list/{supplyCompCd}")
 	@ResponseBody
 	public Collection<DelvFeePolicy> getDeliveryFeePolicyList(@PathVariable String supplyCompCd) {
-		return businessService.getDeliveryFeePolicyList(supplyCompCd);
+		DelvFeePolicy delvFeePolicy = new DelvFeePolicy();
+		delvFeePolicy.setSupplyCompCd(supplyCompCd);
+		return businessService.getDeliveryFeePolicyList(delvFeePolicy);
 	}
 
 	/**

+ 118 - 81
src/main/java/com/style24/admin/biz/web/TsaCustomerController.java

@@ -2,7 +2,9 @@ package com.style24.admin.biz.web;
 
 import java.util.Collection;
 
+import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.security.GagaPasswordEncoder;
+import com.gagaframework.web.util.GagaStringUtil;
 import com.style24.admin.biz.service.TsaCustomerService;
 import com.style24.admin.biz.service.TsaKakaoService;
 import com.style24.admin.biz.service.TsaSystemService;
@@ -10,9 +12,12 @@ import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.session.TscSession;
 import com.style24.core.support.util.CryptoUtils;
 import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.CustContactHst;
+import com.style24.persistence.domain.CustGrade;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.CustomerSearch;
 import com.style24.persistence.domain.Delivery;
+import com.style24.persistence.domain.GiftCard;
 import com.style24.persistence.domain.Order;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -38,6 +43,8 @@ import com.style24.persistence.domain.Counsel;
 import lombok.extern.slf4j.Slf4j;
 
 import com.gagaframework.web.rest.server.GagaResponse;
+import com.style24.persistence.domain.Point;
+import com.style24.persistence.domain.Review;
 
 /**
  * 고객 Controller
@@ -373,6 +380,8 @@ public class TsaCustomerController extends TsaBaseController {
 		// 포인트반영상태
 		mav.addObject("pntUploadStatList", rendererService.getCommonCodeList("G070"));
 
+		// 상품권유형
+		mav.addObject("giftCardOccurGbList", rendererService.getCommonCodeList("G074"));
 
 		mav.addObject("custNo", custNo);
 
@@ -493,6 +502,32 @@ public class TsaCustomerController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0005"));
 	}
 
+	/**
+	 * 메시지 발송 팝업 화면
+	 *
+	 * @param elementCellPhnno - 휴대폰
+	 * @param elementCustNo - 고객일련번호
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 01. 25
+	 */
+	@GetMapping("/cellphone/change/popup/form")
+	public ModelAndView cellphoneChangePopupForm(@RequestParam(value = "elementCellPhnno", required = false) String elementCellPhnno
+			, @RequestParam(value = "elementCustNo") String elementCustNo) {
+		ModelAndView mav = new ModelAndView();
+		// 휴대폰 번호
+		mav.addObject("elementCellPhnno", elementCellPhnno);
+
+		// 고객 아이디
+		mav.addObject("elementCustNo", elementCustNo);
+
+		mav.addObject("callBack", TscConstants.CALLCENTER_TEL_NO);
+
+		mav.setViewName("customer/CellphoneChangePopupForm");
+
+		return mav;
+	}
+
 	/**
 	 * 인증번호 발송
 	 *
@@ -504,21 +539,25 @@ public class TsaCustomerController extends TsaBaseController {
 	@PostMapping("/certno/send")
 	@ResponseBody
 	public GagaResponse sendCustomerCertNo(@RequestBody Customer customer) {
-//		String certNo = GagaStringUtil.getRandomNumber(6);
-//		TsaSession.setAttribute("certNo", certNo);
-//		customer.setCertNo(certNo);
-//		log.info("certNo {}", certNo);
-//
-//		// 카카오알림톡 발송(카카오 템플릿 문구검수 후 변경 해야함)
-//		// 광고가 아니므로 SMS수신동의여부 체크할 필요 없음. 무조건 발송해야 함
-//		if (StringUtils.isNotBlank(customer.getCellPhnno())) {
-//			try {
-//				kakaoService.sendCustomerCertNo(customer);
-//			} catch (Exception e) {
-//				log.error(e.getMessage());
-//			}
-//
-//		}
+		String certNo = GagaStringUtil.getRandomNumber(6);
+		TsaSession.setAttribute("certNo", certNo);
+		TsaSession.setAttribute("cellPhnno", customer.getCellPhnno());
+
+		Customer custInfo = customerService.getCustomerInfo(customer.getCustNo());
+		customer.setCustNm(custInfo.getCustNm());
+		customer.setCertNo(certNo);
+		log.info("certNo {}", certNo);
+
+		// 카카오알림톡 발송(카카오 템플릿 문구검수 후 변경 해야함)
+		// 광고가 아니므로 SMS수신동의여부 체크할 필요 없음. 무조건 발송해야 함
+		if (StringUtils.isNotBlank(customer.getCellPhnno())) {
+			try {
+				kakaoService.sendCustomerCertNo(customer);
+			} catch (Exception e) {
+				log.error(e.getMessage());
+			}
+
+		}
 
 		return super.ok(message.getMessage("SUCC_0005"));
 	}
@@ -527,21 +566,28 @@ public class TsaCustomerController extends TsaBaseController {
 	 * 인증번호 확인
 	 *
 	 * @param customer -고객정보
-	 * @return Customer
+	 * @return GagaMap
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 01. 25
 	 */
 	@PostMapping("/certno/confirm")
 	@ResponseBody
-	public Customer confirmCustomerCertNo(@RequestBody Customer customer) {
-		Customer custResult = new Customer();
-//		String certNo = TsaSession.getAttribute("certNo");
-//		String result = "N";
-//		if (certNo.equals(customer.getCrtfdNo())) {
-//			result = "Y";
-//		}
-//		custResult.setCrtfdNoYn(result);
-		return custResult;
+	public GagaMap confirmCustomerCertNo(@RequestBody Customer customer) {
+		String certNo = TsaSession.getAttribute("certNo");
+		String cellPhnno = TsaSession.getAttribute("cellPhnno");
+		String crtfdNoYn = "N";
+
+		if (certNo.equals(customer.getCertNo())) {
+			customer.setCellPhnno(cellPhnno);
+			if (StringUtils.isNotBlank(cellPhnno)) {
+				customerService.updateCustomerCellphnno(customer);
+			}
+			crtfdNoYn = "Y";
+		}
+
+		GagaMap result = new GagaMap();
+		result.setString("crtfdNoYn", crtfdNoYn);
+		return result;
 	}
 
 	/**
@@ -658,80 +704,74 @@ public class TsaCustomerController extends TsaBaseController {
 	}
 
 	/**
-	 * 회원상세-1:1문의내역
+	 * 회원상세-포인트
 	 *
 	 * @param custNo -고객일련번호
-	 * @return Collection<Counsel>
+	 * @return Point
 	 * @author jsshin
 	 * @since 2021. 01. 21
 	 */
-	@GetMapping("/counsel/list/{custNo}")
+	@GetMapping("/point/{custNo}")
 	@ResponseBody
-	public Collection<Counsel> getCustomerCounselList(@PathVariable Integer custNo) {
-		//return customerService.getCustomerCounselList(custNo);
-		return null;
+	public Point getCustomerPoint(@PathVariable Integer custNo) {
+		return customerService.getCustomerPoint(custNo);
 	}
 
 	/**
-	 * 회원상세-상품문의내역
+	 * 회원상세-포인트내역
 	 *
 	 * @param custNo -고객일련번호
-	 * @return Collection<Counsel>
+	 * @return Collection<TsaPoint>
 	 * @author jsshin
 	 * @since 2021. 01. 21
 	 */
-	@GetMapping("/goodsQna/list/{custNo}")
+	@GetMapping("/point/list/{custNo}")
 	@ResponseBody
-	public Collection<Counsel> getCustomerGoodsQnaList(@PathVariable Integer custNo) {
-		//return customerService.getCustomerGoodsQnaList(custNo);
-		return null;
+	public Collection<Point> getCustomerPointList(@PathVariable Integer custNo) {
+		return customerService.getCustomerPointList(custNo);
 	}
 
 	/**
-	 * 회원상세-상품문의 상세화면
+	 * 회원상세-1:1문의내역
 	 *
-	 * @param counselSq -상담일련번호
-	 * @return ModelAndView
+	 * @param custNo -고객일련번호
+	 * @return Collection<Counsel>
 	 * @author jsshin
 	 * @since 2021. 01. 21
 	 */
-	@GetMapping("/goodsQna/detail/form/{counselSq}")
-	public ModelAndView goodsQnaDetailForm(@PathVariable String counselSq) {
-		ModelAndView mav = new ModelAndView();
-		// 문의상세
-		//mav.addObject("goodsQna", customerService.getGoodsQnaDetail(counselSq));
-		mav.setViewName("customer/GoodsQnaPopupForm");
-		return mav;
+	@GetMapping("/giftcard/list/{custNo}")
+	@ResponseBody
+	public Collection<GiftCard> getCustomerGiftCardList(@PathVariable Integer custNo) {
+		return customerService.getCustomerGiftCardList(custNo);
 	}
 
-
 	/**
-	 * 회원상세-포인트
+	 * 회원상세-1:1문의내역
 	 *
 	 * @param custNo -고객일련번호
-	 * @return TsaPoint
+	 * @return Collection<Counsel>
 	 * @author jsshin
 	 * @since 2021. 01. 21
 	 */
-//	@GetMapping("/point/{custNo}")
-//	@ResponseBody
-//	public Point getCustomerPoint(@PathVariable Integer custNo) {
-//		return customerService.getCustomerPoint(custNo);
-//	}
+	@GetMapping("/counsel/list/{custNo}")
+	@ResponseBody
+	public Collection<Counsel> getCustomerCounselList(@PathVariable Integer custNo) {
+		return customerService.getCustomerCounselList(custNo);
+	}
 
 	/**
-	 * 회원상세-포인트내역
+	 * 회원상세-상품문의내역
 	 *
 	 * @param custNo -고객일련번호
-	 * @return Collection<TsaPoint>
+	 * @return Collection<Counsel>
 	 * @author jsshin
 	 * @since 2021. 01. 21
 	 */
-//	@GetMapping("/point/list/{custNo}")
-//	@ResponseBody
-//	public Collection<TsaPoint> getCustomerPointList(@PathVariable Integer custNo) {
-//		return customerService.getCustomerPointList(custNo);
-//	}
+	@GetMapping("/goodsQna/list/{custNo}")
+	@ResponseBody
+	public Collection<Counsel> getCustomerGoodsQnaList(@PathVariable Integer custNo) {
+		return customerService.getCustomerGoodsQnaList(custNo);
+	}
 
 	/**
 	 * 회원상세-상품평내역
@@ -741,11 +781,11 @@ public class TsaCustomerController extends TsaBaseController {
 	 * @author jsshin
 	 * @since 2021. 01. 21
 	 */
-//	@GetMapping("/review/list/{custNo}")
-//	@ResponseBody
-//	public Collection<Review> getCustomerReviewList(@PathVariable Integer custNo) {
-//		return customerService.getCustomerReviewList(custNo);
-//	}
+		@GetMapping("/review/list/{custNo}")
+		@ResponseBody
+		public Collection<Review> getCustomerReviewList(@PathVariable Integer custNo) {
+			return customerService.getCustomerReviewList(custNo);
+		}
 
 	/**
 	 * 회원상세-회원등급변경이력
@@ -755,12 +795,11 @@ public class TsaCustomerController extends TsaBaseController {
 	 * @author jsshin
 	 * @since 2021. 01. 21
 	 */
-//	@GetMapping("/change/grade/list/{custNo}")
-//	@ResponseBody
-//	public Collection<TsaCustomer> getCustomerChageGradeList(@PathVariable Integer custNo) {
-//		return customerService.getCustomerChangeGradeList(custNo);
-//	}
-
+		@GetMapping("/change/grade/list/{custNo}")
+		@ResponseBody
+		public Collection<CustGrade> getCustomerChageGradeList(@PathVariable Integer custNo) {
+			return customerService.getCustomerChangeGradeList(custNo);
+		}
 
 	/**
 	 * 회원상세-회원접촉이력
@@ -772,24 +811,22 @@ public class TsaCustomerController extends TsaBaseController {
 	 */
 	@GetMapping("/contact/list/{custNo}")
 	@ResponseBody
-	public Collection<Customer> getCustomerContactList(@PathVariable Integer custNo) {
-		//return customerService.getCustomerContactList(custNo);
-		return null;
+	public Collection<CustContactHst> getCustomerContactList(@PathVariable Integer custNo) {
+		return customerService.getCustomerContactList(custNo);
 	}
 
 	/**
 	 * 회원상세-회원접촉이력 생성
 	 *
-	 * @param customer -고객정보
+	 * @param custContactHst -고객정보
 	 * @return GagaResponse
 	 * @author jsshin
 	 * @since 2021. 01. 21
 	 */
 	@PostMapping("/contact/create")
 	@ResponseBody
-	public GagaResponse createCustomerContactHistory(@RequestBody Customer customer) {
-//		customer.setReceiverId(customer.getCustNo());
-//		customerService.createCustomerContactHistory(customer);
+	public GagaResponse createCustomerContactHistory(@RequestBody CustContactHst custContactHst) {
+		customerService.createCustomerContactHistory(custContactHst);
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 

+ 81 - 118
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -4,10 +4,19 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.gagaframework.web.util.GagaDateUtil;
+import com.gagaframework.web.util.GagaFileUtil;
+import com.style24.persistence.TscPageRequest;
+import com.style24.persistence.domain.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
+import org.springframework.core.io.InputStreamResource;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -22,28 +31,18 @@ import com.style24.admin.biz.service.TsaCouponService;
 import com.style24.admin.biz.service.TsaFreegiftPromotionService;
 import com.style24.admin.biz.service.TsaMorebetterService;
 import com.style24.admin.biz.service.TsaRendererService;
-import com.style24.admin.biz.service.TsaReviewService;
 import com.style24.admin.biz.service.TsaSystemService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.persistence.TscPageRequest;
-import com.style24.persistence.domain.CommonCode;
-import com.style24.persistence.domain.Coupon;
-import com.style24.persistence.domain.CouponRefval;
-import com.style24.persistence.domain.CustCoupon;
-import com.style24.persistence.domain.FreeGoodsPromotion;
-import com.style24.persistence.domain.MoreBetter;
-import com.style24.persistence.domain.MoreBetterBurden;
-import com.style24.persistence.domain.MoreBetterGoods;
-import com.style24.persistence.domain.MoreBetterSection;
-import com.style24.persistence.domain.Review;
 
 import lombok.extern.slf4j.Slf4j;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.rest.server.GagaResponse;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * 마케팅 Controller
  * @author xodud1202
@@ -60,9 +59,6 @@ public class TsaMarketingController extends TsaBaseController {
 	@Autowired
 	private Environment env;
 
-	@Autowired
-	private TsaReviewService reviewService;
-
 	@Autowired
 	private TsaFreegiftPromotionService freegiftService;
 
@@ -84,84 +80,6 @@ public class TsaMarketingController extends TsaBaseController {
 	@Autowired
 	private TsaCouponService couponService;
 
-	/**
-	 * 상품평관리 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2021. 1. 25
-	 */
-	@GetMapping("/review/form")
-	public ModelAndView reviewForm() {
-		ModelAndView mav = new ModelAndView("marketing/ReviewForm");
-
-		// 사이즈점수
-		mav.addObject("scoreSizeList", rendererService.getAvailCommonCodeList("G040"));
-
-		// 색상점수
-		mav.addObject("scoreColorList", rendererService.getAvailCommonCodeList("G039"));
-
-		// 핏점수
-		mav.addObject("scoreFitList", rendererService.getAvailCommonCodeList("G042"));
-
-		// 두께감점수
-		mav.addObject("scoreThickList", rendererService.getAvailCommonCodeList("G079"));
-
-		// 무게감점수
-		mav.addObject("scoreWeightList", rendererService.getAvailCommonCodeList("G080"));
-
-		// 발볼넓이점수(G041)
-		mav.addObject("scoreBallList", rendererService.getAvailCommonCodeList("G041"));
-
-		// 포인트지급상태
-		mav.addObject("pntGiveStatList", rendererService.getAvailCommonCodeList("G043"));
-
-//		// 품목
-//		mav.addObject("itemkindList", rendererService.getAllItemkindList());
-//		
-//		// 브랜드그룹
-//		mav.addObject("brandGrpNmList", rendererService.getBrandGroupList());
-//		
-//		// MD
-//		mav.addObject("brandMdList", rendererService.getBrandMdList());
-//
-//		// 카테고리
-//		mav.addObject("tCateList", rendererService.getTCategoryList(""));
-//
-//		// 브랜드 조회
-//		mav.addObject("brandList", rendererService.getSupplyCompanyBrandList(""));
-
-		return mav;
-	}
-
-	/**
-	 * 상품평 목록
-	 * @param review - 상품평 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2021. 1. 25
-	 */
-	@PostMapping("/review/list")
-	@ResponseBody
-	public GagaMap getReviewList(@RequestBody Review review) {
-		GagaMap result = new GagaMap();
-
-		// multi row 검색관련 처리
-		if (StringUtils.isNotBlank(review.getGoodsCd())) {
-			review.setGoodsCds(review.getGoodsCd().replaceAll("\r", "").split("\n"));
-		}
-
-		// 상품평 목록
-		Collection<Review> reviewList = reviewService.getReviewList(review);
-
-		review.setPageable(new TscPageRequest(review.getPageNo() - 1, review.getPageSize()));
-		review.getPageable().setTotalCount(reviewList.size());
-
-		result.set("paging", review);
-		result.set("dataList", reviewList);
-
-		return result;
-	}
-
 	/* xodud1202 진행 */
 	/**
 	 * 사은품 프로모션 관리 화면
@@ -242,7 +160,7 @@ public class TsaMarketingController extends TsaBaseController {
 	public GagaResponse freeGoodsPromotionSave(@RequestBody FreeGoodsPromotion param) {
 		try {
 			freegiftService.saveFreegoodsPromotionInfo(param);
-		} catch (Exception e) {
+		} catch(Exception e) {
 			e.printStackTrace();
 			return super.error(message.getMessage("FAIL_0001"));
 		}
@@ -262,7 +180,7 @@ public class TsaMarketingController extends TsaBaseController {
 	public GagaResponse freeGoodsPromotionChangeStat(@RequestBody FreeGoodsPromotion param) {
 		try {
 			freegiftService.updateFreegoodsPromotionStat(param);
-		} catch (Exception e) {
+		} catch(Exception e) {
 			e.printStackTrace();
 			return super.error(message.getMessage("FAIL_0001"));
 		}
@@ -270,6 +188,7 @@ public class TsaMarketingController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 
+
 	/* // xodud1202 진행 */
 
 	/* JSM 진행 */
@@ -330,7 +249,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") String cpnId ) {
 		ModelAndView mav = new ModelAndView();
 		String num = "";
 		String mode = "N";
@@ -378,17 +297,17 @@ public class TsaMarketingController extends TsaBaseController {
 		// 입점업체 조회
 		mav.addObject("ibSupplyCompList", rendererService.getSupplyCompanyList("", "N"));
 		// 정상/이월 조회
-		mav.addObject("formalGbList", rendererService.getCommonCodeList("G009"));
+		mav.addObject("formalGbList" , rendererService.getCommonCodeList("G009"));
 		// 카테고리 구분 조회
-		mav.addObject("cateGbList", rendererService.getCommonCodeList("G032"));
+		mav.addObject("cateGbList" , rendererService.getCommonCodeList("G032"));
 		// 자사 브랜드 조회
-		mav.addObject("selfBrandList", couponService.getSelfBrandList());
+		mav.addObject("selfBrandList" , couponService.getSelfBrandList());
 		// 사이트코드 조회
 		mav.addObject("siteCdList", rendererService.getCommonCodeList("G000"));
 		// 쿠폰상태 조회
 		mav.addObject("cpnStatList", rendererService.getCommonCodeList("G232"));
 		// 쿠폰 유형 조회
-		mav.addObject("cpnTypeList", rendererService.getCommonCodeList("G230", "Y"));
+		mav.addObject("cpnTypeList", rendererService.getCommonCodeList("G230" , "Y"));
 		// 사용가능 고객구분 조회
 		mav.addObject("usableCustGbList", rendererService.getCommonCodeList("G100"));
 		// 사용가능 고객등급 조회
@@ -405,29 +324,29 @@ public class TsaMarketingController extends TsaBaseController {
 		mav.addObject("upperAfLinkCdList", rendererService.getCommonCodeList("G053"));
 
 		// 이미 쿠폰 아이디가 있으면 적용대상 조회
-		if (!StringUtils.isBlank(cpnId)) {
+		if(!StringUtils.isBlank(cpnId)) {
 			mode = "U";
 			issueCnt = couponService.getCouponIssueCnt(cpnId);
 			// 쿠폰상세조회
-			mav.addObject("cpnDetail", couponService.getCouponDetail(cpnId));
+			mav.addObject("cpnDetail" , couponService.getCouponDetail(cpnId));
 			// 쿠폰적용대상 - 공급업체 조회
-			mav.addObject("cpnDtlRefvalSupplyCompList", couponService.getCouponRefvalSupplyCompList(cpnId));
+			mav.addObject("cpnDtlRefvalSupplyCompList" , couponService.getCouponRefvalSupplyCompList(cpnId));
 			// 쿠폰적용대상 - 적용상품 조회
-			mav.addObject("cpnDtlRefvalApplyGoodsList", couponService.getCouponRefvalGoodsList(cpnId, "G260_10"));
+			mav.addObject("cpnDtlRefvalApplyGoodsList" , couponService.getCouponRefvalGoodsList(cpnId , "G260_10"));
 			// 쿠폰적용대상 - 카테고리 조회
-			mav.addObject("cpnDtlRefvalCateList", couponService.getCouponRefvalCategoryList(cpnId));
+			mav.addObject("cpnDtlRefvalCateList" , couponService.getCouponRefvalCategoryList(cpnId));
 			// 쿠폰적용대상 - 브랜드 조회
-			mav.addObject("cpnDtlRefvalBrandList", couponService.getCouponRefvalBrandList(cpnId));
+			mav.addObject("cpnDtlRefvalBrandList" , couponService.getCouponRefvalBrandList(cpnId));
 			// 쿠폰적용대상 - 제외상품 조회
-			mav.addObject("cpnDtlRefvalExceptGoodsList", couponService.getCouponRefvalGoodsList(cpnId, "G260_14"));
+			mav.addObject("cpnDtlRefvalExceptGoodsList" , couponService.getCouponRefvalGoodsList(cpnId , "G260_14"));
 			// 쿠폰 입점업체분담율 조회
-			mav.addObject("cpnDtlBurdenList", couponService.getCouponBurdenList(cpnId));
+			mav.addObject("cpnDtlBurdenList" , couponService.getCouponBurdenList(cpnId));
 		}
 
 		//issueCnt = 3;
 
-		mav.addObject("mode", mode);
-		mav.addObject("issueCnt", issueCnt);
+		mav.addObject("mode" , mode);
+		mav.addObject("issueCnt" , issueCnt);
 
 		mav.setViewName("marketing/CouponPopupForm");
 		return mav;
@@ -467,6 +386,7 @@ public class TsaMarketingController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 
+
 	/**
 	 * 쿠폰발행팝업
 	 * @param
@@ -519,14 +439,14 @@ public class TsaMarketingController extends TsaBaseController {
 		// 시간 시 리스트 세팅
 		mav.addObject("hhList", hhList);
 		// 사이트조회
-		mav.addObject("siteCdList", rendererService.getCommonCodeList("G000"));
+		mav.addObject("siteCdList" , rendererService.getCommonCodeList("G000"));
 		// 사용가능 고객구분 조회
 		mav.addObject("usableCustGbList", rendererService.getCommonCodeList("G100"));
 		// 사용가능 고객등급 조회
 		mav.addObject("usableCustGradeList", rendererService.getCommonCodeList("G110"));
 		// 쿠폰발행사유 조회
 		mav.addObject("cpnPubReasonList", rendererService.getCommonCodeList("G068"));
-
+		
 		mav.setViewName("marketing/CouponPubForCustPopupForm");
 
 		return mav;
@@ -541,7 +461,7 @@ public class TsaMarketingController extends TsaBaseController {
 	 */
 	@PostMapping("/coupon/insertCustPub")
 	@ResponseBody
-	public GagaResponse saveCouponCustPub(@RequestBody CustCoupon custCoupon) {
+	public GagaResponse saveCouponCustPub(@RequestBody CustCoupon custCoupon ){
 		couponService.saveCouponCustPub(custCoupon);
 
 		return super.ok(message.getMessage("SUCC_0006"));
@@ -660,31 +580,74 @@ public class TsaMarketingController extends TsaBaseController {
 	 * @author bin2107
 	 * @since 2021. 1. 5
 	 */
-
 	@PostMapping("/morebetter/save")
 	@ResponseBody
-	public GagaResponse saveMorebetterDetail(@RequestBody MoreBetter moreBetter) {
+	public GagaMap saveMorebetterDetail(@RequestBody MoreBetter moreBetter){
+		String result = "";
+		GagaMap map = new GagaMap();
+
+		String[] multiSupplyCompCd = moreBetter.getSupplyCompArr().split(",");
+		String[] multiBrand = moreBetter.getBrandArr().split(",");
+		String[] multiGoods = moreBetter.getGoodsArr().split(",");
+
+		MoreBetterGoods moreBetterGoods = new MoreBetterGoods();
+
+		moreBetterGoods.setMultiSupplyCompCd(multiSupplyCompCd);
+		moreBetterGoods.setMultiBrand(multiBrand);
+		moreBetterGoods.setMultiGoods(multiGoods);
+		log.info("[1 saveMorebetterDetail moreBetterGoods]{}",moreBetterGoods);
+
+		// TMTB_GOODS_TEMP TABLE TRUNCATE -> 다른 다다에서 사용중인 상품 조회 -> INSERT
+		morebetterService.createMorebetterGoodsTemp(moreBetterGoods);
+		//log.info("[saveMorebetterDetail createMorebetterGoodsTemp a]{}");
+		// 다른 다다에서 사용중인 상품 조회
+		Collection<MoreBetterGoods> duplicateGoodsList = morebetterService.getMorebetterDuplicateList(moreBetterGoods);
+
+		log.info("[1 duplicateGoodsList size]{}",duplicateGoodsList.size());
+
+		// SELECT -> 지금 내가 선택한 업체&브랜드 + 적용상품에 해당하는 상품 조회 MINUS TMTB_GOODS_TEMP 상품
+		// 조회 건수 있으면 -> 해당 상품코드 엑셀로 던져주기
+		if(duplicateGoodsList.size() > 0){
+			map.set("duplicateYn","Y");
+			map.set("msg", result);
+			map.set("duplicateGoodsList",duplicateGoodsList);
+		}else{
+			// 조회 건수 없으면 -> 저장으로 넘어감
+			//morebetterService.saveMoreBetterDetail(moreBetter);
+			map.set("duplicateYn","N");
+			map.set("msg", message.getMessage("SUCC_0001"));
+		}
+
+		return map;
+	}
+
+	@PostMapping("/morebetter/save2")
+	@ResponseBody
+	public GagaResponse saveMorebetterDetail2(@RequestBody MoreBetter moreBetter){
 		String[] multiSupplyCompCd = moreBetter.getSupplyCompArr().split(",");
 		String[] multiBrand = moreBetter.getBrandArr().split(",");
+		String[] multiGoods = moreBetter.getGoodsArr().split(",");
 
 		MoreBetterGoods moreBetterGoods = new MoreBetterGoods();
 
 		moreBetterGoods.setMultiSupplyCompCd(multiSupplyCompCd);
 		moreBetterGoods.setMultiBrand(multiBrand);
-		log.info("[saveMorebetterDetail moreBetterGoods]{}", moreBetterGoods);
+		moreBetterGoods.setMultiGoods(multiGoods);
+		log.info("[saveMorebetterDetail moreBetterGoods]{}",moreBetterGoods);
 
 		// TMTB_GOODS_TEMP TABLE TRUNCATE -> 다른 다다에서 사용중인 상품 조회 -> INSERT
-		morebetterService.createMorebetterGoodsTemp();
+		morebetterService.createMorebetterGoodsTemp(moreBetterGoods);
 		//log.info("[saveMorebetterDetail createMorebetterGoodsTemp a]{}");
 		// 다른 다다에서 사용중인 상품 조회
 		Collection<MoreBetterGoods> duplicateGoodsList = morebetterService.getMorebetterDuplicateList(moreBetterGoods);
 
-		log.info("[duplicateGoodsList size]{}", duplicateGoodsList.size());
+		log.info("[duplicateGoodsList size]{}",duplicateGoodsList.size());
 
 		// SELECT -> 지금 내가 선택한 업체&브랜드에 해당하는 상품 조회 MINUS TMTB_GOODS_TEMP 상품
 		// 조회 건수 있으면 -> 해당 상품코드 엑셀로 던져주기
 		// 조회 건수 없으면 -> 저장으로 넘어감
 
+
 		//morebetterService.saveMoreBetterDetail(moreBetter);
 		return super.ok(message.getMessage("SUCC_0001"));
 	}

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

@@ -62,50 +62,6 @@ public class TsaOrderChangeController extends TsaBaseController {
 	@Autowired
 	private TscOrderRefundService coreOrderRefundService;
 	
-	/**
-	 * 취소요청 화면
-	 * 취소신청 (NAPY, 외부몰) (배치)
-	 * @param OrderChange - 주문취소신청정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2021. 01. 20
-	 */
-	@PostMapping("/cnclReq")
-	@ResponseBody
-	public GagaResponse cnclReq(@RequestBody OrderChange cnclReq) {
-		
-		if (cnclReq== null) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-		
-		// * 필요 데이타
-		// 주문번호, 주문상세, 취소신청수량, 신청구분(취소신청, 취소완료), 몰구분(자사, NAPY, EXTMALL)
-
-		// 1. 주문변경정보등록
-		// TB_ORDER_CHANGE (등록)
-		// TB_ORDER_CHANGE_DTL (등록)
-		
-		return super.ok("성공");
-	}
-	
-	/**
-	 * 취소신청컨펌 (NAPY, 외부몰) (관리자)
-	 * @param OrderChange - 주문취소신청정보
-	 * @return
-	 * @author jsh77b
-	 * @since 2021. 01. 20
-	 */
-	@PostMapping("/cnclReqComplete")
-	@ResponseBody
-	public GagaResponse cnclReqComplete(@RequestBody OrderChange cnclReq) {
-		
-		if (cnclReq== null) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-		
-		return super.ok("성공");
-	}
-	
 	/**
 	 * 취소요청 화면 (관리자)
 	 * 
@@ -141,6 +97,80 @@ public class TsaOrderChangeController extends TsaBaseController {
 		return mav;
 	}
 	
+	/**
+	 * 취소신청 (ADMIN, NAPY, 외부몰) (배치)
+	 * 
+	 * @param OrderChange - 주문취소신청정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 01. 20
+	 */
+	@PostMapping("/cnclReq")
+	@ResponseBody
+	public GagaResponse cnclReq(@RequestBody OrderChange cnclReq) {
+		
+		GagaMap mav = new GagaMap();
+		
+		if (cnclReq== null) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+		
+		List<Order> cnclReqList = cnclReq.getCancelReqList(); // 취소요청정보목록
+		
+		// To Do List
+		// @ 결품취소로직 추가
+		// @ 주문취소시 상태값 체크
+		// @ 취소, 반품시 배송비 체크 로직 (선결제 로직)
+		
+		// 1. 세션회원조회
+		int userNo = TsaSession.getInfo().getUserNo();
+		
+		// 2. 환불금액계산
+		// 2021.01.19 취소신청정보를 목록 (주문상세번호, 취소/반품수량) 으로 표현
+		mav = coreOrderRefundService.cnclRtnRefundAmt(cnclReqList);
+		
+		// 3. 주문변경 기본정보 설정
+		mav.set("ordNo"			, cnclReq.getOrdNo());				// 주문번호
+		mav.set("chgReason"		, cnclReq.getChgReason());			// 변경사유
+		mav.set("chgMemo"		, cnclReq.getChgMemo());			// 변경메모
+		
+		mav.set("accountNo"		, cnclReq.getAccountNo());			// 환불계좌번호
+		mav.set("accountNm"		, cnclReq.getAccountNm());			// 환불계좌예금주명
+		mav.set("bankCd"		, cnclReq.getBankCd());				// 환불계좌은행코드
+		
+		mav.set("allCanYn"		, cnclReq.getAllCanYn());			// 무통장입금전 전체취소 여부
+		mav.set("isCustomer"	, cnclReq.getIsCustomer());			// 변경사유 (고객, 회사)
+		
+		// 4. 주문변경 회수지정보 추가
+		mav.set("chgerNm"		, cnclReq.getChgerNm());			// 변경자명
+		mav.set("chgerEmail"	, cnclReq.getChgerEmail());			// 변경자이메일주소
+		mav.set("chgerPhnno"	, cnclReq.getChgerPhnno());			// 변경자핸드폰번호
+		mav.set("chgerTelno"	, cnclReq.getChgerTelno());			// 변경자전화번호
+				
+		// 5. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL, TB_REFUND)
+		coreOrderChangeService.cnclReq(mav, userNo);
+		
+		return super.ok("성공");
+	}
+	
+	/**
+	 * 취소요청컨펌 (NAPY, 외부몰) (관리자)
+	 * @param OrderChange - 주문취소신청정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 01. 20
+	 */
+	@PostMapping("/cnclReqComplete")
+	@ResponseBody
+	public GagaResponse cnclReqComplete(@RequestBody OrderChange cnclReq) {
+		
+		if (cnclReq== null) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+		
+		return super.ok("성공");
+	}
+	
 	/**
 	 * 취소완료 (관리자)
 	 * @param Collection<Order> - 주문취소신청목록
@@ -148,9 +178,9 @@ public class TsaOrderChangeController extends TsaBaseController {
 	 * @author jsh77b
 	 * @since 2020. 12. 29
 	 */
-	@PostMapping("/cancel")
+	@PostMapping("/cnclComplete")
 	@ResponseBody
-	public GagaResponse orderCancel(@RequestBody OrderChange cnclReq) {
+	public GagaResponse cnclComplete(@RequestBody OrderChange cnclReq) {
 		
 		GagaMap mav = new GagaMap();
 		
@@ -158,7 +188,7 @@ public class TsaOrderChangeController extends TsaBaseController {
 			throw new IllegalStateException(message.getMessage("FAIL_1001"));
 		}
 		
-		List<Order> cnclReqList = cnclReq.getCancelReqList(); // 취소요청정보
+		List<Order> cnclReqList = cnclReq.getCancelReqList(); // 취소요청정보목록
 		
 		// To Do List
 		// @ 결품취소로직 추가

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

@@ -32,7 +32,7 @@ public class Brand extends TscBaseDomain {
 //	private String delvFeeCd;		// 배송비정책코드
 //	private int delvFee;			// 기본배송비
 //	private int minOrdAmt;			// 무료배송비최소주문금액
-	private float sellFeeRate;		// 판매수수료율
+//	private float sellFeeRate;		// 판매수수료율
 	private float pntPrate10;		// 포인트적립율(PC정상)
 	private float pntMrate10;		// 포인트적립율(모바일정상)
 	private float pntPrate20;		// 포인트적립율(PC이월)

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

@@ -42,7 +42,7 @@ public class Delivery extends TscBaseDomain {
 	private String recipNm;
 	private String recipTelno;
 	private String recipPhnno;
-	private String recipZipNo;
+	private String recipZipcode;
 	private String recipBaseAddr;
 	private String recipDtlAddr;
 	private String delvMemo;

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

@@ -67,6 +67,7 @@ public class MoreBetter extends TscBaseDomain {
 
 	private String supplyCompArr;
 	private String brandArr;
+	private String goodsArr;
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] arrCompBrandGoods;

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

@@ -47,4 +47,7 @@ public class MoreBetterGoods extends TscBaseDomain {
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] multiBrand;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiGoods;
 }

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

@@ -272,7 +272,7 @@
 	</update>
 	
 	<!-- 배송비정책 목록 -->
-	<select id="getDeliveryFeePolicyList" parameterType="String" resultType="DelvFeePolicy">
+	<select id="getDeliveryFeePolicyList" parameterType="DelvFeePolicy" resultType="DelvFeePolicy">
 		/* TsaBusiness.getDeliveryFeePolicyList */
 		SELECT DELV_FEE_CD    /*배송비정책코드*/
 		     , SUPPLY_COMP_CD /*공급업체코드*/
@@ -477,14 +477,9 @@
 		     , A.DISP_NM_LANG                /*노출명언어*/
 		     , A.RGB_CD                      /*RGB코드*/
 		     , A.DISTRIBUTION_GB             /*유통구분*/
-		     -- , A.SUPPLY_COMP_CD              /*업체코드*/
 		     , B.SUPPLY_COMP_NM              /*업체명*/
-		     -- , A.DELV_LOC_CD                 /*출고처코드*/
-		     , C.DELV_LOC_NM                 /*출고처명*/
 		     , A.ERP_BRAND_CD                /*ERP브랜드코드*/
 		     , A.SELF_YN                     /*자사여부*/
-		     -- , A.DELV_FEE_CD                 /*배송비정책코드*/
-		     , A.SELL_FEE_RATE               /*판매수수료율*/
 		     , A.USE_YN                      /*사용여부*/
 		     , A.PNT_PRATE10                 /*포인트적립율(PC)*/
 		     , A.PNT_MRATE10                 /*포인트적립율(모바일)*/
@@ -492,13 +487,8 @@
 		     , A.PNT_MRATE20                 /*포인트적립율(모바일)*/
 		     , A.LOGO_FILE_NM                 /*로고파일명*/
 		     , A.DISP_ORD                    /*표시순서*/
-		    -- , D.MIN_ORD_AMT                 /*무료배송최소금액*/
-		    -- , D.DELV_FEE                    /*배송비*/
 		FROM   TB_BRAND A
 		INNER JOIN TB_SUPPLY_COMPANY B ON A.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD
-		LEFT OUTER JOIN TB_DELIVERY_LOC C ON A.DELV_LOC_CD = C.DELV_LOC_CD
-		-- LEFT OUTER JOIN TB_DELV_FEE_POLICY D ON A.SUPPLY_COMP_CD = D.SUPPLY_COMP_CD
-		--                                  AND A.DELV_FEE_CD =  D.DELV_FEE_CD
 		WHERE  1 = 1
 		<if test='supplyCompCd != null and supplyCompCd != ""'>
 		AND    A.SUPPLY_COMP_CD = #{supplyCompCd}
@@ -660,7 +650,6 @@
 		     , DISTRIBUTION_GB
 		     , SELF_YN
 		     , ERP_BRAND_CD
-		     , SELL_FEE_RATE
 		     , PNT_PRATE10
 		     , PNT_MRATE10
 		     , PNT_PRATE20
@@ -689,7 +678,6 @@
 		            ELSE 'N'
 		       END
 		     , #{erpBrandCd}
-		     , IFNULL(#{sellFeeRate},0)
 		     , IFNULL(#{pntPrate10},0)
 		     , IFNULL(#{pntMrate10},0)
 		     , IFNULL(#{pntPrate20},0)
@@ -724,7 +712,6 @@
 		                      ELSE 'N'
 		                 END
 		     , ERP_BRAND_CD = #{erpBrandCd}
-		     , SELL_FEE_RATE = IFNULL(#{sellFeeRate},0)
 		     , PNT_PRATE10 = IFNULL(#{pntPrate10},0)
 		     , PNT_MRATE10 = IFNULL(#{pntMrate10},0)
 		     , PNT_PRATE20 = IFNULL(#{pntPrate20},0)

+ 145 - 70
src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml

@@ -20,7 +20,7 @@
 		     , EMAIL
 		     , EMAIL_AGREE_YN
 		     , DATE_FORMAT(EMAIL_AGREE_DT, '%Y%m%d%H%i%S') AS EMAIL_AGREE_DT
-		     , HOME_ZIP_NO
+		     , HOME_ZIPCODE
 		     , HOME_BASE_ADDR
 		     , HOME_DTL_ADDR
 		     , SITE_CD
@@ -132,7 +132,7 @@
 		     , EMAIL
 		     , EMAIL_AGREE_YN
 		     , DATE_FORMAT(EMAIL_AGREE_DT, '%Y%m%d%H%i%S') AS EMAIL_AGREE_DT
-		     , HOME_ZIP_NO
+		     , HOME_ZIPCODE
 		     , HOME_BASE_ADDR
 		     , HOME_DTL_ADDR
 		     , SITE_CD
@@ -196,8 +196,8 @@
 		                    END,
 		     SMS_AGREE_YN = #{smsAgreeYn},
 		    </if>
-		    <if test="homeZipNo != null and homeZipNo != ''">
-		     HOME_POST_NO = #{homeZipNo},
+		    <if test="homeZipcode != null and homeZipcode != ''">
+		     HOME_ZIPCODE = #{homeZipcode},
 		    </if>
 		    <if test="homeBaseAddr != null and homeBaseAddr != ''">
 		     HOME_BASE_ADDR = #{homeBaseAddr},
@@ -208,9 +208,6 @@
 		    <if test="birthYmd != null and birthYmd != ''">
 		     BIRTH_YMD = REPLACE(#{birthYmd}, '-', ''),
 		    </if>
-		    <if test="cellPhnno != null and cellPhnno != ''">
-		     CELL_PHNNO = #{cellPhnno},
-		    </if>
 		    <if test="email != null and email != ''">
 		     EMAIL = #{email},
 		    </if>
@@ -234,6 +231,16 @@
 		WHERE CUST_NO = #{custNo}
 	</update>
 
+	<!-- 회원 휴대전화번호 수정 -->
+	<update id="updateCustomerCellPhnno" parameterType="Customer">
+		/* TsaCustomer.updateCustomerCellPhnno */
+		UPDATE TB_CUSTOMER
+		SET    CELL_PHNNO = #{cellPhnno}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  CUST_NO = #{custNo}
+	</update>
+
 	<!-- 회원 주문내역 -->
 	<select id="getCustomerOrderList" parameterType="Integer" resultType="Order">
 		/* TsaCustomer.getCustomerOrderList */
@@ -288,7 +295,7 @@
 		     , CDA.RECIP_NM
 		     , CDA.RECIP_PHNNO
 		     , CDA.RECIP_TELNO
-		     , CDA.RECIP_ZIP_NO
+		     , CDA.RECIP_ZIPCODE
 		     , CDA.RECIP_BASE_ADDR
 		     , CDA.RECIP_DTL_ADDR
 		     , CDA.DEL_YN
@@ -317,13 +324,14 @@
 	<update id="saveCustomerDeliveryAddr" parameterType="Delivery">
 		/* TsaCustomer.saveCustomerDeliveryAddr */
 		INSERT INTO TB_CUST_DELIVERY_ADDR (
-		       CUST_NO
+		       CUST_DELV_ADDR_SQ
+		     , CUST_NO
 		     , DELV_ADDR_NM
 		     , DEFAULT_YN
 		     , RECIP_NM
 		     , RECIP_PHNNO
 		     , RECIP_TELNO
-		     , RECIP_ZIP_NO
+		     , RECIP_ZIPCODE
 		     , RECIP_BASE_ADDR
 		     , RECIP_DTL_ADDR
 		     , DELV_MEMO
@@ -334,13 +342,14 @@
 		     , UPD_DT
 		)
 		VALUES (
-		       #{custNo}
+		       #{custDelvAddrSq}
+		     , #{custNo}
 		     , #{delvAddrNm}
 		     , IFNULL(#{defaultYn}, 'N')
 		     , #{recipNm}
 		     , #{recipPhnno}
 		     , #{recipTelno}
-		     , #{recipZipNo}
+		     , #{recipZipcode}
 		     , #{recipBaseAddr}
 		     , #{recipDtlAddr}
 		     , #{delvMemo}
@@ -356,7 +365,7 @@
 		     , RECIP_NM = #{recipNm}
 		     , RECIP_PHNNO = #{recipPhnno}
 		     , RECIP_TELNO = #{recipTelno}
-		     , RECIP_ZIP_NO = #{recipZipNo}
+		     , RECIP_ZIPCODE = #{recipZipcode}
 		     , RECIP_BASE_ADDR = #{recipBaseAddr}
 		     , RECIP_DTL_ADDR  = #{recipDtlAddr}
 		     , DEL_YN = IFNULL(#{delYn}, 'N')
@@ -426,13 +435,67 @@
 		ORDER BY E.ORD_NO DESC, CC.REG_DT DESC
 	</select>
 
+	<select id="getCustomerPoint" parameterType="Integer" resultType="Point">
+		/* TsaCustomer.getCustomerPoint */
+		SELECT IFNULL((
+		               SELECT SUM(RM_PNT_AMT)
+		               FROM  TB_CUST_POINT
+		               WHERE CUST_NO = C.CUST_NO
+		               AND   EXP_CMP_DT IS NULL
+		               ), 0)                           AS RM_PNT_AMT -- 가용포인트
+		     , IFNULL((
+		                SELECT SUM(GV_PNT_AMT)
+		                FROM   TB_CUST_POINT
+		                WHERE  CUST_NO = C.CUST_NO
+		               ), 0)                           AS GV_PNT_AMT -- 누적포인트
+		     , IFNULL((
+		                SELECT SUM(US_PNT_AMT)
+		                FROM  TB_CUST_POINT
+		                WHERE CUST_NO = C.CUST_NO
+		               ), 0)                           AS US_PNT_AMT -- 사용포인트
+		     , IFNULL((
+		                SELECT SUM(RM_PNT_AMT)
+		                FROM  TB_CUST_POINT
+		                WHERE CUST_NO = C.CUST_NO
+		                AND   EXP_CMP_DT IS NOT NULL
+		               ), 0)                           AS EXPIRE_PNT_AMT -- 소멸포인트
+		     , IFNULL((
+		               SELECT SUM(A.PNT_AMT + B.PNT_AMT) AS PNT_AMT
+		               FROM (
+		                     SELECT SUM(PNT_AMT) AS PNT_AMT
+		                          , ORD_NO
+		                     FROM   TB_CUST_POINT_HST
+		                     WHERE  OCCUR_GB = 'G069_12' -- 적립예정
+		                     AND    CUST_NO = #{custNo}
+		                     GROUP BY ORD_NO
+		                    ) A
+		                 , (
+		                    SELECT SUM(PNT_AMT) AS PNT_AMT
+		                         , ORD_NO
+		                    FROM TB_CUST_POINT_HST
+		                    WHERE OCCUR_GB = 'G069_13' -- 적립예정취소
+		                    AND   CUST_NO = #{custNo}
+		                    GROUP BY ORD_NO
+		                    ) B
+		               WHERE A.ORD_NO = B.ORD_NO
+		               ), 0)                           AS EXPECTED_PNT_AMT -- 적립예정포인트
+		     , IFNULL((
+		               SELECT SUM(RM_PNT_AMT) AS RM_PNT_AMT
+		               FROM  TB_CUST_POINT
+		               WHERE EXP_BE_DT >= NOW()
+		               AND   EXP_BE_DT <![CDATA[<]]> DATE_ADD(NOW(),INTERVAL 31 DAY)
+		                ), 0)                          AS EXPECTED_EXPIRE_PNT_AMT -- 소멸예정포인트(30일)
+		FROM   TB_CUSTOMER C
+		WHERE  C.CUST_NO = #{custNo}
+	</select>
+
 
 	<!--회원 포인트내역  -->
 	<select id="getCustomerPointList" parameterType="Integer" resultType="Point">
 		/* TsaCustomer.getCustomerPointList */
 		SELECT CC.*
 		FROM (
-		      SELECT DATE_FORMAT(CASE WHEN CPH.PNT_UPLOAD_STAT = '30'
+		      SELECT DATE_FORMAT(CASE WHEN CPH.PNT_UPLOAD_STAT = 'G070_30'
 		                              THEN CPH.PNT_UPLOAD_DT
 		                          ELSE CPH.REG_DT END, '%Y-%m-%d' ) AS DT
 		           , CPH.PNT_HST_SQ
@@ -459,19 +522,30 @@
 	<!-- 회원 상품권이력 -->
 	<select id="getCustomerGiftCardList" parameterType="Integer" resultType="GiftCard">
 		/* TsaCustomer.getCustomerGiftCardList */
-		SELECT *
-		FROM  TB_CUST_GIFTCARD_HST CGH
+		SELECT CGH.GFCD_HST_SQ
+		     , CGH.CUST_NO
+		     , CGH.OCCUR_GB
+		     , CGH.OCCUR_DTL_DESC
+		     , CGH.GFCD_AMT
+		     , CGH.CUST_GFCD_SQ
+		     , CGH.ORD_NO
+		     , CGH.ORD_DTL_NO
+		     , CGH.REG_NO
+		     , CGH.REG_DT
+		     , CGH.UPD_NO
+		     , CGH.UPD_DT
+		FROM   TB_CUST_GIFTCARD_HST CGH
 		INNER JOIN
-		      TB_CUSTOMER C
-		ON    CGH.CUST_NO = C.CUST_NO
-		WHERE CGH.CUST_NO = #{custNo}
+		       TB_CUSTOMER C
+		ON     CGH.CUST_NO = C.CUST_NO
+		WHERE  CGH.CUST_NO = #{custNo}
 	</select>
 
 	<!--회원 상품평내역  -->
 	<select id="getCustomerReviewList" parameterType="Integer" resultType="Review">
 		/* TsaCustomer.getCustomerReviewList */
 		SELECT CASE WHEN REVIEW_GB = 'P'
-		            THEN '[포토]'||R.REVIEW_TITLE
+		            THEN '[포토/동영상]'||R.REVIEW_TITLE
 		            ELSE R.REVIEW_TITLE
 		       END                          AS REVIEW_TITLE
 		     , R.REVIEW_SQ
@@ -497,17 +571,18 @@
 		     , R.CONFIRM_YN
 		     , FN_GET_USER_NM(R.CONFIRM_UNO)             AS CONFIRM_UNM
 		     , DATE_FORMAT(R.CONFIRM_DT, '%Y%m%d%H%i%S') AS CONFIRM_DT
-		     , FN_GET_USER_NM(R.REG_NO) AS REG_NM
+		     , R.REG_NO
 		     , R.REG_DT
-		     , FN_GET_USER_NM(R.UPD_NO) AS UPD_NM
+		     , R.UPD_NO
 		     , R.UPD_DT
 		     , R.ADM_RPL
 		     , R.ADM_RPL_REG_NO
 		     , R.ADM_RPL_DT
 		FROM   TB_REVIEW R
-		     , TB_CUSTOMER C
-		WHERE  R.CUST_NO = C.CUST_NO
-		AND    R.CUST_NO = #{custNo}
+		INNER  JOIN
+		       TB_CUSTOMER C
+		ON     R.CUST_NO = C.CUST_NO
+		WHERE  R.CUST_NO = #{custNo}
 		ORDER BY R.REG_DT DESC
 	</select>
 
@@ -545,7 +620,7 @@
 		     , CS.ASSIGNED_HMS
 		     , CS.ANS_TITLE
 		     , CS.ANS_CONTENT
-		     , CS.ANS_NO
+		     , FN_GET_USER_NM(CS.ANS_NO) AS ANS_NM
 		     , CS.ANS_DT
 		     , CS.SECRET_YN
 		FROM  TB_COUNSEL CS
@@ -553,56 +628,56 @@
 		      TB_CUSTOMER C
 		ON    CS.CUST_NO = C.CUST_NO
 		WHERE CS.COUNSEL_TYPE = 'C'
-		AND  CS.CUST_NO = #{custNo}
+		AND   CS.CUST_NO = #{custNo}
 	</select>
 
 	<!--회원 상품문의 내역  -->
 	<select id="getCustomerGoodsQnaList" parameterType="Integer" resultType="Counsel">
 		/* TsaCustomer.getCustomerGoodsQnaList */
 		SELECT CS.CUST_NO
-			 , CS.SITE_CD
-			 , CS.COUNSEL_CLSF
-			 , CS.COUNSEL_DCLSF
-			 , CS.CUST_NO
-			 , CS.CELL_PHNNO
-			 , CS.EMAIL
-			 , CS.EMAIL_REQ_YN
-			 , CS.EMAIL_SEND_YN
-			 , CS.SMS_REQ_YN
-			 , CS.SMS_SEND_YN
-			 , CS.REL_ORD_NO
-			 , CS.REL_GOODS_CD
-			 , CS.COUNSEL_TYPE
-			 , CS.QUEST_TITLE
-			 , CS.QUEST_CONTENT
-			 , CS.QUEST_DT
-			 , CS.ORG_FILE_NM1
-			 , CS.SYS_FILE_NM1
-			 , CS.ORG_FILE_NM2
-			 , CS.SYS_FILE_NM2
-			 , CS.ANS_STAT
-			 , CS.ANS_TRANS_YN
-			 , CS.ANS_COMP_CD
-			 , CS.ANS_TRANS_NO
-			 , CS.ANS_TRANS_DT
-			 , CS.ASSIGNED_CS_NO
-			 , CS.ASSIGNED_YMD
-			 , CS.ASSIGNED_HMS
-			 , CS.ANS_TITLE
-			 , CS.ANS_CONTENT
-			 , CS.ANS_NO
-			 , CS.ANS_DT
-			 , CS.SECRET_YN
+		     , CS.SITE_CD
+		     , CS.COUNSEL_CLSF
+		     , CS.COUNSEL_DCLSF
+		     , CS.CUST_NO
+		     , CS.CELL_PHNNO
+		     , CS.EMAIL
+		     , CS.EMAIL_REQ_YN
+		     , CS.EMAIL_SEND_YN
+		     , CS.SMS_REQ_YN
+		     , CS.SMS_SEND_YN
+		     , CS.REL_ORD_NO
+		     , CS.REL_GOODS_CD
+		     , CS.COUNSEL_TYPE
+		     , CS.QUEST_TITLE
+		     , CS.QUEST_CONTENT
+		     , CS.QUEST_DT
+		     , CS.ORG_FILE_NM1
+		     , CS.SYS_FILE_NM1
+		     , CS.ORG_FILE_NM2
+		     , CS.SYS_FILE_NM2
+		     , CS.ANS_STAT
+		     , CS.ANS_TRANS_YN
+		     , CS.ANS_COMP_CD
+		     , CS.ANS_TRANS_NO
+		     , CS.ANS_TRANS_DT
+		     , CS.ASSIGNED_CS_NO
+		     , CS.ASSIGNED_YMD
+		     , CS.ASSIGNED_HMS
+		     , CS.ANS_TITLE
+		     , CS.ANS_CONTENT
+		     , FN_GET_USER_NM(CS.ANS_NO) AS ANS_NM
+		     , CS.ANS_DT
+		     , CS.SECRET_YN
 		FROM  TB_COUNSEL CS
-			      INNER JOIN
+		INNER JOIN
 		      TB_CUSTOMER C
-		      ON    CS.CUST_NO = C.CUST_NO
+		ON    CS.CUST_NO = C.CUST_NO
 		WHERE CS.COUNSEL_TYPE = 'G'
-		  AND  CS.CUST_NO = #{custNo}
+		AND   CS.CUST_NO = #{custNo}
 	</select>
 
 	<!--회원등급 변경내역  -->
-	<select id="getCustomerChangeGradeList" parameterType="Integer" resultType="Customer">
+	<select id="getCustomerChangeGradeList" parameterType="Integer" resultType="CustGrade">
 		/* TsaCustomer.getCustomerChangeGradeList */
 		SELECT CGH.CUST_NO
 		     , CGH.APPLY_YMD
@@ -615,11 +690,11 @@
 		FROM   TB_CUST_GRADE_HST CGH
 		INNER JOIN
 		       TB_CUSTOMER C
-		ON    CGH.CUST_NO = C.CUST_NO
-		WHERE CGH.CUST_NO = 1000001
+		ON     CGH.CUST_NO = C.CUST_NO
+		WHERE  CGH.CUST_NO = #{custNo}
 	</select>
 
-	<!-- 회원접촉이력 -->
+	<!-- 회원접촉내역 -->
 	<select id="getCustomerContactList" parameterType="Integer" resultType="CustContactHst">
 		/* TsaCustomer.getCustomerContactList */
 		SELECT CONTACT_HST_SQ
@@ -633,7 +708,7 @@
 		     , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S')  AS REG_DT
 		FROM   TB_CUST_CONTACT_HST
 		WHERE  RECEIVER_NO = #{custNo}
-		ORDER  BY REG_DT DESC
+		ORDER BY REG_DT DESC
 	</select>
 
 	<!-- 탈퇴회원목록 -->
@@ -654,7 +729,7 @@
 		     , EMAIL
 		     , EMAIL_AGREE_YN
 		     , DATE_FORMAT(EMAIL_AGREE_DT, '%Y%m%d%H%i%S') AS EMAIL_AGREE_DT
-		     , HOME_ZIP_NO
+		     , HOME_ZIPCODE
 		     , HOME_BASE_ADDR
 		     , HOME_DTL_ADDR
 		     , SITE_CD
@@ -738,7 +813,7 @@
 		     , EMAIL
 		     , EMAIL_AGREE_YN
 		     , DATE_FORMAT(EMAIL_AGREE_DT, '%Y%m%d%H%i%S') AS EMAIL_AGREE_DT
-		     , HOME_ZIP_NO
+		     , HOME_ZIPCODE
 		     , HOME_BASE_ADDR
 		     , HOME_DTL_ADDR
 		     , SITE_CD

+ 20 - 7
src/main/java/com/style24/persistence/mybatis/shop/TsaMorebetter.xml

@@ -484,22 +484,27 @@
 		</if>
 	</delete>
 
-	<delete id="deleteTmtbGoodsTemp" timeout="300">
+	<delete id="deleteTmtbGoodsTemp" parameterType="MoreBetterGoods">
 		/* TsaMarketing.deleteTmtbGoodsTemp */
-		TRUNCATE TABLE TB_TMTB_GOODS_TEMP
+		DELETE FROM TB_TMTB_USING_GOODS_TEMP
+		WHERE	REG_NO = #{regNo}
 	</delete>
 
-	<insert id="createTmtbGoodsTemp">
+	<insert id="createTmtbGoodsTemp" parameterType="MoreBetterGoods">
 		/* TsaMarketing.createTmtbGoodsTemp */
-		INSERT INTO TB_TMTB_GOODS_TEMP
-			SELECT 	B.GOODS_CD
+		INSERT INTO TB_TMTB_USING_GOODS_TEMP
+			SELECT 	#{regNo} AS REG_NO
+			        ,B.GOODS_CD
+					,G.GOODS_NM
 			  FROM 	TB_TMTB A
 		INNER JOIN  TB_TMTB_APPLY_GOODS B
 				ON  A.TMTB_SQ = B.TMTB_SQ
+		INNER JOIN  TB_GOODS G
+				ON  B.GOODS_CD = G.GOODS_CD
 			WHERE 1=1
 			  AND NOW() BETWEEN DATE_FORMAT(A.TMTB_ST_DT, '%Y-%m-%d %H:%i:%S') AND DATE_FORMAT(A.TMTB_ED_DT, '%Y-%m-%d %H:%i:%S')
 			  AND A.TMTB_STAT = 'G232_11'
-			  AND B.GOODS_GB = 'G800_20'
+			  AND B.GOODS_GB IN ('G800_10','G800_20')
 			  AND B.DEL_YN = 'N'
 			  AND B.GOODS_CD NOT IN (
 									SELECT	GOODS_CD
@@ -513,8 +518,10 @@
 	<select id="getMorebetterDuplicateList" parameterType="MoreBetterGoods" resultType="MoreBetterGoods">
 		/* TsaMarketing.getMorebetterDuplicateList */
 		SELECT TMP.GOODS_CD
-		  FROM TB_TMTB_GOODS_TEMP TMP
+			  ,TMP.GOODS_NM
+		  FROM TB_TMTB_USING_GOODS_TEMP TMP
 		 WHERE 1=1
+		   AND TMP.REG_NO = #{regNo}
 		   AND TMP.GOODS_CD IN (
 				   SELECT  G.GOODS_CD
 					 FROM  TB_GOODS G
@@ -531,6 +538,12 @@
 								#{item}
 							</foreach>
 						</if>
+						<if test="multiGoods != null and multiGoods != ''">
+							AND G.GOODS_CD IN
+							<foreach collection="multiGoods" item="item" index="index"  open="(" close=")" separator=",">
+								#{item}
+							</foreach>
+						</if>
 				)
 	</select>
 	<!--// CSB 진행 -->

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

@@ -698,7 +698,7 @@
 		     , Z.DELV_FEE_SQ
 	</select>
 	
-	<!-- 주문상세 > 취소/반품/교환 요청정보 -->
+	<!-- 주문상세 > 취소/반품/교환 요청정보 (변경상세단위) -->
 	<select id="getOrderChangeList" parameterType="Order" resultType="Order">
 		/* order.getOrderChangeList */
 		SELECT OCD.ORD_CHG_SQ
@@ -715,7 +715,7 @@
 		     , CASE WHEN OC.CHG_GB = 'G680_20' THEN FN_GET_CODE_NM('G686', OC.CHG_REASON)
 		            WHEN OC.CHG_GB = 'G680_30' THEN FN_GET_CODE_NM('G688', OC.CHG_REASON)
 		            WHEN OC.CHG_GB = 'G680_40' THEN FN_GET_CODE_NM('G689', OC.CHG_REASON)
-		            ELSE '결전취소'
+		            ELSE '결전취소'
 		            END  CHG_REASON_NM
 		     , OC.CHG_MEMO
 		     , OC.CHGER_NM
@@ -735,8 +735,8 @@
 		WHERE  1=1
 		AND    OD.ORD_NO = #{ordNo}
 		AND    OCD.DEL_YN = 'N'
-		ORDER  BY OC.REG_DT DESC
-		     , OCD.ORD_DTL_NO
+		ORDER  BY OC.ORD_CHG_SQ
+		     , OCD.ORD_DTL_NO 
 	</select>
 	
 	<!-- 주문상세 > 환불정보 -->

+ 17 - 12
src/main/webapp/WEB-INF/views/business/BrandForm.html

@@ -141,11 +141,12 @@
 							<input type="text" class="w100" name="supplyCompNm" readonly="readonly"/>
 							<input type="hidden" class="w100" name="supplyCompCd" />
 						</td>
-					-->	
+					
 						<th>판매수수료율<i class="required" title="필수"></i></th>
 						<td>
 							<input type="text" class="w100 aR" name="sellFeeRate" value="0" maxlength="3" required="required" data-valid-name="판매수수료율" data-valid-type="real"/>%
 						</td>
+					-->		
 						<th>유통구분<i class="required" title="필수"></i></th>
 						<td>
 							<select name="distributionGb" required="required" data-valid-name="유통구분">
@@ -153,6 +154,12 @@
 								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
 						</td>
+						<th>사용여부<i class="required" title="필수"></i></th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked">Yes</label>
+							<label class="rdoBtn"><input type="radio" name="useYn" value="N">No</label>
+							<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> No에 체크하면 "프론트"에 노출되지 않습니다.</span>
+						</td>
 					</tr>
 					<!--  <tr>	
 						<th>출고처<i class="required" title="필수"></i></th>
@@ -194,14 +201,6 @@
 						<td class="infoTxt">
 							<input type="text" class="w100 aR" name="dispOrd" maxlength="5" required="required" data-valid-name="노출순서" data-valid-type="numeric"/>
 						</td>
-						<th>사용여부<i class="required" title="필수"></i></th>
-						<td>
-							<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked">Yes</label>
-							<label class="rdoBtn"><input type="radio" name="useYn" value="N">No</label>
-							<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> No에 체크하면 "프론트"에 노출되지 않습니다.</span>
-						</td>
-					</tr>
-					<tr>
 						<th>RGB코드</th>
 						<td  colspan="3">
 							<input type="text" class="w100 aR" name="rgbCd" maxlength="6" data-valid-name="REG코드" />
@@ -307,8 +306,8 @@
 				{headerName: "기본배송비", field: "delvFee", width: 120, cellClass: 'text-center', valueFormatter: function(params) { return Number(params.value).addComma(); }},
 				{headerName: "최소주문금액", field: "minOrdAmt", width: 120, cellClass: 'text-center', valueFormatter: function(params) { return Number(params.value).addComma(); }}
 			]
-		},*/
-		{headerName: "판매수수료율(%)", field: "sellFeeRate", width: 150, cellClass: 'text-center'},
+		},
+		{headerName: "판매수수료율(%)", field: "sellFeeRate", width: 150, cellClass: 'text-center'}, */
 		{
 			headerName: "포인트적립율(%)",
 			children : [
@@ -373,7 +372,7 @@
 		
 		//$("#detailForm input[name=delvFee]").val(Number(event.data.delvFee).addComma());
 		//$("#detailForm input[name=minOrdAmt]").val(Number(event.data.minOrdAmt).addComma());
-		$("#detailForm input[name=sellFeeRate]").val(event.data.sellFeeRate);
+		//$("#detailForm input[name=sellFeeRate]").val(event.data.sellFeeRate);
 		$("#detailForm input[name=pntPrate10]").val(event.data.pntPrate10);
 		$("#detailForm input[name=pntMrate10]").val(event.data.pntMrate10);
 		$("#detailForm input[name=pntPrate20]").val(event.data.pntPrate20);
@@ -742,6 +741,12 @@
 		// 로고이미지 영역은 수정 시 노출
 		$("#brandImgArea").removeClass("on").addClass("off");
 		
+		// 그리드 삭제
+		var allData = gagaAgGrid.getAllRowData(gridOptions2);
+		allData.forEach(function(item, index) {
+			gridOptions2.api.updateRowData({remove: [item]});
+		});
+		
 	});
 	
 	//이미지 클릭시 미리보기

+ 135 - 0
src/main/webapp/WEB-INF/views/customer/CellphoneChangePopupForm.html

@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CellphoneChangePopupForm.html
+ * @desc    : 휴대폰번호변경팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.25   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="800">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong >휴대전화번호변경팝업</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupCellphoneForm')"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<div class="panelStyle">
+				<form id="cellPhoneForm" name="cellPhoneForm">
+					<input type="hidden" id="custNo" name="custNo">
+					<table class="frmStyle">
+						<colgroup>
+							<col style="width:1%"/>
+							<col style="width:40%"/>
+						</colgroup>
+						<tbody>
+						<tr>
+							<span class="infoTxt cBlue"><i class="fa fa-info-circle"></i>인증번호 확인 후 번호변경가능 </span>
+							<span class="infoTxt cBlue"><i class="fa fa-info-circle"></i>변경 할 휴대폰번호 입력 후 전송</span> <br/>
+							<span class="infoTxt cBlue"><i class="fa fa-info-circle"></i>인증번호는 6자리 입니다.</span><br/>
+							<th>기존휴대전화번호<em class="star"></em></th>
+							<td>
+								<input type="text" class="w150" name="orgCellPhone" maxlength="13" readonly="readonly"/>
+							</td>
+							<th>변경할휴대전화번호<em class="star"></em></th>
+							<td>
+								<input type="text" class="w150" name="cellPhnno" required="required" maxlength="13" data-valid-name="휴대전화번호" />
+							</td>
+						</tr>
+						<tr id="trCertNo" style="display: none">
+							<th>인증번호</th>
+							<td>
+								<input type="text" class="w200" name="certNo" placeholder="인증번호 입력" style="display:none;">
+							</td>
+						</tr>
+						</tbody>
+					</table>
+				</form>
+			</div>
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" id="btnSendCustCrtfdNo" class="btn btn-success btn-lg" >인증번호발송</button>
+					<button type="button" id="btnCustCertNo" class="btn btn-success btn-lg" style="display: none">인증번호확인</button>
+				</li>
+			</ul>
+		</div>
+		<!-- //CONTENT -->
+	</div>
+</div>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	const elementCellPhnno = [[${elementCellPhnno}]];
+	const elementCustNo = [[${elementCustNo}]];
+
+
+	// 인증번호 전송
+	$('#btnSendCustCrtfdNo').on('click', function () {
+		//휴대폰번호
+		if (!gagajf.validation('#cellPhoneForm'))
+			return false;
+
+		mcxDialog.confirm("인증번호를 전송 하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				let jsonData = JSON.stringify($('#cellPhoneForm').serializeObject());
+				gagajf.ajaxJsonSubmit('/customer/certno/send', jsonData, function () {
+					$('#cellPhoneForm input[name=certNo]').val('');
+					$('#cellPhoneForm input[name=certNo]').show();
+					$('#trCertNo').show();
+					$('#btnCustCertNo').show();
+				});
+			}
+		});
+	});
+
+	// 인증확인버튼
+	$('#btnCustCertNo').on('click', function () {
+		let jsonData = JSON.stringify($('#cellPhoneForm').serializeObject());
+		gagajf.ajaxJsonSubmit('/customer/certno/confirm', jsonData, fnCertificationResult);
+	});
+
+	// 인증확인 콜백
+	var fnCertificationResult = function (data) {
+		if (data.crtfdNoYn === 'Y') {
+			mcxDialog.confirm("휴대전화 번호가 정상적으로 변경 되었습니다.", {
+				cancelBtnText: "취소",
+				sureBtnText: "확인",
+				sureBtnClick: function () {
+					uifnPopupClose('popupCellphoneForm');
+					fnSearchCustInfo();
+				}
+			});
+		} else {
+			mcxDialog.alert("인증번호가 일치하지 않습니다.\n확인 후 다시 입력해 주세요.");
+		}
+	};
+
+	// 데이터 셋팅
+	var fnInitDataSet = function () {
+		$('#cellPhoneForm input[name=orgCellPhone]').val($(elementCellPhnno).val());
+		$('#cellPhoneForm input[name=custNo]').val($(elementCustNo).val());
+	}
+
+	// 휴대폰 자동 하이픈
+	$('#cellPhoneForm input[name=cellPhnno]').on('input keyup keydown paste change', function () {
+		cfnCellPhonnHypen(this);
+	});
+
+	$(document).ready(function() {
+		fnInitDataSet();
+	});
+
+	/*]]>*/
+</script>
+</html>

+ 142 - 65
src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html

@@ -64,7 +64,7 @@
 						<li><a href="#tab3" onclick="fnSearchDelivery();">배송지정보</a></li>
 						<li><a href="#tab4" onclick="fnSearchCoupon();">쿠폰내역</a></li>
 						<li><a href="#tab5" onclick="fnSearchPoint();">포인트내역</a></li>
-						<li><a href="#tab6" onclick="">상품권내역</a></li>
+						<li><a href="#tab6" onclick="fnSearchGiftCard()">상품권내역</a></li>
 						<li><a href="#tab7" onclick="fnSearchReview();">상품평내역</a></li>
 						<li><a href="#tab8" onclick="fnSearchCounsel();">1:1문의내역</a></li>
 						<li><a href="#tab9" onclick="fnSearchGoodsQna();">상품문의내역</a></li>
@@ -148,7 +148,7 @@
 									<tr>
 										<th class="dashR">자택주소</th>
 										<td class="dashR" colspan="3">
-											<input type="text" id="homeZipNo" name="homeZipNo" class="w100" readonly="readonly"/>
+											<input type="text" id="homeZipcode" name="homeZipcode" class="w100" readonly="readonly"/>
 											<button type="button" class="btn btn-info btn-lg" onclick="fnOpenDaumAddr('custInfoForm');">우편번호찾기</button>
 											<br/>
 											<input type="text" id="homeBaseAddr" name="homeBaseAddr" class="w300" readonly="readonly"/>
@@ -242,6 +242,7 @@
 						<!-- TAB3 PANELSTYLE -->
 						<div class="panelStyle">
 							<form id="custAddrForm" name="custAddrForm" action="#" method="post">
+								<input type="hidden" name="custDelvAddrSq"/>
 								<input type="hidden" name="custNo" th:value="${custNo}"/>
 								<h4>배송지정보</h4>
 								<div id="custAddrList" class="ag-theme-balham" style="width: 100%; height: 300px;" ></div>
@@ -306,7 +307,7 @@
 									<tr>
 										<th>주소<i class="star"></i></th>
 										<td colspan="5">
-											<input type="text" id="recipZipNo" name="recipZipNo" class="w100" maxlength="10" required="required" data-valid-name="주소"/>
+											<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>
 											<br/>
 											<input type="text" id="recipBaseAddr" name="recipBaseAddr" class="w300" maxlength="50" required="required" data-valid-name="주소"/>
@@ -334,9 +335,6 @@
 							<h4>쿠폰 내역</h4>
 							<div id="custCouponList" class="ag-theme-balham" style="width: 100%; height: 510px;" ></div>
 							<ul class="panelBar">
-								<li class="left">
-									<button type="button" id="btnCustCouponDelete" class="btn btn-danger btn-lg">쿠폰삭제</button>
-								</li>
 								<li class="right">
 									<button type="button" id="btnCustCouponCreate" class="btn btn-info btn-lg" >쿠폰발급</button>
 								</li>
@@ -350,20 +348,23 @@
 					<li id="tab5" class="tab">
 						<!-- TAB5 PANELSTYLE -->
 						<div class="panelStyle">
+							<form id="custPointForm" name="custPointForm" action="#" method="post">
 							<h4>포인트 내역</h4>
 							<table class="tableStyle">
 								<colgroup>
+									<col style="width:15%;"/>
+									<col style="width:15%;"/>
+									<col style="width:15%;"/>
 									<col style="width:20%;"/>
 									<col style="width:20%;"/>
-									<col style="width:20%;"/>
-									<col style="width:20%;"/>
-									<col style="width:20%;"/>
+									<col style="width:25%;"/>
 								</colgroup>
 								<tbody>
 								<tr>
 									<th>가용포인트</th>
-									<th>누적 포인트</th>
+									<th>누적포인트</th>
 									<th>사용포인트</th>
+									<th>소멸포인트</th>
 									<th>적립예정포인트</th>
 									<th>소멸예정포인트(30일)</th>
 								</tr>
@@ -371,6 +372,7 @@
 									<td name="availPntAmt">0 P</td>
 									<td name="accumPntAmt">0 P</td>
 									<td name="usePntAmt">0 P</td>
+									<td name="expirePntAmt">0 P</td>
 									<td name="expectedPntAmt">0 P</td>
 									<td name="expectedExpirePntAmt">0 P</td>
 								</tr>
@@ -383,6 +385,7 @@
 									<button type="button" id="btnCustPointCreate" class="btn btn-info btn-lg">포인트부여</button>
 								</li>
 							</ul>
+							</form>
 						</div>
 						<!-- //TAB5 PANELSTYLE -->
 					</li>
@@ -436,6 +439,8 @@
 					<li id="tab10" class="tab">
 						<!-- TAB10 PANELSTYLE -->
 						<div class="panelStyle">
+							<form id="custContactHstForm" name="custContactHstForm" action="#" method="post">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
 							<h4>회원접촉이력</h4>
 							<table class="frmStyle">
 								<colgroup>
@@ -475,6 +480,7 @@
 							</table>
 							<br/>
 							<div id="custContactList" class="ag-theme-balham" style="width: 100%; height: 420px;"></div>
+							</form>
 						</div>
 						<!-- //TAB10 PANELSTYLE -->
 					</li>
@@ -518,11 +524,11 @@
 	const pubReasonList = gagajf.convertToArray([[${pubReasonList}]]);				//쿠폰발행사유
 	const pntOccurGbList = gagajf.convertToArray([[${pntOccurGbList}]]);			//포인트반영구분
 	const pntUploadStatList = gagajf.convertToArray([[${pntUploadStatList}]]);		//포인트반영상태
+	const giftCardOccurGbList = gagajf.convertToArray([[${giftCardOccurGbList}]]);	//상품권유형
 	const counselClsfList = gagajf.convertToArray([[${counselClsfList}]]);			//상담분류
 	const contactTypeList = gagajf.convertToArray([[${contactTypeList}]]);			//회원접촉유형
 	const contactMethodList = gagajf.convertToArray([[${contactMethodList}]]);		//회원접촉방법
 	const genderGbList = gagajf.convertToArray([[${genderGbList}]]);				// 성별
-	let orgData;
 
 	//구매내역 그리드
 	const columnOrderDefs = [
@@ -601,7 +607,7 @@
 				return gagaAgGrid.toDateTimeFormat(params.value);
 			}
 		},
-		{headerName: "확인ID", field: "ansId", width: 100, cellClass: 'text-center'},
+		{headerName: "확인NO", field: "ansNo", width: 100, cellClass: 'text-center'},
 		{headerName: "확인자", field: "userNm", width: 100, cellClass: 'text-center'}
 	];
 
@@ -626,7 +632,7 @@
 				return gagaAgGrid.toDateTimeFormat(params.value);
 			}
 		},
-		{headerName: "확인ID", field: "ansId", width: 100, cellClass: 'text-center'},
+		{headerName: "확인NO", field: "ansNo", width: 100, cellClass: 'text-center'},
 		{headerName: "확인자", field: "userNm", width: 100, cellClass: 'text-center'}
 	];
 
@@ -662,7 +668,7 @@
 			}
 		},
 		{headerName: "쿠폰발행 상세사유", field: "pubReasonDtl", width: 300, cellClass: 'text-center'},
-		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regNo", width: 100, cellClass: 'text-center'},
 		{
 			headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
 			cellRenderer: function (params) {
@@ -703,7 +709,35 @@
 			}
 		},
 		{headerName: "포인트상세사유", field: "occurDtlDesc", width: 300, cellClass: 'text-center'},
-		{headerName: "등록자", field: "regId", width: 100, cellClass: 'text-center'}
+		{headerName: "등록자", field: "regNo", width: 100, cellClass: 'text-center'}
+	];
+
+	//상품권내역 그리드
+	const columnGiftCardDefs = [
+		{
+			headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "주문번호", field: "ordNo", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "금액", field: "gfcdAmt", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
+			}
+		},
+		{
+			headerName: "발생구분", field: "occurGb", width: 100, cellClass: 'text-center',
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(giftCardOccurGbList, params.value); }
+		},
+		{
+			headerName: "발생상세설명", field: "occurDtlDesc", width: 300, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(pntOccurGbList, params.value);
+			}
+		},
+		{headerName: "등록자", field: "regNo", width: 100, cellClass: 'text-center'}
 	];
 
 	//상품평 그리드
@@ -728,7 +762,7 @@
 				return gagaAgGrid.toDateTimeFormat(params.value);
 			}
 		},
-		{headerName: "지급ID", field: "confirmId", width: 130, cellClass: 'text-center'},
+		{headerName: "지급No", field: "confirmNo", width: 130, cellClass: 'text-center'},
 		{headerName: "게시여부", field: "dispYn", width: 100, cellClass: 'text-center'},
 		{
 			headerName: "지급예정포인트", field: "giveDuePnt", width: 120, cellClass: 'text-center',
@@ -785,7 +819,7 @@
 		{headerName: "수령자", field: "recipNm", width: 100, cellClass: 'text-center'},
 		{headerName: "전화번호", field: "recipTelno", width: 130, cellClass: 'text-center'},
 		{headerName: "휴대전화번호", field: "recipPhnno", width: 130, cellClass: 'text-center'},
-		{headerName: "우편번호", field: "recipZipNo", width: 100, cellClass: 'text-center'},
+		{headerName: "우편번호", field: "recipZipcode", width: 100, cellClass: 'text-center'},
 		{headerName: "기본주소", field: "recipBaseAddr", width: 300, cellClass: 'text-left'},
 		{headerName: "상세주소", field: "recipDtlAddr", width: 150, cellClass: 'text-left'},
 		{
@@ -795,7 +829,7 @@
 			}
 		},
 		{headerName: "삭제", field: "delYn", width: 50, cellClass: 'text-center'},
-		{headerName: "수정자", field: "updNm", width: 100, cellClass: 'text-center'},
+		{headerName: "수정자", field: "updNo", width: 100, cellClass: 'text-center'},
 		{
 			headerName: "수정일시", field: "updDt", width: 150, cellClass: 'text-center',
 			cellRenderer: function (params) {
@@ -820,7 +854,7 @@
 			}
 		},
 		{headerName: "내용", field: "contactContents", width: 1000, cellClass: 'text-center'},
-		{headerName: "등록자", field: "regId", width: 100, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regNo", width: 100, cellClass: 'text-center'},
 		{
 			headerName: "등록일", field: "regDt", width: 150, cellClass: 'text-center',
 			cellRenderer: function (params) {
@@ -834,6 +868,7 @@
 	let gridGoodsQnaOptions = gagaAgGrid.getGridOptions(columnGoodsQnaDefs);//상품문의내역 그리드
 	let gridCouponOptions = gagaAgGrid.getGridOptions(columnCouponDefs);	//쿠폰내역 그리드
 	let gridPointOptions = gagaAgGrid.getGridOptions(columnPointDefs);		//포인트내역 그리드
+	let gridGiftCardOptions = gagaAgGrid.getGridOptions(columnGiftCardDefs);//상품권내역 그리드
 	let gridReviewOptions = gagaAgGrid.getGridOptions(columnReviewDefs);	//상품평 그리드
 	let gridGradeOptions = gagaAgGrid.getGridOptions(columnGradeDefs);		//등급변경 그리드
 	let gridAddrOptions = gagaAgGrid.getGridOptions(columnAddrDefs);		//주소정보 그리드
@@ -873,6 +908,18 @@
 		cfnOpenLmsPopup(param);
 	});
 
+	// 기본정보 -  번호변경
+	$('#btnCustCrtfd').on('click', function () {
+		if (!fnCheckValidationPhnno('#custInfoForm')) {
+			return false;
+		}
+		let elementCellPhnno = '#custInfoForm input[name=cellPhnno]';
+		let elementCustNo = '#custInfoForm input[name=custNo]';
+
+		const actionUrl = '/customer/cellphone/change/popup/form?elementCellPhnno=' + encodeURIComponent(elementCellPhnno)
+						+ '&elementCustNo=' + encodeURIComponent(elementCustNo)
+		cfnOpenModalPopup(actionUrl, 'popupCellphoneForm');
+	});
 
 	// 기본정보 - 이메일발송 버튼
 	$('#btnCustSendEmail').on('click', function () {
@@ -938,6 +985,7 @@
 		$('#custAddrForm input[name=custDelvAddrSq]').val('');
 		$('#custAddrForm input[name=recipPhnno]').val('');
 		$('#custAddrForm input[name=recipTelno]').val('');
+		fnDisplayDeliveryCheckBox('N', 'N');
 	});
 
 	// 배송지정보 - 저장버튼
@@ -1007,17 +1055,16 @@
 	});
 
 
-
 	// 회원접촉이력 저장
 	$('#btnSaveContact').on('click', function () {
-		if (!gagajf.validation('#custContact')) {
+		if (!gagajf.validation('#custContactHstForm')) {
 			return;
 		}
 		mcxDialog.confirm("저장하시겠습니까?", {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
 			sureBtnClick: function () {
-				var jsonData = JSON.stringify($('#custContact').serializeObject());
+				var jsonData = JSON.stringify($('#custContactHstForm').serializeObject());
 				gagajf.ajaxJsonSubmit('/customer/contact/create', jsonData, fnSearchContact);
 			}
 		});
@@ -1083,16 +1130,11 @@
 				$('#custAddrForm input[name=telLastNo]').val(telNoSplit[2]);
 			}
 
-			$('#custAddrForm input[name=recipZipNo]').val(event.data.recipZipNo);
+			$('#custAddrForm input[name=recipZipcode]').val(event.data.recipZipcode);
 			$('#custAddrForm input[name=recipBaseAddr]').val(event.data.recipBaseAddr);
 			$('#custAddrForm input[name=recipDtlAddr]').val(event.data.recipDtlAddr);
 
-			let defaultYn = event.data.defaultYn === 'Y' ? true : false;
-			let delYn = event.data.delYn === 'Y' ? true : false;
-
-			$('#custAddrForm input:checkbox[name=defaultYn]').prop('checked', defaultYn);
-			$('#custAddrForm input:checkbox[name=delYn]').prop('checked', delYn);
-
+			fnDisplayDeliveryCheckBox(event.data.defaultYn, event.data.delYn);
 		}
 	};
 
@@ -1123,7 +1165,7 @@
 					let snsType = fnGetSnsType(data.nvJoinId, data.kkJoinId, data.ysJoinId);
 					$('#snsType').text(snsType);
 
-					$('#homeZipNo').val(data.homeZipNo);
+					$('#homeZipcode').val(data.homeZipcode);
 					$('#homeBaseAddr').val(data.homeBaseAddr);
 					$('#homeDtlAddr').val(data.homeDtlAddr);
 					$('#sexGb').text(gagaAgGrid.lookupValue(genderGbList, data.sexGb));
@@ -1132,10 +1174,7 @@
 					fnDisplaySmsAgree(data.smsAgreeYn);				// SMS 수신여부
 					fnDisplayEmail(data.maskingEmail);				// EMAIL
 					fnDisplayCellPhnno(data.maskingCellPhnno);		// 핸드폰
-					fnDisplayManaged(data.managedRsn);			// 관리대상
-
-					//기존데이트 저장
-					orgData = data;
+					fnDisplayManaged(data.managedRsn);				// 관리대상
 
 				}
 			});
@@ -1147,16 +1186,11 @@
 		gagaAgGrid.fetch(actionUrl, gridOrderOptions);
 	};
 
-	//	1:1문의 내역 조회
-	var fnSearchCounsel = function () {
-		const actionUrl = "/customer/counsel/list/" + custNo;
-		gagaAgGrid.fetch(actionUrl, gridCounselOptions);
-	};
-
-	//	상품문의 내역 조회
-	var fnSearchGoodsQna = function () {
-		const actionUrl = "/customer/goodsQna/list/" + custNo;
-		gagaAgGrid.fetch(actionUrl, gridGoodsQnaOptions);
+	// 배송지 조회
+	var fnSearchDelivery = function () {
+		const actionUrl = "/customer/delivery/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridAddrOptions);
+		$('#btnCustAddrNew').trigger('click');
 	};
 
 	//	쿠폰내역 조회
@@ -1170,42 +1204,55 @@
 		$.get('/customer/point/' + custNo
 			, function (data) {
 				if (!gagajf.isNull(data)) {
-					$('#custPoint td[name=availPntAmt]').text(data.availPntAmt.addComma() + ' P');
-					$('#custPoint td[name=accumPntAmt]').text(data.accumPntAmt.addComma() + ' P');
-					$('#custPoint td[name=usePntAmt]').text(data.usePntAmt.addComma() + ' P');
-					$('#custPoint td[name=expectedPntAmt]').text(data.expectedPntAmt.addComma() + ' P');
-					$('#custPoint td[name=expectedExpirePntAmt]').text(data.expirePntAmt.addComma() + ' P');
+					$('#custPointForm td[name=availPntAmt]').text(data.rmPntAmt.addComma() + ' P');
+					$('#custPointForm td[name=accumPntAmt]').text(data.gvPntAmt.addComma() + ' P');
+					$('#custPointForm td[name=usePntAmt]').text(data.usPntAmt.addComma() + ' P');
+					$('#custPointForm td[name=expirePntAmt]').text(data.expirePntAmt.addComma() + ' P');
+					$('#custPointForm td[name=expectedPntAmt]').text(data.expectedPntAmt.addComma() + ' P');
+					$('#custPointForm td[name=expectedExpirePntAmt]').text(data.expectedExpirePntAmt.addComma() + ' P');
 				}
 			});
 		const actionUrl = "/customer/point/list/" + custNo;
 		gagaAgGrid.fetch(actionUrl, gridPointOptions);
 	};
 
+	// 상품권 조회
+	var fnSearchGiftCard = function () {
+		const actionUrl = "/customer/giftcard/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridGiftCardOptions);
+	};
+
 	// 상품평내역 조회
 	var fnSearchReview = function () {
 		const actionUrl = "/customer/review/list/" + custNo;
 		gagaAgGrid.fetch(actionUrl, gridReviewOptions);
 	};
 
-	// 회원등급변경이력 조회
-	var fnSearchChangeGrade = function () {
-		const actionUrl = "/customer/change/grade/list/" + custNo;
-		gagaAgGrid.fetch(actionUrl, gridGradeOptions);
+	//	1:1문의 내역 조회
+	var fnSearchCounsel = function () {
+		const actionUrl = "/customer/counsel/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridCounselOptions);
 	};
 
-	// 주소정보 조회
-	var fnSearchDelivery = function () {
-		const actionUrl = "/customer/delivery/list/" + custNo;
-		gagaAgGrid.fetch(actionUrl, gridAddrOptions);
-		$('#btnCustAddrNew').trigger('click');
+	//	상품문의 내역 조회
+	var fnSearchGoodsQna = function () {
+		const actionUrl = "/customer/goodsQna/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridGoodsQnaOptions);
 	};
 
 	// 회원접촉이력 조회
 	var fnSearchContact = function () {
+		$('#custContactHstForm')[0].reset();
 		const actionUrl = "/customer/contact/list/" + custNo;
 		gagaAgGrid.fetch(actionUrl, gridContactOptions);
 	};
 
+	// 회원등급변경이력 조회
+	var fnSearchChangeGrade = function () {
+		const actionUrl = "/customer/change/grade/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridGradeOptions);
+	};
+
 
 	/**
 	 * DAUM을 이용한 우편번호 팝업 레이어
@@ -1215,13 +1262,13 @@
 			oncomplete: function(data) {
 				// 우편번호와 주소 정보를 해당 필드에 넣는다.
 				if (id === 'custInfoForm') {
-					$('#homeZipNo').val(data.zonecode);
+					$('#homeZipcode').val(data.zonecode);
 					$('#homeBaseAddr').val(cfnGetDaumRoadAddr(data));
 					$('#homeDtlAddr').focus();
 				}
 
 				if (id === 'custAddrForm') {
-					$('#recipZipNo').val(data.zonecode);
+					$('#recipZipcode').val(data.zonecode);
 					$('#recipBaseAddr').val(cfnGetDaumRoadAddr(data));
 					$('#recipDtlAddr').focus();
 				}
@@ -1395,8 +1442,36 @@
 			yearRange: (currentYear - 100) + ' : ' + (currentYear - 14),
 			defaultDate: $birthYmd.val()
 		});
+	};
+
+	// 배송지 기본,삭제 체크박스 설정
+	var fnDisplayDeliveryCheckBox = function (defaultYn, delYn) {
+		let $defaultYn = $('#custAddrForm input:checkbox[name=defaultYn]');
+		let $delYn = $('#custAddrForm input:checkbox[name=delYn]');
+		let defaultBoolean;
+		let delBoolean;
+
+		if (defaultYn === 'Y') {
+			defaultBoolean = true;
+			$defaultYn.parent().addClass('checked');
+		} else {
+			defaultBoolean = false;
+			$defaultYn.parent().removeClass('checked');
+		}
+
+		if (delYn === 'Y') {
+			delBoolean = true;
+			$delYn.parent().addClass('checked');
+		} else {
+			delBoolean = false;
+			$delYn.parent().removeClass('checked');
+		}
+
+		$defaultYn.prop('checked', defaultBoolean);
+		$delYn.prop('checked', delBoolean);
 	}
 
+
 	$('#btnLogin').on('click', function () {
 		let custId = $('span[name=custId]').text();
 		const actionUrl = _frontUrl + '/customer/front/login?custId=' + custId;
@@ -1413,20 +1488,22 @@
 
 		gagaAgGrid.createGrid('custOrderList', gridOrderOptions);		// 주문내역
 
-		gagaAgGrid.createGrid('custCounselList', gridCounselOptions);	// 1:1문의 내역
-
-		gagaAgGrid.createGrid('custGoodsQnaList', gridGoodsQnaOptions);	// 상품문의 내역
+		gagaAgGrid.createGrid('custAddrList', gridAddrOptions);			// 주소정보 그리드
 
 		gagaAgGrid.createGrid('custCouponList', gridCouponOptions);		// 쿠폰내역
 
 		gagaAgGrid.createGrid('custPointList', gridPointOptions);		// 포인트내역 그리드
 
+		gagaAgGrid.createGrid('custGiftCardList', gridGiftCardOptions);	// 상품권내역 그리드
+
+		gagaAgGrid.createGrid('custCounselList', gridCounselOptions);	// 1:1문의 내역
+
+		gagaAgGrid.createGrid('custGoodsQnaList', gridGoodsQnaOptions);	// 상품문의 내역
+
 		gagaAgGrid.createGrid('custReviewList', gridReviewOptions);		// 상품평 그리드
 
 		gagaAgGrid.createGrid('custGradeList', gridGradeOptions);		// 등급변경 그리드
 
-		gagaAgGrid.createGrid('custAddrList', gridAddrOptions);			// 주소정보 그리드
-
 		gagaAgGrid.createGrid('custContactList', gridContactOptions);	// 회원접촉이력 그리드
 	});
 

+ 38 - 46
src/main/webapp/WEB-INF/views/customer/EmailPopupForm.html

@@ -14,7 +14,7 @@
  * 1.0  2021.01.21   jsshin     최초 작성
  *******************************************************************************
  -->
-<div class="modalPopup" id="popupEmailForm" data-width="800">
+<div class="modalPopup" data-width="800">
 	<div class="panelStyle">
 		<!-- TITLE -->
 		<div class="panelTitle">
@@ -24,51 +24,43 @@
 		<!-- //TITLE -->
 		<!-- CONTENT -->
 		<div class="panelContent">
-			<div class="tabs">
-				<!-- TABS CONTENT -->
-				<ul class="tabsCont">
-					<li class="tab on" id="tab1">
-						<div class="panelStyle">
-							<form id="emailForm" name="emailForm">
-								<input type="hidden" name="sendEmail" th:value="${sendEmail}"/>
-								<input type="hidden" name="email"/>
-								<table class="frmStyle">
-									<colgroup>
-										<col style="width:1%"/>
-										<col style="width:40%"/>
-									</colgroup>
-									<tbody>
-									<tr >
-										<th>보내는사람</th>
-										<td>
-											<span name="sendEmail" th:text="${sendEmail}"></span>
-										</td>
-									</tr>
-									<tr>
-										<th>받는사람</th>
-										<td>
-											<span name="email"></span>
-										</td>
-									</tr>
-									<tr>
-										<th>제목<em class="star"></em></th>
-										<td>
-											<input type="text" class="w150" name="title" value="" required="required" data-valid-name="제목"/>
-										</td>
-									</tr>
-									<tr>
-										<th>내용<em class="star"></em></th>
-										<td>
-											<textarea class="textareaR4" style="resize: none;" name ="content" ></textarea>
-										</td>
-									</tr>
-									</tbody>
-								</table>
-							</form>
-						</div>
-					</li>
-				</ul>
-				<!-- //TABS CONTENT -->
+			<div class="panelStyle">
+				<form id="emailForm" name="emailForm">
+					<input type="hidden" name="sendEmail" th:value="${sendEmail}"/>
+					<input type="hidden" name="email"/>
+					<table class="frmStyle">
+						<colgroup>
+							<col style="width:1%"/>
+							<col style="width:40%"/>
+						</colgroup>
+						<tbody>
+						<tr >
+							<th>보내는사람</th>
+							<td>
+								<span name="sendEmail" th:text="${sendEmail}"></span>
+							</td>
+						</tr>
+						<tr>
+							<th>받는사람</th>
+							<td>
+								<span name="email"></span>
+							</td>
+						</tr>
+						<tr>
+							<th>제목<em class="star"></em></th>
+							<td>
+								<input type="text" class="w150" name="title" value="" required="required" data-valid-name="제목"/>
+							</td>
+						</tr>
+						<tr>
+							<th>내용<em class="star"></em></th>
+							<td>
+								<textarea class="textareaR4" style="resize: none;" name ="content" ></textarea>
+							</td>
+						</tr>
+						</tbody>
+					</table>
+				</form>
 			</div>
 			<ul class="panelBar">
 				<li class="right">

+ 31 - 47
src/main/webapp/WEB-INF/views/customer/LmsPopupForm.html

@@ -14,7 +14,7 @@
  * 1.0  2021.01.21   jsshin     최초 작성
  *******************************************************************************
  -->
-<div class="modelessPopup draggable" data-width="634">
+<div class="modalPopup" data-width="800">
 	<div class="panelStyle">
 		<!-- TITLE -->
 		<div class="panelTitle">
@@ -24,52 +24,36 @@
 		<!-- //TITLE -->
 		<!-- CONTENT -->
 		<div class="panelContent">
-			<div class="tabs">
-				<div class="tabsNav">
-					<ul >
-						<li class="on"><a href="#tab1">LMS 발송</a></li>
-					</ul>
-				</div>
-				<!-- //TABS NAVI -->
-				<!-- TABS CONTENT -->
-				<ul class="tabsCont">
-					<!-- LMS 발송 -->
-					<li class="tab on" id="tab1">
-						<div class="panelStyle">
-							<form id="lmsForm" name="lmsForm">
-								<table class="frmStyle">
-									<colgroup>
-										<col style="width:1%"/>
-										<col style="width:40%"/>
-									</colgroup>
-									<tbody>
-									<tr >
-										<th>수신자번호 <em class="star"></em></th>
-										<td>
-											<input type="text" class="w150" name="cellPhnno" data-valid-name="수신번호"  required="required"  maxlength="13"/>
-										</td>
-									</tr>
-									<tr>
-										<th>발신자번호<em class="star"></em></th>
-										<td>
-											<input type="text" class="w150" name="callBack" th:value="${callBack}" maxlength="11" readonly="readonly"/>
-										</td>
-									<tr>
-										<th>메시지<em class="star"></em></th>
-										<td>
-											<textarea class="textareaR4"  style="resize: none;" name ="content" ></textarea>
-											<span name="count">0</span> / 2000 byte
-										</td>
-									</tr>
-									</tr>
-									</tbody>
-								</table>
-							</form>
-						</div>
-					</li>
-					<!-- //LMS발송 -->
-				</ul>
-				<!-- //TAB CONTENT -->
+			<div class="panelStyle">
+				<form id="lmsForm" name="lmsForm">
+					<table class="frmStyle">
+						<colgroup>
+							<col style="width:1%"/>
+							<col style="width:40%"/>
+						</colgroup>
+						<tbody>
+						<tr >
+							<th>수신자번호 <em class="star"></em></th>
+							<td>
+								<input type="text" class="w150" name="cellPhnno" data-valid-name="수신번호"  required="required"  maxlength="13"/>
+							</td>
+						</tr>
+						<tr>
+							<th>발신자번호<em class="star"></em></th>
+							<td>
+								<input type="text" class="w150" name="callBack" th:value="${callBack}" maxlength="11" readonly="readonly"/>
+							</td>
+						</tr>
+						<tr>
+							<th>메시지<em class="star"></em></th>
+							<td>
+								<textarea class="textareaR4"  style="resize: none;" name ="content" ></textarea>
+								<span name="count">0</span> / 2000 byte
+							</td>
+						</tr>
+						</tbody>
+					</table>
+				</form>
 			</div>
 			<ul class="panelBar">
 				<li class="right">

+ 9 - 20
src/main/webapp/WEB-INF/views/goods/GoodsDealForm.html

@@ -51,15 +51,19 @@
 						<col width="10%"/>
 						<col/>
 						<col width="10%"/>
-						<col width="20%"/>
-						<col width="10%"/>
 						<col width="24%"/>
+						<col width="10%"/>
+						<col width="20%"/>
 					</colgroup>
 					<tr>
 						<th>상품명<em class="required" title="필수"></em></th>
 						<td><input type="text" id="goodsNm" name="goodsNm" maxlength="60"/></td>
-						<th>판매가<em class="required" title="필수"></em></th>
-						<td><input type="text" class="w100" id="currPrice" name="currPrice" maxlength="8" data-valid-type="numeric"/></td>
+						<th>성별<em class="required" title="필수"></em></th>
+						<td><select  name="sexGb" id="sexGb">
+								<option value="">[전체]</option>
+								<option th:if="${sexGbList}" th:each="oneData, status : ${sexGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
 						<th>제조년월일<em class="required" title="필수"></em></th>
 						<td><input type="text" class="w100" id="makeYmd" name="makeYmd" maxlength="8" data-valid-type="date"/></td>
 					</tr>
@@ -74,12 +78,6 @@
 								<option th:if="${seasonList}" th:each="oneData, status : ${seasonList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
 						</td>
-						<th>성별<em class="required" title="필수"></em></th>
-						<td><select  name="sexGb" id="sexGb">
-								<option value="">[전체]</option>
-								<option th:if="${sexGbList}" th:each="oneData, status : ${sexGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
 						<th>원산지<em class="required" title="필수"></em></th>
 						<td ><select name="makeOriginCd" id="makeOriginCd">
 								<option value="">[전체]</option>
@@ -87,6 +85,7 @@
 							</select>
 							<input type="hidden" id="makeNm" name="makeNm" />
 						</td>
+						<td colspan="2"></td>
 					</tr>
 				</table>
 			</div>	
@@ -336,16 +335,6 @@
 			return false;
 		}
 		
-		if(gagajf.isNull($("#goodsDealForm input[name=currPrice]").val())){
-			mcxDialog.alertC('판매가를 입력해 주세요.', {
-				sureBtnText: "확인",
-				sureBtnClick: function() {
-					$("#goodsDealForm input[name=currPrice]").focus();
-				}
-			});	
-			return false;
-		}
-		
 		if(Number($("#goodsDealForm input[name=currPrice]").val()) <= 0){
 			mcxDialog.alertC('판매가를 바르게 입력해 주세요.', {
 				sureBtnText: "확인",

+ 7 - 10
src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html

@@ -1080,14 +1080,12 @@
 		var idx = 0;
 		$('#goodsDetailForm').find('#notiArea').html('');
 		notiHtml += '<table class="frmStyle">';
-		notiHtml += '<colgroup><col style="width:20%"/><col/><col style="width:5%"/><col style="width:5%"/></colgroup>';
+		notiHtml += '<colgroup><col style="width:20%"/><col/></colgroup>';
 		notiHtml += '<tbody id="infoContents">\n';
-		notiHtml += '<tr><th>고시항목</th><th>고시내용</th><th>필수여부</th><th>전시여부</th></tr>';
+		notiHtml += '<tr><th>고시항목</th><th>고시내용</th></tr>';
 		result.forEach(function(info){
 			notiHtml += '<tr><th>'+ gagajf.convNull(info.niItemNm, '') +'<input type="hidden" name="niItemCd" value="'+ gagajf.convNull(info.niItemCd, '') +'" />\n<input type="hidden" name="dispOrd" value="'+ gagajf.convNull(info.dispOrd, '') +'" /></th>';
 			notiHtml += '<td><input type="text" name="niContent" value="'+ gagajf.convNull(info.niContent, '') +'"/></td>\n';
-			notiHtml += '<td class="aC">'+gagajf.convNull(info.reqYn, '')+'<input type="hidden" name="reqYn" value="'+ gagajf.convNull(info.reqYn, '') +'"/></td>\n';
-			notiHtml += '<td class="aC">'+gagajf.convNull(info.dispYn, '')+'<input type="hidden" name="dispYn" value="'+ gagajf.convNull(info.dispYn, '') +'"/></td>\n';
 			notiHtml += '</tr>\n';
 		});
 		notiHtml += '</tbody></table>';
@@ -1320,13 +1318,12 @@
 				idx = 0;
 
 				$("#goodsDetailForm #notiArea").find("#infoContents tr").each(function() {
-					if ("Y" == $(this).find("input[name=reqYn]").val() ||  "Y" == $(this).find("input[name=dispYn]").val()){
-						if (gagajf.isNull($(this).find("input[name=niContent]").val())){
-							optCheck = true;
-							mcxDialog.alertC("고시정보를 입력해주세요.");
-							return false;
-						}
+					if (gagajf.isNull($(this).find("input[name=niContent]").val())){
+						optCheck = true;
+						mcxDialog.alertC("고시정보를 입력해주세요.");
+						return false;
 					}
+
 					idx++;
 				});
 			}

+ 42 - 3
src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html

@@ -31,6 +31,7 @@
 			<input type="hidden" name="sectionGbList"/>				<!-- 다다익선 구간/혜택 리스트 -->
 			<input type="hidden" name="supplyCompArr"/>
 			<input type="hidden" name="brandArr"/>
+			<input type="hidden" name="goodsArr"/>
 
 			<div class="panelContent">
 				<table class="frmStyle">
@@ -154,6 +155,14 @@
 									</div>
 								</td>
 							</tr>
+							<tr > <!--class="off"-->
+								<th>업체&브랜드상품</th>
+								<td>
+									<div class="padding10" > <!--style="display: none;"-->
+										<div id="gridDuplicateGoodsList" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+									</div>
+								</td>
+							</tr>
 						</table>
 					</div>
 				</div>
@@ -398,6 +407,12 @@
 		{headerName: "구간시퀀스", field: "tmtbSectionSq", width: 150, cellClass: 'text-center', hide: true},
 		{headerName: "할인값시퀀스", field: "tmtbValSq", width: 150, cellClass: 'text-center', hide: true}
 	];
+	// 다른 다다익선 사용중인 중복상품 엑셀 리스트 설정
+	var columnDuplicateGoodsList = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "상품코드", field: "goodsCd", width: 120, cellClass: 'text-center'},
+		{headerName: "상품명", field: "goodsNm", width: 120, cellClass: 'text-center'}
+	];
 
 	// 공급업체 리스트 설정
 	var gridOptionsFGCompanyList = gagaAgGrid.getGridOptions(columnFGCompanyList);
@@ -426,6 +441,10 @@
 	gridOptionsSectionGbList.rowSelection = "multiple";
 	gridOptionsSectionGbList.stopEditingWhenGridLosesFocus = true;
 
+	// 다른 다다익선 사용중인 중복상품 엑셀 리스트 설정
+	var gridOptionsDuplicateGoodsList = gagaAgGrid.getGridOptions(columnDuplicateGoodsList);
+	gridOptionsDuplicateGoodsList.rowSelection = "multiple";
+
 	$(document).ready(function() {
 		// 1.그리드 그리기
 		gagaAgGrid.createGrid("gridFGPromotionCompanyList", gridOptionsFGCompanyList);
@@ -434,6 +453,7 @@
 		gagaAgGrid.createGrid("gridFGExceptGoodsList", gridOptionsFGExceptGoodsList);
 		gagaAgGrid.createGrid("gridApplyBurdenList", gridOptionsApplyBurdenList);
 		gagaAgGrid.createGrid("gridSectionGbList", gridOptionsSectionGbList);
+		gagaAgGrid.createGrid("gridDuplicateGoodsList", gridOptionsDuplicateGoodsList);
 
 		// 2. 그리드 데이터 바인딩
 		if(mode == "U"){
@@ -524,6 +544,7 @@
 	$('#btnMorebetterSave').on('click', function() {
 		var allSupplyCompData = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList);
 		var allBrandData = gagaAgGrid.getAllRowData(gridOptionsFGBrandList);
+		var allApplyGoodsData = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList);
 
 		// 공급업체+브랜드 상품조회
 		var multiSupplyCompCd = [];
@@ -536,16 +557,34 @@
 			multiBrand.push(item.brandCd);
 		});
 
+		var multiGoods = [];
+		$.each(allApplyGoodsData, function(idx, item) {
+			multiGoods.push(item.goodsCd);
+		});
+
 		$('#moreBetterForm input[name=supplyCompArr]').val(multiSupplyCompCd.join(','));
 		$('#moreBetterForm input[name=brandArr]').val(multiBrand.join(','));
+		$('#moreBetterForm input[name=goodsArr]').val(multiGoods.join(','));
 
 		var jsonData = JSON.stringify($('#moreBetterForm').serializeObject());
-		gagajf.ajaxJsonSubmit($('#moreBetterForm').prop('action'), jsonData, function() {
+		gagajf.ajaxJsonSubmit($('#moreBetterForm').prop('action'), jsonData, fnMorebetterSaveCollback);
+	});
+
+	var fnMorebetterSaveCollback = function(result){
+		console.log('duplicateYn::::'+result.duplicateYn);
+		if(result.duplicateYn == "Y"){
+			console.log('duplicateGoodsList Size::'+ result.duplicateGoodsList.length);
+			for(let i=0; i<result.duplicateGoodsList.length; i++){
+				gagaAgGrid.addRowData(gridOptionsDuplicateGoodsList, {"goodsCd" : result.duplicateGoodsList[i].goodsCd, "goodsNm" : result.duplicateGoodsList[i].goodsNm});
+			}
+			gagaAgGrid.exportToExcel('다다익선 중복상품 목록', gridOptionsDuplicateGoodsList);
+		}else{
+			mcxDialog.alert(result.msg);
 			fnMorebetterFormClose();
 			$('#btnInit').trigger('click');
 			$('#btnSearch').trigger('click');
-		});
-	});
+		}
+	}
 
 	// 저장 버튼 클릭시
 	$('#btnMorebetterSave2').on('click', function() {

+ 24 - 7
src/main/webapp/WEB-INF/views/order/CancelRequestForm.html

@@ -36,7 +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" id="btnCancelRequestPartOk" onclick="fnCancelRequestPartOk();">요청</button>
+					<button type="button" class="btn btn-success" onclick="fnCnclReq('req');">취소신청</button>
+					<button type="button" class="btn btn-success" onclick="fnCnclReq('complete');">취소완료</button>
 				</div>
 				
 				<table class="frmStyle">
@@ -886,8 +887,8 @@ var fnChangeChgReason = function(reasonCd){
 	fnCalculateRefundAmt();			//환불예정금액 계산.
 }
 
-// 취소요청
-var fnCancelRequestPartOk = function () {
+// 취소신청/완료
+var fnCnclComplete = function (reqGbn) {
 	
 	var temp 		= false;
 	var ordDtlStat	= cancelRequestTargetList[0].ordDtlStat; 
@@ -901,11 +902,11 @@ var fnCancelRequestPartOk = function () {
 	}
 	
 	if (temp == false) {
-		mcxDialog.alert('취소수량을 입력하세요.');
+		mcxDialog.alert('취소신청수량을 입력하세요.');
 		return;
 	}
 	
-	// 2. 입금대기건 && 전체취소 체크
+	// 2. 입금대기건 & 전체취소 체크
 	if (ordDtlStat == "G013_10" && $("#spanPayAmt").text() != $("#spanRefundAmt").text()) {
 		alert("입금대기건은 전체 취소만 가능합니다.");
 		return;
@@ -920,7 +921,8 @@ var fnCancelRequestPartOk = function () {
 	var chgReason = $("#cancelRequestFrm select[name=selectChgReason]").val();
 	
 	if (gagajf.isNull(chgReason)) {
-		mcxDialog.alert("취소사유를 입력하세요."); return ;
+		mcxDialog.alert("취소사유를 입력하세요."); 
+		return ;
 	}
 	
 	// 4. 환불계좌 체크
@@ -928,6 +930,7 @@ var fnCancelRequestPartOk = function () {
 	var accountNm 	= "";
 	var bankCd 		= "";
 	
+	// 결제타입 무통장입금시 환불계좌 등록
 	if (payMeans == 'G014_20') {
 		var refundAccount = gridOptionsRefundAccountInfo.api.getSelectedRows();
 		
@@ -965,6 +968,20 @@ var fnCancelRequestPartOk = function () {
 		,"chgerPhnno"		: chgerPhnno
 		,"chgerTelno"		: chgerTelno
 	}
+	
+	// 6. 취소신청, 취소완료 여부 체크
+	// 취소완료
+	if (reqGbn == "complete") {
+		cnclUrl = '/orderChange/cnclComplete/';
+	}
+	// 취소신청
+	else if (reqGbn == "req") {
+		cnclUrl = '/orderChange/cnclReq/';
+	}
+	// 취소신청 완료
+	else if (reqGbn == "reqComplete"){
+		cnclUrl = '/orderChange/cnclReqComplete/';
+	}
 
 	// 주문번호, 취소사유, 취소메모, (취소, 반품, 교환 신청 정보 목록), 환불계좌
 	var jsonData = JSON.stringify(jsonObj);
@@ -974,7 +991,7 @@ var fnCancelRequestPartOk = function () {
 		sureBtnClick		: function(){
 			// 취소 실행
 			gagajf.ajaxJsonSubmit(
-				'/orderChange/cancel/'
+				cnclUrl
 				, jsonData
 				, function() {
 					uifnPopupClose('popupOrderDetail');

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

@@ -117,7 +117,7 @@
 				</table>
 
 				<div id="wrapOrderChange">
-					<h4>(취소/반품/교환)요청 정보</h4>
+					<h4>(취소/반품/교환) 요청 정보</h4>
 					<div id="gridOrderChangeInfo" style="width:100%; height: 180px; min-height:99px;" class="ag-theme-balham"></div>
 				</div>
 
@@ -262,6 +262,7 @@ var columnDefsGoodsInfo = [
 				headerName		: "상태변경"
 				, field			: "ordDtlStatChg"
 				, width			: 120
+				, hide			: true
 				, cellClass		: 'text-center'
 				, cellRenderer	: function (params) {				
 					var strVal 		= "";
@@ -604,7 +605,25 @@ var gridOptionsDeliveryFeeInfo = gagaAgGrid.getGridOptions(columnDefsDeliveryFee
 
 // 6. 반품/교환 정보
 var columnDefsOrderChangeInfo = [
-	{headerName: "요청번호"		, field: "ordChgSq"		, width: 100	, cellClass: 'text-center'},
+	{
+		headerName		: "요청번호"		
+		, field			: "ordChgSq"		
+		, width			: 100	
+		, cellClass		: 'text-center'
+		, cellRenderer	: function(params) {
+			var rtnStr = "";
+			
+			// 취소요청, 교환요청, 반품요청 일때는 요청 정보 확인 팝업 정보
+			if (params.data.chgStat == 'G685_20' || params.data.chgStat == 'G685_30' || params.data.chgStat == 'G685_40') {
+				rtnStr = "<a href='javascript:void(0);' onclick='fnChgReqInfo(" + params.value + ");>" + params.value + "</a>";
+				//rtnStr = '<a href="javascript:void(0);" onclick="fnChgReqInfo(\'' + params.value + '\');">' + params.value + '</a>';
+			} else {
+				rtnStr = params.value;
+			}
+			
+			return  rtnStr;
+		}
+	},
 	{headerName: "요청구분"		, field: "chgGbNm"		, width: 100	, cellClass: 'text-center'},
 	{headerName: "상품코드"		, field: "goodsCd"		, width: 100	, cellClass: 'text-center'},
 	{headerName: "옵션1"			, field: "optCd1"		, width: 100	, cellClass: 'text-center'},
@@ -632,8 +651,9 @@ var columnDefsOrderChangeInfo = [
 		, cellRenderer	: function (params) {
 			var rtnStr = ""
 			
+			// 회수지수정가능(교환요청, 반품요청)
 			if (params.data.chgStat == 'G685_30' || params.data.chgStat == 'G685_40' ) {
-				// 배송지 수정 (주문배송, 교환배송)
+				
 				rtnStr += params.value;			
 				rtnStr += "<button type=\"button\" style=\"margin-left:10px\" class=\"btn btn-info\" onclick=\"fnOpenDaumAddr('" + params.node.rowIndex + "', 'CLAIM');\">POST</button>";
 				rtnStr += "<button type=\"button\" class=\"btn btn-info\" onclick=\"fnSaveChgerAddr('" + params.node.rowIndex + "');\">저장</button>";
@@ -662,7 +682,7 @@ var columnDefsOrderChangeInfo = [
 		, cellClass		: 'text-center'
 		, cellRenderer	: function (params) {
 			var retStr = "";
-
+			
 			if (params.data.chgGb == "G680_30" && params.data.chgStat == "G685_40") {
 				retStr = ' <button type="button" class="btn btn-success" onclick="fnReturnReqeustCancel(\'' + params.data.ordChgSq + '\',\'' + params.value + '\',\'' + params.node.rowIndex + '\');">반품취소</button>';
 			} else if (params.data.chgGb == "G680_40" && params.data.chgStat == "G685_30") {
@@ -992,6 +1012,12 @@ var fnExchangeRequest = function () {
 	cfnOpenModalPopup(actionUrl, 'popupExchangeRequestForm');
 };
 
+// 취소요청, 교환요청, 반품요청 일때는 요청 정보 확인 팝업 정보
+var fnChgReqInfo = function () {
+	var actionUrl = "/orderChange/cancel/request/form?ordNo=" + ordNo;
+	cfnOpenModalPopup(actionUrl, 'popupCancelRequestForm');
+};
+
 // 취소승인
 var fnCancelConfirmRequest = function (ordChgSq) {
 	mcxDialog.confirm("요청번호 [" + ordChgSq + "] 에 대한 취소승인 처리를 하시겠습니까?", {

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

@@ -0,0 +1,1397 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OrderListForm.html
+ * @desc    : 주문상세화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.11.16   jsh77b       최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1500" data-height="700"> <!-- data-width="1500" data-height="870" -->
+	<div class="panelStyle">
+		<div class="panelTitle">
+			<h2>주문상세내역</h2>
+			<button type="button" class="close" onclick="fnOrderDetailClose()"><i class="fa fa-times"></i></button>
+		</div>
+			
+		<div class="panelContent" style="height:90%; overflow-y:auto; padding:0px 20px !important; ">
+			<form id="orderDetailInfo" name="orderDetailInfo" action="#" th:method="post">
+				<input type="hidden" name="custNo"/>
+				<input type="hidden" name="orderNm"/>
+				<input type="hidden" name="orderPhnno"/>
+				<input type="hidden" name="orderEmail"/>
+				
+				<h4>기본정보</h4>
+				<!-- <div id="gridOrderInfo" style="width:100%; height:100px;" class="ag-theme-balham"></div> -->
+
+				<!-- TABLE -->
+				<table class="tableStyle">
+					<colgroup>
+						<col width="">
+						<col width="">
+						<col width="">
+						<col width="">
+						<col width="">
+						<col width="">
+						<col width="">
+						<col width="">
+						<col width="">
+						<col width="">
+						<col width="">
+						<col width="">
+						<col width="">
+					</colgroup>
+					<thead>
+						<tr>
+							<th>사이트</th>
+							<th>몰구분</th>
+							<th>웹구분</th>
+							<th>외부몰</th>
+							<th>주문일시</th>
+							<th>주문자</th>
+							<th>고객번호</th>
+							<th>주문번호</th>
+							<th>이메일</th>
+							<th>핸드폰번호</th>
+							<th>회원구분</th>
+							<th>관리대상</th>
+							<th>등급</th>
+						</tr>
+					</thead>
+					<tbody>
+						<tr>
+							<td th:text="${orderInfo[0].siteCdNm}"></td>
+							<td th:text="${orderInfo[0].mallGbNm}"></td>
+							<td th:text="${orderInfo[0].frontGbNm}"></td>
+							<td th:text="${orderInfo[0].extmallNm}"></td>
+							<td th:text="${orderInfo[0].ordDt}"></td>
+							<td th:text="${orderInfo[0].ordNm}"></td>
+							<td th:text="${orderInfo[0].custNo}"></td>
+							<td th:text="${orderInfo[0].ordNo}"></td>
+							<td th:text="${orderInfo[0].ordEmail}"></td>
+							<td th:text="${orderInfo[0].ordPhnno}"></td>
+							<td th:text="${orderInfo[0].custGbNm}"></td>
+							<td th:text="${orderInfo[0].managedRsnNm}"></td>
+							<td th:text="${orderInfo[0].custGradeNm}"></td>
+						</tr>
+					</tbody>
+				</table>
+				<!-- //TABLE -->
+									
+				<h4>주문상품정보</h4>
+				<button type="button" class="btn btnRight btn-base btn-sm off" id="btnExchange" style="margin-left:10px;" >교환요청</button>
+				<button type="button" class="btn btnRight btn-base btn-sm off" id="btnReturn">반품요청</button>
+				<button type="button" class="btn btnRight btn-base btn-sm off" id="btnCancel">취소요청</button>
+				<div id="gridOrderGoodsInfo" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+				
+				<h4>주문사은품정보</h4>
+				<button type="button" class="btn btnRight btn-base btn-sm off" id="btnFreeGiftCancel" style="margin-left:10px;" >사은품취소</button>
+				<div id="gridOrderFreeGiftInfo" style="width:100%; height:120px;" class="ag-theme-balham"></div>
+				
+				<h4>배송정보</h4>
+				<div id="gridDeliveryAddrInfo" style="width:100%; height:100px;" class="ag-theme-balham"></div>
+				
+				<table style="width:100%;">
+					<colgroup>
+						<col style="width:65%;"/>
+						<col/>                                                                                  
+					</colgroup>
+					<tbody>
+						<tr>
+							<td style="">
+								<h4>결제정보</h4>
+								<div id="gridPaymentInfo" style="width:100%; height: 100px;" class="ag-theme-balham"></div>
+							</td>
+							<td style="">
+								<h4>배송비정보</h4>
+								<div id="gridDeliveryFeeInfo" style="width:100%; height: 100px;" class="ag-theme-balham"></div>
+							</td>
+						<tr>
+					</tbody>
+				</table>
+
+				<div id="wrapOrderChange">
+					<h4>(취소/반품/교환)요청 정보</h4>
+					<div id="gridOrderChangeInfo" style="width:100%; height: 180px; min-height:99px;" class="ag-theme-balham"></div>
+				</div>
+
+				<div id="wrapRefund">
+					<h4>환불정보</h4>
+					<div id="gridOrderRefundInfo" style="width:100%; height: 100px;" class="ag-theme-balham"></div>
+				</div>
+
+				<table style="width:100%;">
+					<colgroup>
+						<col style="width:65%;"/>
+						<col/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<td style="">
+								<h4>상담내역</h4>
+								<div id="gridOrderCounselInfo" style="width:100%; height: 100px;" class="ag-theme-balham"></div>
+							</td>
+							<td style="">
+								<h4>관리자메모</h4>
+								<button type="button" id="btnCreateOrderMemo" class="btn btnRight btn-base btn-sm" style="margin-left:10px;"> +</button>
+								<div id="gridOrderMemoInfo" style="width:100%; height: 100px;" class="ag-theme-balham"></div>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+				
+			</form>
+		</div>
+	</div>
+</div>
+
+<!-- data -->
+<script th:inline="javascript">
+var ordNo 					= [[${ordNo}]];							// 주문번호
+var userNo 					= [[${userNo}]]							// 관리자번호
+
+var orderInfo 				= [[${orderInfo}]];						// 기본정보
+var orderGoodsInfo 			= [[${orderGoodsInfo}]];				// 주문상세정보
+var orderFreeGiftInfo 		= [[${orderFreeGiftInfo}]];				// 주문사은품정보
+var orderDeliveryAddrInfo	= [[${orderDeliveryAddrInfo}]];			// 배송정보
+var orderPaymentInfo 		= [[${orderPaymentInfo}]];				// 결제정보
+var orderDeliveryFeeInfo 	= [[${orderDeliveryFeeInfo}]];			// 배송비정보
+var orderChangeInfo 		= [[${orderChangeInfo}]];				// 취소/반품/교환요청 정보
+var orderRefundInfo 		= [[${orderRefundInfo}]];				// 환불정보
+var orderCounselInfo 		= [[${orderCounselInfo}]];				// 상담내역
+var orderAdminMemoInfo 		= [[${orderAdminMemoInfo}]];			// 관리자메모
+</script>
+
+<!-- AgGrid 컬럼 세팅 -->
+<script>
+// 1.주문기본정보 그리드 바인딩
+// 2.상품별 상세정보
+var columnDefsGoodsInfo = [
+	{
+		headerName	: "주문상세",
+		children	: [
+			{headerName: "번호"		, field: "ordDtlNo"		, width: 80, cellClass: 'text-center'},
+			{headerName: "주문구분"	, field: "exchGbNm"		, width: 80, cellClass: 'text-center'},
+		],
+	},
+	{
+		headerName	: "상품정보",
+		children	: [
+			{headerName: "상품코드"	, field: "goodsCd"		, width: 80, cellClass: 'text-center'},
+			{
+				headerName		: "상품명"
+				, field			: "goodsNm"
+				, width			: 200
+				, cellClass		: 'text-left'
+				, cellRenderer: function (params) {
+					return '<a href="javascript:void(0);" onclick="cfnOpenFrontGoodsPopup(\'' + params.data.goodsCd + '\',\'' + params.data.siteCd + '\');">' + params.value + '</a>';
+				}
+			},
+			{headerName: "상품타입"	, field: "goodsTypeNm"	, width: 100, cellClass: 'text-center'},
+			{headerName: "브랜드"		, field: "brandEnm"		, width: 80, cellClass: 'text-center'}
+		]
+	},
+	{
+		headerName	: "단품정보",
+		children	: [
+			{headerName: "단품코드"	, field: "itemCd"		, width: 80, cellClass: 'text-center'},
+			{
+				headerName		: "단품명"
+				, field			: "itemNm"
+				, width			: 200
+				, cellClass		: 'text-left'
+				, cellRenderer: function (params) {
+					return '<a href="javascript:void(0);" onclick="cfnOpenFrontGoodsPopup(\'' + params.data.itemCd + '\',\'' + params.data.siteCd + '\');">' + params.value + '</a>';
+				}
+			},
+			{headerName: "옵션1"		, field: "optCd1"		, width: 80, cellClass: 'text-center'},
+			{headerName: "옵션2"		, field: "optCd2"		, width: 80, cellClass: 'text-center'},
+			{headerName: "단품수량"	, field: "itemQty"		, width: 80, cellClass: 'text-center'},
+			{
+				headerName		: "단품금액"
+				, field			: "itemPrice"
+				, width			: 100
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "옵션추가금액"
+				, field			: "optAddPrice"
+				, width			: 100
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return params.value.addComma();
+				}
+			}
+		]
+	},
+	{
+		headerName	: "주문상세단품",
+		children	: [
+			{headerName: "주문수량"	, field: "ordQty"		, width: 80, cellClass: 'text-center'},
+			{headerName: "취소수량"	, field: "cnclRtnQty"	, width: 80, cellClass: 'text-center'},
+			{headerName: "변경요청수량"	, field: "ordReqChgQty"	, width: 100, cellClass: 'text-center'},
+			{headerName: "상세상태"	, field: "ordDtlStat"	, width: 120, cellClass: 'text-center', hide: true},
+			{
+				headerName		: "상세상태"
+				, field			: "ordDtlStatNm"
+				, width			: 120
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					var retVal = "";
+					retVal += (params.data.cancelRequestQty > 0) ? " 취" + params.data.cancelRequestQty : "";
+					retVal += (params.data.returnRequestQty > 0) ? " 반" + params.data.returnRequestQty : "";
+					retVal += (params.data.exchangeRequestQty > 0) ? " 교" + params.data.exchangeRequestQty : "";
+					
+					if (!gagajf.isNull(retVal)) {
+						retVal = "-" + retVal;
+					}
+					
+					return "<a href=\"javascript:void(0);\" onclick=\"fnOrderDetailChangeHst('" + params.data.ordDtlNo + "');\">" + params.value + retVal + "</a>";
+				}
+			},
+			{
+				headerName		: "상태변경"
+				, field			: "ordDtlStatChg"
+				, width			: 120
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {				
+					var strVal 		= "";
+					var strCheck	= "";
+					
+					// 현재상태에 따라서 갈수 있는 상태 정리
+					// @ 자사 : 결제완료, 배송준비중, 배송중, 배송완료
+					// @ 입점 : 결제완료, 상품준비중, 출고완료
+					// @ 모든상태값 변경 기준 (상세내역의 상택값 이력으로만 이동가능)
+					// G013_00	주문접수
+					// G013_10	입금대기
+					// G013_18	발주대기-가격차이
+					// G013_19	발주대기-우편번호상이
+					// G013_20	결제완료
+					// G013_30	상품준비중
+					// G013_40	배송준비중
+					// G013_50	배송중
+					// G013_55	출고완료
+					// G013_60	배송완료
+					// G013_98	결제전주문취소
+					// G013_99	결제후주문취소
+					// 2020.12.22 추가적인 개발은 추후 물류개발이 완료된 후 추가할 예정
+					// To Do List
+					// @ 재고정보수정
+					// @ 정산정보수정
+					strVal += "<select class='ordDtlStatChg' name='ordDtlStatChg' ordDtlNo='"+params.data.ordDtlNo+"' ordNo='"+params.data.ordNo+"' onChange='fnChangOrdDtlStat(this);'>";
+					strVal += "	<option value=''>선택</option>";
+					
+					if (!gagajf.isNull(params.data.g20)) {
+						strVal += "	<option value='G013_20'>결제완료</option>";
+					}
+					if (!gagajf.isNull(params.data.g30)) {
+						strVal += "	<option value='G013_30'>상품준비중</option>";
+					}
+					if (!gagajf.isNull(params.data.g40)) {
+						strVal += "	<option value='G013_40'>배송준비중</option>";
+					}
+					if (!gagajf.isNull(params.data.g50)) {
+						strVal += "	<option value='G013_50'>배송중</option>";
+					}
+					if (!gagajf.isNull(params.data.g55)) {
+						strVal += "	<option value='G013_55'>출고완료</option>";
+					}
+					if (!gagajf.isNull(params.data.g60)) {
+						strVal += "	<option value='G013_60'>배송완료</option>";
+					}
+					strVal += "</select>";
+					
+					return strVal;
+				}
+			}
+		]
+	},
+	{
+		headerName	: "쿠폰",
+		children	: [
+			{
+				headerName		: "즉시할인"
+				, field			: "cpn1DcAmt"
+				, width			: 80
+				, cellClass		: 'text-right' //goodsCpnDcAmtClass
+				, cellRenderer: function (params) {
+					return "<a href=\"javascript:void(0);\" onclick=\"fnOrderCouponHst('" + params.data.ordNo + "');\">" + params.value.addComma() + "</a>";
+				}
+			},
+			{
+				headerName		: "상품"
+				, field			: "goodsCpnDcAmt"
+				, width			: 80
+				, cellClass		: 'text-right' //goodsCpnDcAmtClass
+				, cellRenderer: function (params) {
+					return "<a href=\"javascript:void(0);\" onclick=\"fnOrderCouponHst('" + params.data.ordNo + "');\">" + params.value.addComma() + "</a>";
+				}
+			},
+			{
+				headerName		: "장바구니"
+				, field			: "cartCpnDcAmt"
+				, width			: 80
+				, cellClass		: 'text-right' //cartCpnDcAmtClass
+				, cellRenderer	: function (params) {
+					return "<a href=\"javascript:void(0);\" onclick=\"fnOrderCouponHst('" + params.data.ordNo + "');\">" + params.value.addComma() + "</a>";
+				}
+			}
+		]
+	},
+	{
+		headerName	: "다다익선",
+		children	: [
+			{
+				headerName		: "수량"
+				, field			: "tmtb1DcAmt"
+				, width			: 80
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return "<a href=\"javascript:void(0);\" onclick=\"fnOrderTmtbHst('" + params.data.ordNo + "');\">" + params.value.addComma() + "</a>";
+				}
+			},
+			{
+				headerName		: "금액"
+				, field			: "tmtb2DcAmt"
+				, width			: 80
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return "<a href=\"javascript:void(0);\" onclick=\"fnOrderTmtbHst('" + params.data.ordNo + "');\">" + params.value.addComma() + "</a>";
+				}
+			}
+		]
+	},
+	{
+		headerName	: "포인트",
+		children	: [
+			{
+				headerName		: "사용"
+				, field			: "pntDcAmt"
+				, width			: 80
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return "<a href=\"javascript:void(0);\" onclick=\"fnOrderPointHst('" + params.data.ordNo + "');\">" + params.value.addComma() + "</a>";
+				}
+			},
+			{
+				headerName		: "즉시사용"
+				, field			: "prePntDcAmt"
+				, width			: 80
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return "<a href=\"javascript:void(0);\" onclick=\"fnOrderPointHst('" + params.data.ordNo + "');\">" + params.value.addComma() + "</a>";
+				}
+			},
+			{
+				headerName		: "적립"
+				, field			: "savePntAmt"
+				, width			: 80
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return "<a href=\"javascript:void(0);\" onclick=\"fnOrderPointHst('" + params.data.ordNo + "');\">" + params.value.addComma() + "</a>";
+				}
+			}
+		]
+	},
+	{
+		headerName	: "상품권",
+		children	: [
+			{
+				headerName		: "사용"
+				, field			: "gfcdUseAmt"
+				, width			: 80
+				, cellClass		: 'text-right'
+				, cellRenderer	: function (params) {
+					return "<a href=\"javascript:void(0);\" onclick=\"fnOrderGiftcardHst('" + params.data.ordNo + "');\">" + params.value.addComma() + "</a>";
+				}
+			}
+		]
+	},
+	{
+		headerName	: "금액(원/단위)",
+		children	: [
+			{
+				headerName		: "주문"
+				, field			: "ordAmt"
+				, width			: 80
+				, cellClass		: 'text-right'
+				, valueFormatter: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "실결제"
+				, field			: "realOrdAmt"
+				, width			: 80
+				, cellClass		: 'text-right'
+				, valueFormatter: function (params) {
+					return params.value.addComma();
+				}
+			},
+			{
+				headerName		: "취소"
+				, field			: "cnclRtnAmt"
+				, width			: 80
+				, cellClass		: 'text-right'
+				, valueFormatter: function (params) {
+					return params.value.addComma();
+				}
+			},
+		]
+	},
+	{headerName: "결품", field: "soldoutYn", width: 60, cellClass: 'text-center'},
+	{
+		headerName	: "배송",
+		children	: [
+			{
+				headerName		: "송장번호"
+				, field			: "invoiceNo"
+				, width			: 100
+				, cellClass		: 'text-center'
+				, cellRenderer	: function (params) {
+					var retStr = '';
+					if (!gagajf.isNull(params.value)) retStr = '<a href="javascript:void(0);" onclick="fnSearchDelivery(\'' + params.data.trackingUrl + '\',\'' + params.data.invoiceNo + '\');">' + params.value + '</a>';
+					return retStr;
+				}
+			},
+			{headerName: "출고처"		, field: "delvLocNm"	, width: 120, cellClass: 'text-center'},
+			{headerName: "배송지번호"	, field: "delvAddrSq"	, width: 120, cellClass: 'text-center'}
+		]
+	}
+];
+var gridOptionsGoodsInfo = gagaAgGrid.getGridOptions(columnDefsGoodsInfo);
+
+// 2.5 주문사은품정보
+var columnDefsOrderFreeGiftInfo = [
+	{headerName: "주문사은품번호"	, field: "ordFreegiftSq"	, width: 120, cellClass: 'text-center', hide: true},
+	{headerName: "주문번호"		, field: "ordNo"			, width: 120, cellClass: 'text-center'},
+	{headerName: "사은품프로모션"	, field: "freegiftSq"		, width: 100, cellClass: 'text-center', hide: true},
+	{headerName: "사은품프로모션명"	, field: "freegiftNm"		, width: 250, cellClass: 'text-center'},
+	{headerName: "사은품혜택번호"	, field: "freegiftValSq"	, width: 100, cellClass: 'text-center', hide: true},
+	{
+		headerName			: "사용포인트"		
+		, field				: "usePoint"			
+		, width				: 100
+		, cellClass			: 'text-right'
+		, valueFormatter	: function (params) {
+			return params.value.addComma();
+		}
+	},
+	{headerName: "사은품코드"		, field: "itemCd"			, width: 100, cellClass: 'text-center'},
+	{headerName: "사은품명"		, field: "itemNm"			, width: 100, cellClass: 'text-center'},
+	{headerName: "사은품수량"		, field: "itemQty"			, width: 100, cellClass: 'text-center'},
+	{headerName: "옵션명"			, field: "optCd"			, width: 100, cellClass: 'text-center'},
+	{headerName: "옵션코드1"		, field: "optCd1"			, width: 100, cellClass: 'text-center'},
+	{headerName: "옵션코드2"		, field: "optCd2"			, width: 100, cellClass: 'text-center'},
+	{headerName: "삭제여부"		, field: "delYn"			, width: 100, cellClass: 'text-center'}
+];
+var gridOptionsOrderFreeGiftInfo = gagaAgGrid.getGridOptions(columnDefsOrderFreeGiftInfo);
+
+// 3.배송정보
+var columnDefsDeliveryInfo = [
+	{headerName: "배송지번호"		, field: "delvAddrSq"		, width: 80, cellClass: 'text-center'},
+	{headerName: "주문구분"		, field: "exchGbNm"			, width: 80, cellClass: 'text-center'},
+	{headerName: "수정여부"		, field: "delvAddrEditYn"	, width: 80, cellClass: 'text-center', hide: true},
+	{headerName: "받는분"			, field: "recipNm"			, width: 80, cellClass: 'text-left', editable: true},
+	{headerName: "핸드폰번호"		, field: "recipPhnno"		, width: 120, cellClass: 'text-left', editable: true},
+	{headerName: "전화번호"		, field: "recipTelno"		, width: 120, cellClass: 'text-left', editable: true},
+	{
+		headerName		: "우편번호"		
+		, field			: "recipZipNo"
+		, width			: 220
+		, cellClass		: 'text-center'
+		, cellRenderer	: function (params) {
+			var rtnStr = ""
+			
+			if (params.data.delvAddrEditYn < 1) {
+				// 배송지 수정 (주문배송, 교환배송)
+				rtnStr += params.value;			
+				rtnStr += "<button type=\"button\" style=\"margin-left:10px\" class=\"btn btn-info\" onclick=\"fnOpenDaumAddr('" + params.node.rowIndex + "', 'ADDR');\">POST</button>";
+				rtnStr += "<button type=\"button\" class=\"btn btn-info\" onclick=\"fnUpdateOrderAddr('" + params.node.rowIndex + "');\">저장</button>";
+			} else {
+				rtnStr += params.value;
+			}
+			
+			return rtnStr;
+		}
+	},
+	{headerName: "주소(기본)"		, field: "recipBaseAddr"	, width: 220, cellClass: 'text-left'},
+	{headerName: "주소(상세)"		, field: "recipDtlAddr"		, width: 220, cellClass: 'text-left', editable: true},
+	{headerName: "배송메모"		, field: "delvMemo"			, width: 250, cellClass: 'text-left', editable: true}
+];
+var gridOptionsDeliveryInfo = gagaAgGrid.getGridOptions(columnDefsDeliveryInfo);
+
+// 4.결제정보
+var columnDefsPaymentInfo = [
+	{headerName: "결제수단"		, field: "payMeansNm"	, width: 100	, cellClass: 'text-center'},
+	{headerName: "카드(은행)"		, field: "cardNm"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "할부(입금계좌)"	, field: "cardMips"		, width: 150	, cellClass: 'text-center'},
+	{
+		headerName		: "승인번호"
+		, field			: "pgTradeNo"
+		, width			: 100
+		, cellClass		: 'text-center'
+		, cellRenderer	: function (params) {
+			var retStr = '';
+
+			if (!gagajf.isNull(params.value)) {
+				retStr = '<a href="javascript:void(0);" onclick="fnReceiptPage(\'' + params.data.pgTid + '\');">' + params.value + '</a>';
+			}
+
+			if (gagajf.isNull(params.value) && !gagajf.isNull(params.data.pgTid)) {
+				retStr = '<a href="javascript:void(0);" onclick="fnReceiptPage(\'' + params.data.pgTid + '\');">' + '거래내역' + '</a>';
+			}
+
+			return retStr;
+		}
+	},
+	{
+		headerName			: "결제일시"	
+		, field				: "payDt"
+		, width				: 130
+		, cellClass			: 'text-center' 
+		, cellRenderer: function(params) {
+			return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmm").format("YYYY-MM-DD HH:mm") : '';
+		}
+	},
+	{headerName: "결제상태"	, field: "payStatNm"	, width: 80		, cellClass: 'text-center'},
+	{
+		headerName			: "결제금액"
+		, field				: "payAmt"
+		, width				: 80
+		, cellClass			: 'text-right'
+		, valueFormatter	: function (params) {
+			return params.value.addComma();
+		}
+	},
+	{headerName: "계좌만료일"	, field: "vaDeadline"	, width: 150	, cellClass: 'text-center'}
+];
+var gridOptionsPaymentInfo = gagaAgGrid.getGridOptions(columnDefsPaymentInfo);
+
+// 5.배송비
+var columnDefsDeliveryFeeInfo = [
+	{headerName: "배송비종류"		, field: "delvFeeGbNm", width: 120, cellClass: 'text-center'},
+	{
+		headerName			: "배송비"
+		, field				: "delvFee"
+		, width				: 100
+		, cellClass			: 'text-right'
+		, valueFormatter	: function (params) {
+			return params.value.addComma();
+		}
+	},
+	{headerName: "배송비정산여부"	, field: "delvUsacYn", width: 120, cellClass: 'text-center'},
+	{
+		headerName			: "배송비정산일시"	
+		, field				: "delvUsacDt"
+		, width				: 140
+		, cellClass			: 'text-center' 
+		, cellRenderer: function(params) {
+			return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmm").format("YYYY-MM-DD HH:mm") : '';
+		}
+	}
+];
+var gridOptionsDeliveryFeeInfo = gagaAgGrid.getGridOptions(columnDefsDeliveryFeeInfo);
+
+// 6. 반품/교환 정보
+var columnDefsOrderChangeInfo = [
+	{headerName: "요청번호"		, field: "ordChgSq"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "요청구분"		, field: "chgGbNm"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "상품코드"		, field: "goodsCd"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "옵션1"			, field: "optCd1"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "옵션2"			, field: "optCd2"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "수량"			, field: "chgQty"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "요청상태"		, field: "chgStatNm"	, width: 100	, cellClass: 'text-center'},
+	{
+		headerName		: "요청일자"		
+		, field			: "regDt"		
+		, width			: 150		
+		, cellClass		: 'text-center'
+		, cellRenderer	: function(params) {
+			return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmm").format("YYYY-MM-DD HH:mm") : '';
+		}
+	},
+	{headerName: "변경사유"		, field: "chgReasonNm"	, width: 100	, cellClass: 'text-center'},
+	{headerName: "요청메모"		, field: "chgMemo"		, width: 150	, cellClass: 'text-center'},
+	{headerName: "변경자명"		, field: "chgerNm"		, width: 100	, cellClass: 'text-center'},
+	{headerName: "변경자핸드폰"		, field: "chgerPhnno"	, width: 120	, cellClass: 'text-center', editable: true},
+	{
+		headerName		: "우편번호"		
+		, field			: "chgerZipNo"
+		, width			: 220
+		, cellClass		: 'text-center'
+		, cellRenderer	: function (params) {
+			var rtnStr = ""
+			
+			if (params.data.chgStat == 'G685_30' || params.data.chgStat == 'G685_40' ) {
+				// 배송지 수정 (주문배송, 교환배송)
+				rtnStr += params.value;			
+				rtnStr += "<button type=\"button\" style=\"margin-left:10px\" class=\"btn btn-info\" onclick=\"fnOpenDaumAddr('" + params.node.rowIndex + "', 'CLAIM');\">POST</button>";
+				rtnStr += "<button type=\"button\" class=\"btn btn-info\" onclick=\"fnSaveChgerAddr('" + params.node.rowIndex + "');\">저장</button>";
+			} else {
+				rtnStr = "";
+			}
+			
+			return rtnStr;
+		}
+	},
+	{headerName: "주소(기본)"		, field: "chgerBaseAddr"	, width: 220, cellClass: 'text-left'},
+	{headerName: "주소(상세)"		, field: "chgerDtlAddr"	, width: 150	, cellClass: 'text-center'	, editable: true},
+	{
+		headerName		: "택배사전송"
+		, field			: "wdInvoiceSendYn"
+		, width			: 120
+		, cellClass		: 'text-center'
+		, cellRenderer	: function (params) {
+			return (params.value == 'N') ? '미전송' : '전송';
+		}
+	},
+	{
+		headerName		: "요청취소"
+		, field			: "ordDtlNo"
+		, width			: 100
+		, cellClass		: 'text-center'
+		, cellRenderer	: function (params) {
+			var retStr = "";
+
+			if (params.data.chgGb == "G680_30" && params.data.chgStat == "G685_40") {
+				retStr = ' <button type="button" class="btn btn-success" onclick="fnReturnReqeustCancel(\'' + params.data.ordChgSq + '\',\'' + params.value + '\',\'' + params.node.rowIndex + '\');">반품취소</button>';
+			} else if (params.data.chgGb == "G680_40" && params.data.chgStat == "G685_30") {
+				retStr = ' <button type="button" class="btn btn-success" onclick="fnExchangeReqeustCancel(\'' + params.data.ordChgSq + '\',\'' + ordNo + '\',\'' + params.value + '\',\'' + params.node.rowIndex + '\');">교환취소</button>';
+			} else if (params.data.chgGb == "G680_20" && params.data.chgStat == "G685_20") {
+				retStr = '<button type="button" class="btn btn-success" onclick="fnCancelConfirmRequestCancel(\'' + params.data.ordChgSq + '\')">요청철회</button>';
+			}
+
+			return retStr;
+		}
+	},
+	{
+		headerName		: "회수지시전송"
+		, field			: "wdInvoiceSendYn"
+		, width			: 120
+		, cellClass		: 'text-center'
+	},
+	{headerName: "회수송장번호", field: "wdInvoiceNo", width: 90, cellClass: 'text-center'}
+];
+var gridOptionsOrderChangeInfo = gagaAgGrid.getGridOptions(columnDefsOrderChangeInfo);
+
+// 7.환불정보
+var columnDefsRefundInfo = [
+	{headerName: "환불수단"		, field: "payMeansNm"	, width: 80		, cellClass: 'text-center'},
+	{headerName: "환불은행(카드)"	, field: "cardNm"		, width: 120	, cellClass: 'text-center'},
+	{headerName: "환불은행계좌번호"	, field: "raNo"			, width: 150	, cellClass: 'text-center'},
+	{headerName: "예금주"			, field: "raNm"			, width: 80		, cellClass: 'text-center'},
+	{
+		headerName			: "환불금액"
+		, field				: "refundAmt"
+		, width				: 100
+		, cellClass			: 'text-right'
+		, valueFormatter	: function (params) {
+			return params.value.addComma();
+		}
+	},
+	{
+		headerName		: "환불완료일자"		
+		, field			: "updDt"		
+		, width			: 140	
+		, cellClass		: 'text-center'
+		, cellRenderer	: function(params) {
+			return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmm").format("YYYY-MM-DD HH:mm") : '';
+		}
+	},
+	{headerName: "환불처리자"		, field: "updNm"		, width: 120		, cellClass: 'text-center'}
+];
+var gridOptionsRefundInfo = gagaAgGrid.getGridOptions(columnDefsRefundInfo);
+
+// 8.상담내역
+var columnDefsOrderCounselInfo = [
+	{headerName: "상담구분"		, field: "counselClsfNm"	, width: 120	, cellClass: 'text-center'},
+	{headerName: "상품코드"		, field: "goodsCd"			, width: 120	, cellClass: 'text-center'},
+	{
+		headerName		: "질문제목"
+		, field			: "questTitle"
+		, width			: 250
+		, cellClass		: 'text-center'
+		, cellRenderer	: function (params) {
+			return '<a href="javascript:void(0);" onclick="cfnOpenOneToOneAskDetailPopup(\'' + params.data.counselSq + '\')">' + params.value + '</a>';
+		}
+	},
+	{
+		headerName		: "등록일"			
+		, field			: "questDt"	
+		, width			: 120	
+		, cellClass		: 'text-center'
+		, cellRenderer	: function(params) {
+			return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmm").format("YYYY-MM-DD HH:mm") : '';
+		}
+	},
+	{
+		headerName		: "답변일"			
+		, field			: "ansDt"	
+		, width			: 120	
+		, cellClass		: 'text-center'
+		, cellRenderer	: function(params) {
+			return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmm").format("YYYY-MM-DD HH:mm") : '';
+		}
+	},
+	{headerName: "답변자"			, field: "ansNm"	, width: 80		, cellClass: 'text-center'},
+	{headerName: "삭제여부"		, field: "delYn"	, width: 80		, cellClass: 'text-center'}
+];
+var gridOptionsOrderCounselInfo = gagaAgGrid.getGridOptions(columnDefsOrderCounselInfo);
+
+// 9.주문메모
+var columnDefsOrderMemoInfo = [
+	{headerName: "등록일시"		, field: "regDt"	, width: 135	, cellClass: 'text-center'},
+	{
+		headerName		: "등록자"
+		, field			: "regNm"
+		, width			: 100
+		, cellClass		: 'text-center'
+	},
+	{
+		headerName		: "관리메모"
+		, field			: "memo"
+		, width			: 150
+		, cellClass		: 'text-left'
+		, cellRenderer	: function (params) {
+			var retStr = '';
+			
+			if (!gagajf.isNull(params.value)) {
+				retStr = '<a href="javascript:void(0);" onclick="fnCreateOrderMemo(\'' + params.data.ordNo + '\',\'' + params.data.orderMemoSq + '\',\'U' + '\');">' + params.value + '</a>';
+			}
+			return retStr;
+		}
+	},
+	{
+		headerName		: "삭제"
+		, field			: "orderMemoSq"
+		, width			: 80
+		, cellClass		: 'text-center'
+		, cellRenderer	: function (params) {
+			var retStr = '';
+			
+			if (params.data.updNo == userNo) {
+				retStr = '<button type="button" class="btn btn-danger" onclick="fnDeleteOrderMemo(\'' + params.data.ordNo + '\',\'' + params.value + '\');"> - </button>';
+			}
+			return retStr;
+		}
+	},
+];
+var gridOptionsOrderMemoInfo = gagaAgGrid.getGridOptions(columnDefsOrderMemoInfo);
+</script>
+
+<script>
+var fnSetGridHeightInit = function () {
+	if (_windowWidth < 1780) {
+		_girdRowH1 = 33 + _scrollH;
+		_girdRowH2 = 80 + _scrollH;
+	} else {
+		_girdRowH1 = 33
+		_girdRowH2 = 80;
+	}
+}
+</script>
+
+<!-- 버튼 이벤트 바인딩 -->
+<script>
+var _windowWidth 	= $(window).width();		/* 위도우창 넓이 */
+var _girdRowH 		= 33;						/* 그리드 Row 줄 높이 */
+var _girdRowH1 		= 33;						/* 그리드 타이틀 1줄 짜리 높이*/
+var _girdRowH2 		= 62;						/* 그리드 타이틀 2줄 짜리 높이*/
+var _scrollH 		= 27;						/* 가로스크롤bar 높이 */
+
+$(window).resize(function () {
+	_windowWidth = $(window).width();
+	fnSetGridHeightInit();
+});
+
+</script>
+<!-- AgGrid 생성 -->
+<script>
+// 팝업닫기
+var fnOrderDetailClose = function(){
+	uifnPopupClose('popupOrderDetail');
+}
+
+$(document).ready(function () {
+	
+	// 1. 그리드 그리기
+	//gagaAgGrid.createGrid('gridOrderInfo'					, gridOptionsOrderInfo);			// 기본정보
+	gagaAgGrid.createGrid('gridOrderGoodsInfo'				, gridOptionsGoodsInfo);			// 상품정보
+	gagaAgGrid.createGrid('gridOrderFreeGiftInfo'			, gridOptionsOrderFreeGiftInfo);	// 사은품정보
+	gagaAgGrid.createGrid('gridDeliveryAddrInfo'			, gridOptionsDeliveryInfo);			// 배송정보
+	gagaAgGrid.createGrid('gridPaymentInfo'					, gridOptionsPaymentInfo);			// 결제정보
+	gagaAgGrid.createGrid('gridDeliveryFeeInfo'				, gridOptionsDeliveryFeeInfo);		// 배송비정보
+	gagaAgGrid.createGrid('gridOrderChangeInfo'				, gridOptionsOrderChangeInfo);		// 취소/반품/교환 요청 정보
+	gagaAgGrid.createGrid('gridOrderRefundInfo'				, gridOptionsRefundInfo);			// 환불정보
+	gagaAgGrid.createGrid('gridOrderCounselInfo'			, gridOptionsOrderCounselInfo);		// 상담내역
+	gagaAgGrid.createGrid('gridOrderMemoInfo'				, gridOptionsOrderMemoInfo);		// 관리자메모
+	
+	// 2. 그리드 데이터 바인딩
+	//gridOptionsOrderInfo.api.setRowData(orderInfo);								// 기본정보
+	gridOptionsGoodsInfo.api.setRowData(orderGoodsInfo);							// 상품정보
+	gridOptionsOrderFreeGiftInfo.api.setRowData(orderFreeGiftInfo);					// 사은품품정보
+	gridOptionsDeliveryInfo.api.setRowData(orderDeliveryAddrInfo);					// 배송정보
+	gridOptionsPaymentInfo.api.setRowData(orderPaymentInfo);						// 결제정보
+	gridOptionsDeliveryFeeInfo.api.setRowData(orderDeliveryFeeInfo);				// 배송비정보
+	gridOptionsOrderChangeInfo.api.setRowData(orderChangeInfo);						// 취소/반품/교환요청 정보
+	gridOptionsRefundInfo.api.setRowData(orderRefundInfo);							// 환불정보
+	gridOptionsOrderCounselInfo.api.setRowData(orderCounselInfo);					// 상담내역
+	gridOptionsOrderMemoInfo.api.setRowData(orderAdminMemoInfo);					// 관리자메모
+	
+	// 2.1 TOTAL ROWS 없애기
+	gagaAgGrid.hideStatusBar('gridOrderGoodsInfo');
+	gagaAgGrid.hideStatusBar('gridOrderFreeGiftInfo');
+	gagaAgGrid.hideStatusBar('gridDeliveryAddrInfo');
+	gagaAgGrid.hideStatusBar('gridPaymentInfo');
+	gagaAgGrid.hideStatusBar('gridDeliveryFeeInfo');
+	gagaAgGrid.hideStatusBar('gridOrderChangeInfo');
+	gagaAgGrid.hideStatusBar('gridOrderRefundInfo');
+	gagaAgGrid.hideStatusBar('gridOrderCounselInfo');
+	gagaAgGrid.hideStatusBar('gridOrderMemoInfo');
+	
+	// 3. 그리드 높이 설정
+	fnSetGridHeightInit();
+	
+	// 4. 그리드 숨김 처리
+	if (orderChangeInfo == null || orderChangeInfo.length === 0) {
+		$("#wrapOrderChange").addClass("off");
+	}
+	
+	if (orderRefundInfo == null || orderRefundInfo.length === 0) {
+		$("#wrapRefund").addClass("off");
+	}
+	
+	// 5. 버튼처리
+	// G013_00	주문접수
+	// G013_10	입금대기
+	// G013_18	발주대기-가격차이
+	// G013_19	발주대기-우편번호상이
+	// G013_20	결제완료
+	// G013_30	상품준비중
+	// G013_40	배송준비중
+	// G013_50	배송중
+	// G013_55	출고완료
+	// G013_60	배송완료
+	// G013_98	결제전주문취소
+	// G013_99	결제후주문취소
+	
+	// G685_10	결제전취소
+	// G685_20	취소요청
+	// G685_21	취소완료
+	// G685_30	교환요청
+	// G685_31	교환요청취소
+	// G685_32	교환완료
+	// G685_40	반품요청
+	// G685_41	반품요청취소
+	// G685_42	반품완료
+
+	var addrBtnChkCnt = 0;
+	gridOptionsGoodsInfo.api.forEachNode(function (rowNode, index) {
+		
+		// 입금대기, 결제완료, 상품준비중, 배송준비중 일때 취소가능
+		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.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.ordDtlStat == 'G013_10' || rowNode.data.ordDtlStat == 'G013_20' || rowNode.data.ordDtlStat == 'G013_30' || rowNode.data.ordDtlStat == 'G013_40') {
+			addrBtnChkCnt++;
+		}
+	});
+
+	// 주소변경 버튼 히든처리
+	if (addrBtnChkCnt > 0) {
+		$("#btnUpdateOrderAddr").removeClass("off");
+	}
+});
+
+$(document).ready(function () {
+	$('#orderDetailContents').css("width", "97%").css("height", "96%");
+	
+	// 취소요청
+	$('#btnCancel').on('click', function () {
+		fnCancelRequest(ordNo, 'N');
+	});
+	// 반품요청
+	$('#btnReturn').on('click', function () {
+		fnReturnRequest(ordNo, 'N');
+	});
+	// 교환요청
+	$('#btnExchange').on('click', function () {
+		fnExchangeRequest(ordNo, 'N');
+	});
+	// 메모등록
+	$('#btnCreateOrderMemo').on('click', function () {
+		fnCreateOrderMemo(ordNo, 0, 'N');
+	});
+	// 배송 정보 수정
+	$('#btnUpdateOrderAddr').on('click', function () {
+		fnUpdateOrderAddr();
+	});
+	// 환불계좌 등록
+	$('#btnSaveAccount').on('click', function () {
+		fnCreateOrderRfAccount(ordNo, custNo);
+	});
+});
+</script>
+
+<!-- function -->
+<script>
+var gridOrderChangeInfoSelectedIdx = '';
+
+// 배송지변경
+var fnUpdateOrderAddr = function (rowIdx) {	
+	gridOptionsDeliveryInfo.api.stopEditing();
+	var jsonData = JSON.stringify(gridOptionsDeliveryInfo.api.getRowNode(rowIdx).data);
+	
+	mcxDialog.confirm("주소를 변경하시겠습니까?", {
+		cancelBtnText	: "취소",
+		sureBtnText		: "확인",
+		sureBtnClick	: function () {
+			gagajf.ajaxJsonSubmit(
+				"/order/deliver/addr/update"
+				, jsonData
+				, function () {
+					
+				}
+			);
+		}
+	});
+}
+
+// 취소요청
+var fnCancelRequest = function () {
+	var actionUrl = "/orderChange/cancel/request/form?ordNo=" + ordNo;
+	cfnOpenModalPopup(actionUrl, 'popupCancelRequestForm');
+};
+
+// 반품요청
+var fnReturnRequest = function () {
+	var actionUrl = "/orderChange/return/request/form?ordNo=" + ordNo;
+	cfnOpenModalPopup(actionUrl, 'popupReturnRequestForm');
+};
+
+// 교환요청
+var fnExchangeRequest = function () {
+	var actionUrl = "/orderChange/exchange/request/form?ordNo=" + ordNo;
+	cfnOpenModalPopup(actionUrl, 'popupExchangeRequestForm');
+};
+
+// 취소승인
+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) {
+	var actionUrl = "/order/detail/change/hst/form/" + ordDtlNo;
+	cfnOpenModalPopup(actionUrl, 'popupOrderDetailChangeHstForm');
+};
+
+// 쿠폰내역 팝업
+var fnOrderCouponHst = function (ordNo) {
+	var actionUrl = "/order/detail/coupon/hst/form/" + ordNo;
+	cfnOpenModalPopup(actionUrl, 'popupOrderDetailCouponHstForm');
+};
+
+// 다다익선내역 팝업
+var fnOrderTmtbHst = function (ordNo) {
+	var actionUrl = "/order/detail/tmtb/hst/form/" + ordNo;
+	cfnOpenModalPopup(actionUrl, 'popupOrderDetailTmtbHstForm');
+};
+
+// 포인트내역 팝업
+var fnOrderPointHst = function (ordNo) {
+	var actionUrl = "/order/detail/point/hst/form/" + ordNo;
+	cfnOpenModalPopup(actionUrl, 'popupOrderDetailPointHstForm');
+};
+
+// 상품권내역 팝업
+var fnOrderGiftcardHst = function (ordNo) {
+	var actionUrl = "/order/detail/giftcard/hst/form/" + ordNo;
+	cfnOpenModalPopup(actionUrl, 'popupOrderDetailGiftcardHstForm');
+};
+
+// 관리자메모 등록
+var fnCreateOrderMemo = function (ordNo, seq, mode) {
+	var actionUrl = "/order/memo/create/form?ordNo=" + ordNo + "&seq=" + seq + "&mode=" + mode;
+	cfnOpenModalPopup(actionUrl, 'popupCreateOrderMemo');
+};
+
+// 환불계좌 등록
+var fnCreateOrderRfAccount = function (ordNo, custNo) {
+	var actionUrl = "/order/refund/account/create/form?ordNo=" + ordNo + "&custNo="+custNo;
+	cfnOpenModalPopup(actionUrl, 'popupCreateRefundAccount');
+};
+
+// 주문메모 삭제
+var fnDeleteOrderMemo = function (ordNo, orderMemoSq) {
+	mcxDialog.confirm('삭제하시겠습니까?', {
+		cancelBtnText	: "취소",
+		sureBtnText		: "확인",
+		sureBtnClick	: function () {
+			var data = new Object();
+			data.ordNo 	= ordNo;
+			data.seq 	= orderMemoSq;
+			
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit(
+				'/order/memo/delete'
+				, jsonData
+				, function () {
+					fnBindOrderMemo();
+				}
+			);
+		}
+	});
+}
+
+// 주문메모 바인딩
+var fnBindOrderMemo = function() {
+	gagaAgGrid.fetch(
+		"/order/admin/memo/list/" + ordNo
+		, gridOptionsOrderMemoInfo
+		, null
+		, function (result) {
+		}
+	);
+};
+
+// 주문 변경요청정보 바인딩
+var fnBindOrderChangeInfo = function() {
+	gagaAgGrid.fetch(
+		"/order/return/info/list/" + ordNo
+		, gridOptionsOrderChangeInfo
+		, null
+		, function (result) {
+			$('#gridOrderChangeInfo').css('height', 31 + 33 * ((result.length == 0 || result == null) ? 1 : result.length));
+		}
+	);
+};
+
+// 환불계좌 정보
+var fnBindOrderRfAccountInfo = function () {
+	gagaAgGrid.fetch(
+		"/order/refund/account/info/list?ordNo=" + ordNo+"&custNo="+custNo
+		, gridOptionsRefundAccountInfo
+		, null
+		, function (result) {
+			$('#gridOptionsRefundAccountInfo').css('height', 31 + 33 * ((result.length == 0 || result == null) ? 1 : result.length));
+		}
+	);
+};
+
+// 배송비 DATA 바인딩
+var fnBindDeliveryAddr = function(delvAddrSq) {
+	if (typeof (delvAddrSq) != 'undefined') {
+		var strLink = '/order/deliver/addr/info/' + delvAddrSq;
+		var jsonData = JSON.stringify([]);
+		gagajf.ajaxJsonSubmit(strLink, jsonData, fnBindDeliveryAddrCallBack);
+	}
+};
+
+// 배송정보
+var fnBindDeliveryAddrCallBack = function(result) {
+	gridOptionsDeliveryInfo.api.setRowData(result);
+};
+
+// 변경요청 > 회수지정보 저장
+var fnSaveChgerAddr = function (rowIdx) {
+	gridOptionsOrderChangeInfo.api.stopEditing();
+	
+	var jsonData = JSON.stringify(gridOptionsOrderChangeInfo.api.getRowNode(rowIdx).data);
+	
+	mcxDialog.confirm("주소를 변경하시겠습니까?", {
+		cancelBtnText	: "취소",
+		sureBtnText		: "확인",
+		sureBtnClick	: function () {
+			gagajf.ajaxJsonSubmit(
+				"/order/change/info/addr/update"
+				, jsonData
+				, function () {
+					
+				}
+			);
+		}
+	});
+}
+
+// 반품요청 철회
+var fnReturnReqeustCancel = function (ordChgSq, ordDtlNo, rowIdx) {
+	mcxDialog.confirm('반품요청을 철회하시겠습니까?', {
+		cancelBtnText	: "취소",
+		sureBtnText		: "확인",
+		sureBtnClick	: function () {
+			var data = new Object();
+			data.ordChgSq = ordChgSq;
+			data.ordDtlNo = ordDtlNo;
+			
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit(
+				'/order/return/request/cancel'
+				, jsonData
+				, function (result) {
+					if (result.message != '회수컨펌 된 내역이 있습니다.') {
+						var selectedRow = gridOptionsOrderChangeInfo.api.getRowNode(rowIdx).data;
+						gridOptionsOrderChangeInfo.api.updateRowData({remove: [selectedRow]});
+					}
+				}
+			);
+		}
+	});
+};
+
+// 교환요청 철회
+var fnExchangeReqeustCancel = function (ordChgSq, ordNo, ordDtlNo, rowIdx) {
+	mcxDialog.confirm('교환요청을 취소하시겠습니까?', {
+		cancelBtnText	: "취소",
+		sureBtnText		: "확인",
+		sureBtnClick	: function () {
+			var data = new Object();
+			data.ordNo 		= ordNo;
+			data.ordDtlNo 	= ordDtlNo;
+			data.ordChgSq 	= ordChgSq;
+			
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit(
+				'/order/exchange/request/cancel'
+				, jsonData, function () {
+					uifnPopupClose('popupOrderDetail');
+					fnReOpenOrderDetailPopup();
+				}
+			);
+		}
+	});
+};
+
+// LMS 전송
+var fnOpenLmsForm = function (orderPhnno, custNo) {
+	if (gagajf.isNull(custNo) && gagajf.isNull(orderPhnno)) {
+		mcxDialog.alert("정보가 올바르지 않습니다.");
+		return false;
+	}
+
+	$('#orderDetailInfo input[name=orderPhnno]').val(orderPhnno);
+	$('#orderDetailInfo input[name=custNo]').val(custNo);
+
+	var param = {};
+	param.elementCellPhnno = '#orderDetailInfo input[name=orderPhnno]';
+	param.elementCustNo = '#orderDetailInfo input[name=custNo]';
+	cfnOpenLmsPopup(param);
+};
+
+// EMAIL 전송
+var fnOpenEmailForm = function (orderEmail, orderNm, custNo) {
+	if (gagajf.isNull(orderEmail) && gagajf.isNull(orderNm) && gagajf.isNull(custNo)) {
+		mcxDialog.alert("정보가 올바르지 않습니다.");
+		return false;
+	}
+	$('#orderDetailInfo input[name=orderEmail]').val(orderEmail);
+	$('#orderDetailInfo input[name=orderNm]').val(orderNm);
+	$('#orderDetailInfo input[name=custNo]').val(custNo);
+
+	var param = {};
+	param.elementRecipEmail = '#orderDetailInfo input[name=orderEmail]';
+	param.elementCustNm = '#orderDetailInfo input[name=orderNm]';
+	param.elementCustNo = '#orderDetailInfo input[name=custNo]';
+
+	cfnOpenEmailPopup(param);
+};
+
+// 송장조회
+var fnSearchDelivery = function (url, invoiceNo) {
+	var fullUrl = url + invoiceNo;
+	window.open(fullUrl, '_blank');
+};
+
+// 카드전표 영수증 조회
+var fnReceiptPage = function (tid) {
+	var fullUrl = "https://npg.nicepay.co.kr/issue/IssueLoader.do?TID=" + tid + "&type=0";
+	window.open(fullUrl, '_blank');
+};
+
+// 수동 회수 지시 
+var fnWdinvocieSend = function (ordChgSq) {
+	mcxDialog.confirm("요청번호 [" + ordChgSq + "] 회수지시 처리 하시겠습니까? <br> 시스템에서 회수지시를 보내지는않습니다.", {
+		cancelBtnText	: "취소",
+		sureBtnText		: "확인",
+		sureBtnClick	: function () {
+			var data = new Object();
+			data.ordChgSq = ordChgSq;
+			
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit(
+				'/order/wdinvoice/send/save'
+				, jsonData
+				, function (result) {
+					uifnPopupClose('popupOrderDetail');
+					fnReOpenOrderDetailPopup();
+				}
+			);
+		}
+	});
+};
+
+// 구매확정철회
+var fnChangedCompleteDelivery = function (ordNo, ordDtlNo, ordDtlStat) {
+	if ('70' !== ordDtlStat) {
+		mcxDialog.alert("구매확정철회는 구매확정인 상태여만 가능합니다.");
+		return false;
+	}
+	
+	var data = {};
+	data.ordDtlNo = ordDtlNo;
+	data.ordNo = ordNo;
+	var jsonData = JSON.stringify(data);
+	
+	gagajf.ajaxJsonSubmit('/order/check/status', jsonData, fnChangedCompleteDeliveryCallback);
+};
+
+var fnChangedCompleteDeliveryCallback = function (result) {
+	// 구매확정 처리 가능 하지 않으면 얼럿 노출 끝
+	if (!result.isPossible) {
+		mcxDialog.alert("구매확정철회는 구매확정인 상태여만 가능합니다.");
+		return false;
+	} else {
+		mcxDialog.confirm("구매확정 철회 하시겠습니까? <br> 지급된 포인트에 대한 처리는 별도로 하셔야 합니다. ", {
+			cancelBtnText	: "취소",
+			sureBtnText		: "확인",
+			sureBtnClick	: function () {
+				var data = {};
+				data.ordDtlNo = result.ordDtlNo;
+				data.ordNo = result.ordNo;
+				
+				var jsonData = JSON.stringify(data);
+				gagajf.ajaxJsonSubmit(
+					'/order/complete/delivery/changed'
+					, jsonData
+					, function (result) {
+						uifnPopupClose('popupOrderDetail');
+						fnReOpenOrderDetailPopup();
+					}
+				);
+			}
+		});
+	}
+};
+
+// 주문상세 상태값 변경
+var fnChangOrdDtlStat = function (obj) {
+	var ordNo 			= $(obj).attr("ordNo");
+	var ordDtlNo 		= $(obj).attr("ordDtlNo");
+	var ordDtlStat 		= $(obj).val();
+	var ordDtlStatNm 	= $(obj).children("option:selected").text();
+	var strConfirm		= "주문상태를 " + ordDtlStatNm + "(으)로 변경 하시겠습니까?"
+	
+	mcxDialog.confirm(strConfirm, {
+		cancelBtnText	: "취소",
+		sureBtnText		: "확인",
+		sureBtnClick	: function () {
+			var data = new Object();
+			data.ordNo			= ordNo;
+			data.ordDtlNo 		= ordDtlNo;
+			data.ordDtlStat 	= ordDtlStat;
+
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit(
+				'/order/detail/ordDtlStat/changed'
+				, jsonData
+				, function (result) {
+					uifnPopupClose('popupOrderDetail');
+					fnReOpenOrderDetailPopup();
+				}
+			);
+		}
+	});
+};
+
+// DAUM을 이용한 우편번호 팝업 레이어
+var fnOpenDaumAddr = function(idx, addrGb) {
+		
+	let daumZip = new daum.Postcode({
+		oncomplete: function(data) {
+			// 배송지주소 수정
+			if ("ADDR" == addrGb) {
+				gridOptionsDeliveryInfo.api.gre
+				gridOptionsDeliveryInfo.api.getRowNode(idx).data.recipZipNo 		= data.zonecode;
+				gridOptionsDeliveryInfo.api.getRowNode(idx).data.recipBaseAddr 		= cfnGetDaumRoadAddr(data);
+				gridOptionsDeliveryInfo.api.getRowNode(idx).data.recipDtlAddr 		= "";
+				gridOptionsDeliveryInfo.api.refreshCells();
+			}
+			// 회수지주소 수정
+			else {
+				gridOptionsOrderChangeInfo.api.getRowNode(idx).data.chgerZipNo 		= data.zonecode;
+				gridOptionsOrderChangeInfo.api.getRowNode(idx).data.chgerBaseAddr 	= cfnGetDaumRoadAddr(data);
+				gridOptionsOrderChangeInfo.api.getRowNode(idx).data.chgerDtlAddr 	= "";
+				gridOptionsOrderChangeInfo.api.refreshCells();
+			}
+			
+			cfnCloseDaumAddr();
+		},
+		width: '100%'
+	});
+	
+	cfnOpenDaumAddr(daumZip);
+}
+</script>
+
+</html>
+
+
+
+
+