package com.style24.front.biz.web;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.gagaframework.web.parameter.GagaMap;
import com.gagaframework.web.rest.server.GagaResponse;
import com.gagaframework.web.rest.server.GagaResponseStatus;
import com.style24.core.biz.service.TscCustomerService;
import com.style24.core.biz.service.TscKakaotalkService;
import com.style24.core.biz.service.TscKcpService;
import com.style24.core.biz.service.TscMailService;
import com.style24.core.biz.service.TscOrderChangeService;
import com.style24.core.biz.service.TscOrderRefundService;
import com.style24.core.biz.service.TscOrderService;
import com.style24.core.biz.service.TscWmsService;
import com.style24.core.support.env.TscConstants;
import com.style24.core.support.message.TscMessageByLocale;
import com.style24.front.biz.service.TsfCartService;
import com.style24.front.biz.service.TsfCommonService;
import com.style24.front.biz.service.TsfDeliveryService;
import com.style24.front.biz.service.TsfGiftcardService;
import com.style24.front.biz.service.TsfOrderChangeService;
import com.style24.front.biz.service.TsfOrderService;
import com.style24.front.biz.service.TsfRendererService;
import com.style24.front.support.controller.TsfBaseController;
import com.style24.front.support.security.session.TsfSession;
import com.style24.persistence.TscPageRequest;
import com.style24.persistence.domain.Cart;
import com.style24.persistence.domain.CustAccount;
import com.style24.persistence.domain.Order;
import com.style24.persistence.domain.OrderChange;
import com.style24.persistence.domain.SweetTracker;

import lombok.extern.slf4j.Slf4j;

/**
 * 비회원 Controller
 * 
 * @author card007
 * @since 2021. 04. 27
 */
@Controller
@RequestMapping("/noMember")
@Slf4j
public class TsfNoMemberController extends TsfBaseController {

	@Autowired
	private Environment env;

	@Autowired
	private TscMessageByLocale message;

	@Autowired
	private TscOrderService coreOrderService;

	@Autowired
	private TsfOrderService orderService;

	@Autowired
	private TsfCartService cartService;

	@Autowired
	private TscCustomerService coreCustomerService;

	@Autowired
	private TsfOrderChangeService orderChangeService;

	@Autowired
	private TscOrderChangeService coreOrderChangeService;

	@Autowired
	private TscOrderRefundService coreOrderRefundService;

	@Autowired
	private TsfRendererService rendererService;

	@Autowired
	private TsfGiftcardService giftcardService;

	@Autowired
	private TsfCommonService commonService;

	@Autowired
	private TscWmsService coreWmsService;

	@Autowired
	private TsfDeliveryService deliveryService;
	
	@Autowired
	private TscKcpService coreKcpService;

	@Autowired
	private TscKakaotalkService coreKakaotalkService;

	@Autowired
	private TscMailService mailService;

	/**
	 * 비회원 주문 내역
	 *
	 * @param Order(ordNm, ordPhnno, ordNo)
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 04. 27
	 */
	@GetMapping("/order/list/form")
	public ModelAndView noMemberOrderListForm() {
		ModelAndView mav = new ModelAndView();

		// 로그인 상태이면 메인으로 리다이렉트 처리
		if (TsfSession.isLogin()) {
			mav.setViewName("redirect:/");
			return mav;
		}

		// 비회원 정보 유효성 체크
		if (StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNo"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNm"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdPhnno"))) {
			// 세션에 비회원 정보가 없으면 비회원 주문 조회 화면으로 리다이렉트 처리
			mav.setViewName("redirect:/customer/noncust/order/confirm/form");
			return mav;
		}

		// 비회원 정보 설정
		Order order = new Order();
		order.setOrdNo(Integer.parseInt(TsfSession.getAttribute("noMemberOrdNo")));
		order.setOrdNm(TsfSession.getAttribute("noMemberOrdNm"));
		order.setOrdPhnno(TsfSession.getAttribute("noMemberOrdPhnno"));

		// 핸드폰번호 하이픈 처리
		if (!order.getOrdPhnno().contains("-")) {
			order.setOrdPhnno(order.getOrdPhnno().replaceAll("(\\d{3})(\\d{3,4})(\\d{4})", "$1-$2-$3"));
		}

		mav.addObject("ordNo", order.getOrdNo());
		mav.addObject("ordNm", order.getOrdNm());
		mav.addObject("ordPhnno", order.getOrdPhnno());

		// 로그인여부 설정
		mav.addObject("isLogin", false);

		// 주문 상태 별 수량 조회
		mav.addObject("orderCount", coreOrderService.getOrderStatCount(order));

		// 2021.04.21 모바일에서 사용하려고 추가
		int totalCnt = orderService.getPagingOrdNoListCount(order);
		mav.addObject("totalCnt", totalCnt);

		// 주문상세상태코드 설정
		mav.addObject("ordDtlStatList", rendererService.getCommonCodeList("G013", "Y", new String[] {"G013_10", "G013_11", "G013_25", "G013_35", "G013_55", "G013_97", "G013_98", "G013_99"}));

		mav.setViewName(super.getDeviceViewName("mypage/NoMemberOrderListForm"));

		return mav;
	}

	/**
	 * 비회원 주문상세 화면
	 * 
	 * @param Order
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 04. 28
	 */
	@GetMapping("/order/detail/form")
	public ModelAndView noMemberOrderDetailForm() {
		ModelAndView mav = new ModelAndView();

		// 로그인 상태이면 메인으로 리다이렉트 처리
		if (TsfSession.isLogin()) {
			mav.setViewName("redirect:/");
			return mav;
		}

		// 비회원 정보 유효성 체크
		if (StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNo"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNm"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdPhnno"))) {
			// 세션에 비회원 정보가 없으면 비회원 주문 조회 화면으로 리다이렉트 처리
			mav.setViewName("redirect:/customer/noncust/order/confirm/form");
			return mav;
		}

		// 비회원 정보 설정
		Order order = new Order();
		order.setOrdNo(Integer.parseInt(TsfSession.getAttribute("noMemberOrdNo")));
		order.setOrdNm(TsfSession.getAttribute("noMemberOrdNm"));
		order.setOrdPhnno(TsfSession.getAttribute("noMemberOrdPhnno"));

		// 핸드폰번호 하이픈 처리
		if (!order.getOrdPhnno().contains("-")) {
			order.setOrdPhnno(order.getOrdPhnno().replaceAll("(\\d{3})(\\d{3,4})(\\d{4})", "$1-$2-$3"));
		}

		mav.addObject("ordNo", order.getOrdNo());
		mav.addObject("ordNm", order.getOrdNm());
		mav.addObject("ordPhnno", order.getOrdPhnno());

		// 로그인여부 설정
		mav.addObject("isLogin", false);

		// 주문목록 조회
		Collection<GagaMap> orderList = orderService.getOrderListForMypage(order);

		if (orderList.size() == 0) {
			mav.setViewName("redirect:/noMember/order/list/form");
			return mav;
		}

		mav.addObject("orderList", orderList);
		mav.addObject("oneData", orderList.iterator().next().get("oneData"));
		mav.addObject("allCanYn", orderList.iterator().next().get("allCanYn"));
		mav.addObject("canChgAddr", orderList.iterator().next().get("canChgAddr"));

		// 주문정보 조회
		mav.addObject("orderInfo", coreOrderService.getOrderInfoList(order).iterator().next());

		// 주문 금액정보 조회
		mav.addObject("orderAmtInfo", orderService.getOrderAmtForMypage(order));

		// 주문 결제정보 조회
		mav.addObject("paymentInfo", orderService.getPaymentInfoForMypage(order));

		// 주문 배송지 정보 조회
		mav.addObject("deliveryAddrInfo", orderService.getOrderDeliveryAddrInfo(order));

		// 상품권 현금영수증 신청 정보 조회
		mav.addObject("cashReceiptsInfo", giftcardService.getCashReceiptsRequestInfo(order));

		// KCP 전표 경로 설정
		mav.addObject("kcpReceiptUrl", env.getProperty("pg.kcp.receipt.url"));

		mav.setViewName(super.getDeviceViewName("mypage/NoMemberOrderDetailForm"));

		return mav;
	}

	/**
	 * 비회원 주문목록 조회
	 * 
	 * @param Order
	 * @return GagaMap
	 * @author card007
	 * @since 2021. 04. 28
	 */
	@PostMapping("/order/list")
	@ResponseBody
	public GagaMap getOrderList(@RequestBody Order order) {
		GagaMap map = new GagaMap();

		// 페이징 처리 설정
		TscPageRequest pageable = new TscPageRequest((order.getPageNo() > 0 ? order.getPageNo() - 1 : 0), order.getPageSize(), order.getPageUnit());
		pageable.setTotalCount(orderService.getPagingOrdNoListCount(order));
		order.setPageable(pageable);

		// 페이징 처리 및 주문정보 조회
		List<Integer> ordNoList = new ArrayList<>();

		for (Order tmpOrder : orderService.getPagingOrdNoList(order)) {
			ordNoList.add(tmpOrder.getOrdNo());
		}

		if (ordNoList.size() > 0) {
			order.setOrdNoList(ordNoList.stream().mapToInt(Integer::intValue).toArray());
			map.set("orderList", orderService.getOrderListForMypage(order));
		}

		map.set("orderInfo", order);

		return map;
	}

	/**
	 * 비회원 주문상세 주문내역 삭제
	 * 
	 * @param Order
	 * @return GagaMap
	 * @author card007
	 * @since 2021. 04. 28
	 */
	@PostMapping("/order/delete")
	@ResponseBody
	public GagaMap deleteOrder(@RequestBody Order order) {
		GagaMap result = new GagaMap();

		// 주문내역 삭제 처리
		order.setUpdNo(0);
		int chk = orderService.updateOrderDisplayYn(order);

		if (chk > 0) {
			result.set("message", message.getMessage("SUCC_0003"));
			result.set("status", GagaResponseStatus.SUCCESS.getCode());
		} else {
			result.set("message", message.getMessage("FAIL_0003"));
			result.set("status", GagaResponseStatus.FAIL.getCode());
		}

		return result;
	}

	/**
	 * 비회원 주문정보 확인
	 *
	 * @param order - 주문번호, 주문자명, 휴대폰번호
	 * @return GagaMap
	 * @author jsshin
	 * @since 2021. 04. 28
	 */
	@PostMapping("/order/info/validation")
	@ResponseBody
	public GagaMap getOrderInfoValidation(@RequestBody Order order) {
		GagaMap result = new GagaMap();
		if (!order.getOrdPhnno().contains("-")) {
			order.setOrdPhnno(order.getOrdPhnno().replaceAll("(\\d{3})(\\d{3,4})(\\d{4})", "$1-$2-$3"));
		}
		boolean isFind = orderService.getNoMemberOrderInfo(order) > 0;

		if (isFind) {
			TsfSession.setAttribute("noMemberOrdNm",order.getOrdNm());
			TsfSession.setAttribute("noMemberOrdNo", String.valueOf(order.getOrdNo()));
			TsfSession.setAttribute("noMemberOrdPhnno",order.getOrdPhnno());
		}

		result.setBoolean("isFind", isFind);
		return result;
	}

	/**
	 * 비회원 반품신청 환불금액 계산
	 * 
	 * @param OrderChange
	 * @return GagaMap
	 * @author card007
	 * @since 2021. 04. 28
	 */
	@SuppressWarnings("unchecked")
	@PostMapping("/cancel/refund/amt/calculate")
	@ResponseBody
	public GagaMap calculateRefundAmt(@RequestBody OrderChange orderChange) {
		if (orderChange == null) {
			throw new IllegalStateException(message.getMessage("FAIL_1001"));
		}

		// 비회원 정보 설정
		orderChange.setOrdNo(Integer.parseInt(TsfSession.getAttribute("noMemberOrdNo")));
		orderChange.setOrdNm(TsfSession.getAttribute("noMemberOrdNm"));
		orderChange.setOrdPhnno(TsfSession.getAttribute("noMemberOrdPhnno"));

		// 핸드폰번호 하이픈 처리
		if (!orderChange.getOrdPhnno().contains("-")) {
			orderChange.setOrdPhnno(orderChange.getOrdPhnno().replaceAll("(\\d{3})(\\d{3,4})(\\d{4})", "$1-$2-$3"));
		}

		// 2. 환불 사전 정보 조회
		GagaMap refundPreInfo = coreOrderChangeService.getRefundPreInfo(orderChange);
		List<Order> cnclReqList = (List<Order>)refundPreInfo.get("cnclReqList");

		return coreOrderRefundService.cnclRtnRefundAmt(cnclReqList);
	}

	/**
	 * 비회원 배송지 정보 수정
	 * 
	 * @param Order
	 * @return GagaMap
	 * @author card007
	 * @since 2021. 04. 28
	 */
	@PostMapping("/change/delvery/addr")
	@ResponseBody
	public GagaMap changeDelveryAddr(@RequestBody Order order) {
		GagaMap result = new GagaMap();
		result.set("status", GagaResponseStatus.SUCCESS.getCode());
		result.set("message", message.getMessage("DELV_0001"));

		try {
			order.setCustNo(0);

			// 배송지 수정 처리
			commonService.updateDeliverAddr(order);

			// WMS 배송지 수정 처리
			coreWmsService.updateWmsDeliveryChangeAddr(order);
		} catch (Exception e) {
			result.set("status", GagaResponseStatus.FAIL.getCode());
			result.set("message", message.getMessage("FAIL_0002"));
		}

		return result;
	}

	/**
	 * 비회원 배송 메모 수정
	 *
	 * @param Order
	 * @return GagaMap
	 * @author card007
	 * @since 2021. 04. 28
	 */
	@PostMapping("/change/delvery/memo")
	@ResponseBody
	public GagaMap changeDelveryAddrDelvMemo(@RequestBody Order order) {
		GagaMap result = new GagaMap();
		result.set("status", GagaResponseStatus.SUCCESS.getCode());
		result.set("message", message.getMessage("DELV_0002"));

		order.setCustNo(0);

		try {
			// 배송메모 수정 처리
			commonService.updateDeliverAddrDelvMemo(order);

			// WMS 배송메모 수정 처리
			coreWmsService.updateWmsDeliveryMemo(order);
		} catch (Exception e) {
			result.set("status", GagaResponseStatus.FAIL.getCode());
			result.set("message", message.getMessage("FAIL_0002"));
		}

		return result;
	}

	/**
	 * 비회원 회수지 정보 수정
	 * 
	 * @param OrderChange
	 * @return GagaMap
	 * @author card007
	 * @since 2021. 04. 28
	 */
	@PostMapping("/change/chger/addr")
	@ResponseBody
	public GagaMap changeChgerAddr(@RequestBody OrderChange orderChange) {
		GagaMap result = new GagaMap();
		result.set("status", GagaResponseStatus.SUCCESS.getCode());
		result.set("message", message.getMessage("DELV_0003"));

		try {
			orderChange.setUpdNo(0);

			// 회수지 정보 수정 처리
			coreOrderChangeService.updateChgerAddr(orderChange);

			// WMS 회수지 정보 수정 처리
			Order order = new Order();
			order.setOrdNo(orderChange.getOrdNo());
			order.setChgerZipcode(orderChange.getChgerZipcode());
			order.setChgerBaseAddr(orderChange.getChgerBaseAddr());
			order.setChgerDtlAddr(orderChange.getChgerDtlAddr());
			order.setChgerRtnMemo(orderChange.getChgerRtnMemo());
			order.setOrdChgSq(orderChange.getOrdChgSq());

			coreWmsService.updateWmsRecallChangeAddr(order);
		} catch (Exception e) {
			result.set("status", GagaResponseStatus.FAIL.getCode());
			result.set("message", message.getMessage("FAIL_0002"));
		}

		return result;
	}

	/**
	 * 비회원 반품메모 수정
	 *
	 * @param Order
	 * @return GagaMap
	 * @author card007
	 * @since 2021. 04. 13
	 */
	@PostMapping("/change/chger/rtn/memo")
	@ResponseBody
	public GagaMap changeChgerRtnMemo(@RequestBody OrderChange orderChange) {
		GagaMap result = new GagaMap();
		result.set("status", GagaResponseStatus.SUCCESS.getCode());
		result.set("message", message.getMessage("DELV_0004"));

		try {
			orderChange.setUpdNo(0);

			// 반품메모 수정 처리
			coreOrderChangeService.updateChgerRtnMemo(orderChange);

			// WMS IF 반품메모 수정 처리
			Order order = new Order();
			order.setOrdNo(orderChange.getOrdNo());
			order.setChgerRtnMemo(orderChange.getChgerRtnMemo());
			order.setOrdChgSq(orderChange.getOrdChgSq());
			coreWmsService.updateWmsRecallChangeMemo(order);
		} catch (Exception e) {
			throw new IllegalStateException(message.getMessage("FAIL_0002"));
		}

		return result;
	}

	/**
	 * 비회원 취소신청 화면
	 *
	 * @param Order
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 04. 28
	 */
	@GetMapping("/cancel/form")
	@ResponseBody
	public ModelAndView noMemberCancelForm(Order order) {
		ModelAndView mav = new ModelAndView();

		// 로그인 상태이면 메인으로 리다이렉트 처리
		if (TsfSession.isLogin()) {
			mav.setViewName("redirect:/");
			return mav;
		}

		// 비회원 정보 유효성 체크
		if (StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNo"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNm"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdPhnno"))) {
			// 세션에 비회원 정보가 없으면 비회원 주문 조회 화면으로 리다이렉트 처리
			mav.setViewName("redirect:/customer/noncust/order/confirm/form");
			return mav;
		}

		// 비회원 정보 설정
		order.setOrdNo(Integer.parseInt(TsfSession.getAttribute("noMemberOrdNo")));
		order.setOrdNm(TsfSession.getAttribute("noMemberOrdNm"));
		order.setOrdPhnno(TsfSession.getAttribute("noMemberOrdPhnno"));

		// 핸드폰번호 하이픈 처리
		if (!order.getOrdPhnno().contains("-")) {
			order.setOrdPhnno(order.getOrdPhnno().replaceAll("(\\d{3})(\\d{3,4})(\\d{4})", "$1-$2-$3"));
		}

		mav.addObject("ordNo", order.getOrdNo());
		mav.addObject("ordNm", order.getOrdNm());
		mav.addObject("ordPhnno", order.getOrdPhnno());

		// 로그인여부 설정
		mav.addObject("isLogin", false);

		// 취소 가능 리스트 조회
		GagaMap map = orderChangeService.getCancelListForMypage(order);
		Order oneData = (Order)map.get("oneData");
		mav.addObject("cancelList", map);
		mav.addObject("oneData", oneData);

		// 주문 결제정보 조회
		mav.addObject("paymentInfo", orderService.getPaymentInfoForMypage(order));

		// 2021.05.03 은행목록추가
		mav.addObject("bankList", rendererService.getCommonCodeList("G942", "Y"));

		mav.setViewName(super.getDeviceViewName("/mypage/NoMemberCancelForm"));

		return mav;
	}

	/**
	 * 비회원 취소신청
	 *
	 * @param Collection<Order>
	 * @return GagaMap
	 * @author card007
	 * @since 2021. 04. 28
	 */
	@SuppressWarnings("unchecked")
	@PostMapping("/cancel")
	@ResponseBody
	public GagaMap cancel(@RequestBody OrderChange orderChange) {
		if (orderChange == null) {
			throw new IllegalStateException(message.getMessage("FAIL_1001"));
		}

		// 비회원 정보 설정
		orderChange.setOrdNm(TsfSession.getAttribute("noMemberOrdNm"));
		orderChange.setOrdPhnno(TsfSession.getAttribute("noMemberOrdPhnno"));

		// 핸드폰번호 하이픈 처리
		if (!orderChange.getOrdPhnno().contains("-")) {
			orderChange.setOrdPhnno(orderChange.getOrdPhnno().replaceAll("(\\d{3})(\\d{3,4})(\\d{4})", "$1-$2-$3"));
		}

		// 1. 취소완료 처리
		orderChange.setCustNo(0);
		GagaMap result = coreOrderChangeService.orderCancelPreInfo(orderChange, 0);

		// 2. 취소완료 카카오알림톡 발송
		int ordChgSq = result.getInt("ordChgSq");

		if (ordChgSq > 0) {
			try {
				// 취소 알림톡 관련 정보 조회
				orderChange = coreOrderChangeService.getKakaoOrderCancelInfo(ordChgSq);

				// 취소 알림톡 발송
				if (StringUtils.isNotBlank(orderChange.getOrdPhnno())) {
					coreKakaotalkService.sendOrderCancelComplete(orderChange, 0);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}

			try {
				// 취소 안내 메일 정보 조회
				GagaMap replaceInfo = coreOrderChangeService.getMailOrderCancelReplaceInfo(orderChange);

				// 취소 안내 메일 발송
				if (orderChange != null && StringUtils.isNotBlank(replaceInfo.getString("ordEmail"))) {
					mailService.sendOrderCancel(replaceInfo, 0);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		result.set("status", GagaResponseStatus.SUCCESS.getCode());
		result.set("message", message.getMessage("CANCEL_0001"));

		return result;
	}

	/**
	 * 마이페이지 장바구니 관련 정보 조회
	 *
	 * @param Cart
	 * @return Collecion<Cart>
	 * @author card007
	 * @since 2021. 04. 28
	 */
	@PostMapping("/cart/add/info")
	@ResponseBody
	public Collection<Cart> getAddCartInfo(@RequestBody Cart cart) {
		return cartService.getAddCartInfoForMypage(cart);
	}

	/**
	 * 비회원 반품신청 화면
	 *
	 * @param Order
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 05. 02
	 */
	@GetMapping("/return/form")
	@ResponseBody
	public ModelAndView returnForm(Order order) {
		ModelAndView mav = new ModelAndView();

		// 로그인 상태이면 메인으로 리다이렉트 처리
		if (TsfSession.isLogin()) {
			mav.setViewName("redirect:/");
			return mav;
		}

		// 비회원 정보 유효성 체크
		if (StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNo"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNm"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdPhnno"))) {
			// 세션에 비회원 정보가 없으면 비회원 주문 조회 화면으로 리다이렉트 처리
			mav.setViewName("redirect:/customer/noncust/order/confirm/form");
			return mav;
		}

		// 비회원 정보 설정
		order.setOrdNo(Integer.parseInt(TsfSession.getAttribute("noMemberOrdNo")));
		order.setOrdNm(TsfSession.getAttribute("noMemberOrdNm"));
		order.setOrdPhnno(TsfSession.getAttribute("noMemberOrdPhnno"));

		// 핸드폰번호 하이픈 처리
		if (!order.getOrdPhnno().contains("-")) {
			order.setOrdPhnno(order.getOrdPhnno().replaceAll("(\\d{3})(\\d{3,4})(\\d{4})", "$1-$2-$3"));
		}

		mav.addObject("ordNo", order.getOrdNo());
		mav.addObject("ordNm", order.getOrdNm());
		mav.addObject("ordPhnno", order.getOrdPhnno());

		// 로그인여부 설정
		mav.addObject("isLogin", false);

		// 반품 가능 리스트 조회
		order.setChgGb(TscConstants.OrderChangeGb.RETURN.value());
		GagaMap map = orderChangeService.getReturnListForMypage(order);
		Order oneData = (Order)map.get("oneData");
		mav.addObject("returnList", map);
		mav.addObject("oneData", oneData);

		// 주문 결제정보 조회
		mav.addObject("paymentInfo", orderService.getPaymentInfoForMypage(order));

		// 주문 배송지 정보 조회
		mav.addObject("deliveryAddrInfo", orderService.getOrderDeliveryAddrInfo(order));

		// 반품 사유 목록 조회
		mav.addObject("returnReason", rendererService.getCommonCodeList("G688", "Y"));

		// 2021.05.03 은행목록추가
		mav.addObject("bankList", rendererService.getCommonCodeList("G942", "Y"));

		// 2021.08.26 card007 택배사목록 추가
		mav.addObject("shipCompanyList", rendererService.getShipCompanyList());

		mav.setViewName(super.getDeviceViewName("/mypage/NoMemberReturnForm"));

		return mav;
	}

	/**
	 * 반품신청
	 *
	 * @param OrderChange
	 * @return GagaMap
	 * @author card007
	 * @since 2021. 05. 02
	 */
	@SuppressWarnings("unchecked")
	@PostMapping("/return")
	@ResponseBody
	public GagaMap rtnReq(@RequestBody OrderChange orderChange) {
		if (orderChange == null) {
			throw new IllegalStateException(message.getMessage("FAIL_1001"));
		}

		// 비회원 정보 설정
		orderChange.setOrdNm(TsfSession.getAttribute("noMemberOrdNm"));
		orderChange.setOrdPhnno(TsfSession.getAttribute("noMemberOrdPhnno"));

		// 핸드폰번호 하이픈 처리
		if (!orderChange.getOrdPhnno().contains("-")) {
			orderChange.setOrdPhnno(orderChange.getOrdPhnno().replaceAll("(\\d{3})(\\d{3,4})(\\d{4})", "$1-$2-$3"));
		}

		// 2. 환불 사전 정보 조회
		GagaMap refundPreInfo 		= coreOrderChangeService.getRefundPreInfo(orderChange);
		List<Order> returnReqList 	= (List<Order>)refundPreInfo.get("cnclReqList");

		// 3. 환불금액계산
		GagaMap result 				= coreOrderRefundService.cnclRtnRefundAmt(returnReqList);

		// 4. 주문변경 기본정보 설정
		result.set("ordNo"			, orderChange.getOrdNo());				// 주문번호
		result.set("custNo"			, 0);									// 고객번호
		result.set("regNo"			, 0);									// 등록자번호
		result.set("updNo"			, 0);									// 수정자번호
		result.set("chgReason"		, orderChange.getChgReason());			// 변경사유
		result.set("chgMemo"		, orderChange.getChgMemo());			// 변경메모

		result.set("accountNo"		, orderChange.getAccountNo());			// 환불계좌번호
		result.set("accountNm"		, orderChange.getAccountNm());			// 환불계좌예금주명
		result.set("bankCd"			, orderChange.getBankCd());				// 환불계좌은행코드

		result.set("isCustomer"		, orderChange.getIsCustomer());			// 변경사유 (고객, 회사)
		result.set("wdGb"			, orderChange.getWdGb());				// 회수방법
		result.set("wdInvoiceNo"	, orderChange.getWdInvoiceNo());		// 회수송장번호
		result.set("shipCompCd"		, orderChange.getShipCompCd());			// 회수택배사코드

		// 5. 주문변경 회수지정보 추가
		result.set("chgerNm"		, orderChange.getChgerNm());			// 변경자명
		result.set("chgerEmail"		, orderChange.getChgerEmail());			// 변경자이메일주소
		result.set("chgerZipcode"	, orderChange.getChgerZipcode());		// 회수지우편번호
		result.set("chgerBaseAddr"	, orderChange.getChgerBaseAddr());		// 회수지기본주소
		result.set("chgerDtlAddr"	, orderChange.getChgerDtlAddr());		// 회수지상세주소
		result.set("chgerPhnno"		, orderChange.getChgerPhnno());			// 변경자핸드폰번호
		result.set("chgerTelno"		, orderChange.getChgerTelno());			// 변경자전화번호
		result.set("chgerRtnMemo"	, orderChange.getChgerRtnMemo());		// 반품메모

		// 6. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL, TB_REFUND)
		GagaMap map = coreOrderChangeService.returnRequest(result);
		int ordChgSq = map.getInt("ordChgSq");
		int addPayCost = map.getInt("addPayCost");

		if (ordChgSq > 0) {
			try {
				// 반품 알림톡 관련 정보 조회
				orderChange = coreOrderChangeService.getKakaoOrderReturnInfo(ordChgSq);

				// 반품 알림톡 발송
				if (StringUtils.isNotBlank(orderChange.getOrdPhnno())) {
					coreKakaotalkService.sendOrderReturnRequest(orderChange, 0);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}

			try {
				// 반품배송비 있을 시 추가결제완료 로직에서 메일 전송
				if (addPayCost == 0) {
					// 반품 안내 메일 정보 조회
					GagaMap replaceInfo = coreOrderChangeService.getMailOrderReturnReplaceInfo(orderChange);

					// 반품 안내 메일 발송
					if (StringUtils.isNotBlank(replaceInfo.getString("ordEmail"))) {
						mailService.sendOrderReturn(replaceInfo, 0);
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		result.set("status", GagaResponseStatus.SUCCESS.getCode());
		if (orderChange.getAddPayCost() == 0) {
			result.set("message", message.getMessage("RETURN_0001"));
		}

		return result;
	}

	/**
	 * 반품요청철회
	 *
	 * @param OrderChange
	 * @return GagaResponse
	 * @author card007
	 * @since 2021. 05. 02
	 */
	@PostMapping("/return/cancel")
	@ResponseBody
	public GagaResponse rtnReqCancel(@RequestBody OrderChange orderChange) {

		if (orderChange== null) {
			throw new IllegalStateException(message.getMessage("FAIL_1001"));
		}

		// 1. 반품요청철회 정보 설정
		int custNo = TsfSession.isLogin() ? TsfSession.getInfo().getCustNo() : 0;
		GagaMap map = new GagaMap();
		map.set("ordNo"			, orderChange.getOrdNo());
		map.set("ordChgSq"		, orderChange.getOrdChgSq());
		map.set("custNo"		, custNo);
		map.set("ipAddress"		, TsfSession.getIpAddress());

		// 2.반품요청철회 
		coreOrderChangeService.rtnReqCancel(map, custNo);

		return super.ok(message.getMessage("RETURN_0002"));
		// return super.ok();
	}

	/**
	 * 환불계좌 등록 팝업
	 *
	 * @param OrderChange
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 05. 02
	 */
	@ResponseBody
	@RequestMapping(value = "/refund/account/register/popup/form")
	public ModelAndView registerRefundAccountPopupForm(@RequestBody OrderChange orderChange) {
		ModelAndView mav = new ModelAndView();

		// 계좌인증용 은행코드 조회
		mav.addObject("bankList", rendererService.getAvailCommonCodeList("G942"));

		// 계좌주명 설정
		mav.addObject("accountNm", orderChange.getAccountNm());

		// 주문번호 설정
		mav.addObject("ordNo", orderChange.getOrdNo());

		mav.setViewName(super.getDeviceViewName("popup/RefundAccountAddPopupForm"));

		return mav;
	}

	/**
	 * 비회원 교환신청 화면
	 *
	 * @param Order
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 05. 02
	 */
	@GetMapping("/exchange/form")
	@ResponseBody
	public ModelAndView exchangeForm(Order order) {
		ModelAndView mav = new ModelAndView();

		// 로그인 상태이면 메인으로 리다이렉트 처리
		if (TsfSession.isLogin()) {
			mav.setViewName("redirect:/");
			return mav;
		}

		// 비회원 정보 유효성 체크
		if (StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNo"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNm"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdPhnno"))) {
			// 세션에 비회원 정보가 없으면 비회원 주문 조회 화면으로 리다이렉트 처리
			mav.setViewName("redirect:/customer/noncust/order/confirm/form");
			return mav;
		}

		// 비회원 정보 설정
		order.setOrdNo(Integer.parseInt(TsfSession.getAttribute("noMemberOrdNo")));
		order.setOrdNm(TsfSession.getAttribute("noMemberOrdNm"));
		order.setOrdPhnno(TsfSession.getAttribute("noMemberOrdPhnno"));

		// 핸드폰번호 하이픈 처리
		if (!order.getOrdPhnno().contains("-")) {
			order.setOrdPhnno(order.getOrdPhnno().replaceAll("(\\d{3})(\\d{3,4})(\\d{4})", "$1-$2-$3"));
		}

		mav.addObject("ordNo", order.getOrdNo());
		mav.addObject("ordNm", order.getOrdNm());
		mav.addObject("ordPhnno", order.getOrdPhnno());

		// 로그인여부 설정
		mav.addObject("isLogin", false);

		// 교환 가능 리스트 조회
		order.setChgGb(TscConstants.OrderChangeGb.EXCHANGE.value());
		GagaMap map = orderChangeService.getReturnListForMypage(order);
		Order oneData = (Order)map.get("oneData");
		mav.addObject("exchangeList", map);
		mav.addObject("oneData", oneData);

		// 주문 배송지 정보 조회
		mav.addObject("deliveryAddrInfo", orderService.getOrderDeliveryAddrInfo(order));

		// 교환 사유 목록 조회
		mav.addObject("exchangeReason", rendererService.getCommonCodeList("G689", "Y"));

		// 2021.08.26 card007 택배사목록 추가
		mav.addObject("shipCompanyList", rendererService.getShipCompanyList());

		mav.setViewName(super.getDeviceViewName("/mypage/NoMemberExchangeForm"));

		return mav;
	}

	/**
	 * 비회원 교환 옵션 변경 팝업
	 * 
	 * @param Order
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 05. 02
	 */
	@PostMapping("/change/option/popup/form")
	@ResponseBody
	public ModelAndView changeOptionPopupForm(OrderChange orderChange) {
		ModelAndView mav = new ModelAndView();

		// 교환 옵션 정보 조회
		Collection<OrderChange> exchangeOptionInfo = orderChangeService.getExchangeOptionInfo(orderChange);
		mav.addObject("exchangeOptionInfo", exchangeOptionInfo);
		mav.addObject("oneData", exchangeOptionInfo.iterator().next());
		mav.addObject("ordDtlNo", orderChange.getOrdDtlNo());
		mav.addObject("chgQty", orderChange.getChgQty());

		mav.setViewName(super.getDeviceViewName("mypage/ChangeOptionPopupForm"));

		return mav;
	}

	/**
	 * 교환신청
	 *
	 * @param OrderChange
	 * @return GagaMap
	 * @author card007
	 * @since 2021. 05. 02
	 */
	@SuppressWarnings("unchecked")
	@PostMapping("/exchange")
	@ResponseBody
	public GagaMap excReq(@RequestBody OrderChange orderChange) {
		GagaMap result = new GagaMap();

		// 교환요청 데이터 확인
		if (orderChange == null) {
			result.set("status", GagaResponseStatus.FAIL.getCode());
			result.set("message", message.getMessage("FAIL_1001"));
			return result;
		}

		// 고객번호 설정
		orderChange.setUpdNo(0);
		orderChange.setRegNo(0);

		// 교환처리
		result = coreOrderChangeService.exchReq(orderChange);
		int ordChgSq = result.getInt("ordChgSq");
		int addPayCost = result.getInt("addPayCost");

		if (ordChgSq > 0) {
			try {
				// 교환 알림톡 관련 정보 조회
				orderChange = coreOrderChangeService.getKakaoOrderReturnInfo(ordChgSq);

				// 교환 알림톡 발송
				if (StringUtils.isNotBlank(orderChange.getOrdPhnno())) {
					coreKakaotalkService.sendOrderExchangeRequest(orderChange, 0);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}

			try {
				// 교환배송비 있을 시 추가결제완료 로직에서 메일 발송
				if (addPayCost == 0) {
					// 교환 안내 메일 정보 조회
					GagaMap replaceInfo = coreOrderChangeService.getMailOrderExchangeReplaceInfo(orderChange);

					// 교환 안내 메일 발송
					if (StringUtils.isNotBlank(replaceInfo.getString("ordEmail"))) {
						mailService.sendOrderExchange(replaceInfo, 0);
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		// 처리 결과 코드에 따른 메세지 설정
		if (result.get("status").equals(GagaResponseStatus.SUCCESS.getCode())) {
			if (orderChange.getAddPayCost() == 0) {
				result.set("message", message.getMessage("EXCHANGE_0001"));
			}
		} else {
			result.set("message", message.getMessage("FAIL_0004"));
		}

		return result;
	}

	/**
	 * 교환요청철회
	 *
	 * @param OrderChange
	 * @return GagaResponse
	 * @author card007
	 * @since 2021. 04. 20
	 */
	@PostMapping("/exchange/cancel")
	@ResponseBody
	public GagaResponse exchangeRequestCancel(@RequestBody OrderChange orderChange) {

		if (orderChange== null) {
			throw new IllegalStateException(message.getMessage("FAIL_1001"));
		}

		// 1. 교환요청철회 정보 설정
		orderChange.setCustNo(0);
		orderChange.setRegNo(0);
		orderChange.setUpdNo(0);

		String ipAddress = TsfSession.getIpAddress();
		orderChange.setIpAddress(ipAddress);

		// 2.교환요청철회 
		coreOrderChangeService.exchangeCancel(orderChange);

		return super.ok(message.getMessage("EXCHANGE_0002"));
		// return super.ok();
	}

	/**
	 * 비회원 상태별 수량 조회
	 *
	 * @param Order
	 * @return GagaMap
	 * @author card007
	 * @since 2021. 05. 02
	 */
	@PostMapping("/status/count")
	@ResponseBody
	public GagaMap fnReloadStatusCount(@RequestBody Order order) {
		GagaMap result = new GagaMap();

		// 상태별 수량 조회
		result.set("orderCount", coreOrderService.getOrderStatCount(order));

		result.set("status", GagaResponseStatus.SUCCESS.getCode());

		return result;
	}

	/**
	 * 비회원 취반교 목록 화면
	 * 
	 * @param Order
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 05. 02
	 */
	@GetMapping("/cre/list/form")
	public ModelAndView mypageCreListForm() {
		ModelAndView mav = new ModelAndView();

		// 로그인 상태이면 메인으로 리다이렉트 처리
		if (TsfSession.isLogin()) {
			mav.setViewName("redirect:/");
			return mav;
		}

		// 비회원 정보 유효성 체크
		if (StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNo"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNm"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdPhnno"))) {
			// 세션에 비회원 정보가 없으면 비회원 주문 조회 화면으로 리다이렉트 처리
			mav.setViewName("redirect:/customer/noncust/order/confirm/form");
			return mav;
		}

		// 비회원 정보 설정
		Order order = new Order();
		order.setOrdNo(Integer.parseInt(TsfSession.getAttribute("noMemberOrdNo")));
		order.setOrdNm(TsfSession.getAttribute("noMemberOrdNm"));
		order.setOrdPhnno(TsfSession.getAttribute("noMemberOrdPhnno"));

		// 핸드폰번호 하이픈 처리
		if (!order.getOrdPhnno().contains("-")) {
			order.setOrdPhnno(order.getOrdPhnno().replaceAll("(\\d{3})(\\d{3,4})(\\d{4})", "$1-$2-$3"));
		}

		mav.addObject("ordNo", order.getOrdNo());
		mav.addObject("ordNm", order.getOrdNm());
		mav.addObject("ordPhnno", order.getOrdPhnno());

		// 로그인여부 설정
		mav.addObject("isLogin", false);

		// 주문 상태 별 수량 조회
		mav.addObject("orderCount", coreOrderService.getOrderStatCount(order));

		// 2021.04.21 모바일에서 사용하려고 추가
		OrderChange orderChange = new OrderChange();
		orderChange.setOrdNo(order.getOrdNo());
		orderChange.setOrdNm(order.getOrdNm());
		orderChange.setOrdPhnno(order.getOrdPhnno());
		int totalCnt = orderChangeService.getPagingCreListCount(orderChange);
		mav.addObject("totalCnt", totalCnt);

		// 주문상세상태코드 설정
		mav.addObject("chgStatList", rendererService.getCommonCodeList("G685", "Y", new String[] {"G685_10", "G685_11", "G685_19"}));

		mav.setViewName(super.getDeviceViewName("mypage/NoMemberCreListForm"));

		return mav;
	}

	/**
	 * 마이페이지 취반교 목록 조회
	 *
	 * @param OrderChange
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 05. 02
	 */
	@PostMapping("/cre/list")
	@ResponseBody
	public GagaMap getCreList(@RequestBody OrderChange orderChange) {
		GagaMap map = new GagaMap();

		// 페이징 처리 설정
		TscPageRequest pageable = new TscPageRequest((orderChange.getPageNo() > 0 ? orderChange.getPageNo() - 1 : 0), orderChange.getPageSize(), orderChange.getPageUnit());
		pageable.setTotalCount(orderChangeService.getPagingCreListCount(orderChange));
		orderChange.setPageable(pageable);

		// 페이징 처리 및 주문정보 조회
		List<Integer> ordChgSqList = new ArrayList<>();

		for (OrderChange tmpOrderChange : orderChangeService.getPagingCreList(orderChange)) {
			ordChgSqList.add(tmpOrderChange.getOrdChgSq());
		}

		if (ordChgSqList.size() > 0) {
			orderChange.setOrdChgSqArr(ordChgSqList.stream().mapToInt(Integer::intValue).toArray());
			map.set("creList", orderChangeService.getCreList(orderChange));
		}

		map.set("creInfo", orderChange);

		return map;
	}

	/**
	 * 마이페이지 취반교 취소 상세 화면
	 * 
	 * @param OrderChange
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 05. 02
	 */
	@GetMapping("/cre/cancel/detail/form")
	public ModelAndView mypageCreCancelDetailForm(OrderChange orderChange) {
		ModelAndView mav = new ModelAndView();

		// 로그인 상태이면 메인으로 리다이렉트 처리
		if (TsfSession.isLogin()) {
			mav.setViewName("redirect:/");
			return mav;
		}

		// 비회원 정보 유효성 체크
		if (StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNo"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNm"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdPhnno"))) {
			// 세션에 비회원 정보가 없으면 비회원 주문 조회 화면으로 리다이렉트 처리
			mav.setViewName("redirect:/customer/noncust/order/confirm/form");
			return mav;
		}

		// 비회원 정보 설정
		orderChange.setOrdNo(Integer.parseInt(TsfSession.getAttribute("noMemberOrdNo")));
		orderChange.setOrdNm(TsfSession.getAttribute("noMemberOrdNm"));
		orderChange.setOrdPhnno(TsfSession.getAttribute("noMemberOrdPhnno"));

		// 핸드폰번호 하이픈 처리
		if (!orderChange.getOrdPhnno().contains("-")) {
			orderChange.setOrdPhnno(orderChange.getOrdPhnno().replaceAll("(\\d{3})(\\d{3,4})(\\d{4})", "$1-$2-$3"));
		}

		mav.addObject("ordNo", orderChange.getOrdNo());
		mav.addObject("ordNm", orderChange.getOrdNm());
		mav.addObject("ordPhnno", orderChange.getOrdPhnno());

		// 로그인여부 설정
		mav.addObject("isLogin", false);

		// 취소상세 데이터 조회
		GagaMap map = coreOrderChangeService.getCreCancelDetailInfo(orderChange);
		OrderChange oneData = (OrderChange) map.get("oneData");
		mav.addObject("cancelDetailList", map);
		mav.addObject("oneData", oneData);
		mav.addObject("refundYn", map.getString("refundYn"));

		// 주문 결제정보 조회
		Order order = new Order();
		order.setOrdNo(orderChange.getOrdNo());
		mav.addObject("paymentInfo", orderService.getPaymentInfoForMypage(order));

		// KCP 전표 경로 설정
		mav.addObject("kcpReceiptUrl", env.getProperty("pg.kcp.receipt.url"));

		mav.setViewName(super.getDeviceViewName("mypage/NoMemberCreCancelDetailForm"));

		return mav;
	}

	/**
	 * 마이페이지 취반교 반품 상세 화면
	 * 
	 * @param OrderChange
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 05. 02
	 */
	@GetMapping("/cre/return/detail/form")
	public ModelAndView mypageCreReturnDetailForm(OrderChange orderChange) {
		ModelAndView mav = new ModelAndView();

		// 로그인 상태이면 메인으로 리다이렉트 처리
		if (TsfSession.isLogin()) {
			mav.setViewName("redirect:/");
			return mav;
		}

		// 비회원 정보 유효성 체크
		if (StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNo"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNm"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdPhnno"))) {
			// 세션에 비회원 정보가 없으면 비회원 주문 조회 화면으로 리다이렉트 처리
			mav.setViewName("redirect:/customer/noncust/order/confirm/form");
			return mav;
		}

		// 비회원 정보 설정
		orderChange.setOrdNo(Integer.parseInt(TsfSession.getAttribute("noMemberOrdNo")));
		orderChange.setOrdNm(TsfSession.getAttribute("noMemberOrdNm"));
		orderChange.setOrdPhnno(TsfSession.getAttribute("noMemberOrdPhnno"));

		// 핸드폰번호 하이픈 처리
		if (!orderChange.getOrdPhnno().contains("-")) {
			orderChange.setOrdPhnno(orderChange.getOrdPhnno().replaceAll("(\\d{3})(\\d{3,4})(\\d{4})", "$1-$2-$3"));
		}

		mav.addObject("ordNo", orderChange.getOrdNo());
		mav.addObject("ordNm", orderChange.getOrdNm());
		mav.addObject("ordPhnno", orderChange.getOrdPhnno());

		// 로그인여부 설정
		mav.addObject("isLogin", false);

		// 반품상세 데이터 조회
		GagaMap map = coreOrderChangeService.getCreReturnDetailInfo(orderChange);
		OrderChange oneData = (OrderChange) map.get("oneData");
		mav.addObject("returnDetailList", map);
		mav.addObject("oneData", oneData);
		mav.addObject("refundYn", map.getString("refundYn"));

		// 주문 결제정보 조회
		Order order = new Order();
		order.setOrdNo(orderChange.getOrdNo());
		mav.addObject("paymentInfo", orderService.getPaymentInfoForMypage(order));

		// KCP 전표 경로 설정
		mav.addObject("kcpReceiptUrl", env.getProperty("pg.kcp.receipt.url"));

		mav.setViewName(super.getDeviceViewName("mypage/NoMemberCreReturnDetailForm"));

		return mav;
	}

	/**
	 * 마이페이지 취반교 교환 상세 화면
	 * 
	 * @param OrderChange
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 05. 02
	 */
	@GetMapping("/cre/exchange/detail/form")
	public ModelAndView mypageCreExchangeDetailForm(OrderChange orderChange) {
		ModelAndView mav = new ModelAndView();

		// 로그인 상태이면 메인으로 리다이렉트 처리
		if (TsfSession.isLogin()) {
			mav.setViewName("redirect:/");
			return mav;
		}

		// 비회원 정보 유효성 체크
		if (StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNo"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNm"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdPhnno"))) {
			// 세션에 비회원 정보가 없으면 비회원 주문 조회 화면으로 리다이렉트 처리
			mav.setViewName("redirect:/customer/noncust/order/confirm/form");
			return mav;
		}

		// 비회원 정보 설정
		orderChange.setOrdNo(Integer.parseInt(TsfSession.getAttribute("noMemberOrdNo")));
		orderChange.setOrdNm(TsfSession.getAttribute("noMemberOrdNm"));
		orderChange.setOrdPhnno(TsfSession.getAttribute("noMemberOrdPhnno"));

		// 핸드폰번호 하이픈 처리
		if (!orderChange.getOrdPhnno().contains("-")) {
			orderChange.setOrdPhnno(orderChange.getOrdPhnno().replaceAll("(\\d{3})(\\d{3,4})(\\d{4})", "$1-$2-$3"));
		}

		mav.addObject("ordNo", orderChange.getOrdNo());
		mav.addObject("ordNm", orderChange.getOrdNm());
		mav.addObject("ordPhnno", orderChange.getOrdPhnno());

		// 로그인여부 설정
		mav.addObject("isLogin", false);

		// 교환상세 데이터 조회
		GagaMap map = coreOrderChangeService.getCreExchangeDetailInfo(orderChange);
		OrderChange oneData = (OrderChange) map.get("oneData");
		mav.addObject("exchangeDetailList", map);
		mav.addObject("oneData", oneData);

		// KCP 전표 경로 설정
		mav.addObject("kcpReceiptUrl", env.getProperty("pg.kcp.receipt.url"));

		mav.setViewName(super.getDeviceViewName("mypage/NoMemberCreExchangeDetailForm"));

		return mav;
	}

	/**
	 * WMS 주문 취소 가능 여부 조회
	 *
	 * @param OrderChange
	 * @return GagaMap
	 * @author card007
	 * @since 2021. 04. 22
	 */
	@PostMapping("/wms/cancel/available")
	@ResponseBody
	public GagaMap getWmsCancelYn(@RequestBody OrderChange orderChange) {
		GagaMap result = new GagaMap();
		String cancelYn = "Y";

		Integer ordNo = orderChange.getOrdNo();

		for (Integer ordDtlNo : orderChange.getOrdDtlNoArr()) {
			String rst = coreWmsService.getCancelYn(ordNo, ordDtlNo);

			if ("Y".equals(cancelYn) && "N".equals(rst)) {
				cancelYn = "N";
			}
		}

		result.setString("cancelYn", cancelYn);

		return result;
	}

	/**
	 * 마이페이지 주문목록 조회 (모바일)
	 *
	 * @param Order
	 * @return ModelAndView
	 * @author jsh77b
	 * @since 2021. 04. 19
	 */
	@ResponseBody
	@PostMapping("/order/listInfo")
	public ModelAndView getOrderListInfo(@RequestBody Order order) {

		// 주문목록조회
		ModelAndView mav = new ModelAndView();

		// 페이징 처리 설정
		TscPageRequest pageable = new TscPageRequest((order.getPageNo() > 0 ? order.getPageNo() - 1 : 0), order.getPageSize(), order.getPageUnit());
		int totalCnt = orderService.getPagingOrdNoListCount(order);
		pageable.setTotalCount(totalCnt);
		order.setPageable(pageable);

		// 페이징 처리 및 주문정보 조회
		List<Integer> ordNoList = new ArrayList<>();

		for (Order tmpOrder : orderService.getPagingOrdNoList(order)) {
			ordNoList.add(tmpOrder.getOrdNo());
		}

		if (ordNoList.size() > 0) {
			order.setOrdNoList(ordNoList.stream().mapToInt(Integer::intValue).toArray());
		}

		mav.addObject("orderList", orderService.getOrderListForMypage(order));
		mav.setViewName(super.getDeviceViewName("mypage/NoMemberOrderListInfo"));

		return mav;
	}

	/**
	 * 마이페이지 주문목록 사전 정보 조회 (모바일)
	 *
	 * @param Order
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 05. 27
	 */
	@ResponseBody
	@PostMapping("/order/list/pre/info")
	public GagaMap getOrderListPreInfo(@RequestBody Order order) {
		GagaMap result = new GagaMap();

		// 페이징 처리 설정
		TscPageRequest pageable = new TscPageRequest((order.getPageNo() > 0 ? order.getPageNo() - 1 : 0), order.getPageSize(), order.getPageUnit());
		pageable.setTotalCount(orderService.getPagingOrdNoListCount(order));
		order.setPageable(pageable);

		result.set("paging"		, pageable);
		result.set("ordNoList"	, orderService.getPagingOrdNoList(order));

		return result;
	}

	/**
	 * 마이페이지 주문목록 조회 (모바일)
	 *
	 * @param Order
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 05. 27
	 */
	@ResponseBody
	@PostMapping("/order/list/info")
	public ModelAndView getOrderListInfo3(@RequestBody Order order) {
		// 주문목록조회
		ModelAndView mav = new ModelAndView();

		mav.addObject("orderList", orderService.getOrderListForMypage(order));
		mav.setViewName(super.getDeviceViewName("mypage/NoMemberOrderListInfo"));

		return mav;
	}

	/**
	 * 마이페이지 취반교 목록 조회
	 *
	 * @param OrderChange
	 * @return ModelAndView
	 * @author jsh77b
	 * @since 2021. 02. 18
	 */
	@PostMapping("/cre/listInfo")
	@ResponseBody
	public ModelAndView getCreListInfo(@RequestBody OrderChange orderChange) {
		// 주문목록조회
		ModelAndView mav = new ModelAndView();

		// 페이징 처리 설정
		TscPageRequest pageable = new TscPageRequest((orderChange.getPageNo() > 0 ? orderChange.getPageNo() - 1 : 0), orderChange.getPageSize(), orderChange.getPageUnit());
		pageable.setTotalCount(orderChangeService.getPagingCreListCount(orderChange));
		orderChange.setPageable(pageable);

		// 페이징 처리 및 주문정보 조회
		List<Integer> ordChgSqList = new ArrayList<>();

		for (OrderChange tmpOrderChange : orderChangeService.getPagingCreList(orderChange)) {
			ordChgSqList.add(tmpOrderChange.getOrdChgSq());
		}

		if (ordChgSqList.size() > 0) {
			orderChange.setOrdChgSqArr(ordChgSqList.stream().mapToInt(Integer::intValue).toArray());
		}

		mav.addObject("creList", orderChangeService.getCreList(orderChange));
		mav.addObject("creInfo", orderChange);
		mav.setViewName(super.getDeviceViewName("mypage/NoMemberCreListInfo"));

		return mav;
	}

	/**
	 * 배송조회 화면
	 *
	 * @param Order
	 * @return ModelAndView
	 * @author card007
	 * @since  2021. 05. 04
	 */
	@GetMapping("/delivery/info/form")
	@ResponseBody
	public ModelAndView deliveryInfoForm(Order order) {
		ModelAndView mav = new ModelAndView();

		// 로그인 상태이면 메인으로 리다이렉트 처리
		if (TsfSession.isLogin()) {
			mav.setViewName("redirect:/");
			return mav;
		}

		// 비회원 정보 유효성 체크
		if (StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNo"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdNm"))
			|| StringUtils.isBlank(TsfSession.getAttribute("noMemberOrdPhnno"))) {
			// 세션에 비회원 정보가 없으면 비회원 주문 조회 화면으로 리다이렉트 처리
			mav.setViewName("redirect:/customer/noncust/order/confirm/form");
			return mav;
		}

		// 비회원 정보 설정
		order.setOrdNo(Integer.parseInt(TsfSession.getAttribute("noMemberOrdNo")));
		order.setOrdNm(TsfSession.getAttribute("noMemberOrdNm"));
		order.setOrdPhnno(TsfSession.getAttribute("noMemberOrdPhnno"));

		// 핸드폰번호 하이픈 처리
		if (!order.getOrdPhnno().contains("-")) {
			order.setOrdPhnno(order.getOrdPhnno().replaceAll("(\\d{3})(\\d{3,4})(\\d{4})", "$1-$2-$3"));
		}

		mav.addObject("ordNo", order.getOrdNo());
		mav.addObject("ordNm", order.getOrdNm());
		mav.addObject("ordPhnno", order.getOrdPhnno());

		// 로그인여부 설정
		mav.addObject("isLogin", false);

		// 주문목록 조회
		Collection<GagaMap> orderList = orderService.getOrderListForMypage(order);

		if (orderList.size() == 0) {
			mav.setViewName("redirect:/noMember/order/list/form");
			return mav;
		}

		mav.addObject("orderList", orderList);
		mav.addObject("oneData", orderList.iterator().next().get("oneData"));


		// 주문 배송지 정보 조회
		mav.addObject("deliveryAddrInfo", orderService.getOrderDeliveryAddrInfo(order));

		// 스윗트래커 정보 조회
		SweetTracker sweetTracker = new SweetTracker();
		sweetTracker.setShipCompCd(order.getShipCompCd());
		sweetTracker.setInvoiceNo(order.getInvoiceNo());
		mav.addObject("sweetTrackerInfoList", deliveryService.getSweetTrackerDeliveryInfo(sweetTracker));

		mav.setViewName(super.getDeviceViewName("mypage/NoMemberDeliveryInfoForm"));

		return mav;
	}

	/**
	 * 회수 배송 조회 팝업
	 *
	 * @param Order
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 03. 30
	 */
	@PostMapping("/track/withdraw/popup/form")
	@ResponseBody
	public ModelAndView trackWithdrawPopupForm(OrderChange orderChange) {
		ModelAndView mav = new ModelAndView();

		// 스윗트래커 정보 조회
		SweetTracker sweetTracker = new SweetTracker();
		sweetTracker.setShipCompCd(orderChange.getShipCompCd());
		sweetTracker.setInvoiceNo(orderChange.getWdInvoiceNo());
		mav.addObject("sweetTrackerInfoList", deliveryService.getSweetTrackerDeliveryInfo(sweetTracker));

		mav.setViewName(super.getDeviceViewName("popup/TrackWithdrawPopupForm"));

		return mav;
	}

	/**
	 * 비회원 계좌인증
	 *
	 * @Param CustAccount
	 * @return GagaMap
	 * @author card007
	 * @since 2021. 05. 26
	 */
	@RequestMapping("/account/check")
	@ResponseBody
	public GagaMap getAccountCheck(@RequestBody CustAccount custAccount) {
		custAccount.setIpAddress(TsfSession.getIpAddress());
		boolean isValid = false;

		log.info("accountNm() >>> {}",custAccount.getAccountNm());
		log.info("bankCd() >>> {}",custAccount.getBankCd());
		log.info("accountNo() >>> {}",custAccount.getAccountNo());

		GagaMap result = coreKcpService.checkAccount(custAccount);
		if ("0000".equals(result.get("resCd"))) {
			isValid = true;
		}
		result.set("isValid", isValid);
		return result;
	}

	/**
	 * 비회원 취반교목록 사전 정보 조회 (모바일)
	 *
	 * @param Order
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 06. 01
	 */
	@ResponseBody
	@PostMapping("/cre/list/pre/info")
	public GagaMap getCreListPreInfo(@RequestBody OrderChange orderChange) {
		GagaMap result = new GagaMap();

		// 페이징 처리 설정
		TscPageRequest pageable = new TscPageRequest((orderChange.getPageNo() > 0 ? orderChange.getPageNo() - 1 : 0), orderChange.getPageSize(), orderChange.getPageUnit());
		pageable.setTotalCount(orderChangeService.getPagingCreListCount(orderChange));
		orderChange.setPageable(pageable);

		result.set("paging"		, pageable);
		result.set("creList"	, orderChangeService.getPagingCreList(orderChange));

		return result;
	}

	/**
	 * 비회원 취반교목록 조회 (모바일)
	 *
	 * @param Order
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 06. 01
	 */
	@ResponseBody
	@PostMapping("/cre/list/info")
	public ModelAndView getCreListInfo2(@RequestBody OrderChange orderChange) {
		// 주문목록조회
		ModelAndView mav = new ModelAndView();

		Collection<GagaMap> creList = orderChangeService.getCreList(orderChange);

		mav.addObject("creList"			, 	creList);
		mav.addObject("creListCnt"		, 	creList.size());
		mav.addObject("pageNo"			, 	orderChange.getPageNo());

		mav.setViewName(super.getDeviceViewName("mypage/NoMemberCreListInfo"));

		return mav;
	}
}
