Explorar o código

Merge branch 'develop' of http://112.172.147.34:4936/style24/style24.front.git into develop

eskim %!s(int64=5) %!d(string=hai) anos
pai
achega
4411356f10
Modificáronse 40 ficheiros con 2710 adicións e 599 borrados
  1. 2 0
      src/main/java/com/style24/front/biz/dao/TsfOrderDao.java
  2. 31 1
      src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java
  3. 14 0
      src/main/java/com/style24/front/biz/dao/TsfSocialDao.java
  4. 1 1
      src/main/java/com/style24/front/biz/service/TsfCartService.java
  5. 7 3
      src/main/java/com/style24/front/biz/service/TsfCounselService.java
  6. 48 7
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  7. 36 0
      src/main/java/com/style24/front/biz/service/TsfPlanningService.java
  8. 9 1
      src/main/java/com/style24/front/biz/web/TsfCallcenterController.java
  9. 160 112
      src/main/java/com/style24/front/biz/web/TsfOrderController.java
  10. 61 1
      src/main/java/com/style24/front/biz/web/TsfPlanningController.java
  11. 72 0
      src/main/java/com/style24/persistence/domain/Social.java
  12. 2 2
      src/main/java/com/style24/persistence/mybatis/shop/TsfCounsel.xml
  13. 27 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml
  14. 108 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  15. 6 0
      src/main/resources/config/application-locd.yml
  16. 7 0
      src/main/resources/config/application-locp.yml
  17. 7 0
      src/main/resources/config/application-run.yml
  18. 7 0
      src/main/resources/config/application-tsit.yml
  19. 22 0
      src/main/resources/config/application.yml
  20. 309 0
      src/main/webapp/WEB-INF/views/mob/SigninFormMob.html
  21. 175 0
      src/main/webapp/WEB-INF/views/mob/callcenter/GoodsQnaFormMob.html
  22. 194 5
      src/main/webapp/WEB-INF/views/mob/callcenter/OneToOneQnaFormMob.html
  23. 219 0
      src/main/webapp/WEB-INF/views/mob/callcenter/OneToOneQnaRegisterFormMob.html
  24. 59 44
      src/main/webapp/WEB-INF/views/mob/common/fragments/FooterMob.html
  25. 1 1
      src/main/webapp/WEB-INF/views/mob/common/layout/CallcenterLayoutMob.html
  26. 38 0
      src/main/webapp/WEB-INF/views/mob/common/layout/DefaultLayoutMob.html
  27. 37 0
      src/main/webapp/WEB-INF/views/mob/display/MallMainFormMob.html
  28. 3 3
      src/main/webapp/WEB-INF/views/web/SigninFormWeb.html
  29. 2 1
      src/main/webapp/WEB-INF/views/web/callcenter/GoodsQnaFormWeb.html
  30. 4 4
      src/main/webapp/WEB-INF/views/web/order/OrderCustemerInfoWeb.html
  31. 70 62
      src/main/webapp/WEB-INF/views/web/order/OrderDeliveryAddrInfoWeb.html
  32. 413 248
      src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html
  33. 44 20
      src/main/webapp/WEB-INF/views/web/order/OrderFreegiftInfoWeb.html
  34. 74 0
      src/main/webapp/WEB-INF/views/web/order/OrderListInfoWeb.html
  35. 1 1
      src/main/webapp/WEB-INF/views/web/order/OrderNoMemberWeb.html
  36. 3 0
      src/main/webapp/WEB-INF/views/web/pg/kcpOrderWeb.html
  37. 357 0
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  38. 77 81
      src/main/webapp/WEB-INF/views/web/planning/PlanningEventMainFormWeb.html
  39. 1 1
      src/main/webapp/WEB-INF/views/web/planning/PlanningMainFormWeb.html
  40. 2 0
      src/main/webapp/ux/style24_link.js

+ 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);
 }

+ 31 - 1
src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java

@@ -46,7 +46,7 @@ public interface TsfPlanningDao {
 	Collection<Plan> getPlanList(Plan plan);
 	
 	/**
-	 * 기획전 목록
+	 * 기획전 상품 목록
 	 *
 	 * @param
 	 * @return
@@ -54,6 +54,26 @@ public interface TsfPlanningDao {
 	 * @date 2021. 3. 8
 	 */
 	Collection<Plan> getPlanGoodsList(Plan plan);
+	
+	/**
+	 * 기획전 상세정보
+	 *
+	 * @param 기획전 번호
+	 * @return
+	 * @author sowon
+	 * @date 2020. 7. 27
+	 */
+	Plan getPlanDetailInfo(Plan plan);
+	
+	/**
+	 * 기획전 고객등급 확인 목록
+	 *
+	 * @param
+	 * @return
+	 * @author sowon
+	 * @date 2021. 3. 8
+	 */
+	Collection<Plan> planCustGrade(Plan plan);
 
 	/**
 	 * 이벤트 갯수 조회
@@ -64,5 +84,15 @@ public interface TsfPlanningDao {
 	 * @since 2021.03.08
 	 */
 	int getEventAllCount(Plan plan);
+	
+	/**
+	 * 이벤트 목록
+	 *
+	 * @param
+	 * @return
+	 * @author sowon
+	 * @date 2021. 3. 8
+	 */
+	Collection<Plan> getPlanEventList(Plan plan);
 
 }

+ 14 - 0
src/main/java/com/style24/front/biz/dao/TsfSocialDao.java

@@ -0,0 +1,14 @@
+package com.style24.front.biz.dao;
+
+import com.style24.core.support.annotation.ShopDs;
+
+/**
+ * 소셜관리(핫딜) Dao
+ * 
+ * @author sowon
+ * @since 2021. 3. 9
+ */
+@ShopDs
+public interface TsfSocialDao {
+
+}

+ 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 {

+ 7 - 3
src/main/java/com/style24/front/biz/service/TsfCounselService.java

@@ -101,6 +101,7 @@ public class TsfCounselService {
 
 	/**
 	 * 1:1문의 삭제
+	 * 		진행중 상태일 때 삭제하는 것이 아니라 답변완료 상태일 때만 삭제하는 것으로 함 (기획서)
 	 * @param counsel - 상담정보
 	 * @author gagamel
 	 * @since 2020. 12. 28
@@ -111,7 +112,8 @@ public class TsfCounselService {
 		counsel.setUpdNo(TsfSession.getInfo().getCustNo());
 		int result = counselDao.deleteOneToOneQna(counsel);
 		if (result == 0) {
-			throw new IllegalStateException("답변이 완료되어 삭제할 수 없습니다.");
+//			throw new IllegalStateException("답변이 완료되어 삭제할 수 없습니다.");
+			throw new IllegalStateException("답변이 완료되지 않아 삭제할 수 없습니다.");
 		}
 	}
 
@@ -158,7 +160,8 @@ public class TsfCounselService {
 		counsel.setUpdNo(TsfSession.getInfo().getCustNo());
 		int result = counselDao.deleteOneToOneQnaImage(counsel);
 		if (result == 0) {
-			throw new IllegalStateException("답변이 완료되어 삭제할 수 없습니다.");
+//			throw new IllegalStateException("답변이 완료되어 삭제할 수 없습니다.");
+			throw new IllegalStateException("답변이 완료되지 않아 삭제할 수 없습니다.");
 		}
 	}
 
@@ -244,7 +247,8 @@ public class TsfCounselService {
 		counsel.setUpdNo(TsfSession.getInfo().getCustNo());
 		int result = counselDao.deleteGoodsQna(counsel);
 		if (result == 0) {
-			throw new IllegalStateException("답변이 완료되어 삭제할 수 없습니다.");
+//			throw new IllegalStateException("답변이 완료되어 삭제할 수 없습니다.");
+			throw new IllegalStateException("답변이 완료되지 않아 삭제할 수 없습니다.");
 		}
 	}
 

+ 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;
+	}
 }

+ 36 - 0
src/main/java/com/style24/front/biz/service/TsfPlanningService.java

@@ -73,6 +73,30 @@ public class TsfPlanningService {
 		//plan.setSiteCd(TsfConstants.SITE_CD);
 		return planningDao.getPlanGoodsList(plan);
 	}
+	
+	/**
+	 * 기획전 고객등급 목록
+	 *
+	 * @param
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 9
+	 */
+	public Collection<Plan>planCustGrade(Plan plan) {
+		return planningDao.planCustGrade(plan);
+	}
+	
+	/**
+	 * 기획전 상세 정보
+	 *
+	 * @param
+	 * @return
+	 * @author sowon	
+	 * @since 2021. 3. 8
+	 */
+	public Plan getPlanDetailInfo(Plan plan) {
+		return planningDao.getPlanDetailInfo(plan);
+	}
 
 	/**
 	 * 이벤트 갯수 조회
@@ -84,5 +108,17 @@ public class TsfPlanningService {
 	public int getEvnetAllCount(Plan plan) {
 		return planningDao.getEventAllCount(plan);
 	}
+	
+	/**
+	 * 이벤트 목록
+	 *
+	 * @param
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 9
+	 */
+	public Collection<Plan> getPlanEventList(Plan plan) {
+		return planningDao.getPlanEventList(plan);
+	}
 
 }

+ 9 - 1
src/main/java/com/style24/front/biz/web/TsfCallcenterController.java

@@ -1,6 +1,7 @@
 package com.style24.front.biz.web;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mobile.device.Device;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -171,17 +172,23 @@ public class TsfCallcenterController extends TsfBaseController {
 
 	/**
 	 * 1:1문의 화면
+	 * @param device - 디바이스 정보
 	 * @return
 	 * @author gagamel
 	 * @since 2020. 12. 24
 	 */
 	@GetMapping("/onetoone/qna/form")
-	public ModelAndView oneToOneQnaForm() {
+	public ModelAndView oneToOneQnaForm(Device device) {
 		ModelAndView mav = new ModelAndView();
 
 		// 1:1문의 건수 정보
 		mav.addObject("qnaCountInfo", counselService.getOneToOneQnaCountInfo());
 
+		if (device.isMobile() || device.isTablet()) { // 모바일이면
+			// 문의유형
+			mav.addObject("counselClsfList", rendererService.getCommonCodeList("G059", "Y", new String[] {"G596"}));
+		}
+
 		mav.setViewName(super.getDeviceViewName("callcenter/OneToOneQnaForm"));
 
 		return mav;
@@ -368,6 +375,7 @@ public class TsfCallcenterController extends TsfBaseController {
 
 	/**
 	 * 상품문의 삭제 처리
+	 * 		진행중 상태일 때 삭제하는 것이 아니라 답변완료 상태일 때만 삭제하는 것으로 함 (기획서)
 	 * @param counsel -상담정보
 	 * @return
 	 * @author gagamel

+ 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;
+	}
+
 }

+ 61 - 1
src/main/java/com/style24/front/biz/web/TsfPlanningController.java

@@ -1,5 +1,8 @@
 package com.style24.front.biz.web;
 
+import java.util.Collection;
+import java.util.Iterator;
+
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -7,6 +10,7 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.style24.core.support.env.TscConstants;
@@ -73,6 +77,60 @@ public class TsfPlanningController extends TsfBaseController {
 		return mav;
 	}
 	
+	/**
+	 * 기획전 상세화면
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 9
+	 */
+	@GetMapping("/detail/form")
+	@ResponseBody
+	public ModelAndView PlanningDetailForm(Plan plan) throws Exception {
+		ModelAndView mav = new ModelAndView();
+		// 상세정보
+		//plan.setSiteCd(TsfConstants.SITE_CD);
+		
+		// 디바이스 set
+		plan.setFrontGb(TsfSession.getFrontGb());
+
+		Plan planInfo = planningService.getPlanDetailInfo(plan);
+		mav.addObject("planInfo", planInfo);
+
+		if (planInfo == null || planInfo.getPlanSq() == null) {
+			mav.setViewName("redirect:/planning/main/form");
+			return mav;
+		}
+		
+		// 다른기획전 보기 
+		mav.addObject("planList", planningService.getPlanList(plan));
+//
+//		mav.addObject("couponList", planningService.getPlusCouponList(plan));
+//
+//		// 소스
+//		mav.addObject("fsrcInfo", planningService.getPlanFsrcInfo(plan));
+//
+//		// 기획전 상세 및 코너 목록
+//		mav.addObject("planCornerList", planningService.getPlanCornerList(plan));
+//
+//		// 특가세일 기준
+//		mav.addObject("specialPriceSaleRate", policyService.getSpecialPriceSaleDisplayRate(TsfConstants.SITE_CD));
+//
+//		if ("E".equals(planInfo.getPlanGb())) { // 기획전 일 떄
+//			if (planInfo.getPrivacyPolicy() != null && !planInfo.getPrivacyPolicy().equals("")) {
+//				mav.addObject("planQuestionList", planningService.getPlanQuestionList(plan));
+//			}
+//		}
+
+		// Popup Parameter
+//		mav.addObject("preview", plan.getPreview());
+//		mav.addObject("viewDt", plan.getViewDt());
+//		mav.addObject("viewPage", "40");
+//		mav.addObject("popupPlanSq", plan.getPlanSq());
+
+		mav.setViewName(super.getDeviceViewName("planning/PlanningDetailForm"));
+		return mav;
+	}
 	/**
 	 * 이벤트 메인 화면
 	 * 
@@ -89,7 +147,9 @@ public class TsfPlanningController extends TsfBaseController {
 		
 		// 이벤트 갯수
 		mav.addObject("cnt",planningService.getEvnetAllCount(plan));
-				
+		
+		// 이벤트 목록
+		mav.addObject("evnetList",planningService.getPlanEventList(plan));		
 		
 		mav.setViewName(super.getDeviceViewName("planning/PlanningEventMainForm"));
 		return mav;

+ 72 - 0
src/main/java/com/style24/persistence/domain/Social.java

@@ -0,0 +1,72 @@
+package com.style24.persistence.domain;
+
+
+import com.style24.persistence.TscBaseDomain;
+import com.style24.persistence.TscPageRequest;
+
+import lombok.Data;
+
+/**
+ * 소셜관리 Domain
+ *
+ * @author sowon
+ * @since 2021. 03. 03
+ */
+
+@SuppressWarnings("serial")
+@Data
+public class Social extends TscBaseDomain{
+		// SOCIAL
+		private Integer socialSq;			// 소셜일련번호
+		private String socialNm;		// 소셜명
+		private String socialType;		// 소셜유형
+		private String siteCd;			// 사이트코드
+		private String frontGb;			// 프론튿구분
+		private String socialStdt;		// 소셜시작시간
+		private String socialEddt;		// 소셜종료시간
+		private String socialTnm;		// 소셜타이틀명
+		private String useYn;			// 사용여부
+		private String applyGb;			// 적용구분
+		
+		private String regNm;
+		// PLAN
+		private Integer planSq;			// 기획전 일련번호
+		
+		
+
+		// SOCIAL GOODS
+		private Integer scgoodsSq;		// 소셜상품일련번호(SEQ_SCGOODS sequence)
+		private String goodsCd;			// 상품코드(상품)
+		private int currBprice;		// 변경전현재판매가
+		private int currAprice;		// 변경후현재판매가
+		private float dcBrate;			// 변경전할인율
+		private float dcArate;			// 변경후할인율
+		private float pntBprate;		// 변경전포인트적립율(PC)
+		private float pntAprate;		// 변경후포인트적립율(PC)
+		private float pntBmrate;		// 변경전포인트적립율(모바일)
+		private float pntAmrate;		// 변경후포인트적립율(모바일)
+		private String erpPriceLinkYn;	// erp가격연계여부(자사품만 사용, y연계)
+		private String dispOrd;			// 표시순서
+		private String delYn;			// 삭제여부(Y:삭제)
+
+		// GOODS
+		private int currPrice;		// 현재 판매가
+		private float dcRate;			// 할인율
+		private float pntPrate;		// PC 포인트 적립율
+		private float pntMrate;		// MOBILE 포인트 적립율
+
+		
+
+		private String excelFileNm;		// 엑셀파일명
+		// 검색
+		private String stDate;	// 시작일시
+		private String edDate;	// 종료일시
+		
+		
+		// Pagination
+		private TscPageRequest pageable;
+		private int pageNo = 1;
+		private int pageSize = 50;
+		private int pageUnit = 10;
+		
+}

+ 2 - 2
src/main/java/com/style24/persistence/mybatis/shop/TsfCounsel.xml

@@ -196,7 +196,7 @@
 		     , UPD_DT = NOW()
 		WHERE  COUNSEL_SQ = #{counselSq}
 		AND    CUST_NO = #{custNo}
-		AND    ANS_STAT = 'G060_10' /*답변상태:처리중*/
+		AND    ANS_STAT = 'G060_20' /*답변상태:답변완료*/
 	</update>
 	
 	<!-- 상품문의 생성 -->
@@ -374,7 +374,7 @@
 		     , UPD_DT = NOW()
 		WHERE  COUNSEL_SQ = #{counselSq}
 		AND    CUST_NO = #{custNo}
-		AND    ANS_STAT = 'G060_10' /*답변상태:처리중*/
+		AND    ANS_STAT = 'G060_20' /*답변상태:답변완료*/
 	</update>
 
 </mapper>

+ 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>

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

@@ -102,6 +102,9 @@
 		  AND P1.DEL_YN = 'N'
 		  AND P1.PLAN_GB = 'P'
 		  AND NOW() BETWEEN P1.DISP_STDT AND P1.DISP_EDDT
+	   	<if test="planSq != null and planSq != ''">
+			AND P1.PLAN_SQ != #{planSq}
+		</if>
 		 <!--  AND P1.FRONT_GB IN (#{frontGb}, 'A') -->
 		  AND P1.PLAN_SQ IN (
 				   						SELECT PLAN_SQ 
@@ -174,6 +177,64 @@
 			WHERE F.RNUM IN (1,2)
 	</select>
 	
+	<!-- 기획전 상세정보 -->
+	<select id="getPlanDetailInfo" parameterType="Plan" resultType="Plan">
+		/* TsfPlanning.getPlanDetailInfo*/
+		SELECT A.PLAN_SQ
+		     , A.PLAN_NM
+		     , A.PLAN_GB
+		     , A.SITE_CD
+		     , A.FRONT_GB
+		     , A.DISP_STDT
+		     , A.DISP_EDDT
+		     , A.MAIN_PIMG
+		     , A.MAIN_MIMG
+		     , A.DTL_PIMG
+		     , A.DTL_MIMG
+		     , A.DTL_TITLE1
+		     , A.DTL_TITLE2
+		     , A.REPLY_YN
+		     , A.REPLY_LOC
+		     , A.REPLY_IMG
+		     , A.REPLY_TITLE1
+		     , A.REPLY_TITLE2
+		     , A.CORNER_NM_DISP_YN
+		     , A.GOODS_LIMIT_YN
+		     , A.GOODS_LIMIT_QTY
+		     , A.DEL_YN
+		     , A.OPEN_YN
+		     , A.DISP_ORD
+		     , A.READ_CNT
+		     , A.DEV_URL
+		     , A.BADGE_NM
+		     , A.BADGE_FCOLOR
+		     , A.BADGE_BCOLOR
+		     , A.POLL_SQ
+		     , A.REG_NO
+		     , A.REG_DT
+		     , A.UPD_NO
+		     , A.UPD_DT
+		FROM   TB_PLAN A
+		WHERE  A.PLAN_SQ = #{planSq}
+		<!-- AND    A.SITE_CD = #{siteCd} -->
+		<if test='adminPreview != "Y"'> -- 어드민 미리보기
+		AND    NOW() BETWEEN A.DISP_STDT AND A.DISP_EDDT
+		</if>
+		<if test="frontGb != null and frontGb != ''">
+		AND    (A.FRONT_GB = 'A' OR A.FRONT_GB = #{frontGb})
+		</if>
+	</select>
+	
+	<select id="planCustGrade" resultType="int" parameterType="Plan">
+		/* TsfPlanning.planCustGrade */
+		SELECT G.CUST_GRADE 
+			  ,G.PLAN_SQ 
+			  ,G.REG_DT 
+			  ,G.REG_NO 
+		FROM TB_PLAN_CUST_GRADE G 
+		WHERE PLAN_SQ = #{planSq}
+	</select>
+	
 	<select id="getEventAllCount" resultType="int" parameterType="Plan">
 		/* TsfPlanning.getEventAllCount */
 		SELECT COUNT(*) AS CNT
@@ -185,6 +246,53 @@
 		    <!-- AND P.FRONT_GB IN (#{frontGb}, 'A') -->
 	</select>
 	
+	<select id="getPlanEventList" parameterType="Plan" resultType="Plan">
+		SELECT P1.*
+		FROM 
+		(
+			 SELECT
+			       P.PLAN_SQ
+			      ,P.PLAN_NM
+			      ,P.PLAN_GB
+			      ,P.SITE_CD
+			      ,P.FRONT_GB
+			      ,SUBSTRING_INDEX(P.DISP_STDT , ' ', +1) AS DISP_STDT
+			      ,SUBSTRING_INDEX(P.DISP_EDDT , ' ', +1) AS DISP_EDDT
+			      ,CASE WHEN DATE(P.REG_DT) BETWEEN DATE_ADD(NOW(),INTERVAL -3 DAY ) AND NOW() THEN 'NEW' END AS 'NEW_PLAN'   /*등록일 기준 3일 */
+			      ,P.MAIN_PIMG
+			      ,P.MAIN_MIMG
+			      ,P.DTL_PIMG
+			      ,P.DTL_MIMG
+			      ,P.DTL_TITLE1
+			      ,P.DTL_TITLE2
+			      ,P.REPLY_YN
+			      ,P.REPLY_LOC
+			      ,P.REPLY_IMG
+			      ,P.REPLY_TITLE1
+			      ,P.REPLY_TITLE2
+			      ,P.CORNER_NM_DISP_YN
+			      ,P.GOODS_LIMIT_YN
+			      ,P.GOODS_LIMIT_QTY
+			      ,P.DEL_YN, OPEN_YN
+			      ,P.DISP_ORD
+			      ,P.READ_CNT
+			      ,P.DEV_URL
+			      ,P.BADGE_NM
+			      ,P.BADGE_FCOLOR
+			      ,P.BADGE_BCOLOR
+			      ,P.POLL_SQ
+			      ,P.REG_NO
+			      ,P.REG_DT
+			      ,P.UPD_NO
+			      ,P.UPD_DT
+			 FROM TB_PLAN P 
+			 WHERE 1=1 
+			 	AND P.PLAN_GB = 'E' /*이벤트 경우*/
+			 	AND NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT /*진행기간*/
+			 	AND P.DEL_YN = 'N'
+		)P1
+		ORDER BY P1.NEW_PLAN DESC , ABS(DATEDIFF(P1.DISP_EDDT,NOW()))  
+	</select>
 	
 
 </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
+

+ 309 - 0
src/main/webapp/WEB-INF/views/mob/SigninFormMob.html

@@ -0,0 +1,309 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/DefaultLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : SigninFormMob.html
+ * @desc    : 로그인 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.10   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<main class="container mb">
+		<div class="close">
+			<a href="javascript:void(0)" class="btn_close" onclick="cfnGoToPage(_PAGE_MAIN);"><span></span><span></span></a>
+		</div>
+
+		<!-- ★ 컨텐츠 시작 -->
+		<section class="content mb_login">
+
+			<div class="inner">
+				<h2 class="title">로그인</h2>
+			</div>
+			<div class="inner">
+				<form class="form_wrap form_full" name="loginForm" id="loginForm" th:action="@{/login}" method="post">
+					<div class="form_head"><h3 class="title sr-only">로그인</h3></div>
+					<div class="form_field mt0">
+						<input type="text" name="loginId" placeholder="아이디" class="form_control"minlength="4" maxlength="12" required="required" data-valid-type="alphaNumeric" data-valid-name="아이디"/>
+					</div>
+					<div class="form_field">
+						<input type="password" name="passwd" placeholder="비밀번호 8자~20자 입력" class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="비밀번호"/>
+					</div>
+					<div class="login_check mt10">
+						<div class="left">
+							<div class="form_field">
+								<input id="chkSaveId" type="checkbox"><label for="chkSaveId"><span>아이디 저장</span></label>
+							</div>
+						</div>
+						<div class="right">
+							<ul>
+								<li><a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">아이디찾기</a></li>
+								<li><a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_PWD_FIND);">비밀번호 찾기</a></li>
+							</ul>
+						</div>
+					</div>
+					<div class="help_block">
+						<!-- 보안문자 입력시 -->
+						<div>
+							<div class="captcha" style="display: none;"> <!-- 캡차영역 -->
+								<ul>
+									<li class="lap"> <!-- 캡차이미지 -->
+										<div class="captcha_box"> <!-- 캡차이미지 -->
+											<img src="" id="imgCaptcha"/>
+										</div>
+										<div class="captcha_btn_dual">
+											<button type="button" id="play_audio" onclick="fnReloadCaptchaImage();">새로고침</button>
+											<button type="button" id="swap_captcha">음성듣기</button>
+										</div>
+									</li>
+									<li class="captcha_area">
+										<label for="captcha" id="label_captcha_area" class="sr-only">보안문자 입력</label>
+										<input type="text" id="captcha" name="captcha" placeholder="위 보안문자 이미지에 보이는 문자 입력" title="문자입력"/>
+									</li>
+								</ul>
+							</div>
+							<p class="t_err mt10 t_err_login_fail" style="display: none;">
+								<span id="err_msg">보안문자 입력을 다시 시도해 주세요.</span><br>
+								(10회 이상 실패하면 180초 동안 로그인이 불가능 합니다.)<br>
+								<span id="login_fail_cnt">4</span>회 실패 / 잔여 : <span id="login_remain_cnt">6</span>회<span id="blockSecs1" style="display: none;"> / <span id="blockSecs2">180</span>초 남음
+							</p>
+						</div>
+						<!-- //보안문자 입력시 -->
+					</div>
+					<div class="ui_row mt20">
+						<button type="button" class="btn btnL btn_dark" id="btnLogin">로그인</button>
+					</div>
+				</form>
+				<div class="t_c sns_wrap">
+					<h3 class="sr-only">간편로그인</h3>
+					<ul class="login_utill">
+						<li class="lu_kakao">
+							<a href="javascript:void(0)">
+								<div class="ico"></div>카카오로<br>시작하기
+							</a>
+						</li>
+						<li class="lu_naver">
+							<a href="javascript:void(0)">
+								<div class="ico"></div>네이버로<br>시작하기
+							</a>
+						</li>
+						<li class="lu_yes24">
+							<a href="javascript:void(0)">
+								<div class="ico"></div>YES24로<br>시작하기
+							</a>
+						</li>
+					</ul>
+				</div>
+				<div class="t_c mt30"><botton class="btn_nonMb">비회원 주문조회</botton>
+				</div>
+
+		</section>
+		<!-- ★ 컨텐츠 종료 -->
+
+	</main>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let ckLoginId = "ckLoginId";
+
+	// 로그인블락시간(초) 설정
+	let fnSetLoginBlockTime = function() {
+		let blockSecs = Number($("#blockSecs2").html()) - 1;
+		$("#blockSecs2").html(blockSecs);
+		if (blockSecs == 0) {
+			clearTimeout(fnSetLoginBlockTime);
+			$('#btnLogin').attr('disabled',false);
+		} else {
+			setTimeout(fnSetLoginBlockTime, 1000);
+		}
+	}
+	
+	// 로그인
+	$('#btnLogin').on('click', function() {
+		if (!gagajf.validation($('#loginForm'))) {
+			return;
+		}
+
+		let params = new Object();
+		params.loginId = $('#loginForm input[name=loginId]').val();
+		params.passwd = $('#loginForm input[name=passwd]').val();
+		
+		$.post($('#loginForm').prop('action')
+			, $.param(params)
+			, function(result) {
+				if (result.status != 'OK') {
+
+					if (result.status == 'PWD_5WRONG') {
+						// Do nothing
+					} else if (result.status == 'DORMANT_CUST') {
+						// 휴면회원
+						mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
+							sureBtnText: "확인",
+							sureBtnClick: function() {
+								cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+							}
+						});
+
+						return;
+					} else if (result.status == 'SECEDE_CUST') {
+						// 탈퇴회원
+					} else if (result.status == 'SESSION_EXPIRED') {
+						// 세션만료
+					}
+
+					if (!gagajf.isNull(result.message)) {
+						let loginFailCnt = Number(result.loginFailInfo.loginFailCnt);
+						
+						$("#err_msg").html(result.message);
+						$("#login_fail_cnt").html(loginFailCnt);
+						$("#login_remain_cnt").html(10 - loginFailCnt);
+						$(".t_err_login_fail").show();
+						
+						if (loginFailCnt >= 5 && loginFailCnt < 10) {
+							// 비밀번호 5회 이상 틀린 경우 캡챠 노출
+							$('.captcha').show();
+						} else if (loginFailCnt >= 10) {
+							$('.captcha').hide();
+							
+							// 비밀번호 10회 이상 틀린 경우 로그인 블락
+							let blockSecs = Number(result.loginFailInfo.blockSecs);
+							if (blockSecs > 0) {
+								$("#blockSecs2").html(blockSecs);
+								fnSetLoginBlockTime();
+								$("#blockSecs1").show();
+								$('#btnLogin').attr('disabled',true);
+							}
+						}
+					}
+
+					return; // 정상적으로 로그인 되지 않았으므로 return
+				}
+				
+				document.location.href = result.returnUrl;
+				
+// 				if (gagajf.isNull(result.returnUrl)) {
+// 					cfnGoToPage(_PAGE_MAIN);
+// 				} else {
+// 					if (result.returnUrl.indexOf(_PAGE_DIRECT_BUY) > -1) {
+// 						// 바로주문
+// 						jfOrderByMember();
+// 					} else if (result.returnUrl.indexOf(_PAGE_CUSTOMER_JOIN) > -1 ||
+// 						result.returnUrl.indexOf(_PAGE_CUSTOMER_ID_FIND) > -1 ||
+// 						result.returnUrl.indexOf(_PAGE_CUSTOMER_PW_FIND) > -1 ||
+// 						result.returnUrl.indexOf(_PAGE_CUSTOMER_JOIN_COMPLETE) > -1) {
+// 						cfnGoToPage(_PAGE_MAIN);
+// 					} else {
+// 						document.location.href = result.returnUrl;
+// 					}
+// 				}
+			}
+			, 'json');
+	});
+	
+	// Save ID
+	$('#chkSaveId').on('click', function() {
+		if ($(this).is(":checked")) {
+			if (!gagajf.isNull($('#loginForm input[name=loginId]').val())) {
+				gagajf.setCookie(ckLoginId, $('#loginForm input[name=loginId]').val(), 1);
+			}
+		} else {
+			if (!gagajf.isNull(gagajf.getCookie(ckLoginId)) && (gagajf.getCookie(ckLoginId) === $('#loginForm input[name=loginId]').val())) {
+				gagajf.setCookie(ckLoginId, $('#loginForm input[name=loginId]').val(), -1);
+			}
+		}
+	});
+	
+	// 캡챠 이미지 로딩
+	let fnReloadCaptchaImage = function() {
+		$('#imgCaptcha').attr('src', '/common/captcha.do?dummy=' + new Date());
+	}
+
+	// SNS 로그인 콜백함수
+	var fnSnsSigninCallback = function(userInfo) {
+		// Ci이 조회 시 없음
+		if (userInfo.custStat === 'DUP_PHONE_CUST') {
+			mcxDialog.alert("이미 사용 중인 휴대전화번호 입니다.");
+			return;
+		}
+		if (userInfo.custStat === 'DUP_EMAIL_CUST') {
+			mcxDialog.alert("이미 사용 중인 이메일 입니다.");
+			return;
+		}
+		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
+		}
+		// Ci이 조회 시 있음
+		if (userInfo.custStat === 'SECEDE_CUST') {
+			mcxDialog.alert("탈퇴 회원 입니다.");
+			return;
+		}
+		if (userInfo.custStat === 'DORMANT_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+		}
+		if (userInfo.custStat === 'FAIL_CUST') {
+			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+			return;
+		}
+		if (userInfo.custStat === 'NEW_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
+		}
+
+
+		if (userInfo.custStat === 'SUCC_CUST') {
+			let params = {};
+			params.snsType = userInfo.snsType;
+			params.snsId = [[${snsLoginPrefix}]] + userInfo.snsId;
+			$.post(_frontUrl + '/login'
+				, $.param(params)
+				, function(result) {
+					fnReloadAfterLogin(result);
+				}
+				, "json");
+		}
+
+
+	};
+
+	var fnReloadAfterLogin = function(result) {
+		if (result.status === 'OK') {
+			document.location.href = result.returnUrl;
+		} else if (result.status === 'EMAIL_DUP') {
+
+		} else if(result.status === 'DORMANT_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+		} else if(result.status === 'SECEDE_CUST') {
+
+		} else {
+			//cfnGoToPage(_PAGE_CUSTOMER_JOIN_CERTIFY_SNS);
+		}
+	};
+
+
+
+	$(document).ready(function() {
+		$('#loginForm input[name=loginId]').val(gagajf.getCookie(ckLoginId));
+		if (gagajf.isNull($('#loginForm input[name=loginId]').val())) {
+			$('#loginForm input[name=loginId]').focus();
+			$('#chkSaveId').prop('checked', false);
+		} else {
+			$('#loginForm input[name=passwd]').focus();
+			$('#chkSaveId').prop('checked', true);
+		}
+	});
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 175 - 0
src/main/webapp/WEB-INF/views/mob/callcenter/GoodsQnaFormMob.html

@@ -0,0 +1,175 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/CallcenterLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : GoodsQnaFormWeb.html
+ * @desc    : 상품문의 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.09   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<main role="" id="" class="container cs">
+		<!-- 고객센터 Gnb -->
+		<nav class="pnb" id="callcenterGnb">
+		</nav>
+		<!-- //고객센터 Gnb -->
+		
+		<!-- ★ 컨텐츠 시작 -->
+		<section class="content cs_product_1">
+			<div class="inner sr-only"><h2 class="title">상품문의</h2></div>
+			<div class="inner wide">
+				<!-- 게시판info -->
+				<ul class="inquiry_box">
+					<li>
+						<p th:text="${qnaCountInfo.totCnt}">999</p>
+						<p>총 문의</p>
+					</li>
+					<li>
+						<p th:text="${qnaCountInfo.ansCnt}">456</p>
+						<p>답변완료</p>
+					</li>
+					<li>
+						<p th:text="${qnaCountInfo.ingCnt}">690</p>
+						<p>처리 중</p>
+					</li>
+				</ul>
+				<!-- //게시판info -->
+			</div>
+			
+			<div class="inner wide">
+				<!-- 폴딩리스트2 -->
+				<div class="ui_row" id="divQna"> <!-- 데이터 없을시 클래스 nodata 추가 -->
+					<div class="foldGroup case2">
+						<!-- list2 -->
+						<ul id="ulQna">
+						</ul>
+						<!-- //list2 -->
+					</div>
+				</div>
+				<div class="ui_foot">
+					<button class="btn btnM btnIcon_more" id="btnQnaMore">더보기</button>
+				</div>
+			</div>
+		</section>
+		<!-- ★ 컨텐츠 종료 -->
+	</main>
+	
+	<form id="qnaForm" name="qnaForm" action="#" th:action="@{'/callcenter/goods/qna/list'}">
+		<input type="hidden" name="pageNo" value ="1"/>
+		<input type="hidden" name="pageSize" value ="10"/>
+	</form>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	$(document).ready(function() {
+		// 타이틀명
+		$('#htopTitle').text('고객센터');
+		
+		// 고객센터 GNB 설정
+		fnSetCallcenterGnb(3);
+		
+		$('#btnQnaMore').trigger('click');
+	});
+
+	// 더보기
+	$('#btnQnaMore').on('click', function() {
+		gagajf.ajaxFormSubmit($('#qnaForm').prop('action'), '#qnaForm', fnGetListCallback);
+	});
+	
+	// QNA 콜백함수
+	var fnGetListCallback = function(result) {
+		$('#ulQna').html('');
+
+		// 목록
+		if (result.dataList != null && result.dataList.length > 0) {
+			$.each(result.dataList, function(idx, item) {
+				let tag = '<li>\n';
+				tag += '	<div class="fold_head">\n';
+				tag += '		<a href="javascript:void(0)">\n';
+				tag += '			<div>\n';
+				tag += '				<div class="fold_tit">\n';
+				tag += '					<div class="lap1">\n';
+				tag += '						<span class="fold_state ' + (item.ansStat == "G060_10" ? "doing" : "done") + '"">' + item.ansStatNm + '</span>\n'; //답변완료 : done / 처리중 : doing
+				tag += '						<span class="prod">' + item.goodsNm + ' ' + item.relGoodsCd + '</span>\n';
+				tag += '					</div>\n';
+				tag += '					<div class="lap2"><span>' + item.questContent + '</span></div>\n';
+				tag += '				</div>\n';
+				tag += '				<span class="data">' + item.questDt + '</span>\n';
+				tag += '			</div>\n';
+				tag += '		</a>\n';
+				tag += '	</div>\n';
+				tag += '	<div class="fold_cont">\n';
+				tag += '		<div class="fold_detail">\n';
+				tag += '			<div>\n';
+				tag += '				<p>' + item.questContent + '</p>\n';
+				tag += '			</div>\n';
+				tag += '		</div>\n';
+				
+				if (item.ansStat == 'G060_20') { // 답변완료일 때
+					tag += '		<div class="fold_answer">\n';
+					tag += '			<div>\n';
+					tag += '				<div class="answer_body">' + item.ansContent + '</div>\n';
+					tag += '				<div class="answer_foot">\n';
+					tag += '					<span class="data">' + item.ansDt + '</span>\n';
+					tag += '					<button type="button" class="btn_delete" onclick="fnDeleteQna(' + item.counselSq + ');"><span>삭제</span></button>\n';
+					tag += '				</div>\n';
+					tag += '			</div>\n';
+					tag += '		</div>\n';
+				}
+				
+				tag += '	</div>\n';
+				tag += '</li>\n';
+			
+				$('#ulQna').append(tag);
+				$('#divQna').removeClass('nodata');
+			});
+		} else {
+			let tag = '<li>내역이 없습니다.</li>\n';
+			$('#ulQna').append(tag);
+			$('#divQna').addClass('nodata');
+		}
+		
+		if (result.paging.pageable.totalPage > result.paging.pageable.pageNo) {
+			$('#btnQnaMore').parent().show();
+			$('#qnaForm input[name=pageNo]').val(result.paging.pageable.pageNo + 1);
+		} else {
+			$('#btnQnaMore').parent().hide();
+		}
+	}
+	
+	// 삭제
+	let fnDeleteQna = function(counselSq) {
+		mcxDialog.confirm("등록된 내용을 삭제하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				let params = new Object();
+				params.counselSq = counselSq;
+				
+				var jsonData = JSON.stringify(params);
+				gagajf.ajaxJsonSubmit('/callcenter/goods/qna/delete'
+						, jsonData
+						, function() {
+							fnGetList();
+						});
+			}
+		});
+	}
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 194 - 5
src/main/webapp/WEB-INF/views/mob/callcenter/OneToOneQnaFormMob.html

@@ -63,14 +63,15 @@
 			</div>
 		</section>
 		<!-- ★ 컨텐츠 종료 -->
+		
+		<div class="cs_contactUs_my_footer">
+			<a href="#none;" class="questionMy"><p>1:1문의</p></a>
+		</div>
 	</main>
 	
-	<div class="cs_contactUs_my_footer">
-		<a href="#none" class="questionMy"><p>1:1문의</p></a>
-	</div>
-	
 	<!-- 모달영역 -->
 	<div>
+		<!-- 문의이미지슬라이드 -->
 		<div class="modal pop_full fade" id="thumb_pic" tabindex="-1" role="dialog" aria-labelledby="exampleFullLabel" aria-hidden="true" style="display: none;">
 			<div class="modal-dialog" role="document">
 				<div class="modal-content">
@@ -93,6 +94,116 @@
 				</div>
 			</div>
 		</div>
+		<!-- //문의이미지슬라이드 -->
+		
+		<!-- 문의등록 -->
+		<div class="modal pop_full fade" id="myQuestion" tabindex="-1" role="dialog" aria-labelledby="exampleFullLabel" aria-hidden="true">
+			<div class="modal-dialog" role="document">
+				<div class="modal-content">
+					<div class="modal-header">
+						<h5 class="modal-title">1:1문의</h5>
+					</div>
+					<div class="modal-body">
+						<div class="pop_cont">
+							<div class="content cs_contactUs_my">
+								<form class="form_wrap" role="form" name="qnaRegisterForm" id="qnaRegisterForm" th:action="@{'/callcenter/onetoone/qna/create'}" method="post" onsubmit="$('#qnaRegisterForm').trigger('click'); return false;">
+									<div class="form_field">
+										<div class="ui_col_12 form_full">
+											<div class="input_wrap">
+												<div class="select">
+													<select class="select_hidden" name="counselClsf">
+														<option value="">(필수) 문의 유형을 선택해 주세요</option>
+														<option th:if="${counselClsfList}" th:each="oneData, status : ${counselClsfList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+													</select>
+													<!-- <div class="select_dress">(필수) 문의 유형을 선택해 주세요<span></span></div> -->
+													<ul class="select_options">
+														<li rel="">(필수) 유형을 선택해 주세요</li>
+														<li th:if="${counselClsfList}" th:each="oneData, status : ${counselClsfList}" th:rel="${oneData.cd}" th:text="${oneData.cdNm}"></li>
+													</ul>
+												</div>
+											</div>
+										</div>
+									</div>
+									<div class="form_field">
+										<div class="ui_col_12 form_full">
+											<div class="input_wrap test">
+												<span class="input_group_addon"><span class="ico"></span></span>
+												<input type="text" class="form_control" placeholder="(필수) 문의 제목을 입력해 주세요" maxlength="30" name="questTitle" required="required" data-valid-name="제목"/>
+											</div>
+											<!-- 숫자, 특수문자, 불완성형 한글 제외하여 입력 -->
+										</div>
+									</div>
+									<div class="form_field">
+										<div class="ui_col_12 form_full">
+											<div class="input_wrap">
+												<textarea class="doc_contactus" name="questContent" cols="30" rows="10" style="resize: none;" placeholder="내용을 입력해 주세요. (500자 이내)" required="required" data-valid-name="내용"></textarea>
+												<p class="txt_cnt">
+													<span id="contactus_cnt" class="contactus_cnt"><em class="c_primary">0</em>/500</span>
+												</p>
+											</div>
+											<!-- 특수문자 : \ / : < >  사용 불가 > 입력 시, “특수문자 \ / : < > 는 사용할 수 없습니다.” 얼럿 호출 스크립트 입력 불가능 -->
+										</div>
+									</div>
+									<div class="form_field">
+										<div class="ui_col_12 form_full">
+											<div class="input_wrap">
+												<!-- 이미지첨부 -->
+												<div class="form_field">
+													<div class="imgUpload">
+														<label for="fileAdd" class="fileAdd">첫번째업로드</label>
+														<input type="file" id="fileAdd" name="file1"/>
+														<input type="hidden" name="file1OrgFileNm"/>
+														<input type="hidden" name="file1SysFileNm"/>
+													</div>
+													<div class="imgUpload">
+														<label for="fileAdds" class="fileAdd">두번째업로드</label>
+														<input type="file" id="fileAdds" name="file2"/>
+														<input type="hidden" name="file2OrgFileNm"/>
+														<input type="hidden" name="file2SysFileNm"/>
+													</div>
+												</div>
+												<!-- //이미지첨부 -->
+												<div class="info_addfile">
+													<ul>
+														<li>사진은 이미지당 10MB 이하의 JPEG, JPG, PNG 파일 2장까지 첨부 가능합니다.</li>
+														<li>파일명에 한글은 사용 불가입니다.</li>
+														<li>첨부된 사진은 문의 외의 목적으로는 사용되지 않습니다.</li>
+													</ul>
+												</div>
+											</div>
+										</div>
+									</div>
+									<div class="form_field">
+										<div class="form_field">
+											<div class="ui_col_12 cellphone">
+												<div class="input_wrap">
+													<span class="tt">알림톡 수신 여부</span>
+													<!-- 알림 신청 체크박스(선택 _ 기본값) -->
+													<div>
+														<div class="ck_box">
+															<input type="radio" name="smsReqYn" id="smsReqYn1" value="Y" checked="checked"/>
+															<label for="smsReqYn1"><span>수신</span></label>
+														</div>
+														<div class="ck_box">
+															<input type="radio" name="smsReqYn" id="smsReqYn2" value="N">
+															<label for="smsReqYn2"><span>미수신</span></label>
+														</div>
+													</div>
+												</div>
+											</div>
+										</div>
+									</div>
+								</form>
+							</div>
+						</div>
+					</div>
+				</div>
+				<div class="cs_contactUs_my_footer">
+					<a href="#none" class="myQuestion" id="btnSaveQna"><p>등록</p></a>
+				</div>
+			</div>
+		</div>
+		<!-- //문의등록 -->
 	</div>
 	<!-- //모달끝 -->
 		
@@ -190,7 +301,7 @@
 					tag += '			<div class="answer_foot">\n';
 					tag += '				<span class="data">' + item.ansDt + '</span>\n';
 					
-					if (item.ansStat == 'G060_20') { // 답변완료일때
+					if (item.ansStat == 'G060_20') { // 답변완료일 
 						tag += '				<button type="button" class="btn_delete" onclick="fnDeleteQna(' + item.counselSq + ');"><span>삭제</span></button>\n';
 					}
 					
@@ -237,6 +348,84 @@
 			}
 		});
 	}
+	
+	// JQUERY를 이용한 버튼 모달 팝업
+	$(".questionMy").click(function() {
+		$("#myQuestion").modal("show");
+	});
+	
+	// text_area
+	$('.doc_contactus').keyup(function (e) {
+		var content = $(this).val();
+		$('#contactus_cnt').html("(<em class='c_primary'>" + content.length + "</em>/500자)");
+		if (content.length > 500) {
+			alert("최대 500자까지 입력 가능합니다.");
+			$(this).val(content.substring(0, 500));
+			$('#contactus_cnt').html("(<em class='c_primary'>500</em>/500자)");
+		}
+	});
+	
+	// 파일첨부 선택 시
+	$('#fileAdd').on('change', function() { fnChooseFile(this); });
+	$('#fileAdds').on('change', function() { fnChooseFile(this); });
+	
+	var fnChooseFile = function(obj) {
+		// multiple 속성이 있으면 files에는 다수의 객체가 할당됨
+		var file = obj.files[0];
+		
+		if (!gagajf.isNull(file.name)) {
+			var extension = "\.(jpg|jpeg|png)$";
+			if (!(new RegExp(extension, "i")).test(file.name)) {
+				mcxDialog.alertC('이미지는 [jpg, jpeg, png] 파일만 가능합니다.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$(obj).parent('.imgUpload').find('.removes').trigger('click');
+					}
+				});
+				return false;
+			}
+		}
+		
+		if (!gagajf.isNull(file.size) && Number(file.size) > 20 * 1000000) {
+			mcxDialog.alertC('이미지는 최대 20MB 이하 파일만 가능합니다.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$(obj).parent('.imgUpload').find('.removes').trigger('click');
+				}
+			});
+			return false;
+		}
+		
+		// 파일 업로드
+		gagajf.ajaxFileUpload('/common/file/upload?subDir=/counsel'
+				, file
+				, function(result) {
+					// 업로드한 파일명 설정
+					$('input[name=' + obj.name + 'OrgFileNm]').val(result.oldFileName);
+					$('input[name=' + obj.name + 'SysFileNm]').val(result.newFileName);
+				}
+		);
+	}
+	
+	// 저장
+	$('#btnSaveQna').on('click', function() {
+		// 입력 값 체크
+		if (!gagajf.validation('#qnaRegisterForm'))
+			return false;
+
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxFormSubmit($('#qnaRegisterForm').prop('action')
+						, '#qnaRegisterForm'
+						, function() {
+							cfnGoToPage(_PAGE_ONETOONE_QNA);
+						}
+				);
+			}
+		});
+	});
 /*]]>*/
 </script>
 

+ 219 - 0
src/main/webapp/WEB-INF/views/mob/callcenter/OneToOneQnaRegisterFormMob.html

@@ -0,0 +1,219 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/CallcenterLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : OneToOneQnaRegisterFormMob.html
+ * @desc    : 1:1문의 등록 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.09   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<!-- 모달영역 -->
+	<div>
+		<!-- 모달1 -->
+		<div class="modal pop_full fade" id="myQuestion" tabindex="-1" role="dialog" aria-labelledby="exampleFullLabel" aria-hidden="true">
+			<div class="modal-dialog" role="document">
+				<div class="modal-content">
+					<div class="modal-header">
+						<h5 class="modal-title">1:1문의</h5>
+					</div>
+					<div class="modal-body">
+						<div class="pop_cont">
+							<div class="content cs_contactUs_my">
+								<form class="form_wrap" role="form" name="qnaForm" id="qnaForm" th:action="@{'/callcenter/onetoone/qna/create'}" method="post">
+									<div class="form_field">
+										<div class="ui_col_12 form_full">
+											<div class="input_wrap">
+												<div class="select">
+													<select class="select_hidden" name="counselClsf" required="required" data-valid-name="문의유형">
+														<option value="">(필수) 문의 유형을 선택해 주세요</option>
+														<option th:if="${counselClsfList}" th:each="oneData, status : ${counselClsfList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+													</select>
+													<!-- <div class="select_dress">(필수) 문의 유형을 선택해 주세요<span></span></div> -->
+													<ul class="select_options">
+														<li rel="">(필수) 유형을 선택해 주세요</li>
+														<li th:if="${counselClsfList}" th:each="oneData, status : ${counselClsfList}" th:rel="${oneData.cd}" th:text="${oneData.cdNm}"></li>
+													</ul>
+												</div>
+											</div>
+										</div>
+									</div>
+									<div class="form_field">
+										<div class="ui_col_12 form_full">
+											<div class="input_wrap test">
+												<span class="input_group_addon"><span class="ico"></span></span>
+												<input type="text" class="form_control" placeholder="(필수) 문의 제목을 입력해 주세요" maxlength="30" name="questTitle" required="required" data-valid-name="제목"/>
+											</div>
+											<!-- 숫자, 특수문자, 불완성형 한글 제외하여 입력 -->
+										</div>
+									</div>
+									<div class="form_field">
+										<div class="ui_col_12 form_full">
+											<div class="input_wrap">
+												<textarea class="doc_contactus" name="questContent" cols="30" rows="10" style="resize: none;" placeholder="내용을 입력해 주세요. (500자 이내)" required="required" data-valid-name="내용"></textarea>
+												<p class="txt_cnt">
+													<span id="contactus_cnt" class="contactus_cnt"><em class="c_primary">0</em>/500</span>
+												</p>
+											</div>
+											<!-- 특수문자 : \ / : < >  사용 불가 > 입력 시, “특수문자 \ / : < > 는 사용할 수 없습니다.” 얼럿 호출 스크립트 입력 불가능 -->
+										</div>
+									</div>
+									<div class="form_field">
+										<div class="ui_col_12 form_full">
+											<div class="input_wrap">
+												<!-- 이미지첨부 -->
+												<div class="form_field">
+													<div class="imgUpload">
+														<label for="fileAdd" class="fileAdd">첫번째업로드</label>
+														<input type="file" id="fileAdd" name="file1"/>
+														<input type="hidden" name="file1OrgFileNm"/>
+														<input type="hidden" name="file1SysFileNm"/>
+													</div>
+													<div class="imgUpload">
+														<label for="fileAdds" class="fileAdd">두번째업로드</label>
+														<input type="file" id="fileAdds" name="file2"/>
+														<input type="hidden" name="file2OrgFileNm"/>
+														<input type="hidden" name="file2SysFileNm"/>
+													</div>
+												</div>
+												<!-- //이미지첨부 -->
+												<div class="info_addfile">
+													<ul>
+														<li>사진은 이미지당 10MB 이하의 JPEG, JPG, PNG 파일 2장까지 첨부 가능합니다.</li>
+														<li>파일명에 한글은 사용 불가입니다.</li>
+														<li>첨부된 사진은 문의 외의 목적으로는 사용되지 않습니다.</li>
+													</ul>
+												</div>
+											</div>
+										</div>
+									</div>
+									<div class="form_field">
+										<div class="form_field">
+											<div class="ui_col_12 cellphone">
+												<div class="input_wrap">
+													<span class="tt">알림톡 수신 여부</span>
+													<!-- 알림 신청 체크박스(선택 _ 기본값) -->
+													<div>
+														<div class="ck_box">
+															<input type="radio" name="smsReqYn" id="smsReqYn1" value="Y" checked="checked"/>
+															<label for="smsReqYn1"><span>수신</span></label>
+														</div>
+														<div class="ck_box">
+															<input type="radio" name="smsReqYn" id="smsReqYn2" value="N">
+															<label for="smsReqYn2"><span>미수신</span></label>
+														</div>
+													</div>
+												</div>
+											</div>
+										</div>
+									</div>
+								</form>
+							</div>
+						</div>
+					</div>
+				</div>
+				<div class="cs_contactUs_my_footer">
+					<a href="#none" class="myQuestion" id="btnSaveQna"><p>등록</p></a>
+				</div>
+			</div>
+		</div>
+		<!-- //모달1 -->
+	</div>
+	<!-- //모달끝 -->
+	
+<script th:inline="javascript">
+/*<![CDATA[*/
+	$(document).ready(function() {
+		
+	});
+	
+	// text_area
+	$('.doc_contactus').keyup(function (e) {
+		var content = $(this).val();
+		$('#contactus_cnt').html("(<em class='c_primary'>" + content.length + "</em>/500자)");
+		if (content.length > 500) {
+			alert("최대 500자까지 입력 가능합니다.");
+			$(this).val(content.substring(0, 500));
+			$('#contactus_cnt').html("(<em class='c_primary'>500</em>/500자)");
+		}
+	});
+	
+	// 파일첨부 선택 시
+	$('#fileAdd').on('change', function() { fnChooseFile(this); });
+	$('#fileAdds').on('change', function() { fnChooseFile(this); });
+	
+	var fnChooseFile = function(obj) {
+		// multiple 속성이 있으면 files에는 다수의 객체가 할당됨
+		var file = obj.files[0];
+		
+		if (!gagajf.isNull(file.name)) {
+			var extension = "\.(jpg|jpeg|png)$";
+			if (!(new RegExp(extension, "i")).test(file.name)) {
+				mcxDialog.alertC('이미지는 [jpg, jpeg, png] 파일만 가능합니다.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$(obj).parent('.imgUpload').find('.removes').trigger('click');
+					}
+				});
+				return false;
+			}
+		}
+		
+		if (!gagajf.isNull(file.size) && Number(file.size) > 20 * 1000000) {
+			mcxDialog.alertC('이미지는 최대 20MB 이하 파일만 가능합니다.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$(obj).parent('.imgUpload').find('.removes').trigger('click');
+				}
+			});
+			return false;
+		}
+		
+		// 파일 업로드
+		gagajf.ajaxFileUpload('/common/file/upload?subDir=/counsel'
+				, file
+				, function(result) {
+					// 업로드한 파일명 설정
+					$('input[name=' + obj.name + 'OrgFileNm]').val(result.oldFileName);
+					$('input[name=' + obj.name + 'SysFileNm]').val(result.newFileName);
+				}
+		);
+	}
+	
+	// 저장
+	$('#btnSaveQna').on('click', function() {
+		// 입력 값 체크
+		if (!gagajf.validation('#qnaForm'))
+			return false;
+
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxFormSubmit($('#qnaForm').prop('action')
+						, '#qnaForm'
+						, function() {
+							cfnGoToPage(_PAGE_ONETOONE_QNA);
+						}
+				);
+			}
+		});
+	});
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 59 - 44
src/main/webapp/WEB-INF/views/mob/common/fragments/FooterMob.html

@@ -2,53 +2,68 @@
 <html lang="ko"
 	xmlns:th="http://www.thymeleaf.org">
 
-<footer id="footer" th:fragment="footer">
-
-	<button class="btn_top" title="페이지 맨위로 이동">
-		<span>
-			<i class="gl1"></i>
-			<i class="gl2"></i>
-			<i class="gl3"></i>
-		</span>
-	</button>
-	<section class="f1">
-		<div class="inner">
-			<ul class="link wider">
-				<li><a href="#none">고객센터</a></li>
-				<li><a href="#none">이용약관</a></li>
-				<li><a href="#none">개인정보취급방침</a></li>
-			</ul>
+<th:block th:fragment="footer">
+	<nav id="tabbar" class="tabbar fixed">
+	<!-- <nav id="tabbar" class="tabbar"> -->
+		<div class="tabbar-inner">
+			<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);" class="btn-home">Home</a>
+			<a href="javascript:history;" class="btn-history">History</a>
+			<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_WISHLIST);" class="btn-wish">Wish</a>
+			<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MYPAGE);" class="btn-my">Mypage</a>
+			<a href="javascript:menu;" class="btn-menu" data-popup-trigger="" data-target="#menu">Menu</a>
+		</div>
+			<!-- 
+				<span class="txt-balloon" id="tutorial_mycloset" style=""> 툴팁예제</span>
+			-->
+	</nav>
 
-			<div class="collapse">
-				<div class="btnWrap">
-					<button class="btn_infos">아이스타일이십사 주식회사</button>
+	<footer>
+		<button class="btn_top" title="페이지 맨위로 이동">
+			<span>
+				<i class="gl1"></i>
+				<i class="gl2"></i>
+				<i class="gl3"></i>
+			</span>
+		</button>
+		<section class="f1">
+			<div class="inner">
+				<ul class="link wider">
+					<li><a href="#none">고객센터</a></li>
+					<li><a href="#none">이용약관</a></li>
+					<li><a href="#none">개인정보취급방침</a></li>
+				</ul>
+	
+				<div class="collapse">
+					<div class="btnWrap">
+						<button class="btn_infos">아이스타일이십사 주식회사</button>
+					</div>
+					<ul class="infos info">
+						<li class="fn">대표이사 : 윤종선</li>
+						<li class="fn">주소 : 서울시 영등포구 은행로 11, 8층(여의도동, 일신빌딩)</li>
+						<li class="fn">사업자등록번호 : 116-81-32499 </li>
+						<li class="fn">개인정보관리책임자 : 이정득 </li>
+						<li class="fn">통신판매업신고번호 : 제 2020-서울영등포1432</li>
+						<li class="fn">개인정보보호책임자 : 김명인</li>
+						<li class="fn">호스팅 서비스 : 아이스타일이십사㈜</li>
+					</ul>
 				</div>
-				<ul class="infos info">
-					<li class="fn">대표이사 : 윤종선</li>
-					<li class="fn">주소 : 서울시 영등포구 은행로 11, 8층(여의도동, 일신빌딩)</li>
-					<li class="fn">사업자등록번호 : 116-81-32499 </li>
-					<li class="fn">개인정보관리책임자 : 이정득 </li>
-					<li class="fn">통신판매업신고번호 : 제 2020-서울영등포1432</li>
-					<li class="fn">개인정보보호책임자 : 김명인</li>
-					<li class="fn">호스팅 서비스 : 아이스타일이십사㈜</li>
+				
+				<ul class="link">
+					<li><a href="#none">사업자정보확인</a></li>
+					<li><a href="#none">PC버전</a></li>
+					<li><a href="#none">APP 다운로드</a></li>
+					<li><a href="#none">SN&#64;PP</a></li>
+				</ul>
+				<ul class="copy">
+					<li>COPYRIGHTⓒ2020 STYLE24 ALL RIGHTS RESERVED.</li>
+				</ul>
+				<ul class="sns">
+					<li><a href="#none" class="insta">Instagram</a></li>
+					<li><a href="#none" class="facebook">facebook</a></li>
 				</ul>
 			</div>
-			
-			<ul class="link">
-				<li><a href="#none">사업자정보확인</a></li>
-				<li><a href="#none">PC버전</a></li>
-				<li><a href="#none">APP 다운로드</a></li>
-				<li><a href="#none">SN&#64;PP</a></li>
-			</ul>
-			<ul class="copy">
-				<li>COPYRIGHTⓒ2020 STYLE24 ALL RIGHTS RESERVED.</li>
-			</ul>
-			<ul class="sns">
-				<li><a href="#none" class="insta">Instagram</a></li>
-				<li><a href="#none" class="facebook">facebook</a></li>
-			</ul>
-		</div>
-	</section>
+		</section>
+	</footer>
 
 <script th:inline="javascript">
 /*<![CDATA[*/
@@ -57,6 +72,6 @@
 /*]]>*/
 </script>
 
-</footer>
+</th:block>
 
 </html>

+ 1 - 1
src/main/webapp/WEB-INF/views/mob/common/layout/CallcenterLayoutMob.html

@@ -19,7 +19,7 @@
 		<!-- // CONTENT AREA -->
 
 		<!-- Footer -->
-		<footer id="footer" th:replace="~{mob/common/fragments/FooterMob :: footer}"></footer>
+		<th:block th:replace="~{mob/common/fragments/FooterMob :: footer}"></th:block>
 
 		<th:block th:replace="~{mob/common/fragments/ScriptsMob :: scripts}"></th:block>
 		<!-- <th:block th:replace="~{mob/common/fragments/MarketingScripts :: mscripts}"></th:block> -->

+ 38 - 0
src/main/webapp/WEB-INF/views/mob/common/layout/DefaultLayoutMob.html

@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
+
+<head th:replace="~{mob/common/fragments/HeadMob :: head}"></head>
+
+<body>
+
+	<th:block th:replace="~{mob/common/fragments/VariablesMob :: variables}"></th:block>
+	
+	<div class="app">
+		<!-- GNB -->
+		<th:block th:replace="~{mob/common/fragments/GnbMob :: gnb}"></th:block>
+		<!--// GNB -->
+		
+		<!-- CONTENT AREA -->
+		<th:block layout:fragment="content"></th:block>
+		<!-- // CONTENT AREA -->
+
+		<!-- Footer -->
+		<th:block th:replace="~{mob/common/fragments/FooterMob :: footer}"></th:block>
+
+		<th:block th:replace="~{mob/common/fragments/ScriptsMob :: scripts}"></th:block>
+		<!-- <th:block th:replace="~{mob/common/fragments/MarketingScripts :: mscripts}"></th:block> -->
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	$(document).ready(function() {
+		
+	});
+/*]]>*/
+</script>
+
+	</div>
+	
+</body>
+</html>

+ 37 - 0
src/main/webapp/WEB-INF/views/mob/display/MallMainFormMob.html

@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/DefaultLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : MallMainFormMob.html
+ * @desc    : 몰메인 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.10   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+
+	<h1>Mall Main ...............</h1>
+	
+<script th:inline="javascript">
+/*<![CDATA[*/
+	// 컨텐츠 호출
+	$(document).ready(function() {
+		
+	});
+/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>

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

@@ -63,7 +63,7 @@
 								</li>
 								<li class="captcha_area">
 									<label for="captcha" id="label_captcha_area">보안문자 입력</label>
-									<input type="text" id="captcha" name="captcha" title="문자입력">
+									<input type="text" id="captcha" name="captcha" title="문자입력"/>
 								</li>
 							</ul>
 						</div>
@@ -106,8 +106,8 @@
 								</a>
 							</li>
 							<li>
-								<a href="javascript:void(0)">
-									<i class="ico ico_snslogin yes24" onclick="cfnLoginYes24();"></i>
+								<a href="javascript:void(0)" onclick="cfnLoginYes24();">
+									<i class="ico ico_snslogin yes24"></i>
 									<span>YES24로 시작하기</span>
 								</a>
 							</li>

+ 2 - 1
src/main/webapp/WEB-INF/views/web/callcenter/GoodsQnaFormWeb.html

@@ -132,7 +132,7 @@
 				tag += '				<p>' + item.questContent + '</p>\n';
 				tag += '			</div>\n';
 				
-				if (item.ansStat == 'G060_10') { // 처리중일
+				if (item.ansStat == 'G060_20') { // 답변완료일 
 					tag += '			<button type="button" class="btn btn_default btn_del" onclick="fnDeleteQna(' + item.counselSq + ');"><span><i class="ico ico_trash"></i>삭제</span></button>\n';
 				}
 				
@@ -150,6 +150,7 @@
 				tag += '</li>\n';
 				
 				$('#ulQna').append(tag);
+				$('#divQna').removeClass('nodata');
 			});
 		} else {
 			let tag = '<li>내역이 없습니다.</li>\n';

+ 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}" />

+ 357 - 0
src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html

@@ -0,0 +1,357 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : PlanningDetailFormWeb.html
+ * @desc    : 기획전메인 Page
+ *============================================================================
+ * Pastelmall
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.3.9     sowon     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+	<!--  container -->
+	<div id="container" class="container dp">
+		<div class="breadcrumb"> 
+			<ul>
+               <li class="bread_home"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);">홈</a></li>
+				<li class="bread_2depth"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);">기획전</a></li>
+				<li class="bread_2depth">[[${planInfo.planNm}]]</li>
+			</ul> 
+		</div>
+		<div class="wrap">
+            <div class="content wide"> <!-- 풀사이즈 -->
+                <div class="cont_head">
+					<div>
+                        <h3>[[${planInfo.planNm}]]</h3>
+                        <div>
+                            <a href="javascript:void(0)">sns share</a>
+                        </div>
+                    </div>
+                </div>
+                <div class="cont_body">
+                    <div class="coner_content">
+                        <div class="coner_front">
+                            <div class="big_banner"></div> <!-- 상단배너 -->
+                        </div>
+                        <div class="coner_item01">
+                            <div class="dp_listItems_wrap"> <!-- 추천아이템 -->
+                                <div>
+                                    <a href="javascript:void(0)">겨울 아우터 추천템</a>
+                                </div>
+                                <div class="dp_listItems_cont">
+                                    <ul>
+                                        <li>
+                                            <div class="dp_listItems">
+                                                <div class="dp_listItems_img">
+                                                    <img src="/images/pc/thumb/dp_item01.jpg" alt="">
+                                                </div>
+                                                <div class="dp_listItems_info">
+                                                    <div class="dp_listItems_brand">BUCKAROO</div>
+                                                    <div class="dp_listItems_name">여성 유니 하이넥 벨트 빈티지 숏 기장 무스탕<br>(B204Z5010P)</div>
+                                                    <div class="dp_listItems_price">
+                                                        <span class="price">79,900</span>
+                                                        <del>98,000</del>
+                                                        <span class="percent">10%</span>
+                                                    </div>
+                                                    <div class="ui_row">
+                                                        <button type="button" class="btn btn_default"><span>VIEW MORE</span></button>
+                                                    </div>
+                                                </div>
+                                            </div>
+                                        </li>
+                                        <li>
+                                            <div class="dp_listItems">
+                                                <div class="dp_listItems_img">
+                                                    <img src="/images/pc/thumb/dp_item02.jpg" alt="">
+                                                </div>
+                                                <div class="dp_listItems_info">
+                                                    <div class="dp_listItems_brand">NBA</div>
+                                                    <div class="dp_listItems_name">남성 유니 와플 패턴 코듀로이 숏기장 다운점퍼<br>(B204DW040P)</div>
+                                                    <div class="dp_listItems_price">
+                                                        <span class="price">79,900</span>
+                                                        <del>98,000</del>
+                                                        <span class="percent">10%</span>
+                                                    </div>
+                                                    <div class="ui_row">
+                                                        <button type="button" class="btn btn_default"><span>VIEW MORE</span></button>
+                                                    </div>
+                                                </div>
+                                            </div>
+                                        </li>
+                                        <div class="ui_row">
+                                            <button type="button" class="btn btn_default"><span>더 많은 상품보기</span></button>
+                                        </div>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="coner_item02">
+                            <div class="dp_coupon_wrap">
+                                <div>
+                                    <p>TBJ 시즌오프 기간한정 20% 할인쿠폰</p>
+                                </div>
+                                <div class="dp_coupon_list">
+                                    <div class="dp_coupon_item">
+                                        <div class="dp_coupon">
+                                            <p>멤버십 10%할인쿠폰</p>
+                                            <p>10%</p>
+                                            <button></button>
+                                        </div>
+                                        <div>
+                                            <a href="javascript:void(0)" id="coupon_pop">사용안내</a>
+                                        </div>
+                                    </div>
+                                    <div class="dp_coupon_item">
+                                        <div class="dp_coupon">
+                                            <p>멤버십 10%할인쿠폰멤버십 10%할인쿠폰멤버십 10%할인쿠폰</p>
+                                            <p>10%</p>
+                                            <button></button>
+                                        </div>
+                                        <div>
+                                            <a href="javascript:void(0)" id="coupon_pop2">사용안내</a>
+                                        </div>
+                                    </div>
+                                    <div class="dp_coupon_item">
+                                        <div class="dp_coupon">
+                                            <p>멤버십 10%할인쿠폰멤버십 10%할인쿠폰멤버십 10%할인쿠폰</p>
+                                            <p>10%</p>
+                                            <button></button>
+                                        </div>
+                                        <div>
+                                            <a href="javascript:void(0)" id="coupon_pop">사용안내</a>
+                                        </div>
+                                    </div>
+                                    <div class="dp_coupon_item">
+                                        <div class="dp_coupon">
+                                            <p>멤버십 10%할인쿠폰멤버십 10%할인쿠폰멤버십 10%할인쿠폰</p>
+                                            <p>10%</p>
+                                            <button></button>
+                                        </div>
+                                        <div>
+                                            <a href="javascript:void(0)" id="coupon_pop">사용안내</a>
+                                        </div>
+                                    </div>
+                                    <div class="dp_coupon_item">
+                                        <div class="dp_coupon">
+                                            <p>멤버십 10%할인쿠폰멤버십 10%할인쿠폰멤버십 10%할인쿠폰</p>
+                                            <p>10%</p>
+                                            <button></button>
+                                        </div>
+                                        <div>
+                                            <a href="javascript:void(0)" id="coupon_pop">사용안내</a>
+                                        </div>
+                                    </div>
+                                    <div class="dp_coupon_item">
+                                        <div class="dp_coupon">
+                                            <p>멤버십 10%할인쿠폰멤버십 10%할인쿠폰멤버십 10%할인쿠폰</p>
+                                            <p>10%</p>
+                                            <button></button>
+                                        </div>
+                                        <div>
+                                            <a href="javascript:void(0)" id="coupon_pop">사용안내</a>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="dp_coupon_tip">
+                                    <div class="dp_coupon_notice">
+                                    </div>
+                                    <ul>
+                                        <li>쿠폰 발급 기간 : 2020.09 ~ 2020.10.05</li>
+                                        <li>쿠폰 사용 기간 : 2020.09 ~ 2020.10.05이며, 이후 자동 소멸됩니다.</li>
+                                        <li>본 쿠폰은 해당 기획전 상품에만 적용 가능합니다.</li>
+                                        <li>본 쿠폰은 해당 기획전 다운로드 버튼을 통해 발급받으실 수 있습니다.</li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div>
+                        
+                        
+                        <div class="coner_visual">
+                            <div class="dp_banner_slide"> 
+                                <div class="post-wrapper dp_lookbook_case1"> <!-- 슬라이드case1 -->
+                                   <div class="post"><img src="/images/pc/thumb/dp_slide_banner1.png"></div>
+                                   <div class="post"><img src="/images/pc/thumb/dp_slide_banner1.png"></div>
+                                   <div class="post"><img src="/images/pc/thumb/dp_slide_banner1.png"></div>
+                                   <div class="post"><img src="/images/pc/thumb/dp_slide_banner1.png"></div>
+                                </div>
+                             </div>
+                        </div>
+                    </div>
+                </div>
+            </div> <!-- //풀사이즈 -->
+			<div class="content">
+				<div class="cont_head">
+                    <div class="bullet_sticky_nav">
+                        <ul>    
+                            <li><a href="#23">모이몰른</a></li> <!-- 섹션이동 -->
+                        </ul>
+                    </div>
+                    <div class="item_header">
+                        <h3>겨울 아우터 재입고</h3>
+                    </div>
+				</div>
+				<div class="cont_body">
+                    <div class="list_content">
+                        <div class="list_defult">
+                            <div>
+                                <p>등록된 기획전이 없습니다.</p>
+                            </div>
+                            <div class="ui_row">
+                                <button type="button" class="btn btn_default btn_md"><span>메인으로 가기</span></button>
+                            </div>
+                        </div>
+                        <div class="itemsGrp"> <!-- itemsGrp rank hot deal -->
+                            <div class=" item_prod"> <!-- item_prod ranker d_detail -->
+                                <div class="item_state"> <!-- item_state AD soldout -->
+                                    <a href="#none" class="itemLink">
+                                        <div class="itemPic">
+                                            <img alt="BLUE-a" class=" vLHTC pd_img" src="/images/pc/thumb/prod1.jpg">
+                                            <button type="button" class="itemLike active">관심상품 추가</button>
+                                        </div>
+                                        <p class="itemBrand">BRAND NAME</p>
+
+                                        <div class=" itemName">남성 헤링본 기모 팬츠 헤링본 기모 팬츠</div>
+                                        <p class="itemPrice">488,000<!-- -->원</p>
+                                        <p class="itemBadge">
+                                            <span class="badge13">베스트 </span>
+                                        </p>
+                                        <div class="itemcolorchip">
+                                            <span class="chip_color35" value="ABM">BEIGE</span>
+                                            <span class="chip_color54" value="BDS">BLACK</span>
+                                            <span class="chip_color40" value="YBR">WHITE</span>
+                                        </div>
+                                        <div class="itemComment">#주문 폭주 상품</div>
+                                    </a>
+                                </div>
+                            </div>
+                           
+                        </div>
+
+                        <div class="foot_banner_slide"> 
+                            <div>
+                                <p>다른 기획전 보기</p>
+                                <a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);">전체보기</a>
+                            </div>
+                            <div class="dp_banner_slide">
+                                <div class="post-wrapper dp_lookbook_case3"> <!-- 슬라이드case3 -->
+                                   <th:block th:each="PlanData, PlanStat : ${planList}">  
+                                    <div class="post">     
+                                              
+                                        <a href="#none" class="dp_lookbook_item" th:onclick="cfnGoToPage(_PAGE_PLANNING_DETAIL + '?planSq=' + [[${PlanData.planSq}]]);">
+                                            <div>
+                                                <img th:src="${@environment.getProperty('domain.image')+'/planning/'+PlanData.mainPimg}" style="width: 100%;" alt="">
+                                            </div>
+                                            <div>
+                                            <th:block th:if="${PlanData.cnt > 1}">
+                                            <p class="itemBrand">[[${PlanData.brand}]] 외</p>
+                                            </th:block>
+                                            <th:block th:if="${PlanData.cnt <= 1}">
+                                            <p class="itemBrand">[[${PlanData.brand}]]</p>
+                                            </th:block>
+                                             <div class="itemName">[[${PlanData.planNm}]]</div>
+                                            </div>
+                                        </a>
+                                    </div>
+                                    </th:block>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+		    </div>
+        </div>
+    </div>   	
+
+<script th:inline="javascript">
+$(document).ready(function() {
+	var error = [[${error}]];
+	console.log("====" + error);
+	
+	if(error!= null){
+		mcxDialog.alert(error);
+	}
+});
+</script>
+<script>
+// header scroll
+$(function(){
+	$(window).scroll(function(){
+		var scroll = $(this).scrollTop();
+		var headerH = $(".header").height();
+		if ($(window).scrollTop() > headerH){
+			$(".header").addClass("minify");
+			return false;
+		}
+		else {
+			$(".header").removeClass("minify");
+			return false;
+		}
+	});
+});
+  </script>
+<script>
+    $(document).ready( function() {
+        $(window).scroll(function(){
+            var navOffset = $('.item_header').offset().top - $('.bullet_sticky_nav').height();
+            var windScroll = $(window).scrollTop();
+            if (windScroll > navOffset){
+                $(".bullet_sticky_nav").addClass("sticky");
+            }
+            else {
+                $(".bullet_sticky_nav").removeClass("sticky");
+            }
+            $("#shiping_pop").click(function() {
+                $("#Bulletship_modal").modal("show");
+            });	
+        });
+    });
+</script>
+<script>
+    $(function(){
+        $('.dp_lookbook_case1').slick({
+            dots: true,
+            infinite: true,
+            speed: 300,
+            slidesToShow: 1,
+            adaptiveHeight: true
+        });
+        $('.dp_lookbook_case2').slick({
+            dots: true,
+            infinite: true,
+            speed: 300,
+            slidesToShow: 2,
+            slidesToScroll: 1,
+            adaptiveHeight: true,
+            variableWidth:true
+        });
+        $('.dp_lookbook_case3').slick({
+            dots: false,
+            infinite: true,
+            speed: 300,
+            slidesToShow: 5,
+            slidesToScroll: 1,
+            adaptiveHeight: true
+        });
+        $('.dp_lookbook_case4').slick({
+            dots: true,
+            infinite: true,
+            speed: 300,
+            slidesToShow: 1,
+            adaptiveHeight: true
+        });
+    });
+</script>
+</th:block>
+
+</body>
+</html>

+ 77 - 81
src/main/webapp/WEB-INF/views/web/planning/PlanningEventMainFormWeb.html

@@ -18,20 +18,18 @@
  -->
  <body>
 <th:block layout:fragment="content">
-	<!--  container -->
+<!--  container -->
 	<div id="container" class="container ev">
 		<div class="breadcrumb">
 			<ul>
-				<li class="bread_home"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);">홈</a></li>
+				<li class="bread_home"><a href="index.html">홈</a></li>
 				<li class="bread_2depth">이벤트/혜택</li>
 			</ul>
 		</div>
 		<div class="wrap">
-			<div class="content ev_list">
+			<div class="content ev_list"> <!-- 페이지특정 클래스 = ev_list -->
 				<div class="cont_head">
-					<div>
-						<h3>이벤트</h3>
-					</div>
+                    <h2 class="displayH t_c">이벤트</h2>
 				</div>
 				<div class="cont_body">
 					<div class="ev_mem_rank">
@@ -65,145 +63,143 @@
 							</ul>
 						</div>
 					</div>
-					<th:block th:if="${cnt > 0}">
-					<div class="event_list">
-					</th:block>
-					<th:block th:unless="${cnt > 0}">
-					<div class="event_list no_data">
-					</th:block>
-						<div class="event_top">
-							<div class="count">
-								<span>[[${cnt}]]</span>개의 이벤트
-							</div>
-							<div class="event_btn">
-								<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_NOTICE);">당첨자 발표</a>
-							</div>
+					<div class="area_top_list_info">
+						<div class="total_count">
+							<span>9999</span>개의 이벤트
 						</div>
-						<div class="list">
-							
-							<ul class="clear event_con">
+						<div class="ui_right">
+							<button class="btn btn_default"><span>당첨자 발표</span></button>
+						</div>
+					</div>
+					<div class="area_thumb_list">
+						<div class="thumb_list">
+							<ul>
 								<li>
 									<a href="">
-										<div class="ev_img">
-											<div class="rank ranker"><span>NEW</span></div>
-											<img src="/images/pc/thumb/ev_list_img01.jpg" alt="ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션">
+										<div class="rank ranker"><span>NEW</span></div>
+										<div class="thumb">
+											<img src="/images/pc/thumb/ev_list_img01.jpg" alt="">
 										</div>
 										<div class="txt">
-											<p class="tit">ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션</p>
-											<div class="date">
+											<p class="title">ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션</p>
+											<p class="date">
 												<span>2020.12.17</span> - <span>2021.01.03</span>
-											</div>
+											</p>
 										</div>
 									</a>
 								</li>
 								<li>
 									<a href="">
-									<div class="ev_img">
-										<div class="rank ranker"><span>NEW</span></div><img src="/images/pc/thumb/ev_list_img02.jpg" alt="단 48시간, 퓨어캐시미어 최대 80%세일 PURE CASHMERE 48H POP-UP">
-									</div>
-									<div class="txt">
-										<p class="tit">단 48시간, 퓨어캐시미어 최대 80%세일 PURE CASHMERE 48H POP-UP 단 48시간, 퓨어캐시미어 최대 80%세일 PURE CASHMERE 48H POP-UP</p>
-										<div class="date">
-											<span>2020.12.17</span> - <span>2021.01.03</span>
-										</div>
-									</div>
-								</a>
+										<div class="thumb">
+											<img src="/images/pc/thumb/ev_list_img02.jpg" alt="">
+										</div>
+										<div class="txt">
+											<p class="title">단 48시간, 퓨어캐시미어 최대 80%세일 PURE CASHMERE 48H POP-UP 단 48시간, 퓨어캐시미어 최대 80%세일 PURE CASHMERE 48H POP-UP</p>
+											<p class="date">
+												<span>2020.12.17</span> - <span>2021.01.03</span>
+											</p>
+										</div>
+									</a>
 								</li>
 								<li>
 									<a href="">
-										<div class="ev_img">
-											<img src="/images/pc/thumb/ev_list_img03.jpg" alt="ANDEW white 20winter">
+										<div class="thumb">
+											<img src="/images/pc/thumb/ev_list_img03.jpg" alt="">
 										</div>
 										<div class="txt">
-											<p class="tit">ANDEW white 20winter</p>
-											<div class="date">
+											<p class="title">ANDEW white 20winter</p>
+											<p class="date">
 												<span>2020.12.17</span> - <span>2021.01.03</span>
-											</div>
+											</p>
 										</div>
 									</a>
 								</li>
 								<li>
 									<a href="">
-										<div class="ev_img">
-											<img src="/images/pc/thumb/ev_list_img04.jpg" alt="자연스럽고 편안한  Earth Colors">
+										<div class="thumb">
+											<img src="/images/pc/thumb/ev_list_img04.jpg" alt="">
 										</div>
 										<div class="txt">
-											<p class="tit">자연스럽고 편안한  Earth Colors</p>
-											<div class="date">
+											<p class="title">자연스럽고 편안한  Earth Colors</p>
+											<p class="date">
 												<span>2020.12.17</span> - <span>2021.01.03</span>
-											</div>
+											</p>
 										</div>
 									</a>
 								</li>
 								<li>
 									<a href="">
-										<div class="ev_img">
-											<img src="/images/pc/thumb/ev_list_img05.jpg" alt="RETRO CONTEMPORARY 3개 브랜드 BUCKAROO/NBA/ANDEW">
+										<div class="thumb">
+											<img src="/images/pc/thumb/ev_list_img05.jpg" alt="">
 										</div>
 										<div class="txt">
-											<p class="tit">RETRO CONTEMPORARY 3개 브랜드 BUCKAROO/NBA/ANDEW</p>
-											<div class="date">
+											<p class="title">RETRO CONTEMPORARY 3개 브랜드 BUCKAROO/NBA/ANDEW</p>
+											<p class="date">
 												<span>2020.12.17</span> - <span>2021.01.03</span>
-											</div>
+											</p>
 										</div>
 									</a>
 								</li>
 								<li>
 									<a href="">
-										<div class="ev_img">
-											<img src="/images/pc/thumb/ev_list_img06.jpg" alt="스타일24만의 스타일로, tbj 하이 스타일링">
+										<div class="thumb">
+											<img src="/images/pc/thumb/ev_list_img06.jpg" alt="">
 										</div>
 										<div class="txt">
-											<p class="tit">스타일24만의 스타일로, TBJ 하이 스타일링</p>
-											<div class="date">
+											<p class="title">스타일24만의 스타일로, TBJ 하이 스타일링</p>
+											<p class="date">
 												<span>2020.12.17</span> - <span>2021.01.03</span>
-											</div>
+											</p>
 										</div>
 									</a>
 								</li>
 								<li>
 									<a href="">
-										<div class="ev_img">
-											<img src="/images/pc/thumb/ev_list_img07.jpg" alt="올 겨울, 나를 설레게하는 선물같은 브랜드 THIS IS FOUR YOU">
+										<div class="thumb">
+											<img src="/images/pc/thumb/ev_list_img07.jpg" alt="">
 										</div>
 										<div class="txt">
-											<p class="tit">올 겨울, 나를 설레게하는 선물같은 브랜드 THIS IS FOUR YOU</p>
-											<div class="date">
+											<p class="title">올 겨울, 나를 설레게하는 선물같은 브랜드 THIS IS FOUR YOU</p>
+											<p class="date">
 												<span>2020.12.17</span> - <span>2021.01.03</span>
-											</div>
+											</p>
 										</div>
 									</a>
 								</li>
 								<li>
 									<a href="">
-										<div class="ev_img">
-											<img src="/images/pc/thumb/ev_list_img08.jpg" alt="한눈에 살펴보는 우리 아이 겨울 아이템">
+										<div class="thumb">
+											<img src="/images/pc/thumb/ev_list_img08.jpg" alt="">
 										</div>
 										<div class="txt">
-											<p class="tit">한눈에 살펴보는 우리 아이 겨울 아이템</p>
-											<div class="date">
+											<p class="title">한눈에 살펴보는 우리 아이 겨울 아이템</p>
+											<p class="date">
 												<span>2020.12.17</span> - <span>2021.01.03</span>
-											</div>
+											</p>
 										</div>
 									</a>
 								</li>
-							</ul>
-							
-							<ul class="clear no_con">
-								<li>
-									<p><img src="/images/pc/ico_content_find.png" alt="등록된 이벤트가 없습니다."></p>
-									<span>등록된 이벤트가 없습니다.</span>
-									<a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);">홈으로 가기</a>
-								</li>
-							</ul>
-						
+							</ul>	
 						</div>
+						<!-- 등록된 이벤트가 없을 때 노출 -->
+						<div class="nodata">
+							<div class="txt_box">
+								<p>
+									등록된 이벤트가 없습니다.
+								</p>
+							</div>
+							<div class="btn_box">
+								<button class="btn btn_default"><span>홈으로 가기</span></button>
+							</div>
+						</div>		
+						<!-- //등록된 이벤트가 없을 때 노출 -->
 					</div>
-				</div>
-			</div>
-		</div>
+			    </div>
+		    </div>
+        </div>	
 	</div>
 	<!-- // container -->	
+	<!-- // container -->	
 
 <script th:inline="javascript">
 

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

@@ -77,7 +77,7 @@
                             <div class="exhi_item">
                              
                                 <div class="exhi_item_img">
-                                    <a href="javascript:void(0);" th:onclick="fnEventGoToPage('[[${PlanData.planSq}]]');">
+                                    <a href="javascript:void(0);" th:onclick="cfnGoToPage(_PAGE_PLANNING_DETAIL + '?planSq=' + [[${PlanData.planSq}]]);">
                                     	<th:block th:if="${PlanData.newPlan != null}">
                                         <div class="shape ranker"><span>NEW</span></div>
                                         </th:block>

+ 2 - 0
src/main/webapp/ux/style24_link.js

@@ -52,6 +52,7 @@ const _PAGE_MYPAGE_DELIVERY_ADDR = _frontUrl + "/mypage/delivery/addr/form";	//
 const _PAGE_MYPAGE_WISHLIST = _frontUrl + "/mypage/wish/list/form";				// 마이페이지 > 위시리스트
 const _PAGE_MYPAGE_CUSTOMER = _frontUrl + "/mypage/customer/form";				// 마이페이지 > 내정보 관리
 const _PAGE_MYPAGE_SECEDE = _frontUrl + "/mypage/customer/secede/form";			// 마이페이지 > 회원탈퇴
+const _PAGE_WISHLIST = _frontUrl + "/mypage/wish/list/form";					// 마이페이지 > 위시리스트
 const _PAGE_WISHLIST_PUT = _frontUrl + "/mypage/wish/list/put";					// 위시리스트 담기
 const _PAGE_WISHLIST_DEL = _frontUrl + "/mypage/wish/list/delete";				// 위시리스트 삭제
 
@@ -59,6 +60,7 @@ const _PAGE_WISHLIST_DEL = _frontUrl + "/mypage/wish/list/delete";				// 위시
 
 //== 기획전 ==/
 const _PAGE_PLANNING_MAIN = _frontUrl + "/planning/main/form"; 					// 기획전 메인
+const _PAGE_PLANNING_DETAIL = _frontUrl + "/planning/detail/form";				// 기획전 상세
 
 
 //== 이벤트 ==/