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