package com.chinaztt.mes.production.state.operationtask; import com.chinaztt.mes.production.entity.OperationTask; import com.chinaztt.mes.production.state.operationtask.constant.OperationTaskEvents; import com.chinaztt.mes.production.state.operationtask.constant.OperationTaskStates; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.statemachine.StateMachineContext; import org.springframework.statemachine.StateMachinePersist; import org.springframework.statemachine.config.EnableStateMachineFactory; import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter; import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer; import org.springframework.statemachine.config.builders.StateMachineStateConfigurer; import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer; import org.springframework.statemachine.persist.DefaultStateMachinePersister; import org.springframework.statemachine.persist.StateMachinePersister; import org.springframework.statemachine.support.DefaultStateMachineContext; import java.util.EnumSet; /** * @Author: zhangxy * @Date: 2020-08-24 17:21 */ @Configuration @EnableStateMachineFactory(name = "operationTaskStateMachineFactory") public class OperationTaskStateMachineConfig extends EnumStateMachineConfigurerAdapter { public final static String MACHINE_ID = "operationTaskStateMachine"; @Override public void configure(StateMachineStateConfigurer states) throws Exception { states.withStates() .initial(OperationTaskStates.PENDING) .states(EnumSet.allOf(OperationTaskStates.class)); } @Override public void configure(StateMachineTransitionConfigurer transitions) throws Exception { transitions .withExternal() .source(OperationTaskStates.PENDING).target(OperationTaskStates.INPROGRESS) .event(OperationTaskEvents.START) .and() .withExternal() .source(OperationTaskStates.INTERRUPTED).target(OperationTaskStates.INPROGRESS) .event(OperationTaskEvents.START) .and() .withExternal() .source(OperationTaskStates.INPROGRESS).target(OperationTaskStates.INTERRUPTED) .event(OperationTaskEvents.INTERRUPT) .and() .withExternal() .source(OperationTaskStates.INPROGRESS).target(OperationTaskStates.COMPLETED) .event(OperationTaskEvents.COMPLETE) .and() .withExternal() .source(OperationTaskStates.PENDING).target(OperationTaskStates.CANCELED) .event(OperationTaskEvents.CANCEL) .and() .withExternal() .source(OperationTaskStates.INTERRUPTED).target(OperationTaskStates.CANCELED) .event(OperationTaskEvents.CANCEL) .and() .withExternal() .source(OperationTaskStates.INPROGRESS).target(OperationTaskStates.CANCELED) .event(OperationTaskEvents.CANCEL) .and() .withExternal() .source(OperationTaskStates.COMPLETED).target(OperationTaskStates.INPROGRESS) .event(OperationTaskEvents.START); } @Override public void configure(StateMachineConfigurationConfigurer config) throws Exception { config.withConfiguration().machineId(MACHINE_ID); } /** * 持久化配置 * * @return */ @Bean(name = "operationTaskPersister") public StateMachinePersister persister() { return new DefaultStateMachinePersister<>(new StateMachinePersist() { @Override public void write(StateMachineContext stateMachineContext, OperationTask operationTask) throws Exception { } @Override public StateMachineContext read(OperationTask operationTask) throws Exception { StateMachineContext result = new DefaultStateMachineContext(OperationTaskStates.getEnum(operationTask.getState()), null, null, null, null, MACHINE_ID); return result; } }); } }