ProcessInstanceStateMachineConfig.java 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package com.qqflow.engine.domain.flow.statemachine;
  2. import com.qqflow.engine.domain.flow.enums.ProcessEvent;
  3. import com.qqflow.engine.domain.flow.enums.ProcessStatus;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.statemachine.config.EnableStateMachineFactory;
  6. import org.springframework.statemachine.config.StateMachineConfigurerAdapter;
  7. import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
  8. import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;
  9. import java.util.EnumSet;
  10. @Configuration
  11. @EnableStateMachineFactory
  12. public class ProcessInstanceStateMachineConfig extends StateMachineConfigurerAdapter<ProcessStatus, ProcessEvent> {
  13. @Override
  14. public void configure(StateMachineStateConfigurer<ProcessStatus, ProcessEvent> states) throws Exception {
  15. states.withStates()
  16. .initial(ProcessStatus.PENDING_RECEIVE)
  17. .states(EnumSet.allOf(ProcessStatus.class));
  18. }
  19. @Override
  20. public void configure(StateMachineTransitionConfigurer<ProcessStatus, ProcessEvent> transitions) throws Exception {
  21. this.configureActiveTransitions(transitions);
  22. this.configureTerminalTransitions(transitions);
  23. }
  24. private void configureActiveTransitions(StateMachineTransitionConfigurer<ProcessStatus, ProcessEvent> transitions) throws Exception {
  25. transitions
  26. .withExternal()
  27. .source(ProcessStatus.PENDING_RECEIVE).target(ProcessStatus.PENDING).event(ProcessEvent.RECEIVE)
  28. .and()
  29. .withExternal()
  30. .source(ProcessStatus.PENDING).target(ProcessStatus.APPROVED).event(ProcessEvent.APPROVE)
  31. .and()
  32. .withExternal()
  33. .source(ProcessStatus.PENDING).target(ProcessStatus.REJECTED).event(ProcessEvent.REJECT)
  34. .and()
  35. .withExternal()
  36. .source(ProcessStatus.PENDING).target(ProcessStatus.RETURNED).event(ProcessEvent.RETURN)
  37. .and()
  38. .withExternal()
  39. .source(ProcessStatus.RETURNED).target(ProcessStatus.PENDING).event(ProcessEvent.RECEIVE);
  40. }
  41. private void configureTerminalTransitions(StateMachineTransitionConfigurer<ProcessStatus, ProcessEvent> transitions) throws Exception {
  42. transitions
  43. .withExternal()
  44. .source(ProcessStatus.APPROVED).target(ProcessStatus.COMPLETED).event(ProcessEvent.COMPLETE)
  45. .and()
  46. .withExternal()
  47. .source(ProcessStatus.PENDING_RECEIVE).target(ProcessStatus.REVOKED).event(ProcessEvent.REVOKE)
  48. .and()
  49. .withExternal()
  50. .source(ProcessStatus.PENDING).target(ProcessStatus.REVOKED).event(ProcessEvent.REVOKE)
  51. .and()
  52. .withExternal()
  53. .source(ProcessStatus.RETURNED).target(ProcessStatus.REVOKED).event(ProcessEvent.REVOKE)
  54. .and()
  55. .withExternal()
  56. .source(ProcessStatus.PENDING_RECEIVE).target(ProcessStatus.TERMINATED).event(ProcessEvent.TERMINATE)
  57. .and()
  58. .withExternal()
  59. .source(ProcessStatus.PENDING).target(ProcessStatus.TERMINATED).event(ProcessEvent.TERMINATE);
  60. }
  61. }