From d4142e3b037a19016842ca1676f9defc2720e016 Mon Sep 17 00:00:00 2001 From: psemenkov Date: Wed, 9 Aug 2023 16:03:24 +0300 Subject: [PATCH] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-467=20?= =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B7=D0=B0=D0=B3?= =?UTF-8?q?=D1=80=D1=83=D0=B7=D0=BA=D1=83=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=94=D0=A4-20.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../importer/config/SWTImporterConfig.java | 1 + .../swt/importer/logic/data/enums/ETable.java | 2 +- .../logic/data/tables/SDf20Table.java | 39 +++++++ .../logic/stages/SWTImportKafkaMessenger.java | 1 + .../importer/readers/AbstractTemplate.java | 5 + .../swt/importer/readers/SWTReader.java | 1 + .../readers/template/SDf20Template.java | 102 ++++++++++++++++++ .../importer/config/ImportSWTServiceTest.java | 1 + .../files/RDC_KS_DF-20_230717163911161.txt | 16 +++ .../importer/logic/stages/ImportToDBTest.java | 14 ++- .../spcex/platform/enumeration/SdfTable.java | 1 + 11 files changed, 180 insertions(+), 3 deletions(-) create mode 100644 clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/logic/data/tables/SDf20Table.java create mode 100644 clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/readers/template/SDf20Template.java create mode 100644 clearing-parent/swt-importer/src/test/java/ru/spcex/clearing/swt/importer/files/RDC_KS_DF-20_230717163911161.txt diff --git a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/config/SWTImporterConfig.java b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/config/SWTImporterConfig.java index 392ab4cf8..b08aed04d 100644 --- a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/config/SWTImporterConfig.java +++ b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/config/SWTImporterConfig.java @@ -57,6 +57,7 @@ public class SWTImporterConfig { map.put(ETable.S_DF_08, new SDf08Table()); map.put(ETable.S_DF_10, new SDf10Table()); map.put(ETable.S_DF_13, new SDf13Table()); + map.put(ETable.S_DF_20, new SDf20Table()); map.put(ETable.S_DF_21, new SDf21Table()); return map; } diff --git a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/logic/data/enums/ETable.java b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/logic/data/enums/ETable.java index 9279bf25a..3788b39c7 100644 --- a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/logic/data/enums/ETable.java +++ b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/logic/data/enums/ETable.java @@ -4,8 +4,8 @@ public enum ETable { S_DF_08("DF-08"), S_DF_10("DF-10"), S_DF_13("DF-13"), + S_DF_20("DF-20"), S_DF_21("DF-21"); - //S_DF20("DF-20"); private final String prefix; diff --git a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/logic/data/tables/SDf20Table.java b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/logic/data/tables/SDf20Table.java new file mode 100644 index 000000000..9b62a4b7e --- /dev/null +++ b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/logic/data/tables/SDf20Table.java @@ -0,0 +1,39 @@ +package ru.spcex.clearing.swt.importer.logic.data.tables; + +import ru.clearing.classes.statics.data.sdf.SDf20; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.swt.importer.logic.data.enums.ETable; +import ru.spcex.clearing.swt.importer.readers.SWTRecord; + +import java.time.Instant; + +public class SDf20Table extends AbstractTable { + + private static final String PREFIX = ETable.S_DF_20.name(); + private static final Class CLAZZ = SDf20.class; + private static final String NAME_OF_HZ_MAP = IMDGDistributedNames.Map_SDf20; + + public SDf20Table() { + super(PREFIX, CLAZZ, NAME_OF_HZ_MAP); + } + + @Override + public SDf20 getEntity(SWTRecord record) { + SDf20 result = new SDf20(); + result.setOutDocument(record.getValFor20Tag()); + result.setInDocument(record.getValFor21Tag()); + result.setSecurity(record.getValFor35BTag()[0]); + result.setOpenBalance(record.getValFor60ATag()); + result.setDepoCodeCl(record.getValFor83DTag()[0]); + result.setQuantity(record.getValFor35ATag()); + result.setOperationCode(record.getValFor66ATag()); + result.setDepoCodeCorr(record.getValFor87DTag()); + result.setOperationDate(record.getValFor30Tag()); + result.setCloseBalance(record.getValFor62ATag()); + result.setFileName(filename); + result.setGenerationTime(Instant.now()); + result.setGenerationId(fileId); + return result; + } + +} \ No newline at end of file diff --git a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/logic/stages/SWTImportKafkaMessenger.java b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/logic/stages/SWTImportKafkaMessenger.java index 0e5f6ef81..f3d575196 100644 --- a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/logic/stages/SWTImportKafkaMessenger.java +++ b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/logic/stages/SWTImportKafkaMessenger.java @@ -31,6 +31,7 @@ public class SWTImportKafkaMessenger implements InitializingBean { messengers.put(ETable.S_DF_08, groupId -> messageBalance(groupId, SdfTable.SDF_08)); messengers.put(ETable.S_DF_10, groupId -> messageBalance(groupId, SdfTable.SDF_10)); messengers.put(ETable.S_DF_13, groupId -> messageBalance(groupId, SdfTable.SDF_13)); + messengers.put(ETable.S_DF_20, groupId -> messageBalance(groupId, SdfTable.SDF_20)); messengers.put(ETable.S_DF_21, groupId -> messageBalance(groupId, SdfTable.SDF_21)); } diff --git a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/readers/AbstractTemplate.java b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/readers/AbstractTemplate.java index 319d23345..adf206e96 100644 --- a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/readers/AbstractTemplate.java +++ b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/readers/AbstractTemplate.java @@ -3,6 +3,7 @@ package ru.spcex.clearing.swt.importer.readers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.spcex.clearing.swt.importer.logic.data.enums.ReadingPatterns; +import ru.spcex.clearing.swt.importer.readers.template.SDf20Template; import ru.spcex.clearing.swt.importer.readers.template.SDf21Template; import java.util.List; @@ -54,4 +55,8 @@ public abstract class AbstractTemplate { public static AbstractTemplate getSDf21Template(Scanner scanner){ return new SDf21Template(scanner); } + + public static AbstractTemplate getSDf20Template(Scanner scanner){ + return new SDf20Template(scanner); + } } diff --git a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/readers/SWTReader.java b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/readers/SWTReader.java index 42c806fee..a9417b76a 100644 --- a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/readers/SWTReader.java +++ b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/readers/SWTReader.java @@ -28,6 +28,7 @@ public class SWTReader implements Closeable { recordEnds.put(ETable.S_DF_08, ReadingPatterns.TableRow); recordEnds.put(ETable.S_DF_10, ReadingPatterns.TableRow); recordEnds.put(ETable.S_DF_13, ReadingPatterns.Tag77A); + templates.put(ETable.S_DF_20, AbstractTemplate::getSDf20Template); templates.put(ETable.S_DF_21, AbstractTemplate::getSDf21Template); } diff --git a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/readers/template/SDf20Template.java b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/readers/template/SDf20Template.java new file mode 100644 index 000000000..8e142a54b --- /dev/null +++ b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/readers/template/SDf20Template.java @@ -0,0 +1,102 @@ +package ru.spcex.clearing.swt.importer.readers.template; + +import ru.spcex.clearing.swt.importer.logic.data.enums.ReadingPatterns; +import ru.spcex.clearing.swt.importer.readers.AbstractTemplate; +import ru.spcex.clearing.swt.importer.readers.SWTRecord; +import ru.spcex.clearing.swt.importer.readers.ValidationResult; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +import static ru.spcex.clearing.swt.importer.logic.data.enums.ReadingPatterns.*; +import static ru.spcex.clearing.swt.importer.readers.ValidationResult.SUCSESS; + +public class SDf20Template extends AbstractTemplate { + private List hederPatterns = List.of( + To, + From, + Type, + DateTime, + Tag20, + Tag21, + Tag35B, + Tag60A, + Tag83D, + Tag20C, + Tag35A, + Tag23, + Tag66A, + Tag87D, + Tag30, + Tag62A); + + private List groupRecords = new ArrayList<>(); + + private String line = ""; + + public SDf20Template(Scanner scanner) { + super(scanner); + } + + @Override + protected List getGroupRecords() { + return groupRecords; + } + + @Override + public ValidationResult readAndValidate() { + SWTRecord currentRecord = new SWTRecord(); + currentRecord.setNotEmpty(false); + ReadingPatterns currentPattern; + boolean hederEnded = false; + boolean recordEmpty = true; + ValidationResult result = prepareNextLine(this::setLine); + if (!SUCSESS.equals(result)) return result; + for (int i = 0; i < hederPatterns.size() && !isReadEnded(); i++) { + currentPattern = hederPatterns.get(i); + if (currentPattern.canRead(line)) { + currentPattern.reed(line, currentRecord); + currentRecord.setNotEmpty(true); + if (Tag21.equals(currentPattern)) { + hederEnded = true; + } else if (Tag35B.equals(currentPattern)) { + recordEmpty = false; + } else if (Tag62A.equals(currentPattern)) { + groupRecords.add(currentRecord); + setReadEnded(true); + return SUCSESS; + } + result = prepareNextLine(this::setLine); + if (!SUCSESS.equals(result)) { + if (hederEnded && recordEmpty) { + setReadEnded(true); + return SUCSESS; + } else { + return result; + } + } + } else { + result = checkNotValue(line, "required teg: " + currentPattern.name() + ", but was: "); + if (!SUCSESS.equals(result)) return result; + result = prepareNextLine(this::setLine); + if (!SUCSESS.equals(result)) { + if (hederEnded && recordEmpty) { + setReadEnded(true); + return SUCSESS; + } else { + return result; + } + } + i--; + } + } + if (!recordEmpty) groupRecords.add(currentRecord); + setReadEnded(true); + return SUCSESS; + } + + public void setLine(String line) { + this.line = line; + } +} diff --git a/clearing-parent/swt-importer/src/test/java/ru/spcex/clearing/swt/importer/config/ImportSWTServiceTest.java b/clearing-parent/swt-importer/src/test/java/ru/spcex/clearing/swt/importer/config/ImportSWTServiceTest.java index 552e75ba1..493047c13 100644 --- a/clearing-parent/swt-importer/src/test/java/ru/spcex/clearing/swt/importer/config/ImportSWTServiceTest.java +++ b/clearing-parent/swt-importer/src/test/java/ru/spcex/clearing/swt/importer/config/ImportSWTServiceTest.java @@ -30,6 +30,7 @@ public class ImportSWTServiceTest { map.put(ETable.S_DF_08, new SDf08Table()); map.put(ETable.S_DF_10, new SDf10Table()); map.put(ETable.S_DF_13, new SDf13Table()); + map.put(ETable.S_DF_20, new SDf20Table()); map.put(ETable.S_DF_21, new SDf21Table()); return map; } diff --git a/clearing-parent/swt-importer/src/test/java/ru/spcex/clearing/swt/importer/files/RDC_KS_DF-20_230717163911161.txt b/clearing-parent/swt-importer/src/test/java/ru/spcex/clearing/swt/importer/files/RDC_KS_DF-20_230717163911161.txt new file mode 100644 index 000000000..69af698f2 --- /dev/null +++ b/clearing-parent/swt-importer/src/test/java/ru/spcex/clearing/swt/importer/files/RDC_KS_DF-20_230717163911161.txt @@ -0,0 +1,16 @@ +To:SPCE +From:CSO +Type:512 +Date/Time:20230717/1639 +:20:SPCEX_20230717Q8712-512 +:21:NONREF +:35B:ISIN MFBEL-BV-08:Республика Беларусь:облигации +:60A:SHS0, +:83D:747200000AT0:ПАО "Промсвязьбанк" +:20C:Поручение XXX202304061703 от 2023-04-06 +:35A:SHS100000, +:23:8712 +:66A:RECFREE +:87D:747288887ZT0 +:30:20230406 +:62A:SHS9900000, \ No newline at end of file diff --git a/clearing-parent/swt-importer/src/test/java/ru/spcex/clearing/swt/importer/logic/stages/ImportToDBTest.java b/clearing-parent/swt-importer/src/test/java/ru/spcex/clearing/swt/importer/logic/stages/ImportToDBTest.java index 837b6732b..7c645faf4 100644 --- a/clearing-parent/swt-importer/src/test/java/ru/spcex/clearing/swt/importer/logic/stages/ImportToDBTest.java +++ b/clearing-parent/swt-importer/src/test/java/ru/spcex/clearing/swt/importer/logic/stages/ImportToDBTest.java @@ -7,6 +7,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.sdf.SDf10; import ru.clearing.classes.statics.data.sdf.SDf13; +import ru.clearing.classes.statics.data.sdf.SDf20; import ru.clearing.classes.statics.data.sdf.SDf21; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.swt.importer.config.ImportSWTServiceTest; @@ -49,11 +50,20 @@ class ImportToDBTest { } // @Test void process() throws IOException { - ETable eTable = ETable.S_DF_21; - File swtFile = new File("D:\\repo\\mfd\\clearing\\clearing-parent\\swt-importer\\src\\test\\java\\ru\\spcex\\clearing\\swt\\importer\\files\\RDC_KS_DF-21_230717164021676.txt"); + ETable eTable = ETable.S_DF_20; + File swtFile = new File("D:\\repo\\mfd\\clearing\\clearing-parent\\swt-importer\\src\\test\\java\\ru\\spcex\\clearing\\swt\\importer\\files\\RDC_KS_DF-20_230717163911161.txt"); ResultContainer resultContainer = createNewTask(eTable, swtFile); resultContainer.setSwtSource(Files.readAllBytes(Paths.get(swtFile.getAbsolutePath()))); + importToDB.process(resultContainer); + Imdg df20Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf20, SDf20.class); + df20Imdg.getAllValues(); + + eTable = ETable.S_DF_21; + swtFile = new File("D:\\repo\\mfd\\clearing\\clearing-parent\\swt-importer\\src\\test\\java\\ru\\spcex\\clearing\\swt\\importer\\files\\RDC_KS_DF-21_230717164021676.txt"); + resultContainer = createNewTask(eTable, swtFile); + resultContainer.setSwtSource(Files.readAllBytes(Paths.get(swtFile.getAbsolutePath()))); + importToDB.process(resultContainer); Imdg df21Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf21, SDf21.class); df21Imdg.getAllValues(); diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SdfTable.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SdfTable.java index e83326702..3a7ede09f 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SdfTable.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SdfTable.java @@ -13,6 +13,7 @@ public enum SdfTable implements IEnumKey { SDF_12("SDF_12"), SDF_13("SDF_13"), SDF_16("SDF_16"), + SDF_20("SDF_20"), SDF_21("SDF_21"), SDF_57("SDF_57");