This commit is contained in:
parent
1defffc0a1
commit
e3d1478752
9 changed files with 143 additions and 14 deletions
|
|
@ -16,9 +16,11 @@ import ru.clearing.classes.statics.data.misc.Session;
|
||||||
import ru.clearing.classes.statics.data.registry.Registry;
|
import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
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.state.DataEnum;
|
||||||
import ru.spcex.clearing.session.state.SsnEvent;
|
import ru.spcex.clearing.session.state.SsnEvent;
|
||||||
import ru.spcex.clearing.session.state.action.CreateSessionAction;
|
import ru.spcex.clearing.session.state.action.CreateSessionAction;
|
||||||
import ru.spcex.clearing.session.state.action.DealsPrepareAction;
|
import ru.spcex.clearing.session.state.action.DealsPrepareAction;
|
||||||
|
import ru.spcex.clearing.session.state.action.DiscardRegistriesAction;
|
||||||
import ru.spcex.clearing.session.state.action.EndStageNotificationAction;
|
import ru.spcex.clearing.session.state.action.EndStageNotificationAction;
|
||||||
import ru.spcex.clearing.session.state.action.FinishingSessionAction;
|
import ru.spcex.clearing.session.state.action.FinishingSessionAction;
|
||||||
import ru.spcex.clearing.session.state.action.FormingPaymentInstructionAssetsAction;
|
import ru.spcex.clearing.session.state.action.FormingPaymentInstructionAssetsAction;
|
||||||
|
|
@ -29,14 +31,18 @@ import ru.spcex.clearing.session.state.action.InspectionObligationsV2Action;
|
||||||
import ru.spcex.clearing.session.state.action.ObligationAdmissionAction;
|
import ru.spcex.clearing.session.state.action.ObligationAdmissionAction;
|
||||||
import ru.spcex.clearing.session.state.action.RequirementAndObligationCreationAction;
|
import ru.spcex.clearing.session.state.action.RequirementAndObligationCreationAction;
|
||||||
import ru.spcex.clearing.session.state.action.ReviseStage1;
|
import ru.spcex.clearing.session.state.action.ReviseStage1;
|
||||||
|
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.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.SdfGuard;
|
import ru.spcex.clearing.session.state.guard.SdfGuard;
|
||||||
import ru.spcex.clearing.session.state.guard.SdfGuardExtractorAfterAssets;
|
import ru.spcex.clearing.session.state.guard.SdfGuardExtractorAfterAssets;
|
||||||
|
import ru.spcex.clearing.session.state.guard.StashedRegistriesPresentGuard;
|
||||||
import ru.spcex.clearing.session.state.listener.MachineMonitoringListener;
|
import ru.spcex.clearing.session.state.listener.MachineMonitoringListener;
|
||||||
import ru.spcex.clearing.util.StateMachineUtil;
|
import ru.spcex.clearing.util.StateMachineUtil;
|
||||||
|
import static ru.spcex.clearing.util.StateMachineUtil.chain;
|
||||||
|
import static ru.spcex.clearing.util.StateMachineUtil.invert;
|
||||||
import ru.spcex.platform.classes.base.interfaces.ExecutionType;
|
import ru.spcex.platform.classes.base.interfaces.ExecutionType;
|
||||||
import ru.spcex.platform.enumeration.RegistryStatus;
|
import ru.spcex.platform.enumeration.RegistryStatus;
|
||||||
import ru.spcex.platform.enumeration.Section;
|
import ru.spcex.platform.enumeration.Section;
|
||||||
|
|
@ -63,6 +69,12 @@ public class FinalSessionStateMachineConfig
|
||||||
private final FormingPaymentInstructionAssetsAction formingPaymentInstructionAssetsAction;
|
private final FormingPaymentInstructionAssetsAction formingPaymentInstructionAssetsAction;
|
||||||
private final FinishingSessionAction finishingSessionAction;
|
private final FinishingSessionAction finishingSessionAction;
|
||||||
private final EndStageNotificationAction endStageNotificationAction;
|
private final EndStageNotificationAction endStageNotificationAction;
|
||||||
|
private final SaveRegistriesAndContinueAction obligationAdmissionContinueAction;
|
||||||
|
private final DiscardRegistriesAction discardOblAdmStash =
|
||||||
|
new DiscardRegistriesAction(DataEnum.obligationAdmissionStashedRgs);
|
||||||
|
private final StashedRegistriesPresentGuard oblAdmGuard = new StashedRegistriesPresentGuard(
|
||||||
|
DataEnum.obligationAdmissionStashedRgs
|
||||||
|
);
|
||||||
|
|
||||||
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;
|
||||||
|
|
@ -81,10 +93,11 @@ public class FinalSessionStateMachineConfig
|
||||||
InspectionObligationsV2Action inspectionObligationsV2Action,
|
InspectionObligationsV2Action inspectionObligationsV2Action,
|
||||||
FormingPaymentInstructionReturnMkrAction formingPaymentInstructionReturnMkrAction,
|
FormingPaymentInstructionReturnMkrAction formingPaymentInstructionReturnMkrAction,
|
||||||
FormingPaymentInstructionAssetsAction formingPaymentInstructionAssetsAction,
|
FormingPaymentInstructionAssetsAction formingPaymentInstructionAssetsAction,
|
||||||
FinishingSessionAction finishingSessionAction, EndStageNotificationAction endStageNotificationAction
|
FinishingSessionAction finishingSessionAction, EndStageNotificationAction endStageNotificationAction, SaveRegistriesAndContinueAction obligationAdmissionContinueAction
|
||||||
) {
|
) {
|
||||||
this.sendSdf56Action = sendSdf56Action;
|
this.sendSdf56Action = sendSdf56Action;
|
||||||
this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
|
this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
|
||||||
|
this.obligationAdmissionContinueAction = obligationAdmissionContinueAction;
|
||||||
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;
|
||||||
|
|
@ -115,13 +128,14 @@ public class FinalSessionStateMachineConfig
|
||||||
);
|
);
|
||||||
this.inspOblDepositReturnAction.setSessionType(SESSION_TYPE);
|
this.inspOblDepositReturnAction.setSessionType(SESSION_TYPE);
|
||||||
this.inspectionObligationsV2Action.setSessionType(SESSION_TYPE);
|
this.inspectionObligationsV2Action.setSessionType(SESSION_TYPE);
|
||||||
|
this.obligationAdmissionContinueAction.setDataEnum(DataEnum.obligationAdmissionStashedRgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void configure(StateMachineStateConfigurer<TaskType, SsnEvent> states) throws Exception {
|
public void configure(StateMachineStateConfigurer<TaskType, SsnEvent> states) throws Exception {
|
||||||
states
|
states
|
||||||
.withStates()
|
.withStates()
|
||||||
.initial(TaskType.StartRevise, StateMachineUtil.chain(
|
.initial(TaskType.StartRevise, chain(
|
||||||
new CreateSessionAction(sessionImdg)
|
new CreateSessionAction(sessionImdg)
|
||||||
.sessionType(SESSION_TYPE)
|
.sessionType(SESSION_TYPE)
|
||||||
.section(SECTION),
|
.section(SECTION),
|
||||||
|
|
@ -134,13 +148,12 @@ public class FinalSessionStateMachineConfig
|
||||||
TaskType.ObligationsAdmission,
|
TaskType.ObligationsAdmission,
|
||||||
TaskType.InclusionToPool,
|
TaskType.InclusionToPool,
|
||||||
TaskType.InspectionObligations,
|
TaskType.InspectionObligations,
|
||||||
TaskType.InspectionObligations,
|
|
||||||
TaskType.FormingRegistersOnOS,
|
TaskType.FormingRegistersOnOS,
|
||||||
TaskType.FormingPaymentInstruction,
|
TaskType.FormingPaymentInstruction,
|
||||||
TaskType.FormingPaymentInstruction,
|
|
||||||
TaskType.FinishingSession,
|
TaskType.FinishingSession,
|
||||||
TaskType.EndStageNotification,
|
TaskType.EndStageNotification,
|
||||||
TaskType.PSEUDO_waitingForSdf
|
TaskType.PSEUDO_waitingForSdf,
|
||||||
|
TaskType.PSEUDO_waitingForObligationAdmission
|
||||||
)))
|
)))
|
||||||
.end(TaskType.EndStageNotification);
|
.end(TaskType.EndStageNotification);
|
||||||
}
|
}
|
||||||
|
|
@ -166,9 +179,25 @@ public class FinalSessionStateMachineConfig
|
||||||
.source(TaskType.RequirementsAndObligationsCreate).target(TaskType.ObligationsAdmission)
|
.source(TaskType.RequirementsAndObligationsCreate).target(TaskType.ObligationsAdmission)
|
||||||
.action(obligationAdmissionAction)
|
.action(obligationAdmissionAction)
|
||||||
.and()
|
.and()
|
||||||
|
.withExternal()
|
||||||
|
.source(TaskType.ObligationsAdmission)
|
||||||
|
.target(TaskType.PSEUDO_waitingForObligationAdmission)
|
||||||
|
.guard(oblAdmGuard)
|
||||||
|
.and()
|
||||||
|
.withExternal()
|
||||||
|
.source(TaskType.PSEUDO_waitingForObligationAdmission).target(TaskType.InclusionToPool)
|
||||||
|
.action(chain(obligationAdmissionContinueAction, inclusionToPoolAction))
|
||||||
|
.event(SsnEvent.CONTINUE)
|
||||||
|
.and()
|
||||||
|
.withExternal()
|
||||||
|
.source(TaskType.PSEUDO_waitingForObligationAdmission).target(TaskType.ObligationsAdmission)
|
||||||
|
.action(StateMachineUtil.chain(discardOblAdmStash, obligationAdmissionAction))
|
||||||
|
.event(SsnEvent.REPEAT)
|
||||||
|
.and()
|
||||||
.withExternal()
|
.withExternal()
|
||||||
.source(TaskType.ObligationsAdmission).target(TaskType.InclusionToPool)
|
.source(TaskType.ObligationsAdmission).target(TaskType.InclusionToPool)
|
||||||
.action(inclusionToPoolAction)
|
.guard(invert(oblAdmGuard))
|
||||||
|
.action(chain(obligationAdmissionContinueAction, inclusionToPoolAction))
|
||||||
.and()
|
.and()
|
||||||
.withExternal()
|
.withExternal()
|
||||||
.source(TaskType.InclusionToPool).target(TaskType.InspectionObligations)
|
.source(TaskType.InclusionToPool).target(TaskType.InspectionObligations)
|
||||||
|
|
@ -219,7 +248,6 @@ public class FinalSessionStateMachineConfig
|
||||||
config
|
config
|
||||||
.withConfiguration()
|
.withConfiguration()
|
||||||
.machineId(SESSION_TYPE.getKey())
|
.machineId(SESSION_TYPE.getKey())
|
||||||
.listener(loggingChangeStateListener)
|
.listener(loggingChangeStateListener);
|
||||||
;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,8 @@ public enum TaskType implements IEnumKey {
|
||||||
* Step 11
|
* Step 11
|
||||||
*/
|
*/
|
||||||
EndStageNotification("CL11"),
|
EndStageNotification("CL11"),
|
||||||
PSEUDO_waitingForSdf("PSEUDO_waitingForSdf")
|
PSEUDO_waitingForSdf("PSEUDO_waitingForSdf"),
|
||||||
|
PSEUDO_waitingForObligationAdmission("PSEUDO_waitingForObligationAdmission"),
|
||||||
;
|
;
|
||||||
|
|
||||||
private String key;
|
private String key;
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ public enum DataEnum {
|
||||||
session, //Session
|
session, //Session
|
||||||
dealsPrepared, //List<ExecutionCommon>
|
dealsPrepared, //List<ExecutionCommon>
|
||||||
counterPartyId, //Long
|
counterPartyId, //Long
|
||||||
|
obligationAdmissionStashedRgs, //Map<Long, Registry>
|
||||||
paymentInstructionReturnMkr, //List<PaymentInstruction>
|
paymentInstructionReturnMkr, //List<PaymentInstruction>
|
||||||
paymentInfo,
|
paymentInfo,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,4 +4,7 @@ public enum SsnEvent {
|
||||||
SDF_01,
|
SDF_01,
|
||||||
SDF_57,
|
SDF_57,
|
||||||
SDF_04,
|
SDF_04,
|
||||||
|
PAUSE,
|
||||||
|
CONTINUE,
|
||||||
|
REPEAT
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
package ru.spcex.clearing.session.state.action;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.statemachine.StateContext;
|
||||||
|
import ru.spcex.clearing.session.stage.TaskType;
|
||||||
|
import ru.spcex.clearing.session.state.DataEnum;
|
||||||
|
import ru.spcex.clearing.session.state.SsnEvent;
|
||||||
|
|
||||||
|
public class DiscardRegistriesAction extends AbstractSessionActionForOkErrorHandling {
|
||||||
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
private final DataEnum dataEnum;
|
||||||
|
|
||||||
|
public DiscardRegistriesAction(DataEnum dataEnum) {
|
||||||
|
this.dataEnum = dataEnum;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void actualExecute(StateContext<TaskType, SsnEvent> ctx) {
|
||||||
|
ctx.getExtendedState().getVariables().remove(dataEnum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -66,12 +66,12 @@ public class ObligationAdmissionAction extends AbstractSessionActionForOkErrorHa
|
||||||
@Override
|
@Override
|
||||||
protected void actualExecute(StateContext<TaskType, SsnEvent> ctx) {
|
protected void actualExecute(StateContext<TaskType, SsnEvent> ctx) {
|
||||||
try (cash) {
|
try (cash) {
|
||||||
Long sessionId = ctx.getExtendedState().get(DataEnum.sessionId, Long.class);
|
obligationAdmission(ctx);
|
||||||
obligationAdmission(sessionId);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void obligationAdmission(Long sessionId) {
|
private void obligationAdmission(StateContext<TaskType, SsnEvent> ctx) {
|
||||||
|
Long sessionId = ctx.getExtendedState().get(DataEnum.sessionId, Long.class);
|
||||||
Collection<Registry> registries = registryImdg.getCollectionObjectsBySQL("sessionId = " + sessionId);
|
Collection<Registry> registries = registryImdg.getCollectionObjectsBySQL("sessionId = " + sessionId);
|
||||||
Map<Long, List<Registry>> byGroups = registries.stream().collect(Collectors.groupingBy(Registry::getGroupId));
|
Map<Long, List<Registry>> byGroups = registries.stream().collect(Collectors.groupingBy(Registry::getGroupId));
|
||||||
log.info("found {} ({} groups) registries with sessionId {}", registries.size(), byGroups.size(), sessionId);
|
log.info("found {} ({} groups) registries with sessionId {}", registries.size(), byGroups.size(), sessionId);
|
||||||
|
|
@ -95,7 +95,12 @@ public class ObligationAdmissionAction extends AbstractSessionActionForOkErrorHa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
registryImdg.putAll(rgsToUpdate);
|
|
||||||
|
ctx.getExtendedState().getVariables().put(DataEnum.obligationAdmissionStashedRgs, rgsToUpdate);
|
||||||
|
// if (wasNack) {
|
||||||
|
// } else {
|
||||||
|
// registryImdg.putAll(rgsToUpdate);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
private IValidator valFor(Registry rgs) {
|
private IValidator valFor(Registry rgs) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
package ru.spcex.clearing.session.state.action;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
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.Service;
|
||||||
|
import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
|
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;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
|
||||||
|
public class SaveRegistriesAndContinueAction extends AbstractSessionActionForOkErrorHandling {
|
||||||
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
private final Imdg<Registry> registryImdg;
|
||||||
|
private DataEnum dataEnum;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public SaveRegistriesAndContinueAction(ImdgProvider imdgProvider) {
|
||||||
|
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDataEnum(DataEnum dataEnum) {
|
||||||
|
this.dataEnum = dataEnum;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void actualExecute(StateContext<TaskType, SsnEvent> ctx) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Map<Long, Registry> rgss = ctx.getExtendedState().get(dataEnum, Map.class);
|
||||||
|
registryImdg.putAll(rgss, 200);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
package ru.spcex.clearing.session.state.guard;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import org.springframework.statemachine.StateContext;
|
||||||
|
import org.springframework.statemachine.guard.Guard;
|
||||||
|
import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
|
import ru.spcex.clearing.session.stage.TaskType;
|
||||||
|
import ru.spcex.clearing.session.state.DataEnum;
|
||||||
|
import ru.spcex.clearing.session.state.SsnEvent;
|
||||||
|
|
||||||
|
public class StashedRegistriesPresentGuard implements Guard<TaskType, SsnEvent> {
|
||||||
|
private final DataEnum dataEnum;
|
||||||
|
|
||||||
|
public StashedRegistriesPresentGuard(DataEnum dataEnum) {
|
||||||
|
this.dataEnum = dataEnum;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean evaluate(StateContext<TaskType, SsnEvent> ctx) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Map<Long, Registry> rgss = ctx.getExtendedState().get(dataEnum, Map.class);
|
||||||
|
return rgss != null && !rgss.isEmpty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,6 +3,7 @@ package ru.spcex.clearing.util;
|
||||||
import org.springframework.statemachine.StateContext;
|
import org.springframework.statemachine.StateContext;
|
||||||
import org.springframework.statemachine.StateMachine;
|
import org.springframework.statemachine.StateMachine;
|
||||||
import org.springframework.statemachine.action.Action;
|
import org.springframework.statemachine.action.Action;
|
||||||
|
import org.springframework.statemachine.guard.Guard;
|
||||||
|
|
||||||
public class StateMachineUtil {
|
public class StateMachineUtil {
|
||||||
|
|
||||||
|
|
@ -18,6 +19,10 @@ public class StateMachineUtil {
|
||||||
return getId(stateMachine);
|
return getId(stateMachine);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <T1, T2> Guard<T1, T2> invert(Guard<T1, T2> guard) {
|
||||||
|
return context -> !guard.evaluate(context);
|
||||||
|
}
|
||||||
|
|
||||||
public static <S, A> Action<S, A> chain(Action<S, A> a, Action<S, A> b) {
|
public static <S, A> Action<S, A> chain(Action<S, A> a, Action<S, A> b) {
|
||||||
return context -> {
|
return context -> {
|
||||||
a.execute(context);
|
a.execute(context);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue