Fetch the repository succeeded.
package net.chrisrichardson.ftgo.kitchenservice.domain;
import io.eventuate.tram.events.aggregates.ResultWithDomainEvents;
import net.chrisrichardson.ftgo.common.NotYetImplementedException;
import net.chrisrichardson.ftgo.common.RevisedOrderLineItem;
import net.chrisrichardson.ftgo.common.UnsupportedStateTransitionException;
import net.chrisrichardson.ftgo.kitchenservice.api.TicketDetails;
import net.chrisrichardson.ftgo.kitchenservice.api.TicketLineItem;
import net.chrisrichardson.ftgo.kitchenservice.api.events.TicketAcceptedEvent;
import net.chrisrichardson.ftgo.kitchenservice.api.events.TicketCancelled;
import net.chrisrichardson.ftgo.kitchenservice.api.events.TicketDomainEvent;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;
@Entity
@Table(name = "tickets")
@Access(AccessType.FIELD)
public class Ticket {
@Id
private Long id;
@Enumerated(EnumType.STRING)
private TicketState state;
private TicketState previousState;
private Long restaurantId;
@ElementCollection
@CollectionTable(name = "ticket_line_items")
private List<TicketLineItem> lineItems;
private LocalDateTime readyBy;
private LocalDateTime acceptTime;
private LocalDateTime preparingTime;
private LocalDateTime pickedUpTime;
private LocalDateTime readyForPickupTime;
public static ResultWithDomainEvents<Ticket, TicketDomainEvent> create(long restaurantId, Long id, TicketDetails details) {
return new ResultWithDomainEvents<>(new Ticket(restaurantId, id, details));
}
private Ticket() {
}
public Ticket(long restaurantId, Long id, TicketDetails details) {
this.restaurantId = restaurantId;
this.id = id;
this.state = TicketState.CREATE_PENDING;
this.lineItems = details.getLineItems();
}
public List<TicketDomainEvent> confirmCreate() {
switch (state) {
case CREATE_PENDING:
state = TicketState.AWAITING_ACCEPTANCE;
return singletonList(new TicketCreatedEvent(id, new TicketDetails()));
default:
throw new UnsupportedStateTransitionException(state);
}
}
public List<TicketDomainEvent> cancelCreate() {
throw new NotYetImplementedException();
}
public List<TicketDomainEvent> accept(LocalDateTime readyBy) {
switch (state) {
case AWAITING_ACCEPTANCE:
// Verify that readyBy is in the futurestate = TicketState.ACCEPTED;
this.acceptTime = LocalDateTime.now();
if (!acceptTime.isBefore(readyBy))
throw new IllegalArgumentException(String.format("readyBy %s is not after now %s", readyBy, acceptTime));
this.readyBy = readyBy;
return singletonList(new TicketAcceptedEvent(readyBy));
default:
throw new UnsupportedStateTransitionException(state);
}
}
// TODO reject()
// TODO cancel()
public List<TicketDomainEvent> preparing() {
switch (state) {
case ACCEPTED:
this.state = TicketState.PREPARING;
this.preparingTime = LocalDateTime.now();
return singletonList(new TicketPreparationStartedEvent());
default:
throw new UnsupportedStateTransitionException(state);
}
}
public List<TicketDomainEvent> readyForPickup() {
switch (state) {
case PREPARING:
this.state = TicketState.READY_FOR_PICKUP;
this.readyForPickupTime = LocalDateTime.now();
return singletonList(new TicketPreparationCompletedEvent());
default:
throw new UnsupportedStateTransitionException(state);
}
}
public List<TicketDomainEvent> pickedUp() {
switch (state) {
case READY_FOR_PICKUP:
this.state = TicketState.PICKED_UP;
this.pickedUpTime = LocalDateTime.now();
return singletonList(new TicketPickedUpEvent());
default:
throw new UnsupportedStateTransitionException(state);
}
}
public void changeLineItemQuantity() {
switch (state) {
case AWAITING_ACCEPTANCE:
// TODO
break;
case PREPARING:
// TODO - too late
break;
default:
throw new UnsupportedStateTransitionException(state);
}
}
public List<TicketDomainEvent> cancel() {
switch (state) {
case AWAITING_ACCEPTANCE:
case ACCEPTED:
this.previousState = state;
this.state = TicketState.CANCEL_PENDING;
return emptyList();
default:
throw new UnsupportedStateTransitionException(state);
}
}
public Long getId() {
return id;
}
public List<TicketDomainEvent> confirmCancel() {
switch (state) {
case CANCEL_PENDING:
this.state = TicketState.CANCELLED;
return singletonList(new TicketCancelled());
default:
throw new UnsupportedStateTransitionException(state);
}
}
public List<TicketDomainEvent> undoCancel() {
switch (state) {
case CANCEL_PENDING:
this.state = this.previousState;
return emptyList();
default:
throw new UnsupportedStateTransitionException(state);
}
}
public List<TicketDomainEvent> beginReviseOrder(List<RevisedOrderLineItem> revisedOrderLineItems) {
switch (state) {
case AWAITING_ACCEPTANCE:
case ACCEPTED:
this.previousState = state;
this.state = TicketState.REVISION_PENDING;
return emptyList();
default:
throw new UnsupportedStateTransitionException(state);
}
}
public List<TicketDomainEvent> undoBeginReviseOrder() {
switch (state) {
case REVISION_PENDING:
this.state = this.previousState;
return emptyList();
default:
throw new UnsupportedStateTransitionException(state);
}
}
public List<TicketDomainEvent> confirmReviseTicket(List<RevisedOrderLineItem> revisedOrderLineItems) {
switch (state) {
case REVISION_PENDING:
this.state = this.previousState;
return singletonList(new TicketRevised());
default:
throw new UnsupportedStateTransitionException(state);
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。