From ef217e8ff7401c3a57b6189bcb9c1df150df95af Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 1 Sep 2023 12:38:32 +0300 Subject: [PATCH] =?UTF-8?q?clearing-service=20FinishingSession=20=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=82=D1=83=D1=81=D1=8B=20=D0=B4=D0=BB=D1=8F=20Exe?= =?UTF-8?q?cution.=20imdg=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B8=D0=BD=D0=B4=D0=B5=D0=BA=D1=81=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../session/stage/impl/FinishingSession.java | 96 ++++++++++++++++++- .../businessobject/ExecutionFondMapStore.java | 5 + .../imdg/businessobject/RegistryMapStore.java | 5 + .../imdg/object/ExecutionDepositMapStore.java | 2 +- 4 files changed, 103 insertions(+), 5 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FinishingSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FinishingSession.java index c33d0560e..d6ab2b6df 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FinishingSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FinishingSession.java @@ -6,6 +6,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.execution.ExecutionCommon; +import ru.clearing.classes.statics.data.execution.ExecutionDeposit; +import ru.clearing.classes.statics.data.execution.ExecutionFond; +import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.sdf.SDf05; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -19,20 +23,22 @@ import ru.spcex.clearing.session.stage.ISessionStage; import ru.spcex.clearing.session.stage.StageResult; import ru.spcex.clearing.session.stage.Task; import ru.spcex.clearing.session.stage.task.FinishingSessionPayload; -import ru.spcex.platform.enumeration.RegistryDesignation; -import ru.spcex.platform.enumeration.RegistryStatus; -import ru.spcex.platform.enumeration.RegistryTradingParams; -import ru.spcex.platform.enumeration.Section; +import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IMessageResolver; import java.time.Instant; import java.util.Collection; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; import static ru.spcex.clearing.error.ClearingErrorInternal.SessionGeneralError; @@ -43,6 +49,9 @@ public class FinishingSession implements ISessionStage { private final ImdgProvider imdgProvider; private final Imdg registryImdg; + private final Imdg executionFondImdg; + private final Imdg executionDepositImdg; + private final Imdg sessionImdg; private final Imdg sDf05Imdg; private final KafkaSender kafkaSender; private final IMessageResolver msgResolver; @@ -53,7 +62,10 @@ public class FinishingSession implements ISessionStage { @Autowired public FinishingSession(ImdgProvider imdgProvider, KafkaSender kafkaSender, IMessageResolver msgResolver, Sdf05Sender sdf05Sender, Sdf14Sender sdf14Sender) { this.imdgProvider = imdgProvider; + this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class); + this.executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class); this.sDf05Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf05, SDf05.class); this.kafkaSender = kafkaSender; this.msgResolver = msgResolver; @@ -86,7 +98,54 @@ public class FinishingSession implements ISessionStage { rgs.setRegistryStatus(RegistryStatus.CLRD.getKey()); rgs.setUpdated(now); registryImdg.update(rgs); + }); + log.debug("For sessionId={} was updated {} registers for status={}", sessionId, claimsAndLiabilities.size(), RegistryStatus.CLRD.getKey()); + + // Отметка статуса в Execution* + Session session = sessionImdg.getSingleObjectByID(sessionId); + if (session == null) { + log.error("Session id={} not found. Can not update Execution's.", sessionId); + } else { + Collection oRegs = findORegistryBySessionId(sessionId); + Set exchangeExecutionIdAllowed = oRegs.stream() + .filter(rgs -> RegistryStatus.CLRD.equalsByKey(rgs.getRegistryStatus())) + .map(Registry::getGroupId) // Registry::getGroupId == Execution.ExchangeExecutionId, см. RegistryFondBuilder/RegistryDepoBuilder + .collect(Collectors.toSet()); + + if (IEnumKey.contains(session.getSessionType(), SessionType.FINL, SessionType.MEDM)) { + Collection executions = findExecutionDepositBySessionId(sessionId); + int notAllowed = 0; + for (ExecutionDeposit execution : executions) { + CoverageStatus toStatus = exchangeExecutionIdAllowed.contains(execution.getExchangeExecutionId()) ? + CoverageStatus.ALWD : CoverageStatus.DNED; + if (toStatus == CoverageStatus.DNED) + notAllowed++; + execution.setCoverageStatus(toStatus.getKey()); + execution.setUpdated(Instant.now()); + executionDepositImdg.update(execution); + } + log.trace("By sessionId={} update {} ExecutionDeposit: {} allowed, {} denied", sessionId, + executions.size(), exchangeExecutionIdAllowed.size(), notAllowed); + } else if (IEnumKey.contains(session.getSessionType(), SessionType.TRDT, SessionType.IPOB, SessionType.IPO0, SessionType.IPOT)) { + Collection executions = findExecutionFondBySessionId(sessionId); + int notAllowed = 0; + for (ExecutionFond execution : executions) { + CoverageStatus toStatus = exchangeExecutionIdAllowed.contains(execution.getExchangeExecutionId()) ? + CoverageStatus.ALWD : CoverageStatus.DNED; + if (toStatus == CoverageStatus.DNED) + notAllowed++; + execution.setCoverageStatus(toStatus.getKey()); + execution.setUpdated(Instant.now()); + executionFondImdg.update(execution); + } + log.trace("By sessionId={} update {} ExecutionFond: {} allowed, {} denied", sessionId, + executions.size(), exchangeExecutionIdAllowed.size(), notAllowed); + } else { + log.warn("Unsupported session[{}].SessionType={} for update Executions", sessionId, session.getSessionType()); + } + } + // 2. Отправка сообщений Collection forRegistries = selectRegistry(sessionId); log.debug("Found {} registries for sessionId={}", forRegistries.size(), sessionId); @@ -173,4 +232,33 @@ public class FinishingSession implements ISessionStage { log.debug("found {} claims and liabilities", result.size()); return result; } + + protected Collection findORegistryBySessionId(Long sessionId) { + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + ImdgPredicate prdct = pb.and( + pb.equals("sessionId", sessionId), +// registryStatus - любой статус + pb.equals("registryDesignation", RegistryDesignation.O.getKey())); + Collection result = registryImdg.getCollectionObjectsByPredicate(prdct); + log.trace("found {} liabilities by query {} ", result.size(), prdct); + result = result.stream() + .filter(registry -> Objects.equals(registry.getValueDate(), registry.getSettlementDate())) + .collect(Collectors.toList()); + log.debug("found {} liabilities 'O' by query {} and ValueDate==SettlementDate", result.size(), prdct); + return result; + } + + protected Collection findExecutionFondBySessionId(Long sessionId) { + Collection result = executionFondImdg.getCollectionObjectsByFieldValues(Map.of("sessionId", sessionId)); + log.trace("found {} ExecutionFond by sessionId={}", result.size(), sessionId); + return result; + } + + protected Collection findExecutionDepositBySessionId(Long sessionId) { + Collection result = executionDepositImdg.getCollectionObjectsByFieldValues(Map.of("sessionId", sessionId)); + log.trace("found {} ExecutionDeposit by sessionId={}", result.size(), sessionId); + return result; + } + + } diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/ExecutionFondMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/ExecutionFondMapStore.java index e240ce865..56ece03b3 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/ExecutionFondMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/ExecutionFondMapStore.java @@ -35,6 +35,11 @@ public class ExecutionFondMapStore extends TemplateMapStore { }; } + @Override + public String[] getIndexingField() { + return new String[]{"exchangeExecutionId", "sessionId"}; + } + @Override public Iterable loadAllKeys() { return defaultLoadAllKeysOnTodayByField("SETTLEMENT_DATE", true); diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/RegistryMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/RegistryMapStore.java index 19f64c1f9..d504508aa 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/RegistryMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/RegistryMapStore.java @@ -29,6 +29,11 @@ public class RegistryMapStore extends TemplateMapStore { return "REGISTRY"; } + @Override + public String[] getIndexingField() { + return new String[]{"sessionId"}; + } + @Override public String[] getFields() { return new String[]{ diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/ExecutionDepositMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/ExecutionDepositMapStore.java index 07a311601..e7d715072 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/ExecutionDepositMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/ExecutionDepositMapStore.java @@ -28,7 +28,7 @@ public class ExecutionDepositMapStore extends TemplateMapStore } public String[] getIndexingField() { - return new String[]{"exchangeExecutionId"}; + return new String[]{"exchangeExecutionId", "sessionId"}; } @Override