From 2968cfb3d8c146cf8378cbc480be53e83bdaac7b Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Tue, 21 Apr 2026 15:59:14 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-943 --- .../dflt/management/model/SwapContext.java | 13 -------- .../management/service/ImdgQueryService.java | 33 ++++++++++++++----- .../service/OrderCalculationService.java | 8 ++--- .../service/OrderTemplateBuilder.java | 2 ++ .../service/SpotOvernightOrderService.java | 8 +++-- .../service/SwapOvernightOrderService.java | 8 +++-- 6 files changed, 41 insertions(+), 31 deletions(-) diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/model/SwapContext.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/model/SwapContext.java index 55f7a0cc6..28cfb35b1 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/model/SwapContext.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/model/SwapContext.java @@ -1,6 +1,5 @@ package ru.spcex.clearing.dflt.management.model; -import ru.clearing.classes.statics.data.misc.Listing; import ru.clearing.classes.statics.data.misc.Market; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.security.RiskParameter; @@ -9,7 +8,6 @@ public class SwapContext { private final Registry registry; private final String orderCategory; private final Market market; - private final Listing listing; private final RiskParameter riskParameter; private final CounterpartyInfo categoryP; private final CounterpartyInfo clcc; @@ -19,7 +17,6 @@ public class SwapContext { this.registry = builder.registry; this.orderCategory = builder.orderCategory; this.market = builder.market; - this.listing = builder.listing; this.riskParameter = builder.riskParameter; this.categoryP = builder.categoryP; this.clcc = builder.clcc; @@ -38,10 +35,6 @@ public class SwapContext { return market; } - public Listing getListing() { - return listing; - } - public RiskParameter getRiskParameter() { return riskParameter; } @@ -66,7 +59,6 @@ public class SwapContext { private Registry registry; private String orderCategory; private Market market; - private Listing listing; private RiskParameter riskParameter; private CounterpartyInfo categoryP; private CounterpartyInfo clcc; @@ -87,11 +79,6 @@ public class SwapContext { return this; } - public Builder listing(Listing listing) { - this.listing = listing; - return this; - } - public Builder riskParameter(RiskParameter riskParameter) { this.riskParameter = riskParameter; return this; diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/ImdgQueryService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/ImdgQueryService.java index a1f60d71a..76aed74df 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/ImdgQueryService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/ImdgQueryService.java @@ -4,6 +4,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.util.Collection; import java.util.Optional; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.company.ClearingMemberCategory; import ru.clearing.classes.statics.data.company.Company; @@ -68,7 +69,8 @@ public class ImdgQueryService { ImdgPredicateBuilder builder = registryImdg.predicateBuilder(); ImdgPredicate registryPredicate = builder.and( builder.regex("registryCode", "^PM.*T"), - builder.not(builder.equals("registryStatus", RegistryStatus.OK.getKey())) + builder.not(builder.equals("registryStatus", RegistryStatus.OK.getKey())), + builder.equals("clearingDate", LocalDate.now()) ); return registryImdg.getCollectionIdsByPredicate(registryPredicate); @@ -159,8 +161,14 @@ public class ImdgQueryService { public Listing findListing(Registry registry, String marketCode) { return "RUB".equals(registry.getSecuritySymbol()) - ? findListingForRub(registry, marketCode) - : findListingForOtherCurrency(registry, marketCode); + ? findListingForRub(registry, marketCode, null) + : findListingForOtherCurrency(registry, marketCode, null); + } + + public Listing findListing(Registry registry, String marketCode, String settleCode) { + return "RUB".equals(registry.getSecuritySymbol()) + ? findListingForRub(registry, marketCode, settleCode) + : findListingForOtherCurrency(registry, marketCode, settleCode); } public RiskParameter findRiskParameter(Registry registry) { @@ -208,9 +216,8 @@ public class ImdgQueryService { return currencyPairDictionaryImdg.getSingleObjectByID(security.getCurrencyPairId()); } - private Listing findListingForRub(Registry registry, String marketCode) { + private Listing findListingForRub(Registry registry, String marketCode, String settleCode) { ImdgPredicateBuilder pb = currencyPairDictionaryImdg.predicateBuilder(); - CurrencyPairDictionary pair = currencyPairDictionaryImdg.getFirstObjectByPredicate( pb.and( pb.equals("baseCurrency", "CNY"), @@ -218,8 +225,13 @@ public class ImdgQueryService { ) ); + ImdgPredicate settlementTypeCondition = + StringUtils.isNotEmpty(settleCode) ? pb.equals("settlementType", settleCode) : pb.alwaysTrue(); Collection securityIds = currencyPairSecurityImdg.getCollectionIdsByPredicate( - pb.equals("currencyPairId", pair.getId()) + pb.and( + pb.equals("currencyPairId", pair.getId()), + settlementTypeCondition + ) ); return listingImdg.getSingleObjectByPredicate( @@ -230,7 +242,7 @@ public class ImdgQueryService { ); } - private Listing findListingForOtherCurrency(Registry registry, String marketCode) { + private Listing findListingForOtherCurrency(Registry registry, String marketCode, String settleCode) { ImdgPredicateBuilder pb = currencyPairDictionaryImdg.predicateBuilder(); CurrencyPairDictionary pair = currencyPairDictionaryImdg.getFirstObjectByPredicate( @@ -240,8 +252,13 @@ public class ImdgQueryService { ) ); + ImdgPredicate settlementTypeCondition = + StringUtils.isNotEmpty(settleCode) ? pb.equals("settlementType", settleCode) : pb.alwaysTrue(); Collection securityIds = currencyPairSecurityImdg.getCollectionIdsByPredicate( - pb.equals("currencyPairId", pair.getId()) + pb.and( + pb.equals("currencyPairId", pair.getId()), + settlementTypeCondition + ) ); return listingImdg.getSingleObjectByPredicate( diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java index a7b4b3c27..2c92b21a8 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderCalculationService.java @@ -31,7 +31,7 @@ public class OrderCalculationService { public void calcAndEnrichSwap(OrderCurrency order, SwapContext context) { Registry registry = context.getRegistry(); - Listing listing = context.getListing(); + Listing listing = imdgQueryService.findListing(registry, context.getMarket().getCode(), order.getSettleCode()); CurrencyPairDictionary pair = imdgQueryService.getCurrencyPairDictionaryBySecurityId(listing.getSecurityId()); BigDecimal s = imdgQueryService.defineTransferRate(pair.getId(), registry.getSecuritySymbol()); @@ -51,7 +51,7 @@ public class OrderCalculationService { public void calcAndEnrichSpot(OrderCurrency order, SwapContext context) { Registry registry = context.getRegistry(); - Listing listing = context.getListing(); + Listing listing = imdgQueryService.findListing(registry, context.getMarket().getCode(), order.getSettleCode()); CurrencyPairDictionary pair = imdgQueryService.getCurrencyPairDictionaryBySecurityId(listing.getSecurityId()); BigDecimal s = imdgQueryService.defineTransferRate(pair.getId(), registry.getSecuritySymbol()); @@ -88,7 +88,7 @@ public class OrderCalculationService { BigDecimal rateValue = rates.getValue(); BigDecimal sum2 = planPositionRub.divide(rateValue, lotSize, RoundingMode.HALF_DOWN); - BigDecimal sum3 = sum1.setScale(0, RoundingMode.CEILING).min(sum2); + BigDecimal sum3 = sum1.setScale(lotSize, RoundingMode.CEILING); BigDecimal sum4 = sum3.multiply(rateValue, MC).negate(); BigDecimal sum5 = sum3.negate(); @@ -113,7 +113,7 @@ public class OrderCalculationService { BigDecimal planPositionCny = cnyRegistry.getBalance(); BigDecimal sum2 = planPositionCny.divide(rateValue, lotSize, RoundingMode.HALF_DOWN); - BigDecimal sum3 = sum1.setScale(0, RoundingMode.CEILING).min(sum2).negate(); + BigDecimal sum3 = sum1.setScale(lotSize, RoundingMode.CEILING).min(sum2).negate(); BigDecimal sum4 = sum3.multiply(rateValue, MC).negate(); BigDecimal sum5 = sum3.negate(); diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderTemplateBuilder.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderTemplateBuilder.java index 827b20664..cee16a04c 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderTemplateBuilder.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderTemplateBuilder.java @@ -1,5 +1,6 @@ package ru.spcex.clearing.dflt.management.service; +import java.time.Instant; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.misc.Listing; import ru.clearing.classes.statics.data.misc.Market; @@ -208,6 +209,7 @@ public class OrderTemplateBuilder { order.setStatus("CRET"); order.setComment(comment); order.setRegistryId(registry.getId()); + order.setCreated(Instant.now()); } private Side resolvePrimaryTransferSide(Registry registry, SettleCode settleCode) { diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SpotOvernightOrderService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SpotOvernightOrderService.java index fe6e9fba2..03c2663c1 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SpotOvernightOrderService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SpotOvernightOrderService.java @@ -3,7 +3,6 @@ package ru.spcex.clearing.dflt.management.service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.misc.Listing; import ru.clearing.classes.statics.data.misc.Market; import ru.clearing.classes.statics.data.misc.OrderCurrency; import ru.clearing.classes.statics.data.registry.Registry; @@ -12,6 +11,7 @@ import ru.spcex.clearing.dflt.management.model.CounterpartyInfo; import ru.spcex.clearing.dflt.management.model.SwapContext; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.enumeration.CompanyRole; +import ru.spcex.platform.enumeration.RegistryStatus; import ru.spcex.platform.enumeration.SettleCode; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -22,6 +22,7 @@ public class SpotOvernightOrderService { private final ImdgQueryService imdgQueryService; private final Imdg orderCurrencyImdg; + private final Imdg registryImdg; private final OrderTemplateBuilder templateBuilder; private final OrderCalculationService swapCalculationService; @@ -31,6 +32,7 @@ public class SpotOvernightOrderService { OrderCalculationService swapCalculationService) { this.imdgQueryService = imdgQueryService; this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class); + this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.templateBuilder = templateBuilder; this.swapCalculationService = swapCalculationService; } @@ -39,7 +41,6 @@ public class SpotOvernightOrderService { String orderCategory = imdgQueryService.resolveOrderCategory(registry.getCompanyId()); Market market = imdgQueryService.getSpotMarket(); - Listing listing = imdgQueryService.findListing(registry, market.getCode()); RiskParameter riskParameter = imdgQueryService.findRiskParameter(registry); CounterpartyInfo categoryP = imdgQueryService.getCompanyByClearingCategory("P"); CounterpartyInfo clcc = imdgQueryService.getCompanyByRole(CompanyRole.CLCC); @@ -49,7 +50,6 @@ public class SpotOvernightOrderService { .registry(registry) .orderCategory(orderCategory) .market(market) - .listing(listing) .riskParameter(riskParameter) .categoryP(categoryP) .clcc(clcc) @@ -86,6 +86,8 @@ public class SpotOvernightOrderService { orderCurrencyImdg.insert(primaryBalancingT1); orderCurrencyImdg.insert(counterBalancingT1); + registry.setRegistryStatus(RegistryStatus.OK.getKey()); + registryImdg.update(registry); log.info("Spot orders created for registryId={}", registry.getId()); } diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOvernightOrderService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOvernightOrderService.java index 3a7f457ce..3e4cab785 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOvernightOrderService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOvernightOrderService.java @@ -3,7 +3,6 @@ package ru.spcex.clearing.dflt.management.service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.misc.Listing; import ru.clearing.classes.statics.data.misc.Market; import ru.clearing.classes.statics.data.misc.OrderCurrency; import ru.clearing.classes.statics.data.registry.Registry; @@ -12,6 +11,7 @@ import ru.spcex.clearing.dflt.management.model.CounterpartyInfo; import ru.spcex.clearing.dflt.management.model.SwapContext; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.enumeration.CompanyRole; +import ru.spcex.platform.enumeration.RegistryStatus; import ru.spcex.platform.enumeration.SettleCode; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -22,6 +22,7 @@ public class SwapOvernightOrderService { private final ImdgQueryService imdgQueryService; private final Imdg orderCurrencyImdg; + private final Imdg registryImdg; private final OrderTemplateBuilder templateBuilder; private final OrderCalculationService swapCalculationService; @@ -31,6 +32,7 @@ public class SwapOvernightOrderService { OrderCalculationService swapCalculationService) { this.imdgQueryService = imdgQueryService; this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class); + this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.templateBuilder = templateBuilder; this.swapCalculationService = swapCalculationService; } @@ -39,7 +41,6 @@ public class SwapOvernightOrderService { String orderCategory = imdgQueryService.resolveOrderCategory(registry.getCompanyId()); Market market = imdgQueryService.getSwapMarket(); - Listing listing = imdgQueryService.findListing(registry, market.getCode()); RiskParameter riskParameter = imdgQueryService.findRiskParameter(registry); CounterpartyInfo categoryP = imdgQueryService.getCompanyByClearingCategory("P"); CounterpartyInfo clcc = imdgQueryService.getCompanyByRole(CompanyRole.CLCC); @@ -49,7 +50,6 @@ public class SwapOvernightOrderService { .registry(registry) .orderCategory(orderCategory) .market(market) - .listing(listing) .riskParameter(riskParameter) .categoryP(categoryP) .clcc(clcc) @@ -71,6 +71,8 @@ public class SwapOvernightOrderService { orderCurrencyImdg.insert(primaryBalancing); orderCurrencyImdg.insert(counterBalancing); + registry.setRegistryStatus(RegistryStatus.OK.getKey()); + registryImdg.update(registry); log.info("Swap orders created for registryId={}", registry.getId()); }