Используя 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);
    }

Ответы (0 шт):