diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml index 3eb65f449..c35426eac 100644 --- a/clearing-parent/reports-service/pom.xml +++ b/clearing-parent/reports-service/pom.xml @@ -132,6 +132,15 @@ spring-boot-test test + + com.mchange + c3p0 + + + org.postgresql + postgresql + 42.7.3 + diff --git a/clearing-parent/reports-service/readme.md b/clearing-parent/reports-service/readme.md index 4ab9323ef..3aca42cba 100644 --- a/clearing-parent/reports-service/readme.md +++ b/clearing-parent/reports-service/readme.md @@ -4,7 +4,7 @@ report-service Сервис для генерации отчётов. -Формат xml, docx. +Формат xml, docx, csv. Параметры запуска @@ -12,6 +12,7 @@ report-service --spring.config.location= путь к папке с файлом настроек application.properties --console - признак, что надо запуститься не как сервис, слушающий очередь kafka, а как утилита для генерации отчётов за текущий день/месяц и выключиться. +-Dspring.profiles.active=dev - позволяет выгружать данные из БД в обход IMDG (нужны соответствующие настройки подключения) По умолчанию запускается в режиме сервиса. @@ -48,6 +49,8 @@ DAILY - все ежедневные reports-service.kafka-consumer - группа настроек для подключения к очереди kafka + reports-service.direct-db - группа настроек для подключения к базе (если нужно получать данные напрямую из БД в обход IMDG) + и другие настройки. Рабочие папки diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java index 0492bb849..52594c333 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java @@ -4,10 +4,12 @@ import org.apache.commons.lang3.exception.ExceptionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.ConfigurableApplicationContext; -@SpringBootApplication +//@SpringBootApplication +@SpringBootApplication(exclude={DataSourceAutoConfiguration.class}) public class ReportsServiceApplication { public static void main(String[] args) { try { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/CSVReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/CSVReportBuilder.java index 53a3b4243..2e71182e7 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/CSVReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/CSVReportBuilder.java @@ -1,20 +1,5 @@ package ru.spcex.clearing.reports.builders; -import com.opencsv.CSVWriter; -import com.opencsv.ICSVWriter; -import com.opencsv.bean.*; -import com.opencsv.exceptions.CsvBadConverterException; -import com.opencsv.exceptions.CsvChainedException; -import com.opencsv.exceptions.CsvFieldAssignmentException; -import com.opencsv.exceptions.CsvRequiredFieldEmptyException; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import ru.clearing.classes.statics.data.misc.Session; -import ru.spcex.platform.enumeration.ReportBuilderType; -import ru.spcex.platform.enumeration.ReportKeys; -import ru.spcex.platform.imdg.api.Imdg; - import java.io.File; import java.io.FileWriter; import java.io.IOException; @@ -26,8 +11,34 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.util.*; +import java.util.Collection; +import java.util.List; +import java.util.Locale; +import java.util.Set; import java.util.stream.Collectors; +import com.opencsv.CSVWriter; +import com.opencsv.ICSVWriter; +import com.opencsv.bean.AbstractCsvConverter; +import com.opencsv.bean.BeanField; +import com.opencsv.bean.ColumnPositionMappingStrategy; +import com.opencsv.bean.ConverterNumber; +import com.opencsv.bean.CsvBindByName; +import com.opencsv.bean.CsvBindByPosition; +import com.opencsv.bean.CsvConverter; +import com.opencsv.bean.CsvNumber; +import com.opencsv.bean.StatefulBeanToCsv; +import com.opencsv.bean.StatefulBeanToCsvBuilder; +import com.opencsv.exceptions.CsvBadConverterException; +import com.opencsv.exceptions.CsvChainedException; +import com.opencsv.exceptions.CsvFieldAssignmentException; +import com.opencsv.exceptions.CsvRequiredFieldEmptyException; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.clearing.classes.statics.data.misc.Session; +import ru.spcex.platform.enumeration.ReportBuilderType; +import ru.spcex.platform.enumeration.ReportKeys; +import ru.spcex.platform.imdg.api.Imdg; /** * Класс для построения отчетов в формате CSV @@ -136,10 +147,8 @@ public abstract class CSVReportBuilder { } protected List getSessionIdsForCurrentDate(Imdg sessionImdg) { - Collection sessionForCurrentDay = sessionImdg.getCollectionObjectsByFieldValues( - Map.of( - "clearingDate", LocalDate.now() - ) + Collection sessionForCurrentDay = sessionImdg.getCollectionObjectsByPredicate( + sessionImdg.predicateBuilder().equals("clearingDate", LocalDate.now()) ); Set sessionIds = sessionForCurrentDay.stream().map(Session::getId).collect(Collectors.toSet()); return sessionIds.stream().toList(); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java index 09f2b6b67..ad9fb91aa 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java @@ -1,5 +1,11 @@ package ru.spcex.clearing.reports.builders.ks; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.company.Company; @@ -10,7 +16,16 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.reports.builders.CSVReportBuilder; import ru.spcex.clearing.reports.builders.EmptyParams; import ru.spcex.clearing.reports.builders.bean.KSCommissionTradesReport; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.MarketCode; +import ru.spcex.platform.enumeration.RegistryStatus; +import ru.spcex.platform.enumeration.RegistryTradingParams; +import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.enumeration.ReportBuilderType; +import ru.spcex.platform.enumeration.ReportKeys; +import ru.spcex.platform.enumeration.Section; +import ru.spcex.platform.enumeration.SessionType; +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; @@ -18,14 +33,6 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.utils.enumeration.IEnumKey; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - @Component public class KSCommissionTradesReportBuilder extends CSVReportBuilder { protected DateTimeFormatter dateFormatter_ddMMyy = DateTimeFormatter.ofPattern("ddMMyy"); @@ -81,9 +88,9 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder registryImdg; private final Imdg sessionImdg; private final Imdg accountImdg; - private final Imdg currencyPairDictionaryImdg; - private final Imdg currencyPairSecurityImdg; private List rows = null; @@ -49,8 +45,6 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder sessionIds = params.getSessionId(); if (sessionIds == null || sessionIds.isEmpty()) sessionIds = getSessionIdsForCurrentDate(sessionImdg); ImdgPredicate finalPredicate = pb.and( pb.in("sessionId", sessionIds.toArray(new Long[0])), pb.equals("clearingDate", nowDate), - pb.sql(sql), + registryPredicate, pb.or( pb.equals("accountType", AccountType.Clrn.getKey()), pb.equals("accountType", AccountType.Info.getKey()) @@ -181,11 +175,13 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate); log.debug("Found {} registries by query: {}", registries.size(), finalPredicate); @@ -121,10 +119,12 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder sessionsForDay = sessionImdg.getCollectionObjectsByFieldValues(Map.of("clearingDate", LocalDate.now())); + Collection sessionsForDay = sessionImdg.getCollectionObjectsByPredicate( + sessionImdg.predicateBuilder().equals("clearingDate", LocalDate.now()) + ); Long[] sessionIds = sessionsForDay.stream().map(Session::getId).toArray(Long[]::new); ImdgPredicate cmtPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CM_T).buildPredicate(pb); Collection cmtRegistries = registryImdg.getCollectionObjectsByPredicate( @@ -171,8 +176,8 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder clearingMemberCategory = clearingMemberCategoryImdg.getCollectionObjectsByFieldValues( - Map.of("companyId", counterPartyId) + Collection clearingMemberCategory = clearingMemberCategoryImdg.getCollectionObjectsByPredicate( + clearingMemberCategoryImdg.predicateBuilder().equals("companyId", counterPartyId) ); if (!clearingMemberCategory.isEmpty()) { ClearingMemberCategory next = clearingMemberCategory.iterator().next(); @@ -203,8 +208,8 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder { Long counterPartyId = reg.getCounterPartyId(); if (counterPartyId != null) { - Collection clearingMemberCategory = clearingMemberCategoryImdg.getCollectionObjectsByFieldValues( - Map.of("companyId", counterPartyId) + Collection clearingMemberCategory = clearingMemberCategoryImdg.getCollectionObjectsByPredicate( + clearingMemberCategoryImdg.predicateBuilder().equals("companyId", counterPartyId) ); if (!clearingMemberCategory.isEmpty()) { ClearingMemberCategory next = clearingMemberCategory.iterator().next(); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepDepoNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepDepoNettoReportBuilder.java index 0b5570f3b..4c3aa3d89 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepDepoNettoReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepDepoNettoReportBuilder.java @@ -1,5 +1,14 @@ package ru.spcex.clearing.reports.builders.ks; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.account.AccountSymbols; @@ -10,19 +19,17 @@ import ru.spcex.clearing.reports.builders.CSVReportBuilder; import ru.spcex.clearing.reports.builders.PairRegistry3Id; import ru.spcex.clearing.reports.builders.SessionIdParam; import ru.spcex.clearing.reports.builders.bean.KSRepDepoNettoReport; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryTradingParams; +import ru.spcex.platform.enumeration.ReportBuilderType; +import ru.spcex.platform.enumeration.ReportKeys; 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; -import java.math.BigDecimal; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.*; -import java.util.stream.Collectors; - @Component public class KSRepDepoNettoReportBuilder extends CSVReportBuilder { private final Imdg registryImdg; @@ -69,11 +76,11 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder sessionIds = params.getSessionId(); if (sessionIds == null || sessionIds.isEmpty()) sessionIds = getSessionIdsForCurrentDate(sessionImdg); - String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CS_T, RegistryTradingParams.LS_T).build(); + ImdgPredicate registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CS_T, RegistryTradingParams.LS_T).buildPredicate(pb); ImdgPredicate finalPredicate = pb.and( pb.in("sessionId", sessionIds.toArray(new Long[0])), pb.equals("clearingDate", nowDate), - pb.sql(sql), + registryPredicate, pb.equals("accountType", AccountType.Depo.getKey()), pb.notNull("account") ); @@ -130,7 +137,9 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder registryImdg; private final Imdg companyImdg; private final Imdg accountSymbolsImdg; - private final Imdg currencyPairDictionaryImdg; - private final Imdg currencyPairSecurityImdg; private List rows = null; @@ -48,8 +43,6 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder { private final Imdg registryImdg; @@ -98,7 +101,9 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder companies = companyImdg.getCollectionObjectsByFieldValues(Map.of("workflowStatus", WorkflowStatus.Active.getKey())); + Collection companies = companyImdg.getCollectionObjectsByPredicate( + companyImdg.predicateBuilder().equals("workflowStatus", WorkflowStatus.Active.getKey()) + ); log.debug("Found {} Company", companies.size()); rows = new ArrayList<>(companies.size()); for (Company company : companies) { try { - CompanySymbols innCompanySymbol = companySymbolsImdg.getFirstObjectByFieldValues( - Map.of( - "companyId", company.getId(), - "companySymbol", CompanySymbol.INN.getKey() - ) + ImdgPredicateBuilder pb = companySymbolsImdg.predicateBuilder(); + CompanySymbols innCompanySymbol = companySymbolsImdg.getFirstObjectByPredicate( + pb.and( + pb.equals("companyId", company.getId()), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ) ); - CompanySymbols cppCompanySymbol = companySymbolsImdg.getFirstObjectByFieldValues( - Map.of( - "companyId", company.getId(), - "companySymbol", CompanySymbol.CPP.getKey() - ) + CompanySymbols cppCompanySymbol = companySymbolsImdg.getFirstObjectByPredicate( + pb.and( + pb.equals("companyId", company.getId()), + pb.equals("companySymbol", CompanySymbol.CPP.getKey()) + ) ); - ProfileDocument profileDocument = profileDocumentImdg.getFirstObjectByFieldValues( - Map.of( - "companyId", company.getId(), - "documentType", DocumentTypes.cntr.getKey() - ) + pb = profileDocumentImdg.predicateBuilder(); + ProfileDocument profileDocument = profileDocumentImdg.getFirstObjectByPredicate( + pb.and( + pb.equals("companyId", company.getId()), + pb.equals("documentType", DocumentTypes.cntr.getKey()) + ) ); KSRepFirmDetailsReport ksRepFirmDetailsReport = new KSRepFirmDetailsReport(); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java index 36236c6f6..3bde5b548 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java @@ -38,6 +38,7 @@ import ru.spcex.platform.enumeration.ReportKeys; import ru.spcex.platform.enumeration.Side; 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; import ru.spcex.platform.utils.enumeration.IEnumKey; @@ -144,7 +145,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder registryCollection = registryImdg.getCollectionObjectsByPredicate( pbRegistry.and( pbRegistry.equals("groupId", groupId), @@ -154,7 +155,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder { @@ -55,9 +54,9 @@ public class KSSessionListReportBuilder extends CSVReportBuilder query = Map.of("clearingDate", LocalDate.now()); - Collection sessions = sessionImdg.getCollectionObjectsByFieldValues(query); - log.debug("Found {} Session by query: {}", sessions.size(), query); + ImdgPredicate predicate = sessionImdg.predicateBuilder().equals("clearingDate", LocalDate.now()); + Collection sessions = sessionImdg.getCollectionObjectsByPredicate(predicate); + log.debug("Found {} Session by query: {}", sessions.size(), predicate.toString()); rows = new ArrayList<>(sessions.size()); for (Session session : sessions) { try { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ClearingImdgConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ClearingImdgConfig.java index 27de4b75c..51c3d943d 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ClearingImdgConfig.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ClearingImdgConfig.java @@ -1,47 +1,48 @@ package ru.spcex.clearing.reports.config; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; +import java.beans.PropertyVetoException; +import com.mchange.v2.c3p0.ComboPooledDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import ru.spcex.clearing.reports.config.settings.ReportsServiceSettings; +import ru.spcex.clearing.reports.db_direct.DBProvider; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; @Configuration public class ClearingImdgConfig { - private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) { - ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); - if (maxPoolSz > 2) { - pool.setKeepAliveSeconds(60); - pool.setAllowCoreThreadTimeOut(true); - } - pool.setCorePoolSize(maxPoolSz); - pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion); - return pool; - } - - @Bean(name = "taskExecutorHazelcastClientInitializer") - public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() { - return createThreadPoolTaskExecutor(1, true); - } - - @Bean(name = "taskExecutorIdGeneratorAwaiter") - public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() { - return createThreadPoolTaskExecutor(1, false); - } - - @Autowired @Bean - public ImdgProvider imdgProvider( - @Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer, - @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, - ReportsServiceSettings settings - ) { - return new HazelcastService(taskExecutorHazelcastClientInitializer, - taskExecutorIdGeneratorAwaiter, - settings.getHazelcast()); + public ImdgProvider imdgProvider(ReportsServiceSettings settings, Environment env) throws PropertyVetoException { + String[] activeProfiles = env.getActiveProfiles(); + boolean isDevProfile = false; + for (String profile : activeProfiles) { + if (profile.equalsIgnoreCase("DEV")) { + isDevProfile = true; + break; + } + } + if (!isDevProfile) { + ThreadPoolTaskExecutor hazelcastClientInitializerPool = new ThreadPoolTaskExecutor(); + hazelcastClientInitializerPool.setCorePoolSize(1); + hazelcastClientInitializerPool.setWaitForTasksToCompleteOnShutdown(true); + ThreadPoolTaskExecutor idGeneratorAwaiterPool = new ThreadPoolTaskExecutor(); + idGeneratorAwaiterPool.setCorePoolSize(1); + idGeneratorAwaiterPool.setWaitForTasksToCompleteOnShutdown(false); + return new HazelcastService(hazelcastClientInitializerPool, idGeneratorAwaiterPool, settings.getHazelcast()); + } else { + ComboPooledDataSource dataSource = new ComboPooledDataSource(); + dataSource.setDriverClass(settings.getDirectDb().getDriver()); + dataSource.setJdbcUrl(settings.getDirectDb().getUrl()); + dataSource.setUser(settings.getDirectDb().getLogin()); + dataSource.setPassword(settings.getDirectDb().getPassword()); + dataSource.setMinPoolSize(Integer.parseInt(settings.getDirectDb().getMinPoolSize())); + dataSource.setMaxPoolSize(Integer.parseInt(settings.getDirectDb().getMaxPoolSize())); + JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); + return new DBProvider(jdbcTemplate); + } } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java index 2ed531e19..5bcafa140 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java @@ -9,6 +9,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.kafka.core.ProducerFactory; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory; import ru.spcex.clearing.platform.messaging.config.KafkaProducerFactory; @@ -16,9 +17,11 @@ import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings import ru.spcex.clearing.platform.messaging.service.RequestInfo; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.reports.config.settings.ReportsServiceSettings; +import ru.spcex.clearing.reports.db_direct.DBProvider; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; @Configuration public class KafkaConfig { @@ -48,14 +51,26 @@ public class KafkaConfig { @Autowired @Bean - public KafkaSender kafkaSender(KafkaTemplate kafkaTemplate, ImdgProvider imdgProvider) { - ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator(); + public KafkaSender kafkaSender(KafkaTemplate kafkaTemplate, ImdgProvider imdgProvider, ReportsServiceSettings settings) { + final ImdgProvider provider; + if (imdgProvider instanceof DBProvider) { + ThreadPoolTaskExecutor hazelcastClientInitializerPool = new ThreadPoolTaskExecutor(); + hazelcastClientInitializerPool.setCorePoolSize(1); + hazelcastClientInitializerPool.setWaitForTasksToCompleteOnShutdown(true); + ThreadPoolTaskExecutor idGeneratorAwaiterPool = new ThreadPoolTaskExecutor(); + idGeneratorAwaiterPool.setCorePoolSize(1); + idGeneratorAwaiterPool.setWaitForTasksToCompleteOnShutdown(false); + provider = new HazelcastService(hazelcastClientInitializerPool, idGeneratorAwaiterPool, settings.getHazelcast()); + } else { + provider = imdgProvider; + } + ImdgId imdgIdGenerator = provider.getImdgIdGenerator(); return KafkaSender .setup() .setKafkaTemplate(kafkaTemplate) .idGenerator(imdgIdGenerator::nextId) .imdgProvider(s -> { - Imdg imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class); + Imdg imdg = provider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class); return imdg::insert; }) .build(); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/settings/DirectDB.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/settings/DirectDB.java new file mode 100644 index 000000000..281147ae3 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/settings/DirectDB.java @@ -0,0 +1,58 @@ +package ru.spcex.clearing.reports.config.settings; + +public class DirectDB { + private String login; + private String password; + private String url; + private String driver; + private String minPoolSize; + private String maxPoolSize; + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getMinPoolSize() { + return minPoolSize; + } + + public void setMinPoolSize(String minPoolSize) { + this.minPoolSize = minPoolSize; + } + + public String getMaxPoolSize() { + return maxPoolSize; + } + + public void setMaxPoolSize(String maxPoolSize) { + this.maxPoolSize = maxPoolSize; + } + + public String getDriver() { + return driver; + } + + public void setDriver(String driver) { + this.driver = driver; + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/settings/ReportsServiceSettings.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/settings/ReportsServiceSettings.java index 160a3f9ae..69bfa7ba0 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/settings/ReportsServiceSettings.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/settings/ReportsServiceSettings.java @@ -1,5 +1,6 @@ package ru.spcex.clearing.reports.config.settings; +import java.util.List; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; @@ -8,8 +9,6 @@ import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings; import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; -import java.util.List; - @Component @PropertySource("file:${spring.config.location}/application.properties") @ConfigurationProperties("reports-service") @@ -19,6 +18,7 @@ public class ReportsServiceSettings { private KafkaProducerSettings kafkaProducer; private Store reportsStore; private Store notificationsStore; + private DirectDB directDb; @Value("#{'${reports-service.reports.pfx-class-codes}'.split('\\s*,\\s*')}") private List pfxClassCodes; @@ -71,4 +71,12 @@ public class ReportsServiceSettings { public void setPfxClassCodes(List pfxClassCodes) { this.pfxClassCodes = pfxClassCodes; } + + public DirectDB getDirectDb() { + return directDb; + } + + public void setDirectDb(DirectDB directDb) { + this.directDb = directDb; + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBMap.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBMap.java index bd085ef57..11cdd9701 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBMap.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBMap.java @@ -1,18 +1,39 @@ package ru.spcex.clearing.reports.db_direct; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.sql.Date; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Time; +import java.sql.Timestamp; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; public class DBMap implements Imdg { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final DateTimeFormatter localDateFormatter = DateTimeFormatter.ISO_LOCAL_DATE; + private final DateTimeFormatter localTimeFormatter = DateTimeFormatter.ISO_LOCAL_TIME; + private final DateTimeFormatter localDateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; + private final Class clazz; private final Map fieldMatcherMap; private final String tableName; private final JdbcTemplate jdbcTemplate; - private final Class clazz; + private final ReflectionRowMapper reflectionRowMapper; public DBMap(Map fieldMatcherMap, String tableName, @@ -21,23 +42,47 @@ public class DBMap implements Imdg { this.tableName = tableName; this.jdbcTemplate = jdbcTemplate; this.clazz = clazz; + reflectionRowMapper = new ReflectionRowMapper<>(clazz, fieldMatcherMap); } @Override public T getSingleObjectByID(Long id) { - return jdbcTemplate.queryForObject("select * from %s where ID = %d".formatted(tableName, id), clazz); + T result; + try { + result = jdbcTemplate.queryForObject("select * from %s where ID = %d".formatted(tableName, id), reflectionRowMapper); + } catch (Exception e) { + log.warn("Query error", e); + return null; + } + return result; } @Override public Collection getCollectionObjectsByPredicate(ImdgPredicate predicate) { String sql = predicate.toString(); - return jdbcTemplate.queryForList("select * from %s where (%s)".formatted(tableName, sql), clazz); + List result; + try { + result = jdbcTemplate.query("select * from %s where (%s)".formatted(tableName, sql), reflectionRowMapper); + } catch (Exception e) { + log.warn("Query error", e); + return null; + } + if (result.isEmpty()) return Collections.emptyList(); + return result; } @Override public T getFirstObjectByPredicate(ImdgPredicate predicate) { String sql = predicate.toString(); - return jdbcTemplate.queryForObject("select * from %s where (%s) limit 1".formatted(tableName, sql), clazz); + List result; + try { + result = jdbcTemplate.query("select * from %s where (%s) limit 1".formatted(tableName, sql), reflectionRowMapper); + } catch (Exception e) { + log.warn("Query error", e); + return null; + } + if (result.isEmpty()) return null; + return result.iterator().next(); } @Override @@ -47,26 +92,73 @@ public class DBMap implements Imdg { + /** + * Позволяет по матчеру (fieldMatcherMap) создать объект нужного типа (clazz) из ResultSet + */ + static class ReflectionRowMapper implements RowMapper { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Class clazz; + private final Map fieldMatcherMap; + private ReflectionRowMapper(Class clazz, Map fieldMatcherMap) { + this.clazz = clazz; + this.fieldMatcherMap = fieldMatcherMap; + } + @Override + public T mapRow(ResultSet rs, int rowNum) { + T result; + try { + Constructor constructor = clazz.getDeclaredConstructor(); + result = constructor.newInstance(); + for (Map.Entry entry : fieldMatcherMap.entrySet()) { + String pojoName = entry.getKey(); + String dbName = entry.getValue(); + Field field = null; + Object value; + try { + try { + field = clazz.getDeclaredField(pojoName); + } catch (NoSuchFieldException ignored) {} + if (field == null) { + Class superClass = clazz; + do { + superClass = superClass.getSuperclass(); + if (superClass == null) break; + try { + field = superClass.getDeclaredField(pojoName); + } catch (NoSuchFieldException ignored) {} + } while (field == null); + } + if (field == null) continue; + value = rs.getObject(dbName); + } catch (SQLException e) { + continue; + } + setFieldWithCorrectType(field, result, value); + } + } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | + IllegalAccessException e) { + log.error("ReflectionRowMapper error, check code", e); + throw new RuntimeException(e); + } + return result; + } - - @Deprecated - @Override - public Collection getCollectionObjectsBySQL(String paramString) { - return Imdg.super.getCollectionObjectsBySQL(paramString); + private void setFieldWithCorrectType(Field field, T obj, Object value) throws IllegalAccessException { + if (obj == null) return; + field.setAccessible(true); + if (value instanceof Date dateValue) { + field.set(obj, dateValue.toLocalDate()); + } else if (value instanceof Time timeValue) { + field.set(obj, timeValue.toLocalTime()); + } else if (value instanceof Timestamp timestampValue) { + if (field.getType() == Instant.class) { + field.set(obj, timestampValue.toInstant()); + } else if (field.getType() == LocalDateTime.class) { + field.set(obj, timestampValue.toLocalDateTime()); + } + } else field.set(obj, value); + } } - - @Deprecated - @Override - public T getFirstObjectByFieldValues(Map> conditions) { - return Imdg.super.getFirstObjectByFieldValues(conditions); - } - - @Deprecated - @Override - public Collection getCollectionObjectsByFieldValues(Map> conditions) { - return Imdg.super.getCollectionObjectsByFieldValues(conditions); - } - } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBPredicateBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBPredicateBuilder.java index c8083fae0..bd66a4760 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBPredicateBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBPredicateBuilder.java @@ -1,8 +1,10 @@ package ru.spcex.clearing.reports.db_direct; +import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.Map; @@ -34,6 +36,7 @@ public class DBPredicateBuilder extends ImdgPredicateBuilderHazelcast { if (object instanceof LocalDate ldObj) return " '%s' ".formatted(ldObj.format(localDateFormatter)); if (object instanceof LocalTime ltObj) return " '%s' ".formatted(ltObj.format(localTimeFormatter)); if (object instanceof LocalDateTime ldtObj) return " '%s' ".formatted(ldtObj.format(localDateTimeFormatter)); + if (object instanceof Instant instantObj) return " '%s' ".formatted(localDateTimeFormatter.withZone(ZoneId.systemDefault()).format(instantObj)); return " %s ".formatted(object.toString()); } @@ -104,7 +107,7 @@ public class DBPredicateBuilder extends ImdgPredicateBuilderHazelcast { return new DBPredicate( " (%s) ".formatted( Arrays.stream(param) - .map(predicate -> " (%s) ") + .map(predicate -> " (%s) ".formatted(predicate.toString())) .collect(Collectors.joining(" and ")) ) ); @@ -120,7 +123,7 @@ public class DBPredicateBuilder extends ImdgPredicateBuilderHazelcast { return new DBPredicate( " (%s) ".formatted( Arrays.stream(param) - .map(predicate -> " (%s) ") + .map(predicate -> " (%s) ".formatted(predicate.toString())) .collect(Collectors.joining(" or ")) ) ); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBProvider.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBProvider.java index 485fcdb31..49e70bed2 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBProvider.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBProvider.java @@ -16,6 +16,7 @@ import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.security.CurrencyPairSecurity; import ru.clearing.platform.dictionary.CurrencyPairDictionary; +import ru.clearing.platform.dictionary.ErrorCodeDictionary; import ru.clearing.platform.dictionary.RegistryCodeDictionary; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.imdg.api.Imdg; @@ -51,6 +52,11 @@ public class DBProvider implements ImdgProvider { throw new UnsupportedOperationException("not implemented for direct DB provider"); } + @Override + public void waitAvailable() { + // nothing to do + } + private void initFieldsMatcherForTable() { Map accountMatcher = new HashMap<>(); @@ -314,6 +320,12 @@ public class DBProvider implements ImdgProvider { tradingClearingRegistryMatcher.put("tradingClearingRegistryPurpose", "trading_clearing_registry_purpose"); tradingClearingRegistryMatcher.put("status", "status"); this.fieldsMatcherForTable.put(TradingClearingRegistry.class, tradingClearingRegistryMatcher); + + Map errorCodeDictionaryMatcher = new HashMap<>(); + errorCodeDictionaryMatcher.put("id", "id"); + errorCodeDictionaryMatcher.put("code", "code"); + errorCodeDictionaryMatcher.put("name", "name"); + this.fieldsMatcherForTable.put(ErrorCodeDictionary.class, errorCodeDictionaryMatcher); } private void initTableNames() { @@ -331,6 +343,7 @@ public class DBProvider implements ImdgProvider { this.tableNameForClass.put(ProfileDocument.class, "PROFILE_DOCUMENT"); this.tableNameForClass.put(ExecutionCurrency.class, "EXECUTION_CURRENCY"); this.tableNameForClass.put(TradingClearingRegistry.class, "TRADING_CLEARING_REGISTRY"); + this.tableNameForClass.put(ErrorCodeDictionary.class, "ERROR_CODE_DICTIONARY"); } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NCMPNotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NCMPNotificationBuilder.java index b75689f9f..564f8df3d 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NCMPNotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NCMPNotificationBuilder.java @@ -1,5 +1,11 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,16 +15,12 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.profile.ProfileDocument; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class NCMPNotificationBuilder extends NotificationBuilder { @@ -49,27 +51,54 @@ public class NCMPNotificationBuilder extends NotificationBuilder { return null; } - String profileDocumentSql = "companyId = %d AND documentType = CLRN".formatted(consumerId); + ImdgPredicateBuilder pb = profileDocumentImdg.predicateBuilder(); + ImdgPredicate predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("documentType", "CLRN") + ); ProfileDocument profileDocument = null; - Collection profileDocuments = profileDocumentImdg.getCollectionObjectsBySQL(profileDocumentSql); + Collection profileDocuments = profileDocumentImdg.getCollectionObjectsByPredicate(predicate); if (profileDocuments.size() >= 1) { profileDocument = profileDocuments.iterator().next(); } else { - log.warn("ProfileDocument with sql {} not found", profileDocumentSql); + log.warn("ProfileDocument with sql {} not found", predicate.toString()); return null; } - String companySymbolsValueINN = getCompanySymbolValue("companyId = %d AND companySymbol = %s".formatted(consumerId, CompanySymbol.INN.getKey()), companySymbolsImdg); - String companySymbolValueCLRC = getCompanySymbolValue("companyId = %d AND companySymbol = %s".formatted(consumerId, CompanySymbol.CLRC.getKey()), companySymbolsImdg); - String companySymbolValueRGRC = getCompanySymbolValue("companyId = %d AND companySymbol = %s".formatted(consumerId, CompanySymbol.RGRC.getKey()), companySymbolsImdg); + pb = companySymbolsImdg.predicateBuilder(); + String companySymbolsValueINN = getCompanySymbolValue( + pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ), + companySymbolsImdg + ); + String companySymbolValueCLRC = getCompanySymbolValue( + pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.CLRC.getKey()) + ), + companySymbolsImdg + ); + String companySymbolValueRGRC = getCompanySymbolValue( + pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.RGRC.getKey()) + ), + companySymbolsImdg + ); - String accountSql = "companyId = %d AND accountType = INFO".formatted(consumerId); Account account = null; - Collection accounts = accountImdg.getCollectionObjectsBySQL(accountSql); - if (profileDocuments.size() >= 1) { + pb = accountImdg.predicateBuilder(); + predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("accountType", AccountType.Info.getKey()) + ); + Collection accounts = accountImdg.getCollectionObjectsByPredicate(predicate); + if (!profileDocuments.isEmpty()) { account = accounts.iterator().next(); } else { - log.warn("Account with sql {} not found", accountSql); + log.warn("Account with sql {} not found", predicate.toString()); return null; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NTCRNotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NTCRNotificationBuilder.java index 8b79e1cf0..9ea136aa7 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NTCRNotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NTCRNotificationBuilder.java @@ -1,5 +1,11 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,13 +17,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.Map; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class NTCRNotificationBuilder extends NotificationBuilder { @@ -59,7 +59,15 @@ public class NTCRNotificationBuilder extends NotificationBuilder { return null; } - String companySymbolValueCLRC = getCompanySymbolValue("companyId = %d AND companySymbol = %s".formatted(consumerId, CompanySymbol.INN.getKey()), companySymbolsImdg); + ImdgPredicateBuilder pb = companySymbolsImdg.predicateBuilder(); + + String companySymbolValueCLRC = getCompanySymbolValue( + pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ), + companySymbolsImdg + ); Map valuesForTemplate = new HashMap<>(); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java index e1ac4bb34..c2ed1cce5 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java @@ -1,11 +1,5 @@ package ru.spcex.clearing.reports.notifications; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.spcex.clearing.reports.exceptions.ConfigException; -import ru.spcex.platform.imdg.api.Imdg; - import java.io.File; import java.net.URL; import java.time.LocalDate; @@ -15,6 +9,12 @@ import java.time.format.TextStyle; import java.util.Collection; import java.util.Locale; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.spcex.clearing.reports.exceptions.ConfigException; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; public abstract class NotificationBuilder { protected final Logger log = LoggerFactory.getLogger(getClass()); @@ -76,9 +76,9 @@ public abstract class NotificationBuilder { return filename; } - protected String getCompanySymbolValue(String companySymbolsSql, Imdg companySymbolsImdg) { + protected String getCompanySymbolValue(ImdgPredicate predicate, Imdg companySymbolsImdg) { CompanySymbols companySymbols; - Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsByPredicate(predicate); if (companySymbolsCollection.size() >= 1) { companySymbols = companySymbolsCollection.iterator().next(); } else { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java index b09df0225..862910976 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java @@ -1,5 +1,12 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -7,14 +14,11 @@ import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.profile.ProfileDocument; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.DocumentTypes; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.TextStyle; -import java.util.*; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class REXNotificationBuilder extends NotificationBuilder { @@ -31,7 +35,12 @@ public class REXNotificationBuilder extends NotificationBuilder { @Override public File buildNotification(Long consumerId) { String sql = "companyId = %d AND documentType = 'XCNT'".formatted(consumerId); - Collection profileDocuments = profileDocumentImdg.getCollectionObjectsBySQL(sql); + ImdgPredicateBuilder pb = profileDocumentImdg.predicateBuilder(); + ImdgPredicate predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("documentType", DocumentTypes.xcnt.getKey()) + ); + Collection profileDocuments = profileDocumentImdg.getCollectionObjectsByPredicate(predicate); ProfileDocument currentProfileDocument = null; if (profileDocuments.size() >= 1) { Optional profileDocumentOptional = profileDocuments.stream().max((o1, o2) -> { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_ACTV_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_ACTV_NotificationBuilder.java index 1c92bfe86..9b81cc7fd 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_ACTV_NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_ACTV_NotificationBuilder.java @@ -1,5 +1,13 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.Instant; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,13 +17,11 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.relation.Relation; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.Instant; -import java.time.LocalDateTime; -import java.util.*; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class ROOT_ACTV_NotificationBuilder extends NotificationBuilder { @@ -44,14 +50,14 @@ public class ROOT_ACTV_NotificationBuilder extends NotificationBuilder { return null; } - String relationsSql = "consumerId = %d".formatted(consumerId); Relation relation = null; - Collection relations = relationImdg.getCollectionObjectsBySQL(relationsSql); - if (relations.size() >= 1) { + ImdgPredicate predicate = relationImdg.predicateBuilder().equals("consumerId", consumerId); + Collection relations = relationImdg.getCollectionObjectsByPredicate(predicate); + if (!relations.isEmpty()) { Optional relationOptional = relations.stream().max(Comparator.comparing(BusinessObject::getUpdated)); relation = relationOptional.get(); } else { - log.warn("Relation with sql {} not found", relationsSql); + log.warn("Relation with sql {} not found", predicate.toString()); return null; } Long notificationId = relation.getId(); @@ -61,13 +67,17 @@ public class ROOT_ACTV_NotificationBuilder extends NotificationBuilder { return null; } - String companySymbolsSql = "companyId = %d AND companySymbol = INN"; + ImdgPredicateBuilder pb = companySymbolsImdg.predicateBuilder(); + predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ); CompanySymbols companySymbols = null; - Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); - if (companySymbolsCollection.size() >= 1) { + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsByPredicate(predicate); + if (!companySymbolsCollection.isEmpty()) { companySymbols = companySymbolsCollection.iterator().next(); } else { - log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + log.warn("CompanySymbols with sql {} not found", predicate.toString()); return null; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_BLKD_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_BLKD_NotificationBuilder.java index 8259bda50..fb12faf20 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_BLKD_NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_BLKD_NotificationBuilder.java @@ -1,5 +1,13 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.Instant; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,13 +17,11 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.relation.Relation; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.Instant; -import java.time.LocalDateTime; -import java.util.*; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class ROOT_BLKD_NotificationBuilder extends NotificationBuilder { @@ -44,14 +50,14 @@ public class ROOT_BLKD_NotificationBuilder extends NotificationBuilder { return null; } - String relationsSql = "consumerId = %d".formatted(consumerId); Relation relation = null; - Collection relations = relationImdg.getCollectionObjectsBySQL(relationsSql); - if (relations.size() >= 1) { + ImdgPredicate predicate = relationImdg.predicateBuilder().equals("consumerId", consumerId); + Collection relations = relationImdg.getCollectionObjectsByPredicate(predicate); + if (!relations.isEmpty()) { Optional relationOptional = relations.stream().max(Comparator.comparing(BusinessObject::getUpdated)); relation = relationOptional.get(); } else { - log.warn("Relation with sql {} not found", relationsSql); + log.warn("Relation with sql {} not found", predicate.toString()); return null; } Long notificationId = relation.getId(); @@ -61,13 +67,17 @@ public class ROOT_BLKD_NotificationBuilder extends NotificationBuilder { return null; } - String companySymbolsSql = "companyId = %d AND companySymbol = INN"; CompanySymbols companySymbols = null; - Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); - if (companySymbolsCollection.size() >= 1) { + ImdgPredicateBuilder pb = companySymbolsImdg.predicateBuilder(); + predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ); + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsByPredicate(predicate); + if (!companySymbolsCollection.isEmpty()) { companySymbols = companySymbolsCollection.iterator().next(); } else { - log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + log.warn("CompanySymbols with sql {} not found", predicate.toString()); return null; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_CLOS_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_CLOS_NotificationBuilder.java index 2ac7b9083..993d7e324 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_CLOS_NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_CLOS_NotificationBuilder.java @@ -1,5 +1,12 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -8,14 +15,12 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.profile.ProfileDocument; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.CompanySymbol; +import ru.spcex.platform.enumeration.DocumentTypes; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.TextStyle; -import java.util.*; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class ROOT_CLOS_NotificationBuilder extends NotificationBuilder { @@ -33,10 +38,14 @@ public class ROOT_CLOS_NotificationBuilder extends NotificationBuilder { @Override public File buildNotification(Long consumerId) { - String sql = "companyId = %d AND documentType = 'CNTR'".formatted(consumerId); - Collection profileDocuments = profileDocumentImdg.getCollectionObjectsBySQL(sql); + ImdgPredicateBuilder pb = profileDocumentImdg.predicateBuilder(); + ImdgPredicate predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("documentType", DocumentTypes.cntr.toString()) + ); + Collection profileDocuments = profileDocumentImdg.getCollectionObjectsByPredicate(predicate); ProfileDocument currentProfileDocument = null; - if (profileDocuments.size() >= 1) { + if (!profileDocuments.isEmpty()) { Optional profileDocumentOptional = profileDocuments.stream().max((o1, o2) -> { LocalDate o1ValidFromDate = o1.getValidFromDate(); LocalDate o2ValidFromDate = o2.getValidFromDate(); @@ -46,7 +55,7 @@ public class ROOT_CLOS_NotificationBuilder extends NotificationBuilder { }); currentProfileDocument = profileDocumentOptional.get(); } else { - log.warn("Profile_document with sql {} not found", sql); + log.warn("Profile_document with sql {} not found", predicate.toString()); return null; } @@ -72,13 +81,17 @@ public class ROOT_CLOS_NotificationBuilder extends NotificationBuilder { return null; } - String companySymbolsSql = "companyId = %d AND companySymbol = INN"; CompanySymbols companySymbols = null; - Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); - if (companySymbolsCollection.size() >= 1) { + pb = companySymbolsImdg.predicateBuilder(); + predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ); + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsByPredicate(predicate); + if (!companySymbolsCollection.isEmpty()) { companySymbols = companySymbolsCollection.iterator().next(); } else { - log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + log.warn("CompanySymbols with sql {} not found", predicate.toString()); return null; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_NEW_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_NEW_NotificationBuilder.java index abcfcdd01..229564166 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_NEW_NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_NEW_NotificationBuilder.java @@ -1,5 +1,12 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -8,14 +15,12 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.profile.ProfileDocument; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.CompanySymbol; +import ru.spcex.platform.enumeration.DocumentTypes; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.TextStyle; -import java.util.*; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class ROOT_NEW_NotificationBuilder extends NotificationBuilder { @@ -33,8 +38,12 @@ public class ROOT_NEW_NotificationBuilder extends NotificationBuilder { @Override public File buildNotification(Long consumerId) { - String sql = "companyId = %d AND documentType = 'CNTR'".formatted(consumerId); - Collection profileDocuments = profileDocumentImdg.getCollectionObjectsBySQL(sql); + ImdgPredicateBuilder pb = profileDocumentImdg.predicateBuilder(); + ImdgPredicate predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("documentType", DocumentTypes.cntr.toString()) + ); + Collection profileDocuments = profileDocumentImdg.getCollectionObjectsByPredicate(predicate); ProfileDocument currentProfileDocument = null; if (profileDocuments.size() >= 1) { Optional profileDocumentOptional = profileDocuments.stream().max((o1, o2) -> { @@ -46,7 +55,7 @@ public class ROOT_NEW_NotificationBuilder extends NotificationBuilder { }); currentProfileDocument = profileDocumentOptional.get(); } else { - log.warn("Profile_document with sql {} not found", sql); + log.warn("Profile_document with sql {} not found", predicate.toString()); return null; } @@ -72,13 +81,17 @@ public class ROOT_NEW_NotificationBuilder extends NotificationBuilder { return null; } - String companySymbolsSql = "companyId = %d AND companySymbol = INN"; CompanySymbols companySymbols = null; - Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); - if (companySymbolsCollection.size() >= 1) { + pb = companySymbolsImdg.predicateBuilder(); + predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ); + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsByPredicate(predicate); + if (!companySymbolsCollection.isEmpty()) { companySymbols = companySymbolsCollection.iterator().next(); } else { - log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + log.warn("CompanySymbols with sql {} not found", predicate.toString()); return null; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_SSPD_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_SSPD_NotificationBuilder.java index 28807f29c..5dbc63599 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_SSPD_NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_SSPD_NotificationBuilder.java @@ -1,5 +1,13 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.Instant; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,13 +17,11 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.relation.Relation; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.Instant; -import java.time.LocalDateTime; -import java.util.*; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class ROOT_SSPD_NotificationBuilder extends NotificationBuilder { @@ -44,14 +50,14 @@ public class ROOT_SSPD_NotificationBuilder extends NotificationBuilder { return null; } - String relationsSql = "consumerId = %d".formatted(consumerId); Relation relation = null; - Collection relations = relationImdg.getCollectionObjectsBySQL(relationsSql); - if (relations.size() >= 1) { + ImdgPredicate predicate = relationImdg.predicateBuilder().equals("consumerId", consumerId); + Collection relations = relationImdg.getCollectionObjectsByPredicate(predicate); + if (!relations.isEmpty()) { Optional relationOptional = relations.stream().max(Comparator.comparing(BusinessObject::getUpdated)); relation = relationOptional.get(); } else { - log.warn("Relation with sql {} not found", relationsSql); + log.warn("Relation with sql {} not found", predicate.toString()); return null; } Long notificationId = relation.getId(); @@ -61,13 +67,17 @@ public class ROOT_SSPD_NotificationBuilder extends NotificationBuilder { return null; } - String companySymbolsSql = "companyId = %d AND companySymbol = INN"; CompanySymbols companySymbols = null; - Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); - if (companySymbolsCollection.size() >= 1) { + ImdgPredicateBuilder pb = companySymbolsImdg.predicateBuilder(); + predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ); + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsByPredicate(predicate); + if (!companySymbolsCollection.isEmpty()) { companySymbols = companySymbolsCollection.iterator().next(); } else { - log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + log.warn("CompanySymbols with sql {} not found", predicate.toString()); return null; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java index 3622a661f..1b5ca6975 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java @@ -1,5 +1,13 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.Instant; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,13 +17,11 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.relation.Relation; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.Instant; -import java.time.LocalDateTime; -import java.util.*; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class RRPCNotificationBuilder extends NotificationBuilder { @@ -44,14 +50,14 @@ public class RRPCNotificationBuilder extends NotificationBuilder { return null; } - String relationsSql = "consumerId = %d".formatted(consumerId); Relation relation = null; - Collection relations = relationImdg.getCollectionObjectsBySQL(relationsSql); - if (relations.size() >= 1) { + ImdgPredicate predicate = relationImdg.predicateBuilder().equals("consumerId", consumerId); + Collection relations = relationImdg.getCollectionObjectsByPredicate(predicate); + if (!relations.isEmpty()) { Optional relationOptional = relations.stream().max(Comparator.comparing(BusinessObject::getUpdated)); relation = relationOptional.get(); } else { - log.warn("Relation with sql {} not found", relationsSql); + log.warn("Relation with sql {} not found", predicate.toString()); return null; } Long notificationId = relation.getId(); @@ -61,13 +67,17 @@ public class RRPCNotificationBuilder extends NotificationBuilder { return null; } - String companySymbolsSql = "companyId = %d AND companySymbol = INN"; CompanySymbols companySymbols = null; - Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); + ImdgPredicateBuilder pb = companySymbolsImdg.predicateBuilder(); + predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ); + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsByPredicate(predicate); if (companySymbolsCollection.size() >= 1) { companySymbols = companySymbolsCollection.iterator().next(); } else { - log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + log.warn("CompanySymbols with sql {} not found", predicate.toString()); return null; } diff --git a/clearing-parent/reports-service/src/main/resources/application.properties b/clearing-parent/reports-service/src/main/resources/application.properties index 75eab238c..ae7aac6b4 100644 --- a/clearing-parent/reports-service/src/main/resources/application.properties +++ b/clearing-parent/reports-service/src/main/resources/application.properties @@ -34,3 +34,11 @@ reports-service.notifications-store.server-port=2222 reports-service.notifications-store.delete-after-send=true reports-service.reports.pfx-class-codes=BKVC,SKVC,UKVC,NKVC,DKVC,BMVC,SMVC,UMVC,DMVC,MMVC,BMFC,SMFC,UMFC,DMFC,MMFC,BMMC,SMMC,UMMC,DMMC,MMMC,BMIC,SMIC,UMIC,DMIC,MMIC + +reports-service.direct-db.login=clearing +reports-service.direct-db.password=Aa111111 +reports-service.direct-db.url=jdbc:postgresql://10.200.200.133:5432/clearing?currentSchema=clearing_prod +reports-service.direct-db.driver=org.postgresql.Driver +#reports-service.direct-db.url=jdbc:postgresql://10.200.200.133:5432/postgres?currentSchema=clearing_tester +reports-service.direct-db.min-pool-size=10 +reports-service.direct-db.max-pool-size=30 \ No newline at end of file diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/notifications/NotificationBuilderTest.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/notifications/NotificationBuilderTest.java index b0a5f47f7..18cf87cd4 100644 --- a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/notifications/NotificationBuilderTest.java +++ b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/notifications/NotificationBuilderTest.java @@ -1,7 +1,12 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Arrays; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import static org.mockito.Mockito.*; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.relation.Relation; @@ -10,15 +15,6 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import java.io.File; -import java.time.Instant; -import java.time.LocalDate; -import java.time.ZoneId; -import java.util.Arrays; -import java.util.Collections; - -import static org.mockito.Mockito.*; - class NotificationBuilderTest { static ImdgProvider imdgProviderMock; static Imdg companyImdgMock; @@ -59,7 +55,7 @@ class NotificationBuilderTest { testProfileDocument_2.setValidFromDate(LocalDate.of(2019, 1, 1)); testProfileDocument_2.setNumber("TEST_NUMBER_2"); profileDocumentImdgMock = mock(Imdg.class); - when(profileDocumentImdgMock.getCollectionObjectsBySQL(any())).thenReturn(Arrays.asList(testProfileDocument_1, testProfileDocument_2)); + when(profileDocumentImdgMock.getCollectionObjectsByPredicate(any())).thenReturn(Arrays.asList(testProfileDocument_1, testProfileDocument_2)); when(imdgProviderMock.getImdg(eq(IMDGDistributedNames.Map_ProfileDocument), eq(ProfileDocument.class))).thenReturn(profileDocumentImdgMock); testRelation_1 = new Relation(); @@ -71,7 +67,7 @@ class NotificationBuilderTest { testRelation_2.setConsumerId(777L); testRelation_2.setUpdated(LocalDate.of(2019, 1, 1).atStartOfDay(ZoneId.systemDefault()).toInstant()); relationImdgMock = mock(Imdg.class); - when(relationImdgMock.getCollectionObjectsBySQL(any())).thenReturn(Arrays.asList(testRelation_1, testRelation_2)); + when(relationImdgMock.getCollectionObjectsByPredicate(any())).thenReturn(Arrays.asList(testRelation_1, testRelation_2)); when(imdgProviderMock.getImdg(eq(IMDGDistributedNames.Map_Relation), eq(Relation.class))).thenReturn(relationImdgMock); testCompanySymbols_1 = new CompanySymbols(); @@ -85,7 +81,7 @@ class NotificationBuilderTest { testCompanySymbols_2.setCompanySymbol("TEST_COMPANY_SYMBOL_2"); testCompanySymbols_2.setCompanySymbolValue("TEST_COMPANY_SYMBOL_VALUE_2"); companySymbolsImdgMock = mock(Imdg.class); - when(companySymbolsImdgMock.getCollectionObjectsBySQL(any())).thenReturn(Arrays.asList(testCompanySymbols_1, testCompanySymbols_2)); + when(companySymbolsImdgMock.getCollectionObjectsByPredicate(any())).thenReturn(Arrays.asList(testCompanySymbols_1, testCompanySymbols_2)); when(imdgProviderMock.getImdg(eq(IMDGDistributedNames.Map_CompanySymbols), eq(CompanySymbols.class))).thenReturn(companySymbolsImdgMock); }