reports-service new features (direct db)

This commit is contained in:
akulikov 2024-08-06 18:25:55 +03:00
parent 8d797212b5
commit 44c547d07c
33 changed files with 704 additions and 340 deletions

View file

@ -132,6 +132,15 @@
<artifactId>spring-boot-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.3</version>
</dependency>
</dependencies>
<build>

View file

@ -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)
и другие настройки.
Рабочие папки

View file

@ -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 {

View file

@ -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<P, R> {
}
protected List<Long> getSessionIdsForCurrentDate(Imdg<Session> sessionImdg) {
Collection<Session> sessionForCurrentDay = sessionImdg.getCollectionObjectsByFieldValues(
Map.of(
"clearingDate", LocalDate.now()
)
Collection<Session> sessionForCurrentDay = sessionImdg.getCollectionObjectsByPredicate(
sessionImdg.predicateBuilder().equals("clearingDate", LocalDate.now())
);
Set<Long> sessionIds = sessionForCurrentDay.stream().map(Session::getId).collect(Collectors.toSet());
return sessionIds.stream().toList();

View file

@ -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<EmptyParams, KSCommissionTradesReport> {
protected DateTimeFormatter dateFormatter_ddMMyy = DateTimeFormatter.ofPattern("ddMMyy");
@ -81,9 +88,9 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
LocalDate nowDate = LocalDate.now();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.TS_T).build();
ImdgPredicate registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.TS_T).buildPredicate(pb);
ImdgPredicate finalPredicate = pb.and(
pb.sql(sql),
registryPredicate,
pb.greatEqual("refundDate", nowDate),
pb.lessEqual("valueDate", nowDate),
pb.in("sessionType", SessionType.XDEP.getKey(), SessionType.FINL.getKey(), SessionType.MEDM.getKey())
@ -170,11 +177,14 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
if (accountType == AccountType.Clrn) {
account = registry.getAccount();
} else if (accountType == AccountType.Info) {
Account accountFromImdg = accountImdg.getFirstObjectByFieldValues(Map.of(
"accountType", AccountType.Anlt.getKey(),
"companyId", 1L
));
account = accountFromImdg.getAccount();
pb = accountImdg.predicateBuilder();
Account accountFromImdg = accountImdg.getFirstObjectByPredicate(
pb.and(
pb.equals("accountType", AccountType.Anlt.getKey()),
pb.equals("companyId", 1L)
)
);
account = accountFromImdg != null ? accountFromImdg.getAccount() : null;
}
String tkrInitiator = null;
@ -193,11 +203,13 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
if (accountType == AccountType.Clrn) {
accountInitiator = tmtRegistry.getAccount();
} else if (accountType == AccountType.Info) {
Account accountFromImdg = accountImdg.getFirstObjectByFieldValues(Map.of(
"accountType", AccountType.Anlt.getKey(),
"companyId", 1L
));
accountInitiator = accountFromImdg.getAccount();
Account accountFromImdg = accountImdg.getFirstObjectByPredicate(
pb.and(
pb.equals("accountType", AccountType.Anlt.getKey()),
pb.equals("companyId", 1L)
)
);
accountInitiator = accountFromImdg != null ? accountFromImdg.getAccount() : null;
}
}
Session session = sessionImdg.getSingleObjectByID(registry.getSessionId());

View file

@ -14,8 +14,6 @@ import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.security.CurrencyPairSecurity;
import ru.clearing.platform.dictionary.CurrencyPairDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.builders.CSVReportBuilder;
import ru.spcex.clearing.reports.builders.PairRegistryId;
@ -40,8 +38,6 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
private final Imdg<Registry> registryImdg;
private final Imdg<Session> sessionImdg;
private final Imdg<Account> accountImdg;
private final Imdg<CurrencyPairDictionary> currencyPairDictionaryImdg;
private final Imdg<CurrencyPairSecurity> currencyPairSecurityImdg;
private List<KSRepCashNettoReport> rows = null;
@ -49,8 +45,6 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
currencyPairDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyPairDictionary, CurrencyPairDictionary.class);
currencyPairSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, CurrencyPairSecurity.class);
}
@Override
@ -83,13 +77,13 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
LocalDate nowDate = LocalDate.now();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CM_T, RegistryTradingParams.LM_T).build();
ImdgPredicate registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CM_T, RegistryTradingParams.LM_T).buildPredicate(pb);
List<Long> 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<SessionIdParam
if (accountType == AccountType.Clrn) {
account = registry.getAccount();
} else if (accountType == AccountType.Info) {
Account accountFromIMDG = accountImdg.getFirstObjectByFieldValues(Map.of(
"companyId", 1L,
"accountType", AccountType.Anlt.getKey()
));
if (accountFromIMDG != null) account = accountFromIMDG.getAccount();
Account accountFromImdg = accountImdg.getFirstObjectByPredicate(
pb.and(
pb.equals("accountType", AccountType.Anlt.getKey()),
pb.equals("companyId", 1L)
)
);
account = accountFromImdg != null ? accountFromImdg.getAccount() : null;
}
ksRepCashNettoReport.setAccount(account);
ksRepCashNettoReport.setTkr(registry.getTradingClearingRegistry());

View file

@ -8,7 +8,6 @@ import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
@ -83,7 +82,6 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyPa
pb.equals("registryStatus", RegistryStatus.OK.getKey()),
pb.notNull("tradingClearingRegistry"),
registryPredicate
);
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
log.debug("Found {} registries by query: {}", registries.size(), finalPredicate);
@ -121,10 +119,12 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyPa
if (accountType == AccountType.Clrn) {
account = registry.getAccount();
} else if (accountType == AccountType.Info) {
Account accountFromIMDG = accountImdg.getFirstObjectByFieldValues(Map.of(
"companyId", 1L,
"accountType", AccountType.Anlt.getKey()
));
Account accountFromIMDG = accountImdg.getFirstObjectByPredicate(
pb.and(
pb.equals("accountType", AccountType.Anlt.getKey()),
pb.equals("companyId", 1L)
)
);
if (accountFromIMDG != null) account = accountFromIMDG.getAccount();
}

View file

@ -8,7 +8,6 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.account.Account;
@ -117,11 +116,13 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
account = registry.getAccount();
} else if (accountType == AccountType.Info) {
Account accountFromIMDG = accountImdg.getFirstObjectByFieldValues(Map.of(
"companyId", 1L,
"accountType", AccountType.Anlt.getKey(),
"currency", registry.getSecuritySymbol()
));
Account accountFromIMDG = accountImdg.getFirstObjectByPredicate(
pb.and(
pb.equals("accountType", AccountType.Anlt.getKey()),
pb.equals("companyId", 1L),
pb.equals("currency", registry.getSecuritySymbol())
)
);
if (accountFromIMDG != null) account = accountFromIMDG.getAccount();
}
KSRepCashRegistersReport ksRepCashRegistersReport = new KSRepCashRegistersReport();
@ -138,11 +139,15 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
ksRepCashRegistersReport.setRemarks(null);
ksRepCashRegistersReport.setTradeNum(null);
RegistryCodeDictionary registryCodeDictionary = registryCodeDictionaryImdg.getFirstObjectByFieldValues(Map.of("code", registry.getRegistryCode()));
RegistryCodeDictionary registryCodeDictionary = registryCodeDictionaryImdg.getFirstObjectByPredicate(
registryCodeDictionaryImdg.predicateBuilder().equals("code", registry.getRegistryCode())
);
if (registryCodeDictionary != null) ksRepCashRegistersReport.setRegisterName(registryCodeDictionary.getName());
Collection<Session> sessionsForDay = sessionImdg.getCollectionObjectsByFieldValues(Map.of("clearingDate", LocalDate.now()));
Collection<Session> 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<Registry> cmtRegistries = registryImdg.getCollectionObjectsByPredicate(
@ -171,8 +176,8 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
for (Registry cmtRegistry : cmtRegistries) {
Long counterPartyId = cmtRegistry.getCounterPartyId();
if (counterPartyId != null) {
Collection<ClearingMemberCategory> clearingMemberCategory = clearingMemberCategoryImdg.getCollectionObjectsByFieldValues(
Map.of("companyId", counterPartyId)
Collection<ClearingMemberCategory> 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<EmptyParam
.filter(reg -> {
Long counterPartyId = reg.getCounterPartyId();
if (counterPartyId != null) {
Collection<ClearingMemberCategory> clearingMemberCategory = clearingMemberCategoryImdg.getCollectionObjectsByFieldValues(
Map.of("companyId", counterPartyId)
Collection<ClearingMemberCategory> clearingMemberCategory = clearingMemberCategoryImdg.getCollectionObjectsByPredicate(
clearingMemberCategoryImdg.predicateBuilder().equals("companyId", counterPartyId)
);
if (!clearingMemberCategory.isEmpty()) {
ClearingMemberCategory next = clearingMemberCategory.iterator().next();

View file

@ -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<SessionIdParam, KSRepDepoNettoReport> {
private final Imdg<Registry> registryImdg;
@ -69,11 +76,11 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
List<Long> 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<SessionIdParam
ksRepDepoNettoReport.setTkr(registry.getTradingClearingRegistry());
String account = registry.getAccount();
AccountSymbols accountSymbols = accountSymbolsImdg.getFirstObjectByFieldValues(Map.of("accountId", registry.getAccountId()));
AccountSymbols accountSymbols = accountSymbolsImdg.getFirstObjectByPredicate(
accountSymbolsImdg.predicateBuilder().equals("accountId", registry.getAccountId())
);
if (accountSymbols != null && !StringUtils.isBlank(accountSymbols.getAccountSymbolValue()))
account = accountSymbols.getAccountSymbolValue();
ksRepDepoNettoReport.setAccount(account);

View file

@ -8,14 +8,11 @@ import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.account.AccountSymbols;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.security.CurrencyPairSecurity;
import ru.clearing.platform.dictionary.CurrencyPairDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.builders.CSVReportBuilder;
import ru.spcex.clearing.reports.builders.EmptyParams;
@ -39,8 +36,6 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<E
private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg;
private final Imdg<AccountSymbols> accountSymbolsImdg;
private final Imdg<CurrencyPairDictionary> currencyPairDictionaryImdg;
private final Imdg<CurrencyPairSecurity> currencyPairSecurityImdg;
private List<KSRepDepoRegisterQuantitiesReport> rows = null;
@ -48,8 +43,6 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<E
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
accountSymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
currencyPairDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyPairDictionary, CurrencyPairDictionary.class);
currencyPairSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyPairSecurity, CurrencyPairSecurity.class);
}
@Override
@ -124,8 +117,11 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<E
String account = registry.getAccount();
AccountSymbols accountSymbols = null;
if (IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType()) == AccountType.Depo)
accountSymbols = accountSymbolsImdg.getFirstObjectByFieldValues(Map.of("accountId", registry.getAccountId()));
if (IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType()) == AccountType.Depo) {
accountSymbols = accountSymbolsImdg.getFirstObjectByPredicate(
accountSymbolsImdg.predicateBuilder().equals("accountId", registry.getAccountId())
);
}
if (accountSymbols != null && !StringUtils.isBlank(accountSymbols.getAccountSymbolValue()))
account = accountSymbols.getAccountSymbolValue();

View file

@ -1,5 +1,12 @@
package ru.spcex.clearing.reports.builders.ks;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.account.AccountSymbols;
@ -10,22 +17,18 @@ 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.KSRepDepoRegistersReport;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.ReportBuilderType;
import ru.spcex.platform.enumeration.ReportKeys;
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;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@Component
public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParams, KSRepDepoRegistersReport> {
private final Imdg<Registry> registryImdg;
@ -98,7 +101,9 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParam
ksRepDepoRegistersReport.setFirmId(registry.getTradingCode());
String account = registry.getAccount();
AccountSymbols accountSymbols = accountSymbolsImdg.getFirstObjectByFieldValues(Map.of("accountId", registry.getAccountId()));
AccountSymbols accountSymbols = accountSymbolsImdg.getFirstObjectByPredicate(
accountSymbolsImdg.predicateBuilder().equals("accountId", registry.getAccountId())
);
if (accountSymbols != null && !StringUtils.isBlank(accountSymbols.getAccountSymbolValue()))
account = accountSymbols.getAccountSymbolValue();
ksRepDepoRegistersReport.setAccount(account);
@ -114,7 +119,9 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParam
ksRepDepoRegistersReport.setRemarks(null);
ksRepDepoRegistersReport.setTradeNum(null);
RegistryCodeDictionary registryCodeDescription = registryCodeDictionaryImdg.getFirstObjectByFieldValues(Map.of("code", registry.getRegistryCode()));
RegistryCodeDictionary registryCodeDescription = registryCodeDictionaryImdg.getFirstObjectByPredicate(
registryCodeDictionaryImdg.predicateBuilder().equals("code", registry.getRegistryCode())
);
if (registryCodeDescription != null) ksRepDepoRegistersReport.setRegisterName(registryCodeDescription.getName());
BigDecimal settledCredit = registry.getSettledCredit() != null ? registry.getSettledCredit() : BigDecimal.ZERO;

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.reports.builders.ks;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
@ -8,14 +11,14 @@ 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.KSRepFirmDetailsReport;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.enumeration.DocumentTypes;
import ru.spcex.platform.enumeration.ReportBuilderType;
import ru.spcex.platform.enumeration.ReportKeys;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
@Deprecated
@Component
@ -59,31 +62,35 @@ public class KSRepFirmDetailsReportBuilder extends CSVReportBuilder<EmptyParams,
@Override
protected void collect(EmptyParams params) {
Collection<Company> companies = companyImdg.getCollectionObjectsByFieldValues(Map.of("workflowStatus", WorkflowStatus.Active.getKey()));
Collection<Company> 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();

View file

@ -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<EmptyParams, KSRe
if (coverage == CoverageStatus.DEND) {
if (execution instanceof ExecutionFond) {
ImdgPredicateBuilder pbRegistry = registryImdg.predicateBuilder();
String registryPredicateStr = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams._S_T).build();
ImdgPredicate registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams._S_T).buildPredicate(pbRegistry);
Collection<Registry> registryCollection = registryImdg.getCollectionObjectsByPredicate(
pbRegistry.and(
pbRegistry.equals("groupId", groupId),
@ -154,7 +155,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
RegistryStatus.NACK.getKey(),
RegistryStatus.FAIL.getKey(),
RegistryStatus.UNCV.getKey()),
pbRegistry.sql(registryPredicateStr)
registryPredicate
)
);
if (registryCollection.isEmpty()) {
@ -197,10 +198,13 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
Account moneyAccountFromImdg = accountImdg.getSingleObjectByID(tkr.getMoneyAccountId());
if (moneyAccountFromImdg != null) {
if (AccountType.Info.equalsByKey(moneyAccountFromImdg.getAccountType())) {
moneyAccountFromImdg = accountImdg.getFirstObjectByFieldValues(Map.of(
"companyId", 1L,
"accountType", AccountType.Anlt.getKey()
));
ImdgPredicateBuilder pb = accountImdg.predicateBuilder();
moneyAccountFromImdg = accountImdg.getFirstObjectByPredicate(
pb.and(
pb.equals("companyId", 1L),
pb.equals("accountType", AccountType.Anlt.getKey())
)
);
}
account = moneyAccountFromImdg.getAccount();
}
@ -248,9 +252,9 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
} else if (execution instanceof ExecutionFond executionFond) {
if (tkr.getDepoAccountId() != null) {
AccountSymbols accountSymbols = accountSymbolsImdg.getFirstObjectByFieldValues(Map.of(
"accountId", tkr.getDepoAccountId()
));
AccountSymbols accountSymbols = accountSymbolsImdg.getFirstObjectByPredicate(
accountSymbolsImdg.predicateBuilder().equals("accountId", tkr.getDepoAccountId())
);
if (accountSymbols != null) {
depoAccount = accountSymbols.getAccountSymbolValue();
} else {
@ -326,9 +330,9 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
continue;
}
CurrencyPairSecurity currencyPairSecurity = currencyPairSecurityImdg.getFirstObjectByFieldValues(Map.of(
"securityId", executionCurrency.getSecurityId()
));
CurrencyPairSecurity currencyPairSecurity = currencyPairSecurityImdg.getFirstObjectByPredicate(
currencyPairSecurityImdg.predicateBuilder().equals("securityId", executionCurrency.getSecurityId())
);
if (currencyPairSecurity != null) {
CurrencyPairDictionary currencyPairDictionary = currencyPairDictionaryImdg.getSingleObjectByID(
currencyPairSecurity.getCurrencyPairId()

View file

@ -1,5 +1,10 @@
package ru.spcex.clearing.reports.builders.ks;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.misc.Session;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -10,13 +15,7 @@ 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 java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
@Component
public class KSSessionListReportBuilder extends CSVReportBuilder<EmptyParams, KSSessionListReport> {
@ -55,9 +54,9 @@ public class KSSessionListReportBuilder extends CSVReportBuilder<EmptyParams, KS
@Override
protected void collect(EmptyParams params) {
Map<String, LocalDate> query = Map.of("clearingDate", LocalDate.now());
Collection<Session> sessions = sessionImdg.getCollectionObjectsByFieldValues(query);
log.debug("Found {} Session by query: {}", sessions.size(), query);
ImdgPredicate predicate = sessionImdg.predicateBuilder().equals("clearingDate", LocalDate.now());
Collection<Session> sessions = sessionImdg.getCollectionObjectsByPredicate(predicate);
log.debug("Found {} Session by query: {}", sessions.size(), predicate.toString());
rows = new ArrayList<>(sessions.size());
for (Session session : sessions) {
try {

View file

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

View file

@ -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<String, Object> kafkaTemplate, ImdgProvider imdgProvider) {
ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator();
public KafkaSender kafkaSender(KafkaTemplate<String, Object> 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<RequestInfo> imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class);
Imdg<RequestInfo> imdg = provider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class);
return imdg::insert;
})
.build();

View file

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

View file

@ -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<String> pfxClassCodes;
@ -71,4 +71,12 @@ public class ReportsServiceSettings {
public void setPfxClassCodes(List<String> pfxClassCodes) {
this.pfxClassCodes = pfxClassCodes;
}
public DirectDB getDirectDb() {
return directDb;
}
public void setDirectDb(DirectDB directDb) {
this.directDb = directDb;
}
}

View file

@ -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<T extends SpcexObjectBase> implements Imdg<T> {
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<T> clazz;
private final Map<String, String> fieldMatcherMap;
private final String tableName;
private final JdbcTemplate jdbcTemplate;
private final Class<T> clazz;
private final ReflectionRowMapper<T> reflectionRowMapper;
public DBMap(Map<String, String> fieldMatcherMap,
String tableName,
@ -21,23 +42,47 @@ public class DBMap<T extends SpcexObjectBase> implements Imdg<T> {
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<T> getCollectionObjectsByPredicate(ImdgPredicate predicate) {
String sql = predicate.toString();
return jdbcTemplate.queryForList("select * from %s where (%s)".formatted(tableName, sql), clazz);
List<T> 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<T> 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<T extends SpcexObjectBase> implements Imdg<T> {
/**
* Позволяет по матчеру (fieldMatcherMap) создать объект нужного типа (clazz) из ResultSet
*/
static class ReflectionRowMapper<T extends SpcexObjectBase> implements RowMapper<T> {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Class<T> clazz;
private final Map<String, String> fieldMatcherMap;
private ReflectionRowMapper(Class<T> clazz, Map<String, String> fieldMatcherMap) {
this.clazz = clazz;
this.fieldMatcherMap = fieldMatcherMap;
}
@Override
public T mapRow(ResultSet rs, int rowNum) {
T result;
try {
Constructor<T> constructor = clazz.getDeclaredConstructor();
result = constructor.newInstance();
for (Map.Entry<String, String> 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<T> 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<String, ? extends Comparable<?>> conditions) {
return Imdg.super.getFirstObjectByFieldValues(conditions);
}
@Deprecated
@Override
public Collection<T> getCollectionObjectsByFieldValues(Map<String, ? extends Comparable<?>> conditions) {
return Imdg.super.getCollectionObjectsByFieldValues(conditions);
}
}

View file

@ -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 "))
)
);

View file

@ -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<String, String> 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<String, String> 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");
}
}

View file

@ -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<ProfileDocument> profileDocuments = profileDocumentImdg.getCollectionObjectsBySQL(profileDocumentSql);
Collection<ProfileDocument> 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<Account> 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<Account> 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;
}

View file

@ -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<String, String> valuesForTemplate = new HashMap<>();

View file

@ -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<CompanySymbols> companySymbolsImdg) {
protected String getCompanySymbolValue(ImdgPredicate predicate, Imdg<CompanySymbols> companySymbolsImdg) {
CompanySymbols companySymbols;
Collection<CompanySymbols> companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql);
Collection<CompanySymbols> companySymbolsCollection = companySymbolsImdg.getCollectionObjectsByPredicate(predicate);
if (companySymbolsCollection.size() >= 1) {
companySymbols = companySymbolsCollection.iterator().next();
} else {

View file

@ -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<ProfileDocument> profileDocuments = profileDocumentImdg.getCollectionObjectsBySQL(sql);
ImdgPredicateBuilder pb = profileDocumentImdg.predicateBuilder();
ImdgPredicate predicate = pb.and(
pb.equals("companyId", consumerId),
pb.equals("documentType", DocumentTypes.xcnt.getKey())
);
Collection<ProfileDocument> profileDocuments = profileDocumentImdg.getCollectionObjectsByPredicate(predicate);
ProfileDocument currentProfileDocument = null;
if (profileDocuments.size() >= 1) {
Optional<ProfileDocument> profileDocumentOptional = profileDocuments.stream().max((o1, o2) -> {

View file

@ -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<Relation> relations = relationImdg.getCollectionObjectsBySQL(relationsSql);
if (relations.size() >= 1) {
ImdgPredicate predicate = relationImdg.predicateBuilder().equals("consumerId", consumerId);
Collection<Relation> relations = relationImdg.getCollectionObjectsByPredicate(predicate);
if (!relations.isEmpty()) {
Optional<Relation> 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<CompanySymbols> companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql);
if (companySymbolsCollection.size() >= 1) {
Collection<CompanySymbols> 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;
}

View file

@ -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<Relation> relations = relationImdg.getCollectionObjectsBySQL(relationsSql);
if (relations.size() >= 1) {
ImdgPredicate predicate = relationImdg.predicateBuilder().equals("consumerId", consumerId);
Collection<Relation> relations = relationImdg.getCollectionObjectsByPredicate(predicate);
if (!relations.isEmpty()) {
Optional<Relation> 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<CompanySymbols> 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<CompanySymbols> 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;
}

View file

@ -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<ProfileDocument> profileDocuments = profileDocumentImdg.getCollectionObjectsBySQL(sql);
ImdgPredicateBuilder pb = profileDocumentImdg.predicateBuilder();
ImdgPredicate predicate = pb.and(
pb.equals("companyId", consumerId),
pb.equals("documentType", DocumentTypes.cntr.toString())
);
Collection<ProfileDocument> profileDocuments = profileDocumentImdg.getCollectionObjectsByPredicate(predicate);
ProfileDocument currentProfileDocument = null;
if (profileDocuments.size() >= 1) {
if (!profileDocuments.isEmpty()) {
Optional<ProfileDocument> 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<CompanySymbols> 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<CompanySymbols> 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;
}

View file

@ -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<ProfileDocument> profileDocuments = profileDocumentImdg.getCollectionObjectsBySQL(sql);
ImdgPredicateBuilder pb = profileDocumentImdg.predicateBuilder();
ImdgPredicate predicate = pb.and(
pb.equals("companyId", consumerId),
pb.equals("documentType", DocumentTypes.cntr.toString())
);
Collection<ProfileDocument> profileDocuments = profileDocumentImdg.getCollectionObjectsByPredicate(predicate);
ProfileDocument currentProfileDocument = null;
if (profileDocuments.size() >= 1) {
Optional<ProfileDocument> 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<CompanySymbols> 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<CompanySymbols> 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;
}

View file

@ -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<Relation> relations = relationImdg.getCollectionObjectsBySQL(relationsSql);
if (relations.size() >= 1) {
ImdgPredicate predicate = relationImdg.predicateBuilder().equals("consumerId", consumerId);
Collection<Relation> relations = relationImdg.getCollectionObjectsByPredicate(predicate);
if (!relations.isEmpty()) {
Optional<Relation> 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<CompanySymbols> 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<CompanySymbols> 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;
}

View file

@ -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<Relation> relations = relationImdg.getCollectionObjectsBySQL(relationsSql);
if (relations.size() >= 1) {
ImdgPredicate predicate = relationImdg.predicateBuilder().equals("consumerId", consumerId);
Collection<Relation> relations = relationImdg.getCollectionObjectsByPredicate(predicate);
if (!relations.isEmpty()) {
Optional<Relation> 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<CompanySymbols> companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql);
ImdgPredicateBuilder pb = companySymbolsImdg.predicateBuilder();
predicate = pb.and(
pb.equals("companyId", consumerId),
pb.equals("companySymbol", CompanySymbol.INN.getKey())
);
Collection<CompanySymbols> 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;
}

View file

@ -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

View file

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