diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryListValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryListValidationConfig.java index 35581a678..a6259188f 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryListValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryListValidationConfig.java @@ -1,6 +1,7 @@ package ru.spcex.clearing.account.config.validation; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -57,7 +58,7 @@ public class TradingClearingRegistryListValidationConfig { AccountError.TradingClearingRegistryNotFound, false), new ExistAllAccountId<>("accountId", - TradingClearingRegistryListNewRequest::getAccountId, + TradingClearingRegistryListNewRequest::getCurrencyAccountList, false, null), DictionaryPresentRule.instance("stauts", @@ -153,11 +154,11 @@ public class TradingClearingRegistryListValidationConfig { public static class ExistAllAccountId implements IValidationRule> { String fieldName; - Function accountIdGetter; + Function> accountIdGetter; boolean required; Function idGetter; - public ExistAllAccountId(String fieldName, Function accountIdGetter, boolean required, Function idGetter) { + public ExistAllAccountId(String fieldName, Function> accountIdGetter, boolean required, Function idGetter) { this.fieldName = fieldName; this.accountIdGetter = accountIdGetter; this.required = required; @@ -167,8 +168,8 @@ public class TradingClearingRegistryListValidationConfig { @Override public Optional validate(ImdgValidationContext context) { R validatedObject = context.getValidatedObject(); - Long accountId = accountIdGetter.apply(validatedObject); - if (accountId == null) { + List accounts = accountIdGetter.apply(validatedObject); + if (accounts == null || accounts.isEmpty()) { if (required) return of(AccountError.RequiredFieldEmpty, fieldName); // обязательное поле else @@ -177,36 +178,40 @@ public class TradingClearingRegistryListValidationConfig { Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); // Проверить существование счетов { - Account byIdObject = accountImdg.getSingleObjectByID(accountId); - if (byIdObject == null) - return of(AccountError.AccountNotFound, accountId, fieldName); - if (!IEnumKey.contains(byIdObject.getAccountType(), AccountType.Clrn, AccountType.Info)) { - return of(AccountError.AccountIsNotACurrency, accountId, + for (Long accountId : accounts) { + Account byIdObject = accountImdg.getSingleObjectByID(accountId); + if (byIdObject == null) + return of(AccountError.AccountNotFound, accountId, fieldName); + if (!IEnumKey.contains(byIdObject.getAccountType(), AccountType.Clrn, AccountType.Info)) { + return of(AccountError.AccountIsNotACurrency, accountId, fieldName, "expected: CLRN/INFO but is " + byIdObject.getAccountType()); // Счет %S не - } - if (CurrencyCode.isRub(byIdObject.getCurrency()) || StringUtils.isEmpty(byIdObject.getCurrency())) { - return of(AccountError.AccountIsNotACurrency, accountId, fieldName); // Счет %S не валютный + } + if (CurrencyCode.isRub(byIdObject.getCurrency()) || StringUtils.isEmpty(byIdObject.getCurrency())) { + return of(AccountError.AccountIsNotACurrency, accountId, fieldName); // Счет %S не валютный + } } } // Проверка отсутствия других TradingClearingRegistryList с этими счетами Imdg tradingClearingRegistryListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); ImdgPredicateBuilder pb = tradingClearingRegistryListImdg.predicateBuilder(); - ImdgPredicate query = pb.and(pb.equals("status", WorkflowStatus.Active.getKey()), + for (Long accountId : accounts) { + ImdgPredicate query = pb.and(pb.equals("status", WorkflowStatus.Active.getKey()), pb.equals("accountId", accountId)); - if (idGetter != null) { - Long id = idGetter.apply(validatedObject); - if (id == null) // never - return of(AccountError.RequiredFieldEmpty, "id"); - query = pb.and(query, pb.not(pb.equals("id", id))); - } - Collection inOtherLists = tradingClearingRegistryListImdg.getCollectionObjectsByPredicate(query); - if (!inOtherLists.isEmpty()) { - Collection duplicateAccounts = inOtherLists.stream() + if (idGetter != null) { + Long id = idGetter.apply(validatedObject); + if (id == null) // never + return of(AccountError.RequiredFieldEmpty, "id"); + query = pb.and(query, pb.not(pb.equals("id", id))); + } + Collection inOtherLists = tradingClearingRegistryListImdg.getCollectionObjectsByPredicate(query); + if (!inOtherLists.isEmpty()) { + Collection duplicateAccounts = inOtherLists.stream() .map(TradingClearingRegistryList::getAccountId) .filter(accountId::equals) .collect(Collectors.toSet()); - return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, duplicateAccounts, fieldName); // (5023) «Счет %s уже используется» + return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, duplicateAccounts, fieldName); // (5023) «Счет %s уже используется» + } } return empty(); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClientCodeService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClientCodeService.java index b4b1f04fb..aa940b7a5 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClientCodeService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClientCodeService.java @@ -54,6 +54,8 @@ import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; 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.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.log.ExceptionUtils; @@ -197,17 +199,35 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean clientCodeNewRequest.setDepoAccountId(account.getId()); } } + List currencyIds = new ArrayList<>(); for (MoneyAccountMsgRequest moneyAccountMsg : tkrAccount.getMoneyAccounts()) { + ImdgPredicateBuilder predicateBuilder = accountImdg.predicateBuilder(); + ImdgPredicate currencyPredicate; + ImdgPredicate accountPredicate = predicateBuilder.equals("account", moneyAccountMsg.getAccount()); if (moneyAccountMsg.getCurrCode().equals(CurrencyCode.RUB.getKey())) { - Account account = accountImdg.getFirstObjectByFieldValues( - Map.of( - "account", moneyAccountMsg.getAccount() - ) + currencyPredicate = predicateBuilder.or( + predicateBuilder.equals("currency", CurrencyCode.RUB.getKey()), + predicateBuilder.isNull("currency") ); - if (account != null) { - clientCodeNewRequest.setMoneyAccountId(account.getId()); - } + } else { + currencyPredicate = predicateBuilder.equals("currency", moneyAccountMsg.getCurrCode()); } + Account account = accountImdg.getFirstObjectByPredicate( + predicateBuilder.and(accountPredicate, currencyPredicate) + ); + if (account == null) { + log.warn("Account not found: currency: {}; account: {}", moneyAccountMsg.getCurrCode(), + moneyAccountMsg.getAccount()); + continue; + } + if (!StringUtils.hasText(account.getCurrency()) || CurrencyCode.RUB.equalsByKey(account.getCurrency())) { + clientCodeNewRequest.setMoneyAccountId(account.getId()); + } else { + currencyIds.add(account.getId()); + } + } + if (!currencyIds.isEmpty()) { + clientCodeNewRequest.setCurrencyAccountList(currencyIds); } BaseRequest request = new BaseRequest<>(); request.setRequestPayload(clientCodeNewRequest); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryListService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryListService.java index 1b6b3658d..49d1b7ab4 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryListService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryListService.java @@ -141,7 +141,6 @@ public class TradingClearingRegistryListService extends QueueConsumer implements TradingClearingRegistryListNewRequest req = userRequest.getRequestPayload(); - Account account = accountImdg.getSingleObjectByID(req.getAccountId()); Instant now = Instant.now(); List newIds=new ArrayList<>(); @@ -153,6 +152,7 @@ public class TradingClearingRegistryListService extends QueueConsumer implements tradingClearingRegistryList.setUpdated(now); tradingClearingRegistryList.setTradingClearingRegistryId(req.getTradingClearingRegistryId()); tradingClearingRegistryList.setAccountId(currAccId); + Account account = accountImdg.getSingleObjectByID(currAccId); tradingClearingRegistryList.setCurrency(account.getCurrency()); if (req.getStatus() == null) { tradingClearingRegistryList.setStatus(ServiceStatus.Active.getKey());