registry-service поправил ExecutionDepositLoader, ExecutionFondLoader

This commit is contained in:
AKurakin 2024-06-06 13:57:40 +03:00
parent cc87b6ec1e
commit 26ce847f37
2 changed files with 145 additions and 63 deletions

View file

@ -2,6 +2,7 @@ package ru.spcex.clearing.registry.reports.loaders;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ru.spcex.clearing.registry.conf.properties.AProperties; import ru.spcex.clearing.registry.conf.properties.AProperties;
import ru.spcex.clearing.registry.reports.ReportUtils; 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.math.BigDecimal;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -41,31 +39,39 @@ public class ExecutionDepositLoader extends IDBLoader<ExecutionDeposit> {
public List<ExecutionDeposit> loadObjects() { public List<ExecutionDeposit> loadObjects() {
try { try {
List<ExecutionDeposit> executionDeposits = super.loadObjects(); List<ExecutionDeposit> executionDeposits = super.loadObjects();
Map<Long, List<ExecutionDeposit>> groupedExecutionDepositForTKR = executionDeposits.stream()
.collect(Collectors.groupingBy(ExecutionDeposit::getTradingClearingRegistryId));
if (executionDeposits.isEmpty()) { if (executionDeposits.isEmpty()) {
log.warn("ExecutionDeposit not found."); log.warn("ExecutionDeposit not found.");
return new ArrayList<>(); return new ArrayList<>();
} }
Set<Long> tkrIds = groupedExecutionDepositForTKR.keySet();
MapSqlParameterSource parameterSource = new MapSqlParameterSource(); Map<Long, TradingClearingRegistry> tradingClearingRegistryById = new HashMap<>();
parameterSource.addValue("ids", tkrIds); {
List<TradingClearingRegistry> tradingClearingRegistries = clearingJdbc.query( Set<Long> tkrIds = executionDeposits.stream()
"select ID, CODE from TRADING_CLEARING_REGISTRY where ID in (:ids)", .filter(eDep -> eDep.getPartyTradingClearingRegistry() == null) // оптимизация; // В execution deposit они пустые
parameterSource, new TradingClearingRegistryRowMapper() .map(ExecutionDeposit::getTradingClearingRegistryId)
); .filter(Objects::nonNull)
for (TradingClearingRegistry tkr : tradingClearingRegistries) { .collect(Collectors.toSet());
List<ExecutionDeposit> executionDepositList = groupedExecutionDepositForTKR.get(tkr.getId()); tkrIds.addAll(executionDeposits.stream()
for (ExecutionDeposit deposit : executionDepositList) { .filter(eDep -> eDep.getCounterPartyTradingClearingRegistry() == null) // оптимизация // В execution deposit и fond они заполнены
deposit.setSellerTkrCode(tkr.getCode()); .map(ExecutionDeposit::getCounterPartyTradingClearingRegistryId)
.filter(Objects::nonNull)
.collect(Collectors.toSet()));
MapSqlParameterSource parameterSource = new MapSqlParameterSource();
parameterSource.addValue("ids", tkrIds);
List<TradingClearingRegistry> 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<Long, List<CompanySymbols>> companySymbolsForCompanyIdMap; Map<Long, List<CompanySymbols>> companySymbolsForCompanyIdMap;
{ {
Set<Long> companyIds = executionDeposits.stream().map(ExecutionDeposit::getCompanyId).collect(Collectors.toSet()); Set<Long> companyIds = executionDeposits.stream().map(ExecutionDeposit::getCompanyId).collect(Collectors.toSet());
parameterSource = new MapSqlParameterSource(); MapSqlParameterSource parameterSource = new MapSqlParameterSource();
parameterSource.addValue("ids", companyIds); parameterSource.addValue("ids", companyIds);
parameterSource.addValue("cs", CompanySymbol.CLRC.getKey()); parameterSource.addValue("cs", CompanySymbol.CLRC.getKey());
List<CompanySymbols> companySymbolsForCompanyId = clearingJdbc.query( List<CompanySymbols> companySymbolsForCompanyId = clearingJdbc.query(
@ -78,7 +84,7 @@ public class ExecutionDepositLoader extends IDBLoader<ExecutionDeposit> {
Map<Long, List<CompanySymbols>> companySymbolsForCounterPartyIdMap; Map<Long, List<CompanySymbols>> companySymbolsForCounterPartyIdMap;
{ {
Set<Long> counterPartyIds = executionDeposits.stream().map(ExecutionDeposit::getCounterPartyId).collect(Collectors.toSet()); Set<Long> counterPartyIds = executionDeposits.stream().map(ExecutionDeposit::getCounterPartyId).collect(Collectors.toSet());
parameterSource = new MapSqlParameterSource(); MapSqlParameterSource parameterSource = new MapSqlParameterSource();
parameterSource.addValue("ids", counterPartyIds); parameterSource.addValue("ids", counterPartyIds);
parameterSource.addValue("companySymbol", CompanySymbol.CLRC.getKey()); parameterSource.addValue("companySymbol", CompanySymbol.CLRC.getKey());
List<CompanySymbols> companySymbolsForCounterPartyId = clearingJdbc.query( List<CompanySymbols> companySymbolsForCounterPartyId = clearingJdbc.query(
@ -94,7 +100,7 @@ public class ExecutionDepositLoader extends IDBLoader<ExecutionDeposit> {
executionDeposits.stream().map(ExecutionDeposit::getCompanyId), executionDeposits.stream().map(ExecutionDeposit::getCompanyId),
executionDeposits.stream().map(ExecutionDeposit::getCounterPartyId)) executionDeposits.stream().map(ExecutionDeposit::getCounterPartyId))
.collect(Collectors.toSet()); .collect(Collectors.toSet());
parameterSource = new MapSqlParameterSource(); MapSqlParameterSource parameterSource = new MapSqlParameterSource();
parameterSource.addValue("ids", allCompanyIds); parameterSource.addValue("ids", allCompanyIds);
List<Company> companyForCompanyId = clearingJdbc.query( List<Company> companyForCompanyId = clearingJdbc.query(
"select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)", "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)",
@ -104,15 +110,18 @@ public class ExecutionDepositLoader extends IDBLoader<ExecutionDeposit> {
.collect(Collectors.toMap(Company::getId, o -> o)); .collect(Collectors.toMap(Company::getId, o -> o));
} }
Set<String> coverageStatuses = executionDeposits.stream().map(ExecutionDeposit::getCoverageStatus).collect(Collectors.toSet()); Map<String, List<AllowedDictionary>> allowedDictionariesByCode;
parameterSource = new MapSqlParameterSource(); {
parameterSource.addValue("coverageStatuses", coverageStatuses); Set<String> coverageStatuses = executionDeposits.stream().map(ExecutionDeposit::getCoverageStatus).collect(Collectors.toSet());
List<AllowedDictionary> allowedDictionaries = clearingJdbc.query( MapSqlParameterSource parameterSource = new MapSqlParameterSource();
"select * from ALLOWED_DICTIONARY where CODE in (:coverageStatuses)", parameterSource.addValue("coverageStatuses", coverageStatuses);
parameterSource, new AllowedDictionaryRowMapper() List<AllowedDictionary> allowedDictionaries = clearingJdbc.query(
); "select * from ALLOWED_DICTIONARY where CODE in (:coverageStatuses)",
Map<String, List<AllowedDictionary>> allowedDictionariesByCode = allowedDictionaries.stream() parameterSource, new AllowedDictionaryRowMapper()
.collect(Collectors.groupingBy(AllowedDictionary::getCode)); );
allowedDictionariesByCode = allowedDictionaries.stream()
.collect(Collectors.groupingBy(AllowedDictionary::getCode));
}
for (ExecutionDeposit executionDeposit : executionDeposits) { for (ExecutionDeposit executionDeposit : executionDeposits) {
Company companyByCompanyId = companyById.get(executionDeposit.getCompanyId()); Company companyByCompanyId = companyById.get(executionDeposit.getCompanyId());
@ -139,7 +148,17 @@ public class ExecutionDepositLoader extends IDBLoader<ExecutionDeposit> {
executionDeposit.setBuyerCode(companySymbols.getCompanySymbolValue()); 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)) { } else if (MoneyFlowSide.BUY.equalsByKey(side) || Side.BUY.equalsByKey(side)) {
if (companyByCompanyId != null) { if (companyByCompanyId != null) {
executionDeposit.setBuyer(companyByCompanyId.getShortName()); executionDeposit.setBuyer(companyByCompanyId.getShortName());
@ -161,7 +180,16 @@ public class ExecutionDepositLoader extends IDBLoader<ExecutionDeposit> {
executionDeposit.setSellerCode(companySymbols.getCompanySymbolValue()); 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 { } else {
log.warn("Unknown executionDeposit[{}].side={}", executionDeposit.getId(), executionDeposit.getSide()); log.warn("Unknown executionDeposit[{}].side={}", executionDeposit.getId(), executionDeposit.getSide());
} }
@ -178,6 +206,20 @@ public class ExecutionDepositLoader extends IDBLoader<ExecutionDeposit> {
} }
} }
String getTCRCodeFromValueOrById(@Nullable String tcrCode, @Nullable Long tcrId, Map<Long, TradingClearingRegistry> 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 @Override
public ExecutionDeposit fromRS(ResultSet resultSet) throws SQLException { public ExecutionDeposit fromRS(ResultSet resultSet) throws SQLException {
ExecutionDeposit object = new ExecutionDeposit(); ExecutionDeposit object = new ExecutionDeposit();

View file

@ -2,6 +2,7 @@ package ru.spcex.clearing.registry.reports.loaders;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ru.spcex.clearing.registry.conf.properties.AProperties; import ru.spcex.clearing.registry.conf.properties.AProperties;
import ru.spcex.clearing.registry.reports.ReportUtils; 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.math.BigDecimal;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -37,26 +35,34 @@ public class ExecutionFondLoader extends IDBLoader<ExecutionFond> {
return new ArrayList<>(); return new ArrayList<>();
} }
Map<Long, List<ExecutionFond>> groupedExecutionFondForTKR = executionFonds.stream() Map<Long, TradingClearingRegistry> tradingClearingRegistryById = new HashMap<>();
.collect(Collectors.groupingBy(ExecutionFond::getTradingClearingRegistryId)); {
Set<Long> tkrIds = groupedExecutionFondForTKR.keySet(); Set<Long> tkrIds = executionFonds.stream()
MapSqlParameterSource parameterSource = new MapSqlParameterSource(); .filter(eDep -> eDep.getPartyTradingClearingRegistry() == null) // оптимизация;
parameterSource.addValue("ids", tkrIds); .map(ExecutionFond::getTradingClearingRegistryId)
List<TradingClearingRegistry> tradingClearingRegistries = clearingJdbc.query( .filter(Objects::nonNull)
"select ID, CODE from TRADING_CLEARING_REGISTRY where ID in (:ids)", .collect(Collectors.toSet());
parameterSource, new TradingClearingRegistryRowMapper() tkrIds.addAll(executionFonds.stream()
); .filter(eDep -> eDep.getCounterPartyTradingClearingRegistry() == null) // оптимизация // В execution deposit и fond они заполнены
for (TradingClearingRegistry tkr : tradingClearingRegistries) { .map(ExecutionFond::getCounterPartyTradingClearingRegistryId)
List<ExecutionFond> executionFondList = groupedExecutionFondForTKR.get(tkr.getId()); .filter(Objects::nonNull)
for (ExecutionFond fond : executionFondList) { .collect(Collectors.toSet()));
fond.setSellerTkrCode(tkr.getCode());
MapSqlParameterSource parameterSource = new MapSqlParameterSource();
parameterSource.addValue("ids", tkrIds);
List<TradingClearingRegistry> 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<Long, List<CompanySymbols>> companySymbolsForCompanyIdMap; Map<Long, List<CompanySymbols>> companySymbolsForCompanyIdMap;
{ {
Set<Long> companyIds = executionFonds.stream().map(ExecutionFond::getCompanyId).collect(Collectors.toSet()); Set<Long> companyIds = executionFonds.stream().map(ExecutionFond::getCompanyId).collect(Collectors.toSet());
parameterSource = new MapSqlParameterSource(); MapSqlParameterSource parameterSource = new MapSqlParameterSource();
parameterSource.addValue("ids", companyIds); parameterSource.addValue("ids", companyIds);
parameterSource.addValue("cs", CompanySymbol.CLRC.getKey()); parameterSource.addValue("cs", CompanySymbol.CLRC.getKey());
List<CompanySymbols> companySymbolsForCompanyId = clearingJdbc.query( List<CompanySymbols> companySymbolsForCompanyId = clearingJdbc.query(
@ -69,7 +75,7 @@ public class ExecutionFondLoader extends IDBLoader<ExecutionFond> {
Map<Long, List<CompanySymbols>> companySymbolsForCounterPartyIdMap; Map<Long, List<CompanySymbols>> companySymbolsForCounterPartyIdMap;
{ {
Set<Long> counterPartyIds = executionFonds.stream().map(ExecutionFond::getCounterPartyId).collect(Collectors.toSet()); Set<Long> counterPartyIds = executionFonds.stream().map(ExecutionFond::getCounterPartyId).collect(Collectors.toSet());
parameterSource = new MapSqlParameterSource(); MapSqlParameterSource parameterSource = new MapSqlParameterSource();
parameterSource.addValue("ids", counterPartyIds); parameterSource.addValue("ids", counterPartyIds);
parameterSource.addValue("companySymbol", CompanySymbol.CLRC.getKey()); parameterSource.addValue("companySymbol", CompanySymbol.CLRC.getKey());
List<CompanySymbols> companySymbolsForCounterPartyId = clearingJdbc.query( List<CompanySymbols> companySymbolsForCounterPartyId = clearingJdbc.query(
@ -85,7 +91,7 @@ public class ExecutionFondLoader extends IDBLoader<ExecutionFond> {
executionFonds.stream().map(ExecutionFond::getCompanyId), executionFonds.stream().map(ExecutionFond::getCompanyId),
executionFonds.stream().map(ExecutionFond::getCounterPartyId)) executionFonds.stream().map(ExecutionFond::getCounterPartyId))
.collect(Collectors.toSet()); .collect(Collectors.toSet());
parameterSource = new MapSqlParameterSource(); MapSqlParameterSource parameterSource = new MapSqlParameterSource();
parameterSource.addValue("ids", allCompanyIds); parameterSource.addValue("ids", allCompanyIds);
List<Company> companyForCompanyId = clearingJdbc.query( List<Company> companyForCompanyId = clearingJdbc.query(
"select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)", "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)",
@ -95,15 +101,18 @@ public class ExecutionFondLoader extends IDBLoader<ExecutionFond> {
.collect(Collectors.toMap(Company::getId, o -> o)); .collect(Collectors.toMap(Company::getId, o -> o));
} }
Set<String> coverageStatuses = executionFonds.stream().map(ExecutionFond::getCoverageStatus).collect(Collectors.toSet()); Map<String, List<AllowedDictionary>> allowedDictionariesByCode;
parameterSource = new MapSqlParameterSource(); {
parameterSource.addValue("coverageStatuses", coverageStatuses); Set<String> coverageStatuses = executionFonds.stream().map(ExecutionFond::getCoverageStatus).collect(Collectors.toSet());
List<AllowedDictionary> allowedDictionaries = clearingJdbc.query( MapSqlParameterSource parameterSource = new MapSqlParameterSource();
"select CODE, NAME from ALLOWED_DICTIONARY where CODE in (:coverageStatuses)", parameterSource.addValue("coverageStatuses", coverageStatuses);
parameterSource, new AllowedDictionaryRowMapper() List<AllowedDictionary> allowedDictionaries = clearingJdbc.query(
); "select CODE, NAME from ALLOWED_DICTIONARY where CODE in (:coverageStatuses)",
Map<String, List<AllowedDictionary>> allowedDictionariesByCode = allowedDictionaries.stream() parameterSource, new AllowedDictionaryRowMapper()
.collect(Collectors.groupingBy(AllowedDictionary::getCode)); );
allowedDictionariesByCode = allowedDictionaries.stream()
.collect(Collectors.groupingBy(AllowedDictionary::getCode));
}
for (ExecutionFond executionFond : executionFonds) { for (ExecutionFond executionFond : executionFonds) {
Company companyByCompanyId = companyById.get(executionFond.getCompanyId()); Company companyByCompanyId = companyById.get(executionFond.getCompanyId());
@ -130,7 +139,16 @@ public class ExecutionFondLoader extends IDBLoader<ExecutionFond> {
executionFond.setBuyerCode(companySymbols.getCompanySymbolValue()); 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)) { } else if (MoneyFlowSide.BUY.equalsByKey(side) || Side.BUY.equalsByKey(side)) {
if (companyByCompanyId != null) { if (companyByCompanyId != null) {
executionFond.setBuyer(companyByCompanyId.getShortName()); executionFond.setBuyer(companyByCompanyId.getShortName());
@ -152,7 +170,16 @@ public class ExecutionFondLoader extends IDBLoader<ExecutionFond> {
executionFond.setSellerCode(companySymbols.getCompanySymbolValue()); 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 { } else {
log.warn("Unknown executionFond[{}].side={}", executionFond.getId(), executionFond.getSide()); log.warn("Unknown executionFond[{}].side={}", executionFond.getId(), executionFond.getSide());
} }
@ -168,6 +195,19 @@ public class ExecutionFondLoader extends IDBLoader<ExecutionFond> {
} }
} }
String getTCRCodeFromValueOrById(@Nullable String tcrCode, @Nullable Long tcrId, Map<Long, TradingClearingRegistry> 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 @Override
protected ExecutionFond fromRS(ResultSet resultSet) throws SQLException { protected ExecutionFond fromRS(ResultSet resultSet) throws SQLException {