diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/SsnEvent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/SsnEvent.java index 43e225126..93378a83e 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/SsnEvent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/SsnEvent.java @@ -7,6 +7,7 @@ public enum SsnEvent { SDF_13, SDF_08, SDF_21, + ALL_SDF_RECEIVED, PAUSE, CONTINUE, REPEAT diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/SdfReceivedActionV2.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/SdfReceivedActionV2.java new file mode 100644 index 000000000..8142cea3e --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/SdfReceivedActionV2.java @@ -0,0 +1,46 @@ +package ru.spcex.clearing.session.state.action; + +import java.util.EnumSet; +import java.util.function.Function; +import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.statemachine.ExtendedState; +import org.springframework.statemachine.StateContext; +import org.springframework.statemachine.action.Action; +import ru.spcex.clearing.session.state.SsnEvent; + +public class SdfReceivedActionV2 implements Action { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final EnumSet sdfs; + + public SdfReceivedActionV2(EnumSet sdfs) { + this.sdfs = sdfs; + } + + @Override + public void execute(StateContext ctx) { + ExtendedState state = ctx.getExtendedState(); + + log.info("event {} flag saving received", ctx.getEvent().name()); + state.getVariables().put(ctx.getEvent().name(), true); + + Function was = sdf -> state.get(sdf.name(), Object.class) != null; + + boolean everySdfConditionMet = sdfs + .stream() + .allMatch(was::apply); + if (everySdfConditionMet) { + log.info("all of {} conditions were met", sdfs); + sdfs.forEach(sdf -> state.getVariables().remove(sdf.name())); + ctx.getStateMachine().sendEvent(SsnEvent.ALL_SDF_RECEIVED); + } else { + log.info("conditions: {}", + sdfs + .stream() + .map(sdf -> "%s: %s".formatted(sdf.name(), was.apply(sdf) ? "received" : "waiting")) + .collect(Collectors.joining(";", "[", "]")) + ); + } + } +}