# 주문, 주문상품 엔티티 개발

구현 기능

* 상품 주문
* 주문 내역 조회
* 주문 취소

구현 순서

* 주문 엔티티, 주문상품 엔티티 개발(핵심 비즈니스 로직)
* 주문 리포지토리 개발
* 주문 서비스 개발
* **주문 검색 기능 개발**
* 주문 기능 테스트

주문하면 단순 주문 목록에 데이터가 들어갈 뿐만 아니라 재고 목록에서 수량 줄어야 한다!\
주문 취소하면 재고가 다시 증가되는 것도 마찬가지다.

Order

1. 생성메서드 : 생성해야하는 필드(Member, Delivery, OrderItem, LocalDateTime, OrderStatus)가 많을 땐 생성 메서드를 따로 구현한다!\
   OrderStatus : 주문이 생성되면 ORDER로 해준다.\
   OrderDate : LocalDateTime.now()

```java
public static Order createOrder(Member member,Delivery delivery,OrderItem... orderItems){//orderItem에서 이미 수량 감산하고 넘어온다.
    Order order = new Order();
    order.setMember(member);
    order.setDelivery(delivery);
    for(OrderItem orderItem : orderItems){
        order.addOrderItem(orderItem);
    }
    order.setStatus(OrderStatus.ORDER);
    order.setOrderDate(LocalDateTime.now());
    return order;
}
```

&#x20; 2\. 비즈니스 로직 : 주문 취소\
배송이 완료되면 주문 취소가 불가능하다.\
1\. validation 로직 : delivery.getStatus() == DeliveryStatus.COMP

Order 내부에 있는 Delivery 엔티티의 상태 조회하고, 이미 배송완료된 상태라면 Exception\
2\. validation 통과 후\
\- 주문 상태 CANCEL로 처리\
\- 주문 상품도 cancle() 처리 : 주문(상품 2개)일 때 상품 각각에 대해서도 취소 처리해줘야함!\
\&#xNAN;**(OrderItem에서 cancle 메서드 구현 필요)**

```java
public void cancel(){
    //validation
    if(delivery.getStatus() == DelieveryStatus.COMP){
        throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다");
    }
    //validation 통과 후
    this.setStatus(OrderStatus.CANCEL);
    for(OrderItem orderItem : orderItems){
        orderItem.cancle();
    }
}
```

&#x20; 3\. 조회 로직 : 전체 주문 가격 조회\
현재 Order에 있는 OrderItem 리스트인 orderItems를 반복문으로 돌면서 각 상품 수량과 가격을 곱한 값을 다 더해준다!\
\&#xNAN;**(OrderItem에서 상품 수량과 가격을 곱해서 총가격 구하는 메서드 구현 필요)**

```java
public int getTotalPrice(){
    int totalPrice = 0;
    for(OrderItem orderItem : orderItems){
        totalPrice += orderItem.getTotalPrice();//300*5 + 400*3 + ...
    }
    return totalPrice;
}
```

Java8 버전 문법 : stream을 mapToInt로 변환

```java
public int getTotalPrice(){//stream을 mapToInt로 변환
    return orderItems.stream()
        .mapToInt(OrderItem::getTotalPrice)
        .sum();
```

OrderItem

1. 생성메서드 : 생성해야하는 필드(Item, Order, orderPrice, count)가 많을 땐 생성 메서드를 따로 구현한다!

```java
public static OrderItem createOrderItem(Item item,int orderPrice,int count){
    OrderItem orderItem = new OrderItem();
    orderItem.setItem(item);
    orderItem.setOrderPrice(orderPrice);
    orderItem.setCount(count);

    item.removeStock(count);
    return orderItem;
}
```

&#x20; 2\. 비즈니스 로직

```java
public void cancle(){
  getItem().addStock(count);//재고 수량 증가.아이템을 가져와서(getItem()) 주문 수량만큼 다시 늘려줘야한다!
}
```

3\. 조회 로직 : 주문 상품 전체 가격 조회

```java
public int getTotalPrice(){//주문 가격 * 주문 수량
  return getOrderPrice() * getCount();
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://heunnajo.gitbook.io/jpa/6./undefined.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
