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

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

jsh77b 5 лет назад
Родитель
Сommit
b5aa44df73
27 измененных файлов с 1783 добавлено и 921 удалено
  1. 44 25
      src/main/java/com/style24/front/biz/service/TsfOrderChangeService.java
  2. 56 44
      src/main/java/com/style24/front/biz/web/TsfIndexController.java
  3. 3 65
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  4. 10 2
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  5. 74 86
      src/main/java/com/style24/front/support/controller/TsfBaseController.java
  6. 76 15
      src/main/java/com/style24/front/support/controller/TsfCustomErrorController.java
  7. 1 2
      src/main/java/com/style24/front/support/startup/TsfApplication.java
  8. 3 2
      src/main/java/com/style24/persistence/domain/Plan.java
  9. 5 5
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml
  10. 294 277
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml
  11. 3 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  12. 3 2
      src/main/resources/config/application.yml
  13. 2 0
      src/main/webapp/WEB-INF/views/mob/common/fragments/HeadMob.html
  14. 39 0
      src/main/webapp/WEB-INF/views/mob/error/404Mob.html
  15. 39 0
      src/main/webapp/WEB-INF/views/mob/error/SystemCheckMob.html
  16. 129 0
      src/main/webapp/WEB-INF/views/mob/planning/PlanningMainFormMob.html
  17. 39 0
      src/main/webapp/WEB-INF/views/web/error/404Web.html
  18. 39 0
      src/main/webapp/WEB-INF/views/web/error/SystemCheckWeb.html
  19. 14 9
      src/main/webapp/WEB-INF/views/web/mypage/MypageCancelFormWeb.html
  20. 42 36
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html
  21. 6 4
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListFormWeb.html
  22. 316 332
      src/main/webapp/WEB-INF/views/web/mypage/MypageReturnFormWeb.html
  23. 504 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageReturnFormWeb_20210329.html
  24. 37 9
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  25. 3 3
      src/main/webapp/WEB-INF/views/web/planning/PlanningMainFormWeb.html
  26. 1 2
      src/main/webapp/ux/pc/js/mypage.js
  27. 1 1
      src/main/webapp/ux/style24_link.js

+ 44 - 25
src/main/java/com/style24/front/biz/service/TsfOrderChangeService.java

@@ -46,10 +46,30 @@ public class TsfOrderChangeService {
 	 */
 	public GagaMap getCancelListForMypage(Order order) {
 		GagaMap map = new GagaMap();
+		Collection<Order> result = new ArrayList<>();
+		List<Integer> ordDtlNoList = new ArrayList<>();
+
+		for (Order tmpOrder : orderChangeDao.getCancelListForMypage(order)) {
+			// 세트상품 옵션별 배열로 담기
+			if (tmpOrder.getItemNm().contains("!@!")) {
+				tmpOrder.setItemNmArr(tmpOrder.getItemNm().split("!@!"));
+				tmpOrder.setColorNmArr(tmpOrder.getColorNm().split(","));
+				tmpOrder.setOptCd1Arr(tmpOrder.getOptCd1().split(","));
+				tmpOrder.setOptCd2Arr(tmpOrder.getOptCd2().split(","));
+			} else {
+				String[] arr = {tmpOrder.getItemNm()}, arr2 = {tmpOrder.getColorNm()}, arr3 = {tmpOrder.getOptCd1()}, arr4 = {tmpOrder.getOptCd2()};
+				tmpOrder.setItemNmArr(arr);
+				tmpOrder.setColorNmArr(arr2);
+				tmpOrder.setOptCd1Arr(arr3);
+				tmpOrder.setOptCd2Arr(arr4);
+			}
+			
+			ordDtlNoList.add(tmpOrder.getOrdDtlNo());
+			result.add(tmpOrder);
+		}
 
-		Collection<Order> result = orderChangeDao.getCancelListForMypage(order);
 		Order oneData = result.iterator().next();
-		oneData.setOrdDtlNoArr(getOrdDtlNoArr(result));
+		oneData.setOrdDtlNoArr(ordDtlNoList.stream().mapToInt(Integer::intValue).toArray());
 
 		map.set("oneData", oneData);
 		map.set("cancelList", result);
@@ -67,10 +87,30 @@ public class TsfOrderChangeService {
 	 */
 	public GagaMap getReturnListForMypage(Order order) {
 		GagaMap map = new GagaMap();
+		Collection<Order> result = new ArrayList<>();
+		List<Integer> ordDtlNoList = new ArrayList<>();
+
+		for (Order tmpOrder : orderChangeDao.getReturnListForMypage(order)) {
+			// 세트상품 옵션별 배열로 담기
+			if (tmpOrder.getItemNm().contains("!@!")) {
+				tmpOrder.setItemNmArr(tmpOrder.getItemNm().split("!@!"));
+				tmpOrder.setColorNmArr(tmpOrder.getColorNm().split(","));
+				tmpOrder.setOptCd1Arr(tmpOrder.getOptCd1().split(","));
+				tmpOrder.setOptCd2Arr(tmpOrder.getOptCd2().split(","));
+			} else {
+				String[] arr = {tmpOrder.getItemNm()}, arr2 = {tmpOrder.getColorNm()}, arr3 = {tmpOrder.getOptCd1()}, arr4 = {tmpOrder.getOptCd2()};
+				tmpOrder.setItemNmArr(arr);
+				tmpOrder.setColorNmArr(arr2);
+				tmpOrder.setOptCd1Arr(arr3);
+				tmpOrder.setOptCd2Arr(arr4);
+			}
+
+			ordDtlNoList.add(tmpOrder.getOrdDtlNo());
+			result.add(tmpOrder);
+		}
 
-		Collection<Order> result = orderChangeDao.getReturnListForMypage(order);
 		Order oneData = result.iterator().next();
-		oneData.setOrdDtlNoArr(getOrdDtlNoArr(result));
+		oneData.setOrdDtlNoArr(ordDtlNoList.stream().mapToInt(Integer::intValue).toArray());
 
 		map.set("oneData", oneData);
 		map.set("returnList", result);
@@ -78,27 +118,6 @@ public class TsfOrderChangeService {
 		return map;
 	}
 
-	/**
-	 * 마이페이지 주문상세번호 배열 처리
-	 *
-	 * @param Collection<Order>
-	 * @return int[]
-	 * @author card007
-	 * @since 2021. 03. 19
-	 */
-	private int[] getOrdDtlNoArr(Collection<Order> orderList) {
-		Order order = new Order();
-		List<Integer> ordDtlNoList = new ArrayList<>();
-		
-		for (Order tmp : orderList) {
-			ordDtlNoList.add(tmp.getOrdDtlNo());
-		}
-		
-		order.setOrdDtlNoArr(ordDtlNoList.stream().mapToInt(Integer::intValue).toArray());
-		
-		return ordDtlNoList.stream().mapToInt(Integer::intValue).toArray();
-	}
-
 	/**
 	 * 사용 상품권 정보 조회
 	 *

+ 56 - 44
src/main/java/com/style24/front/biz/web/TsfIndexController.java

@@ -4,7 +4,6 @@ import java.io.IOException;
 import java.math.BigInteger;
 import java.security.SecureRandom;
 
-import javax.servlet.RequestDispatcher;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
@@ -13,7 +12,6 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.HttpRequestMethodNotSupportedException;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -34,7 +32,6 @@ import com.style24.persistence.domain.Customer;
 import lombok.extern.slf4j.Slf4j;
 
 import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.rest.server.GagaResponseStatus;
 
 /**
  * Index Controller
@@ -67,51 +64,66 @@ public class TsfIndexController extends TsfBaseController {
 	@Autowired
 	private ObjectMapper objectMapper;
 
+//	/**
+//	 * 에러 페이지
+//	 * @return
+//	 * @author gagamel
+//	 * @throws IOException
+//	 * @since 2020. 3. 18
+//	 */
+//	@GetMapping("/error")
+//	public ModelAndView error(HttpServletRequest request, HttpServletResponse response) throws HttpRequestMethodNotSupportedException, IOException {
+//		ModelAndView mav = new ModelAndView();
+//
+//		Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
+//
+//		if (status != null) {
+//			Integer statusCode = Integer.valueOf(status.toString());
+//			log.info("statusCode: {}", statusCode);
+//
+//			if (statusCode == GagaResponseStatus.NOT_FOUND.getCode()) {
+//				mav.addObject("status", GagaResponseStatus.NOT_FOUND.getCode());
+//
+//				// 404 오류 시 잘못된 링크 유입 시 몰메인으로 이동 처리
+//				String prevRequestUri = (String)request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);
+//				log.info("prevRequestUri: {}", prevRequestUri);
+//				if (prevRequestUri.startsWith("/m")) {
+//					response.sendRedirect("/");
+//				}
+//
+//				String profiles = env.getProperty("spring.profiles.active").toLowerCase();
+//				if ("locd".equals(profiles) || "locp".equals(profiles) || "dev".equals(profiles)) {
+//					mav.addObject("message", "No mapping found for HTTP request with URI ["
+//						+ String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI)) + "]");
+//				}
+//
+//				mav.setViewName(super.getDeviceViewName("error/404"));
+//
+//				return mav;
+//			}
+//		}
+//
+//		mav.addObject("status", GagaResponseStatus.INTERNAL_SERVER_ERROR.getCode());
+//
+//		String profiles = env.getProperty("spring.profiles.active").toLowerCase();
+//		if ("locd".equals(profiles) || "locp".equals(profiles) || "dev".equals(profiles)) {
+//			mav.addObject("message", String.valueOf(request.getAttribute(RequestDispatcher.ERROR_MESSAGE)));
+//		}
+//
+//		mav.setViewName(super.getDeviceViewName("error/500"));
+//
+//		return mav;
+//	}
+
 	/**
-	 * 에러 페이지
+	 * 시스템점검중 페이지
 	 * @return
 	 * @author gagamel
-	 * @throws IOException
-	 * @since 2020. 3. 18
+	 * @since 2020. 3. 29
 	 */
-	@GetMapping("/error")
-	public ModelAndView error(HttpServletRequest request, HttpServletResponse response) throws HttpRequestMethodNotSupportedException, IOException {
-		ModelAndView mav = new ModelAndView(super.getDeviceViewName("error/500"));
-
-		Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
-
-		if (status != null) {
-			Integer statusCode = Integer.valueOf(status.toString());
-			log.info("statusCode: {}", statusCode);
-
-			if (statusCode == GagaResponseStatus.NOT_FOUND.getCode()) {
-				mav.addObject("status", GagaResponseStatus.NOT_FOUND.getCode());
-
-				// 404 오류 시 잘못된 링크 유입 시 몰메인으로 이동 처리
-				String prevRequestUri = (String)request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);
-				log.info("prevRequestUri: {}", prevRequestUri);
-				if (prevRequestUri.startsWith("/m")) {
-					response.sendRedirect("/");
-				}
-
-				String profiles = env.getProperty("spring.profiles.active").toLowerCase();
-				if ("locd".equals(profiles) || "locp".equals(profiles) || "dev".equals(profiles)) {
-					mav.addObject("message", "No mapping found for HTTP request with URI ["
-						+ String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI)) + "]");
-				}
-
-				return mav;
-			}
-		}
-
-		mav.addObject("status", GagaResponseStatus.INTERNAL_SERVER_ERROR.getCode());
-
-		String profiles = env.getProperty("spring.profiles.active").toLowerCase();
-		if ("locd".equals(profiles) || "locp".equals(profiles) || "dev".equals(profiles)) {
-			mav.addObject("message", String.valueOf(request.getAttribute(RequestDispatcher.ERROR_MESSAGE)));
-		}
-
-		return mav;
+	@GetMapping("/system/check")
+	public String systemCheck() {
+		return super.getDeviceViewName("error/SystemCheck");
 	}
 
 	/**

+ 3 - 65
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -559,70 +559,10 @@ public class TsfMypageController extends TsfBaseController {
 	 * @author card007
 	 * @since 2021. 03. 22
 	 */
-	@PostMapping("/cancel")
-	@ResponseBody
-	public GagaMap cancel(@RequestBody OrderChange cnclReq) {
-		if (cnclReq== null) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-
-		List<Order> cnclReqList = cnclReq.getCancelReqList(); // 변경요청정보
-
-		// TODO
-		// @ 결품취소로직 추가
-		// @ 주문취소시 상태값 체크
-		// @ 취소, 반품시 배송비 체크 로직 (선결제 로직)
-
-		// 1. 세션회원조회
-		int custNo = TsfSession.getInfo().getCustNo();
-
-		// 2. 환불금액계산
-		// 2021.01.19 취소신청정보를 목록 (주문상세번호, 취소/반품수량) 으로 표현
-		GagaMap result = coreOrderRefundService.cnclRtnRefundAmt(cnclReqList);
-
-		// 3. 주문변경 기본정보 설정
-		result.set("ordNo"			, cnclReq.getOrdNo());				// 주문번호
-		result.set("ordChgSq"		, cnclReq.getOrdChgSq());			// 주문변경번호
-		result.set("chgReason"		, cnclReq.getChgReason());			// 변경사유
-		result.set("chgMemo"		, cnclReq.getChgMemo());			// 변경메모
-
-		result.set("accountNo"		, cnclReq.getAccountNo());			// 환불계좌번호
-		result.set("accountNm"		, cnclReq.getAccountNm());			// 환불계좌예금주명
-		result.set("bankCd"			, cnclReq.getBankCd());				// 환불계좌은행코드
-
-		result.set("allCanYn"		, cnclReq.getAllCanYn());			// 무통장입금전 전체취소 여부
-		result.set("isCustomer"		, cnclReq.getIsCustomer());			// 변경사유 (고객, 회사)
-
-		// 4. 주문변경 회수지정보 추가
-		result.set("chgerNm"		, cnclReq.getChgerNm());			// 변경자명
-		result.set("chgerEmail"		, cnclReq.getChgerEmail());			// 변경자이메일주소
-		result.set("chgerPhnno"		, cnclReq.getChgerPhnno());			// 변경자핸드폰번호
-		result.set("chgerTelno"		, cnclReq.getChgerTelno());			// 변경자전화번호
-
-		result.set("reqGbn"			, cnclReq.getReqGbn());				// 신청구분
-
-		// 5. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL)
-		coreOrderChangeService.cnclComplete(result, custNo);
-
-		result.set("status", GagaResponseStatus.SUCCESS.getCode());
-		result.set("message", "취소 처리 되었습니다.");
-		// result.set("message", message.getMessage("SUCC_0004"));
-
-		return result;
-	}
-
-	/**
-	 * 마이페이지 전체취소신청
-	 *
-	 * @param Collection<Order>
-	 * @return GagaMap
-	 * @author card007
-	 * @since 2021. 03. 22
-	 */
 	@SuppressWarnings("unchecked")
-	@PostMapping("/cancel/all")
+	@PostMapping("/cancel")
 	@ResponseBody
-	public GagaMap cancelAll(@RequestBody OrderChange orderChange) {
+	public GagaMap cancel(@RequestBody OrderChange orderChange) {
 		if (orderChange == null) {
 			throw new IllegalStateException(message.getMessage("FAIL_1001"));
 		}
@@ -759,11 +699,9 @@ public class TsfMypageController extends TsfBaseController {
 	 * @author card007
 	 * @since 2021. 02. 26
 	 */
+	@SuppressWarnings("unchecked")
 	@PostMapping("/cancel/refund/amt/calculate")
 	@ResponseBody
-	// public GagaMap calculateRefundAmt(@RequestBody List<Order> orderList) {
-	// 	return coreOrderRefundService.cnclRtnRefundAmt(orderList);
-	// }
 	public GagaMap calculateRefundAmt(@RequestBody OrderChange orderChange) {
 		if (orderChange == null) {
 			throw new IllegalStateException(message.getMessage("FAIL_1001"));

+ 10 - 2
src/main/java/com/style24/front/biz/web/TsfPlanningController.java

@@ -3,6 +3,7 @@ package com.style24.front.biz.web;
 import java.util.Collection;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mobile.device.Device;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -74,18 +75,24 @@ public class TsfPlanningController extends TsfBaseController {
 	/**
 	 * 기획전 메인 목록
 	 * @param plan - 기획전 정보
+	 * @param device - 디바이스 정보
 	 * @return
 	 * @author gagamel
 	 * @since 2021. 3. 29
 	 */
 	@GetMapping("/main/list")
 	@ResponseBody
-	public Collection<Plan> getPlanningMainList(Plan plan) {
+	public Collection<Plan> getPlanningMainList(Plan plan, Device device) {
 		plan.setSiteCd(TscConstants.Site.STYLE24.value());
 		plan.setFrontGb(TsfSession.getFrontGb());
 		plan.setCustGb(TsfSession.getCustGb());
 		plan.setCustNo(TsfSession.isLogin() ? TsfSession.getInfo().getCustNo() : 0);
-		plan.setMaxRow(2);
+
+		if (device.isNormal()) {
+			plan.setMaxRow(2); // PC웹은 2개
+		} else {
+			plan.setMaxRow(3); // 모바일은 3개
+		}
 
 		return planningService.getPlanningMainList(plan);
 	}
@@ -130,6 +137,7 @@ public class TsfPlanningController extends TsfBaseController {
 		plan.setCustNo(TsfSession.isLogin() ? TsfSession.getInfo().getCustNo() : 0);
 		
 		// 기본 set
+		plan.setExceptPlanSq(planSq);
 		plan.setPlanSq(planSq);
 		review.setPlanSq(planSq);
 		coupon.setPlanSq(planSq);

+ 74 - 86
src/main/java/com/style24/front/support/controller/TsfBaseController.java

@@ -1,7 +1,5 @@
 package com.style24.front.support.controller;
 
-import java.sql.SQLException;
-import java.sql.SQLRecoverableException;
 import java.util.Collection;
 import java.util.Set;
 
@@ -11,9 +9,6 @@ import javax.validation.Validation;
 import javax.validation.Validator;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.apache.ibatis.binding.BindingException;
-import org.springframework.beans.TypeMismatchException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.propertyeditors.StringTrimmerEditor;
 import org.springframework.core.env.Environment;
@@ -22,15 +17,9 @@ 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.security.access.AccessDeniedException;
 import org.springframework.util.Assert;
-import org.springframework.validation.FieldError;
-import org.springframework.web.HttpRequestMethodNotSupportedException;
-import org.springframework.web.bind.MethodArgumentNotValidException;
-import org.springframework.web.bind.MissingServletRequestParameterException;
 import org.springframework.web.bind.WebDataBinder;
 import org.springframework.web.bind.annotation.ControllerAdvice;
-import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.InitBinder;
 import org.springframework.web.bind.annotation.ModelAttribute;
 import org.springframework.web.bind.annotation.ResponseBody;
@@ -38,7 +27,6 @@ import org.springframework.web.context.request.RequestAttributes;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
-import com.fasterxml.jackson.databind.JsonMappingException;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.front.support.env.TsfConstants;
 import com.style24.front.support.security.session.TsfSession;
@@ -195,80 +183,80 @@ public class TsfBaseController {
 		return GagaResponse.error(GagaResponseStatus.FAIL.getCode(), message);
 	}
 
-	@ExceptionHandler(AccessDeniedException.class)
-	@ResponseBody
-	public GagaResponse handleForbidden(Exception e) {
-		return GagaResponse.error(GagaResponseStatus.FORBIDDEN.getCode(), e.getMessage());
-	}
-
-	@ExceptionHandler(TypeMismatchException.class)
-	@ResponseBody
-	public GagaResponse handleBadRequestException(Exception e) {
-		errorLogging(e);
-		return GagaResponse.error(GagaResponseStatus.BAD_REQUEST.getCode(), e.getMessage());
-	}
-
-	@ExceptionHandler(MissingServletRequestParameterException.class)
-	@ResponseBody
-	public GagaResponse handleRequestParameterException(MissingServletRequestParameterException e) {
-		errorLogging(e);
-		return GagaResponse.error(GagaResponseStatus.BAD_REQUEST.getCode(), e.getMessage());
-	}
-
-	/**
-	 * HttpRequestMethodNotSupportedException Handler
-	 * @param e - HttpRequestMethodNotSupportedException, SQLRecoverableException
-	 * @return forwarding URI
-	 */
-	@ExceptionHandler({HttpRequestMethodNotSupportedException.class, SQLRecoverableException.class})
-	public String handleException(HttpRequestMethodNotSupportedException e) {
-		return "forward:/error/500";
-	}
-
-	@ExceptionHandler(Throwable.class)
-	@ResponseBody
-	public GagaResponse handleException(Throwable throwable) {
-		errorLogging(throwable);
-
-		Throwable rootCause = ExceptionUtils.getRootCause(throwable);
-
-		if (rootCause != null) {
-			throwable = rootCause;
-		}
-
-		if (throwable instanceof SQLException || throwable instanceof BindingException ||
-			throwable instanceof JsonMappingException) {
-			String message = String.format("데이터 처리중 에러가 발생하였습니다. 시스템 관리자에게 문의하세요.");
-			return GagaResponse.error(GagaResponseStatus.INTERNAL_SERVER_ERROR.getCode(), message);
-		}
-
-		return GagaResponse.error(GagaResponseStatus.INTERNAL_SERVER_ERROR.getCode(), throwable.getMessage());
-	}
-
-	private void errorLogging(Throwable throwable) {
-		if (log.isErrorEnabled()) {
-			Throwable rootCause = ExceptionUtils.getRootCause(throwable);
-
-			if (rootCause != null) {
-				throwable = rootCause;
-			}
-
-			if (throwable.getMessage() != null) {
-				log.error(throwable.getMessage(), throwable);
-			} else {
-				log.error("ERROR", throwable);
-			}
-		}
-	}
-
-	@ExceptionHandler(MethodArgumentNotValidException.class)
-	@ResponseBody
-	public Object processValidationError(MethodArgumentNotValidException ex) {
-		FieldError fieldError = ex.getBindingResult().getFieldErrors().get(0);
-		GagaResponse error = GagaResponse.error(GagaResponseStatus.INTERNAL_SERVER_ERROR.getCode(), fieldError.getDefaultMessage());
-		error.getError().setRequiredKey(fieldError.getField());
-		return error;
-	}
+//	@ExceptionHandler(AccessDeniedException.class)
+//	@ResponseBody
+//	public GagaResponse handleForbidden(Exception e) {
+//		return GagaResponse.error(GagaResponseStatus.FORBIDDEN.getCode(), e.getMessage());
+//	}
+//
+//	@ExceptionHandler(TypeMismatchException.class)
+//	@ResponseBody
+//	public GagaResponse handleBadRequestException(Exception e) {
+//		errorLogging(e);
+//		return GagaResponse.error(GagaResponseStatus.BAD_REQUEST.getCode(), e.getMessage());
+//	}
+//
+//	@ExceptionHandler(MissingServletRequestParameterException.class)
+//	@ResponseBody
+//	public GagaResponse handleRequestParameterException(MissingServletRequestParameterException e) {
+//		errorLogging(e);
+//		return GagaResponse.error(GagaResponseStatus.BAD_REQUEST.getCode(), e.getMessage());
+//	}
+//
+//	/**
+//	 * HttpRequestMethodNotSupportedException Handler
+//	 * @param e - HttpRequestMethodNotSupportedException, SQLRecoverableException
+//	 * @return forwarding URI
+//	 */
+//	@ExceptionHandler({HttpRequestMethodNotSupportedException.class, SQLRecoverableException.class})
+//	public String handleException(HttpRequestMethodNotSupportedException e) {
+//		return "forward:/error";
+//	}
+//
+//	@ExceptionHandler(Throwable.class)
+//	@ResponseBody
+//	public GagaResponse handleException(Throwable throwable) {
+//		errorLogging(throwable);
+//
+//		Throwable rootCause = ExceptionUtils.getRootCause(throwable);
+//
+//		if (rootCause != null) {
+//			throwable = rootCause;
+//		}
+//
+//		if (throwable instanceof SQLException || throwable instanceof BindingException ||
+//			throwable instanceof JsonMappingException) {
+//			String message = String.format("데이터 처리중 에러가 발생하였습니다. 시스템 관리자에게 문의하세요.");
+//			return GagaResponse.error(GagaResponseStatus.INTERNAL_SERVER_ERROR.getCode(), message);
+//		}
+//
+//		return GagaResponse.error(GagaResponseStatus.INTERNAL_SERVER_ERROR.getCode(), throwable.getMessage());
+//	}
+//
+//	private void errorLogging(Throwable throwable) {
+//		if (log.isErrorEnabled()) {
+//			Throwable rootCause = ExceptionUtils.getRootCause(throwable);
+//
+//			if (rootCause != null) {
+//				throwable = rootCause;
+//			}
+//
+//			if (throwable.getMessage() != null) {
+//				log.error(throwable.getMessage(), throwable);
+//			} else {
+//				log.error("ERROR", throwable);
+//			}
+//		}
+//	}
+//
+//	@ExceptionHandler(MethodArgumentNotValidException.class)
+//	@ResponseBody
+//	public Object processValidationError(MethodArgumentNotValidException ex) {
+//		FieldError fieldError = ex.getBindingResult().getFieldErrors().get(0);
+//		GagaResponse error = GagaResponse.error(GagaResponseStatus.INTERNAL_SERVER_ERROR.getCode(), fieldError.getDefaultMessage());
+//		error.getError().setRequiredKey(fieldError.getField());
+//		return error;
+//	}
 
 	/**
 	 * Custom Validation using group class

+ 76 - 15
src/main/java/com/style24/front/support/controller/TsfCustomErrorController.java

@@ -1,32 +1,93 @@
 package com.style24.front.support.controller;
 
-import org.springframework.boot.web.servlet.error.ErrorController;
+import java.io.IOException;
+import java.util.Map;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController;
+import org.springframework.boot.web.error.ErrorAttributeOptions;
+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.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * Custom Error Controller
- * 		1. Disabling the Whitelabel Error Page
- * 			- application.yml 파일에 다음을 추가
- * 				server.error.whitelabel.enabled=false
- * 			
- * 			or
- * 
- * 			- ~Application.java 파일에 다음을 추가
- * 				@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class})
- * 
- * 		2. Create a Custom ErrorController
- * 			you have to create a class that implements the ErrorController interface.
- * 			And overrides its getErrorPath() to return a custom path to call when an error occurred.
+ * 		Disabling the Whitelabel Error Page
+ * 		- application.yml 파일에 다음을 추가
+ * 			server.error.path='/error'
+ * 			server.error.whitelabel.enabled=false
  * 
  * @author gagamel
  * @since 2020. 9. 11
  */
 @Controller
-public class TsfCustomErrorController implements ErrorController {
+@RequestMapping("${server.error.path:${error.path:/error}}")
+@Slf4j
+public class TsfCustomErrorController extends AbstractErrorController {
+
+	public TsfCustomErrorController(ErrorAttributes errorAttributes) {
+		super(errorAttributes);
+	}
 
 	@Override
 	public String getErrorPath() {
-		return "/error";
+		return this.getErrorPath();
+	}
+
+	/**
+	 * HTML로 응답을 주는 경우의 처리
+	 * @param request - HttpServletRequest
+	 * @param response - HttpServletResponse
+	 * @return
+	 * @throws IOException
+	 */
+	@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
+	public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) throws IOException {
+		HttpStatus status = this.getStatus(request);
+		log.error("status.value(): {}", status.value());
+
+		Map<String, Object> model = this.getErrorAttributes(request, ErrorAttributeOptions.defaults());
+
+		response.setStatus(status.value());
+		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);
+		}
+
+		Object oExceptionType = request.getAttribute(RequestDispatcher.ERROR_EXCEPTION_TYPE);
+		if (oExceptionType != null) {
+			String exceptionType = oExceptionType.toString();
+			log.error("ERROR_EXCEPTION_TYPE: {}", exceptionType);
+
+			// 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("mob/error/500Mob", model);
+	}
+
+	/**
+	 * HTML 외의 응답이 필요한 경우의 처리
+	 * @param request - HttpServletRequest
+	 * @return
+	 */
+	@RequestMapping
+	public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
+		Map<String, Object> body = this.getErrorAttributes(request, ErrorAttributeOptions.defaults());
+		HttpStatus status = this.getStatus(request);
+		return new ResponseEntity<>(body, status);
 	}
 
 }

+ 1 - 2
src/main/java/com/style24/front/support/startup/TsfApplication.java

@@ -10,7 +10,6 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
-import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration;
 import org.springframework.cache.annotation.EnableCaching;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
@@ -29,7 +28,7 @@ import com.gagaframework.web.core.GagaConstants;
  */
 @EnableCaching
 @Configuration
-@EnableAutoConfiguration(exclude = {DataSourceTransactionManagerAutoConfiguration.class, DataSourceAutoConfiguration.class, ErrorMvcAutoConfiguration.class})
+@EnableAutoConfiguration(exclude = {DataSourceTransactionManagerAutoConfiguration.class, DataSourceAutoConfiguration.class})
 @ComponentScan(basePackages = {GagaConstants.GAGA_PACKAGE, TscConstants.BASE_PACKAGE})
 @Slf4j
 public class TsfApplication {

+ 3 - 2
src/main/java/com/style24/persistence/domain/Plan.java

@@ -302,7 +302,8 @@ public class Plan extends TscBaseDomain {
 
 	Collection<Plan> planningGoodsList;	//베너별 상품목록
 
-	private String likeIt;	// 위시리스트담은상품
-	private int maxRow;		// 최대ROW수
+	private String likeIt;			// 위시리스트담은상품
+	private int maxRow;				// 최대ROW수
+	private Integer exceptPlanSq;	// 제외할기획전번호
 
 }

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

@@ -86,7 +86,8 @@
 					 , ODI.OPT_CD2
 					 , G.LIST_PRICE
 		             , G.GOODS_TYPE
-					 , GI.SYS_IMG_NM
+		             , CASE WHEN G.GOODS_TYPE != 'G056_S' AND G.SELF_GOODS_YN = 'Y' THEN (SELECT SYS_IMG_NM FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y' LIMIT 1)
+		                    ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y' LIMIT 1) END AS SYS_IMG_NM
 					 , OD.ORD_DTL_STAT
 					 , OD.ORD_QTY
 					 , OD.CNCL_RTN_QTY
@@ -135,10 +136,6 @@
 				   AND R.ORD_DTL_NO = OD.ORD_DTL_NO
 				  LEFT OUTER JOIN TB_DELIVERY_ADDR DA
 				    ON DA.DELV_ADDR_SQ = OD.DELV_ADDR_SQ
-				  LEFT OUTER JOIN TB_GOODS_IMG GI
-				    ON OD.GOODS_CD = GI.GOODS_CD
-				   AND ODI.OPT_CD1 = GI.COLOR_CD
-				   AND GI.DEFAULT_IMG_YN = 'Y'
 				  LEFT OUTER JOIN TB_GOODS_RES_SELL GRS
 				    ON GRS.GOODS_CD = OD.GOODS_CD
 				  LEFT OUTER JOIN (SELECT OD.ORD_DTL_NO
@@ -179,6 +176,9 @@
 					#{item}
 				</foreach>
 			</if>
+			<if test="ordDtlStat != null and ordDtlStat != ''">
+		   AND OD.ORD_DTL_STAT = #{ordDtlStat}
+			</if>
 		   AND O.DISP_YN = 'Y'
 		   AND OD.ORD_QTY - OD.CNCL_RTN_QTY > 0
 		</where>

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

@@ -18,133 +18,294 @@
 	<!-- 마이페이지 취소 목록 조회 -->
 	<select id="getCancelListForMypage" parameterType="Order" resultType="Order">
 		/* TscOrderChange.getCancelListForMypage */
-		SELECT O.ORD_NO
-		     , DATE_FORMAT(O.ORD_DT, '%Y.%m.%d')				AS ORD_DT
-		     , O.CUST_NO
-		     , OD.ORD_DTL_NO
-		     , OD.ORD_DTL_STAT
-		     , FN_GET_CODE_NM('G013', OD.ORD_DTL_STAT)			AS ORD_DTL_STAT_NM
-		     , OD.ORD_EXCH_GB
-		     , CASE WHEN OD.ORD_DTL_STAT IN ('G013_20', 'G013_30', 'G013_40') THEN 'Y'
-					ELSE 'N'
-				END												AS ALL_CAN_YN
-		     , OD.GOODS_CD
-		     , G1.GOODS_NM
-		     , G1.GOODS_TYPE
-		     , G1.LIST_PRICE
-		     , FN_GET_CODE_NM('G056', G1.GOODS_TYPE)			AS GOODS_TYPE_NM
-		     , G2.GOODS_CD										AS ITEM_CD
-		     , G2.GOODS_NM										AS ITEM_NM
-		     , ODI.ORD_DTL_ITEM_SQ
-		     , ODI.OPT_CD
-		     , ODI.OPT_CD1
-		     , ODI.OPT_CD2
-		     , ODI.ITEM_QTY
-		     , ODI.ITEM_PRICE
-		     , ODI.OPT_ADD_PRICE
-		     , ODI.ORD_AMT
-		     , ODI.CNCL_RTN_AMT
-		     , ODI.CPN1_DC_AMT
-		     , ODI.TMTB1_DC_AMT
-		     , ODI.TMTB2_DC_AMT
-		     , ODI.GOODS_CPN_DC_AMT
-		     , ODI.CART_CPN_DC_AMT
-		     , ODI.PNT_DC_AMT
-		     , ODI.PRE_PNT_DC_AMT
-		     , ODI.GFCD_USE_AMT
-		     , ODI.REAL_ORD_AMT
-		     , GI.SYS_IMG_NM
-		     , OD.ORD_QTY
-		     , OD.CNCL_RTN_QTY
-		     , CASE WHEN OCD.ORD_REQ_CHG_QTY IS NULL THEN 0
-					ELSE OCD.ORD_REQ_CHG_QTY * ODI.ITEM_QTY
-				END												AS ORD_REQ_CHG_QTY
-		     , OD.ORD_QTY - OD.CNCL_RTN_QTY - IF(OCD.ORD_REQ_CHG_QTY IS NULL, 0, OCD.ORD_REQ_CHG_QTY * ODI.ITEM_QTY) AS ORD_CAN_CHG_QTY
-		     , OD.SAVE_PNT_AMT
-		     , OD.SHIP_COMP_CD
-		     , OD.GIFT_PACK_YN
-		     , FN_GET_SUPPLY_COMP_NM(OD.SUPPLY_COMP_CD)			AS SUPPLY_COMP_NM
-		     , OD.INVOICE_NO
-		     , OD.SUPPLY_COMP_CD
-		     , OD.DELV_FEE_CD
-		     , OD.SHOT_DELV_YN
-		     , G1.SELF_GOODS_YN
-		     , CONCAT(B.BRAND_ENM, ' ', B.BRAND_KNM)			AS BRAND_NM
-		     , P.PAY_MEANS
-		     , P.PAY_STAT
-		  FROM TB_ORDER O
-		 INNER JOIN TB_ORDER_DETAIL OD
-		    ON O.ORD_NO = OD.ORD_NO
-		 INNER JOIN TB_ORDER_DETAIL_ITEM ODI
-		    ON OD.ORD_NO = ODI.ORD_NO
-		   AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
-		 INNER JOIN TB_GOODS G1
-		    ON OD.GOODS_CD = G1.GOODS_CD
-		 INNER JOIN TB_GOODS G2
-		    ON ODI.ITEM_CD = G2.GOODS_CD
-		 INNER JOIN TB_BRAND B
-		    ON B.BRAND_CD = G1.BRAND_CD
-		 INNER JOIN TB_PAYMENT P
-		    ON OD.ORD_NO = P.ORD_NO
-		   AND P.PAY_STAT IN ('G016_30', 'G016_00')
-		   AND P.PAY_GB = 'O'
-		  LEFT OUTER JOIN (SELECT OD.ORD_DTL_NO
-								, SUM(OCD.CHG_QTY) AS ORD_REQ_CHG_QTY
-							 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'
-							  AND OCD.CHG_STAT IN ('G685_20', 'G685_30', 'G685_33', 'G685_40')
-							GROUP BY OCD.ORD_DTL_NO
-						  ) OCD
-		    ON OD.ORD_DTL_NO = OCD.ORD_DTL_NO
-		  LEFT OUTER JOIN TB_GOODS_IMG GI
-		    ON OD.GOODS_CD = GI.GOODS_CD
-		   AND ODI.OPT_CD1 = GI.COLOR_CD
-		   AND GI.DEFAULT_IMG_YN = 'Y'
-		 WHERE O.ORD_NO = #{ordNo}
-		   AND OD.ORD_DTL_STAT IN ('G013_10', 'G013_11', 'G013_20', 'G013_30')
+		SELECT GROUP_CONCAT(Z.ITEM_NM ORDER BY Z.ORD_DTL_ITEM_SQ SEPARATOR '!@!') AS ITEM_NM
+		     , GROUP_CONCAT(Z.COLOR_NM ORDER BY Z.ORD_DTL_ITEM_SQ) AS COLOR_NM
+		     , GROUP_CONCAT(Z.OPT_CD1 ORDER BY Z.ORD_DTL_ITEM_SQ) AS OPT_CD1
+		     , GROUP_CONCAT(Z.OPT_CD2 ORDER BY Z.ORD_DTL_ITEM_SQ) AS OPT_CD2
+		     , Z.ORD_NO
+		     , Z.ORD_DT
+		     , Z.GIFT_ADDR_INP_YN
+		     , Z.ORD_DTL_NO
+		     , Z.ORD_EXCH_GB
+		     , Z.GOODS_CD
+		     , Z.GOODS_NM
+		     , Z.LIST_PRICE
+		     , Z.GOODS_TYPE
+		     , 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.RETURNABLE_YN
+		     , Z.SELF_GOODS_YN
+		     , Z.BRAND_NM
+		     , Z.ORD_REQ_CHG_QTY
+		     , Z.ORD_CAN_CHG_QTY
+		     , Z.BANK_CD
+		     , Z.ACCOUNT_NO
+		     , Z.ACCOUNT_NM
+		  FROM (SELECT O.ORD_NO
+		             , DATE_FORMAT(O.ORD_DT, '%Y.%m.%d')                                AS ORD_DT
+		             , OD.ORD_DTL_NO
+		             , OD.ORD_EXCH_GB
+		             , OD.GOODS_CD
+		             , OD.GIFT_ADDR_INP_YN
+		             , G.GOODS_NM
+		             , IFNULL((SELECT COLOR_KNM FROM TB_COLOR C WHERE COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G.MAIN_COLOR_CD ) AND USE_YN  = 'Y'), ODI.OPT_CD1) AS COLOR_NM
+		             , (SELECT GOODS_NM FROM TB_GOODS WHERE GOODS_CD = ODI.ITEM_CD)     AS ITEM_NM
+		             , ODI.ORD_DTL_ITEM_SQ
+		             , ODI.OPT_CD1
+		             , ODI.OPT_CD2
+		             , G.LIST_PRICE
+		             , G.GOODS_TYPE
+		             , CASE WHEN G.GOODS_TYPE != 'G056_S' AND G.SELF_GOODS_YN = 'Y' THEN (SELECT SYS_IMG_NM FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y' LIMIT 1)
+		                    ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y' LIMIT 1) END AS SYS_IMG_NM
+		             , OD.ORD_DTL_STAT
+		             , OD.ORD_QTY
+		             , OD.CNCL_RTN_QTY
+		             , OD.ORD_AMT
+		             , OD.REAL_ORD_AMT
+		             , OD.SAVE_PNT_AMT
+		             , OD.CNCL_RTN_AMT
+		             , OD.PNT_DC_AMT
+		             , OD.GFCD_USE_AMT
+		             , OD.SHIP_COMP_CD
+		             , OD.GIFT_PACK_YN
+		             , (SELECT SHIP_COMP_NM
+		                  FROM TB_SHIP_COMPANY Z
+		                 WHERE Z.SHIP_COMP_CD = OD.SHIP_COMP_CD)                        AS SHIP_COMP_NM
+		             , OD.INVOICE_NO
+		             , OD.SUPPLY_COMP_CD
+		             , OD.DELV_FEE_CD
+		             , OD.SHOT_DELV_YN
+		             , OD.CHANGEABLE_YN
+		             , OD.RETURNABLE_YN
+		             , G.SELF_GOODS_YN
+		             , CONCAT(B.BRAND_ENM, ' ', B.BRAND_KNM)                            AS BRAND_NM
+		             , CASE WHEN OCD.ORD_REQ_CHG_QTY IS NULL THEN 0
+		                    ELSE OCD.ORD_REQ_CHG_QTY * ODI.ITEM_QTY
+		                END                                                             AS ORD_REQ_CHG_QTY
+		             , OD.ORD_QTY - OD.CNCL_RTN_QTY - IF(OCD.ORD_REQ_CHG_QTY IS NULL, 0, OCD.ORD_REQ_CHG_QTY * ODI.ITEM_QTY) AS ORD_CAN_CHG_QTY
+		             , CA.BANK_CD
+		             , CA.ACCOUNT_NO
+		             , CA.ACCOUNT_NM
+		          FROM TB_ORDER O
+		         INNER JOIN TB_ORDER_DETAIL OD
+		            ON O.ORD_NO = OD.ORD_NO
+		           AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25', 'G013_97', 'G013_98', 'G013_99')
+		         INNER JOIN TB_ORDER_DETAIL_ITEM ODI
+		            ON OD.ORD_NO = ODI.ORD_NO
+		           AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		           AND ODI.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25', 'G013_97', 'G013_98', 'G013_99')
+		         INNER JOIN TB_GOODS G
+		            ON OD.GOODS_CD = G.GOODS_CD
+		         INNER JOIN TB_BRAND B
+		            ON B.BRAND_CD = G.BRAND_CD
+		          LEFT OUTER JOIN (SELECT OD.ORD_DTL_NO
+		                                , SUM(OCD.CHG_QTY) AS ORD_REQ_CHG_QTY
+		                             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'
+		                              AND OCD.CHG_STAT IN ('G685_20', 'G685_30', 'G685_33', 'G685_40')
+		                            GROUP BY OCD.ORD_DTL_NO
+		                          ) OCD
+		            ON OD.ORD_DTL_NO = OCD.ORD_DTL_NO
+		          LEFT OUTER JOIN TB_CUST_ACCOUNT CA
+		            ON O.CUST_NO = CA.CUST_NO
+		         WHERE O.ORD_NO = #{ordNo}
+		           AND OD.ORD_DTL_STAT IN ('G013_10', 'G013_11', 'G013_20', 'G013_30')
 		<choose>
 			<when test='custNo != null and custNo != ""'>
-		   AND O.CUST_NO = #{custNo}
+		           AND O.CUST_NO = #{custNo}
 			</when>
 			<otherwise>
-		   AND O.ORD_NO = #{ordNo}
-		   AND O.ORD_NM = #{orderNm}
+		           AND O.ORD_NO = #{ordNo}
+		           AND O.ORD_NM = #{orderNm}
 			</otherwise>
 		</choose>
-		   AND O.DISP_YN = 'Y'
-		 ORDER BY OD.ORD_DTL_NO
+		           AND O.DISP_YN = 'Y'
+		           AND OD.ORD_QTY - OD.CNCL_RTN_QTY > 0
+		       ) Z
+		 GROUP BY Z.ORD_NO, Z.ORD_DT, Z.GIFT_ADDR_INP_YN, Z.ORD_DTL_NO, Z.ORD_EXCH_GB
+		        , 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_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>
 
 	<!-- 마이페이지 반품 목록 조회 -->
 	<select id="getReturnListForMypage" parameterType="Order" resultType="Order">
 		/* TscOrderChange.getReturnListForMypage */
+		SELECT GROUP_CONCAT(Z.ITEM_NM ORDER BY Z.ORD_DTL_ITEM_SQ SEPARATOR '!@!') AS ITEM_NM
+		     , GROUP_CONCAT(Z.COLOR_NM ORDER BY Z.ORD_DTL_ITEM_SQ) AS COLOR_NM
+		     , GROUP_CONCAT(Z.OPT_CD1 ORDER BY Z.ORD_DTL_ITEM_SQ) AS OPT_CD1
+		     , GROUP_CONCAT(Z.OPT_CD2 ORDER BY Z.ORD_DTL_ITEM_SQ) AS OPT_CD2
+		     , Z.ORD_NO
+		     , Z.ORD_DT
+		     , Z.GIFT_ADDR_INP_YN
+		     , Z.ORD_DTL_NO
+		     , Z.ORD_EXCH_GB
+		     , Z.GOODS_CD
+		     , Z.GOODS_NM
+		     , Z.LIST_PRICE
+		     , Z.GOODS_TYPE
+		     , 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.RETURNABLE_YN
+		     , Z.SELF_GOODS_YN
+		     , Z.BRAND_NM
+		     , Z.ORD_REQ_CHG_QTY
+		     , Z.ORD_CAN_CHG_QTY
+		     , Z.BANK_CD
+		     , Z.ACCOUNT_NO
+		     , Z.ACCOUNT_NM
+		  FROM (SELECT O.ORD_NO
+		             , DATE_FORMAT(O.ORD_DT, '%Y.%m.%d')                                      AS ORD_DT
+		             , OD.ORD_DTL_NO
+		             , OD.ORD_EXCH_GB
+		             , OD.GOODS_CD
+		             , OD.GIFT_ADDR_INP_YN
+		             , G.GOODS_NM
+		             , IFNULL((SELECT COLOR_KNM FROM TB_COLOR C WHERE COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G.MAIN_COLOR_CD ) AND USE_YN  = 'Y'), ODI.OPT_CD1) AS COLOR_NM
+		             , (SELECT GOODS_NM FROM TB_GOODS WHERE GOODS_CD = ODI.ITEM_CD)           AS ITEM_NM
+		             , ODI.ORD_DTL_ITEM_SQ
+		             , ODI.OPT_CD1
+		             , ODI.OPT_CD2
+		             , G.LIST_PRICE
+		             , G.GOODS_TYPE
+		             , CASE WHEN G.GOODS_TYPE != 'G056_S' AND G.SELF_GOODS_YN = 'Y' THEN (SELECT SYS_IMG_NM FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y' LIMIT 1)
+		                    ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(G.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y' LIMIT 1) END AS SYS_IMG_NM
+		             , OD.ORD_DTL_STAT
+		             , OD.ORD_QTY
+		             , OD.CNCL_RTN_QTY
+		             , OD.ORD_AMT
+		             , OD.REAL_ORD_AMT
+		             , OD.SAVE_PNT_AMT
+		             , OD.CNCL_RTN_AMT
+		             , OD.PNT_DC_AMT
+		             , OD.GFCD_USE_AMT
+		             , OD.SHIP_COMP_CD
+		             , OD.GIFT_PACK_YN
+		             , (SELECT SHIP_COMP_NM
+		                  FROM TB_SHIP_COMPANY Z
+		                 WHERE Z.SHIP_COMP_CD = OD.SHIP_COMP_CD)                              AS SHIP_COMP_NM
+		             , OD.INVOICE_NO
+		             , OD.SUPPLY_COMP_CD
+		             , OD.DELV_FEE_CD
+		             , OD.SHOT_DELV_YN
+		             , OD.CHANGEABLE_YN
+		             , OD.RETURNABLE_YN
+		             , G.SELF_GOODS_YN
+		             , CONCAT(B.BRAND_ENM, ' ', B.BRAND_KNM)                                  AS BRAND_NM
+		             , CASE WHEN OCD.ORD_REQ_CHG_QTY IS NULL THEN 0
+		                    ELSE OCD.ORD_REQ_CHG_QTY * ODI.ITEM_QTY
+		                END                                                                   AS ORD_REQ_CHG_QTY
+		             , OD.ORD_QTY - OD.CNCL_RTN_QTY - IF(OCD.ORD_REQ_CHG_QTY IS NULL, 0, OCD.ORD_REQ_CHG_QTY * ODI.ITEM_QTY) AS ORD_CAN_CHG_QTY
+		             , CA.BANK_CD
+		             , CA.ACCOUNT_NO
+		             , CA.ACCOUNT_NM
+		          FROM TB_ORDER O
+		         INNER JOIN TB_ORDER_DETAIL OD
+		            ON O.ORD_NO = OD.ORD_NO
+		           AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25', 'G013_97', 'G013_98', 'G013_99')
+		         INNER JOIN TB_ORDER_DETAIL_ITEM ODI
+		            ON OD.ORD_NO = ODI.ORD_NO
+		           AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		           AND ODI.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25', 'G013_97', 'G013_98', 'G013_99')
+		         INNER JOIN TB_GOODS G
+		            ON OD.GOODS_CD = G.GOODS_CD
+		         INNER JOIN TB_BRAND B
+		            ON B.BRAND_CD = G.BRAND_CD
+		          LEFT OUTER JOIN (SELECT OD.ORD_DTL_NO
+		                                , SUM(OCD.CHG_QTY) AS ORD_REQ_CHG_QTY
+		                             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'
+		                              AND OCD.CHG_STAT IN ('G685_20', 'G685_30', 'G685_33', 'G685_40')
+		                            GROUP BY OCD.ORD_DTL_NO
+		                          ) OCD
+		            ON OD.ORD_DTL_NO = OCD.ORD_DTL_NO
+		          LEFT OUTER JOIN TB_CUST_ACCOUNT CA
+		            ON O.CUST_NO = CA.CUST_NO
+		         WHERE O.DISP_YN = 'Y'
+		           AND OD.ORD_DTL_STAT IN ('G013_50', 'G013_55', 'G013_60')
+		<choose>
+			<when test='custNo != null and custNo != ""'>
+		           AND O.CUST_NO = #{custNo}
+			</when>
+			<otherwise>
+		           AND O.ORD_NO = #{ordNo}
+		           AND O.ORD_NM = #{orderNm}
+			</otherwise>
+		</choose>
+		<if test="ordNo != null and ordNo != ''">
+		           AND O.ORD_NO = #{ordNo}
+		</if>
+		<if test="supplyCompCd != null and supplyCompCd != ''">
+		           AND OD.SUPPLY_COMP_CD = #{supplyCompCd}
+		</if>
+		       ) Z
+		 GROUP BY Z.ORD_NO, Z.ORD_DT, Z.GIFT_ADDR_INP_YN, Z.ORD_DTL_NO, Z.ORD_EXCH_GB, 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_REQ_CHG_QTY, Z.ORD_CAN_CHG_QTY, Z.BANK_CD
+		        , Z.ACCOUNT_NO, Z.ACCOUNT_NM
+		ORDER BY Z.ORD_DTL_NO
+	</select>
+	
+	<!-- 취소/반품 환불 사전 정보 조회 -->
+	<select id="getRefundPreInfo" parameterType="OrderChange" resultType="Order">
+		/* TscOrderChange.getRefundPreInfo */
 		SELECT O.ORD_NO
-		     , DATE_FORMAT(O.ORD_DT, '%Y.%m.%d')				AS ORD_DT
 		     , OD.ORD_DTL_NO
-		     , OD.ORD_DTL_STAT
-		     , FN_GET_CODE_NM('G013', OD.ORD_DTL_STAT)			AS ORD_DTL_STAT_NM
-		     , OD.ORD_EXCH_GB
-		     , CASE WHEN OD.ORD_DTL_STAT IN ('G013_20', 'G013_30', 'G013_40') THEN 'Y'
-					ELSE 'N'
-				END												AS ALL_CAN_YN
 		     , OD.GOODS_CD
 		     , G1.GOODS_NM
-		     , G1.GOODS_TYPE
-		     , FN_GET_CODE_NM('G056', G1.GOODS_TYPE)			AS GOODS_TYPE_NM
-		     , G2.GOODS_CD										AS ITEM_CD
-		     , G2.GOODS_NM										AS ITEM_NM
 		     , ODI.ORD_DTL_ITEM_SQ
-		     , ODI.OPT_CD
-		     , ODI.OPT_CD1
-		     , ODI.OPT_CD2
+		     , ODI.ITEM_CD
+		     , G2.GOODS_NM AS ITEM_NM
 		     , ODI.ITEM_QTY
+		     , OD.ORD_QTY
+		     , OD.CNCL_RTN_QTY
+		     , OCD.ORD_REQ_CHG_QTY
 		     , ODI.ITEM_PRICE
 		     , ODI.OPT_ADD_PRICE
 		     , ODI.ORD_AMT
-		     , ODI.CNCL_RTN_AMT
+		     , ODI.OPT_CD1
+		     , ODI.OPT_CD2
 		     , ODI.CPN1_DC_AMT
 		     , ODI.TMTB1_DC_AMT
 		     , ODI.TMTB2_DC_AMT
@@ -152,166 +313,23 @@
 		     , ODI.CART_CPN_DC_AMT
 		     , ODI.PNT_DC_AMT
 		     , ODI.PRE_PNT_DC_AMT
+		     , ODI.SAVE_PNT_AMT
 		     , ODI.GFCD_USE_AMT
-		     , ODI.REAL_ORD_AMT
-		     , GI.SYS_IMG_NM
-		     , OD.ORD_QTY
-		     , OD.CNCL_RTN_QTY
-		     , CASE WHEN OCD.ORD_REQ_CHG_QTY IS NULL THEN 0
-					ELSE OCD.ORD_REQ_CHG_QTY * ODI.ITEM_QTY
-				END												AS ORD_REQ_CHG_QTY
-		     , OD.ORD_QTY - OD.CNCL_RTN_QTY - IF(OCD.ORD_REQ_CHG_QTY IS NULL, 0, OCD.ORD_REQ_CHG_QTY * ODI.ITEM_QTY) AS ORD_CAN_CHG_QTY
-		     , OD.SAVE_PNT_AMT
-		     , OD.SHIP_COMP_CD
-		     , OD.GIFT_PACK_YN
-		     , FN_GET_SUPPLY_COMP_NM(OD.SUPPLY_COMP_CD)			AS SUPPLY_COMP_NM
-		     , OD.INVOICE_NO
-		     , OD.SUPPLY_COMP_CD
-		     , OD.DELV_FEE_CD
-		     , OD.SHOT_DELV_YN
-		     , G1.SELF_GOODS_YN
-		     , CONCAT(B.BRAND_ENM, ' ', B.BRAND_KNM)			AS BRAND_NM
+		     , ODI.CNCL_RTN_AMT
+		     , FN_GET_CODE_NM('G056', OD.GOODS_TYPE) AS GOODS_TYPE_NM
+		     , ODI.ORD_DTL_STAT
+		     , FN_GET_CODE_NM('G013', ODI.ORD_DTL_STAT) AS ORD_DTL_STAT_NM
 		     , DF.DELV_FEE
-		     , DF.DELV_FEE_CD
 		     , DFP.MIN_ORD_AMT
-		     , DFP.DELV_FEE										AS ORG_DELV_FEE
+		     , DFP.DELV_FEE AS ORG_DELV_FEE
 		     , DFP.RTN_DELV_FEE
-		     , DFP.DELV_FEE + DFP.RTN_DELV_FEE					AS EXC_DELV_FEE
-		     , DL.RTN_LOC_NM
-		     , DL.RTN_LOC_ZIPCODE
-		     , DL.RTN_LOC_BASE_ADDR
-		     , DL.RTN_LOC_DTL_ADDR
-		     , DL.RTN_LOC_TELNO
-		     , DA.RECIP_NM
-		     , DA.RECIP_TELNO
-		     , DA.RECIP_PHNNO
-		     , DA.RECIP_ZIPCODE
-		     , DA.RECIP_BASE_ADDR
-		     , DA.RECIP_DTL_ADDR
-		  FROM TB_ORDER O
-		 INNER JOIN TB_ORDER_DETAIL OD
-		    ON O.ORD_NO = OD.ORD_NO
-		   AND OD.ORD_DTL_STAT NOT IN ('G013_11', 'G013_25', 'G013_97')
-		 INNER JOIN TB_ORDER_DETAIL_ITEM ODI
-		    ON OD.ORD_NO = ODI.ORD_NO
-		   AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
-		   AND ODI.ORD_DTL_STAT NOT IN ('G013_11', 'G013_25', 'G013_97')
-		 INNER JOIN TB_GOODS G1
-		    ON OD.GOODS_CD = G1.GOODS_CD
-		 INNER JOIN TB_GOODS G2
-		    ON ODI.ITEM_CD = G2.GOODS_CD
-		 INNER JOIN TB_BRAND B
-		    ON B.BRAND_CD = G1.BRAND_CD
-		  LEFT OUTER JOIN (SELECT OD.ORD_DTL_NO
-								, SUM(OCD.CHG_QTY) AS ORD_REQ_CHG_QTY
-							 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'
-							  AND OCD.CHG_STAT IN ('G685_20', 'G685_30', 'G685_33', 'G685_40')
-							GROUP BY OCD.ORD_DTL_NO
-						  ) OCD
-		    ON OD.ORD_DTL_NO = OCD.ORD_DTL_NO
-		  LEFT OUTER JOIN TB_DELIVERY_ADDR DA
-		    ON DA.DELV_ADDR_SQ = OD.DELV_ADDR_SQ
-		  LEFT OUTER JOIN TB_GOODS_IMG GI
-		    ON OD.GOODS_CD = GI.GOODS_CD
-		   AND ODI.OPT_CD1 = GI.COLOR_CD
-		   AND GI.DEFAULT_IMG_YN = 'Y'
-		  LEFT OUTER JOIN (SELECT X.DELV_FEE_CD
-							  , SUM(X.DELV_FEE) AS DELV_FEE
-						   FROM TB_DELIVERY_FEE X
-						  WHERE X.ORD_NO = #{ordNo}
-							AND X.DELV_FEE_GB = 'G018_10'
-						  GROUP BY X.DELV_FEE_CD
-						) DF
-		    ON OD.DELV_FEE_CD = DF.DELV_FEE_CD
-		  LEFT OUTER JOIN TB_DELV_FEE_POLICY DFP
-		    ON DF.DELV_FEE_CD = DFP.DELV_FEE_CD
-		   AND DFP.USE_YN = 'Y'
-		  LEFT OUTER JOIN (SELECT TDL.DELV_LOC_CD
-								, TDL.RTN_LOC_NM
-								, TDL.RTN_LOC_TELNO
-								, TDL.RTN_LOC_ZIPCODE
-								, TDL.RTN_LOC_BASE_ADDR
-								, TDL.RTN_LOC_DTL_ADDR
-							 FROM TB_DELIVERY_LOC TDL
-							INNER JOIN TB_SUPPLY_COMPANY TSC
-							   ON TDL.SUPPLY_COMP_CD = TSC.SUPPLY_COMP_CD
-						  ) DL
-		    ON OD.DELV_LOC_CD = DL.DELV_LOC_CD
-		<where>
-			<choose>
-				<when test='custNo != null and custNo != ""'>
-		   AND O.CUST_NO = #{custNo}
-				</when>
-				<otherwise>
-		   AND O.ORD_NO = #{ordNo}
-		   AND O.ORD_NM = #{orderNm}
-				</otherwise>
-			</choose>
-			<if test="ordNo != null and ordNo != ''">
-		   AND O.ORD_NO = #{ordNo}
-			</if>
-			<if test="ordNoList != null">
-		   AND O.ORD_NO IN
-				<foreach collection="ordNoList" item="item" index="index"  open="(" close=")" separator=",">
-					#{item}
-				</foreach>
-			</if>
-			<if test="ordDtlNoArr != null">
-		   AND OD.ORD_DTL_NO IN
-				<foreach collection="ordDtlNoArr" item="item" index="index"  open="(" close=")" separator=",">
-					#{item}
-				</foreach>
-			</if>
-		   AND O.DISP_YN = 'Y'
-		</where>
-		 ORDER BY OD.ORD_DTL_NO
-	</select>
-	
-	<!-- 취소/반품 환불 사전 정보 조회 -->
-	<select id="getRefundPreInfo" parameterType="OrderChange" resultType="Order">
-		/* TscOrderChange.getRefundPreInfo */
-		SELECT O.ORD_NO
-			 , OD.ORD_DTL_NO
-			 , OD.GOODS_CD
-			 , G1.GOODS_NM
-			 , ODI.ORD_DTL_ITEM_SQ
-			 , ODI.ITEM_CD
-			 , G2.GOODS_NM									AS ITEM_NM
-			 , ODI.ITEM_QTY
-			 , OD.ORD_QTY
-			 , OD.CNCL_RTN_QTY
-			 , OCD.ORD_REQ_CHG_QTY
-			 , ODI.ITEM_PRICE
-			 , ODI.OPT_ADD_PRICE
-			 , ODI.ORD_AMT
-			 , ODI.OPT_CD1
-			 , ODI.OPT_CD2
-			 , ODI.CPN1_DC_AMT
-			 , ODI.TMTB1_DC_AMT
-			 , ODI.TMTB2_DC_AMT
-			 , ODI.GOODS_CPN_DC_AMT
-			 , ODI.CART_CPN_DC_AMT
-			 , ODI.PNT_DC_AMT
-			 , ODI.PRE_PNT_DC_AMT
-			 , ODI.SAVE_PNT_AMT
-			 , ODI.GFCD_USE_AMT
-			 , ODI.CNCL_RTN_AMT
-			 , FN_GET_CODE_NM('G056', OD.GOODS_TYPE)		AS GOODS_TYPE_NM
-			 , ODI.ORD_DTL_STAT
-			 , FN_GET_CODE_NM('G013', ODI.ORD_DTL_STAT)		AS ORD_DTL_STAT_NM
-			 , DF.DELV_FEE
-			 , DFP.MIN_ORD_AMT
-			 , DFP.DELV_FEE									AS ORG_DELV_FEE
-			 , DFP.RTN_DELV_FEE
-			 , DFP.DELV_FEE + DFP.RTN_DELV_FEE				AS EXC_DELV_FEE
-			 , DFP.SUPPLY_COMP_CD
-			 , DFP.DELV_FEE_CD
-			 , P.PAY_STAT
-			 , P.PAY_STAT
+		     , DFP.DELV_FEE + DFP.RTN_DELV_FEE AS EXC_DELV_FEE
+		     , DFP.SUPPLY_COMP_CD
+		     , IF(G1.SELF_GOODS_YN = 'Y', 'WMS', DFP.DELV_FEE_CD) AS DELV_FEE_CD
+		     , P.PAY_STAT
+		     , CASE WHEN NULLIF(OD.INVOICE_NO, '') IS NULL THEN 'N'
+		            ELSE 'Y'
+		        END AS DELV_YN
 		  FROM TB_ORDER O
 		 INNER JOIN TB_ORDER_DETAIL OD
 		    ON O.ORD_NO = OD.ORD_NO
@@ -325,22 +343,22 @@
 		 INNER JOIN TB_PAYMENT P
 		    ON P.ORD_NO = O.ORD_NO
 		  LEFT OUTER JOIN (SELECT OD.ORD_DTL_NO
-								, SUM(OCD.CHG_QTY) AS ORD_REQ_CHG_QTY
-							 FROM TB_ORDER_CHANGE_DETAIL OCD
-							INNER JOIN TB_ORDER_DETAIL OD
-							   ON OCD.ORD_DTL_NO = OD.ORD_DTL_NO
-							WHERE OCD.DEL_YN = 'N'
-							  AND OCD.CHG_STAT IN ('G685_20', 'G685_30', 'G685_33', 'G685_40')
-							GROUP BY OCD.ORD_DTL_NO
-						  ) OCD
+		                        , SUM(OCD.CHG_QTY) AS ORD_REQ_CHG_QTY
+		                     FROM TB_ORDER_CHANGE_DETAIL OCD
+		                    INNER JOIN TB_ORDER_DETAIL OD
+		                       ON OCD.ORD_DTL_NO = OD.ORD_DTL_NO
+		                    WHERE OCD.DEL_YN = 'N'
+		                      AND OCD.CHG_STAT IN ('G685_20', 'G685_30', 'G685_33', 'G685_40')
+		                    GROUP BY OCD.ORD_DTL_NO
+		                  ) OCD
 		    ON OD.ORD_DTL_NO = OCD.ORD_DTL_NO
 		  LEFT OUTER JOIN (SELECT X.DELV_FEE_CD
-								, SUM(X.DELV_FEE) AS DELV_FEE
-							 FROM TB_DELIVERY_FEE X
-							WHERE X.DELV_FEE_GB = 'G018_10'
+		                        , SUM(X.DELV_FEE) AS DELV_FEE
+		                     FROM TB_DELIVERY_FEE X
+		                    WHERE X.DELV_FEE_GB = 'G018_10'
 		                      AND X.ORD_NO = #{ordNo}
-							GROUP BY X.DELV_FEE_CD
-						  ) DF
+		                    GROUP BY X.DELV_FEE_CD
+		                  ) DF
 		    ON OD.DELV_FEE_CD = DF.DELV_FEE_CD
 		  LEFT OUTER JOIN TB_DELV_FEE_POLICY DFP
 		    ON DF.DELV_FEE_CD = DFP.DELV_FEE_CD
@@ -360,7 +378,6 @@
 			</if>
 		   AND O.DISP_YN = 'Y'
 		</where>
-
 	</select>
 	
 	<!-- 사용 상품권 정보 조회 -->

+ 3 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml

@@ -114,6 +114,9 @@
 		                             AND    DISP_YN = 'Y' /*전시하는브랜드기획전*/
 		                            )
 		        </if>
+		        <if test="exceptPlanSq != null and exceptPlanSq != ''"> <!-- 제외할기획전 -->
+		        AND    P.PLAN_SQ != #{exceptPlanSq}
+		        </if>
 		       ) Z
 		ORDER  BY NEW_YN DESC, END_DAYS
 	</select>

+ 3 - 2
src/main/resources/config/application.yml

@@ -17,13 +17,14 @@ spring:
             repositories:
                 enabled: true
 
-#server:
+server:
 #    servlet:
 #        session:
 #            cookie:
 #                name: WSESSIONID
 #                secure: true
-#    error.whitelabel.enabled: false
+    error.path: '/error' # 오류 응답을 처리할 Handler의 경로
+    error.whitelabel.enabled: false
 
 # 본인인증
 certify:

+ 2 - 0
src/main/webapp/WEB-INF/views/mob/common/fragments/HeadMob.html

@@ -51,6 +51,8 @@
 	<link rel="icon" href="/images/favicon-16x16.png" sizes="16x16" type="image/png"/>
 	
 	<link rel="stylesheet" type="text/css" href="/ux/mo/css/swiper.min.css"/>
+	<link rel="stylesheet" type="text/css" th:href="@{'/ux/mo/css/common_m.css?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" href="/ux/mo/css/common_m.css"/>
+	<link rel="stylesheet" type="text/css" th:href="@{'/ux/mo/css/layout_m.css?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" href="/ux/mo/css/layout_m.css"/>
 	<link rel="stylesheet" type="text/css" th:href="@{'/ux/mo/css/style24_m.css?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" href="/ux/mo/css/style24_m.css"/>
 	
 	<script src="/ux/mo/js/jquery-3.5.1.min.js"></script>

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


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


+ 129 - 0
src/main/webapp/WEB-INF/views/mob/planning/PlanningMainFormMob.html

@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/DefaultLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : PlanningMainFormMob.html
+ * @desc    : 기획전메인 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.29   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<!--  container -->
+	<div id="container" class="container dp">
+		<section class="content dp_exhibition">
+			<div class="inner wide">
+				<div class="category_nav">
+					<ul>
+						<li><button type="button" th:class="${cateNo == null ? 'active' : ''}" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);">전체</button></li>
+						<li><button type="button" th:each="oneData, stat : ${cateList}" th:class="${oneData.cateNo == cateNo ? 'active' : '' }" th:onclick="|cfnGoToPage(_PAGE_PLANNING_MAIN + '?cateNo=${oneData.cateNo}');|">[[${oneData.cateNm}]]</button></li>
+					</ul>
+				</div>
+			</div>
+			<div class="inner">
+				<div class="list_content"> <!-- 데이터 없을시 클래스 nodata 추가 -->
+					<div class="count_wrap">
+						<div>
+							<p id="planningTotCnt"></p>
+						</div>
+					</div>
+					<div class="list_defult nodata" style="display: none;" id="divPlanningNoData">
+						<div>
+							<p>등록된 기획전이 없습니다.</p>
+						</div>
+						<button type="button" class="btn btn_default" onclick="cfnGoToPage(_PAGE_MAIN);"><span>홈으로 가기</span></button>
+					</div>
+					<div class="list_item" style="display: none;" id="divPlanningList">
+					</div>
+				</div>
+			</div>
+		</section>
+	</div>
+	<!-- // container -->
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let fnGetPlanningList = function(cateNo) {
+		let actionUrl = '/planning/main/list';
+		if (!gagajf.isNull(cateNo)) actionUrl += '?cateNo=' + cateNo;
+		
+		$.getJSON(actionUrl
+			, function(result, status) {
+				if (status == 'success') {
+					if (result.length > 0) {
+						$('#planningTotCnt').html('<span>' + result.length.addComma() + '</span>개의 기획전');
+						
+						$('#divPlanningList').html('');
+						
+						$.each(result, function(idx, item) {
+							let tag = '<div>\n';
+							tag += '	<div class="visual">\n';
+							
+							if (item.newYn == 'Y') {
+								tag += '		<div class="shape ranker"><span>NEW</span></div>\n';
+							}
+							
+							tag += '		<div class="img">\n';
+							tag += '			<img src="' + _uploadImageUrl + item.mainImg + '" alt="">\n';
+							tag += '		</div>\n';
+							tag += '		<div class="txtWrap">\n';
+							tag += '			<p>' + item.planNm + '</p>\n';
+							tag += '			<p class="txt_xs">' + item.dtlTitle1 + '</p>\n';
+							tag += '		</div>\n';
+							tag += '	</div>\n';
+							
+							if (item.planningGoodsList.length > 0) {
+								tag += '	<div class="itemsGrp n3">\n';
+							
+								$.each(item.planningGoodsList, function(idx2, goods) {
+									tag += '		<div class="item_prod">\n';
+									tag += '			<div class="item_state">\n';
+									tag += '				<a class="itemLink" href="javascript:void(0);" class="itemLink" onclick="cfnGoToGoodsDetail(\'' + goods.goodsCd + '\');">\n';
+									tag += '					<div class="itemPic">\n';
+									tag += '						<img alt="BLUE-a" class=" vLHTC pd_img" src="' + _uploadGoodsUrl + '/' + goods.sysImgNm + '"/>\n';
+									tag += '					</div>\n';
+									tag += '					<div class="itemName">' + goods.goodsNm + '</div>\n';
+									tag += '					<p class="itemPrice">' + goods.currPrice.addComma() + '</p>\n';
+									tag += '				</a>\n';
+									tag += '			</div>\n';
+									tag += '		</div>\n';
+								});
+								
+								tag += '	</div>\n';
+							}
+							
+							tag += '</div>\n';
+							
+							$('#divPlanningList').append(tag);
+						});
+						
+						$('#divPlanningNoData').hide();
+						$('#divPlanningList').show();
+					} else {
+						$('#divPlanningNoData').show();
+						$('#divPlanningList').hide();
+					}
+				}
+			});
+	}
+	
+	$(document).ready(function() {
+		fnGetPlanningList([[${cateNo}]]);
+	});
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

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


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


+ 14 - 9
src/main/webapp/WEB-INF/views/web/mypage/MypageCancelFormWeb.html

@@ -31,17 +31,18 @@
 				</div>
 			</div>
 			<div class="cont">
-				<input type="hidden" name="accountNo" th:value="${cancelList.oneData.accountNo}"/>
-				<input type="hidden" name="accountNm" th:value="${cancelList.oneData.accountNm}"/>
-				<input type="hidden" name="bankCd" th:value="${cancelList.oneData.bankCd}"/>
+				<input type="hidden" name="accountNo" th:value="${oneData.accountNo}"/>
+				<input type="hidden" name="accountNm" th:value="${oneData.accountNm}"/>
+				<input type="hidden" name="bankCd" th:value="${oneData.bankCd}"/>
 				<div class="sec_head">
 					<h3 class="subH1">주문취소</h3>
-					<span class="order_number">주문번호&nbsp;:&nbsp;<em th:text="${cancelList.oneData.ordNo}"></em></span>
+					<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>주문일 <span th:text="${cancelList.oneData.ordDt}"></span></p>
+							<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="${cancelList.cancelList}" th:each="cancel, status : ${cancelList.cancelList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
@@ -68,7 +69,8 @@
 										<div class="gd_opt">
 											<div class="option_wrap">
 												<span class="title sr-only">주문 옵션</span>
-												<span class="option" th:text="|${cancel.optCd1} / ${cancel.optCd2}|"></span>
+												<span class="option" th:if="${cancel.goodsType == 'G056_S'}" th:each="option, status : ${cancel.colorNmArr}" th:text="|${cancel.itemNmArr[status.index]} / ${option} / ${cancel.optCd2Arr[status.index]}|"></span>
+												<span class="option" th:unless="${cancel.goodsType == 'G056_S'}" th:text="|${cancel.colorNm} / ${cancel.optCd2}|"></span>
 											</div>
 										</div>
 										<div class="gd_calc">
@@ -76,7 +78,7 @@
 												<span class="count"><em th:text="${cancel.ordQty - cancel.cnclRtnQty}"></em>개</span>
 											</p>
 											<p>
-												<span class="price_org"><em th:text="${#numbers.formatInteger(cancel.listPrice * (cancel.ordQty - cancel.cnclRtnQty), 1, 'COMMA')}"></em>원</span>
+												<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>
 											</p>
 										</div>
@@ -205,7 +207,10 @@
 		fnSetMypageLocation('취소/반품/환불내역', '_PAGE_MYPAGE_CRS_LIST', '취소 신청');
 		
 		// 셀렉트박스 활성화
-		var goods_count_selecter = new sCombo('.myOrderView .part_goods .select_custom.select_count');
+		//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);
+		});
 	});
 	
 	// 취소 처리
@@ -237,7 +242,7 @@
 		}
 		
 		// 취소요청 데이터 설정
-		let url = '/mypage/cancel/all';
+		let url = '/mypage/cancel';
 
 		// 주문상세번호 및 취소 수량 설정
 		let ordDtlNoArr = [];

+ 42 - 36
src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html

@@ -85,7 +85,7 @@
 														<span class="count"><em th:text="${ordDtl.ordQty - ordDtl.cnclRtnQty}"></em>개</span>
 													</p>
 													<p>
-														<span class="price_org"><em th:text="${#numbers.formatInteger(ordDtl.ordAmt - ordDtl.cnclRtnAmt - ordDtl.cpn1DcAmt, 1, 'COMMA')}"></em>원</span>
+														<span class="price_org" th:if="${(ordDtl.ordAmt - ordDtl.cnclRtnAmt - ordDtl.cpn1DcAmt) > (ordDtl.realOrdAmt + ordDtl.pntDcAmt + ordDtl.gfcdUseAmt)}"><em th:text="${#numbers.formatInteger(ordDtl.ordAmt - ordDtl.cnclRtnAmt - ordDtl.cpn1DcAmt, 1, 'COMMA')}"></em>원</span>
 														<span class="price_sale"><em th:text="${#numbers.formatInteger(ordDtl.realOrdAmt + ordDtl.pntDcAmt + ordDtl.gfcdUseAmt, 1, 'COMMA')}"></em>원</span>
 													</p>
 													<p>
@@ -162,7 +162,7 @@
 													</th:block>
 
 													<!-- 리뷰작성 버튼(구매확정) -->
-													<th:block th:if="${ordDtl.ordDtlStat == 'G013_70' and ordDtl.reviewableYn == 'Y' and ordDtl.reviewSq == null}">
+													<th:block th:if="${(ordDtl.ordDtlStat == 'G013_50' or ordDtl.ordDtlStat == 'G013_55' or ordDtl.ordDtlStat == 'G013_60' or ordDtl.ordDtlStat == 'G013_70') and ordDtl.reviewableYn == 'Y' and ordDtl.reviewSq == null}">
 														<p><button type="button" class="btn btn_primary_line btn_sm" th:attr="ordNo=${ordDtl.ordNo}" onclick="fnCreateReview(this);"><span>리뷰 쓰기</span></button></p>
 													</th:block>
 
@@ -203,7 +203,7 @@
 												<p>주문이 완료되어 결제를 기다리고 있습니다.</p>
 
 												<!-- 예약 상품 -->
-												<p th:if="${!#strings.isEmpty(ordDtl.recipBaseAddr)}" th:text="|예약판매 상품으로${ordDtl.delvResDt} 출고 예정입니다.|"></p>
+												<p th:if="${!#strings.isEmpty(ordDtl.delvResDt)}" th:text="|예약판매 상품으로${ordDtl.delvResDt} 출고 예정입니다.|"></p>
 											</div>
 											
 											<!-- 상품준비중 -->
@@ -211,7 +211,7 @@
 												<p>배송할 상품을 준비 중입니다.</p>
 
 												<!-- 예약 상품 -->
-												<p th:if="${!#strings.isEmpty(ordDtl.recipBaseAddr)}" th:text="|예약판매 상품으로${ordDtl.delvResDt} 출고 예정입니다.|"></p>
+												<p th:if="${!#strings.isEmpty(ordDtl.delvResDt)}" th:text="|예약판매 상품으로${ordDtl.delvResDt} 출고 예정입니다.|"></p>
 											</div>
 											
 											<!-- 배송준비중 -->
@@ -219,7 +219,7 @@
 												<p>상품 준비가 완료되어 곧 배송될 예정입니다.</p>
 
 												<!-- 예약 상품 -->
-												<p th:if="${!#strings.isEmpty(ordDtl.recipBaseAddr)}" th:text="|예약판매 상품으로${ordDtl.delvResDt} 출고 예정입니다.|"></p>
+												<p th:if="${!#strings.isEmpty(ordDtl.delvResDt)}" th:text="|예약판매 상품으로${ordDtl.delvResDt} 출고 예정입니다.|"></p>
 											</div>
 											
 											<!-- 배송중, 배송완료 -->
@@ -492,38 +492,44 @@
 			
 			return false;
 		}
-
-		// 취소요청 데이터 설정
-		let url = '/mypage/cancel/all';
-		
-		// 주문상세번호 설정
-		let ordDtlNoArr = [];
-		$.each($('input[name=ordDtlNoArr]'), function(idx, item) {
-			ordDtlNoArr.push($(item).val());
-		});
 		
-		// 취소 수량 설정
-		let cnclRtnReqQtyArr = [];
-		$.each($('input[name=cnclRtnReqQtyArr]'), function(idx, item) {
-			cnclRtnReqQtyArr.push($(item).val());
-		});
-
-		// 전체 취소 처리
-		let data = {};
-		data.ordNo = ordNo;
-		data.chgReason = 'G686_10';
-		data.accountNo = accountNo;
-		data.accountNm = accountNm;
-		data.bankCd = bankCd;
-		data.isCustomer = 'Y';
-		data.reqGbn = 'cnclComplete';
-		data.ordDtlNoArr = ordDtlNoArr;
-		data.cnclRtnReqQtyArr = cnclRtnReqQtyArr;
-		
-		let jsonData = JSON.stringify(data);
-
-		gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
-			cfnGoToPage(_PAGE_MYPAGE_ORDER_LIST);
+		mcxDialog.confirm('전체취소 처리하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				// 취소요청 데이터 설정
+				let url = '/mypage/cancel';
+				
+				// 주문상세번호 설정
+				let ordDtlNoArr = [];
+				$.each($('input[name=ordDtlNoArr]'), function(idx, item) {
+					ordDtlNoArr.push($(item).val());
+				});
+				
+				// 취소 수량 설정
+				let cnclRtnReqQtyArr = [];
+				$.each($('input[name=cnclRtnReqQtyArr]'), function(idx, item) {
+					cnclRtnReqQtyArr.push($(item).val());
+				});
+				
+				// 전체 취소 처리
+				let data = {};
+				data.ordNo = ordNo;
+				data.chgReason = 'G686_10';
+				data.accountNo = accountNo;
+				data.accountNm = accountNm;
+				data.bankCd = bankCd;
+				data.isCustomer = 'Y';
+				data.reqGbn = 'cnclComplete';
+				data.ordDtlNoArr = ordDtlNoArr;
+				data.cnclRtnReqQtyArr = cnclRtnReqQtyArr;
+				
+				let jsonData = JSON.stringify(data);
+				
+				gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+					cfnGoToPage(_PAGE_MYPAGE_ORDER_LIST);
+				});
+			}
 		});
 	}
 </script>

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

@@ -421,7 +421,9 @@
 					tag += '							<span class="count"><em>' + (ordDtl.ordQty - ordDtl.cnclRtnQty) + '</em>개</span>\n';
 					tag += '						</p>\n';
 					tag += '						<p>\n';
-					tag += '							<span class="price_org"><em>' + (ordDtl.ordAmt - ordDtl.cnclRtnAmt - ordDtl.cpn1DcAmt).addComma() + '</em>원</span>\n';
+					if ((ordDtl.ordAmt - ordDtl.cnclRtnAmt - ordDtl.cpn1DcAmt) > (ordDtl.realOrdAmt + ordDtl.pntDcAmt + ordDtl.gfcdUseAmt)) {
+						tag += '							<span class="price_org"><em>' + (ordDtl.ordAmt - ordDtl.cnclRtnAmt - ordDtl.cpn1DcAmt).addComma() + '</em>원</span>\n';
+					}
 					tag += '							<span class="price_sale"><em>' + (ordDtl.realOrdAmt + ordDtl.pntDcAmt + ordDtl.gfcdUseAmt).addComma() + '</em>원</span>\n';
 					tag += '						</p>\n';
 					tag += '					</div>\n';
@@ -491,8 +493,8 @@
 							tag += '					<p><button type="button" class="btn btn_primary_line btn_sm" ordNo="' + ordDtl.ordNo + '" ordDtlNo="' + ordDtl.ordDtlNo + '" onclick="fnDecideOrder(this);"><span>구매 확정</span></button></p>\n';
 						}
 
-						// 리뷰작성 버튼(구매확정)
-						if (ordDtl.ordDtlStat == 'G013_70' && ordDtl.reviewableYn == 'Y' && ordDtl.reviewSq == null) {
+						// 리뷰작성 버튼(배송중, 배송완료, 구매확정)
+						if ((ordDtl.ordDtlStat == 'G013_50' || ordDtl.ordDtlStat == 'G013_55' || ordDtl.ordDtlStat == 'G013_60' || ordDtl.ordDtlStat == 'G013_70') && ordDtl.reviewableYn == 'Y' && ordDtl.reviewSq == null) {
 							tag += '					<p><button type="button" class="btn btn_primary_line btn_sm" ordNo="' + ordDtl.ordNo + '" onclick="fnCreateReview(this);"><span>리뷰 쓰기</span></button></p>\n';
 						}
 
@@ -582,7 +584,7 @@
 								}
 								
 								tag += '			</div>';
-							} else {
+							} else if (ordDtl.ordDtlStat == 'G013_60') {
 								tag += '			<div class="order_text"><p>15일 후 자동으로 구매확정됩니다.</p></div>\n';
 							}
 						}

+ 316 - 332
src/main/webapp/WEB-INF/views/web/mypage/MypageReturnFormWeb.html

@@ -14,12 +14,13 @@
  * VER  DATE         AUTHOR      DESCRIPTION
  * ===  ===========  ==========  =============================================
  * 1.0  2021.02.25   card007     최초 작성
+ * 1.1  2021.03.29   card007     퍼블 수정
  *******************************************************************************
  -->
 <body>
 
 <th:block layout:fragment="content">
-	<div class="content myOrderList">
+	<div class="content myOrderView">
 		<div class="cont_body">
 			<!-- CONT-BODY -->
 			<div class="lnb">
@@ -30,299 +31,293 @@
 					<ul id="mypageLnbList"></ul>
 				</div>
 			</div>
-			<div class="my_cont">
+			<div class="cont">
+				<input type="hidden" name="accountNo" th:value="${oneData.accountNo}"/>
+				<input type="hidden" name="accountNm" th:value="${oneData.accountNm}"/>
+				<input type="hidden" name="bankCd" th:value="${oneData.bankCd}"/>
 				<div class="sec_head">
-					<h3>반품 신청</h3>
-					<div class="od_detail">
-						(주문번호 : <span class="num" th:text="${ordNo}"></span>)
-					</div>
+					<h3 class="subH1">반품 신청</h3>
+					<span class="order_number">주문번호&nbsp;:&nbsp;<em th:text="${oneData.ordNo}"></em></span>
 				</div>
-				<div class="sec_body mypage_body">
-					<form class="form_wrap" role="form">
-						<div class="order_list">
-							<section class="order_row">
-								<div class="part_deliver">
-									<div class="tbl_tit">
-										<!-- 주문일/선물일 설정 -->
-										<span class="start_t" th:unless="${returnList.oneData.giftPackYn == 'Y'}">주문일</span>
-										<span class="gift_t" th:if="${returnList.oneData.giftPackYn == 'Y'}">선물일</span>
-										<!-- //주문일/선물일 설정 -->
-		
-										<span class="order_date" th:text="${returnList.oneData.ordDt}"></span>
-		
-										<!-- 배송구분 설정 -->
-										<span class="order_label02" th:if="${returnList.shotDelv}">총알배송</span>
-										<span class="order_label01" th:if="${returnList.selfMall}">STYLE24 일반배송</span>
-										<span class="order_label01" th:if="${returnList.supplyMall}">업체직배송</span>
-										<!-- //배송구분 설정 -->
-										<a href="javascript:void(0)" class="detail_btn" th:attr="ordNo=${returnList.oneData.ordNo}" onclick="fnGoToOrderDetail(this)">주문상세보기</a>
-									</div>
-									<div class="tbl type2">
-										<table id="returnList">
-											<colgroup>
-												<col width="1020">
-												<col width="180">
-											</colgroup>
-											<tbody>
-											<th:block th:if="${returnList.returnList}" th:each="return, status : ${returnList.returnList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
-												<tr>
-													<td>
-														<div class="info_item">
-															<div class="thumb_box">
-																<a href="">
-																	<img th:src="${imageUrl + '/' + return.sysImgNm}" width="100%" alt="">
-																</a>
-															</div>
-															<div class="info_box">
-																<p class="od_name">
-																	<a href="">
-																		<span class="brand" th:text="${return.brandNm}"></span>
-																		<span class="name" th:text="${return.goodsNm}"></span>
-																	</a>
-																</p>
-																<p class="od_opt">
-																	<span class="option"><em th:text="${return.optCd1}"></em><em th:text="${return.optCd2}"></em></span>
-																	<span class="count">수량 <em th:text="${return.ordQty}"></em>개</span>
-																</p>
-															</div>
-															<div class="info_calc">
-																<p class="price">
-																	<span class="selling_price" th:text="|${#numbers.formatInteger(return.ordAmt, 1, 'COMMA')}원|"></span>
-																</p>
-																<p class="point"><span th:text="${#numbers.formatInteger(return.savePntAmt, 1, 'COMMA')}"></span>p</p>
-															</div>
-														</div>
-													</td>
-													<td class="cnt_sel">
-														<span class="cnt_t">수량</span>
-														<div class="form_field">
-															<div class="select_custom type1">
-																<div class="combo">
-																	<input type="hidden" name="chgQty" value="0" th:attr="ordDtlNo=${return.ordDtlNo}, ordCanChgQty=${return.ordCanChgQty}"/>
-																	<div class="select">선택</div>
-																	<ul class="list" style="width:100px; margin:0 auto">
-																		<li class="selected" value="0">선택</li>
-																		<li th:if="${return.ordCanChgQty > 0}" th:each="num : ${#numbers.sequence(1,return.ordCanChgQty)}" th:value="${num}" th:text="${num}" onclick="fnChangeQty(this);"></li>
-																	</ul>
-																</div>
-															</div>
-														</div>
-		<!--												<select class="select_dress" name="chgQty" onchange="fnChangeQty();">-->
-		<!--													<option value="">선택</option>-->
-		<!--													<option th:if="${return.ordQty > 0}" th:each="num : ${#numbers.sequence(1,return.ordQty)}" th:value="${num}" th:text="${num}"></option>-->
-		<!--												</select>-->
-													</td>
-												</tr>
-											</th:block>
-											</tbody>
-										</table>
-									</div>
-									<div class="order_confirm">
-										<p class="cf_txt cf_desc c_primary">반품하실 상품의 수량을 선택하신 후 반품 신청을 하실 수 있습니다.</p>
+				<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="${returnList.returnList}" th:each="return, status : ${returnList.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=${return.goodsCd}" onclick="fnGoToGoodsDetail(this)">
+												<span class="thumb">
+													<img th:src="${imageUrl + '/' + return.sysImgNm}" width="100%" alt="">
+												</span>
+												<p>
+													<span class="brand" th:text="${return.brandNm}"></span>
+													<span class="tag primary" th:if="${return.shotDelvYn == 'Y'}">총알배송</span>
+													<span class="tag" th:if="${return.shotDelvYn == 'N' and return.selfGoodsYn == 'Y'}">STYLE24 일반배송</span>
+													<span class="tag" th:if="${return.selfGoodsYn == 'N'}">업체직배송</span>
+												</p>
+												<p>
+													<span class="name" th:text="${return.goodsNm}"></span>
+												</p>
+											</a>
+										</div>
+										<div class="gd_opt">
+											<div class="option_wrap">
+												<span class="title sr-only">주문 옵션</span>
+												<span class="option" th:if="${return.goodsType == 'G056_S'}" th:each="option, status : ${return.colorNmArr}" th:text="|${return.itemNmArr[status.index]} / ${option} / ${return.optCd2Arr[status.index]}|"></span>
+												<span class="option" th:unless="${return.goodsType == 'G056_S'}" th:text="|${return.colorNm} / ${return.optCd2}|"></span>
+											</div>
+										</div>
+										<div class="gd_calc">
+											<p>
+												<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>
+											</p>
+										</div>
 									</div>
-								</div>
-							</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>
+									<div class="button_box">
+										<div class="count_modify">
+											<span class="txt">수량</span>
+											<form class="form_wrap">
 												<div class="form_field">
-													<div class="select_custom type1">
+													<div class="select_custom select_count">
 														<div class="combo">
-															<input type="hidden" name="chgReason"/>
-															<div class="select">반품 사유를 선택하세요</div>
-															<ul class="list" style="width:400px">
-																<li class="selected" value="">반품 사유를 선택하세요</li>
-																<li th:if="${returnReason}" th:each="oneData, status : ${returnReason}" th:value="${oneData.cd}" th:text="${oneData.cdNm}" onclick="fnChangeReason(this);"></li>
+															<input type="hidden" name="chgQty" value="0" th:attr="ordDtlNo=${return.ordDtlNo}, ordCanChgQty=${return.ordCanChgQty}"/>
+															<div class="select">선택</div>
+															<ul class="list">
+																<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" 추가  -->
+																<li class="selected" qty="0" onclick="fnChangeReturnQty(this);">선택</li>
+																<li th:if="${return.ordCanChgQty > 0}" th:each="num : ${#numbers.sequence(1,return.ordCanChgQty)}" th:attr="qty=${num}" th:text="${num}" onclick="fnChangeReturnQty(this);"></li>
 															</ul>
 														</div>
 													</div>
 												</div>
-											</td>
-										</tr>
-										<tr>
-											<td>
-												<textarea class="doc_exchange" name="chgMemo" id="chgMemo" placeholder="자세한 사유를 입력해주세요." onkeyup="cfnGetTextLength(this, 200, $('#return_cnt'));"></textarea>
-												<p class="txt_cnt"><span id="return_cnt" class="c_primary">0</span>/200</p>
-											</td>
-										</tr>
-										</tbody>
-									</table>
+											</form>
+										</div>
+									</div>
 								</div>
-							</section>
-							<section class="order_row" id="wdGb">
-								<div class="order_tit">
-									<h3 class="subH3">반품 방식 선택</h3>
+								<div class="order_text">
+									<p>반품하실 상품의 수량을 선택하신 후 반품 신청을 하실 수 있습니다.</p>
 								</div>
-								<div class="tbl type1">
-									<table>
-										<colgroup>
-											<col width="*">
-										</colgroup>
-										<tbody>
-										<tr>
-											<td>
-												<div class="form_field radio_field">
-													<div class="">
-														<input type="radio" name="wdGb" id="withdraw" value="W" checked>
-														<label for="withdraw"><span>방문회수 <b class="c_primary">택배사에서 방문하여 회수</b></span></label>
-													</div>
-													<div class="">
-														<input type="radio" name="wdGb" id="direct" value="D">
-														<label for="direct"><span>직접반송 <b class="c_primary">고객이 직접 반송처리</b></span></label>
+							</div>
+							<!-- //주문상품 -->
+							</th:block>
+						</div>
+					</div>
+					<h4 class="subH3">반품 사유</h4>
+					<div class="tbl type1">
+						<table>
+							<tbody>
+								<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="${returnReason}" th:each="oneData, status : ${returnReason}" th:value="${oneData.cd}" th:text="${oneData.cdNm}" onclick="fnChangeReason(this);"></li>
+													</ul>
+												</div>
+											</div>
+										</div>
+									</td>
+								</tr>
+								<tr>
+									<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>
+												<p class="txt_cnt"><span id="return_cnt" class="c_primary">0</span>/200</p>
+											</div>
+										</div>
+									</td>
+								</tr>
+							</tbody>
+						</table>
+					</div>
+					<h4 class="subH3">반품 방식 선택</h4>
+					<div class="tbl type1">
+						<table>
+							<tbody>
+								<tr>
+									<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>
+					<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 id="chgerAddr" th:text="|${deliveryAddrInfo.recipBaseAddr} ${deliveryAddrInfo.recipDtlAddr}|">
+											<button type="button" class="btn btn_default btn_sm" onclick="fnChangeDeliveryAddr('chger');"><span>회수지 변경</span></button>
+										</td>
+										<input type="hidden" name="chgerBaseAddr" th:value="${deliveryAddrInfo.recipBaseAddr}">
+										<input type="hidden" name="chgerDtlAddr" th:value="${deliveryAddrInfo.recipDtlAddr}">
+									</tr>
+								</tbody>
+							</table>
+						</div>
+					</div>
+					<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>
-											</td>
-										</tr>
-										</tbody>
-									</table>
-								</div>
-							</section>
-							<section class="order_row" id="chgerLocation">
-								<div class="order_tit">
-									<h3 class="subH3">상품 회수지</h3>
-									<span class="del_t">택배사에서 반품 상품을 직접 회수할 장소 선택</span>
-									<button type="button" class="btn_popup" onclick="fnChangeDeliveryAddr('chger');"><span>회수지 선택</span></button>
-								</div>
-								<div class="tbl type1">
-									<table>
-										<colgroup>
-											<col width="200">
-											<col width="*">
-										</colgroup>
-										<tbody>
-										<tr>
-											<th>성명</th>
-											<td id="chgerNm" th:text="${deliveryAddrInfo.recipNm}"></td>
-											<input type="hidden" name="chgerNm" th:value="${deliveryAddrInfo.recipNm}">
-										</tr>
-										<tr>
-											<th>연락처</th>
-											<td id="chgerPhnno" th:text="${deliveryAddrInfo.recipPhnno}"></td>
-											<input type="hidden" name="chgerPhnno" th:value="${deliveryAddrInfo.recipPhnno}">
-										</tr>
-										<tr>
-											<th>주소</th>
-											<td id="chgerAddr" th:text="|${deliveryAddrInfo.recipBaseAddr} ${deliveryAddrInfo.recipDtlAddr}|"></td>
-											<input type="hidden" name="chgerBaseAddr" th:value="${deliveryAddrInfo.recipBaseAddr}">
-											<input type="hidden" name="chgerDtlAddr" th:value="${deliveryAddrInfo.recipDtlAddr}">
-										</tr>
-										</tbody>
-									</table>
-								</div>
-							</section>
-							<section class="order_row" id="returnLocation" style="display:none">
-								<div class="order_tit">
-									<h3 class="subH3">반품하실 배송지</h3>
-								</div>
-								<div class="tbl type1">
-									<table>
-										<colgroup>
-											<col width="200">
-											<col width="*">
-										</colgroup>
-										<tbody>
-										<tr>
-											<th>성명</th>
-											<td th:text="${deliveryAddrInfo.rtnLocNm}"></td>
-											<input type="hidden" name="rtnLocNm" th:value="${deliveryAddrInfo.rtnLocNm}">
-										</tr>
-										<tr>
-											<th>연락처</th>
-											<td th:text="${deliveryAddrInfo.rtnLocTelno}"></td>
-											<input type="hidden" name="rtnLocTelno" th:value="${deliveryAddrInfo.rtnLocTelno}">
-										</tr>
-										<tr>
-											<th>주소</th>
-											<td th:text="|${deliveryAddrInfo.rtnLocBaseAddr} ${deliveryAddrInfo.rtnLocDtlAddr}|"></td>
-											<input type="hidden" name="rtnLocBaseAddr" th:value="${deliveryAddrInfo.rtnLocBaseAddr}">
-											<input type="hidden" name="rtnLocDtlAddr" th:value="${deliveryAddrInfo.rtnLocDtlAddr}">
-										</tr>
-										</tbody>
-									</table>
-								</div>
-							</section>
-							<section class="order_row">
-								<div class="order_tit">
-									<h3 class="subH3">환불 정보</h3>
-									<button type="button" class="btn_popup"><span>취소 전표 보기</span></button>
-								</div>
-								<div class="tbl type1 re_info_tbl">
-									<div class="r_left">
-										<dl>
-											<dt>환불(예정) 금액</dt>
-											<dd>
-												<span class="big_t"><strong id="returnAmt">0</strong>원</span>
-											</dd>
-										</dl>
-										<dl>
-											<dt>상품취소 금액</dt>
-											<dd>
-												<span id="goodsCancelAmt">0</span>원
-											</dd>
-										</dl>
-										<dl>
-											<dt>배송비</dt>
-											<dd>
-												<span id="deliveryFee">0</span>원
-											</dd>
-										</dl>
-										<dl>
-											<dt>할인금액 차감</dt>
-											<dd>
-												<span id="deductDcAmt">0</span>원
-											</dd>
-										</dl>
-									</div>
-									<div class="r_right">
-										<dl>
-											<dt>환불수단</dt>
-											<dd>
-												<span th:text="${paymentInfo.payMeansNm}"></span>
-											</dd>
-										</dl>
-										<dl>
-											<dt>결제금액 환불</dt>
-											<dd>
-												<span id="refundPayAmt">0</span>원
-											</dd>
-										</dl>
+											</form>
+										</td>
+									</tr>
+								</tbody>
+							</table>
+						</div>
+					</div>
+					<h4 class="subH3">환불정보</h4>
+					<div class="tbl type6">
+						<table>
+							<colgroup>
+								<col width="50%">
+								<col width="50%">
+							</colgroup>
+							<tbody>
+								<tr>
+									<td>
 										<dl>
-											<dt>포인트 환불</dt>
-											<dd>
-												<span id="refundPoint">0</span>P
-											</dd>
+											<div>
+												<dt>환불 예정 금액</dt>
+												<dd>
+													<div class="price">
+														<span class="return_total_price"><em id="returnAmt">0</em>원</span>
+													</div>
+												</dd>
+											</div>
+											<div class="include_item"> <!-- 할인항목 표기 class명 include_item -->
+												<dt>상품 취소 금액</dt>
+												<dd><em id="goodsCancelAmt">0</em>원</dd>
+											</div>
+											<div class="include_item">
+												<dt>배송비</dt>
+												<dd><em id="deliveryFee">0</em>원</dd>
+											</div>
+											<div class="include_item">
+												<dt>할인 금액 차감</dt>
+												<dd><em id="deductDcAmt">0</em>원</dd>
+											</div>
 										</dl>
+									</td>
+									<td>
 										<dl>
-											<dt>상품권 환불</dt>
-											<dd>
-												<span id="refundGiftCard">0</span>원
-											</dd>
+											<div>
+												<dt>환불 수단</dt>
+												<dd th:if="${paymentInfo.pgGb == 'KCP'}" th:text="${paymentInfo.payMeansNm}"></dd>
+												<dd th:if="${paymentInfo.pgGb == 'NAVER'}">네이버페이</dd>
+												<dd th:if="${paymentInfo.pgGb == 'KAKAO'}">카카오페이</dd>
+												<dd th:if="${paymentInfo.pgGb == 'PAYCO'}">PAYCO</dd>
+											</div>
+											<div>
+												<dt>결제 금액 환불</dt>
+												<dd>
+													<em id="refundPayAmt">0</em>원
+												</dd>
+											</div>
+											<div>
+												<dt>포인트 환불</dt>
+												<dd>
+													<em id="refundPoint">0</em>P
+												</dd>
+											</div>
+											<div>
+												<dt>상품권 환불</dt>
+												<dd>
+													<em id="refundGiftCard">0</em>원
+												</dd>
+											</div>
 										</dl>
-									</div>
-								</div>
-								<p class="alert_t">※ 카드사로 결제 취소 요청이 전달된 후 환불까지는 평일 기준 3 ~7일이 소요될 수 있습니다.</p>
-							</section>
-							<section class="order_row" id="addDeliveryFee" style="display:none">
-								<div class="ship_fee">
-									<p><span class="c_primary" id="addPayCost">2,500원</span> 배송비 추가 결제가 필요합니다.</p>
-									<input type="hidden" name="addPayCost"/>
-								</div>
-							</section>
-							<div class="btn_wrap">
-								<button type="button" class="btn btn_default cancle_btn" onclick="cfnGoToPage(_PAGE_MYPAGE_CRS_LIST)"><span>반품 취소</span></button>
-								<button tyep="submit" class="btn btn_primary submit_btn" onclick="fnReturn()"><span id="returnButton">반품 신청</span></button>
-							</div>
-						</div>
-					</form>
+									</td>
+								</tr>
+							</tbody>
+						</table>
+					</div>
+					<div class="txt_info">
+						<ul>
+							<li>
+								카드사로 결제 취소 요청이 전달된 후 환불까지는 평일 기준 3 ~7일이 소요될 수 있습니다.
+							</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_CRS_LIST)"><span>취소</span></button>
+						<button type="button" id="btn_refund_pop" class="btn btn_dark btn_md" onclick="fnReturn()"><span>반품 신청</span></button>
+					</div>
 				</div>
 			</div>
 			<!-- // CONT-BODY -->
@@ -331,23 +326,22 @@
 <script src="/ux/plugins/gaga/gaga.paging.js"></script>
 <script th:inline="javascript">
 	let returnList = [[${returnList.returnList}]];
-	let oneData = [[${returnList.oneData}]];
+	let oneData = [[${oneData}]];
 	let usedGiftCardInfo = [[${usedGiftCardInfo}]];
 	let usedPointInfo = [[${usedPointInfo}]];
-	let refundPoint = 0;
-	let refundGiftCard = 0;
 
 	$(document).ready(function() {
 		// 마이페이지 LNB 설정
 		fnSetMypageLnbList(2);
-		
+
 		// 마이페이지 location 설정
 		fnSetMypageLocation('취소/반품/환불내역', '_PAGE_MYPAGE_CRS_LIST', '반품 신청');
-		
-		// 셀렉트박스 활성화
-		$('.select_custom.type1').each(function(index) {
-			var selecter01 = new sCombo($(this));
-		});
+
+		// 반품상품 수량 셀렉트박스 활성화
+		var goods_count_selecter = new sCombo('.myOrderView .part_goods .select_custom.select_count');
+
+		// 반품사유 셀렉트박스 활성화
+		var return_reason_selecter = new sCombo('.myOrderView .tbl.type1 td .select_custom.select_reason');
 
 		// 입점업체의 경우 회수방식 직접배송 처리
 		if (oneData.selfGoodsYn == 'Y') {
@@ -363,76 +357,65 @@
 	}
 	
 	// 반품 수량 변경 이벤트 처리
-	var fnChangeQty = function(param) {
+	var fnChangeReturnQty = function(param) {
 		let url = '/mypage/cancel/refund/amt/calculate';
 
 		if (param != null) {
-			$(param).parent().parent().find('input[name=chgQty]').val($(param).val());
+			$(param).parent().parent().find('input[name=chgQty]').val($(param).attr('qty'));
 		}
 
 		let chgReason = $('input[name=chgReason]').val();
 
-		console.log(chgReason);
 		if (!gagajf.isNull(chgReason)) {
-			let returnRequestList = [];
-
 			// 반품 수량 설정
-			let chgQtyArr = [];
+			let cnclRtnReqQtyArr = [];
 			let ordDtlNoArr = [];
 			let ordCanChgQtyArr = [];
-			let chgQtyChk = 0;
 			$.each($('input[name=chgQty]'), function(idx, item) {
 				let chgQty = $(item).val();
 				let ordDtlNo = $(item).attr('ordDtlNo');
 				let ordCanChgQty = $(item).attr('ordCanChgQty');
-
-				chgQtyArr.push(Number(chgQty));
+				
+				cnclRtnReqQtyArr.push(Number(chgQty));
 				ordDtlNoArr.push(Number(ordDtlNo));
 				ordCanChgQtyArr.push(Number(ordCanChgQty));
-				
-				chgQtyChk += Number(chgQty);
 			});
 
-			if (chgQtyChk > 0) {
+			let data = {};
+			data.ordNo = oneData.ordNo;
+			data.ordDtlNoArr = ordDtlNoArr;
+			data.cnclRtnReqQtyArr = cnclRtnReqQtyArr;
+
+			let jsonData = JSON.stringify(data);
+
+			gagajf.ajaxJsonSubmit(url, jsonData, function (result) {
 				// 환불포인트, 환불상품권 금액 계산
 				let refundPoint = fnCalculatePoint(chgQtyArr, ordDtlNoArr, ordCanChgQtyArr);
 				let refundGiftCard = fnCalculateGiftCard(chgQtyArr, ordDtlNoArr, ordCanChgQtyArr);
+
+				let spanCnclRtnAmt = Number(result.spanCnclRtnAmt);
+				let sumDeliveryFee = Number(result.sumDeliveryFee);
+				let spanTotDeliveryFee = Number(result.spanTotDeliveryFee);
+				let spanCpnDcAmt = Number(result.spanCpnDcAmt);
+				let spanTmtbDcAmt = Number(result.spanTmtbDcAmt);
+				let spanPrePntDcAmt = Number(result.spanPrePntDcAmt);
+				let spanRefundAmt = Number(result.spanRefundAmt);
 				
-				$.each(returnList, function (idx, item) {
-					let index = ordDtlNoArr.indexOf(item.ordDtlNo);
-					item.ordCanChgQty = chgQtyArr[index];
-					
-					returnRequestList.push(item);
-				})
-				
-				let jsonData = JSON.stringify(returnRequestList);
+				let goodsCancelAmt = spanCnclRtnAmt;										// 상품취소금액
+				let deliveryFee = sumDeliveryFee - spanTotDeliveryFee;						// 배송비
+				let deductDcAmt = 0 - spanCpnDcAmt - spanTmtbDcAmt - spanPrePntDcAmt;		// 할인금액 차감(쿠폰+다다익선+선포인트)
+				let refundPayAmt = spanRefundAmt;											// 결제금액 환불
+				let returnAmt = refundPayAmt + refundPoint + refundGiftCard;				// 환불예정금액
 				
-				gagajf.ajaxJsonSubmit(url, jsonData, function (result) {
-					let spanCnclRtnAmt = Number(result.spanCnclRtnAmt);
-					let sumDeliveryFee = Number(result.sumDeliveryFee);
-					let spanTotDeliveryFee = Number(result.spanTotDeliveryFee);
-					let spanCpnDcAmt = Number(result.spanCpnDcAmt);
-					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 returnAmt = refundPayAmt + refundPoint + refundGiftCard;				// 환불예정금액
-					
-					// 금액 설정
-					$('#returnAmt').text(returnAmt.addComma());
-					$('#goodsCancelAmt').text(goodsCancelAmt.addComma());
-					$('#deliveryFee').text(deliveryFee.addComma());
-					$('#deductDcAmt').text(deductDcAmt.addComma());
-					$('#refundPayAmt').text(refundPayAmt.addComma());
-					$('#refundPoint').text(refundPoint.addComma());
-					$('#refundGiftCard').text(refundGiftCard.addComma());
-					console.log(result);
-				});
-			}
+				// 금액 설정
+				$('#returnAmt').text(returnAmt.addComma());
+				$('#goodsCancelAmt').text(goodsCancelAmt.addComma());
+				$('#deliveryFee').text(deliveryFee.addComma());
+				$('#deductDcAmt').text(deductDcAmt.addComma());
+				$('#refundPayAmt').text(refundPayAmt.addComma());
+				$('#refundPoint').text(refundPoint.addComma());
+				$('#refundGiftCard').text(refundGiftCard.addComma());
+			});
 		}
 	}
 
@@ -453,6 +436,7 @@
 	var fnChangeReason = function(param) {
 		// TODO
 		// 반품 사유 변경 처리
+		console.log($(param).val());
 		$(param).parent().parent().find('input[name=chgReason]').val($(param).val());
 		fnChangeQty();
 	}

+ 504 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageReturnFormWeb_20210329.html

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

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

@@ -17,8 +17,9 @@
  -->
 <body>
 	<th:block layout:fragment="content">
+	<script src="https://developers.kakao.com/sdk/js/kakao.min.js"></script>
 		<!--  container -->
-		<div id="container" class="container dp" th:with="frontUrl=${@environment.getProperty('domain.front')}, goodsView=${@environment.getProperty('upload.goods.view')}">
+		<div id="container" class="container dp" th:with="frontUrl=${@environment.getProperty('domain.front')}, goodsView=${@environment.getProperty('upload.goods.view')}, planView=${@environment.getProperty('upload.image.view')}">
 			<div class="breadcrumb">
 				<ul>
 					<li class="bread_home"><a href="javascript:void(0);"
@@ -35,7 +36,19 @@
 						<div>
 							<h3 th:text="${planInfo.planNm}"></h3>
 							<div>
-								<a href="javascript:void(0)">sns share</a>
+								<div class="shareSet">
+										<button class="btn_share" data-name="openShare">공유하기</button>
+										<div class="shareWrap" th:with="stylelUrl=${@environment.getProperty('domain.front')}, imgGoodsUrl=${@environment.getProperty('upload.goods.view')}">
+										<div id="layerShare" class="setShare open">
+											<span>
+												<button type="button" class="kk" th:attr="onclick=|cfnSendToKakao('${stylelUrl+'/planning/detail/form?planSq='+planInfo.planSq}', '${planInfo.planNm}', '${planView+ '/'+planInfo.mainImg}');|"><span>카카오톡</span></button>
+												<button type="button" class="fb" th:attr="onclick=|sendSns('facebook', '${stylelUrl+'/planning/detail/form?planSq='+planInfo.planSq}', '${planInfo.planNm}', '', '');|"><span>페이스북</span></button>
+												<button type="button" class="tw" th:attr="onclick=|sendSns('twitter', '${stylelUrl+'/planning/detail/form?planSq='+planInfo.planSq}', '${planInfo.planNm+ '#style24몰'}', '', '');|"><span>트위터</span></button>
+												<button type="button" class="url btn_copy"><span>URL</span></button>
+											</span>
+										</div>
+									</div>
+								</div>
 							</div>
 						</div>
 					</div>
@@ -193,10 +206,10 @@
 									<div class="swiper-slide">
 										<a th:onclick="cfnGoToPlanDetail([[${PlanData.planSq}]])">
 											<div class="thumb">
-												<img th:src="${@environment.getProperty('domain.image')+PlanData.mainImg}" alt="${PlanData.planNm}">
+												<img th:src="${@environment.getProperty('upload.image.view')+PlanData.mainImg}" alt="${PlanData.planNm}">
 											</div>
 											<div class="txt">
-												<span class="brand" th:if="${PlanData.cnt > 1}" th:text="${PlanData.brand}+' 외'"></span>
+												<!-- <span class="brand" th:if="${PlanData.cnt > 1}" th:text="${PlanData.brand}+' 외'"></span> -->
 												<p class="tit" th:text="${PlanData.planNm}"></p>
 											</div>
 										</a>
@@ -560,6 +573,7 @@ var useInfoCoupon = function (id) {
 		// 화면 전환 필요		
 	}
 
+	
 //세번째 자리 콤마찍기 (숫자만 포함, 소수점자리 구분)
 function comma(num){
 	return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
@@ -570,11 +584,25 @@ function comma(num){
 		<script type="text/javascript">
 	    // 컨텐츠 호출
         $(document).ready( function() {
-            $("#header").load("head.html");
-            $("#footer").load("foot.html");
-        });
-
-        $(document).ready( function() {
+        	
+        	//공유 버튼 토글 
+    		$("button[data-name=openShare]").on("click", function(){
+    			$(this).toggleClass("on").next(".shareWrap").toggleClass("on");
+    			return false;
+    		});
+    		//영역밖 클릭으로 공유토글 닫기
+    		$("body").on('click', function(e) { 
+    			if(!$(".shareWrap.on").parent().has(e.target).length) {
+    				$("button[data-name=openShare]").removeClass("on");
+    				$(".shareWrap").removeClass("on");
+    			};
+    		});
+    		
+    		$('.btn_copy').bind('click', function() {
+    			copyToClipboard();
+    		});
+    		
+        	
             $(window).scroll(function(){
                 var navOffset = $('.item_header').offset().top - $('.bullet_sticky_nav').height();
                 var windScroll = $(window).scrollTop();

+ 3 - 3
src/main/webapp/WEB-INF/views/web/planning/PlanningMainFormWeb.html

@@ -8,19 +8,19 @@
  * @source  : PlanningMainFormWeb.html
  * @desc    : 기획전메인 Page
  *============================================================================
- * Pastelmall
+ * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION
  * ===  ===========  ==========  =============================================
- * 1.0  2021.03.5   sowon     최초 작성
+ * 1.0  2021.03.05   sowon       최초 작성
  *******************************************************************************
  -->
 <body>
 
 <th:block layout:fragment="content">
 	<!--  container -->
-	<div id="container" class="container dp" th:with="frontUrl=${@environment.getProperty('domain.front')}, goodsView=${@environment.getProperty('upload.goods.view')}">
+	<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>

+ 1 - 2
src/main/webapp/ux/pc/js/mypage.js

@@ -168,10 +168,10 @@ var fnDeleteOrder = function() {
 		sureBtnText: "확인",
 		sureBtnClick: function(){
 			let data = {};
-
 			data.ordNo = ordNo;
 
 			var jsonData = JSON.stringify(data);
+
 			gagajf.ajaxJsonSubmit('/mypage/order/delete', jsonData, function() {
 				cfnGoToPage(_PAGE_MYPAGE);
 			});
@@ -292,7 +292,6 @@ var fnReceipt = function(param) {
 		// URL 설정
 		receiptWin += '?cmd=cash_bill';
 		receiptWin += '&cash_no=' + paymentInfo.cashAuthNo;
-		//receiptWin += '&cash_no=' + paymentInfo.cashTradeNo;		// 둘중 하나 인데 확인 필요
 		receiptWin += '&order_id=' + ordNo;
 		receiptWin += '&trade_mony=' + orderAmtInfo.realOrdAmt + orderAmtInfo.realDelvAmt;
 		

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

@@ -338,7 +338,7 @@ var cfnLoginYes24 = function (requestGb, chkRememberMe) {
  */
 var cfnGoToGoodsDetail = function (goodsCd, colorCd, ithrCd, contentsLoc, planDtlSq, rccode ) {
 	var params = goodsCd;
-	if (typeof (ithrCd) != 'colorCd') params += "&colorCd=" + colorCd;
+	if (typeof (colorCd) != 'undefined') params += "&colorCd=" + colorCd;
 	if (typeof (ithrCd) != 'undefined') params += "&ithrCd=" + ithrCd;
 	if (typeof (contentsLoc) != 'undefined' && contentsLoc != "") params += "&contentsLoc=" + contentsLoc;
 	if (typeof (planDtlSq) != 'undefined') params += "&planDtlSq=" + planDtlSq;

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