diff --git a/README.md b/README.md index 498a1025..47ee2d9f 100644 --- a/README.md +++ b/README.md @@ -188,16 +188,16 @@ docker compose -p kitchenpos up -d #### 단어 -| 한글명 | 영문명 | 설명 | -|---------|------------------|-----------------------------------------------| -| 배달 주소 | delivery address | 손님이 배달받을 주소 | -| 배달 기사 | delivery rider | 손님이 주문한 메뉴를 배달하는 사용자 | -| 대기중 | waiting | (주문 상태)손님이 배달하기 주문을 등록 후 접수 대기 상태 | -| 접수 | accepted | (주문 상태)사장님이 배달하기 주문을 수락한 상태 | -| 서빙 | served | (주문 상태)라이더에게 메뉴를 전달가능한 상태 (다시 말해, 메뉴가 완성된 상태) | -| 배달중 | delivering | (주문 상태)라이더에게 메뉴를 전달한 상태 | -| 배달완료 | delivered | (주문 상태)라이더가 배달을 완료한 상태 | -| 주문완료 | completed | (주문 상태)배달이 완료되어 주문이 완료됐을때의 상태 | +| 한글명 | 영문명 | 설명 | +|-------|------------------|-----------------------------------------------| +| 배달 주소 | delivery address | 손님이 배달받을 주소 | +| 배달 기사 | delivery rider | 손님이 주문한 메뉴를 배달하는 사용자 | +| 대기중 | waiting | (주문 상태)손님이 배달하기 주문을 등록 후 접수 대기 상태 | +| 수락 | accepted | (주문 상태)사장님이 배달하기 주문을 수락한 상태 | +| 서빙 | served | (주문 상태)라이더에게 메뉴를 전달가능한 상태 (다시 말해, 메뉴가 완성된 상태) | +| 배달중 | delivering | (주문 상태)라이더에게 메뉴를 전달한 상태 | +| 배달완료 | delivered | (주문 상태)라이더가 배달을 완료한 상태 | +| 주문완료 | completed | (주문 상태)배달이 완료되어 주문이 완료됐을때의 상태 | #### 행위 @@ -215,7 +215,7 @@ docker compose -p kitchenpos up -d | 한글명 | 영문명 | 설명 | |-----------|------------------|-----------------------------------------------| | 대기중 | waiting | (주문 상태)손님이 포장하기 주문을 등록 후 접수 대기 상태 | -| 접수 | accepted | (주문 상태)사장님이 포장하기 주문을 수락한 상태 | +| 수락 | accepted | (주문 상태)사장님이 포장하기 주문을 수락한 상태 | | 서빙 | served | (주문 상태)손님에게 메뉴를 전달가능한 상태 (다시 말해, 메뉴가 완성된 상태) | | 주문완료 | completed | (주문 상태)손님이 메뉴를 가져가서 주문이 완료됐을때의 상태 | @@ -224,7 +224,7 @@ docker compose -p kitchenpos up -d | 한글명 | 영문명 | 설명 | |------|----------|--------------------------------------| | 주문한다 | order | 손님이 포장하기 주문을 한다. | -| 수락한다 | accept | 사장님이 포자하기 주문을 수락한다. | +| 수락한다 | accept | 사장님이 포장하기 주문을 수락한다. | | 서빙한다 | serve | 사장님이 메뉴를 완성하여 손님이 가져갈 수 있도록 메뉴를 놔둔다. | ### 먹고가기 주문 @@ -234,7 +234,7 @@ docker compose -p kitchenpos up -d | 한글명 | 영문명 | 설명 | |-----------|------------------|-----------------------------------------------| | 대기중 | waiting | (주문 상태)손님이 먹고가기 주문을 등록 후 접수 대기 상태 | -| 접수 | accepted | (주문 상태)사장님이 먹고가기 주문을 수락한 상태 | +| 수락 | accepted | (주문 상태)사장님이 먹고가기 주문을 수락한 상태 | | 서빙 | served | (주문 상태)손님에게 메뉴를 전달가능한 상태 (다시 말해, 메뉴가 완성된 상태) | | 주문완료 | completed | (주문 상태)손님에게 메뉴를 직접 가져다 드리고 주문이 완료됐을때의 상태 | @@ -271,3 +271,239 @@ docker compose -p kitchenpos up -d | 치운다. | clear | 주문 테이블을 치운다. | ## 모델링 + +### 상품(Product) +#### 상태 +- 상품명(name) + - 상품명은 필수값이다. + - 상품명은 비속어를 포함할 수 없다. +- 가격(price) + - 가격은 필수값이다. + - 가격은 0원보다 작을 수 없다. +#### 행위 +- 상품을 등록할 수 있다. + - PurgomalumClient를 통해 비속어 검증을 한다. +- 상품 가격을 변경할 수 있다. + - 메뉴의 가격이 메뉴에 속한 상품 가격의 합보다 클 경우 메뉴는 숨겨진다. +- 상품을 조회할 수 있다. +### 메뉴 그룹(MenuGroup) +#### 상태 +- 이름(name) + - 메뉴 그룹 이름은 필수값이다. + - 메뉴 그룹 이름은 비어있을 수 없다. +#### 행위 +- 메뉴 그룹을 등록할 수 있다. +- 메뉴 그룹을 조회할 수 있다. +### 메뉴(Menu) +#### 상태 +- 이름(name) + - 상품명은 필수값이다. + - 상품명은 비속어를 포함할 수 없다. +- 가격(price) + - 가격은 필수값이다. + - 가격은 0원 이상이어야 한다. +- 메뉴 그룹(menuGroup) + - 메뉴 그룹은 필수값이다. +- 노출 상태(displayed) + - 노출 상태는 필수값이다. +- 메뉴 상품(menuProducts) + - 메뉴에 속한 상품은 1개 이상이어야 한다. +#### 행위 +- 메뉴를 등록할 수 있다. + - PurgomalumClient를 통해 비속어 검증을 한다. + - 메뉴에 속한 상품 중에 존재하지 않는 상품이 있으면 등록할 수 없다. + - 가격은 메뉴 상품 가격의 합보다 작거나 같아야 한다. +- 메뉴 가격을 변경할 수 있다. + - 가격은 메뉴 상품 가격의 합보다 작거나 같아야 한다. +- 메뉴를 노출할 수 있다. + - 가격은 메뉴 상품 가격의 합보다 작거나 같아야 한다. +- 메뉴를 미노출할 수 있다. +- 메뉴를 조회할 수 있다. +### 메뉴 상품(MenuProduct) +#### 상태 +- 상품(product) + - 상품은 필수값이다. +- 수량(quantity) + - 수량은 필수값이다. + - 수량은 0 보다 커야 한다. +### 주문 테이블(OrderTable) +#### 상태 +- 이름(name) + - 주문 테이블 이름은 필수값이다. + - 주문 테이블 이름은 비어있을 수 없다. +- 손님 수(numberOfGuests) + - 손님 수는 0명 이상이어야 한다. +- 착석 여부(occupied) +#### 행위 +- 주문 테이블을 등록할 수 있다. + - 손님 수는 0명으로 설정된다. + - 착석 여부는 미착석으로 설정된다. +- 주문 테이블에 착석할 수 있다. + - 존재하지 않는 주문 테이블에 착석할 수 없다. +- 주문 테이블을 치울 수 있다. + - 존재하지 않는 주문 테이블에 착석할 수 없다. + - 완료되지 않은 주문이 있는 주문 테이블은 치울 수 없다. + - 손님 수는 0명으로 설정된다. +- 주문 테이블의 손님 수를 변경할 수 있다. + - 존재하지 않는 주문 테이블에 착석할 수 없다. + - 미착석인 주문 테이블의 손님 수를 변경할 수 없다. +- 주문 테이블을 조회할 수 있다. +### 주문 내역(OrderLineItem) +#### 상태 +- 메뉴(menu) + - 메뉴는 필수값이다. +- 수량(quantity) + - 수량은 필수값이다. + - 포장하기와 배달하기의 주문 내역 수량은 0 이상이여야 한다. +- 가격(price) +### 주문(Order) +#### 상태 +- 주문 유형(type) + - 주문 유형은 필수값이다. +- 주문 상태(status) +- 주문 시간(orderDateTime) +- 주문 내역(orderLineItems) + - 주문 내역은 필수값이다. + - 주문 내역은 1개 이상이여야 한다. +- 배달 주소(deliveryAddress) + - 배달하기 주문인 경우에는 핋수값이다. + - 배달하기 주문인 경우에는 비어있을 수 없다. +- 주문 테이블(orderTable) + - 먹고가기인 경우 주문 테이블은 필수값이다. +#### 행위 +- 주문을 할 수 있다. + - 존재하지 않는 메뉴는 주문할 수 없다. + - 먹고가기인 경우 존재하지 않은 주문 테이블에 주문할 수 없다. + - 포장하기와 배달하기의 주문 내역 수량은 0 이상이여야 한다. + - 주문 내역의 속해있는 메뉴가 존재하지 않으면 주문할 수 없다. + - 메뉴가 미노출인 경우 주문할 수 없다. + - 메뉴 상태는 대기중으로 설정된다. + - 주문 시간은 현재 시간으로 설정된다. + - 주문 테이블이 미착석인 경우 주문할 수 없다. +- 주문을 수락할 수 있다. + - 존재하지 않는 주문은 수락할 수 없다. + - 주문 상태가 대기중인 주문만 수락할 수 있다. + - 배달하기 주문인 경우 배달 기사에 배달을 요청할 수 있다. + - KitchenridersClient를 통해 배달을 요청한다. + - 주문 상태를 수락으로 변경한다. +- 주문을 서빙할 수 있다. + - 존재하지 않는 주문은 서빙할 수 없다. + - 수락된 주문만 서빙할 수 있다. + - 주문 상태를 서빙으로 변경한다. +- 배달을 시작할 수 있다. + - 존재하지 않는 주문은 배달할 수 없다. + - 배달하기 주문이 경우에만 배달할 수 있다. + - 서빙된 주문만 배달할 수 있다. + - 주문 상태를 배달중으로 변경한다. +- 배달을 완료할 수 있다. + - 존재하지 않는 주문은 배달을 완료할 수 없다. + - 배달중인 주문만 배달할 수 있다. + - 주문 상태를 배달완료로 변경한다. +- 주문을 완료할 수 있다. + - 존재하지 않는 주문은 주문을 완료할 수 없다. + - 배달하기 주문의 경우 배달 완료된 주문만 완료할 수 있다. + - 포장하기 및 먹고가기 주문의 경우 서빙된 주문만 완료할 수 있다. + - 주문 상태를 주문완료로 변경한다. + - 먹고가기 주문인 경우 해당 주문 테이블의 모든 주문이 완료된 경우에만 테이블을 치울 수 있다. +- 주문을 조회할 수 있다. + +## 모델 관계도 +```mermaid +classDiagram + MenuGroup "1" --> "*" Menu + Menu "1" <-- "*" MenuProduct + MenuProduct "1" <-- "*" Product + Order "1" --> "*" OrderLineItem + OrderTable "1" --> "*" Order + OrderLineItem "1" <-- "*" Menu + OrderStatus -- Order + OrderType -- Order + class Product { + UUID id + String name // 상품명 + BigDecimal price // 가격 + } + class MenuGroup { + UUID id + String name // 이름 + } + class Menu { + UUID id + String name // 이름 + BigDecimal price // 가격 + MenuGroup menuGroup // 메뉴 그룹 + boolean displayed // 노출 상태 + List~MenuProduct~ menuProducts // 메뉴상품 + } + class MenuProduct { + Long seq + Product product // 상품 + long quantity // 수량 + } + class OrderTable { + UUID id + String name // 이름 + int numberOfGuests // 손님 수 + boolean occupied // 착석 여부 + } + class OrderLineItem { + UUID id + Menu menu // 메뉴 + long quantity // 수량 + BigDecimal price // 가격 + } + class Order { + UUID id + OrderType type // 주문 유형 + OrderStatus status // 주문 상태 + LocalDateTime orderDateTime // 주문 시간 + List~OrderLineItem~ orderLineItems // 주문 내역 + String deliveryAddress // 배달 주소 + OrderTable orderTable // 주문 테이블 + } + class OrderStatus { + <> + WAITING // 대기중 + ACCEPTED // 수락 + SERVED // 서빙 + DELIVERING // 배달중 + DELIVERED // 배달 완료 + COMPLETED // 완료 + } + class OrderType { + <> + EAT_IN // 먹고가기 + TAKEOUT // 포장하기 + DELIVERY // 배달하기 + } +``` +## 정책 +### 배달하기 +1. (손님) 배달하기 주문을 한다. - `대기중` +2. (사장님) 배달하기 주문을 수락한다. - `수락` +3. (사장님) 배달 기사에게 배달을 요청한다. +4. (사장님) 메뉴를 완성하여, 배달 기사가 배달할 수 있도록 메뉴를 놔둔다. - `서빙` +5. (배달 기사) 배달을 시작한다. - `배달중` +6. (배달 기사) 배달을 완료한다. - `배달완료` +7. (사장님) 주문을 완료한다. - `주문완료` +### 포장하기 +1. (손님) 포장하기 주문을 한다. - `대기중` +2. (사장님) 포장하기 주문을 수락한다. - `수락` +3. (사장님) 메뉴를 완성하여 손님이 가져갈 수 있도록 메뉴를 놔둔다. - `서빙` +4. (사장님) 손님이 메뉴를 가져가고 주문을 완료한다. - `주문완료` +### 먹고가기 +1. (손님) 비어있는 주문 테이블에 착석한다. +2. (사장님) 주문 테이블의 손님수를 설정한다. +3. (손님) 먹고가기 주문을 한다. - `대기중` +4. (사장님) 먹고가기 주문을 수락한다. - `수락` +5. (사장님) 메뉴를 완성한다. - `서빙` +6. (사장님) 손님에게 메뉴를 직접 가져다 드리고 주문을 완료한다. - `주문완료` +7. (사장님) 해당 주문테이블에 모든 주문이 완료되면 주문 테이블을 치운다. +### 메뉴 생성 +1. (사장님) 상품을 등록한다. +2. (사장님) 메뉴 그룹을 등록한다. +3. (사장님) 메뉴 상품을 설정한다. +4. (사장님) 메뉴를 등록한다. + +## CONTEXT MAP +![img.png](images/context-map.png) \ No newline at end of file diff --git a/images/context-map.png b/images/context-map.png new file mode 100644 index 00000000..30b17858 Binary files /dev/null and b/images/context-map.png differ