This commit is contained in:
parent
02869b9ddd
commit
90d802d370
4 changed files with 88 additions and 37 deletions
|
|
@ -1,7 +1,6 @@
|
|||
package ru.spcex.clearing.config.state_machine_2.specific;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumSet;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.function.Supplier;
|
||||
|
|
@ -41,9 +40,8 @@ import ru.spcex.clearing.session.state.action.UpdateWorkflowStatusAction;
|
|||
import ru.spcex.clearing.session.state.guard.ErroneousRegistriesPresentGuard;
|
||||
import ru.spcex.clearing.session.state.guard.PaymentsWereCreatedGuard;
|
||||
import ru.spcex.clearing.session.state.guard.PaymentsWereNotCreatedGuard;
|
||||
import ru.spcex.clearing.session.state.guard.SdfGuardUtil;
|
||||
import ru.spcex.clearing.session.state.guard.SdfSetGuard;
|
||||
import ru.spcex.clearing.session.state.guard.SdfUnitSetGuard;
|
||||
import ru.spcex.clearing.session.state.guard.SdfUnitSetGuardAfterPaymentInstructions;
|
||||
import ru.spcex.clearing.session.state.guard.SdfUnitSetGuardAfterRevise;
|
||||
import ru.spcex.clearing.session.state.guard.StashedRegistriesPresentGuard;
|
||||
import ru.spcex.clearing.session.state.listener.MachineMonitoringListener;
|
||||
import static ru.spcex.clearing.util.StateMachineUtil.*;
|
||||
|
|
@ -215,14 +213,13 @@ public class UnitedSessionStateMachineConfig
|
|||
}
|
||||
|
||||
private void sourcePseudoWaitAfterAgainRevise(StateMachineTransitionConfigurer<TaskType, SsnEvent> transitions) throws Exception {
|
||||
EnumSet<SsnEvent> ssnEvents = SdfGuardUtil.afterAgainReviseError(SECTION);
|
||||
transitions
|
||||
.withExternal()
|
||||
.source(TaskType.PSEUDO_waitSdfAfterAgainRevise)
|
||||
.target(TaskType.AgainRevise)
|
||||
.guard(new SdfSetGuard(ssnEvents))
|
||||
.guard(new SdfUnitSetGuardAfterRevise())
|
||||
.action(againRevise);
|
||||
for (var event : ssnEvents) {
|
||||
for (var event : SdfUnitSetGuardAfterRevise.supportedSdfs()) {
|
||||
transitions
|
||||
.withInternal()
|
||||
.source(TaskType.PSEUDO_waitSdfAfterAgainRevise)
|
||||
|
|
@ -325,14 +322,13 @@ public class UnitedSessionStateMachineConfig
|
|||
}
|
||||
|
||||
private void sourcePseudoWaitSdfAfterPaymentInstructions(StateMachineTransitionConfigurer<TaskType, SsnEvent> transitions) throws Exception {
|
||||
EnumSet<SsnEvent> sdfs = SdfGuardUtil.bySectionAfter7StepUnit();
|
||||
transitions
|
||||
.withExternal()
|
||||
.source(TaskType.PSEUDO_waitSdfAfterPaymentInstructions)
|
||||
.target(TaskType.AgainRevise)
|
||||
.guard(new SdfUnitSetGuard(sdfs))
|
||||
.guard(new SdfUnitSetGuardAfterPaymentInstructions())
|
||||
.action(againRevise);
|
||||
for (var event: sdfs) {
|
||||
for (var event: SdfUnitSetGuardAfterPaymentInstructions.supportedSdfs()) {
|
||||
transitions
|
||||
.withInternal()
|
||||
.source(TaskType.PSEUDO_waitSdfAfterPaymentInstructions)
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ public class SdfGuardUtil {
|
|||
SsnEvent.SDF_57
|
||||
);
|
||||
}
|
||||
case FOND, MULT -> {
|
||||
case FOND -> {
|
||||
return EnumSet.of(
|
||||
SsnEvent.SDF_21,
|
||||
SsnEvent.SDF_57
|
||||
|
|
@ -42,13 +42,4 @@ public class SdfGuardUtil {
|
|||
default -> throw new IllegalStateException("unknown wait conditions for section " + section);
|
||||
}
|
||||
}
|
||||
|
||||
public static EnumSet<SsnEvent> bySectionAfter7StepUnit() {
|
||||
return EnumSet.of(
|
||||
SsnEvent.SDF_04,
|
||||
SsnEvent.SDF_57,
|
||||
SsnEvent.SDF_13,
|
||||
SsnEvent.SDF_21
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ import java.util.Collection;
|
|||
import java.util.EnumSet;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.statemachine.ExtendedState;
|
||||
|
|
@ -15,38 +14,42 @@ import ru.spcex.clearing.session.state.DataEnum;
|
|||
import ru.spcex.clearing.session.state.SsnEvent;
|
||||
import ru.spcex.platform.enumeration.SdfTable;
|
||||
|
||||
public class SdfUnitSetGuard implements Guard<TaskType, SsnEvent> {
|
||||
public class SdfUnitSetGuardAfterPaymentInstructions implements Guard<TaskType, SsnEvent> {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
private final EnumSet<SsnEvent> sdfs;
|
||||
private final static EnumSet<SsnEvent> sdfsFullSet = EnumSet.of(
|
||||
SsnEvent.SDF_04,
|
||||
SsnEvent.SDF_57,
|
||||
SsnEvent.SDF_13,
|
||||
SsnEvent.SDF_21
|
||||
);
|
||||
|
||||
public SdfUnitSetGuard(SsnEvent first, SsnEvent... rest) {
|
||||
this.sdfs = EnumSet.of(first, rest);
|
||||
}
|
||||
private final static EnumSet<SsnEvent> sdfsSmallSet = EnumSet.of(
|
||||
SsnEvent.SDF_04,
|
||||
SsnEvent.SDF_57
|
||||
);
|
||||
|
||||
public SdfUnitSetGuard(EnumSet<SsnEvent> sdfs) {
|
||||
this.sdfs = sdfs;
|
||||
public static EnumSet<SsnEvent> supportedSdfs() {
|
||||
return EnumSet.copyOf(sdfsFullSet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean evaluate(StateContext<TaskType, SsnEvent> ctx) {
|
||||
ExtendedState state = ctx.getExtendedState();
|
||||
@SuppressWarnings("unchecked")
|
||||
Collection<SdfTable> sdfTables = ctx.getExtendedState().get(DataEnum.sdfTables, Collection.class);
|
||||
Collection<SdfTable> sdfTables = state.get(DataEnum.sdfTables, Collection.class);
|
||||
Function<SsnEvent, Boolean> was = sdf -> state.get(sdf.name(), Object.class) != null;
|
||||
|
||||
boolean everySdfConditionMet;
|
||||
EnumSet<SsnEvent> sdfs;
|
||||
if (sdfTables.contains(SdfTable.SDF_12)) {
|
||||
everySdfConditionMet = sdfs
|
||||
.stream()
|
||||
.allMatch(was::apply);
|
||||
sdfs = sdfsFullSet;
|
||||
} else {
|
||||
everySdfConditionMet = Stream.of(SsnEvent.SDF_04, SsnEvent.SDF_57)
|
||||
.allMatch(was::apply);
|
||||
sdfs = sdfsSmallSet;
|
||||
}
|
||||
|
||||
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()));
|
||||
sdfTables.forEach(sdfTable -> ctx.getExtendedState().getVariables().remove(sdfTable));
|
||||
sdfsFullSet.forEach(sdf -> state.getVariables().remove(sdf.name()));
|
||||
return true;
|
||||
} else {
|
||||
log.info("conditions: {}",
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
package ru.spcex.clearing.session.state.guard;
|
||||
|
||||
import java.util.Collection;
|
||||
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.guard.Guard;
|
||||
import ru.spcex.clearing.session.stage.TaskType;
|
||||
import ru.spcex.clearing.session.state.DataEnum;
|
||||
import ru.spcex.clearing.session.state.SsnEvent;
|
||||
import ru.spcex.platform.enumeration.SdfTable;
|
||||
|
||||
public class SdfUnitSetGuardAfterRevise implements Guard<TaskType, SsnEvent> {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
private static final EnumSet<SsnEvent> sdfsFullSet = EnumSet.of(
|
||||
SsnEvent.SDF_21,
|
||||
SsnEvent.SDF_57
|
||||
);
|
||||
|
||||
private static final EnumSet<SsnEvent> sdfsSmallSet = EnumSet.of(
|
||||
SsnEvent.SDF_57
|
||||
);
|
||||
|
||||
public static EnumSet<SsnEvent> supportedSdfs() {
|
||||
return EnumSet.copyOf(sdfsFullSet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean evaluate(StateContext<TaskType, SsnEvent> ctx) {
|
||||
ExtendedState state = ctx.getExtendedState();
|
||||
@SuppressWarnings("unchecked")
|
||||
Collection<SdfTable> sdfTables = state.get(DataEnum.sdfTables, Collection.class);
|
||||
Function<SsnEvent, Boolean> was = sdf -> state.get(sdf.name(), Object.class) != null;
|
||||
|
||||
EnumSet<SsnEvent> sdfs;
|
||||
if (sdfTables.contains(SdfTable.SDF_12)) {
|
||||
sdfs = sdfsFullSet;
|
||||
} else {
|
||||
sdfs = sdfsSmallSet;
|
||||
}
|
||||
|
||||
boolean everySdfConditionMet = sdfs.stream().allMatch(was::apply);
|
||||
if (everySdfConditionMet) {
|
||||
log.info("all of {} conditions were met", sdfs);
|
||||
sdfsFullSet.forEach(sdf -> state.getVariables().remove(sdf.name()));
|
||||
return true;
|
||||
} else {
|
||||
log.info("conditions: {}",
|
||||
sdfs
|
||||
.stream()
|
||||
.map(sdf -> "%s: %s".formatted(sdf.name(), was.apply(sdf) ? "received" : "waiting"))
|
||||
.collect(Collectors.joining(";", "[", "]"))
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue