diff --git a/clearing-parent/dbf-exporter/pom.xml b/clearing-parent/dbf-exporter/pom.xml
index 249e0f012..12f8fbc23 100644
--- a/clearing-parent/dbf-exporter/pom.xml
+++ b/clearing-parent/dbf-exporter/pom.xml
@@ -25,6 +25,14 @@
org.springframework.boot
spring-boot-autoconfigure
+
+ org.springframework.integration
+ spring-integration-sftp
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
@@ -45,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 183e5148c..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,82 +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.Journal;
-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));
- pipeline.add(context.getBean(Journal.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 04b8b3431..687b73447 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 {
@@ -48,22 +50,18 @@ public class KafkaSenderConfig {
}
// @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;
- }
- ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator();
- return KafkaSender
- .setup()
- .setKafkaTemplate(kafkaTemplate)
- .idGenerator(imdgIdGenerator::nextId)
- .imdgProvider(s -> {
- Imdg imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class);
- return imdg::insert;
- })
- .build();
- }
+@Bean
+public Supplier kafkaSenderSupplier(KafkaTemplate kafkaTemplate,
+ ImdgProvider imdgProvider) {
+ ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator();
+ return () -> KafkaSender
+ .setup()
+ .setKafkaTemplate(kafkaTemplate)
+ .idGenerator(imdgIdGenerator::nextId)
+ .imdgProvider(s -> {
+ Imdg imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class);
+ return imdg::insert;
+ })
+ .build();
+}
}
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/logic/data/enums/FilenameTemplate.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java
index 457c83e7d..03327e824 100644
--- 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
@@ -1,12 +1,13 @@
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 java.util.Objects;
import static ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile.SECTION;
import static ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile.outDir;
@@ -14,7 +15,7 @@ import static ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile.outDir;
public enum FilenameTemplate {
df_section_dateTime {
@Override
- public String getFileName(ResultContainer resultContainer) {
+ public String getFileName(ResultContainer resultContainer, List files) {
return appendSection(resultContainer)
.append(dateTime(resultContainer))
.append(".DBF").toString();
@@ -22,19 +23,19 @@ public enum FilenameTemplate {
},
df_section_dateTime_counter {
@Override
- public String getFileName(ResultContainer resultContainer) {
+ public String getFileName(ResultContainer resultContainer, List files) {
return appendSection(resultContainer)
.append(dateTime(resultContainer))
- .append(counter(resultContainer))
+ .append(counter(resultContainer, files))
.append(".DBF").toString();
}
},
df_section_dateTime_counter_mamberCode {
@Override
- public String getFileName(ResultContainer resultContainer) {
+ public String getFileName(ResultContainer resultContainer, List files) {
return appendSection(resultContainer)
.append(dateTime(resultContainer))
- .append(counter(resultContainer))
+ .append(counter(resultContainer, files))
.append(mamberCode(resultContainer))
.append(".DBF").toString();
}
@@ -58,10 +59,10 @@ public enum FilenameTemplate {
return result;
}
- protected StringBuilder counter(ResultContainer resultContainer) {
+ protected StringBuilder counter(ResultContainer resultContainer, List files) {
StringBuilder result = new StringBuilder();
result.append('_');
- result.append(countSameFilesInDir(resultContainer.getTableForExport().getFilePrefix(), outDir) + 1);
+ result.append(countSameFilesInDir(resultContainer.getTableForExport().getFilePrefix(), files) + 1);
return result;
}
@@ -72,25 +73,22 @@ public enum FilenameTemplate {
return result;
}
- protected Integer countSameFilesInDir(String prefixOfTable, String outDir) {
+ protected Integer countSameFilesInDir(String prefixOfTable, List files) {
int res = 0;
- File directory = new File(outDir);
String timestampNow = utilFormatter.format(LocalDateTime.now());
- 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];
+ for (SftpFileInfo file : files) {
+ String name = file.getFilename();
+ String[] splitName = name.split("_");
+ String prefix = splitName[0];
+ String timestamp = splitName[2];
- 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));
+ 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;
@@ -99,7 +97,7 @@ public enum FilenameTemplate {
private static final DateTimeFormatter tsFormatter = DateTimeFormatter.ofPattern("yyMMddHHmm");
private static final DateTimeFormatter utilFormatter = DateTimeFormatter.ofPattern("yyMMdd");
- public String getFileName(ResultContainer resultContainer) {
+ 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/stages/ExportFromHazelcast.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java
index b9c819c40..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,6 +30,7 @@ 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;
@@ -44,7 +45,8 @@ public class ExportFromHazelcast extends Stage implements InitializingBean {
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_DF07_Converter s_df07_converter,
@@ -55,6 +57,7 @@ public class ExportFromHazelcast extends Stage implements InitializingBean {
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_df07_converter = s_df07_converter;
@@ -100,6 +103,7 @@ public class ExportFromHazelcast extends Stage implements InitializingBean {
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();
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 025a1819f..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,18 +11,22 @@ 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.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
- public Journal(KafkaSender kafkaSender) {
+ public Journal(Supplier kafkaSender) {
this.kafkaSender = kafkaSender;
}
@@ -45,7 +49,15 @@ public class Journal extends Stage implements InitializingBean {
journalSdf.setDocumentName(documentNames.get(resultContainer.getTableForExport()));
journalSdf.setDossierNumber(dossierNumber.get(resultContainer.getTableForExport()));
journalSdf.setResultStatus(StageResult.ERROR.equals(resultContainer.getLastStageResult()) ? "NACK" : "ACK");
- kafkaSender.sendRequestToQueue(EXPORT_COMPLETED, journalSdf);
+ 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;
}
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 f62dca17c..ff8acaed5 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,7 +1,9 @@
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;
@@ -14,6 +16,7 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.time.LocalDateTime;
import java.util.EnumMap;
+import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -22,23 +25,24 @@ import java.util.Objects;
*/
@Component
public class PrepareDBFFile extends Stage implements InitializingBean {
- public static final String SECTION = "U";
- public static final String CODE_OF_MEMBER = null;
+ public static final String SECTION = "S";
private final ExportDBFServiceSettings settings;
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());
Table table = resultContainer.getTableForExport();
LocalDateTime currentDateTime = LocalDateTime.now();
resultContainer.setRegistrationDateTime(currentDateTime);
- File dbfFile = new File(nameTemplates.get(table).getFileName(resultContainer));
+ File dbfFile = new File(nameTemplates.get(table).getFileName(resultContainer, files));
try {
Path dbfFilePath = dbfFile.toPath();
Files.deleteIfExists(dbfFilePath);
@@ -54,7 +58,7 @@ 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.");
@@ -65,8 +69,8 @@ public class PrepareDBFFile extends Stage implements InitializingBean {
private static final Map nameTemplates = new EnumMap<>(Table.class);
static {
- nameTemplates.put(Table.S_DF02, FilenameTemplate.df_section_dateTime);
- nameTemplates.put(Table.S_DF03, FilenameTemplate.df_section_dateTime_counter_mamberCode);
+ 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);
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 854ba7aa0..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("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, 255));
-// 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
index 9b9a7d181..74922f6df 100644
--- 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
@@ -25,7 +25,7 @@ public class S_DF05_Converter extends DFConverter {
public DBFField[] getDBFHeaders() {
List dbfFields = new LinkedList<>();
Date date = new Date();
- dbfFields.add(new DBFField("TP", DBFDataType.NUMERIC, 72, 18));
+ dbfFields.add(new DBFField("TP", DBFDataType.NUMERIC, 32, 18));
dbfFields.add(new DBFField("DT", DBFDataType.DATE));
dbfFields.add(new DBFField("TM", DBFDataType.DATE));
dbfFields.add(new DBFField("PR", DBFDataType.CHARACTER, 1));
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF07_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF07_Converter.java
index aaa5f7f76..241fe6af2 100644
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF07_Converter.java
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF07_Converter.java
@@ -31,16 +31,16 @@ public class S_DF07_Converter extends DFConverter {
public DBFField[] getDBFHeaders() {
List dbfFields = new LinkedList<>();
dbfFields.add(new DBFField("ACCOUNT", DBFDataType.CHARACTER, 20));
- dbfFields.add(new DBFField("SUM", DBFDataType.NUMERIC, 72, 18));
+ dbfFields.add(new DBFField("SUM", DBFDataType.NUMERIC, 32, 18));
dbfFields.add(new DBFField("MARKET", DBFDataType.CHARACTER, 1));
dbfFields.add(new DBFField("TYPE", DBFDataType.CHARACTER, 1));
dbfFields.add(new DBFField("DEAL", DBFDataType.CHARACTER, 10));
dbfFields.add(new DBFField("CLIENT_N", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("_I_N_N", DBFDataType.NUMERIC, 72, 18));
- dbfFields.add(new DBFField("_B_I_C", DBFDataType.NUMERIC, 72, 18));
- dbfFields.add(new DBFField("_S_P_E_C", DBFDataType.CHARACTER, 255));
- dbfFields.add(new DBFField("NUMBER", DBFDataType.NUMERIC, 72, 18));
- dbfFields.add(new DBFField("RESULT", DBFDataType.NUMERIC, 72, 18));
+ dbfFields.add(new DBFField("_I_N_N", DBFDataType.NUMERIC, 32, 18));
+ dbfFields.add(new DBFField("_B_I_C", DBFDataType.NUMERIC, 32, 18));
+ dbfFields.add(new DBFField("_S_P_E_C", DBFDataType.CHARACTER, 254));
+ dbfFields.add(new DBFField("NUMBER", DBFDataType.NUMERIC, 32, 18));
+ dbfFields.add(new DBFField("RESULT", DBFDataType.NUMERIC, 32, 18));
return dbfFields.toArray(DBFField[]::new);
}
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF53_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF53_Converter.java
index e78e4362b..b837cb1f9 100644
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF53_Converter.java
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF53_Converter.java
@@ -17,8 +17,6 @@ public class S_DF53_Converter extends DFConverter {
values.add(typeMatch(entity.getDeal()));
values.add(typeMatch(entity.getStatus()));
values.add(typeMatch(entity.getResult()));
- values.add(typeMatch(entity.getGenerationTime()));
- values.add(typeMatch(entity.getGenerationId()));
return values.toArray(Object[]::new);
}
@@ -29,8 +27,6 @@ public class S_DF53_Converter extends DFConverter {
dbfFields.add(new DBFField("DEAL", DBFDataType.CHARACTER, 4));
dbfFields.add(new DBFField("STATUS", DBFDataType.NUMERIC, 32, 18));
dbfFields.add(new DBFField("RESULT", DBFDataType.NUMERIC, 32, 18));
- dbfFields.add(new DBFField("GEN_TIME", DBFDataType.DATE));
- dbfFields.add(new DBFField("GEN_ID", DBFDataType.NUMERIC));
return dbfFields.toArray(DBFField[]::new);
}
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF54_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF54_Converter.java
index 314a443a3..0b9aff09f 100644
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF54_Converter.java
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF54_Converter.java
@@ -96,7 +96,7 @@ public class S_DF54_Converter extends DFConverter {
dbfFields.add(new DBFField("INN_CRED", DBFDataType.CHARACTER, 12));
dbfFields.add(new DBFField("KPP_CRED", DBFDataType.CHARACTER, 9));
dbfFields.add(new DBFField("ACC_KR1", DBFDataType.CHARACTER, 35));
- dbfFields.add(new DBFField("SPECIF1", DBFDataType.CHARACTER, 255));
+ dbfFields.add(new DBFField("SPECIF1", DBFDataType.CHARACTER, 254));
dbfFields.add(new DBFField("SEND_TYPE", DBFDataType.CHARACTER, 10));
dbfFields.add(new DBFField("DOC_RESULT", DBFDataType.CHARACTER, 2));
return dbfFields.toArray(DBFField[]::new);
diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF56_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF56_Converter.java
index a0bcde368..a3b29c1a0 100644
--- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF56_Converter.java
+++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF56_Converter.java
@@ -25,8 +25,8 @@ public class S_DF56_Converter extends DFConverter {
public DBFField[] getDBFHeaders() {
List dbfFields = new LinkedList<>();
dbfFields.add(new DBFField("NUMBER", DBFDataType.CHARACTER, 10));
- dbfFields.add(new DBFField("START_DATETIME", DBFDataType.NUMERIC, 10));
- dbfFields.add(new DBFField("END_DATETIME", DBFDataType.NUMERIC, 10));
+ dbfFields.add(new DBFField("SDATETIME", DBFDataType.NUMERIC, 10));
+ dbfFields.add(new DBFField("EDATETIME", DBFDataType.NUMERIC, 10));
dbfFields.add(new DBFField("ACCOUNT", DBFDataType.CHARACTER, 25));
dbfFields.add(new DBFField("DEAL", DBFDataType.CHARACTER, 4));
return dbfFields.toArray(DBFField[]::new);
diff --git a/clearing-parent/dbf-exporter/src/main/resources/application.properties b/clearing-parent/dbf-exporter/src/main/resources/application.properties
index 4fd39eab5..4a55bf4fd 100644
--- a/clearing-parent/dbf-exporter/src/main/resources/application.properties
+++ b/clearing-parent/dbf-exporter/src/main/resources/application.properties
@@ -7,7 +7,12 @@ export-dbf-service.hazelcast.password=dev-pass
export-dbf-service.common.encoding=cp866
export-dbf-service.common.threads-count=10
-export-dbf-service.store.out-dir=d:\\trash\\clearing\\exporter\\out\\
+export-dbf-service.store.local-temp-dir=D:\\docs and T3\\clearing\\dbf\\
+export-dbf-service.store.out-dir=DocOut
+export-dbf-service.store.user:tester
+export-dbf-service.store.password=password
+export-dbf-service.store.server-ip=10.230.238.53
+export-dbf-service.store.server-port=2222
export-dbf-service.kafka-consumer.bootstrap-servers=localhost:9092
export-dbf-service.kafka-consumer.group-id=dev-group-balance-service
diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/AbstractServiceTest.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/AbstractServiceTest.java
new file mode 100644
index 000000000..d4e8c0160
--- /dev/null
+++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/AbstractServiceTest.java
@@ -0,0 +1,73 @@
+package ru.spcex.clearing.dbf.exporter;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.kafka.core.KafkaTemplate;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import ru.spcex.clearing.dbf.exporter.config.ExportDBFServiceSettingsTest;
+import ru.spcex.clearing.dbf.exporter.config.PipelineConfig;
+import ru.spcex.clearing.dbf.exporter.config.SFTPTestConfig;
+import ru.spcex.clearing.dbf.exporter.logic.Processor;
+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.services.CommandService;
+import ru.spcex.clearing.dbf.exporter.services.converters.*;
+import ru.spcex.clearing.test.config.ImdgTestConfig;
+import ru.spcex.clearing.test.config.KafkaTestConfig;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import static ru.spcex.clearing.test.config.ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId;
+
+@ExtendWith(SpringExtension.class)
+@ContextConfiguration(classes = {
+ ExportDBFServiceSettingsTest.class,
+ SFTPTestConfig.class,
+ PipelineConfig.class,
+ ExportFromHazelcast.class,
+ Journal.class,
+ PrepareDBFFile.class,
+ Processor.class,
+ CommandService.class,
+ S_DF02_Converter.class,
+ S_DF03_Converter.class,
+ S_DF05_Converter.class,
+ S_DF07_Converter.class,
+ S_DF51_Converter.class,
+ S_DF53_Converter.class,
+ S_DF54_Converter.class,
+ S_DF56_Converter.class,
+ ImdgTestConfig.class,
+ KafkaTestConfig.class})
+public abstract class AbstractServiceTest {
+ protected static final long generationId = 21L;
+
+ @Autowired
+ @Qualifier("kafkaTestTemplate")
+ protected KafkaTemplate kafkaTemplate;
+
+ @Autowired
+ @Qualifier("hazelcastServiceTest")
+ protected ImdgProvider imdgProvider;
+
+ @Autowired
+ protected CommandService commandService;
+
+ @BeforeAll
+ static void setProperty() {
+ Path path = Paths.get("src", "main", "resources");
+ String currentPath = path.toAbsolutePath().toString();
+ System.setProperty("spring.config.location", currentPath);
+// Hazelcast.shutdownAll();
+ }
+
+ protected void init() {
+ waitAvailableImdgProviderAndAddAdminWithDefaultId();
+ }
+}
diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/config/ExportDBFServiceSettingsTest.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/config/ExportDBFServiceSettingsTest.java
new file mode 100644
index 000000000..9d3e7c076
--- /dev/null
+++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/config/ExportDBFServiceSettingsTest.java
@@ -0,0 +1,24 @@
+package ru.spcex.clearing.dbf.exporter.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import ru.spcex.clearing.dbf.exporter.config.settings.Common;
+import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings;
+import ru.spcex.clearing.dbf.exporter.config.settings.Store;
+
+@Configuration
+public class ExportDBFServiceSettingsTest {
+
+ @Bean
+ public ExportDBFServiceSettings settings(){
+ ExportDBFServiceSettings settings = new ExportDBFServiceSettings();
+ Common common = new Common();
+ common.setEncoding("cp866");
+ settings.setCommon(common);
+ Store store = new Store();
+ store.setOutDir("DocOut");
+ store.setLocalTempDir("D:\\docs and T3\\clearing\\dbf");
+ settings.setStore(store);
+ return settings;
+ }
+}
diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/config/SFTPTestConfig.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/config/SFTPTestConfig.java
new file mode 100644
index 000000000..5692a838a
--- /dev/null
+++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/config/SFTPTestConfig.java
@@ -0,0 +1,31 @@
+package ru.spcex.clearing.dbf.exporter.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.integration.sftp.session.SftpFileInfo;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+@Configuration
+public class SFTPTestConfig {
+ @Bean
+ public SFTPConfig.DbfGateway dbfGateway(){
+ return new DGateway();
+ }
+
+ public static class DGateway implements SFTPConfig.DbfGateway{
+
+ @Override
+ public void sendToSftp(File file) {
+
+ }
+
+ @Override
+ public List listFiles(String dir) {
+ return new ArrayList<>();
+ }
+ }
+
+}
diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF02_Test.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF02_Test.java
new file mode 100644
index 000000000..65ce96a4c
--- /dev/null
+++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF02_Test.java
@@ -0,0 +1,69 @@
+package ru.spcex.clearing.dbf.exporter.services;
+
+import org.apache.kafka.clients.consumer.MockConsumer;
+import org.apache.kafka.clients.producer.ProducerRecord;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import ru.clearing.classes.statics.data.sdf.SDf02;
+import ru.spcex.clearing.dbf.exporter.AbstractServiceTest;
+import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table;
+import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
+import ru.spcex.clearing.platform.messaging.domain.Consts;
+import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SdfClearingRequest;
+import ru.spcex.clearing.platform.messaging.domain.cud.system.JournalSdf;
+import ru.spcex.platform.imdg.api.Imdg;
+
+import javax.annotation.PostConstruct;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
+import static ru.spcex.clearing.test.TestUtils.addRecordToKafka;
+import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew;
+import static ru.spcex.clearing.test.config.KafkaTestConfig.getCaptor;
+
+class S_DF02_Test extends AbstractServiceTest {
+
+ @PostConstruct
+ public void init() {
+ super.init();
+ }
+
+ /**
+ * Тест проверяет создание строк документа DBF .
+ */
+ @Test
+ void cdeateSdf() {
+ Table table = Table.S_DF02;
+ Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), SDf02.class);
+ SDf02 sDf02 = new SDf02();
+ sDf02.setGenerationId(generationId);
+ sDf02.setCurr_code("curr_code");
+ sDf02.setAccount("account");
+ sDf02.setRemainder("remainder");
+ sDf02.setDeal("deal");
+ sDf02.setAcc_code("acc_code");
+ sDf02.setDat("dat");
+ sDf02.setMarket("market");
+ sDf02.setAcc_name("acc_name");
+ sDf02.setAcc_type("acc_type");
+ sDf02.setSumengage("sumengage");
+ sDf02.setSumunblock("sumunblock");
+ sDf02.setFile_type("file_type");
+ sDf02.setResult("result");
+ map.insert(sDf02);
+ SdfClearingRequest sdfClearingRequest = new SdfClearingRequest();
+ sdfClearingRequest.setGroupId(generationId);
+ String request = getJsonStringForNew(sdfClearingRequest, generationId);
+ addRecordToKafka((MockConsumer) commandService.getConsumer(), Consts.SDF02_PROCESS, 0, 0, request);
+
+ //waiting for kafka send message (finale event)
+ ArgumentCaptor captor = getCaptor(kafkaTemplate);
+ verify(kafkaTemplate, timeout(30_000L).times(1))
+ .send(captor.capture());
+
+ BaseRequest