From 26ce847f370dbea7f08fdf7cb2ed366ca449e154 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Thu, 6 Jun 2024 13:57:40 +0300 Subject: [PATCH] =?UTF-8?q?registry-service=20=D0=BF=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20ExecutionDepositLoader,=20ExecutionF?= =?UTF-8?q?ondLoader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../loaders/ExecutionDepositLoader.java | 106 ++++++++++++------ .../reports/loaders/ExecutionFondLoader.java | 102 ++++++++++++----- 2 files changed, 145 insertions(+), 63 deletions(-) diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionDepositLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionDepositLoader.java index c7ae2ba2d..dab1d6c9f 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionDepositLoader.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionDepositLoader.java @@ -2,6 +2,7 @@ package ru.spcex.clearing.registry.reports.loaders; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; import ru.spcex.clearing.registry.conf.properties.AProperties; import ru.spcex.clearing.registry.reports.ReportUtils; @@ -14,10 +15,7 @@ import ru.spcex.clearing.registry.reports.loaders.helpers.TradingClearingRegistr import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -41,31 +39,39 @@ public class ExecutionDepositLoader extends IDBLoader { public List loadObjects() { try { List executionDeposits = super.loadObjects(); - - Map> groupedExecutionDepositForTKR = executionDeposits.stream() - .collect(Collectors.groupingBy(ExecutionDeposit::getTradingClearingRegistryId)); if (executionDeposits.isEmpty()) { log.warn("ExecutionDeposit not found."); return new ArrayList<>(); } - Set tkrIds = groupedExecutionDepositForTKR.keySet(); - MapSqlParameterSource parameterSource = new MapSqlParameterSource(); - parameterSource.addValue("ids", tkrIds); - List tradingClearingRegistries = clearingJdbc.query( - "select ID, CODE from TRADING_CLEARING_REGISTRY where ID in (:ids)", - parameterSource, new TradingClearingRegistryRowMapper() - ); - for (TradingClearingRegistry tkr : tradingClearingRegistries) { - List executionDepositList = groupedExecutionDepositForTKR.get(tkr.getId()); - for (ExecutionDeposit deposit : executionDepositList) { - deposit.setSellerTkrCode(tkr.getCode()); + + Map tradingClearingRegistryById = new HashMap<>(); + { + Set tkrIds = executionDeposits.stream() + .filter(eDep -> eDep.getPartyTradingClearingRegistry() == null) // оптимизация; // В execution deposit они пустые + .map(ExecutionDeposit::getTradingClearingRegistryId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + tkrIds.addAll(executionDeposits.stream() + .filter(eDep -> eDep.getCounterPartyTradingClearingRegistry() == null) // оптимизация // В execution deposit и fond они заполнены + .map(ExecutionDeposit::getCounterPartyTradingClearingRegistryId) + .filter(Objects::nonNull) + .collect(Collectors.toSet())); + + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", tkrIds); + List tradingClearingRegistries = clearingJdbc.query( + "select ID, CODE from TRADING_CLEARING_REGISTRY where ID in (:ids)", + parameterSource, new TradingClearingRegistryRowMapper() + ); + for (TradingClearingRegistry tkr : tradingClearingRegistries) { + tradingClearingRegistryById.put(tkr.getId(), tkr); } } Map> companySymbolsForCompanyIdMap; { Set companyIds = executionDeposits.stream().map(ExecutionDeposit::getCompanyId).collect(Collectors.toSet()); - parameterSource = new MapSqlParameterSource(); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); parameterSource.addValue("ids", companyIds); parameterSource.addValue("cs", CompanySymbol.CLRC.getKey()); List companySymbolsForCompanyId = clearingJdbc.query( @@ -78,7 +84,7 @@ public class ExecutionDepositLoader extends IDBLoader { Map> companySymbolsForCounterPartyIdMap; { Set counterPartyIds = executionDeposits.stream().map(ExecutionDeposit::getCounterPartyId).collect(Collectors.toSet()); - parameterSource = new MapSqlParameterSource(); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); parameterSource.addValue("ids", counterPartyIds); parameterSource.addValue("companySymbol", CompanySymbol.CLRC.getKey()); List companySymbolsForCounterPartyId = clearingJdbc.query( @@ -94,7 +100,7 @@ public class ExecutionDepositLoader extends IDBLoader { executionDeposits.stream().map(ExecutionDeposit::getCompanyId), executionDeposits.stream().map(ExecutionDeposit::getCounterPartyId)) .collect(Collectors.toSet()); - parameterSource = new MapSqlParameterSource(); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); parameterSource.addValue("ids", allCompanyIds); List companyForCompanyId = clearingJdbc.query( "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)", @@ -104,15 +110,18 @@ public class ExecutionDepositLoader extends IDBLoader { .collect(Collectors.toMap(Company::getId, o -> o)); } - Set coverageStatuses = executionDeposits.stream().map(ExecutionDeposit::getCoverageStatus).collect(Collectors.toSet()); - parameterSource = new MapSqlParameterSource(); - parameterSource.addValue("coverageStatuses", coverageStatuses); - List allowedDictionaries = clearingJdbc.query( - "select * from ALLOWED_DICTIONARY where CODE in (:coverageStatuses)", - parameterSource, new AllowedDictionaryRowMapper() - ); - Map> allowedDictionariesByCode = allowedDictionaries.stream() - .collect(Collectors.groupingBy(AllowedDictionary::getCode)); + Map> allowedDictionariesByCode; + { + Set coverageStatuses = executionDeposits.stream().map(ExecutionDeposit::getCoverageStatus).collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("coverageStatuses", coverageStatuses); + List allowedDictionaries = clearingJdbc.query( + "select * from ALLOWED_DICTIONARY where CODE in (:coverageStatuses)", + parameterSource, new AllowedDictionaryRowMapper() + ); + allowedDictionariesByCode = allowedDictionaries.stream() + .collect(Collectors.groupingBy(AllowedDictionary::getCode)); + } for (ExecutionDeposit executionDeposit : executionDeposits) { Company companyByCompanyId = companyById.get(executionDeposit.getCompanyId()); @@ -139,7 +148,17 @@ public class ExecutionDepositLoader extends IDBLoader { executionDeposit.setBuyerCode(companySymbols.getCompanySymbolValue()); } } - executionDeposit.setBuyerTkrCode(executionDeposit.getCounterPartyTradingClearingRegistry()); + + executionDeposit.setBuyerTkrCode(getTCRCodeFromValueOrById( + executionDeposit.getCounterPartyTradingClearingRegistry(), // В execution deposit они заполнены + executionDeposit.getCounterPartyTradingClearingRegistryId(), + tradingClearingRegistryById + )); + executionDeposit.setSellerTkrCode(getTCRCodeFromValueOrById( + executionDeposit.getPartyTradingClearingRegistry(), + executionDeposit.getTradingClearingRegistryId(), + tradingClearingRegistryById + )); } else if (MoneyFlowSide.BUY.equalsByKey(side) || Side.BUY.equalsByKey(side)) { if (companyByCompanyId != null) { executionDeposit.setBuyer(companyByCompanyId.getShortName()); @@ -161,7 +180,16 @@ public class ExecutionDepositLoader extends IDBLoader { executionDeposit.setSellerCode(companySymbols.getCompanySymbolValue()); } } - executionDeposit.setBuyerTkrCode(executionDeposit.getPartyTradingClearingRegistry()); + executionDeposit.setBuyerTkrCode(getTCRCodeFromValueOrById( + executionDeposit.getPartyTradingClearingRegistry(), + executionDeposit.getTradingClearingRegistryId(), + tradingClearingRegistryById + )); + executionDeposit.setSellerTkrCode(getTCRCodeFromValueOrById( + executionDeposit.getCounterPartyTradingClearingRegistry(), // В execution deposit они заполнены + executionDeposit.getCounterPartyTradingClearingRegistryId(), + tradingClearingRegistryById + )); } else { log.warn("Unknown executionDeposit[{}].side={}", executionDeposit.getId(), executionDeposit.getSide()); } @@ -178,6 +206,20 @@ public class ExecutionDepositLoader extends IDBLoader { } } + String getTCRCodeFromValueOrById(@Nullable String tcrCode, @Nullable Long tcrId, Map tradingClearingRegistryById) { + if (tcrCode != null) + return tcrCode; + if (tcrId != null) { + TradingClearingRegistry tcr = tradingClearingRegistryById.get(tcrId); + if (tcr == null) { + log.warn("Can not find TCR.id={}", tcrId); + } else { + return tcr.getCode(); + } + } + return null; + } + @Override public ExecutionDeposit fromRS(ResultSet resultSet) throws SQLException { ExecutionDeposit object = new ExecutionDeposit(); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionFondLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionFondLoader.java index 4fcb487e7..6debd93e3 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionFondLoader.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionFondLoader.java @@ -2,6 +2,7 @@ package ru.spcex.clearing.registry.reports.loaders; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; import ru.spcex.clearing.registry.conf.properties.AProperties; import ru.spcex.clearing.registry.reports.ReportUtils; @@ -14,10 +15,7 @@ import ru.spcex.clearing.registry.reports.loaders.helpers.TradingClearingRegistr import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -37,26 +35,34 @@ public class ExecutionFondLoader extends IDBLoader { return new ArrayList<>(); } - Map> groupedExecutionFondForTKR = executionFonds.stream() - .collect(Collectors.groupingBy(ExecutionFond::getTradingClearingRegistryId)); - Set tkrIds = groupedExecutionFondForTKR.keySet(); - MapSqlParameterSource parameterSource = new MapSqlParameterSource(); - parameterSource.addValue("ids", tkrIds); - List tradingClearingRegistries = clearingJdbc.query( - "select ID, CODE from TRADING_CLEARING_REGISTRY where ID in (:ids)", - parameterSource, new TradingClearingRegistryRowMapper() - ); - for (TradingClearingRegistry tkr : tradingClearingRegistries) { - List executionFondList = groupedExecutionFondForTKR.get(tkr.getId()); - for (ExecutionFond fond : executionFondList) { - fond.setSellerTkrCode(tkr.getCode()); + Map tradingClearingRegistryById = new HashMap<>(); + { + Set tkrIds = executionFonds.stream() + .filter(eDep -> eDep.getPartyTradingClearingRegistry() == null) // оптимизация; + .map(ExecutionFond::getTradingClearingRegistryId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + tkrIds.addAll(executionFonds.stream() + .filter(eDep -> eDep.getCounterPartyTradingClearingRegistry() == null) // оптимизация // В execution deposit и fond они заполнены + .map(ExecutionFond::getCounterPartyTradingClearingRegistryId) + .filter(Objects::nonNull) + .collect(Collectors.toSet())); + + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", tkrIds); + List tradingClearingRegistries = clearingJdbc.query( + "select ID, CODE from TRADING_CLEARING_REGISTRY where ID in (:ids)", + parameterSource, new TradingClearingRegistryRowMapper() + ); + for (TradingClearingRegistry tkr : tradingClearingRegistries) { + tradingClearingRegistryById.put(tkr.getId(), tkr); } } Map> companySymbolsForCompanyIdMap; { Set companyIds = executionFonds.stream().map(ExecutionFond::getCompanyId).collect(Collectors.toSet()); - parameterSource = new MapSqlParameterSource(); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); parameterSource.addValue("ids", companyIds); parameterSource.addValue("cs", CompanySymbol.CLRC.getKey()); List companySymbolsForCompanyId = clearingJdbc.query( @@ -69,7 +75,7 @@ public class ExecutionFondLoader extends IDBLoader { Map> companySymbolsForCounterPartyIdMap; { Set counterPartyIds = executionFonds.stream().map(ExecutionFond::getCounterPartyId).collect(Collectors.toSet()); - parameterSource = new MapSqlParameterSource(); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); parameterSource.addValue("ids", counterPartyIds); parameterSource.addValue("companySymbol", CompanySymbol.CLRC.getKey()); List companySymbolsForCounterPartyId = clearingJdbc.query( @@ -85,7 +91,7 @@ public class ExecutionFondLoader extends IDBLoader { executionFonds.stream().map(ExecutionFond::getCompanyId), executionFonds.stream().map(ExecutionFond::getCounterPartyId)) .collect(Collectors.toSet()); - parameterSource = new MapSqlParameterSource(); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); parameterSource.addValue("ids", allCompanyIds); List companyForCompanyId = clearingJdbc.query( "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)", @@ -95,15 +101,18 @@ public class ExecutionFondLoader extends IDBLoader { .collect(Collectors.toMap(Company::getId, o -> o)); } - Set coverageStatuses = executionFonds.stream().map(ExecutionFond::getCoverageStatus).collect(Collectors.toSet()); - parameterSource = new MapSqlParameterSource(); - parameterSource.addValue("coverageStatuses", coverageStatuses); - List allowedDictionaries = clearingJdbc.query( - "select CODE, NAME from ALLOWED_DICTIONARY where CODE in (:coverageStatuses)", - parameterSource, new AllowedDictionaryRowMapper() - ); - Map> allowedDictionariesByCode = allowedDictionaries.stream() - .collect(Collectors.groupingBy(AllowedDictionary::getCode)); + Map> allowedDictionariesByCode; + { + Set coverageStatuses = executionFonds.stream().map(ExecutionFond::getCoverageStatus).collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("coverageStatuses", coverageStatuses); + List allowedDictionaries = clearingJdbc.query( + "select CODE, NAME from ALLOWED_DICTIONARY where CODE in (:coverageStatuses)", + parameterSource, new AllowedDictionaryRowMapper() + ); + allowedDictionariesByCode = allowedDictionaries.stream() + .collect(Collectors.groupingBy(AllowedDictionary::getCode)); + } for (ExecutionFond executionFond : executionFonds) { Company companyByCompanyId = companyById.get(executionFond.getCompanyId()); @@ -130,7 +139,16 @@ public class ExecutionFondLoader extends IDBLoader { executionFond.setBuyerCode(companySymbols.getCompanySymbolValue()); } } - executionFond.setBuyerTkrCode(executionFond.getCounterPartyTradingClearingRegistry()); + executionFond.setBuyerTkrCode(getTCRCodeFromValueOrById( + executionFond.getCounterPartyTradingClearingRegistry(), // В execution fond они заполнены + executionFond.getCounterPartyTradingClearingRegistryId(), + tradingClearingRegistryById + )); + executionFond.setSellerTkrCode(getTCRCodeFromValueOrById( + executionFond.getPartyTradingClearingRegistry(), + executionFond.getTradingClearingRegistryId(), + tradingClearingRegistryById + )); } else if (MoneyFlowSide.BUY.equalsByKey(side) || Side.BUY.equalsByKey(side)) { if (companyByCompanyId != null) { executionFond.setBuyer(companyByCompanyId.getShortName()); @@ -152,7 +170,16 @@ public class ExecutionFondLoader extends IDBLoader { executionFond.setSellerCode(companySymbols.getCompanySymbolValue()); } } - executionFond.setBuyerTkrCode(executionFond.getPartyTradingClearingRegistry()); + executionFond.setBuyerTkrCode(getTCRCodeFromValueOrById( + executionFond.getPartyTradingClearingRegistry(), + executionFond.getTradingClearingRegistryId(), + tradingClearingRegistryById + )); + executionFond.setSellerTkrCode(getTCRCodeFromValueOrById( + executionFond.getCounterPartyTradingClearingRegistry(), // В execution fond они заполнены + executionFond.getCounterPartyTradingClearingRegistryId(), + tradingClearingRegistryById + )); } else { log.warn("Unknown executionFond[{}].side={}", executionFond.getId(), executionFond.getSide()); } @@ -168,6 +195,19 @@ public class ExecutionFondLoader extends IDBLoader { } } + String getTCRCodeFromValueOrById(@Nullable String tcrCode, @Nullable Long tcrId, Map tradingClearingRegistryById) { + if (tcrCode != null) + return tcrCode; + if (tcrId != null) { + TradingClearingRegistry tcr = tradingClearingRegistryById.get(tcrId); + if (tcr == null) { + log.warn("Can not find TCR.id={}", tcrId); + } else { + return tcr.getCode(); + } + } + return null; + } @Override protected ExecutionFond fromRS(ResultSet resultSet) throws SQLException {