Merge branch 'refs/heads/stage-5-state-machine' into dev

This commit is contained in:
etreschenkov 2025-07-14 16:48:33 +03:00
commit f1bb965141
16 changed files with 96 additions and 27 deletions

View file

@ -36,6 +36,7 @@ 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.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.SdfGuard;
@ -76,6 +77,7 @@ public class CurrencySessionStateMachineConfig extends EnumStateMachineConfigure
private final StashedRegistriesPresentGuard oblAdmGuard = new StashedRegistriesPresentGuard(
DataEnum.obligationAdmissionStashedRgs
);
private final ErroneousRegistriesPresentGuard inspErrGuard = new ErroneousRegistriesPresentGuard();
private final UpdateWorkflowStatusAction pauseWsAction;
private final UpdateWorkflowStatusAction activeWsAction;
@ -197,12 +199,12 @@ public class CurrencySessionStateMachineConfig extends EnumStateMachineConfigure
.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))
.guard(invert(inspErrGuard))
.action(saveRegistriesAfterInspectionAndContinueAction)
.action(formingPaymentInstructionAssetsAction);
}

View file

@ -36,6 +36,7 @@ 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.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.SdfGuard;
@ -74,6 +75,7 @@ public class IntermediateMkrSessionStateMachineConfig
private final DiscardRegistriesAction discardInspOblStash = new DiscardRegistriesAction(
DataEnum.inspectionObligationStashedRgs
);
private final ErroneousRegistriesPresentGuard inspErrGuard = new ErroneousRegistriesPresentGuard();
private final DiscardRegistriesAction discardOblAdmStash =
new DiscardRegistriesAction(DataEnum.obligationAdmissionStashedRgs);
private final StashedRegistriesPresentGuard oblAdmGuard = new StashedRegistriesPresentGuard(
@ -210,12 +212,12 @@ public class IntermediateMkrSessionStateMachineConfig
.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))
.guard(invert(inspErrGuard))
.action(saveRegistriesAfterInspectionAndContinueAction)
.action(formingPaymentInstructionAssetsAction);
}

View file

@ -33,6 +33,7 @@ import ru.spcex.clearing.session.state.action.ReviseStage1Action;
import ru.spcex.clearing.session.state.action.SaveRegistriesAfterInspectionAndContinueAction;
import ru.spcex.clearing.session.state.action.SaveRegistriesAndContinueAction;
import ru.spcex.clearing.session.state.action.UpdateWorkflowStatusAction;
import ru.spcex.clearing.session.state.guard.ErroneousRegistriesPresentGuard;
import ru.spcex.clearing.session.state.guard.StashedRegistriesPresentGuard;
import ru.spcex.clearing.session.state.listener.MachineMonitoringListener;
import static ru.spcex.clearing.util.StateMachineUtil.*;
@ -60,14 +61,16 @@ public class PaymSessionStateMachineConfig extends EnumStateMachineConfigurerAda
private final SaveRegistriesAfterInspectionAndContinueAction saveRegistriesAfterInspectionAndContinueAction;
private final DiscardRegistriesAction discardOblAdmStash =
new DiscardRegistriesAction(DataEnum.obligationAdmissionStashedRgs);
private final StashedRegistriesPresentGuard oblAdmGuard = new StashedRegistriesPresentGuard(
DataEnum.obligationAdmissionStashedRgs
);
private final DiscardRegistriesAction discardInspOblStash = new DiscardRegistriesAction(
DataEnum.inspectionObligationStashedRgs
);
private final UpdateWorkflowStatusAction pauseWsAction;
private final UpdateWorkflowStatusAction activeWsAction;
private final StashedRegistriesPresentGuard oblAdmGuard = new StashedRegistriesPresentGuard(
DataEnum.obligationAdmissionStashedRgs
);
private final ErroneousRegistriesPresentGuard inspErrGuard = new ErroneousRegistriesPresentGuard();
private final Guard<TaskType, SsnEvent> reviseSuccessGuard = guardCheckCtxForFlag(DataEnum.againReviseSuccess);
private final SessionType SESSION_TYPE = SessionType.PAYM;
private final Section SECTION = Section.CURR;
@ -195,12 +198,12 @@ public class PaymSessionStateMachineConfig extends EnumStateMachineConfigurerAda
.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))
.guard(invert(inspErrGuard))
.action(saveRegistriesAfterInspectionAndContinueAction)
.action(formingPaymentInstructionAssetsAction);
}

View file

@ -37,6 +37,7 @@ 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.UpdateWorkflowStatusAction;
import ru.spcex.clearing.session.state.guard.ErroneousRegistriesPresentGuard;
import ru.spcex.clearing.session.state.guard.PaymentsWereCreatedListGuard;
import ru.spcex.clearing.session.state.guard.PaymentsWereNotCreatedListGuard;
import ru.spcex.clearing.session.state.guard.SdfGuard;
@ -82,6 +83,7 @@ public class PrimaryAuctionB0SessionStateMachineConfig
private final StashedRegistriesPresentGuard oblAdmGuard = new StashedRegistriesPresentGuard(
DataEnum.obligationAdmissionStashedRgs
);
private final ErroneousRegistriesPresentGuard inspErrGuard = new ErroneousRegistriesPresentGuard();
private final Guard<TaskType, SsnEvent> reviseSuccessGuard = guardCheckCtxForFlag(DataEnum.againReviseSuccess);
private final SessionType SESSION_TYPE = SessionType.IPO0;
@ -219,12 +221,12 @@ public class PrimaryAuctionB0SessionStateMachineConfig
.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))
.guard(invert(inspErrGuard))
.action(saveRegistriesAfterInspectionAndContinueAction)
.action(formingPaymentInstructionSecuritiesAction);
}

View file

@ -13,7 +13,6 @@ 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.guard.Guard;
import org.springframework.statemachine.listener.StateMachineListenerAdapter;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.classes.statics.data.misc.Session;
@ -36,13 +35,15 @@ 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.UpdateWorkflowStatusAction;
import ru.spcex.clearing.session.state.guard.ErroneousRegistriesPresentGuard;
import ru.spcex.clearing.session.state.guard.PaymentsWereCreatedListGuard;
import ru.spcex.clearing.session.state.guard.PaymentsWereNotCreatedListGuard;
import ru.spcex.clearing.session.state.guard.SdfGuardUtil;
import ru.spcex.clearing.session.state.guard.SdfSetGuard;
import ru.spcex.clearing.session.state.guard.StashedRegistriesPresentGuard;
import ru.spcex.clearing.session.state.listener.MachineMonitoringListener;
import static 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.enumeration.Section;
import ru.spcex.platform.enumeration.SessionType;
@ -78,7 +79,7 @@ public class PrimaryAuctionBnSessionStateMachineConfig
private final StashedRegistriesPresentGuard oblAdmGuard = new StashedRegistriesPresentGuard(
DataEnum.obligationAdmissionStashedRgs
);
private final Guard<TaskType, SsnEvent> reviseSuccessGuard = guardCheckCtxForFlag(DataEnum.againReviseSuccess);
private final ErroneousRegistriesPresentGuard inspErrGuard = new ErroneousRegistriesPresentGuard();
private final SessionType SESSION_TYPE = SessionType.IPOB;
private final Section SECTION = Section.FOND;
@ -206,12 +207,12 @@ public class PrimaryAuctionBnSessionStateMachineConfig
.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))
.guard(invert(inspErrGuard))
.action(saveRegistriesAfterInspectionAndContinueAction)
.action(formingPaymentInstructionSecuritiesAction);
}

View file

@ -37,6 +37,7 @@ 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.UpdateWorkflowStatusAction;
import ru.spcex.clearing.session.state.guard.ErroneousRegistriesPresentGuard;
import ru.spcex.clearing.session.state.guard.PaymentsWereCreatedListGuard;
import ru.spcex.clearing.session.state.guard.PaymentsWereNotCreatedListGuard;
import ru.spcex.clearing.session.state.guard.SdfGuard;
@ -82,6 +83,7 @@ public class PrimaryAuctionT0SessionStateMachineConfig
private final StashedRegistriesPresentGuard oblAdmGuard = new StashedRegistriesPresentGuard(
DataEnum.obligationAdmissionStashedRgs
);
private final ErroneousRegistriesPresentGuard inspErrGuard = new ErroneousRegistriesPresentGuard();
private final Guard<TaskType, SsnEvent> reviseSuccessGuard = guardCheckCtxForFlag(DataEnum.againReviseSuccess);
private final SessionType SESSION_TYPE = SessionType.IPOT;
@ -221,12 +223,12 @@ public class PrimaryAuctionT0SessionStateMachineConfig
.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))
.guard(invert(inspErrGuard))
.action(saveRegistriesAfterInspectionAndContinueAction)
.action(formingPaymentInstructionSecuritiesAction);
}

View file

@ -32,6 +32,7 @@ import ru.spcex.clearing.session.state.action.SaveRegistriesAfterInspectionAndCo
import ru.spcex.clearing.session.state.action.Sdf56Action;
import ru.spcex.clearing.session.state.action.SdfReceivedAction;
import ru.spcex.clearing.session.state.action.UpdateWorkflowStatusAction;
import ru.spcex.clearing.session.state.guard.ErroneousRegistriesPresentGuard;
import ru.spcex.clearing.session.state.guard.PaymentsWereCreatedListGuard;
import ru.spcex.clearing.session.state.guard.PaymentsWereNotCreatedListGuard;
import ru.spcex.clearing.session.state.guard.SdfGuardUtil;
@ -67,6 +68,7 @@ public class ReturnDepositSessionStateMachineConfig
);
private final StashedRegistriesPresentGuard oblAdmGuard = new StashedRegistriesPresentGuard(
DataEnum.obligationAdmissionStashedRgs);
private final ErroneousRegistriesPresentGuard inspErrGuard = new ErroneousRegistriesPresentGuard();
private final SessionType SESSION_TYPE = SessionType.XDEP;
private final Section SECTION = Section.MKR;
@ -161,12 +163,12 @@ public class ReturnDepositSessionStateMachineConfig
.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))
.guard(invert(inspErrGuard))
.action(saveRegistriesAfterInspectionAndContinueAction)
.action(formingPaymentInstructionDepositReturnAction);
}

View file

@ -37,6 +37,7 @@ 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.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.SdfGuard;
@ -82,6 +83,7 @@ public class SecondaryAuctionT0SessionStateMachineConfig
private final StashedRegistriesPresentGuard oblAdmGuard = new StashedRegistriesPresentGuard(
DataEnum.obligationAdmissionStashedRgs
);
private final ErroneousRegistriesPresentGuard inspErrGuard = new ErroneousRegistriesPresentGuard();
private final Guard<TaskType, SsnEvent> reviseSuccessGuard = guardCheckCtxForFlag(DataEnum.againReviseSuccess);
private final SessionType SESSION_TYPE = SessionType.TRDT;
@ -221,12 +223,12 @@ public class SecondaryAuctionT0SessionStateMachineConfig
.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))
.guard(invert(inspErrGuard))
.action(saveRegistriesAfterInspectionAndContinueAction)
.action(formingPaymentInstructionAssetsAction);
}

View file

@ -38,6 +38,7 @@ 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.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.SdfGuard;
@ -86,6 +87,7 @@ public class UnitedSessionStateMachineConfig
private final StashedRegistriesPresentGuard oblAdmGuard = new StashedRegistriesPresentGuard(
DataEnum.obligationAdmissionStashedRgs
);
private final ErroneousRegistriesPresentGuard inspErrGuard = new ErroneousRegistriesPresentGuard();
private final Guard<TaskType, SsnEvent> reviseSuccessGuard = guardCheckCtxForFlag(DataEnum.againReviseSuccess);
private final SessionType SESSION_TYPE = SessionType.UNIT;
private final Section SECTION = Section.MULT;
@ -234,12 +236,12 @@ public class UnitedSessionStateMachineConfig
.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))
.guard(invert(inspErrGuard))
.action(saveRegistriesAfterInspectionAndContinueAction)
.action(formingPaymentInstructionAssetsAction);
}

View file

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

View file

@ -2,6 +2,7 @@ package ru.spcex.clearing.session.state.action;
import java.math.BigDecimal;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
@ -31,6 +32,7 @@ import ru.spcex.clearing.session.stage.impl.GatewayRequester;
import ru.spcex.clearing.session.stage.impl.PlanBalanceCalc;
import ru.spcex.clearing.session.state.DataEnum;
import ru.spcex.clearing.session.state.SsnEvent;
import ru.spcex.clearing.session.state.model.RgsErr;
import ru.spcex.platform.enumeration.ClearingCategory;
import ru.spcex.platform.enumeration.RegistryCapacity;
import ru.spcex.platform.enumeration.RegistryDesignation;
@ -82,6 +84,7 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct
Collection<Registry> registriesToProcess = registryImdg.getCollectionObjectsBySQL(sqlCondition);
Map<Long, Registry> rgssToStore = new HashMap<>(registriesToProcess.size()); //вторые ноги у сделок - нужна ли оптимизация?
List<RgsErr> errs = new ArrayList<>();
List<Map.Entry<GroupRgsKey, List<Registry>>> registriesByGroupSorted = registryImdg.getCollectionObjectsBySQL(sqlCondition)
.stream()
@ -99,6 +102,7 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct
if (omtInGroupO.isEmpty() || tmtInGroupO.isEmpty()) {
log.error("groupId/market {}/{} failed to find OM*T/TM*T registry", entry.getKey().groupId(), entry.getKey().market());
group.forEach(rgs -> updateRegistryStatus(rgs, registryStatusFailed(), rgssToStore)); // FAIL or MNG
group.forEach(rgs -> errs.add(new RgsErr(rgs, "Не удалось найти обязательства/требования в группе"))); //never
continue;
}
Registry omtRgs = omtInGroupO.get();
@ -129,6 +133,7 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct
//для OM*T uncovered остальным фейл
group.forEach(rgs -> updateRegistryStatus(rgs, registryStatusFailed(rgs), rgssToStore));
updateRegistryStatus(dmx.get(), RegistryStatus.UNCV, rgssToStore);
errs.add(new RgsErr(dmx.get(), biErr(dmx.get())));
}
continue;
}
@ -139,12 +144,14 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct
log.error("OM*T register.id={} groupId={}, market={} failed to find AM*F asset", omtRgs.getId(),
entry.getKey().groupId(), entry.getKey().market());
group.forEach(rgs -> updateRegistryStatus(rgs, registryStatusFailed(), rgssToStore)); // FAIL or MNG
errs.add(new RgsErr(omtRgs, biErr(omtRgs)));
continue;
}
if (amfAssetReceiverO.isEmpty()) {
log.error("TM*T register.id={} groupId={}, market={} failed to find AM*F asset", tmtRgs.getId(),
entry.getKey().groupId(), entry.getKey().market());
group.forEach(rgs -> updateRegistryStatus(rgs, registryStatusFailed(), rgssToStore)); // FAIL or MNG
errs.add(new RgsErr(tmtRgs, "Не удалось найти AM*F"));
continue;
}
@ -176,6 +183,7 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct
continue;
} else if (SessionType.XDEP.equals(sessionType)) {
group.forEach(rgs -> updateRegistryStatus(rgs, registryStatusFailed(rgs), rgssToStore)); // для финальной UNCV or FAIL ; другие MNG
errs.add(new RgsErr(omtRgs, biErr(omtRgs)));
// updateStatus(dmtInfo.get(), RegistryStatus.UNCV); не меняет статус, статус определяется OM*T
continue;
}
@ -195,6 +203,7 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct
continue;
} else if (SessionType.XDEP.equals(sessionType)) {
group.forEach(rgs -> updateRegistryStatus(rgs, registryStatusFailed(rgs), rgssToStore));
errs.add(new RgsErr(omtRgs, biErr(omtRgs)));
// updateStatus(dmtClnr.get(), RegistryStatus.UNCV); не меняет статус, статус определяется OM*T
continue;
}
@ -213,13 +222,21 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct
log.info("OM*T.id={} -> no DM*X/DM*T(INFO/CLRN) registry found. setting {} status to group",
omtRgs.getId(), registryStatusFailed());
group.forEach(rgs -> updateRegistryStatus(rgs, registryStatusFailed(rgs), rgssToStore));
errs.add(new RgsErr(omtRgs, biErr(omtRgs)));
}
}
ctx.getExtendedState().getVariables().put(DataEnum.erroneousRegistries, errs);
ctx.getExtendedState().getVariables().put(DataEnum.inspectionObligationStashedRgs, rgssToStore);
// registryImdg.putAll(rgssToStore, 200);
//
// planBalanceCalc.stageRevision2(sessionId);
}
private static String biErr(Registry rgs) {
return "Недостаточно средств по инструменту " + rgs.getSecuritySymbol();
}
private static boolean equalByRgs(RegistryTradingParams rgsParams, Registry rgs) {
return rgsParams.equalByRegistry(
IEnumKey.getEnumByKey(RegistryDesignation.class, rgs.getRegistryDesignation()),

View file

@ -39,6 +39,7 @@ import ru.spcex.clearing.session.stage.impl.PlanBalanceCalc;
import ru.spcex.clearing.session.stage.util.RegistryUtil;
import ru.spcex.clearing.session.state.DataEnum;
import ru.spcex.clearing.session.state.SsnEvent;
import ru.spcex.clearing.session.state.model.RgsErr;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryInstrumentType;
import ru.spcex.platform.enumeration.RegistryStatus;
@ -110,6 +111,7 @@ public class InspectionObligationsV2Action extends AbstractSessionActionForOkErr
RegistryStatus.POOL.getKey());
Collection<Registry> registriesToProcess = registryImdg.getCollectionObjectsBySQL(sqlCondition);
List<RgsErr> errs = new ArrayList<>();
Map<Long, Registry> rgssToStore = new HashMap<>(registriesToProcess.size()); //вторые ноги у сделок - нужна ли оптимизация?
List<Map.Entry<GroupRgsKey, List<Registry>>> registriesByGroupSorted = registriesToProcess.stream()
.collect(Collectors.groupingBy(registry -> new GroupRgsKey(registry.getGroupId(), registry.getMarket())))
@ -161,6 +163,7 @@ public class InspectionObligationsV2Action extends AbstractSessionActionForOkErr
msgResolver.resolve(new EnumMessage(ClearingError.InsecurityObligation, obligation.getCompanyId())));
isUncovered = true;
}
if (isUncovered) errs.add(new RgsErr(obligation, biErr(obligation)));
checkResults.add(new CheckResult(obligation, isUncovered));
isUncovered = false;
}
@ -169,8 +172,10 @@ public class InspectionObligationsV2Action extends AbstractSessionActionForOkErr
for (Registry rgs : group) {
Runnable failGroup = () -> Stream.concat(group.stream(), getRefundDateRgsIfPresent(group).stream())
.forEach(registry -> {
registry.setComment(msgResolver.resolve(RgsError.A__tNotFound));
String err = msgResolver.resolve(RgsError.A__tNotFound);
registry.setComment(err);
updateRegistryStatus(registry, RegistryStatus.FAIL, rgssToStore);
errs.add(new RgsErr(registry, err));
});
RegistryInstrumentType mOrS = IEnumKey.getEnumByKey(RegistryInstrumentType.class, rgs.getRegistryInstrumentType());
if (mOrS == null) {
@ -205,7 +210,10 @@ public class InspectionObligationsV2Action extends AbstractSessionActionForOkErr
checkResults.stream()
.filter(chk -> chk.registry().getId().equals(omt.get().getId()))
.findFirst()
.ifPresent(chk -> chk.isUncovered = true);
.ifPresent(chk -> {
chk.isUncovered = true;
errs.add(new RgsErr(omt.get(), biErr(omt.get())));
});
}
}
defineStatusAndUpdateRegistry(checkResults, group, rgssToStore);
@ -267,9 +275,13 @@ public class InspectionObligationsV2Action extends AbstractSessionActionForOkErr
}
}
}
ctx.getExtendedState().getVariables().put(DataEnum.erroneousRegistries, errs);
ctx.getExtendedState().getVariables().put(DataEnum.inspectionObligationStashedRgs, rgssToStore);
}
private static String biErr(Registry rgs) {
return "Недостаточно средств по инструменту " + rgs.getSecuritySymbol();
}
private Registry copyF(Registry rgs) {
Registry rgsF = rgs.clone();

View file

@ -48,7 +48,7 @@ public class PauseWorkflowStatusWithNotificationAction extends UpdateWorkflowSta
case PSEUDO_waitAfterObligationAdmissionError -> {
return "Ряд обязательств не допущены к клирингу!!!\r\n";
}
case PSEUDO_waitAfterInspectionError -> {
case PSEUDO_waitAfterInspectionError, PSEUDO_waitAfterInspectionDepositReturnError -> {
return "Ряд обязательств подлежит исключению из клирингового пула!!!\r\n";
}
default -> {

View file

@ -39,6 +39,7 @@ public class SaveRegistriesAfterInspectionAndContinueAction extends AbstractSess
Long sessionId = ctx.getExtendedState().get(DataEnum.sessionId, Long.class);
registryImdg.putAll(rgss, 200);
planBalanceCalc.stageRevision2(sessionId);
ctx.getExtendedState().getVariables().remove(dataEnum);
}
}

View file

@ -37,5 +37,6 @@ public class SaveRegistriesAndContinueAction extends AbstractSessionActionForOkE
@SuppressWarnings("unchecked")
Map<Long, Registry> rgss = ctx.getExtendedState().get(dataEnum, Map.class);
registryImdg.putAll(rgss, 200);
ctx.getExtendedState().getVariables().remove(dataEnum);
}
}

View file

@ -0,0 +1,19 @@
package ru.spcex.clearing.session.state.guard;
import java.util.Collection;
import org.springframework.statemachine.StateContext;
import org.springframework.statemachine.guard.Guard;
import ru.spcex.clearing.session.stage.TaskType;
import ru.spcex.clearing.session.state.DataEnum;
import ru.spcex.clearing.session.state.SsnEvent;
public class ErroneousRegistriesPresentGuard implements Guard<TaskType, SsnEvent> {
public ErroneousRegistriesPresentGuard() {}
@Override
public boolean evaluate(StateContext<TaskType, SsnEvent> ctx) {
Collection<?> rgss = ctx.getExtendedState().get(DataEnum.erroneousRegistries, Collection.class);
return rgss != null && !rgss.isEmpty();
}
}