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

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

jsh77b 5 лет назад
Родитель
Сommit
352c2f7522
47 измененных файлов с 2216 добавлено и 655 удалено
  1. 9 0
      src/main/java/com/style24/front/biz/dao/TsfCommonDao.java
  2. 9 0
      src/main/java/com/style24/front/biz/dao/TsfGiftcardDao.java
  3. 66 1
      src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java
  4. 10 0
      src/main/java/com/style24/front/biz/dao/TsfPointDao.java
  5. 11 0
      src/main/java/com/style24/front/biz/service/TsfGiftcardService.java
  6. 66 9
      src/main/java/com/style24/front/biz/service/TsfPlanningService.java
  7. 11 1
      src/main/java/com/style24/front/biz/service/TsfPointService.java
  8. 34 2
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  9. 106 15
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  10. 47 24
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  11. 2 46
      src/main/java/com/style24/front/support/controller/TsfBaseController.java
  12. 7 4
      src/main/java/com/style24/front/support/controller/TsfCustomErrorController.java
  13. 68 0
      src/main/java/com/style24/front/support/util/ViewUtils.java
  14. 2 1
      src/main/java/com/style24/persistence/domain/Login.java
  15. 5 1
      src/main/java/com/style24/persistence/domain/Plan.java
  16. 7 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfCommon.xml
  17. 29 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfGiftcard.xml
  18. 19 23
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  19. 17 16
      src/main/java/com/style24/persistence/mybatis/shop/TsfLogin.xml
  20. 13 3
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml
  21. 2 2
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml
  22. 125 34
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  23. 30 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfPoint.xml
  24. 1 1
      src/main/resources/config/application-tsit.yml
  25. 13 2
      src/main/webapp/WEB-INF/views/mob/error/404Mob.html
  26. 1 0
      src/main/webapp/WEB-INF/views/mob/error/500Mob.html
  27. 39 0
      src/main/webapp/WEB-INF/views/mob/error/InaccessMob.html
  28. 53 1
      src/main/webapp/WEB-INF/views/web/common/layout/MypageLayoutWeb.html
  29. 161 0
      src/main/webapp/WEB-INF/views/web/display/LookbookMainFormWeb.html
  30. 39 38
      src/main/webapp/WEB-INF/views/web/display/MallMainFormWeb.html
  31. 14 3
      src/main/webapp/WEB-INF/views/web/error/404Web.html
  32. 39 0
      src/main/webapp/WEB-INF/views/web/error/InaccessWeb.html
  33. 205 0
      src/main/webapp/WEB-INF/views/web/mypage/ChangeOptionPopupFormWeb.html
  34. 55 36
      src/main/webapp/WEB-INF/views/web/mypage/MypageCancelFormWeb.html
  35. 251 194
      src/main/webapp/WEB-INF/views/web/mypage/MypageExchangeFormWeb.html
  36. 285 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageExchangeFormWeb_20210330.html
  37. 12 22
      src/main/webapp/WEB-INF/views/web/mypage/MypageGiftcardFormWeb.html
  38. 1 20
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html
  39. 6 6
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListFormWeb.html
  40. 18 39
      src/main/webapp/WEB-INF/views/web/mypage/MypagePointForm2Web.html
  41. 146 26
      src/main/webapp/WEB-INF/views/web/mypage/MypageReturnFormWeb.html
  42. 6 4
      src/main/webapp/WEB-INF/views/web/mypage/MypageReviewCreateFormWeb.html
  43. 17 75
      src/main/webapp/WEB-INF/views/web/mypage/MypageWishListFormWeb.html
  44. 2 2
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  45. 133 0
      src/main/webapp/WEB-INF/views/web/planning/PlanningShotGuideFormWeb.html
  46. 21 3
      src/main/webapp/biz/mypage.js
  47. 3 1
      src/main/webapp/ux/style24_link.js

+ 9 - 0
src/main/java/com/style24/front/biz/dao/TsfCommonDao.java

@@ -33,6 +33,15 @@ public interface TsfCommonDao {
 	 */
 	void createInflowHistory(InflowHst inflow);
 
+	/**
+	 * 웹제휴채널명 조회
+	 * @param afLinkCd - 웹제휴링크코드
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 30
+	 */
+	String getAfLinkName(String afLinkCd);
+
 //	/**
 //	 * 기본답변문구내용 조회
 //	 *

+ 9 - 0
src/main/java/com/style24/front/biz/dao/TsfGiftcardDao.java

@@ -59,5 +59,14 @@ public interface TsfGiftcardDao {
 	 */
 	 void saveGiftcardApi(GiftCard giftcard);
 	 
+	 /**
+	 * 상품권 최근 12개월 년 월
+	 *
+	 * @param 
+	 * @author sowon
+	 * @since 2021. 3. 30
+	 */
+	 Collection<GiftCard> getRecentlyDate();
+	 
 	 
 }

+ 66 - 1
src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java

@@ -46,13 +46,58 @@ public interface TsfPlanningDao {
 
 	/**
 	 * 기획전 상품 목록
-	 * @param
+	 * @param plan - 기획전 정보
 	 * @return
 	 * @author gagamel
 	 * @since 2021. 3. 29
 	 */
 	Collection<Plan> getPlanningGoodsList(Plan plan);
 
+	/**
+	 * 디바이스접근가능여부 조회
+	 * @param plan - 기획전 정보
+	 * @return Y:접근가능 / N:접근불가
+	 * @author gagamel
+	 * @since 2021. 3. 30
+	 */
+	String getDeviceAccessibleYn(Plan plan);
+
+	/**
+	 * 신규회원접근가능여부 조회
+	 * @param plan - 기획전 정보
+	 * @return Y:접근가능 / N:접근불가
+	 * @author gagamel
+	 * @since 2021. 3. 30
+	 */
+	String getNewCustomerAccessibleYn(Plan plan);
+
+	/**
+	 * 고객구분접근가능여부 조회
+	 * @param plan - 기획전 정보
+	 * @return Y:접근가능 / N:접근불가
+	 * @author gagamel
+	 * @since 2021. 3. 30
+	 */
+	String getCustomerGubunAccessibleYn(Plan plan);
+
+	/**
+	 * 고객등급접근가능여부 조회
+	 * @param plan - 기획전 정보
+	 * @return Y:접근가능 / N:접근불가
+	 * @author gagamel
+	 * @since 2021. 3. 30
+	 */
+	String getCustomerGradeAccessibleYn(Plan plan);
+
+	/**
+	 * 웹제휴채널접근가능여부 조회
+	 * @param plan - 기획전 정보
+	 * @return Y:접근가능 / N:접근불가
+	 * @author gagamel
+	 * @since 2021. 3. 30
+	 */
+	String getAfLinkAccessibleYn(Plan plan);
+
 //	/**
 //	 * 기획전 목록 + 상품
 //	 *
@@ -171,6 +216,17 @@ public interface TsfPlanningDao {
 	 * @date 2021. 3. 23
 	 */
 	Collection<Plan> getPlanGoods1Info(Plan plan);
+	
+
+	/**
+	 * 기획전 코너 리스트
+	 *
+	 * @param 기획전 번호
+	 * @return
+	 * @author sowon
+	 * @date 2021. 3. 30
+	 */
+	Collection<Plan> getPlanCornerList(Plan plan);
 
 	/**
 	 * 이벤트 갯수 조회
@@ -192,4 +248,13 @@ public interface TsfPlanningDao {
 	 */
 	Collection<Plan> getPlanEventList(Plan plan);
 
+	/**
+	 * 총알배송 html 소스 
+	 *
+	 * @param plan
+	 * @return plan
+	 * @author sowon
+	 * @date 2021. 3. 30
+	 */
+	Plan getShotDeliveryHtml(Plan plan);
 }

+ 10 - 0
src/main/java/com/style24/front/biz/dao/TsfPointDao.java

@@ -3,6 +3,7 @@ package com.style24.front.biz.dao;
 import java.util.Collection;
 
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.GiftCard;
 import com.style24.persistence.domain.Point;
 
 /**
@@ -83,5 +84,14 @@ public interface TsfPointDao {
 	 * @since 2021. 03. 23
 	 */
 	Point getCustomerPoint(Point point);
+	
+	/**
+	 * 포인트 최근 12개월 년 월
+	 *
+	 * @param 
+	 * @author sowon
+	 * @since 2021. 3. 30
+	 */
+	 Collection<Point> getRecentlyDate();
 
 }

+ 11 - 0
src/main/java/com/style24/front/biz/service/TsfGiftcardService.java

@@ -133,5 +133,16 @@ public class TsfGiftcardService {
 		}
 
 	}
+	
+	 /**
+	 * 상품권 최근 12개월 년 월
+	 *
+	 * @param GiftCard
+	 * @author sowon
+	 * @since 2021. 3. 30
+	 */
+	 public Collection<GiftCard> getRecentlyDate(){
+		 return giftcardDao.getRecentlyDate();
+	 }
 
 }

+ 66 - 9
src/main/java/com/style24/front/biz/service/TsfPlanningService.java

@@ -2,10 +2,12 @@ package com.style24.front.biz.service;
 
 import java.util.Collection;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.style24.front.biz.dao.TsfCommonDao;
 import com.style24.front.biz.dao.TsfPlanningDao;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Coupon;
@@ -30,6 +32,9 @@ public class TsfPlanningService {
 	@Autowired
 	private TsfCouponService couponService;
 
+	@Autowired
+	private TsfCommonDao commonDao;
+
 	/**
 	 * 기획전 카테고리 목록
 	 * @param plan - 기획전 정보
@@ -111,20 +116,60 @@ public class TsfPlanningService {
 //	}
 
 	/**
-	 * 기획전 고객등급 목록
-	 *
-	 * @param
-	 * @return
-	 * @author sowon
-	 * @since 2021. 3. 9
+	 * 접근 불가능한 기획전 메시지 조회
+	 * @param planSq - 기획전번호
+	 * @return 접근 불가능 사유 메시지
+	 * @author gagamel
+	 * @since 2021. 3. 30
 	 */
-	public void accessCustGrade(Plan plan) {
-		if (!TsfSession.isLogin()) {
-			throw new IllegalArgumentException("로그인 후 접근이 가능합니다.");
+	public String getInaccessiblePlanningMessage(Integer planSq) {
+		String msg = "";
+
+		Plan plan = new Plan();
+		plan.setPlanSq(planSq);
+
+		// 디바이스접근가능여부 조회
+		plan.setFrontGb(TsfSession.getFrontGb());
+		if ("N".equals(planningDao.getDeviceAccessibleYn(plan))) {
+			msg = "PC웹에서만 접근이 가능합니다.";
+			if ("M".equals(TsfSession.getFrontGb())) {
+				msg = "모바일웹에서만 접근이 가능합니다.";
+			} else if ("A".equals(TsfSession.getFrontGb())) {
+				msg = "앱에서만 접근이 가능합니다.";
+			}
+		}
+
+		// 신규회원접근가능여부 조회
+		if ("N".equals(planningDao.getNewCustomerAccessibleYn(plan))) {
+			msg = "신규회원만 접근 가능합니다.";
 		}
 
+		if (TsfSession.isLogin()) {
+			// 고객구분접근가능여부 조회
+			plan.setCustGb(TsfSession.getCustGb());
+			if ("N".equals(planningDao.getCustomerGubunAccessibleYn(plan))) {
+				msg = TsfSession.getInfo().getCustGbNm() + "만 접근이 가능합니다.";
+			}
+
+			// 고객등급접근가능여부 조회
+			plan.setCustGrade(TsfSession.getInfo().getCustGrade());
+			if ("N".equals(planningDao.getCustomerGradeAccessibleYn(plan))) {
+				msg = TsfSession.getInfo().getCustGradeNm() + " 회원만 접근 가능합니다.";
+			}
+		}
+
+		if (StringUtils.isNotBlank(TsfSession.getAttribute("afLinkCd"))) {
+			// 웹제휴채널접근가능여부 조회
+			plan.setAfLinkCd(TsfSession.getAttribute("afLinkCd"));
+			if ("N".equals(planningDao.getAfLinkAccessibleYn(plan))) {
+				msg = commonDao.getAfLinkName(TsfSession.getAttribute("afLinkCd")) + " 채널만 접근 가능합니다.";
+			}
+		}
+
+		return msg;
 	}
 
+
 	/**
 	 * 기획전 상세 정보
 	 *
@@ -245,5 +290,17 @@ public class TsfPlanningService {
 	public Collection<Plan> getPlanEventList(Plan plan) {
 		return planningDao.getPlanEventList(plan);
 	}
+	
+	/**
+	 * 총알배송 html 소스 
+	 *
+	 * @param plan
+	 * @return plan
+	 * @author sowon
+	 * @date 2021. 3. 30
+	 */
+	public Plan getShotDeliveryHtml(Plan plan) {
+		return planningDao.getShotDeliveryHtml(plan);
+	}
 
 }

+ 11 - 1
src/main/java/com/style24/front/biz/service/TsfPointService.java

@@ -6,7 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.style24.front.biz.dao.TsfPointDao;
-
+import com.style24.persistence.domain.GiftCard;
 import com.style24.persistence.domain.Point;
 
 import lombok.extern.slf4j.Slf4j;
@@ -109,5 +109,15 @@ public class TsfPointService {
 		return pointDao.getCustomerPoint(point);
 	}
 
+	/**
+	 * 포인트 최근 12개월 년 월
+	 *
+	 * @param GiftCard
+	 * @author sowon
+	 * @since 2021. 3. 30
+	 */
+	 public Collection<Point> getRecentlyDate(){
+		 return pointDao.getRecentlyDate();
+	 }
 
 }

+ 34 - 2
src/main/java/com/style24/front/biz/web/TsfDisplayController.java

@@ -7,6 +7,9 @@ import java.util.HashMap;
 
 import javax.servlet.http.HttpServletResponse;
 
+import com.gagaframework.web.parameter.GagaMap;
+import com.style24.core.support.env.TscConstants;
+import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.BrandGroup;
 import com.style24.persistence.domain.Cate4Srch;
 import com.style24.persistence.domain.Contents;
@@ -127,12 +130,13 @@ public class TsfDisplayController extends TsfBaseController {
 			if(contentsLoc.equals("SMM006")){
 				Social social = new Social();
 				social.setSiteCd("G000_10");
-				social.setFrontGb("P");
+				social.setFrontGb(TsfSession.getFrontGb());
 				mainLayout.setSocialInfo(socialService.getSocialForGoods(social));
 			}
 
 			mainLayoutList.add(mainLayout);
 		}
+
 		//log.info("mainLayoutList::{}", mainLayoutList);
 		mav.addObject("mainLayoutList", mainLayoutList);
 		mav.setViewName(super.getDeviceViewName("display/MallMainForm"));
@@ -262,7 +266,7 @@ public class TsfDisplayController extends TsfBaseController {
 				Plan plan = new Plan();
 				plan.setBrandGroupNo(Integer.parseInt(paramMap.get("brandGroupNo")));
 				plan.setMaxRow(6);
-				plan.setFrontGb("P");
+				plan.setFrontGb(TsfSession.getFrontGb());
 				plan.setSiteCd("G000_10");
 				brandMain.setPlanningList(planningService.getPlanningMainList(plan));
 			}
@@ -330,4 +334,32 @@ public class TsfDisplayController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * 룩북 메인
+	 * @param lookbook
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 30
+	 */
+	@GetMapping("/lookbook/main/form")
+	public ModelAndView lookbookMain(Lookbook lookbook) {
+		ModelAndView mav = new ModelAndView(super.getDeviceViewName("display/LookbookMainForm"));
+
+		return mav;
+	}
+
+	/**
+	 * 룩북 리스트
+	 * @param lookbook
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 30
+	 */
+	@GetMapping("/lookbook/main/list")
+	@ResponseBody
+	public Collection<Lookbook> lookbooklist(Lookbook lookbook) {
+		lookbook.setFrontGb(TsfSession.getFrontGb());
+		return coreLookbookService.getLookbookList(lookbook);
+	}
+
 }

+ 106 - 15
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -357,15 +357,11 @@ public class TsfMypageController extends TsfBaseController {
 
 		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);
+		// 반품 가능 리스트 조회
+		GagaMap map = orderChangeService.getReturnListForMypage(order);
+		Order oneData = (Order) map.get("oneData");
+		mav.addObject("exchangeList", map);
+		mav.addObject("oneData", oneData);
 
 		// 주문 배송지 정보 조회
 		mav.addObject("deliveryAddrInfo", orderService.getOrderDeliveryAddrInfo(order));
@@ -378,6 +374,36 @@ public class TsfMypageController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * 마이페이지 교환 옵션 변경 팝업
+	 *
+	 * @param Order
+	 * @return ModelAndView
+	 * @author card007
+	 * @since 2021. 03. 30
+	 */
+	@PostMapping("/change/option/popup/form")
+	@ResponseBody
+	public ModelAndView changeOptionPopupForm(Order order) {
+		ModelAndView mav = new ModelAndView();
+
+		// custNo 설정
+		if (TsfSession.isLogin()) {
+			order.setCustNo(TsfSession.getInfo().getCustNo());
+		} else {
+			order.setCustNo(0);
+		}
+
+		// 교환 옵션 정보 조회
+		
+
+		// mav.addObject("exchangeOptionInfo", );
+		mav.setViewName(super.getDeviceViewName("mypage/ChangeOptionPopupForm"));
+
+		return mav;
+	}
+	
+
 	/**
 	 * 마이페이지 등급쿠폰 다운 처리
 	 *
@@ -514,6 +540,71 @@ public class TsfMypageController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * 반품신청
+	 * 
+	 * @param OrderChange
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 03. 30
+	 */
+	@SuppressWarnings("unchecked")
+	@PostMapping("/return")
+	@ResponseBody
+	public GagaMap rtnReq(@RequestBody OrderChange orderChange) {
+		if (orderChange== null) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		// TODO
+		// @ 주문취소시 상태값 체크
+		// @ 취소, 반품시 배송비 체크 로직 (선결제 로직)
+
+		// 1. 세션회원조회
+		int custNo = TsfSession.getInfo().getCustNo();
+		orderChange.setCustNo(custNo);
+
+		// 2. 환불 사전 정보 조회
+		GagaMap refundPreInfo = orderChangeService.getRefundPreInfo(orderChange);
+		List<Order> returnReqList = (List<Order>) refundPreInfo.get("cnclReqList");
+		String allCanYn = refundPreInfo.getString("allCanYn");
+
+		// 2. 환불금액계산
+		GagaMap result = coreOrderRefundService.cnclRtnRefundAmt(returnReqList);
+
+		// 3. 주문변경 기본정보 설정
+		result.set("ordNo"			, orderChange.getOrdNo());				// 주문번호
+		result.set("ordChgSq"		, orderChange.getOrdChgSq());			// 주문변경번호
+		result.set("chgReason"		, orderChange.getChgReason());			// 변경사유
+		result.set("chgMemo"		, orderChange.getChgMemo());			// 변경메모
+
+		result.set("accountNo"		, orderChange.getAccountNo());			// 환불계좌번호
+		result.set("accountNm"		, orderChange.getAccountNm());			// 환불계좌예금주명
+		result.set("bankCd"			, orderChange.getBankCd());				// 환불계좌은행코드
+
+		result.set("allCanYn"		, allCanYn);							// 무통장입금전 전체취소 여부 
+		result.set("isCustomer"		, orderChange.getIsCustomer());			// 변경사유 (고객, 회사)
+		result.set("wdGb"			, orderChange.getWdGb());				// 회수방법
+
+		// 4. 주문변경 회수지정보 추가
+		result.set("chgerNm"		, orderChange.getChgerNm());			// 변경자명
+		result.set("chgerEmail"		, orderChange.getChgerEmail());			// 변경자이메일주소
+		result.set("chgerZipcode"	, orderChange.getChgerZipcode());		// 회수지우편번호
+		result.set("chgerBaseAddr"	, orderChange.getChgerBaseAddr());		// 회수지기본주소
+		result.set("chgerDtlAddr"	, orderChange.getChgerDtlAddr());		// 회수지상세주소
+		result.set("chgerPhnno"		, orderChange.getChgerPhnno());			// 변경자핸드폰번호
+		result.set("chgerTelno"		, orderChange.getChgerTelno());			// 변경자전화번호
+		result.set("chgerRtnMemo"	, orderChange.getChgerRtnMemo());		// 반품메모
+
+		// 5. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL, TB_REFUND)
+		coreOrderChangeService.rtnReq(result, custNo);
+
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+		result.set("message", "반품 신청이 접수되었습니다.");
+
+		return result;
+	}
+
 	/**
 	 * 마이페이지 취소신청 화면
 	 *
@@ -660,7 +751,8 @@ public class TsfMypageController extends TsfBaseController {
 		mav.addObject("accumulatePointList", pointService.getAccumulatePointList(point));
 		// 사용내역 조회
 		mav.addObject("usePointList", pointService.getUsePointList(point));
-
+		// 최근 12개월
+		mav.addObject("date", pointService.getRecentlyDate());
 		mav.setViewName(super.getDeviceViewName("mypage/MypagePointForm2"));
 		return mav;
 	}
@@ -770,6 +862,9 @@ public class TsfMypageController extends TsfBaseController {
 		ModelAndView mav = new ModelAndView();
 		// 상품권 기본정보
 		mav.addObject("giftcardInfo", giftcardService.getGiftcardInfo(giftcard));
+		
+		// 최근 12개월 년,월
+		mav.addObject("date", giftcardService.getRecentlyDate());
 		mav.setViewName(super.getDeviceViewName("mypage/MypageGiftcardForm"));
 
 		return mav;
@@ -868,7 +963,7 @@ public class TsfMypageController extends TsfBaseController {
 	 * 마이페이지 리뷰화면
 	 *
 	 * @return
-	 * @author sowon	
+	 * @author sowon
 	 * @since 2021. 03. 24
 	 */
 	@GetMapping("/review/form")
@@ -1040,10 +1135,6 @@ public class TsfMypageController extends TsfBaseController {
 	@GetMapping("/wish/list/form")
 	public ModelAndView mypageWishListForm(WishList wishList) {
 		ModelAndView mav = new ModelAndView(super.getDeviceViewName("mypage/MypageWishListForm"));
-		// 위시리스트 달
-		mav.addObject("wishMonth", wishListService.getWishListMonth(wishList));
-		// 위시리스트 상품목록
-		mav.addObject("wishGoods", wishListService.getWishListGoodsList(wishList));
 		return mav;
 	}
 	

+ 47 - 24
src/main/java/com/style24/front/biz/web/TsfPlanningController.java

@@ -2,6 +2,7 @@ package com.style24.front.biz.web;
 
 import java.util.Collection;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.mobile.device.Device;
 import org.springframework.stereotype.Controller;
@@ -97,23 +98,23 @@ public class TsfPlanningController extends TsfBaseController {
 		return planningService.getPlanningMainList(plan);
 	}
 
-	/**
-	 * 기획전 접근확인
-	 * 
-	 * @return
-	 * @author sowon
-	 * @since 2021. 3. 22
-	 */
-	@PostMapping("/access")
-	@ResponseBody
-	public GagaMap PlanningAccessConfrim(@RequestBody Plan plan) throws Exception {
-		GagaMap result = new GagaMap();
-		// 접근 가능 고객 등급 확인
-		planningService.accessCustGrade(plan);
-		result.set("status", "200");
-
-		return result;
-	}
+//	/**
+//	 * 기획전 접근확인
+//	 * 
+//	 * @return
+//	 * @author sowon
+//	 * @since 2021. 3. 22
+//	 */
+//	@PostMapping("/access")
+//	@ResponseBody
+//	public GagaMap PlanningAccessConfrim(@RequestBody Plan plan) throws Exception {
+//		GagaMap result = new GagaMap();
+//		// 접근 가능 고객 등급 확인
+//		planningService.accessCustGrade(plan);
+//		result.set("status", "200");
+//
+//		return result;
+//	}
 
 	/**
 	 * 기획전 상세화면
@@ -124,9 +125,17 @@ public class TsfPlanningController extends TsfBaseController {
 	 */
 	@GetMapping("/detail/form")
 	@ResponseBody
-	public ModelAndView PlanningDetailForm(@RequestParam(value = "planSq") int planSq) throws Exception {
-
+	public ModelAndView PlanningDetailForm(@RequestParam(value = "planSq") int planSq) {
 		ModelAndView mav = new ModelAndView();
+
+		// 접근 불가능한 기획전 메시지 조회
+		String inaccessibleMsg = planningService.getInaccessiblePlanningMessage(planSq);
+		if (StringUtils.isNotBlank(inaccessibleMsg)) {
+			mav.addObject("inaccessibleMsg", inaccessibleMsg);
+			mav.setViewName(super.getDeviceViewName("error/Inaccess"));
+			return mav;
+		}
+
 		Plan plan = new Plan();
 		Review review = new Review();
 		Coupon coupon = new Coupon();
@@ -135,15 +144,13 @@ public class TsfPlanningController extends TsfBaseController {
 		plan.setFrontGb(TsfSession.getFrontGb());
 		plan.setCustGb(TsfSession.getCustGb());
 		plan.setCustNo(TsfSession.isLogin() ? TsfSession.getInfo().getCustNo() : 0);
-		
+
 		// 기본 set
 		plan.setExceptPlanSq(planSq);
 		plan.setPlanSq(planSq);
 		review.setPlanSq(planSq);
 		coupon.setPlanSq(planSq);
 
-		planningService.accessCustGrade(plan);
-		// 이거 access로 옮겨야 하나..?
 		//plan.setSiteCd(TscConstants.Site.STYLE24.value());
 		plan.setFrontGb(TsfSession.getFrontGb());
 
@@ -265,11 +272,10 @@ public class TsfPlanningController extends TsfBaseController {
 		plan.setSiteCd(TscConstants.Site.STYLE24.value());
 		plan.setFrontGb(TsfSession.getFrontGb());
 
-
 		mav.setViewName(super.getDeviceViewName("planning/PlanningEventMainForm"));
 		return mav;
 	}
-	
+
 	/**
 	 * 이벤트 메인 목록
 	 * @param plan - 이벤트 정보
@@ -287,5 +293,22 @@ public class TsfPlanningController extends TsfBaseController {
 
 		return planningService.getPlanEventList(plan);
 	}
+	
+	/**
+	 * 총알배송 메인 화면
+	 * 
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 30
+	 */
+	@GetMapping("/shot/delivery/guide/form")
+	public ModelAndView planningShotDeliveryForm(Plan plan) throws Exception {
+		ModelAndView mav = new ModelAndView();
+		plan.setSiteCd(TscConstants.Site.STYLE24.value());
+		plan.setFrontGb(TsfSession.getFrontGb());
+		mav.addObject("shotHtml", planningService.getShotDeliveryHtml(plan));
+		mav.setViewName(super.getDeviceViewName("planning/PlanningShotGuideForm"));
+		return mav;
+	}
 
 }

+ 2 - 46
src/main/java/com/style24/front/support/controller/TsfBaseController.java

@@ -3,7 +3,6 @@ package com.style24.front.support.controller;
 import java.util.Collection;
 import java.util.Set;
 
-import javax.servlet.http.HttpServletRequest;
 import javax.validation.ConstraintViolation;
 import javax.validation.Validation;
 import javax.validation.Validator;
@@ -12,25 +11,17 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.propertyeditors.StringTrimmerEditor;
 import org.springframework.core.env.Environment;
-import org.springframework.mobile.device.Device;
-import org.springframework.mobile.device.DeviceUtils;
-import org.springframework.mobile.device.site.SitePreference;
-import org.springframework.mobile.device.site.SitePreferenceUtils;
-import org.springframework.mobile.device.util.ResolverUtils;
-import org.springframework.util.Assert;
 import org.springframework.web.bind.WebDataBinder;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.InitBinder;
 import org.springframework.web.bind.annotation.ModelAttribute;
 import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.context.request.RequestAttributes;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
 
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.front.support.env.TsfConstants;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.front.support.startup.TsfEnvsetInfo;
+import com.style24.front.support.util.ViewUtils;
 import com.style24.persistence.domain.Cate1;
 import com.style24.persistence.domain.Login;
 import com.style24.persistence.domain.Meta;
@@ -40,7 +31,6 @@ import lombok.extern.slf4j.Slf4j;
 import com.gagaframework.web.rest.exception.GagaRestException;
 import com.gagaframework.web.rest.server.GagaResponse;
 import com.gagaframework.web.rest.server.GagaResponseStatus;
-import com.gagaframework.web.util.GagaCookieUtil;
 
 /**
  * Controller Advice
@@ -277,41 +267,7 @@ public class TsfBaseController {
 	}
 
 	public String getDeviceViewName(String viewName) {
-		RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
-		Assert.isInstanceOf(ServletRequestAttributes.class, attrs);
-		HttpServletRequest request = ((ServletRequestAttributes)attrs).getRequest();
-
-		Device device = DeviceUtils.getCurrentDevice(request);
-		SitePreference sitePreference = SitePreferenceUtils.getCurrentSitePreference(request);
-		String resolvedViewName = viewName;
-
-		if (ResolverUtils.isNormal(device, sitePreference)) {
-			resolvedViewName = "web/" + viewName + "Web";
-		} else if (ResolverUtils.isMobile(device, sitePreference)) {
-			if (GagaCookieUtil.getCookie(request, TsfConstants.CK_PREFIX + "_site_preference").equals("normal")) {
-				resolvedViewName = "web/" + viewName + "Web";
-			} else {
-				resolvedViewName = "mob/" + viewName + "Mob";
-			}
-		} else if (ResolverUtils.isTablet(device, sitePreference)) {
-			if (GagaCookieUtil.getCookie(request, TsfConstants.CK_PREFIX + "_site_preference").equals("normal")) {
-				resolvedViewName = "web/" + viewName + "Web";
-			} else {
-				resolvedViewName = "mob/" + viewName + "Mob";
-			}
-		}
-
-		log.info("resolvedViewName: {}", resolvedViewName);
-
-		return stripTrailingSlash(resolvedViewName);
-	}
-
-	private String stripTrailingSlash(String viewName) {
-		if (viewName.endsWith("//")) {
-			return viewName.substring(0, viewName.length() - 1);
-		}
-
-		return viewName;
+		return ViewUtils.getDeviceViewName(viewName);
 	}
 
 }

+ 7 - 4
src/main/java/com/style24/front/support/controller/TsfCustomErrorController.java

@@ -13,10 +13,13 @@ import org.springframework.boot.web.servlet.error.ErrorAttributes;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
+import org.springframework.mobile.device.Device;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.servlet.ModelAndView;
 
+import com.style24.front.support.util.ViewUtils;
+
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -51,7 +54,7 @@ public class TsfCustomErrorController extends AbstractErrorController {
 	 * @throws IOException
 	 */
 	@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
-	public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) throws IOException {
+	public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response, Device device) throws IOException {
 		HttpStatus status = this.getStatus(request);
 		log.error("status.value(): {}", status.value());
 
@@ -61,7 +64,7 @@ public class TsfCustomErrorController extends AbstractErrorController {
 		ModelAndView mav = this.resolveErrorView(request, response, status, model);
 
 		if (status.value() == HttpStatus.NOT_FOUND.value()) {
-			return (mav != null) ? mav : new ModelAndView("mob/error/404Mob", model);
+			return (mav != null) ? mav : new ModelAndView(ViewUtils.getDeviceViewName("error/404"), model);
 		}
 
 		Object oExceptionType = request.getAttribute(RequestDispatcher.ERROR_EXCEPTION_TYPE);
@@ -71,11 +74,11 @@ public class TsfCustomErrorController extends AbstractErrorController {
 
 			// Thymeleaf의 HTML 파일을 못 찾는 에러는 "org.thymeleaf.exceptions.TemplateInputException"임.
 			if (exceptionType.endsWith("org.thymeleaf.exceptions.TemplateInputException")) {
-				return (mav != null) ? mav : new ModelAndView("mob/error/404Mob", model);
+				return (mav != null) ? mav : new ModelAndView(ViewUtils.getDeviceViewName("error/404"), model);
 			}
 		}
 
-		return (mav != null) ? mav : new ModelAndView("mob/error/500Mob", model);
+		return (mav != null) ? mav : new ModelAndView(ViewUtils.getDeviceViewName("error/500"), model);
 	}
 
 	/**

+ 68 - 0
src/main/java/com/style24/front/support/util/ViewUtils.java

@@ -0,0 +1,68 @@
+package com.style24.front.support.util;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.mobile.device.Device;
+import org.springframework.mobile.device.DeviceUtils;
+import org.springframework.mobile.device.site.SitePreference;
+import org.springframework.mobile.device.site.SitePreferenceUtils;
+import org.springframework.mobile.device.util.ResolverUtils;
+import org.springframework.util.Assert;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import com.style24.front.support.env.TsfConstants;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.util.GagaCookieUtil;
+
+/**
+ * 디바이스 뷰 관련 Util Class
+ * 
+ * @author gagamel
+ * @since 2021. 3. 30
+ */
+@Slf4j
+public class ViewUtils {
+
+	public static String getDeviceViewName(String viewName) {
+		RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
+		Assert.isInstanceOf(ServletRequestAttributes.class, attrs);
+		HttpServletRequest request = ((ServletRequestAttributes)attrs).getRequest();
+
+		Device device = DeviceUtils.getCurrentDevice(request);
+		SitePreference sitePreference = SitePreferenceUtils.getCurrentSitePreference(request);
+		String resolvedViewName = viewName;
+
+		if (ResolverUtils.isNormal(device, sitePreference)) {
+			resolvedViewName = "web/" + viewName + "Web";
+		} else if (ResolverUtils.isMobile(device, sitePreference)) {
+			if (GagaCookieUtil.getCookie(request, TsfConstants.CK_PREFIX + "_site_preference").equals("normal")) {
+				resolvedViewName = "web/" + viewName + "Web";
+			} else {
+				resolvedViewName = "mob/" + viewName + "Mob";
+			}
+		} else if (ResolverUtils.isTablet(device, sitePreference)) {
+			if (GagaCookieUtil.getCookie(request, TsfConstants.CK_PREFIX + "_site_preference").equals("normal")) {
+				resolvedViewName = "web/" + viewName + "Web";
+			} else {
+				resolvedViewName = "mob/" + viewName + "Mob";
+			}
+		}
+
+		log.info("resolvedViewName: {}", resolvedViewName);
+
+		return stripTrailingSlash(resolvedViewName);
+	}
+
+	private static String stripTrailingSlash(String viewName) {
+		if (viewName.endsWith("//")) {
+			return viewName.substring(0, viewName.length() - 1);
+		}
+
+		return viewName;
+	}
+
+}

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

@@ -30,6 +30,8 @@ public class Login extends TscBaseDomain {
 	private String passwd;			// 비밀번호
 	private String custGb;			// 고객구분
 	private String custGbNm;		// 고객구분명
+	private String custGrade;		// 고객등급
+	private String custGradeNm;		// 고객등급명
 	private String custStat;		// 고객상태
 	private String cellPhnno;		// 휴대전화번호
 	private String email;			// 이메일
@@ -42,7 +44,6 @@ public class Login extends TscBaseDomain {
 	private String ipAddr;			// IP주소
 	private String loginLdt;		// 최종로그인일시
 	private String loginFailYn;		// 로그인실패여부
-	private String custGrade;		// 고객등급
 	private String tempPasswdYn;	// 임시비밀번호여부
 	private int pwdChgDay;			// 비밀번호변경일자
 	private String ci;				// CI(본인인증여부)

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

@@ -257,7 +257,11 @@ public class Plan extends TscBaseDomain {
 	// 사용가능고객구분
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] usableCustGbArr;
-
+	
+	// 프론트구분
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] frontGbArr;
+	
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	List<Plan> multiPlanGoodsContent1;
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)

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

@@ -44,5 +44,12 @@
 		AND    USE_YN = 'Y'
 	</insert>
 	
+	<!-- 웹제휴채널명 조회 -->
+	<select id="getAfLinkName" parameterType="String" resultType="String">
+		/* TsfCommon.getAfLinkName */
+		SELECT AF_LINK_NM
+		FROM   TB_AF_LINK
+		WHERE  AF_LINK_CD = #{afLinkCd}
+	</select>
 
 </mapper>

+ 29 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfGiftcard.xml

@@ -134,6 +134,35 @@
 	        )
 	</insert>
 	
+	<select id="getRecentlyDate" resultType="GiftCard">
+		SELECT A.*
+		FROM
+		    (		
+		      SELECT DATE_FORMAT( NOW(), '%Y') AS YEAR ,DATE_FORMAT( NOW(), '%m') AS MONTH
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 1 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 1 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 2 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 2 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 3 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 3 MONTH), '%m')      
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 4 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 4 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 5 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 5 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 6 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 6 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 7 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 7 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 8 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 8 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 9 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 9 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 10 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 10 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 11 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 11 MONTH), '%m')
+		    )A	
+	</select>
 	
 	<!-- 페이징을 위한 select절 상단 -->
 	<sql id="selectForPagingHeader">

+ 19 - 23
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -942,24 +942,19 @@
 		)
 		, TAB_GOODS_IMG AS (
 		    /* 상품의 이미지 */
-		    SELECT G.BRAND_GROUP_NM
-		         , G.GOODS_CD
-		         , G.GOODS_NM
-		         , G.GOODS_GB
-		         , G.FOREIGN_BUY_YN
-		         , G.PARALLEL_IMPORT_YN
-		         , G.ORDER_MADE_YN
-		         , G.GOODS_TNM
-		         , G.MAIN_COLOR_CD
-		         , G.LIST_PRICE
-		         , G.CURR_PRICE
-		         , G.REG_DT
-		         , CASE WHEN GI.DEFAULT_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END   AS SYS_IMG_NM
-		         , CASE WHEN GI.MOUSEOVER_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END AS SYS_IMG_NM2
-		    FROM   TAB_GOODS G
-		         , TB_GOODS_IMG GI
-		    WHERE  G.GOODS_CD = GI.GOODS_CD
-		    AND    G.MAIN_COLOR_CD = GI.COLOR_CD
+		    SELECT GOODS_CD
+		          ,MAX(SYS_IMG_NM) AS SYS_IMG_NM
+		          ,MAX(SYS_IMG_NM2) AS SYS_IMG_NM2
+		    FROM (
+		          SELECT G.GOODS_CD
+		               , CASE WHEN GI.DEFAULT_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END   AS SYS_IMG_NM
+		               , CASE WHEN GI.MOUSEOVER_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END AS SYS_IMG_NM2
+		          FROM   TAB_GOODS G
+		               , TB_GOODS_IMG GI
+		          WHERE  G.GOODS_CD = GI.GOODS_CD
+		          AND    G.MAIN_COLOR_CD = GI.COLOR_CD
+		          ) Z
+		     GROUP BY GOODS_CD
 		)
 		, TAB_GOODS_VIDEO AS (
 		    /* 상품의 동영상 목록 */
@@ -992,21 +987,22 @@
 		     , G.MAIN_COLOR_CD
 		     , G.LIST_PRICE
 		     , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD,G.CURR_PRICE,#{custGb})                           AS CURR_PRICE    /*현재판매가*/
-		     , G.SYS_IMG_NM
-		     , G.SYS_IMG_NM2
+		     , GI.SYS_IMG_NM
+		     , GI.SYS_IMG_NM2
 		     , GV.VIDEO_GB_M
 		     , GV.VIDEO_VAL_M
 		     , GV.VIDEO_GB_S
 		     , GV.VIDEO_VAL_S
 		     <choose>
 		         <when test="custNo != null and custNo > 0"> <!-- 로그인 했으면 -->
-		     , IF(W.GOODS_CD,'','','likeit')                                                                AS LIKE_IT       /*위시리스트담긴상품*/
+		     , IF(W.GOODS_CD IS NULL,'','likeit')                                                           AS LIKE_IT       /*위시리스트담긴상품*/
 		         </when>
 		         <otherwise>
 		     , ''                                                                                           AS LIKE_IT       /*위시리스트담긴상품*/
 		         </otherwise>
 		     </choose>
-		FROM   TAB_GOODS_IMG G
+		FROM TAB_GOODS G  
+		LEFT OUTER JOIN TAB_GOODS_IMG GI ON G.GOODS_CD = GI.GOODS_CD
 		LEFT OUTER JOIN TAB_GOODS_VIDEO GV ON G.GOODS_CD = GV.GOODS_CD
 		<if test="custNo != null and custNo > 0"> <!-- 로그인 했으면 -->
 		LEFT OUTER JOIN TB_WISHLIST W ON G.GOODS_CD = W.GOODS_CD
@@ -1143,7 +1139,7 @@
 		     , GV.VIDEO_VAL_S
 		     <choose>
 		         <when test="custNo != null and custNo > 0"> <!-- 로그인 했으면 -->
-		     , IF(W.GOODS_CD,'','','likeit')                                                                AS LIKE_IT       /*위시리스트담긴상품*/
+		     , IF(W.GOODS_CD IS NULL,'','likeit')                                                           AS LIKE_IT       /*위시리스트담긴상품*/
 		         </when>
 		         <otherwise>
 		     , ''                                                                                           AS LIKE_IT       /*위시리스트담긴상품*/

+ 17 - 16
src/main/java/com/style24/persistence/mybatis/shop/TsfLogin.xml

@@ -5,27 +5,28 @@
 	<!-- 로그인체크 정보 조회 -->
 	<select id="getLoginCheckInfo" parameterType="Login" resultType="Login">
 		/* TsfLogin.getLoginCheckInfo */
-		SELECT CUST_NO                                                 /*고객번호*/
-		     , CUST_ID                                                 /*고객ID*/
-		     , CUST_NM                                                 /*고객명*/
-		     , PASSWD                                                  /*비밀번호*/
-		     , CUST_GB                                                 /*고객구분*/
-		     , CUST_GRADE                                              /*고객등급*/
-		     , FN_GET_CODE_NM('G100',CUST_GB) AS CUST_GB_NM            /*고객구분명*/
-		     , CUST_STAT                                               /*회원상태*/
-		     , CELL_PHNNO                                              /*휴대전화번호*/
-		     , EMAIL                                                   /*이메일*/
-		     , #{snsType}                     AS SNS_TYPE              /*SNS유형*/
-		     , #{snsId}                       AS SNS_ID                /*SNS가입ID*/
+		SELECT CUST_NO                                                   /*고객번호*/
+		     , CUST_ID                                                   /*고객ID*/
+		     , CUST_NM                                                   /*고객명*/
+		     , PASSWD                                                    /*비밀번호*/
+		     , CUST_GB                                                   /*고객구분*/
+		     , FN_GET_CODE_NM('G100',CUST_GB)          AS CUST_GB_NM     /*고객구분명*/
+		     , CUST_GRADE                                                /*고객등급*/
+		     , FN_GET_CODE_NM('G110',CUST_GRADE)       AS CUST_GRADE_NM  /*고객등급명*/
+		     , CUST_STAT                                                 /*회원상태*/
+		     , CELL_PHNNO                                                /*휴대전화번호*/
+		     , EMAIL                                                     /*이메일*/
+		     , #{snsType}                              AS SNS_TYPE       /*SNS유형*/
+		     , #{snsId}                                AS SNS_ID         /*SNS가입ID*/
 		     , IFNULL((SELECT LOGIN_FAIL_CNT
 		               FROM   TB_LOGIN_FAIL
 		               WHERE  CUST_ID = #{custId}
 		               AND    IP_ADDR = #{ipAddr}
 		               AND    SITE_CD = #{siteCd}
-		              ),0)                    AS LOGIN_FAIL_CNT         /*로그인실패건수*/
-		     , TEMP_PASSWD_YN                                           /*임시비밀번호여부*/
-		     , IFNULL(DATEDIFF(NOW(), PASSWD_CHG_DT), 0) AS PWD_CHG_DAY /*비밀번호변경일자*/
-		     , CI                                                       /*CI본인인증여부*/
+		              ),0)                             AS LOGIN_FAIL_CNT /*로그인실패건수*/
+		     , TEMP_PASSWD_YN                                            /*임시비밀번호여부*/
+		     , IFNULL(DATEDIFF(NOW(),PASSWD_CHG_DT),0) AS PWD_CHG_DAY    /*비밀번호변경일자*/
+		     , CI                                                        /*CI본인인증여부*/
 		FROM   TB_CUSTOMER A
 		WHERE  1 = 1
 		<choose>

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

@@ -62,6 +62,7 @@
 		     , Z.PURCHASE_CONFIRM_DAY
 		     , Z.DELV_RES_DT
 		     , Z.ORD_REQ_CHG_QTY
+		     , Z.ORD_CAN_CHG_QTY
 		     , Z.BANK_CD
 		     , Z.ACCOUNT_NO
 		     , Z.ACCOUNT_NM
@@ -116,6 +117,7 @@
 					 , TIMESTAMPDIFF(DAY, NOW(), OD.DELV_EDDT + INTERVAL 2 WEEK)		AS PURCHASE_CONFIRM_DAY
 					 , DATE_FORMAT(GRS.DELV_RES_DT, '%Y.%m.%d') AS DELV_RES_DT
 					 , IFNULL(OCD.ORD_REQ_CHG_QTY, 0) AS ORD_REQ_CHG_QTY
+					 , OD.ORD_QTY - OD.CNCL_RTN_QTY - IFNULL(OCD.ORD_REQ_CHG_QTY, 0) AS ORD_CAN_CHG_QTY
 					 , CA.BANK_CD
 					 , CA.ACCOUNT_NO
 					 , CA.ACCOUNT_NM
@@ -143,8 +145,16 @@
 									 FROM TB_ORDER_CHANGE_DETAIL OCD
 									INNER JOIN TB_ORDER_DETAIL OD
 									   ON OCD.ORD_DTL_NO = OD.ORD_DTL_NO
-									WHERE OD.ORD_NO = #{ordNo}
-									  AND OCD.DEL_YN = 'N'
+									WHERE OCD.DEL_YN = 'N'
+		<if test="ordNo != null and ordNo != ''">
+									  AND OD.ORD_NO = #{ordNo}
+		</if>
+		<if test="ordNoList != null">
+									  AND OD.ORD_NO IN
+			<foreach collection="ordNoList" item="item" index="index"  open="(" close=")" separator=",">
+				#{item}
+			</foreach>
+		</if>
 									  AND OCD.CHG_STAT IN ('G685_20', 'G685_30', 'G685_33', 'G685_40')
 									GROUP BY OCD.ORD_DTL_NO
 								  ) OCD
@@ -187,7 +197,7 @@
 				, Z.GOODS_CD, Z.GOODS_NM, Z.LIST_PRICE, Z.SYS_IMG_NM, Z.ORD_DTL_STAT, Z.ORD_QTY, Z.CNCL_RTN_QTY, Z.ORD_AMT, Z.REAL_ORD_AMT
 				, Z.SAVE_PNT_AMT, Z.CNCL_RTN_AMT, Z.PNT_DC_AMT, Z.GFCD_USE_AMT, Z.SHIP_COMP_CD, Z.GIFT_PACK_YN, Z.SHIP_COMP_NM, Z.INVOICE_NO
 				, Z.SUPPLY_COMP_CD, Z.DELV_FEE_CD, Z.SHOT_DELV_YN, Z.CHANGEABLE_YN, Z.SELF_GOODS_YN, Z.BRAND_NM, Z.ORD_DTL_STAT_NM, Z.REVIEW_SQ
-				, Z.REVIEWABLE_YN, Z.PURCHASE_CONFIRM_DAY, Z.DELV_RES_DT, Z.ORD_REQ_CHG_QTY, Z.BANK_CD, Z.ACCOUNT_NO, Z.ACCOUNT_NM
+				, Z.REVIEWABLE_YN, Z.PURCHASE_CONFIRM_DAY, Z.DELV_RES_DT, Z.ORD_REQ_CHG_QTY, Z.ORD_CAN_CHG_QTY, Z.BANK_CD, Z.ACCOUNT_NO, Z.ACCOUNT_NM
 		ORDER BY Z.ORD_NO DESC, Z.ORD_DTL_STAT, Z.SELF_GOODS_YN DESC, Z.SHOT_DELV_YN DESC, Z.SUPPLY_COMP_CD, Z.DELV_FEE_CD
 	</select>
 

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

@@ -410,8 +410,8 @@
 			 , CPH.ORD_DTL_NO
 			 , SUM(CPH.PNT_AMT) AS PNT_AMT
 		  FROM TB_CUST_POINT_HST CPH
-		  INNER JOIN TB_CUST_POINT CP
-		  ON CP.CUST_PNT_SQ = CPH.CUST_PNT_SQ
+		 INNER JOIN TB_CUST_POINT CP
+		    ON CP.CUST_PNT_SQ = CPH.CUST_PNT_SQ
 		 WHERE CPH.CUST_NO = #{custNo}
 		   AND CPH.ORD_NO = #{ordNo}
 		<if test="ordDtlNoArr != null">

+ 125 - 34
src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml

@@ -27,12 +27,7 @@
 		AND    P.PLAN_GB = 'P' /*기획전*/
 		AND    P.SITE_CD = #{siteCd}
 		<if test="frontGb != null and frontGb != ''">
-		    <if test='frontGb == "P"'> <!-- PC웹 -->
-		AND    P.FRONT_GB IN ('A','P')
-		    </if>
-		    <if test='frontGb == "A" or frontGb == "M"'> <!-- 모바일 -->
-		AND    P.FRONT_GB IN ('A','M')
-		    </if>
+		AND    P.FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
 		</if>
 		AND    NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT
 		AND    P.DEL_YN = 'N' /*삭제안된 기획전*/
@@ -90,12 +85,7 @@
 		        WHERE  P.PLAN_GB = 'P' /*기획전*/
 		        AND    P.SITE_CD = #{siteCd}
 		        <if test="frontGb != null and frontGb != ''">
-		            <if test='frontGb == "P"'> <!-- PC웹 -->
-		        AND    P.FRONT_GB IN ('A','P')
-		            </if>
-		            <if test='frontGb == "A" or frontGb == "M"'> <!-- 모바일 -->
-		        AND    P.FRONT_GB IN ('A','M')
-		            </if>
+		        AND    P.FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
 		        </if>
 		        AND    NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT
 		        AND    P.DEL_YN = 'N' /*삭제안된 기획전*/
@@ -163,12 +153,7 @@
 		    AND    P.PLAN_GB = 'P' /*기획전*/
 		    AND    P.SITE_CD = #{siteCd}
 		    <if test="frontGb != null and frontGb != ''">
-		        <if test='frontGb == "P"'> <!-- PC웹 -->
-		    AND    P.FRONT_GB IN ('A','P')
-		        </if>
-		        <if test='frontGb == "A" or frontGb == "M"'> <!-- 모바일 -->
-		    AND    P.FRONT_GB IN ('A','M')
-		        </if>
+		    AND    P.FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
 		    </if>
 		    AND    NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT
 		    AND    P.DEL_YN = 'N' /*삭제안된 기획전*/
@@ -223,7 +208,7 @@
 		     , GI.SYS_IMG_NM2
 		     <choose>
 		         <when test="custNo != null and custNo > 0"> <!-- 로그인 했으면 -->
-		     , IF(W.GOODS_CD,'','','likeit')                                                                     AS LIKE_IT       /*위시리스트담긴상품*/
+		     , IF(W.GOODS_CD IS NULL,'','likeit')                                                                AS LIKE_IT       /*위시리스트담긴상품*/
 		         </when>
 		         <otherwise>
 		     , ''                                                                                                AS LIKE_IT       /*위시리스트담긴상품*/
@@ -241,6 +226,81 @@
 		</if>
 	</select>
 	
+	<!-- 디바이스접근가능여부 조회 -->
+	<select id="getDeviceAccessibleYn" parameterType="Plan" resultType="String">
+		/* TsfPlanning.getDeviceAccessibleYn */
+		SELECT CASE WHEN COUNT(*) > 0 THEN
+		                'Y' /*접근가능*/
+		            ELSE
+		                'N' /*접근불가*/
+		       END AS ACCESSIBLE_YN
+		FROM   TB_PLAN
+		WHERE  PLAN_SQ = #{planSq}
+		AND    FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
+	</select>
+	
+	<!-- 신규회원접근가능여부 조회 -->
+	<select id="getNewCustomerAccessibleYn" parameterType="Plan" resultType="String">
+		/* TsfPlanning.getNewCustomerAccessibleYn */
+		SELECT CASE WHEN NEW_CUST_YN = 'N' THEN
+		                'Y' /*접근가능*/
+		            ELSE
+		                CASE WHEN NOW() BETWEEN CUST_JOIN_STDT AND CUST_JOIN_EDDT THEN
+		                         'Y' /*접근가능*/
+		                     ELSE
+		                         'N' /*접근불가*/
+		                END
+		       END AS ACCESSIBLE_YN
+		FROM   TB_PLAN
+		WHERE  PLAN_SQ = #{planSq}
+	</select>
+	
+	<!-- 고객구분접근가능여부 조회 -->
+	<select id="getCustomerGubunAccessibleYn" parameterType="Plan" resultType="String">
+		/* TsfPlanning.getCustomerGubunAccessibleYn */
+		SELECT CASE WHEN COUNT(*) > 0 THEN
+		                'Y' /*접근가능*/
+		            ELSE
+		                'N' /*접근불가*/
+		       END AS ACCESSIBLE_YN
+		FROM   TB_PLAN_CUST_DIVISION
+		WHERE  PLAN_SQ = #{planSq}
+		AND    CUST_GB = #{custGb}
+	</select>
+	
+	<!-- 고객등급접근가능여부 조회 -->
+	<select id="getCustomerGradeAccessibleYn" parameterType="Plan" resultType="String">
+		/* TsfPlanning.getCustomerGradeAccessibleYn */
+		SELECT CASE WHEN COUNT(*) > 0 THEN
+		                'Y' /*접근가능*/
+		            ELSE
+		                'N' /*접근불가*/
+		       END AS ACCESSIBLE_YN
+		FROM   TB_PLAN_CUST_GRADE
+		WHERE  PLAN_SQ = #{planSq}
+		AND    CUST_GRADE = #{custGrade}
+	</select>
+	
+	<!-- 웹제휴채널접근가능여부 조회 -->
+	<select id="getAfLinkAccessibleYn" parameterType="Plan" resultType="String">
+		/* TsfPlanning.getAfLinkAccessibleYn */
+		SELECT CASE WHEN CNT1 = 0 THEN
+		                'Y' /*접근가능*/
+		            ELSE
+		                CASE WHEN CNT2 > 0 THEN
+		                         'Y' /*접근가능*/
+		                     ELSE
+		                         'N' /*접근불가*/
+		                END
+		       END AS ACCESSIBLE_YN
+		FROM   (
+		        SELECT COUNT(*)                                             AS CNT1 /*제휴채널전체건수*/
+		             , CASE WHEN AF_LINK_CD = #{afLinkCd} THEN 1 ELSE 0 END AS CNT2 /*특정제휴채널건수*/
+		        FROM   TB_PLAN_AF_CHANNEL
+		        WHERE  PLAN_SQ = #{planSq}
+		       ) Z
+	</select>
+	
 	<!-- 기획전 상세정보 -->
 	<select id="getPlanDetailInfo" parameterType="Plan" resultType="Plan">
 		/* TsfPlanning.getPlanDetailInfo*/
@@ -285,7 +345,7 @@
 		AND    NOW() BETWEEN A.DISP_STDT AND A.DISP_EDDT
 		</if>
 		<if test="frontGb != null and frontGb != ''">
-		AND    (A.FRONT_GB = 'A' OR A.FRONT_GB = #{frontGb})
+		AND    A.FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
 		</if>
 	</select>
 	
@@ -330,23 +390,11 @@
 		        WHERE  P.PLAN_GB = 'E' /*이벤트*/
 		        AND    P.SITE_CD = #{siteCd}
 		        <if test="frontGb != null and frontGb != ''">
-		            <if test='frontGb == "P"'> <!-- PC웹 -->
-		        AND    P.FRONT_GB IN ('A','P')
-		            </if>
-		            <if test='frontGb == "A" or frontGb == "M"'> <!-- 모바일 -->
-		        AND    P.FRONT_GB IN ('A','M')
-		            </if>
+		        AND    P.FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
 		        </if>
 		        AND    NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT
 		        AND    P.DEL_YN = 'N' /*삭제안된 기획전*/
 		        AND    P.OPEN_YN = 'Y' /*오픈된 기획전*/
-		        <if test="brandGroupNo != null and brandGroupNo != ''"> <!-- 브랜드메인에서 사용 -->
-		        AND    P.PLAN_SQ IN (SELECT PLAN_SQ
-		                             FROM   TB_PLAN_BRAND
-		                             WHERE  BRAND_GROUP_NO = #{brandGroupNo}
-		                             AND    DISP_YN = 'Y' /*전시하는브랜드기획전*/
-		                            )
-		        </if>
 		       ) Z
 		ORDER  BY NEW_YN DESC, END_DAYS
 	</select>
@@ -668,5 +716,48 @@
 			 AND PC.DISP_YN = 'Y'
 		 )Z
 	</select>
-
+	
+	<!-- 기획전 코너 목록 -->
+	<select id="getPlanCornerList" parameterType="Plan" resultType="Plan">
+		/* TsfPlanning.getPlanCornerList */
+		SELECT P.PLAN_SQ
+		     , PD.PLAN_DTL_SQ
+		     , PD.CORNER_NM
+		     , PD.CORNER_DISP_TYPE
+		FROM TB_PLAN P INNER JOIN TB_PLAN_DETAIL PD ON P.PLAN_SQ = PD.PLAN_SQ
+		 WHERE 1=1
+		  AND P.PLAN_SQ = #{planSq}
+		  AND PD.DISP_YN = 'Y'
+		  AND NOW() BETWEEN PD.DISP_STDT AND PD.DISP_EDDT 
+		ORDER BY PD.DISP_ORD 
+	</select>
+	
+	<!-- 총알배송 html 소스  -->
+	<select id="getShotDeliveryHtml" parameterType="Plan" resultType="Plan">
+		/* TsfPlanning.getShotDeliveryHtml */
+		SELECT P.PLAN_SQ 
+		      ,P.PLAN_NM 
+		      ,PC.PLAN_CONT_SQ 
+		      ,PF.DISP_YN
+		      ,PF.FSRC_PC 
+		      ,PF.FSRC_MOB 
+		FROM TB_PLAN P INNER JOIN TB_PLAN_CONTENTS PC ON P.PLAN_SQ = PC.PLAN_SQ 
+		                                              AND P.PLAN_SQ = PC.PLAN_SQ
+		               INNER JOIN TB_PLAN_FSRC PF ON P.PLAN_SQ = PF.PLAN_SQ 
+		                                              AND P.PLAN_SQ = PF.PLAN_SQ
+		WHERE 1=1
+		  AND P.PLAN_SQ = 13
+		  AND P.DEL_YN = 'N'
+		        <if test="frontGb != null and frontGb != ''">
+		            <if test='frontGb == "P"'> <!-- PC웹 -->
+		        AND    P.FRONT_GB IN ('A','P')
+		            </if>
+		            <if test='frontGb == "A" or frontGb == "M"'> <!-- 모바일 -->
+		        AND    P.FRONT_GB IN ('A','M')
+		            </if>
+		        </if>
+		  AND P.OPEN_YN ='Y'
+		  AND PF.DISP_YN ='Y'
+		  AND P.SITE_CD = #{siteCd}
+	</select>
 </mapper>

+ 30 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfPoint.xml

@@ -256,4 +256,34 @@
 		FROM   TB_CUSTOMER C
 		WHERE  C.CUST_NO = #{custNo}
 	</select>
+	
+	<select id="getRecentlyDate" resultType="Point">
+		SELECT A.*
+		FROM
+		    (		
+		      SELECT DATE_FORMAT( NOW(), '%Y') AS YEAR ,DATE_FORMAT( NOW(), '%m') AS MONTH
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 1 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 1 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 2 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 2 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 3 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 3 MONTH), '%m')      
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 4 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 4 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 5 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 5 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 6 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 6 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 7 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 7 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 8 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 8 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 9 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 9 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 10 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 10 MONTH), '%m')
+		      UNION
+		      SELECT DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 11 MONTH), '%Y'),DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 11 MONTH), '%m')
+		    )A	
+	</select>
 </mapper>

+ 1 - 1
src/main/resources/config/application-tsit.yml

@@ -36,7 +36,7 @@ upload:
         target.path: /TSIT/servers/files/data/goods
         max.size: 10
         allow.extension: jpg|gif|jpeg|png
-        view: //tdimage.style24.com/Upload/ProductImage
+        view: //image.istyle24.com/Upload/ProductImage
     image:
         target.path: /TSIT/servers/files/data
         max.size: 10

+ 13 - 2
src/main/webapp/WEB-INF/views/mob/error/404Mob.html

@@ -53,14 +53,25 @@
 				<p class="none_m">방문하시려는 페이지의 주소가 잘못 입력되었거나,<br>페이지의 주소가 변경 혹은 삭제되어 요청하신 페이지를 찾을 수 없습니다. </p>
 				<p>입력하신 주소가 정확한지<br/> 다시 한 번 확인해 주시기 바랍니다</p>
 				<p class="none_pc">
-					서비스 이용 중 문의사항이나 불편하셨던 점은 <br/><a class="none_pc"  href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_FAQ);">고객센터</a>를 이용해주세요. 감사합니다.
+					서비스 이용 중 문의사항이나 불편하셨던 점은 <br/><a class="none_pc"  href="javascript:void(0);" onclick="fnGoToFaq();">고객센터</a>를 이용해주세요. 감사합니다.
 				</p>
 			</div>
 			<div class="btn_group">
-				<button class="btn btn_dark" onclick="cfnGoToPage(_PAGE_MAIN);"><span>홈으로 이동</span></button>
+				<button class="btn btn_dark" onclick="fnGoToHome();"><span>홈으로 이동</span></button>
 			</div>
 		</div>
 	</div>
 	<!-- // container -->
+
+<script type="text/javascript">
+	let fnGoToHome = function() {
+		document.location.href = '/';
+	}
+	
+	let fnGoToFaq = function() {
+		document.location.href = '/callcenter/faq/form';
+	}
+</script>
+
 </body>
 </html>

+ 1 - 0
src/main/webapp/WEB-INF/views/mob/error/500Mob.html

@@ -59,5 +59,6 @@
 		</div>
 	</div>
 	<!-- // container -->
+
 </body>
 </html>

Разница между файлами не показана из-за своего большого размера
+ 39 - 0
src/main/webapp/WEB-INF/views/mob/error/InaccessMob.html


+ 53 - 1
src/main/webapp/WEB-INF/views/web/common/layout/MypageLayoutWeb.html

@@ -36,8 +36,60 @@
 <!-- Footer -->
 <footer id="footer" th:replace="~{web/common/fragments/FooterWeb :: footer}"></footer>
 
+<!---------------------------------------- 팝업영역 -------------------------------->
+<!-- 배송지변경 팝업 -->
+<div class="modal fade adrsChange_pop" id="adrsChangePop" tabindex="-1" role="dialog" aria-labelledby="adrsChangeLabel" aria-hidden="true">
+	<div class="modal-dialog" role="document">
+		<div class="modal-content">
+			<!-- 배송지변경 팝업 내용 -->
+		</div>
+	</div>
+	<a href="#close-modal" rel="modal:close" id="adrsChangePop_close" class="close-modal">Close</a>
+</div>
+<!-- //배송지변경 팝업 -->
+<!-- 배송지추가 팝업 -->
+<div class="modal fade adrsAdd_pop" id="adrsAddPop" tabindex="-1" role="dialog" aria-labelledby="adrsAddLabel" aria-hidden="true">
+	<div class="modal-dialog" role="document">
+		<div class="modal-content">
+			<!-- 배송지추가 팝업 내용 -->
+		</div>
+	</div>
+	<a href="#close-modal" rel="modal:close" id="adrsAddPop_close" class="close-modal">Close</a>
+</div>
+<!-- //배송지추가 팝업 -->
+<!-- 배송지수정 팝업 -->
+<div class="modal fade adrsModify_pop" id="adrsModifyPop" tabindex="-1" role="dialog" aria-labelledby="adrsModifyLabel" aria-hidden="true">
+	<div class="modal-dialog" role="document">
+		<div class="modal-content">
+			<!-- 배송지수정 팝업 내용 -->
+		</div>
+	</div>
+	<a href="#close-modal" rel="modal:close" id="adrsModifyPop_close" class="close-modal">Close</a>
+</div>
+<!-- //배송지수정 팝업 -->
+<!-- 배송요청사항수정 팝업 -->
+<div class="modal fade rqstModify_pop" id="rqstModifyPop" tabindex="-1" role="dialog" aria-labelledby="rqstModifyLabel" aria-hidden="true">
+	<div class="modal-dialog" role="document">
+		<div class="modal-content">
+			<!-- 배송요청사항수정 팝업 내용 -->
+		</div>
+	</div>
+	<a href="#close-modal" rel="modal:close" id="rqstModifyPop_close" class="close-modal">Close</a>
+</div>
+<!-- //배송요청사항수정 팝업 -->
+<!--교환상품 옵션변경 팝업 -->
+<div class="modal fade exchange_pop" id="exchangePop" tabindex="-1" role="dialog" aria-labelledby="exchangeLabel" aria-hidden="true">
+	<div class="modal-dialog" role="document">
+		<div class="modal-content">
+			<!--교환상품 옵션변경 팝업 내용 -->
+		</div>
+	</div>
+	<a href="#close-modal" rel="modal:close" id="exchangePop_close" class="close-modal">Close</a>
+</div>
+<!-- //교환상품 옵션변경 팝업 -->
+
 <th:block th:replace="~{web/common/fragments/ScriptsWeb :: scripts}"></th:block>
-<script th:src="@{'/ux/pc/js/mypage.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/mypage.js"></script>
+<script th:src="@{'/biz/mypage.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/mypage.js"></script>
 
 <script th:inline="javascript">
 /*<![CDATA[*/

+ 161 - 0
src/main/webapp/WEB-INF/views/web/display/LookbookMainFormWeb.html

@@ -0,0 +1,161 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : LookbookMainFormWeb.html
+ * @desc    : 룩북메인 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.30   bin2107     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<div id="container" class="container dp">
+		<div class="breadcrumb">
+			<ul>
+				<li class="bread_home"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);">홈</a></li>
+				<li class="bread_2depth">룩북</li>
+			</ul>
+		</div>
+		<div class="wrap">
+			<div class="content">
+				<div class="cont_head">
+					<div>
+						<h3>룩북</h3>
+					</div>
+					</dziv>
+					<div class="cont_body">
+						<div class="event_list" id="changeClass">
+							<div class="event_top">
+								<div class="ui_row">
+									<div class="count">
+										<span id="lookbookTotCnt"></span>개의 이벤트
+									</div>
+									<div class="ui_col_12">
+										<div class="btn_group">
+											<!-- <div class="btn_group open"> -->
+											<a href="#none" data-toggle="dropdown" class="btn btn_default tgl_dropdown" aria-expanded="true" id="brandBox">브랜드 선택<span class="caret"></span></a>
+											<div class="dropdown_menu">
+												<ul id="brandArea">
+
+												</ul>
+												<div class="ui_row">
+													<button type="button" class="fillter_reset" onclick="fnGetLookbookList();"><span>초기화</span></button>
+													<button type="button" class="fillter_apply" onclick="fnGetBrandLookbookList();"><span>적용</span></button>
+												</div>
+											</div>
+										</div>
+									</div>
+								</div>
+							</div>
+
+							<div class="list">
+								<ul class="clear event_con" id="lookbookArea" style="display: none;">
+
+								</ul>
+								<ul class="clear no_con" id="divLookbookNoData" style="display: none;">
+									<li>
+										<p><img src="/images/pc/ico_content_none.png" alt="등록된 이벤트가 없습니다."></p>
+										<span>등록된 룩북이 없습니다.</span>
+										<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);">메인으로 가기</a>
+									</li>
+								</ul>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let fnGetLookbookList = function (brandGroupNo){
+		let actionUrl = '/display/lookbook/main/list';
+		if (!gagajf.isNull(brandGroupNo)) actionUrl += '?multiBrandCd=' + brandGroupNo;
+
+		$.getJSON(actionUrl
+			, function (result, status){
+				if (status == 'success'){
+					if (result.length > 0){
+						$('#lookbookTotCnt').html('<span>' + result.length.addComma() + '</span>');
+
+						if (gagajf.isNull(brandGroupNo)){
+							$('#brandArea').html('');
+							let tag = '';
+							let brandArr = [];
+							$.each(result, function(idx, item) {
+								if(!brandArr.includes(item.brandCd)){
+									brandArr.push(item.brandCd);
+									tag += '<li>';
+									tag += '	<label class="brand_btn">';
+									tag += '		<input type="checkbox" group="filterValue" id="chkFilterBrand'+idx+'" data-name="chkFilterBrand'+idx+'" name="filterBrandCds" value="'+item.brandCd+'"><span>'+item.brandNm+'</span>';
+									tag += '	</label>';
+									tag += '</li>';
+								}
+							});
+							$('#brandArea').html(tag);
+						}
+
+						$('#lookbookArea').html('');
+						let tag2 = '';
+						tag2 += '<ul class="clear event_con" id="lookbookArea" style="display: block;">';
+						$.each(result, function(idx, item) {
+							tag2 += '<li>';
+							tag2 += '	<a href="javascript:void(0);">';
+							tag2 += '		<div class="ev_img">';
+							tag2 += '			<img src="' + _imgUrl + item.orgTnfileNm + '" alt="" style="height:100%">';
+							tag2 += '		</div>';
+							tag2 += '		<div class="txt">';
+							tag2 += '			<span class="brand">'+item.brandNm+'</span>';
+							tag2 += '			<p class="tit">'+item.title+'</p>';
+							tag2 += '		</div>';
+							tag2 += '	</a>';
+							tag2 += '</li>';
+						});
+						tag2 += '</ul>';
+
+						$('#lookbookArea').html(tag2);
+						$('#divLookbookNoData').hide();
+						$('#lookbookArea').show();
+					}else{
+						$('#lookbookTotCnt').html('<span>0</span>');
+						document.getElementById("changeClass").className = "event_list no_data";
+						$('#lookbookArea').hide();
+						$('#divLookbookNoData').show();
+					}
+				}
+				document.getElementById("brandBox").className = "btn btn_default tgl_dropdown";
+				$('.dropdown_menu').hide();
+			});
+	}
+
+	var fnGetBrandLookbookList = function (){
+		var multiBrandCd = [];
+		$("input:checkbox:checked").each(function (index) {
+			multiBrandCd.push($(this).val());
+		});
+
+		fnGetLookbookList(multiBrandCd);
+	}
+
+	$(document).ready(function() {
+		//$("#container .wrap .content .cont_body .event_list .event_top .ui_row .count").find('span').text(totalCnt.addComma());
+		fnGetLookbookList();
+	});
+
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 39 - 38
src/main/webapp/WEB-INF/views/web/display/MallMainFormWeb.html

@@ -180,7 +180,7 @@
 								<div class="bar_bg"></div>
 							</div>
 							<th:block th:each="socialData, socialStat : ${mainLayoutData.socialInfo}">
-								<form name="socailForm">
+								<form name="socailForm" id="socailForm">
 									<input type="hidden" name="targetTime" th:value="${socialData.socialEddt}">
 								</form>
 							</th:block>
@@ -197,42 +197,6 @@
 									</div>
 								</div>
 							</div>
-							<script>
-
-								/* 핫딜 countDown */
-								var target_date = new Date().getTime() + (1000*3600*8); // set the countdown date
-								var days, hours, minutes, seconds; // variables for time units
-
-								var countdown = document.getElementById("tiles"); // get tag element
-
-								getCountdown();
-
-								setInterval(function () { getCountdown(); }, 1000);
-
-								function getCountdown(){
-
-									// find the amount of "seconds" between now and target
-									var current_date = new Date().getTime();
-									var seconds_left = (target_date - current_date) / 1000;
-
-
-									seconds_left = seconds_left % 86400;
-
-									hours = pad( parseInt(seconds_left / 3600) );
-									seconds_left = seconds_left % 3600;
-
-									minutes = pad( parseInt(seconds_left / 60) );
-									seconds = pad( parseInt( seconds_left % 60 ) );
-
-									// format countdown string + set tag value
-									countdown.innerHTML = "<span>" + hours + "</span><span>" + minutes + "</span><span>" + seconds + "</span>";
-								}
-
-								function pad(n) {
-									return (n < 10 ? '0' : '') + n;
-								}
-								/* countDown */
-							</script>
 						</div>
 						<div class="cont_body">
 							<div class="swiper-container post-deal">
@@ -320,7 +284,44 @@
 /*<![CDATA[*/
 
 var mainLayoutList = [[${mainLayoutList}]];
-console.log('mainLayoutList::'+mainLayoutList);
+
+var targetTime = $("#socailForm").find("input[name=targetTime]").val();
+if(targetTime != null && targetTime != ''){
+	/* 핫딜 countDown */
+	var endTime = new Date(targetTime); // 남은시간 지정
+	endTime = (Date.parse(endTime) / 1000);
+
+	var countdown = document.getElementById("tiles"); // get tag element
+
+	getCountdown();
+
+	setInterval(function () { getCountdown(); }, 1000);
+
+	function getCountdown(){
+		// find the amount of "seconds" between now and target
+		var now = new Date();
+		now = (Date.parse(now) / 1000);
+
+		var timeLeft = endTime - now;
+
+		var days = Math.floor(timeLeft / 86400);
+		var hours = Math.floor((timeLeft - (days * 86400)) / 3600);
+		var minutes = Math.floor((timeLeft - (days * 86400) - (hours * 3600 )) / 60);
+		var seconds = Math.floor((timeLeft - (days * 86400) - (hours * 3600) - (minutes * 60)));
+
+		if (hours < '10') { hours = '0' + hours; }
+		if (minutes < '10') { minutes = '0' + minutes; }
+		if (seconds < '10') { seconds = '0' + seconds; }
+
+		// format countdown string + set tag value
+		countdown.innerHTML = "<span>" + hours + "</span><span>" + minutes + "</span><span>" + seconds + "</span>";
+	}
+
+	function pad(n) {
+		return (n < 10 ? '0' : '') + n;
+	}
+}
+
 // 컨텐츠 호출
 $(document).ready( function() {
 	$("#header").load("head.html");

+ 14 - 3
src/main/webapp/WEB-INF/views/web/error/404Web.html

@@ -51,16 +51,27 @@
 			<div class="contGrp">
 				<h2>죄송합니다.<br/> 요청하신 페이지를 찾을 수 없습니다.</h2>
 				<p class="none_m">방문하시려는 페이지의 주소가 잘못 입력되었거나,<br/>페이지의 주소가 변경 혹은 삭제되어 요청하신 페이지를 찾을 수 없습니다. </p>
-				<p>입력하신 주소가 정확한지 다시한번 확인해주시기 바랍니다</p>
+				<p>입력하신 주소가 정확한지 다시  번 확인해 주시기 바랍니다.</p>
 				<p class="none_m">
-					서비스 이용 중 문의사항이나 불편하셨던 점은 <a class="none_m"  href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_FAQ);">고객센터</a>를 이용해주세요. 감사합니다.
+					서비스 이용 중 문의사항이나 불편하셨던 점은 <a class="none_m"  href="javascript:void(0);" onclick="fnGoToFaq();">고객센터</a>를 이용해주세요. 감사합니다.
 				</p>
 			</div>
 			<div class="btn_group">
-				<button class="btn btn_dark" onclick="cfnGoToPage(_PAGE_MAIN);"><span>홈으로 이동</span></button>
+				<button class="btn btn_dark" onclick="fnGoToHome();"><span>홈으로 이동</span></button>
 			</div>
 		</div>
 	</div>
 	<!-- // container -->
+
+<script type="text/javascript">
+	let fnGoToHome = function() {
+		document.location.href = '/';
+	}
+	
+	let fnGoToFaq = function() {
+		document.location.href = '/callcenter/faq/form';
+	}
+</script>
+
 </body>
 </html>

Разница между файлами не показана из-за своего большого размера
+ 39 - 0
src/main/webapp/WEB-INF/views/web/error/InaccessWeb.html


+ 205 - 0
src/main/webapp/WEB-INF/views/web/mypage/ChangeOptionPopupFormWeb.html

@@ -0,0 +1,205 @@
+<!-- 배송지변경 팝업 -->
+<div class="modal-header">
+	<h5 class="modal-title" id="exchangeLabel">교환상품 옵션 변경</h5>
+</div>
+<div class="modal-body">
+	<div class="pop_cont">
+		<form class="form_wrap">
+			<div class="select_option_area">
+				<h6>옵션 변경 상품 선택</h6>
+				<div class="form_field">
+					<div>
+						<input id="chk_exchange_item1" name="chk_exchange_item" type="checkbox" checked=""><label for="chk_exchange_item1"><span>슬림핏 체크 네이비컬러 스탠드카라 셋업수트 자켓 / Black</span></label>
+					</div>
+					<div>
+						<input id="chk_exchange_item2" name="chk_exchange_item" type="checkbox"><label for="chk_exchange_item2"><span>베이직 셔츠 / Green</span> </label>
+					</div>
+					<div>
+						<input id="chk_exchange_item3" name="chk_exchange_item" type="checkbox"><label for="chk_exchange_item3"><span>체크 베이직 셔츠 / Green / M</span></label>
+					</div>
+				</div>
+			</div>
+			<div class="modify_option_area">
+				<div class="modify_box">
+					<div class="name_blk">
+						슬림핏 체크 네이비컬러 스탠드카라 셋업수트 자켓 / Black
+					</div>
+					<div class="select_blk">
+						<!-- 옵션교환 라디오 형태 -->
+						<div class="sel_radio">
+							<div class="form_field">
+								<div>
+									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize11" value="" checked="">
+									<label for="rdi-modifysize11"><span>90</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize12" value="" disabled="">
+									<label for="rdi-modifysize12"><span>95</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize13" value="">
+									<label for="rdi-modifysize13"><span>100</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize14" value="">
+									<label for="rdi-modifysize14"><span>105</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize15" value="">
+									<label for="rdi-modifysize15"><span>110</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize16" value="">
+									<label for="rdi-modifysize16"><span>115</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize17" value="">
+									<label for="rdi-modifysize17"><span>free</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize18" value="">
+									<label for="rdi-modifysize18"><span>size1</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-modifysize1" id="rdi-modifysize19" value="">
+									<label for="rdi-modifysize19"><span>size2</span></label>
+								</div>
+							</div>
+						</div>
+						<!-- //옵션교환 라디오 형태 -->
+						<!-- 옵션교환 셀렉트박스 형태 -->
+						<div class="sel_select">
+							<div class="form_field">
+								<div class="select_custom exchange_option1">
+									<div class="combo">
+										<div class="select">옵션 선택</div>
+										<ul class="list">
+											<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
+											<li class="selected">옵션 선택</li>
+											<li>상품옵션01</li>
+											<li>상품옵션02</li>
+											<li>상품옵션03</li>
+											<li aria-disabled="true">상품옵션04</li>
+											<li>상품옵션05</li>
+											<li aria-disabled="true" data-soldout="true">상품옵션06</li>
+										</ul>
+									</div>
+								</div>
+							</div>
+						</div>
+						<!-- //옵션교환 셀렉트박스 형태 -->
+					</div>
+					<div class="allcheck_blk">
+						<div class="form_field">
+							<div>
+								<input id="chk_exchange_all1" name="chk_exchange_all1" type="checkbox" checked=""><label for="chk_exchange_all1"><span>선택 옵션으로 전체 교환</span></label>
+							</div>
+						</div>
+					</div>
+				</div>
+				<div class="modify_box">
+					<div class="name_blk">
+						베이직 셔츠 / Green
+					</div>
+					<div class="select_blk">
+						<!-- 옵션교환 라디오 형태 -->
+						<div class="sel_radio">
+							<div class="form_field">
+								<div>
+									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize21" value="" checked="">
+									<label for="rdi-modifysize21"><span>90</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize22" value="" disabled="">
+									<label for="rdi-modifysize22"><span>95</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize23" value="">
+									<label for="rdi-modifysize23"><span>100</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize24" value="">
+									<label for="rdi-modifysize24"><span>105</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize25" value="">
+									<label for="rdi-modifysize25"><span>110</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize26" value="">
+									<label for="rdi-modifysize26"><span>115</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize27" value="">
+									<label for="rdi-modifysize27"><span>free</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize28" value="">
+									<label for="rdi-modifysize28"><span>size1</span></label>
+								</div>
+								<div>
+									<input type="radio" name="rdi-modifysize2" id="rdi-modifysize29" value="">
+									<label for="rdi-modifysize29"><span>size2</span></label>
+								</div>
+							</div>
+						</div>
+						<!-- //옵션교환 라디오 형태 -->
+					</div>
+					<div class="allcheck_blk">
+						<div class="form_field">
+							<div>
+								<input id="chk_exchange_all2" name="chk_exchange_all2" type="checkbox" checked=""><label for="chk_exchange_all2"><span>선택 옵션으로 전체 교환</span></label>
+							</div>
+						</div>
+					</div>
+				</div>
+
+				<div class="modify_box">
+					<div class="name_blk">
+						체크 베이직 셔츠 / Green
+					</div>
+					<div class="select_blk">
+						<!-- 옵션교환 셀렉트박스 형태 -->
+						<div class="sel_select">
+							<div class="form_field">
+								<div class="select_custom exchange_option2">
+									<div class="combo">
+										<div class="select">옵션 선택</div>
+										<ul class="list">
+											<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
+											<li class="selected">옵션 선택</li>
+											<li>상품옵션01</li>
+											<li>상품옵션02</li>
+											<li>상품옵션03</li>
+											<li aria-disabled="true">상품옵션04</li>
+											<li>상품옵션05</li>
+											<li aria-disabled="true" data-soldout="true">상품옵션06</li>
+										</ul>
+									</div>
+								</div>
+							</div>
+						</div>
+						<!-- //옵션교환 셀렉트박스 형태 -->
+					</div>
+					<div class="allcheck_blk">
+						<div class="form_field">
+							<div>
+								<input id="chk_exchange_all3" name="chk_exchange_all3" type="checkbox" checked=""><label for="chk_exchange_all3"><span>선택 옵션으로 전체 교환</span></label>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+		</form>
+	</div>
+</div>
+<div class="modal-footer">
+	<button type="button" id="" class="btn btn_dark"><span>옵션 저장</span></button>
+</div>
+<script th:inline="javascript">
+//컨텐츠 호출
+$(document).ready( function() {
+	var exchange_option_selecter1 = new sCombo('#exchangePop .select_custom.exchange_option1');
+	var exchange_option_selecter2 = new sCombo('#exchangePop .select_custom.exchange_option2');
+});
+</script>

+ 55 - 36
src/main/webapp/WEB-INF/views/web/mypage/MypageCancelFormWeb.html

@@ -78,8 +78,8 @@
 												<span class="count"><em th:text="${cancel.ordQty - cancel.cnclRtnQty}"></em>개</span>
 											</p>
 											<p>
-												<span class="price_org" th:if="${(cancel.listPrice * (cancel.ordQty - cancel.cnclRtnQty)) > (cancel.ordAmt - cancel.cnclRtnAmt)}"><em th:text="${#numbers.formatInteger(cancel.listPrice * (cancel.ordQty - cancel.cnclRtnQty), 1, 'COMMA')}"></em>원</span>
-												<span class="price_sale"><em th:text="${#numbers.formatInteger(cancel.ordAmt - cancel.cnclRtnAmt, 1, 'COMMA')}"></em>원</span>
+												<span class="price_org" th:if="${(cancel.ordAmt - cancel.cnclRtnAmt - cancel.cpn1DcAmt) > (cancel.realOrdAmt + cancel.pntDcAmt + cancel.gfcdUseAmt)}"><em th:text="${#numbers.formatInteger(cancel.ordAmt - cancel.cnclRtnAmt - cancel.cpn1DcAmt, 1, 'COMMA')}"></em>원</span>
+												<span class="price_sale"><em th:text="${#numbers.formatInteger(cancel.realOrdAmt + cancel.pntDcAmt + cancel.gfcdUseAmt, 1, 'COMMA')}"></em>원</span>
 											</p>
 										</div>
 									</div>
@@ -182,6 +182,12 @@
 							</li>
 						</ul>
 					</div>
+					<div class="info_footer_area" id="addDeliveryFee" style="display:none">
+						<p>
+							<span id="addPayCost">2,500원</span> 배송비 추가 결제가 필요합니다.
+							<input type="hidden" name="addPayCost"/>
+						</p>
+					</div>
 					<div class="btn_footer_area">
 						<button type="button" class="btn btn_default btn_md" onclick="cfnGoToPage(_PAGE_MYPAGE_ORDER_LIST);"><span>취소</span></button>
 						<button type="button" id="btn_refund_pop" class="btn btn_dark btn_md" onclick="fnCancel();"><span>주문 취소</span></button>
@@ -198,63 +204,66 @@
 	let paymentInfo = [[${paymentInfo}]];
 	let usedGiftCardInfo = [[${usedGiftCardInfo}]];
 	let usedPointInfo = [[${usedPointInfo}]];
+	let addPayCost = 0;
 
 	$(document).ready(function() {
 		// 마이페이지 LNB 설정
 		fnSetMypageLnbList(2);
-		
+
 		// 마이페이지 location 설정
 		fnSetMypageLocation('취소/반품/환불내역', '_PAGE_MYPAGE_CRS_LIST', '취소 신청');
-		
+
 		// 셀렉트박스 활성화
-		//var goods_count_selecter = new sCombo('.myOrderView .part_goods .select_custom.select_count');
 		$(".myOrderView .part_goods .select_custom.select_count").each(function() {
 			new sCombo(this);
 		});
 	});
-	
+
 	// 취소 처리
 	var fnCancel = function() {
 		// 취소수량 설정
 		fnChangeCancelQty();
 
-		// 취소수량 체크
-		let index = 0;
-		$.each(cancelList.cancelList, function (idx, item) {
-			index += item.ordCanChgQty;
+		// 주문상세번호 및 취소 수량 설정
+		let ordDtlNoArr = [];
+		let cnclRtnReqQtyArr = [];
+		let chkQty = 0;
+		$.each($('input[name=chgQty]'), function(idx, item) {
+			let chgQty = $(item).val();
+			let ordDtlNo = $(item).attr('ordDtlNo');
+			
+			ordDtlNoArr.push(Number(ordDtlNo));
+			cnclRtnReqQtyArr.push(Number(chgQty));
+			chkQty += chgQty;
 		});
-		
-		if (index == 0) {
-			mcxDialog.alert('취소 수량을 선택해주세요.');
+
+		// 취소 수량 체크
+		if (chkQty == 0) {
+			mcxDialog.alert('취소하실 상품의 수량을 선택해주세요.');
 			return false;
 		}
-		
+
 		// 환불계좌 체크
 		let accountNo = $('input[name=accountNo]').val();
 		let accountNm = $('input[name=accountNm]').val();
 		let bankCd = $('input[name=bankCd]').val();
-		
+
 		if (paymentInfo.payMeans == 'G014_20' && paymentInfo.payStat == 'G016_00' && (gagajf.isNull(accountNo) || gagajf.isNull(accountNm) || gagajf.isNull(bankCd))) {
 			// TODO
 			// 환불계좌 등록 팝업
 			
 			return false;
 		}
-		
+
+		// 추가배송비 PG 처리
+		if (addPayCost > 0) {
+			// TODO
+			// 추가배송비 PG 처리
+		}
+
 		// 취소요청 데이터 설정
 		let url = '/mypage/cancel';
 
-		// 주문상세번호 및 취소 수량 설정
-		let ordDtlNoArr = [];
-		let cnclRtnReqQtyArr = [];
-		$.each($('input[name=chgQty]'), function(idx, item) {
-			let chgQty = $(item).val();
-			let ordDtlNo = $(item).attr('ordDtlNo');
-			
-			ordDtlNoArr.push(Number(ordDtlNo));
-			cnclRtnReqQtyArr.push(Number(chgQty));
-		});
-
 		// 취소 처리
 		let data = {};
 		data.ordNo = oneData.ordNo;
@@ -300,7 +309,7 @@
 		data.ordNo = oneData.ordNo;
 		data.ordDtlNoArr = ordDtlNoArr;
 		data.cnclRtnReqQtyArr = cnclRtnReqQtyArr;
-		
+
 		let jsonData = JSON.stringify(data);
 
 		gagajf.ajaxJsonSubmit(url, jsonData, function (result) {
@@ -315,13 +324,23 @@
 			let spanTmtbDcAmt = Number(result.spanTmtbDcAmt);
 			let spanPrePntDcAmt = Number(result.spanPrePntDcAmt);
 			let spanRefundAmt = Number(result.spanRefundAmt);
-			
+
 			let goodsCancelAmt = spanCnclRtnAmt;										// 상품취소금액
 			let deliveryFee = sumDeliveryFee - spanTotDeliveryFee;						// 배송비
 			let deductDcAmt = 0 - spanCpnDcAmt - spanTmtbDcAmt - spanPrePntDcAmt;		// 할인금액 차감(쿠폰+다다익선+선포인트)
-			let refundPayAmt = spanRefundAmt;											// 결제금액 환불
+			let refundPayAmt = spanRefundAmt - spanTotDeliveryFee;						// 결제금액 환불
 			let returnAmt = refundPayAmt + refundPoint + refundGiftCard;				// 환불예정금액
-			
+
+			// 추가배송비 영역 설정
+			if (refundPayAmt > 0) {
+				refundPayAmt = spanRefundAmt;
+				$('#addDeliveryFee').css('display', '');
+				$('#addPayCost').text(spanTotDeliveryFee.addComma() + '원');
+				addPayCost = spanTotDeliveryFee;
+			} else {
+				addPayCost = 0;
+			}
+
 			// 금액 설정
 			$('#returnAmt').text(returnAmt.addComma());
 			$('#goodsCancelAmt').text(goodsCancelAmt.addComma());
@@ -341,7 +360,7 @@
 			let index = ordDtlNoArr.indexOf(item.ordDtlNo);
 			let chgQty = chgQtyArr[index];
 			let ordCanChgQty = ordCanChgQtyArr[index];
-			
+
 			if (chgQty > 0) {
 				if (chgQty == ordCanChgQty) {
 					refundPoint += item.pntAmt;
@@ -350,19 +369,19 @@
 				}
 			}
 		});
-		
+
 		return refundPoint;
 	}
 	
 	// 환불 상품권 계산
 	var fnCalculateGiftCard = function(chgQtyArr, ordDtlNoArr, ordCanChgQtyArr) {
 		let refundGiftCard = 0;
-		
+
 		$.each(usedGiftCardInfo, function(idx, item) {
 			let index = ordDtlNoArr.indexOf(item.ordDtlNo);
 			let chgQty = chgQtyArr[index];
 			let ordCanChgQty = ordCanChgQtyArr[index];
-			
+
 			if (chgQty > 0) {
 				if (chgQty == ordCanChgQty) {
 					refundGiftCard += item.gfcdAmt;
@@ -371,7 +390,7 @@
 				}
 			}
 		});
-		
+
 		return refundGiftCard;
 	}
 </script>

+ 251 - 194
src/main/webapp/WEB-INF/views/web/mypage/MypageExchangeFormWeb.html

@@ -19,229 +19,270 @@
 <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 class="content myOrderView"> <!-- 페이지특정 클래스 = myOrderView -->
+		<div class="cont_body">
+			<!-- CONT-BODY -->
+			<div class="lnb">
+				<div class="lnb_tit">
+					<h2>마이페이지</h2>
+				</div>
+				<div class="lnb_list">
+					<ul id="mypageLnbList"></ul>
+				</div>
 			</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.shotDelv}">총알배송</span>
-								<span class="order_label01" th:if="${oneData.selfMall}">STYLE24 일반배송</span>
-								<span class="order_label01" th:if="${oneData.supplyMall}">업체직배송</span>
-								<!-- //배송구분 설정 -->
-								<a href="javascript:void(0)" class="detail_btn" th:attr="ordNo=${oneData.ordNo}" onclick="fnGoToOrderDetail(this)">주문상세보기</a>
-							</div>
-							<th:block th:if="${oneData.orderList}" th:each="order, status : ${oneData.orderList}">
-								<div class="tbl type2">
-									<table id="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 class="cont">
+				<div class="sec_head">
+					<h3 class="subH1">교환 신청</h3>
+					<span class="order_number">주문번호&nbsp;:&nbsp;<em th:text="${oneData.ordNo}"></em></span>
+				</div>
+				<div class="sec_body">
+					<div class="part_goods">
+						<div class="goods_head">
+							<p th:unless="${oneData.giftPackYn == 'Y'}">주문일 <span th:text="${oneData.ordDt}"></span></p>
+							<p th:if="${oneData.giftPackYn == 'Y'}">선물일 <span th:text="${oneData.ordDt}"></span></p>
+						</div>
+						<div class="goods_cont">
+							<th:block th:if="${exchangeList.returnList}" th:each="exchange, status : ${exchangeList.returnList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
+							<!-- 주문상품 -->
+							<div class="goods_info">
+								<div class="order_desc">
+									<div class="goods_box">
+										<div class="gd_item">
+											<a href="javascript:void(0)" th:attr="goodsCd=${exchange.goodsCd}" onclick="fnGoToGoodsDetail(this)">
+												<span class="thumb">
+													<img th:src="${imageUrl + '/' + exchange.sysImgNm}" width="100%" alt="">
+												</span>
+												<p>
+													<span class="brand" th:text="${exchange.brandNm}"></span>
+													<span class="tag primary" th:if="${exchange.shotDelvYn == 'Y'}">총알배송</span>
+													<span class="tag" th:if="${exchange.shotDelvYn == 'N' and exchange.selfGoodsYn == 'Y'}">STYLE24 일반배송</span>
+													<span class="tag" th:if="${exchange.selfGoodsYn == 'N'}">업체직배송</span>
+												</p>
+												<p>
+													<span class="name" th:text="${exchange.goodsNm}"></span>
+												</p>
+											</a>
+										</div>
+										<div class="gd_opt">
+											<div class="option_wrap">
+												<span class="title sr-only">주문 옵션</span>
+												<span class="option" th:if="${exchange.goodsType == 'G056_S'}" th:each="option, status : ${exchange.colorNmArr}" th:text="|${exchange.itemNmArr[status.index]} / ${option} / ${exchange.optCd2Arr[status.index]}|"></span>
+												<span class="option" th:unless="${exchange.goodsType == 'G056_S'}" th:text="|${exchange.colorNm} / ${exchange.optCd2}|"></span>
+											</div>
+										</div>
+										<div class="gd_calc">
+											<p>
+												<span class="count"><em th:text="${exchange.ordQty - exchange.cnclRtnQty}"></em>개</span>
+											</p>
+											<p>
+												<span class="price_org" th:if="${(exchange.ordAmt - exchange.cnclRtnAmt - exchange.cpn1DcAmt) > (exchange.realOrdAmt + exchange.pntDcAmt + exchange.gfcdUseAmt)}"><em th:text="${#numbers.formatInteger(exchange.ordAmt - exchange.cnclRtnAmt - exchange.cpn1DcAmt, 1, 'COMMA')}"></em>원</span>
+												<span class="price_sale"><em th:text="${#numbers.formatInteger(exchange.realOrdAmt + exchange.pntDcAmt + exchange.gfcdUseAmt, 1, 'COMMA')}"></em>원</span>
+											</p>
+										</div>
+									</div>
+									<div class="button_box">
+										<div class="count_modify">
+											<span class="txt">수량</span>
+											<form class="form_wrap">
+												<div class="form_field">
+													<div class="select_custom select_count">
+														<div class="combo">
+															<input type="hidden" name="chgQty" value="0" th:attr="ordDtlNo=${exchange.ordDtlNo}, ordCanChgQty=${exchange.ordCanChgQty}"/>
+															<div class="select">선택</div>
+															<ul class="list">
+																<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" 추가  -->
+																<li class="selected" qty="0" onclick="fnChangeExchangeQty(this);">선택</li>
+																<li th:if="${exchange.ordCanChgQty > 0}" th:each="num : ${#numbers.sequence(1,exchange.ordCanChgQty)}" th:attr="qty=${num}" th:text="${num}" onclick="fnChangeExchangeQty(this);"></li>
+															</ul>
 														</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>
+											</form>
+											<button type="button" id="btn_exchange_pop" class="btn btn_dark btn_sm" th:attr="ordNo=${exchange.ordNo}, ordDtlNo=${exchange.ordDtlNo}" onclick="fnChangeOption(this)"><span>교환 옵션 변경</span></button>
+										</div>
+									</div>
+								</div>
+								<div class="order_text">
+									<p>교환하실 상품의 수량 및 옵션을 선택하신 후 교환 신청을 하실 수 있습니다.</p>
 								</div>
-							</th:block>
-							<div class="order_confirm">
-								<p class="cf_txt cf_desc c_primary">교환하실 상품의 수량 및 옵션을 선택하신 후 교환 신청을 하실 수 있습니다.</p>
 							</div>
+							<!-- //주문상품 -->
+							</th:block>
 						</div>
-					</th:block>
-				</section>
-				<section class="order_row">
-					<div class="tbl_tit">
-						<h3 class="subH3">교환 사유</h3>
 					</div>
+					<h4 class="subH3">교환 사유</h4>
 					<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, 200, $('#exchange_cnt'));"></textarea>
-									<p class="txt_cnt"><span id="exchange_cnt" class="c_primary">0</span>/200</p>
-								</td>
-							</tr>
+								<tr>
+									<td>
+										<div class="form_field">
+											<div class="select_custom select_reason">
+												<div class="combo">
+													<input type="hidden" name="chgReason"/>
+													<div class="select">교환 사유를 선택하세요.</div>
+													<ul class="list">
+														<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" 추가  -->
+														<li class="selected">교환 사유를 선택하세요.</li>
+														<li th:if="${exchangeReason}" th:each="oneData, status : ${exchangeReason}" th:attr="chgReason=${oneData.cd}" th:text="${oneData.cdNm}" onclick="fnChangeExchangeReason(this);"></li>
+													</ul>
+												</div>
+											</div>
+										</div>
+									</td>
+								</tr>
+								<tr>
+									<td>
+										<div class="form_field">
+											<div class="input_wrap">
+												<textarea class="doc_reason" name="chgMemo" id="chgMemo" cols="30" rows="10" placeholder="자세한 사유를 입력해주세요." style="resize: none;"></textarea>
+												<p class="txt_cnt"><span id="reason_cnt" class="c_primary">0</span>/200</p>
+											</div>
+										</div>
+									</td>
+								</tr>
 							</tbody>
 						</table>
 					</div>
-				</section>
-				<section class="order_row" id="chgerLocation">
-					<div class="order_tit">
-						<h3 class="subH3">상품 회수지</h3>
-						<span class="del_t">택배사에서 반품 상품을 직접 회수할 장소 선택</span>
-						<button type="button" class="btn_popup" onclick="fnChangeDeliveryAddr('chger');"><span>회수지 선택</span></button>
-					</div>
+					<h4 class="subH3">반품 방식 선택</h4>
 					<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}">
+								<td>
+									<div class="retrieve_method">
+										<div class="form_field">
+											<div>
+												<input type="radio" name="wdGb" id="withdraw" value="W" checked>
+												<label for="withdraw"><span>방문회수<em>택배사에서 고객에게 방문하여 회수</em></span></label>
+											</div>
+											<div>
+												<input type="radio" name="wdGb" id="direct" value="D">
+												<label for="direct"><span>직접배송<em>고객이 반품지로 직접 반송</em></span></label>
+											</div>
+										</div>
+									</div>
+								</td>
 							</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 class="retrieve_box visit" style="display:block;" id="chgerLocation">
+						<h4 class="subH3">교환 회수지 주소 <span class="tit_info">택배사에서 교환 상품을 직접 회수할 장소 선택</span></h4>
+						<div class="tbl type1">
+							<table>
+								<colgroup>
+									<col width="210">
+									<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>
+											<th:block  th:id="chgerAddr" th:text="|${deliveryAddrInfo.recipBaseAddr} ${deliveryAddrInfo.recipDtlAddr}|"></th:block>
+											<button type="button" class="btn btn_default btn_sm" onclick="fnChangeDeliveryAddr('chger');"><span>회수지 변경</span></button>
+										</td>
+										<input type="hidden" name="chgerZipcode" th:value="${deliveryAddrInfo.chgerZipcode}">
+										<input type="hidden" name="chgerBaseAddr" th:value="${deliveryAddrInfo.recipBaseAddr}">
+										<input type="hidden" name="chgerDtlAddr" th:value="${deliveryAddrInfo.recipDtlAddr}">
+										<input type="hidden" name="chgerRtnMemo" th:value="${deliveryAddrInfo.chgerRtnMemo}">
+									</tr>
+								</tbody>
+							</table>
+						</div>
 					</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 class="retrieve_box direct" style="display:none;" id="returnLocation">
+						<h4 class="subH3">반송 정보</h4>
+						<div class="tbl type1">
+							<table>
+								<colgroup>
+									<col width="210">
+									<col width="*">
+								</colgroup>
+								<tbody>
+								<tr>
+									<th>
+										반송주소
+									</th>
+									<td th:text="|${deliveryAddrInfo.rtnLocBaseAddr} ${deliveryAddrInfo.rtnLocDtlAddr}|"></td>
+								</tr>
+								<tr>
+									<th>
+										반송 송장번호
+									</th>
+									<td>
+										<form class="form_wrap">
+											<div class="form_field">
+												<div class="input_wrap">
+													<input type="text" class="form_control" name="wdInvoiceNo" placeholder="송장번호를 입력해주세요.">
+												</div>
+											</div>
+										</form>
+									</td>
+								</tr>
+								</tbody>
+							</table>
+						</div>
 					</div>
+					<h4 class="subH3">교환 상품 배송지</h4>
 					<div class="tbl type1">
 						<table>
 							<colgroup>
-								<col width="200">
+								<col width="210">
 								<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>
+								<tr>
+									<th>
+										배송지 정보
+									</th>
+									<td>
+										<div class="block_line">
+											<ul>
+												<li>
+													<span th:text="${deliveryAddrInfo.recipNm}"></span>
+												</li>
+												<li>
+													<span th:text="${deliveryAddrInfo.recipPhnno}"></span>
+												</li>
+												<li>
+													<span th:text="|${deliveryAddrInfo.recipBaseAddr} ${deliveryAddrInfo.recipDtlAddr}|"></span>
+													<button type="button" class="btn btn_default btn_sm" onclick="fnChangeDeliveryAddr()"><span>배송지 변경</span></button>
+												</li>
+												<li>
+													배송요청 사항&nbsp;:&nbsp;<span id="delvMemo" th:text="${deliveryAddrInfo.delvMemo}"></span>
+													<button type="button" class="btn_underline" onclick="fnChangeDeliveryMemo()"><span>변경하기</span></button>
+												</li>
+											</ul>
+										</div>
+									</td>
+								</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 class="info_footer_area" id="addDeliveryFee" style="display:none">
+						<p>
+							<span id="addPayCost">2,500원</span> 배송비 추가 결제가 필요합니다.
+							<input type="hidden" name="addPayCost"/>
+						</p>
+					</div>
+					<div class="btn_footer_area">
+						<button type="button" class="btn btn_default btn_md" onclick="cfnGoToPage(_PAGE_MYPAGE_CRS_LIST)"><span>취소</span></button>
+						<button type="button" id="btn_confirm_exchange" class="btn btn_dark btn_md" onclick="fnExchange()"><span>교환 신청</span></button>
 					</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>
+			<!-- // CONT-BODY -->
 		</div>
 	</div>
 <script src="/ux/plugins/gaga/gaga.paging.js"></script>
@@ -258,6 +299,22 @@
 	var fnChangeOption = function(param) {
 		// TODO
 		// 옵션변경 처리
+		var jsonObj = {};
+		jsonObj.ordNo = $(param).attr('ordNo');
+		jsonObj.ordDtlNo = $(param).attr('ordDtlNo');
+
+		$.ajax({
+			type		: "POST",
+			url 		: "/mypage/change/option/popup/form",
+			data		: jsonObj,
+			dataType 	: "html",
+			success 	: function(result) {
+				if (result != null) {
+					$("#exchangePop .modal-content").html(result);
+					$("#exchangePop").modal("show");
+				}
+			}
+		});
 	}
 
 	// 교환 처리
@@ -267,15 +324,15 @@
 	}
 	
 	// 교환 사유 변경 이벤트
-	var fnChangeReason = function(param) {
+	var fnChangeExchangeReason = function(param) {
 		let chgReason = $(param).val();
 		// TODO
 		// 사유 변경 처리
-		alert('a');
-		console.log($('#exchangeList tr'));
-		$.each($('#exchangeList tr'), function(idx, item) {
-			console.log(item);
-		})
+	}
+	
+	// 교환 수량 변경 이벤트
+	var fnChangeExchangeQty = function(param) {
+		
 	}
 </script>
 

+ 285 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageExchangeFormWeb_20210330.html

@@ -0,0 +1,285 @@
+<!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.shotDelv}">총알배송</span>
+								<span class="order_label01" th:if="${oneData.selfMall}">STYLE24 일반배송</span>
+								<span class="order_label01" th:if="${oneData.supplyMall}">업체직배송</span>
+								<!-- //배송구분 설정 -->
+								<a href="javascript:void(0)" class="detail_btn" th:attr="ordNo=${oneData.ordNo}" onclick="fnGoToOrderDetail(this)">주문상세보기</a>
+							</div>
+							<th:block th:if="${oneData.orderList}" th:each="order, status : ${oneData.orderList}">
+								<div class="tbl type2">
+									<table id="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, 200, $('#exchange_cnt'));"></textarea>
+									<p class="txt_cnt"><span id="exchange_cnt" class="c_primary">0</span>/200</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 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>

+ 12 - 22
src/main/webapp/WEB-INF/views/web/mypage/MypageGiftcardFormWeb.html

@@ -24,14 +24,13 @@
 			<!-- 페이지특정 클래스 = myVoucher -->
 			<div class="cont_body">
 				<div class="lnb">
-							<div class="lnb_tit">
+					<div class="lnb_tit">
 						<h2>마이페이지</h2>
-						<div class="lnb_list">
-						<ul id="mypageLnbList"></ul>
 					</div>
+					<div class="lnb_list">
+						<ul id="mypageLnbList"></ul>
 					</div>
-					
-				</div>
+				</div>	
 				<div class="cont">
 					<div class="sec_head">
 						<h3 class="subH1">상품권</h3>
@@ -123,26 +122,17 @@
 		</div>
 	</div>
 <script th:inline="javascript">
-	var date = new Date();
-	var year = date.getFullYear();
-	var month = date.getMonth() + 1;
+	let date = [[${date}]];
+	var year = date[0].year;
+	var month = date[0].month;
 
 	//동적으로 날짜 년도 append
 	function appendYear() {
-
-		for (var i = year; i <= year; i++) {
-			for (var j = 1; j <= month; j++) {
-				$("#searchDt").prepend(
-						"<li onclick='fnChangeDate(this.value)' value='"
-								+ year + "" + j + "'>" + i
-								+ "년" + j + "월 </li>");
-			}
+		for (var i = 0; i < date.length; i++) {
+			$("#searchDt").append(	"<li onclick='fnChangeDate(this.value)' value='"+ date[i].year + "" + date[i].month + "'>" + date[i].year	+ "년" + date[i].month + "월 </li>")
 		}
-		$(".select").append(
-				"<li class='selected' value='"+year+""+month+"'>"
-						+ year + "년" + month + "월 </li>"); // 현재년도 선택 */
+		$(".select").append("<li class='selected' value='"+date[0].year+""+date[0].month+"'>"+ date[0].year + "년" + date[0].month + "월 </li>"); // 현재년도 선택 */ 
 	}
-
 	appendYear($("#searchDt"));
 
 	// 사용내역 조회
@@ -203,7 +193,7 @@
 			tmtbHtml += '</div>';
 			tmtbHtml += '<div class="nodata">';
 			tmtbHtml += '<div class="txt_box">';
-			tmtbHtml += '<p>현재 노출 할 수 있는 이용내역이 없습니다.<br></p>';
+			tmtbHtml += '<p>상품권 사용내역이 없습니다.<br></p>';
 			tmtbHtml += '</div>';
 			tmtbHtml += '</div>';
 
@@ -269,7 +259,7 @@
 		if (giftcardOwnList == null) {
 			tmtbHtml2 += '<div class="nodata">';
 			tmtbHtml2 += '<div class="txt_box">';
-			tmtbHtml2 += '<p>현재 노출 할 수 있는 상품권이 없습니다.<br></p>';
+			tmtbHtml2 += '<p>보유한 상품권이 없습니다.<br></p>';
 			tmtbHtml2 += '</div>';
 			tmtbHtml2 += '</div>';
 		} else {

+ 1 - 20
src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html

@@ -314,12 +314,10 @@
 												<li>
 													<span th:text="|${deliveryAddrInfo.recipBaseAddr} ${deliveryAddrInfo.recipDtlAddr}|"></span>
 													<button type="button" class="btn btn_default btn_sm" th:if="${allCanYn == 'Y'}" onclick="fnChangeDeliveryAddr()"><span>배송지 변경</span></button>
-													<button type="button" class="btn btn_default btn_sm" th:unless="${allCanYn == 'Y'}" onclick="fnChangeDeliveryAddr()"><span>배송지 변경</span></button>
 												</li>
 												<li>
 													배송요청 사항&nbsp;:&nbsp;<span id="delvMemo" th:text="${deliveryAddrInfo.delvMemo}"></span>
-													<button type="button" class="btn_underline"th:if="${allCanYn == 'Y'}" onclick="fnChangeDeliveryMemo()"><span>변경하기</span></button>
-													<button type="button" class="btn_underline"th:unless="${allCanYn == 'Y'}" onclick="fnChangeDeliveryMemo()"><span>변경하기</span></button>
+													<button type="button" class="btn_underline" th:if="${allCanYn == 'Y'}" onclick="fnChangeDeliveryMemo()"><span>변경하기</span></button>
 												</li>
 											</ul>
 										</div>
@@ -442,26 +440,9 @@
 				<input type="hidden" name="ordNo"/>
 				<input type="hidden" name="ordDtlNo"/>
 			</form>
-			<form id="reviewForm" name="reviewForm" th:action="@{'/mypage/review/form'}" th:method="post">
-				<input type="hidden" name="ordNo"/>
-				<input type="hidden" name="ordDtlNo"/>
-			</form>
 			<!-- // CONT-BODY -->
 		</div>
 	</div>
-
-	<!-- 배송지변경 -->
-	<div class="modal fade od_pop adrsChange_pop" id="adrsChangePop" tabindex="-1" role="dialog" aria-labelledby="adrsChangeLabel" aria-hidden="true"></div>
-
-	<!-- 배송지추가 팝업 -->
-	<div class="modal fade od_pop adrsAdd_pop" id="adrsAddPop" tabindex="-1" role="dialog" aria-labelledby="adrsAddLabel" aria-hidden="true"></div>
-
-	<!-- 배송지수정 팝업 -->
-	<div class="modal fade od_pop adrsModify_pop" id="adrsModifyPop" tabindex="-1" role="dialog" aria-labelledby="adrsModifyLabel" aria-hidden="true"></div>
-
-	<!-- 배송요청사항수정 팝업 -->
-	<div class="modal fade od_pop rqstModify_pop" id="rqstModifyPop" tabindex="-1" role="dialog" aria-labelledby="rqstModifyLabel" aria-hidden="true"></div>
-
 <script src="/ux/plugins/gaga/gaga.paging.js"></script>
 <script th:inline="javascript">
 	let ordNo = [[${ordNo}]];

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

@@ -200,7 +200,7 @@
 					<input type="hidden" name="ordNo"/>
 					<input type="hidden" name="ordDtlNo"/>
 				</form>
-				<form id="reviewForm" name="reviewForm" th:action="@{'/mypage/review/form'}" th:method="post">
+				<form id="reviewForm" name="reviewForm" th:action="@{'/mypage/review/form'}" th:method="get">
 					<input type="hidden" name="ordNo"/>
 					<input type="hidden" name="ordDtlNo"/>
 				</form>
@@ -457,24 +457,24 @@
 					} else {
 						// 주문취소 버튼(입금대기, 결제완료, 상품준비중, 출고처지정, 배송준비중)
 						if (ordDtl.ordDtlStat == 'G013_10' || ordDtl.ordDtlStat == 'G013_20' || ordDtl.ordDtlStat == 'G013_30' || ordDtl.ordDtlStat == 'G013_35' || ordDtl.ordDtlStat == 'G013_40') {
-							tag += '					<p><button type="button" class="btn btn_default btn_sm" ordNo="' + ordDtl.ordNo + '" ordDtlNo="' + ordDtl.ordDtlNo + '" onclick="fnCreateChange(this, \'cancel\');"><span>주문 취소</span></button></p>\n';
+							tag += '					<p><button type="button" class="btn btn_default btn_sm" ordNo="' + ordDtl.ordNo + '" ordDtlNo="' + ordDtl.ordDtlNo + '" ordCanChgQty="' + ordDtl.ordCanChgQty + '" onclick="fnCreateChange(this, \'cancel\');"><span>주문 취소</span></button></p>\n';
 						}
 
 						// 교환신청 버튼(배송중, 출고완료, 배송완료)
 						if (ordDtl.ordDtlStat == 'G013_50' || ordDtl.ordDtlStat == 'G013_55' || ordDtl.ordDtlStat == 'G013_60') {
 							// 교환/반품 가능한 상품
 							if (ordDtl.changeableYn == 'Y' && ordDtl.returnableYn == 'Y') {
-								tag += '					<p><button type="button" class="btn btn_default btn_sm" ordNo="' + ordDtl.ordNo + '" ordDtlNo="' + ordDtl.ordDtlNo + '" supplyCompCd="' + ordDtl.supplyCompCd + '" onclick="fnCreateChange(this, \'exchange\');"><span>교환 신청</span></button></p>\n';
-								tag += '					<p><button type="button" class="btn btn_default btn_sm" ordNo="' + ordDtl.ordNo + '" ordDtlNo="' + ordDtl.ordDtlNo + '" supplyCompCd="' + ordDtl.supplyCompCd + '" onclick="fnCreateChange(this, \'return\');"><span>반품 신청</span></button></p>\n';
+								tag += '					<p><button type="button" class="btn btn_default btn_sm" ordNo="' + ordDtl.ordNo + '" ordDtlNo="' + ordDtl.ordDtlNo + '" supplyCompCd="' + ordDtl.supplyCompCd + '" ordCanChgQty="' + ordDtl.ordCanChgQty + '" onclick="fnCreateChange(this, \'exchange\');"><span>교환 신청</span></button></p>\n';
+								tag += '					<p><button type="button" class="btn btn_default btn_sm" ordNo="' + ordDtl.ordNo + '" ordDtlNo="' + ordDtl.ordDtlNo + '" supplyCompCd="' + ordDtl.supplyCompCd + '" ordCanChgQty="' + ordDtl.ordCanChgQty + '" onclick="fnCreateChange(this, \'return\');"><span>반품 신청</span></button></p>\n';
 							}
 							// 교환 신청 불가 상품
 							else if (ordDtl.changeableYn == 'N' && ordDtl.returnableYn == 'Y') {
 								tag += '					<p><button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA);"><span>1:1 문의</span></button></p>\n';
-								tag += '					<p><button type="button" class="btn btn_default btn_sm" ordNo="' + ordDtl.ordNo + '" ordDtlNo="' + ordDtl.ordDtlNo + '" supplyCompCd="' + ordDtl.supplyCompCd + '" onclick="fnCreateChange(this, \'return\');"><span>반품 신청</span></button></p>\n';
+								tag += '					<p><button type="button" class="btn btn_default btn_sm" ordNo="' + ordDtl.ordNo + '" ordDtlNo="' + ordDtl.ordDtlNo + '" supplyCompCd="' + ordDtl.supplyCompCd + '" ordCanChgQty="' + ordDtl.ordCanChgQty + '" onclick="fnCreateChange(this, \'return\');"><span>반품 신청</span></button></p>\n';
 							}
 							// 반품 신청 불가 상품
 							else if (ordDtl.changeableYn == 'Y' && ordDtl.returnableYn == 'N') {
-								tag += '					<p><button type="button" class="btn btn_default btn_sm" ordNo="' + ordDtl.ordNo + '" ordDtlNo="' + ordDtl.ordDtlNo + '" supplyCompCd="' + ordDtl.supplyCompCd + '" onclick="fnCreateChange(this, \'exchange\');"><span>교환 신청</span></button></p>\n';
+								tag += '					<p><button type="button" class="btn btn_default btn_sm" ordNo="' + ordDtl.ordNo + '" ordDtlNo="' + ordDtl.ordDtlNo + '" supplyCompCd="' + ordDtl.supplyCompCd + '" ordCanChgQty="' + ordDtl.ordCanChgQty + '" onclick="fnCreateChange(this, \'exchange\');"><span>교환 신청</span></button></p>\n';
 								tag += '					<p><button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA_REG);"><span>1:1 문의</span></button></p>\n';
 							}
 							// 교환/반품 신청 불가 상품

+ 18 - 39
src/main/webapp/WEB-INF/views/web/mypage/MypagePointForm2Web.html

@@ -66,7 +66,7 @@
 							<div class="form_field">
 								<div class="select_custom month">
 									<div class="combo">
-										<input type="hidden" name="pointDate" value="0"/>
+										<input type="hidden" name="pointDate" value="0" id="pointDate"/>
 										<div class="select"></div>
 										<ul id="searchDt" class="list">
 											
@@ -121,57 +121,36 @@
 	let accumulatePointList = [[${accumulatePointList}]];
 	let usePointList = [[${usePointList}]];
 	let allPointList = [[${allPointList}]];
-
-	// select 날짜 생성
-	var date = new Date();
-	var year = date.getFullYear();
-	var month = date.getMonth() +1;
-
+	let date = [[${date}]];
+	var year = date[0].year;
+	var month = date[0].month;
 	// TODO - 퍼블확정시
-	var oneYearAgo = year -1;
-	var twoYearAgo = year -2;
 	
 	// 이번년도
-	for(var i = 1;i <= 12; i++){
-		if(i < 10 && i != month){
-			$("#searchDt").append("<li onclick='fnChangeDate(this);' class='selected' value='"+ year + "" + 0 + i +"'>"+ year + "년" + " " + i + "월" +"</li>");
-		}
-		else if(i < 10 && i == month){
-			//셀렉트박스 이번 달 표시설정
-			$('.select').append("<li style='pointer-events: none' onclick='fnChangeDate(this);' class='selected' value='"+ year + "" + 0 + i +"'>" + year + "년" + " " + i + "월" +"</li>");
-			$("#searchDt").append("<li onclick='fnChangeDate(this);' class='selected' value='"+ year + "" + 0 + i +"'>" + year + "년" + " " + i + "월" +"</li>");
-		}
-		else if(i > 9 && i != month){
-			$("#searchDt").append("<li onclick='fnChangeDate(this);' class='selected' value='"+ year + "" + i +"'>"+ year + "년" + " " + i + "월" +"</li>");
-		}
-		else if(i > 9 && i == month){
-			$('.select').append("<li onclick='fnChangeDate(this);' class='selected' value='"+ year + ""  + i +"'>" + year + "년" + " " + i + "월" +"</li>");
-			$("#searchDt").append("<li onclick='fnChangeDate(this);' class='selected' value='"+ year + "" + i +"'>"+ year + "년" + " " + i + "월" +"</li>");
+	//동적으로 날짜 년도 append
+	function appendYear() {
+		for (var i = 0; i < date.length; i++) {
+			$("#searchDt").append(	"<li onclick='fnChangeDate(this.value)' value='"+ date[i].year + "" + date[i].month + "'>" + date[i].year	+ "년" + date[i].month + "월 </li>")
 		}
+		$(".select").append("<li class='selected' value='"+date[0].year+""+date[0].month+"'>"+ date[0].year + "년" + date[0].month + "월 </li>"); // 현재년도 선택 */ 
 	}
+	appendYear($("#searchDt"));
 
 	// 날짜변경 이벤트
 	var fnChangeDate = function(param) {
 		let url = '/mypage/allpoint/list';
 		
- 		$(param).parent().parent().find('input[name=pointDate]').val($(param).val());
- 		var pointData = $(param).parent().parent().find('input[name=pointDate]').val();
- 		
- 		if(10 > month){
- 			month = "0" + month;
- 		}
+		
+ 		//$(param).parent().parent().find('input[name=pointDate]').val($(param).val());
+ 		//var pointData = $(param).parent().parent().find('input[name=pointDate]').val();
  		
  		// 포인트화면 로딩시 이번달 설정 리스트 표시하기 위함
- 		if(pointData == null){
- 			pointData = year + "" + month;
+ 		var data = {};
+ 		if(typeof param == 'undefined'){
+ 			data.searchDt = year.toString() + "" + month.toString();
+ 		}else{
+ 			data.searchDt = param;
  		}
- 		
-		let data = {};
-		
-		data.searchDt = pointData;
-		
- 		console.log(data);
-		
 		var jsonData = JSON.stringify(data);
 		
 		gagajf.ajaxJsonSubmit('/mypage/allpoint/list', jsonData, function(result){

+ 146 - 26
src/main/webapp/WEB-INF/views/web/mypage/MypageReturnFormWeb.html

@@ -79,8 +79,8 @@
 												<span class="count"><em th:text="${return.ordQty - return.cnclRtnQty}"></em>개</span>
 											</p>
 											<p>
-												<span class="price_org" th:if="${(return.listPrice * (return.ordQty - return.cnclRtnQty)) > (return.ordAmt - return.cnclRtnAmt)}"><em th:text="${#numbers.formatInteger(return.listPrice * (return.ordQty - return.cnclRtnQty), 1, 'COMMA')}"></em>원</span>
-												<span class="price_sale"><em th:text="${#numbers.formatInteger(return.ordAmt - return.cnclRtnAmt, 1, 'COMMA')}"></em>원</span>
+												<span class="price_org" th:if="${(return.ordAmt - return.cnclRtnAmt - return.cpn1DcAmt) > (return.realOrdAmt + return.pntDcAmt + return.gfcdUseAmt)}"><em th:text="${#numbers.formatInteger(return.ordAmt - return.cnclRtnAmt - return.cpn1DcAmt, 1, 'COMMA')}"></em>원</span>
+												<span class="price_sale"><em th:text="${#numbers.formatInteger(return.realOrdAmt + return.pntDcAmt + return.gfcdUseAmt, 1, 'COMMA')}"></em>원</span>
 											</p>
 										</div>
 									</div>
@@ -127,7 +127,7 @@
 													<ul class="list">
 														<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" 추가  -->
 														<li class="selected">반품 사유를 선택하세요.</li>
-														<li th:if="${returnReason}" th:each="oneData, status : ${returnReason}" th:value="${oneData.cd}" th:text="${oneData.cdNm}" onclick="fnChangeReason(this);"></li>
+														<li th:if="${returnReason}" th:each="oneData, status : ${returnReason}" th:attr="chgReason=${oneData.cd}" th:text="${oneData.cdNm}" onclick="fnChangeReturnReason(this);"></li>
 													</ul>
 												</div>
 											</div>
@@ -138,7 +138,7 @@
 									<td>
 										<div class="form_field">
 											<div class="input_wrap">
-												<textarea class="doc_reason" name="" id="" cols="30" rows="10" placeholder="자세한 사유를 입력해주세요."  onkeyup="cfnGetTextLength(this, 200, $('#return_cnt'));" style="resize: none;"></textarea>
+												<textarea class="doc_reason" name="chgMemo" id="chgMemo" cols="30" rows="10" placeholder="자세한 사유를 입력해주세요."  onkeyup="cfnGetTextLength(this, 200, $('#return_cnt'));" style="resize: none;"></textarea>
 												<p class="txt_cnt"><span id="return_cnt" class="c_primary">0</span>/200</p>
 											</div>
 										</div>
@@ -191,11 +191,14 @@
 									</tr>
 									<tr>
 										<th>주소</th>
-										<td id="chgerAddr" th:text="|${deliveryAddrInfo.recipBaseAddr} ${deliveryAddrInfo.recipDtlAddr}|">
+										<td>
+											<th:block  th:id="chgerAddr" th:text="|${deliveryAddrInfo.recipBaseAddr} ${deliveryAddrInfo.recipDtlAddr}|"></th:block>
 											<button type="button" class="btn btn_default btn_sm" onclick="fnChangeDeliveryAddr('chger');"><span>회수지 변경</span></button>
 										</td>
+										<input type="hidden" name="chgerZipcode" th:value="${deliveryAddrInfo.chgerZipcode}">
 										<input type="hidden" name="chgerBaseAddr" th:value="${deliveryAddrInfo.recipBaseAddr}">
 										<input type="hidden" name="chgerDtlAddr" th:value="${deliveryAddrInfo.recipDtlAddr}">
+										<input type="hidden" name="chgerRtnMemo" th:value="${deliveryAddrInfo.chgerRtnMemo}">
 									</tr>
 								</tbody>
 							</table>
@@ -327,8 +330,12 @@
 <script th:inline="javascript">
 	let returnList = [[${returnList.returnList}]];
 	let oneData = [[${oneData}]];
+	let paymentInfo = [[${paymentInfo}]];
 	let usedGiftCardInfo = [[${usedGiftCardInfo}]];
 	let usedPointInfo = [[${usedPointInfo}]];
+	var isCustomer = true;
+	let jsonObj = {};
+	let addPayCost = 0;
 
 	$(document).ready(function() {
 		// 마이페이지 LNB 설정
@@ -349,13 +356,89 @@
 			$('#wdGb').css('display','none');
 		}
 	});
-	
+
 	// 반품 처리
 	var fnReturn = function() {
-		// TODO
-		// 반품신청 처리
+		let url = '/mypage/return';
+
+		// 반품 사유 체크
+		let chgReason = $('input[name=chgReason]').val();
+		if (gagajf.isNull(chgReason)) {
+			mcxDialog.alert('반품사유를 선택해주세요.');
+			return false;
+		}
+
+		// 반송 송장번호 체크
+		let wdGb = $('input[name=wdGb]:radio:checked').val();
+		let wdInvoiceNo = $('input[name=chgReason]').val();
+		if (wdGb == 'D' && gagajf.isNull(wdInvoiceNo)) {
+			mcxDialog.alert('직접 반송하신 송장번호를 입력해주세요.');
+			return false;
+		}
+
+		// 주문상세번호 및 반품 수량 설정
+		let ordDtlNoArr = [];
+		let cnclRtnReqQtyArr = [];
+		let chkQty = 0;
+		$.each($('input[name=chgQty]'), function(idx, item) {
+			let chgQty = $(item).val();
+			let ordDtlNo = $(item).attr('ordDtlNo');
+			
+			ordDtlNoArr.push(Number(ordDtlNo));
+			cnclRtnReqQtyArr.push(Number(chgQty));
+			chkQty += chgQty;
+		});
+
+		// 반품 수량 체크
+		if (chkQty == 0) {
+			mcxDialog.alert('반품하실 상품의 수량을 선택해주세요.');
+			return false;
+		}
+
+		// 환불계좌 체크
+		let accountNo = $('input[name=accountNo]').val();
+		let accountNm = $('input[name=accountNm]').val();
+		let bankCd = $('input[name=bankCd]').val();
+
+		if (paymentInfo.payMeans == 'G014_20' && paymentInfo.payStat == 'G016_00' && (gagajf.isNull(accountNo) || gagajf.isNull(accountNm) || gagajf.isNull(bankCd))) {
+			// TODO
+			// 환불계좌 등록 팝업
+			
+			return false;
+		}
+
+		// 추가배송비 PG 처리
+		if (addPayCost > 0) {
+			// TODO
+			// 추가배송비 PG 처리
+		}
+
+		let data = {};
+		data.ordNo = oneData.ordNo;
+		data.ordChgSq = 0;
+		data.chgReason = chgReason;
+		data.chgMemo = $('input[name=chgMemo]').val();
+		data.accountNo = $('input[name=accountNo]').val();
+		data.accountNm = $('input[name=accountNm]').val();
+		data.bankCd = $('input[name=bankCd]').val();
+		data.isCustomer = isCustomer;
+		data.wdGb = wdGb;
+		data.chgerNm = $('#chgerNm').text();
+		data.chgerZipcode = $('input[name=chgerZipcode]').val();
+		data.chgerBaseAddr = $('input[name=chgerBaseAddr]').val();
+		data.chgerDtlAddr = $('input[name=chgerDtlAddr]').val();
+		data.chgerPhnno = $('input[name=chgerPhnno]').val();
+		data.chgerRtnMemo = $('input[name=chgerRtnMemo]').val();
+		data.ordDtlNoArr = ordDtlNoArr;
+		data.cnclRtnReqQtyArr = cnclRtnReqQtyArr;
+
+		let jsonData = JSON.stringify(data);
+
+		gagajf.ajaxJsonSubmit(url, jsonData, function() {
+			cfnGoToPage(_PAGE_MYPAGE_CRS_LIST);
+		});
 	}
-	
+
 	// 반품 수량 변경 이벤트 처리
 	var fnChangeReturnQty = function(param) {
 		let url = '/mypage/cancel/refund/amt/calculate';
@@ -390,8 +473,8 @@
 
 			gagajf.ajaxJsonSubmit(url, jsonData, function (result) {
 				// 환불포인트, 환불상품권 금액 계산
-				let refundPoint = fnCalculatePoint(chgQtyArr, ordDtlNoArr, ordCanChgQtyArr);
-				let refundGiftCard = fnCalculateGiftCard(chgQtyArr, ordDtlNoArr, ordCanChgQtyArr);
+				let refundPoint = fnCalculatePoint(cnclRtnReqQtyArr, ordDtlNoArr, ordCanChgQtyArr);
+				let refundGiftCard = fnCalculateGiftCard(cnclRtnReqQtyArr, ordDtlNoArr, ordCanChgQtyArr);
 
 				let spanCnclRtnAmt = Number(result.spanCnclRtnAmt);
 				let sumDeliveryFee = Number(result.sumDeliveryFee);
@@ -400,13 +483,41 @@
 				let spanTmtbDcAmt = Number(result.spanTmtbDcAmt);
 				let spanPrePntDcAmt = Number(result.spanPrePntDcAmt);
 				let spanRefundAmt = Number(result.spanRefundAmt);
-				
+				let spanTotRtnDelvFee = Number(result.spanTotRtnDelvFee);
+
+				// 반품 사유 및 반품 방식 배송비 계산
+				if (result.spanRealCnclRtnAmt > 0) {
+					let wdGb = $('input[name=wdGb]:radio:checked').val();
+
+					// 회사사유 : 추가배송비 0, 반품배송비 0
+					if (!isCustomer) {
+						spanTotDeliveryFee = 0;
+						spanTotRtnDelvFee = 0;
+					}
+					// 고객사유(직접발송) : 반품배송비 0
+					else if (wdGb == 'D') {
+						spanTotRtnDelvFee = 0;
+					}
+				}
+
+				let addDelvFee = spanTotDeliveryFee + spanTotRtnDelvFee;
+
 				let goodsCancelAmt = spanCnclRtnAmt;										// 상품취소금액
-				let deliveryFee = sumDeliveryFee - spanTotDeliveryFee;						// 배송비
+				let deliveryFee = sumDeliveryFee - addDelvFee;								// 배송비
 				let deductDcAmt = 0 - spanCpnDcAmt - spanTmtbDcAmt - spanPrePntDcAmt;		// 할인금액 차감(쿠폰+다다익선+선포인트)
-				let refundPayAmt = spanRefundAmt;											// 결제금액 환불
+				let refundPayAmt = spanRefundAmt - addDelvFee;								// 결제금액 환불
 				let returnAmt = refundPayAmt + refundPoint + refundGiftCard;				// 환불예정금액
-				
+
+				// 추가배송비 영역 설정
+				if (refundPayAmt < 0) {
+					refundPayAmt = spanRefundAmt;
+					$('#addDeliveryFee').css('display', '');
+					$('#addPayCost').text(addDelvFee.addComma() + '원');
+					addPayCost = addDelvFee;
+				} else {
+					addPayCost = 0;
+				}
+
 				// 금액 설정
 				$('#returnAmt').text(returnAmt.addComma());
 				$('#goodsCancelAmt').text(goodsCancelAmt.addComma());
@@ -430,15 +541,24 @@
 			$('#chgerLocation').css('display', 'none');
 			$('#returnLocation').css('display', '');
 		}
+
+		// 환불금액 계산
+		fnChangeReturnQty();
 	});
 	
 	// 반품 사유 변경 이벤트
-	var fnChangeReason = function(param) {
-		// TODO
-		// 반품 사유 변경 처리
-		console.log($(param).val());
-		$(param).parent().parent().find('input[name=chgReason]').val($(param).val());
-		fnChangeQty();
+	var fnChangeReturnReason = function(param) {
+		var customerReasonArr = ['G688_10', 'G688_11', 'G688_12', 'G688_13', 'G688_15' , 'G688_21', 'G688_30'];
+		let chgReason = $(param).attr('chgReason');
+
+		// 귀책사유체크(취소,반품,교환)
+		isCustomer = customerReasonArr.includes(chgReason);
+
+		// 반품 사유 설정
+		$(param).parent().parent().find('input[name=chgReason]').val(chgReason);
+
+		// 환불금액 계산
+		fnChangeReturnQty();
 	}
 
 	// 환불 포인트 계산
@@ -458,19 +578,19 @@
 				}
 			}
 		});
-		
+
 		return refundPoint;
 	}
-	
+
 	// 환불 상품권 계산
 	var fnCalculateGiftCard = function(chgQtyArr, ordDtlNoArr, ordCanChgQtyArr) {
 		let refundGiftCard = 0;
-		
+
 		$.each(usedGiftCardInfo, function(idx, item) {
 			let index = ordDtlNoArr.indexOf(item.ordDtlNo);
 			let chgQty = chgQtyArr[index];
 			let ordCanChgQty = ordCanChgQtyArr[index];
-			
+
 			if (chgQty > 0) {
 				if (chgQty == ordCanChgQty) {
 					refundGiftCard += item.gfcdAmt;
@@ -479,7 +599,7 @@
 				}
 			}
 		});
-		
+
 		return refundGiftCard;
 	}
 </script>

+ 6 - 4
src/main/webapp/WEB-INF/views/web/mypage/MypageReviewCreateFormWeb.html

@@ -515,10 +515,12 @@ var reviewUpdate = function() {
 }
 var fnSaveCallback = function (result) {
 	if(result.status == "200"){
-		//포인트 예정금액 고지해야함
-		cfnGoToPage(_PAGE_MYPAGE_REVIEW);
-		
-		//mcxDialog.alert("상품 리뷰를 등록하였습니다.");
+		mcxDialog.confirm("상품리뷰를 등록 하였습니다.리뷰 등록으로 STYLE포인트 XXXP가 적립예정입니다. / 첨부파일이 업로드 된 후 등록이 가능합니다.", {
+			sureBtnText: "확인",
+			sureBtnClick: function() { 
+				cfnGoToPage(_PAGE_MYPAGE_REVIEW);
+			}
+		});
 	}
 }
 

+ 17 - 75
src/main/webapp/WEB-INF/views/web/mypage/MypageWishListFormWeb.html

@@ -54,89 +54,30 @@
 
 
 <script th:inline="javascript">
-let wishMonth = [[${wishMonth}]];
-let wishGoods = [[${wishGoods}]];
-let _mall = [[${@environment.getProperty('domain.front')}]];
-// 위시리스트 
-var wishListForm = function() {
-
-	var html = '';
-	$("#wishList").append(html);
-	if(wishMonth.length>0){
-		for (var i = 0; i < wishMonth.length; i++) {
-			html += '<div class="monthly_wish_wrap">                                                                                         ';
-			html += '	<div class="date">                                                                                                   ';
-			html += '		<span>'+wishMonth[i].regDt+'</span>                                                                              ';
-			html += '	</div>                                                                                                               ';
-			html += '	<div class="itemsGrp">                                                                                            ';
-			$.each(wishGoods, function(idx, item) {
-				html += '		<div class="item_prod">                                                                                       ';
-				html += '			<div class="item_state">                                                                                  ';
-				html += '				<button type="button" class="itemLike active" goodsCd="'+item.goodsCd+'" planDtlSq="" onclick="wishlistDelete(this)">관심상품 추가</button>                                               ';
-				html += '				<a onclick="cfnGoToGoodsDetail(\'' + item.goodsCd + '\');"  class="itemLink" >                                                                     ';
-				html += '					<div class="itemPic">                                                                             ';
-				html += '						<img alt="" class=" vLHTC pd_img" src="/images/pc/thumb/prod5.jpg">                           ';
-				html += '					</div>                                                                                            ';
-				html += '					<p class=" itemBrand">'+item.brandKnm+'</p>                                               ';
-				html += '					<div class=" itemName">'+item.goodsNm+'</div>                                             ';
-				html += '					<p class="itemPrice">' + item.currPrice.addComma();
-				if (item.currPrice != item.listPrice) {
-					html += '						<span class="itemPrice_original">'+item.listPrice.addComma() + '</span>                         ';	
-				}
-				if (item.dcRate>0) {
-					html += '						<span class=" itemPercent">'+item.dcRate+'%</span>                                     ';	
-				}
-				html += '					</p>                                                                                              ';
-				html += '					<div class="itemcolorchip">                                                                       ';
-				html += '						<span class="chip_color35" value="ABM">BEIGE</span>                                           ';
-				html += '						<span class="chip_color54" value="BDS">BLACK</span>                                           ';
-				html += '						<span class="chip_color40" value="YBR">WHITE</span>                                           ';
-				html += '					</div>                                                                                            ';
-				html += '					 <p class="itemBadge">                                                                            ';
-				html += '						<span class="badge13">베스트 </span>                                                             ';
-				html += '					</p>                                                                                              ';
-				html += '					<div class="itemComment">★ [NEW] 20FW 빅웨이브 단독발매!</div>                                            ';
-				html += '				</a>                                                                                                  ';
-				html += '			</div>                                                                                                    ';
-				html += '		</div>	                                                                                                      ';
-			});
-			html += '	</div>  																										 ';
-			html += '</div>                                                                                                                ';
-		}
-	}else{
-		html += '<div class="nodata">';
-		html += '	<div class="txt_box">';
-		html += '		<p>';
-		html += '			등록된 위시리스트가 없습니다.<br>';
-		html += '		</p>';
-		html += '	</div>';
-		html += '</div> ';
-	}
-	
-	$("#wishList").append(html);
-}
-
 // 마이페이지 위시리스트 해제
 var wishlistDelete = function(obj) {
 	mcxDialog.confirm("위시리스트를 해제하시겠습니까?", {
 		cancelBtnText : "취소",
 		sureBtnText : "확인",
 		sureBtnClick : function() {
-			
 			cfnPutWishList(obj);
-			 $.ajax({
-					type		: "GET",
-					url 		: '/mypage/wish/list',
-					dataType 	: 'html',
-					success 	: function(result) {
-						if (result != null) {
-							$("#wishList").html(result);
-						}
-					}
-				});		
-			}
+			ajaxWishList();
+		}
 	});
+}
 
+// 마이페이지 위시리스트 
+var ajaxWishList = function () {
+	 $.ajax({
+			type		: "GET",
+			url 		: '/mypage/wish/list',
+			dataType 	: 'html',
+			success 	: function(result) {
+				if (result != null) {
+					$("#wishList").html(result);
+				}
+			}
+		});		
 }
 
 $(document).ready(function() {
@@ -146,7 +87,8 @@ $(document).ready(function() {
 
 	// 마이페이지 location 설정
 	fnSetMypageLocation('위시리스트', '_PAGE_MYPAGE_WISHLIST');
-	wishListForm();
+	
+	ajaxWishList();
 
 });
 </script>

+ 2 - 2
src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html

@@ -53,6 +53,7 @@
 						</div>
 					</div>
 					<div class="cont_body">
+				
 						<div class="coner_content">
 							<div class="coner_front">
 								<div class="promotion_visual" th:if="${fsrcInfoTop != null}" th:utext="${fsrcInfoTop.fsrcPc}"></div>
@@ -83,7 +84,7 @@
 								
 							</th:block>
 							
-						
+		
 							<div class="coner_front">
 								<div class="promotion_visual" th:if="${fsrcInfoBtm != null}" th:utext="${fsrcInfoBtm.fsrcPc}"></div>
 								<!-- 하단배너 -->
@@ -186,7 +187,6 @@
 									</div>
 								</div>
 							</div>
-
 						</div>
 					</div>
 				</div>

+ 133 - 0
src/main/webapp/WEB-INF/views/web/planning/PlanningShotGuideFormWeb.html

@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : PlanningShotGuideFormWeb.html
+ * @desc    : 총알배송 Page
+ *============================================================================
+ * Pastelmall
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.3.30  	 sowon     최초 작성
+ *******************************************************************************
+ -->
+ <body>
+<th:block layout:fragment="content">
+<!--  container -->
+	<div id="container" class="container dp">
+		<div class="breadcrumb"> 
+			<ul>
+				<li class="bread_home"><a href="index.html">홈</a></li>
+				<li class="bread_2depth">총알배송</li>
+			</ul> 
+		</div>
+		<div class="wrap">
+			<div class="content wide dp_Bulletship"> <!-- 페이지특정 클래스 = dp_Bulletship -->
+				<div class="cont_head">
+					<div>
+                        <h3>총알배송</h3>
+                    </div>
+				</div>
+				<div class="cont_body">
+                     <div class="Bulletship"  th:utext="${#strings.replace(#strings.replace(shotHtml.fsrcPc,'&amplt;','<'),'&ampgt;','>')}">
+                    </div> 
+                    <div class="Bulletship_list">
+                        <div class="cont_head">
+                            <div class="bullet_sticky_nav">
+                                <ul>    
+                                    <li><a href="#brand01">모이몰른</a></li> <!-- 섹션이동 -->
+                                    <li><a href="#brand02">컬리수</a></li>
+                                </ul>
+                            </div>
+                        </div>
+                        <div class="cont_body">
+                            <div class="list_content">
+                                <div id="brand01">
+                                    <div class="item_header"> <!-- 섹션이동 -->
+                                        <h4>모이몰른</h4>
+                                    </div>
+                                    <div class="itemsGrp">
+                                        <div class="item_prod">
+                                            <div class="item_state">
+                                                <button type="button" class="itemLike">관심상품 추가</button>
+                                                <a href="#none" class="itemLink">
+                                                    <div class="rank ranker"><span>1</span></div>
+                                                    <div class="itemPic">
+                                                        <img alt="BLUE-a" class=" vLHTC pd_img" src="/images/pc/thumb/prod1.jpg">
+                                                    </div>
+                                                    <p class="itemBrand">BRAND NAME</p>
+                                                    <div class="itemName">남성 헤링본 기모 팬츠 헤링본 기모 팬츠</div>
+                                                    <p class="itemPrice">80,100
+                                                        <span class="itemPrice_original">89,000</span>
+                                                        <span class=" itemPercent">10%</span>
+                                                    </p>
+                                                    <div class="itemcolorchip">
+                                                        <span class="chip_color35" value="ABM">BEIGE</span>
+                                                        <span class="chip_color54" value="BDS">BLACK</span>
+                                                        <span class="chip_color40" value="YBR">WHITE</span>
+                                                    </div>
+                                                    <p class="itemBadge">
+                                                        <span class="badge13">베스트 </span>
+                                                    </p>
+                                                    <div class="itemComment">#주문 폭주 상품</div>
+                                                </a>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div id="brand02">
+                                    <div class="item_header" > <!-- 섹션이동 -->
+                                        <h4>컬리수</h4>
+                                    </div>
+                                    <div class="itemsGrp">
+                                        <div class="item_prod">
+                                            <div class="item_state">
+                                                <button type="button" class="itemLike">관심상품 추가</button>
+                                                <a href="#none" class="itemLink">
+                                                    <div class="rank ranker"><span>1</span></div>
+                                                    <div class="itemPic">
+                                                        <img alt="BLUE-a" class=" vLHTC pd_img" src="/images/pc/thumb/prod1.jpg">
+                                                    </div>
+                                                    <p class="itemBrand">BRAND NAME</p>
+                                                    <div class="itemName">남성 헤링본 기모 팬츠 헤링본 기모 팬츠</div>
+                                                    <p class="itemPrice">80,100
+                                                        <span class="itemPrice_original">89,000</span>
+                                                        <span class=" itemPercent">10%</span>
+                                                    </p>
+                                                    <div class="itemcolorchip">
+                                                        <span class="chip_color35" value="ABM">BEIGE</span>
+                                                        <span class="chip_color54" value="BDS">BLACK</span>
+                                                        <span class="chip_color40" value="YBR">WHITE</span>
+                                                    </div>
+                                                    <p class="itemBadge">
+                                                        <span class="badge13">베스트 </span>
+                                                    </p>
+                                                    <div class="itemComment">#주문 폭주 상품</div>
+                                                </a>
+                                            </div>
+                                        </div>             
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+		    </div>
+        </div>
+    </div>    
+	<!-- // container -->	
+<script th:inline="javascript">
+/*<![CDATA[*/
+
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 21 - 3
src/main/webapp/biz/mypage.js

@@ -145,6 +145,24 @@ var fnReSendSms = function(param) {
 
 // 반품/취소/교환 버튼 클릭 이벤트
 var fnCreateChange = function(param, gubun) {
+	let ordCanChgQty = $(param).attr('ordCanChgQty');
+
+	// 반품/취소/교환 가능 여부 체크
+	if (ordCanChgQty == 0) {
+		let str = '';
+		if (gubun == 'cancel') {
+			str = '취소 가능한 수량이 없습니다.';
+		} else if (gubun == 'return') {
+			str = '반품 가능한 수량이 없습니다.';
+		} else if (gubun == 'exchange') {
+			str = '교환 가능한 수량이 없습니다.';
+		}
+
+		mcxDialog.alert(str);
+		return false;
+	}
+
+	// 반품/취소/교환 페이지 이동
 	let ordNo = $(param).attr('ordNo');
 	let ordDtlNo = $(param).attr('ordDtlNo');
 
@@ -199,7 +217,7 @@ var fnChangeDeliveryAddr = function(param) {
 			gagajf.showProgressbar(true);
 		},
 		success 	: function(result) {
-			$("#adrsAddPop").html(result);
+			$("#adrsAddPop .modal-dialog .modal-content").html(result);
 			$("#adrsAddPop").modal("show");
 		}
 	});
@@ -229,7 +247,7 @@ $("#btn_rqstModify_pop").on("click", function(e){
 		dataType 	: "html",
 		success 	: function(result) {
 			if (result != null) {
-				$("#rqstModifyPop").html(result);
+				$("#rqstModifyPop .modal-dialog .modal-content").html(result);
 				$("#rqstModifyPop").modal("show");
 			}
 		}
@@ -256,7 +274,7 @@ var fnChangeDeliveryMemo = function() {
 		dataType 	: "html",
 		success 	: function(result) {
 			if (result != null) {
-				$("#rqstModifyPop").html(result);
+				$("#rqstModifyPop .modal-dialog .modal-content").html(result);
 				$("#rqstModifyPop").modal("show");
 			}
 		}

+ 3 - 1
src/main/webapp/ux/style24_link.js

@@ -92,6 +92,8 @@ const _PAGE_GOODS_QNA = _frontUrl + "/callcenter/goods/qna/form";						// 고객
 const _PAGE_NOTICE = _frontUrl + "/callcenter/notice/form";								// 고객센터 > 공지사항
 
 //== 기타 ==/
+const _PAGE_LOOKBOOK_MAIN = _frontUrl + "/display/lookbook/main/form";		// 룩북 메인
+const _PAGE_LOOKBOOK_DETAIL = _frontUrl + "/display/lookbook/detail/form";		// 룩북 상세
 
 
 /**********************************************************************************************/
@@ -710,7 +712,7 @@ function cfnConsentUseInfo(custNm) {
  * @access : public
  * @desc   : 로그인 확인
  * <pre>
- *		cfCheckLogin('callbackFn');
+ *		cfCheckLogin();
  * </pre>
  */
 function cfCheckLogin() {

Некоторые файлы не были показаны из-за большого количества измененных файлов