Преглед изворни кода

Merge branch 'develop' into eskim

eskim пре 5 година
родитељ
комит
480df128d1
30 измењених фајлова са 3423 додато и 637 уклоњено
  1. 19 0
      src/main/java/com/style24/admin/biz/dao/TsaCustomerDao.java
  2. 26 0
      src/main/java/com/style24/admin/biz/dao/TsaReviewDao.java
  3. 27 0
      src/main/java/com/style24/admin/biz/service/TsaCustomerService.java
  4. 37 30
      src/main/java/com/style24/admin/biz/service/TsaKakaoService.java
  5. 10 84
      src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java
  6. 41 0
      src/main/java/com/style24/admin/biz/service/TsaReviewService.java
  7. 71 32
      src/main/java/com/style24/admin/biz/web/TsaCustomerController.java
  8. 1 1
      src/main/java/com/style24/admin/biz/web/TsaGoodsController.java
  9. 123 110
      src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
  10. 41 9
      src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java
  11. 7 14
      src/main/java/com/style24/persistence/domain/MoreBetter.java
  12. 2 1
      src/main/java/com/style24/persistence/domain/MoreBetterBurden.java
  13. 72 9
      src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml
  14. 1 1
      src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  15. 68 70
      src/main/java/com/style24/persistence/mybatis/shop/TsaMorebetter.xml
  16. 7 7
      src/main/java/com/style24/persistence/mybatis/shop/TsaOrder.xml
  17. 80 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaReview.xml
  18. 135 0
      src/main/webapp/WEB-INF/views/customer/CellphoneChangePopupForm.html
  19. 78 42
      src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html
  20. 38 46
      src/main/webapp/WEB-INF/views/customer/EmailPopupForm.html
  21. 31 47
      src/main/webapp/WEB-INF/views/customer/LmsPopupForm.html
  22. 73 109
      src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html
  23. 298 0
      src/main/webapp/WEB-INF/views/marketing/ReviewForm.html
  24. 2 2
      src/main/webapp/WEB-INF/views/order/CancelRequestForm.html
  25. 1054 0
      src/main/webapp/WEB-INF/views/order/CnclReqForm.html
  26. 1054 0
      src/main/webapp/WEB-INF/views/order/CnclReqViewForm.html
  27. 10 10
      src/main/webapp/WEB-INF/views/order/OrderDetailForm.html
  28. 2 2
      src/main/webapp/WEB-INF/views/order/OrderDetailFormBack20210122.html
  29. 6 6
      src/main/webapp/WEB-INF/views/order/ReturnRequestForm.html
  30. 9 5
      src/main/webapp/WEB-INF/views/system/UserDetailForm.html

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

@@ -54,6 +54,15 @@ public interface TsaCustomerDao {
 	 */
 	void updateCustomerInfo(Customer customer);
 
+
+	/**
+	 * 회원 휴대전화번호 수정
+	 * @param customer - 고객정보
+	 * @author jsshin
+	 * @since 2021. 01. 25
+	 */
+	void updateCustomerCellPhnno(Customer customer);
+
 	/**
 	 * 회원 주문내역
 	 * @param custNo - 고객번호
@@ -101,6 +110,16 @@ public interface TsaCustomerDao {
 	 */
 	Collection<Coupon> getCustomerCouponList(Integer custNo);
 
+	/**
+	 * 회원상세-포인트
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Point
+	 * @author jsshin
+	 * @since 2021. 01. 25
+	 */
+	Point getCustomerPoint(Integer custNo);
+
 	/**
 	 * 회원상세-포인트내역
 	 *

+ 26 - 0
src/main/java/com/style24/admin/biz/dao/TsaReviewDao.java

@@ -0,0 +1,26 @@
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Review;
+
+/**
+ * 상품평 Dao
+ *
+ * @author gagamel
+ * @since 2021. 1. 25
+ */
+@ShopDs
+public interface TsaReviewDao {
+
+	/**
+	 * 상품평 목록
+	 * @param review - 상품평 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 25
+	 */
+	Collection<Review> getReviewList(Review review);
+
+}

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

@@ -89,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 - 고객번호
@@ -142,6 +157,18 @@ 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);
+	}
+
 	/**
 	 * 회원상세-포인트내역
 	 *

+ 37 - 30
src/main/java/com/style24/admin/biz/service/TsaKakaoService.java

@@ -104,6 +104,42 @@ public class TsaKakaoService {
 		}
 	}
 
+	/**
+	 * 인증번호발송
+	 * @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);
+			// Do nothing
+		}
+	}
+
 //
 //	/**
 //	 * 일대일문의 답변 알림톡 발송
@@ -139,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
-//		}
-//	}
+
 //
 //	/**
 //	 * 품절에의한 주문취소 안내

+ 10 - 84
src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java

@@ -127,49 +127,30 @@ public class TsaMorebetterService {
      */
     @Transactional("shopTxnManager")
     public void saveMoreBetterDetail(MoreBetter moreBetter) {
-        Gson gson = new Gson();
-        String jsonData = gson.toJson(moreBetter);
-        log.info("{ saveMoreBetterDetail jsonData}",jsonData);
-
         // <,> replace 처리
         moreBetter.setRegNo(TsaSession.getInfo().getUserNo());
         moreBetter.setUpdNo(TsaSession.getInfo().getUserNo());
+        Gson gson = new Gson();
+        String jsonData = gson.toJson(moreBetter);
+        log.info("{ saveMoreBetterDetail jsonData}",jsonData);
+        log.info("{ saveMoreBetterDetail moreBetter}",moreBetter);
 
         // TMTB 마스터(TB_TMTB) 저장
         morebetterDao.saveMorebetterMst(moreBetter);
 
-        // 다다익선 적용대상 설정
         // 공급업체
-        Collection<MoreBetterGoods> supplyCompList = gson.fromJson(moreBetter.getSupplyCompList() , new TypeToken<Collection<MoreBetterGoods>>(){}.getType());
-        for(MoreBetterGoods regSupplyComp : supplyCompList){
-            // 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
-            // tmtbGoodsSq 생성
-            log.info("regSupplyComp.getTmtbGoodsSq = {}",regSupplyComp.getTmtbGoodsSq());
-            Integer tmtbGoodsSq = regSupplyComp.getTmtbGoodsSq();
-            if(tmtbGoodsSq == null){
-                tmtbGoodsSq =  commonService.getNextSequence("SEQ_TMTB_GOODS");
-                regSupplyComp.setTmtbGoodsSq(tmtbGoodsSq);
-            }
+        for(MoreBetterGoods regSupplyComp : moreBetter.getSupplyCompList()){
             regSupplyComp.setTmtbSq(moreBetter.getTmtbSq());
             regSupplyComp.setGoodsGb("G800_20");
             regSupplyComp.setTargetVal(regSupplyComp.getSupplyCompCd());
             regSupplyComp.setRegNo(moreBetter.getRegNo());
             regSupplyComp.setUpdNo(moreBetter.getUpdNo());
-
             morebetterDao.saveMorebetterGoods(regSupplyComp);
         }
 
         // 브랜드
-        Collection<MoreBetterGoods> brandList = gson.fromJson(moreBetter.getBrandList() , new TypeToken<Collection<MoreBetterGoods>>(){}.getType());
-        for(MoreBetterGoods regBrand : brandList){
+        for(MoreBetterGoods regBrand : moreBetter.getBrandList()){
             // 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
-            // tmtbGoodsSq 생성
-            log.info("regBrand.getTmtbGoodsSq = {}",regBrand.getTmtbGoodsSq());
-            Integer tmtbGoodsSq = regBrand.getTmtbGoodsSq();
-            if(tmtbGoodsSq == null){
-                tmtbGoodsSq =  commonService.getNextSequence("SEQ_TMTB_GOODS");
-                regBrand.setTmtbGoodsSq(tmtbGoodsSq);
-            }
             regBrand.setTmtbSq(moreBetter.getTmtbSq());
             regBrand.setGoodsGb("G800_20");
             regBrand.setTargetVal(regBrand.getBrandCd());
@@ -180,23 +161,8 @@ public class TsaMorebetterService {
         }
 
         // 적용상품
-        Collection<MoreBetterGoods> applyGoodsList = gson.fromJson(moreBetter.getApplyGoodsList() , new TypeToken<Collection<MoreBetterGoods>>(){}.getType());
-        for(MoreBetterGoods regApplyGoods : applyGoodsList){
+        for(MoreBetterGoods regApplyGoods : moreBetter.getApplyGoodsList()){
             // 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
-            // tmtbGoodsSq 생성
-            log.info("regApplyGoods.getTmtbGoodsSq = {}",regApplyGoods.getTmtbGoodsSq());
-            Integer tmtbGoodsSq = regApplyGoods.getTmtbGoodsSq();
-            if(tmtbGoodsSq == null){
-                tmtbGoodsSq =  commonService.getNextSequence("SEQ_TMTB_GOODS");
-                regApplyGoods.setTmtbGoodsSq(tmtbGoodsSq);
-            }
-
-            log.info("regApplyGoods.getTmtbApplyGoodsSq = {}",regApplyGoods.getTmtbApplyGoodsSq());
-            Integer tmtbApplyGoodsSq = regApplyGoods.getTmtbApplyGoodsSq();
-            if(tmtbApplyGoodsSq == null){
-                tmtbApplyGoodsSq =  commonService.getNextSequence("SEQ_TMTB_APPLY_GOODS");
-                regApplyGoods.setTmtbApplyGoodsSq(tmtbApplyGoodsSq);
-            }
             regApplyGoods.setTmtbSq(moreBetter.getTmtbSq());
             regApplyGoods.setTargetVal(regApplyGoods.getGoodsCd());
             regApplyGoods.setRegNo(moreBetter.getRegNo());
@@ -207,23 +173,8 @@ public class TsaMorebetterService {
         }
 
         // 제외상품
-        Collection<MoreBetterGoods> exceptGoodsList = gson.fromJson(moreBetter.getExceptGoodsList() , new TypeToken<Collection<MoreBetterGoods>>(){}.getType());
-        for(MoreBetterGoods regExceptGoods : exceptGoodsList){
+        for(MoreBetterGoods regExceptGoods : moreBetter.getExceptGoodsList()){
             // 다다익선 적용대상 설정(TB_TMTB_GOODS) 저장
-            // tmtbGoodsSq 생성
-            log.info("regExceptGoods.getTmtbGoodsSq = {}",regExceptGoods.getTmtbGoodsSq());
-            Integer tmtbGoodsSq = regExceptGoods.getTmtbGoodsSq();
-            if(tmtbGoodsSq == null){
-                tmtbGoodsSq =  commonService.getNextSequence("SEQ_TMTB_GOODS");
-                regExceptGoods.setTmtbGoodsSq(tmtbGoodsSq);
-            }
-
-            log.info("regExceptGoods.getTmtbApplyGoodsSq = {}",regExceptGoods.getTmtbApplyGoodsSq());
-            Integer tmtbApplyGoodsSq = regExceptGoods.getTmtbApplyGoodsSq();
-            if(tmtbApplyGoodsSq == null){
-                tmtbApplyGoodsSq =  commonService.getNextSequence("SEQ_TMTB_APPLY_GOODS");
-                regExceptGoods.setTmtbApplyGoodsSq(tmtbApplyGoodsSq);
-            }
             regExceptGoods.setTmtbSq(moreBetter.getTmtbSq());
             regExceptGoods.setTargetVal(regExceptGoods.getGoodsCd());
             regExceptGoods.setRegNo(moreBetter.getRegNo());
@@ -234,25 +185,8 @@ public class TsaMorebetterService {
         }
 
         // 다다익선 할인구간 저장
-        Collection<MoreBetterSection> sectionGbList = gson.fromJson(moreBetter.getSectionGbList() , new TypeToken<Collection<MoreBetterSection>>(){}.getType());
-        for(MoreBetterSection regSection : sectionGbList){
-            log.info("regSection.getTmtbSectionSq = {}",regSection.getTmtbSectionSq());
-            log.info("regSection.getTmtbValSq = {}",regSection.getTmtbValSq());
+        for(MoreBetterSection regSection : moreBetter.getSectionGbList()){
             // 다다익선 할인구간설정 2차조건(TB_TMTB_SECTION) 저장
-            // tmtbSectionSq 생성
-            Integer tmtbSectionSq = regSection.getTmtbSectionSq();
-            //if("".equals(regSection.getTmtbSectionSq()) || regSection.getTmtbSectionSq() == null){
-            if(tmtbSectionSq == null){
-                tmtbSectionSq =  commonService.getNextSequence("SEQ_TMTB_SECTION");
-                regSection.setTmtbSectionSq(tmtbSectionSq);
-            }
-            // 다다익선 조건에 따른 할인혜택(금액할인) 설정(TB_TMTB_VAL) 저장
-            // tmtbValSq 생성
-            Integer tmtbValSq = regSection.getTmtbValSq();
-            if(tmtbValSq == null){
-                tmtbValSq =  commonService.getNextSequence("SEQ_TMTB_VAL");
-                regSection.setTmtbValSq(tmtbValSq);
-            }
             regSection.setTmtbSq(moreBetter.getTmtbSq());
             regSection.setRegNo(moreBetter.getRegNo());
             regSection.setUpdNo(moreBetter.getUpdNo());
@@ -262,15 +196,7 @@ public class TsaMorebetterService {
         }
 
         // 다다익선 업체분담율(TB_TMTB_BURDEN) 저장
-        Collection<MoreBetterBurden> burdenList = gson.fromJson(moreBetter.getBurdenList() , new TypeToken<Collection<MoreBetterBurden>>(){}.getType());
-        for (MoreBetterBurden regBurden : burdenList) {
-            // tmtbBurdenSq 생성
-            log.info("regBurden.getTmtbBurdenSq = {}",regBurden.getTmtbBurdenSq());
-            Integer tmtbBurdenSq = regBurden.getTmtbBurdenSq();
-            if(tmtbBurdenSq == null){
-                tmtbBurdenSq =  commonService.getNextSequence("SEQ_TMTB_BURDEN");
-                regBurden.setTmtbBurdenSq(tmtbBurdenSq);
-            }
+        for (MoreBetterBurden regBurden : moreBetter.getBurdenList()) {
             regBurden.setTmtbSq(moreBetter.getTmtbSq());
             regBurden.setRegNo(moreBetter.getRegNo());
             regBurden.setUpdNo(moreBetter.getUpdNo());

+ 41 - 0
src/main/java/com/style24/admin/biz/service/TsaReviewService.java

@@ -0,0 +1,41 @@
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.admin.biz.dao.TsaReviewDao;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Review;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 상품평 Service
+ *
+ * @author gagamel
+ * @since 2021. 1. 25
+ */
+@Service
+@Slf4j
+public class TsaReviewService {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TsaReviewDao reviewDao;
+
+	/**
+	 * 상품평 목록
+	 * @param review - 상품평 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 25
+	 */
+	public Collection<Review> getReviewList(Review review) {
+		return reviewDao.getReviewList(review);
+	}
+
+}

+ 71 - 32
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;
@@ -500,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;
+	}
+
 	/**
 	 * 인증번호 발송
 	 *
@@ -511,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"));
 	}
@@ -534,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;
 	}
 
 	/**
@@ -668,15 +707,15 @@ public class TsaCustomerController extends TsaBaseController {
 	 * 회원상세-포인트
 	 *
 	 * @param custNo -고객일련번호
-	 * @return TsaPoint
+	 * @return Point
 	 * @author jsshin
 	 * @since 2021. 01. 21
 	 */
-	//	@GetMapping("/point/{custNo}")
-	//	@ResponseBody
-	//	public Point getCustomerPoint(@PathVariable Integer custNo) {
-	//		return customerService.getCustomerPoint(custNo);
-	//	}
+	@GetMapping("/point/{custNo}")
+	@ResponseBody
+	public Point getCustomerPoint(@PathVariable Integer custNo) {
+		return customerService.getCustomerPoint(custNo);
+	}
 
 	/**
 	 * 회원상세-포인트내역

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

@@ -2422,7 +2422,7 @@ public class TsaGoodsController extends TsaBaseController {
 	@ResponseBody
 	public Collection<GoodsNotiInfo> getGoodsNotiInfoListByNotiClsf(@RequestBody GoodsNotiInfo goodsNotiInfo) {
 		// multi row 검색관련 처리
-		if (!StringUtils.isBlank(goodsNotiInfo.getGoodsCd())) {
+		if (StringUtils.isNotBlank(goodsNotiInfo.getGoodsCd())) {
 			goodsNotiInfo.setGoodsCds(goodsNotiInfo.getGoodsCd().replaceAll("\r", "").split("\n"));
 		}
 

+ 123 - 110
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -4,19 +4,10 @@ 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;
@@ -25,24 +16,32 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
-import com.style24.admin.biz.service.TsaBusinessService;
 import com.style24.admin.biz.service.TsaCommonService;
 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.TsaSystemService;
+import com.style24.admin.biz.service.TsaReviewService;
 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
@@ -62,24 +61,99 @@ public class TsaMarketingController extends TsaBaseController {
 	@Autowired
 	private TsaFreegiftPromotionService freegiftService;
 
-	@Autowired
-	private TsaBusinessService businessService;
-
 	@Autowired
 	private TsaRendererService rendererService;
 
 	@Autowired
 	private TsaCommonService commonService;
 
-	@Autowired
-	private TsaSystemService systemService;
-
 	@Autowired
 	private TsaMorebetterService morebetterService;
 
 	@Autowired
 	private TsaCouponService couponService;
 
+	@Autowired
+	private TsaReviewService reviewService;
+
+	/**
+	 * 상품평관리 화면
+	 * @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 진행 */
 	/**
 	 * 사은품 프로모션 관리 화면
@@ -160,7 +234,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"));
 		}
@@ -180,7 +254,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"));
 		}
@@ -188,7 +262,6 @@ public class TsaMarketingController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 
-
 	/* // xodud1202 진행 */
 
 	/* JSM 진행 */
@@ -249,7 +322,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";
@@ -297,17 +370,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"));
 		// 사용가능 고객등급 조회
@@ -324,29 +397,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;
@@ -386,7 +459,6 @@ public class TsaMarketingController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 
-
 	/**
 	 * 쿠폰발행팝업
 	 * @param
@@ -439,14 +511,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;
@@ -461,7 +533,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"));
@@ -540,10 +612,10 @@ public class TsaMarketingController extends TsaBaseController {
 
 		//tmtb sq 자동생성
 		Integer tmtbSq;
-		if ("N".equals(mode)) {
+		/*if ("N".equals(mode)) {
 			tmtbSq = commonService.getNextSequence("SEQ_TMTB");
 			moreBetter.setTmtbSq(tmtbSq);
-		}
+		}*/
 
 		if ("U".equals(mode)) {
 			// 다다익선 정보
@@ -582,74 +654,15 @@ public class TsaMarketingController extends TsaBaseController {
 	 */
 	@PostMapping("/morebetter/save")
 	@ResponseBody
-	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"));
+	public GagaResponse saveMorebetterDetail(@RequestBody MoreBetter moreBetter){
+		try {
+			morebetterService.saveMoreBetterDetail(moreBetter);
+		} catch(Exception e) {
+			e.printStackTrace();
+			return super.error(message.getMessage("FAIL_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);
-		moreBetterGoods.setMultiGoods(multiGoods);
-		log.info("[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("[duplicateGoodsList size]{}",duplicateGoodsList.size());
-
-		// SELECT -> 지금 내가 선택한 업체&브랜드에 해당하는 상품 조회 MINUS TMTB_GOODS_TEMP 상품
-		// 조회 건수 있으면 -> 해당 상품코드 엑셀로 던져주기
-		// 조회 건수 없으면 -> 저장으로 넘어감
-
-
-		//morebetterService.saveMoreBetterDetail(moreBetter);
 		return super.ok(message.getMessage("SUCC_0001"));
+
 	}
 
 	/**
@@ -790,4 +803,4 @@ public class TsaMarketingController extends TsaBaseController {
 	public Collection<Coupon> getCouponRetrieveList(@RequestBody Coupon coupon) {
 		return couponService.getCouponRetrieveList(coupon);
 	}
-}
+}

+ 41 - 9
src/main/java/com/style24/admin/biz/web/TsaOrderChangeController.java

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

+ 7 - 14
src/main/java/com/style24/persistence/domain/MoreBetter.java

@@ -6,6 +6,7 @@ import com.style24.persistence.TscPageRequest;
 import lombok.Data;
 
 import java.util.Collection;
+import java.util.List;
 
 /**
  * 품목 Domain
@@ -57,20 +58,12 @@ public class MoreBetter extends TscBaseDomain {
 	//private String burdenRate;	// 업체분담율
 	private String useYn;			// 사용여부
 
-	private String supplyCompList;
-	private String brandList;
-	private String applyGoodsList;
-	private String exceptGoodsList;
-	private String burdenList;
-	private String sectionGbList;
-	private String compBrandGoodsList;
-
-	private String supplyCompArr;
-	private String brandArr;
-	private String goodsArr;
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] arrCompBrandGoods;
+	List<MoreBetterGoods> supplyCompList;
+	List<MoreBetterGoods> brandList;
+	List<MoreBetterGoods> applyGoodsList;
+	List<MoreBetterGoods> exceptGoodsList;
+	List<MoreBetterBurden> burdenList;
+	List<MoreBetterSection> sectionGbList;
 
 	// Pagination
 	private TscPageRequest pageable;

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

@@ -14,7 +14,8 @@ import lombok.Data;
 @Data
 public class MoreBetterBurden extends TscBaseDomain {
 	// 다다익선 업체 분담율
-	private Integer tmtbBurdenSq;		// 업체분담율Sq
+	private Integer tbTmtbBurdenSq;		// 업체분담율Sq
+	private Integer tmtbBurdenSq;
 	private Integer tmtbSq;				// 프로모션Sq
 	private String tmtbSupplyCd;	// 업체코드
 	private String tmtbBurdenRate;	// 업체분담율

+ 72 - 9
src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml

@@ -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 */
@@ -317,7 +324,8 @@
 	<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
@@ -334,7 +342,8 @@
 		     , UPD_DT
 		)
 		VALUES (
-		       #{custNo}
+		       #{custDelvAddrSq}
+		     , #{custNo}
 		     , #{delvAddrNm}
 		     , IFNULL(#{defaultYn}, 'N')
 		     , #{recipNm}
@@ -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
@@ -482,7 +545,7 @@
 	<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
@@ -508,9 +571,9 @@
 		     , 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

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

@@ -3804,7 +3804,7 @@
 		             , RANK() OVER(PARTITION BY GOODS_CD ORDER BY NI_ITEM_CD) AS RK /*정렬순서 중요함. 변경하지 마세요.*/
 		        FROM   TB_GOODS_NOTI_INFO
 		        WHERE  NI_CLSF_CD = #{niClsfCd}
-		        <if test="goodsCds != '' and goodsCds != ''">
+		        <if test="goodsCds != null and goodsCds != ''">
 		        AND    (
 		                <foreach collection="goodsCds" item="item" index="index" separator="or">
 		                UPPER(GOODS_CD) LIKE CONCAT('%',UPPER(#{item}),'%') 

+ 68 - 70
src/main/java/com/style24/persistence/mybatis/shop/TsaMorebetter.xml

@@ -185,7 +185,7 @@
 
 	<select id="getMorebetterBurdenList" parameterType="Integer" resultType="MoreBetterBurden">
 		/* TsaMarketing.getMorebetterBurdenList */
-		SELECT 		TB_TMTB_BURDEN_SQ AS TMTB_BURDEN_SQ
+		SELECT 		TB_TMTB_BURDEN_SQ
 				   , TMTB_SQ
 				   , TMTB_SUPPLY_CD
 				   , TMTB_BURDEN_RATE
@@ -199,47 +199,46 @@
 		  AND TMTB_SQ = #{tmtbSq}
 	</select>
 
-	<insert id="saveMorebetterMst" parameterType="MoreBetter" >
+	<insert id="saveMorebetterMst" parameterType="MoreBetter" keyProperty="tmtbSq">
 		/* TsaMarketing.saveMorebetterMst */
 		INSERT INTO TB_TMTB(
-					 TMTB_SQ
-					,TMTB_NM
-					,TMTB_STAT
-					,TMTB_ST_DT
-					,TMTB_ED_DT
-					,APPLY_GB
-					,MULTI_YN
-					,DEL_YN
-					,REG_NO
-					,REG_DT
-					,UPD_NO
-					,UPD_DT
-			)
-			VALUES (
-			         #{tmtbSq}
-					,#{tmtbNm}
-				    ,#{tmtbStat}
-				    ,#{tmtbStdt}
-				    ,#{tmtbEddt}
-				    ,#{applyGb}
-				    ,#{multiYn}
-				    ,'N'
-				    ,#{regNo}
-				    ,NOW()
-				    ,#{updNo}
-				    ,NOW()
-				   )
-			ON DUPLICATE KEY UPDATE
-						 TMTB_NM = #{tmtbNm}
-						,TMTB_STAT = #{tmtbStat}
-						,TMTB_ST_DT = #{tmtbStdt}
-						,TMTB_ED_DT = #{tmtbEddt}
-						,MULTI_YN = #{multiYn}
-						,UPD_NO = #{updNo}
-						,UPD_DT = NOW()
+		        TMTB_SQ
+		        ,TMTB_NM
+				,TMTB_STAT
+				,TMTB_ST_DT
+				,TMTB_ED_DT
+				,APPLY_GB
+				,MULTI_YN
+				,DEL_YN
+				,REG_NO
+				,REG_DT
+				,UPD_NO
+				,UPD_DT
+		) VALUES (
+			#{tmtbSq}
+		    ,#{tmtbNm}
+			,#{tmtbStat}
+			,#{tmtbStdt}
+			,#{tmtbEddt}
+			,#{applyGb}
+			,#{multiYn}
+			,'N'
+			,#{regNo}
+			,NOW()
+			,#{updNo}
+			,NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+			TMTB_NM = #{tmtbNm}
+			,TMTB_STAT = #{tmtbStat}
+			,TMTB_ST_DT = #{tmtbStdt}
+			,TMTB_ED_DT = #{tmtbEddt}
+			,MULTI_YN = #{multiYn}
+			,UPD_NO = #{updNo}
+			,UPD_DT = NOW()
 	</insert>
 
-	<insert id="saveMorebetterGoods" parameterType="MoreBetterGoods" >
+	<insert id="saveMorebetterGoods" parameterType="MoreBetterGoods" keyProperty="tmtbGoodsSq">
 		/* TsaMarketing.saveMorebetterGoods */
 		INSERT INTO TB_TMTB_GOODS(
 		         	 TMTB_GOODS_SQ
@@ -273,7 +272,7 @@
 						,UPD_DT = NOW()
 	</insert>
 
-	<insert id="saveMorebetterApplyGoods" parameterType="MoreBetterGoods" >
+	<insert id="saveMorebetterApplyGoods" parameterType="MoreBetterGoods" keyProperty="tmtbApplyGoodsSq">
 		/* TsaMarketing.saveMorebetterApplyGoods */
 		INSERT INTO TB_TMTB_APPLY_GOODS(
 					TMTB_APPLY_GOODS_SQ
@@ -304,7 +303,7 @@
 								 ,UPD_DT = NOW()
 	</insert>
 
-	<insert id="saveMorebetterSection" parameterType="MoreBetterSection" >
+	<insert id="saveMorebetterSection" parameterType="MoreBetterSection" keyProperty="tmtbSectionSq">
 		/* TsaMarketing.saveMorebetterSection */
 		INSERT INTO TB_TMTB_SECTION(
 					 TMTB_SECTION_SQ
@@ -335,7 +334,7 @@
 						,UPD_DT = NOW()
 	</insert>
 
-	<insert id="saveMorebetterVal" parameterType="MoreBetterSection" >
+	<insert id="saveMorebetterVal" parameterType="MoreBetterSection" keyProperty="tmtbValSq">
 		/* TsaMarketing.saveMorebetterVal */
 		INSERT INTO TB_TMTB_VAL(
 					 TMTB_VAL_SQ
@@ -368,36 +367,35 @@
 						,UPD_DT = NOW()
 	</insert>
 
-	<insert id="saveMorebetterBurden" parameterType="MoreBetterBurden" >
+	<insert id="saveMorebetterBurden" parameterType="MoreBetterBurden" keyProperty="tbTmtbBurdenSq">
 		/* TsaMarketing.saveMorebetterBurden */
 		INSERT INTO TB_TMTB_BURDEN(
-					 TB_TMTB_BURDEN_SQ
-					,TMTB_SQ
-					,TMTB_SUPPLY_CD
-					,TMTB_BURDEN_RATE
-					,USE_YN
-					,REG_NO
-					,REG_DT
-					,UPD_NO
-					,UPD_DT
-			)
-			VALUES (
-			         #{tmtbBurdenSq}
-			        ,#{tmtbSq}
-			        ,#{tmtbSupplyCd}
-			        ,#{tmtbBurdenRate}
-			        ,#{useYn}
-				    ,#{regNo}
-				    ,NOW()
-				    ,#{updNo}
-				    ,NOW()
-				   )
-		ON DUPLICATE KEY UPDATE
-					 TMTB_SUPPLY_CD = #{tmtbSupplyCd}
-					,TMTB_BURDEN_RATE = #{tmtbBurdenRate}
-					,USE_YN = #{useYn}
-					,UPD_NO = #{updNo}
-					,UPD_DT = NOW()
+								  TB_TMTB_BURDEN_SQ
+		                          ,TMTB_SQ
+								  ,TMTB_SUPPLY_CD
+								  ,TMTB_BURDEN_RATE
+								  ,USE_YN
+								  ,REG_NO
+								  ,REG_DT
+								  ,UPD_NO
+								  ,UPD_DT
+		) VALUES (
+			    #{tbTmtbBurdenSq}
+		       ,#{tmtbSq}
+			   ,#{tmtbSupplyCd}
+			   ,#{tmtbBurdenRate}
+			   ,#{useYn}
+			   ,#{regNo}
+			   ,NOW()
+			   ,#{updNo}
+			   ,NOW()
+			   )
+			ON DUPLICATE KEY UPDATE
+								 TMTB_SUPPLY_CD = #{tmtbSupplyCd}
+								 ,TMTB_BURDEN_RATE = #{tmtbBurdenRate}
+								 ,USE_YN = #{useYn}
+								 ,UPD_NO = #{updNo}
+								 ,UPD_DT = NOW()
 	</insert>
 
 	<delete id="deleteTmtbSupplyCompanyList" parameterType="MoreBetterGoods">
@@ -539,7 +537,7 @@
 							</foreach>
 						</if>
 						<if test="multiGoods != null and multiGoods != ''">
-							AND G.GOODS_CD IN
+							OR G.GOODS_CD IN
 							<foreach collection="multiGoods" item="item" index="index"  open="(" close=")" separator=",">
 								#{item}
 							</foreach>

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

@@ -613,7 +613,7 @@
 		     , Z.RECIP_NM
 		     , Z.RECIP_PHNNO
 		     , Z.RECIP_TELNO
-		     , Z.RECIP_ZIP_NO
+		     , Z.RECIP_ZIPCODE
 		     , Z.RECIP_BASE_ADDR
 		     , Z.RECIP_DTL_ADDR
 		     , Z.ORD_EMAIL
@@ -632,7 +632,7 @@
 			     , DA.RECIP_NM 
 			     , DA.RECIP_PHNNO 
 			     , DA.RECIP_TELNO 
-			     , DA.RECIP_ZIP_NO 
+			     , DA.RECIP_ZIPCODE 
 			     , DA.RECIP_BASE_ADDR
 			     , DA.RECIP_DTL_ADDR
 			     , O.ORD_EMAIL
@@ -720,7 +720,7 @@
 		     , OC.CHG_MEMO
 		     , OC.CHGER_NM
 		     , OC.CHGER_PHNNO 
-		     , OC.CHGER_ZIP_NO
+		     , OC.CHGER_ZIPCODE
 		     , OC.CHGER_BASE_ADDR
 		     , OC.CHGER_DTL_ADDR
 		     , OC.WD_INVOICE_SEND_YN
@@ -831,7 +831,7 @@
 		     , O.ORD_PHNNO 
 		     , DA.RECIP_NM 
 		     , DA.RECIP_PHNNO 
-		     , DA.RECIP_ZIP_NO 
+		     , DA.RECIP_ZIPCODE 
 		     , DA.RECIP_BASE_ADDR 
 		     , DA.RECIP_DTL_ADDR 
 		     , G2.SUPPLY_GOODS_CD
@@ -1115,7 +1115,7 @@
 		     , O.ORD_PHNNO 
 		     , DA.RECIP_NM 
 		     , DA.RECIP_PHNNO 
-		     , DA.RECIP_ZIP_NO 
+		     , DA.RECIP_ZIPCODE 
 		     , DA.RECIP_BASE_ADDR 
 		     , DA.RECIP_DTL_ADDR 
 		     , G2.SUPPLY_GOODS_CD
@@ -1545,7 +1545,7 @@
 		SET    RECIP_NM        	= #{recipNm}
 		     , RECIP_PHNNO     	= #{recipPhnno}
 		     , RECIP_TELNO     	= #{recipTelno}
-		     , RECIP_ZIP_NO    	= #{recipZipNo}
+		     , RECIP_ZIPCODE    = #{recipZipcode}
 		     , RECIP_BASE_ADDR 	= #{recipBaseAddr}
 		     , RECIP_DTL_ADDR  	= #{recipDtlAddr}
 		     , DELV_MEMO       	= #{delvMemo}
@@ -1558,7 +1558,7 @@
 	<update id="updateOrderChange" parameterType="Order">
 		/* order.updateOrderChange : 반품/교환 > 회수지 정보 수정 */
 		UPDATE TB_ORDER_CHANGE
-		SET    CHGER_ZIP_NO    	= #{chgerZipNo}
+		SET    CHGER_ZIPCODE    = #{chgerZipCode}
 		     , CHGER_BASE_ADDR 	= #{chgerBaseAddr}
 		     , CHGER_DTL_ADDR  	= #{chgerDtlAddr}
 		     , UPD_NO          	= #{updNo}

+ 80 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaReview.xml

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaReviewDao">
+
+	<!--상품평 목록  -->
+	<select id="getReviewList" parameterType="Review" resultType="Review">
+		/* TsaReview.getReviewList */
+		SELECT R.REVIEW_SQ                                                /*상품평일련번호*/
+		     , R.GOODS_CD                                                 /*상품코드*/
+		     , G.GOODS_NM                                                 /*상품명*/
+		     , (SELECT SYS_IMG_NM
+		        FROM   TB_GOODS_IMG
+		        WHERE  GOODS_CD = G.GOODS_CD
+		        AND    COLOR_CD = G.MAIN_COLOR_CD
+		        AND    DEFAULT_IMG_YN = 'Y' /*디폴트이미지*/
+		        LIMIT 1
+		       )                                        AS GOODS_IMG      /*상품이미지*/
+		     , R.REVIEW_GB                                                /*상품평구분*/
+		     , R.CUST_NO                                                  /*고객번호*/
+		     , C.CUST_NM                                                  /*고객명*/
+		     , R.ORD_NO                                                   /*주문번호*/
+		     , R.ORD_DTL_NO                                               /*주문상세번호*/
+		     , R.REVIEW_TITLE                                             /*상품평제목*/
+		     , R.REVIEW_CONTENT                                           /*상품평내용*/
+		     , R.SCORE                                                    /*구매평점*/
+		     , R.HEIGHT                                                   /*키*/
+		     , R.WEIGHT                                                   /*몸무게*/
+		     , R.SCORE_SIZE                                               /*사이즈점수*/
+		     , R.SCORE_COLOR                                              /*컬러점수*/
+		     , R.SCORE_FIT                                                /*핏점수*/
+		     , R.SCORE_THICK                                              /*두께감점수*/
+		     , R.SCORE_WEIGHT                                             /*무게감점수*/
+		     , R.SCORE_BALL                                               /*볼넓이점수*/
+		     , R.GIVE_DUE_PNT                                             /*지급예정포인트*/
+		     , R.PNT_GIVE_STAT                                            /*포인트지급상태*/
+		     , R.DISP_YN                                                  /*표시여부*/
+		     , R.DEL_YN                                                   /*삭제여부*/
+		     , 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     /*확인일시*/ 
+		     , R.ADM_RPL                                                  /*관리자댓글*/
+		     , FN_GET_USER_NM(R.ADM_RPL_REG_NO)         AS ADM_RPL_GRE_NM /*관리자댓글작성자명*/
+		     , DATE_FORMAT(R.ADM_RPL_DT,'%Y%m%d%H%i%S') AS ADM_RPL_DT     /*관리자댓글작성일시*/
+		FROM   TB_REVIEW R
+		     , TB_CUSTOMER C
+		     , TB_GOODS G
+		WHERE  R.CUST_NO = C.CUST_NO
+		AND    R.GOODS_CD = G.GOODS_CD
+		<if test="goodsCds != null and goodsCds != ''">
+		AND    (
+		        <foreach collection="goodsCds" item="item" index="index" separator="or">
+		        UPPER(R.GOODS_CD) LIKE CONCAT('%',UPPER(#{item}),'%') 
+		        </foreach>
+		       )
+		</if>
+		<if test="startDt != null and startDt != ''">
+		AND    R.REG_DT <![CDATA[>=]]> STR_TO_DATE(#{startDt},'%Y-%m-%d')
+		</if>
+		<if test="endDt != null and endDt != ''">
+		AND    R.REG_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{endDt},'%Y-%m-%d'),INTERVAL 1 DAY)
+		</if>
+		<if test="reviewGb != null and reviewGb != ''">
+		AND    R.REVIEW_GB = #{reviewGb}
+		</if>
+		<if test="pntGiveStat != null and pntGiveStat != ''">
+		AND    R.PNT_GIVE_STAT = #{pntGiveStat}
+		</if>
+		<if test="dispYn != null and dispYn != ''">
+		AND    R.DISP_YN = #{dispYn}
+		</if>
+		<if test="searchGb == 'memNm'">
+		AND    UPPER(C.CUST_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		</if>
+		<if test="searchGb == 'email'">
+		AND    UPPER(C.EMAIL) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		</if>
+		ORDER  BY R.REG_DT DESC
+	</select>
+	
+</mapper>

+ 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>

+ 78 - 42
src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html

@@ -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>
@@ -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>
@@ -905,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 () {
@@ -970,6 +985,7 @@
 		$('#custAddrForm input[name=custDelvAddrSq]').val('');
 		$('#custAddrForm input[name=recipPhnno]').val('');
 		$('#custAddrForm input[name=recipTelno]').val('');
+		fnDisplayDeliveryCheckBox('N', 'N');
 	});
 
 	// 배송지정보 - 저장버튼
@@ -1039,7 +1055,6 @@
 	});
 
 
-
 	// 회원접촉이력 저장
 	$('#btnSaveContact').on('click', function () {
 		if (!gagajf.validation('#custContactHstForm')) {
@@ -1119,12 +1134,7 @@
 			$('#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);
 		}
 	};
 
@@ -1176,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');
 	};
 
 	//	쿠폰내역 조회
@@ -1199,11 +1204,12 @@
 		$.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;
@@ -1222,29 +1228,31 @@
 		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 select[name=contactType]').val('');
-		$('#custContactHstForm select[name=contactMethod]').val('');
-		$('#custContactHstForm textarea[name=contactContents]').val('');
-
+		$('#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을 이용한 우편번호 팝업 레이어
@@ -1434,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;

+ 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">

+ 73 - 109
src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html

@@ -29,9 +29,6 @@
 			<input type="hidden" name="exceptGoodsList"/>			<!-- 제외상품 리스트 -->
 			<input type="hidden" name="burdenList"/>				<!-- 업체 분담율 리스트 -->
 			<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">
@@ -269,8 +266,9 @@
 			<li  class="right">
 				<!-- <th:block th:if="${sessionInfo.roleCd == 'G001_0000' OR sessionInfo.roleCd == 'G001_A000' OR sessionInfo.roleCd == 'G001_A101' OR sessionInfo.roleCd == 'G001_A100' OR sessionInfo.roleCd == 'G001_A001'}"> -->
 				<!--<button type="button" class="btn btnRight btn-success btn-lg" id="btnSearchList">목록</button>-->
-				<button type="button" th:if="${mode == 'N'}" class="btn btnRight btn-success btn-lg" id="btnMorebetterSave">저장</button>
-				<button type="button" th:if="${mode == 'U'}" class="btn btnRight btn-success btn-lg" id="btnMorebetterUpdate">수정</button>
+				<button type="button" class="btn btnRight btn-success btn-lg" id="btnMorebetterSave">저장</button>
+				<!--<button type="button" th:if="${mode == 'N'}" class="btn btnRight btn-success btn-lg" id="btnMorebetterSave">저장</button>
+				<button type="button" th:if="${mode == 'U'}" class="btn btnRight btn-success btn-lg" id="btnMorebetterUpdate">수정</button>-->
 				<!--<button type="button" class="btn btnRight btn-success btn-lg" id="btnChangeStatIng">진행</button>
                     <button type="button" class="btn btnRight btn-success btn-lg" id="btnPromotionDelete">삭제</button>
                     <button type="button" class="btn btnRight btn-success btn-lg" id="btnPromotionStop">중지</button>-->
@@ -541,53 +539,25 @@
 		});
 	});
 
-	$('#btnMorebetterSave').on('click', function() {
-		var allSupplyCompData = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList);
-		var allBrandData = gagaAgGrid.getAllRowData(gridOptionsFGBrandList);
-		var allApplyGoodsData = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList);
-
-		// 공급업체+브랜드 상품조회
-		var multiSupplyCompCd = [];
-		$.each(allSupplyCompData, function(idx, item) {
-			multiSupplyCompCd.push(item.supplyCompCd);
-		});
-
-		var multiBrand = [];
-		$.each(allBrandData, function(idx, item) {
-			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, 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});
+	var fnGoodsGbCheck = function (){
+		let applyGoodsData = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList);
+		var checkCnt = 0;
+		$.each(applyGoodsData, function(idx, item) {
+			if(item.goodsGb == 'G800_10'){
+				checkCnt++;
 			}
-			gagaAgGrid.exportToExcel('다다익선 중복상품 목록', gridOptionsDuplicateGoodsList);
+		});
+		console.log('checkCnt>>'+checkCnt);
+		if(checkCnt < 1){
+			mcxDialog.alert("기본상품을 1개 이상 지정해주세요.");
+			return false;
 		}else{
-			mcxDialog.alert(result.msg);
-			fnMorebetterFormClose();
-			$('#btnInit').trigger('click');
-			$('#btnSearch').trigger('click');
+			console.log('통과');
 		}
-	}
+	};
 
-	// 저장 버튼 클릭시
-	$('#btnMorebetterSave2').on('click', function() {
+	// 저장
+	$('#btnMorebetterSave').on('click', function() {
 		// validation
 		if (!gagajf.validation('#moreBetterForm'))
 			return false;
@@ -607,84 +577,78 @@
 			$('#moreBetterForm input[name=tmtbStdt]').focus();
 			return false;
 		}
-		// 공급업체&&브랜드 체크
-		let allSupplyCompCnt = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList).length;
-		let allBrandCnt = gagaAgGrid.getAllRowData(gridOptionsFGBrandList).length;
-		console.log('allSupplyCompCnt>>>>'+allSupplyCompCnt);
-		console.log('allBrandCnt>>>>'+allBrandCnt);
-		if(allSupplyCompCnt>0){
-			if(allBrandCnt<1){
+
+		// 각 ag-grid list 수량
+		let allSupplyCompData = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList);
+		let allBrandData = gagaAgGrid.getAllRowData(gridOptionsFGBrandList);
+		let allApplyGoodsData = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList);
+		let allExceptGoodsData = gagaAgGrid.getAllRowData(gridOptionsFGExceptGoodsList);
+		let allApplyBurdenData = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList);
+		let allSectionGbData = gagaAgGrid.getAllRowData(gridOptionsSectionGbList);
+
+		if(allSupplyCompData.length > 0){
+			if(allBrandData.length < 1){
 				mcxDialog.alert('브랜드를 추가해주세요.');
 				return;
 			}
 		}
-		if(allBrandCnt>0){
-			if(allSupplyCompCnt<1){
+		if(allBrandData.length > 0){
+			if(allSupplyCompData.length < 1){
 				mcxDialog.alert('공급업체를 추가해주세요.');
 				return;
 			}
 		}
 
-		// 각 ag-grid list 수량
-		let supplyCompCnt = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList).length;
-		let brandCnt = gagaAgGrid.getAllRowData(gridOptionsFGBrandList).length;
-		let applyGoodsCnt = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList).length;
-		let exceptGoodsCnt = gagaAgGrid.getAllRowData(gridOptionsFGExceptGoodsList).length;
-		let applyBurdenCnt = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList).length;
-		let sectionGbCnt = gagaAgGrid.getAllRowData(gridOptionsSectionGbList).length;
-
-		if(applyGoodsCnt < 1){
-			mcxDialog.alert("적용상품이 없습니다.");
-			return false;
-		}
-		if(sectionGbCnt < 1){
+		if(allSectionGbData.length < 1){
 			mcxDialog.alert("할인구간을 설정해주세요.");
 			return false;
 		}
 
-		// disabled 값 넘겨주기
-		$('#moreBetterForm input[name=tmtbSq]').val($('#moreBetterForm input[name=disTmtbSq]').val());
-		$('#moreBetterForm input[name=tmtbStat]').val($('input:radio[name="disTmtbStat"]:checked').val());
+		// 적용상품 그리드에 기본상품 1개이상 있는지 체크
+		fnGoodsGbCheck();
+
+		var data = {
+			mode : $('#moreBetterForm input[name=mode]').val()
+			, tmtbSq : $('#moreBetterForm input[name=disTmtbSq]').val()
+			, tmtbNm : $('#moreBetterForm input[name=tmtbNm]').val()
+			, tmtbStat : $('input:radio[name="disTmtbStat"]:checked').val()
+			, tmtbStdt : $('#moreBetterForm input[name=tmtbStdt]').val()
+			, tmtbEddt : $('#moreBetterForm input[name=tmtbEddt]').val()
+			, sectionGb : $('input:radio[name="sectionGb"]:checked').val()
+			, applyGb : $('input:radio[name="sectionGb"]:checked').val()
+			, dcWay : $('input:radio[name="dcWay"]:checked').val()
+			, multiYn : $('#moreBetterForm input[name=multiYn]').val()
+			, supplyCompList : allSupplyCompData
+			, brandList : allBrandData
+			, applyGoodsList : allApplyGoodsData
+			, exceptGoodsList : allExceptGoodsData
+			, burdenList : allApplyBurdenData
+			, sectionGbList : allSectionGbData
+		};
+
+		var jsonData = JSON.stringify(data);
 
-		mcxDialog.confirm('선택된 데이터를 저장하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function(){
-				var compAllData = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList);
-				var brandAllData = gagaAgGrid.getAllRowData(gridOptionsFGBrandList);
-				var applyAllData = gagaAgGrid.getAllRowData(gridOptionsFGApplyGoodsList);
-				var exceptAllData = gagaAgGrid.getAllRowData(gridOptionsFGExceptGoodsList);
-				var burdenAllData = gagaAgGrid.getAllRowData(gridOptionsApplyBurdenList);
-				var sectionGbAllData = gagaAgGrid.getAllRowData(gridOptionsSectionGbList);
-
-				var jsonSupplyCompData = JSON.stringify(compAllData);
-				$('#moreBetterForm input[name=supplyCompList]').val(jsonSupplyCompData);
-				var jsonBrandData = JSON.stringify(brandAllData);
-				$('#moreBetterForm input[name=brandList]').val(jsonBrandData);
-				var jsonApplyData = JSON.stringify(applyAllData);
-				$('#moreBetterForm input[name=applyGoodsList]').val(jsonApplyData);
-				var jsonExceptData = JSON.stringify(exceptAllData);
-				$('#moreBetterForm input[name=exceptGoodsList]').val(jsonExceptData);
-				var jsonBurdenData = JSON.stringify(burdenAllData);
-				$('#moreBetterForm input[name=burdenList]').val(jsonBurdenData);
-
-				var jsonSectionGbData = JSON.stringify(sectionGbAllData);
-				$('#moreBetterForm input[name=sectionGbList]').val(jsonSectionGbData);
-
-				$('#moreBetterForm input[name=applyGb]').val($('input:radio[name="sectionGb"]:checked').val());
-
-
-				var jsonData = JSON.stringify($('#moreBetterForm').serializeObject());
-				gagajf.ajaxJsonSubmit($('#moreBetterForm').prop('action'), jsonData, function() {
-					fnMorebetterFormClose();
-					$('#btnInit').trigger('click');
-					$('#btnSearch').trigger('click');
-				});
+		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});
 			}
-		});
+			mcxDialog.alert("다른 다다익선에서 사용중인 상품이 존재합니다.");
+			gagaAgGrid.exportToExcel('다다익선 중복상품 목록', gridOptionsDuplicateGoodsList);
 
-	});
+			return;
+		}else{
+			mcxDialog.alert(result.msg);
+			fnMorebetterFormClose();
+			$('#btnInit').trigger('click');
+			$('#btnSearch').trigger('click');
+		}
+	}
 
 	// 공급업체 설정 / 업체 추가 콜백함수
 	var fnSetPopupComapnyInfo = function(result) {

+ 298 - 0
src/main/webapp/WEB-INF/views/marketing/ReviewForm.html

@@ -0,0 +1,298 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : ReviewForm.html
+ * @desc    : 상품평관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.25   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/marketing/review/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<input type="hidden" name="pageNo" value ="1"/>
+				<input type="hidden" name="pageSize" value="50"/>
+				
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:8%;"/>
+						<col style="width:10%;"/>
+						<col style="width:13%;"/>
+						<col style="width:10%;"/>
+						<col style="width:10%;"/>
+						<col style="width:10%;"/>
+						<col style="width:8%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>등록일자</th>
+						<td colspan="7" id="terms">
+						</td>
+						<th rowspan="2">상품코드</th>
+						<td rowspan="2">
+							<textarea class="textareaR2 w150" name="goodsCd" id="goodsCd"></textarea>
+						</td>
+					</tr>
+					<tr>
+						<th>상품평유형</th>
+						<td>
+							<select name="reviewGb">
+								<option value="">[전체]</option>
+								<option value="R">일반</option>
+								<option value="P">포토/영상</option>
+							</select>
+						</td>
+						<th>회원검색</th>
+						<td>
+							<select name="searchGb">
+								<option value="memNm">회원명</option>
+								<option value="email">이메일</option>
+							</select>
+							<input type="text" name="seachTxt" class="w100" maxlength="50"/>
+						</td>
+						<th>포인트지급상태</th>
+						<td>
+							<select name="pntGiveStat">
+								<option value="">[전체]</option>
+								<option th:if="${pntGiveStatList}" th:each="oneData, status : ${pntGiveStatList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>노출여부</th>
+						<td>
+							<select name="dispYn">
+								<option value="">[전체]</option>
+								<option value="Y" selected="selected">[Y] Yes</option>
+								<option value="N">[N] No</option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- //검색조건 영역 -->
+		
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li>
+					<button type="button" class="btn btn-info btn-lg" id="btnSaveBestReview">베스트상품평 선정</button>
+				</li>
+				<li class="right">
+					검색결과 : <strong><span id="totCnt">0</span> 건</strong>&nbsp;
+					쪽번호 <span id="pageNo">0</span>/ <strong id="totPage" class="marR10">0</strong>
+					<select name="pageSize">
+						<option value="50" selected="selected">50개씩 보기</option>
+						<option value="100">100개씩 보기</option>
+						<option value="500">500개씩 보기</option>
+						<option value="1000">1000개씩 보기</option>
+					</select>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+			
+			<div id="gridList" style="width: 100%; height: 670px" class="ag-theme-balham lh60"></div>
+			
+			<ul class="panelBar">
+				<li class="center">
+					<div class="tablePaging" id="pagination"></div>
+				</li>
+			</ul>
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let scoreSizeList = gagajf.convertToArray([[${scoreSizeList}]]);
+	let scoreColorList = gagajf.convertToArray([[${scoreColorList}]]);
+	let scoreFitList = gagajf.convertToArray([[${scoreFitList}]]);
+	let scoreThickList = gagajf.convertToArray([[${scoreThickList}]]);
+	let scoreWeightList = gagajf.convertToArray([[${scoreWeightList}]]);
+	let scoreBallList = gagajf.convertToArray([[${scoreBallList}]]);
+	let pntGiveStatList = gagajf.convertToArray([[${pntGiveStatList}]]);
+	
+	// specify the columns
+	let columnDefs = [
+		{
+			width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false,
+			checkboxSelection: function (params) { return params.data.bestYn == 'N' ? true : false; }
+		},
+		{
+			headerName: "상품평번호", field: "reviewSq", width: 90, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + (params.value == 'R' ? '일반' : '포토/영상') + '</a>';
+			}
+		},
+		{headerName: "상품평유형", field: "reviewGb", width: 90, cellClass: 'text-center'},
+		{
+			headerName: "주문상품", cellClass: 'text-center',
+			children: [
+				{headerName: '주문번호', field: 'ordNo', width: 90, cellClass: 'text-center', cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }},
+				{headerName: '주문상세번호', field: 'ordDtlNo', width: 120, cellClass: 'text-center', hide: true},
+				{headerName: "브랜드명", field: "brandKnm", width: 130, cellClass: 'text-center'},
+				{
+					headerName: "이미지", field: "goodsImg", width: 100, height: 60, cellClass: 'text-center',
+					cellRenderer: function(params) {
+						return '<img width="60" src="' + _goodsUrl + '/' + params.value + '" alt="" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \'' + _goodsUrl + '/' + params.value + '\')" onerror="this.src=\'/image/no.gif\';"/>';
+					}
+				},
+				{headerName: "상품코드", field: "goodsCd", width: 120, cellClass: 'text-center', cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }},
+				{headerName: "상품명", field: "goodsNm", width: 240, cellClass: 'text-center'},
+				{headerName: '회원번호', field: 'custNo', width: 100, cellClass: 'text-center', hide: true},
+				{headerName: '주문자명', field: 'orderNm', width: 100, cellClass: 'text-center', cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }}
+			]
+		},
+		{headerName: "상품평 제목", field: "reviewTitle", width: 200, cellClass: 'text-center', hide: true},
+		{headerName: "상품평 내용", field: "reviewContent", width: 500, cellClass: 'text-center', hide: true},
+		{
+			headerName: "베스트", cellClass: 'text-center',
+			children: [
+				{headerName: '베스트여부', field: 'bestYn', width: 90, cellClass: 'text-center'},
+				{headerName: '포인트지급여부', field: 'bpntGiveYn', width: 120, cellClass: 'text-center', cellRenderer: function(params) { return params.value == 'N' ? '미지급' : '지급'; }},
+				{headerName: '지급포인트', field: 'giveDueBpnt', width: 100, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }}
+			]
+		},
+		{
+			headerName: "만족도 점수", cellClass: 'text-center',
+			children: [
+				{headerName: '총점', field: 'score', width: 100, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+				{headerName: '사이즈점수', field: 'scoreSize', width: 100, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(scoreSizeList, params.value); }},
+				{headerName: '컬러점수', field: 'scoreColor', width: 100, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(scoreColorList, params.value); }},
+				{headerName: '핏점수', field: 'scoreFit', width: 100, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(scoreFitList, params.value); }},
+				{headerName: '두께감점수', field: 'scoreThick', width: 100, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(scoreThickList, params.value); }},
+				{headerName: '무게감점수', field: 'scoreWeight', width: 100, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(scoreWeightList, params.value); }},
+				{headerName: '볼넓이점수', field: 'scoreBall', width: 100, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(scoreBallList, params.value); }}
+			]
+		},
+		{
+			headerName: "노출여부", field: "dispYn", width: 90, cellClass: 'text-center',
+			cellRenderer: function(params) { return params.value == 'N' ? '미노출' : '노출'; }
+		},
+		{headerName: "삭제여부", field: "delYn", width: 90, cellClass: 'text-center', hide: true},
+		{
+			headerName: "지급예정포인트", field: "giveDuePnt", width: 120, cellClass: 'text-center'},
+		{
+			headerName: "포인트지급상태", field: "pntGiveStat", width: 120, cellClass: 'text-center',
+			cellEditorParams: { values: gagaAgGrid.extractValues(pntGiveStatList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(pntGiveStatList, params.value); }
+		},
+		{
+			headerName: "확인", cellClass: 'text-center',
+			children: [
+				{headerName: '확인여부', field: 'confirmYn', width: 90, cellClass: 'text-center', cellRenderer: function(params) { return params.value == 'N' ? '미확인' : '확인'; }},
+				{headerName: '확인자', field: 'confirmUnm', width: 90, cellClass: 'text-center'},
+				{headerName: '확인일시', field: 'confirmDt', width: 150, cellClass: 'text-center', cellRenderer: function(params) { gagaAgGrid.toDateTimeFormat(params.value); }}
+			]
+		},
+		{
+			headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) { gagaAgGrid.toDateTimeFormat(params.value); }
+		}
+	];
+	
+	// Get GridOptions
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	
+	gridOptions.rowSelection = 'multiple';
+	gridOptions.rowHeight = 60; // 이미지가 있을경우 높이 지정해야함.
+	
+	// 조회
+	$('#btnSearch').on('click', function() {
+		gagaPaging.init('searchForm', fnSearchCallBack, 'pagination', $('#searchForm input[name=pageSize]').val());
+		gagaPaging.load($("#searchForm input[name=pageNo]").val());
+	});
+	
+	// 조회 콜백함수
+	var fnSearchCallBack = function(result) {
+		gridOptions.api.setRowData(result.dataList);
+		gagaPaging.createPagination(result.paging.pageable);
+		$('#totCnt').html(result.paging.pageable.totalCount.addComma());
+		$('#pageNo').val(result.paging.pageable.pageNo.addComma());
+		$('#totPage').val(result.paging.pageable.totalPage.addComma());
+	}
+
+	// 페이징크기 변경 시
+	$('select[name=pageSize]').on('change', function() {
+		$('#searchForm input[name=pageSize]').val($(this).val());
+		$('#searchForm input[name=pageNo]').val(1);
+		$('#btnSearch').trigger('click');
+	});
+	
+	// 베스트상품평 선정
+	$('#btnSaveBestReview').on('click', function() {
+		let chooseData = gagaAgGrid.selectedRowData(gridOptions);
+		
+		if (chooseData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		mcxDialog.confirm("베스트상품평으로 선정하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var updatedData = [];
+				
+				$.each(chooseData, function(idx, item) {
+					if (item.bestYn == 'N') {
+						item.bestYn = 'Y';
+						updatedData.push(item);
+					}
+				});
+				
+				var jsonData = JSON.stringify(updatedData);
+				gagajf.ajaxJsonSubmit('/marketing/review/best/save'
+						, jsonData
+						, function() {
+							$('#btnSearch').trigger('click');
+						});
+			}
+		});
+	});
+	
+	// 상품평 상세 팝업
+	var fnOpenReviewPopup = function(reviewSq) {
+		var actionUrl = "/marketing/review/detail/" + reviewSq;
+		cfnOpenModalPopup(actionUrl, "popupReviewDetail");
+	}
+	
+	$(document).ready(function() {
+		cfnCreateCalendar('#terms', 'startDt', 'endDt', true, '등록');
+		$('.btnToday').trigger('click');
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

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

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

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

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

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

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

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

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

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

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

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

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

+ 9 - 5
src/main/webapp/WEB-INF/views/system/UserDetailForm.html

@@ -176,20 +176,24 @@
 								<option th:if="${roleList}" th:each="oneData, status : ${roleList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" th:selected="${roleCd == oneData.cd}"></option>
 							</select>
 						</td>
-						<th><span id="detailRoleRefVal">업체</span></th>
+						<th>
+							<span id="detailRoleRefVal" th:if="${userInfo.roleCd == 'G001_B000'}">업체</span>
+							<span id="detailRoleRefVal" th:if="${userInfo.roleCd == 'G001_C000'}">외부몰벤더</span>
+							<span id="detailRoleRefVal" th:if="${userInfo.roleCd == 'G001_D000'}">제휴채널</span>
+						</th>
 						<td>
 							<input type="hidden" name="roleRefVal" th:value="${userInfo.roleRefVal}"/>
-							<select name="supplyCompCd">
+							<select name="supplyCompCd" th:style="${userInfo.roleCd == 'G001_B000' ? '' : 'display: none'}">
 								<option th:if="${sessionInfo.supplyCompCd == null}" value="">[선택]</option>
 								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" th:selected="${userInfo.roleRefVal == oneData.cd}"></option>
 							</select>
-							<select name="vendorId" style="display: none">
+							<select name="vendorId" th:style="${userInfo.roleCd == 'G001_C000' ? '' : 'display: none'}">
 								<option th:if="${sessionInfo.vendorId == null}" value="">[선택]</option>
 								<option th:if="${vendorList}" th:each="oneData, status : ${vendorList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" th:selected="${userInfo.roleRefVal == oneData.cd}"></option>
 							</select>
-							<select name="afLinkCd" style="display: none">
+							<select name="afLinkCd" th:style="${userInfo.roleCd == 'G001_D000' ? '' : 'display: none'}">
 								<option th:if="${sessionInfo.afLinkCd == null}" value="">[선택]</option>
-								<option th:if="${afLinkList}" th:each="oneData, status : ${afLinkList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+								<option th:if="${afLinkList}" th:each="oneData, status : ${afLinkList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" th:selected="${userInfo.roleRefVal == oneData.cd}"></option>
 							</select>
 						</td>
 					</tr>