state machine bugfix

This commit is contained in:
ialbert 2025-05-30 19:24:17 +03:00
parent 02038847f2
commit bb70598d0a
2 changed files with 201 additions and 240 deletions

View file

@ -1,245 +1,206 @@
package ru.spcex.clearing.config.state_machine_1; 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.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.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") //@Configuration("sessionStateMachineFactory")
//@EnableStateMachineFactory(name = "PrimaryBnSessionStateMachineFactory") //@EnableStateMachineFactory(name = "PrimaryBnSessionStateMachineFactory")
public class StateBnConfig extends EnumStateMachineConfigurerAdapter<TaskType, SessionEvent> { public class StateBnConfig extends EnumStateMachineConfigurerAdapter<TaskType, SessionEvent> {
private Logger log = LoggerFactory.getLogger(getClass()); // private Logger log = LoggerFactory.getLogger(getClass());
//
private final Imdg<Session> sessionImdg; // private final Imdg<Session> sessionImdg;
/** // /**
* адаптеры между ISessionStage старого образца к Spring State Machine // * адаптеры между ISessionStage старого образца к Spring State Machine
*/ // */
private final StateActionAdapter balanceReviseAction; // private final StateActionAdapter balanceReviseAction;
private final StateActionAdapter dealPrepareAction; // private final StateActionAdapter dealPrepareAction;
private final StateActionAdapter requirementsAndObligationCreationAction; // private final StateActionAdapter requirementsAndObligationCreationAction;
private final StateActionAdapter obligationAdmissionAction; // private final StateActionAdapter obligationAdmissionAction;
private final StateActionAdapter inclusionToPoolAction; // private final StateActionAdapter inclusionToPoolAction;
private final StateActionAdapter inspectionObligationsAction; // private final StateActionAdapter inspectionObligationsAction;
private final StateActionAdapter formingRegistersOnOSAction; // private final StateActionAdapter formingRegistersOnOSAction;
private final StateActionAdapter formingPaymentInstructionAction; // private final StateActionAdapter formingPaymentInstructionAction;
//
public StateBnConfig(ImdgProvider imdgProvider, // public StateBnConfig(ImdgProvider imdgProvider,
BalanceRevise balanceRevise, // BalanceRevise balanceRevise,
DealsPrepare dealsPrepare, // DealsPrepare dealsPrepare,
RequirementsAndObligationCreation requirementsAndObligationCreation, // RequirementsAndObligationCreation requirementsAndObligationCreation,
ObligationAdmission obligationsAdmission, // ObligationAdmission obligationsAdmission,
InclusionObligations inclusionObligations, // InclusionObligations inclusionObligations,
InspectionObligations inspectionObligations, // InspectionObligations inspectionObligations,
FormingRegistersOnOS formingRegistersOnOS, // FormingRegistersOnOS formingRegistersOnOS,
FormingPaymentInstruction formingPaymentInstruction, // FormingPaymentInstruction formingPaymentInstruction,
UnlockResources unlockResources, // UnlockResources unlockResources,
FinishingSession finishingSession, // FinishingSession finishingSession,
EndStageNotification endStageNotification, // EndStageNotification endStageNotification,
@Qualifier("marketCodesForBn") Supplier<List<String>> marketCodes) { // @Qualifier("marketCodesForBn") Supplier<List<String>> marketCodes) {
//
Imdg<ExecutionFond> executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class); // Imdg<ExecutionFond> executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); // this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
//
//настройка стадий // //настройка стадий
dealsPrepare.searchForExecutions(ExecutionType.ExecutionFond); // dealsPrepare.searchForExecutions(ExecutionType.ExecutionFond);
ImdgPredicateBuilder execFondPb = executionFondImdg.predicateBuilder(); // ImdgPredicateBuilder execFondPb = executionFondImdg.predicateBuilder();
dealsPrepare.addExecutionFondCondition(execFondPb.regex("settlementCode", "^B\\d{2}$")); // dealsPrepare.addExecutionFondCondition(execFondPb.regex("settlementCode", "^B\\d{2}$"));
dealsPrepare.addExecutionFondCondition(execFondPb.in("market", marketCodes.get().toArray(new String[0]))); // dealsPrepare.addExecutionFondCondition(execFondPb.in("market", marketCodes.get().toArray(new String[0])));
inclusionObligations.setSessionType(SessionType.IPOB); // inclusionObligations.setSessionType(SessionType.IPOB);
imdgProvider.waitAvailable(); // imdgProvider.waitAvailable();
//
//настройка адаптеров для State Machine // //настройка адаптеров для State Machine
balanceReviseAction = new StateActionAdapter(balanceRevise); // balanceReviseAction = new StateActionAdapter(balanceRevise);
//
dealPrepareAction = new StateActionAdapter(dealsPrepare); // dealPrepareAction = new StateActionAdapter(dealsPrepare);
dealPrepareAction.setPayloadForStageGetter((extendedState) -> { // dealPrepareAction.setPayloadForStageGetter((extendedState) -> {
DealsPreparePayload payload = new DealsPreparePayload(); // DealsPreparePayload payload = new DealsPreparePayload();
payload.setSessionId(extendedState.get(StageDataEnum.sessionId.name(), Long.class)); // payload.setSessionId(extendedState.get(StageDataEnum.sessionId.name(), Long.class));
return payload; // return payload;
}); // });
dealPrepareAction.setSaveName(StageDataEnum.ExecutionList); // dealPrepareAction.setSaveName(StageDataEnum.ExecutionList);
//
requirementsAndObligationCreationAction = new StateActionAdapter(requirementsAndObligationCreation); // requirementsAndObligationCreationAction = new StateActionAdapter(requirementsAndObligationCreation);
requirementsAndObligationCreationAction.setPayloadForStageGetter((extendedState) // requirementsAndObligationCreationAction.setPayloadForStageGetter((extendedState)
-> extendedState.get(StageDataEnum.ExecutionList.name(), List.class)); // -> extendedState.get(StageDataEnum.ExecutionList.name(), List.class));
//
obligationAdmissionAction = new StateActionAdapter(obligationsAdmission); // obligationAdmissionAction = new StateActionAdapter(obligationsAdmission);
obligationAdmissionAction.setPayloadForStageGetter((extendedState) -> extendedState.get(StageDataEnum.sessionId.name(), Long.class)); // obligationAdmissionAction.setPayloadForStageGetter((extendedState) -> extendedState.get(StageDataEnum.sessionId.name(), Long.class));
//
inclusionToPoolAction = new StateActionAdapter(inclusionObligations); // inclusionToPoolAction = new StateActionAdapter(inclusionObligations);
inclusionToPoolAction.setPayloadForStageGetter((extendedState) -> { // inclusionToPoolAction.setPayloadForStageGetter((extendedState) -> {
InclusionToPoolPayload payload = new InclusionToPoolPayload(); // InclusionToPoolPayload payload = new InclusionToPoolPayload();
Session session = extendedState.get(StageDataEnum.session.name(), Session.class); // Session session = extendedState.get(StageDataEnum.session.name(), Session.class);
Long sessionId = extendedState.get(StageDataEnum.sessionId.name(), Long.class); // Long sessionId = extendedState.get(StageDataEnum.sessionId.name(), Long.class);
payload.setSessionType(session.getSessionType()); // payload.setSessionType(session.getSessionType());
payload.setSessionId(sessionId); // payload.setSessionId(sessionId);
return payload; // return payload;
}); // });
//
inspectionObligationsAction = new StateActionAdapter(inspectionObligations); // inspectionObligationsAction = new StateActionAdapter(inspectionObligations);
inspectionObligationsAction.setPayloadForStageGetter((extendedState) -> { // inspectionObligationsAction.setPayloadForStageGetter((extendedState) -> {
InspectionPoolPayload payload = new InspectionPoolPayload(); // InspectionPoolPayload payload = new InspectionPoolPayload();
Session session = extendedState.get(StageDataEnum.session.name(), Session.class); // Session session = extendedState.get(StageDataEnum.session.name(), Session.class);
payload.setProcessedCompanyId(session.getCompanyId()); // payload.setProcessedCompanyId(session.getCompanyId());
return payload; // return payload;
}); // });
//
formingRegistersOnOSAction = new StateActionAdapter(formingRegistersOnOS); // formingRegistersOnOSAction = new StateActionAdapter(formingRegistersOnOS);
//
formingPaymentInstructionAction = new StateActionAdapter(formingPaymentInstruction); // formingPaymentInstructionAction = new StateActionAdapter(formingPaymentInstruction);
formingPaymentInstructionAction.setPayloadForStageGetter((extendedState) -> { // formingPaymentInstructionAction.setPayloadForStageGetter((extendedState) -> {
FormingPaymentInstructionPayload payload = new FormingPaymentInstructionPayload(); // FormingPaymentInstructionPayload payload = new FormingPaymentInstructionPayload();
payload.setSessionId(extendedState.get(StageDataEnum.sessionId.name(), Long.class)); // payload.setSessionId(extendedState.get(StageDataEnum.sessionId.name(), Long.class));
return payload; // return payload;
}); // });
formingPaymentInstructionAction.setSaveName(StageDataEnum.PaymentInstructions); // formingPaymentInstructionAction.setSaveName(StageDataEnum.PaymentInstructions);
// if (paymentResult != null && paymentResult.getStageResult().isEmpty()) { // // if (paymentResult != null && paymentResult.getStageResult().isEmpty()) {
// runStage(TaskType.FormingPaymentInstruction, balanceRevise); // // runStage(TaskType.FormingPaymentInstruction, balanceRevise);
//// finishPart(req); // //// finishPart(req);
// } // // }
} // }
//
//
@Override // @Override
public void configure(StateMachineStateConfigurer<TaskType, SessionEvent> states) throws Exception { // public void configure(StateMachineStateConfigurer<TaskType, SessionEvent> states) throws Exception {
states // states
.withStates() // .withStates()
.initial(TaskType.StartRevise, context -> { // .initial(TaskType.StartRevise, context -> {
Session existActiveSession = sessionImdg.getFirstObjectByFieldValues(Map.of("workflowStatus", SessionStatus.ACTV.getKey())); // Session existActiveSession = sessionImdg.getFirstObjectByFieldValues(Map.of("workflowStatus", SessionStatus.ACTV.getKey()));
if (existActiveSession != null) { // if (existActiveSession != null) {
throw new RuntimeException("ActiveSessionIsPresent " + existActiveSession); // throw new RuntimeException("ActiveSessionIsPresent " + existActiveSession);
} // }
Session newSession = new Session(); // Session newSession = new Session();
newSession.setSection(Section.FOND.getKey()); // newSession.setSection(Section.FOND.getKey());
newSession.setSessionType(SessionType.IPOB.getKey()); // newSession.setSessionType(SessionType.IPOB.getKey());
newSession.setSessionStatus(TaskType.StartRevise.getKey()); // newSession.setSessionStatus(TaskType.StartRevise.getKey());
newSession.setWorkflowStatus(SessionStatus.ACTV.getKey()); // newSession.setWorkflowStatus(SessionStatus.ACTV.getKey());
newSession.setClearingDate(LocalDate.now()); // newSession.setClearingDate(LocalDate.now());
sessionImdg.insert(newSession); // sessionImdg.insert(newSession);
log.info("started new session.id={}", newSession.getId()); // log.info("started new session.id={}", newSession.getId());
context.getExtendedState().getVariables().put(StageDataEnum.sessionId.name(), newSession.getId()); // context.getExtendedState().getVariables().put(StageDataEnum.sessionId.name(), newSession.getId());
context.getExtendedState().getVariables().put(StageDataEnum.session.name(), newSession); // context.getExtendedState().getVariables().put(StageDataEnum.session.name(), newSession);
}) // })
.states(new HashSet<>(Arrays.asList(TaskType.StartRevise, // .states(new HashSet<>(Arrays.asList(TaskType.StartRevise,
TaskType.ContinueRevise, // TaskType.ContinueRevise,
TaskType.StartRevisePart1, // TaskType.StartRevisePart1,
TaskType.DealsPrepare, // TaskType.DealsPrepare,
TaskType.RequirementsAndObligationsCreate, // TaskType.RequirementsAndObligationsCreate,
TaskType.ObligationsAdmission, // TaskType.ObligationsAdmission,
TaskType.InclusionToPool, // TaskType.InclusionToPool,
TaskType.InspectionObligations, // TaskType.InspectionObligations,
TaskType.FormingRegistersOnOS, // TaskType.FormingRegistersOnOS,
TaskType.FormingPaymentInstruction, // TaskType.FormingPaymentInstruction,
// TaskType.UnlockResources, //// TaskType.UnlockResources,
TaskType.AgainRevise // TaskType.AgainRevise
// TaskType.FinishingSession, //// TaskType.FinishingSession,
// TaskType.EndStageNotification //// TaskType.EndStageNotification
))) // )))
.end(TaskType.FormingPaymentInstruction) // .end(TaskType.FormingPaymentInstruction)
; // ;
} // }
//
//
@Override // @Override
public void configure(StateMachineTransitionConfigurer<TaskType, SessionEvent> transitions) throws Exception { // public void configure(StateMachineTransitionConfigurer<TaskType, SessionEvent> transitions) throws Exception {
transitions.withExternal() // transitions.withExternal()
.event(SessionEvent.Revise) // .event(SessionEvent.Revise)
.source(TaskType.StartRevise).target(TaskType.ContinueRevise) // .source(TaskType.StartRevise).target(TaskType.ContinueRevise)
.action(balanceReviseAction) // .action(balanceReviseAction)
.and() // .and()
.withExternal() // .withExternal()
.event(SessionEvent.SdfReceived) // .event(SessionEvent.SdfReceived)
.source(TaskType.ContinueRevise).target(TaskType.StartRevisePart1) // .source(TaskType.ContinueRevise).target(TaskType.StartRevisePart1)
.action(context -> { // .action(context -> {
log.info("SDF57 and SDF01 received, continue session"); // log.info("SDF57 and SDF01 received, continue session");
}) // })
.and() // .and()
.withExternal() // .withExternal()
.event(SessionEvent.Revise) // .event(SessionEvent.Revise)
.source(TaskType.StartRevisePart1).target(TaskType.DealsPrepare) // .source(TaskType.StartRevisePart1).target(TaskType.DealsPrepare)
.action(balanceReviseAction) // .action(balanceReviseAction)
.and() // .and()
.withExternal() // .withExternal()
.source(TaskType.DealsPrepare).target(TaskType.RequirementsAndObligationsCreate) // .source(TaskType.DealsPrepare).target(TaskType.RequirementsAndObligationsCreate)
.action(dealPrepareAction) // .action(dealPrepareAction)
.and() // .and()
.withExternal() // .withExternal()
.source(TaskType.RequirementsAndObligationsCreate).target(TaskType.ObligationsAdmission) // .source(TaskType.RequirementsAndObligationsCreate).target(TaskType.ObligationsAdmission)
.action(requirementsAndObligationCreationAction) // .action(requirementsAndObligationCreationAction)
.and() // .and()
.withExternal() // .withExternal()
.source(TaskType.ObligationsAdmission).target(TaskType.InclusionToPool) // .source(TaskType.ObligationsAdmission).target(TaskType.InclusionToPool)
.action(obligationAdmissionAction) // .action(obligationAdmissionAction)
.and() // .and()
.withExternal() // .withExternal()
.source(TaskType.InclusionToPool).target(TaskType.InspectionObligations) // .source(TaskType.InclusionToPool).target(TaskType.InspectionObligations)
.action(inclusionToPoolAction) // .action(inclusionToPoolAction)
.and() // .and()
.withExternal() // .withExternal()
.source(TaskType.InspectionObligations).target(TaskType.FormingRegistersOnOS) // .source(TaskType.InspectionObligations).target(TaskType.FormingRegistersOnOS)
.action(inspectionObligationsAction) // .action(inspectionObligationsAction)
.and() // .and()
.withExternal() // .withExternal()
.source(TaskType.FormingRegistersOnOS).target(TaskType.FormingPaymentInstruction) // .source(TaskType.FormingRegistersOnOS).target(TaskType.FormingPaymentInstruction)
.action(formingRegistersOnOSAction) // .action(formingRegistersOnOSAction)
.and() // .and()
.withExternal() // .withExternal()
.source(TaskType.FormingPaymentInstruction).target(TaskType.AgainRevise) // .source(TaskType.FormingPaymentInstruction).target(TaskType.AgainRevise)
.action(formingPaymentInstructionAction) // .action(formingPaymentInstructionAction)
.and() // .and()
.withExternal() // .withExternal()
.event(SessionEvent.Revise) // .event(SessionEvent.Revise)
.source(TaskType.AgainRevise).target(TaskType.AgainRevise) // .source(TaskType.AgainRevise).target(TaskType.AgainRevise)
.action(balanceReviseAction); // .action(balanceReviseAction);
//
} // }
//
@Override // @Override
public void configure(StateMachineConfigurationConfigurer<TaskType, SessionEvent> config) throws Exception { // public void configure(StateMachineConfigurationConfigurer<TaskType, SessionEvent> config) throws Exception {
StateMachineListenerAdapter<TaskType, SessionEvent> loggingChangeStateListener = new StateMachineListenerAdapter<>() { // StateMachineListenerAdapter<TaskType, SessionEvent> loggingChangeStateListener = new StateMachineListenerAdapter<>() {
@Override // @Override
public void stateEntered(State<TaskType, SessionEvent> state) { // public void stateEntered(State<TaskType, SessionEvent> state) {
TaskType enteredState = state != null ? state.getId() : null; // TaskType enteredState = state != null ? state.getId() : null;
log.info(String.format("State entered: %s", enteredState)); // log.info(String.format("State entered: %s", enteredState));
} // }
}; // };
config.withConfiguration().listener(loggingChangeStateListener); // config.withConfiguration().listener(loggingChangeStateListener);
} // }
} }

View file

@ -51,9 +51,9 @@ public class CreateSessionAction extends AbstractSessionActionForOkErrorHandling
newSession.setClearingDate(LocalDate.now()); newSession.setClearingDate(LocalDate.now());
sessionImdg.insert(newSession); sessionImdg.insert(newSession);
log.info("started new session.id={}", newSession.getId()); log.info("started new session.id={}", newSession.getId());
context.getExtendedState().getVariables().put(DataEnum.sessionId.name(), newSession.getId()); context.getExtendedState().getVariables().put(DataEnum.sessionId, newSession.getId());
context.getExtendedState().getVariables().put(DataEnum.sessionType.name(), sessionType); context.getExtendedState().getVariables().put(DataEnum.sessionType, sessionType);
context.getExtendedState().getVariables().put(DataEnum.section.name(), section); context.getExtendedState().getVariables().put(DataEnum.section, section);
context.getExtendedState().getVariables().put(DataEnum.session.name(), newSession); context.getExtendedState().getVariables().put(DataEnum.session, newSession);
} }
} }