diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf08Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf08Executor.java index 82e71cf60..18ff2538e 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf08Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf08Executor.java @@ -33,6 +33,7 @@ import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.log.ExceptionUtils; import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.validation.IValidator; @@ -118,78 +119,94 @@ public class Sdf08Executor extends AbstractExecutor { Long generationIdForGroup = imdgProvider.getImdgIdGenerator().nextId(); result.setGenerationId(generationIdForGroup); for (SDf08 sdf08 : sdf) { - IValidator validator = sDf08Validator.apply(sdf08); - Optional error = validator.tillFirstError(); - Account account = validator.getStored(ValidationStored.Sdf08Account); - if (statementRequest.getAccountCreationResults().size() == 0 - && ClearingErrorInternal.AccountNotPresent.equals(error.map(EnumMessage::getSubject).orElse(null))) { - Company company = searchCompany(sdf08.getDepoCode()); // validator.getStored(ValidationStored.Sdf08Company); - Long companyId = company == null ? null : company.getId(); // account == null сегда, т.к. кейс AccountNotPresent - if (companyId == null) { - log.warn("account {} for sdf08.id={} not found. Can not send request for creation, cause company not found too", sdf08.getDepoCode(), sdf08.getId()); - } else { - result.getAccountRequests().add(createAccountRequestPart(sdf08.getId(), sdf08.getDepoCode(), companyId)); - log.info("account {} for sdf08.id={} not found - send request for creation", sdf08.getDepoCode(), sdf08.getId()); - } - continue; - } else if (ClearingErrorInternal.AccountNotPresent.equals(error.map(EnumMessage::getSubject).orElse(null))) { - log.error("fatal error: resumed processing after generating accounts, but no account found for sdf01.id={}", sdf08.getId()); - } - if (error.isPresent() && !ClearingError.SecurityNotFound.equals(error.get().getSubject())) { - log.error("sdf01.id={} error: {}", sdf08.getId(), messageResolver.resolve(error.get())); - //fixme инициировать = команда для другого сервиса? sdf02Imdg.insert(createErrorSdf02(sdf01, error.get(), generationIdForGroup)); -// sdf02Imdg.insert(createErrorSdf02(sdf01, error.get(), generationIdForGroup)); - continue; - } - - Statement stmt = createSdf08Statement(sdf08, account); - SDf09 sdf09New = createSuccessSdf09(sdf08, generationIdForGroup); //fixme тоже мб убрать - sdf09Imdg.insert(sdf09New); - stmt.setOutSDfId(sdf09New.getId()); - statementImdg.insert(stmt); - - Company company = companyImdg.getSingleObjectByID(account.getCompanyId()); - if (error.isEmpty()) { - error = validateActiveness(company, account); - } - if (error.isEmpty()) { - Optional reg = findReg(stmt); - Registry rgs; - if (reg.isPresent()) { - rgs = reg.get(); - updateReg(stmt, rgs); - Registry registryUnitB = findRegByUnit(company.getId(), account.getId(), stmt.getContract(), rgs, RegistryUnit.B).orElse(copyRegB(rgs)); - Registry registryUnitF = findRegByUnit(company.getId(), account.getId(), stmt.getContract(), rgs, RegistryUnit.F).orElse(copyRegF(rgs, null)); //передаю null т.к. отнимется ниже по коду - registryUnitF.setBalance(rgs.getBalance().subtract(registryUnitB.getBalance())); - registryUnitF.setUpdated(Instant.now()); - if (registryUnitF.getId() == null) { - registryImdg.insert(registryUnitF); - log.debug("stmt.id={}, new AM*F.id={}", stmt.getId(), registryUnitF.getId()); + Statement stmt = null; + try { + IValidator validator = sDf08Validator.apply(sdf08); + Optional error = validator.tillFirstError(); + Account account = validator.getStored(ValidationStored.Sdf08Account); + if (statementRequest.getAccountCreationResults().size() == 0 + && ClearingErrorInternal.AccountNotPresent.equals(error.map(EnumMessage::getSubject).orElse(null))) { + Company company = searchCompany(sdf08.getDepoCode()); // validator.getStored(ValidationStored.Sdf08Company); + Long companyId = company == null ? null : company.getId(); // account == null сегда, т.к. кейс AccountNotPresent + if (companyId == null) { + log.warn("account {} for sdf08.id={} not found. Can not send request for creation, cause company not found too", sdf08.getDepoCode(), sdf08.getId()); } else { - registryImdg.update(registryUnitF); - log.debug("stmt.id={}, updated AM*F.id={}", stmt.getId(), registryUnitF.getId()); + result.getAccountRequests().add(createAccountRequestPart(sdf08.getId(), sdf08.getDepoCode(), companyId)); + log.info("account {} for sdf08.id={} not found - send request for creation", sdf08.getDepoCode(), sdf08.getId()); } - //нужно сохранить registry B только если его не было - if (registryUnitB.getId() == null) { - registryImdg.insert(registryUnitB); - log.debug("stmt.id={}, new AM*B.id={}", stmt.getId(), registryUnitB.getId()); - } - registryImdg.update(rgs); - } else { - rgs = createRegistryByStatement(stmt, company, account); - Registry registryB = copyRegB(rgs); - Registry registryF = copyRegF(rgs, registryB.getBalance()); - registryImdg.insert(rgs); - registryImdg.insert(registryB); - registryImdg.insert(registryF); + continue; + } else if (ClearingErrorInternal.AccountNotPresent.equals(error.map(EnumMessage::getSubject).orElse(null))) { + log.error("fatal error: resumed processing after generating accounts, but no account found for sdf01.id={}", sdf08.getId()); + } + if (error.isPresent() && !ClearingError.SecurityNotFound.equals(error.get().getSubject())) { + log.error("sdf01.id={} error: {}", sdf08.getId(), messageResolver.resolve(error.get())); + //fixme инициировать = команда для другого сервиса? sdf02Imdg.insert(createErrorSdf02(sdf01, error.get(), generationIdForGroup)); + // sdf02Imdg.insert(createErrorSdf02(sdf01, error.get(), generationIdForGroup)); + continue; + } + stmt = createSdf08Statement(sdf08, account); + SDf09 sdf09New = createSuccessSdf09(sdf08, generationIdForGroup); //fixme тоже мб убрать + sdf09Imdg.insert(sdf09New); + stmt.setOutSDfId(sdf09New.getId()); + statementImdg.insert(stmt); + + Company company = companyImdg.getSingleObjectByID(account.getCompanyId()); + if (error.isEmpty()) { + error = validateActiveness(company, account); + } + if (error.isEmpty()) { + Optional reg = findReg(stmt); + Registry rgs; + if (reg.isPresent()) { + rgs = reg.get(); + updateReg(stmt, rgs); + Registry registryUnitB = findRegByUnit(company.getId(), account.getId(), stmt.getSecurityId(), stmt.getContract(), rgs, RegistryUnit.B).orElse(copyRegB(rgs)); + Registry registryUnitF = findRegByUnit(company.getId(), account.getId(), stmt.getSecurityId(), stmt.getContract(), rgs, RegistryUnit.F).orElse(copyRegF(rgs, null)); //передаю null т.к. отнимется ниже по коду + registryUnitF.setBalance(rgs.getBalance().subtract(registryUnitB.getBalance())); + registryUnitF.setUpdated(Instant.now()); + if (registryUnitF.getId() == null) { + registryImdg.insert(registryUnitF); + log.debug("stmt.id={}, new AM*F.id={}", stmt.getId(), registryUnitF.getId()); + } else { + registryImdg.update(registryUnitF); + log.debug("stmt.id={}, updated AM*F.id={}", stmt.getId(), registryUnitF.getId()); + } + //нужно сохранить registry B только если его не было + if (registryUnitB.getId() == null) { + registryImdg.insert(registryUnitB); + log.debug("stmt.id={}, new AM*B.id={}", stmt.getId(), registryUnitB.getId()); + } + registryImdg.update(rgs); + } else { + rgs = createRegistryByStatement(stmt, company, account); + Registry registryB = copyRegB(rgs); + Registry registryF = copyRegF(rgs, registryB.getBalance()); + registryImdg.insert(rgs); + registryImdg.insert(registryB); + registryImdg.insert(registryF); + } + //2. отправить notification на backend + stmt.setOperationStatus(OperationStatus.Executed.getKey()); + statementImdg.update(stmt); + } else { + stmt.setErrorCodeId(error.get().getSubject().getId()); // fixme ErrorText insert + stmt.setOperationStatus(OperationStatus.Rejected.getKey()); + statementImdg.update(stmt); + } + } catch (Exception e) { + log.error("error for sdf08.id={} (statement {}) stacktrace {}", + sdf08.getId(), + stmt == null ? null : stmt.getId(), + ExceptionUtils.getStackTrace(e)); + try { + if (stmt != null && stmt.getId() != null) { + log.debug("rejecting statement.id={}", stmt.getId()); + stmt.setOperationStatus(OperationStatus.Rejected.getKey()); + statementImdg.update(stmt); + } + } catch (Exception e2) { + log.error("error while rejecting statement.id={} stacktrace {}", stmt.getId(), ExceptionUtils.getStackTrace(e2)); } - //2. отправить notification на backend - stmt.setOperationStatus(OperationStatus.Executed.getKey()); - statementImdg.update(stmt); - } else { - stmt.setErrorCodeId(error.get().getSubject().getId()); // fixme ErrorText insert - stmt.setOperationStatus(OperationStatus.Rejected.getKey()); - statementImdg.update(stmt); } } return result; @@ -352,7 +369,7 @@ public class Sdf08Executor extends AbstractExecutor { return rgsF; } - private Optional findRegByUnit(Long companyId, Long accountId, String contract, Registry registry, RegistryUnit unit) { + private Optional findRegByUnit(Long companyId, Long accountId, Long securityId, String contract, Registry registry, RegistryUnit unit) { RegistryTradingParams p = new RegistryTradingParams( IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()), IEnumKey.getEnumByKey(RegistryInstrumentType.class, registry.getRegistryInstrumentType()), @@ -364,8 +381,8 @@ public class Sdf08Executor extends AbstractExecutor { ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql), pb.sql(sql), pb.equals("companyId", companyId), //fixme companyId? - pb.equals("accountId", accountId) - + pb.equals("accountId", accountId), + pb.equals("securityId", securityId) ); if (RegistryDesignation.D.equalsByKey(registry.getRegistryDesignation()) && !TextUtil.isEmpty(contract)) { rgstrPredicate = pb.and(rgstrPredicate, pb.equals("contract", contract));