Преглед изворни кода

Merge branch 'develop' into eskim

eskim пре 5 година
родитељ
комит
b8a097133c
38 измењених фајлова са 912 додато и 236 уклоњено
  1. 17 0
      src/main/java/com/style24/front/biz/dao/TsfCartDao.java
  2. 20 0
      src/main/java/com/style24/front/biz/service/TsfCartService.java
  3. 0 1
      src/main/java/com/style24/front/biz/service/TsfCouponService.java
  4. 3 0
      src/main/java/com/style24/front/biz/service/TsfOrderChangeService.java
  5. 1 2
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  6. 16 6
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  7. 2 1
      src/main/java/com/style24/front/biz/web/TsfIndexController.java
  8. 46 30
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  9. 160 0
      src/main/java/com/style24/front/biz/web/TsfOrderController.java
  10. 1 0
      src/main/java/com/style24/persistence/domain/Plan.java
  11. 1 1
      src/main/java/com/style24/persistence/domain/Review.java
  12. 37 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml
  13. 1 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfGiftcard.xml
  14. 12 3
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml
  15. 5 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  16. 1 1
      src/main/resources/config/application-locd.yml
  17. 3 3
      src/main/webapp/WEB-INF/views/mob/SnsCallBackFormMob.html
  18. 0 2
      src/main/webapp/WEB-INF/views/mob/cart/CartChangeOptionPopupMob.html
  19. 1 4
      src/main/webapp/WEB-INF/views/mob/cart/CartListAjaxFormMob.html
  20. 21 3
      src/main/webapp/WEB-INF/views/mob/cart/CartListFormMob.html
  21. 95 0
      src/main/webapp/WEB-INF/views/mob/customer/JoinCompleteFormMob.html
  22. 178 125
      src/main/webapp/WEB-INF/views/mob/customer/JoinFormMob.html
  23. 3 3
      src/main/webapp/WEB-INF/views/mob/customer/JoinTypeFormMob.html
  24. 1 0
      src/main/webapp/WEB-INF/views/mob/customer/NiceCallbackFormMob.html
  25. 1 0
      src/main/webapp/WEB-INF/views/mob/customer/NiceCellPhoneFormMob.html
  26. 17 5
      src/main/webapp/WEB-INF/views/mob/mypage/MypageGiftcardFormMob.html
  27. 1 1
      src/main/webapp/WEB-INF/views/web/SnsCallBackFormWeb.html
  28. 2 0
      src/main/webapp/WEB-INF/views/web/cart/CartChangeOptionPopupWeb.html
  29. 3 3
      src/main/webapp/WEB-INF/views/web/cart/CartListAjaxFormWeb.html
  30. 19 6
      src/main/webapp/WEB-INF/views/web/cart/CartListFormWeb.html
  31. 2 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageCreCancelDetailFormWeb.html
  32. 14 3
      src/main/webapp/WEB-INF/views/web/mypage/MypageGiftcardFormWeb.html
  33. 1 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html
  34. 92 0
      src/main/webapp/WEB-INF/views/web/order/OrderAddPaymentCompleteWeb.html
  35. 100 23
      src/main/webapp/WEB-INF/views/web/order/OrderAddPaymentFormWeb.html
  36. 24 4
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  37. 8 1
      src/main/webapp/biz/mypage.js
  38. 3 3
      src/main/webapp/ux/style24_link.js

+ 17 - 0
src/main/java/com/style24/front/biz/dao/TsfCartDao.java

@@ -291,4 +291,21 @@ public interface TsfCartDao {
 	 * @since 2021. 04. 04
 	 */
 	int updateCartGoodsQty(Cart param);
+
+	/**
+	 * 최근 등록된 상품 100개를 제외한 장바구니 제거
+	 * @param Cart
+	 * @return void
+	 * @author xodud1202
+	 * @since 2021. 04. 16
+	 */
+	void deleteOldCart(Cart param);
+
+	/**
+	 * 장바구니에 없는 장바구니 상세 데이터 삭제
+	 * @return void
+	 * @author xodud1202
+	 * @since 2021. 04. 16
+	 */
+	void deleteCartDetailFromEmptyCart();
 }

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

@@ -214,6 +214,11 @@ public class TsfCartService {
 			}
 		}
 
+		// 100개 이상 저장된 장바구니 삭제
+		if("C".equals(cartGb) || cartGb.equals(TscConstants.CartGb.CART.value())) {
+			deleteOldCart();
+		}
+
 		result.put("cartSqList", cartSqList);
 		result.put("goodsType", goodsType);
 		result.put("cartGb", cartGb);
@@ -223,6 +228,21 @@ public class TsfCartService {
 		return result;
 	}
 
+	@Transactional("shopTxnManager")
+	public void deleteOldCart() {
+		Cart deleteCart = new Cart();
+		if(TsfSession.isLogin()) {
+			deleteCart.setCustNo(TsfSession.getInfo().getCustNo());
+		} else {
+			deleteCart.setCustNo(0);
+		}
+
+		deleteCart.setJsessionId(TsfSession.getSessionId());
+
+		cartDao.deleteOldCart(deleteCart);
+		cartDao.deleteCartDetailFromEmptyCart();
+	}
+
 	@Transactional("shopTxnManager")
 	public void saveSetTypeCartInfo(Collection<Cart> params, List<Integer> cartSqs) {
 		Cart cart = new Cart();

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

@@ -682,7 +682,6 @@ public class TsfCouponService {
 
 		int count = 0;
 		for (Coupon tmpCoupon : goodsCouponList) {
-
 			for (int i = 0; i < downloadCnt; i++) {
 				CustCoupon custCoupon = new CustCoupon();
 				custCoupon.setCustNo(TsfSession.getInfo().getCustNo());

+ 3 - 0
src/main/java/com/style24/front/biz/service/TsfOrderChangeService.java

@@ -216,6 +216,9 @@ public class TsfOrderChangeService {
 		result.setString("allCanYn", allCanYn);									// 전체 취소 여부
 		result.setString("allLastCanYn", allLastCanYn);							// 전체 마지막 취소 여부
 		result.setString("allCanYnBeforePayment", allCanYnBeforePayment);		// 무통장입금전 전체 취소 여부
+		result.setString("pgTid", cnclRtn.getPgTid());							// PG거래ID
+		result.setString("payMeans", cnclRtn.getPayMeans());					// 결제수단
+		result.setString("pgGb", cnclRtn.getPgGb());							// PG구분
 		result.set("cnclReqList", cnclReqList);									// 취소신청목록
 
 		return result;

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

@@ -332,8 +332,7 @@ public class TsfOrderService {
 			// TB_PAYMENT 등록. 실패시 PG 환불.
 			if(coreOrderDao.insertPayment(result) < 1) {
 				if(TscConstants.PgGb.KCP.value().equals(param.getPgGb()) || TscConstants.PgGb.PAYCO.value().equals(param.getPgGb())) {
-					result.setIpAddress(request.getRemoteAddr());
-					coreKcpService.kcpPayRollBack(result);
+					coreKcpService.kcpCancel(result);
 				} else if (TscConstants.PgGb.KAKAO.value().equals(param.getPgGb())) {
 					coreKakaoPayService.kakaoPayRollBack(param);
 				} else if (TscConstants.PgGb.NAVER.value().equals(param.getPgGb())) {

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

@@ -324,7 +324,7 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 03. 02
 	 */
 	@GetMapping("/join/type/form")
-	public ModelAndView getJoinWayForm() {
+	public ModelAndView getJoinTypeForm() {
 		ModelAndView mav = new ModelAndView();
 
 		mav.setViewName(super.getDeviceViewName("customer/JoinTypeForm"));
@@ -339,10 +339,17 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @author jsshin
 	 * @since 2021. 02. 05
 	 */
-	@GetMapping("/join/form")
-	public ModelAndView getJoinForm() {
+	@RequestMapping("/join/form")
+	public ModelAndView getJoinForm(@RequestParam(value = "sEncData", required = false) String sEncData
+			, @RequestParam(value = "authMethod", required = false) String authMethod
+			, @RequestParam(value = "custParams", required = false) String custParams) {
+
 		ModelAndView mav = new ModelAndView();
 
+		mav.addObject("sEncData", sEncData);
+		mav.addObject("authMethod", authMethod);
+		mav.addObject("custParams", custParams);
+
 		mav.setViewName(super.getDeviceViewName("customer/JoinForm"));
 
 		return mav;
@@ -351,19 +358,20 @@ public class TsfCustomerController extends TsfBaseController {
 	/**
 	 * 휴대폰 인증 화면
 	 * @param redirectUrl - 모바일사용
-	 * @param custparams - 회원정보 수정시 사용
+	 * @param custParams - 회원정보 수정시 사용
 	 * @return ModelAndView
 	 * @author jsshin
 	 * @since 2021. 02. 09
 	 */
 	@GetMapping("/nice/cellphone/form")
 	public ModelAndView niceCellphoneForm(@RequestParam(value = "redirectUrl", required = false) String redirectUrl
-			, @RequestParam(value = "custparams", required = false) String custparams) {
+			, @RequestParam(value = "custParams", required = false) String custParams) {
 		ModelAndView mav = new ModelAndView();
 		GagaMap result = niceCertify.certifyCellPhone();
 
 		if (TscConstants.FrontGb.MOB.value().equals(TsfSession.getFrontGb())) {
 			mav.addObject("redirectUrl", redirectUrl); // 모바일만 사용
+			mav.addObject("custParams", custParams); // 모바일만 사용
 		}
 
 		mav.addObject("sEncData", result.getString("sEncData"));
@@ -405,7 +413,8 @@ public class TsfCustomerController extends TsfBaseController {
 	@RequestMapping("/nice/certify/callback")
 	public ModelAndView niceCertifyCallback(@RequestParam(value = "EncodeData", required = false) String encodeData
 			, @RequestParam(value = "enc_data", required = false) String encData
-			, @RequestParam(value = "param_r1", required = false) String redirectUrl) {
+			, @RequestParam(value = "param_r1", required = false) String redirectUrl
+			, @RequestParam(value = "param_r2", required = false) String custParams) {
 
 		ModelAndView mav = new ModelAndView();
 		String sEncData = "";
@@ -421,6 +430,7 @@ public class TsfCustomerController extends TsfBaseController {
 
 		if (TscConstants.FrontGb.MOB.value().equals(TsfSession.getFrontGb())) {
 			mav.addObject("redirectUrl", redirectUrl);
+			mav.addObject("custParams", custParams);
 		}
 
 		mav.addObject("sEncData", sEncData);

+ 2 - 1
src/main/java/com/style24/front/biz/web/TsfIndexController.java

@@ -353,7 +353,8 @@ public class TsfIndexController extends TsfBaseController {
 	 * @since 2021. 02. 23
 	 */
 	@RequestMapping( "/signin/yes24LoginCallback")
-	public ModelAndView yes24LoginCallback(@RequestParam(value = "ipin", required = false) String ipin, @RequestParam(value = "ipn", required = false) String ipn, HttpSession session) {
+	public ModelAndView yes24LoginCallback(@RequestParam(value = "ipin", required = false) String ipin
+			, @RequestParam(value = "ipn", required = false) String ipn, HttpSession session) {
 		ModelAndView mav = new ModelAndView();
 		boolean isSnsLoing = false;
 		GagaMap userInfo = new GagaMap();

+ 46 - 30
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -725,6 +725,7 @@ public class TsfMypageController extends TsfBaseController {
 		// @ 결품취소로직 추가
 		// @ 주문취소시 상태값 체크
 		// @ 취소, 반품시 배송비 체크 로직 (선결제 로직)
+		GagaMap result = new GagaMap();
 
 		// 1. 세션회원조회
 		int custNo = TsfSession.getInfo().getCustNo();
@@ -737,36 +738,50 @@ public class TsfMypageController extends TsfBaseController {
 		String allLastCanYn = refundPreInfo.getString("allLastCanYn");
 		String allCanYnBeforePayment = refundPreInfo.getString("allCanYnBeforePayment");
 
-		// 3. 환불금액계산
-		// 2021.01.19 취소신청정보를 목록 (주문상세번호, 취소/반품수량) 으로 표현
-		GagaMap result = coreOrderRefundService.cnclRtnRefundAmt(cnclReqList);
-
-		// 4. 주문변경 기본정보 설정
-		result.set("ordNo", orderChange.getOrdNo());				// 주문번호
-		result.set("ordChgSq", orderChange.getOrdChgSq());			// 주문변경번호
-		result.set("chgReason", orderChange.getChgReason());		// 변경사유
-		result.set("chgMemo", orderChange.getChgMemo());			// 변경메모
-
-		result.set("accountNo", orderChange.getAccountNo());		// 환불계좌번호
-		result.set("accountNm", orderChange.getAccountNm());		// 환불계좌예금주명
-		result.set("bankCd", orderChange.getBankCd());				// 환불계좌은행코드
-
-		result.set("allCanYnBeforePayment", allCanYnBeforePayment);	// 무통장입금전 전체취소 여부
-		result.set("allCanYn", allCanYn);							// 전체취소 여부
-		result.set("allLastCanYn", allLastCanYn);					// 전체 마지막 취소 여부
-		result.set("isCustomer", orderChange.getIsCustomer());		// 변경사유 (고객, 회사)
-
-		// 5. 주문변경 회수지정보 추가
-		// result.set("chgerNm", orderChange.getChgerNm());				// 변경자명
-		// result.set("chgerEmail", orderChange.getChgerEmail());		// 변경자이메일주소
-		// result.set("chgerPhnno", orderChange.getChgerPhnno());		// 변경자핸드폰번호
-		// result.set("chgerTelno", orderChange.getChgerTelno());		// 변경자전화번호
-
-		result.set("reqGbn", orderChange.getReqGbn());				// 신청구분
-		result.set("ipAddress", TsfSession.getIpAddress());			// IP주소
-
-		// 6. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL)
-		coreOrderChangeService.cnclComplete(result, custNo);
+		// 전체취소, 부분취소 구분 처리 진행 
+		if ("Y".equals(allCanYn)) {
+			orderChange.setChgGb(TscConstants.OrderChangeGb.CANCEL.value());
+			orderChange.setIpAddress(TsfSession.getIpAddress());
+			orderChange.setRegNo(custNo);
+			orderChange.setUpdNo(custNo);
+			
+			coreOrderChangeService.allCnclComplete(orderChange);
+		} else {
+			// 3. 환불금액계산
+			// 2021.01.19 취소신청정보를 목록 (주문상세번호, 취소/반품수량) 으로 표현
+			result = coreOrderRefundService.cnclRtnRefundAmt(cnclReqList);
+
+			// 4. 주문변경 기본정보 설정
+			result.setInt("ordNo", orderChange.getOrdNo());						// 주문번호
+			result.setInt("ordChgSq", orderChange.getOrdChgSq());				// 주문변경번호
+			result.setString("chgReason", orderChange.getChgReason());			// 변경사유
+			result.setString("chgMemo", orderChange.getChgMemo());				// 변경메모
+
+			result.setString("accountNo", orderChange.getAccountNo());			// 환불계좌번호
+			result.setString("accountNm", orderChange.getAccountNm());			// 환불계좌예금주명
+			result.setString("bankCd", orderChange.getBankCd());				// 환불계좌은행코드
+
+			result.setString("allCanYnBeforePayment", allCanYnBeforePayment);	// 무통장입금전 전체취소 여부
+			result.setString("allCanYn", allCanYn);								// 전체취소 여부
+			result.setString("allLastCanYn", allLastCanYn);						// 전체 마지막 취소 여부
+			result.setString("isCustomer", orderChange.getIsCustomer());		// 변경사유 (고객, 회사)
+
+			// 5. 주문변경 회수지정보 추가
+			// result.setString("chgerNm", orderChange.getChgerNm());				// 변경자명
+			// result.setString("chgerEmail", orderChange.getChgerEmail());			// 변경자이메일주소
+			// result.setString("chgerPhnno", orderChange.getChgerPhnno());			// 변경자핸드폰번호
+			// result.setString("chgerTelno", orderChange.getChgerTelno());			// 변경자전화번호
+
+			result.setString("reqGbn", orderChange.getReqGbn());				// 신청구분
+			result.setString("ipAddress", TsfSession.getIpAddress());			// IP주소
+			result.setInt("custNo", custNo);									// 고객번호
+			result.setString("pgTid", refundPreInfo.getString("pgTid"));		// PG거래ID
+			result.setString("payMeans", refundPreInfo.getString("payMeans"));	// 결제수단
+			result.setString("pgGb", refundPreInfo.getString("pgGb"));			// PG구분
+
+			// 6. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL)
+			coreOrderChangeService.cnclComplete(result, custNo);
+		}
 
 		result.set("status", GagaResponseStatus.SUCCESS.getCode());
 		result.set("message", message.getMessage("CANCEL_0001"));
@@ -899,6 +914,7 @@ public class TsfMypageController extends TsfBaseController {
 		OrderChange oneData = (OrderChange) map.get("oneData");
 		mav.addObject("cancelDetailList", map);
 		mav.addObject("oneData", oneData);
+		mav.addObject("refundYn", map.getString("refundYn"));
 
 		// 주문 결제정보 조회
 		Order order = new Order();

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

@@ -1138,4 +1138,164 @@ public class TsfOrderController extends TsfBaseController {
 		mav.setViewName("web/order/test");
 		return mav;
 	}
+	
+	/**
+	 * 취소,반품,교환 추가결제화면
+	 *
+	 * @param : ordChgSq
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 04. 16
+	 */
+	@ResponseBody
+	@RequestMapping(value = "/addPaymentForm")
+	public ModelAndView orderAddPaymentForm(Order order) {
+		
+		ModelAndView mav = new ModelAndView();
+		
+		// 1. 주문번호 체크
+		if (order.getOrdChgSq() == null) {
+			mav.setViewName("redirect:/");
+			return mav;
+		}
+				
+		// 2. 추가결제 상품목록
+		GagaMap resultMap = coreOrderService.getAddPayOrderListInfo(order);
+		
+		// 추가결제 목록이 없으면 메인으로 이동
+		@SuppressWarnings("unchecked")
+		Collection<Order> orderAddPayGoodsList = (Collection<Order>) resultMap.get("orderAddPayGoodsList");
+		
+		if (orderAddPayGoodsList.size() < 1) {
+			mav.setViewName("redirect:/");
+			return mav;
+		}
+		
+		// TODO 주문정보 알림톡전송
+		
+		// 3. 화면전송변수설정
+		mav.addObject("orderAddPayGoodsList"	, orderAddPayGoodsList);					// 주문목록정보
+		mav.addObject("refundAmt"				, resultMap.get("refundAmt"));				// 상품환불금액
+		mav.addObject("addPayCost"				, resultMap.get("addPayCost"));				// 추가결제금액
+		mav.addObject("ordChgSq"				, resultMap.get("ordChgSq"));				// 주문취소신청번호
+		
+		mav.addObject("chgGb"					, resultMap.get("chgGb"));					// 변경구분
+		mav.addObject("chgerNm"					, resultMap.get("chgerNm"));				// 변경신청인
+		mav.addObject("chgerPhnno"				, resultMap.get("chgerPhnno"));				// 변경신청핸드폰번호
+		mav.addObject("goodsNm"					, resultMap.get("goodsNm"));				// 상품명
+		mav.setViewName(super.getDeviceViewName("order/OrderAddPaymentForm"));
+		
+		return mav;
+	}
+	
+	/**
+	 * 추가결제실행
+	 *
+	 * @param
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 03. 04
+	 */
+	@PostMapping("/addPayment")
+	@ResponseBody
+	public ModelAndView orderAddPayment(@RequestBody Order order) {
+		ModelAndView mav = new ModelAndView();
+		
+		// 1. 로그인체크 후 custNo 설정
+		if (TsfSession.isLogin()) {
+			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
+		} else {
+			order.setJsessionId(TsfSession.getSessionId());
+			order.setCustNo(0);
+		}
+		
+		log.info("order.getPgGb()              ::: {}", order.getPgGb());
+		log.info("order.getPayMeans()          ::: {}", order.getPayMeans());
+		log.info("order.getOrdChgSq()          ::: {}", order.getOrdChgSq());
+		log.info("order.getGoodsNm()           ::: {}", order.getGoodsNm());
+		log.info("order.getAddPayCost()        ::: {}", order.getAddPayCost());
+		log.info("order.getChgerNm()           ::: {}", order.getChgerNm());
+		log.info("order.getChgerPhnno()        ::: {}", order.getChgerPhnno());
+		
+		order.setOrdNo(order.getOrdChgSq());
+		order.setPayAmt(order.getAddPayCost());
+		order.setOrdNm(order.getChgerNm());
+		order.setOrdPhnno(order.getChgerPhnno());
+
+		// 필수 데이터
+		// pgGb = 결제타입, payMeans = 결제수단, ordNo = 주문번호, goodsNm = 상품명, payAmt = 실결제금액, ordNm = 주문자명, ordPhnno = 휴대폰번호, custNo = 고객번호
+		// 선택 데이터
+		// ordEmail = 주문자메일, ordTelno = 전화번호
+		
+		/* 
+		=== 카카오페이 & 네이버페이 파라메터 ===
+		ordNo = 주문번호
+		custNo = 고객번호
+		goodsNm = 상품명
+		ordGoodsQty = 주문상품수량
+		payAmt = 결제금액
+		======================
+		*/
+
+		Payment payment = orderService.setPgDataInfo(order);
+		mav.addObject("payment"	, payment);
+		mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));
+
+		return mav;
+	}
+	
+	/**
+	 * 결제 PG 요청 완료
+	 *
+	 * @param
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 03. 05
+	 */
+	@ResponseBody
+	@RequestMapping(value = "/addPay/result/response")
+	public ModelAndView addPayResultResponse(Payment param, HttpServletRequest request, HttpServletResponse response) {
+		
+		ModelAndView mav = new ModelAndView();
+		
+		Order order = new Order();
+		
+		// 1. 로그인체크 후 custNo 설정
+		if (TsfSession.isLogin()) {
+			param.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
+			order.setCustNo(TsfSession.getInfo().getCustNo());
+			order.setRegNo(TsfSession.getInfo().getCustNo());
+			order.setUpdNo(TsfSession.getInfo().getCustNo());
+		} else {
+			param.setCustNo(0);
+			order.setCustNo(0);
+			order.setRegNo(0);
+			order.setUpdNo(0);
+		}
+		
+		param.setUpdNo(param.getCustNo());
+		
+		// 2. 결재정보등록(TB_PAYMENT)
+		param = orderService.orderPgPayResult(param, request, response);
+		
+		order.setOrdChgSq(param.getOrdNo());
+		
+		// 3. 추가결제 상품목록
+		GagaMap resultMap = coreOrderService.getAddPayOrderListInfo(order);
+		
+		// 4. 화면전송변수설정
+		mav.addObject("refundAmt"				, resultMap.get("refundAmt"));				// 상품환불금액
+		mav.addObject("addPayCost"				, resultMap.get("addPayCost"));				// 추가결제금액
+		mav.addObject("ordChgSq"				, resultMap.get("ordChgSq"));				// 주문취소신청번호
+		mav.addObject("chgerNm"					, resultMap.get("chgerNm"));				// 변경신청인
+		mav.addObject("chgerPhnno"				, resultMap.get("chgerPhnno"));				// 변경신청핸드폰번호
+
+		// TODO 3. 주문정보 업데이트
+		coreOrderService.updateOrderChangeDetail(order);
+		
+		// 2021.03.16 주문완료화면이동처리
+		mav.setViewName(super.getDeviceViewName("order/OrderAddPaymentComplete"));
+		
+		return mav;
+	}
 }

+ 1 - 0
src/main/java/com/style24/persistence/domain/Plan.java

@@ -181,6 +181,7 @@ public class Plan extends TscBaseDomain {
 	private String itemVal;				//아이템값(상품코드, 이미지파일명 등)
 	private String reviewDispStdt;		//리뷰노출시작일시
 	private String reviewDispEddt;		//리뷰노툴종료일시
+	private String linkOpenGb;			//링크 본창 새창
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] multiPlanReview;		//리뷰상품목록

+ 1 - 1
src/main/java/com/style24/persistence/domain/Review.java

@@ -28,7 +28,7 @@ public class Review extends TscBaseDomain {
 	private Integer ordDtlNo;		// 주문상세번호
 	private String reviewTitle;		// 상품평제목
 	private String reviewContent;	// 상품평내용
-	private float score;			// 구매평점
+	private String score;			// 구매평점
 	private int height;				// 키
 	private int weight;				// 몸무게
 	private String scoreSize;		// 사이즈점수(공통코드G040)

+ 37 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml

@@ -1136,4 +1136,41 @@
 		WHERE CART_SQ = #{cartSq}
 		AND   CUST_NO = #{custNo}
 	</update>
+
+	<!-- 최근 등록된 상품 100개를 제외한 장바구니 제거 -->
+	<delete id="deleteOldCart" parameterType="Cart">
+		/* TsfCart.deleteOldCart : 최근 등록된 상품 100개를 제외한 장바구니 제거 */
+		DELETE FROM TB_CART C
+		WHERE  C.CART_GB = 'G026_BC'
+		<if test="custNo != null and custNo > 0">
+		AND    C.CUST_NO = #{custNo}
+		</if>
+		<if test="custNo == null or custNo == 0">
+		AND    C.CUST_NO = 0
+		AND    C.JSESSION_ID = #{jsessionId}
+		</if>
+		AND    C.CART_SQ NOT IN (SELECT A.CART_SQ
+		                         FROM   (SELECT CART_SQ
+		                                      , ROW_NUMBER() OVER() AS RNUM
+										 FROM   TB_CART
+										 WHERE  CART_GB = 'G026_BC'
+										 <if test="custNo != null and custNo > 0">
+										 AND    CUST_NO = #{custNo}
+										 </if>
+										 <if test="custNo == null or custNo == 0">
+										 AND    CUST_NO = 0
+										 AND    JSESSION_ID = #{jsessionId}
+										 </if>
+										 ORDER  BY REG_DT DESC
+										 LIMIT  100 ) A
+		                         WHERE   A.RNUM BETWEEN 1 AND 100 )
+	</delete>
+
+	<!-- 장바구니에 없는 장바구니 상세 데이터 삭제 -->
+	<delete id="deleteCartDetailFromEmptyCart">
+		/* TsfCart.deleteCartDetailFromEmptyCart : 장바구니에 없는 장바구니 상세 데이터 삭제 */
+		DELETE FROM TB_CART_DETAIL CD
+		WHERE  CD.CART_SQ NOT IN (SELECT CART_SQ
+								  FROM   TB_CART CA)
+	</delete>
 </mapper>

+ 1 - 1
src/main/java/com/style24/persistence/mybatis/shop/TsfGiftcard.xml

@@ -14,7 +14,7 @@
 		      ,(SELECT SUM(CG3.RM_GFCD_AMT)
 				FROM TB_CUST_GIFTCARD CG3
 				WHERE DATE_FORMAT(NOW(), '%Y%m%d') BETWEEN CG3.USE_ST_DATE AND CG3.USE_EXP_DATE
-				  AND  DATE_FORMAT(NOW(), '%Y%m%d') BETWEEN DATE_ADD(CG3.USE_EXP_DATE, INTERVAL -1 MONTH) AND USE_EXP_DATE
+				  AND  NOW() BETWEEN DATE_ADD(DATE_FORMAT(CG3.USE_EXP_DATE,'%Y-%m-%d'), INTERVAL -30 DAY) AND USE_EXP_DATE
 				  AND CUST_NO = #{custNo}
 				  AND CG3.RM_GFCD_AMT > 0 ) AS EXPIRE_COUNT  /*한달 이내 소멸*/
 		FROM TB_CUST_GIFTCARD CG 

+ 12 - 3
src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml

@@ -330,6 +330,8 @@
 		     , DFP.DELV_FEE + DFP.RTN_DELV_FEE                    AS EXC_DELV_FEE
 		     , DFP.SUPPLY_COMP_CD
 		     , IF(G1.SELF_GOODS_YN = 'Y', 'WMS', DFP.DELV_FEE_CD) AS DELV_FEE_CD
+		     , P.PG_TID
+		     , P.PAY_MEANS
 		     , P.PAY_STAT
 		     , CASE WHEN NULLIF(OD.INVOICE_NO, '') IS NULL THEN 'N'
 		            ELSE 'Y'
@@ -798,6 +800,7 @@
 		     , Z.RF_CNCL_AMT
 		     , Z.RF_DELIVERY_FEE
 		     , Z.RF_REAL_CNCL_AMT
+		     , Z.PG_TID
 		     , Z.PG_GB
 		     , Z.PAY_MEANS
 		     , Z.PAY_MEANS_NM
@@ -832,8 +835,8 @@
 		             , ODI.ORD_DTL_ITEM_SQ
 		             , ODI.OPT_CD1
 		             , ODI.OPT_CD2
-		             , ((OD.ORD_AMT - OD.CNCL_RTN_AMT - OD.CPN1_DC_AMT) * (OCD.CHG_QTY / (OD.ORD_QTY - OD.CNCL_RTN_QTY))) AS PRICE_ORG
-		             , ((OD.REAL_ORD_AMT + OD.PNT_DC_AMT + OD.GFCD_USE_AMT) * (OCD.CHG_QTY / (OD.ORD_QTY - OD.CNCL_RTN_QTY))) AS PRICE_SALE
+		             , ((ODH.ORD_AMT - ODH.CPN1_DC_AMT) * (OCD.CHG_QTY / ODH.ORD_QTY)) AS PRICE_ORG
+		             , ((ODH.REAL_ORD_AMT + ODH.PNT_DC_AMT + ODH.GFCD_USE_AMT) * (OCD.CHG_QTY / OD.ORD_QTY)) AS PRICE_SALE
 		             , OC.ADD_PAY_COST
 		             , CASE WHEN G1.GOODS_TYPE != 'G056_S' AND G1.SELF_GOODS_YN = 'Y' THEN (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G1.GOODS_CD AND COLOR_CD = ODI.OPT_CD1 AND DEFAULT_IMG_YN = 'Y')
 		                    ELSE (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G1.GOODS_CD AND COLOR_CD = IFNULL(G1.MAIN_COLOR_CD,'XX') AND DEFAULT_IMG_YN = 'Y') END AS SYS_IMG_NM
@@ -850,6 +853,7 @@
 		             , R.RF_CNCL_AMT
 		             , R.RF_DELIVERY_FEE
 		             , R.RF_REAL_CNCL_AMT
+		             , P.PG_TID
 		             , P.PG_GB
 		             , P.PAY_MEANS
 		             , FN_GET_CODE_NM('G014', P.PAY_MEANS)                              AS PAY_MEANS_NM
@@ -869,6 +873,9 @@
 		            ON OD.ORD_NO = ODI.ORD_NO
 		           AND OD.ORD_DTL_NO = ODI.ORD_DTL_NO
 		           AND OD.ORD_DTL_STAT NOT IN ('G013_00', 'G013_11', 'G013_25')
+		         INNER JOIN TB_ORDER_DETAIL_HST ODH
+		            ON OD.ORD_DTL_NO = ODH.ORD_DTL_NO
+		           AND ODH.ORD_DTL_STAT = 'G013_00'
 		         INNER JOIN TB_GOODS G1
 		            ON OD.GOODS_CD = G1.GOODS_CD
 		         INNER JOIN TB_GOODS G2
@@ -883,6 +890,7 @@
 		         INNER JOIN TB_PAYMENT P
 		            ON P.ORD_NO = O.ORD_NO
 		           AND P.PAY_GB = 'O'
+		           AND P.PAY_STAT = 'G016_30'
 		         WHERE OCD.DEL_YN = 'N'
 		           AND O.DISP_YN = 'Y'
 		<choose>
@@ -903,7 +911,7 @@
 				, Z.GFCD_USE_AMT, Z.ORD_DTL_NO, Z.GOODS_CD, Z.BRAND_NM, Z.SHOT_DELV_YN, Z.SELF_GOODS_YN, Z.GOODS_NM
 				, Z.GOODS_TYPE, Z.PRICE_ORG, Z.PRICE_SALE, Z.ADD_PAY_COST, Z.SYS_IMG_NM, Z.GIFT_PACK_YN, Z.REFUND_AMT, Z.RF_CPN1_AMT, Z.RF_TMTB1_AMT
 				, Z.RF_TMTB2_AMT, Z.RF_GOODS_CPN_AMT, Z.RF_CART_CPN_AMT, Z.RF_PNT_AMT, Z.RF_PRE_PNT_AMT, Z.RF_GFCD_USE_AMT, Z.RF_CNCL_AMT
-				, Z.RF_DELIVERY_FEE, Z.RF_REAL_CNCL_AMT, Z.PG_GB, Z.PAY_MEANS, Z.PAY_MEANS_NM
+				, Z.RF_DELIVERY_FEE, Z.RF_REAL_CNCL_AMT, Z.PG_TID, Z.PG_GB, Z.PAY_MEANS, Z.PAY_MEANS_NM
 		 ORDER BY Z.ORD_CHG_SQ DESC
 	</select>
 
@@ -1062,6 +1070,7 @@
 		         INNER JOIN TB_PAYMENT P
 		            ON P.ORD_NO = O.ORD_NO
 		           AND P.PAY_GB = 'O'
+		           AND P.PAY_STAT = 'G016_30'
 		         WHERE OCD.DEL_YN = 'N'
 		           AND O.DISP_YN = 'Y'
 		<choose>

+ 5 - 1
src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml

@@ -436,6 +436,7 @@
 		     , PLAN_CONT_SQ
 		     ,TITLE 
 		     ,LINK_URL
+		     ,LINK_OPEN_GB
 		     ,NOTE 
 		     ,DISP_YN 
 		FROM TB_PLAN_CONTENTS TPC 
@@ -667,11 +668,12 @@
 		      ,PC.PLAN_SQ
 		      ,PC.TMPL_TYPE
 		      ,PC.TITLE
-		      ,PC.LINK_URL
 		      ,PC.DISP_YN
 		      ,PC.DISP_ORD
 		      ,PCI.PLAN_CONT_ITEM_SQ
 		      ,PCI.ITEM_VAL
+		      ,PCI.LINK_URL
+		      ,PCI.LINK_OPEN_GB
 		      ,PCI.DISP_ORD
 		      ,PCI.REVIEW_DISP_STDT
 		      ,PCI.REVIEW_DISP_EDDT
@@ -692,6 +694,7 @@
 		WITH TAB_PLAN_GOODS AS (
 		    SELECT P.PLAN_SQ                                                /*기획전번호*/
 		         , PC.LINK_URL 
+		         , PC.LINK_OPEN_GB
 		         , PC.DISP_ORD 
 		         , PC.TITLE 
 		         , PC.TMPL_TYPE 
@@ -764,6 +767,7 @@
 		     , PG.TITLE
 		     , PG.TMPL_TYPE
 		     , PG.LINK_URL
+		     , PG.LINK_OPEN_GB
 		     , PG.ITEM_VAL
 		     , PG.PLAN_CONT_SQ
 		     , FN_GET_GOODS_NM(PG.GOODS_NM,PG.GOODS_GB,PG.FOREIGN_BUY_YN,PG.PARALLEL_IMPORT_YN,PG.ORDER_MADE_YN) AS GOODS_FULL_NM /*상품FULL명*/

+ 1 - 1
src/main/resources/config/application-locd.yml

@@ -66,7 +66,7 @@ pg:
         site:
             cd: T0000
             key: 3grptw1.zW0GSo4PQdaGvsF__
-            name: KCP TEST SHOP
+            name: ISTYLE TEST
         log.level: 3
         module.type: 01
         tx.mode: 0

+ 3 - 3
src/main/webapp/WEB-INF/views/mob/SnsCallBackFormMob.html

@@ -3,15 +3,15 @@
 	xmlns:th="http://www.thymeleaf.org">
 <!--
  *******************************************************************************
- * @source  : SigninFormWeb.html
- * @desc    : 로그인 Page
+ * @source  : SnsCallBackFormMob.html
+ * @desc    : SNS 콜백 화면 Page
  *============================================================================
  * STYLE24
  * Copyright(C) 2020 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION
  * ===  ===========  ==========  =============================================
- * 1.0  2021.02.15   gagamel     최초 작성
+ * 1.0  2021.02.15   jsshin     최초 작성
  *******************************************************************************
  -->
 <head th:replace="~{mob/common/fragments/HeadMob :: head}"></head>

+ 0 - 2
src/main/webapp/WEB-INF/views/mob/cart/CartChangeOptionPopupMob.html

@@ -137,8 +137,6 @@
 					<div class="opt_select">
 						<div class="opt_header">
 							<span class="title">옵션2</span>
-							<!--<span th:text="${size.optCd2}"></span>
-							<span th:if="${size.addPrice > 0}">(+<em th:text="${#numbers.formatInteger(size.addPrice, 1, 'COMMA')}"></em>)원</span>-->
 							<span class="info color" th:classappend="|chooseSizeNm_${comp.goodsCd}|" th:text="${comp.optCd2}"></span>
 						</div>
 						<form class="form_wrap">

+ 1 - 4
src/main/webapp/WEB-INF/views/mob/cart/CartListAjaxFormMob.html

@@ -18,6 +18,7 @@
 	<!-- 즉시구매 form -->
 	<form id="cartInfoForm" method="post" action="/order/noMember"></form>
 
+	<!-- 장바구니 화면 -->
 	<form id="cartListForm" method="post" action="/order/noMember" th:with="imgGoodsUrl=${@environment.getProperty('upload.goods.view')}, uxImgUrl=${@environment.getProperty('domain.uximage')}, imgUrl=${@environment.getProperty('upload.image.view')}">
 		<div class="inner shotDelvSelect">
 			<div class="od_method">
@@ -668,10 +669,6 @@
 		</div>
 		<!-- //쿠폰사용안내 팝업 -->
 
-		<!-- 옵션변경 팝업 -->
-		<div id="optModifyPop01" class="popup_box optModifyPop optModifyPop01"></div>
-		<!-- //옵션변경 팝업 -->
-
 		<script th:inline="javascript">
 			var sumRealPayAmt = [[${order.sumRealPayAmt + order.totDelvFee}]];
 			var totDcAmt = [[${order.totDcAmt}]];

+ 21 - 3
src/main/webapp/WEB-INF/views/mob/cart/CartListFormMob.html

@@ -81,6 +81,10 @@
 			</div>
 		</div>
 		<!-- //배송비 SAVE_팝업 -->
+
+		<!-- 옵션변경 팝업 -->
+		<div id="optModifyPop01" class="popup_box optModifyPop optModifyPop01"></div>
+		<!-- //옵션변경 팝업 -->
 	</main>
 
 	<script src="/ux/mo/js/swiper.min.js"></script>
@@ -179,6 +183,7 @@
 			count = count > maxOrdQty ? maxOrdQty : count;
 			$input.val(count);
 			$input.change();
+
 			//주문 최대 수량 이상 증가버튼 비활성화
 			if ($input.val() == maxOrdQty) {
 				$('.optModifyPop01 .number_count .plus').addClass('min_val');
@@ -188,8 +193,21 @@
 
 			return false;
 		}).on('keyup','.optModifyPop01 .number_count input[type=text]',function(e){
-			//텍스트, 0 입력금지
-			$(this).val($(this).val().replace(/[^1-9]/g,""));
+			var minOrdQty = $(this).parent().parent().find(".minOrdQty").val();
+			var maxOrdQty = $(this).parent().parent().find(".maxOrdQty").val();
+
+			$(this).val($(this).val().replace(/[^0-9]/g,""));
+
+			if(Number($(this).val()) < Number(minOrdQty)) {
+				$(this).val(minOrdQty);
+				$('.optModifyPop01 .number_count .minus').addClass('min_val');
+				$('.optModifyPop01 .number_count .plus').removeClass('min_val');
+			}
+			if(Number($(this).val()) > Number(maxOrdQty)) {
+				$(this).val(maxOrdQty);
+				$('.optModifyPop01 .number_count .plus').addClass('min_val');
+				$('.optModifyPop01 .number_count .minus').removeClass('min_val');
+			}
 		});
 
 		//팝업 - 쿠폰사용안내
@@ -198,7 +216,7 @@
 			$("#couponInfoPop").modal("show");
 			return false;
 		});
-		$("#couponInfoPop_close").click(function() {
+		$("#couponInfoPop_close").on("click", function() {
 			$("#couponInfoPop").modal("hide");
 		});
 

+ 95 - 0
src/main/webapp/WEB-INF/views/mob/customer/JoinCompleteFormMob.html

@@ -0,0 +1,95 @@
+<!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/LoginLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : JoinCompleteFormMob.html
+ * @desc    : 회원 가입완료 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.19   jsshin     최초 작성
+ *******************************************************************************
+ -->
+
+<body>
+<th:block layout:fragment="content">
+	<main class="container mb">
+		<section th:if="${maskingCustId != ''}" class="content mb_join_3">
+			<div class="inner">
+				<div class="close">
+					<a href="javascript:void(0)" class="btn_close" onclick="cfnGoToPage(_PAGE_MAIN);"><span></span><span></span></a>
+				</div>
+			</div>
+			<div class="inner">
+				<h2 class="title">회원가입</h2>
+			</div>
+			<div class="inner">
+				<form class="form_wrap form_full" role="form">
+					<div class="form_head">
+						<h3 class="title sr-only">회원가입</h3>
+					</div>
+					<div class="form_info">
+						<span class="ico_content_find"></span>
+						<p>이미 가입된 아이디가 있습니다.</p>
+						<p class="t_info mt15">
+							아래의 아이디로 로그인 하시거나<br>
+							잊으신 경우 ID 찾기를 통해 이용 가능합니다.
+						</p>
+					</div>
+					<div class="print_bar mt30">
+						<p class="c_primary bold" data-font="lato" th:text="${maskingCustId}"></p>
+					</div>
+					<!-- 210415_수정 : 버튼 형식 변경. -->
+					<div class="btn_group_flex btn_group_md">
+						<div>
+							<button id="btn_login" class="btn btn_dark" onclick="cfnGoToPage(_PAGE_LOGIN);">
+								<span>로그인</span>
+							</button>
+						</div>
+						<div>
+							<button id="btn_id_find" class="btn btn_default" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
+								<span>아이디 찾기</span>
+							</button>
+						</div>
+					</div>
+					<!-- //210415_수정 : 버튼 형식 변경. -->
+				</form>
+			</div>
+		</section>
+		<!-- ★ 컨텐츠 시작 -->
+		<section th:unless="${maskingCustId != ''}" class="content mb_join_1">
+			<div class="inner">
+				<div class="close">
+					<a href="javascript:void(0)" class="btn_close" onclick="cfnGoToPage(_PAGE_MAIN);"><span></span><span></span></a>
+				</div>
+			</div>
+			<div class="inner">
+				<h2 class="title">신규회원 혜택 안내</h2>
+			</div>
+			<div class="inner">
+				<form class="form_wrap form_full" role="form">
+					<div class="form_head">
+						<h3 class="title sr-only">신규회원 혜택 안내</h3>
+					</div>
+					<img src="/images/mo/img_mb_join_done.jpg" width="100%" alt="신규회원 혜택안내 내용">
+					<div class="btn_group_flex">
+						<div>
+							<button type="button" class="btn btn_primary btn_block" onclick="cfnGoToPage(_PAGE_MAIN);">
+								<span>쇼핑하러 가기</span>
+							</button>
+						</div>
+					</div>
+				</form>
+			</div>
+		</section>
+		<!-- ★ 컨텐츠 종료 -->
+	</main>
+</th:block>
+</body>
+</html>

+ 178 - 125
src/main/webapp/WEB-INF/views/mob/customer/JoinFormMob.html

@@ -34,122 +34,92 @@
 			<h2 class="title">회원정보 입력</h2>
 		</div>
 		<div class="inner">
-
-			   <form class="form_wrap form_full" role="form">
-					<div class="form_head">
-						<h2 class="title sr-only">회원정보 입력</h2>
+			<form id="joinForm" name="joinForm" class="form_wrap form_full" role="form">
+				<div class="form_head">
+					<h2 class="title sr-only">회원정보 입력</h2>
+				</div>
+				<!-- 아이디 사용가능시 -->
+				<div class="form_field">
+					<label class="input_label sr-only">아이디</label>
+					<div class="input_wrap form_full">
+						<input type="text" id="custId" name="custId" placeholder="아이디" class="form_control" required="required" data-valid-type="alphaNumeric" data-valid-name="아이디" minlength="4" maxlength="12"/>
+						<span class="usable" style="display:block;"></span>
 					</div>
-					<!-- 아이디 사용가능시 -->
-					<div class="form_field">
-						<label class="input_label sr-only">아이디</label>
-						<div class="input_wrap form_full">
-							<input type="text" id="custId" name="custId" placeholder="아이디" class="form_control" required="required" data-valid-type="alphaNumeric" data-valid-name="아이디" minlength="4" maxlength="12"/>
-							<span class="usable" style="display:block;"></span>
-						</div>
-						<div id="dupCustIdDiv" class="help_block hide">
-							<p class="t_err">이미 가입된 아이디입니다.다른 아이디를 입력하여 주세요.</p>
-						</div>
+					<div id="dupCustIdDiv" class="help_block hide">
+						<p class="t_err">이미 가입된 아이디입니다.다른 아이디를 입력하여 주세요.</p>
 					</div>
-					<!-- //아이디 사용가능시 -->
-					<!-- 오류시 부모 div에서 제어 -->
-					<div class="form_field">
-						<label class="input_label sr-only">비밀번호</label>
-						<div class="input_wrap form_full">
-							<input type="password" id="passwd" name="passwd" placeholder="비밀번호 (8~20자 영문, 숫자, 특수문자 중 2가지 이상 조합)" class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="비밀번호"/><!-- 잘못기입된 경우 class "err" 추가 -->
-							<!-- case (사용불가 비밀번호일경우,사용가능한 비밀번호일경우) -->
-							<div class="help_block">
-								<!-- 사용불가 비밀번호일경우 -->
-								<p class="mt10">
-									<span id="firstFailed" class="c_gray">
-										<i class="ico ico_check gray mr5"></i>영문(대/소문자), 숫자, 특수문자 중 2가지 이상 조합(8~20자)<br>
-									</span>
-									<span id="secondFailed" class="c_gray">
-										<i class="ico ico_check gray mr5"></i>4개이상 연속되거나 동일한 문자/숫자 제외<br>
-									</span>
-									<span id="thirdFailed" class="c_gray">
-										<i class="ico ico_check gray mr5"></i>아이디 제외
-									</span>
-								</p>
-								<!-- //사용불가 비밀번호일경우 -->
-								<!-- 사용가능한 비밀번호일경우 -->
-								<p id="avlPwd" class="mt10 hide">
-									<span class="c_black2">
-										<i class="ico ico_check black mr5"></i>사용 가능한 비밀번호입니다
-									</span>
-								</p>
-								<!-- //사용가능한 비밀번호일경우 -->
-							</div>
-							<!-- //case (사용불가 비밀번호일경우,사용가능한 비밀번호일경우) -->
-						</div>
-					</div>
-					<!-- //오류시 부모 div에서 제어 -->
-					<div class="form_field">
-						<label class="input_label sr-only">비밀번호 확인</label>
-						<div class="input_wrap form_full">
-							<input type="password" id="confirmPassword" name="confirmPassword" placeholder="비밀번호 확인" class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="비밀번호"/><!-- 잘못기입된 경우 class "err" 추가 -->
-							<!-- case (비밀번호확인 틀렸을경우,비밀번호 일치할경우) -->
-							<div class="help_block">
-								<!-- 비밀번호확인 틀렸을경우 -->
-								<p id="misPwd" class="t_err hide">
-									비밀번호가 일치하지 않습니다.
-								</p>
-								<!-- //비밀번호확인 틀렸을경우 -->
-								<!-- 비밀번호 일치할경우 -->
-								<p id="avlConPwd"  class="mt10 hide">
-									<span class="c_black2">
-										<i class="ico ico_check black mr5"></i>비밀번호가 일치합니다.
-									</span>
-								</p>
-								<!-- //비밀번호 일치할경우 -->
-							</div>
-							<!-- //case (비밀번호확인 틀렸을경우,비밀번호 일치할경우) -->
+				</div>
+				<!-- //아이디 사용가능시 -->
+				<!-- 오류시 부모 div에서 제어 -->
+				<div class="form_field">
+					<label class="input_label sr-only">비밀번호</label>
+					<div class="input_wrap form_full">
+						<input type="password" id="passwd" name="passwd" placeholder="비밀번호 (8~20자 영문, 숫자, 특수문자 중 2가지 이상 조합)" class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="비밀번호"/><!-- 잘못기입된 경우 class "err" 추가 -->
+						<!-- case (사용불가 비밀번호일경우,사용가능한 비밀번호일경우) -->
+						<div class="help_block">
+							<!-- 사용불가 비밀번호일경우 -->
+							<p class="mt10">
+								<span id="firstFailed" class="c_gray">
+									<i class="ico ico_check gray mr5"></i>영문(대/소문자), 숫자, 특수문자 중 2가지 이상 조합(8~20자)<br>
+								</span>
+								<span id="secondFailed" class="c_gray">
+									<i class="ico ico_check gray mr5"></i>4개이상 연속되거나 동일한 문자/숫자 제외<br>
+								</span>
+								<span id="thirdFailed" class="c_gray">
+									<i class="ico ico_check gray mr5"></i>아이디 제외
+								</span>
+							</p>
+							<!-- //사용불가 비밀번호일경우 -->
+							<!-- 사용가능한 비밀번호일경우 -->
+							<p id="avlPwd" class="mt10 hide">
+								<span class="c_black2">
+									<i class="ico ico_check black mr5"></i>사용 가능한 비밀번호입니다
+								</span>
+							</p>
+							<!-- //사용가능한 비밀번호일경우 -->
 						</div>
+						<!-- //case (사용불가 비밀번호일경우,사용가능한 비밀번호일경우) -->
 					</div>
-					<div class="form_field">
-						<label class="input_label sr-only">이메일</label>
-						<div class="input_wrap form_full">
-							<input type="text" id="email" name="email" placeholder="이메일" class="form_control" required="required" data-valid-name="이메일" maxlength="30"/><!-- 잘못기입된 경우 class "err" 추가 -->
-							<!-- case (이메일 형식이 바르지않을경우,이미 가입되어있는 이메일인경우) -->
-							<div class="help_block">
-								<!-- 이메일 형식이 바르지않을경우 -->
-								<p id="failEmail" class="t_err hide">
-									이메일 형식이 올바르지 않습니다.
-								</p>
-								<!-- //이메일 형식이 바르지않을경우 -->
-								<!-- 이미 가입되어있는 이메일인경우 -->
-								<p id="dupEmail" class="t_err hide">
-									이미 가입된 이메일 주소입니다. 다른 이메일 주소를 입력하여 주세요.
-								</p>
-								<div id="dupEmailDiv" class="mt20 hide">
-									<button type="button" class="btn btn_default btn_sm mini" onclick="cfnGoToPage(_PAGE_LOGIN);">
-										<span>로그인</span>
-									</button>
-									<button type="button" class="btn btn_default btn_sm mini" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
-										<span>아이디 찾기</span>
-									</button>
-								</div>
-								<!-- //이미 가입되어있는 이메일인경우 -->
-							</div>
-							<!-- //case (이메일 형식이 바르지않을경우,이미 가입되어있는 이메일인경우) -->
+				</div>
+				<!-- //오류시 부모 div에서 제어 -->
+				<div class="form_field">
+					<label class="input_label sr-only">비밀번호 확인</label>
+					<div class="input_wrap form_full">
+						<input type="password" id="confirmPassword" name="confirmPassword" placeholder="비밀번호 확인" class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="비밀번호"/><!-- 잘못기입된 경우 class "err" 추가 -->
+						<!-- case (비밀번호확인 틀렸을경우,비밀번호 일치할경우) -->
+						<div class="help_block">
+							<!-- 비밀번호확인 틀렸을경우 -->
+							<p id="misPwd" class="t_err hide">
+								비밀번호가 일치하지 않습니다.
+							</p>
+							<!-- //비밀번호확인 틀렸을경우 -->
+							<!-- 비밀번호 일치할경우 -->
+							<p id="avlConPwd"  class="mt10 hide">
+								<span class="c_black2">
+									<i class="ico ico_check black mr5"></i>비밀번호가 일치합니다.
+								</span>
+							</p>
+							<!-- //비밀번호 일치할경우 -->
 						</div>
+						<!-- //case (비밀번호확인 틀렸을경우,비밀번호 일치할경우) -->
 					</div>
-					<!-- 210415_수정 : 휴대폰 인증 수정 -->
-					<div class="form_field">
-						<label class="input_label sr-only">휴대폰번호</label>
-						<!-- 휴대폰 인증 입력 전 -->
-						<div class="input_wrap form_full">
-							<input type="text" id="cellPhnno" name="cellPhnno" placeholder="휴대폰 인증 해주세요." class="form_control" minlength="10" maxlength="11" required="required" data-valid-type="numeric" data-valid-name="휴대폰" readonly="readonly"/>
-							<button type="button" id="btnCellPhoneCertify" class="btn btn_dark btn_hp_certi">
-								<span>본인인증</span>
-							</button>
-						</div>
-						<!-- //휴대폰 인증 입력 전 -->
-
-						<!-- case (휴대폰번호 형식이 맞지 않을경우,이미 가입되어있는 핸드폰번호일경우) -->
+				</div>
+				<div class="form_field">
+					<label class="input_label sr-only">이메일</label>
+					<div class="input_wrap form_full">
+						<input type="text" id="email" name="email" placeholder="이메일" class="form_control" required="required" data-valid-name="이메일" maxlength="30"/><!-- 잘못기입된 경우 class "err" 추가 -->
+						<!-- case (이메일 형식이 바르지않을경우,이미 가입되어있는 이메일인경우) -->
 						<div class="help_block">
-							<p id="failPhnno" class="t_err hide">휴대폰번호를 형식에 맞게 정확히 입력해주세요</p>
-							<p id="dupPhnno" class="t_err hide">I***D로 가입된 핸드폰 번호 입니다.</p>
-							<div id="dupPhnnoDiv" class="mt20 hide">
+							<!-- 이메일 형식이 바르지않을경우 -->
+							<p id="failEmail" class="t_err hide">
+								이메일 형식이 올바르지 않습니다.
+							</p>
+							<!-- //이메일 형식이 바르지않을경우 -->
+							<!-- 이미 가입되어있는 이메일인경우 -->
+							<p id="dupEmail" class="t_err hide">
+								이미 가입된 이메일 주소입니다. 다른 이메일 주소를 입력하여 주세요.
+							</p>
+							<div id="dupEmailDiv" class="mt20 hide">
 								<button type="button" class="btn btn_default btn_sm mini" onclick="cfnGoToPage(_PAGE_LOGIN);">
 									<span>로그인</span>
 								</button>
@@ -157,27 +127,55 @@
 									<span>아이디 찾기</span>
 								</button>
 							</div>
+							<!-- //이미 가입되어있는 이메일인경우 -->
 						</div>
+						<!-- //case (이메일 형식이 바르지않을경우,이미 가입되어있는 이메일인경우) -->
 					</div>
-					<div class="btn_group_flex">
-						<div>
-							<button type="button" id="btnJoin" class="btn btn_primary btn_block" disabled="disabled">
-								<span>동의하고 가입하기</span>
+				</div>
+				<!-- 210415_수정 : 휴대폰 인증 수정 -->
+				<div class="form_field">
+					<label class="input_label sr-only">휴대폰번호</label>
+					<!-- 휴대폰 인증 입력 전 -->
+					<div class="input_wrap form_full">
+						<input type="text" id="cellPhnno" name="cellPhnno" placeholder="휴대폰 인증 해주세요." class="form_control" minlength="10" maxlength="11" required="required" data-valid-type="numeric" data-valid-name="휴대폰" readonly="readonly"/>
+						<button type="button" id="btnCellPhoneCertify" class="btn btn_dark btn_hp_certi">
+							<span>본인인증</span>
+						</button>
+					</div>
+					<!-- //휴대폰 인증 입력 전 -->
+
+					<!-- case (휴대폰번호 형식이 맞지 않을경우,이미 가입되어있는 핸드폰번호일경우) -->
+					<div class="help_block">
+						<p id="failPhnno" class="t_err hide">휴대폰번호를 형식에 맞게 정확히 입력해주세요</p>
+						<p id="dupPhnno" class="t_err hide">I***D로 가입된 핸드폰 번호 입니다.</p>
+						<div id="dupPhnnoDiv" class="mt20 hide">
+							<button type="button" class="btn btn_default btn_sm mini" onclick="cfnGoToPage(_PAGE_LOGIN);">
+								<span>로그인</span>
+							</button>
+							<button type="button" class="btn btn_default btn_sm mini" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
+								<span>아이디 찾기</span>
 							</button>
 						</div>
 					</div>
-					<!-- //210415_수정 : 버튼 형식 변경. -->
-					<div class="desc_wrap t_c mt20">
-						<p>
-							본인은&nbsp;만 14세 이상이며&nbsp;<a href="javascript:void(0)" onclick="cfnUseTermsLayer();">STYLE24이용약관<i class="ico ico_blank ml5"></i></a>,<br>
-							<a href="javascript:void(0)" onclick="cfnPrivacyPolicyLayer();">개인정보 수집 및 이용<i class="ico ico_blank ml5"></i></a>,
-							<a href="javascript:void(0)" onclick="cfnPrivacyTrustLayer();">개인정보 취급 위탁<i class="ico ico_blank ml5"></i></a><br>
-							내용을 확인 하였으며,동의합니다.
-						</p>
+				</div>
+				<div class="btn_group_flex">
+					<div>
+						<button type="button" id="btnJoin" class="btn btn_primary btn_block" disabled="disabled">
+							<span>동의하고 가입하기</span>
+						</button>
 					</div>
-				</form>
+				</div>
+				<!-- //210415_수정 : 버튼 형식 변경. -->
+				<div class="desc_wrap t_c mt20">
+					<p>
+						본인은&nbsp;만 14세 이상이며&nbsp;<a href="javascript:void(0)" onclick="cfnUseTermsLayer();">STYLE24이용약관<i class="ico ico_blank ml5"></i></a>,<br>
+						<a href="javascript:void(0)" onclick="cfnPrivacyPolicyLayer();">개인정보 수집 및 이용<i class="ico ico_blank ml5"></i></a>,
+						<a href="javascript:void(0)" onclick="cfnPrivacyTrustLayer();">개인정보 취급 위탁<i class="ico ico_blank ml5"></i></a><br>
+						내용을 확인 하였으며,동의합니다.
+					</p>
+				</div>
+			</form>
 		</div>
-
 	</section>
 	<!-- ★ 컨텐츠 종료 -->
 </main>
@@ -185,7 +183,11 @@
 <script th:src="@{'/biz/customer.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/customer.js"></script>
 <script th:inline="javascript">
 	/*<![CDATA[*/
-let custIdCheck = false;
+	const sEncData = [[${sEncData}]];   //인증 후 해당 페이지로 리다이렉트함
+	const authMethod = [[${authMethod}]]; //인증 후 해당 페이지로 리다이렉트함
+	let custParams = [[${custParams}]];
+
+	let custIdCheck = false;
 	let passwdCheck = false;
 	let emailCheck = false;
 	let authCheck = false;
@@ -324,6 +326,12 @@ let custIdCheck = false;
 	//	이메일 확인
 	$('#email').on('blur', function () {
 		const $failEmail = $('#failEmail');
+		const $dupEmail = $('#dupEmail');
+		const $dupEmailDiv = $('#dupEmailDiv');
+		$failEmail.hide();
+		$dupEmail.hide();
+		$dupEmailDiv.hide();
+
 		let email = $(this).val();
 		let validation;
 
@@ -363,7 +371,9 @@ let custIdCheck = false;
 
 	//휴대폰 인증
 	$('#btnCellPhoneCertify').on('click', function () {
-		cfnOpenCellphoneCertify();
+		let joinForm = $('#joinForm').serializeObject();
+		let custParams = joinForm.custId +','+ joinForm.passwd +','+ joinForm.confirmPassword +','+ joinForm.email;
+		cfnOpenCellphoneCertify(_PAGE_CUSTOMER_JOIN, custParams);
 	});
 
 	// 나이스 본인인증 후 콜백
@@ -432,6 +442,49 @@ let custIdCheck = false;
 			$btnJoin.attr('disabled', true);
 		}
 	};
+
+	// 본인인증 후 데이터 입력 값 셋팅
+	var fnDataSet = function (custParams) {
+		const $custId = $('#joinForm input[name=custId]');
+		const $passwd = $('#joinForm input[name=passwd]');
+		const $confirmPassword = $('#joinForm input[name=confirmPassword]');
+		const $email = $('#joinForm input[name=email]');
+
+		let arrayParams = custParams.split(',');
+		//[0]아이디/[1]비밀번호/[2]비밀번호확인/[3]이메일
+		let custId = arrayParams[0];
+		let passwd = arrayParams[1];
+		let confirmPassword = arrayParams[2];
+		let email = arrayParams[3];
+
+		// console.log(arrayParams);
+		if (!gagajf.isNull(custId)) {
+			$custId.val(custId);
+			$custId.trigger('blur');
+		}
+		if (!gagajf.isNull(passwd)) {
+			$passwd.val(passwd);
+			$passwd.trigger('blur');
+		}
+		if (!gagajf.isNull(confirmPassword)) {
+			$confirmPassword.val(confirmPassword);
+			$confirmPassword.trigger('blur');
+		}
+		if (!gagajf.isNull(email)) {
+			$email.val(email);
+			$email.trigger('blur');
+		}
+	};
+
+	$(document).ready(function () {
+		if (!gagajf.isNull(custParams)) {
+			fnDataSet(custParams);
+		}
+		if (!gagajf.isNull(sEncData)) {
+			fnNiceCallBack(sEncData, authMethod);
+		}
+	});
+
 	/*]]>*/
 </script>
 </th:block>

+ 3 - 3
src/main/webapp/WEB-INF/views/mob/customer/JoinTypeFormMob.html

@@ -39,12 +39,12 @@
 						<p class="c_primary t_c">STYLE24 회원으로 가입</p>
 						<p class="t_c mt10">신규 가입 시 할인 쿠폰 등<br> 다양한 혜택을 받으실 수 있습니다.</p>
 					</div>
-				   <div class="ui_row mt20">
-					   <button type="button" class="btn btn_primary" onclick="cfnGoToPage(_PAGE_CUSTOMER_JOIN);">회원가입</button>
+				   <div class="btn_group_flex">
+					   <button type="button" class="btn btn_primary btn_block" onclick="cfnGoToPage(_PAGE_CUSTOMER_JOIN);">동의하고 가입하기</button>
 				   </div>
 				</form>
 				<div class="t_c sns_wrap">
-					<h3 class="sr-only">간편로그인</h3>
+					<h5>간편하게 시작하기</h5>
 					<ul class="login_utill">
 						<li class="lu_kakao">
 							<a href="javascript:void(0);" onclick="cfnLoginKakao();">

+ 1 - 0
src/main/webapp/WEB-INF/views/mob/customer/NiceCallbackFormMob.html

@@ -18,6 +18,7 @@
 	<form name="niceCallbackForm" id="niceCallbackForm" method="post" th:action="${redirectUrl}">
 		<input type="hidden" name="sEncData" th:value="${sEncData}"/>
 		<input type="hidden" name="authMethod" th:value="${authMethod}"/>
+		<input type="hidden" name="custParams" th:value="${custParams}"/>
 	</form>
 <script th:inline="javascript">
 	/*<![CDATA[*/

+ 1 - 0
src/main/webapp/WEB-INF/views/mob/customer/NiceCellPhoneFormMob.html

@@ -20,6 +20,7 @@
 	<input type="hidden" name="m" value="checkplusSerivce" />
 	<input type="hidden" name="EncodeData" th:value="${sEncData}" />
 	<input type="hidden" name="param_r1" th:value="${redirectUrl}"/>
+	<input type="hidden" name="param_r2" th:value="${custParams}"/>
 </form>
 
 <script th:inline="javascript">

+ 17 - 5
src/main/webapp/WEB-INF/views/mob/mypage/MypageGiftcardFormMob.html

@@ -216,15 +216,27 @@ function useGiftcard(result) {
 		let useGiftcard = giftcardUseList[i];
 		tmtbHtml += '	<li>                                                               ';
 		tmtbHtml += '		<div>                                                          ';
-		tmtbHtml += '			<span class="tag deepgray">차감</span>                       ';
-		tmtbHtml += '			<span class="tag_name">상품구매</span>                         ';
+		if (useGiftcard.gfcdAmt<0) {
+			tmtbHtml += '			<span class="tag deepgray">차감</span>                       ';
+		}else{
+			tmtbHtml += '		    <span class="tag primary">적립</span>';
+		}
+		
+		tmtbHtml += '			<span class="tag_name">'+useGiftcard.occurDtlDesc+'</span>                         ';
 		tmtbHtml += '			<span class="txt_content">'	+ useGiftcard.goodsNm + '</span>   ';
 		tmtbHtml += '			<span class="txt_time">'+useGiftcard.regDt+'</span>          ';
 		tmtbHtml += '		</div>                                                         ';
 		tmtbHtml += '		<div>                                                          ';
-		tmtbHtml += '			<span class="amount_minus">                                ';
-		tmtbHtml += '				<em>'+useGiftcard.gfcdAmt.addComma()+'</em>원                                      ';
-		tmtbHtml += '			</span>                                                    ';
+		if (useGiftcard.gfcdAmt<0) {
+			tmtbHtml += '			<span class="amount_minus">                                ';
+			tmtbHtml += '				<em>'+useGiftcard.gfcdAmt.addComma()+'</em>원                                      ';
+			tmtbHtml += '			</span>                                                    ';
+		}else{
+			tmtbHtml += '			<span class="amount_plus">                                ';
+			tmtbHtml += '				<em>'+useGiftcard.gfcdAmt.addComma()+'</em>원                                      ';
+			tmtbHtml += '			</span>                                                    ';
+		}
+		
 		tmtbHtml += '		</div>                                                         ';
 		tmtbHtml += '	</li>                                                              ';
 	}

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

@@ -3,7 +3,7 @@
 	xmlns:th="http://www.thymeleaf.org">
 <!--
  *******************************************************************************
- * @source  : SigninFormWeb.html
+ * @source  : SnsCallBackFormWeb.html
  * @desc    : 로그인 Page
  *============================================================================
  * STYLE24

+ 2 - 0
src/main/webapp/WEB-INF/views/web/cart/CartChangeOptionPopupWeb.html

@@ -187,6 +187,8 @@
 						</th:block>
 					</th:block>
 					<div class="opt_count">
+						<input type="hidden" class="minOrdQty" th:value="${cart.minOrdQty}" />
+						<input type="hidden" class="maxOrdQty" th:value="${cart.maxOrdQty}" />
 						<div class="opt_header">
 							<span class="title">수량</span>
 						</div>

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

@@ -572,19 +572,19 @@
 			temp.optCd 			= "13256848-2";
 			temp.goodsQty 		= 3;
 			temp.goodsType 		= "G056_N";
-			temp.cartGb 		= "G";
+			temp.cartGb 		= "C";
 			temp.afLinkCd 		= "afLinkCd";
 			temp.ithrCd 		= "G027_ZZZ";
 			temp.contentsLoc 	= "G028_YYY";
 			temp.planDtlSq 		= "123";
 			compsList.push(temp);
 
-			temp 			= new Object;
+			temp 				= new Object;
 			temp.goodsCd 		= "AOW13QDM76";
 			temp.optCd 			= "13256848-6";
 			temp.goodsQty 		= 3;
 			temp.goodsType 		= "G056_N";
-			temp.cartGb 		= "G";
+			temp.cartGb 		= "C";
 			temp.afLinkCd 		= "afLinkCd";
 			temp.ithrCd 		= "G027_ZZZ";
 			temp.contentsLoc 	= "G028_YYY";

+ 19 - 6
src/main/webapp/WEB-INF/views/web/cart/CartListFormWeb.html

@@ -301,24 +301,37 @@
 	$(document).on('click','.optModify_pop .number_count .minus',function(e){
 		var $input = $(this).parent().find('input');
 		var count = parseInt($input.val()) - 1;
-		count = count < 1 ? 1 : count;
+		var minOrdQty = $(this).parent().parent().find(".minOrdQty").val();
+
+		count = count < minOrdQty ? minOrdQty : count;
 		$input.val(count);
 		$input.change();
 		//수량1개 이하 감소버튼 비활성화
-		if ($input.val() == 1) {
+		if ($input.val() == minOrdQty) {
 			$('.optModify_pop .number_count .minus').addClass('min_val');
 		}
+
+		$('.optModify_pop .number_count .plus').removeClass('min_val');
+
 		return false;
 	}).on('click','.optModify_pop .number_count .plus',function(e){
 		var $input = $(this).parent().find('input');
-		$input.val(parseInt($input.val()) + 1);
+		var count = parseInt($input.val()) + 1;
+		var maxOrdQty = $(this).parent().parent().find(".maxOrdQty").val();
+
+		count = count > maxOrdQty ? maxOrdQty : count;
+		$input.val(count);
 		$input.change();
-		//수량2개 이상부터 감소버튼 활성화
+
+		//주문 최대 수량 이상 증가버튼 비활성화
+		if ($input.val() == maxOrdQty) {
+			$('.optModify_pop .number_count .plus').addClass('min_val');
+		}
+
 		$('.optModify_pop .number_count .minus').removeClass('min_val');
 		return false;
 	}).on('keyup','.optModify_pop .number_count input[type=text]',function(e){
-		//텍스트, 0 입력금지
-		$(this).val($(this).val().replace(/[^1-9]/g,""));
+		$(this).val($(this).val().replace(/[^0-9]/g,""));
 	});
 
     //상품옵션변경 팝업 > 컬러선택 표기

+ 2 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageCreCancelDetailFormWeb.html

@@ -206,6 +206,8 @@
 <script th:inline="javascript">
 	/*<![CDATA[*/
 	let oneData = [[${oneData}]];
+	let kcpReceiptUrl = [[${@environment.getProperty('pg.kcp.receipt.url')}]];
+	let refundYn = [[${refundYn}]];
 
 	$(document).ready(function() {
 		// 마이페이지 LNB 설정

+ 14 - 3
src/main/webapp/WEB-INF/views/web/mypage/MypageGiftcardFormWeb.html

@@ -202,15 +202,26 @@
 			for (let i = 0; i < giftcardUseList.length; i++) {
 				let useGiftcard = giftcardUseList[i];
 				tmtbHtml += '<tr>';
-				tmtbHtml += '<td><span class="tag deepgray">차감</span></td>';
+				if(useGiftcard.gfcdAmt > 0){
+					tmtbHtml += '		<td><span class="tag primary">적립</span></td>';
+				}else{
+					tmtbHtml += '		<td><span class="tag deepgray">차감</span></td>';
+				}
 				tmtbHtml += '<td>';
 				tmtbHtml += '<div class="txt_content">'	+ useGiftcard.goodsNm + '</div>';
 				tmtbHtml += '</td>';
-				tmtbHtml += '<td><span class="amount_minus"> <em>'
-						/* + '-' */
+				if(useGiftcard.gfcdAmt<0){
+					tmtbHtml += '<td><span class="amount_minus"> <em>'
 						+ ' '
 						+ useGiftcard.gfcdAmt.addComma()
 						+ '</em>원';
+				}else{
+					tmtbHtml += '<td><span class="amount_plus"> <em>'
+						+ ' '
+						+ useGiftcard.gfcdAmt.addComma()
+						+ '</em>원';
+				}
+				
 				tmtbHtml += '</span></td>';
 				tmtbHtml += '<td>' + useGiftcard.regDt
 						+ '</td>';

+ 1 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html

@@ -569,6 +569,7 @@
 				let data = {};
 				data.ordNo = ordNo;
 				data.chgReason = 'G686_10';
+				data.chgReasonNm = '고객변심';
 				data.accountNo = accountNo;
 				data.accountNm = accountNm;
 				data.bankCd = bankCd;

+ 92 - 0
src/main/webapp/WEB-INF/views/web/order/OrderAddPaymentCompleteWeb.html

@@ -0,0 +1,92 @@
+<!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  : OrderAddPaymentWeb.html
+ * @desc    : 추가결제화면 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.13   jsh77b     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+
+<div id="container" class="container od">
+	<div class="wrap">
+		<div class="content completed">
+			<div class="cont_head">
+				<h2>결제완료</h2>
+			</div>
+			<div class="cont_body">
+				<!-- CONT-BODY -->
+				<div class="od_cont">
+					<div class="sec_head">
+						<div class="info_complete">
+							<p class="txt_box">감사합니다. <span th:text="${chgerNm}"></span> 고객님의 결제가 완료되었습니다.</p>
+						</div>
+					</div>
+					<div class="sec_body">
+						<div class="area_payinfo">
+							<h3>결제정보</h3>
+							<div class="tbl type6">
+								<table>
+									<colgroup>
+										<col width="50%">
+										<col width="50%">
+									</colgroup>   
+									<tr>
+										<td>
+											<dl>
+												<div>
+													<dt>반품/교환 배송비</dt>
+													<dd><em th:text="|${#numbers.formatInteger(addPayCost, 1, 'COMMA')}|"></em>원</dd>	
+												</div>
+											</dl>
+										</td>
+										<td>
+											<dl>
+												<div>
+													<dt>결제 금액</dt>
+													<dd>
+														<div class="price">
+															<span class="pay_total_price">
+																<em th:text="|${#numbers.formatInteger(addPayCost, 1, 'COMMA')}|">3,546,200</em>원
+															</span>
+														</div>
+													</dd>
+												</div>
+												<!-- 신용카드 일때 -->
+												<div>
+													<dt class="sr-only">결제방법</dt>
+													<dd>신용카드</dd>
+												</div>
+												<!-- //신용카드 일때 -->
+											</dl>
+										</td>
+									</tr>
+								</table>
+							</div>
+						</div>
+					</div>
+					<div class="sec_foot">
+						<div class="btn_group_md">
+							<button type="button" class="btn btn_dark btn_md"><span>쇼핑 계속하기</span></button>
+						</div>
+					</div>
+				</div>
+				<!-- //CONT-BODY -->
+			</div>
+		</div>
+	</div>
+</div>
+
+<script th:inline="javascript">
+</script>
+</th:block>
+</body>
+</html>

+ 100 - 23
src/main/webapp/WEB-INF/views/web/order/OrderAddPaymentWeb.html → src/main/webapp/WEB-INF/views/web/order/OrderAddPaymentFormWeb.html

@@ -15,10 +15,27 @@
  -->
 <body>
 <th:block layout:fragment="content">
-<form class="form_wrap">
 
-<!--  container -->
-<div id="container" class="container od">
+<!-- payment.js -->
+<script type="text/javascript" th:src="${@environment.getProperty('pg.kcp.js.url')}" src=""></script>
+<script type="text/javascript" src="/biz/payment.js"></script>
+
+<!-- 주문정보form -->
+<form id="order_info" name="order_info" method="post" action="/order/addPay/result/response" style="display:none"></form>
+<!-- //주문정보form -->
+
+<form class="form_wrap" name="addPayForm" id="addPayForm">
+	<input type="hidden" name="refundAmt" th:value="${refundAmt}">
+	<input type="hidden" name="addPayCost" th:value="${addPayCost}">
+	<input type="hidden" name="ordChgSq" th:value="${ordChgSq}">
+	
+	<input type="hidden" name="chgGb" th:value="${chgGb}">
+	<input type="hidden" name="chgerPhnno" th:value="${chgerPhnno}">
+	<input type="hidden" name="chgerNm" th:value="${chgerNm}">
+	<input type="hidden" name="goodsNm" th:value="${goodsNm}"> 
+	
+	<!--  container -->
+	<div id="container" class="container od">
 		<div class="wrap">
 			<div class="content odPayment"> <!-- 페이지특정 클래스 = odPayment 클래스 추가 -->
 				<div class="cont_head">
@@ -37,11 +54,11 @@
 											<div class="paymethod_box">
 												<ul class="sel_method">
 													<li>
-														<input type="radio" name="rdi-paynormal" id="payCreditCard" value="" checked="checked">
+														<input type="radio" name="rdi-paynormal" id="payCreditCard" class="KCP" value="KCP|G014_30" checked="checked">
 														<label for="payCreditCard"><span>신용카드</span></label>
 													</li>
 													<li>
-														<input type="radio" name="rdi-paynormal" id="payCellphone" value="">
+														<input type="radio" name="rdi-paynormal" id="payCellphone" class="KCP" value="KCP|G014_60">
 														<label for="payCellphone"><span>휴대폰 결제</span></label>
 													</li>
 												</ul>
@@ -52,13 +69,13 @@
 								<div class="area_paymentinfo">
 									<div class="paymentinfo">
 										<div class="payinfo_blk">
-											<a href="">개인정보 제공에 대한 동의<span>보기</span></a>
+											<a href="javascript:void(0);">개인정보 제공에 대한 동의<span>보기</span></a>
 											<div class="infotxt">
 												개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.개인정보제공에 대한 동의 내용입니다.
 											</div>
 										</div>
 										<div class="payinfo_blk">
-											<a href="">결제대행 서비스 약관 동의<span>보기</span></a>
+											<a href="javascript:void(0);">결제대행 서비스 약관 동의<span>보기</span></a>
 											<div class="infotxt">
 												결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.결제대행서비스 약관 동의 내용입니다.
 										</div>
@@ -70,7 +87,9 @@
 							</div>
 							<div class="area_paybtn">
 								<div class="form_field">
-									<button type="button" class="btn btn_primary btn_block"><span>동의 후 <em>123,456,789원</em> 결제하기</span></button>
+									<button type="button" class="btn btn_primary btn_block" id="btn_payment">
+										<span>동의 후 <em th:text="|${#numbers.formatInteger(addPayCost, 1, 'COMMA')}원|"></em> 결제하기</span>
+									</button>
 								</div>
 							</div>
 						</div>
@@ -81,46 +100,58 @@
 							<div class="od_item_box">
 								<!-- 반품상품 내역 -->
 								<div class="part_dlvr">
-									<h4 class="sr-only">반품상품</h4>
+									<th:block th:if="${chGb} == 'G680_20'">
+										<h4 class="sr-only">반품상품</h4>
+									</th:block>
+									<th:block th:if="${chGb} == 'G680_30'">
+										<h4 class="sr-only">반품상품</h4>
+									</th:block>
+									<th:block th:if="${chGb} == 'G680_40'">
+										<h4 class="sr-only">교환상품</h4>
+									</th:block>
 									<div class="gd_list">
+										<th:block th:each="goods, i : ${orderAddPayGoodsList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
 										<div class="item_gd">
 											<figure>
-												<span class="thumb"><img src="/images/pc/thumb/tmp_odSide1.jpg" alt=""></span>
+												<span class="thumb">
+													<img th:src="${imageUrl + '/' + goods.sysImgNm}" src="/" width="100%" alt="">
+												</span>
 												<figcaption>
-													<div class="brand">CURLYSUE 컬리수</div>
-													<div class="name">[★2020 겨울신상★] 리버시블 경량점퍼 CPW0XQJM51 [겨울] 리버시블 경량점퍼 CPW0XQJM51 [겨울]</div>
+													<div class="brand" th:text="${goods.brandEnm} + ' ' + ${goods.brandKnm}"></div>
+													<div class="name goodsNm" th:text="${goods.goodsNm}"></div>
+													<div class="option" th:each="colorNm, index : ${goods.colorNmArr}">
+														<span th:text="${colorNm}+'/'+${goods.optCd2Arr[index.index]}"></span> 
+													</div>
 													<div class="option">
-														<span>01_루돌프융기모상하복_D오렌지/110</span>
-														<span>울핸드메이드 벨티드재킷 SWHJKJ42010 / BROWN</span>
-														<span>BLACK / XXL</span>
-														<span>수량&nbsp;<em>99</em>개</span>
+														<span>수량:<em th:text="${goods.chgQty}"></em>개</span>
 													</div>
 													<div class="price">
-														<span class="selling_price">1,000,000</span>
+														<span class="selling_price" th:text="${#numbers.formatInteger((goods.currPrice + goods.optAddPrice) * goods.chgQty, 1, 'COMMA')}"></span>
 													</div>
 												</figcaption>
 											</figure>
 										</div>
-									</div>              
+										</th:block>
+									</div>
 								</div>
-								<!-- //반품상품 내역 -->                   
+								<!-- //반품상품 내역 -->
 							</div>
 							<div class="od_amount_box">
 								<dl>
 									<div>
 										<dt>환불 상품금액</dt>
-										<dd><em>1,590,000</em>원</dd>
+										<dd><em th:text="|${#numbers.formatInteger(refundAmt, 1, 'COMMA')}|"></em>원</dd>
 									</div>
 									<div>
 										<dt>반품/교환 배송비</dt>
-										<dd><em>0원</em></dd>
+										<dd><em th:text="|${#numbers.formatInteger(addPayCost, 1, 'COMMA')}|"></em></dd>
 									</div>
 								</dl>
 							</div>
 							<div class="totalprice_box">
 								<dl>
 									<dt>총 결제 예정 금액</dt>
-									<dd><span>3,546,200</span>원</dd>
+									<dd><span th:text="|${#numbers.formatInteger(addPayCost, 1, 'COMMA')}|"></span>원</dd>
 								</dl>
 								<p class="info_extra">
 									환불할 상품금액이 반품/교환 배송비보다 적을<br>
@@ -130,7 +161,7 @@
 							</div>
 						</div>
 					</div>
-					<!-- // CONT-BODY -->					
+					<!-- // CONT-BODY -->
 				</div>
 			</div>
 		</div>
@@ -139,6 +170,52 @@
 </form>
 
 <script th:inline="javascript">
+//결재하기
+$("#btn_payment").on("click", function(){
+	var paynormal			= $("input[name='rdi-paynormal']:checked").val();
+	var paynormalArr		= paynormal.split("|");
+	var pgGb				= paynormalArr[0];
+	var payMeans			= paynormalArr[1];
+	
+	// 주문데이타 생성
+	var orderData = {
+		"pgGb"					: pgGb
+		,"payMeans"				: payMeans // 네이버페이, 카카오페이
+		,"addPayCost"			: $("#addPayForm input[name=addPayCost]").val()
+		,"ordChgSq"				: $("#addPayForm input[name=ordChgSq]").val()
+		,"chgGb"				: $("#addPayForm input[name=chgGb]").val()
+		,"chgerPhnno"			: $("#addPayForm input[name=chgerPhnno]").val()
+		,"chgerNm"				: $("#addPayForm input[name=chgerNm]").val()
+		,"goodsNm"				: $("#addPayForm input[name=goodsNm]").val()
+	};
+	
+	$.ajax( {
+		type		: "POST",
+		url 		: '/order/addPayment',
+		data		: JSON.stringify(orderData),
+		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) {
+			// 결재정보로드
+			$("#order_info").html(result);
+			
+			var pgGb = $("#order_info input[name=pgGb]").val();
+			
+			if (pgGb == "NAVER") {
+				fnNaverPaymentReady();
+			} else if (pgGb == "KAKAO") {
+				fnKakaoPaymentReady();
+			} else if (pgGb == "KCP" || pgGb == "PAYCO") {
+				jsf__pay(document.order_info);
+			}
+		}
+	});
+});
 
 </script>
 </th:block>

+ 24 - 4
src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html

@@ -372,7 +372,12 @@ if(image.length>0){
 	html += '            <div class="swiper-wrapper">';
 	for (var i = 0; i < image.length; i++) {
 		html += '                	<div class="swiper-slide">';
-		html += '                    	<img alt="" src="'+ imgUrl + image[i].itemVal +'">';
+		if (image[i].linkOpenGb == 'M') {
+			html += '                    	<a href="http://'+image[i].linkUrl+'" target="_self">><img alt="" src="'+ imgUrl + image[i].itemVal +'"></a>';
+		}else{
+			html += '                    	<a href="http://'+image[i].linkUrl+'" target="_blank">><img alt="" src="'+ imgUrl + image[i].itemVal +'"></a>';
+		}
+		
 		html += '                	</div>';
 	}
 	html += '            </div>';
@@ -404,7 +409,13 @@ if(goods1.length>0){
 			html += '	<div>';
 			html += '        <h4>';
 			if (template[i].linkUrl != null && template[i].linkUrl != '') { /* 링크 변경 예정 */
-				html += '        <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+' <i class="ico_arrow"></i></a>';
+				console.log("template[i].linkOpenGb"+ template[i].linkOpenGb);
+				if (template[i].linkOpenGb == 'M') { //본창
+					html += '        <a href="http://'+template[i].linkUrl+'" target="_self">'+template[i].title+' <i class="ico_arrow"></i></a>';
+				}else{
+					html += '        <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+' <i class="ico_arrow"></i></a>';
+				}
+				
 			}else{
 				html += '        <a href="javascript:void(0)">'+template[i].title+'</a>';
 			}
@@ -469,7 +480,11 @@ if(goods2.length>0){
 			html += '	<div>';
 			html += '        <h4>';
 				if (template[i].linkUrl != null && template[i].linkUrl != '') { /* 링크 변경 예정 */
-					html+='            <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+'<i class="ico_arrow"></i></a>';
+					if (template[i].linkOpenGb == 'M') { //본창
+						html += '        <a href="http://'+template[i].linkUrl+'" target="_self">'+template[i].title+' <i class="ico_arrow"></i></a>';
+					}else{
+						html += '        <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+' <i class="ico_arrow"></i></a>';
+					}
 				}else{
 					html+='            <a href="javascript:void(0)">'+template[i].title+'</a>';
 				}
@@ -536,8 +551,13 @@ if(goods4.length>0){
 			html += '<div class="cont_head">';
 			html += '<div>';
 			html += '        <h4>';
+			console.log(template[i].linkOpenGb );
 			if (template[i].linkUrl != null && template[i].linkUrl != '') { /* 링크 변경 예정 */
-				html+='            <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+' <i class="ico_arrow"></i></a>';
+				if (template[i].linkOpenGb == "M") { //본창
+					html += '        <a href="http://'+template[i].linkUrl+'" target="_self">'+template[i].title+' <i class="ico_arrow"></i></a>';
+				}else{
+					html += '        <a href="http://'+template[i].linkUrl+'" target="_blank">'+template[i].title+' <i class="ico_arrow"></i></a>';
+				}
 			}else{
 				html+='            <a href="javascript:void(0)">'+template[i].title+'</a>';
 			}

+ 8 - 1
src/main/webapp/biz/mypage.js

@@ -290,13 +290,20 @@ var fnReceipt = function(param) {
 		// 팝업 크기 설정
 		option = 'width=370, height=625';
 	} else if (param == 'cancel') {
-		if (param.refunYn == 'Y') {
+		if (refundYn == 'Y') {
 			// TODO
 			// 취소전표 확인 처리
+			//receiptWin += '?cmd=card_bill';
+			//receiptWin += '&tno=' + oneData.pgTid;
+			//receiptWin += '&order_no=' + oneData.ordNo;
+			//receiptWin += '&trade_mony=' + oneData.refundAmt;
 		} else {
 			mcxDialog.alert('아직 전표생성이 되지 않았습니다.');
 			return false;
 		}
+		
+		// 팝업 크기 설정
+		option = 'width=455, height=815';
 	} else if (param == 'delivery') {
 		// URL 설정
 		receiptWin += '?cmd=card_bill';

+ 3 - 3
src/main/webapp/ux/style24_link.js

@@ -138,7 +138,7 @@ var cfnGoToPage = function(page, ithrCd) {
  * @since  : 2021/02/09
  * @author : jsshin
  */
-var cfnOpenCellphoneCertify = function (redirectUrl, custparams) {
+var cfnOpenCellphoneCertify = function (redirectUrl, custParams) {
 	var actionUrl = _frontUrl + "/customer/nice/cellphone/form";
 	var popupWidth = 420;
 	var popupHeight = 720;
@@ -150,8 +150,8 @@ var cfnOpenCellphoneCertify = function (redirectUrl, custparams) {
 		console.log('redirectUrl', redirectUrl);
 		if (!gagajf.isNull(redirectUrl)) {
 			actionUrl = actionUrl + "?redirectUrl=" + redirectUrl;
-			if (!gagajf.isNull(custparams)) {
-				actionUrl = actionUrl + "&custparams=" + custparams;
+			if (!gagajf.isNull(custParams)) {
+				actionUrl = actionUrl + "&custParams=" + custParams;
 			}
 			document.location.href = actionUrl;
 		}