Explorar o código

주문서개발

jsh77b %!s(int64=5) %!d(string=hai) anos
pai
achega
fc3ee12f40

+ 3 - 2
src/main/java/com/style24/front/biz/service/TsfCartService.java

@@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.thymeleaf.util.StringUtils;
 
 import com.style24.core.biz.service.TscOrderService;
 import com.style24.core.support.env.TscConstants;
@@ -168,9 +169,9 @@ public class TsfCartService {
 		cart.setGoodsType(params.iterator().next().getGoodsType());
 		cart.setItemCdSql(sb.toString());
 
-		if ("C".equals(params.iterator().next().getCartGb())) {
+		if (!StringUtils.isEmpty(params.iterator().next().getCartGb()) && "C".equals(params.iterator().next().getCartGb())) {
 			cart.setCartGb(TscConstants.CartGb.CART.value());
-		} else if ("O".equals(params.iterator().next().getCartGb())) {
+		} else if (!StringUtils.isEmpty(params.iterator().next().getCartGb()) && "O".equals(params.iterator().next().getCartGb())) {
 			if ("P".equals(TsfSession.getFrontGb())) {
 				cart.setCartGb(TscConstants.CartGb.PC_ORDER.value());
 			} else {

+ 26 - 2
src/main/java/com/style24/front/biz/service/TsfOrderService.java

@@ -13,6 +13,7 @@ import javax.servlet.http.HttpServletResponse;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.thymeleaf.util.StringUtils;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.biz.service.TscKcpService;
@@ -214,12 +215,35 @@ public class TsfOrderService {
 		return mapList;
 	}
 
-	public void kcpTest(Payment param, HttpServletRequest request, HttpServletResponse response) {
+	/**
+	 * PG 결제승인
+	 * @param param - 필수 : payGb(결제수단 : KCP, KAKAO 등), payMeans(결제수단 : G014_30(신용카드) 등), cashReceiptYn(현금영수증여부)
+	 * @param request
+	 * @param response
+	 * @return
+	 */
+	public Payment orderPgPayResult(Payment param, HttpServletRequest request, HttpServletResponse response) {
+		Payment result = new Payment();
 		try {
-			coreKcpService.kcpPayRequest(param, request, response);
+			if(StringUtils.isEmpty(param.getPayGb())) {
+				throw new IllegalArgumentException("결제수단을 선택해주세요.");
+			}
+
+			if("KCP".equals(param.getPayGb())) {
+				result = coreKcpService.kcpPayRequest(param, request, response);
+			} else if ("PAYCO".equals(param.getPayGb())) {
+				param = null;
+			} else if ("KAKAO".equals(param.getPayGb())) {
+				param = null;
+			} else if ("NAVER".equals(param.getPayGb())) {
+
+			}
 		} catch(Exception e) {
 			e.printStackTrace();
+			throw new IllegalArgumentException(e.getMessage());
 		}
+
+		return result;
 	}
 
 	/**

+ 2 - 0
src/main/java/com/style24/front/biz/web/TsfCartController.java

@@ -15,6 +15,7 @@ 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 org.thymeleaf.util.StringUtils;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.biz.service.TscOrderService;
@@ -27,6 +28,7 @@ import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Cart;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.Payment;
 
 import lombok.extern.slf4j.Slf4j;
 

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

@@ -382,7 +382,7 @@ public class TsfCustomerController extends TsfBaseController {
 		ModelAndView mav = new ModelAndView();
 		GagaMap result = niceCertify.certifyCellPhone();
 
-		if (TscConstants.FrontGb.MOBIEL.value().equals(TsfSession.getFrontGb())) {
+		if (TscConstants.FrontGb.MOB.value().equals(TsfSession.getFrontGb())) {
 			mav.addObject("redirectUrl", redirectUrl); // 모바일만 사용
 		}
 
@@ -404,7 +404,7 @@ public class TsfCustomerController extends TsfBaseController {
 		ModelAndView mav = new ModelAndView();
 		GagaMap result = niceCertify.certifyIpin();
 
-		if (TscConstants.FrontGb.MOBIEL.value().equals(TsfSession.getFrontGb())) {
+		if (TscConstants.FrontGb.MOB.value().equals(TsfSession.getFrontGb())) {
 			mav.addObject("redirectUrl", redirectUrl); // 모바일만 사용
 		}
 
@@ -439,7 +439,7 @@ public class TsfCustomerController extends TsfBaseController {
 			authMethod = TscConstants.AuthMethod.IPIN.value();
 		}
 
-		if (TscConstants.FrontGb.MOBIEL.value().equals(TsfSession.getFrontGb())) {
+		if (TscConstants.FrontGb.MOB.value().equals(TsfSession.getFrontGb())) {
 			mav.addObject("redirectUrl", redirectUrl);
 		}
 

+ 339 - 64
src/main/java/com/style24/front/biz/web/TsfOrderController.java

@@ -7,18 +7,24 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
 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 org.springframework.web.servlet.mvc.support.RedirectAttributes;
+import org.thymeleaf.util.StringUtils;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.biz.service.TscFreegiftService;
 import com.style24.core.biz.service.TscKakaoPayService;
 import com.style24.core.biz.service.TscOrderService;
+import com.style24.core.biz.thirdparty.KakaoPayApi;
+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.TsfOrderService;
@@ -57,6 +63,9 @@ public class TsfOrderController extends TsfBaseController {
 	
 	@Autowired
 	private TscKakaoPayService kakaoPayService;
+
+	@Autowired
+	private Environment env;
 	
 	/**
 	 * 회원, 비회원 주문페이지
@@ -70,8 +79,6 @@ public class TsfOrderController extends TsfBaseController {
 	public ModelAndView orderNoMember(Order order, RedirectAttributes redirectAttributes) {
 		ModelAndView mav = new ModelAndView();
 		
-		String rtnView = "";
-		
 		// 비회원 주문시 로직 정리
 		// @ web 인 경우에는 고객정보 입력 화면 후 주문서 이동 후 본인인중
 		// @ web 의 경우에는 입력한 고객정보와 인증받은 고객정보가 다른경우 고객정보 업데이트
@@ -91,6 +98,8 @@ public class TsfOrderController extends TsfBaseController {
 		return mav;
 	}
 	
+	
+	
 	/**
 	 * 주문페이지
 	 *
@@ -116,13 +125,13 @@ public class TsfOrderController extends TsfBaseController {
 		}
 		
 		// TODO
-		// 1.1 카트시퀀스가 없을때 처리 장바구니로 이동 
+		// 1.1 카트시퀀스가 정보가 없을때 처리 장바구니로 이동 
 		if (order.getCartSqArr() == null) {
 			mav.setViewName("redirect:/order/noMember");		// 비회원주문서화면
 			return mav;
 		}
 		
-		// 2. 로그인정보 체크 후 비회원 고객정보 설정 (화면에서 오류 발생에 대비해서 정리)
+		// 2. 로그인정보 체크 후 비회원 고객정보 설정
 		if (TsfSession.isLogin()) {
 			order.setCustNm("");
 			order.setCellPhnno("");
@@ -139,44 +148,67 @@ public class TsfOrderController extends TsfBaseController {
 		// 2.1 배송단위별 상품 목록 조회 (장바구니)
 		Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
 		
-		// 2.2 상품금액, 선포인트, 다다익선할인금액
+		// 2.1.0 상품금액, 선포인트, 다다익선할인금액
 		GagaMap goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
 		
-		// 2.3 배송단위별 장바구니 상품 건수 조회 (장바구니상품)
+		// 2.2 배송단위별 장바구니 상품 건수 조회 (장바구니상품)
 		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList);
+
+		// 3. 할인구간정보조회
+		// 3.2 상품쿠폰, 장바구니쿠폰 목록 조회
+		GagaMap goodsCartCpnMap = coreOrderService.getGoodsCartCpnApplyGoodsList(order);
+		
+		Collection<Order> goodsCpnList 	= (Collection<Order>) goodsCartCpnMap.get("goodsCpnList");
+		Collection<Order> cartCpnList 	= (Collection<Order>) goodsCartCpnMap.get("cartCpnList");
+		
+		// 3.2.1 상품기준 ---> 상품쿠폰 적용된 상품 목록
+		Collection<Order> goodsApplyCpnList = coreOrderService.getGoodsCpnApplyList(tmtbGoodsApplyList, goodsCpnList);
 		
-		// 2.4 고객 보유 포인트 정보 조회
-		//int rmPntAmt = coreOrderService.getCustPointInfo(order);
+		// 3.2.2 장바구니쿠폰기준 ---> 상품목록
+		cartCpnList = coreOrderService.getCartCpnApplyList(tmtbGoodsApplyList, cartCpnList);
 		
-		// 2.5 고객 보유 상품권 정보 조회
-		//int rmGfcdAmt = coreOrderService.getGiftcardInfo(order);
+		// 3.3 배송비쿠폰목록 조회
+		Collection<Order> delvCpnList = coreOrderService.getDelvCpnList(order);
+
+		Collection<Order> delvFeeCdList = (Collection<Order>) delvOrderMap.get("delvFeeCdList");
+		
+		// 3.3.1 배소업체기준 ---> 배송비쿠폰
+		delvCpnList = coreOrderService.getDelvCpnApplyList(delvFeeCdList, delvCpnList);
+		
+		// 3.4 고객 보유 포인트 정보 조회
+		int rmPntAmt = coreOrderService.getCustPointInfo(order);
+		
+		// 3.5 고객 보유 상품권 정보 조회
+		int rmGfcdAmt = coreOrderService.getGiftcardInfo(order);
 
 		// 101. 상품정보
-		mav.addObject("cartGoodsList"			, tmtbGoodsApplyList);						// 장바구니상품목록 (즉시할인쿠폰적용)
-		mav.addObject("delvTotCnt" 				, delvOrderMap.get("delvTotCnt"));			// 총상품건수
-		mav.addObject("delvFeeTotCnt"			, delvOrderMap.get("delvFeeTotCnt"));		// 총배송타입건수
-		mav.addObject("wmsCnt" 					, delvOrderMap.get("wmsCnt"));				// 자사상품건수
-		mav.addObject("resCnt" 					, delvOrderMap.get("resCnt"));				// 자사예약상품건수
-		mav.addObject("delvCnt" 				, delvOrderMap.get("delvCnt"));				// 입점업체상품건수
-		
-		mav.addObject("shotCartList" 			, delvOrderMap.get("shotCartList"));		// 자사총알배송상품목록
-		mav.addObject("wmsCartList" 			, delvOrderMap.get("wmsCartList"));			// 자사일반배송상품목록
-		mav.addObject("delvCartList" 			, delvOrderMap.get("delvCartList"));		// 입점업체상품목록
-		mav.addObject("resCartList" 			, delvOrderMap.get("resCartList"));			// 자사예약배송상품목록
-		mav.addObject("delvAllCartList" 		, delvOrderMap.get("delvAllCartList"));		// 전체배송목록
-		mav.addObject("sumDelvFee" 				, delvOrderMap.get("sumDelvFee"));			// 배송비합계
+		mav.addObject("cartGoodsList"					, tmtbGoodsApplyList);						// 장바구니상품목록 (즉시할인쿠폰적용)
+		mav.addObject("delvTotCnt" 						, delvOrderMap.get("delvTotCnt"));			// 총상품건수
+		mav.addObject("delvFeeTotCnt"					, delvOrderMap.get("delvFeeTotCnt"));		// 총배송타입건수
+		mav.addObject("wmsCnt" 							, delvOrderMap.get("wmsCnt"));				// 자사상품건수
+		mav.addObject("resCnt" 							, delvOrderMap.get("resCnt"));				// 자사예약상품건수
+		mav.addObject("delvCnt" 						, delvOrderMap.get("delvCnt"));				// 입점업체상품건수
+		
+		mav.addObject("shotCartList" 					, delvOrderMap.get("shotCartList"));		// 자사총알배송상품목록
+		mav.addObject("wmsCartList" 					, delvOrderMap.get("wmsCartList"));			// 자사일반배송상품목록
+		mav.addObject("delvCartList" 					, delvOrderMap.get("delvCartList"));		// 입점업체상품목록
+		mav.addObject("resCartList" 					, delvOrderMap.get("resCartList"));			// 자사예약배송상품목록
+		mav.addObject("delvAllCartList" 				, delvOrderMap.get("delvAllCartList"));		// 전체배송목록
+		mav.addObject("sumDelvFee" 						, delvOrderMap.get("sumDelvFee"));			// 배송비합계
 		
 		// 102. 주문정보
-		mav.addObject("order" 					, order);									// 주문정보
+		mav.addObject("order" 							, order);									// 주문정보
 
 		// 103. 할인정보
-		mav.addObject("tmtbGoodsApplyList"		, tmtbGoodsApplyList);						// 다다익선상품 적용목록
-		mav.addObject("orgGoodsSumAmt"			, goodsDcAmtMap.get("orgGoodsSumAmt"));		// 상품금액합계
-		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("tmtbGoodsApplyList"				, tmtbGoodsApplyList);						// 다다익선상품 적용목록
+		mav.addObject("orgGoodsSumAmt"					, goodsDcAmtMap.get("orgGoodsSumAmt"));		// 상품금액합계
+		mav.addObject("cpn1DcSumAmt"					, goodsDcAmtMap.get("cpn1DcSumAmt"));		// 즉시할인금액합계
+		mav.addObject("tmtbDcSumAmt"					, goodsDcAmtMap.get("tmtbDcSumAmt"));		// 다다익선할인금액합계
+		mav.addObject("prePntDcAmt"						, goodsDcAmtMap.get("prePntDcAmt"));		// 선포인트사용가능금액
+
+		mav.addObject("rmPntAmt"						, rmPntAmt);								// 고객포인트정보
+		mav.addObject("rmGfcdAmt"						, rmGfcdAmt);								// 고객상품권정보
+		mav.addObject("savePntSumAmt"					, goodsDcAmtMap.get("savePntSumAmt"));		// 적립예정포인트합계
 		
 		mav.setViewName(super.getDeviceViewName("order/OrderForm"));
 		
@@ -382,19 +414,19 @@ public class TsfOrderController extends TsfBaseController {
 		} 
 
 		ModelAndView mav = new ModelAndView();
-		mav.addObject("goodsApplyCpnList"		, goodsApplyCpnList);						// 상품적용쿠폰
-		mav.addObject("cartCpnList"				, cartCpnList);								// 장바구니쿠폰목록
-		mav.addObject("delvCpnList"				, delvCpnList);								// 배송비쿠폰목록
+		mav.addObject("goodsApplyCpnList"				, goodsApplyCpnList);						// 상품적용쿠폰
+		mav.addObject("cartCpnList"						, cartCpnList);								// 장바구니쿠폰목록
+		mav.addObject("delvCpnList"						, delvCpnList);								// 배송비쿠폰목록
 
-		mav.addObject("orgGoodsSumAmt"			, goodsDcAmtMap.get("orgGoodsSumAmt"));		// 상품금액합계
-		mav.addObject("cpn1DcSumAmt"			, goodsDcAmtMap.get("cpn1DcSumAmt"));		// 즉시할인금액합계
-		mav.addObject("tmtbDcSumAmt"			, goodsDcAmtMap.get("tmtbDcSumAmt"));		// 다다익선할인금액합계
-		mav.addObject("prePntDcAmt"				, goodsDcAmtMap.get("prePntDcAmt"));		// 선포인트사용가능금액
+		mav.addObject("orgGoodsSumAmt"					, goodsDcAmtMap.get("orgGoodsSumAmt"));		// 상품금액합계
+		mav.addObject("cpn1DcSumAmt"					, goodsDcAmtMap.get("cpn1DcSumAmt"));		// 즉시할인금액합계
+		mav.addObject("tmtbDcSumAmt"					, goodsDcAmtMap.get("tmtbDcSumAmt"));		// 다다익선할인금액합계
+		mav.addObject("prePntDcAmt"						, goodsDcAmtMap.get("prePntDcAmt"));		// 선포인트사용가능금액
 
-		mav.addObject("rmPntAmt"				, rmPntAmt);								// 고객포인트정보
-		mav.addObject("rmGfcdAmt"				, rmGfcdAmt);								// 고객상품권정보
-		mav.addObject("savePntSumAmt"			, goodsDcAmtMap.get("savePntSumAmt"));		// 적립예정포인트합계
-		mav.addObject("order"					, order);									// 파라미터
+		mav.addObject("rmPntAmt"						, rmPntAmt);								// 고객포인트정보
+		mav.addObject("rmGfcdAmt"						, rmGfcdAmt);								// 고객상품권정보
+		mav.addObject("savePntSumAmt"					, goodsDcAmtMap.get("savePntSumAmt"));		// 적립예정포인트합계
+		mav.addObject("order"							, order);									// 파라미터
 		
 		mav.setViewName(super.getDeviceViewName("order/OrderDcAmtInfo"));
 		
@@ -432,23 +464,6 @@ public class TsfOrderController extends TsfBaseController {
 		return mav;
 	}
 
-	/**
-	 * 총알배송 가능 지역 체크
-	 *
-	 * @param
-	 * @return
-	 * @author jsh77b
-	 * @since 2021. 02. 08
-	 */
-	@ResponseBody
-	@RequestMapping(value = "/create/order")
-	public ModelAndView createOrder(Order order) {
-		ModelAndView mav = new ModelAndView();
-
-		mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));
-		return mav;
-	}
-
 	/**
 	 * 주문페이지
 	 *
@@ -457,12 +472,11 @@ public class TsfOrderController extends TsfBaseController {
 	 * @author jsh77b
 	 * @since 2021. 02. 02
 	 */
-	@SuppressWarnings({ "unchecked", "null" })
 	@RequestMapping(value = "/pay/result/response")
 	public ModelAndView payResultResponse(Payment param, HttpServletRequest request, HttpServletResponse response) {
 		ModelAndView mav = new ModelAndView();
 
-		orderService.kcpTest(param, request, response);
+		orderService.orderPgPayResult(param, request, response);
 		
 		mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));
 		return mav;
@@ -477,7 +491,7 @@ public class TsfOrderController extends TsfBaseController {
 	 * @since 2021. 02. 08
 	 */
 	@ResponseBody
-	@RequestMapping(value = "/getDailyDeliveryCheck")
+	@PostMapping(value = "/getDailyDeliveryCheck")
 	public int getDailyDeliveryCheck(Order order) {
 		
 		// 1. 총알배송가능 지역, 총알배송 가능 시간 체크
@@ -495,7 +509,7 @@ public class TsfOrderController extends TsfBaseController {
 	 * @since 2021. 02. 17
 	 */
 	@ResponseBody
-	@RequestMapping(value = "/delvAddrChangePop")
+	@PostMapping(value = "/delvAddrChangePop")
 	public ModelAndView delvAddrChangePop(Order order) {
 		
 		ModelAndView mav = new ModelAndView();
@@ -579,6 +593,217 @@ public class TsfOrderController extends TsfBaseController {
 		
 		return mav;
 	}
+	
+	
+	
+	
+	/**
+	 * 주문페이지
+	 *
+	 * @param
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 02. 02
+	 */
+	@SuppressWarnings({ "unchecked", "null" })
+	@RequestMapping(value = "/form20210304")
+	public ModelAndView orderForm20210304(Order order) {
+		ModelAndView mav = new ModelAndView();
+		
+		// TODO
+		// 1.비회주문, 회원 주문 판단 로직,  고객정보 세션 판단
+		// 세션고객정보가 존재하면 회원주문 없으면 비회원 주문
+		
+		// 임시 jsessionId
+		String jsessionId 	= "aaec62cc-5f91-47bb-ba65-ebc9a61385cf";
+		Boolean noMember 	= true;
+
+		// TODO 로그인체크 로직 추가
+		// 1.0 회원, 비회원 여부 판단
+		if (TsfSession.getInfo().getCustNo() == null) {
+			order.setJsessionId(jsessionId);
+		} else {
+			noMember = false;
+			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
+		}
+		
+		// TODO
+		// 1.1 카트시퀀스가 없을때 처리 장바구니로 이동 
+		if (order.getCartSqArr() == null) {
+			mav.setViewName("redirect:/order/noMember");		// 비회원주문서화면
+			return mav;
+		}
+		
+		Order custemerInfo = new Order();
+		Order deliveryAddrInfo = new Order();
+
+		// TODO 로그인체크 로직 추가
+		if (noMember) {
+			// 1.1 주문고객 정보조회
+			custemerInfo.setCustNm(order.getCustNm());
+			custemerInfo.setCellPhnno(order.getCellPhnno());
+			custemerInfo.setEmail(order.getEmail());
+			
+			// 1.2 배송지 정보조회 (기본배송지)
+			deliveryAddrInfo.setDelvAddrNm(order.getCustNm());
+			deliveryAddrInfo.setRecipZipcode(order.getRecipZipcode());
+			deliveryAddrInfo.setRecipBaseAddr(order.getRecipBaseAddr());
+			deliveryAddrInfo.setRecipDtlAddr(order.getRecipDtlAddr());
+			deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
+		} else {
+			// 1.1 주문고객 정보조회
+			custemerInfo = coreOrderService.getCustemerInfo(order);
+			
+			// 1.2 배송지 정보조회 (기본배송지)
+			deliveryAddrInfo = coreOrderService.getDeliveryAddrInfo(order);
+			
+			if (deliveryAddrInfo == null) {
+				deliveryAddrInfo = new Order();
+				deliveryAddrInfo.setDelvAddrNm(custemerInfo.getCustNm());
+				deliveryAddrInfo.setRecipZipcode("");
+				deliveryAddrInfo.setRecipBaseAddr("");
+				deliveryAddrInfo.setRecipDtlAddr("");
+				deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
+			}
+		}
+
+		// TODO 임시 장바구니
+		// 2. 장바구니시퀀스 배열 등록 (장바구니 상품 정보 조회)		
+		// 2.1 배송단위별 상품 목록 조회 (장바구니)
+		Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
+		
+		// 2.1.0 상품금액, 선포인트, 다다익선할인금액
+		GagaMap goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
+		
+		// 2.2 배송단위별 장바구니 상품 건수 조회 (장바구니상품)
+		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList);
+
+		// 3. 할인구간정보조회
+		// 3.2 상품쿠폰, 장바구니쿠폰 목록 조회
+		GagaMap goodsCartCpnMap = coreOrderService.getGoodsCartCpnApplyGoodsList(order);
+		
+		Collection<Order> goodsCpnList 	= (Collection<Order>) goodsCartCpnMap.get("goodsCpnList");
+		Collection<Order> cartCpnList 	= (Collection<Order>) goodsCartCpnMap.get("cartCpnList");
+		
+		// 3.2.1 상품기준 ---> 상품쿠폰 적용된 상품 목록
+		Collection<Order> goodsApplyCpnList = coreOrderService.getGoodsCpnApplyList(tmtbGoodsApplyList, goodsCpnList);
+		
+		// 3.2.2 장바구니쿠폰기준 ---> 상품목록
+		cartCpnList = coreOrderService.getCartCpnApplyList(tmtbGoodsApplyList, cartCpnList);
+		
+		// 3.3 배송비쿠폰목록 조회
+		Collection<Order> delvCpnList = coreOrderService.getDelvCpnList(order);
+		
+		Collection<Order> delvFeeCdList = (Collection<Order>) delvOrderMap.get("delvFeeCdList");
+		
+		// 3.3.1 배소업체기준 ---> 배송비쿠폰
+		delvCpnList = coreOrderService.getDelvCpnApplyList(delvFeeCdList, delvCpnList);
+		
+		// 3.4 고객 보유 포인트 정보 조회
+		int rmPntAmt = coreOrderService.getCustPointInfo(order);
+		
+		// 3.5 고객 보유 상품권 정보 조회
+		int rmGfcdAmt = coreOrderService.getGiftcardInfo(order);
+		
+		// 4. 사은품 정보
+		// 4.1 장바구니상품 사음품 적용 정보 조회
+		GagaMap  resultMap = coreFreegiftService.getOrderFreegift(order);
+
+		// 101. 상품정보
+		mav.addObject("cartGoodsList"					, tmtbGoodsApplyList);						// 장바구니상품목록 (즉시할인쿠폰적용)
+		mav.addObject("delvTotCnt" 						, delvOrderMap.get("delvTotCnt"));			// 총상품건수
+		mav.addObject("delvFeeTotCnt"					, delvOrderMap.get("delvFeeTotCnt"));		// 총배송타입건수
+		mav.addObject("wmsCnt" 							, delvOrderMap.get("wmsCnt"));				// 자사상품건수
+		mav.addObject("resCnt" 							, delvOrderMap.get("resCnt"));				// 자사예약상품건수
+		mav.addObject("delvCnt" 						, delvOrderMap.get("delvCnt"));				// 입점업체상품건수
+		
+		mav.addObject("shotCartList" 					, delvOrderMap.get("shotCartList"));		// 자사총알배송상품목록
+		mav.addObject("wmsCartList" 					, delvOrderMap.get("wmsCartList"));			// 자사일반배송상품목록
+		mav.addObject("delvCartList" 					, delvOrderMap.get("delvCartList"));		// 입점업체상품목록
+		mav.addObject("resCartList" 					, delvOrderMap.get("resCartList"));			// 자사예약배송상품목록
+		mav.addObject("delvAllCartList" 				, delvOrderMap.get("delvAllCartList"));		// 전체배송목록
+		mav.addObject("sumDelvFee" 						, delvOrderMap.get("sumDelvFee"));			// 배송비합계
+		
+		// 102. 고객정보
+		mav.addObject("custemerInfo"					, custemerInfo);							// 고객정보
+		mav.addObject("deliveryAddrInfo"				, deliveryAddrInfo);						// 배송지정보
+		mav.addObject("shotDelvYn" 						, order.getShotDelvYn());					// 장바구니 총알배송여부
+		
+		// 103. 할인정보
+		mav.addObject("tmtbGoodsApplyList"				, tmtbGoodsApplyList);						// 다다익선상품 적용목록
+		mav.addObject("goodsApplyCpnList"				, goodsApplyCpnList);						// 상품적용쿠폰
+		mav.addObject("cartCpnList"						, cartCpnList);								// 장바구니쿠폰목록
+		mav.addObject("delvCpnList"						, delvCpnList);								// 배송비쿠폰목록
+		
+		mav.addObject("orgGoodsSumAmt"					, goodsDcAmtMap.get("orgGoodsSumAmt"));		// 상품금액합계
+		mav.addObject("cpn1DcSumAmt"					, goodsDcAmtMap.get("cpn1DcSumAmt"));		// 즉시할인금액합계
+		mav.addObject("tmtbDcSumAmt"					, goodsDcAmtMap.get("tmtbDcSumAmt"));		// 다다익선할인금액합계
+		mav.addObject("prePntDcAmt"						, goodsDcAmtMap.get("prePntDcAmt"));		// 선포인트사용가능금액
+
+		mav.addObject("rmPntAmt"						, rmPntAmt);								// 고객포인트정보
+		mav.addObject("rmGfcdAmt"						, rmGfcdAmt);								// 고객상품권정보
+		mav.addObject("savePntSumAmt"					, goodsDcAmtMap.get("savePntSumAmt"));		// 적립예정포인트합계
+		
+		// 104. 사은품정보
+		mav.addObject("freegiftGoodsList"				, resultMap.get("freegiftGoodsList"));		// 사은품상품정보 목록
+		mav.addObject("freegiftList"					, resultMap.get("freegiftList"));			// 사은품정보 목록
+		
+		mav.setViewName(super.getDeviceViewName("order/OrderForm"));
+		
+		return mav;
+	}
+	
+	
+
+	/**
+	 * 주문 데이터 생성
+	 *
+	 * @param
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 03. 04
+	 */
+	@PostMapping("/create/order")
+	public ModelAndView createOrder(Order order) {
+		ModelAndView mav = new ModelAndView();
+
+		// KCP CARD 전송 데이터
+		Payment payment = new Payment();
+		// KCP 주문요청 공통 데이터
+		payment.setReqTx("pay");						// 필수 (주문시 only "pay")
+		payment.setOrdrIdxx((int)(Math.random()*10000));// 필수
+		payment.setPayMethod("100000000000");			// 필수 결제수단코드(신용카드 : 100000000000, 계좌이체 : 010000000000, 가상계좌 : 001000000000, 포인트 : 000100000000, 휴대폰 : 000010000000, 상품권 : 000000001000, ARS : 000000000010)
+		payment.setGoodName("LTY_TEST_GOODS_NAME");		// 필수
+		payment.setGoodMny(1779);						// 필수
+		payment.setBuyrName("LTY");						// 필수
+		payment.setBuyrMail("xodud1202@naver.com");		// 선택
+		payment.setBuyrTel1("");						// 선택, 일반 전화번호
+		payment.setBuyrTel2("010-7111-4489");			// 필수, 휴대폰번호
+		payment.setCurrency("WON");						// 필수, 원화 : WON, 달러 : USD
+		payment.setShopUserId(1000006);					// 필수, 쇼핑몰회원ID (CUST_NO)
+		// KCP 공통 변경되지 않는 값
+		payment.setSiteCd(env.getProperty("pg.kcp.site.cd"));		// 상점코드
+		payment.setSiteName(env.getProperty("pg.kcp.site.name"));	// 상점 이름 (영문 작성 권장)
+		payment.setModuleType(env.getProperty("pg.kcp.module.type"));
+		payment.setGoodExpr("0");									// 제공 기간 설정 0:일회성 1:기간설정(ex 1:2012010120120131)
+
+		// KCP 신용카드 옵션
+		payment.setQuotaopt(12);						// 최대 할부 개월 수
+
+		// KCP PAYCO
+		if(!StringUtils.isEmpty(payment.getPgGb()) && TscConstants.PgGb.PAYCO.value().equals(payment.getPgGb())) {		// PAYCO일경우
+			payment.setPaycoDirect("Y");
+			payment.setPayMthod("100000000000");		// PAYCO일때 payMethod 뿐 아니라 payMthod도 송부해야함. cart와 동일하게 송부하면됨.
+			payment.setPayMethod("100000000000");		// CARD로 변경
+		}
+
+		mav.addObject("payment", payment);
+		//model.addAttribute("payment", payment);
+
+		mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));
+		return mav;
+		//return super.getDeviceViewName("pg/kcpOrder");
+	}
 
 	/**
 	 * 카카오페이 결제준비 처리
@@ -590,8 +815,58 @@ public class TsfOrderController extends TsfBaseController {
 	 */
 	@RequestMapping(value = "/kakao/payment/ready")
 	@ResponseBody
-	public GagaMap kakaoPaymentReady(Order order) {
+	public GagaMap kakaoPaymentReady(@RequestBody Order order) {
+		if (TsfSession.getInfo().getCustNo() == null) {
+			order.setCustNo(0);
+		} else {
+			order.setCustNo(TsfSession.getInfo().getCustNo());
+		}
+
 		return kakaoPayService.kakaoPaymentReady(order);
 	}
 
+	/**
+	 * 카카오페이 결제 요청 처리
+	 *
+	 * @param Order
+	 * @return GagaMap
+	 * @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.setViewName(super.getDeviceViewName("/pg/KakaoPaymentRequest"));
+
+		return mav;
+	}
+
+	/**
+	 * 카카오페이 결제 승인 처리
+	 *
+	 * @param Order
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 03. 04
+	 */
+	@RequestMapping(value = "/kakao/payment/approve")
+	@ResponseBody
+	public Payment approveKakaoPayment(@RequestBody Order order) {
+		if (TsfSession.getInfo().getCustNo() == null) {
+			order.setCustNo(0);
+		} else {
+			order.setCustNo(TsfSession.getInfo().getCustNo());
+		}
+
+		Payment payment = kakaoPayService.approveKakaoPayment(order);
+		
+		GagaMap map = kakaoPayService.getKakaoPaymentOrder(order);
+		log.info("map >>> {}", map);
+
+		return payment;
+	}
 }

+ 4 - 3
src/main/resources/config/application-locd.yml

@@ -64,9 +64,10 @@ pg:
         js.url: https://testpay.kcp.co.kr/plugin/payplus_web.jsp
         server: false
         site:
-            cd: T0007
-            key: 4Ho4YsuOZlLXUZUdOxM1Q7X__
+            cd: T0000
+            key: 3grptw1.zW0GSo4PQdaGvsF__
             name: KCP TEST SHOP
         log.level: 3
         module.type: 01
-        tx.mode: 0
+        tx.mode: 0
+

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

@@ -70,6 +70,8 @@ kakao:
     authorizeUrl: https://kauth.kakao.com/oauth/authorize
     unlinkUrl : https://kapi.kakao.com/v1/user/unlink
     paymentReadyUrl : https://kapi.kakao.com/v1/payment/ready
+    approvePaymentUrl : https://kapi.kakao.com/v1/payment/approve
+    paymentOrderUrl : https://kapi.kakao.com/v1/payment/order
 
 # SPEEDY Image Upload
 speedy:

+ 69 - 2
src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html

@@ -48,6 +48,7 @@
 			if( frm.res_cd.value == "0000" )
 			{
 				alert("결제 승인 요청 전,\n\n반드시 결제창에서 고객님이 결제 인증 완료 후\n\n리턴 받은 ordr_chk 와 업체 측 주문정보를\n\n다시 한번 검증 후 결제 승인 요청하시기 바랍니다."); //업체 연동 시 필수 확인 사항.
+				alert(frm);
 				/*
 					가맹점 리턴값 처리 영역
 				*/
@@ -72,12 +73,17 @@
 			}
 		}
 
+
+
 		$(document).on("click", "#buyBtn", function() {
-			$.ajax( {
+			$.ajax({
 				type: "POST",
 				url : '/order/create/order',
 				dataType : 'html',
 				data : {cartSq : 8},
+				error : function(e) {
+					alert(3);
+				},
 				success : function(result) {
 					$("#order_info").html(result);
 					jsf__pay(document.order_info);
@@ -94,7 +100,68 @@
 
 
 <!-- card007 -->
+	<script type="text/javascript">
+		$(document).on("click", "#kakaoBtn", function() {
+			$.ajax( {
+				type: "POST",
+				url : '/order/create/order',
+				dataType : 'html',
+				data : {cartSq : 8},
+				success : function(result) {
+					$("#order_info").html(result);
+					fnKakaoPaymentReady();
+				}
+			});
+		});
+
+		var fnKakaoPaymentReady = function() {
+			const protocol = 'http:';
+			let url = '/order/kakao/payment/ready';
+			let redirectUrl = '/order/kakao/payment/request';
+			let data = {};
+			data.ordNo = $('#order_info input[name=ordr_idxx]').val();
+			data.goodsNm = $('#order_info input[name=good_name]').val();
+			data.ordQty = $('#ordQty').text();
+			data.realOrdAmt = $('#order_info input[name=good_mny]').val();
+			data.approvalUrl = protocol + _frontUrl + redirectUrl;
+			data.failUrl = protocol + _frontUrl + redirectUrl;
+			data.cancelUrl = protocol + _frontUrl + redirectUrl;
+			
+			let jsonData = JSON.stringify(data);
+			
+			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+				let tid = result.tid;
+				let nextRedirectUrl = result.next_redirect_pc_url;
+				let option = 'width=420, height=520';
+				
+				$('#order_info').append('<input type=hidden name="pgTid" value="' + tid + '" />');
+
+				window.open(nextRedirectUrl, 'kakaoPaymentPopup', option);
+			});
+		}
 
+		var fnKakaoPaymentRequest = function(pgToken) {
+			$('#order_info').append('<input type=hidden name="pgToken" value="' + pgToken + '" />');
+
+			let url = '/order/kakao/payment/approve';
+			let data = {};
+			data.pgTid = $('#order_info input[name=pgTid]').val();
+			data.ordNo = $('#order_info input[name=ordr_idxx]').val();
+			data.pgToken = $('#order_info input[name=pgToken]').val();
+			
+			let jsonData = JSON.stringify(data);
+			
+			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+				console.log(result);
+			});
+			
+			return true;
+		}
+	</script>
+
+	<form id="kakao_order_info" name="order_info" method="post" action="/order/pay/result/response" >
+		<input type="button" id="kakaoBtn" value="카카오테스트버튼" style="width:200px; height:200px;"/>
+	</form>
 <!-- // card007 -->
 
 
@@ -285,7 +352,7 @@
 							<div class="area_order">
 								<div class="tit_box">
 									<h3 class="subH2">주문내역</h3>
-									<span> <em class="number" th:text="${delvTotCnt}"></em>개의 상품</span>
+									<span> <em class="number" id="ordQty" th:text="${delvTotCnt}"></em>개의 상품</span>
 								</div>
 								<div class="od_item_box">
 								

+ 32 - 0
src/main/webapp/WEB-INF/views/web/pg/KakaoPaymentRequestWeb.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : KakaoPaymentRequestWeb.html
+ * @desc    : 카카오페이 결제 요청 결과 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.04   card007     최초 작성
+ *******************************************************************************
+ -->
+<head th:replace="~{web/common/fragments/HeadWeb :: head}"></head>
+<th:block th:replace="~{web/common/fragments/VariablesWeb :: variables}"></th:block>
+<th:block th:replace="~{web/common/fragments/ScriptsWeb :: scripts}"></th:block>
+<body>
+
+<script th:inline="javascript">
+	let pgToken = [[${pgToken}]];
+
+	$(document).ready(function() {
+		let result = opener.fnKakaoPaymentRequest(pgToken);
+		if (result) {
+			self.close();
+		}
+	});
+</script>
+</body>
+</html>

+ 32 - 28
src/main/webapp/WEB-INF/views/web/pg/kcpOrderWeb.html

@@ -1,29 +1,40 @@
 <html lang="ko" xmlns:th="http://www.thymeleaf.org">
 	<!-- 선택, 상점이름(영문으로 작성권장) -->
-	<input type="hidden" name="site_name" th:value="${@environment.getProperty('pg.kcp.site.name')}" />
+	<input type="hidden" name="site_name"	th:value="${payment.siteName}" />
 	<!-- 필수, 상점코드 -->
-	<input type="hidden" name="site_cd" th:value="${@environment.getProperty('pg.kcp.site.cd')}" />
-
-	<input type="hidden" name="payco_redirect"	value="Y" />				<!-- 페이코 진행시 -->
-	<input type="hidden" name="pay_mthod"		value="100000000000" />		<!-- 페이코 진행시 -->
-	<input type="hidden" name="req_tx"			value="pay" />				<!-- 필수, 요청의 종류를 구분하는 변수 결제요청페이지의 경우 ‘pay’로 설정 -->
-	<input type="hidden" name="ordr_idxx"		value="100" />				<!-- 필수, 상점 관리 주문번호 (유니크한 값 설정 권장) -->
-	<input type="hidden" name="pay_method"		value="100000000000" />		<!-- 필수, 결제수단코드(신용카드 : 100000000000, 계좌이체 : 010000000000, 가상계좌 : 001000000000, 포인트 : 000100000000, 휴대폰 : 000010000000, 상품권 : 000000001000, ARS : 000000000010) -->
-	<input type="hidden" name="good_name"		value="TEST NAME" />		<!-- 필수, 상품명 -->
-	<input type="hidden" name="good_mny"		value="2000" />				<!-- 필수, 주문요청금액 (※ 화폐단위가 ‘USD’ 일 경우, Cent까지 설정 ex ) $10.55 일 경우 콤마를 뺀 1055, $100 일 경우 10000로 설정 -->
-	<input type="hidden" name="buyr_name"		value="LTY" />				<!-- 필수, 주문자 이름 -->
-	<input type="hidden" name="buyr_mail"		value="test@test.com" />	<!-- 선택, 주문자 이메일 -->
-	<input type="hidden" name="buyr_tel1"		value="" />					<!-- 선택, 주문자 전화번호 -->
-	<input type="hidden" name="buyr_tel2"		value="010-7111-4489" />	<!-- 필수, 주문자 휴대폰번호 -->
-	<input type="hidden" name="currency"		value="WON" />				<!-- 필수, 원화 : WON / 달러 : USD -->
-	<input type="hidden" name="shop_user_id"	value="xodud1202" />		<!-- 필수, 쇼핑몰회원ID 기관에 따라 RM 조치를 위해 쇼핑몰 관리 ID를 필수로 요청 -->
-
-	<input type="hidden" name="quotaopt"        value="12"/>				<!-- 최대 할부 개월 수(0 ~ 18까지 설정 가능) -->
+	<input type="hidden" name="site_cd"		th:value="${payment.siteCd}" />
+
+	<!-- 페이코 송부 정보 -->
+	<th:block th:if="${!#strings.isEmpty(payment.paycoDirect)}">
+		<input type="hidden" name="payco_direct"	th:value="${payment.paycoDirect}" />
+		<input type="hidden" name="pay_mthod"		th:value="${payment.payMthod}" />
+	</th:block>
+
+	<input type="hidden" name="req_tx"			th:value="${payment.reqTx}" />		<!-- 필수, 요청의 종류를 구분하는 변수 결제요청페이지의 경우 ‘pay’로 설정 -->
+	<input type="hidden" name="ordr_idxx"		th:value="${payment.ordrIdxx}" />	<!-- 필수, 상점 관리 주문번호 (유니크한 값 설정 권장) -->
+	<input type="hidden" name="pay_method"		th:value="${payment.payMethod}" />	<!-- 필수, 결제수단코드(신용카드 : 100000000000, 계좌이체 : 010000000000, 가상계좌 : 001000000000, 포인트 : 000100000000, 휴대폰 : 000010000000, 상품권 : 000000001000, ARS : 000000000010) -->
+	<input type="hidden" name="good_name"		th:value="${payment.goodName}" />	<!-- 필수, 상품명 -->
+	<input type="hidden" name="good_mny"		th:value="${payment.goodMny}" />	<!-- 필수, 주문요청금액 (※ 화폐단위가 ‘USD’ 일 경우, Cent까지 설정 ex ) $10.55 일 경우 콤마를 뺀 1055, $100 일 경우 10000로 설정 -->
+	<input type="hidden" name="buyr_name"		th:value="${payment.buyrName}" />	<!-- 필수, 주문자 이름 -->
+	<input type="hidden" name="buyr_mail"		th:value="${payment.buyrMail}" />	<!-- 선택, 주문자 이메일 -->
+	<input type="hidden" name="buyr_tel1"		th:value="${payment.buyrTel1}" />	<!-- 선택, 주문자 전화번호 -->
+	<input type="hidden" name="buyr_tel2"		th:value="${payment.buyrTel2}" />	<!-- 필수, 주문자 휴대폰번호 -->
+	<input type="hidden" name="currency"		th:value="${payment.currency}" />	<!-- 필수, 원화 : WON / 달러 : USD -->
+	<input type="hidden" name="shop_user_id"	th:value="${payment.shopUserId}" />	<!-- 필수, 쇼핑몰회원ID 기관에 따라 RM 조치를 위해 쇼핑몰 관리 ID를 필수로 요청 -->
+
+	<input type="hidden" name="quotaopt"		th:value="${payment.quotaopt}"/>	<!-- 최대 할부 개월 수(0 ~ 18까지 설정 가능) -->
+
+	<!-- 2012년 8월 18일 전자상거래법 개정 관련 설정 부분 -->
+	<!-- 제공 기간 설정 0:일회성 1:기간설정(ex 1:2012010120120131)  -->
+	<input type="hidden" name="good_expr"		th:value="${payment.goodExpr}" />
+
+	<!-- 표준웹 설정 정보입니다(변경 불가) -->
+	<input type="hidden" name="module_type"		th:value="${payment.moduleType}" />
 
 	<!--
-		  ※ 필 수
-			  필수 항목 : 표준웹에서 값을 설정하는 부분으로 반드시 포함되어야 합니다
-			  값을 설정하지 마십시오
+			※ 필 수
+			필수 항목 : 표준웹에서 값을 설정하는 부분으로 반드시 포함되어야 합니다
+			값을 설정하지 마십시오
 	-->
 	<input type="hidden" name="res_cd"          value=""/>
 	<input type="hidden" name="res_msg"         value=""/>
@@ -41,11 +52,4 @@
 	<input type="hidden" name="cash_tr_code"    value=""/>
 	<input type="hidden" name="cash_id_info"    value=""/>
 
-	<!-- 2012년 8월 18일 전자상거래법 개정 관련 설정 부분 -->
-	<!-- 제공 기간 설정 0:일회성 1:기간설정(ex 1:2012010120120131)  -->
-	<input type="hidden" name="good_expr" value="0">
-
-	<!-- 표준웹 설정 정보입니다(변경 불가) -->
-	<input type="hidden" name="module_type" th:value="${@environment.getProperty('pg.kcp.module.type')}" />
-
 </html>