Используя Spring Statemachine, у нас возникают трудности с изменением некоторых статусов
Используя Spring Statemachine, я столкнулся с проблемой при изменении статуса: PENDING — это начальный статус, и у нас есть проблема при переходе из состояния ARRIVED -> IN_PROGRESS и В IN_PROGRESS -> COMPLETED.
Он изменяется с ARRIVED на IN_PROGRESS только тогда, когда он меняется с PENDING на IN_PROGRESS. Можем поменять с IN_PROGRESS на COMPLETED, только если изменится с PENDING на COMPLETED.
/**
* allow only the following transitions:
*
* PENDING -> WAITING or ARRIVED or NO_SHOW or USER_CANCELLED or TEAM_CANCELLED
* WAITING -> ARRIVED or NO_SHOW
* ARRIVED -> IN_PROGRESS or USER_CANCELLED or TEAM_CANCELLED
* IN_PROGRESS -> COMPLETED or USER_CANCELLED or TEAM_CANCELLED
* COMPLETED -> no transition
* USER_CANCELLED -> no transition
* TEAM_CANCELLED -> no transition
* NO_SHOW -> no transition
*/
возможно конфигурация не правильно написана, может кто-нибудь помочь?
@Override
public void configure(final StateMachineStateConfigurer<Appointment.Status, Appointment.Status> states) throws Exception {
states
.withStates()
.initial(Appointment.Status.PENDING)
.states(EnumSet.allOf(Appointment.Status.class))
.end(Appointment.Status.COMPLETED)
.end(Appointment.Status.USER_CANCELLED)
.end(Appointment.Status.TEAM_CANCELLED)
.end(Appointment.Status.NO_SHOW);
}
@Override
public void configure(final StateMachineTransitionConfigurer<Appointment.Status, Appointment.Status> transitions) throws Exception {
transitions
.withExternal()
.source(Appointment.Status.PENDING)
.target(Appointment.Status.WAITING)
.event(Appointment.Status.WAITING)
.and()
.withExternal()
.source(Appointment.Status.PENDING)
.target(Appointment.Status.ARRIVED)
.event(Appointment.Status.ARRIVED)
.and()
.withExternal()
.source(Appointment.Status.PENDING)
.target(Appointment.Status.NO_SHOW)
.event(Appointment.Status.NO_SHOW)
.and()
.withExternal()
.source(Appointment.Status.PENDING)
.target(Appointment.Status.USER_CANCELLED)
.event(Appointment.Status.USER_CANCELLED)
.and()
.withExternal()
.source(Appointment.Status.PENDING)
.target(Appointment.Status.TEAM_CANCELLED)
.event(Appointment.Status.TEAM_CANCELLED)
.and()
.withExternal()
.source(Appointment.Status.WAITING)
.target(Appointment.Status.ARRIVED)
.event(Appointment.Status.ARRIVED)
.and()
.withExternal()
.source(Appointment.Status.WAITING)
.target(Appointment.Status.NO_SHOW)
.event(Appointment.Status.NO_SHOW)
.and()
.withExternal()
.source(Appointment.Status.ARRIVED)
.target(Appointment.Status.IN_PROGRESS)
.event(Appointment.Status.IN_PROGRESS)
.and()
.withExternal()
.source(Appointment.Status.ARRIVED)
.target(Appointment.Status.USER_CANCELLED)
.event(Appointment.Status.USER_CANCELLED)
.and()
.withExternal()
.source(Appointment.Status.ARRIVED)
.target(Appointment.Status.TEAM_CANCELLED)
.event(Appointment.Status.TEAM_CANCELLED)
.and()
.withExternal()
.source(Appointment.Status.IN_PROGRESS)
.target(Appointment.Status.COMPLETED)
.event(Appointment.Status.COMPLETED)
.and()
.withExternal()
.source(Appointment.Status.IN_PROGRESS)
.target(Appointment.Status.USER_CANCELLED)
.event(Appointment.Status.USER_CANCELLED)
.and()
.withExternal()
.source(Appointment.Status.IN_PROGRESS)
.target(Appointment.Status.TEAM_CANCELLED)
.event(Appointment.Status.TEAM_CANCELLED);
}