ialbert 2026-04-14 19:09:04 +03:00
parent ecbaecf7eb
commit b7eeb13040
2 changed files with 38 additions and 41 deletions

View file

@ -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<OvernightTypeDictionary> osTypeDictionaryImdg;
private final Imdg<OrderCurrency> orderCurrencyImdg;
private final Imdg<Registry> rgsImdg;
private final SecuritySelector<Security> 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<ImdgValidationContext<OrderCurrencyUpdateRequest>>() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<OrderCurrencyUpdateRequest> 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
);
};
}

View file

@ -55,6 +55,7 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing
private final Imdg<Registry> registryImdg;
private final Imdg<OvernightSettings> overnightSettingsImdg;
private final Imdg<OrderCurrency> orderCurrencyImdg;
private final Function<OrderCurrencyUpdateRequest, IValidator> orderCurrencyUpdateValidator;
private final Function<OrderCurrencyUpdateRequest, IValidator> overnightTypeUpdateValidator;
private final Function<OrderCompanyNewRequest, IValidator> orderCompanyNewValidator;
private final Function<OrderCompanyUpdateRequest, IValidator> orderCompanyUpdateValidator;
@ -70,6 +71,8 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing
UserRoleVerification userRoleVerification,
@Qualifier("orderCurrencyUpdateOvernightTypeValidator")
Function<OrderCurrencyUpdateRequest, IValidator> overnightTypeUpdateValidator,
@Qualifier("orderCurrencyUpdateValidator")
Function<OrderCurrencyUpdateRequest, IValidator> orderCurrencyUpdateValidator,
Function<OrderCompanyNewRequest, IValidator> orderCompanyNewValidator,
Function<OrderCompanyUpdateRequest, IValidator> orderCompanyUpdateValidator,
Function<CommonDeleteRequest, IValidator> 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<OrderCurrencyUpdateRequest> req) {
OrderCurrencyUpdateRequest payload = req.getRequestPayload();
IValidator validator = orderCurrencyUpdateValidator.apply(payload);
Optional<EnumMessage> 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;
}