Bläddra i källkod

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

# Conflicts:
#	src/main/java/com/style24/front/biz/web/TsfMypageController.java
ChoiSooHwan 5 år sedan
förälder
incheckning
faeeba1802

+ 12 - 0
src/main/java/com/style24/front/biz/dao/TsfCouponDao.java

@@ -1,5 +1,7 @@
 package com.style24.front.biz.dao;
 
+import java.util.Collection;
+
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Cart;
 import com.style24.persistence.domain.Coupon;
@@ -28,4 +30,14 @@ public interface TsfCouponDao {
 	 * @since 2021. 02. 17
 	 */
 	Coupon getSearchSerialCpnInfo(Coupon param);
+
+	/**
+	 * 마이페이지 등급쿠폰 다운가능 쿠폰 정보 조회
+	 * 
+	 * @param coupon
+	 * @return Collection<Coupon>
+	 * @author card007
+	 * @since 2021.02.25
+	 */
+	Collection<Coupon> getCustGradeCouponInfo(Coupon coupon);
 }

+ 1 - 2
src/main/java/com/style24/front/biz/service/TsfCartService.java

@@ -343,6 +343,7 @@ public class TsfCartService {
 
 		// 섹션 정보 조회 후 할인 여부 판단
 		Collection<Order> tmtbSectionList = cartDao.selectTmtbSectionValList(applySq);
+		
 		for(Order applyInfo : tmtbApplyList) {													// 기준 상품 및 다다익선 정보 조회
 			// 다다익선 할인 조건 조회
 			for(Order section : tmtbSectionList) {
@@ -388,8 +389,6 @@ public class TsfCartService {
 			}
 		});
 
-
-
 		// 수량 다다익선 적용 상품 할인 금액 계산
 		int leftAmt = 0;
 		int i = 0;

+ 36 - 0
src/main/java/com/style24/front/biz/service/TsfCouponService.java

@@ -186,4 +186,40 @@ public class TsfCouponService {
 		coreCouponDao.updateGiveRandomCoupon(custCoupon);		// 랜덤쿠폰 CUST_NO UPDATE
 		coreCouponDao.saveCouponCustPub(custCoupon);			// 랜덤쿠폰 고객 지급
 	}
+
+	/**
+	 * 마이페이지 등급쿠폰 다운 처리
+	 *
+	 * @param coupon
+	 * @return Collection<Coupon>
+	 * @author card007
+	 * @since 2021.02.25
+	 */
+	@Transactional("shopTxnManager")
+	public int createCustGradeAllCoupon(Coupon coupon) {
+		int count = 0;
+		
+		Collection<Coupon> couponList = couponDao.getCustGradeCouponInfo(coupon);
+		
+		for(Coupon tmpCoupon : couponList) {
+			int downloadCnt = tmpCoupon.getDownloadCnt();
+			for (int i = 0; i < downloadCnt; i++) {
+				CustCoupon custCoupon = new CustCoupon();
+				custCoupon.setCustNo(tmpCoupon.getCustNo());
+				custCoupon.setCpnId(tmpCoupon.getCpnId());
+				custCoupon.setAvailStdt(tmpCoupon.getAvailStdt());
+				custCoupon.setAvailEddt(tmpCoupon.getAvailEddt());
+				custCoupon.setPubReason(TscConstants.PubReason.DOWNLOAD.value());
+				custCoupon.setEndAlimSendYn(tmpCoupon.getEndAlimYn());
+				custCoupon.setRegNo(tmpCoupon.getCustNo());
+				custCoupon.setUpdNo(tmpCoupon.getCustNo());
+
+				coreCouponDao.saveCouponCustPub(custCoupon);
+
+				count++;
+			}
+		}
+		
+		return count;
+	}
 }

+ 129 - 22
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -34,9 +34,9 @@ import com.style24.front.biz.service.TsfWishlistService;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.TscPageRequest;
+import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.Point;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -83,7 +83,7 @@ public class TsfMypageController extends TsfBaseController {
 	
 	@Autowired
 	private TsfRendererService rendererService;
-	
+
 	/**
 	 * 마이페이지 메인 화면
 	 *
@@ -300,8 +300,6 @@ public class TsfMypageController extends TsfBaseController {
 	public ModelAndView exchangeForm(Order order) {
 		ModelAndView mav = new ModelAndView();
 		
-		log.info("order >>> {}", order);
-		
 		// 주문번호 설정
 		mav.addObject("ordNo", order.getOrdNo());
 
@@ -340,31 +338,140 @@ public class TsfMypageController extends TsfBaseController {
 		
 		return mav;
 	}
-	
+
+	/**
+	 * 마이페이지 등급쿠폰 다운 처리
+	 *
+	 * @return
+	 * @author card007
+	 * @since 2021. 02. 17
+	 */
+	@PostMapping("/coupon/download/all")
+	@ResponseBody
+	public GagaMap createCustGradeAllCoupon(@RequestBody Coupon coupon) {
+		GagaMap result = new GagaMap();
+
+		// 고객정보 조회
+		Customer customer = new Customer();
+		customer.setSiteCd(TscConstants.Site.STYLE24.value());
+		customer.setCustNo(coupon.getCustNo());
+		customer.setCustStat(TscConstants.CustStat.ACTIVE.value());
+		customer = coreCustomerService.getCustomerInfo(customer);
+
+		// 고객정보 설정
+		coupon.setCustGb(customer.getCustGb());
+		coupon.setCustGrade(customer.getCustGrade());
+
+		// 등급쿠폰 다운 처리
+		int count = couponService.createCustGradeAllCoupon(coupon);
+		
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+		
+		if (count == 0) {
+			result.set("message", message.getMessage("COUPON_0002"));
+		} else {
+			result.set("message", message.getMessage("COUPON_0001", new Object[] {count}));
+		}
+
+		return result;
+	}
+
+	/**
+	 * 마이페이지 쿠폰 수량 조회
+	 *
+	 * @return
+	 * @author card007
+	 * @since 2021. 02. 25
+	 */
+	@PostMapping("/coupon/count")
+	@ResponseBody
+	public GagaMap fnReloadCouponCount(@RequestBody Order order) {
+		GagaMap result = new GagaMap();
+
+		// 쿠폰정보 조회
+		result.set("couponCnt", coreOrderService.getCouponInfo(order));
+
+		order.setExpiredSoon("Y");
+		result.set("expiredSoonCouponCnt", coreOrderService.getCouponInfo(order));
+
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		return result;
+	}
+
+	/**
+	 * 마이페이지 상태별 수량 조회
+	 *
+	 * @return
+	 * @author card007
+	 * @since 2021. 02. 25
+	 */
+	@PostMapping("/status/count")
+	@ResponseBody
+	public GagaMap fnReloadStatusCount(@RequestBody Order order) {
+		GagaMap result = new GagaMap();
+
+		// 쿠폰정보 조회
+		result.set("orderCount", orderService.getOrderStatCount(order));
+
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		return result;
+	}
+
 	/**
-	 * 마이페이지 STYLE24 포인트화면
+	 * 마이페이지 반품신청 화면
 	 *
-	 * @param 
+	 * @param Order
 	 * @return ModelAndView
-	 * @author csh9191
+	 * @author card007
 	 * @since 2021. 02. 25
 	 */
-	@GetMapping("/point/form")
-	public ModelAndView stylePointForm(Point point) {
+	@PostMapping("/cancel/form")
+	@ResponseBody
+	public ModelAndView returnForm(Order order) {
 		ModelAndView mav = new ModelAndView();
-		
+
+		// 주문번호 설정
+		mav.addObject("ordNo", order.getOrdNo());
+
+		// 고객번호 설정
 		int custNo = TsfSession.getInfo().getCustNo();
-		point.setCustNo(custNo);
-		// 잔여포인트
-		mav.addObject("pointInfo", pointService.getUsablePointInfo(point));		
-		// 적립예정포인트 expectedPntAmt
-		mav.addObject("expectedpointInfo", pointService.getExpectedPointInfo(point));
-		// 한달 이내 소멸 예정 포인트
-		mav.addObject("extinctpointInfo", pointService.getExtinctPointInfo(point));
-		// 적립내역
-		mav.addObject("accumulatePointList", pointService.getAccumulatePointList(point));
-		
-		mav.setViewName(super.getDeviceViewName("mypage/MypagePointForm"));
+		order.setCustNo(custNo);
+		mav.addObject("custNo", custNo);
+
+		// 고객정보 조회
+		Customer customer = new Customer();
+		customer.setSiteCd(TscConstants.Site.STYLE24.value());
+		customer.setCustNo(custNo);
+		customer.setCustStat(TscConstants.CustStat.ACTIVE.value());
+		customer = coreCustomerService.getCustomerInfo(customer);
+
+		mav.addObject("customerInfo", customer);
+
+
+		// 주문목록 조회
+		Collection<GagaMap> orderList = orderService.getOrderListForMypage(order);
+
+		if (orderList.size() == 0) {
+			mav.setViewName("redirect:/mypage/order/list/form");
+			return mav;
+		}
+
+		mav.addObject("orderList", orderList);
+
+		// 주문 결제정보 조회
+		mav.addObject("paymentInfo", orderService.getPaymentInfoForMypage(order));
+
+		// 주문 배송지 정보 조회
+		mav.addObject("deliveryAddrInfo", orderService.getOrderDeliveryAddrInfo(order));
+
+		// 교환 사유 목록 조회
+		mav.addObject("exchangeReason", rendererService.getCommonCodeList("G688", "Y"));
+
+		mav.setViewName(super.getDeviceViewName("/mypage/MypageReturnForm"));
+
 		return mav;
 	}
+
 }

+ 30 - 26
src/main/java/com/style24/front/biz/web/TsfOrderController.java

@@ -151,7 +151,7 @@ public class TsfOrderController extends TsfBaseController {
 		// 2.1 배송단위별 상품 목록 조회 (장바구니)
 		Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
 		
-		// 상품금액, 선포인트, 다다익선할인금액
+		// 2.1.0 상품금액, 선포인트, 다다익선할인금액
 		GagaMap goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
 		
 		// 2.2 배송단위별 장바구니 상품 건수 조회 (장바구니상품)
@@ -167,7 +167,8 @@ public class TsfOrderController extends TsfBaseController {
 		// 3.2.1 상품기준 ---> 상품쿠폰 적용된 상품 목록
 		Collection<Order> goodsApplyCpnList = coreOrderService.getGoodsCpnApplyList(tmtbGoodsApplyList, goodsCpnList);
 		
-		//cartCpnList = coreOrderService.getGoodsCpnApplyList(tmtbGoodsApplyList, cartCpnList);
+		// 3.2.2 장바구니쿠폰기준 ---> 상품목록
+		cartCpnList = coreOrderService.getCartCpnApplyList(tmtbGoodsApplyList, cartCpnList);
 		
 		// 3.3 배송비쿠폰목록 조회
 		Collection<Order> delvCpnList = coreOrderService.getDelvCpnList(order);
@@ -183,36 +184,39 @@ public class TsfOrderController extends TsfBaseController {
 		GagaMap  resultMap = coreFreegiftService.getOrderFreegift(order);
 
 		// 101. 상품정보
-		mav.addObject("cartGoodsList"					, tmtbGoodsApplyList);					// 장바구니상품목록 (즉시할인쿠폰적용)
-		mav.addObject("delvTotCnt" 						, delvOrderMap.get("delvTotCnt"));		// 총상품건수
-		mav.addObject("delvFeeTotCnt"					, delvOrderMap.get("delvFeeTotCnt"));	// 총배송타입건수
-		mav.addObject("wmsCnt" 							, delvOrderMap.get("wmsCnt"));			// 자사상품건수
-		mav.addObject("resCnt" 							, delvOrderMap.get("resCnt"));			// 자사예약상품건수
-		mav.addObject("delvCnt" 						, delvOrderMap.get("delvCnt"));			// 입점업체상품건수
-		mav.addObject("wmsCartList" 					, delvOrderMap.get("wmsCartList"));		// 자사장바구니상품목록
-		mav.addObject("resCartList" 					, delvOrderMap.get("resCartList"));		// 자사장바구니예약상품목
-		mav.addObject("delvCartList" 					, delvOrderMap.get("delvCartList"));	// 입점업체장바구니상품목록
-		mav.addObject("sumDelvFee" 						, delvOrderMap.get("sumDelvFee"));		// 배송비합계
+		mav.addObject("cartGoodsList"					, tmtbGoodsApplyList);						// 장바구니상품목록 (즉시할인쿠폰적용)
+		mav.addObject("delvTotCnt" 						, delvOrderMap.get("delvTotCnt"));			// 총상품건수
+		mav.addObject("delvFeeTotCnt"					, delvOrderMap.get("delvFeeTotCnt"));		// 총배송타입건수
+		mav.addObject("wmsCnt" 							, delvOrderMap.get("wmsCnt"));				// 자사상품건수
+		mav.addObject("resCnt" 							, delvOrderMap.get("resCnt"));				// 자사예약상품건수
+		mav.addObject("delvCnt" 						, delvOrderMap.get("delvCnt"));				// 입점업체상품건수
+		
+		mav.addObject("shotCartList" 					, delvOrderMap.get("shotCartList"));		// 자사총알배송상품목록
+		mav.addObject("wmsCartList" 					, delvOrderMap.get("wmsCartList"));			// 자사일반배송상품목록
+		mav.addObject("delvCartList" 					, delvOrderMap.get("delvCartList"));		// 입점업체상품목록
+		mav.addObject("resCartList" 					, delvOrderMap.get("resCartList"));			// 자사예약배송상품목록
+		mav.addObject("delvAllCartList" 				, delvOrderMap.get("delvAllCartList"));		// 전체배송목록
+		mav.addObject("sumDelvFee" 						, delvOrderMap.get("sumDelvFee"));			// 배송비합계
 		
 		// 102. 고객정보
-		mav.addObject("custemerInfo"					, custemerInfo);						// 고객정보
-		mav.addObject("deliveryAddrInfo"				, deliveryAddrInfo);					// 배송지정보
-		mav.addObject("shotDelvYn" 						, order.getShotDelvYn());				// 장바구니 총알배송여부
+		mav.addObject("custemerInfo"					, custemerInfo);							// 고객정보
+		mav.addObject("deliveryAddrInfo"				, deliveryAddrInfo);						// 배송지정보
+		mav.addObject("shotDelvYn" 						, order.getShotDelvYn());					// 장바구니 총알배송여부
 		
 		// 103. 할인정보
-		mav.addObject("tmtbGoodsApplyList"				, tmtbGoodsApplyList);					// 다다익선상품 적용목록
-		mav.addObject("goodsApplyCpnList"				, goodsApplyCpnList);					// 상품적용쿠폰
-		mav.addObject("cartCpnList"						, cartCpnList);							// 장바구니쿠폰목록
-		mav.addObject("delvCpnList"						, delvCpnList);							// 배송비쿠폰목록
-		mav.addObject("prePntDcAmt"						, goodsDcAmtMap.get("prePntDcAmt"));	// 선포인트정보
-		mav.addObject("goodsSumAmt"						, goodsDcAmtMap.get("goodsSumAmt"));	// 상품금액합계
-		mav.addObject("tmtbDcSumAmt"					, goodsDcAmtMap.get("tmtbDcSumAmt"));	// 다다익선할인금액합계
-		mav.addObject("rmPntAmt"						, rmPntAmt);							// 고객포인트정보
-		mav.addObject("rmGfcdAmt"						, rmGfcdAmt);							// 고객상품권정보
+		mav.addObject("tmtbGoodsApplyList"				, tmtbGoodsApplyList);						// 다다익선상품 적용목록
+		mav.addObject("goodsApplyCpnList"				, goodsApplyCpnList);						// 상품적용쿠폰
+		mav.addObject("cartCpnList"						, cartCpnList);								// 장바구니쿠폰목록
+		mav.addObject("delvCpnList"						, delvCpnList);								// 배송비쿠폰목록
+		mav.addObject("prePntDcAmt"						, goodsDcAmtMap.get("prePntDcAmt"));		// 선포인트정보
+		mav.addObject("goodsSumAmt"						, goodsDcAmtMap.get("goodsSumAmt"));		// 상품금액합계
+		mav.addObject("tmtbDcSumAmt"					, goodsDcAmtMap.get("tmtbDcSumAmt"));		// 다다익선할인금액합계
+		mav.addObject("rmPntAmt"						, rmPntAmt);								// 고객포인트정보
+		mav.addObject("rmGfcdAmt"						, rmGfcdAmt);								// 고객상품권정보
 		
 		// 104. 사은품정보
-		mav.addObject("freegiftGoodsList"				, resultMap.get("freegiftGoodsList"));	// 사은품상품정보 목록
-		mav.addObject("freegiftList"					, resultMap.get("freegiftList"));		// 사은품정보 목록
+		mav.addObject("freegiftGoodsList"				, resultMap.get("freegiftGoodsList"));		// 사은품상품정보 목록
+		mav.addObject("freegiftList"					, resultMap.get("freegiftList"));			// 사은품정보 목록
 		
 		mav.setViewName(super.getDeviceViewName("order/OrderForm"));
 		

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

@@ -21,6 +21,8 @@ public class Coupon extends TscBaseDomain {
 	private int[] currPrices;		// 상품가격 배열
 	private int cpnId;				// 쿠폰번호
 	private int custNo;				// 회원번호
+	private String custGb;			// 회원구분
+	private String custGrade;		// 회원등급
 	private int availDays;			// 쿠폰 다운로드 후 유효기간일
 	private int rdCpnId;			// 랜덤쿠폰번호
 	private int dcAmt;				// 할인적용금액
@@ -38,4 +40,5 @@ public class Coupon extends TscBaseDomain {
 	private String availYn;			// 지급 받은 쿠폰 사용 가능 유무
 	private String dcWay;			// 할인금액/율 구분
 	private String cpnDesc;			// 쿠폰설명
+	private int downloadCnt;		// 다운로드수
 }

+ 58 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml

@@ -55,4 +55,62 @@
 		<!-- 랜덤쿠폰은 RD_CPN_NM이 1개이나, 시리얼 쿠폰은 다수개이므로 하나의 정보만 조회 -->
 		LIMIT  1
 	</select>
+	
+	<!-- 마이페이지 등급쿠폰 다운가능 쿠폰 정보 조회 -->
+	<select id="getCustGradeCouponInfo" parameterType="Coupon" resultType="Coupon">
+		/* TsfCoupon.getCustGradeCouponInfo */
+		SELECT Z.CUST_NO
+		     , Z.CPN_ID
+		     , Z.AVAIL_STDT
+		     , Z.AVAIL_EDDT
+		     , Z.END_ALIM_YN
+		     , Z.DOWNLOAD_CNT
+		  FROM (SELECT A.*
+					 , CASE WHEN A.CNT <![CDATA[<=]]> 0 THEN 0
+							WHEN A.CNT > (A.DN_ABLE_CNT * A.ONE_PUB_QTY) THEN (A.DN_ABLE_CNT * A.ONE_PUB_QTY)
+							ELSE A.CNT
+						END AS DOWNLOAD_CNT
+				  FROM (SELECT #{custNo} AS CUST_NO
+							 , C.CPN_ID
+							 , C.CPN_NM
+							 , C.CUST_PUB_LIMIT_QTY
+							 , C.ONE_PUB_QTY
+							 , IF(C.PD_GB = 'P', C.AVAIL_STDT, NOW()) AS AVAIL_STDT
+							 , IF(C.PD_GB = 'P', C.AVAIL_EDDT, CONCAT(CURRENT_DATE + INTERVAL C.AVAIL_DAYS DAY, ' 23:59:59')) AS AVAIL_EDDT
+				             , C.END_ALIM_YN
+							 , IFNULL(CC.CPN_CNT, 0) AS DN_CNT
+				             , IF(C.CUST_PUB_LIMIT_QTY = 0 OR C.CUST_PUB_LIMIT_QTY - CC.CPN_CNT > 0, 1, 0) AS DN_ABLE_CNT
+				             , IF(C.TOT_PUB_LIMIT_QTY > 0, C.TOT_PUB_LIMIT_QTY - CC2.CPN_CNT, 99999) AS CNT
+						  FROM TB_COUPON C
+						 INNER JOIN TB_COUPON_CUST_GBN CCGB
+							ON C.CPN_ID = CCGB.CPN_ID
+						   AND CCGB.USABLE_CUST_GB IN ('G100_00', IFNULL(#{custGb}, 'G100_00'))
+						 INNER JOIN TB_COUPON_CUST_GRADE CCGR
+							ON C.CPN_ID = CCGR.CPN_ID
+						   AND CCGR.USABLE_CUST_GRADE = #{custGrade}
+						  LEFT OUTER JOIN (SELECT CPN_ID
+												, CUST_NO
+												, COUNT(*) AS CPN_CNT
+											 FROM TB_CUST_COUPON
+											GROUP BY CPN_ID, CUST_NO) CC
+							ON C.CPN_ID = CC.CPN_ID
+						   AND CC.CUST_NO = #{custNo}
+						  LEFT OUTER JOIN (SELECT CPN_ID
+												, COUNT(*) AS CPN_CNT
+											 FROM TB_CUST_COUPON
+											GROUP BY CPN_ID) CC2
+							ON C.CPN_ID = CC2.CPN_ID
+						 WHERE C.DOWN_ABL_YN = 'Y'
+						   AND NOW() BETWEEN C.DOWN_STDT AND C.DOWN_EDDT
+						   AND C.CPN_STAT = 'G232_11'  -- 진행
+						   AND CASE WHEN C.TOT_PUB_LIMIT_QTY = 0 THEN 1
+									WHEN C.TOT_PUB_LIMIT_QTY - CC2.CPN_CNT > 0 THEN 1
+									ELSE 0
+								END = 1
+						   AND IF(C.NEW_CUST_YN = 'Y', (SELECT COUNT(*) FROM TB_CUSTOMER WHERE CUST_NO = #{custNo} AND REG_DT BETWEEN C.CUST_JOIN_STDT AND C.CUST_JOIN_EDDT), 1) = 1
+						   AND IF(C.FIRST_ORD_YN = 'Y', (SELECT COUNT(*) FROM TB_ORDER WHERE CUST_NO = #{custNo} AND ORD_DT BETWEEN C.BUY_STDT AND C.BUY_EDDT), 0) = 0
+						) A
+				) Z
+		 WHERE Z.DOWNLOAD_CNT > 0
+	</select>
 </mapper>

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

@@ -221,6 +221,7 @@
 		     , ORD_NO
 		     , PAY_DT
 		     , PAY_MEANS
+		     , FN_GET_CODE_NM('G014', PAY_MEANS) AS PAY_MEANS_NM
 		     , PAY_AMT
 		     , PG_CPN_AMT
 		     , NPAY_PNT_AMT

+ 4 - 0
src/main/resources/i18n/messages/message_ko_KR.properties

@@ -86,3 +86,7 @@ SABANGNET_0007=\uAD50\uD658\uC8FC\uBB38\uC774 \uC218\uC9D1\uB418\uC5C8\uC2B5\uB2
 SABANGNET_0008=\uBC18\uD488\uC8FC\uBB38\uC774 \uC218\uC9D1\uB418\uC5C8\uC2B5\uB2C8\uB2E4.(\uCD1D {0}\uAC74 \uC911 {1}\uAC74 \uC2E4\uD328 {2}\uAC74 \uC131\uACF5)
 SABANGNET_0009=\uC720\uD6A8\uC131 \uAC80\uC99D \uC2E4\uD328\uB85C \uCC98\uB9AC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
 SABANGNET_0010=\uCD9C\uACE0\uB97C \uC704\uD574 ERP\uB85C \uC804\uC1A1\uD558\uC600\uC2B5\uB2C8\uB2E4.(\uC131\uACF5: {0}\uAC74, \uC2E4\uD328: {1}\uAC74)
+
+#\uCFE0\uD3F0
+COUPON_0001=\uCD1D {0}\uC7A5\uC758 \uCFE0\uD3F0\uC744 \uB2E4\uC6B4\uB85C\uB4DC \uD558\uC600\uC2B5\uB2C8\uB2E4.
+COUPON_0002=\uC774\uBBF8 \uB2E4\uC6B4\uB85C\uB4DC\uB97C \uC644\uB8CC \uD558\uC168\uC2B5\uB2C8\uB2E4.

+ 6 - 12
src/main/webapp/WEB-INF/views/web/mypage/MypageExchangeFormWeb.html

@@ -126,8 +126,8 @@
 							</tr>
 							<tr>
 								<td>
-									<textarea class="doc_exchange" name="chgMemo" id="chgMemo" placeholder="자세한 사유를 입력해주세요." onkeyup="cfnGetTextLength(this, 500, $('#exchange_cnt'));"></textarea>
-									<p class="txt_cnt"><span id="exchange_cnt" class="c_primary">0</span>/500</p>
+									<textarea class="doc_exchange" name="chgMemo" id="chgMemo" placeholder="자세한 사유를 입력해주세요." onkeyup="cfnGetTextLength(this, 200, $('#exchange_cnt'));"></textarea>
+									<p class="txt_cnt"><span id="exchange_cnt" class="c_primary">0</span>/200</p>
 								</td>
 							</tr>
 							</tbody>
@@ -137,7 +137,7 @@
 				<section class="order_row" id="chgerLocation">
 					<div class="order_tit">
 						<h3 class="subH3">상품 회수지</h3>
-						<span class="del_t">교환받을 상품을 수령할 장소 선택</span>
+						<span class="del_t">택배사에서 반품 상품을 직접 회수할 장소 선택</span>
 						<button type="button" class="btn_popup" onclick="fnChangeDeliveryAddr('chger');"><span>회수지 선택</span></button>
 					</div>
 					<div class="tbl type1">
@@ -201,7 +201,7 @@
 				<section class="order_row">
 					<div class="order_tit">
 						<h3 class="subH3">교환 상품 받으실 주소</h3>
-						<span class="del_t">택배사에서 반품 상품을 직접 회수할 장소 선택</span>
+						<span class="del_t">교환받을 상품을 수령할 장소 선택</span>
 						<button type="button" class="btn_popup" onclick="fnChangeDeliveryAddr('recip');"><span>회수지 선택</span></button>
 					</div>
 					<div class="tbl type1">
@@ -253,19 +253,13 @@
 		// 마이페이지 location 설정
 		fnSetMypageLocation('취소/반품/환불내역', '_PAGE_MYPAGE_CRS_LIST', '교환 신청');
 	});
-	
+
 	// 교환 옵션 변경 팝업
 	var fnChangeOption = function(param) {
 		// TODO
 		// 옵션변경 처리
 	}
-	
-	// 회수지, 교환지 설정 팝업
-	var fnChangeDeliveryAddr = function(param) {
-		// TODO
-		// 회수지, 교환지 설정
-	}
-	
+
 	// 교환 처리
 	var fnExchange = function() {
 		// TODO

+ 65 - 10
src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListFormWeb.html

@@ -39,14 +39,14 @@
 					<div th:class="|rank_icon ${#strings.toLowerCase(customerInfo.custGradeNm)}|" th:text="${#strings.substring(customerInfo.custGradeNm, 0, 1)}"></div>
 					<div class="rank_txt01" th:text="${customerInfo.custGradeNm}"></div>
 					<div class="rank_txt02">
-						<button type="button">등급혜택  보기</button>
-						<button type="button" id="cp_down">등급쿠폰 다운</button>
+						<button type="button" onclick="fnGoToCustomerBenefit();">등급혜택  보기</button>
+						<button type="button" id="cp_down" onclick="fnDownloadCoupon();">등급쿠폰 다운</button>
 					</div>
 				</div>
 				<div class="mem_box">
 					<div class="mem_coupon">
 						<p class="tit">보유쿠폰&nbsp;/&nbsp;<span class="c_primary">만료예정</span></p>
-						<span class="coupon_txt01"><span class="big_txt" th:text="${couponCnt}"></span>장</span>&nbsp;/&nbsp;<span class="coupon_txt02 c_primary" th:text="|${expiredSoonCouponCnt}장|">13장</span>
+						<span class="coupon_txt01"><span class="big_txt" id="couponCnt" th:text="${couponCnt}"></span>장</span>&nbsp;/&nbsp;<span class="coupon_txt02 c_primary" id="expiredSoonCouponCnt" th:text="|${expiredSoonCouponCnt}장|"></span>
 					</div>
 					<div class="mem_point">
 						<p class="tit">STYLE  24 포인트</p>
@@ -65,32 +65,32 @@
 				<ul class="clear">
 					<li>
 						<p class="or_p">주문접수</p>
-						<p class="count"><span th:text="${orderCount.orderReceiptCount}">0</span></p>
+						<p class="count"><span id="orderReceiptCount" th:text="${orderCount.orderReceiptCount}">0</span></p>
 					</li>
 					<li>
 						<p class="or_p">결제완료</p>
-						<p class="count"><span th:text="${orderCount.paymentCompleteCount}">0</span></p>
+						<p class="count"><span id="paymentCompleteCount" th:text="${orderCount.paymentCompleteCount}">0</span></p>
 					</li>
 					<li>
 						<p class="or_p">상품 준비 중</p>
-						<p class="count"><span th:text="${orderCount.goodsPrepareCount}">0</span></p>
+						<p class="count"><span id="goodsPrepareCount" th:text="${orderCount.goodsPrepareCount}">0</span></p>
 					</li>
 					<li>
 						<p class="or_p">배송 준비 중</p>
-						<p class="count"><span th:text="${orderCount.shipPrepareCount}">0</span></p>
+						<p class="count"><span id="shipPrepareCount" th:text="${orderCount.shipPrepareCount}">0</span></p>
 					</li>
 					<li>
 						<p class="or_p">배송 중</p>
-						<p class="count"><span th:text="${orderCount.shippingCount}">0</span></p>
+						<p class="count"><span id="shippingCount" th:text="${orderCount.shippingCount}">0</span></p>
 					</li>
 					<li>
 						<p class="or_p">배송 완료</p>
-						<p class="count"><span th:text="${orderCount.shipCompleteCount}">0</span></p>
+						<p class="count"><span id="shipCompleteCount" th:text="${orderCount.shipCompleteCount}">0</span></p>
 					</li>
 				</ul>
 				<div class="order_right">
 					<p class="or_p">취소/교환/반품</p>
-					<p class="count"><span th:text="${orderCount.cancelCount + orderCount.returnCount + orderCount.exchangeCount}">0</span></p>
+					<p class="count"><span id="orderCrsCount" th:text="${orderCount.cancelCount + orderCount.returnCount + orderCount.exchangeCount}">0</span></p>
 				</div>
 			</div>
 			<!-- //주문 경로 -->
@@ -219,6 +219,61 @@
 			}
 		}
 	}
+	
+	// 등급혜택 보기 클릭 이벤트
+	var fnGoToCustomerBenefit = function() {
+		// TODO
+		// 등급혜택보기 페이지 이동
+	}
+	
+	// 등급쿠폰 다운 클릭 이벤트
+	var fnDownloadCoupon = function() {
+		let url = '/mypage/coupon/download/all';
+
+		let data = {};
+		data.custNo = customerInfo.custNo;
+
+		let jsonData = JSON.stringify(data);
+
+		gagajf.ajaxJsonSubmit(url, jsonData, function() {
+			fnReloadCouponCount();
+		});
+	}
+	
+	// 보유쿠폰 수량 업데이트 처리
+	var fnReloadCouponCount = function() {
+		let url = '/mypage/coupon/count';
+		
+		let data = {};
+		data.custNo = customerInfo.custNo;
+		
+		let jsonData = JSON.stringify(data);
+		
+		gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+			$('#couponCnt').text(result.couponCnt);
+			$('#expiredSoonCouponCnt').text(result.expiredSoonCouponCnt + '장');
+		});
+	}
+	
+	// 상태값 별 수량 업데이트 처리
+	var fnReloadStatusCount = function() {
+		let url = '/mypage/status/count';
+		
+		let data = {};
+		data.custNo = customerInfo.custNo;
+		
+		let jsonData = JSON.stringify(data);
+		
+		gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+			$('#orderReceiptCount').text(result.orderCount.orderReceiptCount);
+			$('#paymentCompleteCount').text(result.orderCount.paymentCompleteCount);
+			$('#goodsPrepareCount').text(result.orderCount.goodsPrepareCount);
+			$('#shipPrepareCount').text(result.orderCount.shipPrepareCount);
+			$('#shippingCount').text(result.orderCount.shippingCount);
+			$('#shipCompleteCount').text(result.orderCount.shipCompleteCount);
+			$('#orderCrsCount').text(result.orderCount.cancelCount + result.orderCount.returnCount + result.orderCount.exchangeCount);
+		});
+	}
 /*]]>*/
 </script>
 

+ 335 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageReturnFormWeb.html

@@ -0,0 +1,335 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/MypageLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : MypageReturnFormWeb.html
+ * @desc    : 마이페이지 > 반품신청 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.25   card007     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<div class="my_cont">
+		<div class="sec_head">
+			<h3>반품 신청</h3>
+			<div class="od_detail">
+				(주문번호 : <span class="num" th:text="${ordNo}"></span>)
+			</div>
+		</div>
+		<div class="sec_body mypage_body">
+			<form class="form_wrap" role="form">
+				<div class="order_list">
+					<section class="order_row">
+						<th:block th:if="${orderList}" th:each="oneData, status : ${orderList}">
+							<div class="part_deliver">
+								<div class="tbl_tit">
+									<!-- 주문일/선물일 설정 -->
+									<span class="start_t" th:unless="${oneData.giftPackYn == 'Y'}">주문일</span>
+									<span class="gift_t" th:if="${oneData.giftPackYn == 'Y'}">선물일</span>
+									<!-- //주문일/선물일 설정 -->
+	
+									<span class="order_date" th:text="${oneData.ordDt}"></span>
+	
+									<!-- 배송구분 설정 -->
+									<span class="order_label02" th:if="${oneData.shotDelv}">총알배송</span>
+									<span class="order_label01" th:if="${oneData.selfMall}">STYLE24 일반배송</span>
+									<span class="order_label01" th:if="${oneData.supplyMall}">업체직배송</span>
+									<!-- //배송구분 설정 -->
+									<a href="javascript:void(0)" class="detail_btn" th:attr="ordNo=${oneData.ordNo}" onclick="fnGoToOrderDetail(this)">주문상세보기</a>
+								</div>
+								<th:block th:if="${oneData.orderList}" th:each="order, status : ${oneData.orderList}">
+									<div class="tbl type2">
+										<table id="returnList">
+											<colgroup>
+												<col width="1020">
+												<col width="180">
+											</colgroup>
+											<tbody>
+											<th:block th:if="${order.ordDtlList}" th:each="ordDtl, status : ${order.ordDtlList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
+												<input type="hidden" name="ordDtlNo" th:value="${ordDtl.ordDtlNo}"/>
+												<input type="hidden" name="ordDtlStat" th:value="${ordDtl.ordDtlStat}"/>
+												<input type="hidden" name="reviewSq" th:value="${ordDtl.reviewSq}"/>
+												<tr>
+													<td>
+														<div class="info_item">
+															<div class="thumb_box">
+																<a href="">
+																	<img th:src="${imageUrl + '/' + ordDtl.sysImgNm}" width="100%" alt="">
+																</a>
+															</div>
+															<div class="info_box">
+																<p class="od_name">
+																	<a href="">
+																		<span class="brand" th:text="${ordDtl.brandNm}"></span>
+																		<span class="name" th:text="${ordDtl.goodsNm}"></span>
+																	</a>
+																</p>
+																<p class="od_opt">
+																	<span class="option"><em th:text="${ordDtl.optCd1}"></em><em th:text="${ordDtl.optCd2}"></em></span>
+																	<span class="count">수량 <em th:text="${ordDtl.ordQty}"></em>개</span>
+																</p>
+															</div>
+															<div class="info_calc">
+																<p class="price">
+																	<span class="selling_price" th:text="|${#numbers.formatInteger(ordDtl.ordAmt, 1, 'COMMA')}원|"></span>
+																</p>
+																<p class="point"><span th:text="${#numbers.formatInteger(ordDtl.savePntAmt, 1, 'COMMA')}"></span>p</p>
+															</div>
+														</div>
+													</td>
+													<td class="cnt_sel">
+														<span class="cnt_t">수량</span>
+														<select class="select_dress" name="chgQty" onchange="fnChangeQty();">
+															<option value="">선택</option>
+															<option th:if="${ordDtl.ordQty > 0}" th:each="num : ${#numbers.sequence(1,ordDtl.ordQty)}" th:value="${num}" th:text="${num}"></option>
+														</select>
+													</td>
+												</tr>
+											</th:block>
+											</tbody>
+										</table>
+									</div>
+								</th:block>
+								<div class="order_confirm">
+									<p class="cf_txt cf_desc c_primary">반품하실 상품의 수량을 선택하신 후 반품 신청을 하실 수 있습니다.</p>
+								</div>
+							</div>
+						</th:block>
+					</section>
+					<section class="order_row">
+						<div class="tbl_tit">
+							<h3 class="subH3">반품 사유</h3>
+						</div>
+						<div class="tbl type1">
+							<table>
+								<colgroup>
+									<col width="*">
+								</colgroup>
+								<tbody>
+								<tr>
+									<td>
+										<select id="mounth" name="chgReason" onchange="fnChangeReason(this);">
+											<option value="">반품 사유를 선택하세요</option>
+											<option th:if="${returnReason}" th:each="oneData, status : ${returnReason}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+										</select>
+									</td>
+								</tr>
+								<tr>
+									<td>
+										<textarea class="doc_exchange" name="chgMemo" id="chgMemo" placeholder="자세한 사유를 입력해주세요." onkeyup="cfnGetTextLength(this, 200, $('#return_cnt'));"></textarea>
+										<p class="txt_cnt"><span id="return_cnt" class="c_primary">0</span>/200</p>
+									</td>
+								</tr>
+								</tbody>
+							</table>
+						</div>
+					</section>
+					<section class="order_row">
+						<div class="order_tit">
+							<h3 class="subH3">반품 방식 선택</h3>
+						</div>
+						<div class="tbl type1">
+							<table>
+								<colgroup>
+									<col width="*">
+								</colgroup>
+								<tbody>
+								<tr>
+									<td>
+										<div class="form_field radio_field">
+											<div class="">
+												<input type="radio" name="wdGb" id="withdraw" value="W" onclick="fnChangeWdGb();" checked>
+												<label for="withdraw"><span>방문회수 <b class="c_primary">택배사에서 방문하여 회수</b></span></label>
+											</div>
+											<div class="">
+												<input type="radio" name="wdGb" id="direct" value="D" onclick="fnChangeWdGb();">
+												<label for="direct"><span>직접반송 <b class="c_primary">고객이 직접 반송처리</b></span></label>
+											</div>
+										</div>
+									</td>
+								</tr>
+								</tbody>
+							</table>
+						</div>
+					</section>
+					<section class="order_row" id="chgerLocation">
+						<div class="order_tit">
+							<h3 class="subH3">상품 회수지</h3>
+							<span class="del_t">택배사에서 반품 상품을 직접 회수할 장소 선택</span>
+							<button type="button" class="btn_popup" onclick="fnChangeDeliveryAddr('chger');"><span>회수지 선택</span></button>
+						</div>
+						<div class="tbl type1">
+							<table>
+								<colgroup>
+									<col width="200">
+									<col width="*">
+								</colgroup>
+								<tbody>
+								<tr>
+									<th>성명</th>
+									<td id="chgerNm" th:text="${deliveryAddrInfo.recipNm}"></td>
+									<input type="hidden" name="chgerNm" th:value="${deliveryAddrInfo.recipNm}">
+								</tr>
+								<tr>
+									<th>연락처</th>
+									<td id="chgerPhnno" th:text="${deliveryAddrInfo.recipPhnno}"></td>
+									<input type="hidden" name="chgerPhnno" th:value="${deliveryAddrInfo.recipPhnno}">
+								</tr>
+								<tr>
+									<th>주소</th>
+									<td id="chgerAddr" th:text="|${deliveryAddrInfo.recipBaseAddr} ${deliveryAddrInfo.recipDtlAddr}|"></td>
+									<input type="hidden" name="chgerBaseAddr" th:value="${deliveryAddrInfo.recipBaseAddr}">
+									<input type="hidden" name="chgerDtlAddr" th:value="${deliveryAddrInfo.recipDtlAddr}">
+								</tr>
+								</tbody>
+							</table>
+						</div>
+					</section>
+					<section class="order_row" id="returnLocation" style="display:none">
+						<div class="order_tit">
+							<h3 class="subH3">반품하실 배송지</h3>
+						</div>
+						<div class="tbl type1">
+							<table>
+								<colgroup>
+									<col width="200">
+									<col width="*">
+								</colgroup>
+								<tbody>
+								<tr>
+									<th>성명</th>
+									<td th:text="${deliveryAddrInfo.rtnLocNm}"></td>
+									<input type="hidden" name="rtnLocNm" th:value="${deliveryAddrInfo.rtnLocNm}">
+								</tr>
+								<tr>
+									<th>연락처</th>
+									<td th:text="${deliveryAddrInfo.rtnLocTelno}"></td>
+									<input type="hidden" name="rtnLocTelno" th:value="${deliveryAddrInfo.rtnLocTelno}">
+								</tr>
+								<tr>
+									<th>주소</th>
+									<td th:text="|${deliveryAddrInfo.rtnLocBaseAddr} ${deliveryAddrInfo.rtnLocDtlAddr}|"></td>
+									<input type="hidden" name="rtnLocBaseAddr" th:value="${deliveryAddrInfo.rtnLocBaseAddr}">
+									<input type="hidden" name="rtnLocDtlAddr" th:value="${deliveryAddrInfo.rtnLocDtlAddr}">
+								</tr>
+								</tbody>
+							</table>
+						</div>
+					</section>
+					<section class="order_row">
+						<div class="order_tit">
+							<h3 class="subH3">환불 정보</h3>
+							<button type="button" class="btn_popup"><span>취소 전표 보기</span></button>
+						</div>
+						<div class="tbl type1 re_info_tbl">
+							<div class="r_left">
+								<dl>
+									<dt>환불(예정) 금액</dt>
+									<dd>
+										<span class="big_t"><strong id="returnAmt">0</strong>원</span>
+									</dd>
+								</dl>
+								<dl>
+									<dt>상품취소 금액</dt>
+									<dd>
+										<span id="goodsCancelAmt">0</span>원
+									</dd>
+								</dl>
+								<dl>
+									<dt>배송비</dt>
+									<dd>
+										<span id="deliveryFee">0</span>원
+									</dd>
+								</dl>
+								<dl>
+									<dt>할인금액 차감</dt>
+									<dd>
+										<span id="deductDcAmt">0</span>원
+									</dd>
+								</dl>
+							</div>
+							<div class="r_right">
+								<dl>
+									<dt>환불수단</dt>
+									<dd>
+										<span th:text="${paymentInfo.payMeansNm}"></span>
+									</dd>
+								</dl>
+								<dl>
+									<dt>결제금액 환불</dt>
+									<dd>
+										<span id="refundPayAmt">0</span>원
+									</dd>
+								</dl>
+								<dl>
+									<dt>포인트 환불</dt>
+									<dd>
+										<span id="refundPoint">0</span>P
+									</dd>
+								</dl>
+								<dl>
+									<dt>상품권 환불</dt>
+									<dd>
+										<span id="refundGiftCard">0</span>원
+									</dd>
+								</dl>
+							</div>
+						</div>
+						<p class="alert_t">※ 카드사로 결제 취소 요청이 전달된 후 환불까지는 평일 기준 3 ~7일이 소요될 수 있습니다.</p>
+					</section>
+					<section class="order_row" id="addDeliveryFee" style="display:none">
+						<div class="ship_fee">
+							<p><span class="c_primary" id="addPayCost">2,500원</span> 배송비 추가 결제가 필요합니다.</p>
+							<input type="hidden" name="addPayCost"/>
+						</div>
+					</section>
+					<div class="btn_wrap">
+						<button type="button" class="btn btn_default cancle_btn" onclick="cfnGoToPage(_PAGE_MYPAGE_CRS_LIST)"><span>반품 취소</span></button>
+						<button tyep="submit" class="btn btn_primary submit_btn" onclick="fnReturn()"><span id="returnButton">반품 신청</span></button>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+	$(document).ready(function() {
+		// 마이페이지 LNB 설정
+		fnSetMypageLnbList(2);
+		
+		// 마이페이지 location 설정
+		fnSetMypageLocation('취소/반품/환불내역', '_PAGE_MYPAGE_CRS_LIST', '반품 신청');
+	});
+	
+	// 반품 처리
+	var fnReturn = function() {
+		// TODO
+		// 반품신청 처리
+	}
+	
+	// 반품 수량 변경 이벤트 처리
+	var fnChangeQty = function(param) {
+		// TODO
+		// 반품 수량 변경 처리
+	}
+	
+	var fnChangeWdGb = function() {
+		let wdGb = $('input[name=wdGb]:radio:checked').val();
+		console.log(wdGb);
+	}
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 197 - 172
src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html

@@ -323,7 +323,7 @@
 															<div class="form_field">
 																<input id="chk-maxdisc" type="checkbox" checked="">
 																<label for="chk-maxdisc">
-																	<span>최대 할인혜택을 바로 적용하세요 <em class="maxdisc_amount">(-3,000원)</em></span>
+																	<span>최대 할인혜택을 바로 적용하세요 <em class="maxdisc_amount"></em></span>
 																</label>
 															</div>
 														</div>
@@ -376,6 +376,7 @@
 																						<div class="form_field">
 																							<div class="select_custom type1">
 																								<div class="combo">
+																									<input type="hidden" name="cpnCartSq" th:value="${goods.cartSq}"/>
 																									<input type="hidden" name="custCpnSq" value="0"/>
 																									<input type="hidden" name="cpnDcAmt" value="0"/>
 																									
@@ -413,7 +414,12 @@
 																								<ul class="list">
 																									<li value="0">선택없음</li>
 																									<th:block th:each="cartCpn, k : ${cartCpnList}">
-																										<li th:value="${cartCpn.custCpnSq}" th:data="${cartCpn.cpnDcAmt}" th:text="${cartCpn.cpnNm}"></li>
+																										<li th:value="${cartCpn.custCpnSq}" th:data="${cartCpn.cpnDcAmt}">
+																											<th:block th:text="${cartCpn.cpnNm}"></th:block>
+																											<th:block th:each="cartCpnCartSq, kokok : ${cartCpn.cartCpnCartSqArr}"> 
+																												<input type="text" name="cartCpnCartSq" th:value="${cartCpnCartSq}" />
+																											</th:block>
+																										</li>
 																									</th:block>
 																								</ul>
 																							</div>
@@ -798,148 +804,91 @@
 							<div class="area_order">
 								<div class="tit_box">
 									<h3 class="subH2">주문내역</h3>
-									<span> <em class="number" th:text="${delvTotCnt}"></em>개의 상품
-									</span>
+									<span> <em class="number" th:text="${delvTotCnt}"></em>개의 상품</span>
 								</div>
 								<div class="od_item_box">
-									<!-- 총알배송, 일반배송-->
-									<th:block th:if="${wmsCartList != null and #lists.size(wmsCartList) > 0}">
-										<div class="part_dlvr">
-											<h4 class="subH3 mb20" id="shotDelvTitle">STYLE24 총알배송<span>오늘 자정까지 도착</span></h4>
-											<h4 class="subH3 mb20" id="wmsDelvTitle">STYLE24 일반배송</h4>
-											<div class="gd_list">
-												<th:block th:each="goods, i : ${wmsCartList}">
-													<div class="item_gd">
-														<input type="text" name="cartSq" 			th:value="${goods.cartSq}"/>
-														<input type="text" name="goodscd" 			th:value="${goods.goodsCd}"/>
-														<input type="text" name="ordQty" 			th:value="${goods.goodsQty}"/>
-														<input type="text" name="itemCd" 			th:value="${goods.itemCd}"/>
-														<input type="text" name="optCd" 			th:value="${goods.optCd}"/>
-														<input type="text" name="optCd1" 			th:value="${goods.optCd1}"/>
-														<input type="text" name="optCd2" 			th:value="${goods.optCd2}"/>
-														
-														<input type="text" name="currPrice" 		th:value="${goods.orgCurrPrice}"/>
-														<input type="text" name="cpn1CpnSq" 		th:value="${goods.cpn1CpnSq}"/>
-														<input type="text" name="cpn1DcAmt" 		th:value="${goods.orgCurrPrice} - ${goods.currPrice}"/>
-														
-														<th:block th:if="${goods.applyQtySectionYn} == 'Y' and ${goods.qtyTmtbSq} > 0">
-															<input type="text" name="tmtb1Sq" 		th:value="${goods.qtyTmtbSq}"/>
-															<input type="text" name="tmtb1DcAmt" 	th:value="${goods.tmtb1DcAmt}"/>
-														</th:block>
-														<th:block th:if="${goods.applyQtySectionYn} != 'Y'">
-															<input type="text" name="tmtb1Sq" 		value="0"/>
-															<input type="text" name="tmtb1DcAmt" 	value="0"/>
-														</th:block>
-														
-														<th:block th:if="${goods.applyAmtSectionYn} == 'Y' and ${goods.amtTmtbSq} > 0">
-															<input type="text" name="tmtb2Sq" 		th:value="${goods.amtTmtbSq}"/>
-															<input type="text" name="tmtb2DcAmt" 	th:value="${goods.tmtb2DcAmt}"/>
-														</th:block>
-														<th:block th:if="${goods.applyAmtSectionYn} != 'Y'">
-															<input type="text" name="tmtb2Sq" 		value="0"/>
-															<input type="text" name="tmtb2DcAmt" 	value="0"/>
-														</th:block>
-														
-														<input type="text" name="goodsCpnSq" 		value=""/>
-														<input type="text" name="goodsCpnDcAmt" 	value=""/>
-														<input type="text" name="cartCpnSq" 		value=""/>
-														<input type="text" name="cartCpnDcAmt" 		value=""/>
-														
-														<figure>
-															<span class="thumb"><img src="/images/pc/thumb/tmp_odSide1.jpg" alt=""></span>
-															<figcaption>
-																<div class="brand" th:text="${goods.brandEnm} + ' ' + ${goods.brandKnm}"></div>
-																<div class="name" th:text="${goods.goodsNm}"></div>
-																<div class="option" th:each="opt, index : ${goods.itemNmArr}">
-																	<span th:text="${goods.optCdArr[index.index]}"></span> 
-																	<span>수량:<em th:text="${goods.goodsQty}"></em>개</span>
-																</div>
-																<div class="price">
-																	<th:block th:if="${goods.tmtbDcAmt} > 0">
-																		<span class="selling_price"  th:text="${#numbers.formatInteger(goods.tmtbDcAmt, 1, 'COMMA')}"></span>
-																	</th:block>
-																	<th:block th:if="${goods.tmtbDcAmt} < 1">
-																		<span class="selling_price"  th:text="${#numbers.formatInteger(goods.currPrice, 1, 'COMMA')}"></span>
-																	</th:block>
-																</div>
-															</figcaption>
-														</figure>
-													</div>
+								
+									<!-- 전체배송목록 sort --> 
+									<th:block th:each="delvAllCart, i : ${delvAllCartList}">
+										<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+											<div class="part_dlvr">
+												<th:block th:if="${i.index} == 0">
+													<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+														<h4 class="subH3 mb20">STYLE24 총알배송<span>오늘 자정까지 도착</span></h4>
+													</th:block>
 												</th:block>
-											</div>
-										</div>
-									</th:block>
-									<!-- //총알배송, 일반배송 -->
-									
-									<!-- 업체직배송 -->
-									<th:block th:if="${delvCartList != null and #lists.size(delvCartList) > 0}">
-										<div class="part_dlvr">
-											<h4 class="subH3 mb20">업체직배송</h4>
-											<div class="gd_list">
-												<th:block th:each="goods, i : ${delvCartList}">
-													<div class="item_gd">
-														<figure>
-															<span class="thumb"><img src="/images/pc/thumb/tmp_odSide1.jpg" alt=""></span>
-															<figcaption>
-																<div class="brand" th:text="${goods.brandEnm} + ' ' + ${goods.brandKnm}"></div>
-																<div class="name" th:text="${goods.goodsNm}"></div>
-																<div class="option">
-																	<span th:text="${goods.optCd}"></span> 
-																	<span>수량:<em th:text="${goods.goodsQty}"></em>개</span>
-																</div>
-																<div class="price">
-																	<th:block th:if="${goods.tmtbDcAmt} > 0">
-																		<span class="selling_price"  th:text="${#numbers.formatInteger(goods.tmtbDcAmt, 1, 'COMMA')}"></span>
-																	</th:block>
-																	<th:block th:if="${goods.tmtbDcAmt} < 1">
-																		<span class="selling_price"  th:text="${#numbers.formatInteger(goods.currPrice, 1, 'COMMA')}"></span>
-																	</th:block>
-																</div>
-															</figcaption>
-														</figure>
-													</div>
+												<th:block th:if="${i.index} == 1">
+													<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+														<h4 class="subH3 mb20" id="wmsDelvTitle">STYLE24 일반배송</h4>
+													</th:block>
 												</th:block>
-											</div>
-										</div>
-									</th:block>
-									<!-- //업체직배송 -->
-									
-									<!-- 예약배송 -->
-									<th:block th:if="${resCartList != null and #lists.size(resCartList) > 0}">
-										<div class="part_dlvr">
-											<h4 class="subH3 mb20">예약배송</h4>
-											<div class="gd_list">
-												<th:block th:each="goods, i : ${resCartList}">
-													<div class="item_gd">
-														<figure>
-															<span class="thumb"><img src="/images/pc/thumb/tmp_odSide1.jpg" alt=""></span>
-															<figcaption>
-																<div class="brand" th:text="${goods.brandEnm} + ' ' + ${goods.brandKnm}"></div>
-																<div class="name" th:text="${goods.goodsNm}"></div>
-																<div class="option">
-																	<span th:text="${goods.optCd}"></span>
-																	<span>수량:<em th:text="${goods.goodsQty}"></em>개</span>
-																</div>
-																<div class="price">
-																	<th:block th:if="${goods.tmtbDcAmt} > 0">
-																		<span class="selling_price"  th:text="${#numbers.formatInteger(goods.tmtbDcAmt, 1, 'COMMA')}"></span>
-																	</th:block>
-																	<th:block th:if="${goods.tmtbDcAmt} < 1">
-																		<span class="selling_price"  th:text="${#numbers.formatInteger(goods.currPrice, 1, 'COMMA')}"></span>
-																	</th:block>
-																</div>
-															</figcaption>
-														</figure>
-														<p class="info_reserv">
-															<i class="ico ico_calender"></i><span th:text="${goods.delvResDt}"></span>
-															배송예정상품
-														</p>
-													</div>
+												<th:block th:if="${i.index} == 2">
+													<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+														<h4 class="subH3 mb20">업체직배송</h4>
+													</th:block>
 												</th:block>
+												<th:block th:if="${i.index} == 3">
+													<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+														<h4 class="subH3 mb20">예약배송</h4>
+													</th:block>
+												</th:block>
+												
+												<div class="gd_list">
+													<th:block th:each="goods, i : ${delvAllCart}">
+														<div class="item_gd">
+															<input type="text" name="cartSq" 			th:value="${goods.cartSq}"/>
+															<input type="text" name="cpn1CpnSq" 		th:value="${goods.cpn1CpnSq}"/>
+															<input type="text" name="cpn1DcAmt" 		th:value="${goods.orgCurrPrice} - ${goods.currPrice}"/>
+															
+															<th:block th:if="${goods.applyQtySectionYn} == 'Y' and ${goods.qtyTmtbSq} > 0">
+																<input type="text" name="tmtb1Sq" 		th:value="${goods.qtyTmtbSq}"/>
+																<input type="text" name="tmtb1DcAmt" 	th:value="${goods.tmtb1DcAmt}"/>
+															</th:block>
+															<th:block th:if="${goods.applyQtySectionYn} != 'Y'">
+																<input type="text" name="tmtb1Sq" 		value="0"/>
+																<input type="text" name="tmtb1DcAmt" 	value="0"/>
+															</th:block>
+															
+															<th:block th:if="${goods.applyAmtSectionYn} == 'Y' and ${goods.amtTmtbSq} > 0">
+																<input type="text" name="tmtb2Sq" 		th:value="${goods.amtTmtbSq}"/>
+																<input type="text" name="tmtb2DcAmt" 	th:value="${goods.tmtb2DcAmt}"/>
+															</th:block>
+															<th:block th:if="${goods.applyAmtSectionYn} != 'Y'">
+																<input type="text" name="tmtb2Sq" 		value="0"/>
+																<input type="text" name="tmtb2DcAmt" 	value="0"/>
+															</th:block>
+															
+															<input type="text" name="goodsCpnSq" 		value=""/>
+															<input type="text" name="goodsCpnDcAmt" 	value=""/>
+															<input type="text" name="cartCpnSq" 		value=""/>
+															<input type="text" name="cartCpnDcAmt" 		value=""/>
+															
+															<figure>
+																<span class="thumb"><img src="/images/pc/thumb/tmp_odSide1.jpg" alt=""></span>
+																<figcaption>
+																	<div class="brand" th:text="${goods.brandEnm} + ' ' + ${goods.brandKnm}"></div>
+																	<div class="name" th:text="${goods.goodsNm}"></div>
+																	<div class="option" th:each="opt, index : ${goods.itemNmArr}">
+																		<span th:text="${goods.optCdArr[index.index]}"></span> 
+																		<span>수량:<em th:text="${goods.goodsQty}"></em>개</span>
+																	</div>
+																	<div class="price">
+																		<th:block th:if="${goods.tmtbDcAmt} > 0">
+																			<span class="selling_price"  th:text="${#numbers.formatInteger(goods.tmtbDcAmt, 1, 'COMMA')}"></span>
+																		</th:block>
+																		<th:block th:if="${goods.tmtbDcAmt} < 1">
+																			<span class="selling_price"  th:text="${#numbers.formatInteger(goods.currPrice, 1, 'COMMA')}"></span>
+																		</th:block>
+																	</div>
+																</figcaption>
+															</figure>
+														</div>
+													</th:block>
+												</div>
 											</div>
-										</div>
+										</th:block>
 									</th:block>
-									<!-- //예약배송 -->
+									<!-- //전체배송목록 sort -->
 								</div>
 								
 								<div class="od_amount_box">
@@ -1267,59 +1216,47 @@ $(document).ready( function() {
 </script>
 
 <script th:inline="javascript">
-	var custCpnSq 	= 0;
-	var cpnIndex	= 0;
+	var custCpnSq 		= 0;
+	var cpnIndex		= 0;
+	var cpnApplyTemp	= false;
 	
 	// 컨텐츠 호출
 	$(document).ready( function() {
 		// 1. 총알배송가능 지역, 총알배송 가능 시간 체크
 		fnGetDailyDeliveryCheck();
 		
-		// 2. 배송목록 화면 노출, 비노출 처리
-		// 2.1 자사일반배송노출
-		if (wmsCnt > 0) {
-			$("#wmsDelvArea").css("display", "block");
-		}
-		
-		// 2.2 입점업체일반배송노출
-		if (delvCnt > 0) {
-			$("#delvDelvArea").css("display", "block");
-		}
-		
-		// 2.3 자사예약배송노출
-		if (resCnt > 0) {
-			$("#resDelvArea").css("display", "block");
-		}
-
-		// 3. 쿠폰 SELECT BOX 설정
+		// 2. 쿠폰 SELECT BOX 기능 설정(js적용)
 		$('.select_custom.type1').each(function(index){
 			var selecter01 	= new sCombo($(this));
-			var cpnIndex 	= 0;
 			
-			// select 박스 반복문 실행
+			// 선택박스 버튼기능 구현
 			$(this).find("ul li").each(function(i){
-				cpnIndex++;
-				
-				// 1이상부터 중복 체크
-				if (cpnIndex > 1) {
-					if (cpnDuplicationCheck($(this).prop("value"), index)) {
-						// 쿠폰적용
-						custCpnApply($(this));
-					}
-				}
 				
 				// SELECT BOX 버튼 기능 설정
 				$(this).on("click", function(){
-					// 선택없음
+					// 쿠폰 선택없음
 					if ($(this).prop("value") == 0) {
+						// select box 쿠폰 적용
+						var cpnCartSq = $(this).parent().parent().find("input[name='cpnCartSq']").val();
+						
+						// 장바구니시퀀스 체크
+						$("input[name='cartSq']").each(function(){
+							if (cpnCartSq == $(this).val()) {
+								$(this).parent().find("input[name='goodsCpnSq']").val("0");			// 상품쿠폰시퀀스
+								$(this).parent().find("input[name='goodsCpnDcAmt']").val("0");		// 상품쿠폰할인금액
+							}
+						});
+						
 						$(this).parent().parent().find("input[name='custCpnSq']").val("0");
 						$(this).parent().parent().find("input[name='cpnDcAmt']").val("0");
 						
 						$(this).parent().parent().find(".select").text("선택없음");
 						$(this).parent().parent().parent().parent().parent().find(".cp_discount").css("display", "none");
-					} else {
+					}
+					// 쿠폰선택
+					else {
 						// 쿠폰중복체크 후 적용
-						if (cpnDuplicationCheck($(this).prop("value"), index)) {
+						if (custCpnDuplicationCheck($(this).prop("value"), index)) {
 							// 쿠폰적용
 							custCpnApply($(this));
 						} else {
@@ -1329,13 +1266,81 @@ $(document).ready( function() {
 							custCpnNotApply($(this));
 						}
 					}
+					
+					// 최대할인혜택적용 체크해제
+					if ($("#chk-maxdisc").is(":checked")) {
+						$("#chk-maxdisc").attr("checked", false);
+					}
+					
+					// 쿠폰할인금액 SUM
+					custCpnSumAmtCal();
 				});
 			});
 		});
+		
+		// 3. 쿠폰 최대할인금액 초기화 버튼 설정
+		$("#chk-maxdisc").on("click", function(){
+			if ($(this).is(":checked")) {
+				custCpnInit();
+			}
+		});
+		
+		// 3. 쿠폰적용초기화(할인율최고)
+		custCpnInit();
 	});
 	
+	// 쿠폰 최대할인율 쿠폰적용
+	var custCpnInit = function() {
+		
+		// 쿠폰적용없음적용
+		$(".select_custom.type1").each(function(index){
+			// select box 쿠폰 적용
+			var cpnCartSq = $(this).find("input[name='cpnCartSq']").val();
+			
+			// 장바구니시퀀스 체크
+			$("input[name='cartSq']").each(function(){
+				if (cpnCartSq == $(this).val()) {
+					$(this).parent().find("input[name='goodsCpnSq']").val("0");			// 상품쿠폰시퀀스
+					$(this).parent().find("input[name='goodsCpnDcAmt']").val("0");		// 상품쿠폰할인금액
+				}
+			});
+			
+			$(this).find("input[name='custCpnSq']").val("0");
+			$(this).find("input[name='cpnDcAmt']").val("0");
+			
+			$(this).find(".select").text("선택없음");
+			$(this).find(".cp_discount").css("display", "none");
+		});
+		
+		// 최대할인율 쿠폰적용
+		$('.select_custom.type1').each(function(index){
+			cpnIndex 		= 0;
+			cpnApplyTemp 	= false;
+			
+			// select 박스 반복문 실행
+			$(this).find("ul li").each(function(i){
+				cpnIndex++;
+				
+				// 1이상부터 중복 체크
+				if (cpnApplyTemp == false) {
+					if (cpnIndex > 1) {
+						if (custCpnDuplicationCheck($(this).prop("value"), index)) {
+							// 쿠폰적용
+							custCpnApply($(this));
+							
+							cpnApplyTemp = true;
+						}
+					}
+				}
+			});
+		});
+		
+		// 쿠폰할인금액 SUM
+		custCpnSumAmtCal();
+	}
+	
 	// 쿠폰중복사용체크
-	var cpnDuplicationCheck = function(custCpnSq, index) {
+	var custCpnDuplicationCheck = function(custCpnSq, index) {
 		var selCustSq 	= 0;
 		var cnt 		= 0;
 
@@ -1365,6 +1370,17 @@ $(document).ready( function() {
 		var dcAmtStr = "- " + parseInt(obj.attr("data")).addComma() + " 원 할인적용";
 		obj.parent().parent().parent().parent().parent().find(".cp_amount").text(dcAmtStr);
 		
+		// select box 쿠폰 적용
+		var cpnCartSq = obj.parent().parent().find("input[name='cpnCartSq']").val();
+		
+		// 장바구니시퀀스 체크
+		$("input[name='cartSq']").each(function(){
+			if (cpnCartSq == $(this).val()) {
+				$(this).parent().find("input[name='goodsCpnSq']").val(obj.prop("value"));		// 상품쿠폰시퀀스
+				$(this).parent().find("input[name='goodsCpnDcAmt']").val(obj.attr("data"));		// 상품쿠폰할인금액
+			}
+		});
+		
 		// select box 쿠폰 적용
 		obj.parent().parent().find("input[name='custCpnSq']").val(obj.prop("value"));
 		obj.parent().parent().find("input[name='cpnDcAmt']").val(obj.attr("data"));
@@ -1379,7 +1395,7 @@ $(document).ready( function() {
 	var custCpnNotApply = function(obj) {
 		// 이전에 등록된 쿠폰시퀀스  
 		var custCpnSq = obj.parent().parent().find("input[name='custCpnSq']").val();
-		
+
 		// 이전에 등록된 쿠폰시퀀스 비교후 데이타 원복
 		obj.parent().find("li").each(function(){
 			if ($(this).prop("value") == custCpnSq) {
@@ -1394,6 +1410,15 @@ $(document).ready( function() {
 		});
 	}
 	
+	// 쿠폰할인금액합계설정
+	var custCpnSumAmtCal = function() {
+		var cpnDcSumAmt = 0;
+		$("input[name='cpnDcAmt']").each(function(){
+			cpnDcSumAmt = cpnDcSumAmt + parseInt($(this).val());
+		});
+		$(".maxdisc_amount").text("(-" + cpnDcSumAmt.addComma() + "원)");
+	};
+	
 	// 사은품선택 라디오 버튼 기능
 	$(".freegiftRdo").on("click", function() {
 		var total_gift 		= 0;

+ 11 - 1
src/main/webapp/ux/pc/js/cart.js

@@ -43,7 +43,11 @@ var fnDecideOrder = function(param) {
 			gagajf.ajaxJsonSubmit('/mypage/order/decision'
 				, jsonData
 				, function() {
-					cfnGoToPage(_PAGE_MYPAGE_ORDER_DETAIL + ordNo);
+					if (typeof(fnReloadStatusCount) == 'function') {
+						fnReloadStatusCount();
+					} else {
+						cfnGoToPage(_PAGE_MYPAGE_ORDER_DETAIL + ordNo);
+					}
 				});
 		}
 	});
@@ -189,6 +193,12 @@ var fnDeleteOrder = function() {
 	});
 };
 
+// 회수지, 교환지 설정 팝업
+var fnChangeDeliveryAddr = function(param) {
+	// TODO
+	// 회수지, 교환지 설정
+}
+
 // 문자열 길이를 체크
 var cfnGetTextLength = function(obj, maxLen, dpLoc) {
 	var valLen = $(obj).val().length;

+ 19 - 0
src/main/webapp/ux/plugins/gaga/gaga.validation.js

@@ -495,6 +495,20 @@ var gagajf = {
 			}
 		});
 	},
+	
+	/**
+	 * formId의 input의 값에 ?가 여러 개인 경우 ? 한 개로 대체한다.
+	 * 사용) gagajf.replaceOneQuestionMark('#registerForm');
+	 */
+	replaceOneQuestionMark : function(formId) {
+		$(formId).find('input').each(function(idx, el) {
+			$(el).val($(el).val().replace(/\?+/gi, "?"));
+		});
+		
+		$(formId).find('textarea').each(function(idx, el) {
+			$(el).val($(el).val().replace(/\?+/gi, "?"));
+		});
+	},
 
 	/**
 	 * Progress bar
@@ -531,6 +545,9 @@ var gagajf = {
 	ajaxFormSubmit : function(actionUrl, formId, callbackFn) {
 		// comma(,) 제거
 		gagajf.removeCommaAtNumberFormattedInput(formId);
+		
+		// 물음표(?) 여러 개를 1개로 대체
+		gagajf.replaceOneQuestionMark(formId);
 
 		var jsonData = JSON.stringify($(formId).serializeObject());
 		
@@ -600,6 +617,7 @@ var gagajf = {
 	 * 모든 ajax 처리는 이것으로 진행한다.
 	 * <pre>
 	 *     gagajf.removeCommaAtNumberFormattedInput('#registerForm'); // comma(,) 제거
+	 *     gagajf.replaceOneQuestionMark('#registerForm'); // 물음표(?) 여러 개를 1개로 대체
 	 *     var jsonData = JSON.stringify($('#registerForm').serializeObject());
 	 *     gagajf.ajaxJsonSubmit('/rest/commoncode/create', jsonData, jfRegisterSaveCallback);
 	 * </pre>
@@ -754,6 +772,7 @@ var gagajf = {
 	 * 대용량 json 데이터를 가지고 ajax 방식으로 submit 한다.
 	 * <pre>
 	 *     gagajf.removeCommaAtNumberFormattedInput('#registerForm'); // comma(,) 제거
+	 *     gagajf.replaceOneQuestionMark('#registerForm'); // 물음표(?) 여러 개를 1개로 대체
 	 *     var jsonData = JSON.stringify($('#registerForm').serializeObject());
 	 *     gagajf.ajaxJsonBatchSubmit('/rest/commoncode/create', jsonData, 1, 3, jfRegisterSaveCallback);
 	 * </pre>