From 90d802d370396e518f1d570c6c0a7c9563519a29 Mon Sep 17 00:00:00 2001 From: ialbert Date: Thu, 26 Feb 2026 13:11:29 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-934 --- .../UnitedSessionStateMachineConfig.java | 16 ++--- .../session/state/guard/SdfGuardUtil.java | 11 +--- ...UnitSetGuardAfterPaymentInstructions.java} | 37 +++++------ .../guard/SdfUnitSetGuardAfterRevise.java | 61 +++++++++++++++++++ 4 files changed, 88 insertions(+), 37 deletions(-) rename clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/guard/{SdfUnitSetGuard.java => SdfUnitSetGuardAfterPaymentInstructions.java} (62%) create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/guard/SdfUnitSetGuardAfterRevise.java diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/state_machine_2/specific/UnitedSessionStateMachineConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/state_machine_2/specific/UnitedSessionStateMachineConfig.java index 73a3c29a1..96cbf62ff 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/state_machine_2/specific/UnitedSessionStateMachineConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/state_machine_2/specific/UnitedSessionStateMachineConfig.java @@ -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 transitions) throws Exception { - EnumSet 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 transitions) throws Exception { - EnumSet 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) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/guard/SdfGuardUtil.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/guard/SdfGuardUtil.java index de44c466f..ff9894716 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/guard/SdfGuardUtil.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/guard/SdfGuardUtil.java @@ -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 bySectionAfter7StepUnit() { - return EnumSet.of( - SsnEvent.SDF_04, - SsnEvent.SDF_57, - SsnEvent.SDF_13, - SsnEvent.SDF_21 - ); - } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/guard/SdfUnitSetGuard.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/guard/SdfUnitSetGuardAfterPaymentInstructions.java similarity index 62% rename from clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/guard/SdfUnitSetGuard.java rename to clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/guard/SdfUnitSetGuardAfterPaymentInstructions.java index 6337e8100..75add82fa 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/guard/SdfUnitSetGuard.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/guard/SdfUnitSetGuardAfterPaymentInstructions.java @@ -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 { +public class SdfUnitSetGuardAfterPaymentInstructions implements Guard { private final Logger log = LoggerFactory.getLogger(getClass()); - private final EnumSet sdfs; + private final static EnumSet 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 sdfsSmallSet = EnumSet.of( + SsnEvent.SDF_04, + SsnEvent.SDF_57 + ); - public SdfUnitSetGuard(EnumSet sdfs) { - this.sdfs = sdfs; + public static EnumSet supportedSdfs() { + return EnumSet.copyOf(sdfsFullSet); } @Override public boolean evaluate(StateContext ctx) { ExtendedState state = ctx.getExtendedState(); @SuppressWarnings("unchecked") - Collection sdfTables = ctx.getExtendedState().get(DataEnum.sdfTables, Collection.class); + Collection sdfTables = state.get(DataEnum.sdfTables, Collection.class); Function was = sdf -> state.get(sdf.name(), Object.class) != null; - boolean everySdfConditionMet; + EnumSet 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: {}", diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/guard/SdfUnitSetGuardAfterRevise.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/guard/SdfUnitSetGuardAfterRevise.java new file mode 100644 index 000000000..9c119fc11 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/guard/SdfUnitSetGuardAfterRevise.java @@ -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 { + private final Logger log = LoggerFactory.getLogger(getClass()); + private static final EnumSet sdfsFullSet = EnumSet.of( + SsnEvent.SDF_21, + SsnEvent.SDF_57 + ); + + private static final EnumSet sdfsSmallSet = EnumSet.of( + SsnEvent.SDF_57 + ); + + public static EnumSet supportedSdfs() { + return EnumSet.copyOf(sdfsFullSet); + } + + @Override + public boolean evaluate(StateContext ctx) { + ExtendedState state = ctx.getExtendedState(); + @SuppressWarnings("unchecked") + Collection sdfTables = state.get(DataEnum.sdfTables, Collection.class); + Function was = sdf -> state.get(sdf.name(), Object.class) != null; + + EnumSet 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; + } + } +}