From c6767821aa166d9707a6a35a92e8503dfeaee361 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Wed, 2 Oct 2024 18:46:16 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-770 --- .../account/service/AccountService.java | 27 +++++++++++++++++-- .../service/InformationAccountService.java | 25 +++++++++-------- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java index 669159287..9cce75860 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java @@ -4,6 +4,7 @@ import java.time.Instant; import java.util.Collection; import java.util.Map; import java.util.function.Function; +import org.apache.commons.lang3.StringUtils; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; @@ -42,6 +43,8 @@ import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgTransaction; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.validation.Stored; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; @@ -145,9 +148,29 @@ public class AccountService extends QueueConsumer implements InitializingBean { account.setCompanyId(req.getCompanyId()); account.setAccount(req.getAccount()); if (AccountType.Info.equalsByKey(req.getAccountType())) { - Long infoSequenceId = informationAccountService.accountNextId(currencyCode, currencyCodeId); + Account anltAccount; + { + ImdgPredicateBuilder pb = accountMap.predicateBuilder(); + ImdgPredicate andPredicate = pb.and( + pb.equals("accountType", AccountType.Anlt.getKey()), + pb.equals("currency", currency) + ); + Collection accountsAnlt = accountMap.getCollectionObjectsByPredicate(andPredicate); + if (accountsAnlt.isEmpty()) { + log.warn("Account with {} not exist.", andPredicate); + } else if (accountsAnlt.size() > 1) { + log.warn("Account for companyId 1 and accountType=ANLT contains multiply elements, use first"); + } + anltAccount = accountsAnlt.iterator().next(); + } - String accountValue = informationAccountService.generateInfoAccount(currencyCodeId, infoSequenceId); + String specialAnltAccId = "7000"; + if (anltAccount != null && StringUtils.isNotEmpty(anltAccount.getAccount()) && anltAccount.getAccount().length() >= 4) { + specialAnltAccId = anltAccount.getAccount().substring(anltAccount.getAccount().length() - 4); + } + + Long infoSequenceId = informationAccountService.accountNextId(currencyCode, currencyCodeId); + String accountValue = informationAccountService.generateInfoAccount(currencyCodeId, infoSequenceId, specialAnltAccId); log.trace("New info-account SequenceId={} account={}", infoSequenceId, accountValue); account.setAccount(accountValue); } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java index 1a98c6b2c..7ea1a5215 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java @@ -119,9 +119,6 @@ public class InformationAccountService extends QueueConsumer implements Initiali String currency = req.getCurrency() == null ? CurrencyCode.RUB.getKey() : req.getCurrency(); //userRequest.getRequestPayload().getCurrency(); Long newId = informationAccountImdg.nextIDSequenceFor(); - Long infoSequenceId = accountNextId(currency, 810L); - String accountValue = generateInfoAccount(810L, infoSequenceId); - log.trace("New info-account id={}, sequenceId={}, account={}", newId, infoSequenceId, accountValue); ImdgPredicateBuilder accountPredicateBuilder = accountImdg.predicateBuilder(); ImdgPredicate companyIdPredicate = accountPredicateBuilder.equals("companyId", 1L); @@ -215,15 +212,11 @@ public class InformationAccountService extends QueueConsumer implements Initiali String currency = userRequest.getRequestPayload().getCurrency(); if (currency == null) currency = CurrencyCode.RUB.getKey(); - Long newId = informationAccountImdg.nextIDSequenceFor(); - Long infoSequenceId = accountNextId(currency, 810L); // требуется последовательность n+1 - String accountValue = generateInfoAccount(810L, infoSequenceId); - log.trace("New info-account id={}, sequenceId={}, account={}", newId, infoSequenceId, accountValue); Long anltAccountId = null; + Account anltAccount; { ImdgPredicate andPredicate = pb.and( - pb.equals("companyId", 1L), pb.equals("accountType", AccountType.Anlt.getKey()), pb.equals("currency", currency) ); @@ -234,10 +227,20 @@ public class InformationAccountService extends QueueConsumer implements Initiali } else if (accountsAnlt.size() > 1) { log.warn("Account for companyId 1 and accountType=ANLT contains multiply elements, use first"); } - Account anltAccount = accountsAnlt.iterator().next(); + anltAccount = accountsAnlt.iterator().next(); anltAccountId = anltAccount.getId(); } + + String specialAnltAccId = "7000"; + if (anltAccount != null && StringUtils.isNotEmpty(anltAccount.getAccount()) && anltAccount.getAccount().length() >= 4) { + specialAnltAccId = anltAccount.getAccount().substring(anltAccount.getAccount().length() - 4); + } + Long newId = informationAccountImdg.nextIDSequenceFor(); + Long infoSequenceId = accountNextId(currency, 810L); // требуется последовательность n+1 + String accountValue = generateInfoAccount(810L, infoSequenceId, specialAnltAccId); + log.trace("New info-account id={}, sequenceId={}, account={}", newId, infoSequenceId, accountValue); + Instant now = Instant.now(); Account account = new Account(); account.setAccount(accountValue); @@ -301,8 +304,8 @@ public class InformationAccountService extends QueueConsumer implements Initiali kafkaSender.sendRequestToQueue(Consts.CREATE_NOTIFICATION_NCMP, request); } - public String generateInfoAccount(Long currencyCodeId, Long id) { - return "%d%03d%08d%d".formatted(39911, currencyCodeId, id, 7000); + public String generateInfoAccount(Long currencyCodeId, Long id, String specialAnltAccId) { + return "%d%03d%08d%s".formatted(39911, currencyCodeId, id, specialAnltAccId); } public synchronized Long accountNextId(String currency) {