目录
项目需求概述
用户从开始下订单,到支付完成,再到物流部进行发货,最终用户确认收货
整个流程涉及到很多订单状态,需要通过代码对订单状态进行管理。
除此之外,用户或者物流部分每一次触发的不同操作,都有可能改变订单状态。
如:
用户创建订单操作导致订单状态为待支付状态
用户支付操作导致订单状态变为待发货状态
物流部门发货操作导致订单状态变为待收货状态
用户确认收货操作导致订单状态变为订单完成状态
开发任务
设计整体结算发货以及收货的流程
用户创建订单-> 支付订单->发货->收货->订单完成
要求:
创建订单完成后,订单状态初始化为待支付
订单状态包括:待支付;待发货;待收货;订单完成(状态模式)
触发订单状态变化的操作:支付订单;发货;确认收货(观察者模式)
开发
使用Spring里面的状态机
监听器实际都是用框架实现,不会手写
引入依赖
<dependency>
<groupId>org.springframework.statemachine</groupId>
<artifactId>spring-statemachine-core</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
状态相关枚举
/**
* 订单状态枚举
*/
public enum OrderState {
/**
* 待支付
*/
ORDER_WAIT_PAY,
/**
* 待发货
*/
ORDER_WAIT_SEND,
/**
* 待收货
*/
ORDER_WAIT_RECEIVE,
/**
* 完成订单
*/
ORDER_FINISH
}
/**
* 订单状态转换关系
*/
public enum OrderStateChangeAction {
/**
* 支付操作
*/
PAY_ORDER,
/**
* 发货操作
*/
SEND_ORDER,
/**
* 收货操作
*/
RECEIVE_ORDER
}
@Data
public class Order {
private Integer orderId;
private OrderState orderState;
}
创建配置类
/**
* @author chongfayi
*/
@Configuration
@EnableStateMachine(name = "orderStateMachine")
public class OrderStateMachineConfig extends StateMachineConfigurerAdapter<OrderState, OrderStateChangeAction> {
@Override
public void configure(StateMachineStateConfigurer<OrderState, OrderStateChangeAction> states) throws Exception {
states.withStates().initial(OrderState.ORDER_WAIT_PAY)
.states(EnumSet.allOf(OrderState.class));
}
@Override
public void configure(StateMachineTransitionConfigurer<OrderState, OrderStateChangeAction> transitions) throws Exception {
transitions.withExternal().source(OrderState.ORDER_WAIT_PAY)
.target(OrderState.ORDER_WAIT_SEND)
.event(OrderStateChangeAction.PAY_ORDER)
.and()
.withExternal().source(OrderState.ORDER_WAIT_SEND)
.target(OrderState.ORDER_WAIT_RECEIVE)
.event(OrderStateChangeAction.SEND_ORDER)
.and()
.withExternal().source(OrderState.ORDER_WAIT_RECEIVE)
.target(OrderState.ORDER_FINISH)
.event(OrderStateChangeAction.RECEIVE_ORDER);
}
@Bean
public DefaultStateMachinePersister machinePersister() {
return new DefaultStateMachinePersister(new StateMachinePersist<Object, Object, Order>() {
@Override
public void write(StateMachineContext<Object, Object> stateMachineContext, Order order) throws Exception {
//通过任何方式进行持久化,MYSQL Redis 等
}
@Override
public StateMachineContext<Object, Object> read(Order order) throws Exception {
return new DefaultStateMachineContext(order.getOrderState(), null, null, null);
}
});
}
}
事件监听类
/**
* 监听器是监听到 action 后进行状态的一个变更
*/
@Component("orderStateListener")
@WithStateMachine(name = "orderStateMachine")
public class OrderStateListener {
@OnTransition(source = "ORDER_WAIT_PAY",target = "ORDER_WAIT_SEND")
public Boolean payToSend(Message<OrderStateChangeAction> message){
Order order = (Order) message.getHeaders().get("order");
order.setOrderState(OrderState.ORDER_WAIT_SEND);
return true;
}
@OnTransition(source = "ORDER_WAIT_SEND",target = "ORDER_WAIT_RECEIVE")
public Boolean sendToReceive(Message<OrderStateChangeAction> message){
Order order = (Order) message.getHeaders().get("order");
order.setOrderState(OrderState.ORDER_WAIT_RECEIVE);
return true;
}
@OnTransition(source = "ORDER_WAIT_RECEIVE",target = "ORDER_FINISH")
public Boolean receiveToFinish(Message<OrderStateChangeAction> message){
Order order = (Order) message.getHeaders().get("order");
order.setOrderState(OrderState.ORDER_FINISH);
return true;
}
}