From 181291c42e8c2a80ed40146ee742c64ca424ab12 Mon Sep 17 00:00:00 2001 From: psemenkov Date: Fri, 19 May 2023 16:08:23 +0300 Subject: [PATCH] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-313=20?= =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=B1=D0=BA=D0=B8,=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D1=83?= =?UTF-8?q?=20=D0=BF=D0=BE=20sFTP.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clearing-parent/dbf-exporter/pom.xml | 23 +++++ .../exporter/config/DBFExporterConfig.java | 71 -------------- .../dbf/exporter/config/ImdgConfig.java | 63 ++++++++++++ .../exporter/config/KafkaSenderConfig.java | 34 ++++--- .../dbf/exporter/config/PipelineConfig.java | 26 +++++ .../dbf/exporter/config/SFTPConfig.java | 95 ++++++++++++++++++ .../dbf/exporter/config/settings/Store.java | 45 +++++++++ .../logic/data/enums/FilenameTemplate.java | 46 +++++---- .../logic/stages/ExportFromHazelcast.java | 8 +- .../dbf/exporter/logic/stages/Journal.java | 18 +++- .../exporter/logic/stages/PrepareDBFFile.java | 20 ++-- .../services/converters/S_DF03_Converter.java | 54 +---------- .../services/converters/S_DF05_Converter.java | 2 +- .../services/converters/S_DF07_Converter.java | 12 +-- .../services/converters/S_DF53_Converter.java | 4 - .../services/converters/S_DF54_Converter.java | 2 +- .../services/converters/S_DF56_Converter.java | 4 +- .../src/main/resources/application.properties | 7 +- .../dbf/exporter/AbstractServiceTest.java | 73 ++++++++++++++ .../config/ExportDBFServiceSettingsTest.java | 24 +++++ .../dbf/exporter/config/SFTPTestConfig.java | 31 ++++++ .../dbf/exporter/services/S_DF02_Test.java | 69 +++++++++++++ .../dbf/exporter/services/S_DF03_Test.java | 77 +++++++++++++++ .../dbf/exporter/services/S_DF05_Test.java | 63 ++++++++++++ .../dbf/exporter/services/S_DF07_Test.java | 68 +++++++++++++ .../dbf/exporter/services/S_DF51_Test.java | 58 +++++++++++ .../dbf/exporter/services/S_DF53_Test.java | 61 ++++++++++++ .../dbf/exporter/services/S_DF54_Test.java | 96 +++++++++++++++++++ .../dbf/exporter/services/S_DF56_Test.java | 61 ++++++++++++ .../lim/exporter/AbstractServiceTest.java | 20 +--- 30 files changed, 1027 insertions(+), 208 deletions(-) create mode 100644 clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/ImdgConfig.java create mode 100644 clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/PipelineConfig.java create mode 100644 clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/SFTPConfig.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/AbstractServiceTest.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/config/ExportDBFServiceSettingsTest.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/config/SFTPTestConfig.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF02_Test.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF03_Test.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF05_Test.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF07_Test.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF51_Test.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF53_Test.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF54_Test.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF56_Test.java 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 baseRequestResult = (BaseRequest) captor.getValue().value(); + JournalSdf journalSdf = (JournalSdf) baseRequestResult.getRequestPayload(); + assertEquals(generationId, journalSdf.getRegistrationNumber()); + } +} \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF03_Test.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF03_Test.java new file mode 100644 index 000000000..02185e4a9 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF03_Test.java @@ -0,0 +1,77 @@ +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.SDf03; +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_DF03_Test extends AbstractServiceTest { + + @PostConstruct + public void init() { + super.init(); + } + + /** + * Тест проверяет создание строк документа DBF .
+ */ + @Test + void cdeateSdf() { + Table table = Table.S_DF03; + Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), SDf03.class); + SDf03 sDf03 = new SDf03(); + sDf03.setGenerationId(generationId); + sDf03.setSeg_type("seg_type"); + sDf03.setDoc_type("doc_type"); + sDf03.setDocnm_ref("docnm_ref"); + sDf03.setDocnmprev("docnmprev"); + sDf03.setC_acc_deb("c_acc_deb"); + sDf03.setSbanknam1("sbanknam1"); + sDf03.setSbanknam2("sbanknam2"); + sDf03.setSbanknam3("sbanknam3"); + sDf03.setSbanknam4("sbanknam4"); + sDf03.setSbanknam5("sbanknam5"); + sDf03.setC_acc_cred("c_acc_cred"); + sDf03.setRbanknam1("rbanknam1"); + sDf03.setRbanknam2("rbanknam2"); + sDf03.setRbanknam3("rbanknam3"); + sDf03.setRbanknam4("rbanknam4"); + sDf03.setRbanknam5("rbanknam5"); + sDf03.setPay_date("pay_date"); + sDf03.setPay_val("pay_val"); + sDf03.setSum_deb("sum_deb"); + sDf03.setSpecif_1("specif_1"); + sDf03.setImp_result("imp_result"); + map.insert(sDf03); + SdfClearingRequest sdfClearingRequest = new SdfClearingRequest(); + sdfClearingRequest.setGroupId(generationId); + String request = getJsonStringForNew(sdfClearingRequest, generationId); + addRecordToKafka((MockConsumer) commandService.getConsumer(), Consts.SDF03_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 baseRequestResult = (BaseRequest) captor.getValue().value(); + JournalSdf journalSdf = (JournalSdf) baseRequestResult.getRequestPayload(); + assertEquals(generationId, journalSdf.getRegistrationNumber()); + } +} \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF05_Test.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF05_Test.java new file mode 100644 index 000000000..6f305c0ba --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF05_Test.java @@ -0,0 +1,63 @@ +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.SDf05; +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 java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalTime; + +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_DF05_Test extends AbstractServiceTest { + + @PostConstruct + public void init() { + super.init(); + } + + /** + * Тест проверяет создание строк документа DBF .
+ */ + @Test + void cdeateSdf() { + Table table = Table.S_DF05; + Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), SDf05.class); + SDf05 sDf05 = new SDf05(); + sDf05.setGenerationId(generationId); + sDf05.setTp(new BigDecimal(32)); + sDf05.setDt(LocalDate.now()); + sDf05.setTm(LocalTime.now()); + sDf05.setPr("deal"); + map.insert(sDf05); + SdfClearingRequest sdfClearingRequest = new SdfClearingRequest(); + sdfClearingRequest.setGroupId(generationId); + String request = getJsonStringForNew(sdfClearingRequest, generationId); + addRecordToKafka((MockConsumer) commandService.getConsumer(), Consts.SDF05_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 baseRequestResult = (BaseRequest) captor.getValue().value(); + JournalSdf journalSdf = (JournalSdf) baseRequestResult.getRequestPayload(); + assertEquals(generationId, journalSdf.getRegistrationNumber()); + } +} \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF07_Test.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF07_Test.java new file mode 100644 index 000000000..80ccdbb32 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF07_Test.java @@ -0,0 +1,68 @@ +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.SDf07; +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 java.math.BigDecimal; + +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_DF07_Test extends AbstractServiceTest { + + @PostConstruct + public void init() { + super.init(); + } + + /** + * Тест проверяет создание строк документа DBF .
+ */ + @Test + void cdeateSdf() { + Table table = Table.S_DF07; + Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), SDf07.class); + SDf07 sDf07 = new SDf07(); + sDf07.setGenerationId(generationId); + sDf07.setAccount("curr_code"); + sDf07.setSum(new BigDecimal(32)); + sDf07.setMarket("remainder"); + sDf07.setType("deal"); + sDf07.setDeal("acc_code"); + sDf07.setClientN("dat"); + sDf07.setInn(new BigDecimal(2435)); + sDf07.setBic(new BigDecimal(2435)); + sDf07.setSpec("acc_type"); + sDf07.setNumber(new BigDecimal(2435)); + sDf07.setResult(new BigDecimal(2435)); + map.insert(sDf07); + SdfClearingRequest sdfClearingRequest = new SdfClearingRequest(); + sdfClearingRequest.setGroupId(generationId); + String request = getJsonStringForNew(sdfClearingRequest, generationId); + addRecordToKafka((MockConsumer) commandService.getConsumer(), Consts.SDF07_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 baseRequestResult = (BaseRequest) captor.getValue().value(); + JournalSdf journalSdf = (JournalSdf) baseRequestResult.getRequestPayload(); + assertEquals(generationId, journalSdf.getRegistrationNumber()); + } +} \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF51_Test.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF51_Test.java new file mode 100644 index 000000000..ac4aa9048 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF51_Test.java @@ -0,0 +1,58 @@ +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.SDf51; +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_DF51_Test extends AbstractServiceTest { + + @PostConstruct + public void init() { + super.init(); + } + + /** + * Тест проверяет создание строк документа DBF .
+ */ + @Test + void cdeateSdf() { + Table table = Table.S_DF51; + Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), SDf51.class); + SDf51 sDf51 = new SDf51(); + sDf51.setGenerationId(generationId); + sDf51.setNumber("curr_code"); + sDf51.setDatetime("245367"); + map.insert(sDf51); + SdfClearingRequest sdfClearingRequest = new SdfClearingRequest(); + sdfClearingRequest.setGroupId(generationId); + String request = getJsonStringForNew(sdfClearingRequest, generationId); + addRecordToKafka((MockConsumer) commandService.getConsumer(), Consts.SDF51_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 baseRequestResult = (BaseRequest) captor.getValue().value(); + JournalSdf journalSdf = (JournalSdf) baseRequestResult.getRequestPayload(); + assertEquals(generationId, journalSdf.getRegistrationNumber()); + } +} \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF53_Test.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF53_Test.java new file mode 100644 index 000000000..03fac5a52 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF53_Test.java @@ -0,0 +1,61 @@ +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.SDf53; +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 java.math.BigDecimal; + +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_DF53_Test extends AbstractServiceTest { + + @PostConstruct + public void init() { + super.init(); + } + + /** + * Тест проверяет создание строк документа DBF .
+ */ + @Test + void cdeateSdf() { + Table table = Table.S_DF53; + Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), SDf53.class); + SDf53 sDf53 = new SDf53(); + sDf53.setGenerationId(generationId); + sDf53.setAccount("curr_code"); + sDf53.setDeal("245367"); + sDf53.setStatus(12345L); + sDf53.setResult(new BigDecimal(2345)); + map.insert(sDf53); + SdfClearingRequest sdfClearingRequest = new SdfClearingRequest(); + sdfClearingRequest.setGroupId(generationId); + String request = getJsonStringForNew(sdfClearingRequest, generationId); + addRecordToKafka((MockConsumer) commandService.getConsumer(), Consts.SDF53_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 baseRequestResult = (BaseRequest) captor.getValue().value(); + JournalSdf journalSdf = (JournalSdf) baseRequestResult.getRequestPayload(); + assertEquals(generationId, journalSdf.getRegistrationNumber()); + } +} \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF54_Test.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF54_Test.java new file mode 100644 index 000000000..0491a8c0d --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF54_Test.java @@ -0,0 +1,96 @@ +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.SDf54; +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_DF54_Test extends AbstractServiceTest { + + @PostConstruct + public void init() { + super.init(); + } + + /** + * Тест проверяет создание строк документа DBF .
+ */ + @Test + void cdeateSdf() { + Table table = Table.S_DF54; + Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), SDf54.class); + SDf54 sDf54 = new SDf54(); + sDf54.setGenerationId(generationId); + sDf54.setSeg_type("seg_type"); + sDf54.setDoc_type("doc_type"); + sDf54.setDocnm_ref("docnm_ref"); + sDf54.setDocnmprev("docnmprev"); + sDf54.setSbankcode("sbankcode"); + sDf54.setC_acc_deb("c_acc_deb"); + sDf54.setSbanknam1("sbanknam1"); + sDf54.setSbanknam2("sbanknam2"); + sDf54.setSbanknam3("sbanknam3"); + sDf54.setSbanknam4("sbanknam4"); + sDf54.setSbanknam5("sbanknam5"); + sDf54.setRbankcode("rbankcode"); + sDf54.setC_acc_cred("c_acc_cred"); + sDf54.setRbanknam1("rbanknam1"); + sDf54.setRbanknam2("rbanknam2"); + sDf54.setRbanknam3("rbanknam3"); + sDf54.setRbanknam4("rbanknam4"); + sDf54.setRbanknam5("rbanknam5"); + sDf54.setOp_type("op_type"); + sDf54.setOp_order("op_order"); + sDf54.setPay_date("pay_date"); + sDf54.setPay_val("pay_val"); + sDf54.setSum_deb("sum_deb"); + sDf54.setSclientn1("sclientn1"); + sDf54.setSclientn2("sclientn2"); + sDf54.setSclientn3("sclientn3"); + sDf54.setSclientn4("sclientn4"); + sDf54.setInn_deb("inn_deb"); + sDf54.setKpp_deb("kpp_deb"); + sDf54.setAcc_deb("acc_deb"); + sDf54.setRclientn1("rclientn1"); + sDf54.setRclientn2("rclientn2"); + sDf54.setRclientn3("rclientn3"); + sDf54.setRclientn4("rclientn4"); + sDf54.setInn_cred("inn_cred"); + sDf54.setKpp_cred("kpp_cred"); + sDf54.setAcc_kr_1("acc_kr_1"); + sDf54.setSpecif_1("specif_1"); + sDf54.setSend_type("send_type"); + sDf54.setDoc_result("doc_result"); + map.insert(sDf54); + SdfClearingRequest sdfClearingRequest = new SdfClearingRequest(); + sdfClearingRequest.setGroupId(generationId); + String request = getJsonStringForNew(sdfClearingRequest, generationId); + addRecordToKafka((MockConsumer) commandService.getConsumer(), Consts.SDF54_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 baseRequestResult = (BaseRequest) captor.getValue().value(); + JournalSdf journalSdf = (JournalSdf) baseRequestResult.getRequestPayload(); + assertEquals(generationId, journalSdf.getRegistrationNumber()); + } +} \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF56_Test.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF56_Test.java new file mode 100644 index 000000000..4e7beff0d --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF56_Test.java @@ -0,0 +1,61 @@ +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.SDf56; +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_DF56_Test extends AbstractServiceTest { + + @PostConstruct + public void init() { + super.init(); + } + + /** + * Тест проверяет создание строк документа DBF .
+ */ + @Test + void cdeateSdf() { + Table table = Table.S_DF56; + Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), SDf56.class); + SDf56 sDf56 = new SDf56(); + sDf56.setGenerationId(generationId); + sDf56.setNumber("seg_type"); + sDf56.setStart_datetime("23456"); + sDf56.setEnd_datetime("345678"); + sDf56.setAccount("docnmprev"); + sDf56.setDeal("sbankcode"); + map.insert(sDf56); + SdfClearingRequest sdfClearingRequest = new SdfClearingRequest(); + sdfClearingRequest.setGroupId(generationId); + String request = getJsonStringForNew(sdfClearingRequest, generationId); + addRecordToKafka((MockConsumer) commandService.getConsumer(), Consts.SDF56_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 baseRequestResult = (BaseRequest) captor.getValue().value(); + JournalSdf journalSdf = (JournalSdf) baseRequestResult.getRequestPayload(); + assertEquals(generationId, journalSdf.getRegistrationNumber()); + } +} \ No newline at end of file diff --git a/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/AbstractServiceTest.java b/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/AbstractServiceTest.java index d216e40dd..103207f84 100644 --- a/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/AbstractServiceTest.java +++ b/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/AbstractServiceTest.java @@ -1,19 +1,14 @@ package ru.spcex.clearing.lim.exporter; -import org.apache.kafka.clients.producer.MockProducer; -import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.Producer; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.test.TestUtils; import ru.spcex.clearing.test.config.ImdgTestConfig; import ru.spcex.clearing.test.config.KafkaTestConfig; import ru.spcex.platform.imdg.api.Imdg; @@ -21,8 +16,6 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import java.time.LocalDate; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; import static ru.spcex.clearing.test.config.ImdgTestConfig.currentID; import static ru.spcex.clearing.test.config.ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId; @@ -40,10 +33,10 @@ public abstract class AbstractServiceTest { protected Long securityIdFirst = 12L; protected Long securityIdSecond = 23L; - @Captor - protected ArgumentCaptor producerRecord; - @MockBean - protected MockProducer mockProducer; + @Autowired + @Qualifier("mockProducer") + protected Producer mockProducer; + @Autowired @Qualifier("hazelcastServiceTest") protected ImdgProvider imdgProvider; @@ -52,8 +45,5 @@ public abstract class AbstractServiceTest { waitAvailableImdgProviderAndAddAdminWithDefaultId(); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); - - TestUtils.FutureRecordMetadata future = spy(new TestUtils.FutureRecordMetadata()); - doReturn(future).when(mockProducer).send(producerRecord.capture()); } }