From 18a74ee7b841fa04ba69b19360061af1f3748734 Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 5 Aug 2024 11:52:09 +0300 Subject: [PATCH 01/21] directDB --- clearing-parent/reports-service/pom.xml | 6 + .../clearing/reports/db_direct/DBMap.java | 73 +++++++++++ .../reports/db_direct/DBPredicate.java | 16 +++ .../reports/db_direct/DBPredicateBuilder.java | 114 ++++++++++++++++++ .../reports/db_direct/DBProvider.java | 68 +++++++++++ .../reports/db_direct/DBRegistryParams.java | 2 + 6 files changed, 279 insertions(+) create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBMap.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBPredicate.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBPredicateBuilder.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBProvider.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBRegistryParams.java diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml index e0761fe35..3eb65f449 100644 --- a/clearing-parent/reports-service/pom.xml +++ b/clearing-parent/reports-service/pom.xml @@ -51,6 +51,12 @@ 1.4.19 + + + org.springframework.boot + spring-boot-starter-jdbc + + org.apache.poi 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 new file mode 100644 index 000000000..26703f40b --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBMap.java @@ -0,0 +1,73 @@ +package ru.spcex.clearing.reports.db_direct; + +import java.util.Collection; +import java.util.Map; +import org.springframework.jdbc.core.JdbcTemplate; +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 Map fieldMatcherMap; + private final String tableName; + private final JdbcTemplate jdbcTemplate; + private final Class clazz; + + public DBMap(Map fieldMatcherMap, + String tableName, + JdbcTemplate jdbcTemplate, Class clazz) { + this.fieldMatcherMap = fieldMatcherMap; + this.tableName = tableName; + this.jdbcTemplate = jdbcTemplate; + this.clazz = clazz; + } + + @Override + public T getSingleObjectByID(Long id) { + return jdbcTemplate.queryForObject("select * from %s where ID = %d".formatted(tableName, id), clazz); + } + + @SuppressWarnings("sql") + @Override + public Collection getCollectionObjectsByPredicate(ImdgPredicate predicate) { + String sql = predicate.toString(); + return jdbcTemplate.queryForList("select * from %s where (%s)".formatted(tableName, sql), clazz); + } + + @Override + public T getFirstObjectByPredicate(ImdgPredicate predicate) { + String sql = predicate.toString(); + return jdbcTemplate.queryForObject("select * from %s where (%s) limit 1".formatted(tableName, sql), clazz); + } + + @Override + public ImdgPredicateBuilder predicateBuilder() { + return new DBPredicateBuilder(fieldMatcherMap); + } + + + + + + + + @Deprecated + @Override + public Collection getCollectionObjectsBySQL(String paramString) { + return Imdg.super.getCollectionObjectsBySQL(paramString); + } + + @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/DBPredicate.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBPredicate.java new file mode 100644 index 000000000..6e1bba168 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBPredicate.java @@ -0,0 +1,16 @@ +package ru.spcex.clearing.reports.db_direct; + +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; + +public class DBPredicate implements ImdgPredicate { + private final String predicate; + + public DBPredicate(String predicate) { + this.predicate = predicate; + } + + @Override + public String toString() { + return predicate; + } +} 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 new file mode 100644 index 000000000..417ef84c7 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBPredicateBuilder.java @@ -0,0 +1,114 @@ +package ru.spcex.clearing.reports.db_direct; + +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast; + +public class DBPredicateBuilder extends ImdgPredicateBuilderHazelcast { + private final Map fieldMatcherMap; + + public DBPredicateBuilder(Map fieldMatcherMap) { + this.fieldMatcherMap = fieldMatcherMap; + } + + private String replaced(String key) { + return fieldMatcherMap.get(key); + } + + @Override + public ImdgPredicate equals(String key, Object value) { + return new DBPredicate(" (%s = %s) ".formatted(replaced(key), value.toString())); + } + + @Override + public ImdgPredicate greatEqual(String key, Comparable value) { + return new DBPredicate(" (%s >= %s) ".formatted(replaced(key), value.toString())); + } + + @Override + public ImdgPredicate lessEqual(String key, Comparable value) { + return new DBPredicate(" (%s <= %s) ".formatted(replaced(key), value.toString())); + } + + @Override + public ImdgPredicate greater(String key, Comparable value) { + return new DBPredicate(" (%s > %s) ".formatted(replaced(key), value.toString())); + } + + @Override + public ImdgPredicate less(String key, Comparable value) { + return new DBPredicate(" (%s < %s) ".formatted(replaced(key), value.toString())); + } + + @Override + public ImdgPredicate notNull(String key) { + return new DBPredicate(" (%s is not null) ".formatted(replaced(key))); + } + + @Override + public ImdgPredicate isNull(String key) { + return new DBPredicate(" (%s is null) ".formatted(replaced(key))); + } + + @Override + public ImdgPredicate in(String key, Comparable... values) { + return new DBPredicate( + " (%s in (%s) ".formatted( + replaced(key), + Arrays.stream(values) + .map(" '%s' "::formatted) + .collect(Collectors.joining(",")) + ) + ); + } + + @Override + public ImdgPredicate ilike(String key, String pattern) { + throw new UnsupportedOperationException("not implemented"); + } + + @Override + public ImdgPredicate not(ImdgPredicate param) { + throw new UnsupportedOperationException("not implemented"); + } + + @Override + public ImdgPredicate and(ImdgPredicate paramA, ImdgPredicate paramB) { + return new DBPredicate(" ((%s) and (%s)) ".formatted(paramA.toString(), paramB.toString())); + } + + @Override + public ImdgPredicate and(ImdgPredicate... param) { + return new DBPredicate( + " (%s) ".formatted( + Arrays.stream(param) + .map(predicate -> " (%s) ") + .collect(Collectors.joining(" and ")) + ) + ); + } + + @Override + public ImdgPredicate or(ImdgPredicate paramA, ImdgPredicate paramB) { + return new DBPredicate(" ((%s) or (%s)) ".formatted(paramA.toString(), paramB.toString())); + } + + @Override + public ImdgPredicate or(ImdgPredicate... param) { + return new DBPredicate( + " (%s) ".formatted( + Arrays.stream(param) + .map(predicate -> " (%s) ") + .collect(Collectors.joining(" or ")) + ) + ); + } + + @Override + public ImdgPredicate sql(String sql) { + return new DBPredicate(sql); + } + +} 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 new file mode 100644 index 000000000..e2ddb8c63 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBProvider.java @@ -0,0 +1,68 @@ +package ru.spcex.clearing.reports.db_direct; + +import java.util.HashMap; +import java.util.Map; +import org.springframework.jdbc.core.JdbcTemplate; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.AccountSymbols; +import ru.clearing.classes.statics.data.company.ClearingMemberCategory; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.execution.ExecutionCurrency; +import ru.clearing.classes.statics.data.execution.ExecutionDeposit; +import ru.clearing.classes.statics.data.execution.ExecutionFond; +import ru.clearing.classes.statics.data.misc.Session; +import ru.clearing.classes.statics.data.profile.ProfileDocument; +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.RegistryCodeDictionary; +import ru.spcex.platform.classes.base.SpcexObjectBase; +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.api.ImdgTransaction; + +public class DBProvider implements ImdgProvider { + private final Map, Map> fieldsMatcherForTable; + private final Map, String> tableNameForClass; + private final JdbcTemplate jdbcTemplate; + + public DBProvider(Map, Map> fieldsMatcherForTable, JdbcTemplate jdbcTemplate) { + this.fieldsMatcherForTable = fieldsMatcherForTable; + this.jdbcTemplate = jdbcTemplate; + this.tableNameForClass = new HashMap<>(); + this.tableNameForClass.put(Account.class, "ACCOUNT"); + this.tableNameForClass.put(ExecutionFond.class, "EXECUTION_FOND"); + this.tableNameForClass.put(ExecutionDeposit.class, "EXECUTION_DEPOSIT"); + this.tableNameForClass.put(Company.class, "COMPANY"); + this.tableNameForClass.put(Registry.class, "REGISTRY"); + this.tableNameForClass.put(Session.class, "SESSION"); + this.tableNameForClass.put(CurrencyPairDictionary.class, "CURRENCY_PAIR_DICTIONARY"); + this.tableNameForClass.put(CurrencyPairSecurity.class, "CURRENCY_PAIR_SECURITY"); + this.tableNameForClass.put(RegistryCodeDictionary.class, "REGISTRY_CODE_DICTIONARY"); + this.tableNameForClass.put(ClearingMemberCategory.class, "CLEARING_MEMBER_CATEGORY"); + this.tableNameForClass.put(AccountSymbols.class, "ACCOUNT_SYMBOLS"); + this.tableNameForClass.put(ProfileDocument.class, "PROFILE_DOCUMENT"); + this.tableNameForClass.put(ExecutionCurrency.class, "EXECUTION_CURRENCY"); + this.tableNameForClass.put(TradingClearingRegistry.class, "TRADING_CLEARING_REGISTRY"); + } + + @Override + public Imdg getImdg(String key, Class clazz) { + Map fieldsMatcherMap = fieldsMatcherForTable.get(clazz); + String tableName = tableNameForClass.get(clazz); + return new DBMap<>(fieldsMatcherMap, tableName, jdbcTemplate, clazz); + } + + @Override + public ImdgId getImdgIdGenerator() { + throw new UnsupportedOperationException("not implemented for direct DB provider"); + } + + @Override + public ImdgTransaction newTransaction() { + throw new UnsupportedOperationException("not implemented for direct DB provider"); + } + +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBRegistryParams.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBRegistryParams.java new file mode 100644 index 000000000..14dc63210 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBRegistryParams.java @@ -0,0 +1,2 @@ +package ru.spcex.clearing.reports.db_direct;public class DBRegistryParams { +} From 2c00b9194bd7a717d55d862d62a405b2bde9411e Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 5 Aug 2024 12:18:01 +0300 Subject: [PATCH 02/21] RegistryCodeSqlBuilder new interface --- .../specific/RegistryCodeSqlBuilder.java | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/RegistryCodeSqlBuilder.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/RegistryCodeSqlBuilder.java index 9e055e907..74c7081e0 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/RegistryCodeSqlBuilder.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/RegistryCodeSqlBuilder.java @@ -1,20 +1,34 @@ package ru.spcex.platform.imdg.api.predicate.specific; -import ru.spcex.platform.enumeration.RegistryTradingParams; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; - import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import ru.spcex.platform.enumeration.RegistryTradingParams; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; public class RegistryCodeSqlBuilder { private List registryTradingParams; private String prefix = null; + private String registryDesignation = "registryDesignation"; + private String registryInstrumentType = "registryInstrumentType"; + private String registryCapacity = "registryCapacity"; + private String registryUnit = "registryUnit"; public static RegistryCodeSqlBuilder getInstance(RegistryTradingParams... tradingParams) { + return getInstance(false, tradingParams); + } + + public static RegistryCodeSqlBuilder getInstance(boolean directDB, RegistryTradingParams... tradingParams) { + RegistryCodeSqlBuilder builder = new RegistryCodeSqlBuilder(Arrays.asList(tradingParams)); + if (directDB) { + builder.registryDesignation = "registry_designation"; + builder.registryInstrumentType = "registry_instrument_type"; + builder.registryCapacity = "registry_capacity"; + builder.registryUnit = "registry_unit"; + } return new RegistryCodeSqlBuilder(Arrays.asList(tradingParams)); } @@ -24,10 +38,10 @@ public class RegistryCodeSqlBuilder { public String build() { List conditions = new ArrayList<>(); - String REGISTRY_DESIGNATION_FORMAT = "registryDesignation = '%s'"; - String REGISTRY_INSTRUMENT_TYPE_FORMAT = "registryInstrumentType = '%s'"; - String REGISTRY_CAPACITY_FORMAT = "registryCapacity = '%s'"; - String REGISTRY_UNIT_FORMAT = "registryUnit = '%s'"; + String REGISTRY_DESIGNATION_FORMAT = registryDesignation + " = '%s'"; + String REGISTRY_INSTRUMENT_TYPE_FORMAT = registryInstrumentType + " = '%s'"; + String REGISTRY_CAPACITY_FORMAT = registryCapacity + " = '%s'"; + String REGISTRY_UNIT_FORMAT = registryUnit + " = '%s'"; if (prefix != null) { REGISTRY_DESIGNATION_FORMAT = "%s.%s".formatted(prefix, REGISTRY_DESIGNATION_FORMAT); REGISTRY_INSTRUMENT_TYPE_FORMAT = "%s.%s".formatted(prefix, REGISTRY_INSTRUMENT_TYPE_FORMAT); @@ -75,10 +89,10 @@ public class RegistryCodeSqlBuilder { public ImdgPredicate buildPredicate(ImdgPredicateBuilder pb) { List conditionsOr = new ArrayList<>(); - String REGISTRY_DESIGNATION_FIELD = "registryDesignation"; - String REGISTRY_INSTRUMENT_TYPE_FIELD = "registryInstrumentType"; - String REGISTRY_CAPACITY_FIELD = "registryCapacity"; - String REGISTRY_UNIT_FIELD = "registryUnit"; + String REGISTRY_DESIGNATION_FIELD = registryDesignation; + String REGISTRY_INSTRUMENT_TYPE_FIELD = registryInstrumentType; + String REGISTRY_CAPACITY_FIELD = registryCapacity; + String REGISTRY_UNIT_FIELD = registryUnit; if (prefix != null) { REGISTRY_DESIGNATION_FIELD = "%s.%s".formatted(prefix, REGISTRY_DESIGNATION_FIELD); REGISTRY_INSTRUMENT_TYPE_FIELD = "%s.%s".formatted(prefix, REGISTRY_INSTRUMENT_TYPE_FIELD); From 10d6ad51f1721272fdb83f611ba25bc5d1b37275 Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 5 Aug 2024 12:18:39 +0300 Subject: [PATCH 03/21] RegistryCodeSqlBuilder --- .../imdg/api/predicate/specific/RegistryCodeSqlBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/RegistryCodeSqlBuilder.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/RegistryCodeSqlBuilder.java index 74c7081e0..181ae1e11 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/RegistryCodeSqlBuilder.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/RegistryCodeSqlBuilder.java @@ -29,7 +29,7 @@ public class RegistryCodeSqlBuilder { builder.registryCapacity = "registry_capacity"; builder.registryUnit = "registry_unit"; } - return new RegistryCodeSqlBuilder(Arrays.asList(tradingParams)); + return builder; } private RegistryCodeSqlBuilder(List tradingParams) { From 761204b076a72e9eb5f07015f1dddcbca35638f9 Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 5 Aug 2024 12:40:46 +0300 Subject: [PATCH 04/21] RegistryCodeSqlBuilder --- .../specific/RegistryCodeRawSqlBuilder.java | 15 +++++++++++++++ .../specific/RegistryCodeSqlBuilder.java | 19 +++++++++---------- 2 files changed, 24 insertions(+), 10 deletions(-) create mode 100644 platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/RegistryCodeRawSqlBuilder.java diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/RegistryCodeRawSqlBuilder.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/RegistryCodeRawSqlBuilder.java new file mode 100644 index 000000000..46a1618ad --- /dev/null +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/RegistryCodeRawSqlBuilder.java @@ -0,0 +1,15 @@ +package ru.spcex.platform.imdg.api.predicate.specific; + +import java.util.List; +import ru.spcex.platform.enumeration.RegistryTradingParams; + +public class RegistryCodeRawSqlBuilder extends RegistryCodeSqlBuilder { + RegistryCodeRawSqlBuilder(List tradingParams) { + super(tradingParams); + registryDesignation = "registry_designation"; + registryInstrumentType = "registry_instrument_type"; + registryCapacity = "registry_capacity"; + registryUnit = "registry_unit"; + } + +} diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/RegistryCodeSqlBuilder.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/RegistryCodeSqlBuilder.java index 181ae1e11..c9a97dbe7 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/RegistryCodeSqlBuilder.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/specific/RegistryCodeSqlBuilder.java @@ -12,27 +12,26 @@ public class RegistryCodeSqlBuilder { private List registryTradingParams; private String prefix = null; - private String registryDesignation = "registryDesignation"; - private String registryInstrumentType = "registryInstrumentType"; - private String registryCapacity = "registryCapacity"; - private String registryUnit = "registryUnit"; + protected String registryDesignation = "registryDesignation"; + protected String registryInstrumentType = "registryInstrumentType"; + protected String registryCapacity = "registryCapacity"; + protected String registryUnit = "registryUnit"; public static RegistryCodeSqlBuilder getInstance(RegistryTradingParams... tradingParams) { return getInstance(false, tradingParams); } public static RegistryCodeSqlBuilder getInstance(boolean directDB, RegistryTradingParams... tradingParams) { - RegistryCodeSqlBuilder builder = new RegistryCodeSqlBuilder(Arrays.asList(tradingParams)); + RegistryCodeSqlBuilder builder; if (directDB) { - builder.registryDesignation = "registry_designation"; - builder.registryInstrumentType = "registry_instrument_type"; - builder.registryCapacity = "registry_capacity"; - builder.registryUnit = "registry_unit"; + builder = new RegistryCodeRawSqlBuilder(Arrays.asList(tradingParams)); + } else { + builder = new RegistryCodeSqlBuilder(Arrays.asList(tradingParams)); } return builder; } - private RegistryCodeSqlBuilder(List tradingParams) { + RegistryCodeSqlBuilder(List tradingParams) { this.registryTradingParams = tradingParams; } From 8d797212b5801f0cb5f858749827fd1f7d9f1ebd Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 5 Aug 2024 14:47:04 +0300 Subject: [PATCH 05/21] something ready for test --- .../clearing/reports/db_direct/DBMap.java | 1 - .../reports/db_direct/DBPredicateBuilder.java | 44 ++- .../reports/db_direct/DBProvider.java | 306 ++++++++++++++++-- .../reports/db_direct/DBRegistryParams.java | 2 - 4 files changed, 319 insertions(+), 34 deletions(-) delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBRegistryParams.java 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 26703f40b..bd085ef57 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 @@ -28,7 +28,6 @@ public class DBMap implements Imdg { return jdbcTemplate.queryForObject("select * from %s where ID = %d".formatted(tableName, id), clazz); } - @SuppressWarnings("sql") @Override public Collection getCollectionObjectsByPredicate(ImdgPredicate predicate) { String sql = predicate.toString(); 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 417ef84c7..c8083fae0 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,5 +1,9 @@ package ru.spcex.clearing.reports.db_direct; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.Map; import java.util.stream.Collectors; @@ -7,58 +11,74 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast; public class DBPredicateBuilder extends ImdgPredicateBuilderHazelcast { + 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 Map fieldMatcherMap; public DBPredicateBuilder(Map fieldMatcherMap) { this.fieldMatcherMap = fieldMatcherMap; } - private String replaced(String key) { - return fieldMatcherMap.get(key); + private String replaceKey(String key) { + String result = fieldMatcherMap.get(key); + return result == null ? key : result; + } + + private String replaceValue(Object object) { + if (object == null) + throw new UnsupportedOperationException("For compare 'is null' or 'is not null' use methods isNull() and notNull()"); + + if (object instanceof String strObj) return " '%s' ".formatted(strObj); + if (object instanceof Character charObj) return " '%s' ".formatted(charObj); + 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)); + return " %s ".formatted(object.toString()); } @Override public ImdgPredicate equals(String key, Object value) { - return new DBPredicate(" (%s = %s) ".formatted(replaced(key), value.toString())); + return new DBPredicate(" (%s = %s) ".formatted(replaceKey(key), replaceValue(value))); } @Override public ImdgPredicate greatEqual(String key, Comparable value) { - return new DBPredicate(" (%s >= %s) ".formatted(replaced(key), value.toString())); + return new DBPredicate(" (%s >= %s) ".formatted(replaceKey(key), replaceValue(value))); } @Override public ImdgPredicate lessEqual(String key, Comparable value) { - return new DBPredicate(" (%s <= %s) ".formatted(replaced(key), value.toString())); + return new DBPredicate(" (%s <= %s) ".formatted(replaceKey(key), replaceValue(value))); } @Override public ImdgPredicate greater(String key, Comparable value) { - return new DBPredicate(" (%s > %s) ".formatted(replaced(key), value.toString())); + return new DBPredicate(" (%s > %s) ".formatted(replaceKey(key), replaceValue(value))); } @Override public ImdgPredicate less(String key, Comparable value) { - return new DBPredicate(" (%s < %s) ".formatted(replaced(key), value.toString())); + return new DBPredicate(" (%s < %s) ".formatted(replaceKey(key), replaceValue(value))); } @Override public ImdgPredicate notNull(String key) { - return new DBPredicate(" (%s is not null) ".formatted(replaced(key))); + return new DBPredicate(" (%s is not null) ".formatted(replaceKey(key))); } @Override public ImdgPredicate isNull(String key) { - return new DBPredicate(" (%s is null) ".formatted(replaced(key))); + return new DBPredicate(" (%s is null) ".formatted(replaceKey(key))); } @Override public ImdgPredicate in(String key, Comparable... values) { return new DBPredicate( - " (%s in (%s) ".formatted( - replaced(key), + " (%s in (%s)) ".formatted( + replaceKey(key), Arrays.stream(values) - .map(" '%s' "::formatted) + .map(this::replaceValue) .collect(Collectors.joining(",")) ) ); 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 e2ddb8c63..485fcdb31 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 @@ -24,28 +24,14 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgTransaction; public class DBProvider implements ImdgProvider { - private final Map, Map> fieldsMatcherForTable; - private final Map, String> tableNameForClass; private final JdbcTemplate jdbcTemplate; + private final Map, Map> fieldsMatcherForTable = new HashMap<>(); + private final Map, String> tableNameForClass = new HashMap<>(); - public DBProvider(Map, Map> fieldsMatcherForTable, JdbcTemplate jdbcTemplate) { - this.fieldsMatcherForTable = fieldsMatcherForTable; + public DBProvider(JdbcTemplate jdbcTemplate) { + initFieldsMatcherForTable(); + initTableNames(); this.jdbcTemplate = jdbcTemplate; - this.tableNameForClass = new HashMap<>(); - this.tableNameForClass.put(Account.class, "ACCOUNT"); - this.tableNameForClass.put(ExecutionFond.class, "EXECUTION_FOND"); - this.tableNameForClass.put(ExecutionDeposit.class, "EXECUTION_DEPOSIT"); - this.tableNameForClass.put(Company.class, "COMPANY"); - this.tableNameForClass.put(Registry.class, "REGISTRY"); - this.tableNameForClass.put(Session.class, "SESSION"); - this.tableNameForClass.put(CurrencyPairDictionary.class, "CURRENCY_PAIR_DICTIONARY"); - this.tableNameForClass.put(CurrencyPairSecurity.class, "CURRENCY_PAIR_SECURITY"); - this.tableNameForClass.put(RegistryCodeDictionary.class, "REGISTRY_CODE_DICTIONARY"); - this.tableNameForClass.put(ClearingMemberCategory.class, "CLEARING_MEMBER_CATEGORY"); - this.tableNameForClass.put(AccountSymbols.class, "ACCOUNT_SYMBOLS"); - this.tableNameForClass.put(ProfileDocument.class, "PROFILE_DOCUMENT"); - this.tableNameForClass.put(ExecutionCurrency.class, "EXECUTION_CURRENCY"); - this.tableNameForClass.put(TradingClearingRegistry.class, "TRADING_CLEARING_REGISTRY"); } @Override @@ -65,4 +51,286 @@ public class DBProvider implements ImdgProvider { throw new UnsupportedOperationException("not implemented for direct DB provider"); } + + private void initFieldsMatcherForTable() { + Map accountMatcher = new HashMap<>(); + accountMatcher.put("id", "id"); + accountMatcher.put("updated", "updated_at"); + accountMatcher.put("created", "created_at"); + accountMatcher.put("account", "account"); + accountMatcher.put("accountType", "account_type"); + accountMatcher.put("relationId", "relation_id"); + accountMatcher.put("status", "status"); + accountMatcher.put("processingSign", "processing_sign"); + accountMatcher.put("companyId", "companyId"); + accountMatcher.put("currency", "currency"); + this.fieldsMatcherForTable.put(Account.class, accountMatcher); + + Map executionDepositMatcher = new HashMap<>(); + executionDepositMatcher.put("id", "id"); + executionDepositMatcher.put("updated", "updated_at"); + executionDepositMatcher.put("created", "created_at"); + executionDepositMatcher.put("exchangeExecutionId", "exchange_execution_id"); + executionDepositMatcher.put("side", "side"); + executionDepositMatcher.put("market", "market"); + executionDepositMatcher.put("tradingDate", "trading_date"); + executionDepositMatcher.put("securitySymbol", "security_symbol"); + executionDepositMatcher.put("securityId", "security_id"); + executionDepositMatcher.put("interestAmount", "interest_amount"); + executionDepositMatcher.put("exchangeOrderId", "exchange_order_id"); + executionDepositMatcher.put("price", "price"); + executionDepositMatcher.put("lots", "lots"); + executionDepositMatcher.put("quantity", "quantity"); + executionDepositMatcher.put("exchangeExecutionTime", "exchange_execution_time"); + executionDepositMatcher.put("duration", "duration"); + executionDepositMatcher.put("tradingClearingRegistryId", "trading_clearing_registry_id"); + executionDepositMatcher.put("companyId", "company_id"); + executionDepositMatcher.put("counterPartyId", "counter_party_id"); + executionDepositMatcher.put("securityFullName", "security_full_name"); + executionDepositMatcher.put("settlementCurrency", "settlement_currency"); + executionDepositMatcher.put("coverageStatus", "coverage_status"); + executionDepositMatcher.put("sessionId", "session_id"); + executionDepositMatcher.put("counterPartyTradingClearingRegistryId", "counter_party_trading_clearing_registry_id"); + executionDepositMatcher.put("partyTradingClearingRegistry", "party_trading_clearing_registry"); + executionDepositMatcher.put("counterPartyTradingClearingRegistry", "counter_party_trading_clearing_registry"); + executionDepositMatcher.put("secondLegSettlementDate", "second_leg_settlement_date"); + executionDepositMatcher.put("secondLegSettlementCode", "second_leg_settlement_code"); + executionDepositMatcher.put("firstLegSettlementCode", "first_leg_settlement_code"); + executionDepositMatcher.put("contract", "contract"); + executionDepositMatcher.put("firstLegAmount", "first_leg_amount"); + executionDepositMatcher.put("firstLegSettlementDate", "first_leg_settlement_date"); + executionDepositMatcher.put("secondLegAmount", "second_leg_amount"); + executionDepositMatcher.put("securityCode", "security_code"); + this.fieldsMatcherForTable.put(ExecutionDeposit.class, executionDepositMatcher); + + Map executionFondMatcher = new HashMap<>(); + executionFondMatcher.put("id", "id"); + executionFondMatcher.put("updated", "updated_at"); + executionFondMatcher.put("created", "created_at"); + executionFondMatcher.put("exchangeExecutionId", "exchange_execution_id"); + executionFondMatcher.put("side", "side"); + executionFondMatcher.put("market", "market"); + executionFondMatcher.put("tradingDate", "trading_date"); + executionFondMatcher.put("securitySymbol", "security_symbol"); + executionFondMatcher.put("securityId", "security_id"); + executionFondMatcher.put("interestAmount", "interest_amount"); + executionFondMatcher.put("exchangeOrderId", "exchange_order_id"); + executionFondMatcher.put("price", "price"); + executionFondMatcher.put("settlementAmount", "settlement_amount"); + executionFondMatcher.put("lots", "lots"); + executionFondMatcher.put("quantity", "quantity"); + executionFondMatcher.put("exchangeExecutionTime", "exchange_execution_time"); + executionFondMatcher.put("duration", "duration"); + executionFondMatcher.put("tradingClearingRegistryId", "trading_clearing_registry_id"); + executionFondMatcher.put("comment", "comment"); + executionFondMatcher.put("clientCodeId", "client_code_id"); + executionFondMatcher.put("settlementCode", "settlement_code"); + executionFondMatcher.put("companyId", "company_id"); + executionFondMatcher.put("counterPartyId", "counter_party_id"); + executionFondMatcher.put("securityFullName", "security_full_name"); + executionFondMatcher.put("settlementDate", "settlement_date"); + executionFondMatcher.put("settlementCurrency", "settlement_currency"); + executionFondMatcher.put("exchangeExecutionMicroseconds", "exchange_execution_microseconds"); + executionFondMatcher.put("coverageStatus", "coverage_status"); + executionFondMatcher.put("sessionId", "session_id"); + executionFondMatcher.put("counterPartyTradingClearingRegistryId", "counter_party_trading_clearing_registry_id"); + executionFondMatcher.put("partyTradingClearingRegistry", "party_trading_clearing_registry"); + executionFondMatcher.put("counterPartyTradingClearingRegistry", "counter_party_trading_clearing_registry"); + this.fieldsMatcherForTable.put(ExecutionDeposit.class, executionFondMatcher); + + Map companyMatcher = new HashMap<>(); + companyMatcher.put("id", "id"); + companyMatcher.put("updated", "updated_at"); + companyMatcher.put("created", "created_at"); + companyMatcher.put("shortName", "short_name"); + companyMatcher.put("fullName", "full_name"); + companyMatcher.put("tradingCode", "trading_code"); + companyMatcher.put("clearingCode", "clearing_code"); + companyMatcher.put("registrationCode", "registration_code"); + companyMatcher.put("workflowStatus", "workflow_status"); + this.fieldsMatcherForTable.put(Company.class, companyMatcher); + + Map registryMatcher = new HashMap<>(); + registryMatcher.put("id", "id"); + registryMatcher.put("updated", "updated_at"); + registryMatcher.put("created", "created_at"); + registryMatcher.put("companyId", "company_id"); + registryMatcher.put("tradingCode", "trading_code"); + registryMatcher.put("clearingCode", "clearing_code"); + registryMatcher.put("shortName", "short_name"); + registryMatcher.put("fullName", "full_name"); + registryMatcher.put("accountId", "account_id"); + registryMatcher.put("accountType", "account_type"); + registryMatcher.put("account", "account"); + registryMatcher.put("registryDesignation", "registry_designation"); + registryMatcher.put("registryInstrumentType", "registry_instrument_type"); + registryMatcher.put("registryCapacity", "registry_capacity"); + registryMatcher.put("registryUnit", "registry_unit"); + registryMatcher.put("registryCode", "registry_code"); + registryMatcher.put("tradingClearingRegistryId", "trading_clearing_registry_id"); + registryMatcher.put("tradingClearingRegistry", "trading_clearing_registry"); + registryMatcher.put("registryStatus", "registry_status"); + registryMatcher.put("securityId", "security_id"); + registryMatcher.put("securitySymbol", "security_symbol"); + registryMatcher.put("balance", "balance"); + registryMatcher.put("openBalance", "open_balance"); + registryMatcher.put("closeBalance", "close_balance"); + registryMatcher.put("credit", "credit"); + registryMatcher.put("debit", "debit"); + registryMatcher.put("settledCredit", "settled_credit"); + registryMatcher.put("settledDebit", "settled_debit"); + registryMatcher.put("checkBalance", "check_balance"); + registryMatcher.put("diffBalance", "diff_balance"); + registryMatcher.put("planBalance", "plan_balance"); + registryMatcher.put("balanceDimension", "balance_dimension"); + registryMatcher.put("settlementDate", "settlement_date"); + registryMatcher.put("settlementCode", "settlement_code"); + registryMatcher.put("tradingDate", "trading_date"); + registryMatcher.put("clearingDate", "clearing_date"); + registryMatcher.put("refundDate", "refund_date"); + registryMatcher.put("valueDate", "value_date"); + registryMatcher.put("price", "price"); + registryMatcher.put("contract", "contract"); + registryMatcher.put("counterPartyId", "counter_party_id"); + registryMatcher.put("comment", "comment"); + registryMatcher.put("parentId", "parent_id"); + registryMatcher.put("groupId", "group_id"); + registryMatcher.put("sessionId", "session_id"); + registryMatcher.put("sessionType", "session_type"); + registryMatcher.put("paymentId", "payment_id"); + this.fieldsMatcherForTable.put(Registry.class, registryMatcher); + + Map sessionMatcher = new HashMap<>(); + sessionMatcher.put("id", "id"); + sessionMatcher.put("updated", "updated_at"); + sessionMatcher.put("created", "created_at"); + sessionMatcher.put("clearingDate", "clearing_date"); + sessionMatcher.put("sessionStatus", "session_status"); + sessionMatcher.put("companyId", "company_id"); + sessionMatcher.put("securityId", "security_id"); + sessionMatcher.put("userId", "user_id"); + sessionMatcher.put("section", "section"); + sessionMatcher.put("sessionType", "session_type"); + sessionMatcher.put("workflowStatus", "workflow_status"); + this.fieldsMatcherForTable.put(Session.class, sessionMatcher); + + Map currencyPairDictionaryMatcher = new HashMap<>(); + currencyPairDictionaryMatcher.put("id", "id"); + currencyPairDictionaryMatcher.put("code", "code"); + currencyPairDictionaryMatcher.put("baseCurrencyId", "base_currency_id"); + currencyPairDictionaryMatcher.put("quoteCurrencyId", "quote_currency_id"); + currencyPairDictionaryMatcher.put("majorSign", "major_sign"); + this.fieldsMatcherForTable.put(CurrencyPairDictionary.class, currencyPairDictionaryMatcher); + + Map currencyPairSecurityMatcher = new HashMap<>(); + currencyPairSecurityMatcher.put("id", "id"); + currencyPairSecurityMatcher.put("updated", "updated_at"); + currencyPairSecurityMatcher.put("created", "created_at"); + currencyPairSecurityMatcher.put("baseUnitSize", "base_unit_size"); + currencyPairSecurityMatcher.put("currencyPairId", "currency_pair_id"); + currencyPairSecurityMatcher.put("code", "code"); + currencyPairSecurityMatcher.put("settlementType", "settlement_type"); + currencyPairSecurityMatcher.put("clearingOrganization", "clearing_organization"); + currencyPairSecurityMatcher.put("settlementOrganization", "settlement_organization"); + currencyPairSecurityMatcher.put("securityId", "security_id"); + this.fieldsMatcherForTable.put(CurrencyPairSecurity.class, currencyPairSecurityMatcher); + + Map registryCodeDictionaryMatcher = new HashMap<>(); + registryCodeDictionaryMatcher.put("id", "id"); + registryCodeDictionaryMatcher.put("code", "code"); + registryCodeDictionaryMatcher.put("name", "name"); + this.fieldsMatcherForTable.put(RegistryCodeDictionary.class, registryCodeDictionaryMatcher); + + Map clearingMemberCategoryMatcher = new HashMap<>(); + clearingMemberCategoryMatcher.put("company_id", "company_id"); + clearingMemberCategoryMatcher.put("clearingMemberCategory", "clearing_member_category"); + clearingMemberCategoryMatcher.put("id", "id"); + this.fieldsMatcherForTable.put(ClearingMemberCategory.class, clearingMemberCategoryMatcher); + + Map accountSymbolsMatcher = new HashMap<>(); + accountSymbolsMatcher.put("id", "id"); + accountSymbolsMatcher.put("accountId", "account_id"); + accountSymbolsMatcher.put("accountSymbolValue", "account_symbol_value"); + this.fieldsMatcherForTable.put(AccountSymbols.class, accountSymbolsMatcher); + + Map profileDocumentMatcher = new HashMap<>(); + profileDocumentMatcher.put("companyId", "company_id"); + profileDocumentMatcher.put("documentType", "document_type"); + profileDocumentMatcher.put("issueDate", "issue_date"); + profileDocumentMatcher.put("issuePlace", "issue_place"); + profileDocumentMatcher.put("issuer", "issuer"); + profileDocumentMatcher.put("issuerCode", "issuer_code"); + profileDocumentMatcher.put("name", "name"); + profileDocumentMatcher.put("number", "number"); + profileDocumentMatcher.put("place", "place"); + profileDocumentMatcher.put("validFromDate", "valid_from_date"); + profileDocumentMatcher.put("validToDate", "valid_to_date"); + profileDocumentMatcher.put("link", "link"); + profileDocumentMatcher.put("id", "id"); + this.fieldsMatcherForTable.put(ProfileDocument.class, profileDocumentMatcher); + + Map executionCurrencyMatcher = new HashMap<>(); + executionCurrencyMatcher.put("id", "id"); + executionCurrencyMatcher.put("updated", "updated_at"); + executionCurrencyMatcher.put("created", "created_at"); + executionCurrencyMatcher.put("exchangeExecutionId", "exchange_execution_id"); + executionCurrencyMatcher.put("exchangeExecutionTime", "exchange_execution_time"); + executionCurrencyMatcher.put("exchangeExecutionMicroseconds", "exchange_execution_microseconds"); + executionCurrencyMatcher.put("tradingDate", "trading_date"); + executionCurrencyMatcher.put("settlementDate", "settlement_date"); + executionCurrencyMatcher.put("settlementCode", "settlement_code"); + executionCurrencyMatcher.put("securityId", "security_id"); + executionCurrencyMatcher.put("securitySymbol", "security_symbol"); + executionCurrencyMatcher.put("securityName", "security_name"); + executionCurrencyMatcher.put("companyId", "company_id"); + executionCurrencyMatcher.put("partyTradingClearingRegistryId", "party_trading_clearing_registry_id"); + executionCurrencyMatcher.put("partyTradingClearingRegistry", "party_trading_clearing_registry"); + executionCurrencyMatcher.put("counterPartyId", "counter_party_id"); + executionCurrencyMatcher.put("counterPartyTradingClearingRegistryId", "counter_party_trading_clearing_registry_id"); + executionCurrencyMatcher.put("counterPartyTradingClearingRegistry", "counter_party_trading_clearing_registry"); + executionCurrencyMatcher.put("market", "market"); + executionCurrencyMatcher.put("price", "price"); + executionCurrencyMatcher.put("lots", "lots"); + executionCurrencyMatcher.put("settlementAmount", "settlement_amount"); + executionCurrencyMatcher.put("quantity", "quantity"); + executionCurrencyMatcher.put("side", "side"); + executionCurrencyMatcher.put("currencyCode", "_currency_code"); + executionCurrencyMatcher.put("settlementOrganization", "settlement_organization"); + executionCurrencyMatcher.put("coverageStatus", "coverage_status"); + executionCurrencyMatcher.put("sessionId", "session_id"); + executionCurrencyMatcher.put("clearingDate", "clearing_date"); + this.fieldsMatcherForTable.put(ExecutionCurrency.class, executionCurrencyMatcher); + + Map tradingClearingRegistryMatcher = new HashMap<>(); + tradingClearingRegistryMatcher.put("id", "id"); + tradingClearingRegistryMatcher.put("updated", "updated_at"); + tradingClearingRegistryMatcher.put("created", "created_at"); + tradingClearingRegistryMatcher.put("companyId", "company_id"); + tradingClearingRegistryMatcher.put("code", "code"); + tradingClearingRegistryMatcher.put("moneyAccountId", "money_account_id"); + tradingClearingRegistryMatcher.put("depoAccountId", "depo_account_id"); + tradingClearingRegistryMatcher.put("tradingClearingRegistryType", "trading_clearing_registry_type"); + tradingClearingRegistryMatcher.put("tradingClearingRegistryLevel", "trading_clearing_registry_level"); + tradingClearingRegistryMatcher.put("tradingClearingRegistryPurpose", "trading_clearing_registry_purpose"); + tradingClearingRegistryMatcher.put("status", "status"); + this.fieldsMatcherForTable.put(TradingClearingRegistry.class, tradingClearingRegistryMatcher); + } + + private void initTableNames() { + this.tableNameForClass.put(Account.class, "ACCOUNT"); + this.tableNameForClass.put(ExecutionFond.class, "EXECUTION_FOND"); + this.tableNameForClass.put(ExecutionDeposit.class, "EXECUTION_DEPOSIT"); + this.tableNameForClass.put(Company.class, "COMPANY"); + this.tableNameForClass.put(Registry.class, "REGISTRY"); + this.tableNameForClass.put(Session.class, "SESSION"); + this.tableNameForClass.put(CurrencyPairDictionary.class, "CURRENCY_PAIR_DICTIONARY"); + this.tableNameForClass.put(CurrencyPairSecurity.class, "CURRENCY_PAIR_SECURITY"); + this.tableNameForClass.put(RegistryCodeDictionary.class, "REGISTRY_CODE_DICTIONARY"); + this.tableNameForClass.put(ClearingMemberCategory.class, "CLEARING_MEMBER_CATEGORY"); + this.tableNameForClass.put(AccountSymbols.class, "ACCOUNT_SYMBOLS"); + this.tableNameForClass.put(ProfileDocument.class, "PROFILE_DOCUMENT"); + this.tableNameForClass.put(ExecutionCurrency.class, "EXECUTION_CURRENCY"); + this.tableNameForClass.put(TradingClearingRegistry.class, "TRADING_CLEARING_REGISTRY"); + } + } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBRegistryParams.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBRegistryParams.java deleted file mode 100644 index 14dc63210..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBRegistryParams.java +++ /dev/null @@ -1,2 +0,0 @@ -package ru.spcex.clearing.reports.db_direct;public class DBRegistryParams { -} From 44c547d07c06330a49d52391c44a256d886f188d Mon Sep 17 00:00:00 2001 From: akulikov Date: Tue, 6 Aug 2024 18:25:55 +0300 Subject: [PATCH 06/21] reports-service new features (direct db) --- clearing-parent/reports-service/pom.xml | 9 ++ clearing-parent/reports-service/readme.md | 5 +- .../reports/ReportsServiceApplication.java | 4 +- .../reports/builders/CSVReportBuilder.java | 49 ++++--- .../ks/KSCommissionTradesReportBuilder.java | 54 ++++--- .../ks/KSRepCashNettoReportBuilder.java | 22 ++- .../KSRepCashRegisterSumsReportBuilder.java | 12 +- .../ks/KSRepCashRegistersReportBuilder.java | 29 ++-- .../ks/KSRepDepoNettoReportBuilder.java | 29 ++-- ...epDepoRegisterQuantitiesReportBuilder.java | 14 +- .../ks/KSRepDepoRegistersReportBuilder.java | 31 ++-- .../ks/KSRepFirmDetailsReportBuilder.java | 51 ++++--- .../builders/ks/KSRepTradesReportBuilder.java | 28 ++-- .../ks/KSSessionListReportBuilder.java | 19 ++- .../reports/config/ClearingImdgConfig.java | 65 ++++----- .../clearing/reports/config/KafkaConfig.java | 21 ++- .../reports/config/settings/DirectDB.java | 58 ++++++++ .../settings/ReportsServiceSettings.java | 12 +- .../clearing/reports/db_direct/DBMap.java | 136 +++++++++++++++--- .../reports/db_direct/DBPredicateBuilder.java | 7 +- .../reports/db_direct/DBProvider.java | 13 ++ .../NCMPNotificationBuilder.java | 63 +++++--- .../NTCRNotificationBuilder.java | 24 ++-- .../notifications/NotificationBuilder.java | 16 +-- .../notifications/REXNotificationBuilder.java | 23 ++- .../ROOT_ACTV_NotificationBuilder.java | 36 +++-- .../ROOT_BLKD_NotificationBuilder.java | 36 +++-- .../ROOT_CLOS_NotificationBuilder.java | 41 ++++-- .../ROOT_NEW_NotificationBuilder.java | 39 +++-- .../ROOT_SSPD_NotificationBuilder.java | 36 +++-- .../RRPCNotificationBuilder.java | 34 +++-- .../src/main/resources/application.properties | 8 ++ .../NotificationBuilderTest.java | 20 ++- 33 files changed, 704 insertions(+), 340 deletions(-) create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/settings/DirectDB.java diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml index 3eb65f449..c35426eac 100644 --- a/clearing-parent/reports-service/pom.xml +++ b/clearing-parent/reports-service/pom.xml @@ -132,6 +132,15 @@ spring-boot-test test + + com.mchange + c3p0 + + + org.postgresql + postgresql + 42.7.3 + diff --git a/clearing-parent/reports-service/readme.md b/clearing-parent/reports-service/readme.md index 4ab9323ef..3aca42cba 100644 --- a/clearing-parent/reports-service/readme.md +++ b/clearing-parent/reports-service/readme.md @@ -4,7 +4,7 @@ report-service Сервис для генерации отчётов. -Формат xml, docx. +Формат xml, docx, csv. Параметры запуска @@ -12,6 +12,7 @@ report-service --spring.config.location= путь к папке с файлом настроек application.properties --console - признак, что надо запуститься не как сервис, слушающий очередь kafka, а как утилита для генерации отчётов за текущий день/месяц и выключиться. +-Dspring.profiles.active=dev - позволяет выгружать данные из БД в обход IMDG (нужны соответствующие настройки подключения) По умолчанию запускается в режиме сервиса. @@ -48,6 +49,8 @@ DAILY - все ежедневные reports-service.kafka-consumer - группа настроек для подключения к очереди kafka + reports-service.direct-db - группа настроек для подключения к базе (если нужно получать данные напрямую из БД в обход IMDG) + и другие настройки. Рабочие папки diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java index 0492bb849..52594c333 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java @@ -4,10 +4,12 @@ import org.apache.commons.lang3.exception.ExceptionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.ConfigurableApplicationContext; -@SpringBootApplication +//@SpringBootApplication +@SpringBootApplication(exclude={DataSourceAutoConfiguration.class}) public class ReportsServiceApplication { public static void main(String[] args) { try { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/CSVReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/CSVReportBuilder.java index 53a3b4243..2e71182e7 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/CSVReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/CSVReportBuilder.java @@ -1,20 +1,5 @@ package ru.spcex.clearing.reports.builders; -import com.opencsv.CSVWriter; -import com.opencsv.ICSVWriter; -import com.opencsv.bean.*; -import com.opencsv.exceptions.CsvBadConverterException; -import com.opencsv.exceptions.CsvChainedException; -import com.opencsv.exceptions.CsvFieldAssignmentException; -import com.opencsv.exceptions.CsvRequiredFieldEmptyException; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import ru.clearing.classes.statics.data.misc.Session; -import ru.spcex.platform.enumeration.ReportBuilderType; -import ru.spcex.platform.enumeration.ReportKeys; -import ru.spcex.platform.imdg.api.Imdg; - import java.io.File; import java.io.FileWriter; import java.io.IOException; @@ -26,8 +11,34 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.util.*; +import java.util.Collection; +import java.util.List; +import java.util.Locale; +import java.util.Set; import java.util.stream.Collectors; +import com.opencsv.CSVWriter; +import com.opencsv.ICSVWriter; +import com.opencsv.bean.AbstractCsvConverter; +import com.opencsv.bean.BeanField; +import com.opencsv.bean.ColumnPositionMappingStrategy; +import com.opencsv.bean.ConverterNumber; +import com.opencsv.bean.CsvBindByName; +import com.opencsv.bean.CsvBindByPosition; +import com.opencsv.bean.CsvConverter; +import com.opencsv.bean.CsvNumber; +import com.opencsv.bean.StatefulBeanToCsv; +import com.opencsv.bean.StatefulBeanToCsvBuilder; +import com.opencsv.exceptions.CsvBadConverterException; +import com.opencsv.exceptions.CsvChainedException; +import com.opencsv.exceptions.CsvFieldAssignmentException; +import com.opencsv.exceptions.CsvRequiredFieldEmptyException; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.clearing.classes.statics.data.misc.Session; +import ru.spcex.platform.enumeration.ReportBuilderType; +import ru.spcex.platform.enumeration.ReportKeys; +import ru.spcex.platform.imdg.api.Imdg; /** * Класс для построения отчетов в формате CSV @@ -136,10 +147,8 @@ public abstract class CSVReportBuilder { } protected List getSessionIdsForCurrentDate(Imdg sessionImdg) { - Collection sessionForCurrentDay = sessionImdg.getCollectionObjectsByFieldValues( - Map.of( - "clearingDate", LocalDate.now() - ) + Collection sessionForCurrentDay = sessionImdg.getCollectionObjectsByPredicate( + sessionImdg.predicateBuilder().equals("clearingDate", LocalDate.now()) ); Set sessionIds = sessionForCurrentDay.stream().map(Session::getId).collect(Collectors.toSet()); return sessionIds.stream().toList(); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java index 09f2b6b67..ad9fb91aa 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSCommissionTradesReportBuilder.java @@ -1,5 +1,11 @@ package ru.spcex.clearing.reports.builders.ks; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.company.Company; @@ -10,7 +16,16 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.reports.builders.CSVReportBuilder; import ru.spcex.clearing.reports.builders.EmptyParams; import ru.spcex.clearing.reports.builders.bean.KSCommissionTradesReport; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.MarketCode; +import ru.spcex.platform.enumeration.RegistryStatus; +import ru.spcex.platform.enumeration.RegistryTradingParams; +import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.enumeration.ReportBuilderType; +import ru.spcex.platform.enumeration.ReportKeys; +import ru.spcex.platform.enumeration.Section; +import ru.spcex.platform.enumeration.SessionType; +import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; @@ -18,14 +33,6 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.utils.enumeration.IEnumKey; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - @Component public class KSCommissionTradesReportBuilder extends CSVReportBuilder { protected DateTimeFormatter dateFormatter_ddMMyy = DateTimeFormatter.ofPattern("ddMMyy"); @@ -81,9 +88,9 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder registryImdg; private final Imdg sessionImdg; private final Imdg accountImdg; - private final Imdg currencyPairDictionaryImdg; - private final Imdg currencyPairSecurityImdg; private List rows = null; @@ -49,8 +45,6 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder sessionIds = params.getSessionId(); if (sessionIds == null || sessionIds.isEmpty()) sessionIds = getSessionIdsForCurrentDate(sessionImdg); ImdgPredicate finalPredicate = pb.and( pb.in("sessionId", sessionIds.toArray(new Long[0])), pb.equals("clearingDate", nowDate), - pb.sql(sql), + registryPredicate, pb.or( pb.equals("accountType", AccountType.Clrn.getKey()), pb.equals("accountType", AccountType.Info.getKey()) @@ -181,11 +175,13 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate); log.debug("Found {} registries by query: {}", registries.size(), finalPredicate); @@ -121,10 +119,12 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder sessionsForDay = sessionImdg.getCollectionObjectsByFieldValues(Map.of("clearingDate", LocalDate.now())); + Collection sessionsForDay = sessionImdg.getCollectionObjectsByPredicate( + sessionImdg.predicateBuilder().equals("clearingDate", LocalDate.now()) + ); Long[] sessionIds = sessionsForDay.stream().map(Session::getId).toArray(Long[]::new); ImdgPredicate cmtPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CM_T).buildPredicate(pb); Collection cmtRegistries = registryImdg.getCollectionObjectsByPredicate( @@ -171,8 +176,8 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder clearingMemberCategory = clearingMemberCategoryImdg.getCollectionObjectsByFieldValues( - Map.of("companyId", counterPartyId) + Collection clearingMemberCategory = clearingMemberCategoryImdg.getCollectionObjectsByPredicate( + clearingMemberCategoryImdg.predicateBuilder().equals("companyId", counterPartyId) ); if (!clearingMemberCategory.isEmpty()) { ClearingMemberCategory next = clearingMemberCategory.iterator().next(); @@ -203,8 +208,8 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder { Long counterPartyId = reg.getCounterPartyId(); if (counterPartyId != null) { - Collection clearingMemberCategory = clearingMemberCategoryImdg.getCollectionObjectsByFieldValues( - Map.of("companyId", counterPartyId) + Collection clearingMemberCategory = clearingMemberCategoryImdg.getCollectionObjectsByPredicate( + clearingMemberCategoryImdg.predicateBuilder().equals("companyId", counterPartyId) ); if (!clearingMemberCategory.isEmpty()) { ClearingMemberCategory next = clearingMemberCategory.iterator().next(); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepDepoNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepDepoNettoReportBuilder.java index 0b5570f3b..4c3aa3d89 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepDepoNettoReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepDepoNettoReportBuilder.java @@ -1,5 +1,14 @@ package ru.spcex.clearing.reports.builders.ks; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.account.AccountSymbols; @@ -10,19 +19,17 @@ import ru.spcex.clearing.reports.builders.CSVReportBuilder; import ru.spcex.clearing.reports.builders.PairRegistry3Id; import ru.spcex.clearing.reports.builders.SessionIdParam; import ru.spcex.clearing.reports.builders.bean.KSRepDepoNettoReport; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryTradingParams; +import ru.spcex.platform.enumeration.ReportBuilderType; +import ru.spcex.platform.enumeration.ReportKeys; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; -import java.math.BigDecimal; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.*; -import java.util.stream.Collectors; - @Component public class KSRepDepoNettoReportBuilder extends CSVReportBuilder { private final Imdg registryImdg; @@ -69,11 +76,11 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder sessionIds = params.getSessionId(); if (sessionIds == null || sessionIds.isEmpty()) sessionIds = getSessionIdsForCurrentDate(sessionImdg); - String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CS_T, RegistryTradingParams.LS_T).build(); + ImdgPredicate registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CS_T, RegistryTradingParams.LS_T).buildPredicate(pb); ImdgPredicate finalPredicate = pb.and( pb.in("sessionId", sessionIds.toArray(new Long[0])), pb.equals("clearingDate", nowDate), - pb.sql(sql), + registryPredicate, pb.equals("accountType", AccountType.Depo.getKey()), pb.notNull("account") ); @@ -130,7 +137,9 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder registryImdg; private final Imdg companyImdg; private final Imdg accountSymbolsImdg; - private final Imdg currencyPairDictionaryImdg; - private final Imdg currencyPairSecurityImdg; private List rows = null; @@ -48,8 +43,6 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder { private final Imdg registryImdg; @@ -98,7 +101,9 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder companies = companyImdg.getCollectionObjectsByFieldValues(Map.of("workflowStatus", WorkflowStatus.Active.getKey())); + Collection companies = companyImdg.getCollectionObjectsByPredicate( + companyImdg.predicateBuilder().equals("workflowStatus", WorkflowStatus.Active.getKey()) + ); log.debug("Found {} Company", companies.size()); rows = new ArrayList<>(companies.size()); for (Company company : companies) { try { - CompanySymbols innCompanySymbol = companySymbolsImdg.getFirstObjectByFieldValues( - Map.of( - "companyId", company.getId(), - "companySymbol", CompanySymbol.INN.getKey() - ) + ImdgPredicateBuilder pb = companySymbolsImdg.predicateBuilder(); + CompanySymbols innCompanySymbol = companySymbolsImdg.getFirstObjectByPredicate( + pb.and( + pb.equals("companyId", company.getId()), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ) ); - CompanySymbols cppCompanySymbol = companySymbolsImdg.getFirstObjectByFieldValues( - Map.of( - "companyId", company.getId(), - "companySymbol", CompanySymbol.CPP.getKey() - ) + CompanySymbols cppCompanySymbol = companySymbolsImdg.getFirstObjectByPredicate( + pb.and( + pb.equals("companyId", company.getId()), + pb.equals("companySymbol", CompanySymbol.CPP.getKey()) + ) ); - ProfileDocument profileDocument = profileDocumentImdg.getFirstObjectByFieldValues( - Map.of( - "companyId", company.getId(), - "documentType", DocumentTypes.cntr.getKey() - ) + pb = profileDocumentImdg.predicateBuilder(); + ProfileDocument profileDocument = profileDocumentImdg.getFirstObjectByPredicate( + pb.and( + pb.equals("companyId", company.getId()), + pb.equals("documentType", DocumentTypes.cntr.getKey()) + ) ); KSRepFirmDetailsReport ksRepFirmDetailsReport = new KSRepFirmDetailsReport(); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java index 36236c6f6..3bde5b548 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepTradesReportBuilder.java @@ -38,6 +38,7 @@ import ru.spcex.platform.enumeration.ReportKeys; import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.utils.enumeration.IEnumKey; @@ -144,7 +145,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder registryCollection = registryImdg.getCollectionObjectsByPredicate( pbRegistry.and( pbRegistry.equals("groupId", groupId), @@ -154,7 +155,7 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder { @@ -55,9 +54,9 @@ public class KSSessionListReportBuilder extends CSVReportBuilder query = Map.of("clearingDate", LocalDate.now()); - Collection sessions = sessionImdg.getCollectionObjectsByFieldValues(query); - log.debug("Found {} Session by query: {}", sessions.size(), query); + ImdgPredicate predicate = sessionImdg.predicateBuilder().equals("clearingDate", LocalDate.now()); + Collection sessions = sessionImdg.getCollectionObjectsByPredicate(predicate); + log.debug("Found {} Session by query: {}", sessions.size(), predicate.toString()); rows = new ArrayList<>(sessions.size()); for (Session session : sessions) { try { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ClearingImdgConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ClearingImdgConfig.java index 27de4b75c..51c3d943d 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ClearingImdgConfig.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ClearingImdgConfig.java @@ -1,47 +1,48 @@ package ru.spcex.clearing.reports.config; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; +import java.beans.PropertyVetoException; +import com.mchange.v2.c3p0.ComboPooledDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import ru.spcex.clearing.reports.config.settings.ReportsServiceSettings; +import ru.spcex.clearing.reports.db_direct.DBProvider; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; @Configuration public class ClearingImdgConfig { - private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) { - ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); - if (maxPoolSz > 2) { - pool.setKeepAliveSeconds(60); - pool.setAllowCoreThreadTimeOut(true); - } - pool.setCorePoolSize(maxPoolSz); - pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion); - return pool; - } - - @Bean(name = "taskExecutorHazelcastClientInitializer") - public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() { - return createThreadPoolTaskExecutor(1, true); - } - - @Bean(name = "taskExecutorIdGeneratorAwaiter") - public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() { - return createThreadPoolTaskExecutor(1, false); - } - - @Autowired @Bean - public ImdgProvider imdgProvider( - @Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer, - @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, - ReportsServiceSettings settings - ) { - return new HazelcastService(taskExecutorHazelcastClientInitializer, - taskExecutorIdGeneratorAwaiter, - settings.getHazelcast()); + public ImdgProvider imdgProvider(ReportsServiceSettings settings, Environment env) throws PropertyVetoException { + String[] activeProfiles = env.getActiveProfiles(); + boolean isDevProfile = false; + for (String profile : activeProfiles) { + if (profile.equalsIgnoreCase("DEV")) { + isDevProfile = true; + break; + } + } + if (!isDevProfile) { + ThreadPoolTaskExecutor hazelcastClientInitializerPool = new ThreadPoolTaskExecutor(); + hazelcastClientInitializerPool.setCorePoolSize(1); + hazelcastClientInitializerPool.setWaitForTasksToCompleteOnShutdown(true); + ThreadPoolTaskExecutor idGeneratorAwaiterPool = new ThreadPoolTaskExecutor(); + idGeneratorAwaiterPool.setCorePoolSize(1); + idGeneratorAwaiterPool.setWaitForTasksToCompleteOnShutdown(false); + return new HazelcastService(hazelcastClientInitializerPool, idGeneratorAwaiterPool, settings.getHazelcast()); + } else { + ComboPooledDataSource dataSource = new ComboPooledDataSource(); + dataSource.setDriverClass(settings.getDirectDb().getDriver()); + dataSource.setJdbcUrl(settings.getDirectDb().getUrl()); + dataSource.setUser(settings.getDirectDb().getLogin()); + dataSource.setPassword(settings.getDirectDb().getPassword()); + dataSource.setMinPoolSize(Integer.parseInt(settings.getDirectDb().getMinPoolSize())); + dataSource.setMaxPoolSize(Integer.parseInt(settings.getDirectDb().getMaxPoolSize())); + JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); + return new DBProvider(jdbcTemplate); + } } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java index 2ed531e19..5bcafa140 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java @@ -9,6 +9,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.kafka.core.ProducerFactory; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory; import ru.spcex.clearing.platform.messaging.config.KafkaProducerFactory; @@ -16,9 +17,11 @@ import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings import ru.spcex.clearing.platform.messaging.service.RequestInfo; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.reports.config.settings.ReportsServiceSettings; +import ru.spcex.clearing.reports.db_direct.DBProvider; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; @Configuration public class KafkaConfig { @@ -48,14 +51,26 @@ public class KafkaConfig { @Autowired @Bean - public KafkaSender kafkaSender(KafkaTemplate kafkaTemplate, ImdgProvider imdgProvider) { - ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator(); + public KafkaSender kafkaSender(KafkaTemplate kafkaTemplate, ImdgProvider imdgProvider, ReportsServiceSettings settings) { + final ImdgProvider provider; + if (imdgProvider instanceof DBProvider) { + ThreadPoolTaskExecutor hazelcastClientInitializerPool = new ThreadPoolTaskExecutor(); + hazelcastClientInitializerPool.setCorePoolSize(1); + hazelcastClientInitializerPool.setWaitForTasksToCompleteOnShutdown(true); + ThreadPoolTaskExecutor idGeneratorAwaiterPool = new ThreadPoolTaskExecutor(); + idGeneratorAwaiterPool.setCorePoolSize(1); + idGeneratorAwaiterPool.setWaitForTasksToCompleteOnShutdown(false); + provider = new HazelcastService(hazelcastClientInitializerPool, idGeneratorAwaiterPool, settings.getHazelcast()); + } else { + provider = imdgProvider; + } + ImdgId imdgIdGenerator = provider.getImdgIdGenerator(); return KafkaSender .setup() .setKafkaTemplate(kafkaTemplate) .idGenerator(imdgIdGenerator::nextId) .imdgProvider(s -> { - Imdg imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class); + Imdg imdg = provider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class); return imdg::insert; }) .build(); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/settings/DirectDB.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/settings/DirectDB.java new file mode 100644 index 000000000..281147ae3 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/settings/DirectDB.java @@ -0,0 +1,58 @@ +package ru.spcex.clearing.reports.config.settings; + +public class DirectDB { + private String login; + private String password; + private String url; + private String driver; + private String minPoolSize; + private String maxPoolSize; + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getMinPoolSize() { + return minPoolSize; + } + + public void setMinPoolSize(String minPoolSize) { + this.minPoolSize = minPoolSize; + } + + public String getMaxPoolSize() { + return maxPoolSize; + } + + public void setMaxPoolSize(String maxPoolSize) { + this.maxPoolSize = maxPoolSize; + } + + public String getDriver() { + return driver; + } + + public void setDriver(String driver) { + this.driver = driver; + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/settings/ReportsServiceSettings.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/settings/ReportsServiceSettings.java index 160a3f9ae..69bfa7ba0 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/settings/ReportsServiceSettings.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/settings/ReportsServiceSettings.java @@ -1,5 +1,6 @@ package ru.spcex.clearing.reports.config.settings; +import java.util.List; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; @@ -8,8 +9,6 @@ import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings; import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; -import java.util.List; - @Component @PropertySource("file:${spring.config.location}/application.properties") @ConfigurationProperties("reports-service") @@ -19,6 +18,7 @@ public class ReportsServiceSettings { private KafkaProducerSettings kafkaProducer; private Store reportsStore; private Store notificationsStore; + private DirectDB directDb; @Value("#{'${reports-service.reports.pfx-class-codes}'.split('\\s*,\\s*')}") private List pfxClassCodes; @@ -71,4 +71,12 @@ public class ReportsServiceSettings { public void setPfxClassCodes(List pfxClassCodes) { this.pfxClassCodes = pfxClassCodes; } + + public DirectDB getDirectDb() { + return directDb; + } + + public void setDirectDb(DirectDB directDb) { + this.directDb = directDb; + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBMap.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBMap.java index bd085ef57..11cdd9701 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBMap.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBMap.java @@ -1,18 +1,39 @@ package ru.spcex.clearing.reports.db_direct; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.sql.Date; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Time; +import java.sql.Timestamp; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; public class DBMap implements Imdg { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final DateTimeFormatter localDateFormatter = DateTimeFormatter.ISO_LOCAL_DATE; + private final DateTimeFormatter localTimeFormatter = DateTimeFormatter.ISO_LOCAL_TIME; + private final DateTimeFormatter localDateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; + private final Class clazz; private final Map fieldMatcherMap; private final String tableName; private final JdbcTemplate jdbcTemplate; - private final Class clazz; + private final ReflectionRowMapper reflectionRowMapper; public DBMap(Map fieldMatcherMap, String tableName, @@ -21,23 +42,47 @@ public class DBMap implements Imdg { this.tableName = tableName; this.jdbcTemplate = jdbcTemplate; this.clazz = clazz; + reflectionRowMapper = new ReflectionRowMapper<>(clazz, fieldMatcherMap); } @Override public T getSingleObjectByID(Long id) { - return jdbcTemplate.queryForObject("select * from %s where ID = %d".formatted(tableName, id), clazz); + T result; + try { + result = jdbcTemplate.queryForObject("select * from %s where ID = %d".formatted(tableName, id), reflectionRowMapper); + } catch (Exception e) { + log.warn("Query error", e); + return null; + } + return result; } @Override public Collection getCollectionObjectsByPredicate(ImdgPredicate predicate) { String sql = predicate.toString(); - return jdbcTemplate.queryForList("select * from %s where (%s)".formatted(tableName, sql), clazz); + List result; + try { + result = jdbcTemplate.query("select * from %s where (%s)".formatted(tableName, sql), reflectionRowMapper); + } catch (Exception e) { + log.warn("Query error", e); + return null; + } + if (result.isEmpty()) return Collections.emptyList(); + return result; } @Override public T getFirstObjectByPredicate(ImdgPredicate predicate) { String sql = predicate.toString(); - return jdbcTemplate.queryForObject("select * from %s where (%s) limit 1".formatted(tableName, sql), clazz); + List result; + try { + result = jdbcTemplate.query("select * from %s where (%s) limit 1".formatted(tableName, sql), reflectionRowMapper); + } catch (Exception e) { + log.warn("Query error", e); + return null; + } + if (result.isEmpty()) return null; + return result.iterator().next(); } @Override @@ -47,26 +92,73 @@ public class DBMap implements Imdg { + /** + * Позволяет по матчеру (fieldMatcherMap) создать объект нужного типа (clazz) из ResultSet + */ + static class ReflectionRowMapper implements RowMapper { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Class clazz; + private final Map fieldMatcherMap; + private ReflectionRowMapper(Class clazz, Map fieldMatcherMap) { + this.clazz = clazz; + this.fieldMatcherMap = fieldMatcherMap; + } + @Override + public T mapRow(ResultSet rs, int rowNum) { + T result; + try { + Constructor constructor = clazz.getDeclaredConstructor(); + result = constructor.newInstance(); + for (Map.Entry entry : fieldMatcherMap.entrySet()) { + String pojoName = entry.getKey(); + String dbName = entry.getValue(); + Field field = null; + Object value; + try { + try { + field = clazz.getDeclaredField(pojoName); + } catch (NoSuchFieldException ignored) {} + if (field == null) { + Class superClass = clazz; + do { + superClass = superClass.getSuperclass(); + if (superClass == null) break; + try { + field = superClass.getDeclaredField(pojoName); + } catch (NoSuchFieldException ignored) {} + } while (field == null); + } + if (field == null) continue; + value = rs.getObject(dbName); + } catch (SQLException e) { + continue; + } + setFieldWithCorrectType(field, result, value); + } + } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | + IllegalAccessException e) { + log.error("ReflectionRowMapper error, check code", e); + throw new RuntimeException(e); + } + return result; + } - - @Deprecated - @Override - public Collection getCollectionObjectsBySQL(String paramString) { - return Imdg.super.getCollectionObjectsBySQL(paramString); + private void setFieldWithCorrectType(Field field, T obj, Object value) throws IllegalAccessException { + if (obj == null) return; + field.setAccessible(true); + if (value instanceof Date dateValue) { + field.set(obj, dateValue.toLocalDate()); + } else if (value instanceof Time timeValue) { + field.set(obj, timeValue.toLocalTime()); + } else if (value instanceof Timestamp timestampValue) { + if (field.getType() == Instant.class) { + field.set(obj, timestampValue.toInstant()); + } else if (field.getType() == LocalDateTime.class) { + field.set(obj, timestampValue.toLocalDateTime()); + } + } else field.set(obj, value); + } } - - @Deprecated - @Override - public T getFirstObjectByFieldValues(Map> conditions) { - return Imdg.super.getFirstObjectByFieldValues(conditions); - } - - @Deprecated - @Override - public Collection getCollectionObjectsByFieldValues(Map> conditions) { - return Imdg.super.getCollectionObjectsByFieldValues(conditions); - } - } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBPredicateBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBPredicateBuilder.java index c8083fae0..bd66a4760 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBPredicateBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBPredicateBuilder.java @@ -1,8 +1,10 @@ package ru.spcex.clearing.reports.db_direct; +import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.Map; @@ -34,6 +36,7 @@ public class DBPredicateBuilder extends ImdgPredicateBuilderHazelcast { if (object instanceof LocalDate ldObj) return " '%s' ".formatted(ldObj.format(localDateFormatter)); if (object instanceof LocalTime ltObj) return " '%s' ".formatted(ltObj.format(localTimeFormatter)); if (object instanceof LocalDateTime ldtObj) return " '%s' ".formatted(ldtObj.format(localDateTimeFormatter)); + if (object instanceof Instant instantObj) return " '%s' ".formatted(localDateTimeFormatter.withZone(ZoneId.systemDefault()).format(instantObj)); return " %s ".formatted(object.toString()); } @@ -104,7 +107,7 @@ public class DBPredicateBuilder extends ImdgPredicateBuilderHazelcast { return new DBPredicate( " (%s) ".formatted( Arrays.stream(param) - .map(predicate -> " (%s) ") + .map(predicate -> " (%s) ".formatted(predicate.toString())) .collect(Collectors.joining(" and ")) ) ); @@ -120,7 +123,7 @@ public class DBPredicateBuilder extends ImdgPredicateBuilderHazelcast { return new DBPredicate( " (%s) ".formatted( Arrays.stream(param) - .map(predicate -> " (%s) ") + .map(predicate -> " (%s) ".formatted(predicate.toString())) .collect(Collectors.joining(" or ")) ) ); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBProvider.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBProvider.java index 485fcdb31..49e70bed2 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBProvider.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/db_direct/DBProvider.java @@ -16,6 +16,7 @@ import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.security.CurrencyPairSecurity; import ru.clearing.platform.dictionary.CurrencyPairDictionary; +import ru.clearing.platform.dictionary.ErrorCodeDictionary; import ru.clearing.platform.dictionary.RegistryCodeDictionary; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.imdg.api.Imdg; @@ -51,6 +52,11 @@ public class DBProvider implements ImdgProvider { throw new UnsupportedOperationException("not implemented for direct DB provider"); } + @Override + public void waitAvailable() { + // nothing to do + } + private void initFieldsMatcherForTable() { Map accountMatcher = new HashMap<>(); @@ -314,6 +320,12 @@ public class DBProvider implements ImdgProvider { tradingClearingRegistryMatcher.put("tradingClearingRegistryPurpose", "trading_clearing_registry_purpose"); tradingClearingRegistryMatcher.put("status", "status"); this.fieldsMatcherForTable.put(TradingClearingRegistry.class, tradingClearingRegistryMatcher); + + Map errorCodeDictionaryMatcher = new HashMap<>(); + errorCodeDictionaryMatcher.put("id", "id"); + errorCodeDictionaryMatcher.put("code", "code"); + errorCodeDictionaryMatcher.put("name", "name"); + this.fieldsMatcherForTable.put(ErrorCodeDictionary.class, errorCodeDictionaryMatcher); } private void initTableNames() { @@ -331,6 +343,7 @@ public class DBProvider implements ImdgProvider { this.tableNameForClass.put(ProfileDocument.class, "PROFILE_DOCUMENT"); this.tableNameForClass.put(ExecutionCurrency.class, "EXECUTION_CURRENCY"); this.tableNameForClass.put(TradingClearingRegistry.class, "TRADING_CLEARING_REGISTRY"); + this.tableNameForClass.put(ErrorCodeDictionary.class, "ERROR_CODE_DICTIONARY"); } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NCMPNotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NCMPNotificationBuilder.java index b75689f9f..564f8df3d 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NCMPNotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NCMPNotificationBuilder.java @@ -1,5 +1,11 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,16 +15,12 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.profile.ProfileDocument; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class NCMPNotificationBuilder extends NotificationBuilder { @@ -49,27 +51,54 @@ public class NCMPNotificationBuilder extends NotificationBuilder { return null; } - String profileDocumentSql = "companyId = %d AND documentType = CLRN".formatted(consumerId); + ImdgPredicateBuilder pb = profileDocumentImdg.predicateBuilder(); + ImdgPredicate predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("documentType", "CLRN") + ); ProfileDocument profileDocument = null; - Collection profileDocuments = profileDocumentImdg.getCollectionObjectsBySQL(profileDocumentSql); + Collection profileDocuments = profileDocumentImdg.getCollectionObjectsByPredicate(predicate); if (profileDocuments.size() >= 1) { profileDocument = profileDocuments.iterator().next(); } else { - log.warn("ProfileDocument with sql {} not found", profileDocumentSql); + log.warn("ProfileDocument with sql {} not found", predicate.toString()); return null; } - String companySymbolsValueINN = getCompanySymbolValue("companyId = %d AND companySymbol = %s".formatted(consumerId, CompanySymbol.INN.getKey()), companySymbolsImdg); - String companySymbolValueCLRC = getCompanySymbolValue("companyId = %d AND companySymbol = %s".formatted(consumerId, CompanySymbol.CLRC.getKey()), companySymbolsImdg); - String companySymbolValueRGRC = getCompanySymbolValue("companyId = %d AND companySymbol = %s".formatted(consumerId, CompanySymbol.RGRC.getKey()), companySymbolsImdg); + pb = companySymbolsImdg.predicateBuilder(); + String companySymbolsValueINN = getCompanySymbolValue( + pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ), + companySymbolsImdg + ); + String companySymbolValueCLRC = getCompanySymbolValue( + pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.CLRC.getKey()) + ), + companySymbolsImdg + ); + String companySymbolValueRGRC = getCompanySymbolValue( + pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.RGRC.getKey()) + ), + companySymbolsImdg + ); - String accountSql = "companyId = %d AND accountType = INFO".formatted(consumerId); Account account = null; - Collection accounts = accountImdg.getCollectionObjectsBySQL(accountSql); - if (profileDocuments.size() >= 1) { + pb = accountImdg.predicateBuilder(); + predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("accountType", AccountType.Info.getKey()) + ); + Collection accounts = accountImdg.getCollectionObjectsByPredicate(predicate); + if (!profileDocuments.isEmpty()) { account = accounts.iterator().next(); } else { - log.warn("Account with sql {} not found", accountSql); + log.warn("Account with sql {} not found", predicate.toString()); return null; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NTCRNotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NTCRNotificationBuilder.java index 8b79e1cf0..9ea136aa7 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NTCRNotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NTCRNotificationBuilder.java @@ -1,5 +1,11 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,13 +17,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.Map; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class NTCRNotificationBuilder extends NotificationBuilder { @@ -59,7 +59,15 @@ public class NTCRNotificationBuilder extends NotificationBuilder { return null; } - String companySymbolValueCLRC = getCompanySymbolValue("companyId = %d AND companySymbol = %s".formatted(consumerId, CompanySymbol.INN.getKey()), companySymbolsImdg); + ImdgPredicateBuilder pb = companySymbolsImdg.predicateBuilder(); + + String companySymbolValueCLRC = getCompanySymbolValue( + pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ), + companySymbolsImdg + ); Map valuesForTemplate = new HashMap<>(); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java index e1ac4bb34..c2ed1cce5 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java @@ -1,11 +1,5 @@ package ru.spcex.clearing.reports.notifications; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.spcex.clearing.reports.exceptions.ConfigException; -import ru.spcex.platform.imdg.api.Imdg; - import java.io.File; import java.net.URL; import java.time.LocalDate; @@ -15,6 +9,12 @@ import java.time.format.TextStyle; import java.util.Collection; import java.util.Locale; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.spcex.clearing.reports.exceptions.ConfigException; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; public abstract class NotificationBuilder { protected final Logger log = LoggerFactory.getLogger(getClass()); @@ -76,9 +76,9 @@ public abstract class NotificationBuilder { return filename; } - protected String getCompanySymbolValue(String companySymbolsSql, Imdg companySymbolsImdg) { + protected String getCompanySymbolValue(ImdgPredicate predicate, Imdg companySymbolsImdg) { CompanySymbols companySymbols; - Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsByPredicate(predicate); if (companySymbolsCollection.size() >= 1) { companySymbols = companySymbolsCollection.iterator().next(); } else { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java index b09df0225..862910976 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java @@ -1,5 +1,12 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -7,14 +14,11 @@ import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.profile.ProfileDocument; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.DocumentTypes; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.TextStyle; -import java.util.*; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class REXNotificationBuilder extends NotificationBuilder { @@ -31,7 +35,12 @@ public class REXNotificationBuilder extends NotificationBuilder { @Override public File buildNotification(Long consumerId) { String sql = "companyId = %d AND documentType = 'XCNT'".formatted(consumerId); - Collection profileDocuments = profileDocumentImdg.getCollectionObjectsBySQL(sql); + ImdgPredicateBuilder pb = profileDocumentImdg.predicateBuilder(); + ImdgPredicate predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("documentType", DocumentTypes.xcnt.getKey()) + ); + Collection profileDocuments = profileDocumentImdg.getCollectionObjectsByPredicate(predicate); ProfileDocument currentProfileDocument = null; if (profileDocuments.size() >= 1) { Optional profileDocumentOptional = profileDocuments.stream().max((o1, o2) -> { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_ACTV_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_ACTV_NotificationBuilder.java index 1c92bfe86..9b81cc7fd 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_ACTV_NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_ACTV_NotificationBuilder.java @@ -1,5 +1,13 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.Instant; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,13 +17,11 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.relation.Relation; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.Instant; -import java.time.LocalDateTime; -import java.util.*; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class ROOT_ACTV_NotificationBuilder extends NotificationBuilder { @@ -44,14 +50,14 @@ public class ROOT_ACTV_NotificationBuilder extends NotificationBuilder { return null; } - String relationsSql = "consumerId = %d".formatted(consumerId); Relation relation = null; - Collection relations = relationImdg.getCollectionObjectsBySQL(relationsSql); - if (relations.size() >= 1) { + ImdgPredicate predicate = relationImdg.predicateBuilder().equals("consumerId", consumerId); + Collection relations = relationImdg.getCollectionObjectsByPredicate(predicate); + if (!relations.isEmpty()) { Optional relationOptional = relations.stream().max(Comparator.comparing(BusinessObject::getUpdated)); relation = relationOptional.get(); } else { - log.warn("Relation with sql {} not found", relationsSql); + log.warn("Relation with sql {} not found", predicate.toString()); return null; } Long notificationId = relation.getId(); @@ -61,13 +67,17 @@ public class ROOT_ACTV_NotificationBuilder extends NotificationBuilder { return null; } - String companySymbolsSql = "companyId = %d AND companySymbol = INN"; + ImdgPredicateBuilder pb = companySymbolsImdg.predicateBuilder(); + predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ); CompanySymbols companySymbols = null; - Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); - if (companySymbolsCollection.size() >= 1) { + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsByPredicate(predicate); + if (!companySymbolsCollection.isEmpty()) { companySymbols = companySymbolsCollection.iterator().next(); } else { - log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + log.warn("CompanySymbols with sql {} not found", predicate.toString()); return null; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_BLKD_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_BLKD_NotificationBuilder.java index 8259bda50..fb12faf20 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_BLKD_NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_BLKD_NotificationBuilder.java @@ -1,5 +1,13 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.Instant; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,13 +17,11 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.relation.Relation; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.Instant; -import java.time.LocalDateTime; -import java.util.*; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class ROOT_BLKD_NotificationBuilder extends NotificationBuilder { @@ -44,14 +50,14 @@ public class ROOT_BLKD_NotificationBuilder extends NotificationBuilder { return null; } - String relationsSql = "consumerId = %d".formatted(consumerId); Relation relation = null; - Collection relations = relationImdg.getCollectionObjectsBySQL(relationsSql); - if (relations.size() >= 1) { + ImdgPredicate predicate = relationImdg.predicateBuilder().equals("consumerId", consumerId); + Collection relations = relationImdg.getCollectionObjectsByPredicate(predicate); + if (!relations.isEmpty()) { Optional relationOptional = relations.stream().max(Comparator.comparing(BusinessObject::getUpdated)); relation = relationOptional.get(); } else { - log.warn("Relation with sql {} not found", relationsSql); + log.warn("Relation with sql {} not found", predicate.toString()); return null; } Long notificationId = relation.getId(); @@ -61,13 +67,17 @@ public class ROOT_BLKD_NotificationBuilder extends NotificationBuilder { return null; } - String companySymbolsSql = "companyId = %d AND companySymbol = INN"; CompanySymbols companySymbols = null; - Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); - if (companySymbolsCollection.size() >= 1) { + ImdgPredicateBuilder pb = companySymbolsImdg.predicateBuilder(); + predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ); + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsByPredicate(predicate); + if (!companySymbolsCollection.isEmpty()) { companySymbols = companySymbolsCollection.iterator().next(); } else { - log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + log.warn("CompanySymbols with sql {} not found", predicate.toString()); return null; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_CLOS_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_CLOS_NotificationBuilder.java index 2ac7b9083..993d7e324 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_CLOS_NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_CLOS_NotificationBuilder.java @@ -1,5 +1,12 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -8,14 +15,12 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.profile.ProfileDocument; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.CompanySymbol; +import ru.spcex.platform.enumeration.DocumentTypes; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.TextStyle; -import java.util.*; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class ROOT_CLOS_NotificationBuilder extends NotificationBuilder { @@ -33,10 +38,14 @@ public class ROOT_CLOS_NotificationBuilder extends NotificationBuilder { @Override public File buildNotification(Long consumerId) { - String sql = "companyId = %d AND documentType = 'CNTR'".formatted(consumerId); - Collection profileDocuments = profileDocumentImdg.getCollectionObjectsBySQL(sql); + ImdgPredicateBuilder pb = profileDocumentImdg.predicateBuilder(); + ImdgPredicate predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("documentType", DocumentTypes.cntr.toString()) + ); + Collection profileDocuments = profileDocumentImdg.getCollectionObjectsByPredicate(predicate); ProfileDocument currentProfileDocument = null; - if (profileDocuments.size() >= 1) { + if (!profileDocuments.isEmpty()) { Optional profileDocumentOptional = profileDocuments.stream().max((o1, o2) -> { LocalDate o1ValidFromDate = o1.getValidFromDate(); LocalDate o2ValidFromDate = o2.getValidFromDate(); @@ -46,7 +55,7 @@ public class ROOT_CLOS_NotificationBuilder extends NotificationBuilder { }); currentProfileDocument = profileDocumentOptional.get(); } else { - log.warn("Profile_document with sql {} not found", sql); + log.warn("Profile_document with sql {} not found", predicate.toString()); return null; } @@ -72,13 +81,17 @@ public class ROOT_CLOS_NotificationBuilder extends NotificationBuilder { return null; } - String companySymbolsSql = "companyId = %d AND companySymbol = INN"; CompanySymbols companySymbols = null; - Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); - if (companySymbolsCollection.size() >= 1) { + pb = companySymbolsImdg.predicateBuilder(); + predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ); + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsByPredicate(predicate); + if (!companySymbolsCollection.isEmpty()) { companySymbols = companySymbolsCollection.iterator().next(); } else { - log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + log.warn("CompanySymbols with sql {} not found", predicate.toString()); return null; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_NEW_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_NEW_NotificationBuilder.java index abcfcdd01..229564166 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_NEW_NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_NEW_NotificationBuilder.java @@ -1,5 +1,12 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -8,14 +15,12 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.profile.ProfileDocument; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.CompanySymbol; +import ru.spcex.platform.enumeration.DocumentTypes; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.TextStyle; -import java.util.*; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class ROOT_NEW_NotificationBuilder extends NotificationBuilder { @@ -33,8 +38,12 @@ public class ROOT_NEW_NotificationBuilder extends NotificationBuilder { @Override public File buildNotification(Long consumerId) { - String sql = "companyId = %d AND documentType = 'CNTR'".formatted(consumerId); - Collection profileDocuments = profileDocumentImdg.getCollectionObjectsBySQL(sql); + ImdgPredicateBuilder pb = profileDocumentImdg.predicateBuilder(); + ImdgPredicate predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("documentType", DocumentTypes.cntr.toString()) + ); + Collection profileDocuments = profileDocumentImdg.getCollectionObjectsByPredicate(predicate); ProfileDocument currentProfileDocument = null; if (profileDocuments.size() >= 1) { Optional profileDocumentOptional = profileDocuments.stream().max((o1, o2) -> { @@ -46,7 +55,7 @@ public class ROOT_NEW_NotificationBuilder extends NotificationBuilder { }); currentProfileDocument = profileDocumentOptional.get(); } else { - log.warn("Profile_document with sql {} not found", sql); + log.warn("Profile_document with sql {} not found", predicate.toString()); return null; } @@ -72,13 +81,17 @@ public class ROOT_NEW_NotificationBuilder extends NotificationBuilder { return null; } - String companySymbolsSql = "companyId = %d AND companySymbol = INN"; CompanySymbols companySymbols = null; - Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); - if (companySymbolsCollection.size() >= 1) { + pb = companySymbolsImdg.predicateBuilder(); + predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ); + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsByPredicate(predicate); + if (!companySymbolsCollection.isEmpty()) { companySymbols = companySymbolsCollection.iterator().next(); } else { - log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + log.warn("CompanySymbols with sql {} not found", predicate.toString()); return null; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_SSPD_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_SSPD_NotificationBuilder.java index 28807f29c..5dbc63599 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_SSPD_NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_SSPD_NotificationBuilder.java @@ -1,5 +1,13 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.Instant; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,13 +17,11 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.relation.Relation; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.Instant; -import java.time.LocalDateTime; -import java.util.*; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class ROOT_SSPD_NotificationBuilder extends NotificationBuilder { @@ -44,14 +50,14 @@ public class ROOT_SSPD_NotificationBuilder extends NotificationBuilder { return null; } - String relationsSql = "consumerId = %d".formatted(consumerId); Relation relation = null; - Collection relations = relationImdg.getCollectionObjectsBySQL(relationsSql); - if (relations.size() >= 1) { + ImdgPredicate predicate = relationImdg.predicateBuilder().equals("consumerId", consumerId); + Collection relations = relationImdg.getCollectionObjectsByPredicate(predicate); + if (!relations.isEmpty()) { Optional relationOptional = relations.stream().max(Comparator.comparing(BusinessObject::getUpdated)); relation = relationOptional.get(); } else { - log.warn("Relation with sql {} not found", relationsSql); + log.warn("Relation with sql {} not found", predicate.toString()); return null; } Long notificationId = relation.getId(); @@ -61,13 +67,17 @@ public class ROOT_SSPD_NotificationBuilder extends NotificationBuilder { return null; } - String companySymbolsSql = "companyId = %d AND companySymbol = INN"; CompanySymbols companySymbols = null; - Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); - if (companySymbolsCollection.size() >= 1) { + ImdgPredicateBuilder pb = companySymbolsImdg.predicateBuilder(); + predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ); + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsByPredicate(predicate); + if (!companySymbolsCollection.isEmpty()) { companySymbols = companySymbolsCollection.iterator().next(); } else { - log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + log.warn("CompanySymbols with sql {} not found", predicate.toString()); return null; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java index 3622a661f..1b5ca6975 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java @@ -1,5 +1,13 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.Instant; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,13 +17,11 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.relation.Relation; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.time.Instant; -import java.time.LocalDateTime; -import java.util.*; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @Component public class RRPCNotificationBuilder extends NotificationBuilder { @@ -44,14 +50,14 @@ public class RRPCNotificationBuilder extends NotificationBuilder { return null; } - String relationsSql = "consumerId = %d".formatted(consumerId); Relation relation = null; - Collection relations = relationImdg.getCollectionObjectsBySQL(relationsSql); - if (relations.size() >= 1) { + ImdgPredicate predicate = relationImdg.predicateBuilder().equals("consumerId", consumerId); + Collection relations = relationImdg.getCollectionObjectsByPredicate(predicate); + if (!relations.isEmpty()) { Optional relationOptional = relations.stream().max(Comparator.comparing(BusinessObject::getUpdated)); relation = relationOptional.get(); } else { - log.warn("Relation with sql {} not found", relationsSql); + log.warn("Relation with sql {} not found", predicate.toString()); return null; } Long notificationId = relation.getId(); @@ -61,13 +67,17 @@ public class RRPCNotificationBuilder extends NotificationBuilder { return null; } - String companySymbolsSql = "companyId = %d AND companySymbol = INN"; CompanySymbols companySymbols = null; - Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); + ImdgPredicateBuilder pb = companySymbolsImdg.predicateBuilder(); + predicate = pb.and( + pb.equals("companyId", consumerId), + pb.equals("companySymbol", CompanySymbol.INN.getKey()) + ); + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsByPredicate(predicate); if (companySymbolsCollection.size() >= 1) { companySymbols = companySymbolsCollection.iterator().next(); } else { - log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + log.warn("CompanySymbols with sql {} not found", predicate.toString()); return null; } diff --git a/clearing-parent/reports-service/src/main/resources/application.properties b/clearing-parent/reports-service/src/main/resources/application.properties index 75eab238c..ae7aac6b4 100644 --- a/clearing-parent/reports-service/src/main/resources/application.properties +++ b/clearing-parent/reports-service/src/main/resources/application.properties @@ -34,3 +34,11 @@ reports-service.notifications-store.server-port=2222 reports-service.notifications-store.delete-after-send=true reports-service.reports.pfx-class-codes=BKVC,SKVC,UKVC,NKVC,DKVC,BMVC,SMVC,UMVC,DMVC,MMVC,BMFC,SMFC,UMFC,DMFC,MMFC,BMMC,SMMC,UMMC,DMMC,MMMC,BMIC,SMIC,UMIC,DMIC,MMIC + +reports-service.direct-db.login=clearing +reports-service.direct-db.password=Aa111111 +reports-service.direct-db.url=jdbc:postgresql://10.200.200.133:5432/clearing?currentSchema=clearing_prod +reports-service.direct-db.driver=org.postgresql.Driver +#reports-service.direct-db.url=jdbc:postgresql://10.200.200.133:5432/postgres?currentSchema=clearing_tester +reports-service.direct-db.min-pool-size=10 +reports-service.direct-db.max-pool-size=30 \ No newline at end of file diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/notifications/NotificationBuilderTest.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/notifications/NotificationBuilderTest.java index b0a5f47f7..18cf87cd4 100644 --- a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/notifications/NotificationBuilderTest.java +++ b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/notifications/NotificationBuilderTest.java @@ -1,7 +1,12 @@ package ru.spcex.clearing.reports.notifications; +import java.io.File; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Arrays; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import static org.mockito.Mockito.*; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.relation.Relation; @@ -10,15 +15,6 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import java.io.File; -import java.time.Instant; -import java.time.LocalDate; -import java.time.ZoneId; -import java.util.Arrays; -import java.util.Collections; - -import static org.mockito.Mockito.*; - class NotificationBuilderTest { static ImdgProvider imdgProviderMock; static Imdg companyImdgMock; @@ -59,7 +55,7 @@ class NotificationBuilderTest { testProfileDocument_2.setValidFromDate(LocalDate.of(2019, 1, 1)); testProfileDocument_2.setNumber("TEST_NUMBER_2"); profileDocumentImdgMock = mock(Imdg.class); - when(profileDocumentImdgMock.getCollectionObjectsBySQL(any())).thenReturn(Arrays.asList(testProfileDocument_1, testProfileDocument_2)); + when(profileDocumentImdgMock.getCollectionObjectsByPredicate(any())).thenReturn(Arrays.asList(testProfileDocument_1, testProfileDocument_2)); when(imdgProviderMock.getImdg(eq(IMDGDistributedNames.Map_ProfileDocument), eq(ProfileDocument.class))).thenReturn(profileDocumentImdgMock); testRelation_1 = new Relation(); @@ -71,7 +67,7 @@ class NotificationBuilderTest { testRelation_2.setConsumerId(777L); testRelation_2.setUpdated(LocalDate.of(2019, 1, 1).atStartOfDay(ZoneId.systemDefault()).toInstant()); relationImdgMock = mock(Imdg.class); - when(relationImdgMock.getCollectionObjectsBySQL(any())).thenReturn(Arrays.asList(testRelation_1, testRelation_2)); + when(relationImdgMock.getCollectionObjectsByPredicate(any())).thenReturn(Arrays.asList(testRelation_1, testRelation_2)); when(imdgProviderMock.getImdg(eq(IMDGDistributedNames.Map_Relation), eq(Relation.class))).thenReturn(relationImdgMock); testCompanySymbols_1 = new CompanySymbols(); @@ -85,7 +81,7 @@ class NotificationBuilderTest { testCompanySymbols_2.setCompanySymbol("TEST_COMPANY_SYMBOL_2"); testCompanySymbols_2.setCompanySymbolValue("TEST_COMPANY_SYMBOL_VALUE_2"); companySymbolsImdgMock = mock(Imdg.class); - when(companySymbolsImdgMock.getCollectionObjectsBySQL(any())).thenReturn(Arrays.asList(testCompanySymbols_1, testCompanySymbols_2)); + when(companySymbolsImdgMock.getCollectionObjectsByPredicate(any())).thenReturn(Arrays.asList(testCompanySymbols_1, testCompanySymbols_2)); when(imdgProviderMock.getImdg(eq(IMDGDistributedNames.Map_CompanySymbols), eq(CompanySymbols.class))).thenReturn(companySymbolsImdgMock); } From a99104d8ddef9ac23ce46d24c552b25b70fa6f32 Mon Sep 17 00:00:00 2001 From: akulikov Date: Tue, 6 Aug 2024 19:11:48 +0300 Subject: [PATCH 07/21] reports-service: http://jira.mfd.msk:8088/browse/CLS-711 (1st comment) --- .../ks/KSRepCashNettoReportBuilder.java | 80 +++---- .../ks/KSRepCashRegistersReportBuilder.java | 34 +-- .../ks/KSRepDepoNettoReportBuilder.java | 46 ++-- .../NotificationBuilderTest.java | 4 + .../services/ReportServiceTest_BP.java | 52 +++-- .../services/ReportServiceTest_KS.java | 207 +++++++++--------- .../ks/KS_REP_CASH_NETTO_expected.csv | 4 +- .../ks/KS_REP_CASH_REGISTERS_expected.csv | 3 +- .../ks/ksRepCashNetto_registries.csv | 36 +-- 9 files changed, 247 insertions(+), 219 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java index 8c67cc23d..be787af67 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java @@ -21,6 +21,7 @@ import ru.spcex.clearing.reports.builders.SessionIdParam; import ru.spcex.clearing.reports.builders.bean.KSRepCashNettoReport; import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryStatus; import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.enumeration.ReportBuilderType; import ru.spcex.platform.enumeration.ReportKeys; @@ -77,13 +78,14 @@ 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), registryPredicate, + pb.in("registryStatus", RegistryStatus.OK.getKey(), RegistryStatus.CLRD.getKey()), pb.or( pb.equals("accountType", AccountType.Clrn.getKey()), pb.equals("accountType", AccountType.Info.getKey()) @@ -100,7 +102,7 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder groupedRegistry = entry.getValue(); try { if (groupedRegistry.isEmpty()) { - log.warn("Empty LM_T and CM_T registries for account = {} and session_id = {}. Registries with id = [{}] was skipped", + log.warn("Empty TM_T and OM_T registries for account = {} and session_id = {}. Registries with id = [{}] was skipped", pairRegistryId.getAccount(), pairRegistryId.getSessionId(), groupedRegistry.stream().map(r -> String.valueOf(r.getId())).collect(Collectors.joining(", ")) @@ -108,52 +110,52 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder cmtRegistries = new ArrayList<>(); - List lmtRegistries = new ArrayList<>(); + List omtRegistries = new ArrayList<>(); + List tmtRegistries = new ArrayList<>(); Registry registry = null; for (Registry currRegistry : groupedRegistry) { registry = currRegistry; - if (RegistryDesignation.L.equalsByKey(currRegistry.getRegistryDesignation())) - lmtRegistries.add(currRegistry); - if (RegistryDesignation.C.equalsByKey(currRegistry.getRegistryDesignation())) - cmtRegistries.add(currRegistry); + if (RegistryDesignation.T.equalsByKey(currRegistry.getRegistryDesignation())) + tmtRegistries.add(currRegistry); + if (RegistryDesignation.O.equalsByKey(currRegistry.getRegistryDesignation())) + omtRegistries.add(currRegistry); } boolean invalid = false; - if (!cmtRegistries.isEmpty() || !lmtRegistries.isEmpty()) { + if (!omtRegistries.isEmpty() || !tmtRegistries.isEmpty()) { String sourceTradingCode = null; String sourceTkr = null; - if (!cmtRegistries.isEmpty()) { - Registry next = cmtRegistries.iterator().next(); + if (!omtRegistries.isEmpty()) { + Registry next = omtRegistries.iterator().next(); sourceTradingCode = next.getTradingCode(); sourceTkr = next.getTradingClearingRegistry(); } - if (!lmtRegistries.isEmpty()) { - Registry next = lmtRegistries.iterator().next(); + if (!tmtRegistries.isEmpty()) { + Registry next = tmtRegistries.iterator().next(); sourceTradingCode = next.getTradingCode(); sourceTkr = next.getTradingClearingRegistry(); } - for (Registry currRegistry : cmtRegistries) { + for (Registry currRegistry : omtRegistries) { if (!Objects.equals(sourceTradingCode, currRegistry.getTradingCode())) { invalid = true; - log.warn("Invalid CM_T registries set, tradingCode not equals. Registries was skipped"); + log.warn("Invalid OM_T registries set, tradingCode not equals. Registries was skipped"); break; } if (!Objects.equals(sourceTkr, currRegistry.getTradingClearingRegistry())) { invalid = true; - log.warn("Invalid CM_T registries set, tradingClearingRegistry not equals. Registries was skipped"); + log.warn("Invalid OM_T registries set, tradingClearingRegistry not equals. Registries was skipped"); break; } } - for (Registry currRegistry : lmtRegistries) { + for (Registry currRegistry : tmtRegistries) { if (!Objects.equals(sourceTradingCode, currRegistry.getTradingCode())) { invalid = true; - log.warn("Invalid LM_T registries set, tradingCode not equals. Registries was skipped"); + log.warn("Invalid TM_T registries set, tradingCode not equals. Registries was skipped"); break; } if (!Objects.equals(sourceTkr, currRegistry.getTradingClearingRegistry())) { invalid = true; - log.warn("Invalid CM_T registries set, tradingClearingRegistry not equals. Registries was skipped"); + log.warn("Invalid OM_T registries set, tradingClearingRegistry not equals. Registries was skipped"); break; } } @@ -187,10 +189,10 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder cmtRegistries = registryImdg.getCollectionObjectsByPredicate( + ImdgPredicate omtPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.OM_T).buildPredicate(pb); + Collection omtRegistries = registryImdg.getCollectionObjectsByPredicate( pb.and( - cmtPredicate, + omtPredicate, pb.in("sessionId", sessionIds), pb.equals("tradingCode", registry.getTradingCode()), pb.equals("companyId", registry.getCompanyId()), pb.equals("account", registry.getAccount()), - pb.equals("registryStatus", RegistryStatus.CLRD.getKey()) + pb.in("registryStatus", RegistryStatus.OK.getKey(), RegistryStatus.CLRD.getKey()) ) ); - ImdgPredicate lmtPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.LM_T).buildPredicate(pb); - Collection lmtRegistries = registryImdg.getCollectionObjectsByPredicate( + ImdgPredicate tmtPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.TM_T).buildPredicate(pb); + Collection tmtRegistries = registryImdg.getCollectionObjectsByPredicate( pb.and( - lmtPredicate, + tmtPredicate, pb.in("sessionId", sessionIds), pb.equals("tradingCode", registry.getTradingCode()), pb.equals("companyId", registry.getCompanyId()), pb.equals("account", registry.getAccount()), - pb.equals("registryStatus", RegistryStatus.CLRD.getKey()) + pb.in("registryStatus", RegistryStatus.OK.getKey(), RegistryStatus.CLRD.getKey()) ) ); Set contracts = new HashSet<>(); - BigDecimal cmtBalanceSum = BigDecimal.ZERO; - for (Registry cmtRegistry : cmtRegistries) { - Long counterPartyId = cmtRegistry.getCounterPartyId(); + BigDecimal omtBalanceSum = BigDecimal.ZERO; + for (Registry omtRegistry : omtRegistries) { + Long counterPartyId = omtRegistry.getCounterPartyId(); if (counterPartyId != null) { Collection clearingMemberCategory = clearingMemberCategoryImdg.getCollectionObjectsByPredicate( clearingMemberCategoryImdg.predicateBuilder().equals("companyId", counterPartyId) @@ -182,15 +182,15 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder dmxRegistries = registryImdg.getCollectionObjectsByPredicate( @@ -204,7 +204,7 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder { Long counterPartyId = reg.getCounterPartyId(); if (counterPartyId != null) { @@ -222,7 +222,7 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder sessionIds = params.getSessionId(); if (sessionIds == null || sessionIds.isEmpty()) sessionIds = getSessionIdsForCurrentDate(sessionImdg); - ImdgPredicate registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CS_T, RegistryTradingParams.LS_T).buildPredicate(pb); + ImdgPredicate registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.OS_T, RegistryTradingParams.TS_T).buildPredicate(pb); ImdgPredicate finalPredicate = pb.and( pb.in("sessionId", sessionIds.toArray(new Long[0])), pb.equals("clearingDate", nowDate), registryPredicate, + pb.in("registryStatus", RegistryStatus.OK.getKey(), RegistryStatus.CLRD.getKey()), pb.equals("accountType", AccountType.Depo.getKey()), pb.notNull("account") ); @@ -94,38 +96,38 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder groupedRegistry = entry.getValue(); try { if (groupedRegistry.isEmpty()) { - log.warn("Empty LS_T and CS_T registries for {}", + log.warn("Empty TS_T and OS_T registries for {}", pairRegistryId ); continue; } - List cstRegistries = new ArrayList<>(); - List lstRegistries = new ArrayList<>(); + List ostRegistries = new ArrayList<>(); + List tstRegistries = new ArrayList<>(); Registry registry = null; for (Registry currRegistry : groupedRegistry) { registry = currRegistry; - if (RegistryDesignation.L.equalsByKey(currRegistry.getRegistryDesignation())) - lstRegistries.add(currRegistry); - if (RegistryDesignation.C.equalsByKey(currRegistry.getRegistryDesignation())) - cstRegistries.add(currRegistry); + if (RegistryDesignation.T.equalsByKey(currRegistry.getRegistryDesignation())) + tstRegistries.add(currRegistry); + if (RegistryDesignation.O.equalsByKey(currRegistry.getRegistryDesignation())) + ostRegistries.add(currRegistry); } boolean invalid = false; - if (!cstRegistries.isEmpty() || !lstRegistries.isEmpty()) { + if (!ostRegistries.isEmpty() || !tstRegistries.isEmpty()) { String sourceTradingCode = null; - if (!cstRegistries.isEmpty()) sourceTradingCode = cstRegistries.iterator().next().getTradingCode(); - if (!lstRegistries.isEmpty()) sourceTradingCode = lstRegistries.iterator().next().getTradingCode(); - for (Registry currRegistry : cstRegistries) { + if (!ostRegistries.isEmpty()) sourceTradingCode = ostRegistries.iterator().next().getTradingCode(); + if (!tstRegistries.isEmpty()) sourceTradingCode = tstRegistries.iterator().next().getTradingCode(); + for (Registry currRegistry : ostRegistries) { if (Objects.equals(sourceTradingCode, currRegistry.getTradingCode())) continue; invalid = true; - log.warn("Invalid CS_T registries set, tradingCode not equals. Registries was skipped"); + log.warn("Invalid OS_T registries set, tradingCode not equals. Registries was skipped"); break; } - for (Registry currRegistry : lstRegistries) { + for (Registry currRegistry : tstRegistries) { if (Objects.equals(sourceTradingCode, currRegistry.getTradingCode())) continue; invalid = true; - log.warn("Invalid LS_T registries set, tradingCode not equals. Registries was skipped"); + log.warn("Invalid TS_T registries set, tradingCode not equals. Registries was skipped"); break; } if (invalid) continue; @@ -151,15 +153,15 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder allValues = registryImdg.getAllValues(); + for (Registry registry : allValues) registryImdg.delete(registry); Session session = new Session(); session.setCreated( @@ -1234,6 +1236,7 @@ public class ReportServiceTest_KS { registry.setRegistryCapacity(row[10]); registry.setRegistryUnit(row[11]); registry.setRegistryCode(row[12]); + registry.setRegistryStatus(row[15]); registry.setAccountType(row[6]); registry.setAccount(row[7]); if (row[6].equalsIgnoreCase(AccountType.Info.getKey())) { diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv index f671ff6a5..038b6a150 100644 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv @@ -1,3 +1,3 @@ "FIRMID","SESSION_ID","SESSION_DATE","ACCOUNT","TKR","VALUE","DATE","OBL_VALUE","REQ_VALUE","LOT_CURRENCY","CURRENCY_NETTO","TR_EXECDATE" -"TRADING_CODE","146","20.01.1970T02:49:58","ACCOUNT","TKR","22.22","26.06.2024",,,,, -"TRADING_CODE","146","20.01.1970T02:49:58","ACCOUNT_FROM_ACCOUNT","TKR",,"26.06.2024","22.22","44.44",,, +"TRADING_CODE","146","20.01.1970T02:49:58","ACCOUNT","TKR","22.22","06.08.2024",,,,, +"TRADING_CODE","146","20.01.1970T02:49:58","ACCOUNT_FROM_ACCOUNT","TKR",,"06.08.2024","22.22","44.44",,, diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv index 2d9508a04..59b529206 100644 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv @@ -1,2 +1,3 @@ "FIRMID","ACCOUNT","TKR","DATE","REGISTER_CODE","REGISTER_NAME","OPEN_BALANCE","CHANGE_BALANCE","ADD_WITHDRAW","CLOSE_BALANCE","REMARKS","TRADE_NUM","CURRENCY" -"TRADING_CODE","ACCOUNT","TRADING_CLEARING_REGISTRY","01.07.2024","AM_T","AM_T_NAME","77.78","189.00","111.00","377.78",,, +"TRADING_CODE","ACCOUNT_FROM_ACCOUNT","TRADING_CLEARING_REGISTRY","06.08.2024","AM_T","AM_T_NAME","77.78","189.00","111.00","377.78",,, +"TRADING_CODE","ACCOUNT","TRADING_CLEARING_REGISTRY","06.08.2024","AM_T","AM_T_NAME","77.78","189.00","111.00","377.78",,, diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/ksRepCashNetto_registries.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/ksRepCashNetto_registries.csv index ee191b2e6..38f4f7aa1 100644 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/ksRepCashNetto_registries.csv +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/ksRepCashNetto_registries.csv @@ -1,19 +1,19 @@ company_id;trading_code;clearing_code;short_name;full_name;account_id;account_type;account;registry_designation;registry_instrument_type;registry_capacity;registry_unit;registry_code;trading_clearing_registry_id;trading_clearing_registry;registry_status;security_id;security_symbol;balance;open_balance;close_balance;credit;debit;settled_credit;settled_debit;check_balance;diff_balance;plan_balance;balance_dimension;settlement_date;settlement_code;trading_date;clearing_date;refund_date;value_date;price;contract;counter_party_id;comment;parent_id;group_id;session_id;session_type;payment_id;id;created_at;updated_at;section -4500120;95;95;Банк ВТБ (ПАО);Банк ВТБ (публичное акционерное общество);4410078;CLRN;30411810300000002094;C;M;A;T;CMAT;21240012;0095CAT00001;CLRD;643;RUB;69,75;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7515;38840009;80162;(null);(null);507;47580029;UNIT;(null);47580094;24.06.2024 14:16;24.06.2024 15:19;CURR -80162;8;8;ПАО Сбербанк;Публичное акционерное общество «Сбербанк России»;38690096;CLRN;3,04118607E+019;C;M;A;T;CMAT;130040;0008MAT00001;CLRD;860;UZS;10000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7515;38840009;4500120;(null);(null);507;47580029;UNIT;(null);47580076;24.06.2024 14:16;24.06.2024 15:19;CURR -80022;472;472;ПАО "Промсвязьбанк";Публичное акционерное общество «Промсвязьбанк» ;38690028;CLRN;3,04111569E+019;C;M;A;T;CMAT;1860016;0472CAT00001;CLRD;156;CNY;10;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;12,9575;38840004;4500072;(null);(null);508;47580029;UNIT;(null);47580074;24.06.2024 14:16;24.06.2024 15:19;CURR -80136;45;45;АО "АБ "РОССИЯ";Акционерное общество «Акционерный Банк «РОССИЯ»;130023;CLRN;3,04118103E+019;C;M;A;T;CMAT;1860025;0045CAT00001;CLRD;643;RUB;3000000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;25.06.2024;24.06.2024;17,12;DT1000S001U/240624/45/24062400000001;80074;(null);(null);24062400000001;47580029;UNIT;(null);47580072;24.06.2024 14:16;24.06.2024 15:19;MKR -4500072;234;234;Банк "ВБРР" (АО);Акционерное общество "Всероссийский банк развития регионов";47130002;INFO;3,99118600000001E+019;C;M;A;T;CMAT;47130004;0234CAT00001;CLRD;860;UZS;10000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7575;38840005;80022;(null);(null);1518298;47580029;UNIT;(null);47580093;24.06.2024 14:16;24.06.2024 15:19;CURR -80162;8;8;ПАО Сбербанк;Публичное акционерное общество «Сбербанк России»;130013;CLRN;3,041181E+019;C;M;A;T;CMAT;1930000;0008CAT00001;CLRD;643;RUB;7000000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;25.06.2024;24.06.2024;16,88;DT1000S001U/240624/8/24062400000002;80074;(null);(null);24062400000002;47580029;UNIT;(null);47580079;24.06.2024 14:16;24.06.2024 15:19;MKR -4500072;234;234;Банк "ВБРР" (АО);Акционерное общество "Всероссийский банк развития регионов";4410023;INFO;3,99118100000003E+019;C;M;A;T;CMAT;47130004;0234CAT00001;CLRD;643;RUB;129,58;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;12,9575;38840004;80022;(null);(null);508;47580029;UNIT;(null);47580073;24.06.2024 14:16;24.06.2024 15:19;CURR -80162;8;8;ПАО Сбербанк;Публичное акционерное общество «Сбербанк России»;130013;CLRN;3,041181E+019;C;M;A;T;CMAT;1930000;0008CAT00001;CLRD;643;RUB;9743,9;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;97;(null);80022;(null);(null);1461034;47580029;UNIT;(null);47580085;24.06.2024 14:16;24.06.2024 15:19;FOND -80022;472;472;ПАО "Промсвязьбанк";Публичное акционерное общество «Промсвязьбанк» ;130005;CLRN;3,0411810101E+019;C;M;A;T;CMAT;1860016;0472CAT00001;CLRD;643;RUB;69757,5;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7575;38840005;4500072;(null);(null);1518298;47580029;UNIT;(null);47580090;24.06.2024 14:16;24.06.2024 15:19;CURR -80022;472;472;ПАО "Промсвязьбанк";Публичное акционерное общество «Промсвязьбанк» ;38690032;CLRN;3,04118605E+019;L;M;A;T;LMAT;1860016;0472CAT00001;CLRD;860;UZS;10000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7575;38840005;4500072;(null);(null);1518298;47580029;UNIT;(null);47580075;24.06.2024 14:16;24.06.2024 15:19;CURR -4500072;234;234;Банк "ВБРР" (АО);Акционерное общество "Всероссийский банк развития регионов";47130000;INFO;3,99111560000002E+019;L;M;A;T;LMAT;47130004;0234CAT00001;CLRD;156;CNY;10;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;12,9575;38840004;80022;(null);(null);508;47580029;UNIT;(null);47580087;24.06.2024 14:16;24.06.2024 15:19;CURR -80022;472;472;ПАО "Промсвязьбанк";Публичное акционерное общество «Промсвязьбанк» ;130005;CLRN;3,0411810101E+019;L;M;A;T;LMAT;1860016;0472CAT00001;CLRD;643;RUB;129,58;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;12,9575;38840004;4500072;(null);(null);508;47580029;UNIT;(null);47580083;24.06.2024 14:16;24.06.2024 15:19;CURR -80022;472;472;ПАО "Промсвязьбанк";Публичное акционерное общество «Промсвязьбанк» ;130005;CLRN;3,0411810101E+019;L;M;A;T;LMAT;1860016;0472CAT00001;CLRD;643;RUB;9743,9;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;97;(null);80162;(null);(null);1461034;47580029;UNIT;(null);47580095;24.06.2024 14:16;24.06.2024 15:19;FOND -80074;302;302;Комитет финансов СПб;Комитет финансов Санкт-Петербурга;130019;CLRN;3,04118107E+019;L;M;A;T;LMAT;130034;0302MAT00001;CLRD;643;RUB;7000000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;25.06.2024;24.06.2024;16,88;DT1000S001U/240624/8/24062400000002;80162;(null);(null);24062400000002;47580029;UNIT;(null);47580089;24.06.2024 14:16;24.06.2024 15:19;MKR -4500072;234;234;Банк "ВБРР" (АО);Акционерное общество "Всероссийский банк развития регионов";4410023;INFO;3,99118100000003E+019;L;M;A;T;LMAT;47130004;0234CAT00001;CLRD;643;RUB;69757,5;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7575;38840005;80022;(null);(null);1518298;47580029;UNIT;(null);47580078;24.06.2024 14:16;24.06.2024 15:19;CURR -80074;302;302;Комитет финансов СПб;Комитет финансов Санкт-Петербурга;130019;CLRN;3,04118107E+019;L;M;A;T;LMAT;130034;0302MAT00001;CLRD;643;RUB;3000000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;25.06.2024;24.06.2024;17,12;DT1000S001U/240624/45/24062400000001;80136;(null);(null);24062400000001;47580029;UNIT;(null);47580086;24.06.2024 14:16;24.06.2024 15:19;MKR -80162;8;8;ПАО Сбербанк;Публичное акционерное общество «Сбербанк России»;130017;CLRN;3,04118102E+019;L;M;A;T;LMAT;130040;0008MAT00001;CLRD;643;RUB;69,75;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7515;38840009;4500120;(null);(null);507;47580029;UNIT;(null);47580084;24.06.2024 14:16;24.06.2024 15:19;CURR -4500120;95;95;Банк ВТБ (ПАО);Банк ВТБ (публичное акционерное общество);38690016;CLRN;30411810300000002049;L;M;A;T;LMAT;21240012;0095CAT00001;CLRD;860;UZS;10000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7515;38840009;80162;(null);(null);507;47580029;UNIT;(null);47580088;24.06.2024 14:16;24.06.2024 15:19;CURR +4500120;95;95;Банк ВТБ (ПАО);Банк ВТБ (публичное акционерное общество);4410078;CLRN;30411810300000002094;O;M;A;T;OMAT;21240012;0095CAT00001;CLRD;643;RUB;69,75;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7515;38840009;80162;(null);(null);507;47580029;UNIT;(null);47580094;24.06.2024 14:16;24.06.2024 15:19;CURR +80162;8;8;ПАО Сбербанк;Публичное акционерное общество «Сбербанк России»;38690096;CLRN;3,04118607E+019;O;M;A;T;OMAT;130040;0008MAT00001;CLRD;860;UZS;10000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7515;38840009;4500120;(null);(null);507;47580029;UNIT;(null);47580076;24.06.2024 14:16;24.06.2024 15:19;CURR +80022;472;472;ПАО "Промсвязьбанк";Публичное акционерное общество «Промсвязьбанк» ;38690028;CLRN;3,04111569E+019;O;M;A;T;OMAT;1860016;0472CAT00001;CLRD;156;CNY;10;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;12,9575;38840004;4500072;(null);(null);508;47580029;UNIT;(null);47580074;24.06.2024 14:16;24.06.2024 15:19;CURR +80136;45;45;АО "АБ "РОССИЯ";Акционерное общество «Акционерный Банк «РОССИЯ»;130023;CLRN;3,04118103E+019;O;M;A;T;OMAT;1860025;0045CAT00001;CLRD;643;RUB;3000000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;25.06.2024;24.06.2024;17,12;DT1000S001U/240624/45/24062400000001;80074;(null);(null);24062400000001;47580029;UNIT;(null);47580072;24.06.2024 14:16;24.06.2024 15:19;MKR +4500072;234;234;Банк "ВБРР" (АО);Акционерное общество "Всероссийский банк развития регионов";47130002;INFO;3,99118600000001E+019;O;M;A;T;OMAT;47130004;0234CAT00001;CLRD;860;UZS;10000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7575;38840005;80022;(null);(null);1518298;47580029;UNIT;(null);47580093;24.06.2024 14:16;24.06.2024 15:19;CURR +80162;8;8;ПАО Сбербанк;Публичное акционерное общество «Сбербанк России»;130013;CLRN;3,041181E+019;O;M;A;T;OMAT;1930000;0008CAT00001;CLRD;643;RUB;7000000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;25.06.2024;24.06.2024;16,88;DT1000S001U/240624/8/24062400000002;80074;(null);(null);24062400000002;47580029;UNIT;(null);47580079;24.06.2024 14:16;24.06.2024 15:19;MKR +4500072;234;234;Банк "ВБРР" (АО);Акционерное общество "Всероссийский банк развития регионов";4410023;INFO;3,99118100000003E+019;O;M;A;T;OMAT;47130004;0234CAT00001;CLRD;643;RUB;129,58;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;12,9575;38840004;80022;(null);(null);508;47580029;UNIT;(null);47580073;24.06.2024 14:16;24.06.2024 15:19;CURR +80162;8;8;ПАО Сбербанк;Публичное акционерное общество «Сбербанк России»;130013;CLRN;3,041181E+019;O;M;A;T;OMAT;1930000;0008CAT00001;CLRD;643;RUB;9743,9;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;97;(null);80022;(null);(null);1461034;47580029;UNIT;(null);47580085;24.06.2024 14:16;24.06.2024 15:19;FOND +80022;472;472;ПАО "Промсвязьбанк";Публичное акционерное общество «Промсвязьбанк» ;130005;CLRN;3,0411810101E+019;O;M;A;T;OMAT;1860016;0472CAT00001;CLRD;643;RUB;69757,5;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7575;38840005;4500072;(null);(null);1518298;47580029;UNIT;(null);47580090;24.06.2024 14:16;24.06.2024 15:19;CURR +80022;472;472;ПАО "Промсвязьбанк";Публичное акционерное общество «Промсвязьбанк» ;38690032;CLRN;3,04118605E+019;T;M;A;T;TMAT;1860016;0472CAT00001;CLRD;860;UZS;10000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7575;38840005;4500072;(null);(null);1518298;47580029;UNIT;(null);47580075;24.06.2024 14:16;24.06.2024 15:19;CURR +4500072;234;234;Банк "ВБРР" (АО);Акционерное общество "Всероссийский банк развития регионов";47130000;INFO;3,99111560000002E+019;T;M;A;T;TMAT;47130004;0234CAT00001;CLRD;156;CNY;10;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;12,9575;38840004;80022;(null);(null);508;47580029;UNIT;(null);47580087;24.06.2024 14:16;24.06.2024 15:19;CURR +80022;472;472;ПАО "Промсвязьбанк";Публичное акционерное общество «Промсвязьбанк» ;130005;CLRN;3,0411810101E+019;T;M;A;T;TMAT;1860016;0472CAT00001;CLRD;643;RUB;129,58;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;12,9575;38840004;4500072;(null);(null);508;47580029;UNIT;(null);47580083;24.06.2024 14:16;24.06.2024 15:19;CURR +80022;472;472;ПАО "Промсвязьбанк";Публичное акционерное общество «Промсвязьбанк» ;130005;CLRN;3,0411810101E+019;T;M;A;T;TMAT;1860016;0472CAT00001;CLRD;643;RUB;9743,9;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;97;(null);80162;(null);(null);1461034;47580029;UNIT;(null);47580095;24.06.2024 14:16;24.06.2024 15:19;FOND +80074;302;302;Комитет финансов СПб;Комитет финансов Санкт-Петербурга;130019;CLRN;3,04118107E+019;T;M;A;T;TMAT;130034;0302MAT00001;CLRD;643;RUB;7000000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;25.06.2024;24.06.2024;16,88;DT1000S001U/240624/8/24062400000002;80162;(null);(null);24062400000002;47580029;UNIT;(null);47580089;24.06.2024 14:16;24.06.2024 15:19;MKR +4500072;234;234;Банк "ВБРР" (АО);Акционерное общество "Всероссийский банк развития регионов";4410023;INFO;3,99118100000003E+019;T;M;A;T;TMAT;47130004;0234CAT00001;CLRD;643;RUB;69757,5;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7575;38840005;80022;(null);(null);1518298;47580029;UNIT;(null);47580078;24.06.2024 14:16;24.06.2024 15:19;CURR +80074;302;302;Комитет финансов СПб;Комитет финансов Санкт-Петербурга;130019;CLRN;3,04118107E+019;T;M;A;T;TMAT;130034;0302MAT00001;CLRD;643;RUB;3000000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;25.06.2024;24.06.2024;17,12;DT1000S001U/240624/45/24062400000001;80136;(null);(null);24062400000001;47580029;UNIT;(null);47580086;24.06.2024 14:16;24.06.2024 15:19;MKR +80162;8;8;ПАО Сбербанк;Публичное акционерное общество «Сбербанк России»;130017;CLRN;3,04118102E+019;T;M;A;T;TMAT;130040;0008MAT00001;CLRD;643;RUB;69,75;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7515;38840009;4500120;(null);(null);507;47580029;UNIT;(null);47580084;24.06.2024 14:16;24.06.2024 15:19;CURR +4500120;95;95;Банк ВТБ (ПАО);Банк ВТБ (публичное акционерное общество);38690016;CLRN;30411810300000002049;T;M;A;T;TMAT;21240012;0095CAT00001;CLRD;860;UZS;10000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7515;38840009;80162;(null);(null);507;47580029;UNIT;(null);47580088;24.06.2024 14:16;24.06.2024 15:19;CURR From 6e7fce1fe254a3bf5885b61d1a589966dea221ea Mon Sep 17 00:00:00 2001 From: akulikov Date: Tue, 6 Aug 2024 19:25:36 +0300 Subject: [PATCH 08/21] reports-service: http://jira.mfd.msk:8088/browse/CLS-711 (fix init) --- .../reports/config/ClearingImdgConfig.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) 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 51c3d943d..742130b85 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 @@ -14,6 +14,26 @@ 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); + pool.initialize(); + return pool; + } + + public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() { + return createThreadPoolTaskExecutor(1, true); + } + + public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() { + return createThreadPoolTaskExecutor(1, false); + } + @Bean public ImdgProvider imdgProvider(ReportsServiceSettings settings, Environment env) throws PropertyVetoException { String[] activeProfiles = env.getActiveProfiles(); @@ -25,12 +45,8 @@ public class ClearingImdgConfig { } } if (!isDevProfile) { - ThreadPoolTaskExecutor hazelcastClientInitializerPool = new ThreadPoolTaskExecutor(); - hazelcastClientInitializerPool.setCorePoolSize(1); - hazelcastClientInitializerPool.setWaitForTasksToCompleteOnShutdown(true); - ThreadPoolTaskExecutor idGeneratorAwaiterPool = new ThreadPoolTaskExecutor(); - idGeneratorAwaiterPool.setCorePoolSize(1); - idGeneratorAwaiterPool.setWaitForTasksToCompleteOnShutdown(false); + ThreadPoolTaskExecutor hazelcastClientInitializerPool = taskExecutorHazelcastClientInitializer(); + ThreadPoolTaskExecutor idGeneratorAwaiterPool = taskExecutorIdGeneratorAwaiter(); return new HazelcastService(hazelcastClientInitializerPool, idGeneratorAwaiterPool, settings.getHazelcast()); } else { ComboPooledDataSource dataSource = new ComboPooledDataSource(); From a4febcafb1b146143f9d215d30fd987e1ee2dd2d Mon Sep 17 00:00:00 2001 From: ialbert Date: Wed, 14 Aug 2024 12:23:25 +0300 Subject: [PATCH 09/21] http://jira.mfd.msk:8088/browse/CLS-732 sdf54 & DM*I hotfix --- .../payment/PaymentInstructionOutboundService.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java index ee1e59243..422afad0c 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java @@ -187,13 +187,6 @@ public class PaymentInstructionOutboundService { SDf54 sDf54 = sdf54Creator.create(pmt); sDf54.setId(idGenerator.nextId()); sDf54.setGenerationId(pmt.getId()); - sdf54Imdg.insert(sDf54); - log.debug("new sdf54.id: {}", sDf54.getId()); - dmiService.setProcComment(tcr.getId(), - curr, - safeBD(amount).negate(), - sDf54.getDocnm_ref()); - assetsMng.process(assets.get().a__b(), assets.get().a__t(), assets.get().a__f(), BigDecimal.ZERO); if (time.isTradingTime()) { Supplier builder = () -> GatewayRequestCreator.from(pmt, assets.get().a__b().getTradingCode(), @@ -213,6 +206,13 @@ public class PaymentInstructionOutboundService { return error(req.getId(), ClearingError.GeneralError); } } + sdf54Imdg.insert(sDf54); + log.debug("new sdf54.id: {}", sDf54.getId()); + dmiService.setProcComment(tcr.getId(), + curr, + safeBD(amount).negate(), + sDf54.getDocnm_ref()); + assetsMng.process(assets.get().a__b(), assets.get().a__t(), assets.get().a__f(), BigDecimal.ZERO); SdfClearingRequest exp = new SdfClearingRequest(); exp.setGroupId(sDf54.getGenerationId()); kafkaSender.sendRequestToQueue(Consts.SDF54_PROCESS, exp); From 98bb9a26c8401fade4aa6e195e6331073a671b8d Mon Sep 17 00:00:00 2001 From: ialbert Date: Wed, 14 Aug 2024 12:35:42 +0300 Subject: [PATCH 10/21] pom upversion SPCEX-3.12.9 -> SPCEX-3.12.10 --- clearing-parent/account-service/pom.xml | 2 +- clearing-parent/backend-api/pom.xml | 2 +- clearing-parent/balance-service/pom.xml | 2 +- clearing-parent/classes/pom.xml | 2 +- clearing-parent/cleaning-builders/pom.xml | 6 +++--- clearing-parent/clearing-service/pom.xml | 2 +- clearing-parent/clearing-validation/pom.xml | 8 ++++---- clearing-parent/company-service/pom.xml | 2 +- clearing-parent/db-scripts/pom.xml | 4 ++-- clearing-parent/dbf-exporter/pom.xml | 4 ++-- clearing-parent/dbf-importer/pom.xml | 4 ++-- clearing-parent/dictionary/pom.xml | 4 ++-- clearing-parent/extdb-importer/pom.xml | 4 ++-- clearing-parent/gateway-api/pom.xml | 2 +- clearing-parent/imdg-hist/pom.xml | 10 +++++----- clearing-parent/imdg/pom.xml | 10 +++++----- clearing-parent/lim-exporter/pom.xml | 6 +++--- clearing-parent/pom.xml | 4 ++-- clearing-parent/registry-service/pom.xml | 2 +- clearing-parent/reports-service/pom.xml | 4 ++-- clearing-parent/scheduler-service/pom.xml | 4 ++-- clearing-parent/securities-service/pom.xml | 2 +- clearing-parent/security-util/pom.xml | 8 ++++---- clearing-parent/swt-exporter/pom.xml | 6 +++--- clearing-parent/swt-importer/pom.xml | 2 +- clearing-parent/test-clearing/pom.xml | 4 ++-- clearing-parent/trade-importer/pom.xml | 6 +++--- clearing-parent/utility-service/pom.xml | 2 +- platform-parent/pom.xml | 2 +- pom.xml | 4 ++-- z-distr/pom.xml | 2 +- 31 files changed, 63 insertions(+), 63 deletions(-) diff --git a/clearing-parent/account-service/pom.xml b/clearing-parent/account-service/pom.xml index fe2cf59cc..ee7cad381 100644 --- a/clearing-parent/account-service/pom.xml +++ b/clearing-parent/account-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 4.0.0 diff --git a/clearing-parent/backend-api/pom.xml b/clearing-parent/backend-api/pom.xml index 46b27db03..b357389a7 100644 --- a/clearing-parent/backend-api/pom.xml +++ b/clearing-parent/backend-api/pom.xml @@ -11,7 +11,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 diff --git a/clearing-parent/balance-service/pom.xml b/clearing-parent/balance-service/pom.xml index 1698bbe9f..a5fc4798a 100644 --- a/clearing-parent/balance-service/pom.xml +++ b/clearing-parent/balance-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 4.0.0 diff --git a/clearing-parent/classes/pom.xml b/clearing-parent/classes/pom.xml index a0a09fa8e..c5b6dd087 100644 --- a/clearing-parent/classes/pom.xml +++ b/clearing-parent/classes/pom.xml @@ -12,7 +12,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 diff --git a/clearing-parent/cleaning-builders/pom.xml b/clearing-parent/cleaning-builders/pom.xml index 88812290f..ab02fecc8 100644 --- a/clearing-parent/cleaning-builders/pom.xml +++ b/clearing-parent/cleaning-builders/pom.xml @@ -6,13 +6,13 @@ ru.spcex.clearing clearing-parent - SPCEX-3.12.9 + SPCEX-3.12.10 cleaning-builders cleaning-builders Cleaning builders module - SPCEX-3.12.9 + SPCEX-3.12.10 jar @@ -26,7 +26,7 @@ ru.spcex.clearing classes - SPCEX-3.12.9 + SPCEX-3.12.10 compile diff --git a/clearing-parent/clearing-service/pom.xml b/clearing-parent/clearing-service/pom.xml index 9b9b74d63..3652eab61 100644 --- a/clearing-parent/clearing-service/pom.xml +++ b/clearing-parent/clearing-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 4.0.0 diff --git a/clearing-parent/clearing-validation/pom.xml b/clearing-parent/clearing-validation/pom.xml index bd471da33..4e8de4ad6 100644 --- a/clearing-parent/clearing-validation/pom.xml +++ b/clearing-parent/clearing-validation/pom.xml @@ -8,12 +8,12 @@ clearing-validation Clearing-module, dependency version of platform-utils jar - SPCEX-3.12.9 + SPCEX-3.12.10 clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 @@ -35,13 +35,13 @@ ru.spcex.clearing classes - SPCEX-3.12.9 + SPCEX-3.12.10 compile ru.spcex.clearing dictionary - SPCEX-3.12.9 + SPCEX-3.12.10 compile diff --git a/clearing-parent/company-service/pom.xml b/clearing-parent/company-service/pom.xml index 02a2b92c7..857e228f2 100644 --- a/clearing-parent/company-service/pom.xml +++ b/clearing-parent/company-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 4.0.0 diff --git a/clearing-parent/db-scripts/pom.xml b/clearing-parent/db-scripts/pom.xml index 2e10f5da2..48fd83e4e 100644 --- a/clearing-parent/db-scripts/pom.xml +++ b/clearing-parent/db-scripts/pom.xml @@ -7,12 +7,12 @@ db-scripts db-scripts db-scripts for PostgreSQL - SPCEX-3.12.9 + SPCEX-3.12.10 clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 diff --git a/clearing-parent/dbf-exporter/pom.xml b/clearing-parent/dbf-exporter/pom.xml index 9c6ce7fe9..24f617934 100644 --- a/clearing-parent/dbf-exporter/pom.xml +++ b/clearing-parent/dbf-exporter/pom.xml @@ -7,12 +7,12 @@ dbf-exporter dbf-exporter DBF exporter for DBF files - SPCEX-3.12.9 + SPCEX-3.12.10 clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 diff --git a/clearing-parent/dbf-importer/pom.xml b/clearing-parent/dbf-importer/pom.xml index a116e7e4c..4189e9cb6 100644 --- a/clearing-parent/dbf-importer/pom.xml +++ b/clearing-parent/dbf-importer/pom.xml @@ -8,12 +8,12 @@ dbf-importer dbf-importer DBF loader for DBF files - SPCEX-3.12.9 + SPCEX-3.12.10 clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 diff --git a/clearing-parent/dictionary/pom.xml b/clearing-parent/dictionary/pom.xml index 80decdbf0..08c84d32e 100644 --- a/clearing-parent/dictionary/pom.xml +++ b/clearing-parent/dictionary/pom.xml @@ -8,12 +8,12 @@ Clearing dictionary Clearing dictionary jar - SPCEX-3.12.9 + SPCEX-3.12.10 clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 diff --git a/clearing-parent/extdb-importer/pom.xml b/clearing-parent/extdb-importer/pom.xml index 7d6fd2a9f..614ba961a 100644 --- a/clearing-parent/extdb-importer/pom.xml +++ b/clearing-parent/extdb-importer/pom.xml @@ -4,12 +4,12 @@ ru.spcex.clearing clearing-parent - SPCEX-3.12.9 + SPCEX-3.12.10 extdb-importer extdb-importer Extdb importer module. Аналог trade-importer. - SPCEX-3.12.9 + SPCEX-3.12.10 jar diff --git a/clearing-parent/gateway-api/pom.xml b/clearing-parent/gateway-api/pom.xml index eda002a71..d8042c8e4 100644 --- a/clearing-parent/gateway-api/pom.xml +++ b/clearing-parent/gateway-api/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 4.0.0 diff --git a/clearing-parent/imdg-hist/pom.xml b/clearing-parent/imdg-hist/pom.xml index 307f33f02..dc0267ae5 100644 --- a/clearing-parent/imdg-hist/pom.xml +++ b/clearing-parent/imdg-hist/pom.xml @@ -5,12 +5,12 @@ 4.0.0 imdg-hist jar - SPCEX-3.12.9 + SPCEX-3.12.10 clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 @@ -36,13 +36,13 @@ ru.spcex.clearing classes - SPCEX-3.12.9 + SPCEX-3.12.10 compile ru.spcex.clearing dictionary - SPCEX-3.12.9 + SPCEX-3.12.10 compile @@ -82,7 +82,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.12.9 + SPCEX-3.12.10 compile diff --git a/clearing-parent/imdg/pom.xml b/clearing-parent/imdg/pom.xml index 272bd0970..aed366469 100644 --- a/clearing-parent/imdg/pom.xml +++ b/clearing-parent/imdg/pom.xml @@ -7,12 +7,12 @@ imdg Clearing in memory data grid jar - SPCEX-3.12.9 + SPCEX-3.12.10 clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 @@ -32,13 +32,13 @@ ru.spcex.clearing classes - SPCEX-3.12.9 + SPCEX-3.12.10 compile ru.spcex.clearing dictionary - SPCEX-3.12.9 + SPCEX-3.12.10 compile @@ -89,7 +89,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.12.9 + SPCEX-3.12.10 compile diff --git a/clearing-parent/lim-exporter/pom.xml b/clearing-parent/lim-exporter/pom.xml index db735f2ea..9bbf18a4f 100644 --- a/clearing-parent/lim-exporter/pom.xml +++ b/clearing-parent/lim-exporter/pom.xml @@ -3,13 +3,13 @@ 4.0.0 lim-exporter Lim exporter - SPCEX-3.12.9 + SPCEX-3.12.10 jar ru.spcex.clearing clearing-parent - SPCEX-3.12.9 + SPCEX-3.12.10 @@ -35,7 +35,7 @@ ru.spcex.clearing classes - SPCEX-3.12.9 + SPCEX-3.12.10 compile diff --git a/clearing-parent/pom.xml b/clearing-parent/pom.xml index 18a24e7b9..44d88d3fe 100644 --- a/clearing-parent/pom.xml +++ b/clearing-parent/pom.xml @@ -7,12 +7,12 @@ _parent_clearing Clearing parent module pom - SPCEX-3.12.9 + SPCEX-3.12.10 clearing ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 diff --git a/clearing-parent/registry-service/pom.xml b/clearing-parent/registry-service/pom.xml index 8eddb2eeb..440f13cb6 100644 --- a/clearing-parent/registry-service/pom.xml +++ b/clearing-parent/registry-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 4.0.0 diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml index 9efef7ab7..87044ad05 100644 --- a/clearing-parent/reports-service/pom.xml +++ b/clearing-parent/reports-service/pom.xml @@ -8,12 +8,12 @@ reports-service reports-service Service for creating reports - SPCEX-3.12.9 + SPCEX-3.12.10 clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 diff --git a/clearing-parent/scheduler-service/pom.xml b/clearing-parent/scheduler-service/pom.xml index 51a3dfeae..18a63179e 100644 --- a/clearing-parent/scheduler-service/pom.xml +++ b/clearing-parent/scheduler-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 4.0.0 @@ -51,7 +51,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.12.9 + SPCEX-3.12.10 compile diff --git a/clearing-parent/securities-service/pom.xml b/clearing-parent/securities-service/pom.xml index a45cd514d..0be4701b6 100644 --- a/clearing-parent/securities-service/pom.xml +++ b/clearing-parent/securities-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 4.0.0 diff --git a/clearing-parent/security-util/pom.xml b/clearing-parent/security-util/pom.xml index 22cfca782..c96e3e369 100644 --- a/clearing-parent/security-util/pom.xml +++ b/clearing-parent/security-util/pom.xml @@ -8,12 +8,12 @@ security-util clearing Clearing misc util for verify user roles jar - SPCEX-3.12.9 + SPCEX-3.12.10 clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 @@ -35,13 +35,13 @@ ru.spcex.clearing classes - SPCEX-3.12.9 + SPCEX-3.12.10 compile ru.spcex.clearing dictionary - SPCEX-3.12.9 + SPCEX-3.12.10 compile diff --git a/clearing-parent/swt-exporter/pom.xml b/clearing-parent/swt-exporter/pom.xml index cba323c34..570e57c9c 100644 --- a/clearing-parent/swt-exporter/pom.xml +++ b/clearing-parent/swt-exporter/pom.xml @@ -3,13 +3,13 @@ 4.0.0 swt-exporter Swt exporter - SPCEX-3.12.9 + SPCEX-3.12.10 jar ru.spcex.clearing clearing-parent - SPCEX-3.12.9 + SPCEX-3.12.10 @@ -35,7 +35,7 @@ ru.spcex.clearing classes - SPCEX-3.12.9 + SPCEX-3.12.10 compile diff --git a/clearing-parent/swt-importer/pom.xml b/clearing-parent/swt-importer/pom.xml index 2c0eb7a47..26ccbda22 100644 --- a/clearing-parent/swt-importer/pom.xml +++ b/clearing-parent/swt-importer/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 4.0.0 diff --git a/clearing-parent/test-clearing/pom.xml b/clearing-parent/test-clearing/pom.xml index 2b1d3d3ae..1c50a5dea 100644 --- a/clearing-parent/test-clearing/pom.xml +++ b/clearing-parent/test-clearing/pom.xml @@ -4,11 +4,11 @@ ru.spcex.clearing clearing-parent - SPCEX-3.12.9 + SPCEX-3.12.10 test-clearing Test-clearing - SPCEX-3.12.9 + SPCEX-3.12.10 ru.spcex.platform diff --git a/clearing-parent/trade-importer/pom.xml b/clearing-parent/trade-importer/pom.xml index 23e084d8e..6b212a1d6 100644 --- a/clearing-parent/trade-importer/pom.xml +++ b/clearing-parent/trade-importer/pom.xml @@ -4,12 +4,12 @@ ru.spcex.clearing clearing-parent - SPCEX-3.12.9 + SPCEX-3.12.10 trade-importer trade-importer Trade importer module - SPCEX-3.12.9 + SPCEX-3.12.10 jar @@ -51,7 +51,7 @@ ru.spcex.clearing classes - SPCEX-3.12.9 + SPCEX-3.12.10 compile diff --git a/clearing-parent/utility-service/pom.xml b/clearing-parent/utility-service/pom.xml index cc9c0dafd..7e6371a0d 100644 --- a/clearing-parent/utility-service/pom.xml +++ b/clearing-parent/utility-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 4.0.0 diff --git a/platform-parent/pom.xml b/platform-parent/pom.xml index 2d78e9606..161c1af6a 100644 --- a/platform-parent/pom.xml +++ b/platform-parent/pom.xml @@ -14,7 +14,7 @@ ru.spcex.clearing clearing - SPCEX-3.12.9 + SPCEX-3.12.10 diff --git a/pom.xml b/pom.xml index 665237b09..20094fdd2 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ __parent_ROOT Clearing main parent pom - SPCEX-3.12.9 + SPCEX-3.12.10 clearing-parent @@ -24,7 +24,7 @@ 17 Maven - SPCEX-3.12.9 + SPCEX-3.12.10 2.6.3 diff --git a/z-distr/pom.xml b/z-distr/pom.xml index c5a1ae18e..44cd2b043 100644 --- a/z-distr/pom.xml +++ b/z-distr/pom.xml @@ -5,7 +5,7 @@ clearing ru.spcex.clearing - SPCEX-3.12.9 + SPCEX-3.12.10 4.0.0 From 8ead0d74b5b3644f4192cd7b92af52947c448ac9 Mon Sep 17 00:00:00 2001 From: ialbert Date: Wed, 14 Aug 2024 16:01:57 +0300 Subject: [PATCH 11/21] http://jira.mfd.msk:8088/browse/CLS-732 sdf54 & DM*I hotfix --- .../service/payment/PaymentInstructionOutboundService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java index 422afad0c..fc181c258 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java @@ -203,7 +203,7 @@ public class PaymentInstructionOutboundService { pmt.setTransactionStatus(TransactionStatus.fail.getKey()); pmt.setUpdated(now); pmtImdg.update(pmt); - return error(req.getId(), ClearingError.GeneralError); + return error(req.getId(), ClearingError.GatewayNotApproved); } } sdf54Imdg.insert(sDf54); From a30cb92e47fbff71e33f66b6766e82d692d15fc5 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Tue, 20 Aug 2024 18:48:27 +0300 Subject: [PATCH 12/21] http://jira.mfd.msk:8088/browse/CLS-739 --- .../clearing/config/ValidationConfig.java | 1 + .../validation/Sdf55ValidationRule.java | 30 +++++++++++++++---- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java index 9271670e1..d073b268f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java @@ -561,6 +561,7 @@ public class ValidationConfig { ctx.addImdg(IMDGDistributedNames.Map_SDf54, sDf54Imdg); ctx.addImdg(IMDGDistributedNames.Map_PaymentInstruction, pmtImdg); ctx.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry); + ctx.addImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, imdgTradingClearingRegistryList); return new ValidatorImpl<>(ctx, Sdf55ValidationRule.Fields, Sdf55ValidationRule.GenerationIdFound, diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf55ValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf55ValidationRule.java index 55da2138e..58d8f2978 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf55ValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf55ValidationRule.java @@ -7,6 +7,7 @@ import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.payment.PaymentInstruction; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList; import ru.clearing.classes.statics.data.sdf.SDf54; import ru.clearing.classes.statics.data.sdf.SDf55; import ru.spcex.clearing.error.ClearingError; @@ -14,6 +15,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; import ru.spcex.clearing.service.AssetTrio; import ru.spcex.clearing.service.registry.AssetTBFProcessing; +import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.enumeration.EnumMessage; @@ -73,20 +75,36 @@ public enum Sdf55ValidationRule implements IValidationRule validate(ImdgValidationContext context) { + Imdg tcrListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); Imdg tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); PaymentInstruction pmt = context.getStoredObject(ValidationStored.Sdf55PaymentInstruction); Long accCredId = pmt.getCreditLeg_accountId(); + String creditCurrency = pmt.getCreditLeg_currencyCode(); Long addresseeId = pmt.getSenderId(); if (accCredId == null || addresseeId == null) { return of(ClearingError.RecordNotFound, "TCR - no PI(id=%d)#CreditLeg_accountId/SenderId" - .formatted(pmt.getId())); + .formatted(pmt.getId())); } - TradingClearingRegistry tcr = tcrImdg.getFirstObjectBySQL( - "moneyAccountId = '%d' and companyId = %d".formatted(accCredId, addresseeId) - ); + TradingClearingRegistry tcr = null; + TradingClearingRegistryList tcrList; + String errMsg; + if (CurrencyCode.RUB.equalsByKey(creditCurrency)) { + errMsg = "TCR moneyAccountId = '%d' and companyId = %d".formatted(accCredId, addresseeId); + tcr = tcrImdg.getFirstObjectBySQL( + "moneyAccountId = '%d' and companyId = %d".formatted(accCredId, addresseeId)); + } else { + errMsg = "TCR_LIST accountId = '%d' and companyId = %d".formatted(accCredId, addresseeId); + tcrList = tcrListImdg.getFirstObjectBySQL( + "accountId = '%d'".formatted(accCredId) + ); + if (tcrList != null) { + tcr = tcrImdg.getFirstObjectBySQL( + "id = '%d' and companyId = %d".formatted(tcrList.getTradingClearingRegistryId(), addresseeId)); + } + } + if (tcr == null) { - return of(ClearingError.RecordNotFound, "TCR moneyAccountId = '%d' and companyId = %d" - .formatted(accCredId, addresseeId)); + return of(ClearingError.RecordNotFound, errMsg); } context.storeObject(ValidationStored.Sdf55Tcr, tcr); return empty(); From eecddc03cc2fd53e1fb9ee3d5f8dda752fb92fa5 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Tue, 20 Aug 2024 18:49:01 +0300 Subject: [PATCH 13/21] up pom version --- clearing-parent/account-service/pom.xml | 2 +- clearing-parent/backend-api/pom.xml | 2 +- clearing-parent/balance-service/pom.xml | 2 +- clearing-parent/classes/pom.xml | 2 +- clearing-parent/cleaning-builders/pom.xml | 6 +++--- clearing-parent/clearing-service/pom.xml | 2 +- clearing-parent/clearing-validation/pom.xml | 8 ++++---- clearing-parent/company-service/pom.xml | 2 +- clearing-parent/db-scripts/pom.xml | 4 ++-- clearing-parent/dbf-exporter/pom.xml | 4 ++-- clearing-parent/dbf-importer/pom.xml | 4 ++-- clearing-parent/dictionary/pom.xml | 4 ++-- clearing-parent/extdb-importer/pom.xml | 4 ++-- clearing-parent/gateway-api/pom.xml | 2 +- clearing-parent/imdg-hist/pom.xml | 10 +++++----- clearing-parent/imdg/pom.xml | 10 +++++----- clearing-parent/lim-exporter/pom.xml | 6 +++--- clearing-parent/pom.xml | 4 ++-- clearing-parent/registry-service/pom.xml | 2 +- clearing-parent/reports-service/pom.xml | 4 ++-- clearing-parent/scheduler-service/pom.xml | 4 ++-- clearing-parent/securities-service/pom.xml | 2 +- clearing-parent/security-util/pom.xml | 8 ++++---- clearing-parent/swt-exporter/pom.xml | 6 +++--- clearing-parent/swt-importer/pom.xml | 2 +- clearing-parent/test-clearing/pom.xml | 4 ++-- clearing-parent/trade-importer/pom.xml | 6 +++--- clearing-parent/utility-service/pom.xml | 2 +- platform-parent/pom.xml | 2 +- pom.xml | 4 ++-- z-distr/pom.xml | 2 +- 31 files changed, 63 insertions(+), 63 deletions(-) diff --git a/clearing-parent/account-service/pom.xml b/clearing-parent/account-service/pom.xml index ee7cad381..138463b41 100644 --- a/clearing-parent/account-service/pom.xml +++ b/clearing-parent/account-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 4.0.0 diff --git a/clearing-parent/backend-api/pom.xml b/clearing-parent/backend-api/pom.xml index b357389a7..ff6581441 100644 --- a/clearing-parent/backend-api/pom.xml +++ b/clearing-parent/backend-api/pom.xml @@ -11,7 +11,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 diff --git a/clearing-parent/balance-service/pom.xml b/clearing-parent/balance-service/pom.xml index a5fc4798a..5f88042a0 100644 --- a/clearing-parent/balance-service/pom.xml +++ b/clearing-parent/balance-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 4.0.0 diff --git a/clearing-parent/classes/pom.xml b/clearing-parent/classes/pom.xml index c5b6dd087..823bfa5b0 100644 --- a/clearing-parent/classes/pom.xml +++ b/clearing-parent/classes/pom.xml @@ -12,7 +12,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 diff --git a/clearing-parent/cleaning-builders/pom.xml b/clearing-parent/cleaning-builders/pom.xml index ab02fecc8..4878bbc9c 100644 --- a/clearing-parent/cleaning-builders/pom.xml +++ b/clearing-parent/cleaning-builders/pom.xml @@ -6,13 +6,13 @@ ru.spcex.clearing clearing-parent - SPCEX-3.12.10 + SPCEX-3.12.11 cleaning-builders cleaning-builders Cleaning builders module - SPCEX-3.12.10 + SPCEX-3.12.11 jar @@ -26,7 +26,7 @@ ru.spcex.clearing classes - SPCEX-3.12.10 + SPCEX-3.12.11 compile diff --git a/clearing-parent/clearing-service/pom.xml b/clearing-parent/clearing-service/pom.xml index 3652eab61..15058bb8e 100644 --- a/clearing-parent/clearing-service/pom.xml +++ b/clearing-parent/clearing-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 4.0.0 diff --git a/clearing-parent/clearing-validation/pom.xml b/clearing-parent/clearing-validation/pom.xml index 4e8de4ad6..2eb4ad7b2 100644 --- a/clearing-parent/clearing-validation/pom.xml +++ b/clearing-parent/clearing-validation/pom.xml @@ -8,12 +8,12 @@ clearing-validation Clearing-module, dependency version of platform-utils jar - SPCEX-3.12.10 + SPCEX-3.12.11 clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 @@ -35,13 +35,13 @@ ru.spcex.clearing classes - SPCEX-3.12.10 + SPCEX-3.12.11 compile ru.spcex.clearing dictionary - SPCEX-3.12.10 + SPCEX-3.12.11 compile diff --git a/clearing-parent/company-service/pom.xml b/clearing-parent/company-service/pom.xml index 857e228f2..745cd194e 100644 --- a/clearing-parent/company-service/pom.xml +++ b/clearing-parent/company-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 4.0.0 diff --git a/clearing-parent/db-scripts/pom.xml b/clearing-parent/db-scripts/pom.xml index 48fd83e4e..19903d61d 100644 --- a/clearing-parent/db-scripts/pom.xml +++ b/clearing-parent/db-scripts/pom.xml @@ -7,12 +7,12 @@ db-scripts db-scripts db-scripts for PostgreSQL - SPCEX-3.12.10 + SPCEX-3.12.11 clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 diff --git a/clearing-parent/dbf-exporter/pom.xml b/clearing-parent/dbf-exporter/pom.xml index 24f617934..69d3ba548 100644 --- a/clearing-parent/dbf-exporter/pom.xml +++ b/clearing-parent/dbf-exporter/pom.xml @@ -7,12 +7,12 @@ dbf-exporter dbf-exporter DBF exporter for DBF files - SPCEX-3.12.10 + SPCEX-3.12.11 clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 diff --git a/clearing-parent/dbf-importer/pom.xml b/clearing-parent/dbf-importer/pom.xml index 4189e9cb6..e43e7db4b 100644 --- a/clearing-parent/dbf-importer/pom.xml +++ b/clearing-parent/dbf-importer/pom.xml @@ -8,12 +8,12 @@ dbf-importer dbf-importer DBF loader for DBF files - SPCEX-3.12.10 + SPCEX-3.12.11 clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 diff --git a/clearing-parent/dictionary/pom.xml b/clearing-parent/dictionary/pom.xml index 08c84d32e..9f3411a24 100644 --- a/clearing-parent/dictionary/pom.xml +++ b/clearing-parent/dictionary/pom.xml @@ -8,12 +8,12 @@ Clearing dictionary Clearing dictionary jar - SPCEX-3.12.10 + SPCEX-3.12.11 clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 diff --git a/clearing-parent/extdb-importer/pom.xml b/clearing-parent/extdb-importer/pom.xml index 614ba961a..65b407642 100644 --- a/clearing-parent/extdb-importer/pom.xml +++ b/clearing-parent/extdb-importer/pom.xml @@ -4,12 +4,12 @@ ru.spcex.clearing clearing-parent - SPCEX-3.12.10 + SPCEX-3.12.11 extdb-importer extdb-importer Extdb importer module. Аналог trade-importer. - SPCEX-3.12.10 + SPCEX-3.12.11 jar diff --git a/clearing-parent/gateway-api/pom.xml b/clearing-parent/gateway-api/pom.xml index d8042c8e4..689f0aace 100644 --- a/clearing-parent/gateway-api/pom.xml +++ b/clearing-parent/gateway-api/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 4.0.0 diff --git a/clearing-parent/imdg-hist/pom.xml b/clearing-parent/imdg-hist/pom.xml index dc0267ae5..b5680ac87 100644 --- a/clearing-parent/imdg-hist/pom.xml +++ b/clearing-parent/imdg-hist/pom.xml @@ -5,12 +5,12 @@ 4.0.0 imdg-hist jar - SPCEX-3.12.10 + SPCEX-3.12.11 clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 @@ -36,13 +36,13 @@ ru.spcex.clearing classes - SPCEX-3.12.10 + SPCEX-3.12.11 compile ru.spcex.clearing dictionary - SPCEX-3.12.10 + SPCEX-3.12.11 compile @@ -82,7 +82,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.12.10 + SPCEX-3.12.11 compile diff --git a/clearing-parent/imdg/pom.xml b/clearing-parent/imdg/pom.xml index aed366469..5c86eff9d 100644 --- a/clearing-parent/imdg/pom.xml +++ b/clearing-parent/imdg/pom.xml @@ -7,12 +7,12 @@ imdg Clearing in memory data grid jar - SPCEX-3.12.10 + SPCEX-3.12.11 clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 @@ -32,13 +32,13 @@ ru.spcex.clearing classes - SPCEX-3.12.10 + SPCEX-3.12.11 compile ru.spcex.clearing dictionary - SPCEX-3.12.10 + SPCEX-3.12.11 compile @@ -89,7 +89,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.12.10 + SPCEX-3.12.11 compile diff --git a/clearing-parent/lim-exporter/pom.xml b/clearing-parent/lim-exporter/pom.xml index 9bbf18a4f..cf251dce8 100644 --- a/clearing-parent/lim-exporter/pom.xml +++ b/clearing-parent/lim-exporter/pom.xml @@ -3,13 +3,13 @@ 4.0.0 lim-exporter Lim exporter - SPCEX-3.12.10 + SPCEX-3.12.11 jar ru.spcex.clearing clearing-parent - SPCEX-3.12.10 + SPCEX-3.12.11 @@ -35,7 +35,7 @@ ru.spcex.clearing classes - SPCEX-3.12.10 + SPCEX-3.12.11 compile diff --git a/clearing-parent/pom.xml b/clearing-parent/pom.xml index 44d88d3fe..5c2b5a80c 100644 --- a/clearing-parent/pom.xml +++ b/clearing-parent/pom.xml @@ -7,12 +7,12 @@ _parent_clearing Clearing parent module pom - SPCEX-3.12.10 + SPCEX-3.12.11 clearing ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 diff --git a/clearing-parent/registry-service/pom.xml b/clearing-parent/registry-service/pom.xml index 440f13cb6..3020af53a 100644 --- a/clearing-parent/registry-service/pom.xml +++ b/clearing-parent/registry-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 4.0.0 diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml index 87044ad05..3490e7422 100644 --- a/clearing-parent/reports-service/pom.xml +++ b/clearing-parent/reports-service/pom.xml @@ -8,12 +8,12 @@ reports-service reports-service Service for creating reports - SPCEX-3.12.10 + SPCEX-3.12.11 clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 diff --git a/clearing-parent/scheduler-service/pom.xml b/clearing-parent/scheduler-service/pom.xml index 18a63179e..0b43357d5 100644 --- a/clearing-parent/scheduler-service/pom.xml +++ b/clearing-parent/scheduler-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 4.0.0 @@ -51,7 +51,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.12.10 + SPCEX-3.12.11 compile diff --git a/clearing-parent/securities-service/pom.xml b/clearing-parent/securities-service/pom.xml index 0be4701b6..951ecf2a2 100644 --- a/clearing-parent/securities-service/pom.xml +++ b/clearing-parent/securities-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 4.0.0 diff --git a/clearing-parent/security-util/pom.xml b/clearing-parent/security-util/pom.xml index c96e3e369..fb6f36b0e 100644 --- a/clearing-parent/security-util/pom.xml +++ b/clearing-parent/security-util/pom.xml @@ -8,12 +8,12 @@ security-util clearing Clearing misc util for verify user roles jar - SPCEX-3.12.10 + SPCEX-3.12.11 clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 @@ -35,13 +35,13 @@ ru.spcex.clearing classes - SPCEX-3.12.10 + SPCEX-3.12.11 compile ru.spcex.clearing dictionary - SPCEX-3.12.10 + SPCEX-3.12.11 compile diff --git a/clearing-parent/swt-exporter/pom.xml b/clearing-parent/swt-exporter/pom.xml index 570e57c9c..e93d9ba08 100644 --- a/clearing-parent/swt-exporter/pom.xml +++ b/clearing-parent/swt-exporter/pom.xml @@ -3,13 +3,13 @@ 4.0.0 swt-exporter Swt exporter - SPCEX-3.12.10 + SPCEX-3.12.11 jar ru.spcex.clearing clearing-parent - SPCEX-3.12.10 + SPCEX-3.12.11 @@ -35,7 +35,7 @@ ru.spcex.clearing classes - SPCEX-3.12.10 + SPCEX-3.12.11 compile diff --git a/clearing-parent/swt-importer/pom.xml b/clearing-parent/swt-importer/pom.xml index 26ccbda22..f52af848f 100644 --- a/clearing-parent/swt-importer/pom.xml +++ b/clearing-parent/swt-importer/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 4.0.0 diff --git a/clearing-parent/test-clearing/pom.xml b/clearing-parent/test-clearing/pom.xml index 1c50a5dea..50c97de67 100644 --- a/clearing-parent/test-clearing/pom.xml +++ b/clearing-parent/test-clearing/pom.xml @@ -4,11 +4,11 @@ ru.spcex.clearing clearing-parent - SPCEX-3.12.10 + SPCEX-3.12.11 test-clearing Test-clearing - SPCEX-3.12.10 + SPCEX-3.12.11 ru.spcex.platform diff --git a/clearing-parent/trade-importer/pom.xml b/clearing-parent/trade-importer/pom.xml index 6b212a1d6..2aec5432e 100644 --- a/clearing-parent/trade-importer/pom.xml +++ b/clearing-parent/trade-importer/pom.xml @@ -4,12 +4,12 @@ ru.spcex.clearing clearing-parent - SPCEX-3.12.10 + SPCEX-3.12.11 trade-importer trade-importer Trade importer module - SPCEX-3.12.10 + SPCEX-3.12.11 jar @@ -51,7 +51,7 @@ ru.spcex.clearing classes - SPCEX-3.12.10 + SPCEX-3.12.11 compile diff --git a/clearing-parent/utility-service/pom.xml b/clearing-parent/utility-service/pom.xml index 7e6371a0d..91079d0b4 100644 --- a/clearing-parent/utility-service/pom.xml +++ b/clearing-parent/utility-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 4.0.0 diff --git a/platform-parent/pom.xml b/platform-parent/pom.xml index 161c1af6a..29bbc9aa3 100644 --- a/platform-parent/pom.xml +++ b/platform-parent/pom.xml @@ -14,7 +14,7 @@ ru.spcex.clearing clearing - SPCEX-3.12.10 + SPCEX-3.12.11 diff --git a/pom.xml b/pom.xml index 20094fdd2..973921555 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ __parent_ROOT Clearing main parent pom - SPCEX-3.12.10 + SPCEX-3.12.11 clearing-parent @@ -24,7 +24,7 @@ 17 Maven - SPCEX-3.12.10 + SPCEX-3.12.11 2.6.3 diff --git a/z-distr/pom.xml b/z-distr/pom.xml index 44cd2b043..3e0999d9b 100644 --- a/z-distr/pom.xml +++ b/z-distr/pom.xml @@ -5,7 +5,7 @@ clearing ru.spcex.clearing - SPCEX-3.12.10 + SPCEX-3.12.11 4.0.0 From 77f8e2353b9c766bb64c52b999623c7078393dc6 Mon Sep 17 00:00:00 2001 From: akulikov Date: Wed, 21 Aug 2024 14:47:35 +0300 Subject: [PATCH 14/21] reports-service: http://jira.mfd.msk:8088/browse/CLS-711 --- .../reports/config/ClearingImdgConfig.java | 14 +++----------- .../clearing/reports/config/settings/DirectDB.java | 9 +++++++++ .../src/main/resources/application.properties | 2 +- 3 files changed, 13 insertions(+), 12 deletions(-) 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 742130b85..551491389 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 @@ -4,7 +4,6 @@ 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; @@ -35,16 +34,9 @@ public class ClearingImdgConfig { } @Bean - 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) { + public ImdgProvider imdgProvider(ReportsServiceSettings settings) throws PropertyVetoException { + boolean directDb = settings.getDirectDb() != null && settings.getDirectDb().getEnable(); + if (!directDb) { ThreadPoolTaskExecutor hazelcastClientInitializerPool = taskExecutorHazelcastClientInitializer(); ThreadPoolTaskExecutor idGeneratorAwaiterPool = taskExecutorIdGeneratorAwaiter(); return new HazelcastService(hazelcastClientInitializerPool, idGeneratorAwaiterPool, settings.getHazelcast()); 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 index 281147ae3..a373f66ee 100644 --- 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 @@ -7,6 +7,7 @@ public class DirectDB { private String driver; private String minPoolSize; private String maxPoolSize; + private Boolean enable; public String getLogin() { return login; @@ -55,4 +56,12 @@ public class DirectDB { public void setDriver(String driver) { this.driver = driver; } + + public Boolean getEnable() { + return enable; + } + + public void setEnable(Boolean enable) { + this.enable = enable; + } } diff --git a/clearing-parent/reports-service/src/main/resources/application.properties b/clearing-parent/reports-service/src/main/resources/application.properties index ae7aac6b4..a691c323d 100644 --- a/clearing-parent/reports-service/src/main/resources/application.properties +++ b/clearing-parent/reports-service/src/main/resources/application.properties @@ -35,10 +35,10 @@ 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.enable=true 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 From 8f9713c055feac75910bd2cfb618607cff784aee Mon Sep 17 00:00:00 2001 From: akulikov Date: Wed, 21 Aug 2024 14:57:29 +0300 Subject: [PATCH 15/21] reports-service: http://jira.mfd.msk:8088/browse/CLS-711 --- .../ru/spcex/clearing/reports/config/ClearingImdgConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 551491389..ef769c6f5 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 @@ -35,7 +35,7 @@ public class ClearingImdgConfig { @Bean public ImdgProvider imdgProvider(ReportsServiceSettings settings) throws PropertyVetoException { - boolean directDb = settings.getDirectDb() != null && settings.getDirectDb().getEnable(); + boolean directDb = settings.getDirectDb() != null && settings.getDirectDb().getEnable() != null && settings.getDirectDb().getEnable(); if (!directDb) { ThreadPoolTaskExecutor hazelcastClientInitializerPool = taskExecutorHazelcastClientInitializer(); ThreadPoolTaskExecutor idGeneratorAwaiterPool = taskExecutorIdGeneratorAwaiter(); From 5a2607607e519657b31236e633ab7aff21c059a1 Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 22 Aug 2024 14:33:00 +0300 Subject: [PATCH 16/21] reports-service: http://jira.mfd.msk:8088/browse/CLS-711 fix dbFieldMatcher --- .../java/ru/spcex/clearing/reports/db_direct/DBProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 49e70bed2..da314c098 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 @@ -142,7 +142,7 @@ public class DBProvider implements ImdgProvider { executionFondMatcher.put("counterPartyTradingClearingRegistryId", "counter_party_trading_clearing_registry_id"); executionFondMatcher.put("partyTradingClearingRegistry", "party_trading_clearing_registry"); executionFondMatcher.put("counterPartyTradingClearingRegistry", "counter_party_trading_clearing_registry"); - this.fieldsMatcherForTable.put(ExecutionDeposit.class, executionFondMatcher); + this.fieldsMatcherForTable.put(ExecutionFond.class, executionFondMatcher); Map companyMatcher = new HashMap<>(); companyMatcher.put("id", "id"); From 048eba8b114417facd2d14d7cd34feb6dd85e711 Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 22 Aug 2024 16:56:26 +0300 Subject: [PATCH 17/21] reports-service: http://jira.mfd.msk:8088/browse/CLS-711 fix getSingleObjectById for DBMap --- .../java/ru/spcex/clearing/reports/db_direct/DBMap.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 11cdd9701..555484fef 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 @@ -47,14 +47,15 @@ public class DBMap implements Imdg { @Override public T getSingleObjectByID(Long id) { - T result; + List result; try { - result = jdbcTemplate.queryForObject("select * from %s where ID = %d".formatted(tableName, id), reflectionRowMapper); + result = jdbcTemplate.query("select * from %s where ID = %d limit 1".formatted(tableName, id), reflectionRowMapper); } catch (Exception e) { log.warn("Query error", e); return null; } - return result; + if (result.isEmpty()) return null; + return result.iterator().next(); } @Override From 3f57080c162308e970cbfd77309ec46fad2dda6d Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 22 Aug 2024 17:45:25 +0300 Subject: [PATCH 18/21] reports-service: http://jira.mfd.msk:8088/browse/CLS-711 --- .../clearing/reports/db_direct/DBPredicateBuilder.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 bd66a4760..ab47d61ac 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 @@ -42,16 +42,19 @@ public class DBPredicateBuilder extends ImdgPredicateBuilderHazelcast { @Override public ImdgPredicate equals(String key, Object value) { + if (value == null) return isNull(key); return new DBPredicate(" (%s = %s) ".formatted(replaceKey(key), replaceValue(value))); } @Override public ImdgPredicate greatEqual(String key, Comparable value) { + if (value == null) return isNull(key); return new DBPredicate(" (%s >= %s) ".formatted(replaceKey(key), replaceValue(value))); } @Override public ImdgPredicate lessEqual(String key, Comparable value) { + if (value == null) return isNull(key); return new DBPredicate(" (%s <= %s) ".formatted(replaceKey(key), replaceValue(value))); } @@ -77,6 +80,9 @@ public class DBPredicateBuilder extends ImdgPredicateBuilderHazelcast { @Override public ImdgPredicate in(String key, Comparable... values) { + if (values == null || values.length == 0) { + return new DBPredicate(" (false) "); + } return new DBPredicate( " (%s in (%s)) ".formatted( replaceKey(key), @@ -94,7 +100,7 @@ public class DBPredicateBuilder extends ImdgPredicateBuilderHazelcast { @Override public ImdgPredicate not(ImdgPredicate param) { - throw new UnsupportedOperationException("not implemented"); + return new DBPredicate(" (not (%s)) ".formatted(param.toString())); } @Override From 05b19f488af75de5566aaa835e78580f7f2a6086 Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 22 Aug 2024 19:07:18 +0300 Subject: [PATCH 19/21] reports-service: http://jira.mfd.msk:8088/browse/CLS-711 --- .../reports/db_direct/DBProvider.java | 4 +- .../reports/services/ReportService.java | 225 ++++++++++-------- 2 files changed, 126 insertions(+), 103 deletions(-) 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 da314c098..339a5d9ff 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 @@ -248,7 +248,7 @@ public class DBProvider implements ImdgProvider { this.fieldsMatcherForTable.put(RegistryCodeDictionary.class, registryCodeDictionaryMatcher); Map clearingMemberCategoryMatcher = new HashMap<>(); - clearingMemberCategoryMatcher.put("company_id", "company_id"); + clearingMemberCategoryMatcher.put("companyId", "company_id"); clearingMemberCategoryMatcher.put("clearingMemberCategory", "clearing_member_category"); clearingMemberCategoryMatcher.put("id", "id"); this.fieldsMatcherForTable.put(ClearingMemberCategory.class, clearingMemberCategoryMatcher); @@ -300,7 +300,7 @@ public class DBProvider implements ImdgProvider { executionCurrencyMatcher.put("settlementAmount", "settlement_amount"); executionCurrencyMatcher.put("quantity", "quantity"); executionCurrencyMatcher.put("side", "side"); - executionCurrencyMatcher.put("currencyCode", "_currency_code"); + executionCurrencyMatcher.put("currencyCode", "currency_code"); executionCurrencyMatcher.put("settlementOrganization", "settlement_organization"); executionCurrencyMatcher.put("coverageStatus", "coverage_status"); executionCurrencyMatcher.put("sessionId", "session_id"); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java index 260c1d456..042f31ebc 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java @@ -1,5 +1,13 @@ package ru.spcex.clearing.reports.services; +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; @@ -35,11 +43,6 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.validation.IValidator; -import java.io.File; -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - @Service public class ReportService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -146,147 +149,167 @@ public class ReportService extends QueueConsumer implements InitializingBean { public RequestInfoUpdate createReport(BaseRequest userRequest) { log.debug("ReportRequest received"); - RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestValidator); - if (requestInfoUpdate != null) return null; + try { + RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestValidator); + if (requestInfoUpdate != null) return null; - ReportRequest req = userRequest.getRequestPayload(); + ReportRequest req = userRequest.getRequestPayload(); - logUnknownProperties(userRequest); + logUnknownProperties(userRequest); - log.debug("Create report type {}...", req.getReportId()); + log.debug("Create report type {}...", req.getReportId()); - List> builders = reportBuildersWithoutParams.get( + List> builders = reportBuildersWithoutParams.get( IEnumKey.getEnumByKey(ReportBuilderType.class, req.getReportId()) - ); - List outFilenames = new ArrayList<>(); - List outFiles = new ArrayList<>(); - for (CSVReportBuilder builder : builders) { - File outFile = builder.createReport(new EmptyParams(), outFolder); - if (outFile == null) continue; - outFilenames.add(outFile.getAbsolutePath()); - outFiles.add(outFile); - } + ); + List outFilenames = new ArrayList<>(); + List outFiles = new ArrayList<>(); + for (CSVReportBuilder builder : builders) { + File outFile = builder.createReport(new EmptyParams(), outFolder); + if (outFile == null) continue; + outFilenames.add(outFile.getAbsolutePath()); + outFiles.add(outFile); + } - int outFilesCnt = outFilenames.size(); - if (outFilesCnt == 0) { - log.error("Create report {} failed, see log", req.getReportId()); - } else if (outFilesCnt < builders.size()) { - log.error("Create some error for {} failed, see log", req.getReportId()); - } else { - log.debug("Reports {} successfully created. Output files: {}", req.getReportId(), String.join(", ", outFilenames)); - } + int outFilesCnt = outFilenames.size(); + if (outFilesCnt == 0) { + log.error("Create report {} failed, see log", req.getReportId()); + } else if (outFilesCnt < builders.size()) { + log.error("Create some error for {} failed, see log", req.getReportId()); + } else { + log.debug("Reports {} successfully created. Output files: {}", req.getReportId(), String.join(", ", outFilenames)); + } - sendFilesToSftp(outFiles); + sendFilesToSftp(outFiles); + } catch (Exception e) { + log.error("Unexpected exception", e); + } return null; } public RequestInfoUpdate createReportForSessionId(BaseRequest userRequest) { log.debug("ReportRequestWithSessionId received"); - RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestWithSessionIdValidator); - if (requestInfoUpdate != null) return null; + try { + RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestWithSessionIdValidator); + if (requestInfoUpdate != null) return null; - ReportRequestWithSessionId req = userRequest.getRequestPayload(); + ReportRequestWithSessionId req = userRequest.getRequestPayload(); - logUnknownProperties(userRequest); + logUnknownProperties(userRequest); - log.debug("Create report type {}...", req.getReportId()); + log.debug("Create report type {}...", req.getReportId()); - List> builders = reportBuildersWithSessionIdParam.get( + List> builders = reportBuildersWithSessionIdParam.get( IEnumKey.getEnumByKey(ReportBuilderType.class, req.getReportId()) - ); - List outFilenames = new ArrayList<>(); - List outFiles = new ArrayList<>(); - for (CSVReportBuilder builder : builders) { - SessionIdParam sessionIdParam = new SessionIdParam(); - sessionIdParam.setSessionId(List.of(req.getSessionId())); - File outFile = builder.createReport(sessionIdParam, outFolder); - if (outFile == null) continue; - outFilenames.add(outFile.getAbsolutePath()); - } + ); + List outFilenames = new ArrayList<>(); + List outFiles = new ArrayList<>(); + for (CSVReportBuilder builder : builders) { + SessionIdParam sessionIdParam = new SessionIdParam(); + sessionIdParam.setSessionId(List.of(req.getSessionId())); + File outFile = builder.createReport(sessionIdParam, outFolder); + if (outFile == null) continue; + outFilenames.add(outFile.getAbsolutePath()); + } - int outFilesCnt = outFilenames.size(); - if (outFilesCnt == 0) { - log.error("Create report {} failed, see log", req.getReportId()); - } else if (outFilesCnt < builders.size()) { - log.error("Create some error for {} failed, see log", req.getReportId()); - } else { - log.debug("Reports {} successfully created. Output files: {}", req.getReportId(), String.join(", ", outFilenames)); - } + int outFilesCnt = outFilenames.size(); + if (outFilesCnt == 0) { + log.error("Create report {} failed, see log", req.getReportId()); + } else if (outFilesCnt < builders.size()) { + log.error("Create some error for {} failed, see log", req.getReportId()); + } else { + log.debug("Reports {} successfully created. Output files: {}", req.getReportId(), String.join(", ", outFilenames)); + } - sendFilesToSftp(outFiles); + sendFilesToSftp(outFiles); + } catch (Exception e) { + log.error("Unexpected exception", e); + } return null; } public RequestInfoUpdate createReportForGREP(BaseRequest userRequest) { log.debug("GREP task received"); - RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestGREPValidator); - if (requestInfoUpdate != null) return null; - logUnknownProperties(userRequest); + try { + RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestGREPValidator); + if (requestInfoUpdate != null) return null; + logUnknownProperties(userRequest); - List sessionIds = null; - if (userRequest.getRequestPayload().getSessionId() != null) { - sessionIds = List.of(userRequest.getRequestPayload().getSessionId()); + List sessionIds = null; + if (userRequest.getRequestPayload().getSessionId() != null) { + sessionIds = List.of(userRequest.getRequestPayload().getSessionId()); + } + Map outFiles = createReportsForTask(sessionIds, reportBuildersForGREP.values()); + + sendReportsToGateway(sessionIds, outFiles, ReportType.REPORT_KS_TMP.getKey()); + sendFilesToSftp(outFiles.keySet()); + } catch (Exception e) { + log.error("Unexpected exception", e); } - Map outFiles = createReportsForTask(sessionIds, reportBuildersForGREP.values()); - - sendReportsToGateway(sessionIds, outFiles, ReportType.REPORT_KS_TMP.getKey()); - sendFilesToSftp(outFiles.keySet()); return null; } public RequestInfoUpdate createReportForGRET(BaseRequest userRequest) { log.debug("GRET task received"); - RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestGRETValidator); - if (requestInfoUpdate != null) return null; - logUnknownProperties(userRequest); + try { + RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestGRETValidator); + if (requestInfoUpdate != null) return null; + logUnknownProperties(userRequest); - List sessionIds = null; - if (userRequest.getRequestPayload().getSessionId() != null) { - sessionIds = List.of(userRequest.getRequestPayload().getSessionId()); - } - Map outFiles = createReportsForTask(sessionIds, reportBuildersForGRET.values()); - - Map outFilesWithReportType_PFX64 = new HashMap<>(); - Map outFilesWithReportType_PFX65 = new HashMap<>(); - for (Map.Entry entry : outFiles.entrySet()) { - File reportFile = entry.getKey(); - ReportInfo reportInfo = entry.getValue(); - ReportKeys reportKey = IEnumKey.getEnumByKey(ReportKeys.class, reportInfo.reportKey()); - if (reportKey == ReportKeys.KS_BR_PFX65_DEALS) { - outFilesWithReportType_PFX65.put(reportFile, reportInfo); - } else if ( - reportKey == ReportKeys.KS_BR_PFX64_INFTYPE_1 || - reportKey == ReportKeys.KS_BR_PFX64_INFTYPE_2 || - reportKey == ReportKeys.KS_BR_PFX64_INFTYPE_3 || - reportKey == ReportKeys.KS_BR_PFX64_INFTYPE_4 - ) { - outFilesWithReportType_PFX64.put(reportFile, reportInfo); + List sessionIds = null; + if (userRequest.getRequestPayload().getSessionId() != null) { + sessionIds = List.of(userRequest.getRequestPayload().getSessionId()); } + Map outFiles = createReportsForTask(sessionIds, reportBuildersForGRET.values()); + + Map outFilesWithReportType_PFX64 = new HashMap<>(); + Map outFilesWithReportType_PFX65 = new HashMap<>(); + for (Map.Entry entry : outFiles.entrySet()) { + File reportFile = entry.getKey(); + ReportInfo reportInfo = entry.getValue(); + ReportKeys reportKey = IEnumKey.getEnumByKey(ReportKeys.class, reportInfo.reportKey()); + if (reportKey == ReportKeys.KS_BR_PFX65_DEALS) { + outFilesWithReportType_PFX65.put(reportFile, reportInfo); + } else if ( + reportKey == ReportKeys.KS_BR_PFX64_INFTYPE_1 || + reportKey == ReportKeys.KS_BR_PFX64_INFTYPE_2 || + reportKey == ReportKeys.KS_BR_PFX64_INFTYPE_3 || + reportKey == ReportKeys.KS_BR_PFX64_INFTYPE_4 + ) { + outFilesWithReportType_PFX64.put(reportFile, reportInfo); + } + } + sendReportsToGateway(sessionIds, outFilesWithReportType_PFX64, ReportType.PFX64.getKey()); + sendReportsToGateway(sessionIds, outFilesWithReportType_PFX65, ReportType.PFX65.getKey()); + sendFilesToSftp(outFiles.keySet()); + } catch (Exception e) { + log.error("Unexpected exception", e); } - sendReportsToGateway(sessionIds, outFilesWithReportType_PFX64, ReportType.PFX64.getKey()); - sendReportsToGateway(sessionIds, outFilesWithReportType_PFX65, ReportType.PFX65.getKey()); - sendFilesToSftp(outFiles.keySet()); return null; } public RequestInfoUpdate createReportForGREF(BaseRequest userRequest) { log.debug("GREF task received"); - RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestGREFValidator); - if (requestInfoUpdate != null) return null; - logUnknownProperties(userRequest); + try { + RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestGREFValidator); + if (requestInfoUpdate != null) return null; + logUnknownProperties(userRequest); - List sessionIds = null; - if (userRequest.getRequestPayload().getSessionId() != null) { - sessionIds = List.of(userRequest.getRequestPayload().getSessionId()); + List sessionIds = null; + if (userRequest.getRequestPayload().getSessionId() != null) { + sessionIds = List.of(userRequest.getRequestPayload().getSessionId()); + } + Map outFiles = createReportsForTask(sessionIds, reportBuildersForGREF.values()); + + sendReportsToGateway(sessionIds, outFiles, ReportType.REPORT_KS_FINAL.getKey()); + sendFilesToSftp(outFiles.keySet()); + } catch (Exception e) { + log.error("Unexpected exception", e); } - Map outFiles = createReportsForTask(sessionIds, reportBuildersForGREF.values()); - - sendReportsToGateway(sessionIds, outFiles, ReportType.REPORT_KS_FINAL.getKey()); - sendFilesToSftp(outFiles.keySet()); return null; } From 54ed129de62c50ea5444b04fc3eadcbdd0dfea63 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 26 Aug 2024 18:13:10 +0300 Subject: [PATCH 20/21] http://jira.mfd.msk:8088/browse/CLS-735 --- .../queue/register/RegistryController.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/RegistryController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/RegistryController.java index b3ddb310f..1a4061396 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/RegistryController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/RegistryController.java @@ -95,11 +95,11 @@ public class RegistryController extends AbstractQueueController { @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)}) @RequestMapping(value = "/filter", method = RequestMethod.GET) @ResponseBody - public CommonGetAllResponse getByFilter(@RequestParam(name = "designation", required = false) Optional> designations, - @RequestParam(name = "status", required = false) Optional status, + public CommonGetAllResponse getByFilter(@RequestParam(name = "registryCode", required = false) Optional registryCode, + @RequestParam(name = "status", required = false) Optional> status, @RequestParam(name = "pageSize", required = false) Optional pageSize, @RequestParam(name = "pageIndex", required = false) Optional pageIndex) { - if (designations.isEmpty() && status.isEmpty()) { + if (registryCode.isEmpty() && status.isEmpty()) { throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Request should have at least one of the parameters: designation, status"); } @@ -107,20 +107,22 @@ public class RegistryController extends AbstractQueueController { sw.start(); List filters = new ArrayList<>(); - designations.ifPresent(ds -> filters.add(predicateBuilder.in("registryDesignation", ds.stream() - .map(d -> Optional.ofNullable(IEnumKey.getEnumByKey(RegistryDesignation.class, d)) - .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Unknown registry designation: " + d))) - .map(RegistryDesignation::getKey) - .toArray(String[]::new)))); - status.ifPresent(s -> filters.add(predicateBuilder.in("registryStatus", Optional.ofNullable(IEnumKey.getEnumByKey(RegistryStatus.class, s)) - .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Unknown registry status: " + s)) - .getKey()))); + registryCode.ifPresent(regex -> filters.add(predicateBuilder.regex("registryCode", regex))); + + status.ifPresent(collection -> { + String[] values = collection.stream() + .map(val -> Optional.ofNullable(IEnumKey.getEnumByKey(RegistryStatus.class, val)) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Unknown registry status: " + val))) + .map(RegistryStatus::getKey) + .toArray(String[]::new); + filters.add(predicateBuilder.in("registryStatus", values)); + }); AtomicReference>> all = new AtomicReference<>(); pageIndex.ifPresentOrElse(index -> { ImdgPredicate filter = predicateBuilder.and(filters.toArray(ImdgPredicate[]::new)); all.set(stateLoader.getAllMetaTransformWithPagination(IMDGDistributedNames.Map_Registry, Registry.class, filter, - index, pageSize.orElse(100))); + pageSize.orElse(10_000), index)); }, () -> { ImdgPredicate filter = predicateBuilder.and(filters.toArray(ImdgPredicate[]::new)); From fe3c54aa0c7c5c41259e20a185c052fbabda4af3 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Tue, 27 Aug 2024 12:21:08 +0300 Subject: [PATCH 21/21] http://jira.mfd.msk:8088/browse/CLS-735 --- .../config/RegistriesFilterConfig.java | 39 +++++++++++++++++++ .../queue/register/RegistryController.java | 39 +++++++------------ 2 files changed, 54 insertions(+), 24 deletions(-) create mode 100644 clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/config/RegistriesFilterConfig.java diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/config/RegistriesFilterConfig.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/config/RegistriesFilterConfig.java new file mode 100644 index 000000000..d2989961c --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/config/RegistriesFilterConfig.java @@ -0,0 +1,39 @@ +package ru.spcex.clearing.backendapi.config; + +import java.time.LocalDate; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.clearing.classes.statics.data.execution.ExecutionDeposit; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.RegistryStatus; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; + +@Configuration +public class RegistriesFilterConfig { + + @Bean + public Map filterByName(ImdgProvider imdgProvider) { + ImdgPredicateBuilder predicateBuilder = imdgProvider + .getImdg(IMDGDistributedNames.Map_Registry, ExecutionDeposit.class) + .predicateBuilder(); + return new HashMap() {{ + put("fulfilledLiabilities", predicateBuilder.and( + predicateBuilder.regex("registryCode", "^[OT].*"), + predicateBuilder.in("registryStatus", Arrays.asList(RegistryStatus.OK.getKey(), RegistryStatus.CLRD.getKey()).toArray(new String[0])), + predicateBuilder.equals("settlementDate", LocalDate.now()))); + put("unfulfilledLiabilities", predicateBuilder.and( + predicateBuilder.regex("registryCode", "^[OT].*"), + predicateBuilder.in("registryStatus", Arrays.asList( + RegistryStatus.FAIL.getKey(), + RegistryStatus.UNCV.getKey(), + RegistryStatus.NACK.getKey(), + RegistryStatus.NACC.getKey()).toArray(new String[0])), + predicateBuilder.equals("settlementDate", LocalDate.now()))); + }}; + } +} diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/RegistryController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/RegistryController.java index 1a4061396..6198a533a 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/RegistryController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/RegistryController.java @@ -19,6 +19,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.util.StopWatch; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -54,14 +55,18 @@ public class RegistryController extends AbstractQueueController { protected final Logger log = LoggerFactory.getLogger(getClass()); private final IStateLoader stateLoader; private final ImdgPredicateBuilder predicateBuilder; + private final Map filterByName; @Autowired - public RegistryController(IOperator operator, IStateLoader stateLoader, ImdgProvider imdgProvider) { + public RegistryController(IOperator operator, IStateLoader stateLoader, + ImdgProvider imdgProvider, + Map filterByName) { super(operator); this.stateLoader = stateLoader; this.predicateBuilder = imdgProvider .getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class) .predicateBuilder(); + this.filterByName = filterByName; } @ApiOperation(value = "get all registries.") @@ -95,39 +100,25 @@ public class RegistryController extends AbstractQueueController { @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)}) @RequestMapping(value = "/filter", method = RequestMethod.GET) @ResponseBody - public CommonGetAllResponse getByFilter(@RequestParam(name = "registryCode", required = false) Optional registryCode, - @RequestParam(name = "status", required = false) Optional> status, + public CommonGetAllResponse getByFilter(@RequestParam(name = "kind", required = false) String kind, @RequestParam(name = "pageSize", required = false) Optional pageSize, @RequestParam(name = "pageIndex", required = false) Optional pageIndex) { - if (registryCode.isEmpty() && status.isEmpty()) { + if (!StringUtils.hasText(kind)) { throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Request should have at least one of the parameters: designation, status"); } + if (!filterByName.containsKey(kind)) { + throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Kind is not supported: " + kind); + } StopWatch sw = new StopWatch("registry-controller-stopwatch"); sw.start(); - List filters = new ArrayList<>(); - registryCode.ifPresent(regex -> filters.add(predicateBuilder.regex("registryCode", regex))); - - status.ifPresent(collection -> { - String[] values = collection.stream() - .map(val -> Optional.ofNullable(IEnumKey.getEnumByKey(RegistryStatus.class, val)) - .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Unknown registry status: " + val))) - .map(RegistryStatus::getKey) - .toArray(String[]::new); - filters.add(predicateBuilder.in("registryStatus", values)); - }); - + ImdgPredicate filter = predicateBuilder.and(filterByName.get(kind)); AtomicReference>> all = new AtomicReference<>(); - pageIndex.ifPresentOrElse(index -> { - ImdgPredicate filter = predicateBuilder.and(filters.toArray(ImdgPredicate[]::new)); + pageIndex.ifPresentOrElse(index -> all.set(stateLoader.getAllMetaTransformWithPagination(IMDGDistributedNames.Map_Registry, Registry.class, filter, - pageSize.orElse(10_000), index)); - }, - () -> { - ImdgPredicate filter = predicateBuilder.and(filters.toArray(ImdgPredicate[]::new)); - all.set(stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Registry, Registry.class, filter)); - }); + pageSize.orElse(10_000), index)), + () -> all.set(stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Registry, Registry.class, filter))); sw.stop(); log.info("Info select and format {} data took {} ms", all.get().size(), sw.getLastTaskTimeMillis());