diff --git a/clearing-parent/backend-api/pom.xml b/clearing-parent/backend-api/pom.xml
index ba7ad975c..f3b247036 100644
--- a/clearing-parent/backend-api/pom.xml
+++ b/clearing-parent/backend-api/pom.xml
@@ -323,6 +323,31 @@
+
+
+ java
+
+ transform
+
+
+
+
+ src/main/resources/meta
+
+ meta.xml
+
+ src/main/resources/meta/xsl/java.xsl
+
+
+ java_classes.java
+
+
+
+
+
+
diff --git a/clearing-parent/backend-api/src/main/resources/meta/xsl/java.xsl b/clearing-parent/backend-api/src/main/resources/meta/xsl/java.xsl
new file mode 100644
index 000000000..0b4c78501
--- /dev/null
+++ b/clearing-parent/backend-api/src/main/resources/meta/xsl/java.xsl
@@ -0,0 +1,467 @@
+
+
+
+
+abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+_0123456789
+
+
+
+// JAVA classes for DB version:
+
+
+
+/* Dictionaries */
+
+
+
+
+/* Business objects */
+
+
+
+
+ // Data types
+
+
+
+
+ // . : -
+ ,
+
+
+
+// ----------------- -
+
+
+
+package ru.clearing.platform.dictionary;
+
+
+/**
+ *
+ *
+ * Dictionary DB table:
+ **/
+public class Dictionary extends AbstractDictionary {
+ private static final long serialVersionUID = ConstDictionarySerializable.serialVersionUID;
+
+
+
+
+}
+
+
+// -- mapstore --
+package ru.spcex.clearing.imdg.dictionary;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+import ru.clearing.platform.dictionary.Dictionary;
+import ru.spcex.clearing.imdg.base.DictionaryTMapStore;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+
+@Component
+public class DictionaryMapStore extends DictionaryTMapStore<Dictionary> {
+
+ public DictionaryMapStore(JdbcTemplate jdbcTemplate) {
+ super(jdbcTemplate);
+ }
+
+ @Override
+ public String getMapName() {
+ return IMDGDistributedNames.Map_Dictionary;
+ }
+
+ @Override
+ public String getTableName() {
+ return "";
+ }
+
+ @Override
+ public Dictionary getDictionaryObject() {
+ return new Dictionary();
+ }
+
+}
+
+
+
+
+
+
+
+
+
+
+ !! Нестандартное поле !! // FIXME Нестандартный словарь! Требуется писать код вручную.
+
+
+
+
+
+// ------------------ -
+
+
+package ;
+
+import ru.clearing.classes.ConstSerializable;
+import ru.spcex.platform.classes.base.SpcexObjectBase;
+/**
+ *
+ *
+ * DB table:
+ **/
+public class extends SpcexObjectBase {
+ private static final long serialVersionUID = ConstSerializable.serialVersionUID;
+
+
+
+}
+
+
+//mapstore
+
+// -- mapstore --
+package ru.spcex.clearing.imdg.object;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ;
+import ru.spcex.clearing.imdg.base.TemplateMapStore;
+import ru.spcex.platform.utils.time.TimeUtil;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.*;
+
+@Component
+public class MapStore extends TemplateMapStore<> {
+
+ public MapStore(JdbcTemplate jdbcTemplate) {
+ super(jdbcTemplate);
+ }
+
+ @Override
+ public String getMapName() {
+ return IMDGDistributedNames.Map_;
+ }
+
+ @Override
+ public String getTableName() {
+ return "";
+ }
+
+ @Override
+ public String[] getFields() {
+ return new String[]{
+
+ };
+ }
+
+ @Override
+ public objectReader(ResultSet resultSet) throws SQLException {
+ object = new ();
+ return object;
+ }
+
+ @Override
+ public Object[] objectToField( object) {
+ Object[] args = new Object[]{
+ };
+ return args;
+ }
+
+}
+
+// todo добавить класс History
+package ;
+
+import ru.clearing.classes.ConstSerializable;
+import ru.clearing.classes.objects.BusinessEvent;
+import java.io.Serial;
+/**
+ * Изменение состояния объекта
+ *
+ * DB table: _HISTORY
+ **/
+public class History extends BusinessEvent<> {
+ @Serial
+ private static final long serialVersionUID = ConstSerializable.serialVersionUID;
+
+ private object;
+
+ @Override
+ public getObject() {
+ return object;
+ }
+
+ @Override
+ public void setObject( object) {
+ this.object = object;
+ }
+}
+
+// -- History mapstore для журналирования --
+package ru.spcex.clearing.imdg.businessevent;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ;
+import History;
+import ru.spcex.clearing.imdg.base.TemplateEventMapStore;
+import ru.spcex.platform.utils.time.TimeUtil;
+
+@Component
+public class HistoryMapStore extends TemplateEventMapStore<History> {
+
+ public HistoryMapStore(JdbcTemplate jdbcTemplate) {
+ super(jdbcTemplate);
+ }
+
+ @Override
+ public String getMapName() {
+ return IMDGDistributedNames.Map_History;
+ }
+
+ @Override
+ public String getTableName() {
+ return "_HISTORY";
+ }
+
+ @Override
+ public String[] getFields() {
+ return new String[]{"ID","EVENT_TIME", "EVENT_USER_ID", "EVENT_TYPE",
+ _
+ };
+ }
+
+ @Override
+ public Object[] objectToField(History historyLog) {
+ object=historyLog.getObject();
+ Object[] args = new Object[]{
+ historyLog.getId(),
+ TimeUtil.toDateFromInstant(historyLog.getEventTime()),
+ historyLog.getUserId(),
+ historyLog.getEventType(),
+
+ };
+ return args;
+ }
+
+}
+
+
+, "
+
+
+"
+
+
+
+
+object.set(getInstantFromTimestamp(resultSet, "
+
+
+"))
+
+object.set(getLocalDateFromSqlDate(resultSet, "
+
+
+"))
+
+object.set(getLocalTimeFromSqlTime(resultSet, "
+
+
+"))
+
+object.set(resultSet.getObject("
+
+
+", .class))
+;
+
+,
+
+
+
+
+TimeUtil.toDateFromInstant(object.get())
+
+TimeUtil.toDateFromLocalDate(object.get())
+
+TimeUtil.toDateFromLocalTime(object.get())
+
+object.get()
+
+
+
+
+
+
+
+
+
+ // (in parent) private ;
+
+ // DB field:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ private ;
+
+ // DB field:
+
+
+ // (linked to )
+
+
+
+
+
+
+
+
+
+
+
+
+
+ public get() {
+ return ;
+ }
+ public void set( value) {
+ this.=value;
+ }
+
+
+
+
+
+
+
+
+
+
+ public get() {
+ return ;
+ }
+ public void set( value) {
+ this.=value;
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ upper
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ _
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingRegistersOnOS.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingRegistersOnOS.java
index 5204abe62..54b16f861 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingRegistersOnOS.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingRegistersOnOS.java
@@ -9,7 +9,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.session.stage.ISessionStage;
import ru.spcex.clearing.session.stage.StageResult;
import ru.spcex.clearing.session.stage.Task;
-import ru.spcex.clearing.session.stage.task.RegistryOnObligationsAndSettlementRequirementsPayload;
+import ru.spcex.clearing.session.stage.task.FormingRegistersOnOSPayload;
import ru.spcex.clearing.session.stage.util.RegistryUtil;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryInstrumentType;
@@ -39,10 +39,10 @@ public class FormingRegistersOnOS implements ISessionStage {
@Override
public StageResult> submit(Task> task) {
- RegistryOnObligationsAndSettlementRequirementsPayload payload = (RegistryOnObligationsAndSettlementRequirementsPayload) task.getData();
+ FormingRegistersOnOSPayload payload = (FormingRegistersOnOSPayload) task.getData();
switch (task.getTaskType()) {
case FormingRegistersOnOS -> {
- return createRegistryOnObligationsAndSettlementRequirements(payload.getSessionId());
+ return createRegistryOnObligationsAndSettlementRequirements();
}
default -> {
throw new IllegalStateException("Unknown task type: " + task.getTaskType());
@@ -53,12 +53,10 @@ public class FormingRegistersOnOS implements ISessionStage {
/**
* Select Registry by: registryCode = [O/T][S/M][*][T] & registryStatus=OK
*
- * @param sessionId
* @return
*/
- protected Collection selectRegistry(Long sessionId) {
- String registrySQL = "sessionId = " + sessionId;
- registrySQL += " and (registryDesignation=" + RegistryDesignation.O.getKey() + " or registryDesignation=" + RegistryDesignation.T.getKey() + ")";
+ protected Collection selectRegistry() {
+ String registrySQL = "(registryDesignation=" + RegistryDesignation.O.getKey() + " or registryDesignation=" + RegistryDesignation.T.getKey() + ")";
registrySQL += " and (registryInstrumentType=" + RegistryInstrumentType.S.getKey() + " or registryInstrumentType=" + RegistryInstrumentType.M.getKey() + ")";
registrySQL += " and (registryUnit=" + RegistryUnit.T.getKey() + ")";
registrySQL += " and registryStatus=" + RegistryStatus.OK.getKey() + ")";
@@ -67,8 +65,8 @@ public class FormingRegistersOnOS implements ISessionStage {
return result;
}
- protected StageResult> createRegistryOnObligationsAndSettlementRequirements(Long sessionId) {
- Collection forRegistries = selectRegistry(sessionId);
+ protected StageResult> createRegistryOnObligationsAndSettlementRequirements() {
+ Collection forRegistries = selectRegistry();
ArrayList newRegistries = new ArrayList<>();
//todo oreder by обрабатываться группами по полю registry.groupId
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/UnlockResources.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/UnlockResources.java
index c563c84b5..91c0a60f2 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/UnlockResources.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/UnlockResources.java
@@ -15,6 +15,7 @@ import ru.spcex.platform.enumeration.RegistryInstrumentType;
import ru.spcex.platform.enumeration.RegistryUnit;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
+import ru.spcex.platform.imdg.api.ImdgTransaction;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
@@ -26,10 +27,12 @@ import java.util.Collection;
public class UnlockResources implements ISessionStage {
private final Logger log = LoggerFactory.getLogger(getClass());
+ protected final ImdgProvider imdgProvider;
private final Imdg registryImdg;
@Autowired
public UnlockResources(ImdgProvider imdgProvider) {
+ this.imdgProvider = imdgProvider;
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
}
@@ -39,7 +42,7 @@ public class UnlockResources implements ISessionStage {
switch (task.getTaskType()) {
case UnlockResources -> {
UnlockResourcesPayload payload = (UnlockResourcesPayload) task.getData();
- return unlockResources(payload.getSdfMode(), payload.getSessionId(),
+ return unlockResources(payload.getSdfMode(),
payload.getAccount(),
payload.getSecurityId(),
payload.getFullNames(),
@@ -52,26 +55,18 @@ public class UnlockResources implements ISessionStage {
}
}
- /**
- * Select Registry by: account; fullName* / securityId
- */
- protected Collection selectRegistry(Long sessionId, String account, Long securityId, Collection fullNames) {
+ protected Collection selectRegistryForSDF04(String account, Collection fullNames) {
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
- ImdgPredicate queryPart;
- if (securityId != null) {
- queryPart = pb.in("securityId", securityId);
- } else if (fullNames != null && !fullNames.isEmpty()) {
- queryPart = pb.in("fullName", fullNames.toArray(new String[fullNames.size()]));
- } else {
- throw new IllegalArgumentException("Required securityId or fullNames");
- }
ImdgPredicate query = pb.and(
pb.and(
- pb.equals("sessionId", sessionId),
- pb.equals("registryDesignation", RegistryDesignation.A.getKey()) // не все нужны, только с этим кодом отфильтруем.
+ pb.equals("registryDesignation", RegistryDesignation.A.getKey()),
+ pb.equals("registryInstrumentType", RegistryInstrumentType.M.getKey()),
+ // pb.equals("registryCapacity", *),
+ pb.or(pb.equals("registryUnit", RegistryUnit.F.getKey()),
+ pb.equals("registryUnit", RegistryUnit.B.getKey()))
),
pb.equals("account", account),
- queryPart
+ pb.in("fullName", fullNames.toArray(new String[fullNames.size()]))
);
Collection result = registryImdg.getCollectionObjectsByPredicate(query);
@@ -79,50 +74,74 @@ public class UnlockResources implements ISessionStage {
return result;
}
+ /**
+ * Select Registry by: account; fullName* / securityId
+ */
+ protected Collection selectRegistryForSDF12(String account, Long securityId) {
+ ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
+ ImdgPredicate query = pb.and(
+ pb.and(
+ pb.equals("registryDesignation", RegistryDesignation.A.getKey()),
+ pb.equals("registryInstrumentType", RegistryInstrumentType.S.getKey()),
+ // pb.equals("registryCapacity", *),
+ pb.or(pb.equals("registryUnit", RegistryUnit.F.getKey()),
+ pb.equals("registryUnit", RegistryUnit.B.getKey()))
+ ),
+ pb.equals("account", account),
+ pb.in("securityId", securityId)
+ );
+
+ Collection result = registryImdg.getCollectionObjectsByPredicate(query);
+ log.trace("Selected {} registry's by sql: {}", result.size(), query);
+ return result;
+ }
+
+
/**
* @param sdfMode UnlockResourcesPayload.sdfMode
- * @param sessionId
* @param account
* @param securityId
* @param fullNames
* @return
*/
- protected StageResult> unlockResources(String sdfMode, Long sessionId, String account, Long securityId, Collection fullNames, BigDecimal value) {
- Collection forRegistries = selectRegistry(sessionId, account, securityId, fullNames);
+ protected StageResult> unlockResources(String sdfMode, String account, Long securityId, Collection fullNames, BigDecimal value) {
+ Collection forRegistries;
- //todo при перезапуске после незапланированного завершения стадии: надо ли проверять уже созданные регистры и не создавать дубликаты?
if (UnlockResourcesPayload.MODE_SDF04.equals(sdfMode)) {
- forRegistries = forRegistries.stream().filter(
- (Registry r) ->
- RegistryDesignation.A.equalsByKey(r.getRegistryDesignation())
- &&
- RegistryInstrumentType.M.equalsByKey(r.getRegistryInstrumentType())
- &&
- (RegistryUnit.F.equalsByKey(r.getRegistryUnit()) || RegistryUnit.B.equalsByKey(r.getRegistryUnit()))
- ).toList();
+ forRegistries = selectRegistryForSDF04(account, fullNames);
} else if (UnlockResourcesPayload.MODE_SDF12.equals(sdfMode)) {
- forRegistries = forRegistries.stream().filter(
- (Registry r) ->
- RegistryDesignation.A.equalsByKey(r.getRegistryDesignation())
- &&
- RegistryInstrumentType.S.equalsByKey(r.getRegistryInstrumentType())
- &&
- (RegistryUnit.F.equalsByKey(r.getRegistryUnit()) || RegistryUnit.B.equalsByKey(r.getRegistryUnit()))
- ).toList();
+ forRegistries = selectRegistryForSDF12(account, securityId);
} else {
throw new IllegalArgumentException("Mode not support: " + sdfMode);
}
- for (Registry registry : forRegistries) {
- boolean modified = unlockRegistry(registry, value);
- if (modified) {
- registry.setUpdated(Instant.now());
- registryImdg.update(registry);
- log.trace("Registry {} changed; value +- registry",
- registry.getId(), registry.getRegistryCode(), value);
+ ImdgTransaction tx = imdgProvider.newTransaction();
+ boolean txOk = false;
+ try {
+ log.debug("Processing transaction {}, input {} registers.", tx, forRegistries.size());
+ Imdg registryTxImdg = tx.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
+ int nUpdates = 0;
+ for (Registry registry : forRegistries) {
+ boolean modified = unlockRegistry(registry, value);
+ if (modified) {
+ registry.setUpdated(Instant.now());
+ registryTxImdg.update(registry);
+ nUpdates++;
+ log.trace("Registry {} (registryCode={}) changed; value +- {}",
+ registry.getId(), registry.getRegistryCode(), value);
+ }
+ }
+ log.info("Updated {} registry's (under transaction {}", nUpdates, tx);
+ txOk = true;
+ } finally {
+ if (txOk) {
+ log.debug("Commit transaction {}.", tx);
+ tx.commitTransaction();
+ } else {
+ log.info("Rollback transaction {}", tx);
+ tx.rollbackTransaction();
}
}
- //todo рекомендуется делать транзакцией.
StageResult> res = new StageResult<>(null, true);
res.setStageResult(forRegistries);
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/FormingRegistersOnOSPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/FormingRegistersOnOSPayload.java
new file mode 100644
index 000000000..c09807ebb
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/FormingRegistersOnOSPayload.java
@@ -0,0 +1,5 @@
+package ru.spcex.clearing.session.stage.task;
+
+public class FormingRegistersOnOSPayload {
+
+}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RegistryOnObligationsAndSettlementRequirementsPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RegistryOnObligationsAndSettlementRequirementsPayload.java
deleted file mode 100644
index e0ddc15da..000000000
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RegistryOnObligationsAndSettlementRequirementsPayload.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package ru.spcex.clearing.session.stage.task;
-
-public class RegistryOnObligationsAndSettlementRequirementsPayload {
- private Long sessionId;
-// private Long companyId;
-// private Long securityId;
-
- public Long getSessionId() {
- return sessionId;
- }
-
- public void setSessionId(Long sessionId) {
- this.sessionId = sessionId;
- }
-
-// public Long getCompanyId() {
-// return companyId;
-// }
-//
-// public void setCompanyId(Long companyId) {
-// this.companyId = companyId;
-// }
-//
-// public Long getSecurityId() {
-// return securityId;
-// }
-//
-// public void setSecurityId(Long securityId) {
-// this.securityId = securityId;
-// }
-}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/UnlockResourcesPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/UnlockResourcesPayload.java
index 1b9525f23..fc16b5d2b 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/UnlockResourcesPayload.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/UnlockResourcesPayload.java
@@ -12,8 +12,6 @@ public class UnlockResourcesPayload {
*/
private String sdfMode;
- private Long sessionId;
-
/**
* sDf04.c_acc_cred
* sDf12.depoCodeSender
@@ -46,13 +44,6 @@ public class UnlockResourcesPayload {
}
- public Long getSessionId() {
- return sessionId;
- }
-
- public void setSessionId(Long sessionId) {
- this.sessionId = sessionId;
- }
public String getAccount() {
return account;
diff --git a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java
index 43c6e0e0a..f73172da4 100644
--- a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java
+++ b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java
@@ -65,6 +65,7 @@ public record FieldRequiredRule(
}
@Override
+ // todo replace for error fieldName to fieldValue
public Optional validate(ImdgValidationContext context) {
R validatedObject = context.getValidatedObject();
V value = getter.apply(validatedObject);
diff --git a/clearing-parent/dbf-exporter/pom.xml b/clearing-parent/dbf-exporter/pom.xml
index fc2108169..12f8fbc23 100644
--- a/clearing-parent/dbf-exporter/pom.xml
+++ b/clearing-parent/dbf-exporter/pom.xml
@@ -23,11 +23,15 @@
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-autoconfigure
- org.springframework.boot
- spring-boot-autoconfigure
+ org.springframework.integration
+ spring-integration-sftp
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
@@ -49,6 +53,21 @@
ru.spcex.clearing
classes
+
+ ru.spcex.clearing
+ classes
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ ru.spcex.clearing
+ test-clearing
+ test
+
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/DBFExporterConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/DBFExporterConfig.java
index 10261ad81..7994454f4 100644
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/DBFExporterConfig.java
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/DBFExporterConfig.java
@@ -1,80 +1,11 @@
package ru.spcex.clearing.dbf.exporter.config;
-import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
-import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings;
-import ru.spcex.clearing.dbf.exporter.logic.stages.ExportFromHazelcast;
-import ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile;
-import ru.spcex.clearing.dbf.exporter.logic.stages.Stage;
-import ru.spcex.platform.imdg.api.ImdgProvider;
-import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams;
-import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
-
-import java.util.LinkedList;
-import java.util.List;
@Configuration
@EnableConfigurationProperties
@ComponentScan(basePackages = {"ru.spcex.clearing.dbf.exporter"})
public class DBFExporterConfig {
-
- @Bean("taskExecutorHazelcastClientInitializer")
- public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() {
- return createThreadPoolTaskExecutor(1, true);
- }
-
- @Bean("taskExecutorIdGeneratorAwaiter")
- public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() {
- return createThreadPoolTaskExecutor(1, false);
- }
-
- @Bean("imdgProvider")
- public ImdgProvider imdgProvider(@Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer,
- @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter,
- ExportDBFServiceSettings settings) {
- HazelcastClientParams params = new HazelcastClientParams();
- params.setClusterMembers(settings.getHazelcast().getClusterMembers());
- params.setLogin(settings.getHazelcast().getLogin());
- params.setPassword(settings.getHazelcast().getPassword());
- return new HazelcastService(taskExecutorHazelcastClientInitializer, taskExecutorIdGeneratorAwaiter, params);
- }
-
- @Bean("pipeline")
- public List pipeline(ApplicationContext context) {
- List pipeline = new LinkedList<>();
-
- pipeline.add(context.getBean(PrepareDBFFile.class));
- pipeline.add(context.getBean(ExportFromHazelcast.class));
-
- return pipeline;
- }
-
- @Bean("executor")
- public ThreadPoolTaskExecutor executor(ExportDBFServiceSettings settings) {
- ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
- executor.setMaxPoolSize(settings.getCommon().getThreadsCount());
- executor.setCorePoolSize(settings.getCommon().getThreadsCount());
- executor.setThreadNamePrefix("dbf-exporter");
- executor.setWaitForTasksToCompleteOnShutdown(true);
- executor.setAwaitTerminationSeconds(300);
- executor.initialize();
- return executor;
- }
-
- 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;
- }
-
}
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/ImdgConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/ImdgConfig.java
new file mode 100644
index 000000000..bc37887f9
--- /dev/null
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/ImdgConfig.java
@@ -0,0 +1,63 @@
+package ru.spcex.clearing.dbf.exporter.config;
+
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams;
+import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
+
+@Configuration
+@EnableConfigurationProperties
+@ComponentScan(basePackages = {"ru.spcex.clearing.dbf.exporter"})
+public class ImdgConfig {
+
+ @Bean("taskExecutorHazelcastClientInitializer")
+ public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() {
+ return createThreadPoolTaskExecutor(1, true);
+ }
+
+ @Bean("taskExecutorIdGeneratorAwaiter")
+ public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() {
+ return createThreadPoolTaskExecutor(1, false);
+ }
+
+ @Bean("imdgProvider")
+ public ImdgProvider imdgProvider(@Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer,
+ @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter,
+ ExportDBFServiceSettings settings) {
+ HazelcastClientParams params = new HazelcastClientParams();
+ params.setClusterMembers(settings.getHazelcast().getClusterMembers());
+ params.setLogin(settings.getHazelcast().getLogin());
+ params.setPassword(settings.getHazelcast().getPassword());
+ return new HazelcastService(taskExecutorHazelcastClientInitializer, taskExecutorIdGeneratorAwaiter, params);
+ }
+
+ @Bean("executor")
+ public ThreadPoolTaskExecutor executor(ExportDBFServiceSettings settings) {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ executor.setMaxPoolSize(settings.getCommon().getThreadsCount());
+ executor.setCorePoolSize(settings.getCommon().getThreadsCount());
+ executor.setThreadNamePrefix("dbf-exporter");
+ executor.setWaitForTasksToCompleteOnShutdown(true);
+ executor.setAwaitTerminationSeconds(300);
+ executor.initialize();
+ return executor;
+ }
+
+ 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;
+ }
+
+}
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaSenderConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaSenderConfig.java
index 5f0a59e40..bd4994aca 100644
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaSenderConfig.java
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaSenderConfig.java
@@ -17,6 +17,8 @@ import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
+import java.util.function.Supplier;
+
//отдельный конфиг для sender чтобы сделать required false
@Configuration
public class KafkaSenderConfig {
@@ -38,7 +40,6 @@ public class KafkaSenderConfig {
return KafkaProducerFactory.producerFactory(kafkaSettings);
}
- @Autowired(required = false)
@Bean("kafkaTemplate")
public KafkaTemplate kafkaTemplate(ProducerFactory pf) {
if (pf == null) {
@@ -47,16 +48,11 @@ public class KafkaSenderConfig {
return new KafkaTemplate<>(pf);
}
- @Autowired(required = false)
@Bean
- public KafkaSender kafkaSender(KafkaTemplate kafkaTemplate,
- ImdgProvider imdgProvider) {
- if (kafkaTemplate == null) {
- log.info("Can not create KafkaSender: no kafka-producer settings");
- return null;
- }
+ public Supplier kafkaSenderSupplier(KafkaTemplate kafkaTemplate,
+ ImdgProvider imdgProvider) {
ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator();
- return KafkaSender
+ return () -> KafkaSender
.setup()
.setKafkaTemplate(kafkaTemplate)
.idGenerator(imdgIdGenerator::nextId)
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/PipelineConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/PipelineConfig.java
new file mode 100644
index 000000000..bccca7609
--- /dev/null
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/PipelineConfig.java
@@ -0,0 +1,26 @@
+package ru.spcex.clearing.dbf.exporter.config;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import ru.spcex.clearing.dbf.exporter.logic.stages.ExportFromHazelcast;
+import ru.spcex.clearing.dbf.exporter.logic.stages.Journal;
+import ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile;
+import ru.spcex.clearing.dbf.exporter.logic.stages.Stage;
+
+import java.util.LinkedList;
+import java.util.List;
+
+@Configuration
+public class PipelineConfig {
+ @Bean("pipeline")
+ public List pipeline(ApplicationContext context) {
+ List pipeline = new LinkedList<>();
+
+ pipeline.add(context.getBean(PrepareDBFFile.class));
+ pipeline.add(context.getBean(ExportFromHazelcast.class));
+ pipeline.add(context.getBean(Journal.class));
+
+ return pipeline;
+ }
+}
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/SFTPConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/SFTPConfig.java
new file mode 100644
index 000000000..5f07a6eac
--- /dev/null
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/SFTPConfig.java
@@ -0,0 +1,95 @@
+package ru.spcex.clearing.dbf.exporter.config;
+
+import com.jcraft.jsch.ChannelSftp;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.expression.common.LiteralExpression;
+import org.springframework.integration.annotation.Gateway;
+import org.springframework.integration.annotation.MessagingGateway;
+import org.springframework.integration.annotation.ServiceActivator;
+import org.springframework.integration.channel.DirectChannel;
+import org.springframework.integration.dsl.IntegrationFlow;
+import org.springframework.integration.dsl.IntegrationFlows;
+import org.springframework.integration.file.remote.session.CachingSessionFactory;
+import org.springframework.integration.file.remote.session.SessionFactory;
+import org.springframework.integration.sftp.gateway.SftpOutboundGateway;
+import org.springframework.integration.sftp.outbound.SftpMessageHandler;
+import org.springframework.integration.sftp.session.DefaultSftpSessionFactory;
+import org.springframework.integration.sftp.session.SftpFileInfo;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.messaging.MessageHandler;
+import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings;
+
+import java.io.File;
+import java.util.List;
+
+import static org.springframework.integration.file.remote.gateway.AbstractRemoteFileOutboundGateway.Command.LS;
+
+@Configuration
+public class SFTPConfig {
+
+ @Bean
+ public SessionFactory sftpSessionFactory(ExportDBFServiceSettings settings) {
+ DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
+ factory.setHost(settings.getStore().getServerIp());
+ factory.setPort(settings.getStore().getServerPort());
+ factory.setUser(settings.getStore().getUser());
+ factory.setPassword(settings.getStore().getPassword());
+ factory.setAllowUnknownKeys(true);
+ return new CachingSessionFactory<>(factory);
+ }
+
+ @Bean
+ @ServiceActivator(inputChannel = "toSftpChannel")
+ public MessageHandler handler(SessionFactory sessionFactory, ExportDBFServiceSettings settings) {
+ SftpMessageHandler handler = new SftpMessageHandler(sessionFactory);
+ handler.setRemoteDirectoryExpression(new LiteralExpression(settings.getStore().getOutDir()));
+ handler.setAutoCreateDirectory(true);
+ handler.setFileNameGenerator(message -> {
+ if (message.getPayload() instanceof File) {
+ return ((File) message.getPayload()).getName();
+ }else {
+ throw new IllegalArgumentException("File must expected as payload.");
+ }
+ });
+ return handler;
+ }
+
+ @MessagingGateway
+ public interface DbfGateway {
+ @Gateway(requestChannel = "toSftpChannel")
+ void sendToSftp(File file);
+
+ @Gateway(requestChannel = "listSftpChannel")
+ List listFiles(String dir);
+ }
+
+ @Bean
+ public MessageChannel listSftpChannel(SessionFactory sessionFactory, ExportDBFServiceSettings settings) {
+ DirectChannel dc = new DirectChannel();
+ dc.subscribe(handlerList(sessionFactory, settings));
+ return dc;
+ }
+
+ @Bean
+ public MessageChannel toSftpChannel(SessionFactory sessionFactory, ExportDBFServiceSettings settings) {
+ DirectChannel dc = new DirectChannel();
+ dc.subscribe(handler(sessionFactory, settings));
+ return dc;
+ }
+
+ @Bean
+ @ServiceActivator(inputChannel = "listSftpChannel")
+ public MessageHandler handlerList(SessionFactory sessionFactory, ExportDBFServiceSettings settings) {
+ String expression = "'/%s'".formatted(settings.getStore().getOutDir());
+ SftpOutboundGateway sftpOutboundGateway = new SftpOutboundGateway(sessionFactory, LS.getCommand(), expression);
+ return sftpOutboundGateway;
+ }
+
+ @Bean
+ public IntegrationFlow sftpOutboundListFlow(SessionFactory sessionFactory, ExportDBFServiceSettings settings) {
+ return IntegrationFlows.from("listSftpChannel")
+ .handle(new SftpOutboundGateway(sessionFactory, "ls", "payload")
+ ).get();
+ }
+}
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Store.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Store.java
index e1430418a..74b55277c 100644
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Store.java
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Store.java
@@ -3,6 +3,43 @@ package ru.spcex.clearing.dbf.exporter.config.settings;
public class Store {
private String outDir;
+ private String localTempDir;
+ private String user;
+ private String password;
+ private String serverIp;
+ private int serverPort;
+
+ public String getUser() {
+ return user;
+ }
+
+ public void setUser(String user) {
+ this.user = user;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public String getServerIp() {
+ return serverIp;
+ }
+
+ public void setServerIp(String serverIp) {
+ this.serverIp = serverIp;
+ }
+
+ public int getServerPort() {
+ return serverPort;
+ }
+
+ public void setServerPort(int serverPort) {
+ this.serverPort = serverPort;
+ }
public String getOutDir() {
return outDir;
@@ -11,4 +48,12 @@ public class Store {
public void setOutDir(String outDir) {
this.outDir = outDir;
}
+
+ public String getLocalTempDir() {
+ return localTempDir;
+ }
+
+ public void setLocalTempDir(String localTempDir) {
+ this.localTempDir = localTempDir;
+ }
}
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/controller/ExporterController.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/controller/ExporterController.java
deleted file mode 100644
index a82bd0f32..000000000
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/controller/ExporterController.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package ru.spcex.clearing.dbf.exporter.controller;
-
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.http.MediaType;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-import ru.spcex.clearing.dbf.exporter.services.DBFExportService;
-
-@Controller("/")
-public class ExporterController implements InitializingBean {
- private final Logger log = LoggerFactory.getLogger(getClass());
- private final DBFExportService dbfExportService;
-
- public ExporterController(@Qualifier("dbfExportService") DBFExportService dbfExportService) {
- this.dbfExportService = dbfExportService;
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "/export", produces = MediaType.TEXT_PLAIN_VALUE)
- @ResponseBody
- public String exportTables() {
- log.info("Call export method for exporter controller");
- dbfExportService.run();
- return "export done";
- }
-
- @Override
- public void afterPropertiesSet() throws Exception {
- log.info("controller started");
-
- }
-}
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/ResultContainer.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/ResultContainer.java
index a84f3a8cb..82b5a7559 100644
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/ResultContainer.java
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/ResultContainer.java
@@ -4,6 +4,7 @@ import ru.spcex.clearing.dbf.exporter.logic.data.enums.StageResult;
import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table;
import java.io.File;
+import java.time.LocalDateTime;
import java.util.UUID;
/**
@@ -15,6 +16,8 @@ public class ResultContainer {
private File fileForExport;
private Long groupId;
private StageResult lastStageResult;
+ private LocalDateTime registrationDateTime;
+ private String mamberCode;
protected ResultContainer() {}
@@ -64,4 +67,20 @@ public class ResultContainer {
public void setLastStageResult(StageResult lastStageResult) {
this.lastStageResult = lastStageResult;
}
+
+ public LocalDateTime getRegistrationDateTime() {
+ return registrationDateTime;
+ }
+
+ public void setRegistrationDateTime(LocalDateTime registrationDateTime) {
+ this.registrationDateTime = registrationDateTime;
+ }
+
+ public String getMamberCode() {
+ return mamberCode;
+ }
+
+ public void setMamberCode(String mamberCode) {
+ this.mamberCode = mamberCode;
+ }
}
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java
new file mode 100644
index 000000000..bc51d59e6
--- /dev/null
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java
@@ -0,0 +1,108 @@
+package ru.spcex.clearing.dbf.exporter.logic.data.enums;
+
+import org.springframework.integration.sftp.session.SftpFileInfo;
+import ru.spcex.clearing.dbf.exporter.logic.data.ResultContainer;
+
+import java.io.File;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Locale;
+
+import static ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile.SECTION;
+import static ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile.outDir;
+
+public enum FilenameTemplate {
+ df_section_dateTime {
+ @Override
+ public String getFileName(ResultContainer resultContainer, List files) {
+ return appendSection(resultContainer)
+ .append(dateTime(resultContainer))
+ .append(".DBF").toString();
+ }
+ },
+ df_section_dateTime_counter {
+ @Override
+ public String getFileName(ResultContainer resultContainer, List files) {
+ return appendSection(resultContainer)
+ .append(dateTime(resultContainer))
+ .append(counter(resultContainer, files))
+ .append(".DBF").toString();
+ }
+ },
+ df_section_dateTime_counter_mamberCode {
+ @Override
+ public String getFileName(ResultContainer resultContainer, List files) {
+ return appendSection(resultContainer)
+ .append(dateTime(resultContainer))
+ .append(counter(resultContainer, files))
+ .append(mamberCode(resultContainer))
+ .append(".DBF").toString();
+ }
+ };
+
+ protected StringBuilder appendSection(ResultContainer resultContainer) {
+ StringBuilder result = new StringBuilder();
+ result.append(outDir);
+ result.append(File.separator);
+ result.append(resultContainer.getTableForExport().getFilePrefix().toUpperCase(Locale.ROOT));
+ result.append('_');
+ result.append(SECTION);
+ return result;
+ }
+
+ protected StringBuilder dateTime(ResultContainer resultContainer) {
+ StringBuilder result = new StringBuilder();
+ result.append('_');
+ result.append("PRC");
+ result.append(tsFormatter.format(resultContainer.getRegistrationDateTime()));
+ return result;
+ }
+
+ protected StringBuilder counter(ResultContainer resultContainer, List files) {
+ StringBuilder result = new StringBuilder();
+ result.append('_');
+ result.append(countSameFilesInDir(resultContainer.getTableForExport().getFilePrefix(), files) + 1);
+ return result;
+ }
+
+ protected StringBuilder mamberCode(ResultContainer resultContainer) {
+ StringBuilder result = new StringBuilder();
+ result.append('_');
+ result.append(resultContainer.getMamberCode());
+ return result;
+ }
+
+ protected Integer countSameFilesInDir(String prefixOfTable, List files) {
+ int res = 0;
+ String timestampNow = utilFormatter.format(LocalDateTime.now());
+ for (SftpFileInfo file : files) {
+ if (file.isDirectory()) continue;
+ String name = file.getFilename();
+ String[] splitName = name.split("_");
+ if (splitName.length < 3)
+ throw new IllegalArgumentException("Filename did not contains 3 or 4 separator \"_\": " + name);
+ String prefix = splitName[0];
+ String timestamp = splitName[2];
+
+ if (prefix.equalsIgnoreCase(prefixOfTable) && timestamp.contains(timestampNow)) {
+ if (splitName.length < 4)
+ throw new IllegalArgumentException("Filename did not contains 4 separator \"_\": " + name);
+ String counter = splitName[3];
+ int positionOfDot = counter.indexOf('.');
+ if (positionOfDot != -1) {
+ counter = counter.substring(0, positionOfDot);
+ }
+ res = Integer.max(res, Integer.parseInt(counter));
+ }
+ }
+ return res;
+ }
+
+ private static final DateTimeFormatter tsFormatter = DateTimeFormatter.ofPattern("yyMMddHHmm");
+ private static final DateTimeFormatter utilFormatter = DateTimeFormatter.ofPattern("yyMMdd");
+
+ public String getFileName(ResultContainer resultContainer, List files) {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/Table.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/Table.java
index 52f7d87cd..24ae62a8e 100644
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/Table.java
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/Table.java
@@ -7,11 +7,13 @@ import ru.spcex.platform.classes.base.SpcexObjectBase;
public enum Table {
S_DF02("DF-02", IMDGDistributedNames.Map_SDf02, SDf02.class),
S_DF03("DF-03", IMDGDistributedNames.Map_SDf03, SDf03.class),
- S_DF08("DF-08", IMDGDistributedNames.Map_SDf08, SDf08.class),
- S_DF11("DF-11", IMDGDistributedNames.Map_SDf11, SDf11.class),
- S_DF18("DF-18", IMDGDistributedNames.Map_SDf18, SDf18.class),
- S_DF10("DF-10", IMDGDistributedNames.Map_SDf10, SDf10.class),
- S_DF17("DF-17", IMDGDistributedNames.Map_SDf17, SDf17.class);
+ S_DF05("DF-05", IMDGDistributedNames.Map_SDf05, SDf05.class),
+ S_DF07("DF-07", IMDGDistributedNames.Map_SDf07, SDf07.class),
+ S_DF51("DF-51", IMDGDistributedNames.Map_SDf51, SDf51.class),
+ S_DF53("DF-53", IMDGDistributedNames.Map_SDf53, SDf53.class),
+ S_DF54("DF-54", IMDGDistributedNames.Map_SDf54, SDf54.class),
+ S_DF56("DF-56", IMDGDistributedNames.Map_SDf56, SDf56.class);
+
/**
* Префикс имени файла для экспорта
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java
index a2bebeafc..e322e6e8a 100644
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java
@@ -3,9 +3,9 @@ package ru.spcex.clearing.dbf.exporter.logic.stages;
import com.linuxense.javadbf.DBFField;
import com.linuxense.javadbf.DBFWriter;
import org.springframework.beans.factory.InitializingBean;
-import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.sdf.*;
+import ru.spcex.clearing.dbf.exporter.config.SFTPConfig;
import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings;
import ru.spcex.clearing.dbf.exporter.exceptions.ConfigException;
import ru.spcex.clearing.dbf.exporter.logic.data.ResultContainer;
@@ -30,36 +30,42 @@ import java.util.Objects;
public class ExportFromHazelcast extends Stage implements InitializingBean {
private final ExportDBFServiceSettings settings;
private final ImdgProvider imdgProvider;
+ private final SFTPConfig.DbfGateway gateway;
private final S_DF02_Converter s_df02_converter;
private final S_DF03_Converter s_df03_converter;
- private final S_DF08_Converter s_df08_converter;
- private final S_DF11_Converter s_df11_converter;
- private final S_DF18_Converter s_df18_converter;
- private final S_DF10_Converter s_df10_converter;
- private final S_DF17_Converter s_df17_converter;
+ private final S_DF05_Converter s_df05_converter;
+ private final S_DF07_Converter s_df07_converter;
+ private final S_DF51_Converter s_df51_converter;
+ private final S_DF53_Converter s_df53_converter;
+ private final S_DF54_Converter s_df54_converter;
+ private final S_DF56_Converter s_df56_converter;
private final Map dbfFieldsForTable = new HashMap<>();
private Charset dbfCharset;
public ExportFromHazelcast(ExportDBFServiceSettings settings,
- @Qualifier("imdgProvider") ImdgProvider imdgProvider,
+ ImdgProvider imdgProvider,
+ SFTPConfig.DbfGateway gateway,
S_DF02_Converter s_df02_converter,
S_DF03_Converter s_df03_converter,
- S_DF08_Converter s_df08_converter,
- S_DF11_Converter s_df11_converter,
- S_DF18_Converter s_df18_converter,
- S_DF10_Converter s_df10_converter,
- S_DF17_Converter s_df17_converter) {
+ S_DF07_Converter s_df07_converter,
+ S_DF05_Converter s_df05_converter,
+ S_DF51_Converter s_df51_converter,
+ S_DF54_Converter s_df54_converter,
+ S_DF53_Converter s_df53_converter,
+ S_DF56_Converter s_df56_converter) {
this.settings = settings;
this.imdgProvider = imdgProvider;
+ this.gateway = gateway;
this.s_df02_converter = s_df02_converter;
this.s_df03_converter = s_df03_converter;
- this.s_df08_converter = s_df08_converter;
- this.s_df11_converter = s_df11_converter;
- this.s_df18_converter = s_df18_converter;
- this.s_df10_converter = s_df10_converter;
- this.s_df17_converter = s_df17_converter;
+ this.s_df07_converter = s_df07_converter;
+ this.s_df05_converter = s_df05_converter;
+ this.s_df51_converter = s_df51_converter;
+ this.s_df54_converter = s_df54_converter;
+ this.s_df53_converter = s_df53_converter;
+ this.s_df56_converter = s_df56_converter;
}
@Override
@@ -89,13 +95,15 @@ public class ExportFromHazelcast extends Stage implements InitializingBean {
Object[] values;
if (value instanceof SDf02 sDf02Value) values = s_df02_converter.toObjectArray(sDf02Value);
else if (value instanceof SDf03 sDf03Value) values = s_df03_converter.toObjectArray(sDf03Value);
- else if (value instanceof SDf08 sDf08Value) values = s_df08_converter.toObjectArray(sDf08Value);
- else if (value instanceof SDf11 sDf11Value) values = s_df11_converter.toObjectArray(sDf11Value);
- else if (value instanceof SDf18 sDf18Value) values = s_df18_converter.toObjectArray(sDf18Value);
- else if (value instanceof SDf10 sDf10Value) values = s_df10_converter.toObjectArray(sDf10Value);
- else if (value instanceof SDf17 sDf17Value) values = s_df17_converter.toObjectArray(sDf17Value);
+ else if (value instanceof SDf05 sDf05Value) values = s_df05_converter.toObjectArray(sDf05Value);
+ else if (value instanceof SDf07 sDf07Value) values = s_df07_converter.toObjectArray(sDf07Value);
+ else if (value instanceof SDf51 sDf51Value) values = s_df51_converter.toObjectArray(sDf51Value);
+ else if (value instanceof SDf53 sDf53Value) values = s_df53_converter.toObjectArray(sDf53Value);
+ else if (value instanceof SDf54 sDf54Value) values = s_df54_converter.toObjectArray(sDf54Value);
+ else if (value instanceof SDf56 sDf56Value) values = s_df56_converter.toObjectArray(sDf56Value);
else throw new Exception("Get unknown object from imdg. Class: " + value.getClass().getSimpleName());
dbfWriter.addRecord(values);
+ gateway.sendToSftp(dbfFile);
}
writeOk = true;
emptyMap = tableRows.isEmpty();
@@ -131,11 +139,12 @@ public class ExportFromHazelcast extends Stage implements InitializingBean {
private void initExportFileStructure() {
dbfFieldsForTable.put(Table.S_DF02, s_df02_converter.getDBFHeaders());
dbfFieldsForTable.put(Table.S_DF03, s_df03_converter.getDBFHeaders());
- dbfFieldsForTable.put(Table.S_DF08, s_df08_converter.getDBFHeaders());
- dbfFieldsForTable.put(Table.S_DF18, s_df18_converter.getDBFHeaders());
- dbfFieldsForTable.put(Table.S_DF10, s_df10_converter.getDBFHeaders());
- dbfFieldsForTable.put(Table.S_DF11, s_df11_converter.getDBFHeaders());
- dbfFieldsForTable.put(Table.S_DF17, s_df17_converter.getDBFHeaders());
+ dbfFieldsForTable.put(Table.S_DF05, s_df05_converter.getDBFHeaders());
+ dbfFieldsForTable.put(Table.S_DF07, s_df07_converter.getDBFHeaders());
+ dbfFieldsForTable.put(Table.S_DF51, s_df51_converter.getDBFHeaders());
+ dbfFieldsForTable.put(Table.S_DF53, s_df53_converter.getDBFHeaders());
+ dbfFieldsForTable.put(Table.S_DF54, s_df54_converter.getDBFHeaders());
+ dbfFieldsForTable.put(Table.S_DF56, s_df56_converter.getDBFHeaders());
}
private void initDBFCharset() {
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/Journal.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/Journal.java
index 957862fa5..29a9c8cf9 100644
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/Journal.java
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/Journal.java
@@ -11,25 +11,25 @@ import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table;
import ru.spcex.clearing.platform.messaging.domain.cud.system.JournalSdf;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
-import java.time.LocalDate;
-import java.time.LocalTime;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
import java.util.EnumMap;
import java.util.Map;
+import java.util.function.Supplier;
+
+import static ru.spcex.clearing.platform.messaging.domain.Consts.EXPORT_COMPLETED;
@Component
public class Journal extends Stage implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
- private final KafkaSender kafkaSender;
+ private final Supplier kafkaSender;
- @Autowired(required = false)
- public Journal(KafkaSender kafkaSender) {
+ @Autowired
+ public Journal(Supplier kafkaSender) {
this.kafkaSender = kafkaSender;
}
- public Journal() {
- this.kafkaSender = null;
- }
-
@Override
public boolean skipCompleted() {
return false;
@@ -43,13 +43,21 @@ public class Journal extends Stage implements InitializingBean {
}
JournalSdf journalSdf = new JournalSdf();
//todo read file attibutes
- journalSdf.setRegistrationDate(LocalDate.now());
- journalSdf.setRegistrationTime(LocalTime.now());
+ journalSdf.setRegistrationDate(resultContainer.getRegistrationDateTime().toLocalDate());
+ journalSdf.setRegistrationTime(resultContainer.getRegistrationDateTime().toLocalTime());
journalSdf.setRegistrationNumber(resultContainer.getGroupId());
journalSdf.setDocumentName(documentNames.get(resultContainer.getTableForExport()));
journalSdf.setDossierNumber(dossierNumber.get(resultContainer.getTableForExport()));
journalSdf.setResultStatus(StageResult.ERROR.equals(resultContainer.getLastStageResult()) ? "NACK" : "ACK");
-// kafkaSender.sendRequestToQueue();
+ kafkaSender.get().sendRequestToQueue(EXPORT_COMPLETED, journalSdf);
+
+ //удалим временный файл
+ File dbfFile = resultContainer.getFileForExport();
+ try {
+ Files.deleteIfExists(dbfFile.toPath());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
return StageResult.COMPLETE;
}
@@ -61,23 +69,23 @@ public class Journal extends Stage implements InitializingBean {
static {
documentNames.put(Table.S_DF02, "Уведомлений об исполнении операции загрузки денежных средств или уведомление об ошибке");
documentNames.put(Table.S_DF03, "Сводное платёжное поручение по итогу проведения расчетов, направляемое в РО");
- //documentNames.put(Table.S_DF05, "Уведомление о завершении расчетов в секции");
- documentNames.put(Table.S_DF08, "Запрос остатков по всем счетам, направляемый в РО");
- documentNames.put(Table.S_DF10, "Подтверждение о загрузке по поступлению на клиринговый счет");
- documentNames.put(Table.S_DF11, "Распоряжение на списание с ТБС УК на Клиринговый счет (по итогам проведения расчетов по возврату депозита) / Распоряжение на списание с ТБС УК на Корреспонденский счет УК");
- //documentNames.put(Table.S_DF13, "Распоряжение на списание денежных средств УК категории В (с клирингового счета)");
- documentNames.put(Table.S_DF17, "Подтверждение о загрузке Уведомления о возврате ден.ср. по договору депозита");
+ documentNames.put(Table.S_DF05, "Уведомление о завершении расчетов в секции");
+ documentNames.put(Table.S_DF07, "Подтверждение о загрузке Уведомления о возврате ден.ср. по договору депозита");
+ documentNames.put(Table.S_DF51, "Запрос остатков по всем счетам, направляемый в РО");
+ documentNames.put(Table.S_DF53, "");
+ documentNames.put(Table.S_DF54, "Распоряжение на списание денежных средств УК категории В (с клирингового счета)");
+ documentNames.put(Table.S_DF56, "");
}
private static final Map dossierNumber = new EnumMap<>(Table.class);
static {
dossierNumber.put(Table.S_DF02, "07-50");
dossierNumber.put(Table.S_DF03, "07-51");
- //dossierNumber.put(Table.S_DF05, "07-53");
- dossierNumber.put(Table.S_DF08, "07-55");
- dossierNumber.put(Table.S_DF10, "07-56");
- dossierNumber.put(Table.S_DF11, "07-36");
- //dossierNumber.put(Table.S_DF13, "07-48");
- dossierNumber.put(Table.S_DF17, "07-58");
+ dossierNumber.put(Table.S_DF05, "07-53");
+ dossierNumber.put(Table.S_DF07, "07-58");
+ dossierNumber.put(Table.S_DF51, "07-55");
+ dossierNumber.put(Table.S_DF53, "");
+ dossierNumber.put(Table.S_DF54, "07-48");
+ dossierNumber.put(Table.S_DF56, "");
}
}
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java
index a0743322c..2b88238c0 100644
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java
@@ -1,9 +1,12 @@
package ru.spcex.clearing.dbf.exporter.logic.stages;
import org.springframework.beans.factory.InitializingBean;
+import org.springframework.integration.sftp.session.SftpFileInfo;
import org.springframework.stereotype.Component;
+import ru.spcex.clearing.dbf.exporter.config.SFTPConfig;
import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings;
import ru.spcex.clearing.dbf.exporter.logic.data.ResultContainer;
+import ru.spcex.clearing.dbf.exporter.logic.data.enums.FilenameTemplate;
import ru.spcex.clearing.dbf.exporter.logic.data.enums.StageResult;
import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table;
@@ -12,8 +15,9 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.Locale;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
import java.util.Objects;
/**
@@ -21,23 +25,25 @@ import java.util.Objects;
*/
@Component
public class PrepareDBFFile extends Stage implements InitializingBean {
- private static final String SECTION = "U";
- private static final String CODE_OF_MEMBER = null;
- private static final DateTimeFormatter tsFormatter = DateTimeFormatter.ofPattern("yyMMddHHmm");
- private static final DateTimeFormatter utilFormatter = DateTimeFormatter.ofPattern("yyMMdd");
+ public static final String SECTION = "S";
private final ExportDBFServiceSettings settings;
- private String outDir;
+ public static String outDir;
+ private final SFTPConfig.DbfGateway gateway;
- public PrepareDBFFile(ExportDBFServiceSettings settings) {
+ public PrepareDBFFile(ExportDBFServiceSettings settings, SFTPConfig.DbfGateway gateway) {
this.settings = settings;
+ this.gateway = gateway;
}
@Override
public StageResult process(ResultContainer resultContainer) {
Objects.requireNonNull(resultContainer.getTableForExport());
-
+ List files = gateway.listFiles(settings.getStore().getOutDir());
+ log.debug("From sFTP dir \"{}\" list {} file names.", settings.getStore().getOutDir(), files.size());
Table table = resultContainer.getTableForExport();
- File dbfFile = new File(prepareFilename(table, SECTION, CODE_OF_MEMBER, outDir));
+ LocalDateTime currentDateTime = LocalDateTime.now();
+ resultContainer.setRegistrationDateTime(currentDateTime);
+ File dbfFile = new File(nameTemplates.get(table).getFileName(resultContainer, files));
try {
Path dbfFilePath = dbfFile.toPath();
Files.deleteIfExists(dbfFilePath);
@@ -53,58 +59,25 @@ public class PrepareDBFFile extends Stage implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
- String outDirPath = settings.getStore().getOutDir();
+ String outDirPath = settings.getStore().getLocalTempDir();
File outDirFile = new File(outDirPath);
if (outDirFile.exists() && !outDirFile.isDirectory())
throw new IOException("Output directory " + outDirPath + " is file.");
if (!outDirFile.exists()) Files.createDirectories(outDirFile.toPath());
this.outDir = outDirPath;
+ log.info("Output directory: {}", outDirFile.getAbsolutePath());
}
- private String prepareFilename(Table table, String section, String codeOfMember, String outDir) {
- StringBuilder result = new StringBuilder();
- String prefixOfTable = table.getFilePrefix();
- String time = "PRC" + tsFormatter.format(LocalDateTime.now());
+ private static final Map nameTemplates = new EnumMap<>(Table.class);
- result.append(outDir);
- result.append(File.separator);
- result.append(prefixOfTable.toUpperCase(Locale.ROOT));
- result.append('_');
- result.append(section);
- result.append('_');
- result.append(time);
- result.append('_');
- result.append(countSameFilesInDir(prefixOfTable, outDir) + 1);
- if (codeOfMember != null) {
- result.append('_');
- result.append(codeOfMember);
- }
- result.append(".DBF");
- return result.toString();
- }
-
- private Integer countSameFilesInDir(String prefixOfTable, String outDir) {
- int res = 0;
- File directory = new File(outDir);
- if (directory.exists()) {
- for (File file : Objects.requireNonNull(directory.listFiles())) {
- String name = file.getName();
- String[] splitName = name.split("_");
- String prefix = splitName[0];
- String timestamp = splitName[2];
- String timestampNow = utilFormatter.format(LocalDateTime.now());
-
- if (prefix.equalsIgnoreCase(prefixOfTable) && timestamp.contains(timestampNow)) {
- String counter = splitName[3];
- int positionOfDot = counter.indexOf('.');
- if (positionOfDot != -1) {
- counter = counter.substring(0, positionOfDot);
- }
- res = Integer.max(res, Integer.parseInt(counter));
-
- }
- }
- }
- return res;
+ static {
+ nameTemplates.put(Table.S_DF02, FilenameTemplate.df_section_dateTime_counter);
+ nameTemplates.put(Table.S_DF03, FilenameTemplate.df_section_dateTime_counter);
+ nameTemplates.put(Table.S_DF05, FilenameTemplate.df_section_dateTime);
+ nameTemplates.put(Table.S_DF07, FilenameTemplate.df_section_dateTime_counter);
+ nameTemplates.put(Table.S_DF51, FilenameTemplate.df_section_dateTime_counter);
+ nameTemplates.put(Table.S_DF53, FilenameTemplate.df_section_dateTime_counter);
+ nameTemplates.put(Table.S_DF54, FilenameTemplate.df_section_dateTime_counter);
+ nameTemplates.put(Table.S_DF56, FilenameTemplate.df_section_dateTime_counter);
}
}
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/CommandService.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/CommandService.java
index 8689559f0..2c3acd3f1 100644
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/CommandService.java
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/CommandService.java
@@ -35,12 +35,30 @@ public class CommandService extends QueueConsumer implements InitializingBean {
callback(ExportToFileRequest.class)
.setConsumer(this::process)
.forDestination(Consts.EXPORT_PROCESS, callbacks::put);
+ callback(SdfClearingRequest.class)
+ .setConsumer(r -> processSpecial(Table.S_DF02, r))
+ .forDestination(Consts.SDF02_PROCESS, callbacks::put);
callback(SdfClearingRequest.class)
.setConsumer(r -> processSpecial(Table.S_DF03, r)) // todo необходимо в отдельную папку: "в отдельную директорию SettlementHouse_Fail (чтобы не отдавать такие файлы в ПРЦ"
.forDestination(Consts.SDF03_PROCESS, callbacks::put);
callback(SdfClearingRequest.class)
- .setConsumer(r -> processSpecial(Table.S_DF11, r))
- .forDestination(Consts.SDF11_PROCESS, callbacks::put);
+ .setConsumer(r -> processSpecial(Table.S_DF05, r))
+ .forDestination(Consts.SDF05_PROCESS, callbacks::put);
+ callback(SdfClearingRequest.class)
+ .setConsumer(r -> processSpecial(Table.S_DF07, r))
+ .forDestination(Consts.SDF07_PROCESS, callbacks::put);
+ callback(SdfClearingRequest.class)
+ .setConsumer(r -> processSpecial(Table.S_DF51, r))
+ .forDestination(Consts.SDF51_PROCESS, callbacks::put);
+ callback(SdfClearingRequest.class)
+ .setConsumer(r -> processSpecial(Table.S_DF53, r))
+ .forDestination(Consts.SDF53_PROCESS, callbacks::put);
+ callback(SdfClearingRequest.class)
+ .setConsumer(r -> processSpecial(Table.S_DF54, r))
+ .forDestination(Consts.SDF54_PROCESS, callbacks::put);
+ callback(SdfClearingRequest.class)
+ .setConsumer(r -> processSpecial(Table.S_DF56, r))
+ .forDestination(Consts.SDF56_PROCESS, callbacks::put);
init();
}
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/DBFExportService.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/DBFExportService.java
deleted file mode 100644
index 3371e1c72..000000000
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/DBFExportService.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package ru.spcex.clearing.dbf.exporter.services;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
-import org.springframework.stereotype.Service;
-import ru.spcex.clearing.dbf.exporter.logic.Processor;
-import ru.spcex.clearing.dbf.exporter.logic.data.ResultContainer;
-import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table;
-import ru.spcex.platform.imdg.api.ImdgProvider;
-
-import java.util.Arrays;
-
-@Service("dbfExportService")
-public class DBFExportService {
- Logger log = LoggerFactory.getLogger(getClass());
- private final ThreadPoolTaskExecutor executor;
- private final Processor processor;
- protected final ImdgProvider imdgProvider;
-
- public DBFExportService(@Qualifier("executor") ThreadPoolTaskExecutor executor,
- @Qualifier("processor") Processor processor,
- ImdgProvider imdgProvider) {
- this.executor = executor;
- this.processor = processor;
- this.imdgProvider = imdgProvider;
- log.debug("Check IMDG...");
- imdgProvider.waitAvailable();
- log.debug("IMDG ready...");
- }
-
- public void run() {
- log.debug("Do export for all: {}", Arrays.toString(Table.values()));
- for (Table tableForExport : Table.values()) {
- executor.submit(() -> processor.process(ResultContainer.createNewTask(tableForExport)));
- }
- }
-
-}
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/DFConverter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/DFConverter.java
index 34ade61a5..c8c15f2ad 100644
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/DFConverter.java
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/DFConverter.java
@@ -3,6 +3,7 @@ package ru.spcex.clearing.dbf.exporter.services.converters;
import com.linuxense.javadbf.DBFField;
import ru.spcex.platform.classes.base.SpcexObjectBase;
+import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
@@ -25,4 +26,14 @@ public abstract class DFConverter {
if (src instanceof LocalTime srcLocalTime) return Time.valueOf(srcLocalTime);
return src;
}
+
+ protected Long convertStrToLong(String s) {
+ if (s == null) return null;
+ return Long.valueOf(s);
+ }
+
+ protected BigDecimal convertStrToBigDecimal(String s) {
+ if (s == null) return null;
+ return new BigDecimal(s).setScale(0);
+ }
}
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF02_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF02_Converter.java
index b5c99f71e..5626235e0 100644
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF02_Converter.java
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF02_Converter.java
@@ -43,7 +43,7 @@ public class S_DF02_Converter extends DFConverter {
dbfFields.add(new DBFField("ACC_TYPE", DBFDataType.CHARACTER, 2));
dbfFields.add(new DBFField("SUMENGAGE", DBFDataType.CHARACTER, 22));
dbfFields.add(new DBFField("SUMUNBLOCK", DBFDataType.CHARACTER, 22));
- dbfFields.add(new DBFField("FILE_TYPE", DBFDataType.CHARACTER, 22));
+ dbfFields.add(new DBFField("FILE_TYPE", DBFDataType.CHARACTER, 1));
dbfFields.add(new DBFField("RESULT", DBFDataType.CHARACTER, 3));
return dbfFields.toArray(DBFField[]::new);
}
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF03_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF03_Converter.java
index 9505abaf5..6eedff436 100644
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF03_Converter.java
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF03_Converter.java
@@ -17,15 +17,12 @@ public class S_DF03_Converter extends DFConverter {
values.add(typeMatch(entity.getDoc_type()));
values.add(typeMatch(entity.getDocnm_ref()));
values.add(typeMatch(entity.getDocnmprev()));
-// values.add(typeMatch(entity.getPriority()));
-// values.add(typeMatch(entity.getSbankcode()));
values.add(typeMatch(entity.getC_acc_deb()));
values.add(typeMatch(entity.getSbanknam1()));
values.add(typeMatch(entity.getSbanknam2()));
values.add(typeMatch(entity.getSbanknam3()));
values.add(typeMatch(entity.getSbanknam4()));
values.add(typeMatch(entity.getSbanknam5()));
-// values.add(typeMatch(entity.getRbankcode()));
values.add(typeMatch(entity.getC_acc_cred()));
values.add(typeMatch(entity.getRbanknam1()));
values.add(typeMatch(entity.getRbanknam2()));
@@ -33,31 +30,9 @@ public class S_DF03_Converter extends DFConverter {
values.add(typeMatch(entity.getRbanknam4()));
values.add(typeMatch(entity.getRbanknam5()));
values.add(typeMatch(entity.getPay_date()));
-// values.add(typeMatch(entity.getExt_date()));
values.add(typeMatch(entity.getPay_val()));
values.add(typeMatch(entity.getSum_deb()));
-// values.add(typeMatch(entity.getSclientn1()));
-// values.add(typeMatch(entity.getSclientn2()));
-// values.add(typeMatch(entity.getSclientn3()));
-// values.add(typeMatch(entity.getSclientn4()));
-// values.add(typeMatch(entity.getSc_code()));
-// values.add(typeMatch(entity.getAcc_deb()));
-// values.add(typeMatch(entity.getRclientn1()));
-// values.add(typeMatch(entity.getRclientn2()));
-// values.add(typeMatch(entity.getRclientn3()));
-// values.add(typeMatch(entity.getRclientn4()));
-// values.add(typeMatch(entity.getAcc_kr_1()));
-// values.add(typeMatch(entity.getAcc_kr_2()));
-// values.add(typeMatch(entity.getSp_code()));
values.add(typeMatch(entity.getSpecif_1()));
-// values.add(typeMatch(entity.getSpecif_2()));
-// values.add(typeMatch(entity.getSpecif_3()));
-// values.add(typeMatch(entity.getSpecif_4()));
-// values.add(typeMatch(entity.getSpecif_5()));
-// values.add(typeMatch(entity.getSpecif_6()));
-// values.add(typeMatch(entity.getSend_type()));
-// values.add(typeMatch(entity.getServdate()));
-// values.add(typeMatch(entity.getDoc_result()));
values.add(typeMatch(entity.getImp_result()));
return values.toArray(Object[]::new);
}
@@ -69,15 +44,12 @@ public class S_DF03_Converter extends DFConverter {
dbfFields.add(new DBFField("DOC_TYPE", DBFDataType.CHARACTER, 4));
dbfFields.add(new DBFField("DOCNM_REF", DBFDataType.CHARACTER, 16));
dbfFields.add(new DBFField("DOCNMPREV", DBFDataType.CHARACTER, 16));
- dbfFields.add(new DBFField("PRIORITY", DBFDataType.CHARACTER, 1));
- dbfFields.add(new DBFField("SBANKCODE", DBFDataType.CHARACTER, 12));
dbfFields.add(new DBFField("C_ACC_DEB", DBFDataType.CHARACTER, 35));
dbfFields.add(new DBFField("SBANKNAM1", DBFDataType.CHARACTER, 35));
dbfFields.add(new DBFField("SBANKNAM2", DBFDataType.CHARACTER, 35));
dbfFields.add(new DBFField("SBANKNAM3", DBFDataType.CHARACTER, 35));
dbfFields.add(new DBFField("SBANKNAM4", DBFDataType.CHARACTER, 35));
dbfFields.add(new DBFField("SBANKNAM5", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("RBANKCODE", DBFDataType.CHARACTER, 12));
dbfFields.add(new DBFField("C_ACC_CRED", DBFDataType.CHARACTER, 35));
dbfFields.add(new DBFField("RBANKNAM1", DBFDataType.CHARACTER, 35));
dbfFields.add(new DBFField("RBANKNAM2", DBFDataType.CHARACTER, 35));
@@ -85,31 +57,9 @@ public class S_DF03_Converter extends DFConverter {
dbfFields.add(new DBFField("RBANKNAM4", DBFDataType.CHARACTER, 35));
dbfFields.add(new DBFField("RBANKNAM5", DBFDataType.CHARACTER, 35));
dbfFields.add(new DBFField("PAY_DATE", DBFDataType.CHARACTER, 8));
- dbfFields.add(new DBFField("EXT_DATE", DBFDataType.CHARACTER, 8));
dbfFields.add(new DBFField("PAY_VAL", DBFDataType.CHARACTER, 12));
dbfFields.add(new DBFField("SUM_DEB", DBFDataType.CHARACTER, 22));
- dbfFields.add(new DBFField("SCLIENTN1", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("SCLIENTN2", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("SCLIENTN3", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("SCLIENTN4", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("SC_CODE", DBFDataType.CHARACTER, 12));
- dbfFields.add(new DBFField("ACC_DEB", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("RCLIENTN1", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("RCLIENTN2", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("RCLIENTN3", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("RCLIENTN4", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("ACC_KR_1", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("ACC_KR_2", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("SP_CODE", DBFDataType.CHARACTER, 2));
- dbfFields.add(new DBFField("SPECIF_1", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("SPECIF_2", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("SPECIF_3", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("SPECIF_4", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("SPECIF_5", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("SPECIF_6", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("SEND_TYPE", DBFDataType.CHARACTER, 10));
- dbfFields.add(new DBFField("SERVDATE", DBFDataType.CHARACTER, 8));
- dbfFields.add(new DBFField("DOC_RESULT", DBFDataType.CHARACTER, 2));
+ dbfFields.add(new DBFField("SPECIF_1", DBFDataType.CHARACTER, 254));
dbfFields.add(new DBFField("IMP_RESULT", DBFDataType.CHARACTER, 3));
return dbfFields.toArray(DBFField[]::new);
}
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF05_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF05_Converter.java
new file mode 100644
index 000000000..74922f6df
--- /dev/null
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF05_Converter.java
@@ -0,0 +1,35 @@
+package ru.spcex.clearing.dbf.exporter.services.converters;
+
+import com.linuxense.javadbf.DBFDataType;
+import com.linuxense.javadbf.DBFField;
+import org.springframework.stereotype.Service;
+import ru.clearing.classes.statics.data.sdf.SDf05;
+
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+@Service
+public class S_DF05_Converter extends DFConverter {
+ @Override
+ public Object[] toObjectArray(SDf05 entity) {
+ List