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 b6c013d99..e7c2410b0 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 @@ -43,10 +43,7 @@ import ru.spcex.platform.utils.validation.ValidatorImpl; import java.math.BigDecimal; import java.time.Instant; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.function.Function; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; @@ -71,16 +68,18 @@ public class Sdf06Executor { private final DmiService dmiService; private final static BigDecimal successResult = BigDecimal.ZERO; - //ошибка проверок - private final static BigDecimal errorResult2 = new BigDecimal("3"); - //ошибка проверок баланса или наличия сессии - в этом сценарии session создается + //идет сессия (не возвращаем такую ошибку) private final static BigDecimal errorResult1 = new BigDecimal("1"); - //отказ от gateway + //Участник не найден – переход в ручной режим + private final static BigDecimal errorResult2 = new BigDecimal("2"); + //отказ от gateway либо недостаточно средств у нас private final static BigDecimal errorResult3 = new BigDecimal("3"); + private final static BigDecimal errorResult4 = new BigDecimal("4"); //not thread safe: used in EventReceiver single thread executor //переменная контроля за тем что от гейтвея пришел ответ именно на наш запрос + LinkedList> cachedRequests = new LinkedList<>(); private Long sdf06GroupId; private Long sdf07GroupId; @@ -116,13 +115,8 @@ public class Sdf06Executor { Instant now = Instant.now(); Long sdf07GroupId = idGenerator.nextId(); if (sdf06GroupId != null) { - log.warn("currently awaiting gateway response for groupId: {}. skipping groupId {}", sdf06GroupId, groupId); - sdfs.forEach(sdf06 -> { - SDf07 errorSdf07 = createSdf07(sdf06, now, errorResult2); //fixme "1" - errorSdf07.setGenerationId(sdf07GroupId); - sdf07Imdg.insert(errorSdf07); - }); - sendToExporter(sdf07GroupId, fileName); + log.warn("currently awaiting gateway response for groupId: {}. adding to cache groupId {}", sdf06GroupId, groupId); + cachedRequests.add(systemRequest); return; } Collection requests = new ArrayList<>(); @@ -161,10 +155,12 @@ public class Sdf06Executor { requests.add(GatewayRequestCreator.gatewayRequestPart(stmt, company.getTradingCode(), tcr.getCode())); } else { processedApproved(stmt, sDf06, now, sdf07GroupId); - dmiService.setProc(tcr.getId(), - CurrencyCode.RUB.getKey(), - safeBD(sDf06.getSum()), - sDf06.getNumber()); + if (tcr != null) { + dmiService.setProc(tcr.getId(), + CurrencyCode.RUB.getKey(), + safeBD(sDf06.getSum()), + sDf06.getNumber()); + } sdf07WasCreated = true; } } @@ -203,15 +199,23 @@ public class Sdf06Executor { } private BigDecimal errorById(EnumMessage err) { - if (ClearingError.BalanceInsufficient.equals(err.getSubject())) { - return errorResult3; - } - if ( ClearingError.CompanyNotFoundB.equals(err.getSubject()) + BigDecimal result = null; + if (ClearingError.CompanyNotFoundB.equals(err.getSubject()) || ClearingError.AccountNotFoundB.equals(err.getSubject()) || ClearingError.TCRegistryNotFound.equals(err.getSubject())) { - return errorResult2; + result = Sdf06Executor.errorResult2; } - return errorResult2; + if (ClearingError.BalanceInsufficient.equals(err.getSubject())) { + result = errorResult3; + } + if (ClearingError.WrongField.equals(err.getSubject())) { + result = errorResult4; + } + if (result == null) { + result = errorResult4; + } + log.debug("error subject {} result {}", err.getSubject(), result); + return result; } public void processGatewayResponse(BaseRequest req) { @@ -285,6 +289,10 @@ public class Sdf06Executor { } else { log.debug("gateway response was not for SDF06 executor"); } + if (cachedRequests.size() > 0) { + BaseRequest statementRequest = cachedRequests.removeFirst(); + execute(statementRequest); + } } private void clearContext() { 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 e78d74c20..58e591d37 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 @@ -12,6 +12,7 @@ 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.InOutDirection; import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; @@ -31,6 +32,8 @@ import java.util.Objects; import java.util.Optional; import java.util.function.Function; +import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; + public enum Sdf06NewValidationRule implements IValidationRule> { Fields() { @Override @@ -39,6 +42,9 @@ public enum Sdf06NewValidationRule implements IValidationRule"); } + InOutDirection dir; + if (safeBD(sdf06.getSum()).compareTo(BigDecimal.ZERO) >= 0) { + dir = (InOutDirection.in); + } else { + dir = (InOutDirection.out); + } Imdg tcrImdg; tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); + //если направление in то ТКР необязателен + Function, Optional> err = msg -> { + if (dir.equals(InOutDirection.in)) { + return Optional.empty(); + } else { + return msg; + } + }; + AnltSearcher.AnltSearch anltSrch; if (AccountType.Anlt.getKey().equals(account.getAccountType())) { log.debug("account.id={} is ANLT", account.getId()); if (TextUtil.isEmpty(sdf06.getSpec())) { - return of(ClearingError.TCRegistryNotFound, ""); + log.debug("ANLT couldn't find by account.id={} spec empty", account.getId()); + return err.apply(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()); + 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()); + log.debug("ANLT couldn't find by account.id={} by spec {}", account.getId(), sdf06.getSpec()); + return err.apply(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()); + log.debug("account.id={}, TCR.id={} ANLT found by account.id={} by spec {}", + anltSrch.getAccount().getId(), + anltSrch.getTcr().getId(), + account.getId(), + sdf06.getSpec()); + context.storeObject(ValidationStored.Sdf06Tcr, anltSrch.getTcr()); + return empty(); + } + } else { + TradingClearingRegistry tcr = tcrImdg.getFirstObjectByFieldValues( + Map.of("moneyAccountId", account.getId()) + ); + if (tcr != null) { + context.storeObject(ValidationStored.Sdf06Tcr, tcr); + return empty(); + } else { + log.debug("couldn't find TCR by account.id={} accountType {}", + account.getId(), account.getAccountType()); + return err.apply(of(ClearingError.TCRegistryNotFound, "")); } } - TradingClearingRegistry tcr = tcrImdg.getFirstObjectByFieldValues( - Map.of("moneyAccountId", account.getId()) - ); - if (tcr == null) { - return of(ClearingError.TCRegistryNotFound, ""); - } - context.storeObject(ValidationStored.Sdf06Tcr, tcr); - return empty(); } } ;