From b3f56db198a598a691489e42897d207c3c3809fe Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 23 Jun 2026 16:33:02 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-1055 --- .../logic/data/enums/FilenameTemplate.java | 36 +++++++++++++- .../enums/ImdgProviderThreadSafeWrapper.java | 20 ++++++++ .../exporter/logic/stages/PrepareXMLFile.java | 47 ++++++++++++------- 3 files changed, 84 insertions(+), 19 deletions(-) create mode 100644 clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/data/enums/ImdgProviderThreadSafeWrapper.java diff --git a/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/data/enums/FilenameTemplate.java b/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/data/enums/FilenameTemplate.java index 7d415ea43..0e103518c 100644 --- a/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/data/enums/FilenameTemplate.java +++ b/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/data/enums/FilenameTemplate.java @@ -1,16 +1,21 @@ package ru.spcex.clearing.xml.exporter.logic.data.enums; -import static ru.spcex.clearing.xml.exporter.logic.stages.PrepareXMLFile.outDir; - import java.io.File; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.Collection; import java.util.List; import java.util.Locale; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.integration.sftp.session.SftpFileInfo; import ru.spcex.clearing.xml.exporter.logic.data.ResultContainer; +import static ru.spcex.clearing.xml.exporter.logic.stages.PrepareXMLFile.outDir; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.utils.time.TimeUtil; public enum FilenameTemplate { df_section_dateTime { @@ -30,6 +35,25 @@ public enum FilenameTemplate { .append(".XML").toString(); } }, + df_section_dateTime_counter_with_generation_time { + @Override + public boolean needSftpFiles() { + return false; + } + + @Override + public String getFileName(ResultContainer resultContainer, ImdgProviderThreadSafeWrapper imdgPr) { + Imdg imdg = imdgPr.getImdg(resultContainer.getTableForExport().getHazelcastMapName(), SpcexObjectBase.class); + ImdgPredicateBuilder pb = imdg.predicateBuilder(); + Collection sdfs = imdg.getCollectionObjectsByPredicate( + pb.greatEqual("generationTime", TimeUtil.localDateToInstant(LocalDate.now())) + ); + return appendSection(resultContainer) + .append(dateTime(resultContainer)) + .append("_").append(sdfs.size() + 1) + .append(".XML").toString(); + } + }, df_section_sameName { @Override public String getFileName(ResultContainer resultContainer, List files) { @@ -126,4 +150,12 @@ public enum FilenameTemplate { public String getFileName(ResultContainer resultContainer, List files) { return null; } + + public String getFileName(ResultContainer resultContainer, ImdgProviderThreadSafeWrapper provider) { + return null; + } + + public boolean needSftpFiles() { + return true; + } } diff --git a/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/data/enums/ImdgProviderThreadSafeWrapper.java b/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/data/enums/ImdgProviderThreadSafeWrapper.java new file mode 100644 index 000000000..f3da87c08 --- /dev/null +++ b/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/data/enums/ImdgProviderThreadSafeWrapper.java @@ -0,0 +1,20 @@ +package ru.spcex.clearing.xml.exporter.logic.data.enums; + +import java.util.concurrent.ConcurrentHashMap; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +public final class ImdgProviderThreadSafeWrapper { + private final ConcurrentHashMap> cash = new ConcurrentHashMap<>(); + private final ImdgProvider imdgProvider; + + public ImdgProviderThreadSafeWrapper(ImdgProvider imdgProvider) { + this.imdgProvider = imdgProvider; + } + + public Imdg getImdg(String mapName, Class clazz) { + return (Imdg) + cash.computeIfAbsent(mapName, (k) -> imdgProvider.getImdg(k, clazz)); + } +} diff --git a/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/PrepareXMLFile.java b/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/PrepareXMLFile.java index fb13a3889..8812fab6f 100644 --- a/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/PrepareXMLFile.java +++ b/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/PrepareXMLFile.java @@ -20,8 +20,10 @@ import ru.spcex.clearing.xml.exporter.config.SFTPConfig; import ru.spcex.clearing.xml.exporter.config.settings.ExportXMLServiceSettings; import ru.spcex.clearing.xml.exporter.logic.data.ResultContainer; import ru.spcex.clearing.xml.exporter.logic.data.enums.FilenameTemplate; +import ru.spcex.clearing.xml.exporter.logic.data.enums.ImdgProviderThreadSafeWrapper; import ru.spcex.clearing.xml.exporter.logic.data.enums.StageResult; import ru.spcex.clearing.xml.exporter.logic.data.enums.Table; +import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.log.ExceptionUtils; @Component @@ -32,11 +34,14 @@ public class PrepareXMLFile implements InitializingBean { private final ExportXMLServiceSettings settings; public static String outDir; private final SFTPConfig.XmlGateway gateway; + private final ImdgProviderThreadSafeWrapper imdgProviderWrapper; - public PrepareXMLFile(ExportXMLServiceSettings settings, + public PrepareXMLFile(ImdgProvider imdgProvider, + ExportXMLServiceSettings settings, SFTPConfig.XmlGateway gateway) { this.settings = settings; this.gateway = gateway; + this.imdgProviderWrapper = new ImdgProviderThreadSafeWrapper(imdgProvider); } public StageResult process(ResultContainer resultContainer) { @@ -46,26 +51,34 @@ public class PrepareXMLFile implements InitializingBean { log.error("No SFTP scanning directories, need will be adding settings like 'export-xml-service.store.out-pay-val-dir.RUB=/RUB' and restart app"); return StageResult.ERROR; } - boolean sftpConnectionError = false; List files = new ArrayList<>(); - log.trace("Get files from SFTP paths: {}", settings.getStore().getOutPayValDir().values()); - for (String path : settings.getStore().getOutPayValDir().values()) { - if (!path.endsWith("/")) path += "/"; - try { - files.addAll(gateway.listFiles(path)); - } catch (Exception e) { - log.error("SFTP connection error: {}", ExceptionUtils.getStackTrace(e)); - sftpConnectionError = true; - files = new ArrayList<>(); - break; - } - } - log.info("There are {} files on the sFTP server in the search directories.", files.size()); + boolean sftpConnectionError = false; Table table = resultContainer.getTableForExport(); + FilenameTemplate template = nameTemplates.get(table); + if (template.needSftpFiles()) { + log.trace("Get files from SFTP paths: {}", settings.getStore().getOutPayValDir().values()); + for (String path : settings.getStore().getOutPayValDir().values()) { + if (!path.endsWith("/")) path += "/"; + try { + files.addAll(gateway.listFiles(path)); + } catch (Exception e) { + log.error("SFTP connection error: {}", ExceptionUtils.getStackTrace(e)); + sftpConnectionError = true; + files = new ArrayList<>(); + break; + } + } + log.info("There are {} files on the sFTP server in the search directories.", files.size()); + } LocalDateTime currentDateTime = LocalDateTime.now(); resultContainer.setRegistrationDateTime(currentDateTime); - File xmlFile = new File(nameTemplates.get(table).getFileName(resultContainer, files)); + File xmlFile; + if (template.needSftpFiles()) { + xmlFile = new File(template.getFileName(resultContainer, files)); + } else { + xmlFile = new File(template.getFileName(resultContainer, imdgProviderWrapper)); + } if (sftpConnectionError) { String errorFileName = "error_%s_%s".formatted(LocalDateTime.now().format(FORMATTER), xmlFile.getName()); xmlFile = xmlFile.getParentFile().getAbsoluteFile().toPath().resolve(errorFileName).toFile(); @@ -108,7 +121,7 @@ public class PrepareXMLFile implements InitializingBean { nameTemplates.put(Table.S_DF07, FilenameTemplate.df_section_sameName); // df_section_sameName nameTemplates.put(Table.S_DF51, FilenameTemplate.df_section_dateTime_counter); nameTemplates.put(Table.S_DF53, FilenameTemplate.df_section_sameName); // df_section_sameName - nameTemplates.put(Table.S_DF54, FilenameTemplate.df_section_dateTime_counter); + nameTemplates.put(Table.S_DF54, FilenameTemplate.df_section_dateTime_counter_with_generation_time); nameTemplates.put(Table.S_DF56, FilenameTemplate.df_section_dateTime_counter); } }