diff --git a/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/ExportFromHazelcast.java b/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/ExportFromHazelcast.java index db11b0543..c1111881e 100644 --- a/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/ExportFromHazelcast.java +++ b/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/ExportFromHazelcast.java @@ -1,8 +1,5 @@ package ru.spcex.clearing.xml.exporter.logic.stages; -import static ru.spcex.clearing.platform.messaging.domain.Consts.PAIR_SDF; -import static ru.spcex.clearing.xml.exporter.logic.data.tags.objects.ObjectTag.ruCurrency; - import java.io.File; import java.time.LocalDate; import java.time.LocalTime; @@ -12,11 +9,21 @@ import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Function; import java.util.function.Supplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; +import ru.clearing.classes.statics.data.sdf.SDf01; +import ru.clearing.classes.statics.data.sdf.SDf02; +import ru.clearing.classes.statics.data.sdf.SDf06; +import ru.clearing.classes.statics.data.sdf.SDf07; +import ru.clearing.classes.statics.data.sdf.SDf52; +import ru.clearing.classes.statics.data.sdf.SDf53; +import ru.clearing.classes.statics.data.sdf.WithMessageId; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import static ru.spcex.clearing.platform.messaging.domain.Consts.PAIR_SDF; 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; @@ -28,6 +35,7 @@ import ru.spcex.clearing.xml.exporter.logic.data.enums.Table; import ru.spcex.clearing.xml.exporter.logic.data.tags.DocumentTag; import ru.spcex.clearing.xml.exporter.logic.data.tags.ParentDocTag; import ru.spcex.clearing.xml.exporter.logic.data.tags.objects.ObjectTag; +import static ru.spcex.clearing.xml.exporter.logic.data.tags.objects.ObjectTag.ruCurrency; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.imdg.api.Imdg; @@ -42,6 +50,10 @@ public class ExportFromHazelcast { private final Supplier kafkaSender; private final ExportXMLServiceSettings settings; + private final Imdg sDf01Imdg; + private final Imdg sDf52Imdg; + private final Imdg sDf06Imdg; + public ExportFromHazelcast(ImdgProvider imdgProvider, SFTPConfig.XmlGateway gateway, @Qualifier("mapOfTable") Map> objectTagMap, @@ -52,6 +64,10 @@ public class ExportFromHazelcast { this.objectTagMap = objectTagMap; this.kafkaSender = kafkaSender; this.settings = settings; + + this.sDf01Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf01, SDf01.class); + this.sDf52Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf52, SDf52.class); + this.sDf06Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf06, SDf06.class); } public StageResult process(ResultContainer resultContainer) { @@ -61,9 +77,7 @@ public class ExportFromHazelcast { DocumentTag documentTag = new DocumentTag(); ParentDocTag parentDocTag = new ParentDocTag(); - parentDocTag.setParentId(""); - // todo: Добавить данные DocumentTag'а - documentTag.setMessageId(""); + documentTag.setMessageId(String.valueOf(resultContainer.getGroupId())); documentTag.setMessageType(table.getFilePrefix().replace("-", "")); documentTag.setMessageName(""); documentTag.setMessageDate(LocalDate.now()); @@ -94,6 +108,16 @@ public class ExportFromHazelcast { ((ArrayList) tableRows).sort(Comparator.comparing(SpcexObjectBase::getId)); } + for (SpcexObjectBase s : tableRows) { + if (s instanceof SDf02 sDf02) { + patchDocumentTag(documentTag, sDf02.getInSDfId(), sDf01Imdg, SDf01::getMessageId); + } else if (s instanceof SDf53 sDf53) { + patchDocumentTag(documentTag, sDf53.getInSDfId(), sDf52Imdg, SDf52::getMessageId); + } else if (s instanceof SDf07 sDf07) { + patchDocumentTag(documentTag, sDf07.getInSDfId(), sDf06Imdg, SDf06::getMessageId); + } + } + documentTag.setObjects(addObjectTags(tableRows, table)); resultContainer.setDocumentTag(documentTag); @@ -135,6 +159,23 @@ public class ExportFromHazelcast { return result; } + private void patchDocumentTag(DocumentTag documentTag, Long inSdfId, Imdg mapWithInSdf, Function messageIdGetter) { + T inSdf = mapWithInSdf.getSingleObjectByID(inSdfId); + if (inSdf instanceof WithMessageId withMessageId) { + if (documentTag.getParentDoc().getParentId() == null) { + documentTag.getParentDoc().setParentId(withMessageId.getMessageId()); + } else if (!documentTag.getParentDoc().getParentId().equalsIgnoreCase(withMessageId.getMessageId())) { + log.warn( + "Different messageId (for batch {}, current {}), skip", + documentTag.getParentDoc().getParentId(), + withMessageId.getMessageId() + ); + } else { + documentTag.getParentDoc().setParentId(withMessageId.getMessageId()); + } + } + } + private void sendPairSdfRequest(ResultContainer resultContainer) { PairSdfRequest request = new PairSdfRequest(); request.setGenerationId(resultContainer.getGroupId()); diff --git a/clearing-parent/xml-exporter/src/test/java/ru/spcex/clearing/xml/exporter/logic/stages/ExportFromHazelcastTest.java b/clearing-parent/xml-exporter/src/test/java/ru/spcex/clearing/xml/exporter/logic/stages/ExportFromHazelcastTest.java index be0282fb5..2092ae22e 100644 --- a/clearing-parent/xml-exporter/src/test/java/ru/spcex/clearing/xml/exporter/logic/stages/ExportFromHazelcastTest.java +++ b/clearing-parent/xml-exporter/src/test/java/ru/spcex/clearing/xml/exporter/logic/stages/ExportFromHazelcastTest.java @@ -24,11 +24,14 @@ import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; +import ru.clearing.classes.statics.data.sdf.SDf01; import ru.clearing.classes.statics.data.sdf.SDf02; import ru.clearing.classes.statics.data.sdf.SDf03; import ru.clearing.classes.statics.data.sdf.SDf05; +import ru.clearing.classes.statics.data.sdf.SDf06; import ru.clearing.classes.statics.data.sdf.SDf07; import ru.clearing.classes.statics.data.sdf.SDf51; +import ru.clearing.classes.statics.data.sdf.SDf52; import ru.clearing.classes.statics.data.sdf.SDf53; import ru.clearing.classes.statics.data.sdf.SDf54; import ru.clearing.classes.statics.data.sdf.SDf56; @@ -93,6 +96,7 @@ class ExportFromHazelcastTest { @Test void process_shouldExportSDf02ToObjectTag() { SDf02 expectedSDf02 = new SDf02(); + expectedSDf02.setGenerationId(1777L); expectedSDf02.setCurr_code("test1"); expectedSDf02.setAccount("test2"); expectedSDf02.setRemainder("test3"); @@ -106,16 +110,26 @@ class ExportFromHazelcastTest { expectedSDf02.setSumunblock("test10"); expectedSDf02.setFile_type("test11"); expectedSDf02.setResult("test12"); + expectedSDf02.setInSDfId((long) "inSDf02Id".hashCode()); Imdg imdg = hazelcastService.getImdg(IMDGDistributedNames.Map_SDf02, SDf02.class); imdg.insert(expectedSDf02); + SDf01 forParentId = new SDf01(); + forParentId.setId(expectedSDf02.getInSDfId()); + forParentId.setMessageId("007"); + Imdg sDf01Imdg = hazelcastService.getImdg(IMDGDistributedNames.Map_SDf01, SDf01.class); + sDf01Imdg.insert(forParentId); + ResultContainer actualResultContainer = new ResultContainer(Table.S_DF02); + actualResultContainer.setGroupId(1777L); actualResultContainer.setFileForExport(new File("./src/test/resources/xml/DF-02_S_PRC1604240915_1.xml")); StageResult stageResult = exportFromHazelcast.process(actualResultContainer); DF02ObjectTag actualObjectTag = (DF02ObjectTag) actualResultContainer.getDocumentTag().getObjects().get(0); + Assertions.assertThat("1777").isEqualTo(actualResultContainer.getDocumentTag().getMessageId()); + Assertions.assertThat("007").isEqualTo(actualResultContainer.getDocumentTag().getParentDoc().getParentId()); Assertions.assertThat(stageResult).isEqualTo(StageResult.OK); Assertions.assertThat(actualResultContainer.getDocumentTag().getMessageType()).isEqualTo("DF02"); Assertions.assertThat(actualObjectTag.getCurrCode()).isEqualTo(expectedSDf02.getCurr_code()); @@ -203,6 +217,8 @@ class ExportFromHazelcastTest { @Test void process_shouldExportSDf07ToObjectTag() { SDf07 expectedSDf07 = new SDf07(); + expectedSDf07.setGenerationId(Long.valueOf(3775)); + expectedSDf07.setInSDfId((long) "inSDf07Id".hashCode()); expectedSDf07.setAccount("test1"); expectedSDf07.setSum(new BigDecimal(BigInteger.TEN)); expectedSDf07.setMarket("test3"); @@ -220,12 +236,21 @@ class ExportFromHazelcastTest { Imdg imdg = hazelcastService.getImdg(IMDGDistributedNames.Map_SDf07, SDf07.class); imdg.insert(expectedSDf07); + SDf06 forParentId = new SDf06(); + forParentId.setId(expectedSDf07.getInSDfId()); + forParentId.setMessageId("005"); + Imdg sDf06Imdg = hazelcastService.getImdg(IMDGDistributedNames.Map_SDf06, SDf06.class); + sDf06Imdg.insert(forParentId); + ResultContainer actualResultContainer = new ResultContainer(Table.S_DF07); + actualResultContainer.setGroupId(3775L); actualResultContainer.setFileForExport(new File("./src/test/resources/xml/DF-07_S_PRC1604240915_1.xml")); StageResult stageResult = exportFromHazelcast.process(actualResultContainer); DF07ObjectTag actualObjectTag = (DF07ObjectTag) actualResultContainer.getDocumentTag().getObjects().get(0); + Assertions.assertThat("3775").isEqualTo(actualResultContainer.getDocumentTag().getMessageId()); + Assertions.assertThat("005").isEqualTo(actualResultContainer.getDocumentTag().getParentDoc().getParentId()); Assertions.assertThat(stageResult).isEqualTo(StageResult.OK); Assertions.assertThat(actualResultContainer.getDocumentTag().getMessageType()).isEqualTo("DF07"); Assertions.assertThat(actualObjectTag.getAccount()).isEqualTo(expectedSDf07.getAccount()); @@ -268,6 +293,8 @@ class ExportFromHazelcastTest { @Test void process_shouldExportSDf53ToObjectTag() { SDf53 expectedSDf53 = new SDf53(); + expectedSDf53.setGenerationId(2776L); + expectedSDf53.setInSDfId((long) "inSDf53Id".hashCode()); expectedSDf53.setAccount("test1"); expectedSDf53.setAccName("test2"); expectedSDf53.setDeal("test3"); @@ -279,12 +306,21 @@ class ExportFromHazelcastTest { Imdg imdg = hazelcastService.getImdg(IMDGDistributedNames.Map_SDf53, SDf53.class); imdg.insert(expectedSDf53); + SDf52 forParentId = new SDf52(); + forParentId.setId(expectedSDf53.getInSDfId()); + forParentId.setMessageId("006"); + Imdg sDf52Imdg = hazelcastService.getImdg(IMDGDistributedNames.Map_SDf52, SDf52.class); + sDf52Imdg.insert(forParentId); + ResultContainer actualResultContainer = new ResultContainer(Table.S_DF53); + actualResultContainer.setGroupId(2776L); actualResultContainer.setFileForExport(new File("./src/test/resources/xml/DF-53_S_PRC1604240915_1.xml")); StageResult stageResult = exportFromHazelcast.process(actualResultContainer); DF53ObjectTag actualObjectTag = (DF53ObjectTag) actualResultContainer.getDocumentTag().getObjects().get(0); + Assertions.assertThat("2776").isEqualTo(actualResultContainer.getDocumentTag().getMessageId()); + Assertions.assertThat("006").isEqualTo(actualResultContainer.getDocumentTag().getParentDoc().getParentId()); Assertions.assertThat(stageResult).isEqualTo(StageResult.OK); Assertions.assertThat(actualResultContainer.getDocumentTag().getMessageType()).isEqualTo("DF53"); Assertions.assertThat(actualObjectTag.getAccount()).isEqualTo(expectedSDf53.getAccount()); diff --git a/clearing-parent/xml-importer/src/main/java/ru/spcex/clearing/xml/importer/logic/steps/ImportToDB.java b/clearing-parent/xml-importer/src/main/java/ru/spcex/clearing/xml/importer/logic/steps/ImportToDB.java index 17aaa19ea..3089dcd5f 100644 --- a/clearing-parent/xml-importer/src/main/java/ru/spcex/clearing/xml/importer/logic/steps/ImportToDB.java +++ b/clearing-parent/xml-importer/src/main/java/ru/spcex/clearing/xml/importer/logic/steps/ImportToDB.java @@ -5,6 +5,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.sdf.SDf57; +import ru.clearing.classes.statics.data.sdf.WithMessageId; +import ru.clearing.classes.statics.data.sdf.WithParentId; import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewRequest; import ru.spcex.clearing.xml.importer.logic.data.ResultContainer; import ru.spcex.clearing.xml.importer.logic.data.enums.ETable; @@ -58,6 +60,12 @@ public class ImportToDB { "Номер транзакции " + ((SDf57) entityTable).getDbfId() + " в полученном df57 уже был обработан ранее", Priority.HIGH); } else { + if (entityTable instanceof WithParentId withParentId && documentTag.getParentDoc() != null) { + withParentId.setParentId(documentTag.getParentDoc().getParentId()); + } + if (entityTable instanceof WithMessageId withMessageId) { + withMessageId.setMessageId(documentTag.getMessageId()); + } o.injectEntity(entityTable); } }