xml-importer added

This commit is contained in:
Ivan Nikolaev-Axenov 2024-05-24 18:04:22 +03:00
parent 11684bf923
commit b958dd0e5c
34 changed files with 3710 additions and 0 deletions

View file

@ -43,6 +43,7 @@
<module>swt-importer</module>
<module>gateway-api</module>
<module>imdg-hist</module>
<module>xml-importer</module>
</modules>
<properties>

View file

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>xml-importer</artifactId>
<name>xml-importer</name>
<description>XML loader for XML files</description>
<version>SPCEX-3.11.0.0</version>
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-3.11.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-sftp</artifactId>
</dependency>
<!-- JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<!-- XML files -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.woodstox</groupId>
<artifactId>woodstox-core</artifactId>
<version>6.6.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-imdg-api</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-imdg-api-hazelcast-impl</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-messaging</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-enum</artifactId>
</dependency>
<!-- special logging -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.0.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- TEST -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>application.properties</exclude>
</excludes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>

View file

@ -0,0 +1,18 @@
package ru.spcex.clearing.xml.importer;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
@SpringBootApplication
public class XMLImporterApplication {
public static void main(String[] args) {
try {
SpringApplicationBuilder builder = new SpringApplicationBuilder(XMLImporterApplication.class);
builder.run(args);
} catch (Exception e) {
LoggerFactory.getLogger(XMLImporterApplication.class).error("XML-Loader start failed: {} -> {}", e.getClass().getSimpleName(), e.getMessage());
System.exit(-1);
}
}
}

View file

@ -0,0 +1,45 @@
package ru.spcex.clearing.xml.importer.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import ru.spcex.clearing.xml.importer.config.settings.ImportXMLServiceSettings;
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
@Configuration
public class ImporterImdgConfig {
private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) {
ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
if (maxPoolSz > 2) {
pool.setKeepAliveSeconds(60);
pool.setAllowCoreThreadTimeOut(true);
}
pool.setCorePoolSize(maxPoolSz);
pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion);
return pool;
}
@Bean(name = "taskExecutorHazelcastClientInitializer")
public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() {
return createThreadPoolTaskExecutor(1, true);
}
@Bean(name = "taskExecutorIdGeneratorAwaiter")
public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() {
return createThreadPoolTaskExecutor(1, false);
}
@Autowired
@Bean
public HazelcastService imdgProvider(
@Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer,
@Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter,
ImportXMLServiceSettings settings
) {
return new HazelcastService(taskExecutorHazelcastClientInitializer,
taskExecutorIdGeneratorAwaiter,
settings.getHazelcast());
}
}

View file

@ -0,0 +1,58 @@
package ru.spcex.clearing.xml.importer.config;
import java.util.function.Supplier;
import org.apache.kafka.clients.consumer.Consumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory;
import ru.spcex.clearing.platform.messaging.config.KafkaProducerFactory;
import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings;
import ru.spcex.clearing.platform.messaging.service.RequestInfo;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.xml.importer.config.settings.ImportXMLServiceSettings;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Configuration
public class KafkaConfig {
@Bean
public ProducerFactory<String, Object> pf(ImportXMLServiceSettings settings) {
KafkaProducerSettings kafkaSettings = settings.getKafkaProducer();
return KafkaProducerFactory.producerFactory(kafkaSettings);
}
@Bean("kafkaTemplate")
public KafkaTemplate<String, Object> kafkaTemplate(ProducerFactory<String, Object> pf) {
return new KafkaTemplate<>(pf);
}
@Autowired
@Bean
public Supplier<KafkaSender> kafkaSender(KafkaTemplate<String, Object> kafkaTemplate,
ImdgProvider imdgProvider) {
ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator();
return () -> KafkaSender
.setup()
.setKafkaTemplate(kafkaTemplate)
.idGenerator(imdgIdGenerator::nextId)
.imdgProvider(s -> {
Imdg<RequestInfo> imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class);
return imdg::insert;
})
.build();
}
@Autowired
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Bean
public Consumer<String, Object> createConsumer(ImportXMLServiceSettings settings) {
return KafkaConsumerFactory.consumer(settings.getKafkaConsumer());
}
}

View file

@ -0,0 +1,67 @@
package ru.spcex.clearing.xml.importer.config;
import static org.springframework.integration.file.remote.gateway.AbstractRemoteFileOutboundGateway.Command.MGET;
import com.jcraft.jsch.ChannelSftp;
import java.io.File;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.file.remote.gateway.AbstractRemoteFileOutboundGateway;
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.session.DefaultSftpSessionFactory;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
import ru.spcex.clearing.xml.importer.config.settings.ImportXMLServiceSettings;
@Configuration
public class SFTPConfig {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ImportXMLServiceSettings settings;
public SFTPConfig(ImportXMLServiceSettings settings) {
this.settings = settings;
}
@Bean
public SessionFactory<ChannelSftp.LsEntry> sftpSessionFactory() {
DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
factory.setHost(settings.getStore().getSftpIn().getServerIp());
factory.setPort(settings.getStore().getSftpIn().getServerPort());
factory.setUser(settings.getStore().getSftpIn().getUser());
factory.setPassword(settings.getStore().getSftpIn().getPassword());
factory.setAllowUnknownKeys(true);
return new CachingSessionFactory<>(factory);
}
@MessagingGateway
public interface XmlGateway {
@Gateway(requestChannel = "listSftpChannel")
List<File> listFiles(String dir);
}
@Bean
public MessageChannel listSftpChannel(SessionFactory<ChannelSftp.LsEntry> sessionFactory, ImportXMLServiceSettings settings) {
DirectChannel dc = new DirectChannel();
dc.subscribe(handlerList(sessionFactory, settings));
return dc;
}
@Bean
@ServiceActivator(inputChannel = "listSftpChannel")
public MessageHandler handlerList(SessionFactory<ChannelSftp.LsEntry> sessionFactory, ImportXMLServiceSettings settings) {
SftpOutboundGateway sftpOutboundGateway = new SftpOutboundGateway(sessionFactory, MGET.getCommand(), null);
sftpOutboundGateway.setLocalDirectory(new File(settings.getStore().getSrcDir()));
sftpOutboundGateway.setAutoCreateLocalDirectory(true);
sftpOutboundGateway.setOption(AbstractRemoteFileOutboundGateway.Option.DELETE);
return sftpOutboundGateway;
}
}

View file

@ -0,0 +1,105 @@
package ru.spcex.clearing.xml.importer.config;
import com.ctc.wstx.stax.WstxInputFactory;
import com.ctc.wstx.stax.WstxOutputFactory;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlFactory;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.xml.importer.config.settings.ImportXMLServiceSettings;
import ru.spcex.clearing.xml.importer.logic.data.enums.ETable;
import ru.spcex.clearing.xml.importer.logic.data.tags.objects.DF01ObjectTag;
import ru.spcex.clearing.xml.importer.logic.data.tags.objects.DF04ObjectTag;
import ru.spcex.clearing.xml.importer.logic.data.tags.objects.DF06ObjectTag;
import ru.spcex.clearing.xml.importer.logic.data.tags.objects.DF52ObjectTag;
import ru.spcex.clearing.xml.importer.logic.data.tags.objects.DF55ObjectTag;
import ru.spcex.clearing.xml.importer.logic.data.tags.objects.DF57ObjectTag;
import ru.spcex.clearing.xml.importer.logic.data.tags.objects.ObjectTag;
import ru.spcex.clearing.xml.importer.logic.stages.ChangeDirOfFileStage;
import ru.spcex.clearing.xml.importer.logic.stages.ImportToDB;
import ru.spcex.clearing.xml.importer.logic.stages.Stage;
import ru.spcex.platform.classes.base.SpcexObjectBase;
@Configuration
@EnableConfigurationProperties
@ComponentScan(basePackages = {"ru.spcex.clearing.xml.importer"})
public class XMLImporterConfig {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ImportXMLServiceSettings settings;
private final ApplicationContext context;
public XMLImporterConfig(ImportXMLServiceSettings settings, ApplicationContext context) {
this.settings = settings;
this.context = context;
}
@Bean("pipeline")
public List<Stage> pipeline() {
List<Stage> pipeline = new LinkedList<>();
log.info("XMLImporterConfig.pipeline");
pipeline.add(context.getBean(ImportToDB.class));
pipeline.add(context.getBean(ChangeDirOfFileStage.class));
return pipeline;
}
@Bean("executor")
public ThreadPoolTaskExecutor executor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setMaxPoolSize(settings.getCommon().getThreadsCount());
executor.setCorePoolSize(settings.getCommon().getThreadsCount());
executor.setThreadNamePrefix("xml-importer-thread-");
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(300);
executor.initialize();
return executor;
}
@Bean("mapOfTable")
public Map<ETable, ObjectTag<? extends SpcexObjectBase, ?>> getMapOfTables() {
Map<ETable, ObjectTag<? extends SpcexObjectBase, ?>> map = new HashMap<>();
map.put(ETable.DF_01, new DF01ObjectTag());
map.put(ETable.DF_04, new DF04ObjectTag());
map.put(ETable.DF_06, new DF06ObjectTag());
map.put(ETable.DF_52, new DF52ObjectTag());
map.put(ETable.DF_55, new DF55ObjectTag());
map.put(ETable.DF_57, new DF57ObjectTag());
return map;
}
@Bean("xmlMapper")
public XmlMapper xmlMapper() {
XMLInputFactory inputFactory = new WstxInputFactory();
XMLOutputFactory outputFactory = new WstxOutputFactory();
XmlFactory xmlFactory = XmlFactory.builder()
.xmlInputFactory(inputFactory)
.xmlOutputFactory(outputFactory)
.build();
XmlMapper xmlMapper = new XmlMapper(xmlFactory);
xmlMapper.registerModule(new JavaTimeModule());
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
xmlMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
return xmlMapper;
}
}

View file

@ -0,0 +1,31 @@
package ru.spcex.clearing.xml.importer.config.settings;
public class Common {
private String encodingSource;
private int insertBatchSize;
private int threadsCount;
public String getEncodingSource() {
return encodingSource;
}
public void setEncodingSource(String encodingSource) {
this.encodingSource = encodingSource;
}
public int getInsertBatchSize() {
return insertBatchSize;
}
public void setInsertBatchSize(int insertBatchSize) {
this.insertBatchSize = insertBatchSize;
}
public int getThreadsCount() {
return threadsCount;
}
public void setThreadsCount(int threadsCount) {
this.threadsCount = threadsCount;
}
}

View file

@ -0,0 +1,13 @@
package ru.spcex.clearing.xml.importer.config.settings;
public class Cron {
private String checkSrcDirCron;
public String getCheckSrcDirCron() {
return checkSrcDirCron;
}
public void setCheckSrcDirCron(String checkSrcDirCron) {
this.checkSrcDirCron = checkSrcDirCron;
}
}

View file

@ -0,0 +1,68 @@
package ru.spcex.clearing.xml.importer.config.settings;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings;
import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings;
import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams;
@Component
@PropertySource("file:${spring.config.location}/application.properties")
@ConfigurationProperties("import-xml-service")
public class ImportXMLServiceSettings {
private HazelcastClientParams hazelcast;
private KafkaProducerSettings kafkaProducer;
private KafkaConsumerSettings kafkaConsumer;
private Common common;
private Store store;
private Cron cron;
public HazelcastClientParams getHazelcast() {
return hazelcast;
}
public void setHazelcast(HazelcastClientParams hazelcast) {
this.hazelcast = hazelcast;
}
public KafkaProducerSettings getKafkaProducer() {
return kafkaProducer;
}
public void setKafkaProducer(KafkaProducerSettings kafkaProducer) {
this.kafkaProducer = kafkaProducer;
}
public KafkaConsumerSettings getKafkaConsumer() {
return kafkaConsumer;
}
public void setKafkaConsumer(KafkaConsumerSettings kafkaConsumer) {
this.kafkaConsumer = kafkaConsumer;
}
public Common getCommon() {
return common;
}
public void setCommon(Common common) {
this.common = common;
}
public Store getStore() {
return store;
}
public void setStore(Store store) {
this.store = store;
}
public Cron getCron() {
return cron;
}
public void setCron(Cron cron) {
this.cron = cron;
}
}

View file

@ -0,0 +1,51 @@
package ru.spcex.clearing.xml.importer.config.settings;
import ru.spcex.platform.utils.config.SftpInboundFolderSetting;
public class Store {
private String srcDir;
private String outDir;
private String outDirError;
private boolean deleteSrcFiles = true;
//sftp settings
private SftpInboundFolderSetting sftpIn;
public String getSrcDir() {
return srcDir;
}
public void setSrcDir(String srcDir) {
this.srcDir = srcDir;
}
public String getOutDir() {
return outDir;
}
public void setOutDir(String outDir) {
this.outDir = outDir;
}
public boolean isDeleteSrcFiles() {
return deleteSrcFiles;
}
public void setDeleteSrcFiles(boolean deleteSrcFiles) {
this.deleteSrcFiles = deleteSrcFiles;
}
public String getOutDirError() {
return outDirError;
}
public void setOutDirError(String outDirError) {
this.outDirError = outDirError;
}
public SftpInboundFolderSetting getSftpIn() {
return sftpIn;
}
public void setSftpIn(SftpInboundFolderSetting sftpIn) {
this.sftpIn = sftpIn;
}
}

View file

@ -0,0 +1,32 @@
package ru.spcex.clearing.xml.importer.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import ru.spcex.clearing.xml.importer.services.XMLImporterService;
@RestController("/")
public class ImporterController implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final XMLImporterService importerService;
public ImporterController(@Qualifier("xmlImporterService") XMLImporterService importerService) {
this.importerService = importerService;
}
@GetMapping(path = "/xml-import", produces = MediaType.TEXT_PLAIN_VALUE)
public String checkFolder() {
log.info("Call check method for importer controller");
importerService.run();
return "xml import completed, see log";
}
@Override
public void afterPropertiesSet() {
log.info("controller started");
}
}

View file

@ -0,0 +1,6 @@
package ru.spcex.clearing.xml.importer.exceptions;
public class ConfigException extends RuntimeException {
public ConfigException(String msg) { super(msg); }
public ConfigException(String msg, Throwable cause) { super(msg, cause); }
}

View file

@ -0,0 +1,43 @@
package ru.spcex.clearing.xml.importer.logic;
import java.util.Arrays;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.xml.importer.logic.data.ResultContainer;
import ru.spcex.clearing.xml.importer.logic.data.enums.StageResult;
import ru.spcex.clearing.xml.importer.logic.stages.Stage;
@Component("processor")
public class Processor {
private final Logger log = LoggerFactory.getLogger(getClass());
private final List<Stage> pipeline;
public Processor(@Qualifier("pipeline") List<Stage> pipeline) {
this.pipeline = pipeline;
}
public void process(ResultContainer task) {
log.info("uuid {}. Task started", task.getUuid());
long startMills = System.currentTimeMillis();
for (Stage currStage : pipeline) {
if (statusIsFinal(task.getLastStageStatus()) && currStage.skipCompleted()) {
continue;
}
log.info("uuid {}. Stage: {}", task.getUuid(), currStage.getClass().getSimpleName());
task.setLastStageStatus(currStage.process(task));
log.info("uuid {}. Stage {} finished with status {}", task.getUuid(), currStage.getClass().getSimpleName(), task.getLastStageStatus());
}
long endMills = System.currentTimeMillis();
log.info("uuid {}. Task completed, result: {}, time working: {} ms",
task.getUuid(),
task,
endMills - startMills);
}
private boolean statusIsFinal(StageResult previousStageStatus) {
return Arrays.asList(StageResult.ERROR, StageResult.COMPLETE).contains(previousStageStatus);
}
}

View file

@ -0,0 +1,56 @@
package ru.spcex.clearing.xml.importer.logic.data;
import java.io.File;
import java.util.UUID;
import ru.spcex.clearing.xml.importer.logic.data.enums.ETable;
import ru.spcex.clearing.xml.importer.logic.data.enums.StageResult;
public class ResultContainer {
private UUID uuid;
private ETable xmlTable;
private File xmlFile;
private StageResult lastStageStatus;
protected ResultContainer() {
}
public static ResultContainer createNewTask(ETable xmlTable, File xmlFile) {
ResultContainer container = new ResultContainer();
container.xmlTable = xmlTable;
container.xmlFile = xmlFile;
container.uuid = UUID.randomUUID();
return container;
}
public ETable getXmlTable() {
return xmlTable;
}
public void setXmlTable(ETable xmlTable) {
this.xmlTable = xmlTable;
}
public File getXmlFile() {
return xmlFile;
}
public void setXmlFile(File xmlFile) {
this.xmlFile = xmlFile;
}
public UUID getUuid() {
return uuid;
}
public void setUuid(UUID uuid) {
this.uuid = uuid;
}
public StageResult getLastStageStatus() {
return lastStageStatus;
}
public void setLastStageStatus(StageResult lastStageRes) {
this.lastStageStatus = lastStageRes;
}
}

View file

@ -0,0 +1,39 @@
package ru.spcex.clearing.xml.importer.logic.data.enums;
public enum ETable {
DF_01("DF-01"),
DF_04("DF-04"),
DF_06("DF-06"),
DF_52("DF-52"),
DF_55("DF-55"),
DF_57("DF-57");
public String getPrefix() {
return prefix;
}
private final String prefix;
ETable(String prefix) {
this.prefix = prefix;
}
public static ETable getTableForFilename(String filename) {
for (ETable table : ETable.values()) {
if (table.fileForThisTable(filename)) return table;
}
return null;
}
public static ETable tableForName(String name) {
for (ETable table : values()) {
if (name.equalsIgnoreCase(table.name()))
return table;
}
return null;
}
public boolean fileForThisTable(String filename) {
return filename != null && filename.startsWith(prefix);
}
}

View file

@ -0,0 +1,7 @@
package ru.spcex.clearing.xml.importer.logic.data.enums;
public enum StageResult {
OK,
ERROR,
COMPLETE
}

View file

@ -0,0 +1,148 @@
package ru.spcex.clearing.xml.importer.logic.data.tags;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;
import java.util.Objects;
import ru.spcex.clearing.xml.importer.logic.data.tags.objects.ObjectTag;
import ru.spcex.platform.classes.base.SpcexObjectBase;
@JacksonXmlRootElement(localName = "DOCUMENT")
public class DocumentTag {
@JacksonXmlProperty(isAttribute = true, localName = "MESSAGEID")
private String messageId;
@JacksonXmlProperty(isAttribute = true, localName = "MESSAGETYPE")
private String messageType;
@JacksonXmlProperty(isAttribute = true, localName = "MESSAGENAME")
private String messageName;
@JacksonXmlProperty(isAttribute = true, localName = "MESSAGEDATE")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate messageDate;
@JacksonXmlProperty(isAttribute = true, localName = "MESSAGETIME")
@JsonFormat(pattern = "HH:mm:ss")
private LocalTime messageTime;
@JacksonXmlProperty(isAttribute = true, localName = "SENDER")
private String sender;
@JacksonXmlProperty(isAttribute = true, localName = "RECEIVER")
private String receiver;
@JacksonXmlProperty(localName = "PARENTDOC")
private ParentDocTag parentDoc;
@JacksonXmlElementWrapper(localName = "OBJECTS")
@JacksonXmlProperty(localName = "OBJECT")
private List<ObjectTag<? extends SpcexObjectBase, ?>> objects;
public DocumentTag() {
}
public String getMessageId() {
return messageId;
}
public void setMessageId(String messageId) {
this.messageId = messageId;
}
public String getMessageType() {
return messageType;
}
public void setMessageType(String messageType) {
this.messageType = messageType;
}
public String getMessageName() {
return messageName;
}
public void setMessageName(String messageName) {
this.messageName = messageName;
}
public LocalDate getMessageDate() {
return messageDate;
}
public void setMessageDate(LocalDate messageDate) {
this.messageDate = messageDate;
}
public LocalTime getMessageTime() {
return messageTime;
}
public void setMessageTime(LocalTime messageTime) {
this.messageTime = messageTime;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = receiver;
}
public ParentDocTag getParentDoc() {
return parentDoc;
}
public void setParentDoc(ParentDocTag parentDoc) {
this.parentDoc = parentDoc;
}
public List<ObjectTag<? extends SpcexObjectBase, ?>> getObjects() {
return objects;
}
public void setObjects(List<ObjectTag<? extends SpcexObjectBase, ?>> objects) {
this.objects = objects;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DocumentTag that = (DocumentTag) o;
return Objects.equals(messageId, that.messageId) && Objects.equals(messageType, that.messageType) && Objects.equals(messageName, that.messageName) && Objects.equals(messageDate, that.messageDate) && Objects.equals(messageTime, that.messageTime) && Objects.equals(sender, that.sender) && Objects.equals(receiver, that.receiver) && Objects.equals(parentDoc, that.parentDoc) && Objects.equals(objects, that.objects);
}
@Override
public int hashCode() {
return Objects.hash(messageId, messageType, messageName, messageDate, messageTime, sender, receiver, parentDoc, objects);
}
@Override
public String toString() {
return "DocumentTag{" +
"messageId='" + messageId + '\'' +
", messageType='" + messageType + '\'' +
", messageName='" + messageName + '\'' +
", messageDate='" + messageDate + '\'' +
", messageTime='" + messageTime + '\'' +
", sender='" + sender + '\'' +
", receiver='" + receiver + '\'' +
", parentDoc=" + parentDoc +
", objects=" + objects +
'}';
}
}

View file

@ -0,0 +1,40 @@
package ru.spcex.clearing.xml.importer.logic.data.tags;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import java.util.Objects;
public class ParentDocTag {
@JacksonXmlProperty(isAttribute = true, localName = "PARENTID")
private String parentId;
public ParentDocTag() {
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ParentDocTag that = (ParentDocTag) o;
return Objects.equals(parentId, that.parentId);
}
@Override
public int hashCode() {
return Objects.hashCode(parentId);
}
@Override
public String toString() {
return "ParentDocTag{" +
"parentId='" + parentId + '\'' +
'}';
}
}

View file

@ -0,0 +1,207 @@
package ru.spcex.clearing.xml.importer.logic.data.tags.objects;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import java.time.Instant;
import java.time.LocalDate;
import java.util.Objects;
import ru.clearing.classes.statics.data.sdf.SDf01;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.xml.importer.logic.data.enums.ETable;
public class DF01ObjectTag extends ObjectTag<SDf01, DF01ObjectTag> {
private static final String PREFIX = ETable.DF_01.name();
private static final Class<SDf01> CLAZZ = SDf01.class;
private static final String NAME_OF_HZ_MAP = IMDGDistributedNames.Map_SDf01;
@JacksonXmlProperty(isAttribute = true, localName = "CURR_CODE")
private String currCode;
@JacksonXmlProperty(isAttribute = true, localName = "ACCOUNT")
private String account;
@JacksonXmlProperty(isAttribute = true, localName = "REMAINDER")
private String remainder;
@JacksonXmlProperty(isAttribute = true, localName = "DEAL")
private String deal;
@JacksonXmlProperty(isAttribute = true, localName = "ACC_CODE")
private String accCode;
@JacksonXmlProperty(isAttribute = true, localName = "DAT")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate dat;
@JacksonXmlProperty(isAttribute = true, localName = "MARKET")
private String market;
@JacksonXmlProperty(isAttribute = true, localName = "ACC_NAME")
private String accName;
@JacksonXmlProperty(isAttribute = true, localName = "ACC_TYPE")
private String accType;
@JacksonXmlProperty(isAttribute = true, localName = "SUMENGAGE")
private String sumengage;
@JacksonXmlProperty(isAttribute = true, localName = "SUMUNBLOK")
private String sumunblock;
@JacksonXmlProperty(isAttribute = true, localName = "FILE_TYPE")
private String fileType;
public DF01ObjectTag() {
super(PREFIX, CLAZZ, NAME_OF_HZ_MAP);
}
@Override
public SDf01 getEntity(DF01ObjectTag entity) {
SDf01 result = new SDf01();
result.setCurr_code(entity.getCurrCode());
result.setAccount(entity.getAccount());
result.setRemainder(entity.getRemainder());
result.setDeal(entity.getDeal());
result.setAcc_code(entity.getAccCode());
result.setDat(entity.getDat().toString());
result.setMarket(entity.getMarket());
result.setAcc_name(entity.getAccName());
result.setAcc_type(entity.getAccType());
result.setSumengage(entity.getSumengage());
result.setSumunblock(entity.getSumunblock());
result.setFile_type(entity.getFileType());
result.setFileName(filename);
result.setGenerationTime(Instant.now());
result.setGenerationId(fileId);
return result;
}
public String getCurrCode() {
return currCode;
}
public void setCurrCode(String currCode) {
this.currCode = currCode;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getRemainder() {
return remainder;
}
public void setRemainder(String remainder) {
this.remainder = remainder;
}
public String getDeal() {
return deal;
}
public void setDeal(String deal) {
this.deal = deal;
}
public String getAccCode() {
return accCode;
}
public void setAccCode(String accCode) {
this.accCode = accCode;
}
public LocalDate getDat() {
return dat;
}
public void setDat(LocalDate dat) {
this.dat = dat;
}
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
public String getAccName() {
return accName;
}
public void setAccName(String accName) {
this.accName = accName;
}
public String getAccType() {
return accType;
}
public void setAccType(String accType) {
this.accType = accType;
}
public String getSumengage() {
return sumengage;
}
public void setSumengage(String sumengage) {
this.sumengage = sumengage;
}
public String getSumunblock() {
return sumunblock;
}
public void setSumunblock(String sumunblock) {
this.sumunblock = sumunblock;
}
public String getFileType() {
return fileType;
}
public void setFileType(String fileType) {
this.fileType = fileType;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DF01ObjectTag that = (DF01ObjectTag) o;
return Objects.equals(currCode, that.currCode) && Objects.equals(account, that.account) && Objects.equals(remainder, that.remainder) && Objects.equals(deal, that.deal) && Objects.equals(accCode, that.accCode) && Objects.equals(dat, that.dat) && Objects.equals(market, that.market) && Objects.equals(accName, that.accName) && Objects.equals(accType, that.accType) && Objects.equals(sumengage, that.sumengage) && Objects.equals(sumunblock, that.sumunblock) && Objects.equals(fileType, that.fileType);
}
@Override
public int hashCode() {
return Objects.hash(currCode, account, remainder, deal, accCode, dat, market, accName, accType, sumengage, sumunblock, fileType);
}
@Override
public String toString() {
return "DF01ObjectTag{" +
"currCode='" + currCode + '\'' +
", account='" + account + '\'' +
", remainder='" + remainder + '\'' +
", deal='" + deal + '\'' +
", accCode='" + accCode + '\'' +
", dat=" + dat +
", market='" + market + '\'' +
", accName='" + accName + '\'' +
", accType='" + accType + '\'' +
", sumengage='" + sumengage + '\'' +
", sumunblock='" + sumunblock + '\'' +
", fileType='" + fileType + '\'' +
'}';
}
}

View file

@ -0,0 +1,308 @@
package ru.spcex.clearing.xml.importer.logic.data.tags.objects;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import java.time.Instant;
import java.time.LocalDate;
import java.util.Objects;
import ru.clearing.classes.statics.data.sdf.SDf04;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.xml.importer.logic.data.enums.ETable;
public class DF04ObjectTag extends ObjectTag<SDf04, DF04ObjectTag> {
private static final String PREFIX = ETable.DF_04.name();
private static final Class<SDf04> CLAZZ = SDf04.class;
private static final String NAME_OF_HZ_MAP = IMDGDistributedNames.Map_SDf04;
@JacksonXmlProperty(isAttribute = true, localName = "SEG_TYPE")
private String segType;
@JacksonXmlProperty(isAttribute = true, localName = "DOC_TYPE")
private String docType;
@JacksonXmlProperty(isAttribute = true, localName = "DOCNM_REF")
private String docnmRef;
@JacksonXmlProperty(isAttribute = true, localName = "DOCNMPREV")
private String docnmprev;
@JacksonXmlProperty(isAttribute = true, localName = "C_ACC_DEB")
private String cAccDeb;
@JacksonXmlProperty(isAttribute = true, localName = "SBANKNAM")
private String sbanknam1;
private String sbanknam2;
private String sbanknam3;
private String sbanknam4;
private String sbanknam5;
@JacksonXmlProperty(isAttribute = true, localName = "C_ACC_CRED")
private String cAccCred;
@JacksonXmlProperty(isAttribute = true, localName = "RBANKNAM")
private String rbanknam1;
private String rbanknam2;
private String rbanknam3;
private String rbanknam4;
private String rbanknam5;
@JacksonXmlProperty(isAttribute = true, localName = "PAY_DATE")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate payDate;
@JacksonXmlProperty(isAttribute = true, localName = "PAY_VAL")
private String payVal;
@JacksonXmlProperty(isAttribute = true, localName = "SUM_DEB")
private String sumDeb;
@JacksonXmlProperty(isAttribute = true, localName = "SPECIF_1")
private String specif1;
@JacksonXmlProperty(isAttribute = true, localName = "IMP_RESULT")
private String impResult;
public DF04ObjectTag() {
super(PREFIX, CLAZZ, NAME_OF_HZ_MAP);
}
@Override
public SDf04 getEntity(DF04ObjectTag entity) {
SDf04 result = new SDf04();
result.setSeg_type(entity.getSegType());
result.setDoc_type(entity.getDocType());
result.setDocnm_ref(entity.getDocnmRef());
result.setDocnmprev(entity.getDocnmprev());
result.setC_acc_deb(entity.getcAccDeb());
result.setSbanknam1(entity.getSbanknam1());
result.setSbanknam2(entity.getSbanknam2());
result.setSbanknam3(entity.getSbanknam3());
result.setSbanknam4(entity.getSbanknam4());
result.setSbanknam5(entity.getSbanknam5());
result.setC_acc_cred(entity.getcAccCred());
result.setRbanknam1(entity.getRbanknam1());
result.setRbanknam2(entity.getRbanknam2());
result.setRbanknam3(entity.getRbanknam3());
result.setRbanknam4(entity.getRbanknam4());
result.setRbanknam5(entity.getRbanknam5());
result.setPay_date(entity.getPayDate().toString());
result.setPay_val(entity.getPayVal());
result.setSum_deb(entity.getSumDeb());
result.setSpecif_1(entity.getSpecif1());
result.setImp_result(entity.getImpResult());
result.setFile_name(filename);
result.setGenerationTime(Instant.now());
result.setGenerationId(fileId);
return result;
}
public String getSegType() {
return segType;
}
public void setSegType(String segType) {
this.segType = segType;
}
public String getDocType() {
return docType;
}
public void setDocType(String docType) {
this.docType = docType;
}
public String getDocnmRef() {
return docnmRef;
}
public void setDocnmRef(String docnmRef) {
this.docnmRef = docnmRef;
}
public String getDocnmprev() {
return docnmprev;
}
public void setDocnmprev(String docnmprev) {
this.docnmprev = docnmprev;
}
public String getcAccDeb() {
return cAccDeb;
}
public void setcAccDeb(String cAccDeb) {
this.cAccDeb = cAccDeb;
}
public String getSbanknam1() {
return sbanknam1;
}
public void setSbanknam1(String sbanknam1) {
this.sbanknam1 = sbanknam1;
}
public String getSbanknam2() {
return sbanknam2;
}
public void setSbanknam2(String sbanknam2) {
this.sbanknam2 = sbanknam2;
}
public String getSbanknam3() {
return sbanknam3;
}
public void setSbanknam3(String sbanknam3) {
this.sbanknam3 = sbanknam3;
}
public String getSbanknam4() {
return sbanknam4;
}
public void setSbanknam4(String sbanknam4) {
this.sbanknam4 = sbanknam4;
}
public String getSbanknam5() {
return sbanknam5;
}
public void setSbanknam5(String sbanknam5) {
this.sbanknam5 = sbanknam5;
}
public String getcAccCred() {
return cAccCred;
}
public void setcAccCred(String cAccCred) {
this.cAccCred = cAccCred;
}
public String getRbanknam1() {
return rbanknam1;
}
public void setRbanknam1(String rbanknam1) {
this.rbanknam1 = rbanknam1;
}
public String getRbanknam2() {
return rbanknam2;
}
public void setRbanknam2(String rbanknam2) {
this.rbanknam2 = rbanknam2;
}
public String getRbanknam3() {
return rbanknam3;
}
public void setRbanknam3(String rbanknam3) {
this.rbanknam3 = rbanknam3;
}
public String getRbanknam4() {
return rbanknam4;
}
public void setRbanknam4(String rbanknam4) {
this.rbanknam4 = rbanknam4;
}
public String getRbanknam5() {
return rbanknam5;
}
public void setRbanknam5(String rbanknam5) {
this.rbanknam5 = rbanknam5;
}
public LocalDate getPayDate() {
return payDate;
}
public void setPayDate(LocalDate payDate) {
this.payDate = payDate;
}
public String getPayVal() {
return payVal;
}
public void setPayVal(String payVal) {
this.payVal = payVal;
}
public String getSumDeb() {
return sumDeb;
}
public void setSumDeb(String sumDeb) {
this.sumDeb = sumDeb;
}
public String getSpecif1() {
return specif1;
}
public void setSpecif1(String specif1) {
this.specif1 = specif1;
}
public String getImpResult() {
return impResult;
}
public void setImpResult(String impResult) {
this.impResult = impResult;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DF04ObjectTag that = (DF04ObjectTag) o;
return Objects.equals(segType, that.segType) && Objects.equals(docType, that.docType) && Objects.equals(docnmRef, that.docnmRef) && Objects.equals(docnmprev, that.docnmprev) && Objects.equals(cAccDeb, that.cAccDeb) && Objects.equals(sbanknam1, that.sbanknam1) && Objects.equals(sbanknam2, that.sbanknam2) && Objects.equals(sbanknam3, that.sbanknam3) && Objects.equals(sbanknam4, that.sbanknam4) && Objects.equals(sbanknam5, that.sbanknam5) && Objects.equals(cAccCred, that.cAccCred) && Objects.equals(rbanknam1, that.rbanknam1) && Objects.equals(rbanknam2, that.rbanknam2) && Objects.equals(rbanknam3, that.rbanknam3) && Objects.equals(rbanknam4, that.rbanknam4) && Objects.equals(rbanknam5, that.rbanknam5) && Objects.equals(payDate, that.payDate) && Objects.equals(payVal, that.payVal) && Objects.equals(sumDeb, that.sumDeb) && Objects.equals(specif1, that.specif1) && Objects.equals(impResult, that.impResult);
}
@Override
public int hashCode() {
return Objects.hash(segType, docType, docnmRef, docnmprev, cAccDeb, sbanknam1, sbanknam2, sbanknam3, sbanknam4, sbanknam5, cAccCred, rbanknam1, rbanknam2, rbanknam3, rbanknam4, rbanknam5, payDate, payVal, sumDeb, specif1, impResult);
}
@Override
public String toString() {
return "DF04ObjectTag{" +
"segType='" + segType + '\'' +
", docType='" + docType + '\'' +
", docnmRef='" + docnmRef + '\'' +
", docnmprev='" + docnmprev + '\'' +
", cAccDeb='" + cAccDeb + '\'' +
", sbanknam1='" + sbanknam1 + '\'' +
", sbanknam2='" + sbanknam2 + '\'' +
", sbanknam3='" + sbanknam3 + '\'' +
", sbanknam4='" + sbanknam4 + '\'' +
", sbanknam5='" + sbanknam5 + '\'' +
", cAccCred='" + cAccCred + '\'' +
", rbanknam1='" + rbanknam1 + '\'' +
", rbanknam2='" + rbanknam2 + '\'' +
", rbanknam3='" + rbanknam3 + '\'' +
", rbanknam4='" + rbanknam4 + '\'' +
", rbanknam5='" + rbanknam5 + '\'' +
", payDate=" + payDate +
", payVal='" + payVal + '\'' +
", sumDeb='" + sumDeb + '\'' +
", specif1='" + specif1 + '\'' +
", impResult='" + impResult + '\'' +
'}';
}
}

View file

@ -0,0 +1,221 @@
package ru.spcex.clearing.xml.importer.logic.data.tags.objects;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.util.Objects;
import ru.clearing.classes.statics.data.sdf.SDf06;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.xml.importer.logic.data.enums.ETable;
public class DF06ObjectTag extends ObjectTag<SDf06, DF06ObjectTag> {
private static final String PREFIX = ETable.DF_06.name();
private static final Class<SDf06> CLAZZ = SDf06.class;
private static final String NAME_OF_HZ_MAP = IMDGDistributedNames.Map_SDf06;
@JacksonXmlProperty(isAttribute = true, localName = "ACCOUNT")
private String account;
@JacksonXmlProperty(isAttribute = true, localName = "SUM")
private BigDecimal sum;
@JacksonXmlProperty(isAttribute = true, localName = "MARKET")
private String market;
@JacksonXmlProperty(isAttribute = true, localName = "TYPE")
private String type;
@JacksonXmlProperty(isAttribute = true, localName = "DEAL")
private String deal;
@JacksonXmlProperty(isAttribute = true, localName = "CLIENTN")
private String clientN;
@JacksonXmlProperty(isAttribute = true, localName = "INN")
private String inn;
@JacksonXmlProperty(isAttribute = true, localName = "BIC")
private String bic;
@JacksonXmlProperty(isAttribute = true, localName = "SPEC")
private String spec;
@JacksonXmlProperty(isAttribute = true, localName = "NUMBER")
private BigDecimal number;
@JacksonXmlProperty(isAttribute = true, localName = "DOC_NUM")
private String docNum;
@JacksonXmlProperty(isAttribute = true, localName = "DOC_DATE")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate docDate;
@JacksonXmlProperty(isAttribute = true, localName = "PAY_VAL")
private String payVal;
public DF06ObjectTag() {
super(PREFIX, CLAZZ, NAME_OF_HZ_MAP);
}
@Override
public SDf06 getEntity(DF06ObjectTag entity) {
SDf06 result = new SDf06();
result.setAccount(entity.getAccount());
result.setSum(entity.getSum());
result.setMarket(entity.getMarket());
result.setType(entity.getType());
result.setDeal(entity.getDeal());
result.setClientN(entity.getClientN());
result.setInn(entity.getInn());
result.setBic(entity.getBic());
result.setSpec(entity.getSpec());
result.setNumber(entity.getNumber());
result.setDoc_Num(entity.getDocNum());
result.setDoc_Date(entity.getDocDate().toString());
result.setPay_val(entity.getPayVal());
result.setFileName(filename);
result.setGenerationTime(Instant.now());
result.setGenerationId(fileId);
return result;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public BigDecimal getSum() {
return sum;
}
public void setSum(BigDecimal sum) {
this.sum = sum;
}
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getDeal() {
return deal;
}
public void setDeal(String deal) {
this.deal = deal;
}
public String getClientN() {
return clientN;
}
public void setClientN(String clientN) {
this.clientN = clientN;
}
public String getInn() {
return inn;
}
public void setInn(String inn) {
this.inn = inn;
}
public String getBic() {
return bic;
}
public void setBic(String bic) {
this.bic = bic;
}
public String getSpec() {
return spec;
}
public void setSpec(String spec) {
this.spec = spec;
}
public BigDecimal getNumber() {
return number;
}
public void setNumber(BigDecimal number) {
this.number = number;
}
public String getDocNum() {
return docNum;
}
public void setDocNum(String docNum) {
this.docNum = docNum;
}
public LocalDate getDocDate() {
return docDate;
}
public void setDocDate(LocalDate docDate) {
this.docDate = docDate;
}
public String getPayVal() {
return payVal;
}
public void setPayVal(String payVal) {
this.payVal = payVal;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DF06ObjectTag that = (DF06ObjectTag) o;
return Objects.equals(account, that.account) && Objects.equals(sum, that.sum) && Objects.equals(market, that.market) && Objects.equals(type, that.type) && Objects.equals(deal, that.deal) && Objects.equals(clientN, that.clientN) && Objects.equals(inn, that.inn) && Objects.equals(bic, that.bic) && Objects.equals(spec, that.spec) && Objects.equals(number, that.number) && Objects.equals(docNum, that.docNum) && Objects.equals(docDate, that.docDate) && Objects.equals(payVal, that.payVal);
}
@Override
public int hashCode() {
return Objects.hash(account, sum, market, type, deal, clientN, inn, bic, spec, number, docNum, docDate, payVal);
}
@Override
public String toString() {
return "DF06ObjectTag{" +
"account='" + account + '\'' +
", sum=" + sum +
", market='" + market + '\'' +
", type='" + type + '\'' +
", deal='" + deal + '\'' +
", clientN='" + clientN + '\'' +
", inn='" + inn + '\'' +
", bic='" + bic + '\'' +
", spec='" + spec + '\'' +
", number=" + number +
", docNum='" + docNum + '\'' +
", docDate=" + docDate +
", payVal='" + payVal + '\'' +
'}';
}
}

View file

@ -0,0 +1,129 @@
package ru.spcex.clearing.xml.importer.logic.data.tags.objects;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import java.time.Instant;
import java.time.LocalDate;
import java.util.Objects;
import ru.clearing.classes.statics.data.sdf.SDf52;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.xml.importer.logic.data.enums.ETable;
public class DF52ObjectTag extends ObjectTag<SDf52, DF52ObjectTag> {
private static final String PREFIX = ETable.DF_52.name();
private static final Class<SDf52> CLAZZ = SDf52.class;
private static final String NAME_OF_HZ_MAP = IMDGDistributedNames.Map_SDf52;
@JacksonXmlProperty(isAttribute = true, localName = "ACCOUNT")
private String account;
@JacksonXmlProperty(isAttribute = true, localName = "ACC_NAME")
private String accName;
@JacksonXmlProperty(isAttribute = true, localName = "DEAL")
private String deal;
@JacksonXmlProperty(isAttribute = true, localName = "DATE")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate date;
@JacksonXmlProperty(isAttribute = true, localName = "STATUS")
private Long status;
@JacksonXmlProperty(isAttribute = true, localName = "ACC_TYPE")
private String accType;
public DF52ObjectTag() {
super(PREFIX, CLAZZ, NAME_OF_HZ_MAP);
}
@Override
public SDf52 getEntity(DF52ObjectTag entity) {
SDf52 result = new SDf52();
result.setAccount(entity.getAccount());
result.setAcc_name(entity.getAccName());
result.setDeal(entity.getDeal());
result.setDate(entity.getDate().toString());
result.setAcc_type(entity.getAccType());
result.setStatus(entity.getStatus());
result.setFileName(filename);
result.setGenerationTime(Instant.now());
result.setGenerationId(fileId);
return result;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getAccName() {
return accName;
}
public void setAccName(String accName) {
this.accName = accName;
}
public String getDeal() {
return deal;
}
public void setDeal(String deal) {
this.deal = deal;
}
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
public Long getStatus() {
return status;
}
public void setStatus(Long status) {
this.status = status;
}
public String getAccType() {
return accType;
}
public void setAccType(String accType) {
this.accType = accType;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DF52ObjectTag that = (DF52ObjectTag) o;
return Objects.equals(account, that.account) && Objects.equals(accName, that.accName) && Objects.equals(deal, that.deal) && Objects.equals(date, that.date) && Objects.equals(status, that.status) && Objects.equals(accType, that.accType);
}
@Override
public int hashCode() {
return Objects.hash(account, accName, deal, date, status, accType);
}
@Override
public String toString() {
return "DF52ObjectTag{" +
"account='" + account + '\'' +
", accName='" + accName + '\'' +
", deal='" + deal + '\'' +
", date=" + date +
", status=" + status +
", accType='" + accType + '\'' +
'}';
}
}

View file

@ -0,0 +1,610 @@
package ru.spcex.clearing.xml.importer.logic.data.tags.objects;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import java.time.Instant;
import java.time.LocalDate;
import java.util.Objects;
import ru.clearing.classes.statics.data.sdf.SDf55;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.xml.importer.logic.data.enums.ETable;
public class DF55ObjectTag extends ObjectTag<SDf55, DF55ObjectTag> {
private static final String PREFIX = ETable.DF_55.name();
private static final Class<SDf55> CLAZZ = SDf55.class;
private static final String NAME_OF_HZ_MAP = IMDGDistributedNames.Map_SDf55;
@JacksonXmlProperty(isAttribute = true, localName = "SEG_TYPE")
private String segType;
@JacksonXmlProperty(isAttribute = true, localName = "DOC_TYPE")
private String docType;
@JacksonXmlProperty(isAttribute = true, localName = "DOCNM_REF")
private String docnmRef;
@JacksonXmlProperty(isAttribute = true, localName = "DOCNMPREV")
private String docnmprev;
@JacksonXmlProperty(isAttribute = true, localName = "SBANKCODE")
private String sbankcode;
@JacksonXmlProperty(isAttribute = true, localName = "C_ACC_DEB")
private String cAccDeb;
@JacksonXmlProperty(isAttribute = true, localName = "SBANKNAM")
private String sbanknam1;
private String sbanknam2;
private String sbanknam3;
private String sbanknam4;
private String sbanknam5;
@JacksonXmlProperty(isAttribute = true, localName = "RBANKCODE")
private String rbankcode;
@JacksonXmlProperty(isAttribute = true, localName = "C_ACC_CRED")
private String cAccCred;
@JacksonXmlProperty(isAttribute = true, localName = "RBANKNAM")
private String rbanknam1;
private String rbanknam2;
private String rbanknam3;
private String rbanknam4;
private String rbanknam5;
@JacksonXmlProperty(isAttribute = true, localName = "OP_TYPE")
private String opType;
@JacksonXmlProperty(isAttribute = true, localName = "OP_ORDER")
private String opOrder;
@JacksonXmlProperty(isAttribute = true, localName = "PAY_DATE")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate payDate;
@JacksonXmlProperty(isAttribute = true, localName = "PAY_VAL")
private String payVal;
@JacksonXmlProperty(isAttribute = true, localName = "SUM_DEB")
private String sumDeb;
@JacksonXmlProperty(isAttribute = true, localName = "SCLIENTN")
private String sclientn1;
private String sclientn2;
private String sclientn3;
private String sclientn4;
@JacksonXmlProperty(isAttribute = true, localName = "INN_DEB")
private String innDeb;
@JacksonXmlProperty(isAttribute = true, localName = "KPP_DEB")
private String kppDeb;
@JacksonXmlProperty(isAttribute = true, localName = "ACC_DEB")
private String accDeb;
@JacksonXmlProperty(isAttribute = true, localName = "RCLIENTN")
private String rclientn1;
private String rclientn2;
private String rclientn3;
private String rclientn4;
@JacksonXmlProperty(isAttribute = true, localName = "INN_CRED")
private String innCred;
@JacksonXmlProperty(isAttribute = true, localName = "KPP_CRED")
private String kppCred;
@JacksonXmlProperty(isAttribute = true, localName = "ACC_KR_1")
private String accKr1;
@JacksonXmlProperty(isAttribute = true, localName = "SPECIF_1")
private String specif1;
@JacksonXmlProperty(isAttribute = true, localName = "SEND_TYPE")
private String sendType;
@JacksonXmlProperty(isAttribute = true, localName = "DOC_RESULT")
private String docResult;
@JacksonXmlProperty(isAttribute = true, localName = "DOC_NUM")
private String docNum;
@JacksonXmlProperty(isAttribute = true, localName = "DOC_DATE")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate docDate;
@JacksonXmlProperty(isAttribute = true, localName = "VALUE_DATE")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate valueDate;
@JacksonXmlProperty(isAttribute = true, localName = "SWIFT_BEN")
private String swiftBen;
@JacksonXmlProperty(isAttribute = true, localName = "SWIFT_INT")
private String swiftInt;
public DF55ObjectTag() {
super(PREFIX, CLAZZ, NAME_OF_HZ_MAP);
}
@Override
public SDf55 getEntity(DF55ObjectTag entity) {
SDf55 result = new SDf55();
result.setSeg_type(entity.getSegType());
result.setDoc_type(entity.getDocType());
result.setDocnm_ref(entity.getDocnmRef());
result.setDocnmprev(entity.getDocnmprev());
result.setSbankcode(entity.getSbankcode());
result.setC_acc_deb(entity.getcAccDeb());
result.setSbanknam1(entity.getSbanknam1());
result.setSbanknam2(entity.getSbanknam2());
result.setSbanknam3(entity.getSbanknam3());
result.setSbanknam4(entity.getSbanknam4());
result.setSbanknam5(entity.getSbanknam5());
result.setRbankcode(entity.getRbankcode());
result.setC_acc_cred(entity.getcAccCred());
result.setRbanknam1(entity.getRbanknam1());
result.setRbanknam2(entity.getRbanknam2());
result.setRbanknam3(entity.getRbanknam3());
result.setRbanknam4(entity.getRbanknam4());
result.setRbanknam5(entity.getRbanknam5());
result.setOp_type(entity.getOpType());
result.setOp_order(entity.getOpOrder());
result.setPay_date(entity.getPayDate().toString());
result.setPay_val(entity.getPayVal());
result.setSum_deb(entity.getSumDeb());
result.setSclientn1(entity.getSclientn1());
result.setSclientn2(entity.getSclientn2());
result.setSclientn3(entity.getSclientn3());
result.setSclientn4(entity.getSclientn4());
result.setInn_deb(entity.getInnCred());
result.setKpp_deb(entity.getKppCred());
result.setAcc_deb(entity.getAccDeb());
result.setRclientn1(entity.getRclientn1());
result.setRclientn2(entity.getRclientn2());
result.setRclientn3(entity.getRclientn3());
result.setRclientn4(entity.getRclientn4());
result.setInn_cred(entity.getInnCred());
result.setKpp_cred(entity.getKppCred());
result.setAcc_kr_1(entity.getAccKr1());
result.setSpecif_1(entity.getSpecif1());
result.setSend_type(entity.getSendType());
result.setDoc_result(entity.getDocResult());
result.setDoc_Num(entity.getDocNum());
result.setDoc_Date(entity.getDocDate().toString());
result.setValue_date(entity.getValueDate().toString());
result.setSwift_ben(entity.getSwiftBen());
result.setSwift_int(entity.getSwiftInt());
result.setFileName(filename);
result.setGenerationTime(Instant.now());
result.setGenerationId(fileId);
return result;
}
public String getSegType() {
return segType;
}
public void setSegType(String segType) {
this.segType = segType;
}
public String getDocType() {
return docType;
}
public void setDocType(String docType) {
this.docType = docType;
}
public String getDocnmRef() {
return docnmRef;
}
public void setDocnmRef(String docnmRef) {
this.docnmRef = docnmRef;
}
public String getDocnmprev() {
return docnmprev;
}
public void setDocnmprev(String docnmprev) {
this.docnmprev = docnmprev;
}
public String getSbankcode() {
return sbankcode;
}
public void setSbankcode(String sbankcode) {
this.sbankcode = sbankcode;
}
public String getcAccDeb() {
return cAccDeb;
}
public void setcAccDeb(String cAccDeb) {
this.cAccDeb = cAccDeb;
}
public String getSbanknam1() {
return sbanknam1;
}
public void setSbanknam1(String sbanknam1) {
this.sbanknam1 = sbanknam1;
}
public String getSbanknam2() {
return sbanknam2;
}
public void setSbanknam2(String sbanknam2) {
this.sbanknam2 = sbanknam2;
}
public String getSbanknam3() {
return sbanknam3;
}
public void setSbanknam3(String sbanknam3) {
this.sbanknam3 = sbanknam3;
}
public String getSbanknam4() {
return sbanknam4;
}
public void setSbanknam4(String sbanknam4) {
this.sbanknam4 = sbanknam4;
}
public String getSbanknam5() {
return sbanknam5;
}
public void setSbanknam5(String sbanknam5) {
this.sbanknam5 = sbanknam5;
}
public String getRbankcode() {
return rbankcode;
}
public void setRbankcode(String rbankcode) {
this.rbankcode = rbankcode;
}
public String getcAccCred() {
return cAccCred;
}
public void setcAccCred(String cAccCred) {
this.cAccCred = cAccCred;
}
public String getRbanknam1() {
return rbanknam1;
}
public void setRbanknam1(String rbanknam1) {
this.rbanknam1 = rbanknam1;
}
public String getRbanknam2() {
return rbanknam2;
}
public void setRbanknam2(String rbanknam2) {
this.rbanknam2 = rbanknam2;
}
public String getRbanknam3() {
return rbanknam3;
}
public void setRbanknam3(String rbanknam3) {
this.rbanknam3 = rbanknam3;
}
public String getRbanknam4() {
return rbanknam4;
}
public void setRbanknam4(String rbanknam4) {
this.rbanknam4 = rbanknam4;
}
public String getRbanknam5() {
return rbanknam5;
}
public void setRbanknam5(String rbanknam5) {
this.rbanknam5 = rbanknam5;
}
public String getOpType() {
return opType;
}
public void setOpType(String opType) {
this.opType = opType;
}
public String getOpOrder() {
return opOrder;
}
public void setOpOrder(String opOrder) {
this.opOrder = opOrder;
}
public LocalDate getPayDate() {
return payDate;
}
public void setPayDate(LocalDate payDate) {
this.payDate = payDate;
}
public String getPayVal() {
return payVal;
}
public void setPayVal(String payVal) {
this.payVal = payVal;
}
public String getSumDeb() {
return sumDeb;
}
public void setSumDeb(String sumDeb) {
this.sumDeb = sumDeb;
}
public String getSclientn1() {
return sclientn1;
}
public void setSclientn1(String sclientn1) {
this.sclientn1 = sclientn1;
}
public String getSclientn2() {
return sclientn2;
}
public void setSclientn2(String sclientn2) {
this.sclientn2 = sclientn2;
}
public String getSclientn3() {
return sclientn3;
}
public void setSclientn3(String sclientn3) {
this.sclientn3 = sclientn3;
}
public String getSclientn4() {
return sclientn4;
}
public void setSclientn4(String sclientn4) {
this.sclientn4 = sclientn4;
}
public String getInnDeb() {
return innDeb;
}
public void setInnDeb(String innDeb) {
this.innDeb = innDeb;
}
public String getKppDeb() {
return kppDeb;
}
public void setKppDeb(String kppDeb) {
this.kppDeb = kppDeb;
}
public String getAccDeb() {
return accDeb;
}
public void setAccDeb(String accDeb) {
this.accDeb = accDeb;
}
public String getRclientn1() {
return rclientn1;
}
public void setRclientn1(String rclientn1) {
this.rclientn1 = rclientn1;
}
public String getRclientn2() {
return rclientn2;
}
public void setRclientn2(String rclientn2) {
this.rclientn2 = rclientn2;
}
public String getRclientn3() {
return rclientn3;
}
public void setRclientn3(String rclientn3) {
this.rclientn3 = rclientn3;
}
public String getRclientn4() {
return rclientn4;
}
public void setRclientn4(String rclientn4) {
this.rclientn4 = rclientn4;
}
public String getInnCred() {
return innCred;
}
public void setInnCred(String innCred) {
this.innCred = innCred;
}
public String getKppCred() {
return kppCred;
}
public void setKppCred(String kppCred) {
this.kppCred = kppCred;
}
public String getAccKr1() {
return accKr1;
}
public void setAccKr1(String accKr1) {
this.accKr1 = accKr1;
}
public String getSpecif1() {
return specif1;
}
public void setSpecif1(String specif1) {
this.specif1 = specif1;
}
public String getSendType() {
return sendType;
}
public void setSendType(String sendType) {
this.sendType = sendType;
}
public String getDocResult() {
return docResult;
}
public void setDocResult(String docResult) {
this.docResult = docResult;
}
public String getDocNum() {
return docNum;
}
public void setDocNum(String docNum) {
this.docNum = docNum;
}
public LocalDate getDocDate() {
return docDate;
}
public void setDocDate(LocalDate docDate) {
this.docDate = docDate;
}
public LocalDate getValueDate() {
return valueDate;
}
public void setValueDate(LocalDate valueDate) {
this.valueDate = valueDate;
}
public String getSwiftBen() {
return swiftBen;
}
public void setSwiftBen(String swiftBen) {
this.swiftBen = swiftBen;
}
public String getSwiftInt() {
return swiftInt;
}
public void setSwiftInt(String swiftInt) {
this.swiftInt = swiftInt;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DF55ObjectTag that = (DF55ObjectTag) o;
return Objects.equals(segType, that.segType) && Objects.equals(docType, that.docType) && Objects.equals(docnmRef, that.docnmRef) && Objects.equals(docnmprev, that.docnmprev) && Objects.equals(sbankcode, that.sbankcode) && Objects.equals(cAccDeb, that.cAccDeb) && Objects.equals(sbanknam1, that.sbanknam1) && Objects.equals(sbanknam2, that.sbanknam2) && Objects.equals(sbanknam3, that.sbanknam3) && Objects.equals(sbanknam4, that.sbanknam4) && Objects.equals(sbanknam5, that.sbanknam5) && Objects.equals(rbankcode, that.rbankcode) && Objects.equals(cAccCred, that.cAccCred) && Objects.equals(rbanknam1, that.rbanknam1) && Objects.equals(rbanknam2, that.rbanknam2) && Objects.equals(rbanknam3, that.rbanknam3) && Objects.equals(rbanknam4, that.rbanknam4) && Objects.equals(rbanknam5, that.rbanknam5) && Objects.equals(opType, that.opType) && Objects.equals(opOrder, that.opOrder) && Objects.equals(payDate, that.payDate) && Objects.equals(payVal, that.payVal) && Objects.equals(sumDeb, that.sumDeb) && Objects.equals(sclientn1, that.sclientn1) && Objects.equals(sclientn2, that.sclientn2) && Objects.equals(sclientn3, that.sclientn3) && Objects.equals(sclientn4, that.sclientn4) && Objects.equals(innDeb, that.innDeb) && Objects.equals(kppDeb, that.kppDeb) && Objects.equals(accDeb, that.accDeb) && Objects.equals(rclientn1, that.rclientn1) && Objects.equals(rclientn2, that.rclientn2) && Objects.equals(rclientn3, that.rclientn3) && Objects.equals(rclientn4, that.rclientn4) && Objects.equals(innCred, that.innCred) && Objects.equals(kppCred, that.kppCred) && Objects.equals(accKr1, that.accKr1) && Objects.equals(specif1, that.specif1) && Objects.equals(sendType, that.sendType) && Objects.equals(docResult, that.docResult) && Objects.equals(docNum, that.docNum) && Objects.equals(docDate, that.docDate) && Objects.equals(valueDate, that.valueDate) && Objects.equals(swiftBen, that.swiftBen) && Objects.equals(swiftInt, that.swiftInt);
}
@Override
public int hashCode() {
return Objects.hash(segType, docType, docnmRef, docnmprev, sbankcode, cAccDeb, sbanknam1, sbanknam2, sbanknam3, sbanknam4, sbanknam5, rbankcode, cAccCred, rbanknam1, rbanknam2, rbanknam3, rbanknam4, rbanknam5, opType, opOrder, payDate, payVal, sumDeb, sclientn1, sclientn2, sclientn3, sclientn4, innDeb, kppDeb, accDeb, rclientn1, rclientn2, rclientn3, rclientn4, innCred, kppCred, accKr1, specif1, sendType, docResult, docNum, docDate, valueDate, swiftBen, swiftInt);
}
@Override
public String toString() {
return "DF55ObjectTag{" +
"segType='" + segType + '\'' +
", docType='" + docType + '\'' +
", docnmRef='" + docnmRef + '\'' +
", docnmprev='" + docnmprev + '\'' +
", sbankcode='" + sbankcode + '\'' +
", cAccDeb='" + cAccDeb + '\'' +
", sbanknam1='" + sbanknam1 + '\'' +
", sbanknam2='" + sbanknam2 + '\'' +
", sbanknam3='" + sbanknam3 + '\'' +
", sbanknam4='" + sbanknam4 + '\'' +
", sbanknam5='" + sbanknam5 + '\'' +
", rbankcode='" + rbankcode + '\'' +
", cAccCred='" + cAccCred + '\'' +
", rbanknam1='" + rbanknam1 + '\'' +
", rbanknam2='" + rbanknam2 + '\'' +
", rbanknam3='" + rbanknam3 + '\'' +
", rbanknam4='" + rbanknam4 + '\'' +
", rbanknam5='" + rbanknam5 + '\'' +
", opType='" + opType + '\'' +
", opOrder='" + opOrder + '\'' +
", payDate=" + payDate +
", payVal='" + payVal + '\'' +
", sumDeb='" + sumDeb + '\'' +
", sclientn1='" + sclientn1 + '\'' +
", sclientn2='" + sclientn2 + '\'' +
", sclientn3='" + sclientn3 + '\'' +
", sclientn4='" + sclientn4 + '\'' +
", innDeb='" + innDeb + '\'' +
", kppDeb='" + kppDeb + '\'' +
", accDeb='" + accDeb + '\'' +
", rclientn1='" + rclientn1 + '\'' +
", rclientn2='" + rclientn2 + '\'' +
", rclientn3='" + rclientn3 + '\'' +
", rclientn4='" + rclientn4 + '\'' +
", innCred='" + innCred + '\'' +
", kppCred='" + kppCred + '\'' +
", accKr1='" + accKr1 + '\'' +
", specif1='" + specif1 + '\'' +
", sendType='" + sendType + '\'' +
", docResult='" + docResult + '\'' +
", docNum='" + docNum + '\'' +
", docDate=" + docDate +
", valueDate=" + valueDate +
", swiftBen='" + swiftBen + '\'' +
", swiftInt='" + swiftInt + '\'' +
'}';
}
}

View file

@ -0,0 +1,583 @@
package ru.spcex.clearing.xml.importer.logic.data.tags.objects;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import java.time.Instant;
import java.time.LocalDate;
import java.util.Objects;
import ru.clearing.classes.statics.data.sdf.SDf57;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.xml.importer.logic.data.enums.ETable;
public class DF57ObjectTag extends ObjectTag<SDf57, DF57ObjectTag> {
private static final String PREFIX = ETable.DF_57.name();
private static final Class<SDf57> CLAZZ = SDf57.class;
private static final String NAME_OF_HZ_MAP = IMDGDistributedNames.Map_SDf57;
@JacksonXmlProperty(isAttribute = true, localName = "ID")
private Long id;
@JacksonXmlProperty(isAttribute = true, localName = "DEAL_DEB")
private String dealDeb;
@JacksonXmlProperty(isAttribute = true, localName = "DEAL_CRED")
private String dealCred;
@JacksonXmlProperty(isAttribute = true, localName = "SBANKCODE")
private String sbankcode;
@JacksonXmlProperty(isAttribute = true, localName = "C_ACC_DEB")
private String cAccDeb;
@JacksonXmlProperty(isAttribute = true, localName = "SBANKNAM")
private String sbanknam1;
private String sbanknam2;
private String sbanknam3;
private String sbanknam4;
private String sbanknam5;
@JacksonXmlProperty(isAttribute = true, localName = "RBANKCODE")
private String rbankcode;
@JacksonXmlProperty(isAttribute = true, localName = "C_ACC_CRED")
private String cAccCred;
@JacksonXmlProperty(isAttribute = true, localName = "RBANKNAM")
private String rbanknam1;
private String rbanknam2;
private String rbanknam3;
private String rbanknam4;
private String rbanknam5;
@JacksonXmlProperty(isAttribute = true, localName = "OP_TYPE")
private String opType;
@JacksonXmlProperty(isAttribute = true, localName = "PAY_DATE")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate payDate;
@JacksonXmlProperty(isAttribute = true, localName = "EXT_DATE")
private Long extDate;
@JacksonXmlProperty(isAttribute = true, localName = "PAY_VAL")
private String payVal;
@JacksonXmlProperty(isAttribute = true, localName = "SUM_DEB")
private String sumDeb;
@JacksonXmlProperty(isAttribute = true, localName = "SCLIENTN")
private String sclientn1;
private String sclientn2;
private String sclientn3;
private String sclientn4;
@JacksonXmlProperty(isAttribute = true, localName = "INN_DEB")
private String innDeb;
@JacksonXmlProperty(isAttribute = true, localName = "KPP_DEB")
private String kppDeb;
@JacksonXmlProperty(isAttribute = true, localName = "ACC_DEB")
private String accDeb;
@JacksonXmlProperty(isAttribute = true, localName = "RCLIENTN")
private String rclientn1;
private String rclientn2;
private String rclientn3;
private String rclientn4;
@JacksonXmlProperty(isAttribute = true, localName = "INN_CRED")
private String innCred;
@JacksonXmlProperty(isAttribute = true, localName = "KPP_CRED")
private String kppCred;
@JacksonXmlProperty(isAttribute = true, localName = "ACC_KR")
private String accKr;
@JacksonXmlProperty(isAttribute = true, localName = "SPECIF")
private String specif;
@JacksonXmlProperty(isAttribute = true, localName = "DOC_NUM")
private String docNum;
@JacksonXmlProperty(isAttribute = true, localName = "DOC_DATE")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate docDate;
@JacksonXmlProperty(isAttribute = true, localName = "DT_IN")
private String dtIn;
@JacksonXmlProperty(isAttribute = true, localName = "KT_IN")
private String ktIn;
@JacksonXmlProperty(isAttribute = true, localName = "DT_OUT")
private String dtOut;
@JacksonXmlProperty(isAttribute = true, localName = "KT_OUT")
private String ktOut;
public DF57ObjectTag() {
super(PREFIX, CLAZZ, NAME_OF_HZ_MAP);
}
@Override
public SDf57 getEntity(DF57ObjectTag entity) {
SDf57 result = new SDf57();
result.setDbfId(entity.getId());
result.setDeal_deb(entity.getDealDeb());
result.setDeal_cred(entity.getDealCred());
result.setSbankcode(entity.getSbankcode());
result.setC_acc_deb(entity.getcAccDeb());
result.setSbanknam1(entity.getSbanknam1());
result.setSbanknam2(entity.getSbanknam2());
result.setSbanknam3(entity.getSbanknam3());
result.setSbanknam4(entity.getSbanknam4());
result.setSbanknam5(entity.getSbanknam5());
result.setRbankcode(entity.getRbankcode());
result.setC_acc_cred(entity.getcAccCred());
result.setRbanknam1(entity.getRbanknam1());
result.setRbanknam2(entity.getRbanknam2());
result.setRbanknam3(entity.getRbanknam3());
result.setRbanknam4(entity.getRbanknam4());
result.setRbanknam5(entity.getRbanknam5());
result.setOp_type(entity.getOpType());
result.setPay_date(entity.getPayDate().toString());
result.setExt_date(entity.getExtDate().toString());
result.setPay_val(entity.getPayVal());
result.setSum_deb(entity.getSumDeb());
result.setSclientn1(entity.getSclientn1());
result.setSclientn2(entity.getSclientn2());
result.setSclientn3(entity.getSclientn3());
result.setSclientn4(entity.getSclientn4());
result.setInn_deb(entity.getInnDeb());
result.setKpp_deb(entity.getKppDeb());
result.setAcc_deb(entity.getAccDeb());
result.setRclientn1(entity.getRclientn1());
result.setRclientn2(entity.getRclientn2());
result.setRclientn3(entity.getRclientn3());
result.setRclientn4(entity.getRclientn4());
result.setInn_cred(entity.getInnDeb());
result.setKpp_cred(entity.getKppDeb());
result.setAcc_kr(entity.getAccKr());
result.setSpecif(entity.getSpecif());
result.setDoc_Num(entity.getDocNum());
result.setDoc_Date(entity.getDocDate().toString());
result.setDt_in(entity.getDtIn());
result.setKt_in(entity.getKtIn());
result.setDt_out(entity.getDtOut());
result.setKt_out(entity.getKtOut());
result.setFileName(filename);
result.setGenerationTime(Instant.now());
result.setGenerationId(fileId);
return result;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getDealDeb() {
return dealDeb;
}
public void setDealDeb(String dealDeb) {
this.dealDeb = dealDeb;
}
public String getDealCred() {
return dealCred;
}
public void setDealCred(String dealCred) {
this.dealCred = dealCred;
}
public String getSbankcode() {
return sbankcode;
}
public void setSbankcode(String sbankcode) {
this.sbankcode = sbankcode;
}
public String getcAccDeb() {
return cAccDeb;
}
public void setcAccDeb(String cAccDeb) {
this.cAccDeb = cAccDeb;
}
public String getSbanknam1() {
return sbanknam1;
}
public void setSbanknam1(String sbanknam1) {
this.sbanknam1 = sbanknam1;
}
public String getSbanknam2() {
return sbanknam2;
}
public void setSbanknam2(String sbanknam2) {
this.sbanknam2 = sbanknam2;
}
public String getSbanknam3() {
return sbanknam3;
}
public void setSbanknam3(String sbanknam3) {
this.sbanknam3 = sbanknam3;
}
public String getSbanknam4() {
return sbanknam4;
}
public void setSbanknam4(String sbanknam4) {
this.sbanknam4 = sbanknam4;
}
public String getSbanknam5() {
return sbanknam5;
}
public void setSbanknam5(String sbanknam5) {
this.sbanknam5 = sbanknam5;
}
public String getRbankcode() {
return rbankcode;
}
public void setRbankcode(String rbankcode) {
this.rbankcode = rbankcode;
}
public String getcAccCred() {
return cAccCred;
}
public void setcAccCred(String cAccCred) {
this.cAccCred = cAccCred;
}
public String getRbanknam1() {
return rbanknam1;
}
public void setRbanknam1(String rbanknam1) {
this.rbanknam1 = rbanknam1;
}
public String getRbanknam2() {
return rbanknam2;
}
public void setRbanknam2(String rbanknam2) {
this.rbanknam2 = rbanknam2;
}
public String getRbanknam3() {
return rbanknam3;
}
public void setRbanknam3(String rbanknam3) {
this.rbanknam3 = rbanknam3;
}
public String getRbanknam4() {
return rbanknam4;
}
public void setRbanknam4(String rbanknam4) {
this.rbanknam4 = rbanknam4;
}
public String getRbanknam5() {
return rbanknam5;
}
public void setRbanknam5(String rbanknam5) {
this.rbanknam5 = rbanknam5;
}
public String getOpType() {
return opType;
}
public void setOpType(String opType) {
this.opType = opType;
}
public LocalDate getPayDate() {
return payDate;
}
public void setPayDate(LocalDate payDate) {
this.payDate = payDate;
}
public Long getExtDate() {
return extDate;
}
public void setExtDate(Long extDate) {
this.extDate = extDate;
}
public String getPayVal() {
return payVal;
}
public void setPayVal(String payVal) {
this.payVal = payVal;
}
public String getSumDeb() {
return sumDeb;
}
public void setSumDeb(String sumDeb) {
this.sumDeb = sumDeb;
}
public String getSclientn1() {
return sclientn1;
}
public void setSclientn1(String sclientn1) {
this.sclientn1 = sclientn1;
}
public String getSclientn2() {
return sclientn2;
}
public void setSclientn2(String sclientn2) {
this.sclientn2 = sclientn2;
}
public String getSclientn3() {
return sclientn3;
}
public void setSclientn3(String sclientn3) {
this.sclientn3 = sclientn3;
}
public String getSclientn4() {
return sclientn4;
}
public void setSclientn4(String sclientn4) {
this.sclientn4 = sclientn4;
}
public String getInnDeb() {
return innDeb;
}
public void setInnDeb(String innDeb) {
this.innDeb = innDeb;
}
public String getKppDeb() {
return kppDeb;
}
public void setKppDeb(String kppDeb) {
this.kppDeb = kppDeb;
}
public String getAccDeb() {
return accDeb;
}
public void setAccDeb(String accDeb) {
this.accDeb = accDeb;
}
public String getRclientn1() {
return rclientn1;
}
public void setRclientn1(String rclientn1) {
this.rclientn1 = rclientn1;
}
public String getRclientn2() {
return rclientn2;
}
public void setRclientn2(String rclientn2) {
this.rclientn2 = rclientn2;
}
public String getRclientn3() {
return rclientn3;
}
public void setRclientn3(String rclientn3) {
this.rclientn3 = rclientn3;
}
public String getRclientn4() {
return rclientn4;
}
public void setRclientn4(String rclientn4) {
this.rclientn4 = rclientn4;
}
public String getInnCred() {
return innCred;
}
public void setInnCred(String innCred) {
this.innCred = innCred;
}
public String getKppCred() {
return kppCred;
}
public void setKppCred(String kppCred) {
this.kppCred = kppCred;
}
public String getAccKr() {
return accKr;
}
public void setAccKr(String accKr) {
this.accKr = accKr;
}
public String getSpecif() {
return specif;
}
public void setSpecif(String specif) {
this.specif = specif;
}
public String getDocNum() {
return docNum;
}
public void setDocNum(String docNum) {
this.docNum = docNum;
}
public LocalDate getDocDate() {
return docDate;
}
public void setDocDate(LocalDate docDate) {
this.docDate = docDate;
}
public String getDtIn() {
return dtIn;
}
public void setDtIn(String dtIn) {
this.dtIn = dtIn;
}
public String getKtIn() {
return ktIn;
}
public void setKtIn(String ktIn) {
this.ktIn = ktIn;
}
public String getDtOut() {
return dtOut;
}
public void setDtOut(String dtOut) {
this.dtOut = dtOut;
}
public String getKtOut() {
return ktOut;
}
public void setKtOut(String ktOut) {
this.ktOut = ktOut;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DF57ObjectTag that = (DF57ObjectTag) o;
return Objects.equals(id, that.id) && Objects.equals(dealDeb, that.dealDeb) && Objects.equals(dealCred, that.dealCred) && Objects.equals(sbankcode, that.sbankcode) && Objects.equals(cAccDeb, that.cAccDeb) && Objects.equals(sbanknam1, that.sbanknam1) && Objects.equals(sbanknam2, that.sbanknam2) && Objects.equals(sbanknam3, that.sbanknam3) && Objects.equals(sbanknam4, that.sbanknam4) && Objects.equals(sbanknam5, that.sbanknam5) && Objects.equals(rbankcode, that.rbankcode) && Objects.equals(cAccCred, that.cAccCred) && Objects.equals(rbanknam1, that.rbanknam1) && Objects.equals(rbanknam2, that.rbanknam2) && Objects.equals(rbanknam3, that.rbanknam3) && Objects.equals(rbanknam4, that.rbanknam4) && Objects.equals(rbanknam5, that.rbanknam5) && Objects.equals(opType, that.opType) && Objects.equals(payDate, that.payDate) && Objects.equals(extDate, that.extDate) && Objects.equals(payVal, that.payVal) && Objects.equals(sumDeb, that.sumDeb) && Objects.equals(sclientn1, that.sclientn1) && Objects.equals(sclientn2, that.sclientn2) && Objects.equals(sclientn3, that.sclientn3) && Objects.equals(sclientn4, that.sclientn4) && Objects.equals(innDeb, that.innDeb) && Objects.equals(kppDeb, that.kppDeb) && Objects.equals(accDeb, that.accDeb) && Objects.equals(rclientn1, that.rclientn1) && Objects.equals(rclientn2, that.rclientn2) && Objects.equals(rclientn3, that.rclientn3) && Objects.equals(rclientn4, that.rclientn4) && Objects.equals(innCred, that.innCred) && Objects.equals(kppCred, that.kppCred) && Objects.equals(accKr, that.accKr) && Objects.equals(specif, that.specif) && Objects.equals(docNum, that.docNum) && Objects.equals(docDate, that.docDate) && Objects.equals(dtIn, that.dtIn) && Objects.equals(ktIn, that.ktIn) && Objects.equals(dtOut, that.dtOut) && Objects.equals(ktOut, that.ktOut);
}
@Override
public int hashCode() {
return Objects.hash(id, dealDeb, dealCred, sbankcode, cAccDeb, sbanknam1, sbanknam2, sbanknam3, sbanknam4, sbanknam5, rbankcode, cAccCred, rbanknam1, rbanknam2, rbanknam3, rbanknam4, rbanknam5, opType, payDate, extDate, payVal, sumDeb, sclientn1, sclientn2, sclientn3, sclientn4, innDeb, kppDeb, accDeb, rclientn1, rclientn2, rclientn3, rclientn4, innCred, kppCred, accKr, specif, docNum, docDate, dtIn, ktIn, dtOut, ktOut);
}
@Override
public String toString() {
return "DF57ObjectTag{" +
"id=" + id +
", dealDeb='" + dealDeb + '\'' +
", dealCred='" + dealCred + '\'' +
", sbankcode='" + sbankcode + '\'' +
", cAccDeb='" + cAccDeb + '\'' +
", sbanknam1='" + sbanknam1 + '\'' +
", sbanknam2='" + sbanknam2 + '\'' +
", sbanknam3='" + sbanknam3 + '\'' +
", sbanknam4='" + sbanknam4 + '\'' +
", sbanknam5='" + sbanknam5 + '\'' +
", rbankcode='" + rbankcode + '\'' +
", cAccCred='" + cAccCred + '\'' +
", rbanknam1='" + rbanknam1 + '\'' +
", rbanknam2='" + rbanknam2 + '\'' +
", rbanknam3='" + rbanknam3 + '\'' +
", rbanknam4='" + rbanknam4 + '\'' +
", rbanknam5='" + rbanknam5 + '\'' +
", opType='" + opType + '\'' +
", payDate=" + payDate +
", extDate=" + extDate +
", payVal='" + payVal + '\'' +
", sumDeb='" + sumDeb + '\'' +
", sclientn1='" + sclientn1 + '\'' +
", sclientn2='" + sclientn2 + '\'' +
", sclientn3='" + sclientn3 + '\'' +
", sclientn4='" + sclientn4 + '\'' +
", innDeb='" + innDeb + '\'' +
", kppDeb='" + kppDeb + '\'' +
", accDeb='" + accDeb + '\'' +
", rclientn1='" + rclientn1 + '\'' +
", rclientn2='" + rclientn2 + '\'' +
", rclientn3='" + rclientn3 + '\'' +
", rclientn4='" + rclientn4 + '\'' +
", innCred='" + innCred + '\'' +
", kppCred='" + kppCred + '\'' +
", accKr='" + accKr + '\'' +
", specif='" + specif + '\'' +
", docNum='" + docNum + '\'' +
", docDate=" + docDate +
", dtIn='" + dtIn + '\'' +
", ktIn='" + ktIn + '\'' +
", dtOut='" + dtOut + '\'' +
", ktOut='" + ktOut + '\'' +
'}';
}
}

View file

@ -0,0 +1,71 @@
package ru.spcex.clearing.xml.importer.logic.data.tags.objects;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.imdg.iml.hazelcast.adapter.ImdgHazelcast;
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION)
@JsonSubTypes({
@JsonSubTypes.Type(DF01ObjectTag.class),
@JsonSubTypes.Type(DF04ObjectTag.class),
@JsonSubTypes.Type(DF06ObjectTag.class),
@JsonSubTypes.Type(DF52ObjectTag.class),
@JsonSubTypes.Type(DF55ObjectTag.class),
@JsonSubTypes.Type(DF57ObjectTag.class)
})
public abstract class ObjectTag<T1 extends SpcexObjectBase, T2 extends ObjectTag<T1, T2>> {
private final String prefix;
private final Class<T1> clazz;
private final String nameOfMap;
protected HazelcastService hazelcastService;
protected ImdgHazelcast<T1> map;
protected String filename;
protected Long fileId;
public ObjectTag(String prefix, Class<T1> clazz, String nameOfMap) {
this.prefix = prefix;
this.clazz = clazz;
this.nameOfMap = nameOfMap;
}
public abstract T1 getEntity(T2 entity);
public void injectEntity(T1 obj) {
if (map == null) {
bootMap();
}
if (checkOnExisting(obj)) {
map.insert(obj);
}
}
protected boolean checkOnExisting(T1 obj){
return true;
}
protected void bootMap() {
map = (ImdgHazelcast<T1>) hazelcastService.getImdg(nameOfMap, clazz);
}
public void setHazelcastService(HazelcastService hazelcastService) {
this.hazelcastService = hazelcastService;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public Long getFileId() {
return fileId;
}
public void setFileId(Long fileId) {
this.fileId = fileId;
}
}

View file

@ -0,0 +1,74 @@
package ru.spcex.clearing.xml.importer.logic.stages;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.time.Instant;
import java.time.format.DateTimeFormatter;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.xml.importer.config.settings.ImportXMLServiceSettings;
import ru.spcex.clearing.xml.importer.logic.data.ResultContainer;
import ru.spcex.clearing.xml.importer.logic.data.enums.StageResult;
import ru.spcex.platform.utils.time.TimeUtil;
@Component
public class ChangeDirOfFileStage extends Stage {
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy.MM.dd HH.mm.ss");
private final ImportXMLServiceSettings settings;
public ChangeDirOfFileStage(ImportXMLServiceSettings settings) {
this.settings = settings;
}
@Override
public boolean skipCompleted() {
return false;
}
@Override
public StageResult process(ResultContainer resultContainer) {
File srcDir = new File(settings.getStore().getSrcDir());
File outDir;
if (resultContainer.getLastStageStatus().equals(StageResult.ERROR)) {
outDir = new File(settings.getStore().getOutDirError());
} else {
outDir = new File(settings.getStore().getOutDir());
}
File xmlFile = resultContainer.getXmlFile();
if (!srcDir.exists()) {
log.error("SettlementHouse_DocIn does not exists!");
return StageResult.ERROR;
}
if (!outDir.exists()) {
log.warn("ouput directory {} does not exists! Trying to made new!", outDir.getAbsolutePath());
if (outDir.mkdir()) {
log.error("Made dir {} successfully!", outDir.getName());
} else {
log.error("SettlementHouse_DocIn does not exists!");
return StageResult.ERROR;
}
}
if (!xmlFile.exists()) {
log.error("XML file to save does not exists!");
return StageResult.ERROR;
}
String newNameOfFile = TimeUtil.formatInstant(Instant.now(), FORMATTER) + '_' + xmlFile.getName();
try {
Files.move(xmlFile.toPath(), outDir.toPath().resolve(newNameOfFile), REPLACE_EXISTING);
} catch (IOException e) {
log.error("Could not move file {}", e.getMessage());
return StageResult.ERROR;
}
if (resultContainer.getLastStageStatus().equals(StageResult.ERROR)) {
return StageResult.ERROR;
} else {
return StageResult.COMPLETE;
}
}
}

View file

@ -0,0 +1,74 @@
package ru.spcex.clearing.xml.importer.logic.stages;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.xml.importer.logic.data.ResultContainer;
import ru.spcex.clearing.xml.importer.logic.data.enums.ETable;
import ru.spcex.clearing.xml.importer.logic.data.enums.StageResult;
import ru.spcex.clearing.xml.importer.logic.data.tags.DocumentTag;
import ru.spcex.clearing.xml.importer.logic.data.tags.objects.ObjectTag;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
import ru.spcex.platform.utils.log.ExceptionUtils;
@Component
public class ImportToDB extends Stage {
private final XmlMapper xmlMapper;
private final HazelcastService hazelcastService;
private final Map<ETable, ObjectTag<? extends SpcexObjectBase, ?>> objectTagMap;
private final XmlImportKafkaMessenger kafkaMessenger;
public ImportToDB(@Qualifier("xmlMapper") XmlMapper xmlMapper,
HazelcastService hazelcastService,
@Qualifier("mapOfTable") Map<ETable, ObjectTag<? extends SpcexObjectBase, ?>> objectTagMap,
XmlImportKafkaMessenger kafkaMessenger) {
this.xmlMapper = xmlMapper;
this.hazelcastService = hazelcastService;
this.objectTagMap = objectTagMap;
this.kafkaMessenger = kafkaMessenger;
}
@Override
public StageResult process(ResultContainer resultContainer) {
ETable currTable = resultContainer.getXmlTable();
File xmlFile = resultContainer.getXmlFile();
DocumentTag documentTag;
try {
documentTag = xmlMapper.readValue(xmlFile, DocumentTag.class);
System.out.println(documentTag);
} catch (IOException e) {
log.error(ExceptionUtils.getStackTrace(e));
kafkaMessenger.notifyUserAboutErrorParsing(e, resultContainer);
return StageResult.ERROR;
}
ObjectTag objectTag = objectTagMap.get(currTable);
objectTag.setHazelcastService(hazelcastService);
objectTag.setFilename(resultContainer.getXmlFile().getName());
Long fileId = hazelcastService.getImdgIdGenerator().nextId();
objectTag.setFileId(fileId);
int i = 0;
for (ObjectTag o : documentTag.getObjects()) {
if (o == null) {
log.warn("record index {} null", i);
i++;
continue;
}
objectTag.injectEntity(objectTag.getEntity(o));
i++;
}
if (ETable.DF_01.equals(currTable)) {
kafkaMessenger.sendPairSdfRequest(objectTag, currTable.getPrefix());
}
kafkaMessenger.notifySystemIfNeeded(currTable, fileId);
kafkaMessenger.notifyUserAboutSuccessLoad(resultContainer);
return StageResult.OK;
}
}

View file

@ -0,0 +1,16 @@
package ru.spcex.clearing.xml.importer.logic.stages;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.spcex.clearing.xml.importer.logic.data.ResultContainer;
import ru.spcex.clearing.xml.importer.logic.data.enums.StageResult;
public abstract class Stage {
protected final Logger log = LoggerFactory.getLogger(getClass());
public abstract StageResult process(ResultContainer resultContainer);
public boolean skipCompleted() {
return true;
}
}

View file

@ -0,0 +1,120 @@
package ru.spcex.clearing.xml.importer.logic.stages;
import static ru.spcex.clearing.platform.messaging.domain.Consts.PAIR_SDF;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Supplier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.Sdf04Request;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.NotificationNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.PairSdfRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.xml.importer.logic.data.ResultContainer;
import ru.spcex.clearing.xml.importer.logic.data.enums.ETable;
import ru.spcex.clearing.xml.importer.logic.data.enums.StageResult;
import ru.spcex.clearing.xml.importer.logic.data.tags.objects.ObjectTag;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.enumeration.ObjectType;
import ru.spcex.platform.enumeration.Priority;
import ru.spcex.platform.enumeration.SdfTable;
@Component
public class XmlImportKafkaMessenger implements InitializingBean {
final Logger log = LoggerFactory.getLogger(getClass());
private final Supplier<KafkaSender> kafka;
private final Map<ETable, Consumer<Long>> messengers;
public XmlImportKafkaMessenger(Supplier<KafkaSender> kafka) {
this.kafka = kafka;
this.messengers = new HashMap<>();
}
@Override
public void afterPropertiesSet() {
messengers.put(ETable.DF_01, groupId -> messageStatement(groupId, SdfTable.SDF_01));
messengers.put(ETable.DF_04, groupId -> messageStatement(groupId, SdfTable.SDF_04));
messengers.put(ETable.DF_06, groupId -> messageStatement(groupId, SdfTable.SDF_06, Consts.STATEMENT_PROCESS_SDF06));
messengers.put(ETable.DF_52, groupId -> messageStatement(groupId, SdfTable.SDF_52, Consts.ACCOUNT_PROCESS_SDF52));
messengers.put(ETable.DF_55, groupId -> messageStatement(groupId, SdfTable.SDF_55));
messengers.put(ETable.DF_57, groupId -> messageStatement(groupId, SdfTable.SDF_57));
}
/**
* отправляет в кафку сообщение, при необходимости
* (обрабатывается, например, в balance-service, clearing-service)
*/
public void notifySystemIfNeeded(ETable table, Long groupId) {
Consumer<Long> messenger = messengers.get(table);
if (messenger != null) {
messenger.accept(groupId);
}
}
public void notifyUserAboutErrorParsing(Throwable error, ResultContainer resultContainer) {
if (resultContainer == null || resultContainer.getXmlFile() == null)
return;
String fileName = resultContainer.getXmlFile().getName();
log.debug("Notify user about error {} \"{}\"",
resultContainer.getXmlTable(), fileName);
sendUserNotification(ObjectType.rgst, String.format("Файл \"%s\" не сохранен", fileName), Priority.HIGH);
}
public void notifyUserAboutSuccessLoad(ResultContainer resultContainer) {
if (ETable.DF_04 == resultContainer.getXmlTable()) {
if (!(StageResult.OK == resultContainer.getLastStageStatus() || StageResult.COMPLETE == resultContainer.getLastStageStatus())) {
return;
}
String fileName = resultContainer.getXmlFile().getName();
log.debug("Notify user about success {} \"{}\"",
resultContainer.getXmlTable(), fileName);
sendUserNotification(ObjectType.rgst, String.format("Загружен \"%s\" - успешно", fileName), Priority.LOW);
}
}
private void sendUserNotification(ObjectType objectType, String comment, Priority priority) {
final String destination = Consts.NOTIFICATION_NEW;
NotificationNewRequest request = new NotificationNewRequest();
request.setObjectType(objectType.getKey());
request.setPriority(priority.getKey());
request.setComment(comment);
log.debug("Send message to kafka \"{}\": {}", destination, LogFormatter.toStringWrapper(request));
Long rKey = kafka.get().sendRequestToQueue(destination, request);
log.trace("For user send message, request id={}", rKey);
}
private void messageStatement(Long groupId, SdfTable table) {
messageStatement(groupId, table, Consts.STATEMENT_PROCESS);
}
private void messageStatement(Long groupId, SdfTable table, String destination) {
StatementRequest statementRequest = new StatementRequest();
statementRequest.setGroupId(groupId);
statementRequest.setTable(table);
Long msgId = kafka.get().sendRequestToQueue(destination, statementRequest);
log.debug("Send StatementRequest({}, {}) message id={} to kafka \"{}\"",
groupId, table, msgId, destination);
}
public void sendPairSdfRequest(ObjectTag<? extends SpcexObjectBase, ?> tag, String tableSdf) {
PairSdfRequest request = new PairSdfRequest();
request.setGenerationId(tag.getFileId());
request.setFileNameSDf(tag.getFilename());
request.setTableSDf(tableSdf);
Long msgId = kafka.get().sendRequestToQueue(PAIR_SDF, request);
log.info("Send PairSdfRequest={} message id={} to kafka \"{}\"", LogFormatter.toString(request), msgId, PAIR_SDF);
}
private void messageDf04(Long groupId) {
Sdf04Request sdf04ImportNotification = new Sdf04Request();
sdf04ImportNotification.setGroupId(groupId);
kafka.get().sendRequestToQueue(Consts.SDF04_PROCESS, sdf04ImportNotification);
}
}

View file

@ -0,0 +1,83 @@
package ru.spcex.clearing.xml.importer.services;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.EnumMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.spcex.clearing.xml.importer.config.SFTPConfig;
import ru.spcex.clearing.xml.importer.config.settings.ImportXMLServiceSettings;
import ru.spcex.clearing.xml.importer.logic.data.enums.ETable;
import ru.spcex.platform.utils.log.ExceptionUtils;
@Service("fileChecker")
public class FileChecker {
private final Logger log = LoggerFactory.getLogger(this.getClass());
private final ImportXMLServiceSettings settings;
private final SFTPConfig.XmlGateway gateway;
public FileChecker(ImportXMLServiceSettings settings, SFTPConfig.XmlGateway gateway) {
this.settings = settings;
this.gateway = gateway;
}
public Map<ETable, List<File>> checkNewFiles(ETable specificTable) {
Map<ETable, List<File>> newFiles = new EnumMap<>(ETable.class);
String srcDir = settings.getStore().getSrcDir();
List<File> xmlFiles = lsXML(srcDir);
if (xmlFiles.isEmpty()) return newFiles;
for (File xmlFile : xmlFiles) {
if (xmlFile.isDirectory()) continue;
ETable currTable = ETable.getTableForFilename(xmlFile.getName());
if (currTable == null) continue;
if (specificTable != null && !specificTable.equals(currTable)) continue;
List<File> currList = newFiles.computeIfAbsent(currTable, list -> new LinkedList<>());
currList.add(xmlFile);
}
return newFiles;
}
private List<File> lsXML(String xmlDirPath) {
List<File> resultFiles = new LinkedList<>();
try (Stream<Path> stream = Files.walk(Paths.get(xmlDirPath))) {
resultFiles = stream
.filter(file -> !Files.isDirectory(file))
.map(Path::toFile)
.filter(file -> file.getName().toLowerCase(Locale.ROOT).endsWith(".xml"))
.sorted(Comparator.comparingLong(File::lastModified))
.collect(Collectors.toList());
} catch (IOException e) {
log.error("Error reading 'service.store.src-dir' : {}", ExceptionUtils.getStackTrace(e));
}
return resultFiles;
}
public void checkAndLoadSFTP() {
if (settings.getStore().getSftpIn().getSftpSrcPayValDir() == null || settings.getStore().getSftpIn().getSftpSrcPayValDir().isEmpty()) {
log.error("No SFTP scanning directories, need will be adding setting like 'import-xml-service.store.sftp-in.sftp-src-pay-val-dir.VAL=/VAL' and restart app");
return;
}
List<File> files = new ArrayList<>();
log.trace("Load from SFTP paths: {}", settings.getStore().getSftpIn().getSftpSrcPayValDir().values());
for (String path : settings.getStore().getSftpIn().getSftpSrcPayValDir().values()) {
files.addAll(gateway.listFiles(path));
}
if (!files.isEmpty()) log.info("Loaded from SFTP files count={}", files.size());
}
}

View file

@ -0,0 +1,136 @@
package ru.spcex.clearing.xml.importer.services;
import java.io.File;
import java.nio.file.Path;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import ru.spcex.clearing.xml.importer.logic.Processor;
import ru.spcex.clearing.xml.importer.logic.data.ResultContainer;
import ru.spcex.clearing.xml.importer.logic.data.enums.ETable;
import ru.spcex.platform.utils.collection.Pair;
@Service("xmlImporterService")
@EnableScheduling
public class XMLImporterService {
private final Logger log = LoggerFactory.getLogger(getClass());
private final FileChecker fileChecker;
private final ThreadPoolTaskExecutor executorService;
private final Processor processor;
private final Set<Path> filesCurrentlyInProcess;
public XMLImporterService(@Qualifier("fileChecker") FileChecker fileChecker,
@Qualifier("executor") ThreadPoolTaskExecutor executorService,
@Qualifier("processor") Processor processor) {
this.fileChecker = fileChecker;
this.executorService = executorService;
this.processor = processor;
this.filesCurrentlyInProcess = new HashSet<>();
}
@Scheduled(cron = "${import-xml-service.scheduler.check-src-dir-cron}")
public void run() {
processTable(null);
}
public void processTable(ETable specificTable) {
if (specificTable == null) {
log.trace("adding import task");
} else {
log.info("adding import task {}", specificTable);
}
//fileChecker.checkAndLoadSFTP();
executorService.execute(() -> {
Map<ETable, List<File>> newFiles = null;
try {
log.trace("checking new files... {}", specificTable != null ? specificTable.name() : "");
newFiles = getFiles(specificTable);
if (!newFiles.isEmpty() && log.isDebugEnabled()) {
log.debug("following files will be processed {}", forLogging(newFiles));
} else if (!newFiles.isEmpty()) {
log.info("following files will be processed {}", forLoggingSizeOnly(newFiles));
} else {
log.trace("no files were found");
}
// Сортировка по возрастанию времени изменения - обрабатывать только в таком порядке
List<Pair<File, ETable>> orderByTimeFiles = new ArrayList<>();
for (Map.Entry<ETable, List<File>> newFilesEntry : newFiles.entrySet()) {
ETable currTable = newFilesEntry.getKey();
List<File> fileList = newFilesEntry.getValue();
for (File xmlFile : fileList) {
orderByTimeFiles.add(new Pair<>(xmlFile, currTable));
}
}
orderByTimeFiles.sort(Comparator.comparingLong(iF -> iF.getFirst().lastModified()));
for (Pair<File, ETable> newFilesEntry : orderByTimeFiles) {
ETable currTable = newFilesEntry.getSecond();
File xmlFile = newFilesEntry.getFirst();
processor.process(ResultContainer.createNewTask(currTable, xmlFile));
}
} finally {
if (newFiles != null && !newFiles.isEmpty()) {
cleanFiles(newFiles);
}
}
});
}
private synchronized Map<ETable, List<File>> getFiles(ETable specificTable) {
Map<ETable, List<File>> newFiles = fileChecker.checkNewFiles(specificTable);
Map<ETable, List<File>> newFilesFiltered = newFiles.entrySet()
.stream()
.map(entry ->
new AbstractMap.SimpleEntry<>(entry.getKey(), entry.getValue()
.stream()
.filter(file -> !filesCurrentlyInProcess.contains(file.toPath()))
.collect(Collectors.toList())))
.collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue));
newFilesFiltered.forEach((table, files)
-> files.forEach(file -> filesCurrentlyInProcess.add(file.toPath())));
return newFilesFiltered;
}
private synchronized void cleanFiles(Map<ETable, List<File>> filesFromTask) {
filesFromTask.forEach((table, files)
-> files.forEach(file -> filesCurrentlyInProcess.remove(file.toPath())));
}
private static String forLogging(Map<ETable, List<File>> files) {
return files
.entrySet()
.stream()
.flatMap((Function<Map.Entry<ETable, List<File>>, Stream<String>>) entry -> {
List<String> r = new LinkedList<>();
for (File file : entry.getValue()) {
r.add(entry.getKey().name() + " " + file.toPath());
}
return r.stream();
})
.collect(Collectors.joining(";", "[", "]"));
}
private static String forLoggingSizeOnly(Map<ETable, List<File>> files) {
return files
.entrySet()
.stream()
.map(entry -> entry.getKey().name() + " " + entry.getValue().size())
.collect(Collectors.joining(";", "[", "]"));
}
}

View file

@ -0,0 +1,43 @@
server.port=8081
server.servlet.context-path=/xml-importer
spring.main.web-application-type=servlet
import-xml-service.scheduler.check-src-dir-cron=* * * * 1 ?
import-xml-service.store.delete-src-files=false
import-xml-service.store.src-dir=/opt/clearing/file/xml-importer/
import-xml-service.store.out-dir=/opt/clearing/file/xml-importer/loaded/
import-xml-service.store.out-dir-error=/opt/clearing/file/xml-importer/error/
import-xml-service.common.encoding-source=cp866
import-xml-service.common.insert-batch-size=100
import-xml-service.common.threads-count=10
#sftpSrcDir
import-xml-service.store.sftp-in.sftp-src-pay-val-dir.rub=clearing_xml-importer_sftp/rub/
import-xml-service.store.sftp-in.sftp-src-pay-val-dir.eur=clearing_xml-importer_sftp/eur/
import-xml-service.store.sftp-in.sftp-src-dir=clearing_xml-importer_sftp
import-xml-service.store.sftp-in.user=user
import-xml-service.store.sftp-in.password=*********
import-xml-service.store.sftp-in.server-ip=127.0.0.1
import-xml-service.store.sftp-in.server-port=22
import-xml-service.hazelcast.cluster-members=10.200.200.181:5701
import-xml-service.hazelcast.login=dev
import-xml-service.hazelcast.password=dev-pass
import-xml-service.kafka-producer.bootstrap-servers=localhost:9092
import-xml-service.kafka-producer.acks=all
import-xml-service.kafka-producer.retries=0
import-xml-service.kafka-producer.batch-size=16384
import-xml-service.kafka-producer.linger-ms=1
import-xml-service.kafka-producer.buffer-memory=33554432
import-xml-service.kafka-consumer.bootstrap-servers=localhost:9092
import-xml-service.kafka-consumer.group-id=dev-group-clearing-service
import-xml-service.kafka-consumer.enable-auto-commit=false
import-xml-service.kafka-consumer.session-timeout-ms=30000
import-xml-service.kafka-consumer.auto-offset-reset=latest
import-xml-service.kafka-consumer.linger-ms=1
import-xml-service.kafka-consumer.buffer-memory=33554432

View file

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_PATH" value="./log" />
<property name="FILE_NAME" value="xml-importer" />
<property name="CONSOLE_LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %class{0}:%line - %message%n" />
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{0}:%msg%n" />
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- |%X{ru.nbch.scoring.web.logging.mdc_key}-->
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<!-- first FILE TEXT appender -->
<appender name="TEXT_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${FILE_NAME}-text.log</file>
<encoder>
<!-- |%X{ru.nbch.scoring.web.logging.mdc_key}-->
<Pattern>${FILE_LOG_PATTERN}</Pattern>
<charset>utf8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${FILE_NAME}-text.%d{yyyy-MM-dd}.%i.gz
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
</rollingPolicy>
</appender>
<!-- second FILE JSON appender -->
<appender name="JSON_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${FILE_NAME}-json.log</file>
<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${FILE_NAME}-json.%d{yyyy-MM-dd}.%i.gz
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="TEXT_FILE"/>
<appender-ref ref="JSON_FILE" />
</root>
<logger name="ru.spcex" level="debug" additivity="false">
<appender-ref ref="TEXT_FILE"/>
<appender-ref ref="JSON_FILE" />
<appender-ref ref="CONSOLE"/>
</logger>
</configuration>