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

Merge branch 'order' into develop

card007 5 лет назад
Родитель
Сommit
eaed775a46

+ 2 - 0
src/main/java/com/style24/front/biz/dao/TsfOrderDao.java

@@ -4,6 +4,7 @@ import java.util.Collection;
 
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.Payment;
 
 /**
  * 주문 Dao
@@ -84,4 +85,5 @@ public interface TsfOrderDao {
 	 */
 	int updateOrderDisplayYn(Order order);
 
+	int updatePaymentForOrderFinished(Payment param);
 }

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

@@ -146,7 +146,7 @@ public class TsfCartService {
 		int i = 1;
 		for (Cart param : params) {
 			sb.append("SELECT CD.CART_SQ \n FROM TB_CART_DETAIL CD \n INNER JOIN TB_CART C \n ON CD.CART_SQ = C.CART_SQ \n WHERE C.CUST_NO = ");
-			// TODO 로그인 정보 확인
+
 			if (cart.getCustNo() == 0) {
 				sb.append(cart.getCustNo()).append("\n AND JSESSION_ID = '").append(cart.getJsessionId()).append("'");
 			} else {

+ 48 - 7
src/main/java/com/style24/front/biz/service/TsfOrderService.java

@@ -13,12 +13,15 @@ import javax.servlet.http.HttpServletResponse;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.thymeleaf.util.StringUtils;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.biz.service.TscKcpService;
 import com.style24.core.support.env.TscConstants;
+import com.style24.core.support.session.TscSession;
 import com.style24.front.biz.dao.TsfOrderDao;
+import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.Payment;
 
@@ -217,27 +220,42 @@ public class TsfOrderService {
 
 	/**
 	 * PG 결제승인
-	 * @param param - 필수 : payGb(결제수단 : KCP, KAKAO 등), payMeans(결제수단 : G014_30(신용카드) 등), cashReceiptYn(현금영수증여부)
+	 * @param param - 필수 : pgGb(결제수단 : KCP, KAKAO 등), payMeans(결제수단 : G014_30(신용카드) 등)
 	 * @param request
 	 * @param response
 	 * @return
 	 */
+	@Transactional("shopTxnManager")
 	public Payment orderPgPayResult(Payment param, HttpServletRequest request, HttpServletResponse response) {
 		Payment result = new Payment();
+
 		try {
-			if(StringUtils.isEmpty(param.getPayGb())) {
+			if(StringUtils.isEmpty(param.getPgGb())) {
 				throw new IllegalArgumentException("결제수단을 선택해주세요.");
 			}
 
-			if("KCP".equals(param.getPayGb())) {
+			if(TscConstants.PgGb.KCP.value().equals(param.getPgGb()) || TscConstants.PgGb.PAYCO.value().equals(param.getPgGb())) {
 				result = coreKcpService.kcpPayRequest(param, request, response);
-			} else if ("PAYCO".equals(param.getPayGb())) {
-				result = null;
-			} else if ("KAKAO".equals(param.getPayGb())) {
+			} else if (TscConstants.PgGb.KAKAO.value().equals(param.getPgGb())) {
 				result = null;
-			} else if ("NAVER".equals(param.getPayGb())) {
+			} else if (TscConstants.PgGb.NAVER.value().equals(param.getPgGb())) {
 				result = null;
+			} else {
+				throw new IllegalArgumentException("결제 수단이 잘못 입력되었습니다. 새로고침 후 다시 시도해주세요.");
+			}
+
+			result.setPaySq(param.getPaySq());
+			result.setUpdNo(param.getCustNo());
+			result.setRegNo(param.getCustNo());
+
+			if(updatePaymentForOrderFinished(result) < 1) {
+				// TODO 전체 취소 로직 추가
+				coreKcpService.kcpPayRollBack(result, request);
+
+				throw new IllegalArgumentException("결제 정보 저장 실패. 새로고침 후 다시 시작해주세요.");
 			}
+
+			coreKcpService.kcpPayRollBack(result, request);
 		} catch(Exception e) {
 			e.printStackTrace();
 			throw new IllegalArgumentException(e.getMessage());
@@ -246,6 +264,11 @@ public class TsfOrderService {
 		return result;
 	}
 
+	@Transactional("shopTxnManager")
+	public int updatePaymentForOrderFinished(Payment param) {
+		return orderDao.updatePaymentForOrderFinished(param);
+	}
+
 	/**
 	 * 주문 상태 별 수량 조회
 	 *
@@ -309,4 +332,22 @@ public class TsfOrderService {
 	 */
 	public int updateOrderDisplayYn(Order order) { return orderDao.updateOrderDisplayYn(order); }
 
+	public Payment setPgDataInfo(Order order) {
+		Payment payment = new Payment();
+		if(TscConstants.PgGb.KAKAO.value().equals(order.getPgGb())) {			// 카카오페이
+			// TODO 카카오페이 데이터 세팅
+			payment = null;
+		} else if(TscConstants.PgGb.NAVER.value().equals(order.getPgGb())) {	// 네이버페이
+			// TODO 네이버페이 데이터 세팅
+			payment = null;
+		} else if(TscConstants.PgGb.KCP.value().equals(order.getPgGb()) || TscConstants.PgGb.PAYCO.value().equals(order.getPgGb())){	// KCP, PAYCO
+			payment = coreKcpService.setKcpOrderData(order);
+		} else {
+			throw new IllegalArgumentException("결제타입이 잘못 선택되었습니다. 새로고침 후 다시 시도해주세요.");
+		}
+
+		payment.setPgGb(order.getPgGb());
+		payment.setPayMeans(order.getPayMeans());
+		return payment;
+	}
 }

+ 160 - 112
src/main/java/com/style24/front/biz/web/TsfOrderController.java

@@ -16,7 +16,6 @@ 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.gagaframework.web.rest.server.GagaResponseStatus;
@@ -30,7 +29,6 @@ import com.style24.front.biz.service.TsfCartService;
 import com.style24.front.biz.service.TsfOrderService;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.security.session.TsfSession;
-import com.style24.persistence.domain.KakaoPay;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.Payment;
 
@@ -83,8 +81,6 @@ public class TsfOrderController extends TsfBaseController {
 	public ModelAndView orderNoMember(Order order, RedirectAttributes redirectAttributes) {
 		ModelAndView mav = new ModelAndView();
 		
-		String rtnView = "";
-		
 		// 비회원 주문시 로직 정리
 		// @ web 인 경우에는 고객정보 입력 화면 후 주문서 이동 후 본인인중
 		// @ web 의 경우에는 입력한 고객정보와 인증받은 고객정보가 다른경우 고객정보 업데이트
@@ -94,8 +90,8 @@ public class TsfOrderController extends TsfBaseController {
 		// TODO 임시 장바구니
 		// 2. 장바구니시퀀스 배열 등록 (장바구니 상품 정보 조회)
 		int[] arr = {11,77,8};
-		order.setCartSqArr(arr);
-		order.setShotDelvYn("Y");
+		order.setCartSqArr(arr);		// 장바구니시퀀스
+		order.setShotDelvUseYn("Y");	// 장바구니총알배송사용여부
 		
 		mav.addObject("order" 	, order);										// 주문정보
 		mav.addObject("isLogin"	, TsfSession.isLogin());						// 로그인여부
@@ -104,8 +100,6 @@ public class TsfOrderController extends TsfBaseController {
 		return mav;
 	}
 	
-	
-	
 	/**
 	 * 주문페이지
 	 *
@@ -114,7 +108,6 @@ public class TsfOrderController extends TsfBaseController {
 	 * @author jsh77b
 	 * @since 2021. 02. 02
 	 */
-	@SuppressWarnings({ "unchecked", "null" })
 	@RequestMapping(value = "/form")
 	public ModelAndView orderForm(Order order) {
 		ModelAndView mav = new ModelAndView();
@@ -144,77 +137,51 @@ public class TsfOrderController extends TsfBaseController {
 			order.setEmail("");
 			
 			order.setDelvAddrNm("");
-			order.setRecipZipcode("");
-			order.setRecipBaseAddr("");
-			order.setRecipDtlAddr("");
+			order.setRecipZipcode("00000");
+			order.setRecipBaseAddr("기본주소정보없음");
+			order.setRecipDtlAddr("상제주소정보없음");
 		}
 
 		// TODO 임시 장바구니
-		// 2. 장바구니시퀀스 배열 등록 (장바구니 상품 정보 조회)		
-		// 2.1 배송단위별 상품 목록 조회 (장바구니)
+		// 3. 장바구니상품시퀀스 상품목록조회		
+		// 3.1 즉시할인, 다다익선 할인금액 정보 적용 정보
 		Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
 		
-		// 2.1.0 상품금액, 선포인트, 다다익선할인금액
-		GagaMap goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
+		// 3.2 배송정보조회(장바구니상품목록)
+		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList, order);
 		
-		// 2.2 배송단위별 장바구니 상품 건수 조회 (장바구니상품)
-		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList);
+		// 3.3 할인정보조회(상품금액, 선포인트, 다다익선할인금액)
+		GagaMap goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
 
-		// 3. 할인구간정보조회
-		// 3.2 상품쿠폰, 장바구니쿠폰 목록 조회
-		GagaMap goodsCartCpnMap = coreOrderService.getGoodsCartCpnApplyGoodsList(order);
+		// 4. 화면설정설정
+		// 4.1 배송정보설정
+		mav.addObject("cartGoodsList"		, tmtbGoodsApplyList);						// 장바구니상품목록(즉시할인, 다다익선적용)
 		
-		Collection<Order> goodsCpnList 	= (Collection<Order>) goodsCartCpnMap.get("goodsCpnList");
-		Collection<Order> cartCpnList 	= (Collection<Order>) goodsCartCpnMap.get("cartCpnList");
+		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"));				// 입점업체상품건수
 		
-		// 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);
+		mav.addObject("goodsTotCnt" 		, delvOrderMap.get("goodsTotCnt"));			// 총상품건수
+		mav.addObject("delvAllCartList" 	, delvOrderMap.get("delvAllCartList"));		// 전체배송목록
+		mav.addObject("delvCartGoodsList" 	, delvOrderMap.get("delvCartGoodsList"));	// 장바구니상품목록 sort
+		mav.addObject("sumDelvFee" 			, delvOrderMap.get("sumDelvFee"));			// 배송비합계
 
-		Collection<Order> delvFeeCdList = (Collection<Order>) delvOrderMap.get("delvFeeCdList");
+		// 4.2 할인정보(상품금액, 즉시할인, 다다익선, 선포인트, 적립예정포인트) 
+		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"));		// 적립예정포인트합계
 		
-		// 3.3.1 배소업체기준 ---> 배송비쿠폰
-		delvCpnList = coreOrderService.getDelvCpnApplyList(delvFeeCdList, delvCpnList);
-		
-		// 3.4 고객 보유 포인트 정보 조회
-		//int rmPntAmt = coreOrderService.getCustPointInfo(order);
+		// 4.3 주문정보
+		mav.addObject("order" 				, order);									// 주문정보(고객정보, 배송지정보, 총알배송사용여부)
 		
-		// 2.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"));			// 배송비합계
-		
-		// 102. 주문정보
-		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("rmPntAmt"						, rmPntAmt);								// 고객포인트정보
-		//mav.addObject("rmGfcdAmt"						, rmGfcdAmt);								// 고객상품권정보
-		mav.addObject("savePntSumAmt"					, goodsDcAmtMap.get("savePntSumAmt"));		// 적립예정포인트합계
+		// 4.5 해외구매대행, 주문제작
+		mav.addObject("foreignBuyYn"		, delvOrderMap.get("foreignBuyYn"));		// 해외구매대행여부
+		mav.addObject("orderMadeYn"			, delvOrderMap.get("orderMadeYn"));			// 주문제작여부
 		
 		mav.setViewName(super.getDeviceViewName("order/OrderForm"));
 		
@@ -290,9 +257,9 @@ public class TsfOrderController extends TsfBaseController {
 			if (deliveryAddrInfo == null) {
 				deliveryAddrInfo = new Order();
 				deliveryAddrInfo.setDelvAddrNm(deliveryAddrInfo.getCustNm());
-				deliveryAddrInfo.setRecipZipcode("");
-				deliveryAddrInfo.setRecipBaseAddr("");
-				deliveryAddrInfo.setRecipDtlAddr("");
+				deliveryAddrInfo.setRecipZipcode("00000");
+				deliveryAddrInfo.setRecipBaseAddr("기본주소정보없음");
+				deliveryAddrInfo.setRecipDtlAddr("상제주소정보없음");
 				deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
 			}
 		} else {
@@ -312,6 +279,38 @@ public class TsfOrderController extends TsfBaseController {
 		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.setJsessionId(TsfSession.getSessionId());
+		}
+		
+		// 2. 장바구니상품목록조회
+		Collection<Order> cartGoodsList = coreOrderService.getCartGoodsList(order);
+		
+		// 3. 배송정보조회(장바구니상품목록)
+		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(cartGoodsList, order);
+				
+		ModelAndView mav = new ModelAndView();
+		mav.addObject("delvAllCartList" 	, delvOrderMap.get("delvAllCartList"));		// 전체배송목록
+		mav.setViewName(super.getDeviceViewName("order/OrderListInfo"));
+		
+		return mav;
+	}
+	
 	/**
 	 * 사은품정보조회
 	 *
@@ -390,7 +389,7 @@ public class TsfOrderController extends TsfBaseController {
 			goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
 			
 			// 2.3 배송단위별 장바구니 상품 건수 조회 (장바구니상품)
-			GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList);
+			GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList, order);
 			
 			// 2.4 상품쿠폰, 장바구니쿠폰 목록 조회
 			GagaMap goodsCartCpnMap = coreOrderService.getGoodsCartCpnApplyGoodsList(order);
@@ -483,7 +482,11 @@ public class TsfOrderController extends TsfBaseController {
 	public ModelAndView payResultResponse(Payment param, HttpServletRequest request, HttpServletResponse response) {
 		ModelAndView mav = new ModelAndView();
 
-		param.setPayGb("KCP");
+
+		// 테스트용 데이터 세팅
+		param.setPaySq(3);
+		param.setCustNo(TsfSession.getInfo().getCustNo() == null ? 0 : TsfSession.getInfo().getCustNo());
+		param.setUpdNo(param.getCustNo());
 
 		param = orderService.orderPgPayResult(param, request, response);
 
@@ -684,7 +687,7 @@ public class TsfOrderController extends TsfBaseController {
 		GagaMap goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
 		
 		// 2.2 배송단위별 장바구니 상품 건수 조회 (장바구니상품)
-		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList);
+		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList, order);
 
 		// 3. 할인구간정보조회
 		// 3.2 상품쿠폰, 장바구니쿠폰 목록 조회
@@ -781,42 +784,12 @@ public class TsfOrderController extends TsfBaseController {
 
 
 
-		// TODO PG 데이터 세팅 처리
-		// order.ordNo, order.goodsName
-		// order.payType > 2 Menas, gb  > 이니시스, 카드
-
-		// KCP CARD 전송 데이터
-		Payment payment = new Payment();
-		// KCP 주문요청 공통 데이터
-		payment.setReqTx("pay");						// 필수 (주문시 only "pay")
-		payment.setOrdrIdxx(order.getOrdNo());			// 필수
-		payment.setPayMethod("010000000000");			// 필수 결제수단코드(신용카드 : 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 무통장입금 옵션
-		/*payment.setVcntExpireTerm(3); */					// 무통장입금 유효기간
-
-		// 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로 변경
-		}
+		// TODO PG 데이터 세팅 처리 (order)
+		// 필수 데이터
+		// pgGb = 결제타입, payMeans = 결제수단, ordNo = 주문번호, goodsNm = 상품명, payAmt = 실결제금액, ordNm = 주문자명, ordPhnno = 휴대폰번호, custNo = 고객번호
+		// 선택 데이터
+		// ordEmail = 주문자메일, ordTelno = 전화번호
+		Payment payment = orderService.setPgDataInfo(order);
 
 		mav.addObject("payment", payment);
 		//model.addAttribute("payment", payment);
@@ -956,10 +929,10 @@ public class TsfOrderController extends TsfBaseController {
 	 */
 	@RequestMapping(value = "/naver/payment/request")
 	@ResponseBody
-	public ModelAndView naverPaymentRequest(@RequestParam(value = "reserveId", required = false) String reserveId) {
+	public ModelAndView naverPaymentRequest(@RequestParam(value = "paymentId", required = false) String paymentId) {
 		ModelAndView mav = new ModelAndView();
 
-		mav.addObject("reserveId", reserveId);
+		mav.addObject("paymentId", paymentId);
 
 		mav.setViewName(super.getDeviceViewName("/pg/NaverPaymentRequest"));
 
@@ -991,4 +964,79 @@ public class TsfOrderController extends TsfBaseController {
 		return result;
 	}
 
+	/**
+	 * 네이버페이 결제 승인 처리
+	 *
+	 * @param Order
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 03. 04
+	 */
+	@RequestMapping(value = "/naver/payment/approve")
+	@ResponseBody
+	public GagaMap approveNaverPayment(@RequestBody Order order) {
+		GagaMap result = new GagaMap();
+
+		if (TsfSession.getInfo().getCustNo() == null) {
+			order.setCustNo(0);
+		} else {
+			order.setCustNo(TsfSession.getInfo().getCustNo());
+		}
+
+		result.set("payment", naverPayService.approveNaverPayment(order));
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		return result;
+	}
+
+	/**
+	 * 네이버페이 결제 조회
+	 *
+	 * @param Order
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 03. 09
+	 */
+	@RequestMapping(value = "/naver/payment/order")
+	@ResponseBody
+	public GagaMap naverPaymentOrder(@RequestBody Order order) {
+		GagaMap result = new GagaMap();
+
+		if (TsfSession.getInfo().getCustNo() == null) {
+			order.setCustNo(0);
+		} else {
+			order.setCustNo(TsfSession.getInfo().getCustNo());
+		}
+
+		result.set("naverPay", naverPayService.getNaverPaymentOrder(order));
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		return result;
+	}
+
+	/**
+	 * 네이버페이 결제 취소
+	 *
+	 * @param Order
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 03. 09
+	 */
+	@RequestMapping(value = "/naver/payment/cancel")
+	@ResponseBody
+	public GagaMap cancelNaverPayment(@RequestBody Order order) {
+		GagaMap result = new GagaMap();
+
+		if (TsfSession.getInfo().getCustNo() == null) {
+			order.setCustNo(0);
+		} else {
+			order.setCustNo(TsfSession.getInfo().getCustNo());
+		}
+
+		result.set("naverPay", naverPayService.cancelNaverPayment(order));
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		return result;
+	}
+
 }

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

@@ -322,4 +322,31 @@
 		     , UPD_DT = NOW()
 		 WHERE ORD_NO = #{ordNo}
 	</update>
+
+	<!-- 마이페이지 주문상세 주문내역삭제 처리 -->
+	<update id="updatePaymentForOrderFinished" parameterType="Payment">
+		/* TsfOrder.updatePaymentForOrderFinished */
+		UPDATE TB_PAYMENT SET
+			  PAY_DT = DATE_FORMAT(#{payDt} , '%Y%m%d%H%i%S')
+			, PAY_STAT = #{payStat}
+		    , PG_CPN_AMT = #{pgCpnAmt}
+			, NPAY_PNT_AMT = #{npayPntAmt}
+			, PG_TID = #{pgTid}
+			, PG_TRADE_NO = #{pgTradeNo}
+			, PG_SHOP_ID = #{pgShopId}
+			, CARD_TYPE = #{cardType}
+			, CARD_NM = #{cardNm}
+			, CARD_MIPS = #{cardMips}
+			, CARD_PCABLE_YN = #{cardPcableYn}
+			, VA_NO = #{vaNo}
+			, VA_BANK = #{vaBank}
+			, VA_DEADLINE = DATE_FORMAT(#{vaDeadline} , '%Y%m%d%H%i%S')
+			, TELECOM = #{telecom}
+			, CASH_AUTH_NO = #{cashAuthNo}
+			, CASH_TRADE_NO = #{cashTradeNo}
+			, UPD_NO = #{updNo}
+			, UPD_DT = NOW()
+		WHERE PAY_SQ = #{paySq}
+		  AND ORD_NO = #{ordNo}
+	</update>
 </mapper>

+ 6 - 0
src/main/resources/config/application-locd.yml

@@ -76,3 +76,9 @@ pg:
         module.type: 01
         tx.mode: 0
 
+# 네이버페이 API
+naverPay:
+    apiUrl: https://dev.apis.naver.com/
+    payUrl:
+        web : test-pay.naver.com
+        mob : test-m.pay.naver.com

+ 7 - 0
src/main/resources/config/application-locp.yml

@@ -71,3 +71,10 @@ pg:
         log.path: /WIDE/workspace/logs/wivis
         account.cert.url: https://webapi.nicepay.co.kr/api/checkBankAccountAPI.jsp
         vbank.refund.url: https://webapi.nicepay.co.kr/v2/api/merchant/vbank_refund.jsp
+
+# 네이버페이 API
+naverPay:
+    apiUrl: https://apis.naver.com/
+    payUrl:
+        web : pay.naver.com
+        mob : m.pay.naver.com

+ 7 - 0
src/main/resources/config/application-run.yml

@@ -70,3 +70,10 @@ pg:
         log.path: /app/was/applogs/nicepay
         account.cert.url: https://webapi.nicepay.co.kr/api/checkBankAccountAPI.jsp
         vbank.refund.url: https://webapi.nicepay.co.kr/v2/api/merchant/vbank_refund.jsp
+
+# 네이버페이 API
+naverPay:
+    apiUrl: https://apis.naver.com/
+    payUrl:
+        web : pay.naver.com
+        mob : m.pay.naver.com

+ 7 - 0
src/main/resources/config/application-tsit.yml

@@ -54,3 +54,10 @@ upload:
         view: //tdimage.style24.com/sample
 
 download.path: /TSIT/servers/files/data
+
+# 네이버페이 API
+naverPay:
+    apiUrl: https://dev.apis.naver.com/
+    payUrl:
+        web : test-pay.naver.com
+        mob : test-m.pay.naver.com

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

@@ -45,9 +45,29 @@ naver:
     tokenUrl: https://nid.naver.com/oauth2.0/token
     userInfoUrl : https://openapi.naver.com/v1/nid/me
     authorizeUrl : https://nid.naver.com/oauth2.0/authorize
+    pay:
+        partnerId: np_ktptw906068
+        clientId: 8TSWSyJMMUvOLKUySQx6
+        clientSecret: oGXnO7cMD1
+        paymentReadyUrl: /naverpay/payments/v2/reserve
+        approvePaymentUrl: /naverpay/payments/v2/apply/payment
+        paymentOrderUrl: /naverpay/payments/v2/list/history
+        cancelPaymentUrl: /naverpay/payments/v1/cancel
+
+# 네이버페이 API
+naverPay:
+    partnerId: np_ktptw906068
+    clientId: 8TSWSyJMMUvOLKUySQx6
+    clientSecret: oGXnO7cMD1
+    paymentReadyUrl: /naverpay/payments/v2/reserve
+    approvePaymentUrl: /naverpay/payments/v2/apply/payment
+    paymentOrderUrl: /naverpay/payments/v2/list/history
+    cancelPaymentUrl: /naverpay/payments/v1/cancel
 
 #카카오 API
 kakao:
+# 카카오페이 운영정보
+#    cid : 운영cid정보 없음
 #    appId: 442702
 #    appName: 아이스타일24
 #    companyName: 예스이십사
@@ -55,6 +75,7 @@ kakao:
 #    restApiKey: 46d601394bd887cbada3cf00fdddef54
 #    javascriptKey: b3c9ee69171042c3637e8d714a4c8a75
 #    adminKey: 7cc33b2ef96d785c4caf3376f9dc9254
+# 카카오페이 운영정보
     cid : TC0ONETIME
     appId : 399207
     appName : 구축용 테스트앱
@@ -86,3 +107,4 @@ speedy:
 app.down.url: 
     ios: https://apps.apple.com/kr/app/WIVISMALL/id1517275108
     aos: https://play.google.com/store/apps/details?id=com.wivis.wivismal
+

+ 4 - 4
src/main/webapp/WEB-INF/views/web/order/OrderCustemerInfoWeb.html

@@ -29,9 +29,9 @@
 </div>
 
 <div class="fold_cont" style="display: none;">
-	<input type="hidden" name="custNm" 		th:value="${custNm}"/>
-	<input type="hidden" name="email" 		th:value="${email}"/>
-	<input type="hidden" name="cellPhnno" 	th:value="${cellPhnno}"/>
+	<input type="hidden" name="custNm" 		th:value="${custemerInfo.custNm}"/>
+	<input type="hidden" name="email" 		th:value="${custemerInfo.email}"/>
+	<input type="hidden" name="cellPhnno" 	th:value="${custemerInfo.cellPhnno}"/>
 	
 	<div class="area_mbinfo">
 		<dl>
@@ -45,7 +45,7 @@
 				<dt>
 					<span class="sr-only">이메일</span>
 				</dt>
-				<dd th:text="${custemerInfo.email}">/dd>
+				<dd th:text="${custemerInfo.email}"></dd>
 			</div>
 			<div>
 				<dt>

+ 70 - 62
src/main/webapp/WEB-INF/views/web/order/OrderDeliveryAddrInfoWeb.html

@@ -21,7 +21,7 @@
 			<div class="fold_tit">
 				<span>배송지 정보</span>
 			</div>
-			<div class="data" th:text="${deliveryAddrInfo.recipBaseAddr} + ${deliveryAddrInfo.recipDtlAddr}"></div>
+			<div class="data" th:text="${deliveryAddrInfo.recipBaseAddr} + ' ' + ${deliveryAddrInfo.recipDtlAddr}"></div>
 		</div>
 	</a>
 </div>
@@ -32,6 +32,8 @@
 		<input type="hidden" name="recipBaseAddr" 	th:value="${deliveryAddrInfo.recipBaseAddr}"/>
 		<input type="hidden" name="recipDtlAddr" 	th:value="${deliveryAddrInfo.recipDtlAddr}"/>
 		<input type="hidden" name="delvMemo" 		th:value="${deliveryAddrInfo.delvMemo}"/>
+		<input type="hidden" name="foreignBuyYn" 	th:value="${order.foreignBuyYn}"/>
+		<input type="hidden" name="orderMadeYn" 	th:value="${order.orderMadeYn}"/>
 		
 		<dl>
 			<div>
@@ -39,8 +41,10 @@
 				<dd>
 					<span th:text="${deliveryAddrInfo.delvAddrNm}"></span>
 					<span class="icon_tag">
-						<em class="tag_stype1">기본 배송지</em> 
-						<em class="tag_stype2">총알배송</em>
+						<em class="tag_stype1">기본 배송지</em>
+						<th:block th:if="${order.shotDelvUseYn} == 'Y'"> 
+							<em class="tag_stype2">총알배송</em>
+						</th:block>
 					</span>
 				</dd>
 			</div>
@@ -75,74 +79,78 @@
 	<!-- /배송지정보 -->
 	
 	<!-- 해외배송상품일 경우 노출 -->
-	<div class="area_overseas">
-		<dl>
-			<div>
-				<input type="hidden" name="entryNo" value=""/>
-				
-				<dt>개인통관고유부호</dt>
-				<dd>
-					<div class="form_field">
-						<div>
-							<input type="radio" name="rdi-overseas" id="rdi-overs1" checked> 
-							<label for="rdi-overs1"><span>받는사람 개인통관고유부호</span></label>
-						</div>
-						<div>
-							<input type="radio" name="rdi-overseas" id="rdi-overs2">
-							<label for="rdi-overs2"><span>입력 안 함</span></label>
-						</div>
-						<div class="info_box overs1">
-							<div class="input_wrap">
-								<input type="text" class="form_control err" maxlength="13" placeholder="P로 시작하는 13자리">
-								<!-- 유효하지 않은 개인통관고유부호 일때 class명 'err' 추가 -->
+	<th:block th:if="${order.foreignBuyYn} == 'Y'">
+		<div class="area_overseas">
+			<dl>
+				<div>
+					<input type="hidden" name="entryNo" value=""/>
+					
+					<dt>개인통관고유부호</dt>
+					<dd>
+						<div class="form_field">
+							<div>
+								<input type="radio" name="rdi-overseas" id="rdi-overs1" checked> 
+								<label for="rdi-overs1"><span>받는사람 개인통관고유부호</span></label>
+							</div>
+							<div>
+								<input type="radio" name="rdi-overseas" id="rdi-overs2">
+								<label for="rdi-overs2"><span>입력 안 함</span></label>
 							</div>
-							<div class="t_err">개인통관고유부호가 유효하지 않습니다.</div>
-							<!-- 유효하지 않은 개인통관고유부호 일때 노출 -->
-							<div class="agree_overs">
-								<input id="chk-overs-agr" type="checkbox" checked="">
-								<label for="chk-overs-agr">
-									<span>
-										위 정보는 원활한 통관을 위해 수집 및 판매자에게 제공하며,계속 사용하도록 안전하게 STYLE24에서 저장 &#47; 관리 합니다.&nbsp;&nbsp;
-										<em class="tmark_required">(필수)</em>
-									</span>
-								</label>
+							<div class="info_box overs1">
+								<div class="input_wrap">
+									<input type="text" class="form_control err" maxlength="13" placeholder="P로 시작하는 13자리">
+									<!-- 유효하지 않은 개인통관고유부호 일때 class명 'err' 추가 -->
+								</div>
+								<div class="t_err">개인통관고유부호가 유효하지 않습니다.</div>
+								<!-- 유효하지 않은 개인통관고유부호 일때 노출 -->
+								<div class="agree_overs">
+									<input id="chk-overs-agr" type="checkbox" checked="">
+									<label for="chk-overs-agr">
+										<span>
+											위 정보는 원활한 통관을 위해 수집 및 판매자에게 제공하며,계속 사용하도록 안전하게 STYLE24에서 저장 &#47; 관리 합니다.&nbsp;&nbsp;
+											<em class="tmark_required">(필수)</em>
+										</span>
+									</label>
+								</div>
+							</div>
+							<div class="info_box overs2" style="display: none;">
+								<p>개인통관고유부호를 입력하지 않아도 관세사무소에서 개인정보 확인을 위해 별도 연락을 드릴 예정입니다.</p>
 							</div>
 						</div>
-						<div class="info_box overs2" style="display: none;">
-							<p>개인통관고유부호를 입력하지 않아도 관세사무소에서 개인정보 확인을 위해 별도 연락을 드릴 예정입니다.</p>
+						<div class="info_txt">
+							<ul>
+								<li>물품가액이 $150초과할 경우 관/부과세가 발생 할 수 있습니다.</li>
+								<li>물품 종류와 해외공급자 관계없이 같은 날 입항하게 되면 합산과세 대상이 됩니다.</li>
+							</ul>
 						</div>
-					</div>
-					<div class="info_txt">
-						<ul>
-							<li>물품가액이 $150초과할 경우 관/부과세가 발생 할 수 있습니다.</li>
-							<li>물품 종류와 해외공급자 관계없이 같은 날 입항하게 되면 합산과세 대상이 됩니다.</li>
-						</ul>
-					</div>
-				</dd>
-			</div>
-		</dl>
-	</div>
+					</dd>
+				</div>
+			</dl>
+		</div>
+	</th:block>
 	<!-- //해외배송상품일 경우 노출 -->
 	
 	<!-- 주문제작상품일 경우 노출 -->
-	<div class="area_customitem">
-		<div class="form_field">
-			<div class="agree_custom">
-				<input id="chk-custom-agr1" type="checkbox" checked="">
-				<label for="chk-custom-agr1">
-					<span>고객님께서 주문하신 상품에는 주문제작상품이 포함되어 있습니다.<br>주문제작상품에 대한 안내를 확인하였으며 배송에 동의합니다.&nbsp;&nbsp;
-						<em class="tmark_required">(필수)</em>
-					</span>
-				</label>
+	<th:block th:if="${order.orderMadeYn} == 'Y'">
+		<div class="area_customitem">
+			<div class="form_field">
+				<div class="agree_custom">
+					<input id="chk-custom-agr1" type="checkbox" checked="">
+					<label for="chk-custom-agr1">
+						<span>고객님께서 주문하신 상품에는 주문제작상품이 포함되어 있습니다.<br>주문제작상품에 대한 안내를 확인하였으며 배송에 동의합니다.&nbsp;&nbsp;
+							<em class="tmark_required">(필수)</em>
+						</span>
+					</label>
+				</div>
+			</div>
+			<div class="info_txt">
+				<ul>
+					<li>주문 제작 상품은 주문 후 제작이 진행되며, 제작 완료 후 배송이 시작됩니다.</li>
+					<li>주문 제작 상품의 특성상 주문 완료 후 취소/교환이 불가능합니다. (상품 하자에 한해 가능)</li>
+				</ul>
 			</div>
 		</div>
-		<div class="info_txt">
-			<ul>
-				<li>주문 제작 상품은 주문 후 제작이 진행되며, 제작 완료 후 배송이 시작됩니다.</li>
-				<li>주문 제작 상품의 특성상 주문 완료 후 취소/교환이 불가능합니다. (상품 하자에 한해 가능)</li>
-			</ul>
-		</div>
-	</div>
+	</th:block>
 	<!-- //주문제작상품일 경우 노출 -->
 </div>
 

+ 413 - 248
src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html

@@ -23,57 +23,77 @@
 <script type="text/javascript" src="/ux/pc/js/slick.min.js"></script>
 <script type="text/javascript" src="/ux/pc/js/jquery-ui.js"></script>
 
+<!-- payment.js -->
+<script type="text/javascript" th:src="${@environment.getProperty('pg.kcp.js.url')}" src=""></script>
+<script type="text/javascript" src="/ux/pc/js/payment.js"></script>
+
+
 <!-- xodud1202 -->
-	<script type="text/javascript">
-		/****************************************************************/
-		/* m_Completepayment  설명                                      */
-		/****************************************************************/
-		/* 인증완료시 재귀 함수                                         */
-		/* 해당 함수명은 절대 변경하면 안됩니다.                        */
-		/* 해당 함수의 위치는 payplus.js 보다먼저 선언되어여 합니다.    */
-		/* Web 방식의 경우 리턴 값이 form 으로 넘어옴                   */
-		/****************************************************************/
-		function m_Completepayment( FormOrJson, closeEvent ) {
-			var frm = document.order_info;
-
-			/********************************************************************/
-			/* FormOrJson은 가맹점 임의 활용 금지                               */
-			/* frm 값에 FormOrJson 값이 설정 됨 frm 값으로 활용 하셔야 됩니다.  */
-			/* FormOrJson 값을 활용 하시려면 기술지원팀으로 문의바랍니다.       */
-			/********************************************************************/
-			GetField( frm, FormOrJson );
-
-			if( frm.res_cd.value == "0000" ) {
-				frm.submit();
-			} else {
-				alert( "[" + frm.res_cd.value + "] " + frm.res_msg.value );
-				closeEvent();
-			}
+<script type="text/javascript">
+	/****************************************************************/
+	/* m_Completepayment  설명                                      */
+	/****************************************************************/
+	/* 인증완료시 재귀 함수                                         */
+	/* 해당 함수명은 절대 변경하면 안됩니다.                        */
+	/* 해당 함수의 위치는 payplus.js 보다먼저 선언되어여 합니다.    */
+	/* Web 방식의 경우 리턴 값이 form 으로 넘어옴                   */
+	/****************************************************************/
+	function m_Completepayment( FormOrJson, closeEvent )
+	{
+		var frm = document.order_info;
+
+		/********************************************************************/
+		/* FormOrJson은 가맹점 임의 활용 금지                               */
+		/* frm 값에 FormOrJson 값이 설정 됨 frm 값으로 활용 하셔야 됩니다.  */
+		/* FormOrJson 값을 활용 하시려면 기술지원팀으로 문의바랍니다.       */
+		/********************************************************************/
+		GetField( frm, FormOrJson );
+
+
+		if( frm.res_cd.value == "0000" )
+		{
+			alert("결제 승인 요청 전,\n\n반드시 결제창에서 고객님이 결제 인증 완료 후\n\n리턴 받은 ordr_chk 와 업체 측 주문정보를\n\n다시 한번 검증 후 결제 승인 요청하시기 바랍니다."); //업체 연동 시 필수 확인 사항.
+			alert(frm);
+			/*
+				가맹점 리턴값 처리 영역
+			*/
+
+			frm.submit();
+		} else {
+			alert( "[" + frm.res_cd.value + "] " + frm.res_msg.value );
+			closeEvent();
 		}
-	</script>
-
-	<script th:inline="javascript" th:src="|${@environment.getProperty('pg.kcp.js.url')}?v=${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}|" src=""></script>
+	}
+	
+	/* 표준웹 실행 */
+	function jsf__pay( form ) {
+		try {
+			KCP_Pay_Execute( form );
+		} catch (e) {
+			/* IE 에서 결제 정상종료시 throw로 스크립트 종료 */
+		}
+	}
+</script>
 
-	<form id="order_info" name="order_info" method="post" action="/order/pay/result/response" >
-		<input type="button" id="kcpBuyBtn" value="테스트버튼" style="width:200px; height:200px;"/>
-	</form>
+	
 
 	<script type="text/javascript">
-		/* 표준웹 실행 */
-		function jsf__pay(form) {
-			try {
-				KCP_Pay_Execute(form);
-			} catch (e) {
-				/* IE 에서 결제 정상종료시 throw로 스크립트 종료 */
-			}
-		}
-
-		$("#kcpBuyBtn").click(function() {
+		$(document).on("click", "#buyBtn", function() {
 			$.ajax({
 				type: "POST",
-				url : '/order/create/order',
+				url : '/order/create/preOrder',
 				dataType : 'html',
-				data : {cartSq : 8},
+				data : {
+					  pgGb		: "PAYCO"
+					, payMeans	: "G014_10"
+					, ordNo		: "5"
+					, goodsNm	: "상품 테스트"
+					, payAmt	: "1233"
+					, ordNm		: "이태영"
+					, ordEmail	: "xodud1202@naver.com"
+					, ordTelno	: "02-0000-0000"
+					, ordPhnno	: "010-7111-0000"
+				},
 				error : function(e) {
 					alert(3);
 				},
@@ -84,6 +104,14 @@
 			});
 		});
 	</script>
+	
+	
+
+	<form id="order_info" name="order_info" method="post" action="/order/pay/result/response" ></form>
+	
+	
+	<input type="button" id="buyBtn" value="테스트버튼" style="width:200px; height:200px;"/>
+
 <!-- // xodud1202 -->
 
 
@@ -193,18 +221,15 @@
 	<script src="https://nsp.pay.naver.com/sdk/js/naverpay.min.js"></script>
 	<script th:inline="javascript">
 		let custNo = [[${sessionInfo.custNo}]];
-		//let naverPayClientId = [[${@environment.getProperty('naver.clientId')}]];
-		let naverPayClientId = '8TSWSyJMMUvOLKUySQx6';
+		let naverPayClientId = [[${@environment.getProperty('naverPay.clientId')}]];
 		let redirectUrl = '/order/naver/payment/request';
 		const protocol = 'http:';
 		
-		console.log('naverPayClientId : ' + naverPayClientId);
 		var oPay = Naver.Pay.create({
 			"mode" : "development",				// development or production
 			"clientId": naverPayClientId	// clientId
 		});
 		
-		console.log('oPay : ' + oPay);
 		$(document).on("click", "#naverBtn", function() {
 			$.ajax( {
 				type: "POST",
@@ -233,37 +258,71 @@
 			let jsonData = JSON.stringify(data);
 			
 			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
-				console.log(result.naverPay);
 				let reserveId = result.naverPay.body.reserveId;
 				let url = "https://test-pay.naver.com/payments/" + reserveId;
-				console.log(url);
-				window.open(url, 'naverPaymentPopup');
+				let option = 'width=750, height=' + $(window).height();
+
+				window.open(url, 'naverPaymentPopup', option);
 			});
 		}
 
-		// 카카오페이 결제 승인 요청
+		// 네이버페이 결제 승인 요청
 		var fnNaverPaymentRequest = function(paymentId) {
-			$('#order_info').append('<input type=hidden name="paymentId" value="' + paymentId + '" />');
+			$('#order_info').append('<input type=hidden name="pgTid" value="' + paymentId + '" />');
+
+			let url = '/order/naver/payment/approve';
+			let data = {};
+			data.pgTid = $('#order_info input[name=pgTid]').val();
+
+			let jsonData = JSON.stringify(data);
+
+			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+				console.log('====== naverPaymentRequest ======');
+				console.log(result.payment);
+				console.log(' ');
+				fnNaverPaymentOrder();
+			});
+			
+			return true;
+		}
+		
+		// 네이버페이 결제 정보 조회
+		var fnNaverPaymentOrder = function() {
+			let url = '/order/naver/payment/order';
+			let data = {};
+			data.pgTid = $('#order_info input[name=pgTid]').val();
 			
-			console.log('paymentId : ' + paymentId);
+			let jsonData = JSON.stringify(data);
 			
-			//let url = '/order/naver/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('====== kakaoPaymentRequest ======');
-			//	console.log(result.payment);
-			//	console.log(' ');
-			//	fnKakaoPaymentOrder();
-			//});
+			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+				console.log('====== naverPaymentOrder ======');
+				console.log(result.kakaoPay);
+				console.log(' ');
+				fnCancelNaverPayment();
+			});
 			
 			return true;
 		}
+
+		// 네이버페이 결제 취소
+		var fnCancelNaverPayment = function() {
+			let url = '/order/naver/payment/cancel';
+			let data = {};
+			data.pgTid = $('#order_info input[name=pgTid]').val();
+			data.cancelRequester = '1';
+			data.cancelReason = '고객변심';
+			data.cnclRtnAmt = 1000;
+			//data.allCanYn = 'Y';
+			
+			let jsonData = JSON.stringify(data);
+			
+			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+				console.log('====== naverPaymentCancel ======');
+				console.log(result.kakaoPay);
+				console.log(' ');
+				
+			});
+		}
 	</script>
 
 	<input type="button" id="kakaoBtn" value="카카오테스트버튼" style="width:200px; height:200px;"/>
@@ -271,8 +330,55 @@
 <!-- // card007 -->
 
 
+
+
+
+
+
+
+
 <!--  container -->
 <form id="payForm" name="payForm">
+	<br>
+	<!-- 주문고객정보 -->
+	<table border="1" style="font-size:10px; text-align:center;">
+		<tr style="height:30px;">
+			<th>custNm</th>
+			<th>email</th>
+			<th>cellPhnno</th>
+			<th>recipZipcode</th>
+			<th>recipBaseAddr</th>
+			<th>recipDtlAddr</th>
+			<th>delvMemo</th>
+			<th>foreignBuyYn</th>
+			<th>orderMadeYn</th>
+		</tr>
+		<tr style="height:30px;">
+			<td class="custNm"></td>
+			<td class="email"></td>
+			<td class="cellPhnno"></td>
+			<td class="recipZipcode"></td>
+			<td class="recipBaseAddr"></td>
+			<td class="recipDtlAddr"></td>
+			<td class="delvMemo"></td>
+			<td class="foreignBuyYn"></td>
+			<td class="orderMadeYn"></td>
+		</tr>
+	</table>
+	
+	<br>
+	<!-- 사은품정보 -->
+	<table border="1" style="font-size:10px; text-align:center;">
+		<tr style="height:30px;">
+			<th>freegiftValArr</th>
+			<th>freegiftUsePointArr</th>
+		</tr>
+		<tr style="height:30px;">
+			<td class="freegiftValArr"></td>
+			<td class="freegiftUsePointArr"></td>
+		</tr>
+	</table>
+	
 	<br>
 	<!-- 주문상세금액 -->
 	<table border="1" style="font-size:10px; text-align:center;">
@@ -298,8 +404,11 @@
 			<th>gfcdUseAmt1</th>
 			<th>realOrdAmt1</th>
 			<th>savePntAmt1</th>
+			<th>shoDelvYn</th>
+			<th>foreignYn</th>
+			<th>orderMadeYn</th>
 		</tr>
-		<th:block th:each="delvAllCart, i : ${delvAllCartList}">
+		<th:block th:each="delvAllCart, index : ${delvCartGoodsList}">
 			<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
 				<th:block th:each="goods, i : ${delvAllCart}">
 					<tr style="height:30px;">
@@ -336,6 +445,9 @@
 						<td class="gfcdUseAmt1">0</td>
 						<td class="realOrdAmt1">0</td>
 						<td class="savePntAmt1" 	th:text="${goods.savePntAmt}"></td>
+						<td class="shotDelvYn" 		th:text="${goods.shotDelvYn}"></td>
+						<td class="foreignBuyYn" 	th:text="${goods.foreignBuyYn}"></td>
+						<td class="orderMadeYn" 	th:text="${goods.orderMadeYn}"></td>
 					</tr>
 				</th:block>
 			</th:block>
@@ -343,7 +455,6 @@
 	</table>
 	
 	<br>
-	
 	<!-- 주문금액합계 -->
 	<table border="1" style="font-size:10px; text-align:center;">
 		<tr style="height:30px;">
@@ -414,10 +525,10 @@
 										</colgroup>
 										<tbody>
 											<tr>
-												<th>총 <span class="c_primary bold" th:text="${delvFeeTotCnt}"></span> 건으로 나뉘어 배송 예정</th>
+												<th>총 <span class="c_primary bold" th:text="${delvFeeCdCnt}"></span> 건으로 나뉘어 배송 예정</th>
 												<td class="t_l">
-													<span>총알배송<em class="c_primary bold" th:text="${wmsCnt}" id="shotDelv"></em>건</span>
-													<span>STYLE24<em class="c_primary bold" th:text="${wmsCnt}" id="wmsDelv"></em>건</span>
+													<span>총알배송<em class="c_primary bold" th:text="${shotCnt}" id="shotCnt"></em>건</span>
+													<span>STYLE24<em class="c_primary bold" th:text="${wmsCnt}" id="wmsCnt"></em>건</span>
 													<span>업체직배송<em class="c_primary bold" th:text="${delvCnt}"></em>건</span>
 													<span>예약배송<em class="c_primary bold" th:text="${resCnt}"></em>건</span>
 												</td>
@@ -458,64 +569,10 @@
 							<div class="area_order">
 								<div class="tit_box">
 									<h3 class="subH2">주문내역</h3>
-									<span> <em class="number" id="ordQty" th:text="${delvTotCnt}"></em>개의 상품</span>
+									<span> <em class="number" th:text="${goodsTotCnt}"></em>개의 상품</span>
 								</div>
-								<div class="od_item_box">
 								
-									<!-- 전체배송목록 sort --> 
-									<th:block th:each="delvAllCart, i : ${delvAllCartList}">
-										<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
-											<div class="part_dlvr">
-												<th:block th:if="${i.index} == 0">
-													<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
-														<h4 class="subH3 mb20">STYLE24 총알배송<span>오늘 자정까지 도착</span></h4>
-													</th:block>
-												</th:block>
-												<th:block th:if="${i.index} == 1">
-													<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
-														<h4 class="subH3 mb20" id="wmsDelvTitle">STYLE24 일반배송</h4>
-													</th:block>
-												</th:block>
-												<th:block th:if="${i.index} == 2">
-													<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
-														<h4 class="subH3 mb20">업체직배송</h4>
-													</th:block>
-												</th:block>
-												<th:block th:if="${i.index} == 3">
-													<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
-														<h4 class="subH3 mb20">예약배송</h4>
-													</th:block>
-												</th:block>
-												
-												<div class="gd_list">
-													<th:block th:each="goods, i : ${delvAllCart}">
-														<div class="item_gd">
-															<figure>
-																<span class="thumb"><img src="/images/pc/thumb/tmp_odSide1.jpg" alt=""></span>
-																<figcaption>
-																	<div class="brand" th:text="${goods.brandEnm} + ' ' + ${goods.brandKnm}"></div>
-																	<div class="name" th:text="${goods.goodsNm}"></div>
-																	<div class="option" th:each="opt, index : ${goods.itemNmArr}">
-																		<span th:text="${goods.optCdArr[index.index]}"></span> 
-																		<span>수량:<em th:text="${goods.goodsQty}"></em>개</span>
-																	</div>
-																	<div class="price">
-																		<th:block th:if="${goods.tmtbDcAmt} > 0">
-																			<span class="selling_price"  th:text="${#numbers.formatInteger(goods.tmtbDcAmt, 1, 'COMMA')}"></span>
-																		</th:block>
-																		<th:block th:if="${goods.tmtbDcAmt} < 1">
-																			<span class="selling_price"  th:text="${#numbers.formatInteger(goods.currPrice, 1, 'COMMA')}"></span>
-																		</th:block>
-																	</div>
-																</figcaption>
-															</figure>
-														</div>
-													</th:block>
-												</div>
-											</div>
-										</th:block>
-									</th:block>
-									<!-- //전체배송목록 sort -->
+								<div id="orderListInfo" style="display:none">
 								</div>
 								
 								<div class="od_amount_box">
@@ -615,10 +672,11 @@
 <script th:inline="javascript">
 // 배송관련정보 변수선언
 var cartGoodsList		= [[${cartGoodsList}]]			// 배송목록
-var wmsCnt 				= [[${wmsCnt}]];				// 자사 일반,촐알 배송건수
+var shotCnt 			= [[${shotCnt}]];				// 자사 총알 배송건수
+var wmsCnt 				= [[${wmsCnt}]];				// 자사 일반 배송건수
+var shotWmsCnt 			= [[${shotWmsCnt}]];			// 자사 총알,일반 배송건수
 var resCnt 				= [[${resCnt}]];				// 자사 예약 배송건수
-var delvCnt 			= [[${delvCnt}]];				// 입전 일반 배송건수
-var shotDelvYn			= [[${shotDelvYn}]];			// 총알배송여부
+var delvCnt 			= [[${delvCnt}]];				// 입점 일반 배송건수
 var orgSumDelvFee		= [[${sumDelvFee}]];			// 최초배송비합계
 var prePntDcAmt			= [[${prePntDcAmt}]];			// 선포인트사용가능금액
 
@@ -629,10 +687,18 @@ var recipZipcode		= [[${order.recipZipcode}]];	// 우편번호
 var recipBaseAddr		= [[${order.recipBaseAddr}]];	// 기본주소
 var recipDtlAddr		= [[${order.recipDtlAddr}]];	// 상세주소
 var cartSqArr			= [[${order.cartSqArr}]];		// 장바구니시퀀스 목록
+var shotDelvUseYn		= [[${order.shotDelvUseYn}]];	// 총알배송사용여부(장바구니)
+var shotDelvYn			= [[${order.shotDelvUseYn}]];	// 총알배송사용여부(장바구니)
+
+var foreignBuyYn		= [[${foreignBuyYn}]];			// 해외구매대행여부
+var orderMadeYn			= [[${orderMadeYn}]];			// 주문제작상품여부
 
 var custCpnSq 			= 0;
 var cpnIndex			= 0;
 var cpnApplyTemp		= false;
+
+//AJAX 로드를 위한 변수 설정
+var jsonObj 			= {};
 var jsonData			= null;
 
 // 컨텐츠 호출
@@ -641,8 +707,8 @@ $(document).ready( function() {
 	// 장바구니시퀀스 배열 변환
 	cartSqArr = String(cartSqArr).split(",");
 	
-	// 1. 각각의 컨텐츠 AJAX 로드
-	var jsonObj = {
+	// AJAX 로드를 위한 변수 설정
+	jsonObj = {
 		"custNm" 			: custNm
 		, "cellPhnno" 		: cellPhnno
 		, "email" 			: email
@@ -651,48 +717,18 @@ $(document).ready( function() {
 		, "recipDtlAddr" 	: recipDtlAddr
 		, "cartSqArr"		: cartSqArr
 		, "dispYn"			: "N"
+		, "shotDelvYn"		: shotDelvUseYn
+		, "foreignBuyYn"	: foreignBuyYn
+		, "orderMadeYn"		: orderMadeYn
 	}
 	
-	
-	var jsonData = JSON.stringify(jsonObj);
-	
-	// 1.1 고객정보로드
+	jsonData = JSON.stringify(jsonObj);
+
+	// 1. AJAX 정보(회원정보로드)
 	custemerInfoSet(jsonData);
-	
-	// 2. 각각의 기능 구현
-	// 2.1 총알배송가능 지역, 총알배송 가능 시간 체크
-	fnGetDailyDeliveryCheck();
 });
 
-// 3. 함수기능 정의
-// 3.1 프로모션 쿠폰 적용 함수
-function serialCpnApply() {
-	let data = {
-		rdCpnNm : $("#payForm #serialCpnNm").val()
-	}
-
-	let jsonData = JSON.stringify(data);
-
-	$.ajax( {
-		type			: "POST",
-		url 			: '/cart/list/serialCpnApply',
-		contentType		: 'application/json',
-		dataType 		: 'json',
-		data 			: jsonData,
-		success 		: function(result) {
-			var jsonObj 	= {"cartSqArr" : cartSqArr,"dispYn" : "Y"};
-			var jsonData 	= JSON.stringify(jsonObj);
-
-			// 성공일때는 쿠폰정보 및 포인트 정보 reset
-			if (result.serialCpnInfo.result == "SUCCESS") {
-				dcAmtInfoSet(jsonData);
-			} else {
-				alert(result.serialCpnInfo.result);
-			}
-		}
-	});
-}
-
+// 1. 함수기능 정의
 // 1.1 고객정보로드
 var custemerInfoSet = function(jsonData) {
 	$.ajax( {
@@ -710,6 +746,11 @@ var custemerInfoSet = function(jsonData) {
 			if (result != null) {
 				$("#custemerInfo").css("display", "block");
 				$("#custemerInfo").html(result);
+
+				// 고객정보설정
+				$(".custNm").text($("input[name='custNm'").val());
+				$(".email").text($("input[name='email'").val());
+				$(".cellPhnno").text($("input[name='cellPhnno'").val());
 			}
 			// 1.2 배송정보로드
 			deliveryAddrInfoSet(jsonData);
@@ -734,14 +775,103 @@ var deliveryAddrInfoSet = function(jsonData) {
 			if (result != null) {
 				$("#deliveryAddrInfo").css("display", "block");
 				$("#deliveryAddrInfo").html(result);
+				
+				// 배송정보설정
+				$(".recipZipcode").text($("input[name='recipZipcode'").val());
+				$(".recipBaseAddr").text($("input[name='recipBaseAddr'").val());
+				$(".recipDtlAddr").text($("input[name='recipDtlAddr'").val());
+				$(".delvMemo").text($("input[name='delvMemo'").val());
+				$(".foreignBuyYn").text($("input[name='foreignBuyYn'").val());
+				$(".orderMadeYn").text($("input[name='orderMadeYn'").val());
+			}
+			
+			// 1.3 총알배송가능 지역, 총알배송 가능 시간 체크(초기로드정보)
+			fnGetDailyDeliveryCheck(true);
+		}
+	});
+}
+
+// 1.3 총알배송가능 지역, 총알배송 가능 시간 체크
+var fnGetDailyDeliveryCheck = function (temp) {
+	
+	// 장바구니 총알배송 사용여부 체크 N
+	if (shotDelvUseYn == "N") {
+		// 초기에 한번 데이타 로드
+		if (temp) {
+			// 1.4 주문상품목록로드
+			orderListInfoSet(jsonData, temp);
+		}
+	} else {
+		// 배송지 우편번호 체크
+		var zipcode		= $("input[name='recipZipcode']").val();
+	
+		// 총알배송여부 체크 배송지정보 존재여부 체크
+		if (zipcode == null || zipcode == '') {
+			//alert("배송지정보가 없습니다. 기본 총알배송 가능지역으로 설정 합니다.");
+			zipcode = "04320"; // 기본 서울역 우편번호로 설정
+		}
+		
+		// TODO
+		var shotDelvObj 	= {"zipNo" : zipcode};
+	
+		gagajf.ajaxJsonSubmit(
+			"/order/getDailyDeliveryCheck"
+			, JSON.stringify(shotDelvObj)
+			, function (result) {
+				// 총알배송여부체크
+				var tempShotDelvYn = "N";
+				
+				if (parseInt(result) > 0) {
+					tempShotDelvYn = "Y";
+				}
+				
+				// json 값 설정
+				var orderListObj 		= {"cartSqArr":cartSqArr, "shotDelvYn":tempShotDelvYn};
+				var orderListJsonData 	= JSON.stringify(orderListObj);
+				
+				if (temp) {
+					// 1.3 주문상품목록로드
+					orderListInfoSet(orderListJsonData, temp);
+				} else {
+					if (tempShotDelvYn != shotDelvYn) {
+						orderListInfoSet(orderListJsonData, temp);
+					}
+				}
+				
+				shotDelvYn = tempShotDelvYn;
+			}
+		)
+	}
+}
+
+// 1.4 주문상품목록로드
+var orderListInfoSet = function(orderListJsonData, temp) {
+	$.ajax( {
+		type		: "POST",
+		url 		: '/order/orderListInfo',
+		data		: orderListJsonData,
+		dataType 	: 'html',
+		beforeSend : function(xhr, settings) {
+			xhr.setRequestHeader("AJAX"			, "true");
+			xhr.setRequestHeader('Accept'		, 'application/json');
+			xhr.setRequestHeader('Content-Type'	, 'application/json');
+			gagajf.showProgressbar(true);
+		},
+		success 	: function(result) {
+			if (result != null) {
+				$("#orderListInfo").css("display", "block");
+				$("#orderListInfo").html(result);
+			}
+			
+			// 1.5 사은품정보로드
+			if (temp) {
+				freegiftInfoSet(jsonData);
 			}
-			// 1.2 배송정보로드
-			freegiftInfoSet(jsonData);
 		}
 	});
 }
 
-// 1.3 사은품정보로드
+// 1.5 사은품정보로드
 var freegiftInfoSet = function(jsonData) {
 	
 	$.ajax( {
@@ -759,12 +889,19 @@ var freegiftInfoSet = function(jsonData) {
 			if (result != null) {
 				$("#freegiftInfo").html(result);
 				
+				var total_gift 		= 0;
+				var total_deduct 	= 0;
+				
 				// 2.2 사은품선택 라디오 버튼 기능
 				$(".freegiftRdo").on("click", function() {
-					var total_gift 		= 0;
-					var total_deduct 	= 0;
+					total_gift 		= 0;
+					total_deduct 	= 0;
 					
 					$(".freegiftRdo").each(function(){
+						if ($(this).attr("allYn") == "Y" ) {
+							total_gift 		+= 1;
+						}
+						
 						// 라디오버튼 사은품 체크
 						if ($(this).is(":checked")) {
 							// 수령거부가 아닐때 체크
@@ -779,18 +916,28 @@ var freegiftInfoSet = function(jsonData) {
 					$(".total_deduct").text(total_deduct.addComma());			// 사은품총사용포인트
 					$(".freegiftUsePnt").text(total_deduct);
 					
-					// 쿠폰초기화기능
-					custCpnInit();
+					// 포인트초기화기능
+					pntDcAmtReset();
+				});
+				
+				// 사은품테이블 그리기
+				$(".gift_box").each(function(){
+					$(this).find(".freegiftRdo").each(function(){
+						if ($(this).attr("allYn") == "Y" ) {
+							total_gift += 1;
+						}
+						$(".total_gift").text(total_gift);							// 사은품총선택개수
+					});
 				});
 			}
 			
-			// 1.5 결제타입로드
+			// 1.6 결제타입로드
 			paymentInfoSet(jsonData);
 		}
 	});
 }
 
-// 1.5 결제타입로드
+// 1.6 결제타입로드
 var paymentInfoSet = function(jsonData) {
 	$.ajax( {
 		type		: "POST",
@@ -808,16 +955,45 @@ var paymentInfoSet = function(jsonData) {
 				$("#paymentInfo").css("display", "block");
 				$("#paymentInfo").html(result);
 				
-				// 3.2 할인영역 설정
+				// 1.8 할인영역 설정
+				dcAmtInfoSet(jsonData);
+			}
+		}
+	});
+}
+
+// 1.7 프로모션 쿠폰 적용 함수
+var serialCpnApply = function(){
+	let data = {
+		rdCpnNm : $("#payForm #serialCpnNm").val()
+	}
+
+	let jsonData = JSON.stringify(data);
+
+	$.ajax( {
+		type			: "POST",
+		url 			: '/cart/list/serialCpnApply',
+		contentType		: 'application/json',
+		dataType 		: 'json',
+		data 			: jsonData,
+		success 		: function(result) {
+			var jsonObj 	= {"cartSqArr" : cartSqArr,"dispYn" : "Y"};
+			var jsonData 	= JSON.stringify(jsonObj);
+
+			// 성공일때는 쿠폰정보 및 포인트 정보 reset
+			if (result.serialCpnInfo.result == "SUCCESS") {
+				// 1.8 할인영역 재로드
 				dcAmtInfoSet(jsonData);
+			} else {
+				alert(result.serialCpnInfo.result);
 			}
 		}
 	});
 }
 
-// 3.2 할인영역 설정
+// 1.8 할인영역 설정 (쿠폰, 선포인트, 포인트, 상품권)
 var dcAmtInfoSet = function(jsonData) {
-	// 3.2.1 할인정보로드
+	// 1.8.1 할인정보로드
 	$.ajax( {
 		type		: "POST",
 		url 		: '/order/dcAmtInfo',
@@ -834,10 +1010,10 @@ var dcAmtInfoSet = function(jsonData) {
 				$("#dcAmtInfo").css("display", "block");
 				$("#dcAmtInfo").html(result);
 				
-				// 3.2.2 쿠폰적용초기화(할인율최고)
+				// 1.8.2 쿠폰적용초기화(할인율최고)
 				custCpnInit();
 				
-				// 3.2.3 쿠폰 SELECT BOX 기능 설정(js적용)
+				// 1.8.3 쿠폰 SELECT BOX 기능 설정(js적용)
 				$('.select_custom.type1').each(function(index){
 					var selecter01 	= new sCombo($(this));
 					
@@ -876,14 +1052,14 @@ var dcAmtInfoSet = function(jsonData) {
 					});
 				});
 				
-				// 3.2.4 쿠폰 최대할인금액 초기화 버튼 설정
+				// 1.8.4 쿠폰 최대할인금액 초기화 버튼 설정
 				$("#chk-maxdisc").on("click", function(){
 					if ($(this).is(":checked")) {
 						custCpnInit();
 					}
 				});
 
-				// 3.2.5 쿠폰할인적용 삭제 버튼
+				// 1.8.5 쿠폰할인적용 삭제 버튼
 				$(".btn_del_coupon").on("click", function(){
 					//선택없음선택
 					$(this).parent().parent().find("ul li").each(function(i){
@@ -893,7 +1069,7 @@ var dcAmtInfoSet = function(jsonData) {
 					});
 				});
 				
-				// 3.2.6 선포인트 적용 버튼 기능
+				// 1.8.6 선포인트 적용 버튼 기능
 				$("input[name='rdi-beforpoint']").each(function(){
 					// 선포인트 초기 설정 사용함
 					if ($(this).val() == "Y") {
@@ -911,12 +1087,12 @@ var dcAmtInfoSet = function(jsonData) {
 							$("#prePntDcAmt").text("0원");
 						}
 						
-						// 포인트기능 리렛
-						pntDcAmtReset();
+						// 쿠폰할인금액 SUM
+						custCpnSumAmtCal();
 					});
 				});
 				
-				// 3.2.6 포인트 적용버튼 기능
+				// 1.8.7 포인트 적용버튼 기능
 				$("#btn_point_apply").on("click", function(){
 					var rmPntAmt 			= parseInt($("input[name='rmPntAmt']").val());
 					var freegiftUsePnt 		= parseInt($(".freegiftUsePnt").text());
@@ -966,7 +1142,7 @@ var dcAmtInfoSet = function(jsonData) {
 					gfcdUseAmtReset();
 				});
 				
-				// 3.2.7 상품권 적용버튼 기능
+				// 1.8.8 상품권 적용버튼 기능
 				$("#btn_gfcd_apply").on("click", function(){
 					var rmGfcdAmt 		= parseInt($("input[name='rmGfcdAmt']").val());
 					var gfcdUseAmt 		= parseInt($("input[name='gfcdUseAmtStr']").val());
@@ -1007,7 +1183,7 @@ var dcAmtInfoSet = function(jsonData) {
 	});
 }
 
-// 3.3 쿠폰 최대할인율 쿠폰적용
+// 1.9 쿠폰 최대할인율 쿠폰적용
 var custCpnInit = function() {
 	
 	// 쿠폰적용없음적용
@@ -1053,11 +1229,11 @@ var custCpnInit = function() {
 		});
 	});
 	
-	// 선포인트기능리셋
-	prePntDcAmtReset();
+	// 포인트기능 리렛
+	pntDcAmtReset();
 }
 
-// 3.4 쿠폰중복사용체크
+// 1.10 쿠폰중복사용체크
 var custCpnDuplicationCheck = function(custCpnSq, index) {
 	var selCustSq 	= 0;
 	var cnt 		= 0;
@@ -1082,7 +1258,7 @@ var custCpnDuplicationCheck = function(custCpnSq, index) {
 	}
 }
 
-// 3.5 쿠폰중복체크 후 적용가능
+// 1.11 쿠폰중복체크 후 적용가능
 var custCpnApply = function(obj) {
 	// select box 쿠폰 적용
 	var cpnType 	= obj.parent().parent().find("input[name='cpnType']").val();
@@ -1208,11 +1384,11 @@ var custCpnApply = function(obj) {
 	// 선택된 할인금액 노출
 	obj.parent().parent().parent().parent().parent().find(".cp_discount").css("display", "block");
 	
-	// 선포인트기능리셋
-	prePntDcAmtReset();
+	// 포인트기능 리렛
+	pntDcAmtReset();
 }
 
-// 3.6 쿠폰중복체크 후 적용불가
+// 1.12 쿠폰중복체크 후 적용불가
 var custCpnNotApply = function(obj) {
 	// 이전에 등록된 쿠폰시퀀스  
 	var custCpnSq = obj.parent().parent().find("input[name='custCpnSq']").val();
@@ -1230,11 +1406,11 @@ var custCpnNotApply = function(obj) {
 		}
 	});
 	
-	// 선포인트기능리셋
-	prePntDcAmtReset();
+	// 포인트기능 리렛
+	pntDcAmtReset();
 }
 
-// 3.7 쿠폰 선택없음 기능 구현
+// 1.13 쿠폰 선택없음 기능 구현
 var cpnApplyDel = function(obj) {
 	// 쿠폰타입(상품쿠폰, 장바구니쿠폰, 배송비쿠폰)
 	var cpnType = obj.parent().parent().find("input[name='cpnType']").val();
@@ -1276,8 +1452,8 @@ var cpnApplyDel = function(obj) {
 	obj.parent().parent().find(".select").text("선택없음");
 	obj.parent().parent().parent().parent().parent().find(".cp_discount").css("display", "none");
 	
-	// 선포인트기능리셋
-	prePntDcAmtReset();
+	// 포인트기능 리렛
+	pntDcAmtReset();
 	
 	// 최대할인혜택적용 체크해제
 	if ($("#chk-maxdisc").is(":checked")) {
@@ -1285,7 +1461,7 @@ var cpnApplyDel = function(obj) {
 	}
 }
 
-// 3.9 선포인트리셋기능
+// 1.14 선포인트리셋기능 (사용안함)
 var prePntDcAmtReset = function() {
 	var rmPrePntAmt = parseInt($("input[name='rmPrePntAmt']").val());
 	$("input[name='prePntDcAmt']").val(rmPrePntAmt);
@@ -1304,7 +1480,7 @@ var prePntDcAmtReset = function() {
 	pntDcAmtReset();
 }
 
-// 3.10 포인트리셋기능
+// 1.15 포인트리셋기능
 var pntDcAmtReset = function() {
 	$(".pntDcSumAmt").text("0");
 	$("input[name='pntDcAmtStr']").val("");
@@ -1314,7 +1490,7 @@ var pntDcAmtReset = function() {
 	gfcdUseAmtReset();
 }
 
-// 3.11 상품권리셋기능
+// 1.16 상품권리셋기능
 var gfcdUseAmtReset = function() {
 	$(".gfcdUseSumAmt").text("0");
 	$("input[name='gfcdUseAmtStr']").val("");
@@ -1324,7 +1500,7 @@ var gfcdUseAmtReset = function() {
 	custCpnSumAmtCal();
 }
 
-// 3.12 쿠폰할인금액합계설정(금액전체계산)
+// 1.17 쿠폰할인금액합계설정(금액전체계산)
 var custCpnSumAmtCal = function() {
 	var cpnDcSumAmt = 0;
 	var cpnApplyCnt = 0;
@@ -1464,6 +1640,8 @@ var custCpnSumAmtCal = function() {
 	$(".realOrdSumAmt").text(realOrdSumAmt);
 	$(".savePntSumAmt").text(savePntSumAmt);
 	
+	$("#realOrdAmt").text(realOrdSumAmt.addComma() + "원"); // 총 결제 예정 금액
+	
 	var tempSavePnt			= savePntSumAmt - prePntDcAmt;
 	
 	// 사은품사용 후 보유포인트	
@@ -1477,49 +1655,36 @@ var custCpnSumAmtCal = function() {
 	
 	// 적립포인트
 	$("#savePntSumAmt").text(savePntSumAmt.addComma()+"P");
-};
-
-// 3.20 총알배송가능 지역, 총알배송 가능 시간 체크
-var fnGetDailyDeliveryCheck = function () {
-	// TODO
-	var jsonObj 	= {"zipNo" : 12345};
-	var jsonData 	= JSON.stringify(jsonObj);
-
-	gagajf.ajaxJsonSubmit(
-		"/order/getDailyDeliveryCheck"
-		, jsonData
-		, function (result) {
-			// 자사몰 일반배송
-			$("#shotDelv").text(0);
-			$("#wmsDelv").text(wmsCnt);
-			$("#wmsDelvTitle").css("display", "block");
-			$("#shotDelvTitle").css("display", "none");
-			$(".tag_stype2").css("display", "none");
-
-			// 자사몰 총알배송
-			if (shotDelvYn == "Y") {
-				if (parseInt(result) > 0) {
-					$("#shotDelv").text(wmsCnt);
-					$("#wmsDelv").text(0);
-					
-					$("#wmsDelvTitle").css("display", "none");
-					$("#shotDelvTitle").css("display", "block");
-					$(".tag_stype2").css("display", "block");
+	
+	// 사은품정보 설정
+	var freegiftValArr 			= [];
+	var freegiftUsePointArr 	= [];
+		
+	$(".gift_box").each(function(){
+		$(this).find(".freegiftRdo").each(function(){
+			// 사은품필수
+			if ($(this).attr("allYn") == "Y" ) {
+				freegiftValArr.push($(this).val());
+				freegiftUsePointArr.push($(this).attr("usepoint"));
+			}
+			
+			// 라디오버튼 선택 사은품 체크
+			if ($(this).is(":checked")) {
+				// 수령거부가 아닐때 체크
+				if ($(this).val() != "noSel") {
+					freegiftValArr.push($(this).val());
+					freegiftUsePointArr.push($(this).attr("usepoint"));
 				}
 			}
-		}
-	)
-}
-</script>
-
-
-
-
-
-
-
+		});
+	});
+	
+	$(".freegiftValArr").text(freegiftValArr);				// 사은품시퀀스배열
+	$(".freegiftUsePointArr").text(freegiftUsePointArr);	// 사은품사용포인트배열
+};
 
 
+</script>
 
 <script th:inline="javascript">
 // 화면준비상태
@@ -1724,4 +1889,4 @@ $(document).ready( function() {
 
 </th:block>
 </body>
-</html>
+</html>

+ 44 - 20
src/main/webapp/WEB-INF/views/web/order/OrderFreegiftInfoWeb.html

@@ -15,6 +15,7 @@
  -->
 
 <th:block th:if="${freegiftList != null && #lists.size(freegiftList) > 0}">
+
 <div class="fold_head">
 	<a href="javascript:void(0)">
 		<div>
@@ -33,30 +34,53 @@
 		<th:block th:each="freegift, i : ${freegiftList}">
 			<div class="gift_box">
 				<p class="txt">
-					<span th:text="'사은품선택' + ${i.count} + '' + ${freegift.freegiftNm}"></span>
+					<th:block th:if="${freegift.allYn} == 'Y'">
+						<span th:text="'사은품필수' + ${i.count} + ' ' + ${freegift.freegiftNm}"></span>
+					</th:block>
+					<th:block th:if="${freegift.allYn} == 'N'">
+						<span th:text="'사은품선택' + ${i.count} + ' ' + ${freegift.freegiftNm}"></span>
+					</th:block>
 				</p>
 				<div class="form_field">
-					<th:block th:each="freegiftGoods, k : ${freegiftGoodsList}">
-						<th:block th:if="${freegift.freegiftSq} == ${freegiftGoods.freegiftSq}">
-							<div class="gift">
-								<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="'rdi-gift'+${i.count}+${k.count}" class="chk_img freegiftRdo" th:value="${freegiftGoods.freegiftValSq}" th:usepoint="${freegiftGoods.usePoint}"> 
-								<label th:for="'rdi-gift'+${i.count}+${k.count}"> 
-									<span class="thumb"><img src="http://ts5000.ipdisk.co.kr:89/images/pc/thumb/tmp_gift1.jpg" width="" alt=""></span>
-									<span class="name" th:text="${freegiftGoods.goodsNm}"></span> 
-									<span th:if="${freegiftGoods.usePoint} < 1" class="deduct" th:text="무료"></span>
-									<span th:if="${freegiftGoods.usePoint} > 0" class="deduct" th:text="|- ${freegiftGoods.usePoint} P|"></span>
-								</label>
-							</div>
+					<!-- 전체지급 사음품(필수) -->
+					<th:block th:if="${freegift.allYn} == 'Y'">
+						<th:block th:each="freegiftGoods, k : ${freegiftGoodsList}">
+							<th:block th:if="${freegift.freegiftSq} == ${freegiftGoods.freegiftSq}">
+								<div class="gift">
+									<input type="hidden" th:name="'rdi-gift'+${i.count}" th:id="'rdi-gift'+${i.count}+${k.count}" class="chk_img freegiftRdo" th:value="${freegiftGoods.freegiftValSq}" usepoint="0" allYn="Y">
+									<label th:for="'rdi-gift'+${i.count}+${k.count}"> 
+										<span class="thumb"><img src="http://ts5000.ipdisk.co.kr:89/images/pc/thumb/tmp_gift1.jpg" width="" alt=""></span>
+										<span class="name" th:text="${freegiftGoods.goodsNm}"></span> 
+										<span class="deduct">무료</span>
+									</label>
+								</div>
+							</th:block>
+						</th:block>
+					</th:block>
+					<!-- 선택지급 사음품(선택) -->
+					<th:block th:if="${freegift.allYn} == 'N'">
+						<th:block th:each="freegiftGoods, k : ${freegiftGoodsList}">
+							<th:block th:if="${freegift.freegiftSq} == ${freegiftGoods.freegiftSq}">
+								<div class="gift">
+									<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="'rdi-gift'+${i.count}+${k.count}" class="chk_img freegiftRdo" th:value="${freegiftGoods.freegiftValSq}" th:usepoint="${freegiftGoods.usePoint}"  allYn="N"> 
+									<label th:for="'rdi-gift'+${i.count}+${k.count}"> 
+										<span class="thumb"><img src="http://ts5000.ipdisk.co.kr:89/images/pc/thumb/tmp_gift1.jpg" width="" alt=""></span>
+										<span class="name" th:text="${freegiftGoods.goodsNm}"></span> 
+										<span th:if="${freegiftGoods.usePoint} < 1" class="deduct" th:text="무료"></span>
+										<span th:if="${freegiftGoods.usePoint} > 0" class="deduct" th:text="|- ${freegiftGoods.usePoint} P|"></span>
+									</label>
+								</div>
+							</th:block>
 						</th:block>
+						<div class="gift">
+							<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="${i.count}+'0'" class="chk_img freegiftRdo" value="noSel" usepoint="0" allYn="N"> 
+							<label th:for="${i.count}+'0'">
+								<span class="thumb"><img src="/images/pc/thumb/tmp_gift_empty.jpg" width=""alt=""></span> 
+								<span class="name">사은품 수령안함</span>
+								<span class="deduct">수령거부</span>
+							</label>
+						</div>
 					</th:block>
-					<div class="gift">
-						<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="${i.count}+'0'" class="chk_img freegiftRdo" value="noSel" usepoint="0"> 
-						<label th:for="${i.count}+'0'">
-							<span class="thumb"><img src="/images/pc/thumb/tmp_gift_empty.jpg" width=""alt=""></span> 
-							<span class="name">사은품 수령안함</span>
-							<span class="deduct">수령거부</span>
-						</label>
-					</div>
 				</div>
 			</div>
 		</th:block>

+ 74 - 0
src/main/webapp/WEB-INF/views/web/order/OrderListInfoWeb.html

@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OrderCustemerInfoWeb.html
+ * @desc    : 고객정보 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.01   jsh77b     최초 작성
+ *******************************************************************************
+ -->
+<!-- 주문목록 -->
+<div class="od_item_box">
+	<!-- 전체배송목록 sort --> 
+	<th:block th:each="delvAllCart, i : ${delvAllCartList}">
+		<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+			<div class="part_dlvr">
+				<th:block th:if="${i.index} == 0">
+					<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+						<h4 class="subH3 mb20">STYLE24 총알배송 <span>오늘 자정까지 도착</span></h4>
+					</th:block>
+				</th:block>
+				<th:block th:if="${i.index} == 1">
+					<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+						<h4 class="subH3 mb20">STYLE24 일반배송</h4>
+					</th:block>
+				</th:block>
+				<th:block th:if="${i.index} == 2">
+					<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+						<h4 class="subH3 mb20">업체직배송</h4>
+					</th:block>
+				</th:block>
+				<th:block th:if="${i.index} == 3">
+					<th:block th:if="${delvAllCart != null and #lists.size(delvAllCart) > 0}">
+						<h4 class="subH3 mb20">예약배송</h4>
+					</th:block>
+				</th:block>
+				
+				<div class="gd_list">
+					<th:block th:each="goods, i : ${delvAllCart}">
+						<div class="item_gd">
+							<figure>
+								<span class="thumb"><img src="/images/pc/thumb/tmp_odSide1.jpg" alt=""></span>
+								<figcaption>
+									<div class="brand" th:text="${goods.brandEnm} + ' ' + ${goods.brandKnm}"></div>
+									<div class="name" th:text="${goods.goodsNm}"></div>
+									<div class="option" th:each="opt, index : ${goods.itemNmArr}">
+										<span th:text="${goods.optCdArr[index.index]}"></span> 
+										<span>수량:<em th:text="${goods.goodsQty}"></em>개</span>
+									</div>
+									<div class="price">
+										<th:block th:if="${goods.tmtbDcAmt} > 0">
+											<span class="selling_price"  th:text="${#numbers.formatInteger(goods.tmtbDcAmt, 1, 'COMMA')}"></span>
+										</th:block>
+										<th:block th:if="${goods.tmtbDcAmt} < 1">
+											<span class="selling_price"  th:text="${#numbers.formatInteger(goods.currPrice, 1, 'COMMA')}"></span>
+										</th:block>
+									</div>
+								</figcaption>
+							</figure>
+						</div>
+					</th:block>
+				</div>
+			</div>
+		</th:block>
+	</th:block>
+<!-- //전체배송목록 sort -->
+</div>
+<!-- //주문목록 -->
+</html>

+ 1 - 1
src/main/webapp/WEB-INF/views/web/order/OrderNoMemberWeb.html

@@ -20,7 +20,7 @@
 
 <th:block layout:fragment="content">
 <form id="orderForm" name="orderForm" class="form_wrap form_col_c form_full" action="#" th:action="@{'/order/form'}" th:method="post">
-	<input type="hidden" name="shotDelvYn" th:value="${order.shotDelvYn}" /><!-- 장바구니화면 총알배송여부 -->
+	<input type="hidden" name="shotDelvUseYn" th:value="${order.shotDelvUseYn}" /><!-- 장바구니화면 총알배송사용여부 -->
 	<!-- 장바구니화면 시퀀스 배열 등록 -->
 	<th:block th:each="cartSq , index : ${order.cartSqArr}">
 		<input type="hidden" name="cartSqArr" th:value="${cartSq}" />

+ 3 - 0
src/main/webapp/WEB-INF/views/web/pg/kcpOrderWeb.html

@@ -3,6 +3,9 @@
 <meta http-equiv="X-UA-Compatible" content="IE=edge" />
 <meta http-equiv="Pragma" content="no-cache">
 <meta http-equiv="Expires" content="-1">
+	<!-- 주문 데이터 -->
+	<input type="hidden" name="pgGb"		th:value="${payment.pgGb}" />
+	<input type="hidden" name="payMeans"	th:value="${payment.payMeans}" />
 
 	<!-- 선택, 상점이름(영문으로 작성권장) -->
 	<input type="hidden" name="site_name"	th:value="${payment.siteName}" />