package com.style24.front.biz.web;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

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.TscFreegiftService;
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.TscOrderService;
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.TsfCustomerService;
import com.style24.front.biz.service.TsfOrderChangeService;
import com.style24.front.biz.service.TsfOrderService;
import com.style24.front.biz.thirdparty.NiceCertify;
import com.style24.front.support.controller.TsfBaseController;
import com.style24.front.support.security.session.TsfSession;
import com.style24.persistence.domain.CustAccount;
import com.style24.persistence.domain.CustContactHst;
import com.style24.persistence.domain.Customer;
import com.style24.persistence.domain.Order;
import com.style24.persistence.domain.OrderChange;
import com.style24.persistence.domain.Payment;

import lombok.extern.slf4j.Slf4j;

/**
 * 주문 Controller
 * 
 * @author gagamel
 * @since 2020. 12. 29
 */
@Controller
@RequestMapping("/order")
@Slf4j
public class TsfOrderController extends TsfBaseController {

	@Autowired
	private TscMessageByLocale message;

	@Autowired
	private TscOrderService coreOrderService;

	@Autowired
	private TsfOrderService orderService;

	@Autowired
	private TscOrderChangeService coreOrderChangeService;

	@Autowired
	private TscFreegiftService coreFreegiftService;

	@Autowired
	private TsfCartService cartService;

	@Autowired
	private Environment env;
	
	@Autowired
	private NiceCertify niceCertify;
	
	@Autowired
	private TscKakaotalkService kakaotalkService;
	
	@Autowired
	private TscMailService mailService;
	
	@Autowired
	private TsfOrderChangeService orderChangeService;
	
	@Autowired
	private TsfCustomerService customerService;

	@Autowired
	private TscKcpService coreKcpService;
	
	/**
	 * 회원, 비회원 주문페이지
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 02. 02
	 */
	@RequestMapping(value = "/noMember")
	public ModelAndView orderNoMember(Order order, @RequestParam(value = "sEncData", required = false) String sEncData
			, @RequestParam(value = "authMethod", required = false) String authMethod) {
		ModelAndView mav = new ModelAndView();
		TsfSession.removeAtrribute("cartSqArr");		// 2021.06.03 주문서 접근시 장바구니 등록 세션 제거

		// 비회원 주문시 로직 정리
		// @ WEB 인 경우에는 고객정보 입력 화면 후 주문서 이동 후 본인인중
		// @ WEB 의 경우에는 입력한 고객정보와 인증받은 고객정보가 다른경우 고객정보 업데이트
		// @ MOBILE 인 경우에는 본인인증 후 주문서 이동
		
		// 1. 장바구니 시퀀스가 정보가 없을때 처리 장바구니로 이동
		if (order.getCartSqArr() == null) {
			mav.setViewName("redirect:/cart/list/form");						// 장바구니화면이동
			return mav;
		}
		
		// 2. 선물하기주문 체크 후 비로그인 상태면 장바구니로 강제 이동
		if (coreOrderService.getGiftOrderCheck(order) > 0) {
			if (TsfSession.isLogin() == false) {
				mav.setViewName("redirect:/cart/list/form");					// 장바구니화면이동
				return mav;
			}
		}
		
		mav.addObject("order" 			, order);								// 주문정보
		mav.addObject("isLogin"			, TsfSession.isLogin());				// 로그인여부
		mav.addObject("sEncData"		, sEncData);
		mav.addObject("authMethod"		, authMethod);
		
		mav.setViewName(super.getDeviceViewName("order/OrderNoMember"));		// 비회원주문서화면

		return mav;
	}
	
	/**
	 * 비회원 - 개명본인인증, 휴대폰 본인인증
	 *
	 * @return GagaMap - 결과
	 * @param customer - 본인인증 값
	 * @author jsh77b
	 * @since 2021. 03. 30
	 */
	@PostMapping("/customer/auth")
	@ResponseBody
	public GagaMap updateCustomerAuth(@RequestBody Customer customer) {
		GagaMap authInfo = niceCertify.getCertifyCellPhoneResultInfo(customer);
		return authInfo;
	}
	
	/**
	 * 주문페이지
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 02. 02
	 */
	@RequestMapping(value = "/form")
	public ModelAndView orderForm(HttpServletRequest request, Order order) {
		ModelAndView mav = new ModelAndView();

		// 1.1 referer 체크 (order/noMember)
		String refererStr = "";
		if (request.getHeader("referer") != null) {
			refererStr = request.getHeader("referer").toString();
			if (refererStr.indexOf("/order/noMember") < 0) {
				mav.setViewName("redirect:/cart/list/form");	// 장바구니화면이동
				return mav;
			}
		} else {
			mav.setViewName("redirect:/cart/list/form");		// 장바구니화면이동
			return mav;
		}

		// 1.2 장바구니 시퀀스가 정보가 없을때 처리 장바구니로 이동
		if (order.getCartSqArr() == null) {
			mav.setViewName("redirect:/cart/list/form");		// 장바구니화면이동
			return mav;
		}
		
		// 선물받기여부
		String giftPackYn = "N";
		
		// 1.3. 선물하기주문 체크 후 비로그인 상태면 장바구니로 강제 이동
		if (coreOrderService.getGiftOrderCheck(order) > 0) {
			// 비 로그인 상태면 장바구니 강제 이동
			if (TsfSession.isLogin() == false) {
				mav.setViewName("redirect:/cart/list/form");					// 장바구니화면이동
				return mav;
			}
			
			// 선물하기일때 PC 로 접근하면 장바구니 강제 이동
			if ("P".equals(TsfSession.getFrontGb())) {
				mav.setViewName("redirect:/cart/list/form");					// 장바구니화면이동
				return mav;
			}
			
			// 선물받기여부
			giftPackYn = "Y";
		}

		// 1.4 로그인체크 후 custNo 설정
		if (TsfSession.isLogin()) {
			order.setCustNo(TsfSession.getInfo().getCustNo());
		} else {
			order.setJsessionId(TsfSession.getSessionId());
			order.setCustNo(0);
		}
		
		// 2. 로그인정보 체크 후 비회원 고객정보 설정
		if (TsfSession.isLogin()) {
			order.setCustNm("");
			order.setCellPhnno("");
			order.setEmail("");
			
			order.setDelvAddrNm("배송지명없음");
			order.setRecipNm("없음");
			order.setRecipZipcode("00000");
			order.setRecipBaseAddr("기본주소없음");
			order.setRecipDtlAddr("상제주소없음");
		} else {
			// 2021.04.08 휴대폰번호 하이픈 처리 (비회원인경우)
			order.setHypenCellPhone();
		}

		// 2.1 총알배송여부가 null 이면 Y로 설정
		if (order.getShotDelvUseYn() == null || "".equals(order.getShotDelvUseYn())) {
			order.setShotDelvUseYn("Y");
		}
		
		// 2.2 선물받기 Y 이면 총알배송 불가
		if ("Y".equals(giftPackYn)) {
			order.setShotDelvUseYn("N");
		}
		
		order.setShotDelvYn(order.getShotDelvUseYn());
		order.setGiftPackYn(giftPackYn);

		// 3. 장바구니상품시퀀스 상품목록조회
		// 3.1 즉시할인, 다다익선 할인금액 정보 적용 상품 정보
		Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
		
		// 3.2 상품조회목록이 없으면 장바구니이동 
		if (tmtbGoodsApplyList.size() < 1) {
			mav.setViewName("redirect:/cart/list/form");		// 장바구니화면이동
			return mav;
		}
		
		// 3.3 배송정보조회(장바구니상품목록)
		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList, order);
		
		// 3.4 할인,금액 정보조회(상품금액, 선포인트, 다다익선할인금액)
		GagaMap goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);

		// 4. 화면설정
		// 4.1 배송정보설정
		mav.addObject("cartGoodsList"		, tmtbGoodsApplyList);						// 장바구니상품목록(즉시할인, 다다익선적용)
		
		mav.addObject("delvFeeCdCnt"		, delvOrderMap.get("delvFeeCdCnt"));		// 배송정책단위건수
		mav.addObject("shotCnt" 			, delvOrderMap.get("shotCnt"));				// 자사총알배송상품건수
		mav.addObject("wmsCnt" 				, delvOrderMap.get("wmsCnt"));				// 자사일반상품건수
		mav.addObject("shotWmsCnt" 			, delvOrderMap.get("shotWmsCnt"));			// 자사총알,일반상품건수
		mav.addObject("resCnt" 				, delvOrderMap.get("resCnt"));				// 자사예약상품건수
		mav.addObject("delvCnt" 			, delvOrderMap.get("delvCnt"));				// 입점업체상품건수
		
		mav.addObject("goodsTotCnt" 		, delvOrderMap.get("goodsTotCnt"));			// 총상품건수
		mav.addObject("delvAllCartList" 	, delvOrderMap.get("delvAllCartList"));		// 전체배송목록
		mav.addObject("delvFeeCdList" 		, delvOrderMap.get("delvFeeCdList"));		// 배송단위목록
		mav.addObject("sumDelvFee" 			, delvOrderMap.get("sumDelvFee"));			// 배송비합계

		// 4.2 할인정보(상품금액, 즉시할인, 다다익선, 선포인트, 적립예정포인트) 
		mav.addObject("listSumAmt"			, goodsDcAmtMap.get("listSumAmt"));			// 상품금액합계(정상가)
		mav.addObject("orgGoodsSumAmt"		, goodsDcAmtMap.get("orgGoodsSumAmt"));		// 상품금액합계(판매가)
		mav.addObject("goodsDcSumAmt"		, goodsDcAmtMap.get("goodsDcSumAmt"));		// 상품할인금액(정상가-판매가)
		mav.addObject("cpn1DcSumAmt"		, goodsDcAmtMap.get("cpn1DcSumAmt"));		// 즉시할인금액합계
		mav.addObject("tmtbDcSumAmt"		, goodsDcAmtMap.get("tmtbDcSumAmt"));		// 다다익선할인금액합계
		mav.addObject("prePntDcAmt"			, goodsDcAmtMap.get("prePntDcAmt"));		// 선포인트사용가능금액
		mav.addObject("savePntSumAmt"		, goodsDcAmtMap.get("savePntSumAmt"));		// 적립예정포인트합계
		
		// 4.3 주문정보
		mav.addObject("order" 				, order);									// 주문정보(고객정보, 배송지정보, 총알배송사용여부)
		
		// 4.4 해외구매대행, 주문제작
		mav.addObject("foreignBuyYn"		, delvOrderMap.get("foreignBuyYn"));		// 해외구매대행여부
		mav.addObject("orderMadeYn"			, delvOrderMap.get("orderMadeYn"));			// 주문제작여부
		
		// 4.5 로그인여부
		mav.addObject("isLogin"				, TsfSession.isLogin());					// 로그인여부
		
		// 4.6 선물받기여부
		mav.addObject("giftPackYn"			, giftPackYn);								// 선물받기여부
		
		// 2021.05.07 jsh77b id만 개발자모드허용
		boolean devTempYn = false;
		if (TsfSession.isLogin()) {
			if ("jsh77b".equals(TsfSession.getInfo().getCustId()) || "xodud1202".equals(TsfSession.getInfo().getCustId())) {
				devTempYn = true;
			}
		}
		
		mav.addObject("devTempYn"			, devTempYn);								// 개발자모드가능여부
		mav.addObject("frontGb"				, TsfSession.getFrontGb());					// 프론트구분
		mav.addObject("isApp"				, TsfSession.getAttribute("isApp"));		// 앱여부
		mav.setViewName(super.getDeviceViewName("order/OrderForm"));
		
		return mav;
	}
	
	/**
	 * 고객정보조회
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 02. 17
	 */
	@ResponseBody
	@PostMapping("/custemerInfo")
	public ModelAndView custemerInfo(@RequestBody Order order) {
		
		Order custemerInfo = new Order();
		
		// 1. 로그인체크 후 custNo 설정
		if (TsfSession.isLogin()) {
			order.setCustNo(TsfSession.getInfo().getCustNo());
		} else {
			order.setCustNo(0);
			order.setJsessionId(TsfSession.getSessionId());
		}
		
		// 2. 로그인체크 후 고객정보 설정
		if (TsfSession.isLogin()) {
			// 2.1 주문고객 정보조회 (회원정보)
			custemerInfo = coreOrderService.getCustemerInfo(order);
		} else {
			// 2.1 주문고객 정보조회 (비회원주문서화면정보)
			custemerInfo.setCustNm(order.getCustNm());
			custemerInfo.setCellPhnno(order.getCellPhnno());
			custemerInfo.setEmail(order.getEmail());
			custemerInfo.setSexGb(order.getSexGb());
			custemerInfo.setBirthYmd(order.getBirthYmd());
		}
		
		ModelAndView mav = new ModelAndView();
		mav.addObject("custemerInfo"	, custemerInfo); 			// 고객정보
		mav.addObject("order"			, order);					// 파라미터
		mav.addObject("isLogin"			, TsfSession.isLogin());	// 로그인여부
		mav.setViewName(super.getDeviceViewName("order/OrderCustemerInfo"));
		
		return mav;
	}
	
	/**
	 * 배송정보조회
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 02. 17
	 */
	@ResponseBody
	@PostMapping("/deliveryAddrInfo")
	public ModelAndView deliveryAddrInfo(@RequestBody Order order) {

		Order deliveryAddrInfo = new Order();
		
		// 1. 로그인체크 후 custNo 설정
		if (TsfSession.isLogin()) {
			order.setCustNo(TsfSession.getInfo().getCustNo());
		} else {
			order.setCustNo(0);
			order.setJsessionId(TsfSession.getSessionId());
		}
		
		// 2. 로그인체크 후 고객정보 설정
		if (TsfSession.isLogin()) {
			
			// 2.1 주문고객 배송지정보조회
			Collection<Order> deliveryAddrList = coreOrderService.getDeliveryAddrInfo(order);
			int index = 0;
			
			for (Order deliveryAddr : deliveryAddrList) {
				// 회원 배송지 번호가 존재하면 실행
				if (order.getCustDelvAddrSq() > 0) {
					if (order.getCustDelvAddrSq() == deliveryAddr.getCustDelvAddrSq()) {
						deliveryAddrInfo = deliveryAddr;
					}
				}
				// 회원 배송지 번호가 존재하지 않으면 기본배송지 설정
				else {
					if (index == 0) {
						deliveryAddrInfo = deliveryAddr;
						
						// 배송지목록에 정보가 없으면 아래의 문구 노출
						if (deliveryAddrInfo.getRecipZipcode() == null || "".equals(deliveryAddrInfo.getRecipZipcode())) {
							deliveryAddrInfo.setDelvAddrNm(deliveryAddrInfo.getCustNm());
							
							// 회원 배송지명이 없으면 설정
							if (deliveryAddrInfo.getRecipNm() == null || "".equals(deliveryAddrInfo.getRecipNm())) {
								deliveryAddrInfo.setRecipNm(deliveryAddrInfo.getCustNm());
							}
							
							deliveryAddrInfo.setRecipZipcode("00000");
							deliveryAddrInfo.setRecipBaseAddr("기본주소정보없음");
							deliveryAddrInfo.setRecipDtlAddr("상세주소정보없음");
							deliveryAddrInfo.setDelvMemo("직접 받고 부재 시 문 앞");
							deliveryAddrInfo.setRecipNm(deliveryAddrInfo.getCustNm());
						}
					}
				}
				index++;
			}
		} else {
			// 2.2 비회원 주문고객 정보조회
			if (order.getRecipNm() == null || "".equals(order.getRecipNm())) {
				deliveryAddrInfo.setRecipNm(order.getCustNm());
			} else {
				deliveryAddrInfo.setRecipNm(order.getRecipNm());
			}
			
			if (order.getRecipPhnno() == null || "".equals(order.getRecipPhnno())) {
				deliveryAddrInfo.setRecipPhnno(order.getCellPhnno());
			} else {
				deliveryAddrInfo.setRecipPhnno(order.getRecipPhnno());
			}
			
			deliveryAddrInfo.setRecipZipcode(order.getRecipZipcode());
			deliveryAddrInfo.setRecipBaseAddr(order.getRecipBaseAddr());
			deliveryAddrInfo.setRecipDtlAddr(order.getRecipDtlAddr());
			
			if (order.getDelvMemo() == null || "".equals(order.getDelvMemo())) {
				deliveryAddrInfo.setDelvMemo("직접 받고 부재 시 문 앞");
			} else {
				deliveryAddrInfo.setDelvMemo(order.getDelvMemo());
			}
		}
		
		// 2021.07.06 회원일때 개인통관부호 정보 설정
		String entryNo = "";
		if ("Y".equals(order.getForeignBuyYn())) {
			if (TsfSession.isLogin()) {
				Order vo = new Order();
				order.setCustNo(TsfSession.getInfo().getCustNo());
				vo = coreOrderService.getEntryNo(order);
				
				if (vo != null && vo.getEntryNo() != null) {
					entryNo = vo.getEntryNo();
				}
			}
		}
		
		ModelAndView mav = new ModelAndView();
		mav.addObject("entryNo"				, entryNo);									// 개인통관부호
		mav.addObject("deliveryAddrInfo"	, deliveryAddrInfo);						// 배송지정보
		mav.addObject("order"				, order);									// 파라미터
		mav.addObject("isLogin"				, TsfSession.isLogin());					// 로그인여부

		// 2021.04.29 해외구매대행, 주문제작
		mav.addObject("foreignBuyYn"		, order.getForeignBuyYn());					// 해외구매대행여부
		mav.addObject("orderMadeYn"			, order.getOrderMadeYn());					// 주문제작여부
				
		mav.setViewName(super.getDeviceViewName("order/OrderDeliveryAddrInfo"));
		
		return mav;
	}
	
	/**
	 * 해외통관번호등록화면
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 04. 01
	 */
	@ResponseBody
	@PostMapping("/entryInfo")
	public ModelAndView entryInfo(@RequestBody Order order) {
		ModelAndView mav = new ModelAndView();
		
		// 2021.07.06 회원일때 개인통관부호 정보 설정
		String entryNo = "";
		if (TsfSession.isLogin()) {
			order.setCustNo(TsfSession.getInfo().getCustNo());
			Order vo = new Order();
			vo = coreOrderService.getEntryNo(order);
			
			if (vo != null && vo.getEntryNo() != null) {
				entryNo = vo.getEntryNo();
			}
		}
		
		mav.addObject("entryNo"				, entryNo);									// 개인통관부호
		mav.addObject("order"				, order);									// 파라미터
		mav.addObject("isLogin"				, TsfSession.isLogin());					// 로그인여부
		mav.setViewName(super.getDeviceViewName("order/OrderEntryInfo"));
		
		return mav;
	}
	
	/**
	 * 주문제작상품동의화면
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 04. 01
	 */
	@ResponseBody
	@PostMapping("/madeInfo")
	public ModelAndView madeInfo(@RequestBody Order order) {
		ModelAndView mav = new ModelAndView();
		mav.addObject("order"				, order);									// 파라미터
		mav.addObject("isLogin"				, TsfSession.isLogin());					// 로그인여부
		mav.setViewName(super.getDeviceViewName("order/OrderMadeInfo"));
		
		return mav;
	}
	
	/**
	 * 선물받는사람정보화면
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 04. 01
	 */
	@ResponseBody
	@PostMapping("/orderGiftInfo")
	public ModelAndView orderGiftInfo(@RequestBody Order order) {
		ModelAndView mav = new ModelAndView();
		mav.addObject("order"				, order);									// 파라미터
		mav.addObject("isLogin"				, TsfSession.isLogin());					// 로그인여부
		mav.addObject("frontGb"				, TsfSession.getFrontGb());					// 디바이스구분
		mav.setViewName(super.getDeviceViewName("order/OrderGiftInfo"));
		
		return mav;
	}
	
	/**
	 * 주문내역정보조회
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 02. 17
	 */
	@ResponseBody
	@PostMapping("/orderListInfo")
	public ModelAndView orderListInfo(@RequestBody Order order) {
		
		// 1. 로그인체크 후 custNo 설정
		if (TsfSession.isLogin()) {
			order.setCustNo(TsfSession.getInfo().getCustNo());
		} else {
			order.setCustNo(0);
			order.setJsessionId(TsfSession.getSessionId());
		}
		
		// 2. 즉시할인, 다다익선 할인금액 정보 적용 상품 정보 (2021.05.07 화면에서전송)
		//Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
		Collection<Order> tmtbGoodsApplyList = order.getCartGoodsList();

		// 3. 배송정보조회(장바구니상품목록)
		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList, order);
		
		// 4. 할인정보조회(상품금액, 선포인트, 다다익선할인금액)
		GagaMap goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
				
		ModelAndView mav = new ModelAndView();
		
		// 4.1 상품정보, 배송정보
		mav.addObject("goodsTotCnt" 		, delvOrderMap.get("goodsTotCnt"));			// 총상품건수
		mav.addObject("delvAllCartList" 	, delvOrderMap.get("delvAllCartList"));		// 전체배송목록
		mav.addObject("delvFeeCdCnt" 		, delvOrderMap.get("delvFeeCdCnt"));		// 자사총알배송상품건수
		mav.addObject("shotCnt" 			, delvOrderMap.get("shotCnt"));				// 자사총알배송상품건수
		mav.addObject("wmsCnt" 				, delvOrderMap.get("wmsCnt"));				// 자사일반상품건수
		mav.addObject("isLogin"				, TsfSession.isLogin());					// 로그인여부
		mav.addObject("IMG_PATH"			, env.getProperty("upload.goods.view"));	// 이미지경로
		mav.addObject("isLogin"				, TsfSession.isLogin());					// 로그인여부
		
		// 4.2 할인정보(상품금액, 즉시할인, 다다익선, 선포인트, 적립예정포인트) 
		mav.addObject("listSumAmt"			, goodsDcAmtMap.get("listSumAmt"));			// 상품금액합계
		mav.addObject("orgGoodsSumAmt"		, goodsDcAmtMap.get("orgGoodsSumAmt"));		// 상품금액합계
		mav.addObject("goodsDcSumAmt"		, goodsDcAmtMap.get("goodsDcSumAmt"));		// 상품할인금액(정상가-판매가)
		mav.addObject("cpn1DcSumAmt"		, goodsDcAmtMap.get("cpn1DcSumAmt"));		// 즉시할인금액합계
		mav.addObject("tmtbDcSumAmt"		, goodsDcAmtMap.get("tmtbDcSumAmt"));		// 다다익선할인금액합계
		mav.addObject("prePntDcAmt"			, goodsDcAmtMap.get("prePntDcAmt"));		// 선포인트사용가능금액
		mav.addObject("savePntSumAmt"		, goodsDcAmtMap.get("savePntSumAmt"));		// 적립예정포인트합계
		
		mav.addObject("order"				, order);									// 파라미터
		mav.setViewName(super.getDeviceViewName("order/OrderListInfo"));
		
		return mav;
	}
	
	/**
	 * 사은품정보조회
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 02. 17
	 */
	@ResponseBody
	@PostMapping("/freegiftInfo")
	public ModelAndView freegiftInfo(@RequestBody Order order) {

		GagaMap resultMap = new GagaMap();
		
		// 1. 로그인체크 후 custNo 설정
		if (TsfSession.isLogin()) {
			order.setCustNo(TsfSession.getInfo().getCustNo());
		} else {
			order.setCustNo(0);
			order.setJsessionId(TsfSession.getSessionId());
		}
		
		// 2021.09.27 프론트구분값 누락
		order.setFrontGb(TsfSession.getFrontGb());
		
		// 2. 로그인체크 후 정보 설정 로그인후 사은품정보조회
		if (TsfSession.isLogin()) {
			resultMap = coreFreegiftService.getOrderFreegift(order);
		} 
		
		ModelAndView mav = new ModelAndView();
		mav.addObject("freegiftApplyAmtList"	, resultMap.get("freegiftApplyAmtList"));	// 사은품장바구니목록
		mav.addObject("freegiftGoodsList"		, resultMap.get("freegiftGoodsList"));		// 사은품상품정보 목록
		mav.addObject("freegiftList"			, resultMap.get("freegiftList"));			// 사은품정보 목록
		mav.addObject("order"					, order);									// 파라미터
		mav.addObject("isLogin"					, TsfSession.isLogin());					// 로그인여부
		
		mav.setViewName(super.getDeviceViewName("order/OrderFreegiftInfo"));
		
		return mav;
	}
	
	/**
	 * 할인정보조회
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 02. 17
	 */
	@SuppressWarnings("unchecked")
	@ResponseBody
	@PostMapping("/dcAmtInfo")
	public ModelAndView dcAmtInfo(@RequestBody Order order) {

		GagaMap goodsDcAmtMap = new GagaMap();
		
		Collection<Order> goodsApplyCpnList 	= new ArrayList<Order>();
		Collection<Order> goodsCpnList			= new ArrayList<Order>();
		Collection<Order> cartCpnList 			= new ArrayList<Order>();
		Collection<Order> delvCpnList 			= new ArrayList<Order>();
		Collection<Order> delvFeeCdList 		= new ArrayList<Order>();
		Collection<Order> cartCpnIdList 		= new ArrayList<Order>();
		
		int rmPntAmt 	= 0;
		int rmGfcdAmt 	= 0;
		
		// 1. 로그인체크 후 custNo 설정
		if (TsfSession.isLogin()) {
			order.setCustNo(TsfSession.getInfo().getCustNo());
		} else {
			order.setCustNo(0);
			order.setJsessionId(TsfSession.getSessionId());
		}
		
		// 2. 로그인체크 후 정보 설정 (할인구간정보조회)
		if (TsfSession.isLogin()) {
			
			// 2.1 배송단위별 상품 목록 조회 (장바구니) (2021.05.07 화면에서전송)
			//Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
			Collection<Order> tmtbGoodsApplyList = order.getCartGoodsList();
			
			// 2.2 상품금액, 선포인트, 다다익선할인금액
			goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
			
			// 2.3 배송단위별 장바구니 상품 건수 조회 (장바구니상품)
			GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList, order);
			
			// 2.4 상품쿠폰, 장바구니쿠폰 목록 조회
			GagaMap goodsCartCpnMap = coreOrderService.getGoodsCartCpnApplyGoodsList(order);
			
			goodsCpnList 	= (Collection<Order>) goodsCartCpnMap.get("goodsCpnList");
			cartCpnList 	= (Collection<Order>) goodsCartCpnMap.get("cartCpnList");
			cartCpnIdList 	= (Collection<Order>) goodsCartCpnMap.get("cartCpnIdList");
			
			// 2.5 상품쿠폰 적용된 상품 목록(상품기준)
			goodsApplyCpnList = coreOrderService.getGoodsCpnApplyList(tmtbGoodsApplyList, goodsCpnList);
			
			// 2.6 장바구니쿠폰(장바구니기준 상품목록)
			cartCpnList = coreOrderService.getCartCpnApplyList(tmtbGoodsApplyList, cartCpnList, cartCpnIdList);
			
			// 2.7 배송비쿠폰목록 조회
			order.setCpnId(null); // 2021.0-5.27 null 처리
			delvCpnList = coreOrderService.getDelvCpnList(order);
			
			delvFeeCdList = (Collection<Order>) delvOrderMap.get("delvFeeCdList");
			
			// 2.8 배송비쿠폰(배송업체기준)
			delvCpnList = coreOrderService.getDelvCpnApplyList(delvFeeCdList, delvCpnList);
			
			// 2.9 고객 보유 포인트 정보 조회
			rmPntAmt = coreOrderService.getCustPointInfo(order);
			
			// 2.10 고객 보유 상품권 정보 조회
			rmGfcdAmt = coreOrderService.getGiftcardInfo(order);
		}
		
		// 2021.04.29 포인트사용정보조회
		Order pointUseEnvset = coreOrderService.getPointUseEnvset();
		
		// 주문시포인트설정정보조회
		ModelAndView mav = new ModelAndView();
		mav.addObject("goodsApplyCpnList"				, goodsApplyCpnList);						// 상품적용쿠폰
		mav.addObject("cartCpnList"						, cartCpnList);								// 장바구니쿠폰목록
		mav.addObject("delvCpnList"						, delvCpnList);								// 배송비쿠폰목록

		mav.addObject("orgGoodsSumAmt"					, goodsDcAmtMap.getInt("orgGoodsSumAmt"));	// 상품금액합계
		mav.addObject("cpn1DcSumAmt"					, goodsDcAmtMap.getInt("cpn1DcSumAmt"));	// 즉시할인금액합계
		mav.addObject("tmtbDcSumAmt"					, goodsDcAmtMap.getInt("tmtbDcSumAmt"));	// 다다익선할인금액합계
		mav.addObject("prePntDcAmt"						, goodsDcAmtMap.getInt("prePntDcAmt"));		// 선포인트사용가능금액

		mav.addObject("rmPntAmt"						, rmPntAmt);								// 고객포인트정보
		mav.addObject("rmGfcdAmt"						, rmGfcdAmt);								// 고객상품권정보
		mav.addObject("savePntSumAmt"					, goodsDcAmtMap.get("savePntSumAmt"));		// 적립예정포인트합계
		mav.addObject("order"							, order);									// 파라미터
		mav.addObject("isLogin"							, TsfSession.isLogin());					// 로그인여부
		mav.addObject("pointUseEnvset"					, pointUseEnvset);							// 포인트사용정보조회
		
		mav.setViewName(super.getDeviceViewName("order/OrderDcAmtInfo"));
		
		return mav;
	}
	
	/**
	 * 결제정보조회
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 02. 17
	 */
	@ResponseBody
	@PostMapping("/paymentInfo")
	public ModelAndView paymentInfo(@RequestBody Order order) {
		
		// 1. 로그인체크 후 custNo 설정
		if (TsfSession.isLogin()) {
			order.setCustNo(TsfSession.getInfo().getCustNo());
		} else {
			order.setCustNo(0);
			order.setJsessionId(TsfSession.getSessionId());
		}
		
		// 2. TODO 로그인체크 후 정보 설정 자주사용하는 결제정보조회
		String payMeans 	= "";
		String pgGb 		= "";
		
		if (TsfSession.isLogin()) {
			Order vo = coreOrderService.getCustPaymeans(order);
			if (vo != null) {
				payMeans 	= vo.getPayMeans();
				pgGb 		= vo.getPgGb();
			}
		}

		ModelAndView mav = new ModelAndView();
		mav.addObject("payMeans" 		, payMeans);				// 결제수단
		mav.addObject("pgGb" 			, pgGb);					// PG구분
		mav.addObject("order" 			, order);					// 파라미터
		mav.addObject("isLogin"			, TsfSession.isLogin());	// 로그인여부
		mav.setViewName(super.getDeviceViewName("order/OrderPaymentInfo"));
		
		return mav;
	}

	/**
	 * 주문 데이터 생성 (주문접수)
	 *
	 * @param
	 * @return
	 * @author xodud1202
	 * @since 2021. 03. 04
	 */
	@PostMapping("/create/preOrder")
	@ResponseBody
	public ModelAndView createOrder(@RequestBody Order order) {
		ModelAndView mav = new ModelAndView();
		
		// 2021.03.09 주문데이타 등록 
		// 1. 로그인체크 후 custNo 설정
		if (TsfSession.isLogin()) {
			order.setCustNo(TsfSession.getInfo().getCustNo());
		} else {
			order.setJsessionId(TsfSession.getSessionId());
			order.setCustNo(0);
		}
		
		order.setFrontGb(TsfSession.getFrontGb());

		// 2. 주문정보유효성체크
		String resultStr = orderService.orderValidationCheck(order);
		
		// 주문정보유효성체크 실패
		if (!"SUCCESS".equals(resultStr)) {
			mav.addObject("message", resultStr);
			mav.setViewName(super.getDeviceViewName("order/OrderEmpty"));
			return mav;
		}
		
		// 2.1 주문금액유효성체크
		resultStr = orderService.orderAmtValidationCheck(order);
		
		// 주문금액유효성체크 실패
		if (!"SUCCESS".equals(resultStr)) {
			mav.addObject("message", resultStr);
			mav.setViewName(super.getDeviceViewName("order/OrderEmpty"));
			return mav;
		}
		
		// 3. 주문기본정보등록(주문접수)
		coreOrderService.createPreOrder(order);

		// 4. 2021.05.10 장바구니정보 주문번호 업데이트
		orderService.insertCartHstOrdNo(order);
		
		// 5. PG 결제정보설정
		Payment payment = orderService.setPgDataInfo(order);

		// 2021.05.20 카카오페이, 네이버페이 결제 필요 정보 세션 등록
		if(TscConstants.PgGb.KAKAO.value().equals(payment.getPgGb()) || TscConstants.PgGb.NAVER.value().equals(payment.getPgGb())) {
			TsfSession.setAttribute("ordNo", String.valueOf(order.getOrdNo()));
			TsfSession.setAttribute("tid", payment.getPgTid());
		}
		
		// 2021.05.10 추가
		payment.setPayUrl("/create/preOrder");
		payment.setRetUrl("/pay/result/response");
				
		mav.addObject("payment"				, payment);
		mav.addObject("orderDetailList"		, order.getOrderDetailList());
		mav.addObject("message"				, "SUCCESS");
		mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));

		return mav;
	}
	
	/**
	 * 결제 PG 요청 완료
	 *
	 * @param
	 * @return
	 * @author xodud1202
	 * @since 2021. 03. 05
	 */
	@ResponseBody
	@RequestMapping(value = "/pay/result/response")
	public ModelAndView payResultResponse(Payment param, HttpServletRequest request, HttpServletResponse response) {
		
		// 2021.06.02 태팔요청
		// 2021.09.01 card007 카카오페이 pgToken 없으면 결제실패 페이지 리다이렉트 처리
		if((StringUtils.isBlank(param.getPgTid()) && StringUtils.isBlank(request.getParameter("tran_cd")))
			|| (TscConstants.PgGb.KAKAO.value().equals(param.getPgGb()) && StringUtils.isBlank(param.getPgToken()))) {
			ModelAndView mav = new ModelAndView();
			mav.setViewName("redirect:/order/payment/fail");
			return mav;
		}

		ModelAndView mav = new ModelAndView();
		
		Order order = new Order();
		
		// 1. 로그인체크 후 custNo 설정
		if (TsfSession.isLogin()) {
			param.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
			order.setCustNo(TsfSession.getInfo().getCustNo());
		} else {
			param.setCustNo(0);
			order.setCustNo(0);
		}

		param.setRegNo(param.getCustNo());
		param.setUpdNo(param.getCustNo());
		param.setFrontGb(TsfSession.getFrontGb());
		
		// 2. 결재정보등록(TB_PAYMENT)
		try {
			param = orderService.orderPgPayResult(param, request, response);
		} catch (Exception e) {
			// 2021.10.25 결제실패 등록
			orderService.createPaymentFail(e.getMessage(), param.getCustNo());
			
			// 2021.11.05 결제실패화면이동처리
			ModelAndView redir = new ModelAndView();
			redir.setViewName("redirect:/order/payment/fail");
			return redir;
			//throw new IllegalArgumentException(e.getMessage());
		}

		log.info("CHECK RES_CD :::: {} / {}", param.getCode(), param.getResCd());
		
		if (TscConstants.PgGb.NAVER.value().equals(param.getPgGb()) && !"SUCCESS".equals(param.getCode().toUpperCase())) {
			ModelAndView redir = new ModelAndView();
			redir.setViewName("redirect:/order/payment/fail");
			return redir;
		}

		order.setOrdNo(param.getOrdNo());
		order.setSellGb("10");
		order.setPgGb(param.getPgGb());
		order.setPayMeans(param.getPayMeans());
		
		// 3. 주문정보 업데이트
		coreOrderService.updateOrderInfo(order);
		
		// 4. 2021.05.10 장바구니정보 삭제
		boolean cartDelTemp = true;
		if (TsfSession.isLogin()) {
			if ("jsh77b".equals(TsfSession.getInfo().getCustId()) || "xodud1202".equals(TsfSession.getInfo().getCustId()) || "card007".equals(TsfSession.getInfo().getCustId())) {
				cartDelTemp = false;
			}
		}
		
		if (cartDelTemp) {
			orderService.deleteCartOrdNo(order);
		}
		
		// 5. 2021.05.10 보증보험 API 연동
		orderService.updateInsurance(order);
		
		// 2021.03.16 주문완료화면이동처리
		mav.setViewName("redirect:/order/complete?ordNo=" + order.getOrdNo());
		
		return mav;
	}

	/**
	 * 카카오페이 모바일 결제 PG 요청 완료
	 *
	 * @param Payment
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 05. 20
	 */
	@ResponseBody
	@RequestMapping(value = "/kakao/pay/result/response")
	public ModelAndView kakaoPayResultResponse(Payment payment) {
		ModelAndView mav = new ModelAndView();

		Integer custNo 	= TsfSession.isLogin() ? TsfSession.getInfo().getCustNo() : 0;
		String ordNo 	= TsfSession.getAttribute("ordNo");
		String tid 		= TsfSession.getAttribute("tid");

		if (StringUtils.isBlank(ordNo) || StringUtils.isBlank(tid)) {
			// 2021.11.05 결제실패화면이동처리
			ModelAndView redir = new ModelAndView();
			redir.setViewName("redirect:/order/payment/fail");
			return redir;
			//throw new IllegalArgumentException("결제가 실패하였습니다.");
		}

		payment.setPgTid(tid);
		payment.setPartnerOrderId(ordNo);
		payment.setPartnerUserId(String.valueOf(custNo));
		payment.setPgGb(TscConstants.PgGb.KAKAO.value());
		payment.setRegNo(custNo);
		payment.setUpdNo(custNo);

		// 2. 결재정보등록(TB_PAYMENT)
		Payment result = new Payment();
		
		try {
			result = orderService.kakaoPayResult(payment);
		} catch (Exception e) {
			// 2021.10.25 결제실패 등록
			orderService.createPaymentFail(e.getMessage(), custNo);
			
			// 2021.11.05 결제실패화면이동처리
			ModelAndView redir = new ModelAndView();
			redir.setViewName("redirect:/order/payment/fail");
			return redir;
			//throw new IllegalArgumentException(e.getMessage());
		}

		// 3. 주문정보 업데이트
		Order order = new Order();
		order.setOrdNo(Integer.parseInt(ordNo));
		order.setCustNo(custNo);
		order.setSellGb("10");
		order.setPgGb(TscConstants.PgGb.KAKAO.value());
		order.setPayMeans(result.getPayMeans());

		coreOrderService.updateOrderInfo(order);

		// 4. 2021.05.10 장바구니정보 삭제
		boolean cartDelTemp = true;
		if (TsfSession.isLogin()) {
			if ("jsh77b".equals(TsfSession.getInfo().getCustId()) || "xodud1202".equals(TsfSession.getInfo().getCustId()) || "card007".equals(TsfSession.getInfo().getCustId())) {
				cartDelTemp = false;
			}
		}

		if (cartDelTemp) {
			orderService.deleteCartOrdNo(order);
		}

		// 5. 2021.05.10 보증보험 API 연동
		orderService.updateInsurance(order);

		// 2021.03.16 주문완료화면이동처리
		mav.setViewName("redirect:/order/complete?ordNo=" + order.getOrdNo());
		
		// 2021.05.20 카카오페이, 네이버페이 결제 필요 정보 세션 삭제 
		TsfSession.removeAtrribute("ordNo");
		TsfSession.removeAtrribute("tid");

		return mav;
	}

	/**
	 * 네이버페이 모바일 결제 PG 요청 완료
	 *
	 * @param Payment
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 05. 20
	 */
	@ResponseBody
	@RequestMapping(value = "/naver/pay/result/response")
	public ModelAndView naverPayResultResponse(Payment param) {
		ModelAndView mav = new ModelAndView();

		Integer custNo = TsfSession.isLogin() ? TsfSession.getInfo().getCustNo() : 0;
		String ordNo = TsfSession.getAttribute("ordNo");

		if (StringUtils.isBlank(ordNo)) {
			// 2021.11.05 결제실패화면이동처리
			ModelAndView redir = new ModelAndView();
			redir.setViewName("redirect:/order/payment/fail");
			return redir;
			//throw new IllegalArgumentException("결제가 실패하였습니다.");
		}

		param.setPgTid(param.getPaymentId());
		param.setRegNo(custNo);
		param.setUpdNo(custNo);
		
		// 2. 결재정보등록(TB_PAYMENT)
		Payment result = new Payment();
		try {
			result = orderService.naverPayResult(param);
		} catch (Exception e) {
			// 2021.10.25 결제실패 등록
			orderService.createPaymentFail(e.getMessage(), custNo);
			
			// 2021.11.05 결제실패화면이동처리
			ModelAndView redir = new ModelAndView();
			redir.setViewName("redirect:/order/payment/fail");
			return redir;
			//throw new IllegalArgumentException(e.getMessage());
		}

		// 3. 주문정보 업데이트
		Order order = new Order();
		order.setOrdNo(Integer.parseInt(ordNo));
		order.setCustNo(custNo);
		order.setSellGb("10");
		order.setPgGb(TscConstants.PgGb.NAVER.value());
		order.setPayMeans(result.getPayMeans());

		coreOrderService.updateOrderInfo(order);

		// 4. 2021.05.10 장바구니정보 삭제
		boolean cartDelTemp = true;
		if (TsfSession.isLogin()) {
			if ("jsh77b".equals(TsfSession.getInfo().getCustId()) || "xodud1202".equals(TsfSession.getInfo().getCustId()) || "card007".equals(TsfSession.getInfo().getCustId())) {
				cartDelTemp = false;
			}
		}

		if (cartDelTemp) {
			orderService.deleteCartOrdNo(order);
		}

		// 5. 2021.05.10 보증보험 API 연동
		orderService.updateInsurance(order);

		// 2021.03.16 주문완료화면이동처리
		mav.setViewName("redirect:/order/complete?ordNo=" + order.getOrdNo());

		// 2021.05.20 카카오페이, 네이버페이 결제 필요 정보 세션 삭제 
		TsfSession.removeAtrribute("ordNo");
		TsfSession.removeAtrribute("tid");

		return mav;
	}

	/**
	 * 주문완료페이지
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 03. 16
	 */
	@ResponseBody
	@RequestMapping(value = "/complete")
	public ModelAndView orderComplete(Order order) {
		
		ModelAndView mav = new ModelAndView();
		
		// 1. 주문번호 체크
		if (order.getOrdNo() == null) {
			mav.setViewName("redirect:/");
			return mav;
		}
		
		// 2. 로그인체크 후 custNo 설정
		if (TsfSession.isLogin()) {
			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
		} else {
			order.setCustNo(0);
		}
		
		// 3. 결제완료정보조회
		GagaMap resultMap = coreOrderService.getOrderCompleteInfo(order);
		
		// 3.1 본인회원인 경우 체크
		Order orderInfo = (Order) resultMap.get("orderInfo");
		if (orderInfo.getCustNo() != 0) {
			if (TsfSession.isLogin()) {
				if (!TsfSession.getInfo().getCustNo().equals(orderInfo.getCustNo())) {
					mav.setViewName("redirect:/");
					return mav;
				}
			} else {
				mav.setViewName("redirect:/");
				return mav;
			}
		}
		
		// 3.2 상품주문금액이 없는 경우 체크
		int goodsSumAmt = (Integer) resultMap.get("goodsSumAmt");
		if (goodsSumAmt < 1) {
			mav.setViewName("redirect:/");
			return mav;
		}
		
		// 2021.06.18 알림톡 이전 발송이력 조회
		CustContactHst custContactHst = new CustContactHst();
		custContactHst.setContactType(TscConstants.ContactType.ORDER_INFO.value());
		custContactHst.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value());
		custContactHst.setContactMemo(String.valueOf(order.getOrdNo()));

		int count = customerService.getGiftKakaoSendInfo(custContactHst);
		
		if (count < 1) {
			// 2021.05.31 알림톡전송 주문완료정보		
			if (StringUtils.isNotBlank(orderInfo.getOrdPhnno())) {
				Integer userNo = orderInfo.getCustNo();
				
				try {
					orderInfo.setGoodsNm((String) resultMap.get("goodsNm"));
					orderInfo.setGoodsCnt(String.valueOf(resultMap.get("goodsCnt")));
					
					kakaotalkService.sendOrderComplete(orderInfo, userNo);
					
					GagaMap replaceInfo = new GagaMap(); 
					DecimalFormat df = new DecimalFormat("###,###");
					
					replaceInfo.set("ordSumAmt"			, df.format(resultMap.getInt("ordSumAmt")));
					replaceInfo.set("dcSumAmt"			, df.format(resultMap.getInt("dcSumAmt")));
					replaceInfo.set("realOrdSumAmt"		, df.format(resultMap.getInt("realOrdSumAmt")));
					replaceInfo.set("listSumAmt"		, df.format(resultMap.getInt("listSumAmt")));
					replaceInfo.set("goodsDcSumAmt"		, df.format(getZeroMinusCheck(resultMap.getInt("goodsDcSumAmt"))));
					replaceInfo.set("delvFeeSumAmt"		, df.format(resultMap.getInt("delvFeeSumAmt")));
					replaceInfo.set("realDelvSumAmt"	, df.format(resultMap.getInt("realDelvSumAmt")));
					replaceInfo.set("cpn1DcSumAmt"		, df.format(getZeroMinusCheck(resultMap.getInt("cpn1DcSumAmt"))));
					replaceInfo.set("tmtbSumAmt"		, df.format(getZeroMinusCheck(resultMap.getInt("tmtbSumAmt"))));
					replaceInfo.set("cpnDcSumAmt"		, df.format(getZeroMinusCheck(resultMap.getInt("cpnDcSumAmt"))));
					replaceInfo.set("prePntDcSumAmt"	, df.format(getZeroMinusCheck(resultMap.getInt("prePntDcSumAmt"))));
					replaceInfo.set("pntDcSumAmt"		, df.format(getZeroMinusCheck(resultMap.getInt("pntDcSumAmt"))));
					replaceInfo.set("gfcdUseSumAmt"		, df.format(getZeroMinusCheck(resultMap.getInt("gfcdUseSumAmt"))));
					replaceInfo.set("savePntSumAmt"		, df.format(resultMap.getInt("savePntSumAmt")));
					replaceInfo.set("mileageDcAmt"		, df.format(getZeroMinusCheck(resultMap.getInt("mileageDcAmt"))));
					replaceInfo.set("allianceDcAmt"		, df.format(getZeroMinusCheck(resultMap.getInt("allianceDcAmt"))));
					replaceInfo.set("orderInfo"			, resultMap.get("orderInfo"));
					replaceInfo.set("ordNm"				, resultMap.get("ordNm"));
					replaceInfo.set("ordNo"				, resultMap.get("ordNo"));
					replaceInfo.set("ordDt"				, resultMap.get("ordDt"));
					replaceInfo.set("recipNm"			, resultMap.get("recipNm"));
					replaceInfo.set("recipPhnno"		, resultMap.get("recipPhnno"));
					replaceInfo.set("recipZipcode"		, resultMap.get("recipZipcode"));
					replaceInfo.set("recipBaseAddr"		, resultMap.get("recipBaseAddr"));
					replaceInfo.set("recipDtlAddr"		, resultMap.get("recipDtlAddr"));
					replaceInfo.set("delvMemo"			, resultMap.get("delvMemo"));
					replaceInfo.set("pgGbNm"			, resultMap.get("pgGbNm"));
					replaceInfo.set("orderListInfo"		, resultMap.get("orderListInfo"));
					replaceInfo.set("orderFreegiftInfo"	, resultMap.get("orderFreegiftInfo"));
					
					replaceInfo.set("vaBankNm"			, orderInfo.getCardNm());
					replaceInfo.set("custNo"			, order.getCustNo());
					
					// 2021.07.29
					String vaDeadline = "";
					if (StringUtils.isNotBlank(orderInfo.getVaDeadline())) {
						Date deadline = new SimpleDateFormat("yyyy-MM-dd").parse(orderInfo.getVaDeadline().substring(0, 10));
						vaDeadline = new SimpleDateFormat("yyyy.MM.dd").format(deadline);
					}
					
					replaceInfo.set("vaDeadline"		, vaDeadline);
					replaceInfo.set("vaNo"				, orderInfo.getVaNo());
					
					// 2021.06.15
					// 주문완료 안내 메일 보내기
					if (StringUtils.isNotBlank(orderInfo.getOrdEmail())) {
						
						// 결제완료
						mailService.sendOrderComplete(replaceInfo, userNo);
						
						// 입금요청
						if ("G014_20".equals(orderInfo.getPayMeans())) {
							mailService.sendVaDepositRequest(replaceInfo, userNo);
						}
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			try {
				// 2021.05.31 알림톡전송 선물받기정보 (KCP 무통장입금 제외)
				if ("Y".equals(orderInfo.getGiftPackYn())) {
					// 2021.10.06 KCP, 무통장입금일때 선물받기 정보 보내지 않음!!!
					Boolean tmp = true;
					if ("KCP".equals(orderInfo.getPgGb())) {
						if (TscConstants.PayMeans.BANK_DEPOSIT.value().equals(orderInfo.getPayMeans())) {
							tmp = false;
						}
					}
					
					if (tmp) {
						if (StringUtils.isNotBlank(orderInfo.getRecipPhnno())) {
							Integer userNo = orderInfo.getCustNo();
							try {
								orderInfo.setGoodsNm((String) resultMap.get("goodsNm"));
								orderInfo.setGoodsCnt(String.valueOf(resultMap.get("goodsCnt")));
								kakaotalkService.sendOrderGiftComplete(orderInfo, userNo);
							} catch (Exception e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						}
					}
				}
			} catch (Exception e) {
				
			}
		}
		
		// 2021.04.27 마일리지, 제휴할인정보
		Order payOrder = orderService.getPaymentInfoForMypage(order);
		int mileageDcAmt 	= payOrder.getNpayPntAmt();
		int allianceDcAmt 	= payOrder.getPgCpnAmt();
		int realOrdSumAmt 	= (int) resultMap.get("realOrdSumAmt");
		realOrdSumAmt = realOrdSumAmt - mileageDcAmt - allianceDcAmt;
		
		// 4. 화면전송변수설정
		mav.addObject("orderInfo"			, resultMap.get("orderInfo"));			// 주문기본정보
		mav.addObject("ordSumAmt"			, resultMap.get("ordSumAmt"));			// 주문금액합계
		mav.addObject("dcSumAmt"			, resultMap.get("dcSumAmt"));			// 할인금액합계
		mav.addObject("realOrdSumAmt"		, realOrdSumAmt);						// 결제금액합계
		mav.addObject("listSumAmt"			, resultMap.get("listSumAmt"));			// 상품금액합계(정상가)
		mav.addObject("goodsSumAmt"			, resultMap.get("goodsSumAmt"));		// 상품금액합계(판매가)
		mav.addObject("goodsDcSumAmt"		, resultMap.get("goodsDcSumAmt"));		// 상품금액합계(정상가 - 판매가)
		mav.addObject("delvFeeSumAmt"		, resultMap.get("delvFeeSumAmt"));		// 배송비합계
		mav.addObject("realDelvSumAmt"		, resultMap.get("realDelvSumAmt"));		// 실제배송비합계
		mav.addObject("cpn1DcSumAmt"		, resultMap.get("cpn1DcSumAmt"));		// 즉시할인합계
		mav.addObject("tmtbSumAmt"			, resultMap.get("tmtbSumAmt"));			// 다다익선합계
		mav.addObject("cpnDcSumAmt"			, resultMap.get("cpnDcSumAmt"));		// 쿠폰할인합계
		mav.addObject("prePntDcSumAmt"		, resultMap.get("prePntDcSumAmt"));		// 선포인트할인합계
		mav.addObject("pntDcSumAmt"			, resultMap.get("pntDcSumAmt"));		// 포인트사용합계
		mav.addObject("gfcdUseSumAmt"		, resultMap.get("gfcdUseSumAmt"));		// 상품권사용합계
		mav.addObject("savePntSumAmt"		, resultMap.get("savePntSumAmt"));		// 적립예정포인트합계
		mav.addObject("mileageDcAmt"		, mileageDcAmt);						// 마일리지사용합계
		mav.addObject("allianceDcAmt"		, allianceDcAmt);						// 제휴할인합계
		
		mav.addObject("isLogin"				, TsfSession.isLogin());				// 로그인여부
		mav.addObject("delvAddrSq"			, resultMap.get("delvAddrSq"));			// 배송지번호
		mav.addObject("orderDetailList"		, resultMap.get("orderDetailList"));	// 주문상세목록
		mav.setViewName(super.getDeviceViewName("order/OrderComplete"));
		
		return mav;
	}
	
	/**
	 * 선물받기완료페이지
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 04. 15
	 */
	@ResponseBody
	@RequestMapping(value = "/giftComplete")
	public ModelAndView orderGiftComplete(Order order) {
		
		ModelAndView mav = new ModelAndView();
		
		// 1. 주문번호 체크
		if (order.getOrdNo() == null || order.getOrdNo() < 1) {
			mav.setViewName("redirect:/");
			return mav;
		}
		
		// 2. 결제완료정보조회
		GagaMap resultMap = coreOrderService.getOrderGiftCompleteInfo(order);
		
		int orderListCnt = (int) resultMap.get("orderListCnt");
		
		// 2021.06.04 선물하기 상품이 없을때 홈으로 이동
		if (orderListCnt < 1) {
			mav.setViewName("redirect:/");
			return mav;
		}
		
		// 3. 화면전송변수설정
		mav.addObject("orderInfo"			, resultMap.get("orderInfo"));			// 주문기본정보
		mav.addObject("orderList"			, resultMap.get("orderList"));			// 주문목록정보
		mav.addObject("orderListCnt"		, resultMap.get("orderListCnt"));		// 주문목록갯수
		mav.addObject("giftAddrInpYn"		, resultMap.get("giftAddrInpYn"));		// 선물받기배송지등록여부
		mav.addObject("delvRegYn"			, resultMap.get("delvRegYn"));			// 배송지등록여부
		mav.setViewName(super.getDeviceViewName("order/OrderGiftComplete"));
		
		return mav;
	}
	
	/**
	 * 선물주문배송신청완료
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 04. 15
	 */
	@ResponseBody
	@PostMapping(value = "/giftDelvComplete")
	public int updateDeliveryAddr(@RequestBody Order order) {
		int rtn = coreOrderService.updateOrderDetailGiftAddrInpYn(order);
		return rtn;
	}

	/**
	 * 총알배송 가능 지역 체크
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 02. 08
	 */
	@ResponseBody
	@PostMapping(value = "/getDailyDeliveryCheck")
	public int getDailyDeliveryCheck(@RequestBody Order order) {
		
		// 1. 총알배송가능 지역, 총알배송 가능 시간 체크
		int rtn = coreOrderService.getDailyDeliveryCheck(order);
		return rtn;
	}
	
	/**
	 * 사은품안내팝업 (사용하는지확인)
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 02. 17
	 */
	@ResponseBody
	@RequestMapping(value = "/freegiftInfoPop")
	public ModelAndView freegiftInfoPop(Order order) {
		ModelAndView mav = new ModelAndView();
		mav.setViewName(super.getDeviceViewName("order/OrderFreegiftInfoPop"));
		return mav;
	}
	
	/**
	 * 쿠폰변경팝업 (상품, 장바구니 쿠폰)
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 02. 17
	 */
	@SuppressWarnings({ "unused", "unchecked" })
	@ResponseBody
	@PostMapping(value = "/couponApplyPop")
	public ModelAndView couponApplyPop(@RequestBody Order order) {
		
		ModelAndView mav = new ModelAndView();
		
		GagaMap goodsDcAmtMap = new GagaMap();
		
		Collection<Order> goodsApplyCpnList 	= new ArrayList<Order>();
		Collection<Order> goodsCpnList			= new ArrayList<Order>();
		Collection<Order> cartCpnList 			= new ArrayList<Order>();
		Collection<Order> cartCpnIdList 		= new ArrayList<Order>();
		
		// 1. 로그인체크 후 custNo 설정
		if (TsfSession.isLogin()) {
			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
		} else {
			order.setJsessionId(TsfSession.getSessionId());
		}
		
		// 2. 로그인체크 후 정보 설정 (할인구간정보조회)
		if (TsfSession.isLogin()) {
			
			// 2.1 배송단위별 상품 목록 조회 (장바구니)
			Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
			
			// 2.2 상품금액, 선포인트, 다다익선할인금액
			goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
			
			// 2.3 배송단위별 장바구니 상품 건수 조회 (장바구니상품)
			GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList, order);
			
			// 2.4 상품쿠폰, 장바구니쿠폰 목록 조회
			GagaMap goodsCartCpnMap = coreOrderService.getGoodsCartCpnApplyGoodsList(order);
			
			goodsCpnList 	= (Collection<Order>) goodsCartCpnMap.get("goodsCpnList");
			cartCpnList 	= (Collection<Order>) goodsCartCpnMap.get("cartCpnList");
			cartCpnIdList 	= (Collection<Order>) goodsCartCpnMap.get("cartCpnIdList");
			
			// 2.5 상품쿠폰 적용된 상품 목록(상품기준)
			goodsApplyCpnList = coreOrderService.getGoodsCpnApplyList(tmtbGoodsApplyList, goodsCpnList);
			
			// 2.6 장바구니쿠폰(장바구니기준 상품목록)
			cartCpnList = coreOrderService.getCartCpnApplyList(tmtbGoodsApplyList, cartCpnList, cartCpnIdList);
		} 

		mav.addObject("goodsApplyCpnList"				, goodsApplyCpnList);						// 상품적용쿠폰
		mav.addObject("cartCpnList"						, cartCpnList);								// 장바구니쿠폰목록
		mav.addObject("order"							, order);									// 파라미터

		mav.setViewName(super.getDeviceViewName("order/OrderCouponApplyPop"));
		
		return mav;
	}
	
	/**
	 * 쿠폰변경팝업 (배송비쿠폰)
	 *
	 * @param
	 * @return
	 * @author jsh77b
	 * @since 2021. 02. 17
	 */
	@SuppressWarnings({ "unused", "unchecked" })
	@ResponseBody
	@PostMapping(value = "/delvCouponApplyPop")
	public ModelAndView delvCouponApplyPop(@RequestBody Order order) {
		
		ModelAndView mav = new ModelAndView();
		
		GagaMap goodsDcAmtMap = new GagaMap();
		
		Collection<Order> delvCpnList 			= new ArrayList<Order>();
		Collection<Order> delvFeeCdList 		= new ArrayList<Order>();
		
		// 1. 로그인체크 후 custNo 설정
		if (TsfSession.isLogin()) {
			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
		} else {
			order.setJsessionId(TsfSession.getSessionId());
		}
		
		// 2. 로그인체크 후 정보 설정 (할인구간정보조회)
		if (TsfSession.isLogin()) {
			
			// 2.1 배송단위별 상품 목록 조회 (장바구니)
			Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
			
			GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList, order);
			
			// 2.2 배송비쿠폰목록 조회
			order.setCpnId(null); // 2021.0-5.27 null 처리
			delvCpnList = coreOrderService.getDelvCpnList(order);
			
			// 2.3 배송정책단위목록
			delvFeeCdList = (Collection<Order>) delvOrderMap.get("delvFeeCdList");
			
			// 2.4 배송비쿠폰(배송업체기준)
			delvCpnList = coreOrderService.getDelvCpnApplyList(delvFeeCdList, delvCpnList);
		} 

		mav.addObject("delvCpnList"						, delvCpnList);								// 배송비쿠폰목록
		mav.addObject("order"							, order);									// 파라미터

		mav.setViewName(super.getDeviceViewName("order/OrderDelvCouponApplyPop"));
		
		return mav;
	}

	/**
	 * 카카오페이 결제 요청 처리
	 *
	 * @param String
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 03. 04
	 */
	@RequestMapping(value = "/kakao/payment/request")
	@ResponseBody
	public ModelAndView kakaoPaymentRequest(@RequestParam(value = "pg_token", required = false) String pgToken) {
		ModelAndView mav = new ModelAndView();
		mav.addObject("pgToken", pgToken);
		mav.addObject("ordNo", TsfSession.getAttribute("ordNo"));
		mav.setViewName(super.getDeviceViewName("pg/KakaoPaymentRequest"));
		return mav;
	}

	/**
	 * 네이버페이 결제 요청 처리
	 *
	 * @param String
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 03. 04
	 */
	@RequestMapping(value = "/naver/payment/request")
	@ResponseBody
	public ModelAndView naverPaymentRequest(@RequestParam(value = "paymentId", required = false) String paymentId, @RequestParam(value = "resultCode", required = false) String resultCode) {
		ModelAndView mav = new ModelAndView();
		mav.addObject("paymentId", paymentId);
		mav.addObject("ordNo", TsfSession.getAttribute("ordNo"));

		if (!TscConstants.FrontGb.PC.value().equals(TsfSession.getFrontGb()) && StringUtils.isNotBlank(resultCode) && "Fail".equals(resultCode)) {
			mav.setViewName(super.getDeviceViewName("error/PaymentFail"));
		} else {
			mav.setViewName(super.getDeviceViewName("pg/NaverPaymentRequest"));
		}

		return mav;
	}

	/**
	 * 주문 데이터 생성
	 *
	 * @param
	 * @return
	 * @author xodud1202
	 * @since 2021. 03. 04
	 */
	@RequestMapping(value = "/test")
	public ModelAndView test() {
		ModelAndView mav = new ModelAndView();
		mav.setViewName("web/order/test");
		return mav;
	}
	
	/**
	 * 취소,반품,교환 추가결제화면
	 *
	 * @param : ordChgSq
	 * @return
	 * @author jsh77b
	 * @since 2021. 04. 16
	 */
	@ResponseBody
	@RequestMapping(value = "/addPaymentForm")
	public ModelAndView orderAddPaymentForm(Order order) {
		
		ModelAndView mav = new ModelAndView();
		
		// 1. 주문번호 체크
		if (order.getOrdChgSq() == null) {
			mav.setViewName("redirect:/");
			return mav;
		}
				
		// 2. 추가결제 상품목록
		GagaMap resultMap = coreOrderService.getAddPayOrderListInfo(order);
		
		// 추가결제 목록이 없으면 메인으로 이동
		@SuppressWarnings("unchecked")
		Collection<Order> orderAddPayGoodsList = (Collection<Order>) resultMap.get("orderAddPayGoodsList");
		
		if (orderAddPayGoodsList.size() < 1) {
			mav.setViewName("redirect:/");
			return mav;
		}
		
		// TODO 주문정보 알림톡전송
		
		// 3. 화면전송변수설정
		mav.addObject("orderAddPayGoodsList"	, orderAddPayGoodsList);					// 주문목록정보
		mav.addObject("ordNo"					, resultMap.get("ordNo"));					// 주문번호
		mav.addObject("ordNm"					, resultMap.get("ordNm"));					// 주문자명
		mav.addObject("ordPhnno"				, resultMap.get("ordPhnno"));				// 주문자핸드폰번호
		mav.addObject("refundAmt"				, resultMap.get("refundAmt"));				// 상품환불금액
		mav.addObject("addPayCost"				, resultMap.get("addPayCost"));				// 추가결제금액
		mav.addObject("ordChgSq"				, resultMap.get("ordChgSq"));				// 주문취소신청번호
		
		mav.addObject("chgGb"					, resultMap.get("chgGb"));					// 변경구분
		mav.addObject("chgerNm"					, resultMap.get("chgerNm"));				// 변경신청인
		mav.addObject("chgerPhnno"				, resultMap.get("chgerPhnno"));				// 변경신청핸드폰번호
		mav.addObject("goodsNm"					, resultMap.get("goodsNm"));				// 상품명
		mav.addObject("delvCnt"					, resultMap.get("delvCnt"));				// 업체명카운트
		mav.addObject("delvFeeCdList"			, resultMap.get("delvFeeCdList"));			// 추가결제시 업체명 목록 조회
		mav.setViewName(super.getDeviceViewName("order/OrderAddPaymentForm"));
		
		return mav;
	}
	
	/**
	 * 추가결제실행
	 *
	 * @param
	 * @return
	 * @author xodud1202
	 * @since 2021. 03. 04
	 */
	@PostMapping("/addPayment")
	@ResponseBody
	public ModelAndView orderAddPayment(@RequestBody Order order) {
		ModelAndView mav = new ModelAndView();
		
		// 1. 로그인체크 후 custNo 설정
		if (TsfSession.isLogin()) {
			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
		} else {
			order.setJsessionId(TsfSession.getSessionId());
			order.setCustNo(0);
		}
		
		order.setPayAmt(order.getAddPayCost());
		// order.setOrdNm(order.getChgerNm());
		// order.setOrdPhnno(order.getChgerPhnno());
		
		// 2. 결제정보설정
		Payment payment = orderService.setPgDataInfo(order);
		payment.setOrdChgSq(order.getOrdChgSq());
		
		// 2021.05.10 추가
		payment.setPayUrl("/addPayment");
		payment.setRetUrl("/addPay/result/response");
		mav.addObject("payment", payment);
		mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));

		return mav;
	}
	
	/**
	 * 결제 PG 요청 완료
	 *
	 * @param
	 * @return
	 * @author xodud1202
	 * @since 2021. 03. 05
	 */
	@ResponseBody
	@RequestMapping(value = "/addPay/result/response")
	public ModelAndView addPayResultResponse(Payment param, HttpServletRequest request, HttpServletResponse response) {

		ModelAndView mav = new ModelAndView();

		Order order = new Order();

		// 1. 로그인체크 후 custNo 설정
		if (TsfSession.isLogin()) {
			param.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
			order.setCustNo(TsfSession.getInfo().getCustNo());
			order.setRegNo(TsfSession.getInfo().getCustNo());
			order.setUpdNo(TsfSession.getInfo().getCustNo());
		} else {
			param.setCustNo(0);
			order.setCustNo(0);
			order.setRegNo(0);
			order.setUpdNo(0);
		}
		
		param.setPayGb(TscConstants.PaymentGb.DELIVERY.value());
		param.setUpdNo(param.getCustNo());

		// 2. 결재정보등록(TB_PAYMENT)
		param = orderService.orderPgPayResult(param, request, response);
		order.setOrdNo(param.getOrdNo());
		order.setOrdChgSq(param.getOrdChgSq());

		// 3. 추가결제 상품목록
		GagaMap resultMap = coreOrderService.getAddPayOrderListInfo(order);

		// 4. 화면전송변수설정
		mav.addObject("refundAmt"		, resultMap.get("refundAmt"));				// 상품환불금액
		mav.addObject("addPayCost"		, resultMap.get("addPayCost"));				// 추가결제금액
		mav.addObject("ordChgSq"		, resultMap.get("ordChgSq"));				// 주문취소신청번호
		mav.addObject("chgerNm"			, resultMap.get("chgerNm"));				// 변경신청인
		mav.addObject("chgerPhnno"		, resultMap.get("chgerPhnno"));				// 변경신청핸드폰번호
		mav.addObject("ordNm"			, resultMap.get("ordNm"));					// 주문자명
		mav.addObject("ordPhnno"		, resultMap.get("ordPhnno"));				// 주문자핸드폰번호
		mav.addObject("payMeansNm"		, resultMap.get("payMeansNm"));				// 결제타입명

		// TODO 3. 주문정보 업데이트
		coreOrderService.updateOrderChangeDetail(order);
		
		// 배송비 결제 시퀀스 업데이트
		param.setPayGb(TscConstants.PaymentGb.DELIVERY.value());
		coreOrderService.updateDeliveryFeePaySq(param);
		
		// 추가배송비 결제금액 환불배송비 수정 처리
		coreOrderService.updateRefundDeliveryFee(param);

		// 6. 반품&교환 접수 알림톡 및 메일 발송
		Integer ordChgSq = order.getOrdChgSq();
		Integer custNo = order.getCustNo();

		if (ordChgSq > 0) {
			Collection<Order> list = coreOrderChangeService.getExchangeInfo(order);
			String chgGb = "";
			if (list != null && list.size() > 0) {
				chgGb = list.iterator().next().getChgGb();
			}

			OrderChange orderChange = coreOrderChangeService.getKakaoOrderReturnInfo(ordChgSq);

			if (TscConstants.OrderChangeGb.RETURN.value().equals(chgGb)) {
				// 반품 알림톡 발송
				try {
					if (StringUtils.isNotBlank(orderChange.getOrdPhnno())) {
						kakaotalkService.sendOrderReturnRequest(orderChange, custNo);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}

				// 반품 안내 메일 정보 조회
				try {
					GagaMap replaceInfo = coreOrderChangeService.getMailOrderReturnReplaceInfo(orderChange);

					// 반품 안내 메일 발송
					if (StringUtils.isNotBlank(replaceInfo.getString("ordEmail"))) {
						mailService.sendOrderReturn(replaceInfo, custNo);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			} else if (TscConstants.OrderChangeGb.EXCHANGE.value().equals(chgGb)) {
				// 교환 알림톡 발송
				try {
					if (StringUtils.isNotBlank(orderChange.getOrdPhnno())) {
						kakaotalkService.sendOrderExchangeRequest(orderChange, custNo);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}

				// 교환 안내 메일 정보 조회
				try {
					GagaMap replaceInfo = coreOrderChangeService.getMailOrderExchangeReplaceInfo(orderChange);

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

		// 2021.03.16 주문완료화면이동처리
		mav.setViewName(super.getDeviceViewName("order/OrderAddPaymentComplete"));
		
		return mav;
	}

	/**
	 * 결제 실패 화면
	 *
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 05. 25
	 */
	@RequestMapping(value = "/payment/fail")
	public ModelAndView paymentFail() {
		ModelAndView mav = new ModelAndView();

		mav.setViewName(super.getDeviceViewName("error/PaymentFail"));

		return mav;
	}
	
	/**
	 * 마이페이지 교환 옵션 변경 팝업
	 *
	 * @param Order
	 * @return ModelAndView
	 * @author card007
	 * @since 2021. 03. 30
	 */
	@PostMapping("/change/option/popup/form")
	@ResponseBody
	public ModelAndView changeOptionPopupForm(OrderChange orderChange) {
		ModelAndView mav = new ModelAndView();

		// custNo 설정
		if (TsfSession.isLogin()) {
			orderChange.setCustNo(TsfSession.getInfo().getCustNo());
		} else {
			orderChange.setCustNo(0);
		}

		// 교환 옵션 정보 조회
		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.addObject("title"				, "옵션 변경");

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

		return mav;
	}
	
	/**
	 * 선물받기 옵션변경
	 *
	 * @param Order
	 * @return ModelAndView
	 * @author jsh77b
	 * @since 2021. 06. 18
	 */
	@PostMapping("/updateOrderDetailItemOpt2")
	@ResponseBody
	public GagaResponse updateOrderDetailItemOpt2(@RequestBody Order order) {	
		// custNo 설정
		if (TsfSession.isLogin()) {
			order.setUpdNo(TsfSession.getInfo().getCustNo());
		} else {
			order.setUpdNo(0);
		}

		coreOrderService.updateOrderDetailItemOpt2(order);

		return super.ok(message.getMessage("SUCC_0001"));
	}
	
	
	// 금액이 0 이상일때 - 금액 처리 
	private int getZeroMinusCheck(int amt) {
		int resultAmt = 0; 
		
		if (amt > 0) {
			resultAmt = amt * -1;
		} else {
			resultAmt = amt;
		}
		
		return resultAmt;
	}

	/**
	 * 계좌인증
	 * 
	 * @param CustAccount
	 * @return GagaMap
	 * @author card007
	 * @since 2021. 10. 15
	 */
	@PostMapping("/account/check")
	@ResponseBody
	public GagaMap getAccountCheck(@RequestBody CustAccount custAccount) {
		boolean isValid = false;

		GagaMap result = coreKcpService.checkAccount(custAccount);

		if ("0000".equals(result.get("resCd"))) {
			isValid = true;
		}

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

	/**
	 * 출고금지지역 여부 조회
	 *
	 * @param Order
	 * @return GagaMap
	 * @author card007
	 * @since 2021. 10. 15
	 */
	@PostMapping("/delivery/ban")
	@ResponseBody
	public GagaMap getDeliveryBanZipcode(@RequestBody Order order) {
		GagaMap result = new GagaMap();
		result.set("status", GagaResponseStatus.SUCCESS.getCode());
		result.set("banZipcode", coreOrderService.getDeliveryBanZipcode(order));

		return result;
	}
}
