WEB JAVA SPRING/PROJECT

8.주문 이력 조회

sshhhh 2023. 9. 12. 17:04

주문한 상품 조회

1.OrderItemDto

/**
 * 조회한 주문 데이터 화면에 보낼때 사용
 * 주문 상품 정보 담음
 */

package com.shop.dto;

import com.shop.entity.OrderItem;
import lombok.Getter;
import lombok.Setter;



@Getter @Setter
public class OrderItemDto {

    public OrderItemDto(OrderItem orderItem, String imgUrl){
        this.itemNm = orderItem.getItem().getItemNm();
        this.count = orderItem.getCount();
        this.orderPrice = orderItem.getOrderPrice();
        this.imgUrl = imgUrl;
    }

    private String itemNm; //상품명
    private int count; //주문 수량

    private int orderPrice; //주문 금액
    private String imgUrl; //상품 이미지 경로

}

 

 

 

2.OrderHistDto

//주문 정보 담음

package com.shop.dto;

import com.shop.constant.OrderStatus;
import com.shop.entity.Order;
import lombok.Getter;
import lombok.Setter;

import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

//주문 정보 담음
@Getter @Setter
public class OrderHistDto {

    public OrderHistDto(Order order){ //order 객체를 파라미터로 받아서 멤벼 변수 값 세팅
        this.orderId = order.getId();
        this.orderDate = order.getOrderDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
        this.orderStatus = order.getOrderStatus();
    }

    private Long orderId; //주문아이디
    private String orderDate; //주문날짜
    private OrderStatus orderStatus; //주문 상태

    private List<OrderItemDto> orderItemDtoList = new ArrayList<>();

    //주문 상품리스트
    public void addOrderItemDto(OrderItemDto orderItemDto){
        orderItemDtoList.add(orderItemDto);
    }

}

 

 

 

 

3.OrderRepository

//JPAL로 주문 이력을 조회

package com.shop.repository;

import com.shop.entity.Order;
import org.aspectj.weaver.ast.Or;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface OrderRepository extends JpaRepository<Order, Long> {

    //현재 로그인한 사용자의 주문 데이터를 페이징 조건에 맞춰서 조회
    @Query("select o from Order o " +
            "where o.member.email = :email " +
            "order by o.orderDate desc"
    )
    List<Order> findOrders(@Param("email") String email, Pageable pageable);

    //현재 로그인한 회원의 주문 개수가 몇 개인지 조회
    @Query("select count(o) from Order o " +
            "where o.member.email = :email"
    )
    Long countOrder(@Param("email") String email);

}

 

 

 

4.ItemImgRepository

//상품의 대표이미지를 찾는 쿼리 메소드 : 구매이력 페이지에서 주문 상품의 대표 이미지를 보여주기 위해

ItemImg findByItemIdAndRepimgYn(Long itemId, String repimgYn);

 

 

 

5.OrderService

//주문 목록 조회

@Transactional(readOnly = true)
 public Page<OrderHistDto> getOrderList(String email, Pageable pageable) {

     //유저의 아이디와 페이징 조건 이용하여 주문 목록 조회
     List<Order> orders = orderRepository.findOrders(email, pageable);
     //유저의 주문 총 개수
     Long totalCount = orderRepository.countOrder(email);

     List<OrderHistDto> orderHistDtos = new ArrayList<>();

     //주문 리스트 순회하면서 구매 이력 페이지에 전달할 DTO 생성
     for (Order order : orders) {
         OrderHistDto orderHistDto = new OrderHistDto(order);
         List<OrderItem> orderItems = order.getOrderItems();
         for (OrderItem orderItem : orderItems) {
             ItemImg itemImg = itemImgRepository.findByItemIdAndRepimgYn
                     (orderItem.getItem().getId(), "Y"); //대표이미지 조회
             OrderItemDto orderItemDto =
                     new OrderItemDto(orderItem, itemImg.getImgUrl());
             orderHistDto.addOrderItemDto(orderItemDto);
         }

         orderHistDtos.add(orderHistDto);
     }

     //페이지 구현 객체를 생성하여 반환
     return new PageImpl<OrderHistDto>(orderHistDtos, pageable, totalCount);
 }

 

 

 

 

6.OrderController

//구매이력조회, 지금까지 구현한 로직 호출

@GetMapping(value = {"/orders", "/orders/{page}"})
public String orderHist(@PathVariable("page") Optional<Integer> page, Principal principal, Model model){

    Pageable pageable = PageRequest.of(page.isPresent() ? page.get() : 0, 4);
    //현재 로그인한 회원은 이메일과 페이징 객체를 파라미터로 전달하여 화면에 전달한 주문목록데이터를 리턴값으로 받음
    Page<OrderHistDto> ordersHistDtoList = orderService.getOrderList(principal.getName(), pageable);

    model.addAttribute("orders", ordersHistDtoList);
    model.addAttribute("page", pageable.getPageNumber());
    model.addAttribute("maxPage", 5);

    return "order/orderHist";
}

 

 

 


orderHist.html

<div layout:fragment="content" class="content-mg">

    <h2 class="mb-4">
        구매 이력
    </h2>

    <div th:each="order : ${orders.getContent()}">

        <div class="d-flex mb-3 align-self-center">
            <h4 th:text="${order.orderDate} + ' 주문'"></h4>
            <div class="ml-3">
                <th:block th:if="${order.orderStatus == T(com.shop.constant.OrderStatus).ORDER}">
                    <button type="button" class="btn btn-outline-secondary" th:value="${order.orderId}" onclick="cancelOrder(this.value)">주문취소</button>
                </th:block>
                <th:block th:unless="${order.orderStatus == T(com.shop.constant.OrderStatus).ORDER}">
                    <h4>(취소 완료)</h4>
                </th:block>
            </div>
        </div>
        <div class="card d-flex">
            <div th:each="orderItem : ${order.orderItemDtoList}" class="d-flex mb-3">
                <div class="repImgDiv">
                    <img th:src="${orderItem.imgUrl}" class = "rounded repImg" th:alt="${orderItem.itemNm}">
                </div>
                <div class="align-self-center w-75">
                    <span th:text="${orderItem.itemNm}" class="fs24 font-weight-bold"></span>
                    <div class="fs18 font-weight-light">
                        <span th:text="${orderItem.orderPrice} +'원'"></span>
                        <span th:text="${orderItem.count} +'개'"></span>
                    </div>
                </div>
            </div>
        </div>

    </div>

    <div th:with="start=${(orders.number/maxPage)*maxPage + 1}, end=(${(orders.totalPages == 0) ? 1 : (start + (maxPage - 1) < orders.totalPages ? start + (maxPage - 1) : orders.totalPages)})" >
        <ul class="pagination justify-content-center">

            <li class="page-item" th:classappend="${orders.number eq 0}?'disabled':''">
                <a th:href="@{'/orders/' + ${orders.number-1}}" aria-label='Previous' class="page-link">
                    <span aria-hidden='true'>Previous</span>
                </a>
            </li>

            <li class="page-item" th:each="page: ${#numbers.sequence(start, end)}" th:classappend="${orders.number eq page-1}?'active':''">
                <a th:href="@{'/orders/' + ${page-1}}" th:inline="text" class="page-link">[[${page}]]</a>
            </li>

            <li class="page-item" th:classappend="${orders.number+1 ge orders.totalPages}?'disabled':''">
                <a th:href="@{'/orders/' + ${orders.number+1}}" aria-label='Next' class="page-link">
                    <span aria-hidden='true'>Next</span>
                </a>
            </li>

        </ul>
    </div>

</div>