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

Merge remote-tracking branch 'origin/order' into jsh77b

jsh77b 5 лет назад
Родитель
Сommit
8ef97372ed
23 измененных файлов с 1225 добавлено и 488 удалено
  1. 75 2
      src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java
  2. 7 7
      src/main/java/com/style24/front/biz/dao/TsfOrderDao.java
  3. 4 0
      src/main/java/com/style24/front/biz/service/TsfCartService.java
  4. 13 50
      src/main/java/com/style24/front/biz/service/TsfCouponService.java
  5. 159 3
      src/main/java/com/style24/front/biz/service/TsfGoodsService.java
  6. 85 28
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  7. 1 3
      src/main/java/com/style24/front/biz/web/TsfCartController.java
  8. 128 53
      src/main/java/com/style24/front/biz/web/TsfGoodsController.java
  9. 50 38
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  10. 5 1
      src/main/java/com/style24/persistence/domain/Coupon.java
  11. 12 0
      src/main/java/com/style24/persistence/domain/Goods.java
  12. 37 0
      src/main/java/com/style24/persistence/domain/Lookbook.java
  13. 22 0
      src/main/java/com/style24/persistence/domain/LookbookGoods.java
  14. 5 2
      src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml
  15. 137 14
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  16. 49 56
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml
  17. 79 13
      src/main/webapp/WEB-INF/views/web/cart/cartListAjaxFormWeb.html
  18. 11 8
      src/main/webapp/WEB-INF/views/web/common/layout/MypageLayoutWeb.html
  19. 82 25
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html
  20. 74 176
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListFormWeb.html
  21. 176 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListWeb.html
  22. 2 0
      src/main/webapp/ux/pc/js/common-ui.js
  23. 12 9
      src/main/webapp/ux/style24_link.js

+ 75 - 2
src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java

@@ -3,12 +3,17 @@ package com.style24.front.biz.dao;
 import java.util.Collection;
 
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.CardPromotion;
 import com.style24.persistence.domain.Cate4Srch;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsCompose;
+import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsImg;
+import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsStock;
 import com.style24.persistence.domain.GoodsViewHst;
+import com.style24.persistence.domain.Lookbook;
+import com.style24.persistence.domain.LookbookGoods;
 import com.style24.persistence.domain.VideoDisploc;
 
 /**
@@ -109,15 +114,83 @@ public interface TsfGoodsDao {
 
 
 	/**
-	 * 상품 옵션 사이즈 목록
+	 * 상품 옵션2 목록
 	 *
 	 * @param goods
 	 * @return
 	 * @author eskim
 	 * @date 2021. 2. 9
 	 */
-	Collection<GoodsStock> getGoodsSizeList(Goods goods);
+	Collection<GoodsStock> getGoodsOption2List(Goods goods);
 
+	/**
+	 * 상품 고시정보
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @date 2021. 2. 17
+	 */
+	Collection<GoodsNotiInfo> getGoodsNotiList(Goods goods);
+
+	/**
+	 * 카드 혜택
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @date 2021. 2. 17
+	 */
+	Collection<CardPromotion> getCardPromotionList(CardPromotion cardPromotion);
 
+	/**
+	 * 핫딜 상품 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @date 2021. 2. 17
+	 */
+	Goods getSocialGoods(Goods goods);
+
+	/**
+	 * 카드 혜택
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @date 2021. 2. 17
+	 */
+	Collection<GoodsDesc> getGoodsDescList(GoodsDesc goodsDesc);
+
+	/**
+	 * 상품예약판매정보 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @date 2021. 2. 17
+	 */
+	Goods getGoodsResSell(Goods goods);
+	
+	/**
+	 * 룩북 베너 목록
+	 *
+	 * @param lookbook
+	 * @return
+	 * @author eskim
+	 * @date 2021. 2. 18
+	 */
+	Collection<Lookbook> getLookbookBannerList(Lookbook lookbook);
+	
+	/**
+	 * 룩북 베너별 상품 목록
+	 *
+	 * @param lookbook
+	 * @return
+	 * @author eskim
+	 * @date 2021. 2. 18
+	 */
+	Collection<LookbookGoods> getLookbookBannerGoodsList(Lookbook lookbook);
 
 }

+ 7 - 7
src/main/java/com/style24/front/biz/dao/TsfOrderDao.java

@@ -25,24 +25,24 @@ public interface TsfOrderDao {
 	Collection<Order> getOrderListForMypage(Order order);
 
 	/**
-	 * 마이페이지 주문상태 별 주문수량 조회
+	 * 주문 상태 별 수량 조회
 	 *
 	 * @param Order
-	 * @return int
+	 * @return Order
 	 * @author card007
 	 * @since 2021. 02. 08
 	 */
-	int getOrderStatCount(Order order);
+	Order getOrderStatCount(Order order);
 
 	/**
-	 * 마이페이지 주문변경상태 별 주문수량 조회
+	 * 마이페이지 주문목록 페이징 처리 주문번호 조회
 	 *
 	 * @param Order
-	 * @return int
+	 * @return Collection<Order>
 	 * @author card007
-	 * @since 2021. 02. 08
+	 * @since 2021. 02. 18
 	 */
-	int getOrderChangeStatCount(Order order);
+	Collection<Order> getPagingOrdNoList(Order order);
 
 	/**
 	 * 마이페이지 주문상세 금액정보 조회

+ 4 - 0
src/main/java/com/style24/front/biz/service/TsfCartService.java

@@ -311,6 +311,9 @@ public class TsfCartService {
 					cart.setAmtTmtbSq(info.getAmtTmtbSq());
 				}
 			}
+			if(cart.getTmtbDcAmt() == 0) {
+				cart.setTmtbDcAmt(cart.getCurrPrice());
+			}
 		}
 
 		// 장바구니 업체별 배송비 계산
@@ -318,6 +321,7 @@ public class TsfCartService {
 
 		// 자사 / 입점업체 리스트 분리
 		order = getCartDelvGoodsCntList(cartGoodsList);
+		order.setCartGoodsList(cartGoodsList);
 
 		// 총계 금액 계산
 		setCartListTotAmtInfo(cartGoodsList, order);

+ 13 - 50
src/main/java/com/style24/front/biz/service/TsfCouponService.java

@@ -64,8 +64,7 @@ public class TsfCouponService {
 		param.setFrontGb(TsfSession.getFrontGb());
 
 		// 시리얼키의 쿠폰이 다운로드 가능한지 확인
-		Coupon cpn = couponDao.getSearchSerialCpnInfo(param);   // >> 여기서 쿠폰 정보 다 빼내야함.
-
+		Coupon cpn = couponDao.getSearchSerialCpnInfo(param);
 
 		// 다운로드 받을 수 있는 쿠폰이 있으면
 		if(cpn != null && cpn.getCpnId() > 0) {
@@ -78,12 +77,13 @@ public class TsfCouponService {
 				// 이미 다운 받았고, 사용 한 쿠폰이 있을 경우 종료
 				if(!StringUtils.isEmpty(myCpn.getUsedDt())) {
 					cpn.setResult("해당 쿠폰은 이미 사용하신 쿠폰입니다.");
-				} else {
-					cpn.setResult("지급 받으신 쿠폰 사용 기한이 지났습니다.");
+					return cpn;
+				} else if("N".equals(myCpn.getAvailYn())) {
+					cpn.setResult("지급 받으신 쿠폰의 유효기간이 아닙니다.");
+					return cpn;
 				}
-				return cpn;
 			} else {
-				/* 다운받지 않은 경우 (tb_cust_coupon insert) */
+				/* 다운받은 쿠폰이 아닐 경우 (tb_cust_coupon insert) */
 				// 랜덤쿠폰 할당 및 쿠폰 지급
 				cpn.setRegNo(param.getRegNo());
 				cpn.setUpdNo(param.getUpdNo());
@@ -95,53 +95,16 @@ public class TsfCouponService {
 			return cpn;
 		}
 
+		Coupon dtData = couponDao.getSerialCpnUseInfo(cpn);
+		cpn.setAvailStdt(dtData.getAvailStdt());
+		cpn.setAvailEddt(dtData.getAvailEddt());
+
 		// 장바구니쿠폰 토탈 할인 금액 계산
+		param.setCpnId(cpn.getCpnId());
 		cpn.setDcAmt(getCartCpnApplyTotalAmt(param));
 		cpn.setResult("SUCCESS");
 
-		log.info("CHECK INFO >> {} / {}", cpn.getDcAmt(), cpn.getResult());
-
 		return cpn;
-
-
-
-/*
-		// 시리얼 쿠폰 지급 및 사용 내역 조회
-		Coupon useSerial = getSerialCpnUseInfo(param);
-		if(useSerial == null) {	useSerial = new Coupon();	}
-
-		useSerial.setRdCpnNm(param.getRdCpnNm());
-		useSerial.setCartSqArr(param.getCartSqArr());
-		useSerial.setCustNo(param.getCustNo());
-		useSerial.setRegNo(param.getRegNo());
-		useSerial.setUpdNo(param.getUpdNo());
-
-		Coupon coupon = new Coupon();
-
-		// 시리얼 쿠폰 다운로드하지 않았다면
-		if(useSerial != null && useSerial.getCpnId() > 0) {
-			// 해당 시리얼쿠폰을 사용한적이 있는 경우나, 받은것이 있는경우에 대한 처리
-			if(!StringUtils.isEmpty(useSerial.getUsedDt())) {
-				useSerial.setResult("해당 쿠폰은 이미 사용완료된 쿠폰입니다.");
-				return useSerial;
-			}
-		} else {
-			// 쿠폰 저장 및 할인 가격 적용
-			coupon = couponDao.getSearchSerialCpnInfo(useSerial);
-			if(coupon == null) {
-				useSerial.setResult("해당 쿠폰은 존재하지 않습니다.");
-				return useSerial;
-			} *//*else if (!"Y".equals(coupon.getDownCanGb())) {
-				useSerial.setResult("해당 쿠폰은 사용 할 수 없습니다.");
-				return useSerial;
-			}*//* else {
-				// 랜덤쿠폰 할당 및 쿠폰 지급
-				coupon.setCustNo(useSerial.getCustNo());
-				coupon.setRegNo(useSerial.getRegNo());
-				coupon.setUpdNo(useSerial.getUpdNo());
-				updateGiveRandomCpnInfo(coupon);
-			}
-		}*/
 	}
 
 	// 장바구니쿠폰 토탈 할인 금액 계산
@@ -179,8 +142,8 @@ public class TsfCouponService {
 			totDcAmt = maxDcAmt;
 		}
 
-		// 주문 최소 금액 요건 확인 (0은 제한 없음. 최소 주문 금액보다 총 상품 금액이 적으면 0원으로 세팅)
-		if(buyLimitAmt > 0 && buyLimitAmt > totCurrPrice) {
+		// 주문 최소 금액 요건 확인 (최소 주문 금액보다 총 상품 금액이 적으면 0원으로 세팅)
+		if(buyLimitAmt > totCurrPrice) {
 			totDcAmt = 0;
 		}
 

+ 159 - 3
src/main/java/com/style24/front/biz/service/TsfGoodsService.java

@@ -10,12 +10,16 @@ import org.springframework.transaction.annotation.Transactional;
 import com.style24.core.support.env.TscConstants;
 import com.style24.front.biz.dao.TsfGoodsDao;
 import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.domain.CardPromotion;
 import com.style24.persistence.domain.Cate4Srch;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsCompose;
+import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsImg;
+import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsStock;
 import com.style24.persistence.domain.GoodsViewHst;
+import com.style24.persistence.domain.Lookbook;
 import com.style24.persistence.domain.VideoDisploc;
 
 import lombok.extern.slf4j.Slf4j;
@@ -90,6 +94,85 @@ public class TsfGoodsService {
 		return goodsDao.getGoodsInfo(goods);
 	}
 
+	/**
+	 * 상품 DESC 조회
+	 *
+	 * @param resultGoods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 17
+	 */
+	public Goods getGoodsDesc(Goods resultGoods) {
+
+		GoodsDesc goods = new GoodsDesc();
+		goods.setGoodsCd(resultGoods.getGoodsCd());
+
+		//상품상세 구분(10:상품타이틀,20:상품타이틀내용,30:상품특징,40:상위컨텐츠,50:하위컨텐츠,60:상위컨텐츠-모바일,70:하위컨텐츠-모바일,80:상품상세(as-is,입점))
+
+		// 상품타이틀
+		goods.setDescGb("10");
+		String goodsTitle = this.getGoodsDescList(goods);
+		resultGoods.setGoodsTitle(goodsTitle);
+		// 상품타이틀내용
+		goods.setDescGb("20");
+		String goodsTitleDesc = this.getGoodsDescList(goods);
+		resultGoods.setGoodsTitleDesc(goodsTitleDesc);
+		// 상품특징
+		goods.setDescGb("30");
+		String goodsSpecialDesc = this.getGoodsDescList(goods);
+		resultGoods.setGoodsSpecialDesc(goodsSpecialDesc);
+
+		if ("P".equals(TsfSession.getFrontGb())) {
+			// 상품 상세 pc 상단
+			goods.setDescGb("40");
+			String goodsPcTopDesc = this.getGoodsDescList(goods);
+			resultGoods.setGoodsTopDesc(goodsPcTopDesc);
+
+			// 상품 상세 pc 하단
+			goods.setDescGb("50");
+			String goodsPcDownDesc = this.getGoodsDescList(goods);
+			resultGoods.setGoodsDownDesc(goodsPcDownDesc);
+
+		} else {
+			// 상품 상세 mobile 상단
+			goods.setDescGb("60");
+			String goodsMobileTopDesc = this.getGoodsDescList(goods);
+			resultGoods.setGoodsTopDesc(goodsMobileTopDesc);
+
+			// 상품 상세 mpbile 하단
+			goods.setDescGb("70");
+			String goodsMobileDownDesc = this.getGoodsDescList(goods);
+			resultGoods.setGoodsDownDesc(goodsMobileDownDesc);
+		}
+
+		// 상품특징
+		goods.setDescGb("80");
+		String goodsDesc = this.getGoodsDescList(goods);
+		resultGoods.setGoodsDesc(goodsDesc);
+
+		return resultGoods;
+	}
+
+	/**
+	 * 상품 상세 정보 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 17
+	 */
+	private String getGoodsDescList(GoodsDesc goods) {
+		Collection<GoodsDesc> goodsDescList = goodsDao.getGoodsDescList(goods);
+		StringBuilder goodsDesc = new StringBuilder();
+		if (goodsDescList != null && !goodsDescList.isEmpty()) {
+			for (GoodsDesc tmpGoodsDesc : goodsDescList) {
+				goodsDesc.append(tmpGoodsDesc.getGoodsDesc());
+			}
+		}
+		return goodsDesc.toString();
+	}
+
+
 	/**
 	 * 상품 이미지 정보
 	 *
@@ -216,15 +299,88 @@ public class TsfGoodsService {
 	}
 
 	/**
-	 * 상품 옵션 사이즈 목록
+	 * 상품 옵션2 목록
 	 *
 	 * @param goods
 	 * @return
 	 * @author eskim
 	 * @since 2021. 2. 9
 	 */
-	public Collection<GoodsStock> getGoodsSizeList(Goods goods) {
-		return goodsDao.getGoodsSizeList(goods);
+	public Collection<GoodsStock> getGoodsOption2List(Goods goods) {
+		return goodsDao.getGoodsOption2List(goods);
+	}
+
+	/**
+	 * 상품 고시정보
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 17
+	 */
+	public Collection<GoodsNotiInfo> getGoodsNotiList(Goods goods) {
+		return goodsDao.getGoodsNotiList(goods);
+	}
+
+	/**
+	 * 카드 혜택
+	 *
+	 * @param cardPromotion
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 17
+	 */
+	public Collection<CardPromotion> getCardPromotionList(CardPromotion cardPromotion) {
+		return goodsDao.getCardPromotionList(cardPromotion);
+	}
+
+	/**
+	 * 핫딜 상품 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 17
+	 */
+	public Goods getSocialGoods(Goods goods) {
+		return goodsDao.getSocialGoods(goods);
+	}
+
+	/**
+	 * 상품예약판매정보 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 17
+	 */
+	public Goods getGoodsResSell(Goods resultGoods) {
+
+		Goods goods = goodsDao.getGoodsResSell(resultGoods);
+		if (goods != null) {
+			resultGoods.setDelvResDt(goods.getDelvResDt());
+		}
+
+		return resultGoods;
+	}
+
+	/**
+	 * 룩북
+	 *
+	 * @param lookbook
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 18
+	 */
+	public Collection<Lookbook> getLookbookList(Lookbook lookbook) {
+		Collection<Lookbook> lookbookBannerList = goodsDao.getLookbookBannerList(lookbook);
+		
+		for (Lookbook tempLookbook : lookbookBannerList) {
+			tempLookbook.setLookbookGoodsList(goodsDao.getLookbookBannerGoodsList(tempLookbook));
+		}
+		
+		return lookbookBannerList;
 	}
 
+
 }

+ 85 - 28
src/main/java/com/style24/front/biz/service/TsfOrderService.java

@@ -61,6 +61,7 @@ public class TsfOrderService {
 	 */
 	public Collection<GagaMap> getOrderListForMypage(Order order) {
 		Collection<GagaMap> mapList = new ArrayList<>();
+		Collection<GagaMap> ordDtlStatList = new ArrayList<>();
 		List<Order> orderList = new ArrayList<>();
 		int ordNo = 0;
 		String ordDt = "";
@@ -77,21 +78,42 @@ public class TsfOrderService {
 		int rowspan = 0;
 
 		for (Order tmpOrder : orderDao.getOrderListForMypage(order)) {
-			// 주문번호, 배송구분(총알배송, 일반배송, 업체직배송), 배송정책 변경
-			if (ordNo != tmpOrder.getOrdNo() || !selfGoodsYn.equals(tmpOrder.getSelfGoodsYn()) || ("N".equals(tmpOrder.getSelfGoodsYn()) && !delvFeeCd.equals(tmpOrder.getDelvFeeCd())) || !shotDelvYn.equals(tmpOrder.getShotDelvYn())) {
+			// 주문번호, 배송구분(총알배송, 일반배송, 업체직배송), 배송정책, 선물하기 변경
+			if (ordNo != tmpOrder.getOrdNo()
+				|| !selfGoodsYn.equals(tmpOrder.getSelfGoodsYn())
+				|| ("N".equals(tmpOrder.getSelfGoodsYn()) && !delvFeeCd.equals(tmpOrder.getDelvFeeCd()))
+				|| !shotDelvYn.equals(tmpOrder.getShotDelvYn())
+				|| !giftPackYn.equals(tmpOrder.getGiftPackYn())) {
 				// 데이터 설정
 				if (index > 0) {
+					// 주문내역 목록 설정
+					GagaMap ordDtlStatMap = new GagaMap();
+					ordDtlStatMap.set("orderList", orderList);
+					ordDtlStatMap.set("ordDtlStat", orderList.iterator().next().getOrdDtlStat());
+					ordDtlStatMap.set("shipCompNm", shipCompNm);
+					ordDtlStatMap.set("invoiceNo", invoiceNo);
+					ordDtlStatMap.set("reviewSq", reviewSq);
+					ordDtlStatMap.set("recipBaseAddr", orderList.iterator().next().getRecipBaseAddr());
+					ordDtlStatMap.set("giftLimitDay", orderList.iterator().next().getGiftLimitDay());
+					ordDtlStatMap.set("recipNm", orderList.iterator().next().getRecipNm());
+					ordDtlStatMap.set("giftLimitDt", orderList.iterator().next().getGiftLimitDt());
+					ordDtlStatMap.set("purchaseConfirmDay", orderList.iterator().next().getPurchaseConfirmDay());
+					ordDtlStatMap.set("ordDtlStatLastBanner", "Y");
+					ordDtlStatMap.set("ordDtlStatBanner", "Y");
+					ordDtlStatList.add(ordDtlStatMap);
+					
 					GagaMap map = new GagaMap();
 					map.set("ordNo", ordNo);					// 주문번호
 					map.set("ordDt", ordDt);					// 주문일시
 					map.set("shotDelvYn", shotDelvYn);			// 총알배송여부
 					map.set("selfGoodsYn", selfGoodsYn);		// 자사여부
-					map.set("ordDtlStat", ordDtlStat);			// 주문상태코드
-					map.set("shipCompNm", shipCompNm);			// 배송업체명
-					map.set("invoiceNo", invoiceNo);			// 송장번호
+					// map.set("ordDtlStat", ordDtlStat);			// 주문상태코드
+					// map.set("shipCompNm", shipCompNm);			// 배송업체명
+					// map.set("invoiceNo", invoiceNo);			// 송장번호
 					map.set("giftPackYn", giftPackYn);			// 선물하기여부
-					map.set("reviewSq", reviewSq);				// 리뷰일련번호
-					map.set("orderList", setOrderListParameter(orderList, rowspan, ordDtlStatCnt, "Y"));			// 주문내역
+					// map.set("reviewSq", reviewSq);				// 리뷰일련번호
+					map.set("ordDtlStatList", ordDtlStatList);	// 주문내역
+					// map.set("orderList", setOrderListParameter(orderList, rowspan, ordDtlStatCnt, "Y"));			// 주문내역
 					mapList.add(map);
 				}
 
@@ -107,13 +129,30 @@ public class TsfOrderService {
 				reviewSq = tmpOrder.getReviewSq();
 				giftPackYn = tmpOrder.getGiftPackYn();
 				orderList = new ArrayList<>();
+				ordDtlStatList = new ArrayList<>();
 				ordDtlStatCnt = 0;
 				rowspan = 0;
 			} else if (index > 0 && !ordDtlStat.equals(tmpOrder.getOrdDtlStat())) {
 				// 주문내역 데이터 추가
 				orderList = setOrderListParameter(orderList, rowspan, ordDtlStatCnt, "N");
 
+				// 주문내역 목록 설정
+				GagaMap ordDtlStatMap = new GagaMap();
+				ordDtlStatMap.set("orderList", orderList);
+				ordDtlStatMap.set("ordDtlStat", orderList.iterator().next().getOrdDtlStat());
+				ordDtlStatMap.set("shipCompNm", shipCompNm);
+				ordDtlStatMap.set("invoiceNo", invoiceNo);
+				ordDtlStatMap.set("reviewSq", reviewSq);
+				ordDtlStatMap.set("purchaseConfirmDay", orderList.iterator().next().getPurchaseConfirmDay());
+				ordDtlStatMap.set("recipBaseAddr", orderList.iterator().next().getRecipBaseAddr());
+				ordDtlStatMap.set("giftLimitDay", orderList.iterator().next().getGiftLimitDay());
+				ordDtlStatMap.set("recipNm", orderList.iterator().next().getRecipNm());
+				ordDtlStatMap.set("giftLimitDt", orderList.iterator().next().getGiftLimitDt());
+				ordDtlStatMap.set("ordDtlStatBanner", "Y");
+				ordDtlStatList.add(ordDtlStatMap);
+
 				// 상태 별 배너 설정 후 초기화 진행
+				orderList = new ArrayList<>();
 				ordDtlStat = tmpOrder.getOrdDtlStat();
 				rowspan = 0;
 			}
@@ -129,17 +168,34 @@ public class TsfOrderService {
 
 		// 마지막 데이터 설정
 		if (ordNo > 0) {
+			// 주문내역 목록 설정
+			GagaMap ordDtlStatMap = new GagaMap();
+			ordDtlStatMap.set("orderList", orderList);
+			ordDtlStatMap.set("ordDtlStat", orderList.iterator().next().getOrdDtlStat());
+			ordDtlStatMap.set("shipCompNm", shipCompNm);
+			ordDtlStatMap.set("invoiceNo", invoiceNo);
+			ordDtlStatMap.set("reviewSq", reviewSq);
+			ordDtlStatMap.set("purchaseConfirmDay", orderList.iterator().next().getPurchaseConfirmDay());
+			ordDtlStatMap.set("recipBaseAddr", orderList.iterator().next().getRecipBaseAddr());
+			ordDtlStatMap.set("giftLimitDay", orderList.iterator().next().getGiftLimitDay());
+			ordDtlStatMap.set("recipNm", orderList.iterator().next().getRecipNm());
+			ordDtlStatMap.set("giftLimitDt", orderList.iterator().next().getGiftLimitDt());
+			ordDtlStatMap.set("ordDtlStatLastBanner", "Y");
+			ordDtlStatMap.set("ordDtlStatBanner", "Y");
+			ordDtlStatList.add(ordDtlStatMap);
+			
 			GagaMap map = new GagaMap();
 			map.set("ordNo", ordNo);
 			map.set("ordDt", ordDt);
 			map.set("shotDelvYn", shotDelvYn);
 			map.set("selfGoodsYn", selfGoodsYn);
-			map.set("ordDtlStat", ordDtlStat);
-			map.set("shipCompNm", shipCompNm);
-			map.set("invoiceNo", invoiceNo);
+			// map.set("ordDtlStat", ordDtlStat);
+			// map.set("shipCompNm", shipCompNm);
+			// map.set("invoiceNo", invoiceNo);
 			map.set("giftPackYn", giftPackYn);
-			map.set("reviewSq", reviewSq);
-			map.set("orderList", setOrderListParameter(orderList, rowspan, ordDtlStatCnt, "Y"));
+			// map.set("reviewSq", reviewSq);
+			map.set("ordDtlStatList", ordDtlStatList);	// 주문내역
+			// map.set("orderList", setOrderListParameter(orderList, rowspan, ordDtlStatCnt, "Y"));
 			mapList.add(map);
 		}
 
@@ -156,18 +212,19 @@ public class TsfOrderService {
 	 */
 	private List<Order> setOrderListParameter(List<Order> orderList, int rowspan, int ordDtlStatCnt, String setLastBanner) {
 		// rowspan 설정
-		for (int i = 0;i <= rowspan;i++) {
-			if (i == rowspan) {
-				orderList.get(ordDtlStatCnt - rowspan).setRowspan(rowspan);
-			} else if (rowspan == 1){
-				orderList.get(ordDtlStatCnt - rowspan).setRowspan(1);
-			} else {
-				orderList.get(ordDtlStatCnt - rowspan).setRowspan(0);
-			}
-		}
+		// for (int i = 0;i <= rowspan;i++) {
+		// 	if (i == rowspan) {
+		// 		orderList.get(ordDtlStatCnt - rowspan).setRowspan(rowspan);
+		// 	} else if (rowspan == 1){
+		// 		orderList.get(ordDtlStatCnt - rowspan).setRowspan(1);
+		// 	} else {
+		// 		orderList.get(ordDtlStatCnt - rowspan).setRowspan(0);
+		// 	}
+		// }
 
 		// 주문상세상태값 별 배너 설정
 		if ("Y".equals(setLastBanner)) {
+			orderList.get(orderList.size() - 1).setOrdDtlStatLastBanner("Y");
 			orderList.get(orderList.size() - 1).setOrdDtlStatBanner("Y");
 		} else {
 			orderList.get(ordDtlStatCnt - 1).setOrdDtlStatBanner("Y");
@@ -177,24 +234,24 @@ public class TsfOrderService {
 	}
 
 	/**
-	 * 마이페이지 주문상태 별 주문수량 조회
+	 * 주문 상태 별 수량 조회
 	 *
 	 * @param Order
-	 * @return int
+	 * @return Order
 	 * @author card007
 	 * @since 2021. 02. 08
 	 */
-	public int getOrderStatCount(Order order) { return orderDao.getOrderStatCount(order); }
+	public Order getOrderStatCount(Order order) { return orderDao.getOrderStatCount(order); }
 
 	/**
-	 * 마이페이지 주문변경상태 별 주문수량 조회
+	 * 마이페이지 주문목록 페이징 처리 주문번호 조회
 	 *
 	 * @param Order
-	 * @return int
+	 * @return Collection<Order>
 	 * @author card007
-	 * @since 2021. 02. 08
+	 * @since 2021. 02. 18
 	 */
-	public int getOrderChangeStatCount(Order order) { return orderDao.getOrderChangeStatCount(order); }
+	public Collection<Order> getPagingOrdNoList(Order order) { return orderDao.getPagingOrdNoList(order); }
 
 	/**
 	 * 마이페이지 주문상세 금액정보 조회

+ 1 - 3
src/main/java/com/style24/front/biz/web/TsfCartController.java

@@ -121,6 +121,7 @@ public class TsfCartController extends TsfBaseController {
 
 		model.addAttribute("param", param);
 		model.addAttribute("order", order);
+		model.addAttribute("cartGoodsList", order.getCartGoodsList());
 		model.addAttribute("wmsCartList", order.getWmsCartList());
 		model.addAttribute("delvCartList", order.getDelvCartList());
 		model.addAttribute("IMG_PATH", env.getProperty("upload.goods.view"));
@@ -142,9 +143,6 @@ public class TsfCartController extends TsfBaseController {
 	public GagaMap serialCpnApply(@RequestBody Coupon param) {
 		GagaMap result = new GagaMap();
 
-		log.info("CHECK IN >> {}", param.getRdCpnNm());
-		log.info("CHECK IN >> {}", param.getCartSqArr());
-
 		// 시리얼 쿠폰 정보 조회 및 쿠폰 지급 미대상인 경우 쿠폰 지급
 		Coupon useSerial = couponService.serialCpnApplyInfo(param);
 

+ 128 - 53
src/main/java/com/style24/front/biz/web/TsfGoodsController.java

@@ -2,20 +2,27 @@ package com.style24.front.biz.web;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.servlet.ModelAndView;
 
+import com.style24.core.biz.service.TscEnvsetService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.front.biz.service.TsfGoodsService;
 import com.style24.front.support.controller.TsfBaseController;
+import com.style24.front.support.env.TsfConstants;
 import com.style24.front.support.security.session.TsfSession;
+import com.style24.persistence.domain.CardPromotion;
 import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.Lookbook;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.util.GagaCookieUtil;
+
 /**
  * 상품 Controller
  *
@@ -33,8 +40,12 @@ public class TsfGoodsController extends TsfBaseController {
 	@Autowired
 	private TsfGoodsService goodsService;
 
-//	@Autowired
-//	private TsfPolicyService policyService;
+	@Autowired
+	private TscEnvsetService envsetService;
+
+	@Value("${has-ssl}")
+	private String hasSsl;
+
 
 	/**
 	 * 상품상세
@@ -60,12 +71,12 @@ public class TsfGoodsController extends TsfBaseController {
 
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
 		setGoods(paramsGoods);
-//
-//		String mobileYn = paramsGoods.getMobileYn();
-//		if ("Y".equals(mobileYn)) {
-//			paramsGoods.setFrontGb("M");
-//		}
-//
+
+		String mobileYn = paramsGoods.getMobileYn();
+		if ("Y".equals(mobileYn)) {
+			paramsGoods.setFrontGb("M");
+		}
+
 		Goods goods = goodsService.getGoodsInfo(paramsGoods);
 
 		if (goods == null || goods.getGoodsCd().isEmpty()) {
@@ -76,12 +87,20 @@ public class TsfGoodsController extends TsfBaseController {
 			}
 			return mav;
 		}
-//
-//		// 다른컬러보기용 업체코드 인자 처리
-//		paramsGoods.setSupplyCompCd(goods.getSupplyCompCd());
-//		paramsGoods.setGoodsType(goods.getGoodsType());
-//		paramsGoods.setFormalGb(goods.getFormalGb());
-//		//
+
+		// 상품 상세
+		goods = goodsService.getGoodsDesc(paramsGoods);
+		// 핫딜정보
+		Goods socialGoods = goodsService.getSocialGoods(paramsGoods);
+		if (socialGoods != null && !StringUtils.isBlank(socialGoods.getGoodsCd())) {
+			goods.setSocialSq(socialGoods.getSocialSq());
+			goods.setSocialTnm(socialGoods.getSocialTnm());
+			goods.setSocialEddt(socialGoods.getSocialEddt());
+			goods.setSocialSq(socialGoods.getSocialSq());
+		}
+		// 예약판매정보
+		goods = goodsService.getGoodsResSell(goods);
+
 		// 상품 기본정보
 		mav.addObject("goodsInfo", goods);
 		// 상품 네비정보
@@ -98,15 +117,13 @@ public class TsfGoodsController extends TsfBaseController {
 			mav.addObject("goodsExtendList", goodsService.getGoodsDealComposeList(paramsGoods));
 		} else {
 			if ("N".equals(goods.getGoodsType())) {	// 일반상품
-				// 상품 옵션1 정보
-				mav.addObject("goodsOtherColorList", goodsService.getGoodsOption1List(paramsGoods));
-				// 상품 사이즈정보
-				mav.addObject("goodsSizeList", goodsService.getGoodsSizeList(paramsGoods));
+				// 상품 옵션1(색상) 정보
+				mav.addObject("goodsOption1List", goodsService.getGoodsOption1List(paramsGoods));
+				// 상품 옵션2(사이즈) 정보
+				mav.addObject("goodsOption2List", goodsService.getGoodsOption2List(paramsGoods));
 
 //				// 상품 고시정보
-//				mav.addObject("goodsNotiList", goodsService.getGoodsNotiList(goods));
-//				// 상품 부위별 사이즈정보
-//				mav.addObject("goodsRegionSizeHtml", goodsService.getGoodsRegionsizeList(paramsGoods));
+				mav.addObject("goodsNotiList", goodsService.getGoodsNotiList(goods));
 
 			} else if ("S".equals(goods.getGoodsType())) {		// 셋트상품
 //				mav.addObject("goodsExtendList", goodsService.getGoodsSetExtendList(paramsGoods));
@@ -116,39 +133,51 @@ public class TsfGoodsController extends TsfBaseController {
 		}
 //
 //		// 상품포인트사용방법
-//		mav.addObject("goodsPointMothod", policyService.getPointMothod(TsfConstants.SITE_CD)); // A:정액, R:정율
+//		mav.addObject("goodsPointMothod", envsetService.getPointMothod(TscConstants.Site.STYLE24.value())); // A:정액, R:정율
 //		// 상품포인트절사단위
 //		mav.addObject("goodsPointUnit", paramsGoods.getPointUnit()); // 10:원단위절사(int)
 //		// 상품평노출여부 - 미사용
-//		//mav.addObject("reviewDisplayYn", policyService.getReviewDisplayYn(TsfConstants.SITE_CD));
-//
-//		// 무이자 혜택안내 -- 배너 미사용
-//		TsfCardInstallment cardInstallment = new TsfCardInstallment();
-//		cardInstallment.setImonths99SkipYn("Y");
-//		mav.addObject("cardInfoList", goodsService.getCardInfoList(cardInstallment));
-//
-//		// 오늘본 상품 쿠키 담기
-//		// SSL Server
-//		boolean isSslServer = Boolean.parseBoolean(hasSsl);
-//		log.debug("isSslServer: [{}]", isSslServer);
-//
-//		//기존쿠키 가져오기
-//		setTodayGoodsCd(paramsGoods);
+//		//mav.addObject("reviewDisplayYn", envsetService.getReviewDisplayYn(TsfConstants.SITE_CD));
 //
-//		mav.addObject("params", paramsGoods);
-//		if ("D".equals(goods.getGoodsType())) {
-//			if ("Y".equals(mobileYn)) {
-//				mav.setViewName("mob/goods/GoodsDealFormMob");
-//			} else {
-//				mav.setViewName(super.getDeviceViewName("goods/GoodsDealForm"));
-//			}
-//		} else {
-//			if ("Y".equals(mobileYn)) {
-//				mav.setViewName("mob/goods/GoodsDetailFormMob");
-//			} else {
-//				mav.setViewName(super.getDeviceViewName("goods/GoodsDetailForm"));
-//			}
-//		}
+		// 카드 혜택안내
+		CardPromotion cardPromotion = new CardPromotion();
+		cardPromotion.setRegNo(1); // 혜택유형별로 1건씩
+		mav.addObject("cardInfoList", goodsService.getCardPromotionList(cardPromotion));
+
+		// 쇼핑 혜택
+		// 할인혜택
+
+		// 다다익선
+
+		// 사은품
+
+		// 룩북
+		Lookbook lookbook = new Lookbook();
+		lookbook.setGoodsCd(paramsGoods.getGoodsCd());
+		mav.addObject("cardInfoList", goodsService.getLookbookList(lookbook));
+		// 오늘본 상품 쿠키 담기
+		// SSL Server
+		boolean isSslServer = Boolean.parseBoolean(hasSsl);
+		//log.info("isSslServer: [{}]", isSslServer);
+
+		//기존쿠키 가져오기
+		setTodayGoodsCd(paramsGoods);
+
+		mav.addObject("params", paramsGoods);
+
+		if ("D".equals(goods.getGoodsType())) {
+			if ("Y".equals(mobileYn)) {
+				mav.setViewName("mob/goods/GoodsDealFormMob");
+			} else {
+				mav.setViewName(super.getDeviceViewName("goods/GoodsDealForm"));
+			}
+		} else {
+			if ("Y".equals(mobileYn)) {
+				mav.setViewName("mob/goods/GoodsDetailFormMob");
+			} else {
+				mav.setViewName(super.getDeviceViewName("goods/GoodsDetailForm"));
+			}
+		}
 
 		return mav;
 	}
@@ -164,9 +193,9 @@ public class TsfGoodsController extends TsfBaseController {
 		goods.setFrontGb(TsfSession.getFrontGb());
 		goods.setIsApp(TsfSession.getAttribute("isApp"));	//앱여부 true
 		goods.setSiteCd(TscConstants.Site.STYLE24.value());
-//		goods.setSoldoutGoodsDisplayYn(policyService.getSoldoutGoodsDisplayYn(TscConstants.Site.STYLE24.value())); // 품절상품노출여부
-//		goods.setPointUnit(policyService.getPointUnit(TscConstants.Site.STYLE24.value())); // 10:원단위절사(int)
-//		goods.setFloorUnit(policyService.getPointUnit(TscConstants.Site.STYLE24.value()));
+//		goods.setSoldoutGoodsDisplayYn(envsetService.getSoldoutGoodsDisplayYn(TscConstants.Site.STYLE24.value())); // 품절상품노출여부
+//		goods.setPointUnit(envsetService.getPointUnit(TscConstants.Site.STYLE24.value())); // 10:원단위절사(int)
+//		goods.setFloorUnit(envsetService.getPointUnit(TscConstants.Site.STYLE24.value()));
 		// 회원 구분
 		if (TsfSession.getInfo() != null) {
 			goods.setCustGb(TsfSession.getInfo().getCustGb());
@@ -179,4 +208,50 @@ public class TsfGoodsController extends TsfBaseController {
 		}
 	}
 
+	/**
+	 * 상품 쿠키 생성
+	 *
+	 * @param paramsGoods
+	 * @author eskim
+	 * @since 2021. 2. 17.
+	 */
+	private void setTodayGoodsCd(Goods paramsGoods) {
+		String ckGoodsCd = GagaCookieUtil.getCookie(TsfSession.getHttpServletRequest(), TsfConstants.CK_PREFIX + "_today_goodsCd");
+		//log.info("[detail] ckGoodsCd = {}", ckGoodsCd);
+		String arrGetCkGoodsCd[] = ckGoodsCd.split("\\,");
+		String setCkGoodsCd = "";
+		StringBuilder ckGoodsCdSb = new StringBuilder();
+		if (arrGetCkGoodsCd.length > 0) {
+			for (String cookieGoodsCd : arrGetCkGoodsCd) {
+				if (!cookieGoodsCd.equals(paramsGoods.getGoodsCd()) && !StringUtils.isBlank(cookieGoodsCd)) {
+					ckGoodsCdSb.append(cookieGoodsCd).append(",");
+				}
+			}
+			ckGoodsCdSb.insert(0, ",");
+			ckGoodsCdSb.insert(0, paramsGoods.getGoodsCd());
+		} else {
+			ckGoodsCdSb.append(paramsGoods.getGoodsCd()).append(",");
+		}
+		setCkGoodsCd = ckGoodsCdSb.toString();
+		setCkGoodsCd = setCkGoodsCd.substring(0, setCkGoodsCd.lastIndexOf(","));
+
+		// 오늘본 상품 최대 30개 처리
+		String arrSetCkGoodsCd[] = setCkGoodsCd.split("\\,");
+		if (arrSetCkGoodsCd.length > 30) {
+			ckGoodsCdSb.setLength(0);
+			for (String tempSetCkGoodsCd : arrSetCkGoodsCd) {
+				ckGoodsCdSb.append(tempSetCkGoodsCd).append(",");
+			}
+			setCkGoodsCd = ckGoodsCdSb.toString();
+			setCkGoodsCd = setCkGoodsCd.substring(0, setCkGoodsCd.lastIndexOf(","));
+		}
+
+		//log.info("[detail] setCkGoodsCd = {}", setCkGoodsCd);
+
+		//		if (isSslServer) {
+		//			GagaCookieUtil.setSecureCookie(TsfSession.getHttpServletResponse(), TsfConstants.CK_PREFIX + "_today_goodsCd", setCkGoodsCd, 1);
+		//		} else {
+		GagaCookieUtil.setCookie(TsfSession.getHttpServletResponse(), TsfConstants.CK_PREFIX + "_today_goodsCd", setCkGoodsCd, 24 * 60 * 60);
+		//		}
+	}
 }

+ 50 - 38
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -1,14 +1,19 @@
 package com.style24.front.biz.web;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
@@ -27,6 +32,7 @@ import com.style24.front.biz.service.TsfReviewService;
 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.Customer;
 import com.style24.persistence.domain.Order;
 
@@ -81,8 +87,12 @@ public class TsfMypageController extends TsfBaseController {
 	 * @since 2021. 02. 04
 	 */
 	@GetMapping({"/main/form", "/order/list/form"})
-	public ModelAndView mypageOrderListForm() {
+	public ModelAndView mypageOrderListForm(@RequestBody(required = false) Order order) {
 		ModelAndView mav = new ModelAndView();
+
+		if (order == null) {
+			order = new Order();
+		}
 		
 		// int custNo = TsfSession.getInfo().getCustNo();
 		int custNo = 1000007;
@@ -95,9 +105,9 @@ public class TsfMypageController extends TsfBaseController {
 		mav.addObject("customerInfo", coreCustomerService.getCustomerInfo(customer));
 
 		// 주문정보 조회
-		Order order = new Order();
+		// Order order = new Order();
+		
 		order.setCustNo(custNo);
-		mav.addObject("orderInfo", orderService.getOrderListForMypage(order));
 
 		// 쿠폰정보 조회
 		mav.addObject("couponCnt", coreOrderService.getCouponInfo(order));
@@ -111,42 +121,9 @@ public class TsfMypageController extends TsfBaseController {
 		// 상품권 정보 조회
 		mav.addObject("rmGfcdAmt", coreOrderService.getGiftcardInfo(order));
 
-		// 주문접수
-		order.setOrdDtlStat(TscConstants.OrderDetailStat.ORDER_RECEIPT.value());
-		mav.addObject("orderReceiptCount", orderService.getOrderStatCount(order));
-
-		// 결제완료
-		order.setOrdDtlStat(TscConstants.OrderDetailStat.PAYMENT_COMPLETE.value());
-		mav.addObject("paymentCompleteCount", orderService.getOrderStatCount(order));
-
-		// 상품준비중
-		order.setOrdDtlStat(TscConstants.OrderDetailStat.GOODS_PREPARE.value());
-		mav.addObject("goodsPrepareCount", orderService.getOrderStatCount(order));
-
-		// 배송중
-		order.setOrdDtlStat(TscConstants.OrderDetailStat.DELIVERY_PREPARE.value());
-		mav.addObject("shipPrepareCount", orderService.getOrderStatCount(order));
-
-		// 배송중
-		order.setOrdDtlStat(TscConstants.OrderDetailStat.SHIPPING.value());
-		mav.addObject("shippingCount", orderService.getOrderStatCount(order));
+		// 주문 상태 별 수량 조회
+		mav.addObject("orderCount", orderService.getOrderStatCount(order));
 
-		// 배송완료
-		order.setOrdDtlStat(TscConstants.OrderDetailStat.DELIVERY_COMPLETE.value());
-		mav.addObject("shipCompleteCount", orderService.getOrderStatCount(order));
-
-		// 취소내역
-		order.setChgStat(TscConstants.OrderChangeStat.CANCEL.value());
-		mav.addObject("cancelCount", orderService.getOrderChangeStatCount(order));
-
-		// 반품내역
-		order.setChgStat(TscConstants.OrderChangeStat.RETURN.value());
-		mav.addObject("returnCount", orderService.getOrderChangeStatCount(order));
-
-		// 교환내역
-		order.setChgStat(TscConstants.OrderChangeStat.EXCHANGE.value());
-		mav.addObject("exchangeCount", orderService.getOrderChangeStatCount(order));
-		
 		// 검색기간 설정
 		mav.addObject("searchPeriod", orderService.getSearchPeriod());
 
@@ -212,6 +189,41 @@ public class TsfMypageController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * 마이페이지 주문목록 조회
+	 * 
+	 * @param Order
+	 * @return ModelAndView
+	 * @author card007
+	 * @since 2021. 02. 18
+	 */
+	@PostMapping("/order/list")
+	@ResponseBody
+	public ModelAndView getOrderList(@RequestBody Order order) {
+		ModelAndView mav = new ModelAndView();
+
+		// 페이징 처리 설정
+		order.setPageable(new TscPageRequest(order.getPageNo() - 1, 5));
+
+		// 페이징 처리 및 주문정보 조회
+		List<Integer> ordNoList = new ArrayList<>();
+
+		for (Order tmpOrder : orderService.getPagingOrdNoList(order)) {
+			ordNoList.add(tmpOrder.getOrdNo());
+		}
+
+		if (ordNoList.size() > 0) {
+			order.setOrdNoList(ordNoList.stream().mapToInt(Integer::intValue).toArray());
+		}
+
+		mav.addObject("orderList", orderService.getOrderListForMypage(order));
+		mav.addObject("orderInfo", order);
+		
+		mav.setViewName(super.getDeviceViewName("mypage/MypageOrderList"));
+		
+		return mav;
+	}
+
 	/**
 	 * 마이페이지 주문상세 주문내역 삭제
 	 *

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

@@ -21,7 +21,8 @@ public class Coupon extends TscBaseDomain {
 	private int custNo;				// 회원번호
 	private int availDays;			// 쿠폰 다운로드 후 유효기간일
 	private int rdCpnId;			// 랜덤쿠폰번호
-	private int dcAmt;				// 할인금액
+	private int dcAmt;				// 할인적용금액
+	private int dcVal;				// 할인금액/율
 	private String useYn;			// 쿠폰 사용 여부
 	private String cpnNm;			// 쿠폰명
 	private String rdCpnNm;			// 시리얼쿠폰 키
@@ -32,4 +33,7 @@ public class Coupon extends TscBaseDomain {
 	private String availEddt;		// 쿠폰 유효일
 	private String endAlimYn;		// 쿠폰 종료 알림 여부
 	private String frontGb;			// 화면 구분
+	private String availYn;			// 지급 받은 쿠폰 사용 가능 유무
+	private String dcWay;			// 할인금액/율 구분
+	private String cpnDesc;			// 쿠폰설명
 }

+ 12 - 0
src/main/java/com/style24/persistence/domain/Goods.java

@@ -20,6 +20,7 @@ public class Goods extends TscBaseDomain {
 	private String brandCd;		//브랜드코드
 	private String itemkindCd;		//품목코드
 	private String goodsNm;		//상품명
+	private String goodsFullNm;		// 상품FULL명
 	private String goodsTnm;		//상품타이틀명
 	private String goodsSnm;		//상품검색명
 	private String goodsSnm1;		//상품검색명1(사용자등록용)
@@ -116,4 +117,15 @@ public class Goods extends TscBaseDomain {
 	private String optCd1;			// 옵션코드1
 	private int qty;				// 세트 상품 구성 수량
 
+	private String mobileYn;
+	private String delvResDt;		// 예약판매 출고예정일
+
+	//상품상세 구분(10:상품타이틀,20:상품타이틀내용,30:상품특징,40:상위컨텐츠,50:하위컨텐츠,60:상위컨텐츠-모바일,70:하위컨텐츠-모바일,80:상품상세(as-is,입점))
+	private String goodsTitle; 			// 10:상품타이틀
+	private String goodsTitleDesc;		// 20:상품타이틀내용
+	private String goodsSpecialDesc;	// 30:상품특징
+	private String goodsTopDesc;		// 40:상위컨텐츠, 60:상위컨텐츠-모바일
+	private String goodsDownDesc;		// 50:하위컨텐츠, 70:하위컨텐츠-모바일
+	private String goodsDesc;			// 80:상품상세(as-is,입점)
+
 }

+ 37 - 0
src/main/java/com/style24/persistence/domain/Lookbook.java

@@ -0,0 +1,37 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 룩북 Domain
+ *
+ * @author eskim
+ * @since 2021. 02. 18
+ */
+@SuppressWarnings("serial")
+@Data
+public class Lookbook extends TscBaseDomain {
+
+	private Integer lookbookSq;		// 룩북일련번호
+	private String brandCd;			// 브랜드코드(브랜드)
+	private String title;			// 제목
+	private String dispStdt;		// 노출시작일시
+	private String dispEddt;		// 노출종료일시
+	private String dispYn;			// 표시여부
+	private int dispOrd;			// 표시순서
+
+	private Integer lookbookbSq;	// 룩북배너일련번호
+	private String orgFileNm;		// 원본파일명
+	private String sysFileNm;		// 시스템파일명
+
+	Collection<LookbookGoods> lookbookGoodsList;	//베너별 상품목록
+	
+	private String goodsCd; 		// 상품상세검색용
+	private String frontGb; 		// 상품상세검색용
+	private String custGb; 			// 상품상세검색용
+
+}

+ 22 - 0
src/main/java/com/style24/persistence/domain/LookbookGoods.java

@@ -0,0 +1,22 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 룩북 베너별 상품 Domain
+ *
+ * @author eskim
+ * @since 2021. 02. 18
+ */
+@SuppressWarnings("serial")
+@Data
+public class LookbookGoods extends TscBaseDomain {
+
+	private Integer lookbookbSq;	// 룩북배너일련번호
+	private String goodsCd;			// 상품코드
+	private String delYn;			// 삭제여부
+	private int dispOrd;			// 표시순서
+
+}

+ 5 - 2
src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml

@@ -19,6 +19,10 @@
 		/* TsfCoupon.getSerialCpnUseInfo */
 		SELECT CC.CPN_ID
 			 , DATE_FORMAT(CC.USED_DT, '%Y-%m-%d') AS USED_DT
+			 , CASE WHEN NOW() BETWEEN CC.AVAIL_STDT AND CC.AVAIL_EDDT THEN 'Y'
+					ELSE 'N' END AS AVAIL_YN
+			 , DATE_FORMAT(CC.AVAIL_STDT, '%Y.%m.%d') AS AVAIL_STDT
+			 , DATE_FORMAT(CC.AVAIL_EDDT, '%Y.%m.%d') AS AVAIL_EDDT
 		FROM   TB_CUST_COUPON CC
 		WHERE  1=1
 		AND    CC.CPN_ID = #{cpnId}
@@ -30,6 +34,7 @@
 		/* TsfCoupon.getSearchSerialCpnInfo : 입력된 시리얼 쿠폰 정보 조회 */
 		SELECT CP.CPN_ID
 			 , CP.CPN_NM
+		     , CP.CPN_DESC
 		     , CP.DC_WAY
 			 , CASE WHEN #{frontGb} = 'P' THEN CP.DC_PVAL
 					WHEN #{frontGb} = 'M' THEN CP.DC_MVAL
@@ -40,8 +45,6 @@
 			     	ELSE DATE_FORMAT(CP.AVAIL_STDT, '%Y%m%d%H%i%S') END AS AVAIL_STDT
 			 , CASE WHEN CP.PD_GB = 'D' THEN DATE_FORMAT(DATE_ADD(NOW(), INTERVAL CP.AVAIL_DAYS DAY), '%Y%m%d%H%i%S')
 			     	ELSE  DATE_FORMAT(CP.AVAIL_EDDT, '%Y%m%d%H%i%S') END AS AVAIL_EDDT
-			 , CASE WHEN NOW() BETWEEN CP.DOWN_STDT AND CP.DOWN_EDDT THEN 'Y'
-					ELSE 'N' END AS downCanGb
 		FROM   TB_COUPON CP
 		INNER  JOIN TB_RANDOM_COUPON RC
 		ON     CP.CPN_ID = RC.CPN_ID

+ 137 - 14
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -82,8 +82,11 @@
 		SELECT G.GOODS_CD
 		     , G.GOODS_NM
 		     , G.GOODS_TNM
-		     , G.GOODS_NM
-		     , CONCAT(G.GOODS_TNM,' ',G.GOODS_NM) AS GOODS_TNM_FULL
+		     , CONCAT(IF(IFNULL(G.GOODS_GB,'') IN ('G073_11','G073_15', ''), '',CONCAT('[',FN_GET_CODE_NM('G073',G.GOODS_GB),']') )
+		             ,IF(G.FOREIGN_BUY_YN='N','[해외구매대행]','' )
+		             ,IF(G.PARALLEL_IMPORT_YN = 'Y','[병행수입]','')
+		             ,IF(G.ORDER_MADE_YN='Y','[주문제작]','')
+		             ,G.GOODS_NM ) AS GOODS_FULL_NM
 		     , G.BRAND_CD
 		     , (CASE WHEN B.DISP_NM_LANG = 'EN' THEN B.BRAND_ENM ELSE B.BRAND_KNM END) AS BRAND_NM
 		     , B.BRAND_GRP_NM
@@ -142,7 +145,7 @@
 		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
 		                      AND B.USE_YN = 'Y'
 		INNER JOIN (SELECT GOODS_CD, 
-		            FN_GET_BENEFIT_PRICE(#{siteCd},#{frontGb},GOODS_CD, CURR_PRICE,#{custGb},#{floorUnit},#{custGrade}) AS CURR_PRICE 
+		            FN_GET_BENEFIT_PRICE(#{frontGb},GOODS_CD, CURR_PRICE,#{custGb}) AS CURR_PRICE 
 		            FROM TB_GOODS
 		            WHERE GOODS_CD = #{goodsCd}) BP ON G.GOODS_CD = BP.GOODS_CD
 		LEFT OUTER JOIN TB_WISHLIST W ON G.GOODS_CD = W.GOODS_CD
@@ -203,13 +206,19 @@
 		SELECT GOODS_CD
 		     , OPT_CD1
 		     , STOCK_QTY
+		     , SOLDOUT_YN
+		     , DISP_ORD
+		     , SYS_IMG_NM
 		FROM (
 		     SELECT G.GOODS_CD
 		          , G.SELF_GOODS_YN
 		          , O.OPT_CD1 
 		          , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IF(G.SELF_GOODS_YN ='Y', O.OPT_CD1, '00') AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
-		          , IFNULL(S.STOCK_QTY,0) AS STOCK_QTY
-		          , G.MIN_ORD_QTY
+		          , (CASE WHEN IFNULL(S.STOCK_QTY,0) - G.MIN_ORD_QTY >= 0 THEN STOCK_QTY
+		                 ELSE 0
+		            END ) AS STOCK_QTY
+		          , S.SOLDOUT_YN
+		          , S.DISP_ORD
 		     FROM TB_GOODS G
 		     INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
 		                           AND B.USE_YN = 'Y'
@@ -219,22 +228,33 @@
 		                           , SUM(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
 		                                      ELSE CURR_STOCK_QTY
 		                                      END) AS STOCK_QTY
+		                           , MIN(SOLDOUT_YN) AS SOLDOUT_YN
+		                           , MIN(DISP_ORD) AS DISP_ORD
 		                      FROM VW_STOCK
 		                      WHERE DISP_YN = 'Y'
 		                      GROUP BY GOODS_CD, OPT_CD1) S ON G.GOODS_CD = S.GOODS_CD 
 		                                                    AND O.OPT_CD1 = S.OPT_CD1
 		     WHERE G.GOODS_CD = #{goodsCd})
 		     AND G.GOODS_TYPE = 'G056_N' -- 일반상품
-		     <if test='adminYn == null or adminYn != "Y"'>
-		     AND G.GOODS_STAT = 'G008_90'
-		     </if>
 		     ORDER BY O.DISP_ORD
-		)
+		) Z
+		WHERE 1 = 1
+		<if test='soldoutYn != null and soldoutYn == "Y"'>
+		AND (SOLDOUT_YN = 'Y'
+		     OR
+		     STOCK_QTY <![CDATA[<=]]> 0
+		    )
+		</if>
+		<if test='soldoutYn != null and soldoutYn == "N"'>
+		AND SOLDOUT_YN = 'N'
+		AND STOCK_QTY > 0
+		</if>
+		ORDER BY DISP_ORD
 	</select>
 	
-	<!-- 상품 사이즈 목록 -->
-	<select id="getGoodsSizeList" parameterType="Goods" resultType="GoodsStock">
-		/* TsfGoods.getGoodsSizeList */
+	<!-- 상품 옵션2 목록-->
+	<select id="getGoodsOption2List" parameterType="Goods" resultType="GoodsStock">
+		/* TsfGoods.getGoodsOption2List */
 		SELECT GOODS_CD
 		     , OPT_CD
 		     , OPT_CD1
@@ -272,6 +292,7 @@
 		                FROM VW_STOCK
 		                WHERE GOODS_CD = #{goodsCd}
 		                AND DISP_YN ='Y'
+		                AND OPT_CD2 IS NOT NULL
 		               ) A
 		        ) B
 		     ) Z
@@ -377,7 +398,7 @@
 		                            AND SB.USE_YN = 'Y'
 		                            AND SB.SITE_CD = #{siteCd}
 		INNER JOIN (SELECT GOODS_CD, 
-		            FN_GET_BENEFIT_PRICE(#{siteCd},#{frontGb},GOODS_CD,CURR_PRICE,#{custGb},#{floorUnit},#{custGrade}) AS CURR_PRICE 
+		            FN_GET_BENEFIT_PRICE(#{frontGb},GOODS_CD, CURR_PRICE,#{custGb}) AS CURR_PRICE 
 		            FROM TB_GOODS
 		            WHERE GOODS_CD = #{goodsCd}) BP ON G.GOODS_CD = BP.GOODS_CD
 		WHERE E.GOODS_CD = #{goodsCd}
@@ -465,7 +486,109 @@
 		      </if>
 		) A
 		<if test="rownum != null and rownum > 0 ">
-		LIMIT 1
+		WHERE RNUM = 1
 		</if>
 	</select>
+	
+	<!-- 상품예약판매정보 조회 -->
+	<select id="getGoodsResSell" parameterType="Goods" resultType="Goods">
+		/* TsfGoods.getGoodsResSell */
+		SELECT GOODS_CD
+		     , DATE_FORMAT(DELV_RES_DT ,'%Y년 %m월 %d일') AS DELV_RES_DT
+		FROM TB_GOODS_RES_SELL
+		WHERE GOODS_CD = #{goodsCd}
+		AND DELV_RES_DT > NOW()
+		ORDER BY DELV_RES_DT
+		LIMIT 1
+	</select>
+	
+	<!-- 룩북 베너 목록 조회 -->
+	<select id="getLookbookBannerList" parameterType="Lookbook" resultType="Lookbook">
+		/* TsfGoods.getLookbookBannerList */
+		SELECT A.LOOKBOOK_SQ
+		     , A.BRAND_CD
+		     , A.TITLE
+		     , B.LOOKBOOKB_SQ
+		     , B.SYS_FILE_NM
+		FROM TB_LOOKBOOK A
+		INNER JOIN TB_LOOKBOOK_BANNER B ON A.LOOKBOOK_SQ = B.LOOKBOOK_SQ 
+			                            AND B.DISP_YN = 'Y'
+			                            AND B.LOOKBOOKB_SQ IN (SELECT LOOKBOOKB_SQ FROM TB_LOOKBOOK_GOODS WHERE  GOODS_CD = #{goodsCd} AND DEL_YN  ='N')
+		WHERE NOW() BETWEEN A.DISP_STDT AND A.DISP_EDDT
+		AND A.DISP_YN  = 'Y'
+		ORDER BY A.DISP_ORD, B.DISP_ORD
+	</select>
+	
+	<!-- 룩북 베너 상품 목록 조회 -->
+	<select id="getLookbookBannerGoodsList" parameterType="Lookbook" resultType="Lookbook">
+		/* TsfGoods.getLookbookBannerGoodsList */
+		SELECT Z.*
+		     , 100 - ROUND((CURR_PRICE / LIST_PRICE) * 100 ,0) AS DC_RATE
+		FROM (
+		      SELECT A.LOOKBOOK_SQ
+		           , B.LOOKBOOKB_SQ 
+		           , C.GOODS_CD 
+		           , RANK() OVER(PARTITION BY A.LOOKBOOK_SQ, B.LOOKBOOKB_SQ  ORDER BY C.DISP_ORD ) RNUM 
+		           , C.DISP_ORD 
+		           , G.GOODS_NM
+		           , CONCAT(IF(IFNULL(G.GOODS_GB,'') IN ('G073_11','G073_15', ''), '',CONCAT('[',FN_GET_CODE_NM('G073',G.GOODS_GB),']') )
+		                   ,IF(G.FOREIGN_BUY_YN='N','[해외구매대행]','' )
+		                   ,IF(G.PARALLEL_IMPORT_YN = 'Y','[병행수입]','')
+		                   ,IF(G.ORDER_MADE_YN='Y','[주문제작]','')
+		                   ,G.GOODS_NM ) AS GOODS_FULL_NM
+		          , G.GOODS_STAT
+		          , G.MIN_ORD_QTY 
+		          , (CASE WHEN D.DISP_NM_LANG = 'EN' THEN D.BRAND_ENM ELSE D.BRAND_KNM END) AS BRAND_NM
+		          , G.LIST_PRICE
+		          , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD, G.CURR_PRICE,#{custGb}) AS CURR_PRICE
+		          , G.MAIN_COLOR_CD
+		          , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'00') AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
+		          , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'00') AND MOUSEOVER_IMG_YN = 'Y') AS SYS_IMG_NM2
+		          , S.STOCK_QTY
+		          , S.SOLDOUT_YN
+		          , V.VIDEO_GB_M
+		          , V.VIDEO_VAL_M
+		          , V.VIDEO_GB_S
+		          , V.VIDEO_VAL_S
+		      FROM TB_LOOKBOOK A
+		      INNER JOIN TB_LOOKBOOK_BANNER B ON A.LOOKBOOK_SQ = B.LOOKBOOK_SQ 
+		                                      AND B.DISP_YN = 'Y'
+		                                      AND B.LOOKBOOKB_SQ = #{lookbookbSq}
+		      INNER JOIN TB_LOOKBOOK_GOODS C ON B.LOOKBOOKB_SQ  = C.LOOKBOOKB_SQ 
+		      INNER JOIN TB_GOODS G ON C.GOODS_CD = G.GOODS_CD
+		                            AND G.GOODS_STAT = 'G008_90'
+		      INNER JOIN TB_BRAND D ON G.BRAND_CD = D.BRAND_CD
+		                    AND D.USE_YN = 'Y'
+		      LEFT OUTER JOIN (SELECT GOODS_CD
+		                            , SUM(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
+		                                       ELSE CURR_STOCK_QTY
+		                                       END) AS STOCK_QTY
+		                            , MIN(SOLDOUT_YN) AS SOLDOUT_YN
+		                       FROM VW_STOCK
+		                       WHERE DISP_YN = 'Y'
+		                       GROUP BY GOODS_CD) S ON G.GOODS_CD = S.GOODS_CD
+		      LEFT OUTER JOIN (SELECT MAX(GOODS_CD) AS GOODS_CD 
+		                             , MAX(CASE WHEN  RNUM = 1 THEN  VIDEO_GB END) AS  VIDEO_GB_M
+		                             , MAX(CASE WHEN  RNUM = 1 THEN  VIDEO_VAL END) AS  VIDEO_VAL_M
+		                             , MAX(CASE WHEN  RNUM = 2 THEN  VIDEO_GB END) AS  VIDEO_GB_S
+		                             , MAX(CASE WHEN  RNUM = 2 THEN  VIDEO_VAL END) AS  VIDEO_VAL_S
+		                       FROM (
+		                             SELECT A.DISPLOC_VAL AS GOODS_CD
+		                                  , B.VIDEO_GB 
+		                                  , B.VIDEO_VAL 
+		                                  , A.REG_DT 
+		                                  , RANK() OVER(PARTITION BY A.DISPLOC_VAL ORDER BY A.REG_DT ) RNUM 
+		                             FROM tb_video_disploc  A
+		                             INNER JOIN  tb_video B ON A.VIDEO_SQ = B.VIDEO_SQ 
+		                                                    AND B.DISP_YN ='Y'
+		                             WHERE A.DISPLOC_GB ='G'
+		                             AND A.DISP_YN = 'Y'
+		                            ) V
+		                       ) V ON G.GOODS_CD = V.GOODS_CD
+		      WHERE NOW() BETWEEN A.DISP_STDT AND A.DISP_EDDT
+		      AND A.DISP_YN  = 'Y'
+		      AND A.LOOKBOOK_SQ = #{lookbookSq}
+		) Z
+	</select>
+	
 </mapper>

+ 49 - 56
src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml

@@ -92,17 +92,9 @@
 			<if test="ordNo != null and ordNo != ''">
 		   AND O.ORD_NO = #{ordNo}
 			</if>
-			<choose>
-				<when test="stDate != null and stDate != '' and edDate != null and edDate != ''">
-		   AND O.ORD_DT BETWEEN DATE_FORMAT(CONCAT(#{stDate}, ' 000000'), '%Y-%m-%d %H%i%S') AND DATE_FORMAT(CONCAT(#{edDate}, ' 235959'), '%Y-%m-%d %H%i%S')
-				</when>
-				<otherwise>
-		   AND O.ORD_DT >= DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 3 MONTH) + INTERVAL 1 DAY, '%Y-%m-%d')
-				</otherwise>
-			</choose>
-			<if test="ordDtlNoArr != null">
-		   AND OD.ORD_DTL_NO IN
-				<foreach collection="ordDtlNoArr" item="item" index="index"  open="(" close=")" separator=",">
+			<if test="ordNoList != null">
+		   AND O.ORD_NO IN
+				<foreach collection="ordNoList" item="item" index="index"  open="(" close=")" separator=",">
 					#{item}
 				</foreach>
 			</if>
@@ -111,65 +103,63 @@
 		 ORDER BY OD.SUPPLY_COMP_CD
 				, OD.DELV_FEE_CD
 				, OD.ORD_NO DESC
+		        , OD.GIFT_PACK_YN DESC
 				, G.SELF_GOODS_YN DESC
 				, OD.SHOT_DELV_YN DESC
 				, OD.ORD_DTL_STAT
 	</select>
 
-	<!-- 마이페이지 주문상태 별 주문수량 조회 -->
-	<select id="getOrderStatCount" parameterType="Order" resultType="int">
+	<!-- 마이페이지 주문 상태 별 수량 조회 -->
+	<select id="getOrderStatCount" parameterType="Order" resultType="Order">
 		/* TscOrder.getOrderStatCount */
-		SELECT COUNT(*) CNT
-		  FROM TB_ORDER O
-		 INNER JOIN TB_ORDER_DETAIL OD
-		    ON O.ORD_NO = OD.ORD_NO
-		<where>
-			<choose>
-				<when test='custNo != null and custNo != ""'>
-		   AND O.CUST_NO  =  #{custNo}
-				</when>
-				<otherwise>
-		   AND O.ORD_NO = #{ordNo}
-		   AND O.ORD_NM = #{orderNm}
-				</otherwise>
-			</choose>
-		</where>
-		<if test="ordDtlStat == 'G013_60'">
-		   AND O.ORD_DT >= DATE_FORMAT(CURRENT_DATE - INTERVAL 1 WEEK, '%Y-%m-%d')
-		</if>
-		   AND OD.ORD_DTL_STAT = #{ordDtlStat}
-		   AND O.DISP_YN = 'Y'
-	</select>
-
-	<!-- 마이페이지 주문변경상태 별 주문수량 조회 -->
-	<select id="getOrderChangeStatCount" parameterType="Order" resultType="int">
-		/* TscOrder.getOrderChangeStatCount */
-		SELECT COUNT(*) CNT
-		  FROM TB_ORDER_CHANGE_DETAIL OCD
-		 INNER JOIN TB_ORDER_DETAIL OD
-		    ON OCD.ORD_DTL_NO = OD.ORD_DTL_NO
-		 INNER JOIN TB_ORDER O
-		    ON O.ORD_NO = OD.ORD_NO
+		SELECT SUM(Z.ORDER_RECEIPT)                          AS ORDER_RECEIPT_COUNT
+		     , SUM(Z.PAYMENT_COMPLETE)                       AS PAYMENT_COMPLETE_COUNT
+		     , SUM(Z.GOODS_PREPARE)                          AS GOODS_PREPARE_COUNT
+		     , SUM(Z.SHIP_PREPARE)                           AS SHIP_PREPARE_COUNT
+		     , SUM(Z.SHIPPING)                               AS SHIPPING_COUNT
+		     , SUM(Z.SHIP_COMPLETE)                          AS SHIP_COMPLETE_COUNT
+		     , SUM(Z.CANCEL_COUNT)                           AS CANCEL_COUNT
+		     , SUM(Z.EXCHANGE_COUNT + Z.EXCHANGE_WAIT_COUNT) AS EXCHANGE_COUNT
+		     , SUM(Z.RETURN_COUNT)                           AS RETURN_COUNT
+		  FROM (SELECT IFNULL(CASE OD.ORD_DTL_STAT WHEN 'G013_00' THEN 1
+							   END, 0) AS ORDER_RECEIPT
+					 , IFNULL(CASE OD.ORD_DTL_STAT WHEN 'G013_20' THEN 1
+							   END, 0) AS PAYMENT_COMPLETE
+					 , IFNULL(CASE OD.ORD_DTL_STAT WHEN 'G013_30' THEN 1
+							   END, 0) AS GOODS_PREPARE
+					 , IFNULL(CASE OD.ORD_DTL_STAT WHEN 'G013_40' THEN 1
+							   END, 0) AS SHIP_PREPARE
+					 , IFNULL(CASE OD.ORD_DTL_STAT WHEN 'G013_50' THEN 1
+							   END, 0) AS SHIPPING
+					 , IFNULL(CASE WHEN OD.ORD_DTL_STAT = 'G013_60'
+								    AND O.ORD_DT >= DATE_FORMAT(CURRENT_DATE - INTERVAL 1 WEEK, '%Y-%m-%d') THEN 1
+							   END, 0) AS SHIP_COMPLETE
+					 , IFNULL(CASE OCD.CHG_STAT WHEN 'G685_20' THEN 1
+							   END, 0) AS CANCEL_COUNT
+					 , IFNULL(CASE OCD.CHG_STAT WHEN 'G685_30' THEN 1
+							   END, 0) AS EXCHANGE_COUNT
+					 , IFNULL(CASE OCD.CHG_STAT WHEN 'G685_33' THEN 1
+							   END, 0) AS EXCHANGE_WAIT_COUNT
+					 , IFNULL(CASE OCD.CHG_STAT WHEN 'G685_40' THEN 1
+							   END, 0) AS RETURN_COUNT
+				  FROM TB_ORDER O
+				 INNER JOIN TB_ORDER_DETAIL OD
+					ON O.ORD_NO = OD.ORD_NO
+				  LEFT OUTER JOIN TB_ORDER_CHANGE_DETAIL OCD
+					ON OD.ORD_DTL_NO = OCD.ORD_DTL_NO
 		<where>
 			<choose>
 				<when test='custNo != null and custNo != ""'>
-		   AND O.CUST_NO  =  #{custNo}
+				   AND O.CUST_NO  =  #{custNo}
 				</when>
 				<otherwise>
-		   AND O.ORD_NO = #{ordNo}
-		   AND O.ORD_NM = #{orderNm}
+				   AND O.ORD_NO = #{ordNo}
+				   AND O.ORD_NM = #{orderNm}
 				</otherwise>
 			</choose>
 		</where>
-		<choose>
-			<when test="chgStat == 'G685_30'">
-		   AND OCD.CHG_STAT IN (#{chgStat}, 'G685_33')
-			</when>
-			<otherwise>
-		   AND OCD.CHG_STAT = #{chgStat}
-			</otherwise>
-		</choose>
-		   AND O.DISP_YN = 'Y'
+				   AND O.DISP_YN = 'Y'
+		) AS Z
 	</select>
 
 	<!-- 마이페이지 주문목록 페이징 처리 주문번호 조회 -->
@@ -181,6 +171,9 @@
 		  FROM TB_ORDER
 		 WHERE CUST_NO = #{custNo}
 		   AND DISP_YN = 'Y'
+		<if test="stDate != null and stDate != '' and edDate != null and edDate != ''">
+		   AND ORD_DT BETWEEN CONCAT(#{stDate}, ' 00:00:00') AND CONCAT(#{edDate}, ' 23:59:59')
+		</if>
 		<include refid="selectForPagingFooter"/>
 	</select>
 

+ 79 - 13
src/main/webapp/WEB-INF/views/web/cart/cartListAjaxFormWeb.html

@@ -322,22 +322,21 @@
         <div class="coupon_box">
             <div class="coupon">
                 <div>
-                    <p class="cp_name">
-                        TBJ 시즌오프 20% 할인쿠폰
-                    </p>
+                    <p class="cp_name"></p>
                     <p class="cp_cont">
-                        <span><em>12,399,900</em>원</span>
-                        <span><em>40%</em></span>
+                        <!--<span><em>12,399,900</em>원</span>
+                        <span><em>40%</em></span>-->
+                        <span class="cp_dc_val"></span>
                     </p>
                     <p class="cp_condition">
-                        500,000원 이상 구매 시 최대 50,000원 할인
-                        <span><em class="tag">99장 보유</em></span>
+                        <!--500,000원 이상 구매 시 최대 50,000원 할인
+                        <span><em class="tag">99장 보유</em></span>-->
                     </p>
                 </div>
                 <p class="cp_date">
-                    <span>2021.01.01</span>&nbsp;~&nbsp;<span>2021.12.30</span>
+                    <span class="availStdt"></span>&nbsp;~&nbsp;<span class="availEddt"></span>
                 </p>
-                <button type="button" class="btn_close_code">
+                <button type="button" class="btn_close_code" onClick="cancelCartCpn()">
                     <span>
                         <i class="ico ico_close1"></i>
                         <em class="sr-only">닫기</em>
@@ -410,13 +409,22 @@
 <!-- // CONT-BODY -->
 </form>
 
-<script type="text/javascript">
+<script th:inline="javascript">
     let sumRealPayAmt = [[${order.sumRealPayAmt}]];
     let totDcAmt = [[${order.totDcAmt}]];
+    let cartGoodsList = [[${order.cartGoodsList}]];
 
     $(document).ready(function() {
-        $("#sumRealPayAmt").text(Number(sumRealPayAmt).toLocaleString());
-        $("#totDcAmt").text(Number(totDcAmt).toLocaleString());
+        $(".area_salecoupon .coupon_box").hide();
+        /* TODO 로그인 안했으면 .area_salecoupon (할인코드 입력 부 및 쿠폰정보영역) hide 시킬것 */
+
+        // 다다익선 할인 대상(미적용) 리스트
+        notApplyTmtbAreaList();
+
+
+        /*$("#sumRealPayAmt").text(Number(sumRealPayAmt).toLocaleString());
+        $("#totDcAmt").text(Number(totDcAmt).toLocaleString());*/
+
         //$("#cartListForm").submit();
        /* $.ajax( {
             type: "POST",
@@ -430,6 +438,51 @@
         });*/
     });
 
+    function notApplyTmtbAreaList() {
+        let NotApplyQtyTmtbList = {tmtbSq : 0, tmtbNm : "", goodsList : new Array()};
+        let NotApplyAmtTmtbList = {tmtbSq : 0, tmtbNm : ""};
+
+        for(let i = 0 ; i < cartGoodsList.length ; i++) {
+            let cart = cartGoodsList[i];
+            let tmtbInfo = new Object;
+            let chk = false;
+            if(cart.applyQtySectionYn == "N") {     // 미적용된 다다익선
+                for (let j = 0; j < notApplyTmtbList.length; j++) {
+                    if(cart.qtyTmtbSq == notApplyTmtbList[j].tmtbSq) {
+                        chk = true;
+                        tmtbInfo = notApplyTmtbList[j];
+                    }
+                }
+
+                if(chk) {
+                    let goods = new Object();
+                    goods.brandNm = cart.brandNm;
+                    goods.goodsNm = cart.goodsNm;
+                    goods.sysImgNm = cart.sysImgNm;
+                    goods.currPrice = cart.currPrice;
+                    tmtbInfo.goodsList.push(goods);
+                } else {
+                    let aaa = {
+                        tmtbSq : cart.tmtbSq,
+                        tmtbNm : cart.tmtbNm,
+                        goodsList : new Array()
+                    };
+                }
+
+            }
+        }
+
+
+        /*[# th:each="order : ${order.cartGoodsList}"]*/
+        /*[/]*/
+    }
+
+    function cancelCartCpn() {
+        $("#sumRealPayAmt").text(Number(sumRealPayAmt).toLocaleString());
+        $("#totDcAmt").text(Number(totDcAmt).toLocaleString());
+        $(".area_salecoupon .coupon_box").hide();
+    }
+
     function serialCpnApply() {
         let testArr = [];
         $("#cartListForm input[name=cartSqArr]").each(function(index, item) {
@@ -450,9 +503,22 @@
             dataType : 'json',
             data : jsonData,
             success : function(result) {
-                alert(result.serialCpnInfo.result + " / " + result.serialCpnInfo.dcAmt);
+                $(".area_salecoupon .coupon_box").show();
+
+                // 합계 금액
                 $("#sumRealPayAmt").text(Number(sumRealPayAmt - result.serialCpnInfo.dcAmt).toLocaleString());
                 $("#totDcAmt").text(Number(totDcAmt - result.serialCpnInfo.dcAmt).toLocaleString());
+
+                // 쿠폰 정보
+                $(".area_salecoupon .cp_name").text(result.serialCpnInfo.cpnNm);
+                $(".area_salecoupon .cp_condition").html(result.serialCpnInfo.cpnDesc + "<span><em class='tag'>1장 보유</em></span>");
+                $(".area_salecoupon .availStdt").text(result.serialCpnInfo.availStdt);
+                $(".area_salecoupon .availEddt").text(result.serialCpnInfo.availEddt);
+                if(result.serialCpnInfo.dcWay == "G240_10") {
+                    $(".area_salecoupon .cp_dc_val").html( "<em>" + Number(result.serialCpnInfo.dcVal).toLocaleString() + "</em> 원");
+                } else if (result.serialCpnInfo.dcWay == "G240_11") {
+                    $(".area_salecoupon .cp_dc_val").html( "<em>" + result.serialCpnInfo.dcVal + "%</em>");
+                }
             }
         });
     };

+ 11 - 8
src/main/webapp/WEB-INF/views/web/common/layout/MypageLayoutWeb.html

@@ -45,14 +45,17 @@
 					</div>
 					<div class="lnb_list">
 						<ul id="mypageLnbList">
-							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_ORDER_LIST);">주문확인/배송조회</a></li>
-							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_CRS_LIST);">취소/반품/환불내역</a></li>
-							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_RESTOCK);">재입고 알림 내역</a></li>
-							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_REVIEW);">리뷰</a></li>
-							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_DELIVERY_ADDR);">배송지 관리</a></li>
-							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_WISHLIST);">위시리스트</a></li>
-							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_CUSTOMER);">내정보 관리</a></li>
-							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_SECEDE);">회원 탈퇴</a></li>
+							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE_ORDER_LIST);">주문확인/배송조회</a></li>
+							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE_CRS_LIST);">취소/반품/환불내역</a></li>
+							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE_RESTOCK);">재입고 알림 내역</a></li>
+							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE_COUPON);">쿠폰</a></li>
+							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE_POINT);">STYLE24 포인트</a></li>
+							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE_GIFTCARD);">상품권</a></li>
+							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE_REVIEW);">리뷰</a></li>
+							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE_DELIVERY_ADDR);">배송지 관리</a></li>
+							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE_WISHLIST);">위시리스트</a></li>
+							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE_CUSTOMER);">내정보 관리</a></li>
+							<li><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE_SECEDE);">회원 탈퇴</a></li>
 						</ul>
 					</div>
 				</div>

+ 82 - 25
src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html

@@ -28,25 +28,26 @@
 			<button type="button" class="btn btn_default od_del_btn" onclick="fnDeleteOrder()"><span>주문 내역 삭제</span></button>
 		</div>
 		<div class="sec_body">
-			<div class="order_list">
+			<div class="order_list" id="orderList">
 				<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_label01" th:if="${oneData.selfGoodsYn == 'N'}">업체직배송</span>
-								<span class="order_label01" th:if="${oneData.shotDelvYn == 'N' and oneData.selfGoodsYn == 'Y'}">STYLE24 일반배송</span>
+
+								<!-- 배송구분 설정 -->
 								<span class="order_label02" th:if="${oneData.shotDelvYn == 'Y'}">총알배송</span>
-								<a href="" class="detail_btn">주문상세보기</a>
+								<span class="order_label01" th:if="${oneData.shotDelvYn == 'N' and oneData.selfGoodsYn == 'Y'}">STYLE24 일반배송</span>
+								<span class="order_label01" th:if="${oneData.selfGoodsYn == 'N'}">업체직배송</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}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
-								<input type="hidden" name="ordDtlNo" th:value="${order.ordDtlNo}"/>
-								<input type="hidden" name="ordDtlStat" th:value="${order.ordDtlStat}"/>
+							<th:block th:if="${oneData.ordDtlStatList}" th:each="ordDtlStat, status : ${oneData.ordDtlStatList}">
 								<div class="tbl type2">
 									<table>
 										<colgroup>
@@ -54,6 +55,7 @@
 											<col width="180">
 										</colgroup>
 										<tbody>
+										<th:block th:if="${ordDtlStat.orderList}" th:each="order, status : ${ordDtlStat.orderList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
 											<tr class="bundle_row">
 												<td>
 													<div class="info_item">
@@ -83,7 +85,8 @@
 														</div>
 													</div>
 												</td>
-												<td class="merge_row"> <!-- 같은 데이터 노출시 동일 영역끼리 병합 : 클래스명 merge_row 추가 -->
+												<!-- 주문 -->
+												<td class="merge_row" th:unless="${oneData.giftPackYn == 'Y'}">
 													<div class="delivery">
 														<p class="dlvr_staus" th:text="${order.ordDtlStatNm}"></p>
 														<p class="dlvr_desc" th:if="${order.delvEddt}" th:text="|${order.delvEddt}일 도착|"></p>
@@ -91,29 +94,83 @@
 													<div class="tbl_btn_wrap case02">
 														<button type="button" class="btn btn_default btn_sm"><span>교환</span></button>
 														<button type="button" class="btn btn_default btn_sm"><span>반품/취소</span></button>
-														<button type="button" class="btn btn_default btn_sm" th:if="${order.reviewSq == 0}"><span>리뷰작성</span></button>
+														<button type="button" class="btn btn_default btn_sm"><span>리뷰작성</span></button>
+													</div>
+												</td>
+												<td class="merge_row" th:if="${oneData.giftPackYn == 'Y' and #strings.isEmpty(order.recipBaseAddr)}">
+													<div class="delivery">
+														<p class="dlvr_staus c_primary">주소 입력 대기</p>
+														<p class="dlvr_desc" th:text="|남은 기간 ${order.giftLimitDay}일|"></p>
+														<p class="dlvr_desc" th:text="|(${order.giftLimitDt}까지)|"></p>
+													</div>
+													<div class="tbl_btn_wrap case02">
+														<button type="button" class="btn btn_dark btn_sm"><span>SMS 재전송</span></button>
+													</div>
+												</td>
+												<td class="merge_row" th:if="${oneData.giftPackYn == 'Y' and !#strings.isEmpty(order.recipBaseAddr)}">
+													<div class="delivery">
+														<p class="dlvr_staus c_primary">선물 완료</p>
+														<p class="dlvr_desc" th:text="|(${order.giftCompleteDt})|"></p>
+													</div>
+													<div class="tbl_btn_wrap case02">
 													</div>
 												</td>
 											</tr>
+										</th:block>
 										</tbody>
 									</table>
 								</div>
-								<div class="order_confirm" th:if="${order.ordDtlStatBanner == 'Y'}">
-									<p class="cf_txt cf_desc c_primary" th:if="${order.ordDtlStat == 'G013_00' or order.ordDtlStat == 'G013_10' or order.ordDtlStat == 'G013_11'}">주문 완료 / 결제를 기다리고 있습니다.</p> <!-- button 없이 텍스트만 있을 경우 cf_desc c_primary class 추가 -->
-									<p class="cf_txt cf_desc c_primary" th:if="${order.ordDtlStat == 'G013_20' or order.ordDtlStat == 'G013_30' or order.ordDtlStat == 'G013_35'}">배송할 상품을 준비 중입니다.</p>
-									<p class="cf_txt cf_desc c_primary" th:if="${order.ordDtlStat == 'G013_40'}">상품준비가 완료되어 곧 배송될 예정입니다.</p>
-									<p class="cf_txt cf_desc c_primary" th:if="${order.ordDtlStat == 'G013_50' or order.ordDtlStat == 'G013_55'}" th:text="|${order.shipCompNm} / ${order.invoiceNo}|"></p>
-									<button type="button" class="btn btn_primary" th:if="${order.ordDtlStat == 'G013_50' or order.ordDtlStat == 'G013_55'}">배송조회</button>
-									<p class="cf_txt cf_desc c_primary" th:if="${order.ordDtlStat == 'G013_60'}" th:text="|${order.purchaseConfirmDay}일 후 자동으로 구매확정|"></p>
-									<button type="button" class="btn btn_primary" th:if="${order.ordDtlStat == 'G013_60'}" onclick="fnDecideOrder(this);">구매확정 하기</button>
-									<p class="cf_txt cf_desc c_primary" th:if="${order.ordDtlStat == 'G013_70' and order.reviewSq == 0}">리뷰를 작성하면 다른 구매자에게 도움이 될 수 있습니다.</p>
-									<button type="button" class="btn btn_primary" th:if="${order.ordDtlStat == 'G013_70' and order.reviewSq == 0}">리뷰작성</button>
-									<p class="cf_txt cf_desc c_primary" th:if="${order.ordDtlStat == 'G013_70' and order.reviewSq > 0}">주문내역 다시 구매하기 위해</p>
-									<button type="button" class="btn btn_primary" th:if="${order.ordDtlStat == 'G013_70' and order.reviewSq > 0}">장바구니 담기</button>
-								</div>
+								<th:block th:if="${ordDtlStat.ordDtlStatBanner == 'Y'}">
+									<!-- 주문 -->
+									<th:block th:unless="${oneData.giftPackYn == 'Y'}">
+										<div class="order_confirm" th:if="${ordDtlStat.ordDtlStat == 'G013_00' or ordDtlStat.ordDtlStat == 'G013_10' or ordDtlStat.ordDtlStat == 'G013_11'}">
+											<span class="cf_txt">주문 완료 / 결제를 기다리고 있습니다.</span>
+										</div>
+										<div class="order_confirm" th:if="${ordDtlStat.ordDtlStat == 'G013_20' or ordDtlStat.ordDtlStat == 'G013_30' or ordDtlStat.ordDtlStat == 'G013_35'}">
+											<span class="cf_txt">배송할 상품을 준비 중입니다.</span>
+										</div>
+										<div class="order_confirm" th:if="${ordDtlStat.ordDtlStat == 'G013_40'}">
+											<span class="cf_txt">상품준비가 완료되어 곧 배송될 예정입니다.</span>
+										</div>
+										<div class="order_confirm" th:if="${ordDtlStat.ordDtlStat == 'G013_50' or ordDtlStat.ordDtlStat == 'G013_55'}">
+											<span class="cf_txt" th:text="|${ordDtlStat.shipCompNm} / ${ordDtlStat.invoiceNo}|"></span>
+											<button type="button" class="btn btn_primary">배송조회</button>
+										</div>
+										<div class="order_confirm" th:if="${ordDtlStat.ordDtlStat == 'G013_60'}">
+											<span class="cf_txt" th:text="|${ordDtlStat.purchaseConfirmDay}일 후 자동으로 구매확정|"></span>
+											<button type="button" class="btn btn_primary">구매확정 하기</button>
+										</div>
+										<div class="order_confirm" th:if="${ordDtlStat.ordDtlStat == 'G013_70' and ordDtlStat.reviewSq == 0}">
+											<span class="cf_txt">리뷰를 작성하면 다른 구매자에게 도움이 될 수 있습니다.</span>
+											<button type="button" class="btn btn_primary">리뷰작성</button>
+										</div>
+										<div class="order_confirm" th:if="${ordDtlStat.ordDtlStat == 'G013_70' and ordDtlStat.reviewSq > 0}">
+											<span class="cf_txt">주문내역 다시 구매하기 위해</span>
+											<button type="button" class="btn btn_primary">장바구니 담기</button>
+										</div>
+									</th:block>
+
+									<!-- 선물 -->
+									<th:block th:if="${oneData.giftPackYn == 'Y'}">
+										<div class="order_confirm" th:if="${#strings.isEmpty(ordDtlStat.recipBaseAddr) and ordDtlStat.giftLimitDay >= 0}">
+											<span class="cf_txt" th:text="|${ordDtlStat.recipNm}님이 주소를 입력하기 전입니다. (입력기한 ${ordDtlStat.giftLimitDt})|"></span>
+										</div>
+										<div class="order_confirm" th:unless="${#strings.isEmpty(ordDtlStat.recipBaseAddr)}">
+											<span class="cf_txt" th:text="|${ordDtlStat.recipNm}님께 선물이 발송되었습니다.|"></span>
+										</div>
+										<div class="order_confirm" th:if="${#strings.isEmpty(ordDtlStat.recipBaseAddr) and ordDtlStat.giftLimitDay < 0}">
+											<span class="cf_txt">주소입력 기한이 경과되어 선물이 취소 되었습니다.</span>
+										</div>
+									</th:block>
+								</th:block>
 							</th:block>
 						</div>
 					</th:block>
+
+					<!-- 주문 없을 때 -->
+					<th:block th:unless="${orderList}" th:each="oneData, status : ${orderList}">
+
+					</th:block>
 				</section>
 				<section class="order_row" th:if="${paymentInfo.payMeans == 'G014_20'}">
 					<div class="order_tit">
@@ -376,7 +433,7 @@
 				gagajf.ajaxJsonSubmit('/mypage/order/decision'
 					, jsonData
 					, function() {
-						cfnGoToPage(_PAGE_ORDER_DETAIL + ordNo);
+						cfnGoToPage(_PAGE_MYPAGE_ORDER_DETAIL + ordNo);
 					});
 			}
 		});
@@ -387,7 +444,7 @@
 		fnSetMypageLnbList(1);
 		
 		// 마이페이지 location 설정
-		fnSetMypageLocation('주문확인/배송조회', '_PAGE_ORDER_LIST', '주문상세');
+		fnSetMypageLocation('주문확인/배송조회', '_PAGE_MYPAGE_ORDER_LIST', '주문상세');
 	});
 	
 </script>

+ 74 - 176
src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListFormWeb.html

@@ -53,32 +53,32 @@
 				<ul class="clear">
 					<li>
 						<p class="or_p">주문접수</p>
-						<p class="count"><span th:text="${orderReceiptCount}">0</span></p>
+						<p class="count"><span th:text="${orderCount.orderReceiptCount}">0</span></p>
 					</li>
 					<li>
 						<p class="or_p">결제완료</p>
-						<p class="count"><span th:text="${paymentCompleteCount}">0</span></p>
+						<p class="count"><span th:text="${orderCount.paymentCompleteCount}">0</span></p>
 					</li>
 					<li>
 						<p class="or_p">상품 준비 중</p>
-						<p class="count"><span th:text="${goodsPrepareCount}">0</span></p>
+						<p class="count"><span th:text="${orderCount.goodsPrepareCount}">0</span></p>
 					</li>
 					<li>
 						<p class="or_p">배송 준비 중</p>
-						<p class="count"><span th:text="${shipPrepareCount}">0</span></p>
+						<p class="count"><span th:text="${orderCount.shipPrepareCount}">0</span></p>
 					</li>
 					<li>
 						<p class="or_p">배송 중</p>
-						<p class="count"><span th:text="${shippingCount}">0</span></p>
+						<p class="count"><span th:text="${orderCount.shippingCount}">0</span></p>
 					</li>
 					<li>
 						<p class="or_p">배송 완료</p>
-						<p class="count"><span th:text="${shipCompleteCount}">0</span></p>
+						<p class="count"><span th:text="${orderCount.shipCompleteCount}">0</span></p>
 					</li>
 				</ul>
 				<div class="order_right">
 					<p class="or_p">취소/교환/반품</p>
-					<p class="count"><span th:text="${cancelCount + returnCount + exchangeCount}">0</span></p>
+					<p class="count"><span th:text="${orderCount.cancelCount + orderCount.returnCount + orderCount.exchangeCount}">0</span></p>
 				</div>
 			</div>
 			<!-- //주문 경로 -->
@@ -89,189 +89,28 @@
 					<input type="checkbox" name="month" value="최근 1개월" id="chk01" onclick="fnSetSearchPeriod(1);">
 					<label for="chk01">최근 1개월</label>
 					<input type="checkbox" name="month" value="최근 3개월" id="chk02" onclick="fnSetSearchPeriod(3);">
-					<label for="chk02">최근 2개월</label>
+					<label for="chk02">최근 3개월</label>
 					<input type="checkbox" name="month" value="최근 6개월" id="chk03" onclick="fnSetSearchPeriod(6);">
-					<label for="chk03">최근 3개월</label>
+					<label for="chk03">최근 6개월</label>
 				</div>
 				<div class="sch_right">
 					<div class="sch_datepicker sb">
-						<input type="text" class="n_input my_datepicker" name="stDate" value="" th:placeholder="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}" id="stDate">
+						<input type="text" class="n_input my_datepicker" name="stDate" value="" id="stDate">
 					</div>
 					<div class="sch_datepicker">
-						<input type="text" class="n_input my_datepicker" name="edDate" value="" th:placeholder="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}" id="edDate">
+						<input type="text" class="n_input my_datepicker" name="edDate" value="" id="edDate">
 					</div>
-					<button type="button" class="btn btn_dark">조회</button>
+					<button type="button" class="btn btn_dark" onclick="fnSearchOrderList();">조회</button>
 				</div>
 			</div>
 			<!-- //주문조회 검색 -->
-			<div class="order_list">
-				<th:block th:if="${orderInfo}" th:each="oneData, status : ${orderInfo}">
-					<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_method" th:if="${oneData.shotDelvYn == 'Y'}">총알배송</span>
-							<span class="order_method" th:if="${oneData.shotDelvYn == 'N' and oneData.selfGoodsYn == 'Y'}">일반배송</span>
-							<span class="order_method" th:if="${oneData.selfGoodsYn == 'N'}">업체직배송</span>
-							<!-- //배송구분 설정 -->
-							<a href="javascript:void(0)" class="detail_btn" th:attr="ordNo=${oneData.ordNo}" onclick="fnGoToOrderDetail(this)">주문상세보기</a>
-						</div>
-						<div class="tbl type2">
-							<table>
-								<colgroup>
-									<col width="840">
-									<col width="180">
-									<col width="*">
-								</colgroup>
-								<tbody>
-									<th:block th:if="${oneData.orderList}" th:each="order, status : ${oneData.orderList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
-										<tr>
-											<td class="">
-												<div class="info_item">
-													<div class="thumb_box">
-														<a href="">
-															<img th:src="${imageUrl + '/' + order.sysImgNm}" width="100%" alt="">
-														</a>
-													</div>
-													<div class="info_box">
-														<p class="od_name">
-															<a href="">
-																<span class="brand" th:text="${order.brandNm}"></span>
-																<span class="name" th:text="${order.goodsNm}"></span>
-															</a>
-														</p>
-														<p class="od_opt">
-															<span class="option">옵션:<em th:text="${order.optCd}"></em></span>
-															<span class="count">수량:<em th:text="${order.ordQty}"></em>개</span>
-														</p>
-													</div>
-													<div class="info_calc">
-														<p class="price">
-															<span class="selling_price" th:text="|${#numbers.formatInteger(order.ordAmt, 1, 'COMMA')}원|"></span>
-														</p>
-														<p class="point"><span th:text="${#numbers.formatInteger(order.savePntAmt, 1, 'COMMA')}"></span>p</p>
-													</div>
-												</div>
-											</td>
-											<td class="" th:if="${order.rowspan > 0}" th:rowspan="${order.rowspan}">
-												<div class="delivery">
-													<!-- 주문 -->
-													<th:block th:unless="${oneData.giftPackYn == 'Y'}">
-														<p class="dlvr_staus" th:text="${order.ordDtlStatNm}"></p>
-														<p class="dlvr_desc" th:if="${order.delvEddt}" th:text="|${order.delvEddt}일 도착|"></p>
-													</th:block>
-													<!-- //주문 -->
-
-													<!-- 선물 -->
-													<th:block th:if="${oneData.giftPackYn == 'Y'}">
-														<!-- 주소 입력 전 -->
-														<th:block th:if="${#strings.isEmpty(order.recipBaseAddr)}">
-															<p class="dlvr_staus c_primary">주소 입력 대기</p>
-															<p class="dlvr_desc" th:text="|남은 기간 ${order.giftLimitDay}일|"></p>
-															<p class="dlvr_desc" th:text="|(${order.giftLimitDt}까지)|"></p>
-														</th:block>
-														<!-- 주소 입력 후 -->
-														<th:block th:unless="${#strings.isEmpty(order.recipBaseAddr)}">
-															<p class="dlvr_staus c_primary">선물 완료</p>
-															<p class="dlvr_desc" th:text="|(${order.giftCompleteDt})|"></p>
-														</th:block>
-													</th:block>
-													<!-- //선물 -->
-												</div>
-											</td>
-											<td class="" th:if="${order.rowspan > 0}" th:rowspan="${order.rowspan}">
-												<div class="tbl_btn_wrap case02">
-													<ul>
-														<!-- 주문 -->
-														<th:block th:unless="${oneData.giftPackYn == 'Y'}">
-															<li><button type="button" class="btn btn_default btn_sm"><span>교환</span></button></li>
-															<li><button type="button" class="btn btn_default btn_sm"><span>반품/취소</span></button></li>
-															<li th:if="${order.reviewSq == 0}"><button type="button" class="btn btn_dark btn_sm"><span>리뷰작성</span></button></li>
-														</th:block>
-														<!-- //주문 -->
-														
-														<!-- 선물 -->
-														<th:block th:if="${oneData.giftPackYn == 'Y'}">
-															<li><button type="button" class="btn btn_dark btn_sm" th:if="${#strings.isEmpty(order.recipBaseAddr)}"><span>SMS 재전송</span></button></li>
-														</th:block>
-														<!-- //선물 -->
-													</ul>
-												</div>
-											</td>
-										</tr>
-										<th:block th:if="${order.ordDtlStatBanner == 'Y'}">
-											<!-- 주문 -->
-											<th:block th:unless="${oneData.giftPackYn == 'Y'}">
-												<tr>
-													<td colspan="4">
-														<div class="order_confirm" th:if="${order.ordDtlStat == 'G013_00' or order.ordDtlStat == 'G013_10' or order.ordDtlStat == 'G013_11'}">
-															<span class="cf_txt">주문 완료 / 결제를 기다리고 있습니다.</span>
-														</div>
-														<div class="order_confirm" th:if="${order.ordDtlStat == 'G013_20' or order.ordDtlStat == 'G013_30' or order.ordDtlStat == 'G013_35'}">
-															<span class="cf_txt">배송할 상품을 준비 중입니다.</span>
-														</div>
-														<div class="order_confirm" th:if="${order.ordDtlStat == 'G013_40'}">
-															<span class="cf_txt">상품준비가 완료되어 곧 배송될 예정입니다.</span>
-														</div>
-														<div class="order_confirm" th:if="${order.ordDtlStat == 'G013_50' or order.ordDtlStat == 'G013_55'}">
-															<span class="cf_txt" th:text="|${order.shipCompNm} / ${order.invoiceNo}|"></span>
-															<button type="button" class="btn btn_primary">배송조회</button>
-														</div>
-														<div class="order_confirm" th:if="${order.ordDtlStat == 'G013_60'}">
-															<span class="cf_txt" th:text="|${order.purchaseConfirmDay}일 후 자동으로 구매확정|"></span>
-															<button type="button" class="btn btn_primary">구매확정 하기</button>
-														</div>
-														<div class="order_confirm" th:if="${order.ordDtlStat == 'G013_70' and order.reviewSq == 0}">
-															<span class="cf_txt">리뷰를 작성하면 다른 구매자에게 도움이 될 수 있습니다.</span>
-															<button type="button" class="btn btn_primary">리뷰작성</button>
-														</div>
-														<div class="order_confirm" th:if="${order.ordDtlStat == 'G013_70' and order.reviewSq > 0}">
-															<span class="cf_txt">주문내역 다시 구매하기 위해</span>
-															<button type="button" class="btn btn_primary">장바구니 담기</button>
-														</div>
-													</td>
-												</tr>
-											</th:block>
-
-											<!-- 선물 -->
-											<th:block th:if="${oneData.giftPackYn == 'Y'}">
-												<tr>
-													<td colspan="4">
-														<div class="order_confirm" th:if="${#strings.isEmpty(order.recipBaseAddr) and order.giftLimitDay >= 0}">
-															<span class="cf_txt" th:text="|${order.recipNm}님이 주소를 입력하기 전입니다. (입력기한 ${order.giftLimitDt})|"></span>
-														</div>
-														<div class="order_confirm" th:unless="${#strings.isEmpty(order.recipBaseAddr)}">
-															<span class="cf_txt" th:text="|${order.recipNm}님께 선물이 발송되었습니다.|"></span>
-														</div>
-														<div class="order_confirm" th:if="${#strings.isEmpty(order.recipBaseAddr) and order.giftLimitDay < 0}">
-															<span class="cf_txt">주소입력 기한이 경과되어 선물이 취소 되었습니다.</span>
-														</div>
-													</td>
-												</tr>
-											</th:block>
-										</th:block>
-									</th:block>
-								</tbody>
-							</table>
-						</div>
-					</div>
-				</th:block>
-
-				<!-- 주문 없을 때 -->
-				<th:block th:unless="${orderInfo}" th:each="oneData, status : ${orderInfo}">
-
-				</th:block>
+			<div class="order_list" id="orderList">
 			</div>
 		</div>
 	</div>
 <script src="/ux/plugins/gaga/gaga.paging.js"></script>
 <script th:inline="javascript">
+	let customerInfo = [[${customerInfo}]];
 /*<![CDATA[*/
 	$(document).ready(function() {
 		// 마이페이지 LNB 설정
@@ -282,13 +121,18 @@
 		
 		// datepicker 설정
 		$(".my_datepicker").datepicker();
+		
+		// 주문 리스트 조회
+		fnSearchOrderList(1);
 	});
 	
+	// 주문상세보기 버튼 클릭 이벤트 처리
 	var fnGoToOrderDetail = function(param) {
 		let ordNo = $(param).attr('ordNo');
-		cfnGoToPage(_PAGE_ORDER_DETAIL + ordNo);
+		cfnGoToPage(_PAGE_MYPAGE_ORDER_DETAIL + ordNo);
 	}
 	
+	// 검색기간 버튼 클릭 이벤트 처리
 	var fnSetSearchPeriod = function(period) {
 		let date = new Date();
 		$('#edDate').val(date.getFullYear() + '-' + ('0' + (date.getMonth() + 1)).slice(-2) + '-' + ('0' + (date.getDate() + 1)).slice(-2));
@@ -296,6 +140,60 @@
 		$('#stDate').val(date.getFullYear() + '-' + ('0' + (date.getMonth() + 1)).slice(-2) + '-' + ('0' + (date.getDate() + 1)).slice(-2));
 	}
 	
+	// 주문 목록 조회
+	var fnSearchOrderList = function(pageNo) {
+		if (pageNo == null) {
+			pageNo = $('#pageNo').val();
+		}
+		let stDate = $('#stDate').val();
+		let edDate = $('#edDate').val();
+		//let ordDtlStat = $('#ordDtlStat').val();
+		
+		let data = {};
+		data.pageNo = pageNo;
+		data.stDate = stDate;
+		data.edDate = edDate;
+		data.custNo = customerInfo.custNo;
+		//data.ordDtlStat = ordDtlStat;
+		
+		let jsonData = JSON.stringify(data)
+		
+		$.ajax( {
+			type		: "POST",
+			url 		: '/mypage/order/list',
+			data		: jsonData,
+			dataType 	: 'html',
+			beforeSend : function(xhr, settings) {
+				// AJAX call
+				xhr.setRequestHeader("AJAX", "true");
+				
+				// dataType: "json"일 때
+				xhr.setRequestHeader('Accept', 'application/json');
+				xhr.setRequestHeader('Content-Type', 'application/json');
+				
+				// Button disabled & progressBar creation
+				gagajf.showProgressbar(true);
+			},
+			success 	: function(result) {
+				$('#orderList').html(result);
+				fnMergeRow();
+			}
+		});
+	}
+	
+	// rowspan 처리
+	var fnMergeRow = function() {
+		$(".merge_row").each(function() {
+			var txt = $(this).text();
+			var rows = $(this).parents("table").find(".merge_row:contains('" + txt + "')");
+			//console.log(txt);
+			//console.log(rows);
+			if (rows.length > 1) {
+				rows.eq(0).attr("rowspan", rows.length);
+				rows.not(":eq(0)").remove();
+			}
+		});
+	}
 /*]]>*/
 </script>
 

+ 176 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListWeb.html

@@ -0,0 +1,176 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : MypageOrderListWeb.html
+ * @desc    : 마이페이지 > 주문확인/배송조회 주문리스트 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.18   card007     최초 작성
+ *******************************************************************************
+ -->
+<th:block th:if="${orderList}" th:each="oneData, status : ${orderList}">
+	<input type="hidden" th:value="${orderInfo.pageNo}" id="pageNo"/>
+	<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.shotDelvYn == 'Y'}">총알배송</span>
+			<span class="order_label01" th:if="${oneData.shotDelvYn == 'N' and oneData.selfGoodsYn == 'Y'}">STYLE24 일반배송</span>
+			<span class="order_label01" th:if="${oneData.selfGoodsYn == 'N'}">업체직배송</span>
+			<!-- //배송구분 설정 -->
+			<a href="javascript:void(0)" class="detail_btn" th:attr="ordNo=${oneData.ordNo}" onclick="fnGoToOrderDetail(this)">주문상세보기</a>
+		</div>
+		<th:block th:if="${oneData.ordDtlStatList}" th:each="ordDtlStat, status : ${oneData.ordDtlStatList}">
+			<div class="tbl type2">
+				<table>
+					<colgroup>
+						<col width="1020">
+						<col width="180">
+					</colgroup>
+					<tbody>
+						<th:block th:if="${ordDtlStat.orderList}" th:each="order, status : ${ordDtlStat.orderList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
+						<tr class="bundle_row">
+							<td>
+								<div class="info_item">
+									<div class="thumb_box">
+										<a href="">
+											<img th:src="${imageUrl + '/' + order.sysImgNm}" width="100%" alt="">
+										</a>
+									</div>
+									<div class="info_box">
+										<p class="od_name">
+											<a href="">
+												<span class="brand" th:text="${order.brandNm}"></span>
+												<span class="name" th:text="${order.goodsNm}"></span>
+											</a>
+										</p>
+										<p class="od_opt">
+											<span class="option"><em th:text="${order.optCd1}"></em><em th:text="${order.optCd2}"></em></span>
+											<span class="count">수량 <em th:text="${order.ordQty}"></em>개</span>
+										</p>
+									</div>
+									<div class="info_calc">
+										<p class="price">
+											<span class="selling_price" th:text="|${#numbers.formatInteger(order.ordAmt, 1, 'COMMA')}원|"></span>
+										</p>
+										<p class="point"><span th:text="${#numbers.formatInteger(order.savePntAmt, 1, 'COMMA')}"></span>p</p>
+									</div>
+								</div>
+							</td>
+							<!--  <td class="" th:if="${order.rowspan > 0}" th:rowspan="${order.rowspan}">  -->
+							<!-- 주문 -->
+							<td class="merge_row" th:unless="${oneData.giftPackYn == 'Y'}">
+								<div class="delivery">
+									<p class="dlvr_staus" th:text="${order.ordDtlStatNm}"></p>
+									<p class="dlvr_desc" th:if="${order.delvEddt}" th:text="|${order.delvEddt}일 도착|"></p>
+								</div>
+								<div class="tbl_btn_wrap case02">
+									<button type="button" class="btn btn_default btn_sm"><span>교환</span></button>
+									<button type="button" class="btn btn_default btn_sm"><span>반품/취소</span></button>
+									<button type="button" class="btn btn_default btn_sm"><span>리뷰작성</span></button>
+								</div>
+							</td>
+							<td class="merge_row" th:if="${oneData.giftPackYn == 'Y' and #strings.isEmpty(order.recipBaseAddr)}">
+								<div class="delivery">
+									<p class="dlvr_staus c_primary">주소 입력 대기</p>
+									<p class="dlvr_desc" th:text="|남은 기간 ${order.giftLimitDay}일|"></p>
+									<p class="dlvr_desc" th:text="|(${order.giftLimitDt}까지)|"></p>
+								</div>
+								<div class="tbl_btn_wrap case02">
+									<button type="button" class="btn btn_dark btn_sm"><span>SMS 재전송</span></button>
+								</div>
+							</td>
+							<td class="merge_row" th:if="${oneData.giftPackYn == 'Y' and !#strings.isEmpty(order.recipBaseAddr)}">
+								<div class="delivery">
+									<p class="dlvr_staus c_primary">선물 완료</p>
+									<p class="dlvr_desc" th:text="|(${order.giftCompleteDt})|"></p>
+								</div>
+								<div class="tbl_btn_wrap case02">
+								</div>
+							</td>
+						</tr>
+						</th:block>
+					</tbody>
+				</table>
+			</div>
+			<th:block th:if="${ordDtlStat.ordDtlStatBanner == 'Y'}">
+				<!-- 주문 -->
+				<th:block th:unless="${oneData.giftPackYn == 'Y'}">
+					<div class="order_confirm" th:if="${ordDtlStat.ordDtlStat == 'G013_00' or ordDtlStat.ordDtlStat == 'G013_10' or ordDtlStat.ordDtlStat == 'G013_11'}">
+						<span class="cf_txt">주문 완료 / 결제를 기다리고 있습니다.</span>
+					</div>
+					<div class="order_confirm" th:if="${ordDtlStat.ordDtlStat == 'G013_20' or ordDtlStat.ordDtlStat == 'G013_30' or ordDtlStat.ordDtlStat == 'G013_35'}">
+						<span class="cf_txt">배송할 상품을 준비 중입니다.</span>
+					</div>
+					<div class="order_confirm" th:if="${ordDtlStat.ordDtlStat == 'G013_40'}">
+						<span class="cf_txt">상품준비가 완료되어 곧 배송될 예정입니다.</span>
+					</div>
+					<div class="order_confirm" th:if="${ordDtlStat.ordDtlStat == 'G013_50' or ordDtlStat.ordDtlStat == 'G013_55'}">
+						<span class="cf_txt" th:text="|${ordDtlStat.shipCompNm} / ${ordDtlStat.invoiceNo}|"></span>
+						<button type="button" class="btn btn_primary">배송조회</button>
+					</div>
+					<div class="order_confirm" th:if="${ordDtlStat.ordDtlStat == 'G013_60'}">
+						<span class="cf_txt" th:text="|${ordDtlStat.purchaseConfirmDay}일 후 자동으로 구매확정|"></span>
+						<button type="button" class="btn btn_primary">구매확정 하기</button>
+					</div>
+					<div class="order_confirm" th:if="${ordDtlStat.ordDtlStat == 'G013_70' and ordDtlStat.reviewSq == 0}">
+						<span class="cf_txt">리뷰를 작성하면 다른 구매자에게 도움이 될 수 있습니다.</span>
+						<button type="button" class="btn btn_primary">리뷰작성</button>
+					</div>
+					<div class="order_confirm" th:if="${ordDtlStat.ordDtlStat == 'G013_70' and ordDtlStat.reviewSq > 0}">
+						<span class="cf_txt">주문내역 다시 구매하기 위해</span>
+						<button type="button" class="btn btn_primary">장바구니 담기</button>
+					</div>
+				</th:block>
+	
+				<!-- 선물 -->
+				<th:block th:if="${oneData.giftPackYn == 'Y'}">
+					<div class="order_confirm" th:if="${#strings.isEmpty(ordDtlStat.recipBaseAddr) and ordDtlStat.giftLimitDay >= 0}">
+						<span class="cf_txt" th:text="|${ordDtlStat.recipNm}님이 주소를 입력하기 전입니다. (입력기한 ${ordDtlStat.giftLimitDt})|"></span>
+					</div>
+					<div class="order_confirm" th:unless="${#strings.isEmpty(ordDtlStat.recipBaseAddr)}">
+						<span class="cf_txt" th:text="|${ordDtlStat.recipNm}님께 선물이 발송되었습니다.|"></span>
+					</div>
+					<div class="order_confirm" th:if="${#strings.isEmpty(ordDtlStat.recipBaseAddr) and ordDtlStat.giftLimitDay < 0}">
+						<span class="cf_txt">주소입력 기한이 경과되어 선물이 취소 되었습니다.</span>
+					</div>
+				</th:block>
+			</th:block>
+		</th:block>
+	</div>
+</th:block>
+
+<!-- 주문 없을 때 -->
+<th:block th:unless="${orderList}" th:each="oneData, status : ${orderList}">
+
+</th:block>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	$(document).ready(function() {
+		$(".merge_row").each(function() {
+			var txt = $(this).text();
+			var rows = $(this).parents(".merge").find(".merge_row:contains('" + txt + "')");
+			console.log(txt);
+			console.log(rows.length);
+			if (rows.length > 1) {
+				rows.eq(0).attr("rowspan", rows.length);
+				rows.not(":eq(0)").remove();
+			}
+		});
+	});
+/*]]>*/
+</script>
+
+</html>

+ 2 - 0
src/main/webapp/ux/pc/js/common-ui.js

@@ -272,6 +272,8 @@ $(document).ready( function() {
 	$(".merge_row").each(function() {
 		var txt = $(this).text();
 		var rows = $(this).parents("table").find(".merge_row:contains('" + txt + "')");
+		console.log(txt);
+		console.log(rows.length);
 		if (rows.length > 1) {
 			rows.eq(0).attr("rowspan", rows.length);
 			rows.not(":eq(0)").remove();

+ 12 - 9
src/main/webapp/ux/style24_link.js

@@ -25,15 +25,18 @@ const _PAGE_CUSTOMER_DORMANT = _frontUrl + "/customer/dormant/certify/form";
 
 //== 마이페이지 ==/
 const _PAGE_MYPAGE = _frontUrl + "/mypage/main/form";							// 마이페이지 > 메인
-const _PAGE_ORDER_LIST = _frontUrl + "/mypage/order/list/form";					// 마이페이지 > 주문확인/배송조회
-const _PAGE_ORDER_DETAIL = _frontUrl + "/mypage/order/detail/form/";			// 마이페이지 > 주문/배송 상세
-const _PAGE_CRS_LIST = _frontUrl + "/mypage/crs/list/form";						// 마이페이지 > 취소/교환/반품 목록
-const _PAGE_RESTOCK = _frontUrl + "/mypage/restock/form";						// 마이페이지 > 재입고 알림 내역
-const _PAGE_REVIEW = _frontUrl + "/mypage/review/form";							// 마이페이지 > 리뷰
-const _PAGE_DELIVERY_ADDR = _frontUrl + "/mypage/delivery/addr/form";			// 마이페이지 > 배송지 관리
-const _PAGE_WISHLIST = _frontUrl + "/mypage/wish/list/form";					// 마이페이지 > 위시리스트
-const _PAGE_CUSTOMER = _frontUrl + "/mypage/customer/form";						// 마이페이지 > 내정보 관리
-const _PAGE_SECEDE = _frontUrl + "/mypage/customer/secede/form";				// 마이페이지 > 회원탈퇴
+const _PAGE_MYPAGE_ORDER_LIST = _frontUrl + "/mypage/order/list/form";			// 마이페이지 > 주문확인/배송조회
+const _PAGE_MYPAGE_ORDER_DETAIL = _frontUrl + "/mypage/order/detail/form/";		// 마이페이지 > 주문/배송 상세
+const _PAGE_MYPAGE_CRS_LIST = _frontUrl + "/mypage/crs/list/form";				// 마이페이지 > 취소/교환/반품 목록
+const _PAGE_MYPAGE_RESTOCK = _frontUrl + "/mypage/restock/form";				// 마이페이지 > 재입고 알림 내역
+const _PAGE_MYPAGE_COUPON = _frontUrl + "/mypage/coupon/form";					// 마이페이지 > 재입고 알림 내역
+const _PAGE_MYPAGE_POINT = _frontUrl + "/mypage/point/form";					// 마이페이지 > 재입고 알림 내역
+const _PAGE_MYPAGE_GIFTCARD = _frontUrl + "/mypage/gift/card/form";				// 마이페이지 > 재입고 알림 내역
+const _PAGE_MYPAGE_REVIEW = _frontUrl + "/mypage/review/form";					// 마이페이지 > 리뷰
+const _PAGE_MYPAGE_DELIVERY_ADDR = _frontUrl + "/mypage/delivery/addr/form";	// 마이페이지 > 배송지 관리
+const _PAGE_MYPAGE_WISHLIST = _frontUrl + "/mypage/wish/list/form";				// 마이페이지 > 위시리스트
+const _PAGE_MYPAGE_CUSTOMER = _frontUrl + "/mypage/customer/form";				// 마이페이지 > 내정보 관리
+const _PAGE_MYPAGE_SECEDE = _frontUrl + "/mypage/customer/secede/form";			// 마이페이지 > 회원탈퇴
 
 //== 검색 ==/