diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/StatementService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/StatementService.java index ed22b4a91..d64ec6d0d 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/StatementService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/StatementService.java @@ -139,7 +139,7 @@ public class StatementService extends QueueConsumer implements InitializingBean processSdf01And57(completePairKey.get(), null); return; } - } else if (List.of(SdfTable.SDF_08, SdfTable.SDF_04).contains(table)) { + } else if (List.of(SdfTable.SDF_08, SdfTable.SDF_04, SdfTable.SDF_13).contains(table)) { if (table == SdfTable.SDF_08) { { Long key = completePairKey.get(); @@ -156,6 +156,14 @@ public class StatementService extends QueueConsumer implements InitializingBean pairOfSdfRequest.remove(key); doSomeone = true; } + } else if (table == SdfTable.SDF_13) { + { + Long key = completePairKey.get(); + Pair pair = pairOfSdfRequest.get(key); + processSdf13(pair.getFirst()); + pairOfSdfRequest.remove(key); + doSomeone = true; + } } } if (doSomeone) { @@ -253,7 +261,7 @@ public class StatementService extends QueueConsumer implements InitializingBean private Optional saveRequest(StatementRequest statementRequest) { SdfTable sdfTable = statementRequest.getTable(); //immediately process - if (List.of(SdfTable.SDF_08, SdfTable.SDF_04).contains(sdfTable)) { + if (List.of(SdfTable.SDF_08, SdfTable.SDF_04, SdfTable.SDF_13).contains(sdfTable)) { Long id = imdgProvider.getImdgIdGenerator().nextId(); pairOfSdfRequest.put(id, new Pair<>(statementRequest, null)); return Optional.of(id); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf04Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf04Executor.java index 0957171e4..c302f05c5 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf04Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf04Executor.java @@ -11,6 +11,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.service.AnltSearcher; +import ru.spcex.clearing.service.RegistryManager; import ru.spcex.clearing.service.model.Result; import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; @@ -25,6 +26,7 @@ import java.time.Instant; import java.util.Collection; import java.util.Collections; import java.util.Map; +import java.util.Optional; @Service public class Sdf04Executor extends AbstractExecutor { @@ -36,14 +38,16 @@ public class Sdf04Executor extends AbstractExecutor { private final AnltSearcher anltSearcher; private final IMessageResolver msgRslv; protected final Imdg sessionImdg; + private RegistryManager registryManager; - public Sdf04Executor(ImdgProvider imdgProvider, AnltSearcher anltSearcher, IMessageResolver msgRslv) { + public Sdf04Executor(ImdgProvider imdgProvider, AnltSearcher anltSearcher, IMessageResolver msgRslv, RegistryManager registryManager) { this.imdgProvider = imdgProvider; this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.anltSearcher = anltSearcher; this.msgRslv = msgRslv; + this.registryManager = registryManager; } @Override @@ -96,12 +100,21 @@ public class Sdf04Executor extends AbstractExecutor { } //todo переписать логику поиска на аналогичную по счетам(TRAN) Session activeSession = sessionImdg.getSingleObjectByFieldValues(Map.of("workflowStatus", Status.Active.getKey())); + Instant now = Instant.now(); if (activeSession != null) { Collection registriesByActiveSessionId = selectAMBRegistryBySessionId(activeSession.getId()); registriesByActiveSessionId.stream().filter(registry -> registry.getBalance().compareTo(BigDecimal.ZERO) < 0) .forEach(registry -> { registry.setBalance(BigDecimal.ZERO); - registry.setUpdated(Instant.now()); + Optional registryUnitF = registryManager.findRegByUnit(registry.getCompanyId(), registry.getAccountId(), registry.getContract(), registry, RegistryUnit.F); + Optional registryUnitT = registryManager.findRegByUnit(registry.getCompanyId(), registry.getAccountId(), registry.getContract(), registry, RegistryUnit.T); + if (registryUnitF.isPresent() && registryUnitT.isPresent()) { + registryUnitF.get().setBalance(registryUnitT.get().getBalance().subtract(registry.getBalance())); + registryUnitF.get().setUpdated(now); + registryImdg.update(registryUnitF.get()); + } + + registry.setUpdated(now); registryImdg.update(registry); }); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf13Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf13Executor.java index d88020fca..ac194effb 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf13Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf13Executor.java @@ -10,6 +10,7 @@ import ru.clearing.classes.statics.data.sdf.SDf13; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.clearing.service.RegistryManager; import ru.spcex.clearing.service.model.Result; import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryInstrumentType; @@ -24,6 +25,7 @@ import java.math.BigDecimal; import java.time.Instant; import java.util.Collection; import java.util.Map; +import java.util.Optional; @Service public class Sdf13Executor extends AbstractExecutor { @@ -33,12 +35,13 @@ public class Sdf13Executor extends AbstractExecutor { private final ImdgProvider imdgProvider; private final Imdg registryImdg; protected final Imdg sessionImdg; - - public Sdf13Executor(ImdgProvider imdgProvider) { + protected final RegistryManager registryManager; + public Sdf13Executor(ImdgProvider imdgProvider, RegistryManager registryManager) { this.imdgProvider = imdgProvider; this.sdf12Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf12, SDf12.class); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); + this.registryManager = registryManager; } @Override @@ -59,20 +62,28 @@ public class Sdf13Executor extends AbstractExecutor { Result result = new Result(); Long generationIdForGroup = imdgProvider.getImdgIdGenerator().nextId(); result.setGenerationId(generationIdForGroup); - for (SDf13 sdf13 : sdf) { - //обычно мы ищем по группу sdf04, здесь как будто всегда только одна запись, todo нужно прочекать этот момент - SDf12 sDf12 = selectSdf12bySdf13(sdf13); - log.debug("Process sdf13 record; sdf13.id: {}", sdf13.getId()); - Collection registries = selectRegistryForSDF12(sDf12.getDepoCodeSender(), sDf12.getSecurityCode()); - registries.forEach(registry -> unlockRegistry(registry, new BigDecimal(sDf12.getQuantity()))); - } +// for (SDf13 sdf13 : sdf) { +// //обычно мы ищем по группу sdf04, здесь как будто всегда только одна запись, todo нужно прочекать этот момент +// SDf12 sDf12 = selectSdf12bySdf13(sdf13); +// log.debug("Process sdf13 record; sdf13.id: {}", sdf13.getId()); +// Collection registries = selectRegistryForSDF12(sDf12.getDepoCodeSender(), sDf12.getSecurityCode()); +// registries.forEach(registry -> unlockRegistry(registry, new BigDecimal(sDf12.getQuantity()))); +// } Session activeSession = sessionImdg.getSingleObjectByFieldValues(Map.of("workflowStatus", Status.Active.getKey())); + Instant now = Instant.now(); if (activeSession != null) { Collection registriesByActiveSessionId = selectASBRegistryBySessionId(activeSession.getId()); - registriesByActiveSessionId.stream().filter(registry -> registry.getBalance().compareTo(BigDecimal.ZERO) < 0) + registriesByActiveSessionId .forEach(registry -> { registry.setBalance(BigDecimal.ZERO); - registry.setUpdated(Instant.now()); + Optional registryUnitF = registryManager.findRegByUnit(registry.getCompanyId(), registry.getAccountId(), registry.getContract(), registry, RegistryUnit.F); + Optional registryUnitT = registryManager.findRegByUnit(registry.getCompanyId(), registry.getAccountId(), registry.getContract(), registry, RegistryUnit.T); + if (registryUnitF.isPresent() && registryUnitT.isPresent()) { + registryUnitF.get().setBalance(registryUnitT.get().getBalance().subtract(registry.getBalance())); + registryUnitF.get().setUpdated(now); + registryImdg.update(registryUnitF.get()); + } + registry.setUpdated(now); registryImdg.update(registry); }); }