From b7eeb130409a045e5fe9b233f5d7167bdf5cc896 Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 14 Apr 2026 19:09:04 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-952 --- .../management/config/ValidationConfig.java | 60 +++++++------------ .../listener/OrderCurrencyListener.java | 19 +++++- 2 files changed, 38 insertions(+), 41 deletions(-) diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/ValidationConfig.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/ValidationConfig.java index cf2b764f0..88a08e07b 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/ValidationConfig.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/ValidationConfig.java @@ -1,5 +1,6 @@ package ru.spcex.clearing.dflt.management.config; +import java.util.Optional; import java.util.function.Function; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -10,6 +11,7 @@ import ru.clearing.classes.statics.data.misc.OrderCurrency; import ru.clearing.classes.statics.data.misc.OvernightSettings; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.clearing.classes.statics.data.security.Security; import ru.clearing.platform.dictionary.OvernightTypeDictionary; import ru.spcex.clearing.dflt.management.component.validation.OrderCurrencyByCompanyAndTcrAlreadyPresent; import ru.spcex.clearing.dflt.management.component.validation.OrderCurrencyPLBLCheck; @@ -34,11 +36,13 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.specific.IdEqualPredicate; import static ru.spcex.platform.imdg.api.predicate.specific.IdEqualPredicate.byId; +import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.LogPrefixId; import ru.spcex.platform.imdg.validation.rule.PresentById; import ru.spcex.platform.imdg.validation.rule.PresentByPredicate; import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.ValidatorImpl; @@ -52,6 +56,7 @@ public class ValidationConfig { private final Imdg osTypeDictionaryImdg; private final Imdg orderCurrencyImdg; private final Imdg rgsImdg; + private final SecuritySelector secSelector; @Autowired public ValidationConfig(ImdgProvider imdgProvider) { @@ -62,6 +67,7 @@ public class ValidationConfig { this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class); this.tcrImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + this.secSelector = new SecuritySelector<>(imdgProvider, Security.class); } public enum OvernightSettingsValidationStorage { @@ -186,21 +192,6 @@ public class ValidationConfig { ctx.setValidatedObject(req); ctx.setLogPrefix(LogPrefixId.INSTANCE); ctx.addImdg(IMDGDistributedNames.Map_OrderCurrency, orderCurrencyImdg); - ctx.addImdg(IMDGDistributedNames.Map_Registry, rgsImdg); - ctx.addImdg(IMDGDistributedNames.Map_OvernightTypeDictionary, osTypeDictionaryImdg); - - //@JsonProperty - //private Long securityId; - //@JsonProperty - //private BigDecimal price; - //@JsonProperty - //private Long quantityLot; - //@JsonProperty - //private String side; - //@JsonProperty - //private String status; - //@JsonProperty - //private String comment; var orderCurrencyPresentById = PresentByPredicate .builder(byId(orderCurrencyImdg.predicateBuilder(), req)) @@ -209,34 +200,23 @@ public class ValidationConfig { .store(OrderCurrencyValidationStored.OrderCurrency) .build(); - ImdgPredicateBuilder rgsPb = rgsImdg.predicateBuilder(); - - var registryPresent = PresentByPredicate - .builder(r -> { - OrderCurrency order = ctx.getStoredObject(OrderCurrencyValidationStored.OrderCurrency); - return rgsPb.equals("id", order.getRegistryId()); - }) - .mapName(IMDGDistributedNames.Map_Registry) - .errorProvider(r -> { - OrderCurrency order = ctx.getStoredObject(OrderCurrencyValidationStored.OrderCurrency); - return recordNotFound("registry.id=" + order.getRegistryId()); - }) - .store(OrderCurrencyValidationStored.Registry) - .build(); + var securityPresent = new IValidationRule>() { + @Override + public Optional validate(ImdgValidationContext ctx) { + OrderCurrencyUpdateRequest validatedObject = ctx.getValidatedObject(); + Security security = secSelector.selectSecurityById(validatedObject.getSecurityId()); + if (security == null) { + return of(DefaultManagementErrors.RecordNotFound, "security.id=" + validatedObject.getSecurityId()); + } + return empty(); + } + }; return new ValidatorImpl<>(ctx, orderCurrencyPresentById, - OvernightTypeChanged.INSTANCE, - DictionaryPresentRule.instance( - "overnightType", - OvernightSettingsNewRequest::getOvernightType, - IMDGDistributedNames.Map_OvernightTypeDictionary, - OvernightTypeDictionary.class, - DefaultManagementErrors.RequiredFieldIsEmpty, - DefaultManagementErrors.DictionaryNotFound, - true), - SpotPairPresent.INSTANCE, - registryPresent + securityPresent + //todo SecurityId/price/quantityLot validation?/Side/status/Comment + ); }; } diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OrderCurrencyListener.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OrderCurrencyListener.java index 1f53e34fe..9a5cf9a82 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OrderCurrencyListener.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OrderCurrencyListener.java @@ -55,6 +55,7 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing private final Imdg registryImdg; private final Imdg overnightSettingsImdg; private final Imdg orderCurrencyImdg; + private final Function orderCurrencyUpdateValidator; private final Function overnightTypeUpdateValidator; private final Function orderCompanyNewValidator; private final Function orderCompanyUpdateValidator; @@ -70,6 +71,8 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing UserRoleVerification userRoleVerification, @Qualifier("orderCurrencyUpdateOvernightTypeValidator") Function overnightTypeUpdateValidator, + @Qualifier("orderCurrencyUpdateValidator") + Function orderCurrencyUpdateValidator, Function orderCompanyNewValidator, Function orderCompanyUpdateValidator, Function orderCompanyDeleteValidator, @@ -78,6 +81,7 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing super(kafkaQueue, kafkaProducer); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.overnightSettingsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OvernightSettings, OvernightSettings.class); + this.orderCurrencyUpdateValidator = orderCurrencyUpdateValidator; this.overnightTypeUpdateValidator = overnightTypeUpdateValidator; this.orderCompanyNewValidator = orderCompanyNewValidator; this.orderCompanyUpdateValidator = orderCompanyUpdateValidator; @@ -111,7 +115,20 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing private RequestInfoUpdate orderCurrencyUpdate(BaseRequest req) { OrderCurrencyUpdateRequest payload = req.getRequestPayload(); - + IValidator validator = orderCurrencyUpdateValidator.apply(payload); + Optional error = validator.tillFirstError(); + if (error.isPresent()) { + return new RequestInfoUpdate(req.getId(), Status.Error, msgResolver.resolve(error.get())); + } + OrderCurrency order = validator.getStored(OrderCurrencyValidationStored.OrderCurrency); + order.setSecurityId(payload.getSecurityId()); + order.setPrice(payload.getPrice()); + order.setQuantityLot(BigDecimal.valueOf(payload.getQuantityLot())); + order.setSide(payload.getSide()); + order.setStatus(payload.getStatus()); + order.setComment(payload.getComment()); + log.info("updating OrderCurrency[{}]", order.getId()); + orderCurrencyImdg.update(order); return null; }