diff --git a/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/AmatAmafChecker.java b/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/AmatAmafChecker.java index 9f38f7fbd..2a82d8f5a 100644 --- a/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/AmatAmafChecker.java +++ b/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/AmatAmafChecker.java @@ -122,13 +122,18 @@ public class AmatAmafChecker extends QueueConsumer implements InitializingBean { Collection otherRegistry = registryImdg.getCollectionObjectsByPredicate(predicate); log.trace("For Registry.id={} found {} other Registry's by query {}", am_tId, otherRegistry.size(), predicate); for (Registry otherReg : otherRegistry) { - if (!am_tId.equals(otherReg.getId())) + if (!am_tId.equals(otherReg.getId())) { // always true - предикат выше отфильтрует checkRegistries.add(am_tRegistry); + } } } } timer = System.currentTimeMillis() - timer; log.debug("Select {} Registry and hi's pairs by ID collection. Time {} ms.", checkRegistries.size(), timer); + if (log.isTraceEnabled()) + log.trace("Selected registries id: {}", + checkRegistries.stream().map(o->String.valueOf(o.getId())) + .collect(Collectors.joining(","))); } // Сверка Registry @@ -174,11 +179,18 @@ public class AmatAmafChecker extends QueueConsumer implements InitializingBean { BigDecimal am_tSumm = BigDecimal.ZERO; BigDecimal am_fSumm = BigDecimal.ZERO; for (Registry r : group.getValue()) { + short accumulated=0; if (match(RegistryTradingParams.AM_T, r)) { am_tSumm = am_tSumm.add(BigDecimalUtil.safeBD(r.getBalance())); + accumulated++; } if (match(RegistryTradingParams.AM_F, r)) { am_fSumm = am_fSumm.add(BigDecimalUtil.safeBD(r.getBalance())); + accumulated++; + } + if (accumulated != 1) { + log.warn("Registry {id={}, RegistryCode={}, balance={}} Not match for AM_T/AM_F pattern:", + r.getId(), r.getRegistryCode(), r.getBalance()); } } log.trace("Group {} size of {} item: AM_T summ={}, AM_F summ={}", @@ -194,6 +206,11 @@ public class AmatAmafChecker extends QueueConsumer implements InitializingBean { am_tSumm.subtract(am_fSumm) ); resultMismatch.add(describe); + log.info("Balance not match (am_tSumm={}, am_fSumm={}) in register group: {}", am_tSumm, am_fSumm, + group.getValue().stream() + .map(r->String.format("id=%d accountType=%s registryCode=%s balance=%s", + r.getId(), r.getAccountType(), r.getRegistryCode(), r.getBalance())) + .collect(Collectors.joining("; "))); } } log.debug("Check result: equalsCount = {}, mismatchCount = {}", equalsCount, mismatchCount); diff --git a/clearing-parent/utility-service/src/test/java/ru/spcex/clearing/utility/service/AmatAmafCheckerTest.java b/clearing-parent/utility-service/src/test/java/ru/spcex/clearing/utility/service/AmatAmafCheckerTest.java index c41feb424..0c8a9598e 100644 --- a/clearing-parent/utility-service/src/test/java/ru/spcex/clearing/utility/service/AmatAmafCheckerTest.java +++ b/clearing-parent/utility-service/src/test/java/ru/spcex/clearing/utility/service/AmatAmafCheckerTest.java @@ -6,10 +6,7 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; -import ru.spcex.platform.enumeration.RegistryDesignation; -import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryTradingParams; -import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.imdg.api.ImdgProvider; import java.math.BigDecimal; @@ -21,9 +18,10 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.*; class AmatAmafCheckerTest { + ImdgProvider imdgProvider; AmatAmafChecker instance() { - ImdgProvider imdgProvider = Mockito.mock(ImdgProvider.class); + imdgProvider = Mockito.mock(ImdgProvider.class); KafkaSender kafkaSender = Mockito.mock(KafkaSender.class); Producer kafkaProducer = Mockito.mock(Producer.class); Consumer kafkaQueue = Mockito.mock(Consumer.class); @@ -31,7 +29,7 @@ class AmatAmafCheckerTest { } @Test - void checkOnDate() { + void checkRegisters() { AmatAmafChecker checker = instance(); List regSrc = new ArrayList<>(); @@ -90,6 +88,137 @@ class AmatAmafCheckerTest { LocalDateTime.of(2025, 5, 5, 12, 37, 56), errors)); } + @Test + void checkRegisters2() { + AmatAmafChecker checker = instance(); + + List regSrc = new ArrayList<>(); + + { + Registry reg = new Registry(); + reg.setId(842446L); + reg.setAccountType("ANLT"); + reg.setRegistryDesignation("A"); + reg.setRegistryInstrumentType("M"); + reg.setRegistryCapacity("A"); + reg.setRegistryUnit("T"); + reg.setRegistryCode("AMAT"); + reg.setAccount("30414810200000000600"); + reg.setTradingClearingRegistryId(null); + reg.setTradingClearingRegistry(null); + reg.setSecuritySymbol("RUB"); + reg.setBalance(new BigDecimal("233184292.440000000000000000")); + reg.setPlanBalance(new BigDecimal("233084283.440000000000000000")); + reg.setBalanceDimension("MONY"); + regSrc.add(reg); + } + + { + Registry reg = new Registry(); + reg.setId(61100000L); + reg.setAccountType("INFO"); + reg.setRegistryDesignation("A"); + reg.setRegistryInstrumentType("M"); + reg.setRegistryCapacity("A"); + reg.setRegistryUnit("T"); + reg.setRegistryCode("AMAT"); + reg.setAccount("39911810000000950600"); + reg.setTradingClearingRegistryId(61010036L); + reg.setTradingClearingRegistry("0620CAV00001"); + reg.setSecuritySymbol("RUB"); + reg.setBalance(new BigDecimal("-5351624.2534567800000")); + reg.setPlanBalance(new BigDecimal("-5351630.253456780000000000")); + reg.setBalanceDimension("MONY"); + regSrc.add(reg); + } + { + Registry reg = new Registry(); + reg.setId(61100002L); + reg.setAccountType("INFO"); + reg.setRegistryDesignation("A"); + reg.setRegistryInstrumentType("M"); + reg.setRegistryCapacity("A"); + reg.setRegistryUnit("F"); + reg.setRegistryCode("AMAF"); + reg.setAccount("39911810000000950600"); + reg.setTradingClearingRegistryId(61010036L); + reg.setTradingClearingRegistry("0620CAV00001"); + reg.setSecuritySymbol("RUB"); + reg.setBalance(new BigDecimal("-5351624.25345678000000000")); + reg.setPlanBalance(new BigDecimal("0.000000000000000000")); + reg.setBalanceDimension("MONY"); + regSrc.add(reg); + } + + { + Registry reg = new Registry(); + reg.setId(61100005L); + reg.setAccountType("INFO"); + reg.setRegistryDesignation("A"); + reg.setRegistryInstrumentType("M"); + reg.setRegistryCapacity("A"); + reg.setRegistryUnit("F"); + reg.setRegistryCode("AMAF"); + reg.setAccount("39911156000000250600"); + reg.setTradingClearingRegistryId(61010036L); + reg.setTradingClearingRegistry("0620CAV00001"); + reg.setSecuritySymbol("CNY"); + reg.setBalance(new BigDecimal("207568.000000000000000000")); + reg.setPlanBalance(new BigDecimal("0.000000000000000000")); + reg.setBalanceDimension("MONY"); + regSrc.add(reg); + } + { + Registry reg = new Registry(); + reg.setId(61100003L); + reg.setAccountType("INFO"); + reg.setRegistryDesignation("A"); + reg.setRegistryInstrumentType("M"); + reg.setRegistryCapacity("A"); + reg.setRegistryUnit("T"); + reg.setRegistryCode("AMAT"); + reg.setAccount("39911156000000250600"); + reg.setTradingClearingRegistryId(61010036L); + reg.setTradingClearingRegistry("0620CAV00001"); + reg.setSecuritySymbol("CNY"); + reg.setBalance(new BigDecimal("208246.000000000000000000")); + reg.setPlanBalance(new BigDecimal("208246.000000000000000000")); + reg.setBalanceDimension("MONY"); + regSrc.add(reg); + } + { + Registry reg = new Registry(); + reg.setId(61530046L); + reg.setAccountType("INFO"); + reg.setRegistryDesignation("A"); + reg.setRegistryInstrumentType("M"); + reg.setRegistryCapacity("A"); + reg.setRegistryUnit("T"); + reg.setRegistryCode("AMAT"); + reg.setAccount("39911156000000250600"); + reg.setTradingClearingRegistryId(61010036L); + reg.setTradingClearingRegistry("0620CAV00001"); + reg.setSecuritySymbol("BYN"); + reg.setBalance(new BigDecimal("95.000000000000000000")); + reg.setPlanBalance(new BigDecimal("95.000000000000000000")); + reg.setBalanceDimension("MONY"); + regSrc.add(reg); + } // 61530048 + + + // All OK + List errors = checker.checkRegisters(regSrc); +// assertEquals(2, errors.size()); + + assertEquals("Проведена сверка по регистрам AMAT/AMAF.\n" + + "2025.05.05 12:37:56.\n" + + "Результат сверки: по ТКР 0620CAV00001 выявлено расхождение на регистрах AMAT/AMAF по CNY на сумму 678.000000000000000000;" + + " по ТКР 0620CAV00001 выявлено расхождение на регистрах AMAT/AMAF по BYN на сумму 95.000000000000000000;" + + " по ТКР null выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму 233184292.440000000000000000.", + checker.makeErrorMessage( + LocalDateTime.of(2025, 5, 5, 12, 37, 56), errors)); + } + @Test void makeSuccessMessage() { AmatAmafChecker checker = instance(); diff --git a/clearing-parent/utility-service/src/test/resources/logback-test.xml b/clearing-parent/utility-service/src/test/resources/logback-test.xml new file mode 100644 index 000000000..424fd8603 --- /dev/null +++ b/clearing-parent/utility-service/src/test/resources/logback-test.xml @@ -0,0 +1,56 @@ + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + ${LOG_PATH}/${FILE_NAME}-text.log + + + ${FILE_LOG_PATTERN} + utf8 + + + ${LOG_PATH}/${FILE_NAME}-text.%d{yyyy-MM-dd}.%i.gz + + + 100MB + + 10 + + + + + ${LOG_PATH}/${FILE_NAME}-json.log + + + ${LOG_PATH}/${FILE_NAME}-json.%d{yyyy-MM-dd}.%i.gz + + + 100MB + + 10 + + + + + + + + + + + + + + +