스프링데이터 + JPA/웹 애플리케이션 개발

27. 주문 목록 검색, 취소

sdafdq 2023. 11. 12. 00:40
@GetMapping("/orders")
public String orderList(@ModelAttribute("orderSearch")OrderSearch orderSearch, Model model){
    List<Order> orders = orderService.findOrders(orderSearch);
    model.addAttribute("orders",orders);
    return "order/orderList";
}
public List<Order> findOrders(OrderSearch orderSearch){
    return orderRepository.findAllString(orderSearch);
}

이 부분은 일단 넘어가겠다. 나중에 QueryDSL 배울거기 때문에.

 

주문취소

@PostMapping("/orders/{orderId}/cancel")
public String cancelOrder(@PathVariable("orderId") Long orderId){
    orderService.cancelOrder(orderId);
    return "redirect:orders";
}

취소 버튼 누를 시, 그 아이템의 아이디와 함께 저렇게 url로 오도록 함.

그럼 이것도 Post니 새로고침으로 두번 요청하면 곤란하니 PRG

 

public void cancelOrder(Long orderId){
    Order order = orderRepository.findOne(orderId);

    order.cancel();
}

찾아서, cancel함.

 

public void cancel(){
    if(delivery.getStatus() == DeliveryStatus.COMP){
        throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다.");
    }

    this.setStatus(OrderStatus.CANCEL);
    for (OrderItem orderItem : orderItems) {
        orderItem.cancel();
    }
}

이미 배송완료된 상품이면 에러 발생시키고,

아니면 주문의 상태를 cancel로 바꾸고,

주문 아이템들을

public void cancel(){
    this.getItem().addStock(count);
}

이렇게 cancel 시켜 버림. 간단하게 재고회복만.

 

 

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/header :: header"/>
<body>
<div class="container">
    <div th:replace="fragments/bodyHeader :: bodyHeader"/>
    <div>
        <div>
            <form th:object="${orderSearch}" class="form-inline">
                <div class="form-group mb-2">
                    <input type="text" th:field="*{memberName}" class="formcontrol" placeholder="회원명"/>
                </div>
                <div class="form-group mx-sm-1 mb-2">
                    <select th:field="*{orderStatus}" class="form-control">
                        <option value="">주문상태</option>
                        <option th:each=
                                        "status : ${T(jpabook.jpashop.domain.OrderStatus).values()}"
                                th:value="${status}"
                                th:text="${status}">option
                        </option>
                    </select>
                </div>
                <button type="submit" class="btn btn-primary mb-2">검색</button>
            </form>
        </div>
        <table class="table table-striped">
            <thead>
            <tr>
                <th>#</th>
                <th>회원명</th>
                <th>대표상품 이름</th>
                <th>대표상품 주문가격</th>
                <th>대표상품 주문수량</th>
                <th>상태</th>
                <th>일시</th>
                <th></th>
            </tr>
            </thead>
            <tbody>
            <tr th:each="item : ${orders}">
                <td th:text="${item.id}"></td>
                <td th:text="${item.member.name}"></td>
                <td th:text="${item.orderItems[0].item.name}"></td>
                <td th:text="${item.orderItems[0].orderPrice}"></td>
                <td th:text="${item.orderItems[0].count}"></td>
                <td th:text="${item.status}"></td>
                <td th:text="${item.orderDate}"></td>
                <td>
                    <a th:if="${item.status.name() == 'ORDER'}" href="#"
                       th:href="'javascript:cancel('+${item.id}+')'"
                       class="btn btn-danger">CANCEL</a>
                </td>
            </tr>
            </tbody>
        </table>
    </div>
    <div th:replace="fragments/footer :: footer"/>
</div> <!-- /container -->
</body>
<script>
    function cancel(id) {
        var form = document.createElement("form");
        form.setAttribute("method", "post");
        form.setAttribute("action", "/orders/" + id + "/cancel");
        document.body.appendChild(form);
        form.submit();
    }
</script>
</html>

좀 긴데,

그냥 search 부분은 Enum자체를 가져와서 있는 상태들을 다 뿌리는 거고,

submit 하면 그 조건 상태로 /orders로 넘어감. form은 기본이 get이니 get으로.

 

그 외에 그냥 주문정보 뿌리고,

cancel버튼 추가.

action으로 저 url로 가게끔 설정한 다음,

submit 시켜버림.

나라면 버튼마다 따로 속성 지정해줘서 값 가지고 있게 해 놓은 다음(-data-id라던지)

클릭 이벤트로 추가 시킬 듯.

 

 

'스프링데이터 + JPA > 웹 애플리케이션 개발' 카테고리의 다른 글

26. 상품 주문  (0) 2023.11.11
25. 변경감지와 병합  (0) 2023.11.11
24. 상품 수정  (0) 2023.11.10
23. 상품 등록  (0) 2023.11.10
22. 회원 목록 조회  (0) 2023.11.10