From bb70598d0a5723777ede4e177616f69446dfbc5f Mon Sep 17 00:00:00 2001 From: ialbert Date: Fri, 30 May 2025 19:24:17 +0300 Subject: [PATCH] state machine bugfix --- .../config/state_machine_1/StateBnConfig.java | 433 ++++++++---------- .../state/action/CreateSessionAction.java | 8 +- 2 files changed, 201 insertions(+), 240 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/state_machine_1/StateBnConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/state_machine_1/StateBnConfig.java index 1307c3e53..f1723516f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/state_machine_1/StateBnConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/state_machine_1/StateBnConfig.java @@ -1,245 +1,206 @@ package ru.spcex.clearing.config.state_machine_1; -import java.time.LocalDate; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter; -import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer; -import org.springframework.statemachine.config.builders.StateMachineStateConfigurer; -import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer; -import org.springframework.statemachine.listener.StateMachineListenerAdapter; -import org.springframework.statemachine.state.State; -import ru.clearing.classes.statics.data.execution.ExecutionFond; -import ru.clearing.classes.statics.data.misc.Session; -import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.session.stage.TaskType; -import ru.spcex.clearing.session.stage.impl.BalanceRevise; -import ru.spcex.clearing.session.stage.impl.DealsPrepare; -import ru.spcex.clearing.session.stage.impl.EndStageNotification; -import ru.spcex.clearing.session.stage.impl.FinishingSession; -import ru.spcex.clearing.session.stage.impl.FormingPaymentInstruction; -import ru.spcex.clearing.session.stage.impl.FormingRegistersOnOS; -import ru.spcex.clearing.session.stage.impl.InclusionObligations; -import ru.spcex.clearing.session.stage.impl.InspectionObligations; -import ru.spcex.clearing.session.stage.impl.ObligationAdmission; -import ru.spcex.clearing.session.stage.impl.RequirementsAndObligationCreation; -import ru.spcex.clearing.session.stage.impl.UnlockResources; -import ru.spcex.clearing.session.stage.task.DealsPreparePayload; -import ru.spcex.clearing.session.stage.task.FormingPaymentInstructionPayload; -import ru.spcex.clearing.session.stage.task.InclusionToPoolPayload; -import ru.spcex.clearing.session.stage.task.InspectionPoolPayload; -import ru.spcex.platform.classes.base.interfaces.ExecutionType; -import ru.spcex.platform.enumeration.Section; -import ru.spcex.platform.enumeration.SessionStatus; -import ru.spcex.platform.enumeration.SessionType; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; //@Configuration("sessionStateMachineFactory") //@EnableStateMachineFactory(name = "PrimaryBnSessionStateMachineFactory") public class StateBnConfig extends EnumStateMachineConfigurerAdapter { - private Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg sessionImdg; - /** - * адаптеры между ISessionStage старого образца к Spring State Machine - */ - private final StateActionAdapter balanceReviseAction; - private final StateActionAdapter dealPrepareAction; - private final StateActionAdapter requirementsAndObligationCreationAction; - private final StateActionAdapter obligationAdmissionAction; - private final StateActionAdapter inclusionToPoolAction; - private final StateActionAdapter inspectionObligationsAction; - private final StateActionAdapter formingRegistersOnOSAction; - private final StateActionAdapter formingPaymentInstructionAction; - - public StateBnConfig(ImdgProvider imdgProvider, - BalanceRevise balanceRevise, - DealsPrepare dealsPrepare, - RequirementsAndObligationCreation requirementsAndObligationCreation, - ObligationAdmission obligationsAdmission, - InclusionObligations inclusionObligations, - InspectionObligations inspectionObligations, - FormingRegistersOnOS formingRegistersOnOS, - FormingPaymentInstruction formingPaymentInstruction, - UnlockResources unlockResources, - FinishingSession finishingSession, - EndStageNotification endStageNotification, - @Qualifier("marketCodesForBn") Supplier> marketCodes) { - - Imdg executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class); - this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - - //настройка стадий - dealsPrepare.searchForExecutions(ExecutionType.ExecutionFond); - ImdgPredicateBuilder execFondPb = executionFondImdg.predicateBuilder(); - dealsPrepare.addExecutionFondCondition(execFondPb.regex("settlementCode", "^B\\d{2}$")); - dealsPrepare.addExecutionFondCondition(execFondPb.in("market", marketCodes.get().toArray(new String[0]))); - inclusionObligations.setSessionType(SessionType.IPOB); - imdgProvider.waitAvailable(); - - //настройка адаптеров для State Machine - balanceReviseAction = new StateActionAdapter(balanceRevise); - - dealPrepareAction = new StateActionAdapter(dealsPrepare); - dealPrepareAction.setPayloadForStageGetter((extendedState) -> { - DealsPreparePayload payload = new DealsPreparePayload(); - payload.setSessionId(extendedState.get(StageDataEnum.sessionId.name(), Long.class)); - return payload; - }); - dealPrepareAction.setSaveName(StageDataEnum.ExecutionList); - - requirementsAndObligationCreationAction = new StateActionAdapter(requirementsAndObligationCreation); - requirementsAndObligationCreationAction.setPayloadForStageGetter((extendedState) - -> extendedState.get(StageDataEnum.ExecutionList.name(), List.class)); - - obligationAdmissionAction = new StateActionAdapter(obligationsAdmission); - obligationAdmissionAction.setPayloadForStageGetter((extendedState) -> extendedState.get(StageDataEnum.sessionId.name(), Long.class)); - - inclusionToPoolAction = new StateActionAdapter(inclusionObligations); - inclusionToPoolAction.setPayloadForStageGetter((extendedState) -> { - InclusionToPoolPayload payload = new InclusionToPoolPayload(); - Session session = extendedState.get(StageDataEnum.session.name(), Session.class); - Long sessionId = extendedState.get(StageDataEnum.sessionId.name(), Long.class); - payload.setSessionType(session.getSessionType()); - payload.setSessionId(sessionId); - return payload; - }); - - inspectionObligationsAction = new StateActionAdapter(inspectionObligations); - inspectionObligationsAction.setPayloadForStageGetter((extendedState) -> { - InspectionPoolPayload payload = new InspectionPoolPayload(); - Session session = extendedState.get(StageDataEnum.session.name(), Session.class); - payload.setProcessedCompanyId(session.getCompanyId()); - return payload; - }); - - formingRegistersOnOSAction = new StateActionAdapter(formingRegistersOnOS); - - formingPaymentInstructionAction = new StateActionAdapter(formingPaymentInstruction); - formingPaymentInstructionAction.setPayloadForStageGetter((extendedState) -> { - FormingPaymentInstructionPayload payload = new FormingPaymentInstructionPayload(); - payload.setSessionId(extendedState.get(StageDataEnum.sessionId.name(), Long.class)); - return payload; - }); - formingPaymentInstructionAction.setSaveName(StageDataEnum.PaymentInstructions); - // if (paymentResult != null && paymentResult.getStageResult().isEmpty()) { - // runStage(TaskType.FormingPaymentInstruction, balanceRevise); - //// finishPart(req); - // } - } - - - @Override - public void configure(StateMachineStateConfigurer states) throws Exception { - states - .withStates() - .initial(TaskType.StartRevise, context -> { - Session existActiveSession = sessionImdg.getFirstObjectByFieldValues(Map.of("workflowStatus", SessionStatus.ACTV.getKey())); - if (existActiveSession != null) { - throw new RuntimeException("ActiveSessionIsPresent " + existActiveSession); - } - Session newSession = new Session(); - newSession.setSection(Section.FOND.getKey()); - newSession.setSessionType(SessionType.IPOB.getKey()); - newSession.setSessionStatus(TaskType.StartRevise.getKey()); - newSession.setWorkflowStatus(SessionStatus.ACTV.getKey()); - newSession.setClearingDate(LocalDate.now()); - sessionImdg.insert(newSession); - log.info("started new session.id={}", newSession.getId()); - context.getExtendedState().getVariables().put(StageDataEnum.sessionId.name(), newSession.getId()); - context.getExtendedState().getVariables().put(StageDataEnum.session.name(), newSession); - }) - .states(new HashSet<>(Arrays.asList(TaskType.StartRevise, - TaskType.ContinueRevise, - TaskType.StartRevisePart1, - TaskType.DealsPrepare, - TaskType.RequirementsAndObligationsCreate, - TaskType.ObligationsAdmission, - TaskType.InclusionToPool, - TaskType.InspectionObligations, - TaskType.FormingRegistersOnOS, - TaskType.FormingPaymentInstruction, -// TaskType.UnlockResources, - TaskType.AgainRevise -// TaskType.FinishingSession, -// TaskType.EndStageNotification - ))) - .end(TaskType.FormingPaymentInstruction) - ; - } - - - @Override - public void configure(StateMachineTransitionConfigurer transitions) throws Exception { - transitions.withExternal() - .event(SessionEvent.Revise) - .source(TaskType.StartRevise).target(TaskType.ContinueRevise) - .action(balanceReviseAction) - .and() - .withExternal() - .event(SessionEvent.SdfReceived) - .source(TaskType.ContinueRevise).target(TaskType.StartRevisePart1) - .action(context -> { - log.info("SDF57 and SDF01 received, continue session"); - }) - .and() - .withExternal() - .event(SessionEvent.Revise) - .source(TaskType.StartRevisePart1).target(TaskType.DealsPrepare) - .action(balanceReviseAction) - .and() - .withExternal() - .source(TaskType.DealsPrepare).target(TaskType.RequirementsAndObligationsCreate) - .action(dealPrepareAction) - .and() - .withExternal() - .source(TaskType.RequirementsAndObligationsCreate).target(TaskType.ObligationsAdmission) - .action(requirementsAndObligationCreationAction) - .and() - .withExternal() - .source(TaskType.ObligationsAdmission).target(TaskType.InclusionToPool) - .action(obligationAdmissionAction) - .and() - .withExternal() - .source(TaskType.InclusionToPool).target(TaskType.InspectionObligations) - .action(inclusionToPoolAction) - .and() - .withExternal() - .source(TaskType.InspectionObligations).target(TaskType.FormingRegistersOnOS) - .action(inspectionObligationsAction) - .and() - .withExternal() - .source(TaskType.FormingRegistersOnOS).target(TaskType.FormingPaymentInstruction) - .action(formingRegistersOnOSAction) - .and() - .withExternal() - .source(TaskType.FormingPaymentInstruction).target(TaskType.AgainRevise) - .action(formingPaymentInstructionAction) - .and() - .withExternal() - .event(SessionEvent.Revise) - .source(TaskType.AgainRevise).target(TaskType.AgainRevise) - .action(balanceReviseAction); - - } - - @Override - public void configure(StateMachineConfigurationConfigurer config) throws Exception { - StateMachineListenerAdapter loggingChangeStateListener = new StateMachineListenerAdapter<>() { - @Override - public void stateEntered(State state) { - TaskType enteredState = state != null ? state.getId() : null; - log.info(String.format("State entered: %s", enteredState)); - } - }; - config.withConfiguration().listener(loggingChangeStateListener); - } +// private Logger log = LoggerFactory.getLogger(getClass()); +// +// private final Imdg sessionImdg; +// /** +// * адаптеры между ISessionStage старого образца к Spring State Machine +// */ +// private final StateActionAdapter balanceReviseAction; +// private final StateActionAdapter dealPrepareAction; +// private final StateActionAdapter requirementsAndObligationCreationAction; +// private final StateActionAdapter obligationAdmissionAction; +// private final StateActionAdapter inclusionToPoolAction; +// private final StateActionAdapter inspectionObligationsAction; +// private final StateActionAdapter formingRegistersOnOSAction; +// private final StateActionAdapter formingPaymentInstructionAction; +// +// public StateBnConfig(ImdgProvider imdgProvider, +// BalanceRevise balanceRevise, +// DealsPrepare dealsPrepare, +// RequirementsAndObligationCreation requirementsAndObligationCreation, +// ObligationAdmission obligationsAdmission, +// InclusionObligations inclusionObligations, +// InspectionObligations inspectionObligations, +// FormingRegistersOnOS formingRegistersOnOS, +// FormingPaymentInstruction formingPaymentInstruction, +// UnlockResources unlockResources, +// FinishingSession finishingSession, +// EndStageNotification endStageNotification, +// @Qualifier("marketCodesForBn") Supplier> marketCodes) { +// +// Imdg executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class); +// this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); +// +// //настройка стадий +// dealsPrepare.searchForExecutions(ExecutionType.ExecutionFond); +// ImdgPredicateBuilder execFondPb = executionFondImdg.predicateBuilder(); +// dealsPrepare.addExecutionFondCondition(execFondPb.regex("settlementCode", "^B\\d{2}$")); +// dealsPrepare.addExecutionFondCondition(execFondPb.in("market", marketCodes.get().toArray(new String[0]))); +// inclusionObligations.setSessionType(SessionType.IPOB); +// imdgProvider.waitAvailable(); +// +// //настройка адаптеров для State Machine +// balanceReviseAction = new StateActionAdapter(balanceRevise); +// +// dealPrepareAction = new StateActionAdapter(dealsPrepare); +// dealPrepareAction.setPayloadForStageGetter((extendedState) -> { +// DealsPreparePayload payload = new DealsPreparePayload(); +// payload.setSessionId(extendedState.get(StageDataEnum.sessionId.name(), Long.class)); +// return payload; +// }); +// dealPrepareAction.setSaveName(StageDataEnum.ExecutionList); +// +// requirementsAndObligationCreationAction = new StateActionAdapter(requirementsAndObligationCreation); +// requirementsAndObligationCreationAction.setPayloadForStageGetter((extendedState) +// -> extendedState.get(StageDataEnum.ExecutionList.name(), List.class)); +// +// obligationAdmissionAction = new StateActionAdapter(obligationsAdmission); +// obligationAdmissionAction.setPayloadForStageGetter((extendedState) -> extendedState.get(StageDataEnum.sessionId.name(), Long.class)); +// +// inclusionToPoolAction = new StateActionAdapter(inclusionObligations); +// inclusionToPoolAction.setPayloadForStageGetter((extendedState) -> { +// InclusionToPoolPayload payload = new InclusionToPoolPayload(); +// Session session = extendedState.get(StageDataEnum.session.name(), Session.class); +// Long sessionId = extendedState.get(StageDataEnum.sessionId.name(), Long.class); +// payload.setSessionType(session.getSessionType()); +// payload.setSessionId(sessionId); +// return payload; +// }); +// +// inspectionObligationsAction = new StateActionAdapter(inspectionObligations); +// inspectionObligationsAction.setPayloadForStageGetter((extendedState) -> { +// InspectionPoolPayload payload = new InspectionPoolPayload(); +// Session session = extendedState.get(StageDataEnum.session.name(), Session.class); +// payload.setProcessedCompanyId(session.getCompanyId()); +// return payload; +// }); +// +// formingRegistersOnOSAction = new StateActionAdapter(formingRegistersOnOS); +// +// formingPaymentInstructionAction = new StateActionAdapter(formingPaymentInstruction); +// formingPaymentInstructionAction.setPayloadForStageGetter((extendedState) -> { +// FormingPaymentInstructionPayload payload = new FormingPaymentInstructionPayload(); +// payload.setSessionId(extendedState.get(StageDataEnum.sessionId.name(), Long.class)); +// return payload; +// }); +// formingPaymentInstructionAction.setSaveName(StageDataEnum.PaymentInstructions); +// // if (paymentResult != null && paymentResult.getStageResult().isEmpty()) { +// // runStage(TaskType.FormingPaymentInstruction, balanceRevise); +// //// finishPart(req); +// // } +// } +// +// +// @Override +// public void configure(StateMachineStateConfigurer states) throws Exception { +// states +// .withStates() +// .initial(TaskType.StartRevise, context -> { +// Session existActiveSession = sessionImdg.getFirstObjectByFieldValues(Map.of("workflowStatus", SessionStatus.ACTV.getKey())); +// if (existActiveSession != null) { +// throw new RuntimeException("ActiveSessionIsPresent " + existActiveSession); +// } +// Session newSession = new Session(); +// newSession.setSection(Section.FOND.getKey()); +// newSession.setSessionType(SessionType.IPOB.getKey()); +// newSession.setSessionStatus(TaskType.StartRevise.getKey()); +// newSession.setWorkflowStatus(SessionStatus.ACTV.getKey()); +// newSession.setClearingDate(LocalDate.now()); +// sessionImdg.insert(newSession); +// log.info("started new session.id={}", newSession.getId()); +// context.getExtendedState().getVariables().put(StageDataEnum.sessionId.name(), newSession.getId()); +// context.getExtendedState().getVariables().put(StageDataEnum.session.name(), newSession); +// }) +// .states(new HashSet<>(Arrays.asList(TaskType.StartRevise, +// TaskType.ContinueRevise, +// TaskType.StartRevisePart1, +// TaskType.DealsPrepare, +// TaskType.RequirementsAndObligationsCreate, +// TaskType.ObligationsAdmission, +// TaskType.InclusionToPool, +// TaskType.InspectionObligations, +// TaskType.FormingRegistersOnOS, +// TaskType.FormingPaymentInstruction, +//// TaskType.UnlockResources, +// TaskType.AgainRevise +//// TaskType.FinishingSession, +//// TaskType.EndStageNotification +// ))) +// .end(TaskType.FormingPaymentInstruction) +// ; +// } +// +// +// @Override +// public void configure(StateMachineTransitionConfigurer transitions) throws Exception { +// transitions.withExternal() +// .event(SessionEvent.Revise) +// .source(TaskType.StartRevise).target(TaskType.ContinueRevise) +// .action(balanceReviseAction) +// .and() +// .withExternal() +// .event(SessionEvent.SdfReceived) +// .source(TaskType.ContinueRevise).target(TaskType.StartRevisePart1) +// .action(context -> { +// log.info("SDF57 and SDF01 received, continue session"); +// }) +// .and() +// .withExternal() +// .event(SessionEvent.Revise) +// .source(TaskType.StartRevisePart1).target(TaskType.DealsPrepare) +// .action(balanceReviseAction) +// .and() +// .withExternal() +// .source(TaskType.DealsPrepare).target(TaskType.RequirementsAndObligationsCreate) +// .action(dealPrepareAction) +// .and() +// .withExternal() +// .source(TaskType.RequirementsAndObligationsCreate).target(TaskType.ObligationsAdmission) +// .action(requirementsAndObligationCreationAction) +// .and() +// .withExternal() +// .source(TaskType.ObligationsAdmission).target(TaskType.InclusionToPool) +// .action(obligationAdmissionAction) +// .and() +// .withExternal() +// .source(TaskType.InclusionToPool).target(TaskType.InspectionObligations) +// .action(inclusionToPoolAction) +// .and() +// .withExternal() +// .source(TaskType.InspectionObligations).target(TaskType.FormingRegistersOnOS) +// .action(inspectionObligationsAction) +// .and() +// .withExternal() +// .source(TaskType.FormingRegistersOnOS).target(TaskType.FormingPaymentInstruction) +// .action(formingRegistersOnOSAction) +// .and() +// .withExternal() +// .source(TaskType.FormingPaymentInstruction).target(TaskType.AgainRevise) +// .action(formingPaymentInstructionAction) +// .and() +// .withExternal() +// .event(SessionEvent.Revise) +// .source(TaskType.AgainRevise).target(TaskType.AgainRevise) +// .action(balanceReviseAction); +// +// } +// +// @Override +// public void configure(StateMachineConfigurationConfigurer config) throws Exception { +// StateMachineListenerAdapter loggingChangeStateListener = new StateMachineListenerAdapter<>() { +// @Override +// public void stateEntered(State state) { +// TaskType enteredState = state != null ? state.getId() : null; +// log.info(String.format("State entered: %s", enteredState)); +// } +// }; +// config.withConfiguration().listener(loggingChangeStateListener); +// } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/CreateSessionAction.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/CreateSessionAction.java index 2a41fdb9c..104691dc3 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/CreateSessionAction.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/CreateSessionAction.java @@ -51,9 +51,9 @@ public class CreateSessionAction extends AbstractSessionActionForOkErrorHandling newSession.setClearingDate(LocalDate.now()); sessionImdg.insert(newSession); log.info("started new session.id={}", newSession.getId()); - context.getExtendedState().getVariables().put(DataEnum.sessionId.name(), newSession.getId()); - context.getExtendedState().getVariables().put(DataEnum.sessionType.name(), sessionType); - context.getExtendedState().getVariables().put(DataEnum.section.name(), section); - context.getExtendedState().getVariables().put(DataEnum.session.name(), newSession); + context.getExtendedState().getVariables().put(DataEnum.sessionId, newSession.getId()); + context.getExtendedState().getVariables().put(DataEnum.sessionType, sessionType); + context.getExtendedState().getVariables().put(DataEnum.section, section); + context.getExtendedState().getVariables().put(DataEnum.session, newSession); } }