WEB JAVA SPRING/PROJECT

9.주문 취소

sshhhh 2023. 9. 12. 17:05

주문 취소 버튼 클릭 시
취소 완료!

<주문 취소 로직>

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>