From 74ff6250e2c38af2e29ce532191412e9faa69bd5 Mon Sep 17 00:00:00 2001 From: ialbert Date: Wed, 13 May 2026 13:48:02 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-1008 --- .../management/service/ImdgQueryService.java | 4 +-- .../service/OrderCalculationService.java | 34 ++++++++----------- .../ru/spcex/platform/utils/log/LogUtil.java | 24 +++++++++++++ .../platform/utils/number/BigDecimalUtil.java | 20 +++++++++++ 4 files changed, 61 insertions(+), 21 deletions(-) create mode 100644 platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/log/LogUtil.java 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 41571b301..8e64da397 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 @@ -318,9 +318,9 @@ public class ImdgQueryService { return registryImdg.getSingleObjectByID(id); } - public Registry findRegistry(Registry pm_t, RegistryTradingParams rgsParam, String securitySymbol) { + public Collection findOTRegistry(Registry pm_t, RegistryTradingParams rgsParam, String securitySymbol) { ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); - return registryImdg.getSingleObjectByPredicate( + return registryImdg.getCollectionObjectsByPredicate( pb.and( RegistryCodeSqlBuilder.getInstance(rgsParam).buildPredicate(pb), pb.equals("securitySymbol", securitySymbol), 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 d3e07acc8..913ea2463 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 @@ -4,6 +4,7 @@ import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.time.LocalDate; +import java.util.Collection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -15,10 +16,13 @@ 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.classes.base.SpcexObjectBase; import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.enumeration.SettleCode; +import static ru.spcex.platform.utils.log.LogUtil.logColl; +import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; +import static ru.spcex.platform.utils.number.BigDecimalUtil.safeSumBD; @Service public class OrderCalculationService { @@ -120,18 +124,18 @@ public class OrderCalculationService { BigDecimal sum1 = planPosition.divide(rateValue, MC).abs(); - 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 am_t = imdgQueryService.findAmtRegistry(registry, "CNY"); + Collection om_ts = imdgQueryService.findOTRegistry(registry, RegistryTradingParams.OM_T, "CNY"); + Collection tm_ts = imdgQueryService.findOTRegistry(registry, RegistryTradingParams.TM_T, "CNY"); + log.trace("calculation for {}[{}]: AM*T[{}], OM*T[{}], TM*T[{}]", 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()); + am_t != null ? am_t.getId() : null, + logColl(om_ts, SpcexObjectBase::getId, 10), + logColl(tm_ts, SpcexObjectBase::getId, 10)); + BigDecimal planPositionCny = safeBD(am_t, Registry::getBalance) + .subtract(safeSumBD(om_ts, Registry::getBalance)) + .add(safeSumBD(tm_ts, Registry::getBalance)); BigDecimal sum2 = planPositionCny.setScale(lotSize, RoundingMode.HALF_DOWN); BigDecimal y = sum1.min(sum2); @@ -149,14 +153,6 @@ 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); diff --git a/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/log/LogUtil.java b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/log/LogUtil.java new file mode 100644 index 000000000..50ab396dd --- /dev/null +++ b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/log/LogUtil.java @@ -0,0 +1,24 @@ +package ru.spcex.platform.utils.log; + +import java.util.Collection; +import java.util.function.Function; +import java.util.stream.Collectors; + +public class LogUtil { + + public static String logColl(Collection objs, Function f, int max) { + String specificMsg = "[too many...]"; + if (objs.size() <= max) { + specificMsg = objs + .stream() + .map(f) + .map(obj -> obj != null ? obj.toString() : "null") + .collect(Collectors.joining(", ", "[", "]")); + } + return specificMsg; + } + + public static String logColl(Collection objs, Function f) { + return logColl(objs, f, 15); + } +} diff --git a/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/number/BigDecimalUtil.java b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/number/BigDecimalUtil.java index ed4e446d6..3f7257233 100644 --- a/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/number/BigDecimalUtil.java +++ b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/number/BigDecimalUtil.java @@ -1,11 +1,31 @@ package ru.spcex.platform.utils.number; import java.math.BigDecimal; +import java.util.Collection; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; import ru.spcex.platform.utils.text.TextUtil; public class BigDecimalUtil { // private final Pattern numberPattern = Pattern.compile("\\d+([.,]\\d+)?"); + public static BigDecimal safeSumBD(Collection objs, Function map) { + if (objs == null) return BigDecimal.ZERO; + return objs.stream() + .filter(Objects::nonNull) + .map(map) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add) + ; + } + + public static BigDecimal safeBD(T obj, Function map) { + return Optional + .ofNullable(obj) + .map(map) + .orElse(BigDecimal.ZERO); + } public static BigDecimal parse(String number) { if (TextUtil.isEmpty(number)) {