فهرست منبع

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

gagamel 5 سال پیش
والد
کامیت
f0dc14a5bd
31فایلهای تغییر یافته به همراه2393 افزوده شده و 1171 حذف شده
  1. 7 7
      src/main/java/com/style24/front/biz/dao/TsfOrderDao.java
  2. 66 180
      src/main/java/com/style24/front/biz/service/TsfCartService.java
  3. 20 50
      src/main/java/com/style24/front/biz/service/TsfCouponService.java
  4. 70 25
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  5. 88 64
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  6. 2 3
      src/main/java/com/style24/front/biz/web/TsfCartController.java
  7. 62 14
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  8. 120 52
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  9. 26 29
      src/main/java/com/style24/front/biz/web/TsfOrderController.java
  10. 1 1
      src/main/java/com/style24/front/support/config/TsfWebMvcConfig.java
  11. 7 1
      src/main/java/com/style24/persistence/domain/Coupon.java
  12. 2 1
      src/main/java/com/style24/persistence/domain/Goods.java
  13. 187 53
      src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml
  14. 5 2
      src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml
  15. 23 13
      src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml
  16. 12 8
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  17. 73 57
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml
  18. 292 96
      src/main/webapp/WEB-INF/views/web/cart/cartListAjaxFormWeb.html
  19. 15 19
      src/main/webapp/WEB-INF/views/web/cart/cartListFormWeb.html
  20. 13 16
      src/main/webapp/WEB-INF/views/web/common/layout/MypageLayoutWeb.html
  21. 84 0
      src/main/webapp/WEB-INF/views/web/customer/JoinCompleteFormWeb.html
  22. 28 10
      src/main/webapp/WEB-INF/views/web/customer/JoinFormWeb.html
  23. 291 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageExchangeFormWeb.html
  24. 140 103
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html
  25. 105 176
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListFormWeb.html
  26. 168 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListWeb.html
  27. 5 5
      src/main/webapp/WEB-INF/views/web/order/OrderDelvMemoChangePopWeb.html
  28. 87 29
      src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html
  29. 148 148
      src/main/webapp/WEB-INF/views/web/order/OrderNoMemberWeb.html
  30. 234 0
      src/main/webapp/ux/pc/js/cart.js
  31. 12 9
      src/main/webapp/ux/style24_link.js

+ 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);
 
 	/**
 	 * 마이페이지 주문상세 금액정보 조회

+ 66 - 180
src/main/java/com/style24/front/biz/service/TsfCartService.java

@@ -244,52 +244,10 @@ public class TsfCartService {
 		// 장바구니 상품 조회
 		Collection<Order> cartGoodsList = cartDao.getCartGoodsList(order);
 
-		// 품절체크
+		// 품절 아닌 상품만 체크
 		for(Order goods : cartGoodsList) {
-			// 상품 재고 확인
-			GoodsStock checkParam = new GoodsStock();
-
-			String stockResult = "";
-			// 세트 상품일 경우
-			if(TscConstants.GoodsType.SET.value().equals(goods.getGoodsType())) {
-				Order tempItem = new Order();
-				// 세트 구성품이 여러개일 경우
-				if (goods.getItemCd().contains(",")) {
-					tempItem.setItemCdArr(goods.getItemCd().split(","));
-					tempItem.setOptCdArr(goods.getOptCd().split(","));
-					for(int i = 0 ; i < tempItem.getItemCdArr().length ; i++) {
-						checkParam.setGoodsCd(goods.getGoodsCd());
-						checkParam.setItemCd(tempItem.getItemCdArr()[i]);
-						checkParam.setOptCd(tempItem.getOptCdArr()[i]);
-						checkParam.setGoodsQty(goods.getGoodsQty());
-						checkParam.setGoodsType(goods.getGoodsType());
-						stockResult = goodsService.getCheckStock(checkParam);
-					}
-				} else {		// 세트 구성품이 하나일 경우
-					checkParam.setGoodsCd(goods.getGoodsCd());
-					checkParam.setItemCd(goods.getItemCd());
-					checkParam.setOptCd(goods.getOptCd());
-					checkParam.setGoodsQty(goods.getGoodsQty());
-					checkParam.setGoodsType(goods.getGoodsType());
-					stockResult = goodsService.getCheckStock(checkParam);
-				}
-			} else {
-				// 세트상품이 아닐 경우
-				checkParam.setGoodsCd(goods.getGoodsCd());
-				checkParam.setItemCd(goods.getItemCd());
-				checkParam.setOptCd(goods.getOptCd());
-				checkParam.setGoodsQty(goods.getGoodsQty());
-				checkParam.setGoodsType(goods.getGoodsType());
-				stockResult = goodsService.getCheckStock(checkParam);
-			}
-
-			//String stockResult = "SUCCESS";
-
-			if("SUCCESS".equals(stockResult)) {
-				goods.setSoldoutYn("N");
+			if("N".equals(goods.getSoldoutYn())) {
 				cartSqs.add(goods.getCartSq());
-			} else {
-				goods.setSoldoutYn("Y");
 			}
 		}
 
@@ -311,6 +269,13 @@ public class TsfCartService {
 					cart.setAmtTmtbSq(info.getAmtTmtbSq());
 				}
 			}
+			if(cart.getCartSq() == 8) {
+				log.info("CHECK CART >> {}, {}, {}",cart.getCurrPrice(),cart.getGoodsQty(), cart.getTmtbDcAmt());
+			}
+
+			if(cart.getTmtbDcAmt() == 0) {
+				cart.setTmtbDcAmt(cart.getCurrPrice() * cart.getGoodsQty());
+			}
 		}
 
 		// 장바구니 업체별 배송비 계산
@@ -339,56 +304,58 @@ public class TsfCartService {
 		Collection<Order> cartGoodsList = coreOrderService.getCartGoodsList(param);
 
 		// 장바구니 내 수량 다다익선 적용 가능 리스트 조회 (등록된 기본,적용 상품 정보 전체 조회)
-		param.setApplyGb(TscConstants.ApplyGb.QTY.value());
-		Collection<Order> tmtbQtyApplyList = cartDao.selectMoreBetterApplyCartList(param);
-
-		// 장바구니에 담긴 상품 금액 즉시할인가를 tmtbApplyList 에 저장 (추후 계산식을 위함)
-		for(Order cart : cartGoodsList) {
-			for(Order apply : tmtbQtyApplyList) {
-				if(cart.getCartSq() == apply.getCartSq()) {
-					apply.setCurrPrice(cart.getCurrPrice() + cart.getOptAddPrice());        /* 즉시할인 적용가 */
-				}
-			}
-		}
+		Collection<Order> tmtbApplyList = cartDao.selectMoreBetterApplyCartList(param);
 
-		// 장바구니 등록 수량 다다익선 일련번호 지정
+		// 장바구니 등록 다다익선 일련번호 지정
+		List<Integer> applySq = new ArrayList<Integer>();
 		List<Integer> qtyApplySq = new ArrayList<Integer>();
-		for(Order tmtbApply : tmtbQtyApplyList) {
-			if(TscConstants.GoodsGb.BASE.value().equals(tmtbApply.getGoodsGb())) {
-				qtyApplySq.add(tmtbApply.getTmtbSq());
-			}
-		}
-		param.setTmtbSqs(qtyApplySq.stream().mapToInt(Integer::intValue).toArray());
-
-		// 장바구니 등록 다다익선 총합 금액
-		Collection<Order> tmtbQtySumDataList = cartDao.selectApplyMoreBetterCartInfoList(param);
-		// 기본상품 목록에 총합 데이터 등록
-		for(Order applyInfo : tmtbQtyApplyList) {
-			for(Order tmtbSumInfo : tmtbQtySumDataList) {
-				if(applyInfo.getTmtbSq() == tmtbSumInfo.getTmtbSq()) {
-					applyInfo.setTmtbSumAmt(tmtbSumInfo.getTmtbSumAmt());
-					applyInfo.setTmtbSumQty(tmtbSumInfo.getTmtbSumQty());
+		List<Integer> amtApplySq = new ArrayList<Integer>();
+		for(Order tmtbApply : tmtbApplyList) {
+			if(TscConstants.GoodsGb.BASE.value().equals(tmtbApply.getQtyGoodsGb()) || TscConstants.GoodsGb.BASE.value().equals(tmtbApply.getAmtGoodsGb())) {
+				if(tmtbApply.getQtyTmtbSq() > 0) {
+					applySq.add(tmtbApply.getQtyTmtbSq());
+				}
+				if(tmtbApply.getAmtTmtbSq() > 0) {
+					applySq.add(tmtbApply.getAmtTmtbSq());
 				}
 			}
 		}
+		param.setTmtbSqs(applySq.stream().mapToInt(Integer::intValue).toArray());
 
 		// 섹션 정보 조회 후 할인 여부 판단
-		Collection<Order> tmtbQtySectionList = cartDao.selectTmtbSectionValList(qtyApplySq);
-		for(Order applyInfo : tmtbQtyApplyList) {						// 기준 상품 및 다다익선 정보 조회
-			for(Order section : tmtbQtySectionList) {						// 다다익선 할인 조건 조회
-				if(applyInfo.getTmtbSq() == section.getTmtbSq()) {
-					if(TscConstants.ApplyGb.QTY.value().equals(applyInfo.getApplyGb())) {		// 수량 적용
-						if(section.getSectionVal() <= applyInfo.getTmtbSumQty()) {				// 장바구니 수량 할인 기준 달성시
-							if(applyInfo.getSectionVal() <= section.getSectionVal()) {			// 기존 달성된 기준치보다 할인폭이 클 경우 기준할인 수정
-								applyInfo.setSectionVal(section.getSectionVal());
-								applyInfo.setApplyQtySectionYn("Y");
-								applyInfo.setDcWay(section.getDcWay());
-								applyInfo.setDcVal(section.getDcVal());
-							}
-						} else {
-							if(applyInfo.getSectionVal() < 1 && applyInfo.getGoodsGb().equals(TscConstants.GoodsGb.BASE.value())) {
-								applyInfo.setApplyQtySectionYn("N");
-							}
+		Collection<Order> tmtbQtySectionList = cartDao.selectTmtbSectionValList(applySq);
+		for(Order applyInfo : tmtbApplyList) {								// 기준 상품 및 다다익선 정보 조회
+			// 다다익선 할인 조건 조회
+			for(Order section : tmtbQtySectionList) {
+				if(applyInfo.getQtyTmtbSq() == section.getTmtbSq()) {
+
+					// 수량 적용 다다익선
+					if (section.getSectionVal() <= applyInfo.getQtyTmtbSumQty()) {                // 장바구니 수량 할인 기준 달성시
+						if (applyInfo.getSectionVal() <= section.getSectionVal()) {            // 기존 달성된 기준치보다 할인폭이 클 경우 기준할인 수정
+							applyInfo.setSectionVal(section.getSectionVal());
+							applyInfo.setApplyQtySectionYn("Y");
+							applyInfo.setDcWay(section.getDcWay());
+							applyInfo.setDcVal(section.getDcVal());
+						}
+					} else {
+						if (applyInfo.getSectionVal() < 1 && applyInfo.getQtyGoodsGb().equals(TscConstants.GoodsGb.BASE.value())) {
+							applyInfo.setApplyQtySectionYn("N");
+						}
+					}
+				}
+
+				if(applyInfo.getAmtTmtbSq() == section.getTmtbSq()) {
+					// 금액 적용 다다익선
+					if(section.getSectionVal() <= applyInfo.getAmtTmtbSumAmt()) {				// 장바구니 수량 할인 기준 달성시
+						if(applyInfo.getSectionVal() <= section.getSectionVal()) {			// 기존 달성된 기준치보다 할인폭이 클 경우 기준할인 수정
+							applyInfo.setSectionVal(section.getSectionVal());
+							applyInfo.setApplyAmtSectionYn("Y");
+							applyInfo.setDcWay(section.getDcWay());
+							applyInfo.setDcVal(section.getDcVal());
+						}
+					} else {
+						if(applyInfo.getSectionVal() < 1 && applyInfo.getAmtGoodsGb().equals(TscConstants.GoodsGb.BASE.value())) {
+							applyInfo.setApplyAmtSectionYn("N");
 						}
 					}
 				}
@@ -398,11 +365,11 @@ public class TsfCartService {
 		// 수량 다다익선 적용 상품 할인 금액 계산
 		int leftAmt = 0;
 		int i = 0;
-		for(Order resultAmt : tmtbQtyApplyList) {
+		for(Order resultAmt : tmtbApplyList) {
 			if("Y".equals(resultAmt.getApplyQtySectionYn())) {
 				if (TscConstants.DcWay.AMT.value().equals(resultAmt.getDcWay())) {        // 할인 방식 금액일경우
 					i++;
-					int tempAmt = resultAmt.getCurrPrice() * resultAmt.getGoodsQty();
+					int tempAmt = resultAmt.getCurrPrice();
 					if (i == 1) {
 						leftAmt = resultAmt.getDcVal();
 					}
@@ -417,105 +384,23 @@ public class TsfCartService {
 						resultAmt.setTmtbDcAmt(tempAmt - (int)tempDcAmt);
 					}
 				} else {                                                                // 할인 방식 할인율일 경우
-					int tempAmt = resultAmt.getCurrPrice() * resultAmt.getGoodsQty();
+					int tempAmt = resultAmt.getCurrPrice();
 					tempAmt = (int) (tempAmt - (tempAmt * (resultAmt.getDcVal() / 100.0)));
 					resultAmt.setTmtbDcAmt(tempAmt);
 				}
 			}
-		}
-
-		// 장바구니 정보에 수량 다다익선 정보 입력
-		for(Order cart : cartGoodsList) {
-			for(Order apply : tmtbQtyApplyList) {
-				if(cart.getCartSq() == apply.getCartSq()) {
-					cart.setTmtbDcAmt(apply.getTmtbDcAmt());
-					cart.setApplyQtySectionYn(apply.getApplyQtySectionYn());
-					cart.setQtyTmtbNm(apply.getTmtbNm());
-					cart.setQtyTmtbSq(apply.getTmtbSq());
-				}
-			}
-		}
-
-		// 장바구니 내 금액 다다익선 적용 가능 리스트 조회 (등록된 기본,적용 상품 정보 전체 조회)
-		param.setApplyGb(TscConstants.ApplyGb.AMT.value());
-		Collection<Order> tmtbAmtApplyList = cartDao.selectMoreBetterApplyCartList(param);
-
-		// 장바구니에 담긴 상품 금액 즉시할인가를 tmtbAmtApplyList 에 저장 (추후 계산식을 위함)
-		for(Order cart : cartGoodsList) {
-			for(Order apply : tmtbAmtApplyList) {
-				if(cart.getCartSq() == apply.getCartSq()) {
-					if (StringUtils.isEmpty(cart.getQtyTmtbNm())) {
-						apply.setCurrPrice((cart.getCurrPrice() + cart.getOptAddPrice()) * cart.getGoodsQty());
-					} else {
-						apply.setCurrPrice(cart.getTmtbDcAmt());                                                    /* 수량 다다익선 할인된 금액 적용 */
-					}
-				}
-			}
-		}
-
-		// 장바구니 등록 수량 다다익선 일련번호 지정
-		List<Integer> amtApplySq = new ArrayList<Integer>();
-		for(Order tmtbApply : tmtbAmtApplyList) {
-			if(TscConstants.GoodsGb.BASE.value().equals(tmtbApply.getGoodsGb())) {
-				amtApplySq.add(tmtbApply.getTmtbSq());
-			}
-		}
-		param.setTmtbSqs(amtApplySq.stream().mapToInt(Integer::intValue).toArray());
 
-		// 장바구니 등록 금액 다다익선 총합 금액
-		Collection<Order> tmtbAmtSumDataList = cartDao.selectApplyMoreBetterCartInfoList(param);
-
-		Map<Integer, Integer> tmtbAmtSumData = new HashMap<Integer, Integer>();		// 각 상품별 할인 금액을 다다익선별 SUM하기 위한 MAP
-		for(Order applyInfo : tmtbAmtApplyList) {
-			// SUM AMT는 할인된 금액으로 묶어야함.
-			if(tmtbAmtSumData.get(applyInfo.getTmtbSq()) != null && tmtbAmtSumData.get(applyInfo.getTmtbSq()) > 0) {
-				tmtbAmtSumData.put(applyInfo.getTmtbSq(), tmtbAmtSumData.get(applyInfo.getTmtbSq()) + applyInfo.getCurrPrice());
+			if(resultAmt.getTmtbDcAmt() > 0) {
+				resultAmt.setCurrPrice(resultAmt.getTmtbDcAmt());
 			} else {
-				tmtbAmtSumData.put(applyInfo.getTmtbSq(), applyInfo.getCurrPrice());
-			}
-		}
-
-		// 기본상품 목록에 총합 데이터 등록
-		for(Order applyInfo : tmtbAmtApplyList) {
-			for(Order tmtbSumInfo : tmtbAmtSumDataList) {
-				if(applyInfo.getTmtbSq() == tmtbSumInfo.getTmtbSq()) {
-					applyInfo.setTmtbSumQty(tmtbSumInfo.getTmtbSumQty());
-
-					if(tmtbAmtSumData.get(applyInfo.getTmtbSq()) != null && tmtbAmtSumData.get(applyInfo.getTmtbSq()) > 0) {
-						applyInfo.setTmtbSumAmt(tmtbAmtSumData.get(applyInfo.getTmtbSq()));
-					}
-				}
-			}
-		}
-
-
-		// 섹션 정보 조회 후 할인 여부 판단
-		Collection<Order> tmtbAmtSectionList = cartDao.selectTmtbSectionValList(amtApplySq);
-		for(Order applyInfo : tmtbAmtApplyList) {					// 기준 상품 및 다다익선 정보 조회
-			for(Order section : tmtbAmtSectionList) {					// 다다익선 할인 조건 조회
-				if(applyInfo.getTmtbSq() == section.getTmtbSq()) {
-					if (TscConstants.ApplyGb.AMT.value().equals(applyInfo.getApplyGb())) {
-						if(section.getSectionVal() <= applyInfo.getTmtbSumAmt()) {				// 장바구니 수량 할인 기준 달성시
-							if(applyInfo.getSectionVal() <= section.getSectionVal()) {			// 기존 달성된 기준치보다 할인폭이 클 경우 기준할인 수정
-								applyInfo.setSectionVal(section.getSectionVal());
-								applyInfo.setApplyAmtSectionYn("Y");
-								applyInfo.setDcWay(section.getDcWay());
-								applyInfo.setDcVal(section.getDcVal());
-							}
-						} else {
-							if(applyInfo.getSectionVal() < 1 && applyInfo.getGoodsGb().equals(TscConstants.GoodsGb.BASE.value())) {
-								applyInfo.setApplyAmtSectionYn("N");
-							}
-						}
-					}
-				}
+				resultAmt.setCurrPrice(resultAmt.getCurrPrice());
 			}
 		}
 
 		// 금액 다다익선 할인 계산
 		leftAmt = 0;
 		i = 0;
-		for(Order resultAmt : tmtbAmtApplyList) {
+		for(Order resultAmt : tmtbApplyList) {
 			if("Y".equals(resultAmt.getApplyAmtSectionYn())) {
 				if (TscConstants.DcWay.AMT.value().equals(resultAmt.getDcWay())) {        // 할인 방식 금액일경우
 					i++;
@@ -543,11 +428,12 @@ public class TsfCartService {
 
 		// 장바구니 정보에 수량 다다익선 정보 입력
 		for(Order cart : cartGoodsList) {
-			for(Order apply : tmtbAmtApplyList) {
+			for(Order apply : tmtbApplyList) {
 				if(cart.getCartSq() == apply.getCartSq()) {
-					if(apply.getTmtbDcAmt() > 0) {
-						cart.setTmtbDcAmt(apply.getTmtbDcAmt());
-					}
+					cart.setTmtbDcAmt(apply.getTmtbDcAmt());
+					cart.setApplyQtySectionYn(apply.getApplyQtySectionYn());
+					cart.setQtyTmtbNm(apply.getQtyTmtbNm());
+					cart.setQtyTmtbSq(apply.getQtyTmtbSq());
 					cart.setApplyAmtSectionYn(apply.getApplyAmtSectionYn());
 					cart.setAmtTmtbNm(apply.getTmtbNm());
 					cart.setAmtTmtbSq(apply.getTmtbSq());

+ 20 - 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);
-			}
-		}*/
 	}
 
 	// 장바구니쿠폰 토탈 할인 금액 계산
@@ -160,6 +123,13 @@ public class TsfCouponService {
 		int buyLimitAmt = 0;
 
 		Collection<Order> serialGoodsList = coreOrderService.getSerialCpnApplyGoodsList(order);
+		for(int i = 0 ; i < param.getCartSqArr().length ; i++) {
+			for(Order cpnInfo : serialGoodsList) {
+				if(param.getCartSqArr()[i] == cpnInfo.getCartSq()) {
+					cpnInfo.setCurrPrice(param.getCurrPrices()[i]);
+				}
+			}
+		}
 
 		// 각 필요 데이터 세팅
 		for(Order info : serialGoodsList) {
@@ -179,8 +149,8 @@ public class TsfCouponService {
 			totDcAmt = maxDcAmt;
 		}
 
-		// 주문 최소 금액 요건 확인 (0은 제한 없음. 최소 주문 금액보다 총 상품 금액이 적으면 0원으로 세팅)
-		if(buyLimitAmt > 0 && buyLimitAmt > totCurrPrice) {
+		// 주문 최소 금액 요건 확인 (최소 주문 금액보다 총 상품 금액이 적으면 0원으로 세팅)
+		if(buyLimitAmt > totCurrPrice) {
 			totDcAmt = 0;
 		}
 

+ 70 - 25
src/main/java/com/style24/front/biz/service/TsfCustomerService.java

@@ -5,11 +5,14 @@ import com.gagaframework.web.security.GagaPasswordEncoder;
 import com.style24.core.biz.service.TscCustomerService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.session.TscSession;
+import com.style24.front.support.security.TsfLoginDetails;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.Customer;
+import com.style24.persistence.domain.Login;
 import com.style24.persistence.domain.Point;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.stereotype.Service;
 
 import com.style24.front.biz.dao.TsfCustomerDao;
@@ -17,6 +20,11 @@ import com.style24.front.biz.dao.TsfCustomerDao;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 고객(회원) Service
  *
@@ -36,6 +44,10 @@ public class TsfCustomerService {
 	@Autowired
 	private GagaPasswordEncoder passwordEncoder;
 
+	@Autowired
+	private TsfLoginService loginService;
+
+
 	/**
 	 * 고객아이디 찾기
 	 *
@@ -45,9 +57,9 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 08
 	 */
 	public Customer getCustomerFindId(Customer customer) {
+		TscSession.setAttribute("maskingYn","Y");
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.encryptData(); // 데이터 암호하
-		TscSession.setAttribute("maskingYn","Y");
 		return coreCustomerService.getCustomerInfo(customer);
 	}
 
@@ -118,11 +130,11 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 15
 	 */
 	public Customer getCustomerFindByCi(String ci) {
+		TscSession.setAttribute("maskingYn","Y");
 		Customer customer = new Customer();
 		customer.setCi(ci);
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.encryptData();
-
 		return customerDao.getCustomerInfo(customer);
 	}
 
@@ -134,12 +146,12 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 15
 	 */
 	public Customer getCustomerFindByCellPhnno(String cellPhnno) {
+		TscSession.setAttribute("maskingYn","Y");
 		Customer customer = new Customer();
 		customer.setCellPhnno(cellPhnno);
 		customer.setHypenCellPhone(); // 010-0000-0000
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.encryptData();
-
 		return customerDao.getCustomerInfo(customer);
 	}
 
@@ -195,16 +207,28 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 19
 	 */
 	@Transactional("shopTxnManager")
-	public void saveJoinCustomer(Customer customer) {
-		boolean isSnsJoin = isSnsJoin(customer);
-		if (isSnsJoin) {
+	public boolean saveJoinCustomer(Customer customer) {
+		boolean isJoin = true;
+		// 1. validation
+		customer.encryptData();
+		if (StringUtils.isNotBlank(customer.getSnsId())) {
 			customer.setEncodedPasswd(" ");
+			customer.setCustId(customer.getSnsType()+"_"+customer.getSnsId());
 		} else {
 			customer.setEncodedPasswd(passwordEncoder.encode(customer.getPasswd()));
 		}
-		customer.encryptData();
-		customerDao.createCustomer(customer);
-		saveJoinPostProcessing(customer);
+		customer.setCustStat(TscConstants.CustStat.ACTIVE.value());
+		customer.setCustGb(TscConstants.CustGb.NORMAL.value());
+		customer.setCustGrade(TscConstants.CustGrade.WELCOME.value());
+		int custCnt = customerDao.createCustomer(customer);
+
+		if (custCnt > 0) {
+			saveJoinPostProcessing(customer);
+		} else {
+			isJoin = false;
+		}
+
+		return isJoin;
 	}
 
 	/**
@@ -224,27 +248,48 @@ public class TsfCustomerService {
 
 
 	}
+
 	/**
-	 * SNS 가입인지 확인
-	 * @param customer - 일반가입, SNS 가입
-	 * @return boolean - sns 가입이면 true 아니면 false
+	 * 로그인 처리
+	 * @param custNo - 고객번호
+	 * @param request - 요청
 	 * @author jsshin
-	 * @since 2021. 02. 19
+	 * @since 2021. 02. 18
 	 */
-	public boolean isSnsJoin(Customer customer) {
-		boolean result = false;
-
-		if (StringUtils.isNotBlank(customer.getKkJoinId())) {
-			result = true;
-		}
-		if (StringUtils.isNotBlank(customer.getNvJoinId())) {
-			result = true;
-		}
-		if (StringUtils.isNotBlank(customer.getYsJoinId())) {
-			result = true;
+	public void getLogin(String custId, HttpServletRequest request) {
+		if (StringUtils.isBlank(custId)) {
+			throw new IllegalStateException("고객 아이디가 없습니다. 로그인 다시 해보시기 바랍니다.");
 		}
 
-		return result;
+		Login loginParam = new Login();
+		loginParam.setCustId(custId);
+		Login loginInfo = loginService.getLoginCheckInfo(loginParam);
+
+		// 권한 설정
+		List<SimpleGrantedAuthority> authorities = new ArrayList<>();
+		authorities.add(new SimpleGrantedAuthority(loginInfo.getCustGb()));
+
+		TsfLoginDetails loginDetails = new TsfLoginDetails(loginInfo, authorities);
+
+		// 최종로그인일시 Update
+		loginService.updateLastLoginDate(loginInfo.getCustNo());
+
+		// 로그인이력 생성
+		loginService.createLoginHistory(loginInfo.getCustNo());
+
+		// 세션 생성
+		this.createSession(request,  loginDetails);
+	}
+
+	/**
+	 * Session 생성
+	 * @param request - HttpServletRequest
+	 * @param loginDetails - 로그인 상세 정보
+	 */
+	private void createSession(HttpServletRequest request, TsfLoginDetails loginDetails) {
+		HttpSession session = request.getSession(true);
+		session.setMaxInactiveInterval(1800);
+		session.setAttribute("session", loginDetails);
 	}
 
 }

+ 88 - 64
src/main/java/com/style24/front/biz/service/TsfOrderService.java

@@ -12,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.gagaframework.web.parameter.GagaMap;
+import com.style24.core.support.env.TscConstants;
 import com.style24.front.biz.dao.TsfOrderDao;
 import com.style24.persistence.domain.Order;
 
@@ -61,7 +62,8 @@ public class TsfOrderService {
 	 */
 	public Collection<GagaMap> getOrderListForMypage(Order order) {
 		Collection<GagaMap> mapList = new ArrayList<>();
-		List<Order> orderList = new ArrayList<>();
+		Collection<GagaMap> orderList = new ArrayList<>();
+		List<Order> ordDtlList = new ArrayList<>();
 		int ordNo = 0;
 		String ordDt = "";
 		String delvFeeCd = "";
@@ -69,29 +71,46 @@ public class TsfOrderService {
 		String shotDelvYn = "";
 		String selfGoodsYn = "";
 		String shipCompNm = "";
+		String shipCompCd = "";
 		String invoiceNo = "";
 		String giftPackYn = "";
+		String reviewYn = "";
 		int reviewSq = 0;
 		int index = 0;
-		int ordDtlStatCnt = 0;
-		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())) {		// 총알배송여부 변경
+
 				// 데이터 설정
 				if (index > 0) {
+					// 주문상세내역 목록 설정
+					GagaMap ordDtlMap = new GagaMap();
+					ordDtlMap.set("ordDtlList", ordDtlList);
+					ordDtlMap.set("ordDtlStat", ordDtlList.iterator().next().getOrdDtlStat());
+					ordDtlMap.set("shipCompCd", shipCompCd);
+					ordDtlMap.set("shipCompNm", shipCompNm);
+					ordDtlMap.set("invoiceNo", invoiceNo);
+					ordDtlMap.set("reviewSq", reviewSq);
+					ordDtlMap.set("recipBaseAddr", ordDtlList.iterator().next().getRecipBaseAddr());
+					ordDtlMap.set("giftLimitDay", ordDtlList.iterator().next().getGiftLimitDay());
+					ordDtlMap.set("recipNm", ordDtlList.iterator().next().getRecipNm());
+					ordDtlMap.set("giftLimitDt", ordDtlList.iterator().next().getGiftLimitDt());
+					ordDtlMap.set("purchaseConfirmDay", ordDtlList.iterator().next().getPurchaseConfirmDay());
+					ordDtlMap.set("ordDtlStatBanner", "Y");
+					orderList.add(ordDtlMap);
+					
+					// 주문내역 목록 설정
 					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("giftPackYn", giftPackYn);			// 선물하기여부
-					map.set("reviewSq", reviewSq);				// 리뷰일련번호
-					map.set("orderList", setOrderListParameter(orderList, rowspan, ordDtlStatCnt, "Y"));			// 주문내역
+					map.set("orderList", orderList);			// 주문내역
 					mapList.add(map);
 				}
 
@@ -102,44 +121,76 @@ public class TsfOrderService {
 				ordDtlStat = tmpOrder.getOrdDtlStat();
 				shotDelvYn = tmpOrder.getShotDelvYn();
 				selfGoodsYn = tmpOrder.getSelfGoodsYn();
+				shipCompCd = tmpOrder.getShipCompCd();
 				shipCompNm = tmpOrder.getShipCompNm();
-				invoiceNo = tmpOrder.getInvoiceNo();
-				reviewSq = tmpOrder.getReviewSq();
 				giftPackYn = tmpOrder.getGiftPackYn();
+				ordDtlList = new ArrayList<>();
 				orderList = new ArrayList<>();
-				ordDtlStatCnt = 0;
-				rowspan = 0;
-			} else if (index > 0 && !ordDtlStat.equals(tmpOrder.getOrdDtlStat())) {
-				// 주문내역 데이터 추가
-				orderList = setOrderListParameter(orderList, rowspan, ordDtlStatCnt, "N");
+			} else if (index > 0 
+				&& (!ordDtlStat.equals(tmpOrder.getOrdDtlStat())						// 주문상세상태값 변경
+					|| ("G013_70".equals(tmpOrder.getOrdDtlStat())
+						&& !reviewYn.equals(tmpOrder.getReviewSq() > 0 ? "Y" : "N"))	// 리뷰작성 변경
+					|| (!invoiceNo.equals(tmpOrder.getInvoiceNo())))) {					// 송장번호 변경
+
+				// 주문내역 목록 설정
+				GagaMap ordDtlMap = new GagaMap();
+				ordDtlMap.set("ordDtlList", ordDtlList);
+				ordDtlMap.set("ordDtlStat", ordDtlList.iterator().next().getOrdDtlStat());
+				ordDtlMap.set("shipCompCd", shipCompCd);
+				ordDtlMap.set("shipCompNm", shipCompNm);
+				ordDtlMap.set("invoiceNo", invoiceNo);
+				ordDtlMap.set("reviewSq", reviewSq);
+				ordDtlMap.set("purchaseConfirmDay", ordDtlList.iterator().next().getPurchaseConfirmDay());
+				ordDtlMap.set("recipBaseAddr", ordDtlList.iterator().next().getRecipBaseAddr());
+				ordDtlMap.set("giftLimitDay", ordDtlList.iterator().next().getGiftLimitDay());
+				ordDtlMap.set("recipNm", ordDtlList.iterator().next().getRecipNm());
+				ordDtlMap.set("giftLimitDt", ordDtlList.iterator().next().getGiftLimitDt());
+				ordDtlMap.set("ordDtlStatBanner", "Y");
+				orderList.add(ordDtlMap);
 
 				// 상태 별 배너 설정 후 초기화 진행
+				ordDtlList = new ArrayList<>();
 				ordDtlStat = tmpOrder.getOrdDtlStat();
-				rowspan = 0;
 			}
 
 			// 주문내역 설정
-			orderList.add(tmpOrder);
+			ordDtlList.add(tmpOrder);
 
 			// 인덱스 처리
 			index++;
-			ordDtlStatCnt++;
-			rowspan++;
+			
+			// 초기화 진행
+			invoiceNo = tmpOrder.getInvoiceNo();
+			reviewSq = tmpOrder.getReviewSq();
+			reviewYn = tmpOrder.getReviewSq() > 0 ? "Y" : "N";
 		}
 
 		// 마지막 데이터 설정
 		if (ordNo > 0) {
+			// 주문상세내역 목록 설정
+			GagaMap ordDtlMap = new GagaMap();
+			ordDtlMap.set("ordDtlList", ordDtlList);
+			ordDtlMap.set("ordDtlStat", ordDtlList.iterator().next().getOrdDtlStat());
+			ordDtlMap.set("shipCompCd", shipCompCd);
+			ordDtlMap.set("shipCompNm", shipCompNm);
+			ordDtlMap.set("invoiceNo", invoiceNo);
+			ordDtlMap.set("reviewSq", reviewSq);
+			ordDtlMap.set("purchaseConfirmDay", ordDtlList.iterator().next().getPurchaseConfirmDay());
+			ordDtlMap.set("recipBaseAddr", ordDtlList.iterator().next().getRecipBaseAddr());
+			ordDtlMap.set("giftLimitDay", ordDtlList.iterator().next().getGiftLimitDay());
+			ordDtlMap.set("recipNm", ordDtlList.iterator().next().getRecipNm());
+			ordDtlMap.set("giftLimitDt", ordDtlList.iterator().next().getGiftLimitDt());
+			ordDtlMap.set("ordDtlStatBanner", "Y");
+			orderList.add(ordDtlMap);
+
+			// 주문내역 목록 설정
 			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("giftPackYn", giftPackYn);
-			map.set("reviewSq", reviewSq);
-			map.set("orderList", setOrderListParameter(orderList, rowspan, ordDtlStatCnt, "Y"));
+			map.set("orderList", orderList);
 			mapList.add(map);
 		}
 
@@ -147,54 +198,24 @@ public class TsfOrderService {
 	}
 
 	/**
-	 * 마이페이지 주문내역 데이터 추가
-	 *
-	 * @param List<Order>
-	 * @return List<Order>
-	 * @author card007
-	 * @since 2021. 02. 08
-	 */
-	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);
-			}
-		}
-
-		// 주문상세상태값 별 배너 설정
-		if ("Y".equals(setLastBanner)) {
-			orderList.get(orderList.size() - 1).setOrdDtlStatBanner("Y");
-		} else {
-			orderList.get(ordDtlStatCnt - 1).setOrdDtlStatBanner("Y");
-		}
-
-		return orderList;
-	}
-
-	/**
-	 * 마이페이지 주문상태 별 주문수량 조회
+	 * 주문 상태 별 수량 조회
 	 *
 	 * @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); }
 
 	/**
 	 * 마이페이지 주문상세 금액정보 조회
@@ -214,7 +235,10 @@ public class TsfOrderService {
 	 * @author card007
 	 * @since 2021. 02. 16
 	 */
-	public Order getPaymentInfoForMypage(Order order) { return orderDao.getPaymentInfoForMypage(order); }
+	public Order getPaymentInfoForMypage(Order order) {
+		order.setPayStat(TscConstants.PaymentStat.PAYMENT_COMPLETE.value());
+		return orderDao.getPaymentInfoForMypage(order);
+	}
 
 	/**
 	 * 마이페이지 주문상세 배송지 정보 조회

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

@@ -1,8 +1,10 @@
 package com.style24.front.biz.web;
 
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
+import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
@@ -142,9 +144,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);
 

+ 62 - 14
src/main/java/com/style24/front/biz/web/TsfCustomerController.java

@@ -6,11 +6,17 @@ import com.style24.core.biz.service.TscClauseService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.session.TscSession;
 import com.style24.front.biz.service.TsfKakaoService;
+import com.style24.front.biz.service.TsfLoginService;
 import com.style24.front.biz.thirdparty.NiceCertify;
+import com.style24.front.support.env.TsfConstants;
+import com.style24.front.support.security.TsfLoginDetails;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Customer;
+import com.style24.persistence.domain.Login;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -26,6 +32,11 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 고객(회원) Controller
  * 
@@ -44,14 +55,16 @@ public class TsfCustomerController extends TsfBaseController {
 	private TsfCustomerService customerService;
 
 	@Autowired
-	TscClauseService clauseService;
+	private TscClauseService clauseService;
 
 	@Autowired
-	TsfKakaoService kakaoService;
+	private TsfKakaoService kakaoService;
 
 	@Autowired
 	private NiceCertify niceCertify;
 
+
+
 	/**
 	 * 아이디 찾기 화면
 	 *
@@ -517,12 +530,13 @@ public class TsfCustomerController extends TsfBaseController {
 		GagaMap result = new GagaMap();
 
 		if (StringUtils.isBlank(customer.getCellPhnno())) {
-			throw new IllegalStateException("확인 할 이메일이 없습니다.");
+			throw new IllegalStateException("확인 할 휴대폰번호가 없습니다.");
 		}
 
 		Customer custInfo = customerService.getCustomerFindByCellPhnno(customer.getCellPhnno());
 
 		if (custInfo != null) {
+			result.setString("maskingCustId", custInfo.getMaskingCustId());
 			result.setBoolean("isFind", true);
 		} else {
 			result.setBoolean("isFind", false);
@@ -556,6 +570,7 @@ public class TsfCustomerController extends TsfBaseController {
 
 		Customer custInfo = customerService.getCustomerFindByCi(customer.getCi());
 		if (custInfo != null) {
+			result.setString("maskingCustId", custInfo.getMaskingCustId());
 			result.setBoolean("isFind", true);
 		} else {
 			result.setBoolean("isFind", false);
@@ -575,35 +590,68 @@ public class TsfCustomerController extends TsfBaseController {
 	 */
 	@PostMapping("/join/save")
 	@ResponseBody
-	public GagaMap saveJoinCustomer(@RequestBody Customer customer) {
+	public GagaMap saveJoinCustomer(@RequestBody Customer customer, HttpServletRequest request) {
 		GagaMap result = new GagaMap();
+
+		// 1.세션에 인코딩된 데이터를 가져온다.
 		String encData = TscSession.getAttribute("encData");
 		customer.setEncData(encData);
 		GagaMap authInfo = niceCertify.getCertifyCellPhoneResultInfo(customer);
+
+		// 2.인증통해 받은 데이터 매핑
+		String gender = "G007_"+authInfo.getString("sGender");
+		customer.setSexGb(gender);
 		customer.setCustNm(authInfo.getString("sName"));
 		customer.setBirthYmd(authInfo.getString("sBirthDate"));
 		customer.setForeignerYn(authInfo.getString("sforeignerYn"));
 		customer.setCi(authInfo.getString("sCi"));
-		String gender = "G007_"+authInfo.getString("sGender");
-		customer.setSexGb(gender);
+
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.setFrontGb(TsfSession.getFrontGb());
 		customer.setAfLinkCd(TsfSession.getAttribute("afLinkCd"));
 
-		// 1.입력 받은 데이터 검증
-
-		// 2.고객정보 생성 및 혜택 처리
-		customerService.saveJoinCustomer(customer);
-
-		// 3.알림톡 및 메일 발송
+		// 3.고객정보 생성 및 혜택 처리
+		boolean isJoin = customerService.saveJoinCustomer(customer);
+		// 4.알림톡 및 메일 발송
 		try {
-			kakaoService.sendJoinCongrat(customer);
+			if(StringUtils.isNotBlank(customer.getCellPhnno())) {
+				kakaoService.sendJoinCongrat(customer);
+			}
 		} catch (Exception e) {
 			log.error("error", e);
 		}
-		result.setBoolean("isJoin", true);
+
+		if (isJoin) {
+			customerService.getLogin(customer.getCustId(),request);
+		} else {
+			TsfSession.setAttribute("maskingCustId",customer.getMaskingCustId());
+		}
+
+		result.setBoolean("isJoin", isJoin);
 
 		return result;
 	}
 
+	/**
+	 * 가입완료 페이지
+	 *
+	 * @return GagaMap - 결과정보
+	 * @author jsshin
+	 * @since 2021. 02. 18
+	 */
+	@GetMapping("/join/complete/form")
+	public ModelAndView getJoinCompleteForm() {
+		ModelAndView mav = new ModelAndView();
+
+		String maskingCustId = TsfSession.getAttribute("maskingCustId");
+
+		mav.addObject("maskingCustId", maskingCustId);
+
+		mav.setViewName(super.getDeviceViewName("customer/JoinCompleteForm"));
+
+		return mav;
+	}
+
+
+
 }

+ 120 - 52
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;
 
@@ -23,10 +28,12 @@ import com.style24.front.biz.service.TsfCustomerService;
 import com.style24.front.biz.service.TsfGiftcardService;
 import com.style24.front.biz.service.TsfOrderService;
 import com.style24.front.biz.service.TsfPointService;
+import com.style24.front.biz.service.TsfRendererService;
 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;
 
@@ -72,6 +79,9 @@ public class TsfMypageController extends TsfBaseController {
 
 	@Autowired
 	private TsfCouponService couponService;
+	
+	@Autowired
+	private TsfRendererService rendererService;
 
 	/**
 	 * 마이페이지 메인 화면
@@ -81,11 +91,16 @@ 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;
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
+		order.setCustNo(custNo);
 
 		// 고객정보 조회
 		Customer customer = new Customer();
@@ -94,11 +109,6 @@ public class TsfMypageController extends TsfBaseController {
 		customer.setCustStat(TscConstants.CustStat.ACTIVE.value());
 		mav.addObject("customerInfo", coreCustomerService.getCustomerInfo(customer));
 
-		// 주문정보 조회
-		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));
+		// 주문 상태 별 수량 조회
+		mav.addObject("orderCount", 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));
-
-		// 배송완료
-		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());
 
@@ -166,8 +143,9 @@ public class TsfMypageController extends TsfBaseController {
 	public ModelAndView mypageOrderDetailForm(@PathVariable(value = "ordNo") int ordNo) {
 		ModelAndView mav = new ModelAndView();
 
-		// int custNo = TsfSession.getInfo().getCustNo();
-		int custNo = 1000007;
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
+		mav.addObject("custNo", custNo);
 
 		// 고객정보 조회
 		Customer customer = new Customer();
@@ -190,7 +168,8 @@ public class TsfMypageController extends TsfBaseController {
 		Collection<GagaMap> orderList = orderService.getOrderListForMypage(order);
 
 		if (orderList.size() == 0) {
-			throw new IllegalStateException(message.getMessage("ORDER_0001"));
+			mav.setViewName("redirect:/mypage/order/list/form");
+			return mav;
 		}
 
 		mav.addObject("orderList", orderList);
@@ -212,6 +191,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;
+	}
+
 	/**
 	 * 마이페이지 주문상세 주문내역 삭제
 	 *
@@ -224,11 +238,11 @@ public class TsfMypageController extends TsfBaseController {
 	public GagaMap deleteOrder(@RequestBody Order order) {
 		GagaMap result = new GagaMap();
 
-		// int custNo = TsfSession.getInfo().getCustNo();
-		int custNo = 1000007;
-		
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
 		order.setUpdNo(custNo);
 		
+		// 주문내역 삭제 처리
 		int chk = orderService.updateOrderDisplayYn(order);
 
 		if (chk > 0) {
@@ -260,16 +274,70 @@ public class TsfMypageController extends TsfBaseController {
 			return result;
 		}
 
-		// int custNo = TsfSession.getInfo().getCustNo();
-		int custNo = 1000007;
-
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
 		order.setCustNo(custNo);
 		order.setRegNo(custNo);
 		order.setUpdNo(custNo);
 		
+		// 구매확정 처리
 		result = coreOrderService.decideOrder(order);
 		
 		return result;
 	}
 
+	/**
+	 * 마이페이지 교환신청 화면
+	 *
+	 * @param Order
+	 * @return ModelAndView
+	 * @author card007
+	 * @since 2021. 02. 22
+	 */
+	@PostMapping("/exchange/form")
+	@ResponseBody
+	public ModelAndView exchangeForm(Order order) {
+		ModelAndView mav = new ModelAndView();
+		
+		log.info("order >>> {}", order);
+		
+		// 주문번호 설정
+		mav.addObject("ordNo", order.getOrdNo());
+
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
+		order.setCustNo(custNo);
+		mav.addObject("custNo", custNo);
+
+		// 고객정보 조회
+		Customer customer = new Customer();
+		customer.setSiteCd(TscConstants.Site.STYLE24.value());
+		customer.setCustNo(custNo);
+		customer.setCustStat(TscConstants.CustStat.ACTIVE.value());
+		customer = coreCustomerService.getCustomerInfo(customer);
+
+		mav.addObject("customerInfo", customer);
+
+
+		// 주문목록 조회
+		Collection<GagaMap> orderList = orderService.getOrderListForMypage(order);
+
+		if (orderList.size() == 0) {
+			mav.setViewName("redirect:/mypage/order/list/form");
+			return mav;
+		}
+
+		mav.addObject("orderList", orderList);
+
+		// 주문 배송지 정보 조회
+		mav.addObject("deliveryAddrInfo", orderService.getOrderDeliveryAddrInfo(order));
+		
+		// 교환 사유 목록 조회
+		mav.addObject("exchangeReason", rendererService.getCommonCodeList("G689", "Y"));
+		
+		mav.setViewName(super.getDeviceViewName("/mypage/MypageExchangeForm"));
+		
+		return mav;
+	}
+
 }

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

@@ -7,6 +7,7 @@ import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.biz.service.TscFreegiftService;
@@ -51,7 +52,7 @@ public class TsfOrderController extends TsfBaseController {
 	 * @since 2021. 02. 02
 	 */
 	@RequestMapping(value = "/noMember")
-	public ModelAndView orderNoMember(Order order) {
+	public ModelAndView orderNoMember(Order order, RedirectAttributes redirectAttributes) {
 		ModelAndView mav = new ModelAndView();
 		
 		String rtnView = "";
@@ -62,26 +63,15 @@ public class TsfOrderController extends TsfBaseController {
 		// @ mobile 인 경우에는 본인인증 후 주문서 이동
 		// 배송완료 후 14일 자동구매확정
 		
-		// TODO 임시
-		// 1.0 회원, 비회원 여부 판단
-		if (TsfSession.getInfo() == null) {
-			rtnView = "order/OrderNoMember";
-		} else {
-			if (TsfSession.getInfo().getCustNo() == null) {
-				rtnView = "order/OrderNoMember";
-			} else {
-				rtnView = "forward:/order/form";
-			}
-		}
-		
 		// TODO 임시 장바구니
 		// 2. 장바구니시퀀스 배열 등록 (장바구니 상품 정보 조회)
 		int[] arr = {14,15,16,17,18,19,20,21,11,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,8,77};
 		order.setCartSqArr(arr);
 		order.setShotDelvYn("Y");
 		
-		mav.addObject("order" , order);	// 주문정보
-		mav.setViewName(super.getDeviceViewName(rtnView));
+		mav.addObject("order" 	, order);										// 주문정보
+		mav.addObject("isLogin"	, TsfSession.isLogin());						// 로그인여부
+		mav.setViewName(super.getDeviceViewName("order/OrderNoMember"));		// 비회원주문서화면
 		
 		return mav;
 	}
@@ -94,7 +84,7 @@ public class TsfOrderController extends TsfBaseController {
 	 * @author jsh77b
 	 * @since 2021. 02. 02
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({ "unchecked", "null" })
 	@RequestMapping(value = "/form")
 	public ModelAndView orderForm(Order order) {
 		ModelAndView mav = new ModelAndView();
@@ -106,23 +96,18 @@ public class TsfOrderController extends TsfBaseController {
 		// 임시 jsessionId
 		String jsessionId 	= "aaec62cc-5f91-47bb-ba65-ebc9a61385cf";
 		Boolean noMember 	= true;
-		
-		
+
 		// TODO 로그인체크 로직 추가
 		// 1.0 회원, 비회원 여부 판단
-		if (TsfSession.getInfo() == null) {
+		if (TsfSession.getInfo().getCustNo() == null) {
 			order.setJsessionId(jsessionId);
 		} else {
-			if (TsfSession.getInfo().getCustNo() == null) {
-				order.setJsessionId(jsessionId);
-			} else {
-				noMember = false;
-				order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
-			}
+			noMember = false;
+			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
 		}
 		
 		// 임시
-		order.setCustNo(1000006); // 고객번호등록
+		//order.setCustNo(1000006); // 고객번호등록
 		
 		// TODO
 		// 1.1 카트시퀀스가 없을때 처리 장바구니로 이동 
@@ -152,6 +137,15 @@ public class TsfOrderController extends TsfBaseController {
 			
 			// 1.2 배송지 정보조회 (기본배송지)
 			deliveryAddrInfo = coreOrderService.getDeliveryAddrInfo(order);
+			
+			if (deliveryAddrInfo == null) {
+				deliveryAddrInfo = new Order();
+				deliveryAddrInfo.setDelvAddrNm(custemerInfo.getCustNm());
+				deliveryAddrInfo.setRecipZipcode("");
+				deliveryAddrInfo.setRecipBaseAddr("");
+				deliveryAddrInfo.setRecipDtlAddr("");
+				deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
+			}
 		}
 
 		// TODO 임시 장바구니
@@ -168,13 +162,13 @@ public class TsfOrderController extends TsfBaseController {
 		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList);
 
 		// 3. 할인구간정보조회
-		// 3.2 장바구니상품 상품쿠폰, 장바구니쿠폰 정보 조회
+		// 3.2 상품쿠폰, 장바구니쿠폰 목록 조회
 		GagaMap goodsCartCpnMap = coreOrderService.getGoodsCartCpnApplyGoodsList(order);
 		
 		Collection<Order> goodsCpnList 	= (Collection<Order>) goodsCartCpnMap.get("goodsCpnList");
 		Collection<Order> cartCpnList 	= (Collection<Order>) goodsCartCpnMap.get("cartCpnList");
 		
-		// 3.2.1 상품쿠폰, 장바구니쿠폰 적용된 상품 목록
+		// 3.2.1 상품기준 ---> 상품쿠폰 적용된 상품 목록
 		Collection<Order> goodsApplyCpnList = coreOrderService.getGoodsCpnApplyList(tmtbGoodsApplyList, goodsCpnList);
 		
 		// 3.3 배송비쿠폰목록 조회
@@ -209,7 +203,6 @@ public class TsfOrderController extends TsfBaseController {
 		// 103. 할인정보
 		mav.addObject("tmtbGoodsApplyList"				, tmtbGoodsApplyList);					// 다다익선상품 적용목록
 		mav.addObject("goodsApplyCpnList"				, goodsApplyCpnList);					// 상품적용쿠폰
-		mav.addObject("goodsCpnList"					, goodsCpnList);						// 상품쿠폰목록
 		mav.addObject("cartCpnList"						, cartCpnList);							// 장바구니쿠폰목록
 		mav.addObject("delvCpnList"						, delvCpnList);							// 배송비쿠폰목록
 		mav.addObject("prePntDcAmt"						, prePntDcAmt);							// 선포인트정보
@@ -328,6 +321,10 @@ public class TsfOrderController extends TsfBaseController {
 	public ModelAndView freegiftInfoPop(Order order) {
 		
 		ModelAndView mav = new ModelAndView();
+		
+		
+		
+		
 		mav.setViewName(super.getDeviceViewName("order/OrderFreegiftInfoPop"));
 		
 		return mav;

+ 1 - 1
src/main/java/com/style24/front/support/config/TsfWebMvcConfig.java

@@ -61,7 +61,7 @@ public class TsfWebMvcConfig implements WebMvcConfigurer {
 			"/", "/index", "/signin/**",
 			"/images/**", "/ux/**",
 			"/error/**", "/data/**",
-			"/login", "/logout"
+			"/login", "/logout", "/order/noMember"
 		};
 
 		// 디바이스 해석

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

@@ -17,11 +17,14 @@ public class Coupon extends TscBaseDomain {
 	// 쿠폰 정보
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private int[] cartSqArr;		// 장바구니 일련번호 배열
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private int[] currPrices;		// 상품가격 배열
 	private int cpnId;				// 쿠폰번호
 	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 +35,7 @@ public class Coupon extends TscBaseDomain {
 	private String availEddt;		// 쿠폰 유효일
 	private String endAlimYn;		// 쿠폰 종료 알림 여부
 	private String frontGb;			// 화면 구분
+	private String availYn;			// 지급 받은 쿠폰 사용 가능 유무
+	private String dcWay;			// 할인금액/율 구분
+	private String cpnDesc;			// 쿠폰설명
 }

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

@@ -73,7 +73,8 @@ public class Goods extends TscBaseDomain {
 	private String colorCd;		//색상코드
 	private String colorNM;		//색상코드명
 	private String brandnm;		//브랜드명
-	private String brandGrpNm;	//브랜드그룹명
+	private int brandGroupNo;	//브랜드그룹번호
+	private String brandGroupNm;	//브랜드그룹명
 	private String frontGb;		//프론트구분
 	private String isApp;		//앱구분
 	private String siteCd;		//사이트코드

+ 187 - 53
src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml

@@ -242,58 +242,135 @@
 	<!-- 다다익선 기본 상품 조회 -->
 	<select id="selectMoreBetterApplyCartList" parameterType="Order" resultType="Order">
 		/* TsfCart.selectMoreBetterApplyCartList : 다다익선 기본 상품 조회 */
-		SELECT C.CART_SQ
-			 , T.TMTB_SQ
-			 , T.APPLY_GB
-		     , TAG.GOODS_CD
-		     , TAG.GOODS_GB
-		     , TAG2.TMTB_CNT
-			 , T.TMTB_NM
-			 , C.GOODS_QTY
-		FROM   TB_CART C
-		INNER  JOIN TB_TMTB_APPLY_GOODS TAG
-		ON	   C.GOODS_CD = TAG.GOODS_CD
-		AND	   TAG.DEL_YN = 'N'
-		INNER  JOIN (SELECT TAG.TMTB_SQ
-						  , COUNT(1) AS TMTB_CNT
-					 FROM   TB_TMTB_APPLY_GOODS TAG
-					 INNER  JOIN TB_CART C
-					 ON     TAG.GOODS_CD = C.GOODS_CD
-					 WHERE  TAG.DEL_YN = 'N'
-					<if test="cartSqArr != null and cartSqArr.length > 0">
-					AND     C.CART_SQ IN
-						<foreach collection="cartSqArr" item="item" index="index"  open="(" close=")" separator=",">
-								#{item}
-						</foreach>
-					</if>
-					 GROUP  BY TAG.TMTB_SQ) AS TAG2
-		ON     TAG.TMTB_SQ = TAG2.TMTB_SQ
-		INNER  JOIN TB_TMTB T
-		ON	   T.TMTB_SQ = TAG.TMTB_SQ
-		AND	   T.TMTB_STAT = 'G232_11' /*진행*/
-		INNER  JOIN TB_GOODS G
-		ON	   C.GOODS_CD = G.GOODS_CD
-		LEFT   OUTER JOIN TB_TMTB_APPLY_GOODS NOT_APPLY
-		ON     T.TMTB_SQ = NOT_APPLY.TMTB_SQ
-		AND    C.GOODS_CD = NOT_APPLY.GOODS_CD
-		AND    NOT_APPLY.GOODS_GB = 'G800_30'   /* 제외상품 */
-		AND    NOT_APPLY.DEL_YN = 'N'
+		SELECT A.CART_SQ
+			 , MAX(A.QTY_TMTB_SQ) AS QTY_TMTB_SQ
+			 , MAX(A.AMT_TMTB_SQ) AS AMT_TMTB_SQ
+			 , MAX(A.QTY_TMTB_NM) AS QTY_TMTB_NM
+			 , MAX(A.AMT_TMTB_NM) AS AMT_TMTB_NM
+			 , MAX(A.QTY_GOODS_GB) AS QTY_GOODS_GB
+			 , MAX(A.AMT_GOODS_GB) AS AMT_GOODS_GB
+			 , MAX(A.QTY_TMTB_SUM_QTY) AS QTY_TMTB_SUM_QTY
+			 , MAX(A.QTY_TMTB_SUM_AMT) AS QTY_TMTB_SUM_AMT
+			 , MAX(A.AMT_TMTB_SUM_QTY) AS AMT_TMTB_SUM_QTY
+			 , MAX(A.AMT_TMTB_SUM_AMT) AS AMT_TMTB_SUM_AMT
+			 , MAX(A.AMT_TMTB_CNT) AS AMT_TMTB_CNT
+			 , MAX(A.QTY_TMTB_CNT) AS QTY_TMTB_CNT
+			 , A.GOODS_CD
+			 , A.GOODS_QTY
+			 , (A.CURR_PRICE + A.OPT_ADD_PRICE) * A.GOODS_QTY AS CURR_PRICE
+		FROM   (SELECT C.CART_SQ
+					 , CASE WHEN T.APPLY_GB = 'G810_10' THEN T.TMTB_SQ END QTY_TMTB_SQ
+					 , CASE WHEN T.APPLY_GB = 'G810_11' THEN T.TMTB_SQ END AMT_TMTB_SQ
+					 , CASE WHEN T.APPLY_GB = 'G810_10' THEN T.TMTB_NM END QTY_TMTB_NM
+					 , CASE WHEN T.APPLY_GB = 'G810_11' THEN T.TMTB_NM END AMT_TMTB_NM
+					 , CASE WHEN T.APPLY_GB = 'G810_10' THEN TAG.GOODS_GB END QTY_GOODS_GB
+					 , CASE WHEN T.APPLY_GB = 'G810_11' THEN TAG.GOODS_GB END AMT_GOODS_GB
+					 , CASE WHEN T.APPLY_GB = 'G810_10' THEN SUM_DATA.TMTB_SUM_QTY END QTY_TMTB_SUM_QTY
+					 , CASE WHEN T.APPLY_GB = 'G810_10' THEN SUM_DATA.TMTB_SUM_AMT END QTY_TMTB_SUM_AMT
+					 , CASE WHEN T.APPLY_GB = 'G810_11' THEN SUM_DATA.TMTB_SUM_QTY END AMT_TMTB_SUM_QTY
+					 , CASE WHEN T.APPLY_GB = 'G810_11' THEN SUM_DATA.TMTB_SUM_AMT END AMT_TMTB_SUM_AMT
+					 , CASE WHEN T.APPLY_GB = 'G810_10' THEN TAG2.TMTB_CNT END QTY_TMTB_CNT
+					 , CASE WHEN T.APPLY_GB = 'G810_11' THEN TAG2.TMTB_CNT END AMT_TMTB_CNT
+					, TAG.GOODS_CD
+					, C.GOODS_QTY
+					, FN_GET_APPLY_CPN1_PRICE(C.GOODS_CD, #{frontGb}) AS CURR_PRICE
+					, IFNULL(OP.ADD_PRICE, 0) AS OPT_ADD_PRICE
+				FROM   TB_CART C
+				INNER  JOIN TB_TMTB_APPLY_GOODS TAG
+				ON	   C.GOODS_CD = TAG.GOODS_CD
+				AND	   TAG.DEL_YN = 'N'
+				INNER  JOIN (SELECT TAG.TMTB_SQ
+								  , COUNT(1) AS TMTB_CNT
+							 FROM   TB_TMTB_APPLY_GOODS TAG
+							 INNER  JOIN TB_CART C
+							 ON     TAG.GOODS_CD = C.GOODS_CD
+							 WHERE  TAG.DEL_YN = 'N'
+							<if test="cartSqArr != null and cartSqArr.length > 0">
+							 AND    C.CART_SQ IN
+								<foreach collection="cartSqArr" item="item" index="index"  open="(" close=")" separator=",">
+										#{item}
+								</foreach>
+							</if>
+							 GROUP  BY TAG.TMTB_SQ) AS TAG2
+				ON     TAG.TMTB_SQ = TAG2.TMTB_SQ
+				INNER  JOIN TB_TMTB T
+				ON	   T.TMTB_SQ = TAG.TMTB_SQ
+				AND	   T.TMTB_STAT = 'G232_11' /*진행*/
+				INNER  JOIN TB_GOODS G
+				ON	   C.GOODS_CD = G.GOODS_CD
+				INNER  JOIN TB_CART_DETAIL CD
+				ON     C.CART_SQ = CD.CART_SQ
+				INNER  JOIN (SELECT TAG.TMTB_SQ
+								  , SUM((FN_GET_APPLY_CPN1_PRICE(C.GOODS_CD, #{frontGb}) + IFNULL(OP.ADD_PRICE, 0)) * C.GOODS_QTY) AS TMTB_SUM_AMT
+								  , SUM(C.GOODS_QTY) AS TMTB_SUM_QTY
+							 FROM   TB_TMTB_APPLY_GOODS TAG
+							 INNER  JOIN TB_CART C
+							 ON     TAG.GOODS_CD = C.GOODS_CD
+							 INNER  JOIN TB_GOODS G
+							 ON     C.GOODS_CD = G.GOODS_CD
+							 INNER  JOIN TB_TMTB T
+							 ON     TAG.TMTB_SQ = T.TMTB_SQ
+							 LEFT   OUTER JOIN TB_TMTB_APPLY_GOODS NOT_APPLY
+							 ON     TAG.GOODS_CD = NOT_APPLY.GOODS_CD
+							 AND    TAG.TMTB_SQ = NOT_APPLY.TMTB_SQ
+							 AND    NOT_APPLY.GOODS_GB = 'G800_30'   /* 제외상품 */
+							 LEFT   OUTER JOIN (SELECT OP.ADD_PRICE
+							 						 , C.CART_SQ
+							 					FROM   TB_CART C
+							 					INNER  JOIN TB_CART_DETAIL CD
+							 					ON     C.CART_SQ = CD.CART_SQ
+												 INNER  JOIN TB_OPTION OP
+												 ON     C.GOODS_CD = OP.GOODS_CD
+												 AND    CD.OPT_CD = OP.OPT_CD
+												 WHERE  1=1) OP
+							 ON     C.CART_SQ = OP.CART_SQ
+							 WHERE  1=1
+							 AND    NOT_APPLY.TMTB_SQ IS NULL
+							 AND    T.DEL_YN = 'N'
+							 AND    TAG.DEL_YN = 'N'
+							 AND    C.CART_GB = 'G026_BC'
+							 AND    G.GOODS_STAT = 'G008_90'
+							 AND    G.SELF_MALL_YN = 'Y'
+							 <if test="cartSqArr != null and cartSqArr.length > 0">
+							 	AND    C.CART_SQ IN
+							 	<foreach collection="cartSqArr" item="item" index="index"  open="(" close=")" separator=",">
+							 		#{item}
+							 	</foreach>
+							 </if>
+							 GROUP BY TAG.TMTB_SQ
+					   ) SUM_DATA
+				ON     T.TMTB_SQ = SUM_DATA.TMTB_SQ
+				LEFT   JOIN TB_OPTION OP
+				ON     CD.ITEM_CD = OP.GOODS_CD
+				AND    CD.OPT_CD1 = OP.OPT_CD1
+				AND    CD.OPT_CD2 = OP.OPT_CD2
+				LEFT   OUTER JOIN TB_TMTB_APPLY_GOODS NOT_APPLY
+				ON     T.TMTB_SQ = NOT_APPLY.TMTB_SQ
+				AND    C.GOODS_CD = NOT_APPLY.GOODS_CD
+				AND    NOT_APPLY.GOODS_GB = 'G800_30'   /* 제외상품 */
+				AND    NOT_APPLY.DEL_YN = 'N'
+				WHERE  1=1
+				AND    NOT_APPLY.TMTB_SQ IS NULL
+				AND    T.DEL_YN = 'N'
+				AND    T.TMTB_ST_DT <![CDATA[<=]]> NOW()
+				AND    T.TMTB_ED_DT >= NOW()
+				AND    C.CART_GB = 'G026_BC'
+				AND    G.GOODS_STAT = 'G008_90'
+				AND    G.SELF_MALL_YN = 'Y'
+				<if test="cartSqArr != null and cartSqArr.length > 0">
+				AND    C.CART_SQ IN
+					<foreach collection="cartSqArr" item="item" index="index"  open="(" close=")" separator=",">
+						#{item}
+					</foreach>
+				</if>
+			   ) A
 		WHERE  1=1
-		AND    NOT_APPLY.TMTB_SQ IS NULL
-		AND    T.DEL_YN = 'N'
-		AND    T.TMTB_ST_DT <![CDATA[<=]]> NOW()
-		AND    T.TMTB_ED_DT >= NOW()
-		AND    T.APPLY_GB = #{applyGb}
-		AND    C.CART_GB = 'G026_BC'
-		AND    G.GOODS_STAT = 'G008_90'
-		AND    G.SELF_MALL_YN = 'Y'
-		<if test="cartSqArr != null and cartSqArr.length > 0">
-		AND    C.CART_SQ IN
-			<foreach collection="cartSqArr" item="item" index="index"  open="(" close=")" separator=",">
-				#{item}
-			</foreach>
-		</if>
-		ORDER BY TAG.TMTB_SQ, TAG.GOODS_GB
+		GROUP  BY A.CART_SQ
+			 , A.GOODS_CD
+			 , A.GOODS_QTY
+			 , A.CURR_PRICE
+			 , A.OPT_ADD_PRICE
+		ORDER BY A.CART_SQ
 	</select>
 
 	<!-- 다다익선 적용 상품 SUM DATA 조회 -->
@@ -378,6 +455,7 @@
 			 , GROUP_CONCAT(Z.OPT_CD1 ORDER BY Z.CART_DTL_SQ) AS OPT_CD1
 			 , GROUP_CONCAT(Z.OPT_CD2 ORDER BY Z.CART_DTL_SQ) AS OPT_CD2
 			 , GROUP_CONCAT(Z.ITEM_QTY ORDER BY Z.CART_DTL_SQ) AS ITEM_QTYR
+			 , (SELECT COUNT(1) CNT FROM TB_WISHLIST WHERE CUST_NO = ${custNo} AND CUST_NO != 0 AND GOODS_CD = Z.GOODS_CD) AS WISH_CNT
 			 , Z.CART_SQ
 			 , Z.GOODS_CD
 			 , Z.GOODS_NM
@@ -388,6 +466,7 @@
 			 , Z.SUPPLY_COMP_CD
 			 , Z.DELV_FEE_CD
 		     , Z.CURR_PRICE
+		     , Z.SOLDOUT_YN
 			 , CASE WHEN #{frontGb} = 'P' THEN (Z.CURR_PRICE * Z.GOODS_QTY) * (Z.PNT_PRATE/100)
 					ELSE (Z.CURR_PRICE * Z.GOODS_QTY) * (Z.PNT_MRATE/100) END AS SAVE_PNT_AMT
 			 , GI.SYS_IMG_NM
@@ -406,6 +485,7 @@
 		             , G.BRAND_CD
 		             , G.PNT_PRATE
 					 , G.PNT_MRATE
+		             , STOCK.SOLDOUT_YN
 		             , FN_GET_APPLY_CPN1_PRICE(C.GOODS_CD, #{frontGb}) AS CURR_PRICE
 		             , (SELECT BRAND_KNM FROM TB_BRAND WHERE BRAND_CD = G.BRAND_CD) AS BRAND_NM
 		             , (SELECT SUPPLY_COMP_NM FROM TB_SUPPLY_COMPANY WHERE SUPPLY_COMP_CD = G.SUPPLY_COMP_CD) AS SUPPLY_COMP_NM
@@ -422,6 +502,60 @@
 				INNER  JOIN TB_OPTION O
 				ON     CD.ITEM_CD = O.GOODS_CD
 				AND    CD.OPT_CD = O.OPT_CD
+				INNER  JOIN (   SELECT A.CART_SQ
+									 , MIN(A.SOLDOUT_YN) AS SOLDOUT_YN
+								FROM   (SELECT C.CART_SQ
+											 , CASE WHEN VS.SOLDOUT_YN = 'N' AND VS.CURR_STOCK_QTY > C.GOODS_QTY * GC.QTY THEN 'N'
+													ELSE 'Y' END AS SOLDOUT_YN
+										FROM   TB_CART C
+										INNER  JOIN TB_CART_DETAIL CD
+										ON     C.CART_SQ = CD.CART_SQ
+										INNER  JOIN TB_GOODS G
+										ON     C.GOODS_CD = G.GOODS_CD
+										INNER  JOIN TB_GOODS_COMPOSE GC
+										ON     C.GOODS_CD = GC.GOODS_CD
+										AND    CD.ITEM_CD = GC.COMPS_GOODS_CD
+										INNER  JOIN VW_STOCK VS
+										ON     CD.ITEM_CD = VS.GOODS_CD
+										AND    CD.OPT_CD = VS.OPT_CD
+										WHERE  1=1
+										AND    C.CART_GB = 'G026_BC'
+										AND    G.GOODS_STAT = 'G008_90'
+										AND    G.SELF_MALL_YN = 'Y'
+										<if test="custNo == 0">
+											AND    C.CUST_NO = 0
+											AND    C.JSESSION_ID = #{jsessionId}
+										</if>
+										<if test="custNo != 0">
+											AND    C.CUST_NO = #{custNo}
+										</if>
+										UNION ALL
+										SELECT C.CART_SQ
+											 , CASE WHEN VS.SOLDOUT_YN = 'N' AND VS.CURR_STOCK_QTY > C.GOODS_QTY THEN 'N'
+													ELSE 'Y' END AS SOLDOUT_YN
+										FROM   TB_CART C
+										INNER  JOIN TB_CART_DETAIL CD
+										ON     C.CART_SQ = CD.CART_SQ
+										INNER  JOIN TB_GOODS G
+										ON     C.GOODS_CD = G.GOODS_CD
+										INNER  JOIN VW_STOCK VS
+										ON     C.GOODS_CD = VS.GOODS_CD
+										AND    CD.OPT_CD = VS.OPT_CD
+										WHERE  1=1
+										AND    C.CART_GB = 'G026_BC'
+										AND    G.GOODS_STAT = 'G008_90'
+										AND    G.SELF_MALL_YN = 'Y'
+										<if test="custNo == 0">
+											AND    C.CUST_NO = 0
+											AND    C.JSESSION_ID = #{jsessionId}
+										</if>
+										<if test="custNo != 0">
+											AND    C.CUST_NO = #{custNo}
+										</if>
+								       ) A
+								GROUP  BY  A.CART_SQ
+					   ) STOCK
+				ON     C.CART_SQ = STOCK.CART_SQ
 				WHERE  G.SELF_MALL_YN = 'Y'
 				AND    G.GOODS_STAT = 'G008_90'
 				<if test="custNo == 0">
@@ -455,8 +589,8 @@
 		     , Z.PNT_PRATE
 			 , Z.PNT_MRATE
 			 , GI.SYS_IMG_NM
-		ORDER  BY Z.SUPPLY_COMP_CD
-			 , Z.GOODS_CD
+		ORDER  BY Z.DELV_FEE_CD
+			 , Z.CART_SQ
 	</select>
 
 	<!-- 장바구니 업체별 배송비 -->

+ 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

+ 23 - 13
src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml

@@ -151,8 +151,7 @@
 	<insert id="createCustomer" parameterType="Customer" keyProperty="custNo">
 		/* TsfCustomer.createCustomer */
 		INSERT INTO TB_CUSTOMER (
-		       CUST_NO
-		     , CUST_ID
+		       CUST_ID
 		     , CUST_NM
 		     , PASSWD
 		     , BIRTH_YMD
@@ -193,21 +192,29 @@
 		     , UPD_NO
 		     , UPD_DT
 		)
-		SELECT #{custNo}                           AS CUST_NO
-		     , #{custId}                           AS CUST_ID
+		SELECT #{custId}                           AS CUST_ID
 		     , #{encodedCustNm}                    AS CUST_NM
 		     , #{encodedPasswd}                    AS PASSWD
 		     , #{encodedBirthYmd}                  AS BIRTH_YMD
 		     , #{birthSm}                          AS BIRTH_SM
 		     , #{encodedSexGb}                     AS SEX_GB
 		     , #{encodedCellPhnno}                 AS CELL_PHNNO
-		     , #{appAgreeYn}                       AS APP_AGREE_YN
-		     , #{appAgreeDt}                       AS APP_AGREE_DT
-		     , #{smsAgreeYn}                       AS SMS_AGREE_YN
-		     , #{smsAgreeDt}                       AS SMS_AGREE_DT
+		     , IFNULL(#{appAgreeYn}, 'N')          AS APP_AGREE_YN
+		     , CASE WHEN #{appAgreeYn} = 'Y' THEN
+		            NOW()
+		       ELSE NULL
+		       END                                 AS APP_AGREE_DT
+		     , IFNULL(#{smsAgreeYn}, 'N')          AS SMS_AGREE_YN
+		     , CASE WHEN #{smsAgreeYn} = 'Y' THEN
+		            NOW()
+		       ELSE NULL
+		       END                                 AS SMS_AGREE_DT
 		     , #{encodedEmail}                     AS EMAIL
-		     , #{emailAgreeYn}                     AS EMAIL_AGREE_YN
-		     , #{emailAgreeDt}                     AS EMAIL_AGREE_DT
+		     , IFNULL(#{emailAgreeYn}, 'N')        AS EMAIL_AGREE_YN
+		     , CASE WHEN #{emailAgreeYn} = 'Y' THEN
+		            NOW()
+		       ELSE NULL
+		       END                                 AS EMAIL_AGREE_DT
 		     , #{homeZipcode}                      AS HOME_ZIPCODE
 		     , #{encodedHomeBaseAddr}              AS HOME_BASE_ADDR
 		     , #{encodedHomeDtlAddr}               AS HOME_DTL_ADDR
@@ -223,16 +230,19 @@
 		     , 'N'                                 AS TEMP_PASSWD_YN
 		     , NOW()                               AS LOGIN_LDT
 		     , #{ci}                               AS CI
-		     , NOW()                               AS AUTH_DT
+		     , CASE WHEN #{ci} != '' THEN
+		            NOW()
+		       ELSE NULL
+		       END                                 AS AUTH_DT
 		     , #{managedRsn}                       AS MANAGED_RSN
 		     , #{managedDtlRsn}                    AS MANAGED_DTL_RSN
 		     , #{managedDt}                        AS MANAGED_DT
 		     , #{secedeRsn}                        AS SECEDE_RSN
 		     , #{secedeDtlRsn}                     AS SECEDE_DTL_RSN
 		     , #{secedeDt}                         AS SECEDE_DT
-		     , #{custNo}                           AS REG_NO
+		     , 0                                   AS REG_NO
 		     , NOW()                               AS REG_DT
-		     , #{custNo}                           AS UPD_NO
+		     , 0                                   AS UPD_NO
 		     , NOW()                               AS UPD_DT
 	</insert>
 

+ 12 - 8
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -82,14 +82,14 @@
 		SELECT G.GOODS_CD
 		     , G.GOODS_NM
 		     , G.GOODS_TNM
-		     , CONCAT(IF(IFNULL(G.GOODS_GB,'') IN ('G073_11','G073_15', ''), '',CONCAT('[',FN_GET_CODE_NM('G073',G.GOODS_GB),']') )
+		     , CONCAT(IF(IFNULL(G.GOODS_GB,'') IN ('G073_11','G073_15', ''), '',IFNULL(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
+		     , (CASE WHEN D.DISP_NM_LANG = 'EN' THEN D.BRAND_GROUP_ENM ELSE D.BRAND_GROUP_KNM END) AS BRAND_GROUP_NM
+		     , D.BRAND_GROUP_NO
 		     , B.LOGO_FILE_NM
 		     , G.ITEMKIND_CD
 		     , G.FORMAL_GB
@@ -105,8 +105,8 @@
 		     , G.DAY_MAX_ORD_QTY
 		     , G.SEX_GB
 		     , FN_GET_CODE_NM('G007',G.SEX_GB) AS SEX_NM
-		     , G.DELV_FEE
-		     , G.MIN_ORD_AMT
+		     , E.DELV_FEE
+		     , E.MIN_ORD_AMT
 		     , G.GOODS_GB
 		     , (SELECT NI_CLSF_CD
 		        FROM TB_ITEMKIND
@@ -144,10 +144,14 @@
 		FROM TB_GOODS G
 		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
 		                      AND B.USE_YN = 'Y'
+		INNER JOIN TB_BRAND_GROUP D ON B.BRAND_GROUP_NO = D.BRAND_GROUP_NO
+		                            AND D.USE_YN = 'Y'
 		INNER JOIN (SELECT GOODS_CD, 
 		            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
+		INNER JOIN TB_DELV_FEE_POLICY E ON G.SUPPLY_COMP_CD = E.SUPPLY_COMP_CD
+		                                     AND G.DELV_FEE_CD =  E.DELV_FEE_CD
 		LEFT OUTER JOIN TB_WISHLIST W ON G.GOODS_CD = W.GOODS_CD
 		                              AND IFNULL(#{custNo}, 0) = W.CUST_NO
 		WHERE G.GOODS_CD = #{goodsCd}
@@ -531,7 +535,7 @@
 		           , 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),']') )
+		           , CONCAT(IF(IFNULL(G.GOODS_GB,'') IN ('G073_11','G073_15', ''), '',IFNULL(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','[주문제작]','')
@@ -578,8 +582,8 @@
 		                                  , 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 
+		                             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'

+ 73 - 57
src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml

@@ -66,6 +66,7 @@
 		 INNER JOIN TB_ORDER_DETAIL_ITEM ODI
 		    ON OD.ORD_NO = ODI.ORD_NO
 		   AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		   AND ODI.ORD_DTL_STAT NOT IN ('G013_11', 'G013_25', 'G013_97')
 		 INNER JOIN TB_GOODS G
 		    ON OD.GOODS_CD = G.GOODS_CD
 		 INNER JOIN TB_BRAND B
@@ -92,14 +93,12 @@
 			<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="ordNoList != null">
+		   AND O.ORD_NO IN
+				<foreach collection="ordNoList" item="item" index="index"  open="(" close=")" separator=",">
+					#{item}
+				</foreach>
+			</if>
 			<if test="ordDtlNoArr != null">
 		   AND OD.ORD_DTL_NO IN
 				<foreach collection="ordDtlNoArr" item="item" index="index"  open="(" close=")" separator=",">
@@ -111,65 +110,64 @@
 		 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
+				, R.REVIEW_SQ
 	</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 +179,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>
 
@@ -233,7 +234,9 @@
 		     , CARD_KIND
 		     , CARD_BANK
 		     , CARD_NM
-		     , CARD_MIPS
+		     , CASE CARD_MIPS WHEN 0 THEN '일시불'
+							  ELSE CONCAT(CARD_MIPS, '개월')
+				END									AS CARD_MIPS
 		     , CARD_PCABLE_YN
 		     , VA_NO
 		     , VA_NM
@@ -285,14 +288,27 @@
 			 , DA.RECIP_BASE_ADDR
 			 , DA.RECIP_DTL_ADDR
 			 , DA.DELV_MEMO
+			 , DL.RTN_LOC_NM
+			 , DL.RTN_LOC_TELNO
+			 , DL.RTN_LOC_ZIPCODE
+			 , DL.RTN_LOC_BASE_ADDR
+			 , DL.RTN_LOC_DTL_ADDR
 			 , DA.REG_NO
 			 , DA.REG_DT
 			 , DA.UPD_NO
 			 , DA.UPD_DT
 		  FROM TB_DELIVERY_ADDR DA
-		  INNER JOIN TB_ORDER_DETAIL OD
-		  ON OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
-			  AND OD.ORD_NO = #{ordNo}
+		 INNER JOIN TB_ORDER_DETAIL OD
+		    ON OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
+		   AND OD.ORD_NO = #{ordNo}
+		<if test="ordDtlNoArr != null">
+		   AND OD.ORD_DTL_NO IN
+			<foreach collection="ordDtlNoArr" item="item" index="index"  open="(" close=")" separator=",">
+				#{item}
+			</foreach>
+		</if>
+		  LEFT OUTER JOIN TB_DELIVERY_LOC DL
+		    ON OD.DELV_LOC_CD = DL.DELV_LOC_CD
 		 LIMIT 1
 	</select>
 

+ 292 - 96
src/main/webapp/WEB-INF/views/web/cart/cartListAjaxFormWeb.html

@@ -52,8 +52,19 @@
                     </colgroup>
                     <tbody>
                     <th:block th:each="cart, status : ${wmsCartList}">
-                    <tr>
-                        <td>
+                    <tr class="cartInfo">
+                        <input type="hidden" name="applyQtySectionYn" th:value="${cart.applyQtySectionYn}" />
+                        <input type="hidden" name="applyAmtSectionYn" th:value="${cart.applyAmtSectionYn}" />
+                        <input type="hidden" name="qtyTmtbSq" th:value="${cart.qtyTmtbSq}" />
+                        <input type="hidden" name="qtyTmtbNm" th:value="${cart.qtyTmtbNm}" />
+                        <input type="hidden" name="amtTmtbSq" th:value="${cart.amtTmtbSq}" />
+                        <input type="hidden" name="amtTmtbNm" th:value="${cart.amtTmtbNm}" />
+                        <input type="hidden" name="currPrice" th:value="${cart.currPrice}" />
+                        <input type="hidden" neme="soldoutYn" th:value="${cart.soldoutYn}" />
+                        <input type="hidden" neme="tmtbDcAmt" th:value="${cart.tmtbDcAmt}" />
+                        <input type="hidden" neme="cartSq" th:value="${cart.cartSq}" />
+
+                        <td style="border-left:none;">
                             <!-- 주문가능 상품 -->
                             <div class="info_item" th:classappend="${cart.soldoutYn.equals('Y')} ? unable"> <!-- 주문불가시 class="unable" 추가 / 인풋, 버튼 disable 처리 -->
                                 <div class="form_box">
@@ -79,10 +90,13 @@
                                     </p>
                                     <p class="od_opt" th:each="opt, index : ${cart.itemNmArr}">
                                         <span class="option"><em th:text="${cart.itemNmArr[index.index]} + '_' + ${cart.optCdArr[index.index]}"></em></span>
-                                        <span class="count">수량:<em th:text="${cart.itemQtyArr[index.index]} * ${cart.goodsQty}"></em>개</span>
                                     </p>
+                                    <p class="od_opt">
+                                        <span class="count">수량:<em th:text="${cart.goodsQty}"></em>개</span>
+                                    </p>
+
                                     <p class="od_modify">
-                                        <button type="button"><span>옵션/수량변경</span></button>
+                                        <button type="button" class="btn_opt_pop"><span>옵션/수량변경</span></button>
                                     </p>
                                     <!-- 다다익선 적용 -->
                                     <div class="od_moresale" th:if="${cart.applyQtySectionYn == 'Y' or cart.applyAmtSectionYn == 'Y'}">
@@ -103,8 +117,8 @@
                                         </a>
                                         <div class="li_moresale">
                                             <ul>
-                                                <li th:if="${cart.applyQtySectionYn == 'N'}" th:text="${cart.qtyTmtbNm}"><a href="">대상 상품 보기</a></li>
-                                                <li th:if="${cart.applyAmtSectionYn == 'N'}" th:text="${cart.amtTmtbNm}"><a href="">대상 상품 보기</a></li>
+                                                <li th:if="${cart.applyQtySectionYn == 'N'}" th:inline="text">[[${cart.qtyTmtbNm}]]<a href=''>대상 상품 보기</a></li>
+                                                <li th:if="${cart.applyAmtSectionYn == 'N'}" th:inline="text">[[${cart.amtTmtbNm}]]<a href=''>대상 상품 보기</a></li>
                                             </ul>
                                         </div>
                                     </div>
@@ -115,11 +129,11 @@
                                     <!-- //주문불가시 안내추가 -->
                                 </div>
                                 <div class="info_calc">
-                                    <p class="price" th:if="${cart.tmtbDcAmt > 0}">
+                                    <p class="price" th:if="${cart.tmtbDcAmt < cart.currPrice}">
                                         <span class="selling_price" th:text="|${#numbers.formatInteger(cart.tmtbDcAmt, 1, 'COMMA')} 원|"></span>
                                         <del th:text="|${#numbers.formatInteger(cart.currPrice, 1, 'COMMA')} 원|"></del>
                                     </p>
-                                    <p class="price" th:if="${cart.tmtbDcAmt == 0}">
+                                    <p class="price" th:if="${cart.tmtbDcAmt == cart.currPrice}">
                                         <span class="selling_price" th:text="|${#numbers.formatInteger(cart.currPrice, 1, 'COMMA')} 원|"></span>
                                     </p>
                                     <p class="point"><span th:text="${#numbers.formatInteger(cart.savePntAmt, 1, 'COMMA')}"></span>p 적립예정</p>
@@ -129,7 +143,7 @@
                                     </p>
                                     <p class="util">
                                         <span>
-                                            <button type="button" class="btn_favorite"><span><i class="ico ico_like2"></i><em class="sr-only">관심상품 추가</em></span></button>
+                                            <button type="button" class="btn_favorite" th:classappend="${cart.wishCnt > 0} ? active"><span><i class="ico ico_like2"></i><em class="sr-only">관심상품 추가</em></span></button>
                                         </span>
                                         <span>
                                             <button type="button" class="btn_delete"><span><i class="ico ico_trash"></i><em class="sr-only">상품삭제</em></span></button>
@@ -171,13 +185,24 @@
                     </colgroup>
                     <tbody>
                     <th:block th:each="cart, status : ${delvCartList}">
-                    <tr>
-                        <td>
-                            <div class="info_item">
+                    <tr class="cartInfo">
+                        <input type="hidden" name="applyQtySectionYn" th:value="${cart.applyQtySectionYn}" />
+                        <input type="hidden" name="applyAmtSectionYn" th:value="${cart.applyAmtSectionYn}" />
+                        <input type="hidden" name="qtyTmtbSq" th:value="${cart.qtyTmtbSq}" />
+                        <input type="hidden" name="qtyTmtbNm" th:value="${cart.qtyTmtbNm}" />
+                        <input type="hidden" name="amtTmtbSq" th:value="${cart.amtTmtbSq}" />
+                        <input type="hidden" name="amtTmtbNm" th:value="${cart.amtTmtbNm}" />
+                        <input type="hidden" name="currPrice" th:value="${cart.currPrice}" />
+                        <input type="hidden" neme="soldoutYn" th:value="${cart.soldoutYn}" />
+                        <input type="hidden" neme="tmtbDcAmt" th:value="${cart.tmtbDcAmt}" />
+                        <input type="hidden" neme="cartSq" th:value="${cart.cartSq}" />
+
+                        <td style="border-left:none;">
+                            <div class="info_item" th:classappend="${cart.soldoutYn.equals('Y')} ? unable">
                                 <div class="form_box">
                                     <p class="form_field">
-                                        <input id="od_item_21" name="cartSqArr" type="checkbox" th:value="${cart.cartSq}" th:checked="${cart.soldoutYn.equals('N')}">
-                                        <label for="od_item_21">
+                                        <input th:id="|od_item_${cart.cartSq}|" name="cartSqArr" type="checkbox" th:value="${cart.cartSq}" th:checked="${cart.soldoutYn.equals('N')}" th:disabled="${cart.soldoutYn.equals('Y')}"/>
+                                        <label th:for="|od_item_${cart.cartSq}|">
                                             <span class="sr-only">상품선택</span>
                                         </label>
                                     </p>
@@ -196,10 +221,12 @@
                                     </p>
                                     <p class="od_opt" th:each="opt, index : ${cart.itemNmArr}">
                                         <span class="option"><em th:text="${cart.itemNmArr[index.index]} + '_' + ${cart.optCdArr[index.index]}"></em></span>
-                                        <span class="count">수량:<em th:text="${cart.itemQtyArr[index.index]} * ${cart.goodsQty}"></em>개</span>
+                                    </p>
+                                    <p class="od_opt">
+                                        <span class="count">수량:<em th:text="${cart.goodsQty}"></em>개</span>
                                     </p>
                                     <p class="od_modify">
-                                        <button type="button" id="btn_opt_pop"><span>옵션/수량변경</span></button>
+                                        <button type="button" class="btn_opt_pop"><span>옵션/수량변경</span></button>
                                     </p>
                                     <!-- 다다익선 적용 -->
                                     <div class="od_moresale" th:if="${cart.applyQtySectionYn == 'Y' or cart.applyAmtSectionYn == 'Y'}">
@@ -232,11 +259,11 @@
                                     <!-- //주문불가시 안내추가 -->
                                 </div>
                                 <div class="info_calc">
-                                    <p class="price" th:if="${cart.tmtbDcAmt > 0}">
+                                    <p class="price" th:if="${cart.tmtbDcAmt < cart.currPrice}">
                                         <span class="selling_price" th:text="|${#numbers.formatInteger(cart.tmtbDcAmt, 1, 'COMMA')} 원|"></span>
                                         <del th:text="|${#numbers.formatInteger(cart.currPrice, 1, 'COMMA')} 원|"></del>
                                     </p>
-                                    <p class="price" th:if="${cart.tmtbDcAmt == 0}">
+                                    <p class="price" th:if="${cart.tmtbDcAmt == cart.currPrice}">
                                         <span class="selling_price" th:text="|${#numbers.formatInteger(cart.currPrice, 1, 'COMMA')} 원|"></span>
                                     </p>
                                     <p class="point"><span th:text="${#numbers.formatInteger(cart.savePntAmt, 1, 'COMMA')}"></span>p 적립예정</p>
@@ -322,22 +349,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>
@@ -352,93 +378,196 @@
         </div>
     </div>
     <div class="area_saleitem">
-        <h4>다다익선 할인 대상이 있습니다.</h4>
-        <div class="more_sale">
-            <div class="item_gd">
-                <figure>
-                    <a href="">
-                        <span class="thumb"><img src="/images/pc/thumb/tmp_odSide2.jpg" alt=""></span>
-                    </a>
-                    <figcaption>
-                        <a href="">
-                            <div class="brand">CURLYSUE 컬리수</div>
-                            <div class="name">[★2020 겨울신상★] 리버시블 경량점퍼 CPW0XQJM51 [겨울] 리버시블 경량점퍼 CPW0XQJM51 [겨울]</div>
-                            <div class="price">
-                                <del>7,000,000</del>
-                                <span class="selling_price">1,000,000</span>
-                                <span class="discount">30%</span>
-                            </div>
-                        </a>
-                    </figcaption>
-                </figure>
-            </div>
-            <div class="item_gd">
-                <figure>
-                    <a href="">
-                        <span class="thumb"><img src="/images/pc/thumb/tmp_odSide2.jpg" alt=""></span>
-                    </a>
-                    <figcaption>
-                        <a href="">
-                            <div class="brand">CURLYSUE 컬리수</div>
-                            <div class="name">[★2020 겨울신상★] 리버시블 경량점퍼 CPW0XQJM51 [겨울] 리버시블 경량점퍼 CPW0XQJM51 [겨울]</div>
-                            <div class="price">
-                                <span class="selling_price">1,000,000</span>
-                            </div>
-                        </a>
-                    </figcaption>
-                </figure>
-            </div>
-            <div class="txt">
-                <a href="">
-                    <i class="ico ico_saletag"></i>
-                    <span>TBJ 브랜드 구매시 30,000원 할인</span>
-                </a>
-            </div>
-        </div>
-        <div class="more_sale">
-            <div class="txt">
-                <a href="">
-                    <i class="ico ico_saletag"></i>
-                    <span>300,000이상 구매시 30% 할인</span>
-                    <span>500,000이상 구매시 추가 10% 할인</span>
-                </a>
-            </div>
-        </div>
+
     </div>
 </div>
 <div class="clear"></div>
 <!-- // CONT-BODY -->
 </form>
 
-<script type="text/javascript">
+<script th:inline="javascript">
     let sumRealPayAmt = [[${order.sumRealPayAmt}]];
     let totDcAmt = [[${order.totDcAmt}]];
 
+    function NotApplyTmtbCartList() {
+        let tmtbSq = 0;
+        let tmtbNm = "";
+        let goodsList = {
+            brandNm : "",
+            goodsNm : "",
+            currPrice : 0,
+            imgPath : ""
+        }
+    }
+
     $(document).ready(function() {
-        $("#sumRealPayAmt").text(Number(sumRealPayAmt).toLocaleString());
-        $("#totDcAmt").text(Number(totDcAmt).toLocaleString());
-        //$("#cartListForm").submit();
-       /* $.ajax( {
-            type: "POST",
-            url : '/cart/goods/list',
-            dataType : 'html',
-            success : function(result) {
-                if (result != null) {
-                    $("#cartAjaxList").html(result);
+        $(".area_salecoupon .coupon_box").hide();
+        /* TODO 로그인 안했으면 .area_salecoupon (할인코드 입력 부 및 쿠폰정보영역) hide 시킬것 */
+
+        // 다다익선 할인 대상(미적용) 리스트
+        notApplyTmtbAreaList();
+
+        /*$("#sumRealPayAmt").text(Number(sumRealPayAmt).toLocaleString());
+        $("#totDcAmt").text(Number(totDcAmt).toLocaleString());*/
+
+    });
+
+    function notApplyTmtbAreaList() {
+        let notApplyQtyTmtbList = new Array();
+        let notApplyAmtTmtbList = new Array();
+
+        // 수량 다다익선 조회
+        $("#cartListForm input[name=qtyTmtbSq]").each(function (index) {
+            if($(this).val() != "0" && $(this).parent().find("input[name=applyQtySectionYn]").val() != "Y") {
+                let obj = new Object();
+                obj.tmtbSq = $(this).val();
+                obj.tmtbNm = $(this).parent().find("input[name=qtyTmtbNm]").val();
+                obj.currPrice = $(this).parent().find("input[name=currPrice]").val();
+                obj.goodsNm = $(this).parent().find(".info_box").find(".name").text();
+                obj.brandNm = $(this).parent().find(".info_box").find(".brand").text();
+                obj.imgPath = $(this).parent().find(".info_item").find(".thumb_box img").attr("src");
+
+                notApplyQtyTmtbList.push(obj);
+            }
+
+            if($(this).parent().find("input[name=applyAmtSectionYn]").val() == "N") {       // 다다익선 금액은 기본상품만 가져오면됨 (N은 기본상품에 걸려있음)
+                let obj = new Object();
+                obj.tmtbSq = $(this).parent().find("input[name=amtTmtbSq]").val();
+                obj.tmtbNm = $(this).parent().find("input[name=amtTmtbNm]").val();
+
+                notApplyAmtTmtbList.push(obj);
+            }
+        });
+
+        // 수량 다다익선 정렬
+        var t = new Object();
+        for (let i = 0; i < notApplyQtyTmtbList.length; i++) {
+            for (let j = 0; j < notApplyQtyTmtbList.length - i - 1; j++) {
+                if (notApplyQtyTmtbList[j].tmtbSq > notApplyQtyTmtbList[j + 1].tmtbSq) {
+                    t = notApplyQtyTmtbList[j];
+                    notApplyQtyTmtbList[j] = notApplyQtyTmtbList[j + 1];
+                    notApplyQtyTmtbList[j + 1] = t;
                 }
             }
-        });*/
-    });
+        }
+
+        // 정렬 후 같은 다다익선 상품은 한 배열로 묶음
+        let tmtbQtyList = new Array();
+        for (let i = 0; i < notApplyQtyTmtbList.length; i++) {
+            let goods = notApplyQtyTmtbList[i];
+            let tmtbInfo = new Object();
+            let chk = false;
+            for (let j = 0; j < tmtbQtyList.length; j++) {
+                let tmtb = tmtbQtyList[j];
+                if (goods.tmtbSq == tmtb.tmtbSq) {
+                    tmtbInfo = tmtbQtyList[j];
+                    chk = true;
+                }
+            }
+
+            // 현재 상품 정보
+            let goodsInfo = new Object();
+            goodsInfo.brandNm = goods.brandNm;
+            goodsInfo.goodsNm = goods.goodsNm;
+            goodsInfo.imgPath = goods.imgPath;
+            goodsInfo.currPrice = goods.currPrice;
+
+            // 현재 상품 정보 다다익선 정보에 세팅
+            if (chk) {
+                tmtbInfo.goodsList.push(goodsInfo);
+            } else {
+                let obj = new Object();
+                obj.tmtbSq = goods.tmtbSq;
+                obj.tmtbNm = goods.tmtbNm;
+                obj.goodsList = new Array();
+                obj.goodsList.push(goodsInfo);
+                tmtbQtyList.push(obj);
+            }
+        }
+
+        // 수량 다다익선 HTML 작성
+        let tmtbHtml = "<h4>다다익선 할인 대상이 있습니다.</h4>";
+        for(let i = 0 ; i < tmtbQtyList.length ; i++) {
+            let tmtb = tmtbQtyList[i];
+            tmtbHtml += '<div class="more_sale qtyNotApplyTmtbList">';
+            for(let j = 0 ; j < tmtb.goodsList.length ; j++) {
+                let goods = tmtb.goodsList[j];
+                tmtbHtml += '<div class="item_gd">\n' +
+                        '                <figure>\n' +
+                        '                    <a href="">\n' +
+                        '                        <span class="thumb"><img src="';
+                tmtbHtml += goods.imgPath;
+                tmtbHtml += '" alt=""></span>\n' +
+                        '                    </a>\n' +
+                        '                    <figcaption>\n' +
+                        '                        <a href="">\n' +
+                        '                            <div class="brand">';
+                tmtbHtml += goods.brandNm;
+                tmtbHtml += '</div>\n' +
+                        '                            <div class="name">';
+                tmtbHtml += goods.goodsNm;
+                tmtbHtml += '</div>\n' +
+                        '                            <div class="price">\n' +
+                        '                                <span class="selling_price">';
+                tmtbHtml += Number(goods.currPrice).toLocaleString();
+                tmtbHtml += '</span>\n' +
+                        '                            </div>\n' +
+                        '                        </a>\n' +
+                        '                    </figcaption>\n' +
+                        '                </figure>\n' +
+                        '            </div>';
+            }
+
+            tmtbHtml += '<div class="txt">\n' +
+                    '                <a href="">\n' +
+                    '                    <i class="ico ico_saletag"></i>\n' +
+                    '                    <input type="hidden" name="tmtbSq" value="' + tmtb.tmtbSq + '" />' +
+                    '                    <span>\n';
+            tmtbHtml += tmtb.tmtbNm;
+            tmtbHtml += '</span>\n' +
+                    '                </a>\n' +
+                    '            </div>\n' +
+                    '        </div>';
+        }
+
+        // 금액 다다익선 정보 HTML 작성
+        for(let i = 0 ; i < notApplyAmtTmtbList.length ; i++) {
+            let tmtb = notApplyAmtTmtbList[i];
+            tmtbHtml += '<div class="more_sale amtNotApplyTmtbList">\n' +
+                    '            <div class="txt">\n' +
+                    '                <a href="">\n' +
+                    '                    <i class="ico ico_saletag"></i>\n' +
+                    '                    <input type="hidden" name="tmtbSq" value="' + tmtb.tmtbSq + '" />' +
+                    '                    <span>';
+            tmtbHtml += tmtb.tmtbNm;
+            tmtbHtml += '</span>\n' +
+                    '                </a>\n' +
+                    '            </div>\n' +
+                    '        </div>';
+        }
+
+        $(".area_saleitem").html(tmtbHtml);
+
+    }
+
+    function cancelCartCpn() {
+        $("#sumRealPayAmt").text(Number(sumRealPayAmt).toLocaleString());
+        $("#totDcAmt").text(Number(totDcAmt).toLocaleString());
+        $(".area_salecoupon .coupon_box").hide();
+    }
 
     function serialCpnApply() {
-        let testArr = [];
+        let cartArr = [];
+        let currPrices = [];
         $("#cartListForm input[name=cartSqArr]").each(function(index, item) {
-            testArr.push($(this).val());
+            cartArr.push($(this).val());
+            currPrices.push($(this).parent(".cartInfo").find("input[name=tmtbDcAmt]").val());
         });
 
         let data = {
             rdCpnNm : $("#serialCpnNm").val(),
-            cartSqArr : testArr
+            cartSqArr : cartArr,
+            currPrices : currPrices
         }
 
         let jsonData = JSON.stringify(data);
@@ -450,11 +579,78 @@
             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>");
+                }
             }
         });
     };
+
+    //다다익선 적용내역 보기
+    $(document).on('click','.shopping_bag .part_deliver .btn_moresale',function(e){
+        $(this).toggleClass('active');
+        $(this).parents('.od_moresale').find('.li_moresale').toggle();
+        return false;
+    });
+
+    //관심상품 등록
+    $(document).on('click','.shopping_bag .part_deliver .btn_favorite',function(e){
+        $(this).toggleClass('active');
+        return false;
+    });
+
+    //쿠폰사용안내 팝업열기
+    $(document).on('click','#btn_cpinfo_pop',function(e){
+        $("#cpinfoPop").modal("show");
+        return false;
+    });
+
+    $("input[name=cartSqArr]").on("change", function(e) {
+       /*alert($("input[name=cartSqArr]").length + " / " + $("input[name=cartSqArr]:checked").length);
+       alert($("#od_item_15").prop("checked"));*/
+    });
+
+    //옵션변경 팝업열기
+    $(document).on('click','.btn_opt_pop',function(e){
+        $("#optModifyPop").modal("show");
+        return false;
+    });
+
+    //상품옵션변경 팝업 > 수량조절
+    $(document).on('click','.opt_modify_pop .number_count .minus',function(e){
+        var $input = $(this).parent().find('input');
+        var count = parseInt($input.val()) - 1;
+        count = count < 1 ? 1 : count;
+        $input.val(count);
+        $input.change();
+        return false;
+    }).on('click','.opt_modify_pop .number_count .plus',function(e){
+        var $input = $(this).parent().find('input');
+        $input.val(parseInt($input.val()) + 1);
+        $input.change();
+        return false;
+    });
+
+    //상품옵션변경 팝업 > 컬러선택 표기
+    $(document).on('click','.opt_modify_pop .opt_color ul li a',function(e){
+        $(this).parents('.opt_color').find('li a').removeClass('on');
+        $(this).addClass('on');
+        var optColor = $('.opt_modify_pop .opt_color ul li a.on img').attr('alt');
+        $('.opt_modify_pop .opt_color .opt_header .color').text(optColor);
+        return false;
+    });
 </script>
 </html>

+ 15 - 19
src/main/webapp/WEB-INF/views/web/cart/cartListFormWeb.html

@@ -409,6 +409,9 @@
 </div>
 <!-- //쿠폰사용안내 팝업 -->
 
+<script src="/ux/pc/js/swiper.min.js"></script>
+<link rel="stylesheet" type="text/css" href="/ux/pc/css/swiper.min.css" />
+
 <script type="text/javascript">
     /* xodud1202 수정 */
 
@@ -437,25 +440,18 @@
 
 
     $(function(){
-        // 추천상품 슬라이드
-        $('.od_recommend .item_slide').slick({
-            dots: true,
-            infinite: true,
-            speed: 300,
-            slidesToShow: 5,
-            slidesToScroll: 5,
-            adaptiveHeight: true
-        });
-
-        $('.part_dlvr').on('click','.btn_moresale',function(e){
-            //다다익선 적용내역 보기
-            e.preventDefault();
-            $(this).toggleClass('active');
-            $(this).parents('.od_moresale').find('.li_moresale').toggle();
-        }).on('click','.btn_favorite',function(e){
-            //관심상품 등록
-            e.preventDefault();
-            $(this).toggleClass('active');
+        //추천상품 슬라이드
+        var rcmdItemSwiper = new Swiper('.od_recommend .swiper-container', {
+            slidesPerView: 5,
+            spaceBetween: 0,
+            navigation: {
+                nextEl: '.od_recommend .swiper-button-next',
+                prevEl: '.od_recommend .swiper-button-prev',
+            },
+            pagination: {
+                el: '.od_recommend .swiper-pagination',
+                clickable: true,
+            },
         });
     });
 </script>

+ 13 - 16
src/main/webapp/WEB-INF/views/web/common/layout/MypageLayoutWeb.html

@@ -45,14 +45,6 @@
 					</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>
 						</ul>
 					</div>
 				</div>
@@ -73,18 +65,23 @@
 <th:block th:replace="~{web/common/fragments/ScriptsWeb :: scripts}"></th:block>
 <!-- <th:block th:replace="~{web/common/fragments/MarketingScripts :: mscripts}"></th:block> -->
 
+<script th:src="@{'/ux/pc/js/cart.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/ux/pc/js/cart.js"></script>
+
 <script th:inline="javascript">
 /*<![CDATA[*/
 	var fnSetMypageLnbList = function(lnbLvl) {
 		let tag = '';
-		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_ORDER_LIST);"' + (lnbLvl == 1 ? ' class="on"' : '') + '>주문확인/배송조회</a></li>\n';
-		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_CRS_LIST);"' + (lnbLvl == 2 ? ' class="on"' : '') + '>취소/반품/환불내역</a></li>\n';
-		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_RESTOCK);"' + (lnbLvl == 3 ? ' class="on"' : '') + '>재입고 알림 내역</a></li>\n';
-		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_REVIEW);"' + (lnbLvl == 4 ? ' class="on"' : '') + '>리뷰</a></li>\n';
-		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_DELIVERY_ADDR);"' + (lnbLvl == 5 ? ' class="on"' : '') + '>배송지 관리</a></li>\n';
-		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_WISHLIST);"' + (lnbLvl == 6 ? ' class="on"' : '') + '>위시리스트</a></li>\n';
-		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_CUSTOMER);"' + (lnbLvl == 7 ? ' class="on"' : '') + '>내정보 관리</a></li>\n';
-		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_SECEDE);"' + (lnbLvl == 8 ? ' class="on"' : '') + '>회원 탈퇴</a></li>\n';
+		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_MYPAGE_ORDER_LIST);"' + (lnbLvl == 1 ? ' class="on"' : '') + '>주문확인/배송조회</a></li>\n';
+		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_MYPAGE_CRS_LIST);"' + (lnbLvl == 2 ? ' class="on"' : '') + '>취소/반품/환불내역</a></li>\n';
+		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_MYPAGE_RESTOCK);"' + (lnbLvl == 3 ? ' class="on"' : '') + '>재입고 알림 내역</a></li>\n';
+		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_MYPAGE_COUPON);"' + (lnbLvl == 4 ? ' class="on"' : '') + '>쿠폰</a></li>\n';
+		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_MYPAGE_POINT);"' + (lnbLvl == 5 ? ' class="on"' : '') + '>STYLE24 포인트</a></li>\n';
+		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_MYPAGE_GIFTCARD);"' + (lnbLvl == 6 ? ' class="on"' : '') + '>상품권</a></li>\n';
+		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_MYPAGE_REVIEW);"' + (lnbLvl == 7 ? ' class="on"' : '') + '>리뷰</a></li>\n';
+		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_MYPAGE_DELIVERY_ADDR);"' + (lnbLvl == 8 ? ' class="on"' : '') + '>배송지 관리</a></li>\n';
+		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_MYPAGE_WISHLIST);"' + (lnbLvl == 9 ? ' class="on"' : '') + '>위시리스트</a></li>\n';
+		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_MYPAGE_CUSTOMER);"' + (lnbLvl == 10 ? ' class="on"' : '') + '>내정보 관리</a></li>\n';
+		tag += '<li><a href="javascript:void(0);" onClick="cfnGoToPage(_PAGE_MYPAGE_SECEDE);"' + (lnbLvl == 11 ? ' class="on"' : '') + '>회원 탈퇴</a></li>\n';
 		tag += '</ul>';
 		$('#mypageLnbList').html(tag);
 	}

+ 84 - 0
src/main/webapp/WEB-INF/views/web/customer/JoinCompleteFormWeb.html

@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org"
+	  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	  layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : JoinCompleteFormWeb.html
+ * @desc    : 회원 가입완료 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.22   jsshin     최초 작성
+ *******************************************************************************
+ -->
+
+<body>
+<th:block layout:fragment="content">
+<!--  container -->
+<div id="container" class="container mb">
+	<div class="wrap">
+		<div class="content join3">
+			<div class="cont_head">
+				<h3>style24</h3>
+			</div>
+			<div class="cont_body">
+				<div th:if="${maskingCustId != ''}" class="form_wrap form_col_c" role="form" >
+					<div class="form_head">
+						<h4>회원가입</h4>
+					</div>
+					<div class="form_info">
+						<span class="ico_content_find"></span>
+						<p>이미 가입된 아이디가 있습니다.</p>
+						<p class="t_info mt15">
+							아래의 아이디로 로그인 하시거나<br>
+							잊으신 경우 다시 찾기를 통해 이용 가능합니다.
+						</p>
+					</div>
+					<div class="print_bar mt30">
+						<p class="c_primary bold" data-font="lato">ID***24</p>
+					</div>
+					<div class="btn_group_block btn_group_md ui_row">
+						<div class="ui_col_6">
+							<button type="button" class="btn btn_dark btn_block"><span>로그인</span></button>
+						</div>
+						<div class="ui_col_6">
+							<button type="button" class="btn btn_default btn_block"><span>아이디 찾기</span></button>
+						</div>
+					</div>
+				</div>
+				<div th:unless="${maskingCustId != ''}"  class="form_wrap form_col_c" role="form">
+					<div class="form_head">
+						<h3>신규회원 혜택 안내</h3>
+					</div>
+					<div class="form_info">
+						오픈 콘텐츠 확정시 다시안내
+					</div>
+					<div class="mt40">
+						<button type="button"  class="btn btn_primary btn_block" onclick="cfnGoToPage(_PAGE_MAIN);">
+							<span>쇼핑하러 가기</span>
+						</button>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script th:inline="javascript">
+	/*<![CDATA[*/
+
+	$(document).ready(function() {
+
+	});
+	/*]]>*/
+</script>
+</th:block>
+</body>
+</html>
+
+

+ 28 - 10
src/main/webapp/WEB-INF/views/web/customer/JoinFormWeb.html

@@ -206,7 +206,7 @@
 			$usable.show();
 			custIdCheck = true;
 		}
-
+		fnPossibleJoin();
 	};
 
 	// 비밀번호 입력
@@ -300,6 +300,7 @@
 				$avlConPwd.show();
 				passwdCheck = true;
 			}
+			fnPossibleJoin();
 		}
 	};
 
@@ -340,6 +341,7 @@
 			$dupEmailDiv.hide();
 			emailCheck = true;
 		}
+		fnPossibleJoin();
 	};
 
 	//	휴대폰 확인
@@ -348,7 +350,7 @@
 		let cellPhnno = $(this).val();
 		let validation;
 
-		if (gagajf.isNull(cellPhnno)) {
+		if (!gagajf.isNull(cellPhnno)) {
 			if ( 9 < cellPhnno < 12) {
 				$failPhnno.hide();
 				validation = true;
@@ -374,11 +376,12 @@
 			$dupPhnno.show();
 			// $cellPhnno.text(result.cellPhnno);
 			// $cellPhnno.show();
-			authCheck = false;
+			phoneCheck = false;
 		} else {
 			$dupPhnno.hide();
-			authCheck = true;
+			phoneCheck = true;
 		}
+		fnPossibleJoin();
 	};
 	
 
@@ -393,7 +396,7 @@
 			let custInfo = {};
 			custInfo.encData = encData;
 			let jsonData = JSON.stringify(custInfo);
-			gagajf.ajaxJsonSubmit('/customer/authentication/validation', jsonData, fnInfoConfirmCallBack);
+			gagajf.ajaxJsonSubmit('/customer/authentication/check', jsonData, fnInfoConfirmCallBack);
 		}
 	};
 
@@ -411,18 +414,36 @@
 			$dupPhnno.hide();
 			authCheck = true;
 		}
+		fnPossibleJoin();
 	};
 
 	// 저장
 	$('#btnJoin').on('click', function () {
+		mcxDialog.confirm("회원가입을 하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				$('#btnJoin').attr('disabled', true);
+				let jsonData = JSON.stringify($('#joinForm').serializeObject());
+				gagajf.ajaxJsonSubmit('/customer/join/save', jsonData, fnJoinSaveCallback);
+			}
+		});
+	});
 
+	var fnJoinSaveCallback = function (result) {
+		if (result.isJoin) {
+			//신규회원 혜택 안내 페이지 없음
+			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
+		} else {
+			$('#btnJoin').attr('disabled', false);
+		}
 
-	});
+	};
 
 
 	// 가입 가능한지 확인
 	var fnPossibleJoin = function () {
-		const $btnJoin = $('#btnJoin')
+		const $btnJoin = $('#btnJoin');
 		if (custIdCheck && passwdCheck && emailCheck && phoneCheck && authCheck ) {
 			$btnJoin.attr('disabled', false);
 		} else {
@@ -430,9 +451,6 @@
 		}
 	};
 
-	$(document).ready(function() {
-		fnPossibleJoin();
-	});
 
 /*]]>*/
 </script>

+ 291 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageExchangeFormWeb.html

@@ -0,0 +1,291 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/MypageLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : MypageExchangeFormWeb.html
+ * @desc    : 마이페이지 > 교환신청 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.22   card007     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<div class="my_cont">
+		<div class="sec_head">
+			<h3>교환 신청</h3>
+			<div class="od_detail">
+				(주문번호 : <span class="num" th:text="${ordNo}"></span>)
+			</div>
+		</div>
+		<div class="sec_body mypage_body">
+			<div class="order_list return_list">
+				<section class="order_row">
+					<th:block th:if="${orderList}" th:each="oneData, status : ${orderList}">
+						<div class="part_deliver">
+							<div class="tbl_tit">
+								<!-- 주문일/선물일 설정 -->
+								<span class="start_t" th:unless="${oneData.giftPackYn == 'Y'}">주문일</span>
+								<span class="gift_t" th:if="${oneData.giftPackYn == 'Y'}">선물일</span>
+								<!-- //주문일/선물일 설정 -->
+
+								<span class="order_date" th:text="${oneData.ordDt}"></span>
+
+								<!-- 배송구분 설정 -->
+								<span class="order_label02" th:if="${oneData.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.orderList}" th:each="order, status : ${oneData.orderList}">
+								<div class="tbl type2">
+									<table id="exchangeList">
+										<colgroup>
+											<col width="1020">
+											<col width="180">
+										</colgroup>
+										<tbody>
+										<th:block th:if="${order.ordDtlList}" th:each="ordDtl, status : ${order.ordDtlList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
+											<input type="hidden" name="ordDtlNo" th:value="${ordDtl.ordDtlNo}"/>
+											<input type="hidden" name="ordDtlStat" th:value="${ordDtl.ordDtlStat}"/>
+											<input type="hidden" name="reviewSq" th:value="${ordDtl.reviewSq}"/>
+											<tr>
+												<td>
+													<div class="info_item">
+														<div class="thumb_box">
+															<a href="">
+																<img th:src="${imageUrl + '/' + ordDtl.sysImgNm}" width="100%" alt="">
+															</a>
+														</div>
+														<div class="info_box">
+															<p class="od_name">
+																<a href="">
+																	<span class="brand" th:text="${ordDtl.brandNm}"></span>
+																	<span class="name" th:text="${ordDtl.goodsNm}"></span>
+																</a>
+															</p>
+															<p class="od_opt">
+																<span class="option"><em th:text="${ordDtl.optCd1}"></em><em th:text="${ordDtl.optCd2}"></em></span>
+																<span class="count">수량 <em th:text="${ordDtl.ordQty}"></em>개</span>
+															</p>
+														</div>
+														<div class="info_calc">
+															<p class="price">
+																<span class="selling_price" th:text="|${#numbers.formatInteger(ordDtl.ordAmt, 1, 'COMMA')}원|"></span>
+															</p>
+															<p class="point"><span th:text="${#numbers.formatInteger(ordDtl.savePntAmt, 1, 'COMMA')}"></span>p</p>
+														</div>
+													</div>
+												</td>
+												<td class="cnt_sel">
+													<span class="cnt_t">수량</span>
+													<select class="select_dress" name="chgQty">
+														<option value="">선택</option>
+														<option th:if="${ordDtl.ordQty > 0}" th:each="num : ${#numbers.sequence(1,ordDtl.ordQty)}" th:value="${num}" th:text="${num}"></option>
+													</select>
+													<button class="btn btn_dark btn_sm" th:attr="ordDtlNo=${ordDtl.ordDtlNo}" onclick="fnChangeOption(this);">옵션 변경</button>
+												</td>
+											</tr>
+										</th:block>
+										</tbody>
+									</table>
+								</div>
+							</th:block>
+							<div class="order_confirm">
+								<p class="cf_txt cf_desc c_primary">교환하실 상품의 수량 및 옵션을 선택하신 후 교환 신청을 하실 수 있습니다.</p>
+							</div>
+						</div>
+					</th:block>
+				</section>
+				<section class="order_row">
+					<div class="tbl_tit">
+						<h3 class="subH3">교환 사유</h3>
+					</div>
+					<div class="tbl type1">
+						<table>
+							<colgroup>
+								<col width="*">
+							</colgroup>
+							<tbody>
+							<tr>
+								<td>
+									<select id="mounth" name="chgReason" onchange="fnChangeReason(this);">
+										<option value="">교환 사유를 선택하세요</option>
+										<option th:if="${exchangeReason}" th:each="oneData, status : ${exchangeReason}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+									</select>
+								</td>
+							</tr>
+							<tr>
+								<td>
+									<textarea class="doc_exchange" name="chgMemo" id="chgMemo" placeholder="자세한 사유를 입력해주세요." onkeyup="cfnGetTextLength(this, 500, $('#exchange_cnt'));"></textarea>
+									<p class="txt_cnt"><span id="exchange_cnt" class="c_primary">0</span>/500</p>
+								</td>
+							</tr>
+							</tbody>
+						</table>
+					</div>
+				</section>
+				<section class="order_row" id="chgerLocation">
+					<div class="order_tit">
+						<h3 class="subH3">상품 회수지</h3>
+						<span class="del_t">교환받을 상품을 수령할 장소 선택</span>
+						<button type="button" class="btn_popup" onclick="fnChangeDeliveryAddr('chger');"><span>회수지 선택</span></button>
+					</div>
+					<div class="tbl type1">
+						<table>
+							<colgroup>
+								<col width="200">
+								<col width="*">
+							</colgroup>
+							<tbody>
+							<tr>
+								<th>성명</th>
+								<td id="chgerNm" th:text="${deliveryAddrInfo.recipNm}"></td>
+								<input type="hidden" name="chgerNm" th:value="${deliveryAddrInfo.recipNm}">
+							</tr>
+							<tr>
+								<th>연락처</th>
+								<td id="chgerPhnno" th:text="${deliveryAddrInfo.recipPhnno}"></td>
+								<input type="hidden" name="chgerPhnno" th:value="${deliveryAddrInfo.recipPhnno}">
+							</tr>
+							<tr>
+								<th>주소</th>
+								<td id="chgerAddr" th:text="|${deliveryAddrInfo.recipBaseAddr} ${deliveryAddrInfo.recipDtlAddr}|"></td>
+								<input type="hidden" name="chgerBaseAddr" th:value="${deliveryAddrInfo.recipBaseAddr}">
+								<input type="hidden" name="chgerDtlAddr" th:value="${deliveryAddrInfo.recipDtlAddr}">
+							</tr>
+							</tbody>
+						</table>
+					</div>
+				</section>
+				<section class="order_row" id="returnLocation">
+					<div class="order_tit">
+						<h3 class="subH3">반품하실 배송지</h3>
+					</div>
+					<div class="tbl type1">
+						<table>
+							<colgroup>
+								<col width="200">
+								<col width="*">
+							</colgroup>
+							<tbody>
+							<tr>
+								<th>성명</th>
+								<td th:text="${deliveryAddrInfo.rtnLocNm}"></td>
+								<input type="hidden" name="rtnLocNm" th:value="${deliveryAddrInfo.rtnLocNm}">
+							</tr>
+							<tr>
+								<th>연락처</th>
+								<td th:text="${deliveryAddrInfo.rtnLocTelno}"></td>
+								<input type="hidden" name="rtnLocTelno" th:value="${deliveryAddrInfo.rtnLocTelno}">
+							</tr>
+							<tr>
+								<th>주소</th>
+								<td th:text="|${deliveryAddrInfo.rtnLocBaseAddr} ${deliveryAddrInfo.rtnLocDtlAddr}|"></td>
+								<input type="hidden" name="rtnLocBaseAddr" th:value="${deliveryAddrInfo.rtnLocBaseAddr}">
+								<input type="hidden" name="rtnLocDtlAddr" th:value="${deliveryAddrInfo.rtnLocDtlAddr}">
+							</tr>
+							</tbody>
+						</table>
+					</div>
+				</section>
+				<section class="order_row">
+					<div class="order_tit">
+						<h3 class="subH3">교환 상품 받으실 주소</h3>
+						<span class="del_t">택배사에서 반품 상품을 직접 회수할 장소 선택</span>
+						<button type="button" class="btn_popup" onclick="fnChangeDeliveryAddr('recip');"><span>회수지 선택</span></button>
+					</div>
+					<div class="tbl type1">
+						<table>
+							<colgroup>
+								<col width="200">
+								<col width="*">
+							</colgroup>
+							<tbody>
+							<tr>
+								<th>성명</th>
+								<td id="recipNm" th:text="${deliveryAddrInfo.recipNm}"></td>
+								<input type="hidden" name="recipNm" th:value="${deliveryAddrInfo.recipNm}">
+							</tr>
+							<tr>
+								<th>연락처</th>
+								<td id="recipPhnno" th:text="${deliveryAddrInfo.recipPhnno}"></td>
+								<input type="hidden" name="recipPhnno" th:value="${deliveryAddrInfo.recipPhnno}">
+							</tr>
+							<tr>
+								<th>주소</th>
+								<td id="recipAddr" th:text="|${deliveryAddrInfo.recipBaseAddr} ${deliveryAddrInfo.recipDtlAddr}|"></td>
+								<input type="hidden" name="recipBaseAddr" th:value="${deliveryAddrInfo.recipBaseAddr}">
+								<input type="hidden" name="recipDtlAddr" th:value="${deliveryAddrInfo.recipDtlAddr}">
+							</tr>
+							</tbody>
+						</table>
+					</div>
+				</section>
+				<section class="order_row" id="addDeliveryFee" style="display:none">
+					<div class="ship_fee">
+						<p><span class="c_primary" id="addPayCost">2,500원</span> 배송비 추가 결제가 필요합니다.</p>
+						<input type="hidden" name="addPayCost"/>
+					</div>
+				</section>
+				<div class="btn_wrap">
+					<button type="button" class="btn btn_default cancle_btn" onclick="cfnGoToPage(_PAGE_MYPAGE_CRS_LIST)"><span>교환 취소</span></button>
+					<button tyep="submit" class="btn btn_primary submit_btn" onclick="fnExchange()"><span id="exchangeButton">교환 신청</span></button>
+				</div>
+			</div>
+		</div>
+	</div>
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+	$(document).ready(function() {
+		// 마이페이지 LNB 설정
+		fnSetMypageLnbList(2);
+		
+		// 마이페이지 location 설정
+		fnSetMypageLocation('취소/반품/환불내역', '_PAGE_MYPAGE_CRS_LIST', '교환 신청');
+	});
+	
+	// 교환 옵션 변경 팝업
+	var fnChangeOption = function(param) {
+		// TODO
+		// 옵션변경 처리
+	}
+	
+	// 회수지, 교환지 설정 팝업
+	var fnChangeDeliveryAddr = function(param) {
+		// TODO
+		// 회수지, 교환지 설정
+	}
+	
+	// 교환 처리
+	var fnExchange = function() {
+		// TODO
+		// 교환신청 처리
+	}
+	
+	// 교환 사유 변경 이벤트
+	var fnChangeReason = function(param) {
+		let chgReason = $(param).val();
+		// TODO
+		// 사유 변경 처리
+		alert('a');
+		console.log($('#exchangeList tr'));
+		$.each($('#exchangeList tr'), function(idx, item) {
+			console.log(item);
+		})
+	}
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 140 - 103
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.orderList}" th:each="order, status : ${oneData.orderList}">
 								<div class="tbl type2">
 									<table>
 										<colgroup>
@@ -54,66 +55,125 @@
 											<col width="180">
 										</colgroup>
 										<tbody>
+										<th:block th:if="${order.ordDtlList}" th:each="ordDtl, status : ${order.ordDtlList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
+											<input type="hidden" name="ordDtlNo" th:value="${ordDtl.ordDtlNo}"/>
+											<input type="hidden" name="ordDtlStat" th:value="${ordDtl.ordDtlStat}"/>
+											<input type="hidden" name="reviewSq" th:value="${ordDtl.reviewSq}"/>
 											<tr class="bundle_row">
 												<td>
 													<div class="info_item">
 														<div class="thumb_box">
 															<a href="">
-																<img th:src="${imageUrl + '/' + order.sysImgNm}" width="100%" alt="">
+																<img th:src="${imageUrl + '/' + ordDtl.sysImgNm}" width="100%" alt="">
 															</a>
 														</div>
 														<div class="info_box">
 															<p class="od_name">
 																<a href="">
-																	<span class="brand" th:text="${order.brandNm}"></span>
-																	<span class="name" th:text="${order.goodsNm}"></span>
+																	<span class="brand" th:text="${ordDtl.brandNm}"></span>
+																	<span class="name" th:text="${ordDtl.goodsNm}"></span>
 																</a>
 															</p>
 															<p class="od_opt">
-																<span class="option"><em th:text="${order.optCd1}"></em><em th:text="${order.optCd2}"></em></span>
-																<span class="count">수량 <em th:text="${order.ordQty}"></em>개</span>
+																<span class="option"><em th:text="${ordDtl.optCd1}"></em><em th:text="${ordDtl.optCd2}"></em></span>
+																<span class="count">수량 <em th:text="${ordDtl.ordQty}"></em>개</span>
 															</p>
-															<button type="button" class="btn btn_dark cart_btn">쇼핑백 담기</button>
+															<button type="button" class="btn btn_dark cart_btn" onclick="fnCreateCart(this);">쇼핑백 담기</button>
 														</div>
 														<div class="info_calc">
 															<p class="price">
-																<span class="selling_price" th:text="|${#numbers.formatInteger(order.ordAmt, 1, 'COMMA')}원|"></span>
+																<span class="selling_price" th:text="|${#numbers.formatInteger(ordDtl.ordAmt, 1, 'COMMA')}원|"></span>
 															</p>
-															<p class="point"><span th:text="${#numbers.formatInteger(order.savePntAmt, 1, 'COMMA')}"></span>p</p>
+															<p class="point"><span th:text="${#numbers.formatInteger(ordDtl.savePntAmt, 1, 'COMMA')}"></span>p</p>
 														</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>
+														<p class="dlvr_staus" th:text="${ordDtl.ordDtlStatNm}"></p>
+														<p class="dlvr_desc" th:if="${ordDtl.delvEddt}" th:text="|${ordDtl.delvEddt}일 도착|"></p>
+													</div>
+													<div class="tbl_btn_wrap case02">
+														<button type="button" class="btn btn_default btn_sm" onclick="fnCreateExchange(this);"><span>교환</span></button>
+														<button type="button" class="btn btn_default btn_sm" onclick="fnCreateCancel(this);"><span>반품/취소</span></button>
+														<button type="button" class="btn btn_default btn_sm" th:if="${ordDtl.reviewSq == 0}" onclick="fnCreateReview(this);"><span>리뷰작성</span></button>
+													</div>
+												</td>
+												<td class="merge_row" th:if="${oneData.giftPackYn == 'Y' and #strings.isEmpty(ordDtl.recipBaseAddr)}">
+													<div class="delivery">
+														<p class="dlvr_staus c_primary">주소 입력 대기</p>
+														<p class="dlvr_desc" th:text="|남은 기간 ${ordDtl.giftLimitDay}일|"></p>
+														<p class="dlvr_desc" th:text="|(${ordDtl.giftLimitDt}까지)|"></p>
+													</div>
+													<div class="tbl_btn_wrap case02">
+														<button type="button" class="btn btn_dark btn_sm" onclick="fnReSendSms(this);"><span>SMS 재전송</span></button>
+													</div>
+												</td>
+												<td class="merge_row" th:if="${oneData.giftPackYn == 'Y' and !#strings.isEmpty(ordDtl.recipBaseAddr)}">
+													<div class="delivery">
+														<p class="dlvr_staus c_primary">선물 완료</p>
+														<p class="dlvr_desc" th:text="|(${ordDtl.giftCompleteDt})|"></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" th:if="${order.reviewSq == 0}"><span>리뷰작성</span></button>
 													</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="${order.ordDtlStatBanner == 'Y'}">
+									<!-- 주문 -->
+									<th:block th:unless="${oneData.giftPackYn == 'Y'}">
+										<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" th:attr="ordNo=${oneData.ordNo}, invoiceNo=${order.invoiceNo}, shipCompCd=${order.shipCompCd}" onclick="fnGetDeliveryInfo(this)">배송조회</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" onclick="fnDecideOrder(this);">구매확정 하기</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" banner="banner" onclick="fnCreateReview(this, 'Y');">리뷰작성</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" onclick="fnCreateCart(this, 'Y');">장바구니 담기</button>
+										</div>
+									</th:block>
+
+									<!-- 선물 -->
+									<th:block th:if="${oneData.giftPackYn == 'Y'}">
+										<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>
+									</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">
@@ -189,9 +249,10 @@
 								<td th:text="${deliveryAddrInfo.recipPhnno}"><span class="sr-only">휴대폰 번호</span></td>
 							</tr>
 							<tr>
-								<td th:text="${deliveryAddrInfo.delvMemo}">
+								<td>
 									<span class="tit c_primary">배송요청 사항</span>
-									<button type="button" class="btn_popup" id="btn_rqstModify_pop"><span>변경하기</span></button>
+									<th:block th:text="${deliveryAddrInfo.delvMemo}"></th:block>
+									<button type="button" class="btn_popup" id="btn_rqstModify_pop" onclick="fnChangeDelvMemo();"><span>변경하기</span></button>
 								</td>
 							</tr>
 							</tbody>
@@ -297,17 +358,40 @@
 											<div>
 												<dt>결제방법</dt>
 												<dd>
-													<span class="paymethod">현대카드/무이자6개월</span>
-												</dd>
-											</div>
-											<!-- 무통장 결제시 -->
-											<div th:if="${paymentInfo.payMeans == 'G014_20'}">
-												<dt>&nbsp;</dt>
-												<dd>
-													<button type="button" class="btn btn_default"><span>신용카드 전표 (현금 영수증)</span></button>
+													<!-- TODO -->
+													<!-- Style24 간편결제 처리 (STYLE24 간편결제 : STYLE24 간편결제명 / 카드사명 / 할부개월(일시불)) -->
+													<!-- 실시간계좌이체, 무통장입금 현금영수증 신청여부 추가 -->
+													<!-- 네이버페이 처리 (네이버 페이 : 네이버 페이) -->
+													<!-- 카카오페이 처리 (카카오 페이 : 카카오 페이) -->
+													<!-- PAYCO 처리 (PAYCO : PAYCO) -->
+													<span class="paymethod" th:if="${paymentInfo.payMeans == 'G014_10'}" th:text="|실시간계좌이체|"></span>
+													<span class="paymethod" th:if="${paymentInfo.payMeans == 'G014_20'}" th:text="|무통장입금|"></span>
+													<span class="paymethod" th:if="${paymentInfo.payMeans == 'G014_30'}" th:text="|${paymentInfo.cardNm}/${paymentInfo.cardMips}|"></span>
+													<span class="paymethod" th:if="${paymentInfo.payMeans == 'G014_60'}">휴대폰결제</span>
 												</dd>
 											</div>
-											<!-- //무통장 결제시 -->
+											<th:block th:if="${paymentInfo.pgGb == 'KCP'}">
+												<!-- 신용카드 결제시 -->
+												<div th:if="${paymentInfo.payMeans == 'G014_30'}">
+													<dt>&nbsp;</dt>
+													<dd>
+														<button type="button" class="btn btn_default" onclick="fnReceipt('card');"><span>신용카드 전표</span></button>
+													</dd>
+												</div>
+												<!-- //무통장 결제시 -->
+												<!-- 무통장 결제시 -->
+												<div th:if="${paymentInfo.payMeans == 'G014_10' or paymentInfo.payMeans == 'G014_20'}">
+													<dt>&nbsp;</dt>
+													<dd>
+														<button type="button" class="btn btn_default" onclick="fnReceipt('cash');"><span>현금영수증</span></button>
+													</dd>
+												</div>
+												<!-- //무통장 결제시 -->
+											</th:block>
+											<th:block th:unless="${paymentInfo.pgGb == 'KCP'}">
+												<dt></dt>
+												<dd>NPAY등의 대체결제수단으로 결제시 해당 결제 플롯폼에서 영수증 확인이 가능합니다.</dd>
+											</th:block>
 										</dl>
 									</td>
 								</tr>
@@ -323,63 +407,16 @@
 <script th:inline="javascript">
 	let ordNo = [[${ordNo}]];
 	
-	// 주문 내역 삭제 처리
-	var fnDeleteOrder = function() {
-		mcxDialog.confirm('주문 내역을 삭제하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function(){
-				let data = {};
-				
-				data.ordNo = ordNo;
-				
-				var jsonData = JSON.stringify(data);
-				gagajf.ajaxJsonSubmit('/mypage/order/delete'
-					, jsonData
-					, function() {
-						cfnGoToPage(_PAGE_MYPAGE);
-					});
-			}
-		});
-	};
+	// 배송메모 변경 버튼 클릭 이벤트
+	var fnChangeDelvMemo = function() {
+		// TODO
+		// 배송메모 정보 변경 처리
+	}
 	
-	// 구매확정 처리
-	var fnDecideOrder = function(param) {
-		let ordDtlNoArr = $(param).parent().parent().find('input[name=ordDtlNo]');
-		let ordDtlStatArr = $(param).parent().parent().find('input[name=ordDtlStat]');
-		
-		console.log(ordDtlNoArr);
-		let orderDecisionArr = [];
-		$.each(ordDtlNoArr, function(idx, item) {
-			console.log(item.value);
-			if (ordDtlStatArr[idx].value == 'G013_60') {
-				orderDecisionArr.push(item.value);
-			}
-		});
-
-		console.log(orderDecisionArr);
-		if (orderDecisionArr.length == 0) {
-			mcxDialog.alert('구매확정 가능한 상품이 없습니다.');
-			return false;
-		}
-
-		mcxDialog.confirm('구매확정 처리를 하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function(){
-				let data = {};
-				
-				data.ordNo = ordNo;
-				data.ordDtlNoArr = orderDecisionArr;
-				
-				var jsonData = JSON.stringify(data);
-				gagajf.ajaxJsonSubmit('/mypage/order/decision'
-					, jsonData
-					, function() {
-						cfnGoToPage(_PAGE_ORDER_DETAIL + ordNo);
-					});
-			}
-		});
+	// 신용카드 전표 및 현금영수증 버튼 클릭 이벤트
+	var fnReceipt = function(param) {
+		// TODO
+		// 전표 링크 팝업 처리
 	}
 
 	$(document).ready(function() {
@@ -387,7 +424,7 @@
 		fnSetMypageLnbList(1);
 		
 		// 마이페이지 location 설정
-		fnSetMypageLocation('주문확인/배송조회', '_PAGE_ORDER_LIST', '주문상세');
+		fnSetMypageLocation('주문확인/배송조회', '_PAGE_MYPAGE_ORDER_LIST', '주문상세');
 	});
 	
 </script>

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

@@ -19,6 +19,18 @@
 <body>
 
 <th:block layout:fragment="content">
+	<form id="exchangeForm" name="exchangeForm" action="#" th:action="@{'/mypage/exchange/form'}" th:method="post">
+		<input type="hidden" name="ordNo"/>
+		<input type="hidden" name="ordDtlNoArr"/>
+	</form>
+	<form id="cancelForm" name="cancelForm" th:action="@{'/mypage/cancel/form'}" th:method="post">
+		<input type="hidden" name="ordNo"/>
+		<input type="hidden" name="ordDtlNoArr"/>
+	</form>
+	<form id="reviewForm" name="reviewForm" th:action="@{'/mypage/review/form'}" th:method="post">
+		<input type="hidden" name="ordNo"/>
+		<input type="hidden" name="ordDtlNoArr"/>
+	</form>
 	<div class="my_cont">
 		<div class="sec_head">
 			<h3 class="mem_name"><strong th:text="${customerInfo.custNm}"></strong>님 반갑습니다.</h3>
@@ -53,32 +65,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 +101,29 @@
 					<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" onchange="fnCheckPeriod(this);">
 					</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" onchange="fnCheckPeriod(this);">
 					</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 ordNo = [[${ordNo}]];
+	let customerInfo = [[${customerInfo}]];
 /*<![CDATA[*/
 	$(document).ready(function() {
 		// 마이페이지 LNB 설정
@@ -282,13 +134,21 @@
 		
 		// datepicker 설정
 		$(".my_datepicker").datepicker();
+		
+		// 주문 검색 기간 설정
+		fnSetSearchPeriod(3);
+		
+		// 주문 리스트 조회
+		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 +156,75 @@
 		$('#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) {
+				xhr.setRequestHeader("AJAX", "true");
+				xhr.setRequestHeader('Accept', 'application/json');
+				xhr.setRequestHeader('Content-Type', 'application/json');
+				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 + "')");
+			if (rows.length > 1) {
+				rows.eq(0).attr("rowspan", rows.length);
+				rows.not(":eq(0)").remove();
+			}
+		});
+	}
+	
+	// 검색기간 설정 체크
+	var fnCheckPeriod = function(param) {
+		let stDate = $('#stDate').val();
+		let edDate = $('#edDate').val();
+
+		let sdt = new Date(stDate);
+		let edt = new Date(edDate);
+		let dateDiff = Math.ceil((edt.getTime() - sdt.getTime()) / (1000 * 3600 * 24));
+
+		if (dateDiff > 366) {
+			let id = $(param).attr('id');
+			mcxDialog.alert('조회기간은 최대 1년을 넘을 수 없습니다.');
+			if (id == 'stDate') {
+				sdt.setFullYear(sdt.getFullYear() + 1);
+				$('#edDate').val(sdt.getFullYear() + '-' + ('0' + (sdt.getMonth() + 1)).slice(-2) + '-' + ('0' + (sdt.getDate())).slice(-2));
+			} else {
+				edt.setFullYear(edt.getFullYear() - 1);
+				$('#stDate').val(edt.getFullYear() + '-' + ('0' + (edt.getMonth() + 1)).slice(-2) + '-' + ('0' + (edt.getDate())).slice(-2));
+			}
+		}
+	}
 /*]]>*/
 </script>
 

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

@@ -0,0 +1,168 @@
+<!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.orderList}" th:each="order, status : ${oneData.orderList}">
+			<div class="tbl type2">
+				<table>
+					<colgroup>
+						<col width="1020">
+						<col width="180">
+					</colgroup>
+					<tbody>
+						<th:block th:if="${order.ordDtlList}" th:each="ordDtl, status : ${order.ordDtlList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
+						<input type="hidden" name="ordDtlNo" th:value="${ordDtl.ordDtlNo}"/>
+						<input type="hidden" name="ordDtlStat" th:value="${ordDtl.ordDtlStat}"/>
+						<input type="hidden" name="reviewSq" th:value="${ordDtl.reviewSq}"/>
+						<tr class="bundle_row">
+							<td>
+								<div class="info_item">
+									<div class="thumb_box">
+										<a href="">
+											<img th:src="${imageUrl + '/' + ordDtl.sysImgNm}" width="100%" alt="">
+										</a>
+									</div>
+									<div class="info_box">
+										<p class="od_name">
+											<a href="">
+												<span class="brand" th:text="${ordDtl.brandNm}"></span>
+												<span class="name" th:text="${ordDtl.goodsNm}"></span>
+											</a>
+										</p>
+										<p class="od_opt">
+											<span class="option"><em th:text="${ordDtl.optCd1}"></em><em th:text="${ordDtl.optCd2}"></em></span>
+											<span class="count">수량 <em th:text="${ordDtl.ordQty}"></em>개</span>
+										</p>
+									</div>
+									<div class="info_calc">
+										<p class="price">
+											<span class="selling_price" th:text="|${#numbers.formatInteger(ordDtl.ordAmt, 1, 'COMMA')}원|"></span>
+										</p>
+										<p class="point"><span th:text="${#numbers.formatInteger(ordDtl.savePntAmt, 1, 'COMMA')}"></span>p</p>
+									</div>
+								</div>
+							</td>
+							<!-- 주문 -->
+							<td class="merge_row" th:unless="${oneData.giftPackYn == 'Y'}">
+								<div class="delivery">
+									<p class="dlvr_staus" th:text="${ordDtl.ordDtlStatNm}"></p>
+									<p class="dlvr_desc" th:if="${ordDtl.delvEddt}" th:text="|${ordDtl.delvEddt}일 도착|"></p>
+								</div>
+								<div class="tbl_btn_wrap case02">
+									<button type="button" class="btn btn_default btn_sm" th:attr="ordNo=${oneData.ordNo}" onclick="fnCreateExchange(this);"><span>교환</span></button>
+									<button type="button" class="btn btn_default btn_sm" th:attr="ordNo=${oneData.ordNo}" onclick="fnCreateCancel(this);"><span>반품/취소</span></button>
+									<button type="button" class="btn btn_default btn_sm" th:if="${ordDtl.reviewSq == 0}" th:attr="ordNo=${oneData.ordNo}" onclick="fnCreateReview(this);"><span>리뷰작성</span></button>
+								</div>
+							</td>
+							<td class="merge_row" th:if="${oneData.giftPackYn == 'Y' and #strings.isEmpty(ordDtl.recipBaseAddr)}">
+								<div class="delivery">
+									<p class="dlvr_staus c_primary">주소 입력 대기</p>
+									<p class="dlvr_desc" th:text="|남은 기간 ${ordDtl.giftLimitDay}일|"></p>
+									<p class="dlvr_desc" th:text="|(${ordDtl.giftLimitDt}까지)|"></p>
+								</div>
+								<div class="tbl_btn_wrap case02">
+									<button type="button" class="btn btn_dark btn_sm" th:attr="ordNo=${oneData.ordNo}" onclick="fnReSendSms(this);"><span>SMS 재전송</span></button>
+								</div>
+							</td>
+							<td class="merge_row" th:if="${oneData.giftPackYn == 'Y' and !#strings.isEmpty(ordDtl.recipBaseAddr)}">
+								<div class="delivery">
+									<p class="dlvr_staus c_primary">선물 완료</p>
+									<p class="dlvr_desc" th:text="|(${ordDtl.giftCompleteDt})|"></p>
+								</div>
+								<div class="tbl_btn_wrap case02">
+								</div>
+							</td>
+						</tr>
+						</th:block>
+					</tbody>
+				</table>
+			</div>
+			<th:block th:if="${order.ordDtlStatBanner == 'Y'}">
+				<!-- 주문 -->
+				<th:block th:unless="${oneData.giftPackYn == 'Y'}">
+					<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" th:attr="ordNo=${oneData.ordNo}, invoiceNo=${order.invoiceNo}, shipCompCd=${order.shipCompCd}" onclick="fnGetDeliveryInfo(this)">배송조회</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" onclick="fnDecideOrder(this);">구매확정 하기</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" onclick="fnCreateReview(this, 'Y');">리뷰작성</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" onclick="fnCreateCart(this, 'Y');">장바구니 담기</button>
+					</div>
+				</th:block>
+	
+				<!-- 선물 -->
+				<th:block th:if="${oneData.giftPackYn == 'Y'}">
+					<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>
+				</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() {
+	});
+/*]]>*/
+</script>
+
+</html>

+ 5 - 5
src/main/webapp/WEB-INF/views/web/order/OrderDelvMemoChangePopWeb.html

@@ -9,23 +9,23 @@
 				<div class="area_request">
 					<div class="form_field">
 						<div>
-							<input type="radio" name="rdi-request3" id="rdi-request31" value="" checked=""> 
+							<input type="radio" name="rdi-request3" id="rdi-request31"> 
 							<label for="rdi-request31"><span>문앞</span></label>
 						</div>
 						<div>
-							<input type="radio" name="rdi-request3" id="rdi-request32" value="" checked=""> 
+							<input type="radio" name="rdi-request3" id="rdi-request32"> 
 							<label for="rdi-request32"><span>직접받고 부재시 문 앞</span></label>
 						</div>
 						<div>
-							<input type="radio" name="rdi-request3" id="rdi-request33" value="" checked=""> 
+							<input type="radio" name="rdi-request3" id="rdi-request33"> 
 							<label for="rdi-request33"><span>경비실</span></label>
 						</div>
 						<div>
-							<input type="radio" name="rdi-request3" id="rdi-request34" value="" checked=""> 
+							<input type="radio" name="rdi-request3" id="rdi-request34"> 
 							<label for="rdi-request34"><span>택배함</span></label>
 						</div>
 						<div>
-							<input type="radio" name="rdi-request3" id="rdi-request35" value="" checked=""> 
+							<input type="radio" name="rdi-request3" id="rdi-request35"> 
 							<label for="rdi-request35"><span>기타사항</span></label>
 							<div class="info_box">
 								<div class="input_wrap">

+ 87 - 29
src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html

@@ -61,7 +61,7 @@
 										</colgroup>
 										<tbody>
 											<tr>
-												<th>총 <span class="c_primary bold" th:text="${delvTotCnt}"></span> 건으로 나뉘어 배송 예정</th>
+												<th>총 <span class="c_primary bold" th:text="${delvFeeTotCnt}"></span> 건으로 나뉘어 배송 예정</th>
 												<td class="t_l">
 													<span>총알배송<em class="c_primary bold" th:text="${wmsCnt}" id="shotDelv"></em>건</span>
 													<span>STYLE24<em class="c_primary bold" th:text="${wmsCnt}" id="wmsDelv"></em>건</span>
@@ -358,8 +358,8 @@
 																<div class="coupon_list">
 																	<ul>
 																		<!--  상품쿠폰 -->
-																		<th:block th:if="${goodsApplyCpnList.size() > 0}">
-																			<th:block th:each="goods, i : ${goodsApplyCpnList}">
+																		<th:block th:each="goods, i : ${goodsApplyCpnList}">
+																			<th:block th:if="${goods.goodsCpnList.size() > 0}">
 																				<li>
 																					<div class="coupon">
 																						<div class="item_gd">
@@ -369,18 +369,27 @@
 																									<div class="brand" th:text="${goods.brandEnm}+' '+${goods.brandKnm}"></div>
 																									<div class="name" th:text="${goods.goodsNm}"></div>
 																									<div class="price">
-																										<span class="selling_price"  th:text="${#numbers.formatInteger(goods.currPrice, 1, 'COMMA')}"></span>
+																										<span th:text="${goods.goodsCd}"></span>
+																										<th:block th:if="${goods.tmtbDcAmt} > 0">
+																											<span class="selling_price"  th:text="${#numbers.formatInteger(goods.tmtbDcAmt, 1, 'COMMA')}"></span>
+																										</th:block>
+																										<th:block th:if="${goods.tmtbDcAmt} < 1">
+																											<span class="selling_price"  th:text="${#numbers.formatInteger(goods.currPrice, 1, 'COMMA')}"></span>
+																										</th:block>
 																									</div>
 																								</figcaption>
 																							</figure>
 																						</div>
+																						
 																						<div class="form_field">
-																							<select id="" class="select_hidden">
-																								<th:block th:eath="goodsCpn, k : ${goodsCpnList}">
-																									<option th:value="${goodsCpn.cpnId}" th:text="${goodsCpn.cpnNm}"></option>
+																							<select class="select_hidden cpnSelect">
+																								<option value="">선택안함</option>
+																								<th:block th:each="goodsCpn, k : ${goods.goodsCpnList}">
+																									<option th:value="${goodsCpn.cpnId}" th:text="${goodsCpn.cpnId}+'|'+${goodsCpn.cpnNm}+'|'+${goodsCpn.cpnDcAmt}"></option>
 																								</th:block>
 																							</select>
 																						</div>
+	
 																						<div class="cp_discount">
 																							<span class="cp_amount">-10,000원 할인적용</span>
 																							<button type="button" class="btn_del_coupon" id="">
@@ -392,16 +401,17 @@
 																			</th:block>
 																		</th:block>
 																		<!--  상품쿠폰 -->
-																		
+
 																		<!--  장바구니쿠폰 -->
 																		<th:block th:if="${cartCpnList.size() > 0}">
 																			<li>
 																				<div class="coupon">
 																					<div class="form_field">
 																						<label for="">장바구니 할인쿠폰</label> 
-																						<select id="" class="select_hidden">
+																						<select class="select_hidden">
+																							<option value="">선택안함</option>
 																							<th:block th:each="cartCpn, k : ${cartCpnList}">
-																								<option th:value="${cartCpn.cpnId}" th:text="${cartCpn.cpnNm}"></option>
+																								<option th:value="${cartCpn.cpnId}" th:text="${cartCpn.cpnId}+'|'+${cartCpn.cpnNm}"></option>
 																							</th:block>
 																						</select>
 																					</div>
@@ -790,14 +800,19 @@
 														<figure>
 															<span class="thumb"><img src="/images/pc/thumb/tmp_odSide1.jpg" alt=""></span>
 															<figcaption>
-																<div class="brand" th:text="${goods.brandEnm} + ${goods.brandKnm}"></div>
+																<div class="brand" th:text="${goods.brandEnm} + ' ' + ${goods.brandKnm}"></div>
 																<div class="name" th:text="${goods.goodsNm}"></div>
 																<div class="option" th:each="opt, index : ${goods.itemNmArr}">
 																	<span th:text="${goods.optCdArr[index.index]}"></span> 
 																	<span>수량:<em th:text="${goods.goodsQty}"></em>개</span>
 																</div>
 																<div class="price">
-																	<span class="selling_price" th:text="|${#numbers.formatInteger(goods.currPrice, 1, 'COMMA')} 원|"></span>
+																	<th:block th:if="${goods.tmtbDcAmt} > 0">
+																		<span class="selling_price"  th:text="${#numbers.formatInteger(goods.tmtbDcAmt, 1, 'COMMA')}"></span>
+																	</th:block>
+																	<th:block th:if="${goods.tmtbDcAmt} < 1">
+																		<span class="selling_price"  th:text="${#numbers.formatInteger(goods.currPrice, 1, 'COMMA')}"></span>
+																	</th:block>
 																</div>
 															</figcaption>
 														</figure>
@@ -816,17 +831,21 @@
 												<th:block th:each="goods, i : ${delvCartList}">
 													<div class="item_gd">
 														<figure>
-															<span class="thumb"><img
-																src="/images/pc/thumb/tmp_odSide1.jpg" alt=""></span>
+															<span class="thumb"><img src="/images/pc/thumb/tmp_odSide1.jpg" alt=""></span>
 															<figcaption>
-																<div class="brand" th:text="${goods.brandEnm} + ${goods.brandKnm}"></div>
+																<div class="brand" th:text="${goods.brandEnm} + ' ' + ${goods.brandKnm}"></div>
 																<div class="name" th:text="${goods.goodsNm}"></div>
 																<div class="option">
 																	<span th:text="${goods.optCd}"></span> 
 																	<span>수량:<em th:text="${goods.goodsQty}"></em>개</span>
 																</div>
 																<div class="price">
-																	<span class="selling_price" th:text="|${#numbers.formatInteger(goods.currPrice, 1, 'COMMA')} 원|"></span>
+																	<th:block th:if="${goods.tmtbDcAmt} > 0">
+																		<span class="selling_price"  th:text="${#numbers.formatInteger(goods.tmtbDcAmt, 1, 'COMMA')}"></span>
+																	</th:block>
+																	<th:block th:if="${goods.tmtbDcAmt} < 1">
+																		<span class="selling_price"  th:text="${#numbers.formatInteger(goods.currPrice, 1, 'COMMA')}"></span>
+																	</th:block>
 																</div>
 															</figcaption>
 														</figure>
@@ -847,19 +866,24 @@
 														<figure>
 															<span class="thumb"><img src="/images/pc/thumb/tmp_odSide1.jpg" alt=""></span>
 															<figcaption>
-																<div class="brand" th:text="${goods.brandEnm}"></div>
+																<div class="brand" th:text="${goods.brandEnm} + ' ' + ${goods.brandKnm}"></div>
 																<div class="name" th:text="${goods.goodsNm}"></div>
 																<div class="option">
 																	<span th:text="${goods.optCd}"></span>
 																	<span>수량:<em th:text="${goods.goodsQty}"></em>개</span>
 																</div>
 																<div class="price">
-																	<span class="selling_price" th:text="${goods.currPrice}"></span>
+																	<th:block th:if="${goods.tmtbDcAmt} > 0">
+																		<span class="selling_price"  th:text="${#numbers.formatInteger(goods.tmtbDcAmt, 1, 'COMMA')}"></span>
+																	</th:block>
+																	<th:block th:if="${goods.tmtbDcAmt} < 1">
+																		<span class="selling_price"  th:text="${#numbers.formatInteger(goods.currPrice, 1, 'COMMA')}"></span>
+																	</th:block>
 																</div>
 															</figcaption>
 														</figure>
 														<p class="info_reserv">
-															<i class="ico ico_calender"></i><span>2021.01.15</span>
+															<i class="ico ico_calender"></i><span th:text="${goods.delvResDt}"></span>
 															배송예정상품
 														</p>
 													</div>
@@ -874,35 +898,35 @@
 									<dl>
 										<div>
 											<dt>상품금액</dt>
-											<dd>1,590,000 원</dd>
+											<dd id="goodsSumAmt">1,590,000 원</dd>
 										</div>
 										<div>
 											<dt>배송비</dt>
-											<dd>0원</dd>
+											<dd id="delvSumAmt">0원</dd>
 										</div>
 										<div>
 											<dt>할인금액</dt>
-											<dd><span class="disc_amount">-1,746,500원</span></dd>
+											<dd><span class="disc_amount" id="goodsDcSumAmt">-1,746,500원</span></dd>
 										</div>
 										<div>
 											<dt>다다익선할인금액</dt>
-											<dd><span class="disc_amount">25,000원</span></dd>
+											<dd><span class="disc_amount" id="tmtbDcSumAmt">25,000원</span></dd>
 										</div>
 										<div>
 											<dt>쿠폰할인금액</dt>
-											<dd><span class="disc_amount">3,000원</span></dd>
+											<dd><span class="disc_amount" id="couponDcSumAmt">3,000원</span></dd>
 										</div>
 										<div>
 											<dt>선포인트 사용</dt>
-											<dd><span class="disc_amount">-1,500P</span></dd>
+											<dd><span class="disc_amount" id="prePntDcSumAmt">-1,500P</span></dd>
 										</div>
 										<div>
 											<dt>포인트 사용</dt>
-											<dd><span class="disc_amount">-5,500P</span></dd>
+											<dd><span class="disc_amount" id="pntDcSumAmt">-5,500P</span></dd>
 										</div>
 										<div>
 											<dt>상품권 사용</dt>
-											<dd><span class="disc_amount">-50,000원</span></dd>
+											<dd><span class="disc_amount" id="gfcdUseSumAmt">-50,000원</span></dd>
 										</div>
 									</dl>
 								</div>
@@ -945,7 +969,7 @@
 <!-- 사은품지급안내 팝업 -->
 <div class="modal fade od_pop infoGift_pop" id="infoGiftPop" tabindex="-1" role="dialog" aria-labelledby="infoGiftLabel" aria-hidden="true"></div>
 
-<script type="text/javascript">
+<script th:inline="javascript">
 
 $(document).ready( function() {
 	
@@ -1150,6 +1174,7 @@ $(document).ready( function() {
 
 <script th:inline="javascript">
 	// 배송관련정보 변수선언
+	var cartGoodsList		= [[${cartGoodsList}]]			// 배송목록
 	var wmsCnt 				= [[${wmsCnt}]];				// 자사 일반,촐알 배송건수
 	var resCnt 				= [[${resCnt}]];				// 자사 예약 배송건수
 	var delvCnt 			= [[${delvCnt}]];				// 입전 일반 배송건수
@@ -1190,9 +1215,24 @@ $(document).ready( function() {
 			}
 		)
 	}
+	
+	// 상품금액, 배송비, 할인금액, 다다익선할인금액, 쿠폰할인금액, 선포인트사용, 포인트사용, 상품권사용
+	var goodsSumAmt = 0;
+	var tmtbDcSumAmt = 0;
+	
+	var cartGoodsAmtList = function() {
+		for (i=0 ; i<cartGoodsList.length ; i++) {
+			var obj = cartGoodsList[i];
+			
+			goodsSumAmt = goodsSumAmt + obj.currPrice;
+			tmtbDcSumAmt = tmtbDcSumAmt + (obj.currPrice - obj.tmtbDcAmt);
+		}
+		$("#goodsSumAmt").text(goodsSumAmt.addComma() + "원");
+		$("#tmtbDcSumAmt").text("-" + tmtbDcSumAmt.addComma() + "원");
+	} 
 </script>
 
-<script type="text/javascript">
+<script th:inline="javascript">
 	// 컨텐츠 호출
 	$(document).ready( function() {
 		// 1. 총알배송가능 지역, 총알배송 가능 시간 체크
@@ -1213,6 +1253,24 @@ $(document).ready( function() {
 		if (resCnt > 0) {
 			$("#resDelvArea").css("display", "block");
 		}
+		
+		// 3. 최적의 할인으로 쿠폰 설정
+		//$(".cpnSelect option:eq(1)").attr("selected", "selected");
+		/*
+		$(".cpnSelect").each(function(i){
+			//$(this).find("option:eq(1)").attr("selected", "selected");
+		});
+		*/
+
+		$(".cpnSelect").on("change", function(){
+			alert($(this).val());
+		});
+		
+		$(".select_dress").on("click", function() {
+			alert($("this").text());	
+		});
+		
+		cartGoodsAmtList();
 	});
 	
 	// 사은품선택 라디오 버튼 기능

+ 148 - 148
src/main/webapp/WEB-INF/views/web/order/OrderNoMemberWeb.html

@@ -19,175 +19,175 @@
 <body>
 
 <th:block layout:fragment="content">
-
-	<div class="wrap">
-		<div class="content nonMBorder">
-			<!-- 페이지특정 클래스 = nonMBorder -->
-			<div class="cont_head">
-				<h2 class="t_c mb60">비회원 주문하기</h2>
-			</div>
-			<div class="cont_body">
-				<form id="orderForm" name="orderForm" class="form_wrap form_col_c form_full" action="#" th:action="@{'/order/form'}" th:method="post">
-					<input type="hidden" name="shotDelvYn" th:value="${order.shotDelvYn}" /><!-- 장바구니화면 총알배송여부 -->
-					<!-- 장바구니화면 시퀀스 배열 등록 -->
-					<th:block th:each="cartSq , index : ${order.cartSqArr}">
-						<input type="hidden" name="cartSqArr" th:value="${cartSq}" />
-					</th:block>
-					
-					<div class="form_head">
-						<p>
-							비회원 주문을 위한 주문자 정보 입력 및 개인정보 수집/이용 동의에<br>체크하신 후 주문을 완료하실 수
-							있습니다.
-						</p>
-					</div>
-					
-					<div class="form_field">
-						<label class="input_label sr-only">이름(주문자명)</label>
-						<div class="ui_col_12">
-							<div class="input_wrap">
-								<input type="text" name="custNm" id="custNm" placeholder="이름(주문자명)">
-							</div>
+<div class="wrap">
+	<div class="content nonMBorder">
+		<!-- 페이지특정 클래스 = nonMBorder -->
+		<div class="cont_head">
+			<h2 class="t_c mb60">비회원 주문하기</h2>
+		</div>
+		<div class="cont_body">
+			<form id="orderForm" name="orderForm" class="form_wrap form_col_c form_full" action="#" th:action="@{'/order/form'}" th:method="post">
+				<input type="hidden" name="shotDelvYn" th:value="${order.shotDelvYn}" /><!-- 장바구니화면 총알배송여부 -->
+				<!-- 장바구니화면 시퀀스 배열 등록 -->
+				<th:block th:each="cartSq , index : ${order.cartSqArr}">
+					<input type="hidden" name="cartSqArr" th:value="${cartSq}" />
+				</th:block>
+				
+				<div class="form_head">
+					<p>
+						비회원 주문을 위한 주문자 정보 입력 및 개인정보 수집/이용 동의에<br>체크하신 후 주문을 완료하실 수
+						있습니다.
+					</p>
+				</div>
+				
+				<div class="form_field">
+					<label class="input_label sr-only">이름(주문자명)</label>
+					<div class="ui_col_12">
+						<div class="input_wrap">
+							<input type="text" name="custNm" id="custNm" placeholder="이름(주문자명)">
 						</div>
 					</div>
-					<div class="form_field">
-						<label class="input_label sr-only">휴대폰 번호</label>
-						<div class="ui_col_12">
-							<div class="input_wrap">
-								<input type="text" name="cellPhnno" id="cellPhnno" placeholder="휴대폰 번호">
-							</div>
+				</div>
+				<div class="form_field">
+					<label class="input_label sr-only">휴대폰 번호</label>
+					<div class="ui_col_12">
+						<div class="input_wrap">
+							<input type="text" name="cellPhnno" id="cellPhnno" placeholder="휴대폰 번호">
 						</div>
 					</div>
-					<div class="form_field">
-						<label class="input_label sr-only">이메일주소</label>
-						<div class="ui_col_12">
-							<div class="input_wrap">
-								<input type="text" name="email" id="email" placeholder="이메일주소">
-							</div>
+				</div>
+				<div class="form_field">
+					<label class="input_label sr-only">이메일주소</label>
+					<div class="ui_col_12">
+						<div class="input_wrap">
+							<input type="text" name="email" id="email" placeholder="이메일주소">
 						</div>
 					</div>
-					<div class="form_field">
-						<label class="input_label sr-only">배송주소 우편번호</label>
-						<div class="ui_col_12">
-							<div class="input_wrap" style="display: flex;">
-								<input type="text" name="recipZipcode" id="recipZipcode" placeholder="우편번호">
-								<button type="submit" class="btn btn_default">우편번호 찾기</button>
-							</div>
+				</div>
+				<div class="form_field">
+					<label class="input_label sr-only">배송주소 우편번호</label>
+					<div class="ui_col_12">
+						<div class="input_wrap" style="display: flex;">
+							<input type="text" name="recipZipcode" id="recipZipcode" placeholder="우편번호">
+							<button type="submit" class="btn btn_default">우편번호 찾기</button>
 						</div>
 					</div>
-					<br>
-					<div class="form_field">
-						<label class="input_label sr-only">배송주소 기본주소</label>
-						<div class="ui_col_12">
-							<input type="text" name="recipBaseAddr" id="recipBaseAddr" placeholder="기본주소">
-						</div>
+				</div>
+				<br>
+				<div class="form_field">
+					<label class="input_label sr-only">배송주소 기본주소</label>
+					<div class="ui_col_12">
+						<input type="text" name="recipBaseAddr" id="recipBaseAddr" placeholder="기본주소">
 					</div>
-					<div class="form_field">
-						<label class="input_label sr-only">배송주소 상세주소</label>
-						<div class="ui_col_12">
-							<input type="text" name="recipDtlAddr" id="recipDtlAddr" placeholder="상세주소">
-						</div>
+				</div>
+				<div class="form_field">
+					<label class="input_label sr-only">배송주소 상세주소</label>
+					<div class="ui_col_12">
+						<input type="text" name="recipDtlAddr" id="recipDtlAddr" placeholder="상세주소">
 					</div>
-					
-					<!-- 주소 출력 
-					<div class="help_block">
-						<p><span>도로명</span>서울특별시 서초구 서운로 57번길</p>
-						<p><span>지번</span>서울특별시 서초구 서포동 60-28</p>
+				</div>
+				
+				<!-- 주소 출력 
+				<div class="help_block">
+					<p><span>도로명</span>서울특별시 서초구 서운로 57번길</p>
+					<p><span>지번</span>서울특별시 서초구 서포동 60-28</p>
+				</div>
+				-->
+				
+				<!-- //주소 출력 -->
+				<div class="form_field">
+					<div>
+						<input id="chk-2" type="checkbox"><label for="chk-2">
+							<p>
+								비회원 개인정보 수집&#47;이용 동의 <span>(필수)</span>
+							</p>
+						</label>
 					</div>
-					-->
-					
-					<!-- //주소 출력 -->
-					<div class="form_field">
-						<div>
-							<input id="chk-2" type="checkbox"><label for="chk-2">
-								<p>
-									비회원 개인정보 수집&#47;이용 동의 <span>(필수)</span>
-								</p>
-							</label>
-						</div>
+				</div>
+				
+				<div class="form_field txt_area">
+					<div
+						style="overflow: auto; max-height: 176px; border: 1px solid #ddd;">
+						<strong>제1조(목적)</strong>
+						<p>이 약관은 (유)내고향시푸드(전자거래 사업자)이 운영하는 홈페이지(이하 "쇼핑몰"이라 한다)에서
+							제공하는 인터넷 관련 서비스(이하 "서비스"라 한다)를 이용함에 있어 (유)내고향시푸드와 이용자의 권리·의무 및
+							책임사항을 규정함을 목적으로 합니다. ※ 「PC통신 등을 이용하는 전자거래에 대해서도 그 성질에 반하지 않는 한
+							이 약관을 준용합니다」 제2조(정의) ① "쇼핑몰" 이란 사업자가 재화 또는 용역을 이용자에게 제공하기 위하여
+							컴퓨터 등 정보통신설비를 이용하여 재화 또는 용역을 거래할 수 있도록 설정한 가상의 영업장을 말하며, 아울러
+							쇼핑몰을 운영하는 사업자의 의미로도 사용합니다. ② "이용자"란 "쇼핑몰"에 접속하여 이 약관에 따라 "쇼핑몰"이
+							제공하는 서비스를 받는 회원 및 비회원을 말합니다. ③ "회원"이라 함은 "쇼핑몰"에 개인정보를 제공하여
+							회원등록을 한 자로서, "쇼핑몰"의 정보를 지속적으로 제공받으며, "쇼핑몰"이 제공하는 서비스를 계속적으로 이용할
+							수 있는 자를 말합니다. ④ "비회원"이라 함은 회원에 가입하지 않고 "쇼핑몰"이 제공하는 서비스를 이용하는 자를
+							말합니다. 제3조 (약관의 명시와 개정) ① "쇼핑몰"은 이 약관의 내용과 상호, 영업소 소재지, 대표자의 성명,
+							사업자등록번호, 연락처(전화, 팩스, 전자우편 주소 등) 등을 이용자가 알 수 있도록 사이트의 초기
+							서비스화면(전면)에 게시합니다. ② "쇼핑몰"은 약관의 규제 등에 관한 법률, 전자거래기본법, 전자서명법,
+							정보통신망 이용촉진 등에 관한 법률, 방문판매 등에 관한법률, 소비자보호법 등 관련법을 위배하지 않는 범위에서 이
+							약관을 개정할 수 있습니다. ③ "쇼핑몰"이 약관을 개정할 경우에는 적용일자 및 개정사유를 명시하여 현행약관과
+							함께 홈페이지의 초기화면에 그 적용일자 7일 이전부터 적용일자 전일까지 공지합니다. ④ "쇼핑몰"이 약관을 개정할
+							경우에는 그 개정약관은 그 적용일자 이후에 체결되는 계약에만 적용되고 그 이전에 이미 체결된 계약에 대해서는 개정
+							전의 약관조항이 그대로 적용됩니다. 다만 이미 계약을 체결한 이용자가 개정약관 조항의 적용을 받기를 원하는 뜻을
+							제3항에 의한 개정약관의 공지기간 내에 "쇼핑몰"에 송신하여 "쇼핑몰"의 동의를 받은 경우에는 개정약관 조항이
+							적용됩니다. ⑤ 이 약관에서 정하지 아니한 사항과 이 약관의 해석에 관하여는 정부가 제정한 전자거래소비자보호지침
+							및 관계법령 또는 상관례에 따릅니다. 제4조(서비스의 제공 및 변경) ① "쇼핑몰"은 다음과 같은 업무를
+							수행합니다. 1. 재화 또는 용역에 대한 정보 제공 및 구매계약의 체결 2. 구매계약이 체결된 재화 또는 용역의
+							배송 3. 기타 "쇼핑몰"이 정하는 업무 ② "쇼핑몰"은 재화의 품절 또는 기술적 사양의 변경 등의 경우에는 장차
+							체결되는 계약에 의해 제공할 재화·용역의 내용을 변경할 수 있습니다. 이 경우에는 변경된 재화·용역의 내용 및
+							제공일자를 명시하여 현재의 재화·용역의 내용을 게시한 곳에 그 제공일자 이전 7일부터 공지합니다. ③ "쇼핑몰"이
+							제공하기로 이용자와 계약을 체결한 서비스의 내용을 재화의 품절 또는 기술적 사양의 변경 등의 사유로 변경할
+							경우에는 "쇼핑몰"은 이로 인하여 이용자가 입은 손해를 배상합니다. 단, "쇼핑몰"에 고의 또는 과실이 없는
+							경우에는 그러하지 아니합니다.</p>
 					</div>
-					
-					<div class="form_field txt_area">
-						<div
-							style="overflow: auto; max-height: 176px; border: 1px solid #ddd;">
-							<strong>제1조(목적)</strong>
-							<p>이 약관은 (유)내고향시푸드(전자거래 사업자)이 운영하는 홈페이지(이하 "쇼핑몰"이라 한다)에서
-								제공하는 인터넷 관련 서비스(이하 "서비스"라 한다)를 이용함에 있어 (유)내고향시푸드와 이용자의 권리·의무 및
-								책임사항을 규정함을 목적으로 합니다. ※ 「PC통신 등을 이용하는 전자거래에 대해서도 그 성질에 반하지 않는 한
-								이 약관을 준용합니다」 제2조(정의) ① "쇼핑몰" 이란 사업자가 재화 또는 용역을 이용자에게 제공하기 위하여
-								컴퓨터 등 정보통신설비를 이용하여 재화 또는 용역을 거래할 수 있도록 설정한 가상의 영업장을 말하며, 아울러
-								쇼핑몰을 운영하는 사업자의 의미로도 사용합니다. ② "이용자"란 "쇼핑몰"에 접속하여 이 약관에 따라 "쇼핑몰"이
-								제공하는 서비스를 받는 회원 및 비회원을 말합니다. ③ "회원"이라 함은 "쇼핑몰"에 개인정보를 제공하여
-								회원등록을 한 자로서, "쇼핑몰"의 정보를 지속적으로 제공받으며, "쇼핑몰"이 제공하는 서비스를 계속적으로 이용할
-								수 있는 자를 말합니다. ④ "비회원"이라 함은 회원에 가입하지 않고 "쇼핑몰"이 제공하는 서비스를 이용하는 자를
-								말합니다. 제3조 (약관의 명시와 개정) ① "쇼핑몰"은 이 약관의 내용과 상호, 영업소 소재지, 대표자의 성명,
-								사업자등록번호, 연락처(전화, 팩스, 전자우편 주소 등) 등을 이용자가 알 수 있도록 사이트의 초기
-								서비스화면(전면)에 게시합니다. ② "쇼핑몰"은 약관의 규제 등에 관한 법률, 전자거래기본법, 전자서명법,
-								정보통신망 이용촉진 등에 관한 법률, 방문판매 등에 관한법률, 소비자보호법 등 관련법을 위배하지 않는 범위에서 이
-								약관을 개정할 수 있습니다. ③ "쇼핑몰"이 약관을 개정할 경우에는 적용일자 및 개정사유를 명시하여 현행약관과
-								함께 홈페이지의 초기화면에 그 적용일자 7일 이전부터 적용일자 전일까지 공지합니다. ④ "쇼핑몰"이 약관을 개정할
-								경우에는 그 개정약관은 그 적용일자 이후에 체결되는 계약에만 적용되고 그 이전에 이미 체결된 계약에 대해서는 개정
-								전의 약관조항이 그대로 적용됩니다. 다만 이미 계약을 체결한 이용자가 개정약관 조항의 적용을 받기를 원하는 뜻을
-								제3항에 의한 개정약관의 공지기간 내에 "쇼핑몰"에 송신하여 "쇼핑몰"의 동의를 받은 경우에는 개정약관 조항이
-								적용됩니다. ⑤ 이 약관에서 정하지 아니한 사항과 이 약관의 해석에 관하여는 정부가 제정한 전자거래소비자보호지침
-								및 관계법령 또는 상관례에 따릅니다. 제4조(서비스의 제공 및 변경) ① "쇼핑몰"은 다음과 같은 업무를
-								수행합니다. 1. 재화 또는 용역에 대한 정보 제공 및 구매계약의 체결 2. 구매계약이 체결된 재화 또는 용역의
-								배송 3. 기타 "쇼핑몰"이 정하는 업무 ② "쇼핑몰"은 재화의 품절 또는 기술적 사양의 변경 등의 경우에는 장차
-								체결되는 계약에 의해 제공할 재화·용역의 내용을 변경할 수 있습니다. 이 경우에는 변경된 재화·용역의 내용 및
-								제공일자를 명시하여 현재의 재화·용역의 내용을 게시한 곳에 그 제공일자 이전 7일부터 공지합니다. ③ "쇼핑몰"이
-								제공하기로 이용자와 계약을 체결한 서비스의 내용을 재화의 품절 또는 기술적 사양의 변경 등의 사유로 변경할
-								경우에는 "쇼핑몰"은 이로 인하여 이용자가 입은 손해를 배상합니다. 단, "쇼핑몰"에 고의 또는 과실이 없는
-								경우에는 그러하지 아니합니다.</p>
+				</div>
+				<div class="form_field">
+					<div class="ui_row btn_group_md">
+						<div class="ui_col_6">
+							<button class="btn btn_default btn_block" id="btn_cancel">
+								<span>취소</span>
+							</button>
 						</div>
-					</div>
-					<div class="form_field">
-						<div class="ui_row btn_group_md">
-							<div class="ui_col_6">
-								<button class="btn btn_default btn_block" id="btn_cancel">
-									<span>취소</span>
-								</button>
-							</div>
-							<div class="ui_col_6">
-								<button class="btn btn_dark btn_block" id="btn_order">
-									<span>주문하기</span>
-								</button>
-							</div>
+						<div class="ui_col_6">
+							<button class="btn btn_dark btn_block" id="btn_order">
+								<span>주문하기</span>
+							</button>
 						</div>
 					</div>
-					<div class="form_info">
-						<p>STYLE24에 회원가입을 하시면 더 많은 혜택을 받으실 수 있습니다!</p>
-						<a href="#none" id="btn_join">회원가입</a>
-					</div>
-				</form>
-			</div>
+				</div>
+				<div class="form_info">
+					<p>STYLE24에 회원가입을 하시면 더 많은 혜택을 받으실 수 있습니다!</p>
+					<a href="#none" id="btn_join">회원가입</a>
+				</div>
+			</form>
 		</div>
 	</div>
+</div>
 
-	<script th:inline="javascript">
-		
-	</script>
-
-	<script type="text/javascript">
-		// 컨텐츠 호출
-		$(document).ready( function() {
-			
-		});
-		
-		// 취소버튼
-		$("btn_cancel").on("click", function() {
-			
-		});
+<script th:inline="javascript">
+	var isLogin = [[${isLogin}]];				// 자사 일반,촐알 배송건수
 		
-		// 주문하기버튼
-		$("btn_order").on("click", function() {
-			// TODO 유효성 체크 추가
+	// 컨텐츠 호출
+	$(document).ready( function() {
+		// 로그인 
+		if (isLogin) {
 			$("#orderForm").submit();
-		});
+		}
+	});
+	
+	// 취소버튼
+	$("btn_cancel").on("click", function() {
+		
+	});
+	
+	// 주문하기버튼
+	$("btn_order").on("click", function() {
+		// TODO 유효성 체크 추가
+		$("#orderForm").submit();
+	});
+	
+	// 회원가입버튼
+	$("btn_join_member").on("click", function() {
 		
-		// 회원가입버튼
-		$("btn_join_member").on("click", function() {
-			
-		});
-	</script>
+	});
+</script>
 </th:block>
 
 </body>

+ 234 - 0
src/main/webapp/ux/pc/js/cart.js

@@ -0,0 +1,234 @@
+// 배송조회 버튼 클릭 이벤트
+var fnGetDeliveryInfo = function(param) {
+	let invoiceNo = $(param).attr('invoiceNo');
+	let shipCompCd = $(param).attr('shipCompCd');
+	
+	// TODO
+	// 배송조회 처리
+}
+
+// 구매확정 처리
+var fnDecideOrder = function(param) {
+	let ordDtlNoArr = $(param).parent().parent().find('input[name=ordDtlNo]');
+	let ordDtlStatArr = $(param).parent().parent().find('input[name=ordDtlStat]');
+	
+	let orderDecisionArr = [];
+	$.each(ordDtlNoArr, function(idx, item) {
+		if (ordDtlStatArr[idx].value == 'G013_60') {
+			orderDecisionArr.push(item.value);
+		}
+	});
+	
+	if (orderDecisionArr.length == 0) {
+		mcxDialog.alert('구매확정 가능한 상품이 없습니다.');
+		return false;
+	}
+	
+	mcxDialog.confirm('구매확정 처리를 하시겠습니까?', {
+		cancelBtnText: "취소",
+		sureBtnText: "확인",
+		sureBtnClick: function(){
+			let data = {};
+			
+			data.ordNo = ordNo;
+			data.ordDtlNoArr = orderDecisionArr;
+			
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit('/mypage/order/decision'
+				, jsonData
+				, function() {
+					cfnGoToPage(_PAGE_MYPAGE_ORDER_DETAIL + ordNo);
+				});
+		}
+	});
+}
+
+// 리뷰작성 버튼 클릭 이벤트
+var fnCreateReview = function(param, bannerYn) {
+	let ordDtlNoArr;
+	let ordDtlStatArr;
+	let reviewSqArr;
+
+	if (bannerYn == 'Y') {
+		ordDtlNoArr = $(param).parent().parent().find('input[name=ordDtlNo]');
+		ordDtlStatArr = $(param).parent().parent().find('input[name=ordDtlStat]');
+		reviewSqArr = $(param).parent().parent().find('input[name=reviewSq]');
+	} else {
+		ordDtlNoArr = $(param).parent().parent().parent().parent().find('input[name=ordDtlNo]');
+		ordDtlStatArr = $(param).parent().parent().parent().parent().find('input[name=ordDtlStat]');
+		reviewSqArr = $(param).parent().parent().parent().parent().find('input[name=reviewSq]');
+	}
+	
+	let canReviewSqArr = [];
+	$.each(ordDtlNoArr, function(idx, item) {
+		if (ordDtlStatArr[idx].value == 'G013_70' && reviewSqArr[idx].value == 0) {
+			canReviewSqArr.push(item.value);
+		}
+	});
+	
+	if (canReviewSqArr.length == 0) {
+		mcxDialog.alert('리뷰작성 가능한 상품이 없습니다.');
+		return false;
+	}
+	
+	// TODO
+	// 리뷰 작성페이지 이동
+	let data = {};
+	
+	data.ordNo = ordNo;
+	data.ordDtlNoArr = canReviewSqArr;
+	
+	var jsonData = JSON.stringify(data);
+	
+	//gagajf.ajaxJsonSubmit('/mypage/order/decision'
+	//	, jsonData
+	//	, function() {
+	//		cfnGoToPage(_PAGE_MYPAGE_ORDER_DETAIL + ordNo);
+	//	});
+	
+}
+
+// 장바구니 담기 버튼 클릭 이벤트
+var fnCreateCart = function(param, bannerYn) {
+	let ordDtlNoArr = '';
+	let ordDtlStatArr = '';
+	let reviewSqArr = '';
+
+	if (bannerYn == 'Y') {
+		ordDtlNoArr = $(param).parent().parent().find('input[name=ordDtlNo]');
+		ordDtlStatArr = $(param).parent().parent().find('input[name=ordDtlStat]');
+		reviewSqArr = $(param).parent().parent().find('input[name=reviewSq]');
+	} else {
+		ordDtlNoArr = $(param).parent().parent().parent().parent().parent().find('input[name=ordDtlNo]');
+		ordDtlStatArr = $(param).parent().parent().parent().parent().parent().find('input[name=ordDtlStat]');
+		reviewSqArr = $(param).parent().parent().parent().parent().parent().find('input[name=reviewSq]');
+	}
+	
+	let cartArr = [];
+	$.each(ordDtlNoArr, function(idx, item) {
+		if (bannerYn != 'Y' || (bannerYn == 'Y' && ordDtlStatArr[idx].value == 'G013_70' && reviewSqArr[idx].value > 0)) {
+			cartArr.push(item.value);
+		}
+	});
+	
+	if (cartArr.length == 0) {
+		mcxDialog.alert('장바구니에 담을 상품이 없습니다.');
+		return false;
+	}
+	
+	// TODO
+	// 장바구니 담기 처리
+	let data = {};
+	
+	data.ordNo = ordNo;
+	data.ordDtlNoArr = cartArr;
+	
+	var jsonData = JSON.stringify(data);
+	
+	//gagajf.ajaxJsonSubmit('/mypage/order/decision'
+	//	, jsonData
+	//	, function() {
+	//		cfnGoToPage(_PAGE_MYPAGE_ORDER_DETAIL + ordNo);
+	//	});
+}
+
+// 선물하기 SMS 재전송 버튼 클릭 이벤트
+var fnReSendSms = function(param) {
+	let ordNo = $(param).attr('ordNo');
+	
+	// TODO
+	// 선물하기 SMS 재발송 처리
+}
+
+// 교환 버튼 클릭 이벤트
+var fnCreateExchange = function(param) {
+	if (ordNo == null) {
+		ordNo = $(param).attr('ordNo');
+	}
+
+	let ordDtlNoArr = $(param).parent().parent().parent().parent().find('input[name=ordDtlNo]');
+	
+	let exchangeArr = [];
+	$.each(ordDtlNoArr, function(idx, item) {
+		exchangeArr.push(item.value);
+	})
+	
+	
+	// TODO
+	// 교환신청 페이지 이동 처리
+	$('#exchangeForm input[name=ordNo]').val(ordNo);
+	$('#exchangeForm input[name=ordDtlNoArr]').val(exchangeArr);
+	
+	document.exchangeForm.submit();
+}
+
+// 반품/취소 버튼 클릭 이벤트
+var fnCreateCancel = function(param) {
+	let ordDtlNoArr = $(param).parent().parent().parent().parent().find('input[name=ordDtlNo]');
+	
+	// TODO
+	// 반품/취소신청 페이지 이동 처리
+}
+
+// 주문 내역 삭제 처리
+var fnDeleteOrder = function() {
+	mcxDialog.confirm('주문 내역을 삭제하시겠습니까?', {
+		cancelBtnText: "취소",
+		sureBtnText: "확인",
+		sureBtnClick: function(){
+			let data = {};
+			
+			data.ordNo = ordNo;
+			
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit('/mypage/order/delete'
+				, jsonData
+				, function() {
+					cfnGoToPage(_PAGE_MYPAGE);
+				});
+		}
+	});
+};
+
+// 문자열 길이를 체크
+var cfnGetTextLength = function(obj, maxLen, dpLoc) {
+	var valLen = $(obj).val().length;
+	var cByte = 0;
+	var sliceLen = 0;
+	
+	for (i = 0; i < valLen; i++) {
+		var aChar = $(obj).val().charAt(i);
+		if (escape(aChar).length == 6) {
+			cByte += 3; //한글이면 3를 더한다
+		} else if (aChar == '\n') {
+			cByte += 2; //엔터면 2을 더한다
+		} else {
+			cByte++; //한글아니면 1을 더한다
+		}
+		
+		if (cByte <= maxLen) {
+			sliceLen = i + 1;
+		}
+	}
+	
+	// 사용자가 입력한 값이 제한 값을 초과하는지를 검사한다.
+	if (parseInt(cByte) > parseInt(maxLen)) {
+		mcxDialog.alert('허용된 글자수가 초과되었습니다.\n초과된 부분은 자동으로 삭제됩니다.');
+		//var orgStr = $(obj).val();
+		var slicedStr = $(obj).val().substr(0, sliceLen);
+		$(obj).val(slicedStr);
+		var cByte = 0;
+		for (i = 0; i < $(obj).val().length; i++) {
+			var aChar = $(obj).val().charAt(i);
+			if (escape(aChar).length == 6) {
+				cByte += 3; //한글이면 3를 더한다
+			} else if (aChar == '\n') {
+				cByte += 2; //엔터면 2을 더한다
+			} else {
+				cByte++; //한글아니면 1을 더한다
+			}
+		}
+	}
+	
+	$(dpLoc).text(cByte.addComma());
+}

+ 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";			// 마이페이지 > 회원탈퇴
 
 //== 검색 ==/