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

Merge branch 'order' into develop

card007 5 лет назад
Родитель
Сommit
6cc9e6b902
19 измененных файлов с 1192 добавлено и 535 удалено
  1. 64 181
      src/main/java/com/style24/front/biz/service/TsfCartService.java
  2. 7 0
      src/main/java/com/style24/front/biz/service/TsfCouponService.java
  3. 5 0
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  4. 72 16
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  5. 20 26
      src/main/java/com/style24/front/biz/web/TsfOrderController.java
  6. 1 1
      src/main/java/com/style24/front/support/config/TsfWebMvcConfig.java
  7. 2 0
      src/main/java/com/style24/persistence/domain/Coupon.java
  8. 187 53
      src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml
  9. 22 3
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml
  10. 35 15
      src/main/webapp/WEB-INF/views/web/cart/cartListAjaxFormWeb.html
  11. 2 0
      src/main/webapp/WEB-INF/views/web/common/layout/MypageLayoutWeb.html
  12. 291 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageExchangeFormWeb.html
  13. 9 65
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html
  14. 37 2
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListFormWeb.html
  15. 11 8
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListWeb.html
  16. 5 5
      src/main/webapp/WEB-INF/views/web/order/OrderDelvMemoChangePopWeb.html
  17. 40 12
      src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html
  18. 148 148
      src/main/webapp/WEB-INF/views/web/order/OrderNoMemberWeb.html
  19. 234 0
      src/main/webapp/ux/pc/js/cart.js

+ 64 - 181
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,8 +269,12 @@ 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.setTmtbDcAmt(cart.getCurrPrice() * cart.getGoodsQty());
 			}
 		}
 
@@ -342,56 +304,58 @@ public class TsfCartService {
 		Collection<Order> cartGoodsList = coreOrderService.getCartGoodsList(param);
 
 		// 장바구니 내 수량 다다익선 적용 가능 리스트 조회 (등록된 기본,적용 상품 정보 전체 조회)
-		param.setApplyGb(TscConstants.ApplyGb.QTY.value());
-		Collection<Order> tmtbQtyApplyList = cartDao.selectMoreBetterApplyCartList(param);
+		Collection<Order> tmtbApplyList = cartDao.selectMoreBetterApplyCartList(param);
 
-		// 장바구니에 담긴 상품 금액 즉시할인가를 tmtbApplyList 에 저장 (추후 계산식을 위함)
-		for(Order cart : cartGoodsList) {
-			for(Order apply : tmtbQtyApplyList) {
-				if(cart.getCartSq() == apply.getCartSq()) {
-					apply.setCurrPrice(cart.getCurrPrice() + cart.getOptAddPrice());        /* 즉시할인 적용가 */
-				}
-			}
-		}
-
-		// 장바구니 등록 수량 다다익선 일련번호 지정
+		// 장바구니 등록 다다익선 일련번호 지정
+		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");
 						}
 					}
 				}
@@ -401,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();
 					}
@@ -420,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++;
@@ -546,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());

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

@@ -123,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) {

+ 5 - 0
src/main/java/com/style24/front/biz/service/TsfOrderService.java

@@ -71,6 +71,7 @@ public class TsfOrderService {
 		String shotDelvYn = "";
 		String selfGoodsYn = "";
 		String shipCompNm = "";
+		String shipCompCd = "";
 		String invoiceNo = "";
 		String giftPackYn = "";
 		String reviewYn = "";
@@ -90,6 +91,7 @@ public class TsfOrderService {
 					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);
@@ -119,6 +121,7 @@ public class TsfOrderService {
 				ordDtlStat = tmpOrder.getOrdDtlStat();
 				shotDelvYn = tmpOrder.getShotDelvYn();
 				selfGoodsYn = tmpOrder.getSelfGoodsYn();
+				shipCompCd = tmpOrder.getShipCompCd();
 				shipCompNm = tmpOrder.getShipCompNm();
 				giftPackYn = tmpOrder.getGiftPackYn();
 				ordDtlList = new ArrayList<>();
@@ -133,6 +136,7 @@ public class TsfOrderService {
 				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);
@@ -167,6 +171,7 @@ public class TsfOrderService {
 			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);

+ 72 - 16
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -28,6 +28,7 @@ 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;
@@ -78,6 +79,9 @@ public class TsfMypageController extends TsfBaseController {
 
 	@Autowired
 	private TsfCouponService couponService;
+	
+	@Autowired
+	private TsfRendererService rendererService;
 
 	/**
 	 * 마이페이지 메인 화면
@@ -94,8 +98,9 @@ public class TsfMypageController extends TsfBaseController {
 			order = new Order();
 		}
 		
-		// int custNo = TsfSession.getInfo().getCustNo();
-		int custNo = 1000007;
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
+		order.setCustNo(custNo);
 
 		// 고객정보 조회
 		Customer customer = new Customer();
@@ -104,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("couponCnt", coreOrderService.getCouponInfo(order));
 		
@@ -143,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();
@@ -167,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);
@@ -236,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) {
@@ -272,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;
+	}
+
 }

+ 20 - 26
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 임시 장바구니

+ 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"
 		};
 
 		// 디바이스 해석

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

@@ -17,6 +17,8 @@ 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;			// 쿠폰 다운로드 후 유효기간일

+ 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>
 
 	<!-- 장바구니 업체별 배송비 -->

+ 22 - 3
src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml

@@ -99,6 +99,12 @@
 					#{item}
 				</foreach>
 			</if>
+			<if test="ordDtlNoArr != null">
+		   AND OD.ORD_DTL_NO IN
+				<foreach collection="ordDtlNoArr" item="item" index="index"  open="(" close=")" separator=",">
+					#{item}
+				</foreach>
+			</if>
 		   AND O.DISP_YN = 'Y'
 		</where>
 		 ORDER BY OD.SUPPLY_COMP_CD
@@ -282,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>
 

+ 35 - 15
src/main/webapp/WEB-INF/views/web/cart/cartListAjaxFormWeb.html

@@ -52,7 +52,7 @@
                     </colgroup>
                     <tbody>
                     <th:block th:each="cart, status : ${wmsCartList}">
-                    <tr>
+                    <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}" />
@@ -60,6 +60,9 @@
                         <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;">
                             <!-- 주문가능 상품 -->
@@ -87,8 +90,11 @@
                                     </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" class="btn_opt_pop"><span>옵션/수량변경</span></button>
                                     </p>
@@ -123,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>
@@ -137,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>
@@ -179,7 +185,7 @@
                     </colgroup>
                     <tbody>
                     <th:block th:each="cart, status : ${delvCartList}">
-                    <tr>
+                    <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}" />
@@ -187,12 +193,16 @@
                         <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">
+                            <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>
@@ -211,7 +221,9 @@
                                     </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" class="btn_opt_pop"><span>옵션/수량변경</span></button>
@@ -247,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>
@@ -545,14 +557,17 @@
     }
 
     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);
@@ -603,6 +618,11 @@
         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");

+ 2 - 0
src/main/webapp/WEB-INF/views/web/common/layout/MypageLayoutWeb.html

@@ -65,6 +65,8 @@
 <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) {

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

+ 9 - 65
src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html

@@ -58,6 +58,7 @@
 										<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">
@@ -77,7 +78,7 @@
 																<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">
@@ -94,9 +95,9 @@
 														<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"><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="${ordDtl.reviewSq == 0}"><span>리뷰작성</span></button>
+														<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)}">
@@ -106,7 +107,7 @@
 														<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"><span>SMS 재전송</span></button>
+														<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)}">
@@ -136,7 +137,7 @@
 										</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>
+											<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>
@@ -144,11 +145,11 @@
 										</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>
+											<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">장바구니 담기</button>
+											<button type="button" class="btn btn_primary" onclick="fnCreateCart(this, 'Y');">장바구니 담기</button>
 										</div>
 									</th:block>
 
@@ -406,63 +407,6 @@
 <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 fnDecideOrder = function(param) {
-		let ordDtlNoArr = $(param).parent().parent().find('input[name=ordDtlNo]');
-		let ordDtlStatArr = $(param).parent().parent().find('input[name=ordDtlStat]');
-		
-		console.log($(param).parent().parent().find('input[name=ordDtlNo]'));
-		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 fnChangeDelvMemo = function() {
 		// TODO

+ 37 - 2
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>
@@ -95,10 +107,10 @@
 				</div>
 				<div class="sch_right">
 					<div class="sch_datepicker sb">
-						<input type="text" class="n_input my_datepicker" name="stDate" value="" 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="" 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" onclick="fnSearchOrderList();">조회</button>
 				</div>
@@ -110,6 +122,7 @@
 	</div>
 <script src="/ux/plugins/gaga/gaga.paging.js"></script>
 <script th:inline="javascript">
+	let ordNo = [[${ordNo}]];
 	let customerInfo = [[${customerInfo}]];
 /*<![CDATA[*/
 	$(document).ready(function() {
@@ -190,6 +203,28 @@
 			}
 		});
 	}
+	
+	// 검색기간 설정 체크
+	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>
 

+ 11 - 8
src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListWeb.html

@@ -40,6 +40,9 @@
 					</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">
@@ -75,9 +78,9 @@
 									<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"><span>교환</span></button>
-									<button type="button" class="btn btn_default btn_sm"><span>반품/취소</span></button>
-									<button type="button" class="btn btn_default btn_sm"><span>리뷰작성</span></button>
+									<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)}">
@@ -87,7 +90,7 @@
 									<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"><span>SMS 재전송</span></button>
+									<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)}">
@@ -117,19 +120,19 @@
 					</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>
+						<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">구매확정 하기</button>
+						<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">리뷰작성</button>
+						<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">장바구니 담기</button>
+						<button type="button" class="btn btn_primary" onclick="fnCreateCart(this, 'Y');">장바구니 담기</button>
 					</div>
 				</th:block>
 	

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

+ 40 - 12
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>
@@ -382,7 +382,7 @@
 																						</div>
 																						
 																						<div class="form_field">
-																							<select id="" class="select_hidden cpnSelect">
+																							<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>
@@ -408,7 +408,7 @@
 																				<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.cpnId}+'|'+${cartCpn.cpnNm}"></option>
@@ -898,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>
@@ -1174,6 +1174,7 @@ $(document).ready( function() {
 
 <script th:inline="javascript">
 	// 배송관련정보 변수선언
+	var cartGoodsList		= [[${cartGoodsList}]]			// 배송목록
 	var wmsCnt 				= [[${wmsCnt}]];				// 자사 일반,촐알 배송건수
 	var resCnt 				= [[${resCnt}]];				// 자사 예약 배송건수
 	var delvCnt 			= [[${delvCnt}]];				// 입전 일반 배송건수
@@ -1214,6 +1215,21 @@ $(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 th:inline="javascript">
@@ -1240,9 +1256,21 @@ $(document).ready( function() {
 		
 		// 3. 최적의 할인으로 쿠폰 설정
 		//$(".cpnSelect option:eq(1)").attr("selected", "selected");
+		/*
 		$(".cpnSelect").each(function(i){
-			$(this).find("option:eq(1)").attr("selected", "selected");
+			//$(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());
+}