9.주문 취소WEB JAVA SPRING/PROJECT2023. 9. 12. 17:05
Table of Contents
<주문 취소 로직>
1.상태 취소로 만들것
2.상품 재고 감소 시켰던 만큼 더하기
1.Item
//상품 재고 증가 (주문취소시)
public void addStock(int stockNumber){
this.stockNumber += stockNumber;
}
2.OrderItem
//주문 취소
public void cancel(){
this.getItem().addStock(count);
}
3.Order
//주문 취소 = 상품 재고 더하기 + 주문상태 취소로 바꾸기
public void cancelOrder() {
this.orderStatus = OrderStatus.CANCEL;
for (OrderItem orderItem : orderItems) {
orderItem.cancel();
}
4.OrderService
//현재 로그인한 사용자와 주문 데이터를 생성한 사용자가 같은지 검사 : 같으면 true, 다르면 false
//주문 취소 로직
@Transactional(readOnly = true)
public boolean validateOrder(Long orderId, String email){
Member curMember = memberRepository.findByEmail(email);
Order order = orderRepository.findById(orderId)
.orElseThrow(EntityNotFoundException::new);
Member savedMember = order.getMember();
if(!StringUtils.equals(curMember.getEmail(), savedMember.getEmail())){
return false;
}
return true;
}
public void cancelOrder(Long orderId){
Order order = orderRepository.findById(orderId)
.orElseThrow(EntityNotFoundException::new);
order.cancelOrder(); //주문 취소 상태로 변경하면 변경 감지 기능에 의해서 트랜잭션 끝날때 update 쿼리 실행
}
5.OrderController
//orderID 주문 번호를 받아서 주문 취소, 비동기
@PostMapping("/order/{orderId}/cancel")
public @ResponseBody ResponseEntity cancelOrder(@PathVariable("orderId") Long orderId , Principal principal){
if(!orderService.validateOrder(orderId, principal.getName())){
return new ResponseEntity<String>("주문 취소 권한이 없습니다.", HttpStatus.FORBIDDEN);
}
orderService.cancelOrder(orderId);
return new ResponseEntity<Long>(orderId, HttpStatus.OK);
}
orderHist.html
<script th:inline="javascript">
function cancelOrder(orderId) {
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
var url = "/order/" + orderId + "/cancel";
var paramData = {
orderId : orderId,
};
var param = JSON.stringify(paramData); //취소할 주문 번호 파라미터로 넘김
$.ajax({
url : url,
type : "POST",
contentType : "application/json",
data : param,
beforeSend : function(xhr){
/* 데이터를 전송하기 전에 헤더에 csrf값을 설정 */
xhr.setRequestHeader(header, token);
},
dataType : "json",
cache : false,
success : function(result, status){ // 정상적으로 취소됐으면 현재페이지로 리다이렉트
alert("주문이 취소 되었습니다.");
location.href='/orders/' + [[${page}]];
},
error : function(jqXHR, status, error){
if(jqXHR.status == '401'){
alert('로그인 후 이용해주세요');
location.href='/members/login';
} else{
alert(jqXHR.responseText);
}
}
});
}
</script>
<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>
'WEB JAVA SPRING > PROJECT' 카테고리의 다른 글
10. 장바구니 담기 (0) | 2023.09.12 |
---|---|
8.주문 이력 조회 (0) | 2023.09.12 |
7.주문 기능 (0) | 2023.09.12 |
6.메인 화면 (0) | 2023.09.12 |
5.상품 관리하기 : Querydsl (0) | 2023.09.12 |