From 0b81edefbbe3005a66374021595134c9fe1bb173 Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 15 Aug 2023 15:10:41 +0300 Subject: [PATCH] =?UTF-8?q?SDF06=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20=D0=BF?= =?UTF-8?q?=D0=BE=20ANLT=20account=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20=D0=A2=D0=9A=D0=A0=20=D0=B2=20?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=86=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clearing/config/ValidationConfig.java | 4 +- .../spcex/clearing/service/AnltSearcher.java | 8 +++ .../service/executors/Sdf06Executor.java | 13 +++-- .../validation/Sdf06NewValidationRule.java | 52 +++++++++++++++++-- .../service/validation/ValidationStored.java | 2 +- 5 files changed, 67 insertions(+), 12 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java index 5b46c5471..2da2f572e 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java @@ -253,12 +253,14 @@ public class ValidationConfig { context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany); context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry); context.addImdg(IMDGDistributedNames.Map_Session, imdgSession); + context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry); context.setLogPrefix(LogPrefixId.INSTANCE); return new ValidatorImpl<>(context, Sdf06NewValidationRule.CompanySymbolAndCompanyPresent, Sdf06NewValidationRule.AccountPresent, Sdf06NewValidationRule.Session, - Sdf06NewValidationRule.Balance + Sdf06NewValidationRule.Balance, + Sdf06NewValidationRule.TcrPresent ); }; diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/AnltSearcher.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/AnltSearcher.java index 54d4bd484..be9322c76 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/AnltSearcher.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/AnltSearcher.java @@ -2,6 +2,7 @@ package ru.spcex.clearing.service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.company.Company; @@ -24,12 +25,19 @@ public class AnltSearcher { private final Imdg companyImdg; private final Imdg accountImdg; + @Autowired public AnltSearcher(ImdgProvider imdgProvider) { this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); } + public AnltSearcher(Imdg tcrImdg, Imdg companyImdg, Imdg accountImdg) { + this.tradingClearingRegistryImdg = tcrImdg; + this.companyImdg = companyImdg; + this.accountImdg = accountImdg; + } + @FunctionalInterface public interface AnltLogger { void log(IEnumId subject, Object... args); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java index 75f4c7d0a..f38ece347 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java @@ -115,7 +115,7 @@ public class Sdf06Executor { if (sdf06GroupId != null) { log.warn("currently awaiting gateway response for groupId: {}. skipping groupId {}", sdf06GroupId, groupId); sdfs.forEach(sdf06 -> { - SDf07 errorSdf07 = createSdf07(sdf06, now, errorResult2); + SDf07 errorSdf07 = createSdf07(sdf06, now, errorResult2); //fixme "1" errorSdf07.setGenerationId(sdf07GroupId); sdf07Imdg.insert(errorSdf07); }); @@ -152,12 +152,9 @@ public class Sdf06Executor { continue; } Company company = validator.getStored(ValidationStored.Sdf06Company); - Account account = validator.getStored(ValidationStored.Sdf06Account); - TradingClearingRegistry tcr = tradingClearingRegistryImdg.getFirstObjectByFieldValues( - Map.of("moneyAccountId", account.getId()) - ); + TradingClearingRegistry tcr = validator.getStored(ValidationStored.Sdf06Tcr); //проверка существует ли statement пока убрал - Statement stmt = createStatementBySdf06(sDf06, company.getId(), account); + Statement stmt = createStatementBySdf06(sDf06, company.getId(), validator.getStored(ValidationStored.Sdf06Account)); statementImdg.insert(stmt); log.debug("Statement created: {}", stmt.getId()); if (InOutDirection.in.getKey().equals(stmt.getInOutDirection())) { @@ -197,10 +194,12 @@ public class Sdf06Executor { } private boolean needToCreateStatement(EnumMessage err) { - return ClearingError.ActiveSessionIsPresent.equals(err.getSubject()) || ClearingError.BalanceInsufficient.equals(err.getSubject()); + return ClearingError.ActiveSessionIsPresent.equals(err.getSubject()) || ClearingError.BalanceInsufficient.equals(err.getSubject()) + || ClearingError.TCRegistryNotFound.equals(err.getSubject()); } public void processGatewayResponse(BaseRequest req) { + //может прийти неограниченно позже 06го, после того как прошел клиринг например... Instant now = Instant.now(); String fileName = null; for (SingleAssetResponse gatewayMsg : req.getRequestPayload().getApprovals()) { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf06NewValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf06NewValidationRule.java index 93506ed75..17a3afccb 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf06NewValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf06NewValidationRule.java @@ -6,9 +6,11 @@ import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.registry.Registry; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.sdf.SDf06; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.service.AnltSearcher; import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.enumeration.WorkflowStatus; @@ -55,9 +57,16 @@ public enum Sdf06NewValidationRule implements IValidationRule accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); - Account account = accountImdg.getFirstObjectByFieldValues(Map.of( - "account", sdf06.getAccount(), - "accountType", AccountType.Clrn.getKey())); + ImdgPredicateBuilder pb = accountImdg.predicateBuilder(); + Account account = accountImdg.getFirstObjectByPredicate( + pb.and( + pb.equals("account", sdf06.getAccount()), + pb.or( + pb.equals("accountType", AccountType.Clrn.getKey()), + pb.equals("accountType", AccountType.Anlt.getKey()) + ) + ) + ); if (account == null) { return of(ClearingError.AccountNotFoundB, sdf06.getAccount()); } @@ -107,6 +116,43 @@ public enum Sdf06NewValidationRule implements IValidationRule validate(ImdgValidationContext context) { + SDf06 sdf06 = context.getValidatedObject(); + Account account = context.getStoredObject(ValidationStored.Sdf06Account); + if (account == null) { + return of(ClearingError.TCRegistryNotFound, ""); + } + Imdg tcrImdg; + tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); + if (AccountType.Anlt.getKey().equals(account.getAccountType())) { + log.debug("account.id={} is ANLT", account.getId()); + if (TextUtil.isEmpty(sdf06.getSpec())) { + return of(ClearingError.TCRegistryNotFound, ""); + } + Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + AnltSearcher anltSearcher = new AnltSearcher(tcrImdg, companyImdg, accountImdg); + AnltSearcher.AnltSearch anltSrch = anltSearcher.loadByAnlt(sdf06.getSpec()); + if (!anltSrch.isFound()) { + log.debug("account.id={} ANLT couldn't find account by spec {}", account.getId(), sdf06.getSpec()); + return of(ClearingError.TCRegistryNotFound, sdf06.getSpec()); + } else { + account = anltSrch.getAccount(); + log.debug("account.id={} ANLT found account.id={} by spec {}", account.getId(), account.getId(), sdf06.getSpec()); + } + } + TradingClearingRegistry tcr = tcrImdg.getFirstObjectByFieldValues( + Map.of("moneyAccountId", account.getId()) + ); + if (tcr == null) { + return of(ClearingError.TCRegistryNotFound, ""); + } + context.storeObject(ValidationStored.Sdf06Tcr, tcr); + return empty(); + } } ; private final static Logger log = LoggerFactory.getLogger(Sdf06NewValidationRule.class); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java index f5818dd16..a87a424ee 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/ValidationStored.java @@ -14,7 +14,7 @@ public enum ValidationStored { Sdf21Account, - Sdf06Company, Sdf06Account, + Sdf06Company, Sdf06Account, Sdf06Tcr, ReturnDepositDmx,