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);
}