지난번 개인 과제 키오스크에서 기능을 추가하는 팀 프로젝트를 진행했다.
과제에서 요구한 추가 기능은 다음과 같다.
손님이 주문할 때 요청사항을 적는 기능
주문 시 요청사항 메시지를 입력할 수 있습니다. (20자 제한)
맨 위에 완료된 최근주문 3개를 출력한다.
그 아래에 대기 중인 모든 주문 목록을 출력한다.
가게 주인이 주문 현황과 메뉴 목록을 추가, 삭제할 수 있도록 하는 기능
0. 메인 메뉴
-
- 메인 메뉴에서 아래 기능을 실행한다.
- “1. 대기주문 목록”
- “2. 완료주문 목록”
- “3. 상품 생성”
- “4. 상품 삭제”
- 대기주문 목록
- 주문이 완료되어 처리 대기 중인 주문을 조회하고 완료처리 할 수 있다.
- 주문 데이터 형식은 아래와 같다.
- 대기 번호
- 주문 상품 목록
- 주문 총 가격
- 요청 사항
- 주문 일시
- 날짜는 ISO 8601 형식으로 조합된 UTC 날짜 및 시간 예) 2016-10-27T 17:13:40+00:00
2. 완료 주문 목록
-
-
- 완료처리 했던 주문들을 모두 조회할 수 있다.
- **[ 완료주문 데이터 ]**는 **[ 주문 데이터 ]**에 완료 일시를 추가로 가진다.
- [ 완료주문 데이터 ]
- 대기 번호
- 주문 상품 목록
- 주문 총 가격
- 주문 일시
- 요청 사항
- 완료주문 일시
- 날짜는 ISO 8601 형식으로 조합된 UTC 날짜 및 시간 예) 2016-10-27T 17:13:40+00:00
3. 상품 생성
-
-
- 새로운 상품정보(메뉴, 이름, 설명, 가격)를 입력하여 생성할 수 있다.
- 기존에 없는 메뉴라면 신규로 생성해 준다.
- 새로 생성된 메뉴와 상품은 각각 유일한 메뉴 ID, 상품 ID 식별자를 가진다.
4. 상품 삭제
-
-
- 상품 ID를 가지고 기존 상품정보를 삭제할 수 있다.
- 삭제이전에 주문된 주문정보에서는 삭제되지 않는다.
대기주문 목록을 담을 Order 클래스
인스턴스를 생성할 때 자동으로 주문일시(time)에 현재 시각을 넣을 수 있게 매개변수로 time을 받지 않는 생성자를 만들어줬다.
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Order {
int orderNum;
String orderList;
String time;
double totalPrice;
String request;
Order(){}
Order(int orderNum, String orderList, double totalPrice, String time, String request){
this.orderNum = orderNum;
this.orderList = orderList;
this.totalPrice = totalPrice;
this.time = time;
this.request = request;
}
Order(int orderNum, String orderList, double totalPrice, String request){
this.orderNum = orderNum;
this.orderList = orderList;
this.totalPrice = totalPrice;
this.request = request;
this.time = getTime();
}
public String getTime() {
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
return now.format(dateTimeFormatter);
}
@Override
public String toString() {
return "\n1. 대기번호 : " + this.orderNum + "\n2. 주문 상품 목록 : " + this.orderList +"\n3. 주문 총 가격 : " + this.totalPrice +"W\n4. 요청사항 : " + this.request + "\n5. 주문 일시 : " + this.time + "\n";
}
}
주문 시 요청사항(request)을 손님에게 입력받은 뒤 장바구니(cart)에 담겨 있는 상품명들을 문자열로 연결해서(orderlist) 대기주문 목록(orders)에 넣어줬다. 주문번호와 총가격은 기존 프로젝트에 이미 있어서 그대로 가져왔다.
private List<Item> cart;
private List<Order> orders;
public void addToWaiting(List<Item> cart){
Scanner sc = new Scanner(System.in);
System.out.println("요청 사항을 입력해주세요.");
String request = sc.nextLine();
String orderList = "";
for(Item a : cart){
orderList += a.name + ", ";
}
orderList = orderList.substring(0, orderList.length() - 2); // 맨 끝 , 제거
orders.add(new Order(orderNumber, orderList, totalPrice, request));
}
완료 주문 데이터는 대기 주문 데이터를 상속받아 주문 완료 일시(completiontime) 변수를 추가해 줬다. 또 완료 주문 목록을 최신순으로 정렬하기 위해 주문 완료 일시(completiontime)를 기준으로 비교하도록 compareTo를 오버라이딩 해줬다.
public class CompletedOrder extends Order implements Comparable<CompletedOrder> {
String completiontime;
CompletedOrder(){
}
CompletedOrder(Order order){
super(order.orderNum, order.orderList, order.totalPrice, order.time, order.request);
this.completiontime = getTime();
}
@Override
public String toString() {
return "\n1. 완료번호 : " + this.orderNum + "\n2. 주문 상품 목록 : " + this.orderList +"\n3. 주문 총 가격 : " + this.totalPrice + "W\n4. 요청사항 : " + this.request + "\n5. 주문 일시 : " + this.time + "\n6. 완료 주문 일시 : " +this.completiontime+ "\n";
}
@Override
public int compareTo(CompletedOrder order) {
return this.time.compareTo(order.completiontime);
}
}
관리자가 완료처리할 대기주문 번호(idx)를 고르면 선택한 주문 데이터(co)를 완료 주문 리스트(completedOrders)에 추가하고 대기주문 목록(orders)에서 삭제했다.
public void CompletedOrder(int idx){
Order co = getOrder(idx);
orders.remove(idx);
completedOrders.add(new CompletedOrder(co));
}
완료된 최근주문 3개를 출력하도록 내림차순으로 정렬한 뒤, 완료 주문 목록의 크기가 3 이상이면 세 개만 출력되게 하고 그 미만이면 전부 출력되게 했다.
private List<CompletedOrder> completedOrders;
public void printRecentOrder(){
completedOrders.sort(Collections.reverseOrder());
int SIZE = completedOrders.size();
if(SIZE >= 3){
for (int i = 0; i <3; i++){
System.out.println(completedOrders.get(i));
}
} else {
for (CompletedOrder o : completedOrders){
System.out.println(o);
}
}
}
그 아래 대기 중인 주문 모두를 출력하는 메서드는 다음과 같이 작성했다.
public void printWaiting() {
int SIZE = orders.size();
System.out.println("\n대기주문 "+SIZE+"개\n");
for (Order order : orders){
System.out.println(order);
}
}