FinalMkrSession state machine integration

This commit is contained in:
ialbert 2025-07-16 14:28:56 +03:00
parent ae3245f069
commit a36abc2b98
3 changed files with 120 additions and 11 deletions

View file

@ -35,7 +35,9 @@ import ru.spcex.clearing.session.state.action.SaveRegistriesAfterInspectionAndCo
import ru.spcex.clearing.session.state.action.SaveRegistriesAndContinueAction; import ru.spcex.clearing.session.state.action.SaveRegistriesAndContinueAction;
import ru.spcex.clearing.session.state.action.Sdf56Action; import ru.spcex.clearing.session.state.action.Sdf56Action;
import ru.spcex.clearing.session.state.action.SdfReceivedAction; import ru.spcex.clearing.session.state.action.SdfReceivedAction;
import ru.spcex.clearing.session.state.action.UpdateSessionStatusAction;
import ru.spcex.clearing.session.state.action.UpdateWorkflowStatusAction; 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.PaymentsWereCreatedGuard;
import ru.spcex.clearing.session.state.guard.PaymentsWereNotCreatedGuard; import ru.spcex.clearing.session.state.guard.PaymentsWereNotCreatedGuard;
import ru.spcex.clearing.session.state.guard.SdfGuardUtil; import ru.spcex.clearing.session.state.guard.SdfGuardUtil;
@ -73,11 +75,17 @@ public class FinalSessionStateMachineConfig
private final SaveRegistriesAfterInspectionAndContinueAction saveRegistriesAfterInspectionAndContinueAction; private final SaveRegistriesAfterInspectionAndContinueAction saveRegistriesAfterInspectionAndContinueAction;
private final DiscardRegistriesAction discardOblAdmStash = private final DiscardRegistriesAction discardOblAdmStash =
new DiscardRegistriesAction(DataEnum.obligationAdmissionStashedRgs); new DiscardRegistriesAction(DataEnum.obligationAdmissionStashedRgs);
private final UpdateWorkflowStatusAction pauseWsAction;
private final UpdateWorkflowStatusAction activeWsAction;
private final UpdateSessionStatusAction inspectionStatusAction;
private final DiscardRegistriesAction discardInspOblStash = new DiscardRegistriesAction(
DataEnum.inspectionObligationStashedRgs
);
private final StashedRegistriesPresentGuard oblAdmGuard = new StashedRegistriesPresentGuard( private final StashedRegistriesPresentGuard oblAdmGuard = new StashedRegistriesPresentGuard(
DataEnum.obligationAdmissionStashedRgs DataEnum.obligationAdmissionStashedRgs
); );
private final UpdateWorkflowStatusAction pauseWsAction; private final ErroneousRegistriesPresentGuard inspErrGuard = new ErroneousRegistriesPresentGuard();
private final UpdateWorkflowStatusAction activeWsAction;
private final SessionType SESSION_TYPE = SessionType.FINL; private final SessionType SESSION_TYPE = SessionType.FINL;
private final Section SECTION = Section.MKR; private final Section SECTION = Section.MKR;
@ -100,7 +108,7 @@ public class FinalSessionStateMachineConfig
SaveRegistriesAndContinueAction obligationAdmissionContinueAction, SaveRegistriesAndContinueAction obligationAdmissionContinueAction,
SaveRegistriesAfterInspectionAndContinueAction saveRegistriesAfterInspectionAndContinueAction, SaveRegistriesAfterInspectionAndContinueAction saveRegistriesAfterInspectionAndContinueAction,
@Qualifier("pauseWorkflowStatusAction") UpdateWorkflowStatusAction pauseWsAction, @Qualifier("pauseWorkflowStatusAction") UpdateWorkflowStatusAction pauseWsAction,
@Qualifier("activeWorkflowStatusAction") UpdateWorkflowStatusAction activeWsAction @Qualifier("activeWorkflowStatusAction") UpdateWorkflowStatusAction activeWsAction, UpdateSessionStatusAction inspectionStatusAction
) { ) {
this.sendSdf56Action = sendSdf56Action; this.sendSdf56Action = sendSdf56Action;
this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
@ -108,6 +116,7 @@ public class FinalSessionStateMachineConfig
this.saveRegistriesAfterInspectionAndContinueAction = saveRegistriesAfterInspectionAndContinueAction; this.saveRegistriesAfterInspectionAndContinueAction = saveRegistriesAfterInspectionAndContinueAction;
this.pauseWsAction = pauseWsAction; this.pauseWsAction = pauseWsAction;
this.activeWsAction = activeWsAction; this.activeWsAction = activeWsAction;
this.inspectionStatusAction = inspectionStatusAction.status(TaskType.InspectionObligations);
Imdg<Registry> rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); Imdg<Registry> rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.reviseStage1Action = reviseStage1Action; this.reviseStage1Action = reviseStage1Action;
this.dealsPrepareAction = dealsPrepareAction; this.dealsPrepareAction = dealsPrepareAction;
@ -155,7 +164,9 @@ public class FinalSessionStateMachineConfig
TaskType.FormingPaymentInstruction, TaskType.FormingPaymentInstruction,
TaskType.FinishingSession, TaskType.FinishingSession,
TaskType.PSEUDO_waitSdfAfterPaymentInstructions, TaskType.PSEUDO_waitSdfAfterPaymentInstructions,
TaskType.PSEUDO_waitAfterObligationAdmissionError TaskType.PSEUDO_waitAfterObligationAdmissionError,
TaskType.PSEUDO_InspectionObligationDepositReturn,
TaskType.PSEUDO_waitAfterInspectionDepositReturnError
))) )))
.end(TaskType.FinishingSession); .end(TaskType.FinishingSession);
} }
@ -182,9 +193,10 @@ public class FinalSessionStateMachineConfig
.action(obligationAdmissionAction) .action(obligationAdmissionAction)
.and() .and()
.withExternal() .withExternal()
.source(TaskType.InclusionToPool).target(TaskType.InspectionObligations) .source(TaskType.InclusionToPool).target(TaskType.PSEUDO_InspectionObligationDepositReturn)
//нужно сменить статус ручками, т.к. псевдо состояние
.action(chain(inspectionStatusAction, inspOblDepositReturnAction))
.action(inspOblDepositReturnAction) .action(inspOblDepositReturnAction)
.action(inspectionObligationsV2Action)
.and() .and()
.withExternal() .withExternal()
.source(TaskType.InspectionObligations).target(TaskType.FormingPaymentInstruction) .source(TaskType.InspectionObligations).target(TaskType.FormingPaymentInstruction)
@ -193,6 +205,10 @@ public class FinalSessionStateMachineConfig
sourceObligationAdmission(transitions); sourceObligationAdmission(transitions);
sourcePseudoAfterOAError(transitions); sourcePseudoAfterOAError(transitions);
sourceIODepositReturn(transitions);
sourceIODepositReturnError(transitions);
sourceIO(transitions);
sourceIOError(transitions);
sourceFormingPaymentInstruction(transitions); sourceFormingPaymentInstruction(transitions);
sourcePseudoWaitSdfAfterPaymentInstructions(transitions); sourcePseudoWaitSdfAfterPaymentInstructions(transitions);
} }
@ -211,24 +227,72 @@ public class FinalSessionStateMachineConfig
.action(chain(obligationAdmissionContinueAction, inclusionToPoolAction)); .action(chain(obligationAdmissionContinueAction, inclusionToPoolAction));
} }
private void sourceInspection(StateMachineTransitionConfigurer<TaskType, SsnEvent> transitions) throws Exception { private void sourceIODepositReturn(StateMachineTransitionConfigurer<TaskType, SsnEvent> transitions) throws Exception {
transitions
.withExternal()
.source(TaskType.PSEUDO_InspectionObligationDepositReturn)
.target(TaskType.PSEUDO_waitAfterInspectionDepositReturnError)
.guard(inspErrGuard)
.action(pauseWsAction)
.and()
.withExternal()
.source(TaskType.PSEUDO_InspectionObligationDepositReturn)
.target(TaskType.InspectionObligations)
.guard(invert(inspErrGuard))
.action(saveRegistriesAfterInspectionAndContinueAction)
.action(inspectionObligationsV2Action);
}
private void sourceIODepositReturnError(StateMachineTransitionConfigurer<TaskType, SsnEvent> transitions) throws Exception {
transitions
//continue and repeat after InspectionObligations
.withExternal()
.source(TaskType.PSEUDO_waitAfterInspectionDepositReturnError).target(TaskType.InspectionObligations)
.action(activeWsAction)
.action(saveRegistriesAfterInspectionAndContinueAction)
.action(inspectionObligationsV2Action)
.event(SsnEvent.CONTINUE)
.and()
.withExternal()
.source(TaskType.PSEUDO_waitAfterInspectionDepositReturnError).target(TaskType.PSEUDO_InspectionObligationDepositReturn)
.action(chain(activeWsAction, discardInspOblStash, inspOblDepositReturnAction))
.event(SsnEvent.REPEAT);
}
private void sourceIO(StateMachineTransitionConfigurer<TaskType, SsnEvent> transitions) throws Exception {
transitions transitions
.withExternal() .withExternal()
.source(TaskType.InspectionObligations) .source(TaskType.InspectionObligations)
.target(TaskType.PSEUDO_waitAfterInspectionError) .target(TaskType.PSEUDO_waitAfterInspectionError)
.guard(oblAdmGuard) .guard(inspErrGuard)
.action(pauseWsAction) .action(pauseWsAction)
.and() .and()
.withExternal() .withExternal()
.source(TaskType.InspectionObligations).target(TaskType.FormingPaymentInstruction) .source(TaskType.InspectionObligations).target(TaskType.FormingPaymentInstruction)
.guard(invert(oblAdmGuard)) .guard(invert(inspErrGuard))
.action(saveRegistriesAfterInspectionAndContinueAction)
.action(formingPaymentInstructionAssetsAction)
.action(saveRegistriesAfterInspectionAndContinueAction) .action(saveRegistriesAfterInspectionAndContinueAction)
.action(formingPaymentInstructionReturnMkrAction) .action(formingPaymentInstructionReturnMkrAction)
.action(formingPaymentInstructionAssetsAction); .action(formingPaymentInstructionAssetsAction);
} }
private void sourceIOError(StateMachineTransitionConfigurer<TaskType, SsnEvent> transitions) throws Exception {
transitions
//continue and repeat after InspectionObligations
.withExternal()
.source(TaskType.PSEUDO_waitAfterInspectionError).target(TaskType.FormingPaymentInstruction)
.action(activeWsAction)
.action(saveRegistriesAfterInspectionAndContinueAction)
.action(formingPaymentInstructionReturnMkrAction)
.action(formingPaymentInstructionAssetsAction)
.event(SsnEvent.CONTINUE)
.and()
.withExternal()
.source(TaskType.PSEUDO_waitAfterInspectionError).target(TaskType.InspectionObligations)
.action(chain(activeWsAction, discardInspOblStash, inspectionObligationsV2Action))
.event(SsnEvent.REPEAT);
}
private void sourcePseudoAfterOAError(StateMachineTransitionConfigurer<TaskType, SsnEvent> transitions) throws Exception { private void sourcePseudoAfterOAError(StateMachineTransitionConfigurer<TaskType, SsnEvent> transitions) throws Exception {
transitions transitions
.withExternal() .withExternal()

View file

@ -61,6 +61,7 @@ public enum TaskType implements IEnumKey {
PSEUDO_waitAfterObligationAdmissionError("PSEUDO_waitAfterObligationAdmissionError"), PSEUDO_waitAfterObligationAdmissionError("PSEUDO_waitAfterObligationAdmissionError"),
PSEUDO_waitAfterInspectionError("PSEUDO_waitAfterInspectionError"), PSEUDO_waitAfterInspectionError("PSEUDO_waitAfterInspectionError"),
PSEUDO_waitAfterInspectionDepositReturnError("PSEUDO_waitAfterInspectionDepositReturnError"), PSEUDO_waitAfterInspectionDepositReturnError("PSEUDO_waitAfterInspectionDepositReturnError"),
PSEUDO_InspectionObligationDepositReturn("PSEUDO_InspectionObligationDepositReturn"),
PSEUDO_end("PSEUDO_end"), PSEUDO_end("PSEUDO_end"),
; ;

View file

@ -0,0 +1,44 @@
package ru.spcex.clearing.session.state.action;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.statemachine.StateContext;
import org.springframework.stereotype.Component;
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.state.DataEnum;
import ru.spcex.clearing.session.state.SsnEvent;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class UpdateSessionStatusAction extends AbstractSessionActionForOkErrorHandling {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<Session> ssnImdg;
private TaskType status;
@Autowired
public UpdateSessionStatusAction(ImdgProvider imdgProvider) {
this.ssnImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
}
public UpdateSessionStatusAction status(TaskType status) {
this.status = status;
return this;
}
@Override
protected void actualExecute(StateContext<TaskType, SsnEvent> ctx) {
Session session = ctx.getExtendedState().get(DataEnum.session, Session.class);
if (status == null)
throw new IllegalStateException("status must be set for %s action".formatted(getClass()));
session.setSessionStatus(status.getKey());
log.info("updating session status to {}", status);
ssnImdg.update(session);
}
}