From 79b65e00236374e3d382dd4e9af2287df6dc01ab Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 31 Jul 2023 15:38:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20sdf04=20=D0=B8=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20balance=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/executors/Sdf04Executor.java | 49 ++++++++++++++++--- .../stage/SecondaryAuctionT0Session.java | 1 + .../impl/FormingPaymentInstructionAssets.java | 12 ++--- .../stage/impl/InspectionObligations.java | 8 ++- .../stage/task/InspectionPoolPayload.java | 9 ++++ 5 files changed, 65 insertions(+), 14 deletions(-) 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 f90ca833e..42d6f5ad1 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 @@ -4,6 +4,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.sdf.SDf04; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -11,10 +12,7 @@ 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.model.Result; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.RegistryDesignation; -import ru.spcex.platform.enumeration.RegistryInstrumentType; -import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; @@ -26,6 +24,7 @@ import java.math.BigDecimal; import java.time.Instant; import java.util.Collection; import java.util.Collections; +import java.util.Map; @Service public class Sdf04Executor extends AbstractExecutor { @@ -36,11 +35,13 @@ public class Sdf04Executor extends AbstractExecutor { private final Imdg accountImdg; private final AnltSearcher anltSearcher; private final IMessageResolver msgRslv; + protected final Imdg sessionImdg; public Sdf04Executor(ImdgProvider imdgProvider, AnltSearcher anltSearcher, IMessageResolver msgRslv) { 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; } @@ -69,11 +70,20 @@ public class Sdf04Executor extends AbstractExecutor { Collection registries; Account anltAcc = accountImdg.getFirstObjectBySQL("account = '%s' and accountType = '%s'" .formatted(sdf04.getC_acc_deb(), AccountType.Anlt.getKey())); - //если сдф04 не по аналитическому счету, выбираем по тому c_acc_deb что пришло +// Account tranAcc = accountImdg.getFirstObjectBySQL("account = '%s' and accountType = '%s'" +// .formatted(sdf04.getC_acc_cred(), AccountType.Tran.getKey())); +// //если сдф04 не по аналитическому счету ни по tran счету, выбираем по тому c_acc_deb/c_acc_cred что пришло +// boolean isAnltAcc = anltAcc != null; +// boolean isTranAcc = tranAcc != null; +// if (isAnltAcc && isTranAcc) { +// log.warn("Found ANLT and TRAN acc by sdf04.id: {}", sdf04.getId()); +// } if (anltAcc == null) { registries = selectRegistryForSDF04(sdf04.getC_acc_deb()); +// String acc = anltAcc == null ? sdf04.getC_acc_deb() : sdf04.getC_acc_cred(); +// registries = selectRegistryForSDF04(acc); } else { - //в сдф04 указан ANLT счет, ищем по контракту + //в сдф04 указан ANLT или TRAN счет, ищем по контракту AnltSearcher.AnltSearch anltSearch = anltSearcher.loadByAnlt(sdf04.getSpecif_1()); if (!anltSearch.isFound()) { log.error("sdf04.id={} search by specif1 failed {}", sdf04.getId(), msgRslv.resolve(anltSearch.getError())); @@ -84,6 +94,18 @@ public class Sdf04Executor extends AbstractExecutor { } registries.forEach(registry -> unlockRegistry(registry, parseString(sdf04.getSum_deb()))); } + //todo переписать логику поиска на аналогичную по счетам(TRAN) + Session activeSession = sessionImdg.getSingleObjectByFieldValues(Map.of("workflowStatus", Status.Active.getKey())); + if (activeSession != null) { + Collection registriesByActiveSessionId = selectABRegistryBySessionId(activeSession.getId()); + registriesByActiveSessionId.stream().filter(registry -> registry.getBalance().compareTo(BigDecimal.ZERO) < 0) + .forEach(registry -> { + registry.setBalance(BigDecimal.ZERO); + registry.setUpdated(Instant.now()); + registryImdg.update(registry); + }); + } + return result; } @@ -103,6 +125,21 @@ public class Sdf04Executor extends AbstractExecutor { return result; } + protected Collection selectABRegistryBySessionId(Long sessionId) { + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + ImdgPredicate query = pb.and( + pb.and( + pb.equals("registryDesignation", RegistryDesignation.A.getKey()), + pb.equals("registryUnit", RegistryUnit.B.getKey()) + ), + pb.equals("sessionId", sessionId) + ); + + Collection result = registryImdg.getCollectionObjectsByPredicate(query); + log.trace("Selected {} registry's by sql: {}", result.size(), query); + return result; + } + boolean unlockRegistry(Registry registry, BigDecimal value) { if (registry.getBalance() == null) registry.setBalance(BigDecimal.ZERO); registry.setBalance(registry.getBalance().subtract(value)); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SecondaryAuctionT0Session.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SecondaryAuctionT0Session.java index 664b8e1e1..2e3c2340f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SecondaryAuctionT0Session.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SecondaryAuctionT0Session.java @@ -146,6 +146,7 @@ public class SecondaryAuctionT0Session extends AbstractSession implements Initia //stage 5 { InspectionPoolPayload companyIdPayload = new InspectionPoolPayload(); + companyIdPayload.setSessionId(currSession.getId()); companyIdPayload.setProcessedCompanyId(currSession.getCompanyId()); runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligations); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java index 405fe9367..d6797f9a2 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java @@ -165,7 +165,7 @@ public class FormingPaymentInstructionAssets implements ISessionStage { amount = registry.getBalance() == null ? null : registry.getBalance().abs(); Optional payerAmtO = rgsMng.findRelatedAsset(registry.getTradingClearingRegistryId(), registry.getCompanyId(), AM_T); payerAmtO.ifPresent(amt -> { - amt.setSettledDebit(safeBD(amt.getSettledDebit()).subtract(safeBD(registry.getBalance()))); + amt.setSettledDebit(safeBD(amt.getSettledDebit()).add(safeBD(registry.getBalance().abs()))); setUpdatedStoreInImdg(amt, now); }); } else { @@ -173,10 +173,10 @@ public class FormingPaymentInstructionAssets implements ISessionStage { addresseeId = registry.getCompanyId(); debitLegAccount = counterAcc; creditLegAccount = tranAcc; - amount = registry.getBalance() == null ? null : registry.getBalance().abs().negate(); + amount = registry.getBalance() == null ? null : registry.getBalance().abs(); Optional payerAmtO = rgsMng.findRelatedAsset(registry.getTradingClearingRegistryId(), registry.getCompanyId(), AM_T); payerAmtO.ifPresent(amt -> { - amt.setSettledCredit(safeBD(amt.getSettledCredit()).add(safeBD(registry.getBalance()))); + amt.setSettledCredit(safeBD(amt.getSettledCredit()).add(safeBD(registry.getBalance().abs()))); setUpdatedStoreInImdg(amt, now); }); } @@ -225,7 +225,7 @@ public class FormingPaymentInstructionAssets implements ISessionStage { amount = registry.getBalance() == null ? null : registry.getBalance().abs(); Optional payerAstO = rgsMng.findRelatedAsset(registry.getTradingClearingRegistryId(), registry.getCompanyId(), AS_T); payerAstO.ifPresent(amt -> { - amt.setSettledDebit(safeBD(amt.getSettledDebit()).subtract(safeBD(registry.getBalance()))); + amt.setSettledDebit(safeBD(amt.getSettledDebit()).add(safeBD(registry.getBalance().abs()))); setUpdatedStoreInImdg(amt, now); }); } else { @@ -233,10 +233,10 @@ public class FormingPaymentInstructionAssets implements ISessionStage { addresseeId = registry.getCompanyId(); debitLegAccount = counterAcc; creditLegAccount = dtrnAcc; - amount = registry.getBalance() == null ? null : registry.getBalance().abs().negate(); + amount = registry.getBalance() == null ? null : registry.getBalance().abs(); Optional payerAstO = rgsMng.findRelatedAsset(registry.getTradingClearingRegistryId(), registry.getCompanyId(), AS_T); payerAstO.ifPresent(amt -> { - amt.setSettledCredit(safeBD(amt.getSettledCredit()).add(safeBD(registry.getBalance()))); + amt.setSettledCredit(safeBD(amt.getSettledCredit()).add(safeBD(registry.getBalance().abs()))); setUpdatedStoreInImdg(amt, now); }); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java index aa6907134..b95f057fe 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java @@ -13,6 +13,7 @@ import ru.spcex.clearing.service.RegistryManager; import ru.spcex.clearing.session.stage.ISessionStage; import ru.spcex.clearing.session.stage.StageResult; import ru.spcex.clearing.session.stage.Task; +import ru.spcex.clearing.session.stage.task.InspectionPoolPayload; import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -58,15 +59,16 @@ public class InspectionObligations implements ISessionStage { @Override public StageResult submit(Task task) { + InspectionPoolPayload payload = (InspectionPoolPayload) task.getData(); switch (task.getTaskType()) { case InspectionObligations -> { - return inspectionObligations(); + return inspectionObligations(payload.getSessionId()); } default -> throw new IllegalStateException("Unknown task type: " + task.getTaskType()); } } - private StageResult inspectionObligations() { + private StageResult inspectionObligations(Long sessionId) { String sqlCondition = String.format("(%s) and registryStatus = '%s'", RegistryCodeSqlBuilder.getInstance(OS_T, OM_T, TS_T, TM_T).build(), RegistryStatus.POOL.getKey()); @@ -124,6 +126,7 @@ public class InspectionObligations implements ISessionStage { } else if (IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.T) { blockedRegistry.setBalance(blockedRegistry.getBalance().subtract(registry.getBalance())); } + blockedRegistry.setSessionId(sessionId); blockedRegistry.setUpdated(now); registryImdg.update(blockedRegistry); } else if (section != null && section == Section.FOND && @@ -136,6 +139,7 @@ public class InspectionObligations implements ISessionStage { } else if (IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.T) { blockedRegistry.setBalance(blockedRegistry.getBalance().subtract(registry.getBalance())); } + blockedRegistry.setSessionId(sessionId); blockedRegistry.setUpdated(now); registryImdg.update(blockedRegistry); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/InspectionPoolPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/InspectionPoolPayload.java index 66736d104..10b836e9f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/InspectionPoolPayload.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/InspectionPoolPayload.java @@ -2,6 +2,15 @@ package ru.spcex.clearing.session.stage.task; public class InspectionPoolPayload { private Long processedCompanyId; + private Long sessionId; + + public Long getSessionId() { + return sessionId; + } + + public void setSessionId(Long sessionId) { + this.sessionId = sessionId; + } public Long getProcessedCompanyId() { return processedCompanyId;