Przeglądaj źródła

Merge remote-tracking branch 'origin/develop' into xodud1202

# Conflicts:
#	src/main/java/com/style24/front/biz/dao/TsfCartDao.java
#	src/main/java/com/style24/front/biz/service/TsfCartService.java
#	src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml
#	src/main/webapp/ux/style24_link.js
xodud1202 5 lat temu
rodzic
commit
6c26bd210e
27 zmienionych plików z 1575 dodań i 526 usunięć
  1. 175 118
      src/main/java/com/style24/front/biz/dao/TsfCartDao.java
  2. 86 46
      src/main/java/com/style24/front/biz/service/TsfCartService.java
  3. 70 25
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  4. 5 0
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  5. 62 14
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  6. 72 16
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  7. 20 26
      src/main/java/com/style24/front/biz/web/TsfOrderController.java
  8. 1 1
      src/main/java/com/style24/front/support/config/TsfWebMvcConfig.java
  9. 7 0
      src/main/java/com/style24/front/support/security/handler/TsfLoginSuccessHandler.java
  10. 7 4
      src/main/java/com/style24/persistence/domain/Cart.java
  11. 2 1
      src/main/java/com/style24/persistence/domain/Goods.java
  12. 121 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml
  13. 23 13
      src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml
  14. 12 8
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  15. 22 3
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml
  16. 2 0
      src/main/webapp/WEB-INF/views/web/common/layout/MypageLayoutWeb.html
  17. 84 0
      src/main/webapp/WEB-INF/views/web/customer/JoinCompleteFormWeb.html
  18. 28 10
      src/main/webapp/WEB-INF/views/web/customer/JoinFormWeb.html
  19. 291 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageExchangeFormWeb.html
  20. 9 65
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html
  21. 37 2
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListFormWeb.html
  22. 11 8
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListWeb.html
  23. 5 5
      src/main/webapp/WEB-INF/views/web/order/OrderDelvMemoChangePopWeb.html
  24. 40 12
      src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html
  25. 148 148
      src/main/webapp/WEB-INF/views/web/order/OrderNoMemberWeb.html
  26. 234 0
      src/main/webapp/ux/pc/js/cart.js
  27. 1 1
      src/main/webapp/ux/style24_link.js

+ 175 - 118
src/main/java/com/style24/front/biz/dao/TsfCartDao.java

@@ -15,122 +15,179 @@ import com.style24.persistence.domain.Order;
  */
 @ShopDs
 public interface TsfCartDao {
-    /**
-     * 장바구니 대상 상품 수량 조회
-     * @param Cart
-     * @return
-     * @author xodud1202
-     * @since 2021. 02. 01
-     */
-   int getHasGoodsCartCnt(Cart cart);
-
-    /**
-     * 장바구니 등록 상품 확인
-     * @param Cart
-     * @return
-     * @author xodud1202
-     * @since 2021. 02. 01
-     */
-    Collection<Integer> selectHasSetItemCartList(Cart param);
-
-    /**
-     * 장바구니 등록 상품 확인
-     * @param Cart
-     * @return
-     * @author xodud1202
-     * @since 2021. 02. 01
-     */
-    Collection<Integer> selectHasNormalDealItemCartList(Cart param);
-
-    /**
-     * 장바구니 신규 등록
-     * @param Cart
-     * @return void
-     * @author xodud1202
-     * @since 2021. 02. 01
-     */
-    void insertCartInfo(Cart param);
-
-    /**
-     * 장바구니 상세 신규 등록
-     * @param Cart
-     * @return void
-     * @author xodud1202
-     * @since 2021. 02. 01
-     */
-    void insertCartDetailInfo(Cart param);
-
-    /**
-     * 장바구니 상세 신규 등록
-     * @param Cart
-     * @return void
-     * @author xodud1202
-     * @since 2021. 02. 01
-     */
-    void updateCartInfo(Cart param);
-
-    /**
-     * 장바구니 이력 정보 저장
-     * @param Cart
-     * @return void
-     * @author xodud1202
-     * @since 2021. 02. 02
-     */
-    void insertCartHst(Cart param);
-
-    /**
-     * 장바구니 상세 이력 정보 저장
-     * @param Cart
-     * @return void
-     * @author xodud1202
-     * @since 2021. 02. 02
-     */
-    void insertCartDetailHst(Cart param);
-
-    /**
-     * 다다익선 기본 상품 조회
-     * @param Cart
-     * @return void
-     * @author xodud1202
-     * @since 2021. 02. 04
-     */
-    Collection<Order> selectMoreBetterApplyCartList(Order param);
-
-   /**
-    * 다다익선 적용 상품 SUM DATA 조회
-    * @param Cart
-    * @return void
-    * @author xodud1202
-    * @since 2021. 02. 04
-    */
-   Collection<Order> selectApplyMoreBetterCartInfoList(Order param);
-
-    /**
-     * 다다익선 SECTION 적용 조건 조회
-     * @param List<Integer>
-     * @return Collection<Order>
-     * @author xodud1202
-     * @since 2021. 02. 04
-     */
-    Collection<Order> selectTmtbSectionValList(List<Integer> param);
-
-    /**
-     * 장바구니 상품 조회
-     * @param Order
-     * @return Order
-     * @author xodud1202
-     * @since 2021. 02. 08
-     */
-    Collection<Order> getCartGoodsList(Order param);
-
-    /**
-     * 장바구니 상품 조회
-     * @param Order
-     * @return Order
-     * @author xodud1202
-     * @since 2021. 02. 08
-     */
-    Collection<Order> getCartListDelvFeeInfoList(Order param);
-
-    void deleteCart(Cart param);
+
+	/**
+	 * 장바구니 대상 상품 수량 조회
+	 * @param Cart
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 02. 01
+	 */
+	int getHasGoodsCartCnt(Cart cart);
+
+	/**
+	 * 장바구니 등록 상품 확인
+	 * @param Cart
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 02. 01
+	 */
+	Collection<Integer> selectHasSetItemCartList(Cart param);
+
+	/**
+	 * 장바구니 등록 상품 확인
+	 * @param Cart
+	 * @return
+	 * @author xodud1202
+	 * @since 2021. 02. 01
+	 */
+	Collection<Integer> selectHasNormalDealItemCartList(Cart param);
+
+	/**
+	 * 장바구니 신규 등록
+	 * @param Cart
+	 * @return void
+	 * @author xodud1202
+	 * @since 2021. 02. 01
+	 */
+	void insertCartInfo(Cart param);
+
+	/**
+	 * 장바구니 상세 신규 등록
+	 * @param Cart
+	 * @return void
+	 * @author xodud1202
+	 * @since 2021. 02. 01
+	 */
+	void insertCartDetailInfo(Cart param);
+
+	/**
+	 * 장바구니 상세 신규 등록
+	 * @param Cart
+	 * @return void
+	 * @author xodud1202
+	 * @since 2021. 02. 01
+	 */
+	void updateCartInfo(Cart param);
+
+	/**
+	 * 장바구니 이력 정보 저장
+	 * @param Cart
+	 * @return void
+	 * @author xodud1202
+	 * @since 2021. 02. 02
+	 */
+	void insertCartHst(Cart param);
+
+	/**
+	 * 장바구니 상세 이력 정보 저장
+	 * @param Cart
+	 * @return void
+	 * @author xodud1202
+	 * @since 2021. 02. 02
+	 */
+	void insertCartDetailHst(Cart param);
+
+	/**
+	 * 다다익선 기본 상품 조회
+	 * @param Cart
+	 * @return void
+	 * @author xodud1202
+	 * @since 2021. 02. 04
+	 */
+	Collection<Order> selectMoreBetterApplyCartList(Order param);
+
+	/**
+	 * 다다익선 적용 상품 SUM DATA 조회
+	 * @param Cart
+	 * @return void
+	 * @author xodud1202
+	 * @since 2021. 02. 04
+	 */
+	Collection<Order> selectApplyMoreBetterCartInfoList(Order param);
+
+	/**
+	 * 다다익선 SECTION 적용 조건 조회
+	 * @param List<Integer>
+	 * @return Collection<Order>
+	 * @author xodud1202
+	 * @since 2021. 02. 04
+	 */
+	Collection<Order> selectTmtbSectionValList(List<Integer> param);
+
+	/**
+	 * 장바구니 상품 조회
+	 * @param Order
+	 * @return Order
+	 * @author xodud1202
+	 * @since 2021. 02. 08
+	 */
+	Collection<Order> getCartGoodsList(Order param);
+
+	/**
+	 * 장바구니 상품 조회
+	 * @param Order
+	 * @return Order
+	 * @author xodud1202
+	 * @since 2021. 02. 08
+	 */
+	Collection<Order> getCartListDelvFeeInfoList(Order param);
+
+	/**
+	 * 장바구니담긴상품 고객번호 Update
+	 * @param cart - 장바구니 정보
+	 * @return 처리건수
+	 * @author gagamel
+	 * @date 2021. 2. 24
+	 */
+	int updateCartOfCustNo(Cart cart);
+
+	/**
+	 * 로그인 후 처리할 장바구니 목록 조회
+	 * @param cart - 장바구니 정보
+	 * @return
+	 * @author gagamel
+	 * @date 2021. 2. 24
+	 */
+	Collection<Cart> getCartListAfterLogin(Cart cart);
+
+	/**
+	 * 로그인 후 장바구니 수정
+	 * @param cart - 장바구니 정보
+	 * @author gagamel
+	 * @date 2021. 2. 24
+	 */
+	void updateCartAfterLogin(Cart cart);
+
+	/**
+	 * 로그인 후 장바구니단품 삭제
+	 * @param cart - 장바구니 정보
+	 * @author gagamel
+	 * @date 2021. 2. 24
+	 */
+	void deleteCartItemAfterLogin(Cart cart);
+
+	/**
+	 * 로그인 후 장바구니 삭제
+	 * @param cart - 장바구니 정보
+	 * @author gagamel
+	 * @date 2021. 2. 24
+	 */
+	void deleteCartAfterLogin(Cart cart);
+
+	/**
+	 * 로그인 후 장바구니이력 생성
+	 * @param cart - 장바구니 정보
+	 * @author gagamel
+	 * @date 2021. 2. 24
+	 */
+	void createCartHistoryAfterLogin(Cart cart);
+
+	/**
+	 * 장바구니 삭제
+	 * @param param - 장바구니 정보
+	 * @author xodud1202
+	 * @date 2021. 2. 24
+	 */
+	void deleteCart(Cart param);
 }

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

@@ -6,21 +6,17 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 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.TscOrderService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.session.TscSession;
 import com.style24.front.biz.dao.TsfCartDao;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Cart;
-import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsStock;
 import com.style24.persistence.domain.Login;
@@ -28,6 +24,8 @@ import com.style24.persistence.domain.Order;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.parameter.GagaMap;
+
 /**
  * 장바구니 Service
  *
@@ -65,7 +63,7 @@ public class TsfCartService {
 		}
 
 		// 장바구니 상품 및 재고 가능 여부 체크
-		for(Cart param : params) {
+		for (Cart param : params) {
 			cart.setJsessionId(TscSession.getSessionId());
 			cart.setRegNo(login.getCustNo());
 			cart.setUpdNo(login.getCustNo());
@@ -78,7 +76,7 @@ public class TsfCartService {
 			if (goods == null) {
 				throw new IllegalArgumentException("상품 정보가 존재하지 않습니다.");
 			}
-			if(TscConstants.GoodsStat.SOLDOUT.value().equals(goods.getGoodsStat())) {
+			if (TscConstants.GoodsStat.SOLDOUT.value().equals(goods.getGoodsStat())) {
 				throw new IllegalArgumentException("품절입니다.");
 			}
 
@@ -91,13 +89,13 @@ public class TsfCartService {
 			checkParam.setGoodsType(param.getGoodsType());
 			String stockResult = goodsService.getCheckStock(checkParam);
 
-			if(!"SUCCESS".equals(stockResult)) {
+			if (!"SUCCESS".equals(stockResult)) {
 				throw new IllegalArgumentException(stockResult);
 			}
 
 			cart.setGoodsCd(param.getGoodsCd());
 			int goodsCartCnt = cartDao.getHasGoodsCartCnt(param);
-			if(param.getGoodsQty() + goodsCartCnt > goods.getDayMaxOrdQty()) {
+			if (param.getGoodsQty() + goodsCartCnt > goods.getDayMaxOrdQty()) {
 				throw new IllegalArgumentException("1일 구매한도 수량이 초과되었습니다.");
 			}
 
@@ -105,7 +103,7 @@ public class TsfCartService {
 		}
 
 		// 장바구니 정보 수정
-		if(cart.getGoodsType().equals(TscConstants.GoodsType.SET.value())) {
+		if (cart.getGoodsType().equals(TscConstants.GoodsType.SET.value())) {
 			// 세트상품일 경우
 			saveSetTypeCartInfo(params);
 		} else {
@@ -137,16 +135,16 @@ public class TsfCartService {
 
 		// 장바구니 보유 CART_SQ 쿼리
 		int i = 1;
-		for(Cart param : params) {
+		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) {
+			if (cart.getCustNo() == 0) {
 				sb.append(cart.getCustNo()).append("\n AND JSESSION_ID = '").append(cart.getJsessionId()).append("'");
 			} else {
 				sb.append(cart.getCustNo());
 			}
 			sb.append("\n AND CD.ITEM_CD = '").append(param.getItemCd()).append("' \n AND CD.OPT_CD = '").append(param.getOptCd()).append("'");
-			if(i < params.size()) {
+			if (i < params.size()) {
 				i++;
 				sb.append("\n UNION ALL \n");
 			}
@@ -162,10 +160,10 @@ public class TsfCartService {
 		cart.setGoodsType(params.iterator().next().getGoodsType());
 		cart.setItemCdSql(sb.toString());
 
-		if("C".equals(params.iterator().next().getCartGb())) {
+		if ("C".equals(params.iterator().next().getCartGb())) {
 			cart.setCartGb(TscConstants.CartGb.CART.value());
-		} else if("O".equals(params.iterator().next().getCartGb())) {
-			if("P".equals(TsfSession.getFrontGb())) {
+		} else if ("O".equals(params.iterator().next().getCartGb())) {
+			if ("P".equals(TsfSession.getFrontGb())) {
 				cart.setCartGb(TscConstants.CartGb.PC_ORDER.value());
 			} else {
 				cart.setCartGb(TscConstants.CartGb.MOB_ORDER.value());
@@ -177,8 +175,8 @@ public class TsfCartService {
 		// 같은 장바구니 상품 확인
 		Collection<Integer> cartSqList = cartDao.selectHasSetItemCartList(cart);
 
-		if(cartSqList != null && cartSqList.size() > 0) {		// 장바구니 기존재
-			if(cartSqList.size() > 1) {							// 장바구니 조회 결과 이상시 insert or select 수정 필요
+		if (cartSqList != null && cartSqList.size() > 0) {		// 장바구니 기존재
+			if (cartSqList.size() > 1) {							// 장바구니 조회 결과 이상시 insert or select 수정 필요
 				throw new IllegalArgumentException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
 			} else {
 				cart.setCartSq(cartSqList.iterator().next());
@@ -188,7 +186,7 @@ public class TsfCartService {
 		} else {
 			cartDao.insertCartInfo(cart);					// 장바구니 마스터 정보 저장
 			cartDao.insertCartHst(cart);                    // 장바구니 이력 정보 저장
-			for(Cart param : params) {
+			for (Cart param : params) {
 				param.setCartSq(cart.getCartSq());
 				param.setRegNo(cart.getRegNo());
 				param.setCustNo(cart.getCustNo());
@@ -216,10 +214,10 @@ public class TsfCartService {
 		param.setJsessionId(TscSession.getSessionId());
 
 
-		if("C".equals(param.getCartGb())) {
+		if ("C".equals(param.getCartGb())) {
 			param.setCartGb(TscConstants.CartGb.CART.value());
-		} else if("O".equals(param.getCartGb())) {
-			if("P".equals(TsfSession.getFrontGb())) {
+		} else if ("O".equals(param.getCartGb())) {
+			if ("P".equals(TsfSession.getFrontGb())) {
 				param.setCartGb(TscConstants.CartGb.PC_ORDER.value());
 			} else {
 				param.setCartGb(TscConstants.CartGb.MOB_ORDER.value());
@@ -231,8 +229,8 @@ public class TsfCartService {
 		// 같은 장바구니 상품 확인
 		Collection<Integer> cartSqList = cartDao.selectHasNormalDealItemCartList(param);
 
-		if(cartSqList != null && cartSqList.size() > 0) {		// 장바구니 기존재
-			if(cartSqList.size() > 1) {							// 장바구니 조회 결과 이상시 insert or select 수정 필요
+		if (cartSqList != null && cartSqList.size() > 0) {		// 장바구니 기존재
+			if (cartSqList.size() > 1) {							// 장바구니 조회 결과 이상시 insert or select 수정 필요
 				throw new IllegalArgumentException("장바구니 조회에 실패하였습니다. 관리자에게 문의해주세요.");
 			} else {
 				param.setCartSq(cartSqList.iterator().next());
@@ -265,8 +263,8 @@ public class TsfCartService {
 		Collection<Order> cartGoodsList = cartDao.getCartGoodsList(order);
 
 		// 품절 아닌 상품만 체크
-		for(Order goods : cartGoodsList) {
-			if("N".equals(goods.getSoldoutYn())) {
+		for (Order goods : cartGoodsList) {
+			if ("N".equals(goods.getSoldoutYn())) {
 				cartSqs.add(goods.getCartSq());
 			}
 		}
@@ -365,7 +363,7 @@ public class TsfCartService {
 					}
 				}
 
-				if(applyInfo.getAmtTmtbSq() == section.getTmtbSq()) {
+				if (applyInfo.getAmtTmtbSq() == section.getTmtbSq()) {
 					// 금액 적용 다다익선
 					if(section.getSectionVal() <= applyInfo.getAmtTmtbSumAmt()) {			// 장바구니 수량 할인 기준 달성시
 						if(applyInfo.getAmtSectionVal() <= section.getSectionVal()) {			// 기존 달성된 기준치보다 할인폭이 클 경우 기준할인 수정
@@ -423,7 +421,7 @@ public class TsfCartService {
 				}
 			}
 
-			if(resultAmt.getTmtbDcAmt() > 0) {
+			if (resultAmt.getTmtbDcAmt() > 0) {
 				resultAmt.setCurrPrice(resultAmt.getTmtbDcAmt());
 			}
 		}
@@ -466,9 +464,9 @@ public class TsfCartService {
 		}
 
 		// 장바구니 정보에 수량 다다익선 정보 입력
-		for(Order cart : cartGoodsList) {
-			for(Order apply : tmtbApplyList) {
-				if(cart.getCartSq() == apply.getCartSq()) {
+		for (Order cart : cartGoodsList) {
+			for (Order apply : tmtbApplyList) {
+				if (cart.getCartSq() == apply.getCartSq()) {
 					cart.setTmtbDcAmt(apply.getTmtbDcAmt());
 					cart.setApplyQtySectionYn(apply.getApplyQtySectionYn());
 					cart.setQtyTmtbNm(apply.getQtyTmtbNm());
@@ -496,8 +494,8 @@ public class TsfCartService {
 		// 1. 장바구니 상품 배송단위별 건수 체크 로직 (자사:총알배송, 자사:일반배송, 입점업체, 예약배송)
 		Order delvOrder = new Order();
 
-		Collection<Order> wmsCartList 	= new ArrayList<Order>();
-		Collection<Order> delvCartList 	= new ArrayList<Order>();
+		Collection<Order> wmsCartList = new ArrayList<Order>();
+		Collection<Order> delvCartList = new ArrayList<Order>();
 
 		for (Order order : cartGoodsList) {
 			// 1.1 세트상품 옵션별 배열로 담기
@@ -531,7 +529,7 @@ public class TsfCartService {
 		List<Integer> cartSqArr = new ArrayList<Integer>();
 
 		// 장바구니 일련번호 세팅
-		for(Order param : params) {
+		for (Order param : params) {
 			cartSqArr.add(param.getCartSq());
 		}
 		delvInfo.setCartSqArr(cartSqArr.stream().mapToInt(Integer::intValue).toArray());
@@ -541,16 +539,16 @@ public class TsfCartService {
 
 		// 업체별 상품 합계 금액 저장
 		int compCnt = 0;
-		for(Order delv : delvFeeInfo) {
+		for (Order delv : delvFeeInfo) {
 			compCnt = 0;
-			for(Order param : params) {
-				if(param.getDelvFeeCd().equals(delv.getDelvFeeCd())) {
+			for (Order param : params) {
+				if (param.getDelvFeeCd().equals(delv.getDelvFeeCd())) {
 					compCnt++;
 					if("N".equals(param.getSoldoutYn())) {
 						delv.setCompSumPrice(delv.getCompSumPrice() + param.getCurrPrice());
 					}
 
-					if(compCnt == 1) {
+					if (compCnt == 1) {
 						param.setFirstCompYn("Y");
 					}
 					/* else {
@@ -561,13 +559,13 @@ public class TsfCartService {
 		}
 
 		// 장바구니 업체별 합계 금액으로 무료배송 여부 저장
-		for(Order delv : delvFeeInfo) {
-			for(Order param : params) {
-				if(param.getDelvFeeCd().equals(delv.getDelvFeeCd())) {		// TODO 자사 배송비는 어떤 금액으로 처리하는지 확인 후 조건 수정 필요 (WMS는 DELV_FEE_CD 동일한거 없음)
+		for (Order delv : delvFeeInfo) {
+			for (Order param : params) {
+				if (param.getDelvFeeCd().equals(delv.getDelvFeeCd())) {		// TODO 자사 배송비는 어떤 금액으로 처리하는지 확인 후 조건 수정 필요 (WMS는 DELV_FEE_CD 동일한거 없음)
 					param.setCompCnt(delv.getCompCnt());
-					if(TscConstants.DelvFeeCrite.FREE.value().equals(delv.getDelvFeeCrite())) {
+					if (TscConstants.DelvFeeCrite.FREE.value().equals(delv.getDelvFeeCrite())) {
 						param.setDelvFee(0);
-					} else if(TscConstants.DelvFeeCrite.NORMAL.value().equals(delv.getDelvFeeCrite()) && delv.getCompSumPrice() > delv.getMinOrdAmt()) {
+					} else if (TscConstants.DelvFeeCrite.NORMAL.value().equals(delv.getDelvFeeCrite()) && delv.getCompSumPrice() > delv.getMinOrdAmt()) {
 						param.setDelvFee(0);
 					} else {
 						param.setDelvFee(delv.getDelvFee());
@@ -590,9 +588,9 @@ public class TsfCartService {
 		}
 
 		// TODO 자사 배송비는 어떤 금액으로 처리하는지 확인 후 수정 필요
-		for(Order param : params) {
-			if("WMS".equals(param.getDelvFeeCd())) {
-				if(wmsSumPrice > 40000) {
+		for (Order param : params) {
+			if ("WMS".equals(param.getDelvFeeCd())) {
+				if (wmsSumPrice > 40000) {
 					param.setDelvFee(0);
 				} else {
 					param.setDelvFee(2500);
@@ -613,7 +611,7 @@ public class TsfCartService {
 				order.setSumRealPayAmt(order.getSumRealPayAmt() + cart.getTmtbDcAmt());
 
 				// 배송비 합계
-				if("Y".equals(cart.getFirstCompYn())) {
+				if ("Y".equals(cart.getFirstCompYn())) {
 					order.setTotDelvFee(order.getTotDelvFee() + cart.getDelvFee());
 				}
 			}
@@ -629,4 +627,46 @@ public class TsfCartService {
 	public void deleteCart(Cart param) {
 		cartDao.deleteCart(param);
 	}
+	/**
+	 * 로그인 후 장바구니 Update
+	 * 		회원 로그인 후 호출됨으로 세션 정보 있음
+	 * @param custNo - 고객번호
+	 * @author gagamel
+	 * @since 2021. 2. 24
+	 */
+	@Transactional("shopTxnManager")
+	public void updateCartToAfterLogin(Integer custNo) {
+		Cart cart = new Cart();
+		cart.setJsessionId(TsfSession.getSessionId());
+		cart.setCustNo(custNo);
+		cart.setUpdNo(custNo);
+		log.info("cart: {}", cart);
+
+		// 로그인 후 고객번호 Update
+		int procCnt = cartDao.updateCartOfCustNo(cart);
+
+		if (procCnt > 0) {
+			// 로그인 후 처리할 장바구니 목록
+			Collection<Cart> cartList = cartDao.getCartListAfterLogin(cart);
+
+			for (Cart updCart : cartList) {
+				updCart.setCustNo(custNo);
+
+				// 로그인 후 장바구니 수정
+				cartDao.updateCartAfterLogin(updCart);
+
+				// 로그인 후 장바구니단품 삭제
+				cartDao.deleteCartItemAfterLogin(updCart);
+
+				// 로그인 후 장바구니 삭제
+				cartDao.deleteCartAfterLogin(updCart);
+
+				// 로그인 후 장바구니 이력 생성(삭제할 장바구니번호가 있을 때만)
+				if (updCart.getDelCartSq() > 0) {
+					cartDao.createCartHistoryAfterLogin(updCart);
+				}
+			}
+		}
+	}
+
 }

+ 70 - 25
src/main/java/com/style24/front/biz/service/TsfCustomerService.java

@@ -5,11 +5,14 @@ import com.gagaframework.web.security.GagaPasswordEncoder;
 import com.style24.core.biz.service.TscCustomerService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.session.TscSession;
+import com.style24.front.support.security.TsfLoginDetails;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.Customer;
+import com.style24.persistence.domain.Login;
 import com.style24.persistence.domain.Point;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.stereotype.Service;
 
 import com.style24.front.biz.dao.TsfCustomerDao;
@@ -17,6 +20,11 @@ import com.style24.front.biz.dao.TsfCustomerDao;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 고객(회원) Service
  *
@@ -36,6 +44,10 @@ public class TsfCustomerService {
 	@Autowired
 	private GagaPasswordEncoder passwordEncoder;
 
+	@Autowired
+	private TsfLoginService loginService;
+
+
 	/**
 	 * 고객아이디 찾기
 	 *
@@ -45,9 +57,9 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 08
 	 */
 	public Customer getCustomerFindId(Customer customer) {
+		TscSession.setAttribute("maskingYn","Y");
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.encryptData(); // 데이터 암호하
-		TscSession.setAttribute("maskingYn","Y");
 		return coreCustomerService.getCustomerInfo(customer);
 	}
 
@@ -118,11 +130,11 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 15
 	 */
 	public Customer getCustomerFindByCi(String ci) {
+		TscSession.setAttribute("maskingYn","Y");
 		Customer customer = new Customer();
 		customer.setCi(ci);
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.encryptData();
-
 		return customerDao.getCustomerInfo(customer);
 	}
 
@@ -134,12 +146,12 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 15
 	 */
 	public Customer getCustomerFindByCellPhnno(String cellPhnno) {
+		TscSession.setAttribute("maskingYn","Y");
 		Customer customer = new Customer();
 		customer.setCellPhnno(cellPhnno);
 		customer.setHypenCellPhone(); // 010-0000-0000
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.encryptData();
-
 		return customerDao.getCustomerInfo(customer);
 	}
 
@@ -195,16 +207,28 @@ public class TsfCustomerService {
 	 * @since 2021. 02. 19
 	 */
 	@Transactional("shopTxnManager")
-	public void saveJoinCustomer(Customer customer) {
-		boolean isSnsJoin = isSnsJoin(customer);
-		if (isSnsJoin) {
+	public boolean saveJoinCustomer(Customer customer) {
+		boolean isJoin = true;
+		// 1. validation
+		customer.encryptData();
+		if (StringUtils.isNotBlank(customer.getSnsId())) {
 			customer.setEncodedPasswd(" ");
+			customer.setCustId(customer.getSnsType()+"_"+customer.getSnsId());
 		} else {
 			customer.setEncodedPasswd(passwordEncoder.encode(customer.getPasswd()));
 		}
-		customer.encryptData();
-		customerDao.createCustomer(customer);
-		saveJoinPostProcessing(customer);
+		customer.setCustStat(TscConstants.CustStat.ACTIVE.value());
+		customer.setCustGb(TscConstants.CustGb.NORMAL.value());
+		customer.setCustGrade(TscConstants.CustGrade.WELCOME.value());
+		int custCnt = customerDao.createCustomer(customer);
+
+		if (custCnt > 0) {
+			saveJoinPostProcessing(customer);
+		} else {
+			isJoin = false;
+		}
+
+		return isJoin;
 	}
 
 	/**
@@ -224,27 +248,48 @@ public class TsfCustomerService {
 
 
 	}
+
 	/**
-	 * SNS 가입인지 확인
-	 * @param customer - 일반가입, SNS 가입
-	 * @return boolean - sns 가입이면 true 아니면 false
+	 * 로그인 처리
+	 * @param custNo - 고객번호
+	 * @param request - 요청
 	 * @author jsshin
-	 * @since 2021. 02. 19
+	 * @since 2021. 02. 18
 	 */
-	public boolean isSnsJoin(Customer customer) {
-		boolean result = false;
-
-		if (StringUtils.isNotBlank(customer.getKkJoinId())) {
-			result = true;
-		}
-		if (StringUtils.isNotBlank(customer.getNvJoinId())) {
-			result = true;
-		}
-		if (StringUtils.isNotBlank(customer.getYsJoinId())) {
-			result = true;
+	public void getLogin(String custId, HttpServletRequest request) {
+		if (StringUtils.isBlank(custId)) {
+			throw new IllegalStateException("고객 아이디가 없습니다. 로그인 다시 해보시기 바랍니다.");
 		}
 
-		return result;
+		Login loginParam = new Login();
+		loginParam.setCustId(custId);
+		Login loginInfo = loginService.getLoginCheckInfo(loginParam);
+
+		// 권한 설정
+		List<SimpleGrantedAuthority> authorities = new ArrayList<>();
+		authorities.add(new SimpleGrantedAuthority(loginInfo.getCustGb()));
+
+		TsfLoginDetails loginDetails = new TsfLoginDetails(loginInfo, authorities);
+
+		// 최종로그인일시 Update
+		loginService.updateLastLoginDate(loginInfo.getCustNo());
+
+		// 로그인이력 생성
+		loginService.createLoginHistory(loginInfo.getCustNo());
+
+		// 세션 생성
+		this.createSession(request,  loginDetails);
+	}
+
+	/**
+	 * Session 생성
+	 * @param request - HttpServletRequest
+	 * @param loginDetails - 로그인 상세 정보
+	 */
+	private void createSession(HttpServletRequest request, TsfLoginDetails loginDetails) {
+		HttpSession session = request.getSession(true);
+		session.setMaxInactiveInterval(1800);
+		session.setAttribute("session", loginDetails);
 	}
 
 }

+ 5 - 0
src/main/java/com/style24/front/biz/service/TsfOrderService.java

@@ -71,6 +71,7 @@ public class TsfOrderService {
 		String shotDelvYn = "";
 		String selfGoodsYn = "";
 		String shipCompNm = "";
+		String shipCompCd = "";
 		String invoiceNo = "";
 		String giftPackYn = "";
 		String reviewYn = "";
@@ -90,6 +91,7 @@ public class TsfOrderService {
 					GagaMap ordDtlMap = new GagaMap();
 					ordDtlMap.set("ordDtlList", ordDtlList);
 					ordDtlMap.set("ordDtlStat", ordDtlList.iterator().next().getOrdDtlStat());
+					ordDtlMap.set("shipCompCd", shipCompCd);
 					ordDtlMap.set("shipCompNm", shipCompNm);
 					ordDtlMap.set("invoiceNo", invoiceNo);
 					ordDtlMap.set("reviewSq", reviewSq);
@@ -119,6 +121,7 @@ public class TsfOrderService {
 				ordDtlStat = tmpOrder.getOrdDtlStat();
 				shotDelvYn = tmpOrder.getShotDelvYn();
 				selfGoodsYn = tmpOrder.getSelfGoodsYn();
+				shipCompCd = tmpOrder.getShipCompCd();
 				shipCompNm = tmpOrder.getShipCompNm();
 				giftPackYn = tmpOrder.getGiftPackYn();
 				ordDtlList = new ArrayList<>();
@@ -133,6 +136,7 @@ public class TsfOrderService {
 				GagaMap ordDtlMap = new GagaMap();
 				ordDtlMap.set("ordDtlList", ordDtlList);
 				ordDtlMap.set("ordDtlStat", ordDtlList.iterator().next().getOrdDtlStat());
+				ordDtlMap.set("shipCompCd", shipCompCd);
 				ordDtlMap.set("shipCompNm", shipCompNm);
 				ordDtlMap.set("invoiceNo", invoiceNo);
 				ordDtlMap.set("reviewSq", reviewSq);
@@ -167,6 +171,7 @@ public class TsfOrderService {
 			GagaMap ordDtlMap = new GagaMap();
 			ordDtlMap.set("ordDtlList", ordDtlList);
 			ordDtlMap.set("ordDtlStat", ordDtlList.iterator().next().getOrdDtlStat());
+			ordDtlMap.set("shipCompCd", shipCompCd);
 			ordDtlMap.set("shipCompNm", shipCompNm);
 			ordDtlMap.set("invoiceNo", invoiceNo);
 			ordDtlMap.set("reviewSq", reviewSq);

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

@@ -6,11 +6,17 @@ import com.style24.core.biz.service.TscClauseService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.session.TscSession;
 import com.style24.front.biz.service.TsfKakaoService;
+import com.style24.front.biz.service.TsfLoginService;
 import com.style24.front.biz.thirdparty.NiceCertify;
+import com.style24.front.support.env.TsfConstants;
+import com.style24.front.support.security.TsfLoginDetails;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Customer;
+import com.style24.persistence.domain.Login;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -26,6 +32,11 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 고객(회원) Controller
  * 
@@ -44,14 +55,16 @@ public class TsfCustomerController extends TsfBaseController {
 	private TsfCustomerService customerService;
 
 	@Autowired
-	TscClauseService clauseService;
+	private TscClauseService clauseService;
 
 	@Autowired
-	TsfKakaoService kakaoService;
+	private TsfKakaoService kakaoService;
 
 	@Autowired
 	private NiceCertify niceCertify;
 
+
+
 	/**
 	 * 아이디 찾기 화면
 	 *
@@ -517,12 +530,13 @@ public class TsfCustomerController extends TsfBaseController {
 		GagaMap result = new GagaMap();
 
 		if (StringUtils.isBlank(customer.getCellPhnno())) {
-			throw new IllegalStateException("확인 할 이메일이 없습니다.");
+			throw new IllegalStateException("확인 할 휴대폰번호가 없습니다.");
 		}
 
 		Customer custInfo = customerService.getCustomerFindByCellPhnno(customer.getCellPhnno());
 
 		if (custInfo != null) {
+			result.setString("maskingCustId", custInfo.getMaskingCustId());
 			result.setBoolean("isFind", true);
 		} else {
 			result.setBoolean("isFind", false);
@@ -556,6 +570,7 @@ public class TsfCustomerController extends TsfBaseController {
 
 		Customer custInfo = customerService.getCustomerFindByCi(customer.getCi());
 		if (custInfo != null) {
+			result.setString("maskingCustId", custInfo.getMaskingCustId());
 			result.setBoolean("isFind", true);
 		} else {
 			result.setBoolean("isFind", false);
@@ -575,35 +590,68 @@ public class TsfCustomerController extends TsfBaseController {
 	 */
 	@PostMapping("/join/save")
 	@ResponseBody
-	public GagaMap saveJoinCustomer(@RequestBody Customer customer) {
+	public GagaMap saveJoinCustomer(@RequestBody Customer customer, HttpServletRequest request) {
 		GagaMap result = new GagaMap();
+
+		// 1.세션에 인코딩된 데이터를 가져온다.
 		String encData = TscSession.getAttribute("encData");
 		customer.setEncData(encData);
 		GagaMap authInfo = niceCertify.getCertifyCellPhoneResultInfo(customer);
+
+		// 2.인증통해 받은 데이터 매핑
+		String gender = "G007_"+authInfo.getString("sGender");
+		customer.setSexGb(gender);
 		customer.setCustNm(authInfo.getString("sName"));
 		customer.setBirthYmd(authInfo.getString("sBirthDate"));
 		customer.setForeignerYn(authInfo.getString("sforeignerYn"));
 		customer.setCi(authInfo.getString("sCi"));
-		String gender = "G007_"+authInfo.getString("sGender");
-		customer.setSexGb(gender);
+
 		customer.setSiteCd(TscConstants.Site.STYLE24.value());
 		customer.setFrontGb(TsfSession.getFrontGb());
 		customer.setAfLinkCd(TsfSession.getAttribute("afLinkCd"));
 
-		// 1.입력 받은 데이터 검증
-
-		// 2.고객정보 생성 및 혜택 처리
-		customerService.saveJoinCustomer(customer);
-
-		// 3.알림톡 및 메일 발송
+		// 3.고객정보 생성 및 혜택 처리
+		boolean isJoin = customerService.saveJoinCustomer(customer);
+		// 4.알림톡 및 메일 발송
 		try {
-			kakaoService.sendJoinCongrat(customer);
+			if(StringUtils.isNotBlank(customer.getCellPhnno())) {
+				kakaoService.sendJoinCongrat(customer);
+			}
 		} catch (Exception e) {
 			log.error("error", e);
 		}
-		result.setBoolean("isJoin", true);
+
+		if (isJoin) {
+			customerService.getLogin(customer.getCustId(),request);
+		} else {
+			TsfSession.setAttribute("maskingCustId",customer.getMaskingCustId());
+		}
+
+		result.setBoolean("isJoin", isJoin);
 
 		return result;
 	}
 
+	/**
+	 * 가입완료 페이지
+	 *
+	 * @return GagaMap - 결과정보
+	 * @author jsshin
+	 * @since 2021. 02. 18
+	 */
+	@GetMapping("/join/complete/form")
+	public ModelAndView getJoinCompleteForm() {
+		ModelAndView mav = new ModelAndView();
+
+		String maskingCustId = TsfSession.getAttribute("maskingCustId");
+
+		mav.addObject("maskingCustId", maskingCustId);
+
+		mav.setViewName(super.getDeviceViewName("customer/JoinCompleteForm"));
+
+		return mav;
+	}
+
+
+
 }

+ 72 - 16
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -28,6 +28,7 @@ import com.style24.front.biz.service.TsfCustomerService;
 import com.style24.front.biz.service.TsfGiftcardService;
 import com.style24.front.biz.service.TsfOrderService;
 import com.style24.front.biz.service.TsfPointService;
+import com.style24.front.biz.service.TsfRendererService;
 import com.style24.front.biz.service.TsfReviewService;
 import com.style24.front.biz.service.TsfWishlistService;
 import com.style24.front.support.controller.TsfBaseController;
@@ -78,6 +79,9 @@ public class TsfMypageController extends TsfBaseController {
 
 	@Autowired
 	private TsfCouponService couponService;
+	
+	@Autowired
+	private TsfRendererService rendererService;
 
 	/**
 	 * 마이페이지 메인 화면
@@ -94,8 +98,9 @@ public class TsfMypageController extends TsfBaseController {
 			order = new Order();
 		}
 		
-		// int custNo = TsfSession.getInfo().getCustNo();
-		int custNo = 1000007;
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
+		order.setCustNo(custNo);
 
 		// 고객정보 조회
 		Customer customer = new Customer();
@@ -104,11 +109,6 @@ public class TsfMypageController extends TsfBaseController {
 		customer.setCustStat(TscConstants.CustStat.ACTIVE.value());
 		mav.addObject("customerInfo", coreCustomerService.getCustomerInfo(customer));
 
-		// 주문정보 조회
-		// Order order = new Order();
-		
-		order.setCustNo(custNo);
-
 		// 쿠폰정보 조회
 		mav.addObject("couponCnt", coreOrderService.getCouponInfo(order));
 		
@@ -143,8 +143,9 @@ public class TsfMypageController extends TsfBaseController {
 	public ModelAndView mypageOrderDetailForm(@PathVariable(value = "ordNo") int ordNo) {
 		ModelAndView mav = new ModelAndView();
 
-		// int custNo = TsfSession.getInfo().getCustNo();
-		int custNo = 1000007;
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
+		mav.addObject("custNo", custNo);
 
 		// 고객정보 조회
 		Customer customer = new Customer();
@@ -167,7 +168,8 @@ public class TsfMypageController extends TsfBaseController {
 		Collection<GagaMap> orderList = orderService.getOrderListForMypage(order);
 
 		if (orderList.size() == 0) {
-			throw new IllegalStateException(message.getMessage("ORDER_0001"));
+			mav.setViewName("redirect:/mypage/order/list/form");
+			return mav;
 		}
 
 		mav.addObject("orderList", orderList);
@@ -236,11 +238,11 @@ public class TsfMypageController extends TsfBaseController {
 	public GagaMap deleteOrder(@RequestBody Order order) {
 		GagaMap result = new GagaMap();
 
-		// int custNo = TsfSession.getInfo().getCustNo();
-		int custNo = 1000007;
-		
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
 		order.setUpdNo(custNo);
 		
+		// 주문내역 삭제 처리
 		int chk = orderService.updateOrderDisplayYn(order);
 
 		if (chk > 0) {
@@ -272,16 +274,70 @@ public class TsfMypageController extends TsfBaseController {
 			return result;
 		}
 
-		// int custNo = TsfSession.getInfo().getCustNo();
-		int custNo = 1000007;
-
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
 		order.setCustNo(custNo);
 		order.setRegNo(custNo);
 		order.setUpdNo(custNo);
 		
+		// 구매확정 처리
 		result = coreOrderService.decideOrder(order);
 		
 		return result;
 	}
 
+	/**
+	 * 마이페이지 교환신청 화면
+	 *
+	 * @param Order
+	 * @return ModelAndView
+	 * @author card007
+	 * @since 2021. 02. 22
+	 */
+	@PostMapping("/exchange/form")
+	@ResponseBody
+	public ModelAndView exchangeForm(Order order) {
+		ModelAndView mav = new ModelAndView();
+		
+		log.info("order >>> {}", order);
+		
+		// 주문번호 설정
+		mav.addObject("ordNo", order.getOrdNo());
+
+		// 고객번호 설정
+		int custNo = TsfSession.getInfo().getCustNo();
+		order.setCustNo(custNo);
+		mav.addObject("custNo", custNo);
+
+		// 고객정보 조회
+		Customer customer = new Customer();
+		customer.setSiteCd(TscConstants.Site.STYLE24.value());
+		customer.setCustNo(custNo);
+		customer.setCustStat(TscConstants.CustStat.ACTIVE.value());
+		customer = coreCustomerService.getCustomerInfo(customer);
+
+		mav.addObject("customerInfo", customer);
+
+
+		// 주문목록 조회
+		Collection<GagaMap> orderList = orderService.getOrderListForMypage(order);
+
+		if (orderList.size() == 0) {
+			mav.setViewName("redirect:/mypage/order/list/form");
+			return mav;
+		}
+
+		mav.addObject("orderList", orderList);
+
+		// 주문 배송지 정보 조회
+		mav.addObject("deliveryAddrInfo", orderService.getOrderDeliveryAddrInfo(order));
+		
+		// 교환 사유 목록 조회
+		mav.addObject("exchangeReason", rendererService.getCommonCodeList("G689", "Y"));
+		
+		mav.setViewName(super.getDeviceViewName("/mypage/MypageExchangeForm"));
+		
+		return mav;
+	}
+
 }

+ 20 - 26
src/main/java/com/style24/front/biz/web/TsfOrderController.java

@@ -7,6 +7,7 @@ import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.biz.service.TscFreegiftService;
@@ -51,7 +52,7 @@ public class TsfOrderController extends TsfBaseController {
 	 * @since 2021. 02. 02
 	 */
 	@RequestMapping(value = "/noMember")
-	public ModelAndView orderNoMember(Order order) {
+	public ModelAndView orderNoMember(Order order, RedirectAttributes redirectAttributes) {
 		ModelAndView mav = new ModelAndView();
 		
 		String rtnView = "";
@@ -62,26 +63,15 @@ public class TsfOrderController extends TsfBaseController {
 		// @ mobile 인 경우에는 본인인증 후 주문서 이동
 		// 배송완료 후 14일 자동구매확정
 		
-		// TODO 임시
-		// 1.0 회원, 비회원 여부 판단
-		if (TsfSession.getInfo() == null) {
-			rtnView = "order/OrderNoMember";
-		} else {
-			if (TsfSession.getInfo().getCustNo() == null) {
-				rtnView = "order/OrderNoMember";
-			} else {
-				rtnView = "forward:/order/form";
-			}
-		}
-		
 		// TODO 임시 장바구니
 		// 2. 장바구니시퀀스 배열 등록 (장바구니 상품 정보 조회)
 		int[] arr = {14,15,16,17,18,19,20,21,11,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,8,77};
 		order.setCartSqArr(arr);
 		order.setShotDelvYn("Y");
 		
-		mav.addObject("order" , order);	// 주문정보
-		mav.setViewName(super.getDeviceViewName(rtnView));
+		mav.addObject("order" 	, order);										// 주문정보
+		mav.addObject("isLogin"	, TsfSession.isLogin());						// 로그인여부
+		mav.setViewName(super.getDeviceViewName("order/OrderNoMember"));		// 비회원주문서화면
 		
 		return mav;
 	}
@@ -94,7 +84,7 @@ public class TsfOrderController extends TsfBaseController {
 	 * @author jsh77b
 	 * @since 2021. 02. 02
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({ "unchecked", "null" })
 	@RequestMapping(value = "/form")
 	public ModelAndView orderForm(Order order) {
 		ModelAndView mav = new ModelAndView();
@@ -106,23 +96,18 @@ public class TsfOrderController extends TsfBaseController {
 		// 임시 jsessionId
 		String jsessionId 	= "aaec62cc-5f91-47bb-ba65-ebc9a61385cf";
 		Boolean noMember 	= true;
-		
-		
+
 		// TODO 로그인체크 로직 추가
 		// 1.0 회원, 비회원 여부 판단
-		if (TsfSession.getInfo() == null) {
+		if (TsfSession.getInfo().getCustNo() == null) {
 			order.setJsessionId(jsessionId);
 		} else {
-			if (TsfSession.getInfo().getCustNo() == null) {
-				order.setJsessionId(jsessionId);
-			} else {
-				noMember = false;
-				order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
-			}
+			noMember = false;
+			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
 		}
 		
 		// 임시
-		order.setCustNo(1000006); // 고객번호등록
+		//order.setCustNo(1000006); // 고객번호등록
 		
 		// TODO
 		// 1.1 카트시퀀스가 없을때 처리 장바구니로 이동 
@@ -152,6 +137,15 @@ public class TsfOrderController extends TsfBaseController {
 			
 			// 1.2 배송지 정보조회 (기본배송지)
 			deliveryAddrInfo = coreOrderService.getDeliveryAddrInfo(order);
+			
+			if (deliveryAddrInfo == null) {
+				deliveryAddrInfo = new Order();
+				deliveryAddrInfo.setDelvAddrNm(custemerInfo.getCustNm());
+				deliveryAddrInfo.setRecipZipcode("");
+				deliveryAddrInfo.setRecipBaseAddr("");
+				deliveryAddrInfo.setRecipDtlAddr("");
+				deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
+			}
 		}
 
 		// TODO 임시 장바구니

+ 1 - 1
src/main/java/com/style24/front/support/config/TsfWebMvcConfig.java

@@ -61,7 +61,7 @@ public class TsfWebMvcConfig implements WebMvcConfigurer {
 			"/", "/index", "/signin/**",
 			"/images/**", "/ux/**",
 			"/error/**", "/data/**",
-			"/login", "/logout"
+			"/login", "/logout", "/order/noMember"
 		};
 
 		// 디바이스 해석

+ 7 - 0
src/main/java/com/style24/front/support/security/handler/TsfLoginSuccessHandler.java

@@ -14,6 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
 
+import com.style24.front.biz.service.TsfCartService;
 import com.style24.front.biz.service.TsfLoginService;
 import com.style24.front.support.env.TsfConstants;
 import com.style24.front.support.security.TsfLoginDetails;
@@ -50,6 +51,9 @@ public class TsfLoginSuccessHandler implements AuthenticationSuccessHandler {
 	@Autowired
 	private TsfLoginService loginService;
 
+	@Autowired
+	private TsfCartService cartService;
+
 	@Override
 	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
 		// 로그인 상세 정보
@@ -105,6 +109,9 @@ public class TsfLoginSuccessHandler implements AuthenticationSuccessHandler {
 			returnUrl = "/";
 		}
 
+		// 로그인 후 장바구니 Update
+		cartService.updateCartToAfterLogin(custNo);
+
 		GagaMap result = new GagaMap();
 		result.setString("status", "OK");
 		result.setString("returnUrl", returnUrl);

+ 7 - 4
src/main/java/com/style24/persistence/domain/Cart.java

@@ -1,11 +1,9 @@
 package com.style24.persistence.domain;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
 import com.style24.persistence.TscBaseDomain;
-import lombok.Data;
 
-import java.util.List;
+import lombok.Data;
 
 /**
  * 장바구니
@@ -18,7 +16,7 @@ import java.util.List;
 public class Cart extends TscBaseDomain {
 	// 장바구니 정보
 	private int cartSq;				// 장바구니 번호
-	private int cartDtlSq;          // 장바구니 상세 번호
+	private int cartDtlSq;			// 장바구니 상세 번호
 	private int custNo;				// 고객번호
 	private int planDtlSq;			// 기획전상세번호
 	private int goodsQty;			// 장바구니 등록 수량
@@ -58,4 +56,9 @@ public class Cart extends TscBaseDomain {
 	private String cpnNm;
 	private String rdCpnNm;
 	private String usedDt;
+
+	private String itemOpts;	// 단품옵션
+	private Integer updCartSq;	// 업데이트할 장바구니번호
+	private Integer delCartSq;	// 삭제할 장바구니번호(0이면 삭제할 장바구니번호 없음)
+
 }

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

@@ -73,7 +73,8 @@ public class Goods extends TscBaseDomain {
 	private String colorCd;		//색상코드
 	private String colorNM;		//색상코드명
 	private String brandnm;		//브랜드명
-	private String brandGrpNm;	//브랜드그룹명
+	private int brandGroupNo;	//브랜드그룹번호
+	private String brandGroupNm;	//브랜드그룹명
 	private String frontGb;		//프론트구분
 	private String isApp;		//앱구분
 	private String siteCd;		//사이트코드

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

@@ -630,4 +630,125 @@
 			#{item}
 		</foreach>
 	</delete>
+	
+	<!-- 장바구니담긴상품 고객번호 Update -->
+	<update id="updateCartOfCustNo" parameterType="Cart">
+		/* TsfCart.updateCartOfCustNo */
+		UPDATE TB_CART
+		SET    CUST_NO = #{custNo}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  JSESSION_ID = #{jsessionId}
+	</update>
+	
+	<!-- 로그인 후 처리할 장바구니 목록 조회 -->
+	<select id="getCartListAfterLogin" parameterType="Cart" resultType="Cart">
+		/* TsfCart.getCartListAfterLogin */
+		SELECT A.CART_GB
+		     , A.GOODS_CD
+		     , A.ITEM_OPTS
+		     , IFNULL(B.CART_SQ,A.CART_SQ) AS UPD_CART_SQ /*업데이트할 장바구니번호*/
+		     , CASE WHEN B.CART_SQ IS NOT NULL THEN
+		                A.CART_SQ
+		            ELSE
+		                0
+		       END                         AS DEL_CART_SQ /*삭제할 장바구니번호(0이면 삭제할 장바구니번호 없음)*/
+		FROM   (
+		        /*장바구니에 담을 상품 목록*/
+		        SELECT C.CART_SQ
+		             , C.CART_GB
+		             , C.GOODS_CD
+		             , GROUP_CONCAT(CONCAT(CD.ITEM_CD,':',CD.OPT_CD1,':',CD.OPT_CD2) ORDER BY CD.ITEM_CD, CD.OPT_CD1, CD.OPT_CD2 SEPARATOR ';') AS ITEM_OPTS
+		        FROM   TB_CART C
+		             , TB_CART_DETAIL CD
+		        WHERE  C.CART_SQ = CD.CART_SQ
+		        AND    C.CUST_NO = #{custNo}
+		        AND    C.JSESSION_ID = #{jsessionId}
+		        GROUP  BY C.CART_SQ, C.CART_GB, C.GOODS_CD
+		       ) A
+		LEFT OUTER JOIN (
+		        /*장바구니에 담긴 기존 상품 목록*/
+		        SELECT C.CART_SQ
+		             , C.CART_GB
+		             , C.GOODS_CD
+		             , GROUP_CONCAT(CONCAT(CD.ITEM_CD,':',CD.OPT_CD1,':',CD.OPT_CD2) ORDER BY CD.ITEM_CD, CD.OPT_CD1, CD.OPT_CD2 SEPARATOR ';') AS ITEM_OPTS
+		        FROM   TB_CART C
+		             , TB_CART_DETAIL CD
+		        WHERE  C.CART_SQ = CD.CART_SQ
+		        AND    C.CUST_NO = #{custNo}
+		        AND    C.JSESSION_ID <![CDATA[<>]]> #{jsessionId}
+		        GROUP  BY C.CART_SQ, C.CART_GB, C.GOODS_CD
+		       ) B
+		ON     A.CART_GB = B.CART_GB
+		AND    A.GOODS_CD = B.GOODS_CD
+		AND    A.ITEM_OPTS = B.ITEM_OPTS
+	</select>
+
+	<!-- 로그인 후 장바구니 수정 -->
+	<update id="updateCartAfterLogin" parameterType="Cart">
+		/* TsfCart.updateCartAfterLogin */
+		UPDATE TB_CART X
+		SET    GOODS_QTY = X.GOODS_QTY + IFNULL((SELECT GOODS_QTY
+		                                         FROM   TB_CART
+		                                         WHERE  CART_SQ = #{delCartSq}
+		                                         AND    CUST_NO = #{custNo}
+		                                        ),0)
+		WHERE  CART_SQ = #{updCartSq}
+		AND    CUST_NO = #{custNo}
+	</update>
+
+	<!-- 로그인 후 장바구니단품 삭제 -->
+	<delete id="deleteCartItemAfterLogin" parameterType="Cart">
+		/* TsfCart.deleteCartItemAfterLogin */
+		DELETE FROM TB_CART_DETAIL
+		WHERE  CART_SQ IN (SELECT CART_SQ
+		                   FROM   TB_CART
+		                   WHERE  CART_SQ = #{delCartSq}
+		                   AND    CUST_NO = #{custNo}
+		                  )
+	</delete>
+
+	<!-- 로그인 후 장바구니 삭제 -->
+	<delete id="deleteCartAfterLogin" parameterType="Cart">
+		/* TsfCart.deleteCartAfterLogin */
+		DELETE FROM TB_CART
+		WHERE  CART_SQ = #{delCartSq}
+		AND    CUST_NO = #{custNo}
+	</delete>
+	
+	<!-- 로그인 후 장바구니이력 생성 -->
+	<update id="createCartHistoryAfterLogin" parameterType="Cart">
+		/* TsfCart.createCartHistoryAfterLogin */
+		INSERT INTO TB_CART_HST (
+		       CART_SQ
+		     , CART_GB
+		     , GOODS_CD
+		     , GOODS_QTY
+		     , DEAL_GOODS_CD
+		     , ORD_NO
+		     , CUST_NO
+		     , AF_LINK_CD
+		     , ITHR_CD
+		     , CONTENTS_LOC
+		     , PLAN_DTL_SQ
+		     , REG_NO
+		     , REG_DT
+		)
+		SELECT CART_SQ
+		     , CART_GB
+		     , GOODS_CD
+		     , GOODS_QTY
+		     , DEAL_GOODS_CD
+		     , ORD_NO
+		     , CUST_NO
+		     , AF_LINK_CD
+		     , ITHR_CD
+		     , CONTENTS_LOC
+		     , PLAN_DTL_SQ
+		     , #{regNo}
+		     , NOW()
+		FROM   TB_CART C
+		WHERE  CART_SQ = #{updCartSq}
+	</update>
+	
 </mapper>

+ 23 - 13
src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml

@@ -151,8 +151,7 @@
 	<insert id="createCustomer" parameterType="Customer" keyProperty="custNo">
 		/* TsfCustomer.createCustomer */
 		INSERT INTO TB_CUSTOMER (
-		       CUST_NO
-		     , CUST_ID
+		       CUST_ID
 		     , CUST_NM
 		     , PASSWD
 		     , BIRTH_YMD
@@ -193,21 +192,29 @@
 		     , UPD_NO
 		     , UPD_DT
 		)
-		SELECT #{custNo}                           AS CUST_NO
-		     , #{custId}                           AS CUST_ID
+		SELECT #{custId}                           AS CUST_ID
 		     , #{encodedCustNm}                    AS CUST_NM
 		     , #{encodedPasswd}                    AS PASSWD
 		     , #{encodedBirthYmd}                  AS BIRTH_YMD
 		     , #{birthSm}                          AS BIRTH_SM
 		     , #{encodedSexGb}                     AS SEX_GB
 		     , #{encodedCellPhnno}                 AS CELL_PHNNO
-		     , #{appAgreeYn}                       AS APP_AGREE_YN
-		     , #{appAgreeDt}                       AS APP_AGREE_DT
-		     , #{smsAgreeYn}                       AS SMS_AGREE_YN
-		     , #{smsAgreeDt}                       AS SMS_AGREE_DT
+		     , IFNULL(#{appAgreeYn}, 'N')          AS APP_AGREE_YN
+		     , CASE WHEN #{appAgreeYn} = 'Y' THEN
+		            NOW()
+		       ELSE NULL
+		       END                                 AS APP_AGREE_DT
+		     , IFNULL(#{smsAgreeYn}, 'N')          AS SMS_AGREE_YN
+		     , CASE WHEN #{smsAgreeYn} = 'Y' THEN
+		            NOW()
+		       ELSE NULL
+		       END                                 AS SMS_AGREE_DT
 		     , #{encodedEmail}                     AS EMAIL
-		     , #{emailAgreeYn}                     AS EMAIL_AGREE_YN
-		     , #{emailAgreeDt}                     AS EMAIL_AGREE_DT
+		     , IFNULL(#{emailAgreeYn}, 'N')        AS EMAIL_AGREE_YN
+		     , CASE WHEN #{emailAgreeYn} = 'Y' THEN
+		            NOW()
+		       ELSE NULL
+		       END                                 AS EMAIL_AGREE_DT
 		     , #{homeZipcode}                      AS HOME_ZIPCODE
 		     , #{encodedHomeBaseAddr}              AS HOME_BASE_ADDR
 		     , #{encodedHomeDtlAddr}               AS HOME_DTL_ADDR
@@ -223,16 +230,19 @@
 		     , 'N'                                 AS TEMP_PASSWD_YN
 		     , NOW()                               AS LOGIN_LDT
 		     , #{ci}                               AS CI
-		     , NOW()                               AS AUTH_DT
+		     , CASE WHEN #{ci} != '' THEN
+		            NOW()
+		       ELSE NULL
+		       END                                 AS AUTH_DT
 		     , #{managedRsn}                       AS MANAGED_RSN
 		     , #{managedDtlRsn}                    AS MANAGED_DTL_RSN
 		     , #{managedDt}                        AS MANAGED_DT
 		     , #{secedeRsn}                        AS SECEDE_RSN
 		     , #{secedeDtlRsn}                     AS SECEDE_DTL_RSN
 		     , #{secedeDt}                         AS SECEDE_DT
-		     , #{custNo}                           AS REG_NO
+		     , 0                                   AS REG_NO
 		     , NOW()                               AS REG_DT
-		     , #{custNo}                           AS UPD_NO
+		     , 0                                   AS UPD_NO
 		     , NOW()                               AS UPD_DT
 	</insert>
 

+ 12 - 8
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -82,14 +82,14 @@
 		SELECT G.GOODS_CD
 		     , G.GOODS_NM
 		     , G.GOODS_TNM
-		     , CONCAT(IF(IFNULL(G.GOODS_GB,'') IN ('G073_11','G073_15', ''), '',CONCAT('[',FN_GET_CODE_NM('G073',G.GOODS_GB),']') )
+		     , CONCAT(IF(IFNULL(G.GOODS_GB,'') IN ('G073_11','G073_15', ''), '',IFNULL(CONCAT('[',FN_GET_CODE_NM('G073',G.GOODS_GB),']'),'') )
 		             ,IF(G.FOREIGN_BUY_YN='N','[해외구매대행]','' )
 		             ,IF(G.PARALLEL_IMPORT_YN = 'Y','[병행수입]','')
 		             ,IF(G.ORDER_MADE_YN='Y','[주문제작]','')
 		             ,G.GOODS_NM ) AS GOODS_FULL_NM
 		     , G.BRAND_CD
-		     , (CASE WHEN B.DISP_NM_LANG = 'EN' THEN B.BRAND_ENM ELSE B.BRAND_KNM END) AS BRAND_NM
-		     , B.BRAND_GRP_NM
+		     , (CASE WHEN D.DISP_NM_LANG = 'EN' THEN D.BRAND_GROUP_ENM ELSE D.BRAND_GROUP_KNM END) AS BRAND_GROUP_NM
+		     , D.BRAND_GROUP_NO
 		     , B.LOGO_FILE_NM
 		     , G.ITEMKIND_CD
 		     , G.FORMAL_GB
@@ -105,8 +105,8 @@
 		     , G.DAY_MAX_ORD_QTY
 		     , G.SEX_GB
 		     , FN_GET_CODE_NM('G007',G.SEX_GB) AS SEX_NM
-		     , G.DELV_FEE
-		     , G.MIN_ORD_AMT
+		     , E.DELV_FEE
+		     , E.MIN_ORD_AMT
 		     , G.GOODS_GB
 		     , (SELECT NI_CLSF_CD
 		        FROM TB_ITEMKIND
@@ -144,10 +144,14 @@
 		FROM TB_GOODS G
 		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
 		                      AND B.USE_YN = 'Y'
+		INNER JOIN TB_BRAND_GROUP D ON B.BRAND_GROUP_NO = D.BRAND_GROUP_NO
+		                            AND D.USE_YN = 'Y'
 		INNER JOIN (SELECT GOODS_CD, 
 		            FN_GET_BENEFIT_PRICE(#{frontGb},GOODS_CD, CURR_PRICE,#{custGb}) AS CURR_PRICE 
 		            FROM TB_GOODS
 		            WHERE GOODS_CD = #{goodsCd}) BP ON G.GOODS_CD = BP.GOODS_CD
+		INNER JOIN TB_DELV_FEE_POLICY E ON G.SUPPLY_COMP_CD = E.SUPPLY_COMP_CD
+		                                     AND G.DELV_FEE_CD =  E.DELV_FEE_CD
 		LEFT OUTER JOIN TB_WISHLIST W ON G.GOODS_CD = W.GOODS_CD
 		                              AND IFNULL(#{custNo}, 0) = W.CUST_NO
 		WHERE G.GOODS_CD = #{goodsCd}
@@ -531,7 +535,7 @@
 		           , RANK() OVER(PARTITION BY A.LOOKBOOK_SQ, B.LOOKBOOKB_SQ  ORDER BY C.DISP_ORD ) RNUM 
 		           , C.DISP_ORD 
 		           , G.GOODS_NM
-		           , CONCAT(IF(IFNULL(G.GOODS_GB,'') IN ('G073_11','G073_15', ''), '',CONCAT('[',FN_GET_CODE_NM('G073',G.GOODS_GB),']') )
+		           , CONCAT(IF(IFNULL(G.GOODS_GB,'') IN ('G073_11','G073_15', ''), '',IFNULL(CONCAT('[',FN_GET_CODE_NM('G073',G.GOODS_GB),']'),'') )
 		                   ,IF(G.FOREIGN_BUY_YN='N','[해외구매대행]','' )
 		                   ,IF(G.PARALLEL_IMPORT_YN = 'Y','[병행수입]','')
 		                   ,IF(G.ORDER_MADE_YN='Y','[주문제작]','')
@@ -578,8 +582,8 @@
 		                                  , B.VIDEO_VAL 
 		                                  , A.REG_DT 
 		                                  , RANK() OVER(PARTITION BY A.DISPLOC_VAL ORDER BY A.REG_DT ) RNUM 
-		                             FROM tb_video_disploc  A
-		                             INNER JOIN  tb_video B ON A.VIDEO_SQ = B.VIDEO_SQ 
+		                             FROM TB_VIDEO_DISPLOC  A
+		                             INNER JOIN  TB_VIDEO B ON A.VIDEO_SQ = B.VIDEO_SQ 
 		                                                    AND B.DISP_YN ='Y'
 		                             WHERE A.DISPLOC_GB ='G'
 		                             AND A.DISP_YN = 'Y'

+ 22 - 3
src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml

@@ -99,6 +99,12 @@
 					#{item}
 				</foreach>
 			</if>
+			<if test="ordDtlNoArr != null">
+		   AND OD.ORD_DTL_NO IN
+				<foreach collection="ordDtlNoArr" item="item" index="index"  open="(" close=")" separator=",">
+					#{item}
+				</foreach>
+			</if>
 		   AND O.DISP_YN = 'Y'
 		</where>
 		 ORDER BY OD.SUPPLY_COMP_CD
@@ -282,14 +288,27 @@
 			 , DA.RECIP_BASE_ADDR
 			 , DA.RECIP_DTL_ADDR
 			 , DA.DELV_MEMO
+			 , DL.RTN_LOC_NM
+			 , DL.RTN_LOC_TELNO
+			 , DL.RTN_LOC_ZIPCODE
+			 , DL.RTN_LOC_BASE_ADDR
+			 , DL.RTN_LOC_DTL_ADDR
 			 , DA.REG_NO
 			 , DA.REG_DT
 			 , DA.UPD_NO
 			 , DA.UPD_DT
 		  FROM TB_DELIVERY_ADDR DA
-		  INNER JOIN TB_ORDER_DETAIL OD
-		  ON OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
-			  AND OD.ORD_NO = #{ordNo}
+		 INNER JOIN TB_ORDER_DETAIL OD
+		    ON OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
+		   AND OD.ORD_NO = #{ordNo}
+		<if test="ordDtlNoArr != null">
+		   AND OD.ORD_DTL_NO IN
+			<foreach collection="ordDtlNoArr" item="item" index="index"  open="(" close=")" separator=",">
+				#{item}
+			</foreach>
+		</if>
+		  LEFT OUTER JOIN TB_DELIVERY_LOC DL
+		    ON OD.DELV_LOC_CD = DL.DELV_LOC_CD
 		 LIMIT 1
 	</select>
 

+ 2 - 0
src/main/webapp/WEB-INF/views/web/common/layout/MypageLayoutWeb.html

@@ -65,6 +65,8 @@
 <th:block th:replace="~{web/common/fragments/ScriptsWeb :: scripts}"></th:block>
 <!-- <th:block th:replace="~{web/common/fragments/MarketingScripts :: mscripts}"></th:block> -->
 
+<script th:src="@{'/ux/pc/js/cart.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/ux/pc/js/cart.js"></script>
+
 <script th:inline="javascript">
 /*<![CDATA[*/
 	var fnSetMypageLnbList = function(lnbLvl) {

+ 84 - 0
src/main/webapp/WEB-INF/views/web/customer/JoinCompleteFormWeb.html

@@ -0,0 +1,84 @@
+<!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  : JoinCompleteFormWeb.html
+ * @desc    : 회원 가입완료 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.22   jsshin     최초 작성
+ *******************************************************************************
+ -->
+
+<body>
+<th:block layout:fragment="content">
+<!--  container -->
+<div id="container" class="container mb">
+	<div class="wrap">
+		<div class="content join3">
+			<div class="cont_head">
+				<h3>style24</h3>
+			</div>
+			<div class="cont_body">
+				<div th:if="${maskingCustId != ''}" class="form_wrap form_col_c" role="form" >
+					<div class="form_head">
+						<h4>회원가입</h4>
+					</div>
+					<div class="form_info">
+						<span class="ico_content_find"></span>
+						<p>이미 가입된 아이디가 있습니다.</p>
+						<p class="t_info mt15">
+							아래의 아이디로 로그인 하시거나<br>
+							잊으신 경우 다시 찾기를 통해 이용 가능합니다.
+						</p>
+					</div>
+					<div class="print_bar mt30">
+						<p class="c_primary bold" data-font="lato">ID***24</p>
+					</div>
+					<div class="btn_group_block btn_group_md ui_row">
+						<div class="ui_col_6">
+							<button type="button" class="btn btn_dark btn_block"><span>로그인</span></button>
+						</div>
+						<div class="ui_col_6">
+							<button type="button" class="btn btn_default btn_block"><span>아이디 찾기</span></button>
+						</div>
+					</div>
+				</div>
+				<div th:unless="${maskingCustId != ''}"  class="form_wrap form_col_c" role="form">
+					<div class="form_head">
+						<h3>신규회원 혜택 안내</h3>
+					</div>
+					<div class="form_info">
+						오픈 콘텐츠 확정시 다시안내
+					</div>
+					<div class="mt40">
+						<button type="button"  class="btn btn_primary btn_block" onclick="cfnGoToPage(_PAGE_MAIN);">
+							<span>쇼핑하러 가기</span>
+						</button>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script th:inline="javascript">
+	/*<![CDATA[*/
+
+	$(document).ready(function() {
+
+	});
+	/*]]>*/
+</script>
+</th:block>
+</body>
+</html>
+
+

+ 28 - 10
src/main/webapp/WEB-INF/views/web/customer/JoinFormWeb.html

@@ -206,7 +206,7 @@
 			$usable.show();
 			custIdCheck = true;
 		}
-
+		fnPossibleJoin();
 	};
 
 	// 비밀번호 입력
@@ -300,6 +300,7 @@
 				$avlConPwd.show();
 				passwdCheck = true;
 			}
+			fnPossibleJoin();
 		}
 	};
 
@@ -340,6 +341,7 @@
 			$dupEmailDiv.hide();
 			emailCheck = true;
 		}
+		fnPossibleJoin();
 	};
 
 	//	휴대폰 확인
@@ -348,7 +350,7 @@
 		let cellPhnno = $(this).val();
 		let validation;
 
-		if (gagajf.isNull(cellPhnno)) {
+		if (!gagajf.isNull(cellPhnno)) {
 			if ( 9 < cellPhnno < 12) {
 				$failPhnno.hide();
 				validation = true;
@@ -374,11 +376,12 @@
 			$dupPhnno.show();
 			// $cellPhnno.text(result.cellPhnno);
 			// $cellPhnno.show();
-			authCheck = false;
+			phoneCheck = false;
 		} else {
 			$dupPhnno.hide();
-			authCheck = true;
+			phoneCheck = true;
 		}
+		fnPossibleJoin();
 	};
 	
 
@@ -393,7 +396,7 @@
 			let custInfo = {};
 			custInfo.encData = encData;
 			let jsonData = JSON.stringify(custInfo);
-			gagajf.ajaxJsonSubmit('/customer/authentication/validation', jsonData, fnInfoConfirmCallBack);
+			gagajf.ajaxJsonSubmit('/customer/authentication/check', jsonData, fnInfoConfirmCallBack);
 		}
 	};
 
@@ -411,18 +414,36 @@
 			$dupPhnno.hide();
 			authCheck = true;
 		}
+		fnPossibleJoin();
 	};
 
 	// 저장
 	$('#btnJoin').on('click', function () {
+		mcxDialog.confirm("회원가입을 하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				$('#btnJoin').attr('disabled', true);
+				let jsonData = JSON.stringify($('#joinForm').serializeObject());
+				gagajf.ajaxJsonSubmit('/customer/join/save', jsonData, fnJoinSaveCallback);
+			}
+		});
+	});
 
+	var fnJoinSaveCallback = function (result) {
+		if (result.isJoin) {
+			//신규회원 혜택 안내 페이지 없음
+			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
+		} else {
+			$('#btnJoin').attr('disabled', false);
+		}
 
-	});
+	};
 
 
 	// 가입 가능한지 확인
 	var fnPossibleJoin = function () {
-		const $btnJoin = $('#btnJoin')
+		const $btnJoin = $('#btnJoin');
 		if (custIdCheck && passwdCheck && emailCheck && phoneCheck && authCheck ) {
 			$btnJoin.attr('disabled', false);
 		} else {
@@ -430,9 +451,6 @@
 		}
 	};
 
-	$(document).ready(function() {
-		fnPossibleJoin();
-	});
 
 /*]]>*/
 </script>

+ 291 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageExchangeFormWeb.html

@@ -0,0 +1,291 @@
+<!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/MypageLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : MypageExchangeFormWeb.html
+ * @desc    : 마이페이지 > 교환신청 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.22   card007     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<th:block layout:fragment="content">
+	<div class="my_cont">
+		<div class="sec_head">
+			<h3>교환 신청</h3>
+			<div class="od_detail">
+				(주문번호 : <span class="num" th:text="${ordNo}"></span>)
+			</div>
+		</div>
+		<div class="sec_body mypage_body">
+			<div class="order_list return_list">
+				<section class="order_row">
+					<th:block th:if="${orderList}" th:each="oneData, status : ${orderList}">
+						<div class="part_deliver">
+							<div class="tbl_tit">
+								<!-- 주문일/선물일 설정 -->
+								<span class="start_t" th:unless="${oneData.giftPackYn == 'Y'}">주문일</span>
+								<span class="gift_t" th:if="${oneData.giftPackYn == 'Y'}">선물일</span>
+								<!-- //주문일/선물일 설정 -->
+
+								<span class="order_date" th:text="${oneData.ordDt}"></span>
+
+								<!-- 배송구분 설정 -->
+								<span class="order_label02" th:if="${oneData.shotDelvYn == 'Y'}">총알배송</span>
+								<span class="order_label01" th:if="${oneData.shotDelvYn == 'N' and oneData.selfGoodsYn == 'Y'}">STYLE24 일반배송</span>
+								<span class="order_label01" th:if="${oneData.selfGoodsYn == 'N'}">업체직배송</span>
+								<!-- //배송구분 설정 -->
+								<a href="javascript:void(0)" class="detail_btn" th:attr="ordNo=${oneData.ordNo}" onclick="fnGoToOrderDetail(this)">주문상세보기</a>
+							</div>
+							<th:block th:if="${oneData.orderList}" th:each="order, status : ${oneData.orderList}">
+								<div class="tbl type2">
+									<table id="exchangeList">
+										<colgroup>
+											<col width="1020">
+											<col width="180">
+										</colgroup>
+										<tbody>
+										<th:block th:if="${order.ordDtlList}" th:each="ordDtl, status : ${order.ordDtlList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
+											<input type="hidden" name="ordDtlNo" th:value="${ordDtl.ordDtlNo}"/>
+											<input type="hidden" name="ordDtlStat" th:value="${ordDtl.ordDtlStat}"/>
+											<input type="hidden" name="reviewSq" th:value="${ordDtl.reviewSq}"/>
+											<tr>
+												<td>
+													<div class="info_item">
+														<div class="thumb_box">
+															<a href="">
+																<img th:src="${imageUrl + '/' + ordDtl.sysImgNm}" width="100%" alt="">
+															</a>
+														</div>
+														<div class="info_box">
+															<p class="od_name">
+																<a href="">
+																	<span class="brand" th:text="${ordDtl.brandNm}"></span>
+																	<span class="name" th:text="${ordDtl.goodsNm}"></span>
+																</a>
+															</p>
+															<p class="od_opt">
+																<span class="option"><em th:text="${ordDtl.optCd1}"></em><em th:text="${ordDtl.optCd2}"></em></span>
+																<span class="count">수량 <em th:text="${ordDtl.ordQty}"></em>개</span>
+															</p>
+														</div>
+														<div class="info_calc">
+															<p class="price">
+																<span class="selling_price" th:text="|${#numbers.formatInteger(ordDtl.ordAmt, 1, 'COMMA')}원|"></span>
+															</p>
+															<p class="point"><span th:text="${#numbers.formatInteger(ordDtl.savePntAmt, 1, 'COMMA')}"></span>p</p>
+														</div>
+													</div>
+												</td>
+												<td class="cnt_sel">
+													<span class="cnt_t">수량</span>
+													<select class="select_dress" name="chgQty">
+														<option value="">선택</option>
+														<option th:if="${ordDtl.ordQty > 0}" th:each="num : ${#numbers.sequence(1,ordDtl.ordQty)}" th:value="${num}" th:text="${num}"></option>
+													</select>
+													<button class="btn btn_dark btn_sm" th:attr="ordDtlNo=${ordDtl.ordDtlNo}" onclick="fnChangeOption(this);">옵션 변경</button>
+												</td>
+											</tr>
+										</th:block>
+										</tbody>
+									</table>
+								</div>
+							</th:block>
+							<div class="order_confirm">
+								<p class="cf_txt cf_desc c_primary">교환하실 상품의 수량 및 옵션을 선택하신 후 교환 신청을 하실 수 있습니다.</p>
+							</div>
+						</div>
+					</th:block>
+				</section>
+				<section class="order_row">
+					<div class="tbl_tit">
+						<h3 class="subH3">교환 사유</h3>
+					</div>
+					<div class="tbl type1">
+						<table>
+							<colgroup>
+								<col width="*">
+							</colgroup>
+							<tbody>
+							<tr>
+								<td>
+									<select id="mounth" name="chgReason" onchange="fnChangeReason(this);">
+										<option value="">교환 사유를 선택하세요</option>
+										<option th:if="${exchangeReason}" th:each="oneData, status : ${exchangeReason}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+									</select>
+								</td>
+							</tr>
+							<tr>
+								<td>
+									<textarea class="doc_exchange" name="chgMemo" id="chgMemo" placeholder="자세한 사유를 입력해주세요." onkeyup="cfnGetTextLength(this, 500, $('#exchange_cnt'));"></textarea>
+									<p class="txt_cnt"><span id="exchange_cnt" class="c_primary">0</span>/500</p>
+								</td>
+							</tr>
+							</tbody>
+						</table>
+					</div>
+				</section>
+				<section class="order_row" id="chgerLocation">
+					<div class="order_tit">
+						<h3 class="subH3">상품 회수지</h3>
+						<span class="del_t">교환받을 상품을 수령할 장소 선택</span>
+						<button type="button" class="btn_popup" onclick="fnChangeDeliveryAddr('chger');"><span>회수지 선택</span></button>
+					</div>
+					<div class="tbl type1">
+						<table>
+							<colgroup>
+								<col width="200">
+								<col width="*">
+							</colgroup>
+							<tbody>
+							<tr>
+								<th>성명</th>
+								<td id="chgerNm" th:text="${deliveryAddrInfo.recipNm}"></td>
+								<input type="hidden" name="chgerNm" th:value="${deliveryAddrInfo.recipNm}">
+							</tr>
+							<tr>
+								<th>연락처</th>
+								<td id="chgerPhnno" th:text="${deliveryAddrInfo.recipPhnno}"></td>
+								<input type="hidden" name="chgerPhnno" th:value="${deliveryAddrInfo.recipPhnno}">
+							</tr>
+							<tr>
+								<th>주소</th>
+								<td id="chgerAddr" th:text="|${deliveryAddrInfo.recipBaseAddr} ${deliveryAddrInfo.recipDtlAddr}|"></td>
+								<input type="hidden" name="chgerBaseAddr" th:value="${deliveryAddrInfo.recipBaseAddr}">
+								<input type="hidden" name="chgerDtlAddr" th:value="${deliveryAddrInfo.recipDtlAddr}">
+							</tr>
+							</tbody>
+						</table>
+					</div>
+				</section>
+				<section class="order_row" id="returnLocation">
+					<div class="order_tit">
+						<h3 class="subH3">반품하실 배송지</h3>
+					</div>
+					<div class="tbl type1">
+						<table>
+							<colgroup>
+								<col width="200">
+								<col width="*">
+							</colgroup>
+							<tbody>
+							<tr>
+								<th>성명</th>
+								<td th:text="${deliveryAddrInfo.rtnLocNm}"></td>
+								<input type="hidden" name="rtnLocNm" th:value="${deliveryAddrInfo.rtnLocNm}">
+							</tr>
+							<tr>
+								<th>연락처</th>
+								<td th:text="${deliveryAddrInfo.rtnLocTelno}"></td>
+								<input type="hidden" name="rtnLocTelno" th:value="${deliveryAddrInfo.rtnLocTelno}">
+							</tr>
+							<tr>
+								<th>주소</th>
+								<td th:text="|${deliveryAddrInfo.rtnLocBaseAddr} ${deliveryAddrInfo.rtnLocDtlAddr}|"></td>
+								<input type="hidden" name="rtnLocBaseAddr" th:value="${deliveryAddrInfo.rtnLocBaseAddr}">
+								<input type="hidden" name="rtnLocDtlAddr" th:value="${deliveryAddrInfo.rtnLocDtlAddr}">
+							</tr>
+							</tbody>
+						</table>
+					</div>
+				</section>
+				<section class="order_row">
+					<div class="order_tit">
+						<h3 class="subH3">교환 상품 받으실 주소</h3>
+						<span class="del_t">택배사에서 반품 상품을 직접 회수할 장소 선택</span>
+						<button type="button" class="btn_popup" onclick="fnChangeDeliveryAddr('recip');"><span>회수지 선택</span></button>
+					</div>
+					<div class="tbl type1">
+						<table>
+							<colgroup>
+								<col width="200">
+								<col width="*">
+							</colgroup>
+							<tbody>
+							<tr>
+								<th>성명</th>
+								<td id="recipNm" th:text="${deliveryAddrInfo.recipNm}"></td>
+								<input type="hidden" name="recipNm" th:value="${deliveryAddrInfo.recipNm}">
+							</tr>
+							<tr>
+								<th>연락처</th>
+								<td id="recipPhnno" th:text="${deliveryAddrInfo.recipPhnno}"></td>
+								<input type="hidden" name="recipPhnno" th:value="${deliveryAddrInfo.recipPhnno}">
+							</tr>
+							<tr>
+								<th>주소</th>
+								<td id="recipAddr" th:text="|${deliveryAddrInfo.recipBaseAddr} ${deliveryAddrInfo.recipDtlAddr}|"></td>
+								<input type="hidden" name="recipBaseAddr" th:value="${deliveryAddrInfo.recipBaseAddr}">
+								<input type="hidden" name="recipDtlAddr" th:value="${deliveryAddrInfo.recipDtlAddr}">
+							</tr>
+							</tbody>
+						</table>
+					</div>
+				</section>
+				<section class="order_row" id="addDeliveryFee" style="display:none">
+					<div class="ship_fee">
+						<p><span class="c_primary" id="addPayCost">2,500원</span> 배송비 추가 결제가 필요합니다.</p>
+						<input type="hidden" name="addPayCost"/>
+					</div>
+				</section>
+				<div class="btn_wrap">
+					<button type="button" class="btn btn_default cancle_btn" onclick="cfnGoToPage(_PAGE_MYPAGE_CRS_LIST)"><span>교환 취소</span></button>
+					<button tyep="submit" class="btn btn_primary submit_btn" onclick="fnExchange()"><span id="exchangeButton">교환 신청</span></button>
+				</div>
+			</div>
+		</div>
+	</div>
+<script src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+	$(document).ready(function() {
+		// 마이페이지 LNB 설정
+		fnSetMypageLnbList(2);
+		
+		// 마이페이지 location 설정
+		fnSetMypageLocation('취소/반품/환불내역', '_PAGE_MYPAGE_CRS_LIST', '교환 신청');
+	});
+	
+	// 교환 옵션 변경 팝업
+	var fnChangeOption = function(param) {
+		// TODO
+		// 옵션변경 처리
+	}
+	
+	// 회수지, 교환지 설정 팝업
+	var fnChangeDeliveryAddr = function(param) {
+		// TODO
+		// 회수지, 교환지 설정
+	}
+	
+	// 교환 처리
+	var fnExchange = function() {
+		// TODO
+		// 교환신청 처리
+	}
+	
+	// 교환 사유 변경 이벤트
+	var fnChangeReason = function(param) {
+		let chgReason = $(param).val();
+		// TODO
+		// 사유 변경 처리
+		alert('a');
+		console.log($('#exchangeList tr'));
+		$.each($('#exchangeList tr'), function(idx, item) {
+			console.log(item);
+		})
+	}
+</script>
+
+</th:block>
+
+</body>
+</html>

+ 9 - 65
src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html

@@ -58,6 +58,7 @@
 										<th:block th:if="${order.ordDtlList}" th:each="ordDtl, status : ${order.ordDtlList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
 											<input type="hidden" name="ordDtlNo" th:value="${ordDtl.ordDtlNo}"/>
 											<input type="hidden" name="ordDtlStat" th:value="${ordDtl.ordDtlStat}"/>
+											<input type="hidden" name="reviewSq" th:value="${ordDtl.reviewSq}"/>
 											<tr class="bundle_row">
 												<td>
 													<div class="info_item">
@@ -77,7 +78,7 @@
 																<span class="option"><em th:text="${ordDtl.optCd1}"></em><em th:text="${ordDtl.optCd2}"></em></span>
 																<span class="count">수량 <em th:text="${ordDtl.ordQty}"></em>개</span>
 															</p>
-															<button type="button" class="btn btn_dark cart_btn">쇼핑백 담기</button>
+															<button type="button" class="btn btn_dark cart_btn" onclick="fnCreateCart(this);">쇼핑백 담기</button>
 														</div>
 														<div class="info_calc">
 															<p class="price">
@@ -94,9 +95,9 @@
 														<p class="dlvr_desc" th:if="${ordDtl.delvEddt}" th:text="|${ordDtl.delvEddt}일 도착|"></p>
 													</div>
 													<div class="tbl_btn_wrap case02">
-														<button type="button" class="btn btn_default btn_sm"><span>교환</span></button>
-														<button type="button" class="btn btn_default btn_sm"><span>반품/취소</span></button>
-														<button type="button" class="btn btn_default btn_sm" th:if="${ordDtl.reviewSq == 0}"><span>리뷰작성</span></button>
+														<button type="button" class="btn btn_default btn_sm" onclick="fnCreateExchange(this);"><span>교환</span></button>
+														<button type="button" class="btn btn_default btn_sm" onclick="fnCreateCancel(this);"><span>반품/취소</span></button>
+														<button type="button" class="btn btn_default btn_sm" th:if="${ordDtl.reviewSq == 0}" onclick="fnCreateReview(this);"><span>리뷰작성</span></button>
 													</div>
 												</td>
 												<td class="merge_row" th:if="${oneData.giftPackYn == 'Y' and #strings.isEmpty(ordDtl.recipBaseAddr)}">
@@ -106,7 +107,7 @@
 														<p class="dlvr_desc" th:text="|(${ordDtl.giftLimitDt}까지)|"></p>
 													</div>
 													<div class="tbl_btn_wrap case02">
-														<button type="button" class="btn btn_dark btn_sm"><span>SMS 재전송</span></button>
+														<button type="button" class="btn btn_dark btn_sm" onclick="fnReSendSms(this);"><span>SMS 재전송</span></button>
 													</div>
 												</td>
 												<td class="merge_row" th:if="${oneData.giftPackYn == 'Y' and !#strings.isEmpty(ordDtl.recipBaseAddr)}">
@@ -136,7 +137,7 @@
 										</div>
 										<div class="order_confirm" th:if="${order.ordDtlStat == 'G013_50' or order.ordDtlStat == 'G013_55'}">
 											<span class="cf_txt" th:text="|${order.shipCompNm} / ${order.invoiceNo}|"></span>
-											<button type="button" class="btn btn_primary">배송조회</button>
+											<button type="button" class="btn btn_primary" th:attr="ordNo=${oneData.ordNo}, invoiceNo=${order.invoiceNo}, shipCompCd=${order.shipCompCd}" onclick="fnGetDeliveryInfo(this)">배송조회</button>
 										</div>
 										<div class="order_confirm" th:if="${order.ordDtlStat == 'G013_60'}">
 											<span class="cf_txt" th:text="|${order.purchaseConfirmDay}일 후 자동으로 구매확정|"></span>
@@ -144,11 +145,11 @@
 										</div>
 										<div class="order_confirm" th:if="${order.ordDtlStat == 'G013_70' and order.reviewSq == 0}">
 											<span class="cf_txt">리뷰를 작성하면 다른 구매자에게 도움이 될 수 있습니다.</span>
-											<button type="button" class="btn btn_primary">리뷰작성</button>
+											<button type="button" class="btn btn_primary" banner="banner" onclick="fnCreateReview(this, 'Y');">리뷰작성</button>
 										</div>
 										<div class="order_confirm" th:if="${order.ordDtlStat == 'G013_70' and order.reviewSq > 0}">
 											<span class="cf_txt">주문내역 다시 구매하기 위해</span>
-											<button type="button" class="btn btn_primary">장바구니 담기</button>
+											<button type="button" class="btn btn_primary" onclick="fnCreateCart(this, 'Y');">장바구니 담기</button>
 										</div>
 									</th:block>
 
@@ -406,63 +407,6 @@
 <script th:inline="javascript">
 	let ordNo = [[${ordNo}]];
 	
-	// 주문 내역 삭제 처리
-	var fnDeleteOrder = function() {
-		mcxDialog.confirm('주문 내역을 삭제하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function(){
-				let data = {};
-				
-				data.ordNo = ordNo;
-				
-				var jsonData = JSON.stringify(data);
-				gagajf.ajaxJsonSubmit('/mypage/order/delete'
-					, jsonData
-					, function() {
-						cfnGoToPage(_PAGE_MYPAGE);
-					});
-			}
-		});
-	};
-	
-	// 구매확정 처리
-	var fnDecideOrder = function(param) {
-		let ordDtlNoArr = $(param).parent().parent().find('input[name=ordDtlNo]');
-		let ordDtlStatArr = $(param).parent().parent().find('input[name=ordDtlStat]');
-		
-		console.log($(param).parent().parent().find('input[name=ordDtlNo]'));
-		let orderDecisionArr = [];
-		$.each(ordDtlNoArr, function(idx, item) {
-			if (ordDtlStatArr[idx].value == 'G013_60') {
-				orderDecisionArr.push(item.value);
-			}
-		});
-
-		if (orderDecisionArr.length == 0) {
-			mcxDialog.alert('구매확정 가능한 상품이 없습니다.');
-			return false;
-		}
-
-		mcxDialog.confirm('구매확정 처리를 하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function(){
-				let data = {};
-				
-				data.ordNo = ordNo;
-				data.ordDtlNoArr = orderDecisionArr;
-				
-				var jsonData = JSON.stringify(data);
-				gagajf.ajaxJsonSubmit('/mypage/order/decision'
-					, jsonData
-					, function() {
-						cfnGoToPage(_PAGE_MYPAGE_ORDER_DETAIL + ordNo);
-					});
-			}
-		});
-	}
-	
 	// 배송메모 변경 버튼 클릭 이벤트
 	var fnChangeDelvMemo = function() {
 		// TODO

+ 37 - 2
src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListFormWeb.html

@@ -19,6 +19,18 @@
 <body>
 
 <th:block layout:fragment="content">
+	<form id="exchangeForm" name="exchangeForm" action="#" th:action="@{'/mypage/exchange/form'}" th:method="post">
+		<input type="hidden" name="ordNo"/>
+		<input type="hidden" name="ordDtlNoArr"/>
+	</form>
+	<form id="cancelForm" name="cancelForm" th:action="@{'/mypage/cancel/form'}" th:method="post">
+		<input type="hidden" name="ordNo"/>
+		<input type="hidden" name="ordDtlNoArr"/>
+	</form>
+	<form id="reviewForm" name="reviewForm" th:action="@{'/mypage/review/form'}" th:method="post">
+		<input type="hidden" name="ordNo"/>
+		<input type="hidden" name="ordDtlNoArr"/>
+	</form>
 	<div class="my_cont">
 		<div class="sec_head">
 			<h3 class="mem_name"><strong th:text="${customerInfo.custNm}"></strong>님 반갑습니다.</h3>
@@ -95,10 +107,10 @@
 				</div>
 				<div class="sch_right">
 					<div class="sch_datepicker sb">
-						<input type="text" class="n_input my_datepicker" name="stDate" value="" id="stDate">
+						<input type="text" class="n_input my_datepicker" name="stDate" value="" id="stDate" onchange="fnCheckPeriod(this);">
 					</div>
 					<div class="sch_datepicker">
-						<input type="text" class="n_input my_datepicker" name="edDate" value="" id="edDate">
+						<input type="text" class="n_input my_datepicker" name="edDate" value="" id="edDate" onchange="fnCheckPeriod(this);">
 					</div>
 					<button type="button" class="btn btn_dark" onclick="fnSearchOrderList();">조회</button>
 				</div>
@@ -110,6 +122,7 @@
 	</div>
 <script src="/ux/plugins/gaga/gaga.paging.js"></script>
 <script th:inline="javascript">
+	let ordNo = [[${ordNo}]];
 	let customerInfo = [[${customerInfo}]];
 /*<![CDATA[*/
 	$(document).ready(function() {
@@ -190,6 +203,28 @@
 			}
 		});
 	}
+	
+	// 검색기간 설정 체크
+	var fnCheckPeriod = function(param) {
+		let stDate = $('#stDate').val();
+		let edDate = $('#edDate').val();
+
+		let sdt = new Date(stDate);
+		let edt = new Date(edDate);
+		let dateDiff = Math.ceil((edt.getTime() - sdt.getTime()) / (1000 * 3600 * 24));
+
+		if (dateDiff > 366) {
+			let id = $(param).attr('id');
+			mcxDialog.alert('조회기간은 최대 1년을 넘을 수 없습니다.');
+			if (id == 'stDate') {
+				sdt.setFullYear(sdt.getFullYear() + 1);
+				$('#edDate').val(sdt.getFullYear() + '-' + ('0' + (sdt.getMonth() + 1)).slice(-2) + '-' + ('0' + (sdt.getDate())).slice(-2));
+			} else {
+				edt.setFullYear(edt.getFullYear() - 1);
+				$('#stDate').val(edt.getFullYear() + '-' + ('0' + (edt.getMonth() + 1)).slice(-2) + '-' + ('0' + (edt.getDate())).slice(-2));
+			}
+		}
+	}
 /*]]>*/
 </script>
 

+ 11 - 8
src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListWeb.html

@@ -40,6 +40,9 @@
 					</colgroup>
 					<tbody>
 						<th:block th:if="${order.ordDtlList}" th:each="ordDtl, status : ${order.ordDtlList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
+						<input type="hidden" name="ordDtlNo" th:value="${ordDtl.ordDtlNo}"/>
+						<input type="hidden" name="ordDtlStat" th:value="${ordDtl.ordDtlStat}"/>
+						<input type="hidden" name="reviewSq" th:value="${ordDtl.reviewSq}"/>
 						<tr class="bundle_row">
 							<td>
 								<div class="info_item">
@@ -75,9 +78,9 @@
 									<p class="dlvr_desc" th:if="${ordDtl.delvEddt}" th:text="|${ordDtl.delvEddt}일 도착|"></p>
 								</div>
 								<div class="tbl_btn_wrap case02">
-									<button type="button" class="btn btn_default btn_sm"><span>교환</span></button>
-									<button type="button" class="btn btn_default btn_sm"><span>반품/취소</span></button>
-									<button type="button" class="btn btn_default btn_sm"><span>리뷰작성</span></button>
+									<button type="button" class="btn btn_default btn_sm" th:attr="ordNo=${oneData.ordNo}" onclick="fnCreateExchange(this);"><span>교환</span></button>
+									<button type="button" class="btn btn_default btn_sm" th:attr="ordNo=${oneData.ordNo}" onclick="fnCreateCancel(this);"><span>반품/취소</span></button>
+									<button type="button" class="btn btn_default btn_sm" th:if="${ordDtl.reviewSq == 0}" th:attr="ordNo=${oneData.ordNo}" onclick="fnCreateReview(this);"><span>리뷰작성</span></button>
 								</div>
 							</td>
 							<td class="merge_row" th:if="${oneData.giftPackYn == 'Y' and #strings.isEmpty(ordDtl.recipBaseAddr)}">
@@ -87,7 +90,7 @@
 									<p class="dlvr_desc" th:text="|(${ordDtl.giftLimitDt}까지)|"></p>
 								</div>
 								<div class="tbl_btn_wrap case02">
-									<button type="button" class="btn btn_dark btn_sm"><span>SMS 재전송</span></button>
+									<button type="button" class="btn btn_dark btn_sm" th:attr="ordNo=${oneData.ordNo}" onclick="fnReSendSms(this);"><span>SMS 재전송</span></button>
 								</div>
 							</td>
 							<td class="merge_row" th:if="${oneData.giftPackYn == 'Y' and !#strings.isEmpty(ordDtl.recipBaseAddr)}">
@@ -117,19 +120,19 @@
 					</div>
 					<div class="order_confirm" th:if="${order.ordDtlStat == 'G013_50' or order.ordDtlStat == 'G013_55'}">
 						<span class="cf_txt" th:text="|${order.shipCompNm} / ${order.invoiceNo}|"></span>
-						<button type="button" class="btn btn_primary">배송조회</button>
+						<button type="button" class="btn btn_primary" th:attr="ordNo=${oneData.ordNo}, invoiceNo=${order.invoiceNo}, shipCompCd=${order.shipCompCd}" onclick="fnGetDeliveryInfo(this)">배송조회</button>
 					</div>
 					<div class="order_confirm" th:if="${order.ordDtlStat == 'G013_60'}">
 						<span class="cf_txt" th:text="|${order.purchaseConfirmDay}일 후 자동으로 구매확정|"></span>
-						<button type="button" class="btn btn_primary">구매확정 하기</button>
+						<button type="button" class="btn btn_primary" onclick="fnDecideOrder(this);">구매확정 하기</button>
 					</div>
 					<div class="order_confirm" th:if="${order.ordDtlStat == 'G013_70' and order.reviewSq == 0}">
 						<span class="cf_txt">리뷰를 작성하면 다른 구매자에게 도움이 될 수 있습니다.</span>
-						<button type="button" class="btn btn_primary">리뷰작성</button>
+						<button type="button" class="btn btn_primary" onclick="fnCreateReview(this, 'Y');">리뷰작성</button>
 					</div>
 					<div class="order_confirm" th:if="${order.ordDtlStat == 'G013_70' and order.reviewSq > 0}">
 						<span class="cf_txt">주문내역 다시 구매하기 위해</span>
-						<button type="button" class="btn btn_primary">장바구니 담기</button>
+						<button type="button" class="btn btn_primary" onclick="fnCreateCart(this, 'Y');">장바구니 담기</button>
 					</div>
 				</th:block>
 	

+ 5 - 5
src/main/webapp/WEB-INF/views/web/order/OrderDelvMemoChangePopWeb.html

@@ -9,23 +9,23 @@
 				<div class="area_request">
 					<div class="form_field">
 						<div>
-							<input type="radio" name="rdi-request3" id="rdi-request31" value="" checked=""> 
+							<input type="radio" name="rdi-request3" id="rdi-request31"> 
 							<label for="rdi-request31"><span>문앞</span></label>
 						</div>
 						<div>
-							<input type="radio" name="rdi-request3" id="rdi-request32" value="" checked=""> 
+							<input type="radio" name="rdi-request3" id="rdi-request32"> 
 							<label for="rdi-request32"><span>직접받고 부재시 문 앞</span></label>
 						</div>
 						<div>
-							<input type="radio" name="rdi-request3" id="rdi-request33" value="" checked=""> 
+							<input type="radio" name="rdi-request3" id="rdi-request33"> 
 							<label for="rdi-request33"><span>경비실</span></label>
 						</div>
 						<div>
-							<input type="radio" name="rdi-request3" id="rdi-request34" value="" checked=""> 
+							<input type="radio" name="rdi-request3" id="rdi-request34"> 
 							<label for="rdi-request34"><span>택배함</span></label>
 						</div>
 						<div>
-							<input type="radio" name="rdi-request3" id="rdi-request35" value="" checked=""> 
+							<input type="radio" name="rdi-request3" id="rdi-request35"> 
 							<label for="rdi-request35"><span>기타사항</span></label>
 							<div class="info_box">
 								<div class="input_wrap">

+ 40 - 12
src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html

@@ -61,7 +61,7 @@
 										</colgroup>
 										<tbody>
 											<tr>
-												<th>총 <span class="c_primary bold" th:text="${delvTotCnt}"></span> 건으로 나뉘어 배송 예정</th>
+												<th>총 <span class="c_primary bold" th:text="${delvFeeTotCnt}"></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>
@@ -382,7 +382,7 @@
 																						</div>
 																						
 																						<div class="form_field">
-																							<select id="" class="select_hidden cpnSelect">
+																							<select class="select_hidden cpnSelect">
 																								<option value="">선택안함</option>
 																								<th:block th:each="goodsCpn, k : ${goods.goodsCpnList}">
 																									<option th:value="${goodsCpn.cpnId}" th:text="${goodsCpn.cpnId}+'|'+${goodsCpn.cpnNm}+'|'+${goodsCpn.cpnDcAmt}"></option>
@@ -408,7 +408,7 @@
 																				<div class="coupon">
 																					<div class="form_field">
 																						<label for="">장바구니 할인쿠폰</label> 
-																						<select id="" class="select_hidden">
+																						<select class="select_hidden">
 																							<option value="">선택안함</option>
 																							<th:block th:each="cartCpn, k : ${cartCpnList}">
 																								<option th:value="${cartCpn.cpnId}" th:text="${cartCpn.cpnId}+'|'+${cartCpn.cpnNm}"></option>
@@ -898,35 +898,35 @@
 									<dl>
 										<div>
 											<dt>상품금액</dt>
-											<dd>1,590,000 원</dd>
+											<dd id="goodsSumAmt">1,590,000 원</dd>
 										</div>
 										<div>
 											<dt>배송비</dt>
-											<dd>0원</dd>
+											<dd id="delvSumAmt">0원</dd>
 										</div>
 										<div>
 											<dt>할인금액</dt>
-											<dd><span class="disc_amount">-1,746,500원</span></dd>
+											<dd><span class="disc_amount" id="goodsDcSumAmt">-1,746,500원</span></dd>
 										</div>
 										<div>
 											<dt>다다익선할인금액</dt>
-											<dd><span class="disc_amount">25,000원</span></dd>
+											<dd><span class="disc_amount" id="tmtbDcSumAmt">25,000원</span></dd>
 										</div>
 										<div>
 											<dt>쿠폰할인금액</dt>
-											<dd><span class="disc_amount">3,000원</span></dd>
+											<dd><span class="disc_amount" id="couponDcSumAmt">3,000원</span></dd>
 										</div>
 										<div>
 											<dt>선포인트 사용</dt>
-											<dd><span class="disc_amount">-1,500P</span></dd>
+											<dd><span class="disc_amount" id="prePntDcSumAmt">-1,500P</span></dd>
 										</div>
 										<div>
 											<dt>포인트 사용</dt>
-											<dd><span class="disc_amount">-5,500P</span></dd>
+											<dd><span class="disc_amount" id="pntDcSumAmt">-5,500P</span></dd>
 										</div>
 										<div>
 											<dt>상품권 사용</dt>
-											<dd><span class="disc_amount">-50,000원</span></dd>
+											<dd><span class="disc_amount" id="gfcdUseSumAmt">-50,000원</span></dd>
 										</div>
 									</dl>
 								</div>
@@ -1174,6 +1174,7 @@ $(document).ready( function() {
 
 <script th:inline="javascript">
 	// 배송관련정보 변수선언
+	var cartGoodsList		= [[${cartGoodsList}]]			// 배송목록
 	var wmsCnt 				= [[${wmsCnt}]];				// 자사 일반,촐알 배송건수
 	var resCnt 				= [[${resCnt}]];				// 자사 예약 배송건수
 	var delvCnt 			= [[${delvCnt}]];				// 입전 일반 배송건수
@@ -1214,6 +1215,21 @@ $(document).ready( function() {
 			}
 		)
 	}
+	
+	// 상품금액, 배송비, 할인금액, 다다익선할인금액, 쿠폰할인금액, 선포인트사용, 포인트사용, 상품권사용
+	var goodsSumAmt = 0;
+	var tmtbDcSumAmt = 0;
+	
+	var cartGoodsAmtList = function() {
+		for (i=0 ; i<cartGoodsList.length ; i++) {
+			var obj = cartGoodsList[i];
+			
+			goodsSumAmt = goodsSumAmt + obj.currPrice;
+			tmtbDcSumAmt = tmtbDcSumAmt + (obj.currPrice - obj.tmtbDcAmt);
+		}
+		$("#goodsSumAmt").text(goodsSumAmt.addComma() + "원");
+		$("#tmtbDcSumAmt").text("-" + tmtbDcSumAmt.addComma() + "원");
+	} 
 </script>
 
 <script th:inline="javascript">
@@ -1240,9 +1256,21 @@ $(document).ready( function() {
 		
 		// 3. 최적의 할인으로 쿠폰 설정
 		//$(".cpnSelect option:eq(1)").attr("selected", "selected");
+		/*
 		$(".cpnSelect").each(function(i){
-			$(this).find("option:eq(1)").attr("selected", "selected");
+			//$(this).find("option:eq(1)").attr("selected", "selected");
 		});
+		*/
+
+		$(".cpnSelect").on("change", function(){
+			alert($(this).val());
+		});
+		
+		$(".select_dress").on("click", function() {
+			alert($("this").text());	
+		});
+		
+		cartGoodsAmtList();
 	});
 	
 	// 사은품선택 라디오 버튼 기능

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

@@ -19,175 +19,175 @@
 <body>
 
 <th:block layout:fragment="content">
-
-	<div class="wrap">
-		<div class="content nonMBorder">
-			<!-- 페이지특정 클래스 = nonMBorder -->
-			<div class="cont_head">
-				<h2 class="t_c mb60">비회원 주문하기</h2>
-			</div>
-			<div class="cont_body">
-				<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}" /><!-- 장바구니화면 총알배송여부 -->
-					<!-- 장바구니화면 시퀀스 배열 등록 -->
-					<th:block th:each="cartSq , index : ${order.cartSqArr}">
-						<input type="hidden" name="cartSqArr" th:value="${cartSq}" />
-					</th:block>
-					
-					<div class="form_head">
-						<p>
-							비회원 주문을 위한 주문자 정보 입력 및 개인정보 수집/이용 동의에<br>체크하신 후 주문을 완료하실 수
-							있습니다.
-						</p>
-					</div>
-					
-					<div class="form_field">
-						<label class="input_label sr-only">이름(주문자명)</label>
-						<div class="ui_col_12">
-							<div class="input_wrap">
-								<input type="text" name="custNm" id="custNm" placeholder="이름(주문자명)">
-							</div>
+<div class="wrap">
+	<div class="content nonMBorder">
+		<!-- 페이지특정 클래스 = nonMBorder -->
+		<div class="cont_head">
+			<h2 class="t_c mb60">비회원 주문하기</h2>
+		</div>
+		<div class="cont_body">
+			<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}" /><!-- 장바구니화면 총알배송여부 -->
+				<!-- 장바구니화면 시퀀스 배열 등록 -->
+				<th:block th:each="cartSq , index : ${order.cartSqArr}">
+					<input type="hidden" name="cartSqArr" th:value="${cartSq}" />
+				</th:block>
+				
+				<div class="form_head">
+					<p>
+						비회원 주문을 위한 주문자 정보 입력 및 개인정보 수집/이용 동의에<br>체크하신 후 주문을 완료하실 수
+						있습니다.
+					</p>
+				</div>
+				
+				<div class="form_field">
+					<label class="input_label sr-only">이름(주문자명)</label>
+					<div class="ui_col_12">
+						<div class="input_wrap">
+							<input type="text" name="custNm" id="custNm" placeholder="이름(주문자명)">
 						</div>
 					</div>
-					<div class="form_field">
-						<label class="input_label sr-only">휴대폰 번호</label>
-						<div class="ui_col_12">
-							<div class="input_wrap">
-								<input type="text" name="cellPhnno" id="cellPhnno" placeholder="휴대폰 번호">
-							</div>
+				</div>
+				<div class="form_field">
+					<label class="input_label sr-only">휴대폰 번호</label>
+					<div class="ui_col_12">
+						<div class="input_wrap">
+							<input type="text" name="cellPhnno" id="cellPhnno" placeholder="휴대폰 번호">
 						</div>
 					</div>
-					<div class="form_field">
-						<label class="input_label sr-only">이메일주소</label>
-						<div class="ui_col_12">
-							<div class="input_wrap">
-								<input type="text" name="email" id="email" placeholder="이메일주소">
-							</div>
+				</div>
+				<div class="form_field">
+					<label class="input_label sr-only">이메일주소</label>
+					<div class="ui_col_12">
+						<div class="input_wrap">
+							<input type="text" name="email" id="email" placeholder="이메일주소">
 						</div>
 					</div>
-					<div class="form_field">
-						<label class="input_label sr-only">배송주소 우편번호</label>
-						<div class="ui_col_12">
-							<div class="input_wrap" style="display: flex;">
-								<input type="text" name="recipZipcode" id="recipZipcode" placeholder="우편번호">
-								<button type="submit" class="btn btn_default">우편번호 찾기</button>
-							</div>
+				</div>
+				<div class="form_field">
+					<label class="input_label sr-only">배송주소 우편번호</label>
+					<div class="ui_col_12">
+						<div class="input_wrap" style="display: flex;">
+							<input type="text" name="recipZipcode" id="recipZipcode" placeholder="우편번호">
+							<button type="submit" class="btn btn_default">우편번호 찾기</button>
 						</div>
 					</div>
-					<br>
-					<div class="form_field">
-						<label class="input_label sr-only">배송주소 기본주소</label>
-						<div class="ui_col_12">
-							<input type="text" name="recipBaseAddr" id="recipBaseAddr" placeholder="기본주소">
-						</div>
+				</div>
+				<br>
+				<div class="form_field">
+					<label class="input_label sr-only">배송주소 기본주소</label>
+					<div class="ui_col_12">
+						<input type="text" name="recipBaseAddr" id="recipBaseAddr" placeholder="기본주소">
 					</div>
-					<div class="form_field">
-						<label class="input_label sr-only">배송주소 상세주소</label>
-						<div class="ui_col_12">
-							<input type="text" name="recipDtlAddr" id="recipDtlAddr" placeholder="상세주소">
-						</div>
+				</div>
+				<div class="form_field">
+					<label class="input_label sr-only">배송주소 상세주소</label>
+					<div class="ui_col_12">
+						<input type="text" name="recipDtlAddr" id="recipDtlAddr" placeholder="상세주소">
 					</div>
-					
-					<!-- 주소 출력 
-					<div class="help_block">
-						<p><span>도로명</span>서울특별시 서초구 서운로 57번길</p>
-						<p><span>지번</span>서울특별시 서초구 서포동 60-28</p>
+				</div>
+				
+				<!-- 주소 출력 
+				<div class="help_block">
+					<p><span>도로명</span>서울특별시 서초구 서운로 57번길</p>
+					<p><span>지번</span>서울특별시 서초구 서포동 60-28</p>
+				</div>
+				-->
+				
+				<!-- //주소 출력 -->
+				<div class="form_field">
+					<div>
+						<input id="chk-2" type="checkbox"><label for="chk-2">
+							<p>
+								비회원 개인정보 수집&#47;이용 동의 <span>(필수)</span>
+							</p>
+						</label>
 					</div>
-					-->
-					
-					<!-- //주소 출력 -->
-					<div class="form_field">
-						<div>
-							<input id="chk-2" type="checkbox"><label for="chk-2">
-								<p>
-									비회원 개인정보 수집&#47;이용 동의 <span>(필수)</span>
-								</p>
-							</label>
-						</div>
+				</div>
+				
+				<div class="form_field txt_area">
+					<div
+						style="overflow: auto; max-height: 176px; border: 1px solid #ddd;">
+						<strong>제1조(목적)</strong>
+						<p>이 약관은 (유)내고향시푸드(전자거래 사업자)이 운영하는 홈페이지(이하 "쇼핑몰"이라 한다)에서
+							제공하는 인터넷 관련 서비스(이하 "서비스"라 한다)를 이용함에 있어 (유)내고향시푸드와 이용자의 권리·의무 및
+							책임사항을 규정함을 목적으로 합니다. ※ 「PC통신 등을 이용하는 전자거래에 대해서도 그 성질에 반하지 않는 한
+							이 약관을 준용합니다」 제2조(정의) ① "쇼핑몰" 이란 사업자가 재화 또는 용역을 이용자에게 제공하기 위하여
+							컴퓨터 등 정보통신설비를 이용하여 재화 또는 용역을 거래할 수 있도록 설정한 가상의 영업장을 말하며, 아울러
+							쇼핑몰을 운영하는 사업자의 의미로도 사용합니다. ② "이용자"란 "쇼핑몰"에 접속하여 이 약관에 따라 "쇼핑몰"이
+							제공하는 서비스를 받는 회원 및 비회원을 말합니다. ③ "회원"이라 함은 "쇼핑몰"에 개인정보를 제공하여
+							회원등록을 한 자로서, "쇼핑몰"의 정보를 지속적으로 제공받으며, "쇼핑몰"이 제공하는 서비스를 계속적으로 이용할
+							수 있는 자를 말합니다. ④ "비회원"이라 함은 회원에 가입하지 않고 "쇼핑몰"이 제공하는 서비스를 이용하는 자를
+							말합니다. 제3조 (약관의 명시와 개정) ① "쇼핑몰"은 이 약관의 내용과 상호, 영업소 소재지, 대표자의 성명,
+							사업자등록번호, 연락처(전화, 팩스, 전자우편 주소 등) 등을 이용자가 알 수 있도록 사이트의 초기
+							서비스화면(전면)에 게시합니다. ② "쇼핑몰"은 약관의 규제 등에 관한 법률, 전자거래기본법, 전자서명법,
+							정보통신망 이용촉진 등에 관한 법률, 방문판매 등에 관한법률, 소비자보호법 등 관련법을 위배하지 않는 범위에서 이
+							약관을 개정할 수 있습니다. ③ "쇼핑몰"이 약관을 개정할 경우에는 적용일자 및 개정사유를 명시하여 현행약관과
+							함께 홈페이지의 초기화면에 그 적용일자 7일 이전부터 적용일자 전일까지 공지합니다. ④ "쇼핑몰"이 약관을 개정할
+							경우에는 그 개정약관은 그 적용일자 이후에 체결되는 계약에만 적용되고 그 이전에 이미 체결된 계약에 대해서는 개정
+							전의 약관조항이 그대로 적용됩니다. 다만 이미 계약을 체결한 이용자가 개정약관 조항의 적용을 받기를 원하는 뜻을
+							제3항에 의한 개정약관의 공지기간 내에 "쇼핑몰"에 송신하여 "쇼핑몰"의 동의를 받은 경우에는 개정약관 조항이
+							적용됩니다. ⑤ 이 약관에서 정하지 아니한 사항과 이 약관의 해석에 관하여는 정부가 제정한 전자거래소비자보호지침
+							및 관계법령 또는 상관례에 따릅니다. 제4조(서비스의 제공 및 변경) ① "쇼핑몰"은 다음과 같은 업무를
+							수행합니다. 1. 재화 또는 용역에 대한 정보 제공 및 구매계약의 체결 2. 구매계약이 체결된 재화 또는 용역의
+							배송 3. 기타 "쇼핑몰"이 정하는 업무 ② "쇼핑몰"은 재화의 품절 또는 기술적 사양의 변경 등의 경우에는 장차
+							체결되는 계약에 의해 제공할 재화·용역의 내용을 변경할 수 있습니다. 이 경우에는 변경된 재화·용역의 내용 및
+							제공일자를 명시하여 현재의 재화·용역의 내용을 게시한 곳에 그 제공일자 이전 7일부터 공지합니다. ③ "쇼핑몰"이
+							제공하기로 이용자와 계약을 체결한 서비스의 내용을 재화의 품절 또는 기술적 사양의 변경 등의 사유로 변경할
+							경우에는 "쇼핑몰"은 이로 인하여 이용자가 입은 손해를 배상합니다. 단, "쇼핑몰"에 고의 또는 과실이 없는
+							경우에는 그러하지 아니합니다.</p>
 					</div>
-					
-					<div class="form_field txt_area">
-						<div
-							style="overflow: auto; max-height: 176px; border: 1px solid #ddd;">
-							<strong>제1조(목적)</strong>
-							<p>이 약관은 (유)내고향시푸드(전자거래 사업자)이 운영하는 홈페이지(이하 "쇼핑몰"이라 한다)에서
-								제공하는 인터넷 관련 서비스(이하 "서비스"라 한다)를 이용함에 있어 (유)내고향시푸드와 이용자의 권리·의무 및
-								책임사항을 규정함을 목적으로 합니다. ※ 「PC통신 등을 이용하는 전자거래에 대해서도 그 성질에 반하지 않는 한
-								이 약관을 준용합니다」 제2조(정의) ① "쇼핑몰" 이란 사업자가 재화 또는 용역을 이용자에게 제공하기 위하여
-								컴퓨터 등 정보통신설비를 이용하여 재화 또는 용역을 거래할 수 있도록 설정한 가상의 영업장을 말하며, 아울러
-								쇼핑몰을 운영하는 사업자의 의미로도 사용합니다. ② "이용자"란 "쇼핑몰"에 접속하여 이 약관에 따라 "쇼핑몰"이
-								제공하는 서비스를 받는 회원 및 비회원을 말합니다. ③ "회원"이라 함은 "쇼핑몰"에 개인정보를 제공하여
-								회원등록을 한 자로서, "쇼핑몰"의 정보를 지속적으로 제공받으며, "쇼핑몰"이 제공하는 서비스를 계속적으로 이용할
-								수 있는 자를 말합니다. ④ "비회원"이라 함은 회원에 가입하지 않고 "쇼핑몰"이 제공하는 서비스를 이용하는 자를
-								말합니다. 제3조 (약관의 명시와 개정) ① "쇼핑몰"은 이 약관의 내용과 상호, 영업소 소재지, 대표자의 성명,
-								사업자등록번호, 연락처(전화, 팩스, 전자우편 주소 등) 등을 이용자가 알 수 있도록 사이트의 초기
-								서비스화면(전면)에 게시합니다. ② "쇼핑몰"은 약관의 규제 등에 관한 법률, 전자거래기본법, 전자서명법,
-								정보통신망 이용촉진 등에 관한 법률, 방문판매 등에 관한법률, 소비자보호법 등 관련법을 위배하지 않는 범위에서 이
-								약관을 개정할 수 있습니다. ③ "쇼핑몰"이 약관을 개정할 경우에는 적용일자 및 개정사유를 명시하여 현행약관과
-								함께 홈페이지의 초기화면에 그 적용일자 7일 이전부터 적용일자 전일까지 공지합니다. ④ "쇼핑몰"이 약관을 개정할
-								경우에는 그 개정약관은 그 적용일자 이후에 체결되는 계약에만 적용되고 그 이전에 이미 체결된 계약에 대해서는 개정
-								전의 약관조항이 그대로 적용됩니다. 다만 이미 계약을 체결한 이용자가 개정약관 조항의 적용을 받기를 원하는 뜻을
-								제3항에 의한 개정약관의 공지기간 내에 "쇼핑몰"에 송신하여 "쇼핑몰"의 동의를 받은 경우에는 개정약관 조항이
-								적용됩니다. ⑤ 이 약관에서 정하지 아니한 사항과 이 약관의 해석에 관하여는 정부가 제정한 전자거래소비자보호지침
-								및 관계법령 또는 상관례에 따릅니다. 제4조(서비스의 제공 및 변경) ① "쇼핑몰"은 다음과 같은 업무를
-								수행합니다. 1. 재화 또는 용역에 대한 정보 제공 및 구매계약의 체결 2. 구매계약이 체결된 재화 또는 용역의
-								배송 3. 기타 "쇼핑몰"이 정하는 업무 ② "쇼핑몰"은 재화의 품절 또는 기술적 사양의 변경 등의 경우에는 장차
-								체결되는 계약에 의해 제공할 재화·용역의 내용을 변경할 수 있습니다. 이 경우에는 변경된 재화·용역의 내용 및
-								제공일자를 명시하여 현재의 재화·용역의 내용을 게시한 곳에 그 제공일자 이전 7일부터 공지합니다. ③ "쇼핑몰"이
-								제공하기로 이용자와 계약을 체결한 서비스의 내용을 재화의 품절 또는 기술적 사양의 변경 등의 사유로 변경할
-								경우에는 "쇼핑몰"은 이로 인하여 이용자가 입은 손해를 배상합니다. 단, "쇼핑몰"에 고의 또는 과실이 없는
-								경우에는 그러하지 아니합니다.</p>
+				</div>
+				<div class="form_field">
+					<div class="ui_row btn_group_md">
+						<div class="ui_col_6">
+							<button class="btn btn_default btn_block" id="btn_cancel">
+								<span>취소</span>
+							</button>
 						</div>
-					</div>
-					<div class="form_field">
-						<div class="ui_row btn_group_md">
-							<div class="ui_col_6">
-								<button class="btn btn_default btn_block" id="btn_cancel">
-									<span>취소</span>
-								</button>
-							</div>
-							<div class="ui_col_6">
-								<button class="btn btn_dark btn_block" id="btn_order">
-									<span>주문하기</span>
-								</button>
-							</div>
+						<div class="ui_col_6">
+							<button class="btn btn_dark btn_block" id="btn_order">
+								<span>주문하기</span>
+							</button>
 						</div>
 					</div>
-					<div class="form_info">
-						<p>STYLE24에 회원가입을 하시면 더 많은 혜택을 받으실 수 있습니다!</p>
-						<a href="#none" id="btn_join">회원가입</a>
-					</div>
-				</form>
-			</div>
+				</div>
+				<div class="form_info">
+					<p>STYLE24에 회원가입을 하시면 더 많은 혜택을 받으실 수 있습니다!</p>
+					<a href="#none" id="btn_join">회원가입</a>
+				</div>
+			</form>
 		</div>
 	</div>
+</div>
 
-	<script th:inline="javascript">
-		
-	</script>
-
-	<script type="text/javascript">
-		// 컨텐츠 호출
-		$(document).ready( function() {
-			
-		});
-		
-		// 취소버튼
-		$("btn_cancel").on("click", function() {
-			
-		});
+<script th:inline="javascript">
+	var isLogin = [[${isLogin}]];				// 자사 일반,촐알 배송건수
 		
-		// 주문하기버튼
-		$("btn_order").on("click", function() {
-			// TODO 유효성 체크 추가
+	// 컨텐츠 호출
+	$(document).ready( function() {
+		// 로그인 
+		if (isLogin) {
 			$("#orderForm").submit();
-		});
+		}
+	});
+	
+	// 취소버튼
+	$("btn_cancel").on("click", function() {
+		
+	});
+	
+	// 주문하기버튼
+	$("btn_order").on("click", function() {
+		// TODO 유효성 체크 추가
+		$("#orderForm").submit();
+	});
+	
+	// 회원가입버튼
+	$("btn_join_member").on("click", function() {
 		
-		// 회원가입버튼
-		$("btn_join_member").on("click", function() {
-			
-		});
-	</script>
+	});
+</script>
 </th:block>
 
 </body>

+ 234 - 0
src/main/webapp/ux/pc/js/cart.js

@@ -0,0 +1,234 @@
+// 배송조회 버튼 클릭 이벤트
+var fnGetDeliveryInfo = function(param) {
+	let invoiceNo = $(param).attr('invoiceNo');
+	let shipCompCd = $(param).attr('shipCompCd');
+	
+	// TODO
+	// 배송조회 처리
+}
+
+// 구매확정 처리
+var fnDecideOrder = function(param) {
+	let ordDtlNoArr = $(param).parent().parent().find('input[name=ordDtlNo]');
+	let ordDtlStatArr = $(param).parent().parent().find('input[name=ordDtlStat]');
+	
+	let orderDecisionArr = [];
+	$.each(ordDtlNoArr, function(idx, item) {
+		if (ordDtlStatArr[idx].value == 'G013_60') {
+			orderDecisionArr.push(item.value);
+		}
+	});
+	
+	if (orderDecisionArr.length == 0) {
+		mcxDialog.alert('구매확정 가능한 상품이 없습니다.');
+		return false;
+	}
+	
+	mcxDialog.confirm('구매확정 처리를 하시겠습니까?', {
+		cancelBtnText: "취소",
+		sureBtnText: "확인",
+		sureBtnClick: function(){
+			let data = {};
+			
+			data.ordNo = ordNo;
+			data.ordDtlNoArr = orderDecisionArr;
+			
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit('/mypage/order/decision'
+				, jsonData
+				, function() {
+					cfnGoToPage(_PAGE_MYPAGE_ORDER_DETAIL + ordNo);
+				});
+		}
+	});
+}
+
+// 리뷰작성 버튼 클릭 이벤트
+var fnCreateReview = function(param, bannerYn) {
+	let ordDtlNoArr;
+	let ordDtlStatArr;
+	let reviewSqArr;
+
+	if (bannerYn == 'Y') {
+		ordDtlNoArr = $(param).parent().parent().find('input[name=ordDtlNo]');
+		ordDtlStatArr = $(param).parent().parent().find('input[name=ordDtlStat]');
+		reviewSqArr = $(param).parent().parent().find('input[name=reviewSq]');
+	} else {
+		ordDtlNoArr = $(param).parent().parent().parent().parent().find('input[name=ordDtlNo]');
+		ordDtlStatArr = $(param).parent().parent().parent().parent().find('input[name=ordDtlStat]');
+		reviewSqArr = $(param).parent().parent().parent().parent().find('input[name=reviewSq]');
+	}
+	
+	let canReviewSqArr = [];
+	$.each(ordDtlNoArr, function(idx, item) {
+		if (ordDtlStatArr[idx].value == 'G013_70' && reviewSqArr[idx].value == 0) {
+			canReviewSqArr.push(item.value);
+		}
+	});
+	
+	if (canReviewSqArr.length == 0) {
+		mcxDialog.alert('리뷰작성 가능한 상품이 없습니다.');
+		return false;
+	}
+	
+	// TODO
+	// 리뷰 작성페이지 이동
+	let data = {};
+	
+	data.ordNo = ordNo;
+	data.ordDtlNoArr = canReviewSqArr;
+	
+	var jsonData = JSON.stringify(data);
+	
+	//gagajf.ajaxJsonSubmit('/mypage/order/decision'
+	//	, jsonData
+	//	, function() {
+	//		cfnGoToPage(_PAGE_MYPAGE_ORDER_DETAIL + ordNo);
+	//	});
+	
+}
+
+// 장바구니 담기 버튼 클릭 이벤트
+var fnCreateCart = function(param, bannerYn) {
+	let ordDtlNoArr = '';
+	let ordDtlStatArr = '';
+	let reviewSqArr = '';
+
+	if (bannerYn == 'Y') {
+		ordDtlNoArr = $(param).parent().parent().find('input[name=ordDtlNo]');
+		ordDtlStatArr = $(param).parent().parent().find('input[name=ordDtlStat]');
+		reviewSqArr = $(param).parent().parent().find('input[name=reviewSq]');
+	} else {
+		ordDtlNoArr = $(param).parent().parent().parent().parent().parent().find('input[name=ordDtlNo]');
+		ordDtlStatArr = $(param).parent().parent().parent().parent().parent().find('input[name=ordDtlStat]');
+		reviewSqArr = $(param).parent().parent().parent().parent().parent().find('input[name=reviewSq]');
+	}
+	
+	let cartArr = [];
+	$.each(ordDtlNoArr, function(idx, item) {
+		if (bannerYn != 'Y' || (bannerYn == 'Y' && ordDtlStatArr[idx].value == 'G013_70' && reviewSqArr[idx].value > 0)) {
+			cartArr.push(item.value);
+		}
+	});
+	
+	if (cartArr.length == 0) {
+		mcxDialog.alert('장바구니에 담을 상품이 없습니다.');
+		return false;
+	}
+	
+	// TODO
+	// 장바구니 담기 처리
+	let data = {};
+	
+	data.ordNo = ordNo;
+	data.ordDtlNoArr = cartArr;
+	
+	var jsonData = JSON.stringify(data);
+	
+	//gagajf.ajaxJsonSubmit('/mypage/order/decision'
+	//	, jsonData
+	//	, function() {
+	//		cfnGoToPage(_PAGE_MYPAGE_ORDER_DETAIL + ordNo);
+	//	});
+}
+
+// 선물하기 SMS 재전송 버튼 클릭 이벤트
+var fnReSendSms = function(param) {
+	let ordNo = $(param).attr('ordNo');
+	
+	// TODO
+	// 선물하기 SMS 재발송 처리
+}
+
+// 교환 버튼 클릭 이벤트
+var fnCreateExchange = function(param) {
+	if (ordNo == null) {
+		ordNo = $(param).attr('ordNo');
+	}
+
+	let ordDtlNoArr = $(param).parent().parent().parent().parent().find('input[name=ordDtlNo]');
+	
+	let exchangeArr = [];
+	$.each(ordDtlNoArr, function(idx, item) {
+		exchangeArr.push(item.value);
+	})
+	
+	
+	// TODO
+	// 교환신청 페이지 이동 처리
+	$('#exchangeForm input[name=ordNo]').val(ordNo);
+	$('#exchangeForm input[name=ordDtlNoArr]').val(exchangeArr);
+	
+	document.exchangeForm.submit();
+}
+
+// 반품/취소 버튼 클릭 이벤트
+var fnCreateCancel = function(param) {
+	let ordDtlNoArr = $(param).parent().parent().parent().parent().find('input[name=ordDtlNo]');
+	
+	// TODO
+	// 반품/취소신청 페이지 이동 처리
+}
+
+// 주문 내역 삭제 처리
+var fnDeleteOrder = function() {
+	mcxDialog.confirm('주문 내역을 삭제하시겠습니까?', {
+		cancelBtnText: "취소",
+		sureBtnText: "확인",
+		sureBtnClick: function(){
+			let data = {};
+			
+			data.ordNo = ordNo;
+			
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit('/mypage/order/delete'
+				, jsonData
+				, function() {
+					cfnGoToPage(_PAGE_MYPAGE);
+				});
+		}
+	});
+};
+
+// 문자열 길이를 체크
+var cfnGetTextLength = function(obj, maxLen, dpLoc) {
+	var valLen = $(obj).val().length;
+	var cByte = 0;
+	var sliceLen = 0;
+	
+	for (i = 0; i < valLen; i++) {
+		var aChar = $(obj).val().charAt(i);
+		if (escape(aChar).length == 6) {
+			cByte += 3; //한글이면 3를 더한다
+		} else if (aChar == '\n') {
+			cByte += 2; //엔터면 2을 더한다
+		} else {
+			cByte++; //한글아니면 1을 더한다
+		}
+		
+		if (cByte <= maxLen) {
+			sliceLen = i + 1;
+		}
+	}
+	
+	// 사용자가 입력한 값이 제한 값을 초과하는지를 검사한다.
+	if (parseInt(cByte) > parseInt(maxLen)) {
+		mcxDialog.alert('허용된 글자수가 초과되었습니다.\n초과된 부분은 자동으로 삭제됩니다.');
+		//var orgStr = $(obj).val();
+		var slicedStr = $(obj).val().substr(0, sliceLen);
+		$(obj).val(slicedStr);
+		var cByte = 0;
+		for (i = 0; i < $(obj).val().length; i++) {
+			var aChar = $(obj).val().charAt(i);
+			if (escape(aChar).length == 6) {
+				cByte += 3; //한글이면 3를 더한다
+			} else if (aChar == '\n') {
+				cByte += 2; //엔터면 2을 더한다
+			} else {
+				cByte++; //한글아니면 1을 더한다
+			}
+		}
+	}
+	
+	$(dpLoc).text(cByte.addComma());
+}

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

@@ -103,7 +103,7 @@ var cfnOpenCellphoneCertify = function (redirectUrl, custparams) {
 			document.location.href = actionUrl;
 		}
 	}
-};
+}
 
 /**
  * @type   : function