diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java index d7c8cb5b6..35b78a684 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java @@ -17,6 +17,7 @@ import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.registry.AdmittedLiabilitiesRegisterNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryStatus; @@ -24,10 +25,8 @@ import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; -import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.util.Collection; import java.util.Map; @@ -45,6 +44,7 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements private final Imdg companyMap; private final SecuritySelector securitySelector; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public AdmittedLiabilitiesRegisterService(Consumer kafkaQueue, @@ -57,6 +57,7 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForLocalDateField(admittedLiabilitiesRegisterMap, "clearingDate"); } @Override @@ -78,6 +79,8 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements log.debug("No registry with such conditions {}", sqlConditionForRegistry); return; } + log.debug("Select {} Registry by query {}", registries.size(), registries); + preClearMap.preClearMap(); registries.forEach((registry -> { if (isDuplicateInMap(registry).isEmpty()) { insertAdmittedLiabilitiesRegister(registry); @@ -131,20 +134,7 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements @Override public Optional isDuplicateInMap(Registry entity) { return Optional.empty(); - //todo для всех isDuplicateInMap: сказали надо по критерию чистить мапу перед вставкой записей, критерий уточнят. - /* - todo вечер 28.09.2023 - Вот по какому полю ориентируемся (название реестра - наименование поля) - depoBalanceRegister - createdAt - moneyBalanceRegister - createdAt - admittedLiabilitiesRegister - clearingDate - coveredLiabilitiesRegister - clearingDate - moneyPaymentInstructionRegister - clearingDate - depoPaymentInstructionRegister - createdAt - excludeLiabilitiesRegister - createdAt - liabilitiesRegister - createdAt - executionRegister - clearingDate - */ + //для всех isDuplicateInMap: пока не используется, надо по критерию чистить мапу перед вставкой записей, preClearMap. // Map> fieldValues = Map.of( // "companyId", entity.getRegistryCode(), // "sessionId", entity.getSessionId(), diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java index 247088edf..bdfabce94 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java @@ -17,6 +17,7 @@ import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.registry.CoveredLiabilitiesRegisterNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryStatus; @@ -24,10 +25,8 @@ import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; -import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.util.Collection; import java.util.Map; @@ -45,6 +44,7 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements private final Imdg companyMap; private final SecuritySelector securitySelector; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public CoveredLiabilitiesRegisterService(Consumer kafkaQueue, @@ -57,6 +57,7 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForLocalDateField(coveredLiabilitiesRegisterMap, "clearingDate"); } @Override @@ -79,6 +80,8 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements log.debug("No registry with such conditions {}", sqlConditionForRegistry); return; } + log.debug("Select {} Registry by query {}", registries.size(), sqlConditionForRegistry); + preClearMap.preClearMap(); registries.forEach((registry -> { if (isDuplicateInMap(registry).isEmpty()) { insertCoveredLiabilitiesRegister(registry); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java index d41a72d23..2a88c5690 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java @@ -13,6 +13,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.imdg.api.Imdg; @@ -20,10 +21,8 @@ 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.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.util.Collection; import java.util.Map; @@ -39,6 +38,7 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial private final Imdg depoBalanceRegisterMap; private final Imdg registryMap; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public DepoBalanceRegisterService(Consumer kafkaQueue, @@ -49,6 +49,7 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial this.depoBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoBalanceRegister, DepoBalanceRegister.class); this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForInstantField(depoBalanceRegisterMap, "created"); } @Override @@ -68,6 +69,8 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial log.debug("No registry with such conditions '{}'", prdctForRegistries); return; } + log.debug("Select {} Registry by query {}", registries.size(), prdctForRegistries); + preClearMap.preClearMap(); registries.forEach((registry -> { if (isDuplicateInMap(registry).isEmpty()) { insertDepoBalanceRegister(registry); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java index b62067ec6..b7323faef 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java @@ -16,12 +16,11 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.util.Collection; import java.util.Map; @@ -41,6 +40,7 @@ public class DepoPaymentInstructionRegisterService extends QueueConsumer impleme private final Imdg tradingClearingRegistryMap; private final Imdg InOutDirectionDictionaryMap; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public DepoPaymentInstructionRegisterService(Consumer kafkaQueue, @@ -54,6 +54,7 @@ public class DepoPaymentInstructionRegisterService extends QueueConsumer impleme this.tradingClearingRegistryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); this.InOutDirectionDictionaryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_InOutDirectionDictionary, InOutDirectionDictionary.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForInstantField(depoPaymentInstructionRegisterMap, "created"); } @Override @@ -67,15 +68,19 @@ public class DepoPaymentInstructionRegisterService extends QueueConsumer impleme public void depoPaymentInstructionRegisterNew(BaseRequest userRequest) { log.debug("LauncherCommandRequest received from {}", createRegistry_GORR.topic()); - Collection actualSessions = sessionMap.getCollectionObjectsByFieldValues(Map.of("section", "FOND")); + Map sessionQuery = Map.of("section", "FOND"); + Collection actualSessions = sessionMap.getCollectionObjectsByFieldValues(sessionQuery); if (actualSessions.isEmpty()) { log.debug("No Session with such conditions section = FOND"); return; } + log.debug("Select {} Session by query {}", actualSessions.size(), sessionQuery); + preClearMap.preClearMap(); for (Session session : actualSessions) { Map> fieldValues = Map.of("sessionId", session.getId()); Collection paymentInstructionBySessionId = paymentInstructionMap.getCollectionObjectsByFieldValues(fieldValues); + log.debug("Select {} PaymentInstruction by query {}", paymentInstructionBySessionId.size(), fieldValues); for (PaymentInstruction paymentInstruction : paymentInstructionBySessionId) { if (isDuplicateInMap(paymentInstruction).isEmpty()) { insertDepoPaymentInstructionRegister(paymentInstruction); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java index 7f6b083b2..b3ed52edf 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java @@ -19,15 +19,14 @@ import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExcludeLiabilitiesRegisterNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; 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.specific.SecuritySelector; -import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.time.TimeUtil; import ru.spcex.platform.utils.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.time.LocalDate; import java.util.Collection; @@ -47,6 +46,7 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements private final Imdg companySymbolMap; private final SecuritySelector securitySelector; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public ExcludeLiabilitiesRegisterService(Consumer kafkaQueue, @@ -60,6 +60,7 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements this.companySymbolMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, ru.clearing.classes.statics.data.company.CompanySymbols.class); this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForInstantField(excludeLiabilitiesRegisterMap, "created"); } @Override @@ -82,6 +83,8 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements log.debug("No registry with such conditions {}", sqlForRegistries); return; } + log.debug("Select {} Registry by query {}", registries.size(), sqlForRegistries); + preClearMap.preClearMap(); registries.forEach((registry -> { if (isDuplicateInMap(registry).isEmpty()) { insertExcludeLiabilitiesRegister(registry); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java index 4058813ae..aec13f61e 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java @@ -18,14 +18,13 @@ import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExecutionRegisterOnSaveRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.enumeration.MoneyFlowSide; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.time.LocalDate; import java.util.Collection; @@ -46,6 +45,7 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ private final Imdg executionDepositMap; private final Imdg tradingClearingRegistryMap; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public ExecutionRegisterService(Consumer kafkaQueue, @@ -59,6 +59,7 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ this.executionDepositMap = imdgProvider.getImdg(Map_ExecutionDeposit, ExecutionDeposit.class); this.tradingClearingRegistryMap = imdgProvider.getImdg(Map_TradingClearingRegistry, TradingClearingRegistry.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForLocalDateField(executionRegisterMap, "clearingDate"); } @Override @@ -77,6 +78,9 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ log.debug("ExecutionRegisterNewRequest received"); Collection collectionFond = executionFondMap.getCollectionObjectsByFieldValues(Map.of("clearingDate", localDateNow)); Collection collectionDeposit = executionDepositMap.getCollectionObjectsByFieldValues(Map.of("clearingDate", localDateNow)); + log.debug("Found {} ExecutionFond and {} ExecutionDeposit on clearingDate={}", + collectionFond.size(), collectionDeposit.size(), localDateNow); + preClearMap.preClearMap(); collectionFond.forEach(x -> { if (isDuplicateInMap(x).isEmpty()) { insertExecutionRegister(true, x); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java index 4231f47c8..3d31414af 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java @@ -18,17 +18,16 @@ import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.registry.LiabilitiesRegisterNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.time.TimeUtil; import ru.spcex.platform.utils.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.util.Collection; import java.util.Map; @@ -47,6 +46,7 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial private final Imdg companySymbolsMap; private final Imdg moneyMarketSecurityMap; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public LiabilitiesRegisterService(Consumer kafkaQueue, @@ -60,6 +60,7 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial this.companySymbolsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); this.moneyMarketSecurityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForInstantField(liabilitiesRegisterMap, "created"); } @Override @@ -78,7 +79,8 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial log.debug("LiabilitiesRegisterNewRequest received from {}", Consts.REGISTRY_LIABILITIES_REGISTER_NEW); String sqlConditionForRegistry = getSqlForRegistries(); Collection registries = registryMap.getCollectionObjectsBySQL(sqlConditionForRegistry); - //checking for duplicates + log.debug("Found {} Registry by query {}", registries.size(), sqlConditionForRegistry); + preClearMap.preClearMap(); registries.forEach((registry -> { if (isDuplicateInMap(registry).isEmpty()) { insertLiabilitiesRegister(registry); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java index 40a438400..da1a355d5 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java @@ -16,6 +16,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.imdg.api.Imdg; @@ -23,13 +24,10 @@ 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.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.util.Collection; -import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.function.Function; @@ -46,6 +44,7 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia private final Imdg companyMap; private final Imdg accountMap; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public MoneyBalanceRegisterService(Consumer kafkaQueue, @@ -59,6 +58,7 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); this.accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForInstantField(moneyBalanceRegisterMap, "created"); } @Override @@ -73,11 +73,12 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia log.debug("LauncherCommandRequest received from {}", createRegistry_GBRR.topic()); ImdgPredicate sqlConditionForRegistry = getSqlForRegistries(userRequest.getRequestPayload().getCompanyId()); Collection registries = registryMap.getCollectionObjectsByPredicate(sqlConditionForRegistry); - if (registries == null) { + if (registries.isEmpty()) { log.debug("No registry with such conditions {}", sqlConditionForRegistry); return; } - //todo надо группировать! + log.debug("Select {} Registry by query {}", registries.size(), sqlConditionForRegistry); + preClearMap.preClearMap(); registries.forEach((registry -> { if (isDuplicateInMap(registry).isEmpty()) { insertMoneyBalanceRegister(registry); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java index fd38b554c..aeaf1ee6f 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java @@ -14,12 +14,11 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.registry.util.PreClearMap; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidator; -import java.text.MessageFormat; import java.time.Instant; import java.util.Collection; import java.util.Map; @@ -36,6 +35,7 @@ public class MoneyPaymentInstructionRegisterService extends QueueConsumer implem private final Imdg paymentInstructionMap; private final Imdg sessionMap; private final Function, IValidator> fieldValuesValidator; + private final PreClearMap preClearMap; @Autowired public MoneyPaymentInstructionRegisterService(Consumer kafkaQueue, @@ -47,6 +47,7 @@ public class MoneyPaymentInstructionRegisterService extends QueueConsumer implem this.paymentInstructionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.fieldValuesValidator = fieldValuesValidator; + preClearMap = PreClearMap.instanceForLocalDateField(moneyPaymentInstructionRegisterMap, "clearingDate"); } @Override @@ -61,10 +62,13 @@ public class MoneyPaymentInstructionRegisterService extends QueueConsumer implem log.debug("LauncherCommandRequest received from {}", TOPIC_NAME); Map> fieldValuesSectionMkr = Map.of("section", "MKR"); Collection actualSessions = sessionMap.getCollectionObjectsByFieldValues(fieldValuesSectionMkr); + log.debug("Selected {} Session by query {}", actualSessions.size(), fieldValuesSectionMkr); + preClearMap.preClearMap(); actualSessions.forEach(session -> { Map> fieldValuesSessionId = Map.of("sessionId", session.getId()); Collection paymentInstructionBySessionId = paymentInstructionMap.getCollectionObjectsByFieldValues(fieldValuesSessionId); + log.debug("Selected {} PaymentInstruction by query {}", paymentInstructionBySessionId.size(), fieldValuesSessionId); for (PaymentInstruction paymentInstruction : paymentInstructionBySessionId) { if (isDuplicateInMap(paymentInstruction).isEmpty()) { insertMoneyPaymentInstructionRegister(paymentInstruction); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/PreClearMap.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/PreClearMap.java new file mode 100644 index 000000000..ba80db4e7 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/PreClearMap.java @@ -0,0 +1,79 @@ +package ru.spcex.clearing.registry.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.clearing.classes.objects.BusinessObject; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.utils.time.TimeUtil; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; +import java.util.Collection; +import java.util.Objects; + +public class PreClearMap { + protected final Logger log = LoggerFactory.getLogger(getClass()); + protected final Imdg map; + protected final PredicateBuilder predicateBuilder; + + public PreClearMap(Imdg map, PredicateBuilder predicateBuilder) { + this.map = map; + this.predicateBuilder = predicateBuilder; + } + + public void preClearMap() { + ImdgPredicate query = predicateBuilder.query(map.predicateBuilder(), LocalDate.now()); + Collection toDelete = map.getCollectionObjectsByPredicate(query); + log.debug("Prepare {} to delete by query \"{}\" from map {}", toDelete.size(), query, map.getMapName()); + for (T item : toDelete) + map.delete(item); + } + + public static PreClearMap instanceForLocalDateField(Imdg map, String fieldName) { + Objects.requireNonNull(map); + Objects.requireNonNull(fieldName); + return new PreClearMap<>(map, new PredicateBuilder() { + @Override + public ImdgPredicate query(ImdgPredicateBuilder pb, LocalDate date) { + return pb.equals(fieldName, date); + } + + @Override + public String toString() { + return "LocalDate predicate on " + fieldName; + } + }); + } + + public static PreClearMap instanceForInstantField(Imdg map, String fieldName) { + Objects.requireNonNull(map); + Objects.requireNonNull(fieldName); + return new PreClearMap<>(map, new PredicateBuilder() { + @Override + public ImdgPredicate query(ImdgPredicateBuilder pb, LocalDate date) { +// Instant atFrom = TimeUtil.localDateToInstant(date); +// Instant atTill = TimeUtil.localDateToInstant(date.plusDays(1)); + Instant atFrom = TimeUtil.localDateToInstant(date).truncatedTo(ChronoUnit.DAYS); + Instant atTill = TimeUtil.localDateToInstant(date.plusDays(1)).plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS); + return pb.and(pb.greatEqual(fieldName, atFrom), pb.less(fieldName, atTill)); + } + + @Override + public String toString() { + return "Instant predicate on " + fieldName; + } + }); + } + + public interface PredicateBuilder { + ImdgPredicate query(ImdgPredicateBuilder pb, LocalDate onDate); + } + + @Override + public String toString() { + return "PreClearMap{map=" + map.getMapName() + ", predicateBuilder=" + predicateBuilder + "}"; + } +} diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/util/PreClearMapTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/util/PreClearMapTest.java new file mode 100644 index 000000000..e6b8a8add --- /dev/null +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/util/PreClearMapTest.java @@ -0,0 +1,50 @@ +package ru.spcex.clearing.registry.util; + +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import ru.clearing.classes.objects.BusinessObject; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast; +import ru.spcex.platform.utils.time.TimeUtil; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.*; + +class PreClearMapTest { + + @Test + void instanceForLocalDateField() { + LocalDate dt = LocalDate.of(2023, 9, 29); + Imdg map = Mockito.mock(Imdg.class); + Mockito.when(map.getMapName()).thenReturn("Map_Test"); + ImdgPredicateBuilder pb = new ImdgPredicateBuilderHazelcast(); + Mockito.when(map.predicateBuilder()).thenReturn(pb); + + PreClearMap pcm = PreClearMap.instanceForLocalDateField(map, "dateField"); + assertEquals("PreClearMap{map=Map_Test, predicateBuilder=LocalDate predicate on dateField}", pcm.toString()); + + ImdgPredicate predicate = pcm.predicateBuilder.query(pb, dt); + assertEquals("dateField=2023-09-29", predicate.toString()); + } + + @Test + void instanceForInstantField() { + LocalDate dt = LocalDate.of(2023, 9, 29); + Imdg map = Mockito.mock(Imdg.class); + Mockito.when(map.getMapName()).thenReturn("Map_Test"); + ImdgPredicateBuilder pb = new ImdgPredicateBuilderHazelcast(); + Mockito.when(map.predicateBuilder()).thenReturn(pb); + + PreClearMap pcm = PreClearMap.instanceForInstantField(map, "dateField"); + assertEquals("PreClearMap{map=Map_Test, predicateBuilder=Instant predicate on dateField}", pcm.toString()); + + ImdgPredicate predicate = pcm.predicateBuilder.query(pb, dt); + assertEquals("(dateField>=2023-09-28T00:00:00Z AND dateField<2023-09-30T00:00:00Z)", predicate.toString()); +// String expectedQuery = "(dateField>=" + TimeUtil.localDateToInstant(dt) + " AND dateField<" + TimeUtil.localDateToInstant(dt.plusDays(1)) + ")"; +// assertEquals("(dateField>=2023-09-28T21:00:00Z AND dateField<2023-09-29T21:00:00Z)", predicate.toString()); +// assertEquals(expectedQuery, predicate.toString()); + } +} \ No newline at end of file