This commit is contained in:
AKurakin 2023-08-10 17:54:01 +03:00
parent 1c1b134edf
commit 51949a281a
5 changed files with 43 additions and 46 deletions

View file

@ -11,6 +11,7 @@ import java.util.UUID;
* Контейнер для передачи результата между стадиями
*/
public class ResultContainer {
private String sourceName; // имя инициатора (файла)
private UUID uuid;
private Table tableForExport;
private File fileForExport;
@ -60,6 +61,14 @@ public class ResultContainer {
this.groupId = groupId;
}
public String getSourceName() {
return sourceName;
}
public void setSourceName(String sourceName) {
this.sourceName = sourceName;
}
public StageResult getLastStageResult() {
return lastStageResult;
}

View file

@ -34,14 +34,19 @@ public enum FilenameTemplate {
.append(".DBF").toString();
}
},
df_section_dateTime_counter_samteDate {
df_section_sameName {
@Override
public String getFileName(ResultContainer resultContainer, List<SftpFileInfo> files) {
return appendSection(resultContainer)
.append(dateTime(resultContainer))
.append(counter(resultContainer, files))
.append(".DBF").toString();
//todo изменить логику для частичного сохранения имени(даты). Будут присылать в месте с generationId имя sourceName
if (resultContainer.getSourceName() == null) {
LoggerFactory.getLogger(getClass()).warn("{} groupId={}, SourceName no set. Do default name as df_section_dateTime_counter.", resultContainer.getTableForExport(), resultContainer.getGroupId());
return df_section_dateTime_counter.getFileName(resultContainer, files);
}
String name = resultContainer.getSourceName();
int i = name.indexOf("_");
if (i < 0) throw new IllegalArgumentException("Unexpected source name (symbol _ not found): " + name);
return outDir + File.separator +
resultContainer.getTableForExport().getFilePrefix().toUpperCase(Locale.ROOT) +
name.substring(i);
}
},
df_section_dateTime_counter_mamberCode {
@ -119,39 +124,6 @@ public enum FilenameTemplate {
return res;
}
protected LocalDate dateFromFilesInDir(String prefixOfTable, List<SftpFileInfo> files) {
final Logger log = LoggerFactory.getLogger(getClass());
HashSet<LocalDate> dates = new HashSet<>();
for (SftpFileInfo file : files) {
if (file.isDirectory()) continue;
String name = file.getFilename();
String[] splitName = name.split("_");
if (splitName.length < 3) {
log.info("Filename did not contains 3 or 4+ separator \"_\": " + name);
continue;
}
String prefix = splitName[0];
String timestamp = splitName[2];
try {
if (timestamp.startsWith("PRC"))
timestamp = timestamp.substring(3);
timestamp = timestamp.substring(0, Math.min(6, timestamp.length()));
LocalDate dt = LocalDate.parse(timestamp, utilFormatter);
dates.add(dt);
} catch (Exception e) {
log.warn("Can not parse timestamp \"{}\" as {}: {}", timestamp, utilFormatter, e.getMessage());
}
}
if (dates.isEmpty()) return null;
if (dates.size() == 1) return dates.iterator().next(); // normal
LocalDate maxDate = dates.stream().max(LocalDate::compareTo).orElse(null);
log.warn("Parsed too many dates: {}; select max {}", dates, maxDate);
return maxDate;
}
private static final DateTimeFormatter tsFormatter = DateTimeFormatter.ofPattern("yyMMddHHmm");
private static final DateTimeFormatter utilFormatter = DateTimeFormatter.ofPattern("yyMMdd");

View file

@ -71,12 +71,12 @@ public class PrepareDBFFile extends Stage implements InitializingBean {
private static final Map<Table, FilenameTemplate> nameTemplates = new EnumMap<>(Table.class);
static {
nameTemplates.put(Table.S_DF02, FilenameTemplate.df_section_dateTime_counter_samteDate);
nameTemplates.put(Table.S_DF02, FilenameTemplate.df_section_sameName);
nameTemplates.put(Table.S_DF03, FilenameTemplate.df_section_dateTime_counter);
nameTemplates.put(Table.S_DF05, FilenameTemplate.df_section_dateTime);
nameTemplates.put(Table.S_DF07, FilenameTemplate.df_section_dateTime_counter);
nameTemplates.put(Table.S_DF07, FilenameTemplate.df_section_sameName);
nameTemplates.put(Table.S_DF51, FilenameTemplate.df_section_dateTime_counter);
nameTemplates.put(Table.S_DF53, FilenameTemplate.df_section_dateTime_counter);
nameTemplates.put(Table.S_DF53, FilenameTemplate.df_section_sameName);
nameTemplates.put(Table.S_DF54, FilenameTemplate.df_section_dateTime_counter);
nameTemplates.put(Table.S_DF56, FilenameTemplate.df_section_dateTime_counter);
}

View file

@ -81,6 +81,7 @@ public class CommandService extends QueueConsumer implements InitializingBean {
}
ResultContainer resultContainer = ResultContainer.createNewTask(tableForExport.get());
resultContainer.setGroupId(request.getSdfGroupId());
resultContainer.setSourceName(request.getFileName());
processor.process(resultContainer);
}
@ -88,6 +89,7 @@ public class CommandService extends QueueConsumer implements InitializingBean {
SdfClearingRequest request = systemRequest.getRequestPayload();
ResultContainer resultContainer = ResultContainer.createNewTask(table);
resultContainer.setGroupId(request.getGroupId());
resultContainer.setSourceName(null);
processor.process(resultContainer);
}
@ -96,6 +98,7 @@ public class CommandService extends QueueConsumer implements InitializingBean {
log.info("RequestId={}, LauncherCommandRequest task={}. Table {}", systemRequest.getId(), request.getTaskName(), table);
ResultContainer resultContainer = ResultContainer.createNewTask(table);
resultContainer.setGroupId(null);
resultContainer.setSourceName(null);
processor.process(resultContainer);
}
}

View file

@ -3,12 +3,16 @@ package ru.spcex.clearing.dbf.exporter.logic.data.enums;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import org.junit.jupiter.api.Test;
import org.springframework.integration.sftp.session.SftpFileInfo;
import ru.spcex.clearing.dbf.exporter.logic.data.ResultContainer;
import ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile;
import java.time.LocalDate;
import java.io.File;
import java.time.LocalDateTime;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.*;
import static ru.spcex.clearing.dbf.exporter.logic.data.enums.FilenameTemplate.df_section_sameName;
class FilenameTemplateTest {
@ -28,13 +32,22 @@ class FilenameTemplateTest {
}
@Test
void dateFromFilesInDir() {
void df_section_sameName() {
LsEntry lsEntry = mock(LsEntry.class);
doReturn("DF-02_S_PRC2305191321_1.DBF").when(lsEntry).getFilename();
SftpFileInfo sftpFileInfo = spy(new SftpFileInfo(lsEntry));
doReturn(false).when(sftpFileInfo).isDirectory();
List<SftpFileInfo> files = List.of(sftpFileInfo);
LocalDate maxDate = FilenameTemplate.df_section_dateTime_counter_samteDate.dateFromFilesInDir("DF-02", files);
assertEquals(LocalDate.of(2023,5,19), maxDate);
ResultContainer resultContainer = ResultContainer.createNewTask(Table.S_DF02);
resultContainer.setGroupId(10L);
resultContainer.setSourceName("DF-01_S_PRC1807230915_1.dbf");
PrepareDBFFile.outDir="TEST_DIR";
String name = df_section_sameName.getFileName(resultContainer, files);
assertEquals("TEST_DIR" + File.separator + "DF-02_S_PRC1807230915_1.dbf", name);
resultContainer.setSourceName(null);
resultContainer.setRegistrationDateTime(LocalDateTime.of(2023,8,10, 17,40,22));
String name2 = df_section_sameName.getFileName(resultContainer, files);
assertEquals("TEST_DIR" + File.separator + "DF-02_S_PRC2308101740_1.DBF", name2);
}
}