diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/state_machine_2/specific/FinalSessionStateMachineConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/state_machine_2/specific/FinalSessionStateMachineConfig.java index c3372ccea..a3247b7b7 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/state_machine_2/specific/FinalSessionStateMachineConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/state_machine_2/specific/FinalSessionStateMachineConfig.java @@ -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.Sdf56Action; 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.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; @@ -73,11 +75,17 @@ public class FinalSessionStateMachineConfig private final SaveRegistriesAfterInspectionAndContinueAction saveRegistriesAfterInspectionAndContinueAction; private final DiscardRegistriesAction discardOblAdmStash = 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( DataEnum.obligationAdmissionStashedRgs ); - private final UpdateWorkflowStatusAction pauseWsAction; - private final UpdateWorkflowStatusAction activeWsAction; + private final ErroneousRegistriesPresentGuard inspErrGuard = new ErroneousRegistriesPresentGuard(); private final SessionType SESSION_TYPE = SessionType.FINL; private final Section SECTION = Section.MKR; @@ -100,7 +108,7 @@ public class FinalSessionStateMachineConfig SaveRegistriesAndContinueAction obligationAdmissionContinueAction, SaveRegistriesAfterInspectionAndContinueAction saveRegistriesAfterInspectionAndContinueAction, @Qualifier("pauseWorkflowStatusAction") UpdateWorkflowStatusAction pauseWsAction, - @Qualifier("activeWorkflowStatusAction") UpdateWorkflowStatusAction activeWsAction + @Qualifier("activeWorkflowStatusAction") UpdateWorkflowStatusAction activeWsAction, UpdateSessionStatusAction inspectionStatusAction ) { this.sendSdf56Action = sendSdf56Action; this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); @@ -108,6 +116,7 @@ public class FinalSessionStateMachineConfig this.saveRegistriesAfterInspectionAndContinueAction = saveRegistriesAfterInspectionAndContinueAction; this.pauseWsAction = pauseWsAction; this.activeWsAction = activeWsAction; + this.inspectionStatusAction = inspectionStatusAction.status(TaskType.InspectionObligations); Imdg rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.reviseStage1Action = reviseStage1Action; this.dealsPrepareAction = dealsPrepareAction; @@ -155,7 +164,9 @@ public class FinalSessionStateMachineConfig TaskType.FormingPaymentInstruction, TaskType.FinishingSession, TaskType.PSEUDO_waitSdfAfterPaymentInstructions, - TaskType.PSEUDO_waitAfterObligationAdmissionError + TaskType.PSEUDO_waitAfterObligationAdmissionError, + TaskType.PSEUDO_InspectionObligationDepositReturn, + TaskType.PSEUDO_waitAfterInspectionDepositReturnError ))) .end(TaskType.FinishingSession); } @@ -182,9 +193,10 @@ public class FinalSessionStateMachineConfig .action(obligationAdmissionAction) .and() .withExternal() - .source(TaskType.InclusionToPool).target(TaskType.InspectionObligations) + .source(TaskType.InclusionToPool).target(TaskType.PSEUDO_InspectionObligationDepositReturn) + //нужно сменить статус ручками, т.к. псевдо состояние + .action(chain(inspectionStatusAction, inspOblDepositReturnAction)) .action(inspOblDepositReturnAction) - .action(inspectionObligationsV2Action) .and() .withExternal() .source(TaskType.InspectionObligations).target(TaskType.FormingPaymentInstruction) @@ -193,6 +205,10 @@ public class FinalSessionStateMachineConfig sourceObligationAdmission(transitions); sourcePseudoAfterOAError(transitions); + sourceIODepositReturn(transitions); + sourceIODepositReturnError(transitions); + sourceIO(transitions); + sourceIOError(transitions); sourceFormingPaymentInstruction(transitions); sourcePseudoWaitSdfAfterPaymentInstructions(transitions); } @@ -211,24 +227,72 @@ public class FinalSessionStateMachineConfig .action(chain(obligationAdmissionContinueAction, inclusionToPoolAction)); } - private void sourceInspection(StateMachineTransitionConfigurer transitions) throws Exception { + private void sourceIODepositReturn(StateMachineTransitionConfigurer 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 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 transitions) throws Exception { transitions .withExternal() .source(TaskType.InspectionObligations) .target(TaskType.PSEUDO_waitAfterInspectionError) - .guard(oblAdmGuard) + .guard(inspErrGuard) .action(pauseWsAction) .and() .withExternal() .source(TaskType.InspectionObligations).target(TaskType.FormingPaymentInstruction) - .guard(invert(oblAdmGuard)) - .action(saveRegistriesAfterInspectionAndContinueAction) - .action(formingPaymentInstructionAssetsAction) + .guard(invert(inspErrGuard)) .action(saveRegistriesAfterInspectionAndContinueAction) .action(formingPaymentInstructionReturnMkrAction) .action(formingPaymentInstructionAssetsAction); } + private void sourceIOError(StateMachineTransitionConfigurer 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 transitions) throws Exception { transitions .withExternal() diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java index dd70f4f46..d8941c050 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java @@ -61,6 +61,7 @@ public enum TaskType implements IEnumKey { PSEUDO_waitAfterObligationAdmissionError("PSEUDO_waitAfterObligationAdmissionError"), PSEUDO_waitAfterInspectionError("PSEUDO_waitAfterInspectionError"), PSEUDO_waitAfterInspectionDepositReturnError("PSEUDO_waitAfterInspectionDepositReturnError"), + PSEUDO_InspectionObligationDepositReturn("PSEUDO_InspectionObligationDepositReturn"), PSEUDO_end("PSEUDO_end"), ; diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/UpdateSessionStatusAction.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/UpdateSessionStatusAction.java new file mode 100644 index 000000000..314f18fbd --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/UpdateSessionStatusAction.java @@ -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 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 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); + } +} \ No newline at end of file