public enum OrderStatus {
CREATED, // 订单创建
UNPAID, // 订单待支付
PAID, // 订单已支付
TO_BE_SHIPPED, // 订单待发货
SHIPPED, // 订单已发货
CONFIRMED, // 订单确认
COMPLETED, // 交易完成
CANCELED // 订单已取消
}
public enum OrderEvent {
PAY, // 支付
SHIP, // 发货
RECEIVE, // 确认收货
CANCEL // 取消订单
}
public class OrderStateMachine {
private static final Map<OrderStatus, Map<OrderEvent, OrderStatus>> stateMachine = new HashMap<>();
static {
// 定义状态转移表
Map<OrderEvent, OrderStatus> createdTransitions = new EnumMap<>(OrderEvent.class);
createdTransitions.put(OrderEvent.PAY, OrderStatus.UNPAID);
createdTransitions.put(OrderEvent.CANCEL, OrderStatus.CANCELED);
stateMachine.put(OrderStatus.CREATED, createdTransitions);
Map<OrderEvent, OrderStatus> unpaidTransitions = new EnumMap<>(OrderEvent.class);
unpaidTransitions.put(OrderEvent.PAY, OrderStatus.PAID);
unpaidTransitions.put(OrderEvent.CANCEL, OrderStatus.CANCELED);
stateMachine.put(OrderStatus.UNPAID, unpaidTransitions);
Map<OrderEvent, OrderStatus> paidTransitions = new EnumMap<>(OrderEvent.class);
paidTransitions.put(OrderEvent.SHIP, OrderStatus.TO_BE_SHIPPED);
paidTransitions.put(OrderEvent.CANCEL, OrderStatus.CANCELED);
stateMachine.put(OrderStatus.PAID, paidTransitions);
Map<OrderEvent, OrderStatus> toBeShippedTransitions = new EnumMap<>(OrderEvent.class);
toBeShippedTransitions.put(OrderEvent.RECEIVE, OrderStatus.CONFIRMED);
toBeShippedTransitions.put(OrderEvent.CANCEL, OrderStatus.CANCELED);
stateMachine.put(OrderStatus.TO_BE_SHIPPED, toBeShippedTransitions);
Map<OrderEvent, OrderStatus> shippedTransitions = new EnumMap<>(OrderEvent.class);
shippedTransitions.put(OrderEvent.RECEIVE, OrderStatus.CONFIRMED);
shippedTransitions.put(OrderEvent.CANCEL, OrderStatus.CANCELED);
stateMachine.put(OrderStatus.SHIPPED, shippedTransitions);
Map<OrderEvent, OrderStatus> confirmedTransitions = new EnumMap<>(OrderEvent.class);
confirmedTransitions.put(OrderEvent.CANCEL, OrderStatus.COMPLETED);
stateMachine.put(OrderStatus.CONFIRMED, confirmedTransitions);
}
public static OrderStatus nextState(OrderStatus currentStatus, OrderEvent event) {
Map<OrderEvent, OrderStatus> transitions = stateMachine.get(currentStatus);
if (transitions == null) {
throw new IllegalStateException("Invalid order status: " + currentStatus);
}
OrderStatus nextStatus = transitions.get(event);
if (nextStatus == null) {
throw new IllegalStateException("Invalid event " + event + " for order status " + currentStatus);
}
return nextStatus;
}
}
假设我们有一个订单 order,它的状态为 ORDER_CREATED,接下来我们需要将它流转到 ORDER_PAID 状态,那么可以按照以下流程:
判断订单当前状态是否为 ORDER_CREATED 如果是,则将订单状态设置为 ORDER_TO_BE_PAID,并且更新订单的 update_time,同时添加一条状态变更记录到订单状态表中,记录的事件为 PAY_ORDER,表示用户支付订单 进入支付流程,等待用户支付 用户支付成功后,将订单状态设置为 ORDER_PAID,并且更新订单的 update_time,同时添加一条状态变更记录到订单状态表中,记录的事件为 ORDER_PAID,表示订单已支付
if (order.getOrderStatus() == OrderStatus.ORDER_CREATED) {
order.setOrderStatus(OrderStatus.ORDER_TO_BE_PAID);
order.setUpdateTime(new Date());
orderStatusService.createOrderStatus(order.getOrderId(), OrderStatusEvent.PAY_ORDER, OrderStatus.ORDER_TO_BE_PAID);
// 进入支付流程等待用户支付
// ...
order.setOrderStatus(OrderStatus.ORDER_PAID);
order.setUpdateTime(new Date());
orderStatusService.createOrderStatus(order.getOrderId(), OrderStatusEvent.ORDER_PAID, OrderStatus.ORDER_PAID);
}