diff --git a/clearing-classes/pom.xml b/clearing-classes/pom.xml
new file mode 100644
index 000000000..402e26058
--- /dev/null
+++ b/clearing-classes/pom.xml
@@ -0,0 +1,37 @@
+
+
+ 4.0.0
+
+ clearing-classes
+ Clearing classes
+ Clearing classes module
+ jar
+
+
+ clearing
+ ru.spcex.clearing
+ SPCEX-1.0.0.0
+
+
+
+ 8
+ 8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${project.artifactId}-${project.version}
+
+
\ No newline at end of file
diff --git a/clearing-classes/src/main/java/ru/clearing/classes/ConstSerializable.java b/clearing-classes/src/main/java/ru/clearing/classes/ConstSerializable.java
new file mode 100644
index 000000000..8e607f379
--- /dev/null
+++ b/clearing-classes/src/main/java/ru/clearing/classes/ConstSerializable.java
@@ -0,0 +1,8 @@
+package ru.clearing.classes;
+
+/**
+ * В случае любых изменений модуля classes необходимо изменить serialVersionUID++
+ */
+public interface ConstSerializable {
+ long serialVersionUID = 293236453420L;
+}
diff --git a/clearing-classes/src/main/java/ru/clearing/classes/StaticData/Company/Company.java b/clearing-classes/src/main/java/ru/clearing/classes/StaticData/Company/Company.java
new file mode 100644
index 000000000..baaadd980
--- /dev/null
+++ b/clearing-classes/src/main/java/ru/clearing/classes/StaticData/Company/Company.java
@@ -0,0 +1,59 @@
+package ru.clearing.classes.StaticData.Company;
+
+import ru.clearing.classes.ConstSerializable;
+import ru.clearing.classes.objects.BusinessObject;
+
+/**
+ *
+ */
+public class Company extends BusinessObject {
+ private static final long serialVersionUID = ConstSerializable.serialVersionUID;
+
+ private String clearingCode;
+ private String exchangeCode;
+ private String fullName;
+// private CompanyInfo profile; // todo impl profile
+ private Long statusId; // WorkflowStatusDictionary
+
+ @Override
+ public String toString() {
+ return "Company{" +
+ "clearingCode='" + clearingCode + '\'' +
+ ", exchangeCode='" + exchangeCode + '\'' +
+ ", fullName='" + fullName + '\'' +
+ ", statusId=" + statusId +
+ '}';
+ }
+
+ public String getClearingCode() {
+ return clearingCode;
+ }
+
+ public void setClearingCode(String clearingCode) {
+ this.clearingCode = clearingCode;
+ }
+
+ public String getExchangeCode() {
+ return exchangeCode;
+ }
+
+ public void setExchangeCode(String exchangeCode) {
+ this.exchangeCode = exchangeCode;
+ }
+
+ public String getFullName() {
+ return fullName;
+ }
+
+ public void setFullName(String fullName) {
+ this.fullName = fullName;
+ }
+
+ public Long getStatusId() {
+ return statusId;
+ }
+
+ public void setStatusId(Long statusId) {
+ this.statusId = statusId;
+ }
+}
\ No newline at end of file
diff --git a/clearing-classes/src/main/java/ru/clearing/classes/StaticData/Company/CompanyRoleSet.java b/clearing-classes/src/main/java/ru/clearing/classes/StaticData/Company/CompanyRoleSet.java
new file mode 100644
index 000000000..7304ab48b
--- /dev/null
+++ b/clearing-classes/src/main/java/ru/clearing/classes/StaticData/Company/CompanyRoleSet.java
@@ -0,0 +1,30 @@
+package ru.clearing.classes.StaticData.Company;
+
+import ru.clearing.classes.ConstSerializable;
+import ru.clearing.classes.objects.ObjectBase;
+
+/**
+ * DB: COMPANY_ROLE_SET
+ */
+public class CompanyRoleSet extends ObjectBase {
+ private static final long serialVersionUID = ConstSerializable.serialVersionUID;
+
+ private Long roleId;
+ private Long companyId;
+
+ public Long getRoleId() {
+ return roleId;
+ }
+
+ public void setRoleId(Long roleId) {
+ this.roleId = roleId;
+ }
+
+ public Long getCompanyId() {
+ return companyId;
+ }
+
+ public void setCompanyId(Long companyId) {
+ this.companyId = companyId;
+ }
+}
\ No newline at end of file
diff --git a/clearing-classes/src/main/java/ru/clearing/classes/StaticData/User/ClearingUser.java b/clearing-classes/src/main/java/ru/clearing/classes/StaticData/User/ClearingUser.java
new file mode 100644
index 000000000..a0e4f93d6
--- /dev/null
+++ b/clearing-classes/src/main/java/ru/clearing/classes/StaticData/User/ClearingUser.java
@@ -0,0 +1,27 @@
+package ru.clearing.classes.StaticData.User;
+
+
+import ru.clearing.classes.ConstSerializable;
+import ru.clearing.classes.objects.BusinessObject;
+
+/**
+ * Database table: USER_CLEARING todo name for user ?
+ */
+public class ClearingUser extends BusinessObject {
+ private static final long serialVersionUID = ConstSerializable.serialVersionUID;
+
+// private String idpUuid;
+//
+// public ClearingUser() {
+// super();
+// }
+//
+// public String toString() {
+// return String.format("%s{id=%d, idpUuid='%s'}", getClass().getSimpleName(), getId(), getIdpUuid());
+// }
+//
+// public String getIdpUuid() {
+// return idpUuid;
+// }
+
+}
\ No newline at end of file
diff --git a/clearing-classes/src/main/java/ru/clearing/classes/objects/BusinessEvent.java b/clearing-classes/src/main/java/ru/clearing/classes/objects/BusinessEvent.java
new file mode 100644
index 000000000..d851b81ba
--- /dev/null
+++ b/clearing-classes/src/main/java/ru/clearing/classes/objects/BusinessEvent.java
@@ -0,0 +1,25 @@
+package ru.clearing.classes.objects;
+
+import ru.clearing.classes.ConstSerializable;
+
+import java.util.Date;
+
+/**
+ *
+ */
+public abstract class BusinessEvent extends ObjectBase {
+ static final long serialVersionUID = ConstSerializable.serialVersionUID;
+
+ private Date eventTime;
+
+ public BusinessEvent() {
+ }
+
+ public Date getEventTime() {
+ return eventTime;
+ }
+
+ public void setEventTime(Date eventTime) {
+ this.eventTime = eventTime;
+ }
+}
\ No newline at end of file
diff --git a/clearing-classes/src/main/java/ru/clearing/classes/objects/BusinessObject.java b/clearing-classes/src/main/java/ru/clearing/classes/objects/BusinessObject.java
new file mode 100644
index 000000000..8c67d25a8
--- /dev/null
+++ b/clearing-classes/src/main/java/ru/clearing/classes/objects/BusinessObject.java
@@ -0,0 +1,31 @@
+package ru.clearing.classes.objects;
+
+import ru.clearing.classes.ConstSerializable;
+
+import java.time.Instant;
+
+/**
+ * UUID - Long based with field object
+ */
+public abstract class BusinessObject extends ObjectBase {
+ static final long serialVersionUID = ConstSerializable.serialVersionUID;
+
+ private Instant created;
+ private Instant updated;
+
+ public Instant getCreated() {
+ return created;
+ }
+
+ public void setCreated(Instant created) {
+ this.created = created;
+ }
+
+ public Instant getUpdated() {
+ return updated;
+ }
+
+ public void setUpdated(Instant updated) {
+ this.updated = updated;
+ }
+}
\ No newline at end of file
diff --git a/clearing-classes/src/main/java/ru/clearing/classes/objects/ObjectBase.java b/clearing-classes/src/main/java/ru/clearing/classes/objects/ObjectBase.java
new file mode 100644
index 000000000..80e45d86e
--- /dev/null
+++ b/clearing-classes/src/main/java/ru/clearing/classes/objects/ObjectBase.java
@@ -0,0 +1,55 @@
+package ru.clearing.classes.objects;
+
+import ru.clearing.classes.ConstSerializable;
+import ru.clearing.common.interfaces.WithId;
+
+import java.io.Serializable;
+
+/**
+ * Long ID - based primary key object
+ */
+public abstract class ObjectBase implements WithId, Serializable {
+ static final long serialVersionUID = ConstSerializable.serialVersionUID;
+
+ protected Long id;
+ public ObjectBase(){
+ }
+
+ public ObjectBase(Long id) {
+ this.id = id;
+ }
+
+ public static Long getIdOrNull(WithId o) {
+ return o == null ? null : o.getId();
+ }
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s{id=%d}", getClass().getSimpleName(), getId());
+ }
+
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ObjectBase otcObject = (ObjectBase) o;
+
+ return id.equals(otcObject.id);
+ }
+
+ @Override
+ public int hashCode() {
+ return id.hashCode();
+ }
+}
\ No newline at end of file
diff --git a/clearing-classes/src/main/java/ru/clearing/common/interfaces/WithId.java b/clearing-classes/src/main/java/ru/clearing/common/interfaces/WithId.java
new file mode 100644
index 000000000..2db02001d
--- /dev/null
+++ b/clearing-classes/src/main/java/ru/clearing/common/interfaces/WithId.java
@@ -0,0 +1,5 @@
+package ru.clearing.common.interfaces;
+
+public interface WithId {
+ Long getId();
+}
diff --git a/clearing-classes/target/dfa-classes-DFA-1.0.0.0.jar b/clearing-classes/target/dfa-classes-DFA-1.0.0.0.jar
new file mode 100644
index 000000000..1f3bc1eea
Binary files /dev/null and b/clearing-classes/target/dfa-classes-DFA-1.0.0.0.jar differ
diff --git a/clearing-classes/target/maven-archiver/pom.properties b/clearing-classes/target/maven-archiver/pom.properties
new file mode 100644
index 000000000..57b18811d
--- /dev/null
+++ b/clearing-classes/target/maven-archiver/pom.properties
@@ -0,0 +1,4 @@
+#Created by Apache Maven 3.6.3
+groupId=ru.spcex.clearing
+artifactId=clearing-classes
+version=SPCEX-1.0.0.0
diff --git a/clearing-classes/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/clearing-classes/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
new file mode 100644
index 000000000..f78dea770
--- /dev/null
+++ b/clearing-classes/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -0,0 +1,8 @@
+ru\clearing\classes\objects\ObjectBase.class
+ru\clearing\classes\ConstSerializable.class
+ru\clearing\classes\StaticData\Company\CompanyRoleSet.class
+ru\clearing\classes\objects\BusinessEvent.class
+ru\clearing\classes\StaticData\Company\Company.class
+ru\clearing\classes\StaticData\User\ClearingUser.class
+ru\clearing\common\interfaces\WithId.class
+ru\clearing\classes\objects\BusinessObject.class
diff --git a/clearing-classes/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/clearing-classes/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 000000000..50e2706e2
--- /dev/null
+++ b/clearing-classes/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -0,0 +1,8 @@
+E:\MFD_GIT_REPO\clearing\clearing-classes\src\main\java\ru\clearing\classes\StaticData\User\ClearingUser.java
+E:\MFD_GIT_REPO\clearing\clearing-classes\src\main\java\ru\clearing\classes\objects\ObjectBase.java
+E:\MFD_GIT_REPO\clearing\clearing-classes\src\main\java\ru\clearing\classes\ConstSerializable.java
+E:\MFD_GIT_REPO\clearing\clearing-classes\src\main\java\ru\clearing\classes\StaticData\Company\Company.java
+E:\MFD_GIT_REPO\clearing\clearing-classes\src\main\java\ru\clearing\classes\objects\BusinessEvent.java
+E:\MFD_GIT_REPO\clearing\clearing-classes\src\main\java\ru\clearing\classes\objects\BusinessObject.java
+E:\MFD_GIT_REPO\clearing\clearing-classes\src\main\java\ru\clearing\classes\StaticData\Company\CompanyRoleSet.java
+E:\MFD_GIT_REPO\clearing\clearing-classes\src\main\java\ru\clearing\common\interfaces\WithId.java
diff --git a/clearing-dictionary/.gitignore b/clearing-dictionary/.gitignore
new file mode 100644
index 000000000..9ea567857
--- /dev/null
+++ b/clearing-dictionary/.gitignore
@@ -0,0 +1,12 @@
+*.iml
+target
+lib
+.idea
+*.log
+temp
+otc.logs_IS_UNDEFINED
+.gitconfig
+dependency-reduced-pom.xml
+*/otc-test/src/test/resources/dataForDb/*.sql
+**/out
+preview
\ No newline at end of file
diff --git a/clearing-dictionary/CHANGELOG.md b/clearing-dictionary/CHANGELOG.md
new file mode 100644
index 000000000..5453895a1
--- /dev/null
+++ b/clearing-dictionary/CHANGELOG.md
@@ -0,0 +1,3 @@
+1.0.0
+------------------------------
+-
\ No newline at end of file
diff --git a/clearing-dictionary/pom.xml b/clearing-dictionary/pom.xml
new file mode 100644
index 000000000..dd81e0b7e
--- /dev/null
+++ b/clearing-dictionary/pom.xml
@@ -0,0 +1,118 @@
+
+
+ 4.0.0
+
+ clearing-dictionary
+ PLATFORM dictionary
+ PLATFORM dictionary
+ jar
+ SPCEX-1.0.0.0
+
+
+ clearing
+ ru.spcex.clearing
+ SPCEX-1.0.0.0
+
+
+
+ 5.4.2
+
+
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ ${external_libraries.junit-jupiter.version}
+ test
+
+
+ junit
+ junit
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ 3.7
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ test
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.7.0
+
+ ${project.java.version}
+ ${project.java.version}
+ ${project.build.sourceEncoding}
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 3.0.0-M5
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+ 3.1.0
+
+
+
+ true
+ true
+
+
+ ${built.by}
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 3.2.0
+
+
+
+ true
+ true
+
+
+ ${built.by}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/clearing-dictionary/src/main/java/ru/clearing/platform/dictionary/AbstractDictionary.java b/clearing-dictionary/src/main/java/ru/clearing/platform/dictionary/AbstractDictionary.java
new file mode 100644
index 000000000..f9ebdabe2
--- /dev/null
+++ b/clearing-dictionary/src/main/java/ru/clearing/platform/dictionary/AbstractDictionary.java
@@ -0,0 +1,29 @@
+package ru.clearing.platform.dictionary;
+
+public abstract class AbstractDictionary implements Dictionary {
+ static final long serialVersionUID = ConstDictionarySerializable.serialVersionUID;
+
+ protected Long id;
+ protected String name;
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
\ No newline at end of file
diff --git a/clearing-dictionary/src/main/java/ru/clearing/platform/dictionary/ConstDictionarySerializable.java b/clearing-dictionary/src/main/java/ru/clearing/platform/dictionary/ConstDictionarySerializable.java
new file mode 100644
index 000000000..7f7028c67
--- /dev/null
+++ b/clearing-dictionary/src/main/java/ru/clearing/platform/dictionary/ConstDictionarySerializable.java
@@ -0,0 +1,5 @@
+package ru.clearing.platform.dictionary;
+
+public interface ConstDictionarySerializable {
+ long serialVersionUID = 7020097431335696640L;
+}
diff --git a/clearing-dictionary/src/main/java/ru/clearing/platform/dictionary/Dictionary.java b/clearing-dictionary/src/main/java/ru/clearing/platform/dictionary/Dictionary.java
new file mode 100644
index 000000000..a24bd2477
--- /dev/null
+++ b/clearing-dictionary/src/main/java/ru/clearing/platform/dictionary/Dictionary.java
@@ -0,0 +1,17 @@
+package ru.clearing.platform.dictionary;
+
+import java.io.Serializable;
+
+/**
+ * Словарь.
+ */
+public interface Dictionary extends Serializable {
+
+ Long getId();
+
+ void setId(Long id);
+
+ String getName();
+
+ void setName(String id);
+}
diff --git a/clearing-dictionary/src/main/java/ru/clearing/platform/dictionary/WorkflowStatusDictionary.java b/clearing-dictionary/src/main/java/ru/clearing/platform/dictionary/WorkflowStatusDictionary.java
new file mode 100644
index 000000000..5864f07ee
--- /dev/null
+++ b/clearing-dictionary/src/main/java/ru/clearing/platform/dictionary/WorkflowStatusDictionary.java
@@ -0,0 +1,9 @@
+package ru.clearing.platform.dictionary;
+
+/**
+ * Database table: WORKFLOW_STATUS_DICTIONARY
+ */
+public class WorkflowStatusDictionary extends AbstractDictionary {
+ private static final long serialVersionUID = ConstDictionarySerializable.serialVersionUID;
+
+}
\ No newline at end of file
diff --git a/clearing-dictionary/src/main/java/ru/clearing/platform/dictionary/special/CountryCode.java b/clearing-dictionary/src/main/java/ru/clearing/platform/dictionary/special/CountryCode.java
new file mode 100644
index 000000000..5156a9120
--- /dev/null
+++ b/clearing-dictionary/src/main/java/ru/clearing/platform/dictionary/special/CountryCode.java
@@ -0,0 +1,47 @@
+package ru.clearing.platform.dictionary.special;
+
+import ru.clearing.platform.dictionary.ConstDictionarySerializable;
+import ru.clearing.platform.dictionary.Dictionary;
+
+import java.io.Serializable;
+
+/**
+ * DB table: COUNTRY_CODE_DICTIONARY
+ * Dictionary
+ */
+public class CountryCode implements Serializable, Dictionary {
+ static final long serialVersionUID = ConstDictionarySerializable.serialVersionUID;
+
+ private Long id;
+ private String name;
+ private String countryCode;
+
+ @Override
+ public String toString() {
+ return String.format("CountryCode{id=%d, countryCode='%s'}", id, countryCode);
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getCountryCode() {
+ return countryCode;
+ }
+
+ public void setCountryCode(String countryCode) {
+ this.countryCode = countryCode;
+ }
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 72f449272..f8f24506b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,6 +15,8 @@
frontendapi
storage
db-scripts
+ clearing-classes
+ clearing-dictionary
@@ -27,6 +29,9 @@
SPCEX-1.0.0.0
2.3.12.RELEASE
+
+
+ 3.12.4
diff --git a/storage/pom.xml b/storage/pom.xml
index 7066ccccb..20925b6be 100644
--- a/storage/pom.xml
+++ b/storage/pom.xml
@@ -17,10 +17,6 @@
-
- org.springframework
- spring-jdbc
-
org.springframework.boot
spring-boot-starter
@@ -29,6 +25,38 @@
org.springframework.boot
spring-boot-autoconfigure
+
+ ru.spcex.clearing
+ clearing-classes
+ SPCEX-1.0.0.0
+ compile
+
+
+ ru.spcex.clearing
+ clearing-dictionary
+ SPCEX-1.0.0.0
+ compile
+
+
+
+
+
+ org.springframework
+ spring-jdbc
+
+
+ com.mchange
+ c3p0
+ 0.9.5.2
+
+
+
+
+ com.hazelcast
+ hazelcast-all
+ ${external_libraries.hazelcast.version}
+
+
jar/${project.artifactId}
diff --git a/storage/src/main/java/ru/spcex/clearing/storage/base/BusinessEventMapStore.java b/storage/src/main/java/ru/spcex/clearing/storage/base/BusinessEventMapStore.java
new file mode 100644
index 000000000..84b7d83c7
--- /dev/null
+++ b/storage/src/main/java/ru/spcex/clearing/storage/base/BusinessEventMapStore.java
@@ -0,0 +1,61 @@
+package ru.spcex.clearing.storage.base;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import ru.clearing.classes.objects.BusinessEvent;
+import ru.clearing.classes.objects.BusinessObject;
+import ru.spcex.clearing.storage.utils.TimeUtil;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+public abstract class BusinessEventMapStore extends ObjectBaseMapStore {
+
+ public BusinessEventMapStore(JdbcTemplate jdbcTemplate) {
+ super(jdbcTemplate);
+ }
+
+ @Override
+ public final Iterable loadAllKeys() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public final T load(Long id) {
+ return null;
+ }
+
+ @Override
+ public final Collection load(Collection keys) {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public final Map loadAll(Collection keys) {
+ return Collections.emptyMap();
+ }
+
+ /**
+ * Заполняет поля:
+ * uuid
+ * eventTime
+ * ownerId
+ * eventTypeId
+ *
+ * @param businessEvent объект для заполнения
+ * @param rs resultSet для выгрузки
+ */
+ public void fillBusinessEventFields(BusinessEvent businessEvent, ResultSet rs) throws SQLException {
+ businessEvent.setEventTime(TimeUtil.toUtilDate(rs.getDate("eventtime")));
+ businessEvent.setId(getLong(rs, "id"));
+ }
+
+ public void fillBusinessObjectFieds(BusinessObject businessObject, ResultSet rs) throws SQLException {
+ businessObject.setId(rs.getObject("orderbondid", Long.class));
+ businessObject.setUpdated(TimeUtil.fromDate(rs.getDate("updated")));
+ businessObject.setCreated(TimeUtil.fromDate(rs.getDate("created")));
+ }
+
+}
diff --git a/storage/src/main/java/ru/spcex/clearing/storage/base/BusinessObjectMapStore.java b/storage/src/main/java/ru/spcex/clearing/storage/base/BusinessObjectMapStore.java
new file mode 100644
index 000000000..64e3093cf
--- /dev/null
+++ b/storage/src/main/java/ru/spcex/clearing/storage/base/BusinessObjectMapStore.java
@@ -0,0 +1,35 @@
+package ru.spcex.clearing.storage.base;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import ru.clearing.classes.objects.BusinessObject;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * Шаблон для загрузки BusinessObject-ов.
+ */
+public abstract class BusinessObjectMapStore extends ObjectBaseMapStore {
+
+ public BusinessObjectMapStore(JdbcTemplate jdbcTemplate) {
+ super(jdbcTemplate);
+ }
+
+ /**
+ * Заполняет стандартные поля для BusinessObject из ResultSet
+ *
+ * @param businessObject дозаполнить стандартные поля этому объекту
+ * @param rs из ResultSet
+ * @throws SQLException - error
+ */
+ protected void fillBusinessObjectFields(BusinessObject businessObject, ResultSet rs) throws SQLException {
+ fillBusinessObjectFields(businessObject, rs, "id");
+ }
+
+ protected void fillBusinessObjectFields(BusinessObject businessObject, ResultSet rs, String idName) throws SQLException {
+ businessObject.setUpdated(getInstantFromTimestamp(rs, "updated"));
+ businessObject.setCreated(getInstantFromTimestamp(rs, "created"));
+ businessObject.setId(getLong(rs, idName));
+ }
+
+}
diff --git a/storage/src/main/java/ru/spcex/clearing/storage/base/DictionaryMapStore.java b/storage/src/main/java/ru/spcex/clearing/storage/base/DictionaryMapStore.java
new file mode 100644
index 000000000..2903d40e2
--- /dev/null
+++ b/storage/src/main/java/ru/spcex/clearing/storage/base/DictionaryMapStore.java
@@ -0,0 +1,91 @@
+package ru.spcex.clearing.storage.base;
+
+import com.hazelcast.core.MapLoader;
+import ru.clearing.platform.dictionary.Dictionary;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.dao.support.DataAccessUtils;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.*;
+
+import static ru.spcex.clearing.storage.base.ObjectBaseMapStore.MAX_IN_CLAUSE_SIZE;
+
+/**
+ * Store для словарей стандартных - из ID, NAME.
+ */
+public abstract class DictionaryMapStore implements MapLoader {
+ private static Logger log = LoggerFactory.getLogger(DictionaryMapStore.class);
+
+ protected NamedParameterJdbcTemplate namedParameterJdbcTemplate;
+
+ protected final JdbcTemplate jdbcTemplate;
+
+ protected DictionaryMapStore(JdbcTemplate jdbcTemplate) {
+ this.jdbcTemplate = jdbcTemplate;
+ this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
+ }
+
+ public abstract String getTableName();
+
+ public abstract T getDictionaryObject();
+
+ protected T mapRow(ResultSet rs, int rowNum) throws SQLException {
+ T dictionary = getDictionaryObject();
+ dictionary.setId(rs.getLong("id"));
+ dictionary.setName(rs.getString("name"));
+ return dictionary;
+ }
+
+ private Collection loadCollection(Collection keys) {
+ Map> paramMap = Collections.singletonMap("ids", keys);
+ return namedParameterJdbcTemplate.query("select * from " + getTableName() + " where id in (:ids)", paramMap, this::mapRow);
+ }
+
+ @Override
+ public T load(Long id) {
+ Collection rows;
+ List list = Collections.singletonList(id);
+ try {
+ rows = loadCollection(list);
+ } catch (Throwable e) { // one retry
+ log.trace("Retry load after {}", e.toString());
+ rows = loadCollection(list);
+ }
+ return DataAccessUtils.singleResult(rows);
+ }
+
+ @Override
+ public Map loadAll(Collection keys) {
+ log.trace("loadAll from dictionary {} {} keys", getTableName(), keys.size());
+ Map result = new HashMap<>();
+ long start = System.currentTimeMillis();
+
+ // загрузить данные по ключам частями, чтобы не выйти за ограничения базы по кол-ву элементов в in clause
+ List keysSubList = new ArrayList<>(MAX_IN_CLAUSE_SIZE);
+ for (Iterator iterator = keys.iterator(); iterator.hasNext(); ) {
+ Long key = iterator.next();
+ keysSubList.add(key);
+ if (keysSubList.size() == MAX_IN_CLAUSE_SIZE || !iterator.hasNext()) {
+ Collection rows = loadCollection(keysSubList);
+ for (T row : rows) {
+ result.put(row.getId(), row);
+ }
+ keysSubList.clear();
+ }
+ }
+
+ log.trace("loadAll from dictionary {} {} keys done in {} ms", getTableName(), keys.size(), (System.currentTimeMillis() - start));
+
+ return result;
+ }
+
+ @Override
+ public Iterable loadAllKeys() {
+ log.debug("loadAllKeys from " + getTableName());
+ return jdbcTemplate.query("select id from " + getTableName(), (rs, rowNum) -> rs.getLong("id"));
+ }
+}
diff --git a/storage/src/main/java/ru/spcex/clearing/storage/base/LoggingMapStore.java b/storage/src/main/java/ru/spcex/clearing/storage/base/LoggingMapStore.java
new file mode 100644
index 000000000..622001a29
--- /dev/null
+++ b/storage/src/main/java/ru/spcex/clearing/storage/base/LoggingMapStore.java
@@ -0,0 +1,94 @@
+package ru.spcex.clearing.storage.base;
+
+import com.hazelcast.core.HazelcastInstance;
+import com.hazelcast.core.MapLoaderLifecycleSupport;
+import com.hazelcast.core.MapStore;
+//import com.opencsv.CSVWriter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.lang.NonNull;
+import ru.clearing.classes.objects.ObjectBase;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Properties;
+import java.util.function.Supplier;
+
+/**
+ * MapStore записывающий изменения в файл
+ *
+ * @param
+ */
+public abstract class LoggingMapStore implements MapStore, MapLoaderLifecycleSupport {
+ protected final Logger log = LoggerFactory.getLogger(this.getClass());
+
+// private CSVWriter csvWriter; todo подключить OpenCSV и настройку про логирование данных добавить
+
+// private Supplier recoveryPath = () -> DfaConfig.get().getRoot().getSettings().getRecoveryLogPath();
+
+ @Override
+ public void init(HazelcastInstance hazelcastInstance, Properties properties, String mapName) {
+// try {
+// String recoveryLogPath = recoveryPath.get();
+// if (recoveryLogPath != null) {
+// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+// File recoveryDir = new File(recoveryLogPath + File.separator + simpleDateFormat.format(new Date()));
+// recoveryDir.mkdirs();
+// File recoveryFile = new File(recoveryDir, getTableName() + ".csv");
+// csvWriter = new CSVWriter(new BufferedWriter(new FileWriter(recoveryFile)), ';');
+// log.info("recovery log started {}", recoveryFile);
+// }
+// } catch (Exception e) {
+// log.error("", e);
+// }
+ }
+
+// public void setRecoveryPath(Supplier recoveryPath) {
+// this.recoveryPath = recoveryPath;
+// }
+
+ @Override
+ public void destroy() {
+// try {
+// if (csvWriter != null)
+// csvWriter.close();
+// } catch (IOException e) {
+// log.error("", e);
+// }
+ }
+
+ public abstract String getTableName();
+
+ protected void logHeaders(@NonNull String[] headers) {
+ try {
+// if (csvWriter != null) {
+// csvWriter.writeNext(headers);
+// csvWriter.flush();
+// }
+ } catch (Exception e) {
+ log.error("", e);
+ }
+ }
+
+ protected void logValues(@NonNull List