From 4afb58f14085c4facfceb7dee3898c16db02e5a1 Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 12 May 2026 19:49:42 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-1008 --- .../management/service/ImdgQueryService.java | 19 +++++++++++++++ .../service/OrderCalculationService.java | 24 +++++++++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) 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 ea885fdee..41571b301 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 @@ -26,11 +26,13 @@ import ru.spcex.platform.enumeration.CompanyRole; import ru.spcex.platform.enumeration.MarketType; import ru.spcex.platform.enumeration.OrderStatus; import ru.spcex.platform.enumeration.RegistryStatus; +import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; 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.imdg.api.predicate.specific.RegistryCodeSqlBuilder; @Service public class ImdgQueryService { @@ -316,6 +318,23 @@ public class ImdgQueryService { return registryImdg.getSingleObjectByID(id); } + public Registry findRegistry(Registry pm_t, RegistryTradingParams rgsParam, String securitySymbol) { + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + return registryImdg.getSingleObjectByPredicate( + pb.and( + RegistryCodeSqlBuilder.getInstance(rgsParam).buildPredicate(pb), + pb.equals("securitySymbol", securitySymbol), + pb.or( + pb.equals("registryStatus", RegistryStatus.PROC.getKey()), + pb.equals("registryStatus", RegistryStatus.MNG.getKey()) + ), + pb.equals("tradingClearingRegistryId", pm_t.getTradingClearingRegistryId()), + pb.equals("companyId", pm_t.getCompanyId()), + pb.equals("settlementDate", LocalDate.now()) + ) + ); + } + public Registry findAmtRegistry(Registry registry, String securitySymbol) { ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); return registryImdg.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 11ac7ba71..0d6b2292f 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 @@ -15,7 +15,9 @@ import ru.clearing.platform.dictionary.CurrencyPairDictionary; import ru.spcex.clearing.dflt.management.model.CalculationResult; import ru.spcex.clearing.dflt.management.model.FinalCalculationResult; import ru.spcex.clearing.dflt.management.model.OrderCurrencyContext; +import ru.spcex.platform.classes.base.interfaces.WithId; import ru.spcex.platform.enumeration.CurrencyCode; +import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.enumeration.SettleCode; @Service @@ -117,8 +119,18 @@ public class OrderCalculationService { BigDecimal sum1 = planPosition.divide(rateValue, MC).abs(); - Registry amtRegistry = imdgQueryService.findAmtRegistry(registry, "CNY"); - BigDecimal planPositionCny = amtRegistry.getBalance(); + Registry amtRegistry = imdgQueryService.findRegistry(registry, RegistryTradingParams.AM_T, "CNY"); + Registry omt = imdgQueryService.findRegistry(registry, RegistryTradingParams.OM_T, "CNY"); + Registry tmt = imdgQueryService.findRegistry(registry, RegistryTradingParams.TM_T, "CNY"); + log.trace("calculation for {}[{}]: {}[{}], {}[{}], {}[{}]", + registry.getRegistryCode(), + registry.getId(), + logRegCode(amtRegistry), logId(amtRegistry), + logRegCode(omt), logId(omt), + logRegCode(tmt), logId(tmt)); + BigDecimal planPositionCny = amtRegistry.getBalance() + .subtract(omt.getBalance()) + .add(tmt.getBalance()); BigDecimal sum2 = planPositionCny.setScale(lotSize, RoundingMode.HALF_DOWN); BigDecimal y = sum1.min(sum2); @@ -136,6 +148,14 @@ public class OrderCalculationService { return new CalculationResult(sum1, sum2, sum3, sum4, sum5, sum6); } + private String logId(WithId obj) { + return obj != null ? String.valueOf(obj.getId()) : "null"; + } + + private String logRegCode(Registry obj) { + return obj != null ? String.valueOf(obj.getRegistryCode()) : "null"; + } + private BigDecimal swapPriceCalc(String baseCurrency, BigDecimal s, BigDecimal n, int precision) { Rates rate = imdgQueryService.getRate(baseCurrency, LocalDate.now()); BigDecimal p = n.divide(BigDecimal.valueOf(365), MC);