ialbert 2026-06-23 16:33:02 +03:00
parent bfba880629
commit b3f56db198
3 changed files with 84 additions and 19 deletions

View file

@ -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<SpcexObjectBase> imdg = imdgPr.getImdg(resultContainer.getTableForExport().getHazelcastMapName(), SpcexObjectBase.class);
ImdgPredicateBuilder pb = imdg.predicateBuilder();
Collection<SpcexObjectBase> 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<SftpFileInfo> files) {
@ -126,4 +150,12 @@ public enum FilenameTemplate {
public String getFileName(ResultContainer resultContainer, List<SftpFileInfo> files) {
return null;
}
public String getFileName(ResultContainer resultContainer, ImdgProviderThreadSafeWrapper provider) {
return null;
}
public boolean needSftpFiles() {
return true;
}
}

View file

@ -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<String, Imdg<?>> cash = new ConcurrentHashMap<>();
private final ImdgProvider imdgProvider;
public ImdgProviderThreadSafeWrapper(ImdgProvider imdgProvider) {
this.imdgProvider = imdgProvider;
}
public <T extends SpcexObjectBase> Imdg<T> getImdg(String mapName, Class<T> clazz) {
return (Imdg<T>)
cash.computeIfAbsent(mapName, (k) -> imdgProvider.getImdg(k, clazz));
}
}

View file

@ -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<SftpFileInfo> 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);
}
}