From 9d1a3784472a3ac0f7c94fdba53b72bdd1e126cb Mon Sep 17 00:00:00 2001 From: akulikov Date: Fri, 5 May 2023 10:45:01 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-271 TradingClearingRegistryService --- ...adingClearingRegistryValidationConfig.java | 76 ++--------------- .../TradingClearingRegistryService.java | 83 +++++++++++++------ .../platform/messaging/domain/Consts.java | 1 - 3 files changed, 62 insertions(+), 98 deletions(-) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryValidationConfig.java index 27e0c6581..b32ebb6e5 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryValidationConfig.java @@ -6,7 +6,6 @@ import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.platform.dictionary.ServiceStatusDictionary; -import ru.clearing.platform.dictionary.WorkflowStatusDictionary; import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; @@ -17,7 +16,6 @@ import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; import ru.spcex.clearing.validation.common.rules.IdPresentRule; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.enumeration.ServiceStatus; -import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.validation.IValidator; @@ -29,70 +27,6 @@ import java.util.function.Function; @Configuration public class TradingClearingRegistryValidationConfig { - @Bean("tradingClearingRegistryAutoNewRequest") - public Function tradingClearingRegistryAutoNewRequestValidator( - Map> imdgForValidation - ) { - return tradingClearingRegistryAutoNewRequest -> { - ImdgValidationContext context = new ImdgValidationContext<>(); - context.setValidatedObject(tradingClearingRegistryAutoNewRequest); - Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); - addImdg.accept(IMDGDistributedNames.Map_Company); - addImdg.accept(IMDGDistributedNames.Map_Account); - addImdg.accept(IMDGDistributedNames.Map_WorkflowStatusDictionary); - return new ValidatorImpl<>(context, - IdPresentRule.instance("companyId", - TradingClearingRegistryNewRequest::getCompanyId, - IMDGDistributedNames.Map_Company, - Company.class, - AccountError.RequiredFieldEmpty, - AccountError.CompanyNotFound), - FieldRequiredRule.instance("moneyAccountId", - TradingClearingRegistryNewRequest::getMoneyAccountId, - AccountError.RequiredFieldEmpty, - moneyAccountId -> { - Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); - Account account = accountImdg.getSingleObjectByID(moneyAccountId); - if (account == null) return AccountError.AccountNotFound; - return null; - }), - FieldRequiredRule.instance("depoAccountId", - TradingClearingRegistryNewRequest::getDepoAccountId, - AccountError.RequiredFieldEmpty, - false, - depoAccountId -> { - Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); - Account account = accountImdg.getSingleObjectByID(depoAccountId); - if (account == null) return AccountError.AccountNotFound; - return null; - }), - DictionaryPresentRule.instance("status", - TradingClearingRegistryNewRequest::getStatus, - IMDGDistributedNames.Map_ServiceStatusDictionary, - ServiceStatusDictionary.class, - AccountError.RequiredFieldEmpty, - AccountError.WrongFieldValue, - false, - statusValue -> { - Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); - Long moneyAccountId = tradingClearingRegistryAutoNewRequest.getMoneyAccountId(); - Long depoAccountId = tradingClearingRegistryAutoNewRequest.getDepoAccountId(); - Account moneyAccount = accountImdg.getSingleObjectByID(moneyAccountId); - Account depoAccount = depoAccountId != null ? accountImdg.getSingleObjectByID(depoAccountId) : null; - if ( - (depoAccount != null && (ServiceStatus.Active.equalsByKey(depoAccount.getStatus()) || ServiceStatus.Reopened.equalsByKey(depoAccount.getStatus()))) && - (ServiceStatus.Active.equalsByKey(moneyAccount.getStatus()) || ServiceStatus.Reopened.equalsByKey(moneyAccount.getStatus())) - ) { - - } - - String statusCode = statusValue.getCode(); - if (WorkflowStatus.Active.equalsByKey(statusCode)) return null; - return AccountError.WrongFieldValue; - }) - ); - }; - } @Bean("tradingClearingRegistryNewRequest") public Function tradingClearingRegistryNewRequestValidator( @@ -104,7 +38,7 @@ public class TradingClearingRegistryValidationConfig { Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_Company); addImdg.accept(IMDGDistributedNames.Map_Account); - addImdg.accept(IMDGDistributedNames.Map_WorkflowStatusDictionary); + addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); return new ValidatorImpl<>(context, IdPresentRule.instance("companyId", TradingClearingRegistryNewRequest::getCompanyId, @@ -131,6 +65,8 @@ public class TradingClearingRegistryValidationConfig { if (account == null) return AccountError.AccountNotFound; return null; }), + // todo на будущее: нужна ли эта проверка, если при добавлении регистра статус заполняется автоматически + // на основе полей moneyAccountId и depoAccountId, то же касается TradingClearingRegistryNewRequest, нужно ли там поле status DictionaryPresentRule.instance("status", TradingClearingRegistryNewRequest::getStatus, IMDGDistributedNames.Map_ServiceStatusDictionary, @@ -155,7 +91,7 @@ public class TradingClearingRegistryValidationConfig { ImdgValidationContext context = new ImdgValidationContext<>(); context.setValidatedObject(tradingClearingRegistryUpdateRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); - addImdg.accept(IMDGDistributedNames.Map_WorkflowStatusDictionary); + addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry); return new ValidatorImpl<>(context, IdPresentRule.instance("id", @@ -166,8 +102,8 @@ public class TradingClearingRegistryValidationConfig { AccountError.TradingClearingRegistryNotFound), DictionaryPresentRule.instance("status", TradingClearingRegistryUpdateRequest::getStatus, - IMDGDistributedNames.Map_WorkflowStatusDictionary, - WorkflowStatusDictionary.class, + IMDGDistributedNames.Map_ServiceStatusDictionary, + ServiceStatusDictionary.class, AccountError.RequiredFieldEmpty, AccountError.WrongFieldValue, false) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryService.java index cec060ea0..c4855b536 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryService.java @@ -7,10 +7,12 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.ClearingAccount; import ru.clearing.classes.statics.data.account.DepoAccount; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -19,15 +21,20 @@ import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingR import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryUpdateRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.platform.messaging.service.Status; import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.validation.common.ValidationHelper; +import ru.spcex.platform.enumeration.ServiceStatus; import ru.spcex.platform.enumeration.TradingClearingRegistryPurpose; -import ru.spcex.platform.enumeration.WorkflowStatus; 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.enumeration.IMessageResolver; import ru.spcex.platform.utils.validation.IValidator; import java.time.Instant; +import java.util.Arrays; +import java.util.List; import java.util.function.Function; @Service @@ -40,23 +47,27 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini private final Imdg tradingClearingRegistryImdg; private final Imdg depoAccountImdg; private final Imdg clearingAccountImdg; + private final Imdg accountImdg; private final Imdg companyImdg; private final Function tradingClearingRegistryUpdateRequestValidator; private final Function tradingClearingRegistryNewRequestValidator; private final Function tradingClearingRegistryBlockRequestValidator; + private final IMessageResolver messageResolver; + public TradingClearingRegistryService(Consumer kafkaQueue, Producer kafkaProducer, ImdgProvider imdgProvider, ValidationHelper validationHelper, UserRoleVerification userRoleVerification, + IMessageResolver messageResolver, @Qualifier("tradingClearingRegistryNewRequest") Function tradingClearingRegistryNewRequestValidator, @Qualifier("tradingClearingRegistryUpdateRequest") Function tradingClearingRegistryUpdateRequestValidator, @Qualifier("tradingClearingRegistryBlockRequest") - Function tradingClearingRegistryBlockRequestValidator) { + Function tradingClearingRegistryBlockRequestValidator) { super(kafkaQueue, kafkaProducer); this.validationHelper = validationHelper; this.userRoleVerification = userRoleVerification; @@ -67,16 +78,15 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini this.depoAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class); this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class); this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); this.tradingClearingRegistryUpdateRequestValidator = tradingClearingRegistryUpdateRequestValidator; this.tradingClearingRegistryBlockRequestValidator = tradingClearingRegistryBlockRequestValidator; + this.messageResolver = messageResolver; } @Override public void afterPropertiesSet() throws Exception { init(); - callback(TradingClearingRegistryNewRequest.class) - .setConsumer(this::tradingClearingRegistryAutoNew) - .forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_AUTO_NEW, callbacks::put); callback(TradingClearingRegistryNewRequest.class) .setConsumer(this::tradingClearingRegistryNew) .forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_NEW, callbacks::put); @@ -88,18 +98,8 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini .forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_BLOCK, callbacks::put); } - public RequestInfoUpdate tradingClearingRegistryAutoNew(BaseRequest userRequest) { - log.debug("TradingClearingRegistryAutoNewRequest received"); - - - - Long id = null; - log.debug("successfully processed, id {}", id); - return null; - } - public RequestInfoUpdate tradingClearingRegistryNew(BaseRequest userRequest) { - log.debug("TradingClearingRegistryNewRequest received"); + log.debug("TradingClearingRegistryAutoNewRequest received"); RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); if (requestInfoUpdate != null) return requestInfoUpdate; @@ -114,18 +114,46 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini tradingClearingRegistry.setCompanyId(req.getCompanyId()); tradingClearingRegistry.setMoneyAccountId(req.getMoneyAccountId()); tradingClearingRegistry.setDepoAaccountId(req.getDepoAccountId()); - tradingClearingRegistry.setStatus(WorkflowStatus.Active.getKey()); - // todo tradingClearingRegistryType из соответствующего параметра очереди но в запросе он не фигурирует - // пока оставил вычисление аналогичное автоматическому добавлению ТКР - String tradingRegistryType; - if (req.getDepoAccountId() != null) { - DepoAccount depoAccount = depoAccountImdg.getSingleObjectByID(req.getDepoAccountId()); - tradingRegistryType = depoAccount.getDepoAccountType(); + DepoAccount depoAccount = req.getDepoAccountId() != null ? depoAccountImdg.getSingleObjectByID(req.getDepoAccountId()) : null; + Account depoAccountMain = depoAccount != null ? accountImdg.getSingleObjectByID(depoAccount.getAccountId()) : null; + + ClearingAccount clearingAccount = clearingAccountImdg.getSingleObjectByID(req.getMoneyAccountId()); + Account clearingAccountMain = accountImdg.getSingleObjectByID(clearingAccount.getAccountId()); + + List activeStatuses = Arrays.asList(ServiceStatus.Active.getKey(), ServiceStatus.Reopened.getKey()); + String status = null; + if (depoAccountMain != null) { + if (activeStatuses.contains(depoAccountMain.getStatus()) && activeStatuses.contains(clearingAccountMain.getStatus())) + status = ServiceStatus.Active.getKey(); + if (depoAccountMain.getStatus().equals(ServiceStatus.Blocked.getKey()) || clearingAccountMain.getStatus().equals(ServiceStatus.Blocked.getKey())) + status = ServiceStatus.Blocked.getKey(); + if (depoAccountMain.getStatus().equals(ServiceStatus.Suspended.getKey()) || clearingAccountMain.getStatus().equals(ServiceStatus.Suspended.getKey())) + status = ServiceStatus.Suspended.getKey(); + if (depoAccountMain.getStatus().equals(ServiceStatus.Closed.getKey()) || clearingAccountMain.getStatus().equals(ServiceStatus.Closed.getKey())) + status = ServiceStatus.Closed.getKey(); } else { - ClearingAccount clearingAccount = clearingAccountImdg.getSingleObjectByID(req.getMoneyAccountId()); - tradingRegistryType = clearingAccount.getClearingAccountType(); + if (activeStatuses.contains(clearingAccountMain.getStatus())) + status = ServiceStatus.Active.getKey(); + if (clearingAccountMain.getStatus().equals(ServiceStatus.Blocked.getKey())) + status = ServiceStatus.Blocked.getKey(); + if (clearingAccountMain.getStatus().equals(ServiceStatus.Suspended.getKey())) + status = ServiceStatus.Suspended.getKey(); + if (clearingAccountMain.getStatus().equals(ServiceStatus.Closed.getKey())) + status = ServiceStatus.Closed.getKey(); } + if (status == null) { + String errMsg = messageResolver.resolve(new EnumMessage(AccountError.WrongFieldValue, req.getMoneyAccountId())); + return new RequestInfoUpdate() + .setStatus(Status.Error) + .setMessage(errMsg) + .setId(userRequest.getId()); + } + tradingClearingRegistry.setStatus(status); + + String tradingRegistryType; + if (depoAccount != null) tradingRegistryType = depoAccount.getDepoAccountType(); + else tradingRegistryType = clearingAccount.getClearingAccountType(); tradingClearingRegistry.setTradingClearingRegistryType(tradingRegistryType); TradingClearingRegistryPurpose registryPurpose; @@ -134,7 +162,8 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini tradingClearingRegistry.setTradingClearingRegistryPurpose(registryPurpose.getKey()); Company company = companyImdg.getSingleObjectByID(req.getCompanyId()); - String code = company.getClearingCode() + registryPurpose.getKey() + registryPurpose; + String code = "%4s".formatted(company.getClearingCode()).replace(' ', '0'); + code += registryPurpose.getKey(); if (registryPurpose == TradingClearingRegistryPurpose.C) code += tradingRegistryType + id; else code += "AT" + id; tradingClearingRegistry.setCode(code); @@ -182,7 +211,7 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini CommonDeleteRequest req = userRequest.getRequestPayload(); TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryImdg.getSingleObjectByID(req.getId()); - tradingClearingRegistry.setStatus(WorkflowStatus.Blocked.getKey()); + tradingClearingRegistry.setStatus(ServiceStatus.Blocked.getKey()); tradingClearingRegistryImdg.update(tradingClearingRegistry); diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index d6b06bcf7..c250e2a6e 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -81,7 +81,6 @@ public interface Consts { String DESTINATION_CLIENT_CODE_UPDATE = "client-code-update"; String DESTINATION_CLIENT_CODE_DELETE = "client-code-delete"; - String DESTINATION_TRADING_CLEARING_REGISTRY_AUTO_NEW = "trading-clearing-registry-auto-new"; String DESTINATION_TRADING_CLEARING_REGISTRY_NEW = "trading-clearing-registry-new"; String DESTINATION_TRADING_CLEARING_REGISTRY_UPDATE = "trading-clearing-registry-update"; String DESTINATION_TRADING_CLEARING_REGISTRY_BLOCK = "trading-clearing-registry-block";