diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java index b3c9ed381..b52cfc980 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/AssetTBFProcessing.java @@ -64,6 +64,9 @@ public class AssetTBFProcessing { return a___; } + public void process(Registry am_b, Registry am_t, Registry am_f, BigDecimal sum) { + process(am_b, am_t, am_f, sum, true); + } /** * пересчитывает A**F = A**T - A**B + D**I - D**V * учитываются только D**I с отрицательным balance. @@ -72,7 +75,7 @@ public class AssetTBFProcessing { * @param am_f регистр свободных средств * @param sum отнимается от блокировки. */ - public void process(Registry am_b, Registry am_t, Registry am_f, BigDecimal sum) { + public void process(Registry am_b, Registry am_t, Registry am_f, BigDecimal sum, boolean isFireUpdate) { boolean am_bExists = am_b != null; if (!am_bExists) { am_b = new Registry(); @@ -105,11 +108,15 @@ public class AssetTBFProcessing { am_f.setBalance(am_t.getBalance().subtract(am_b.getBalance()).add(d__iSum).subtract(d__vSum)); if (am_bExists) { am_b.setUpdated(now); - rgsImdg.update(am_b); + if (isFireUpdate) { + rgsImdg.update(am_b); + } } am_f.setUpdated(now); - rgsImdg.update(am_f); + if (isFireUpdate) { + rgsImdg.update(am_f); + } log.debug("assets processing [{}#id={}#balance={} | {}#id={}#balance={} | {}#id={}#balance={}] " + "D**I.size={} D**V.size={}. {}.balance -> {}, {}.balance -> {}", am_f.getRegistryCode(), am_f.getId(), am_fBalanceForLoging, @@ -166,6 +173,9 @@ public class AssetTBFProcessing { } public Optional processByAm_f(Registry am_f, BigDecimal sum) { + return processByAm_f(am_f, sum, true); + } + public Optional processByAm_f(Registry am_f, BigDecimal sum, boolean isFireUpdate) { Optional am_b = rgsMng.findRegByUnit(am_f.getCompanyId(), am_f.getAccountId(), am_f.getContract(), @@ -177,7 +187,7 @@ public class AssetTBFProcessing { am_f, RegistryUnit.T); if (am_b.isPresent() && am_t.isPresent()) { - process(am_b.get(), am_t.get(), am_f, sum); + process(am_b.get(), am_t.get(), am_f, sum, isFireUpdate); return Optional.of(new AssetTrio(am_f, am_b.get(), am_t.get())); } else { return Optional.empty(); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/InspectionObligationsDepositReturnAction.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/InspectionObligationsDepositReturnAction.java index 51d3b2b61..c4d7ebcc4 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/InspectionObligationsDepositReturnAction.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/InspectionObligationsDepositReturnAction.java @@ -2,6 +2,8 @@ package ru.spcex.clearing.session.state.action; import java.math.BigDecimal; import java.time.Instant; +import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -74,8 +76,10 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct RegistryCodeSqlBuilder.getInstance(OS_T, OM_T, TS_T, TM_T).build(), RegistryStatus.POOL.getKey()); - List>> registriesByGroupSorted = registryImdg.getCollectionObjectsBySQL(sqlCondition) - .stream() + Collection registriesToProcess = registryImdg.getCollectionObjectsBySQL(sqlCondition); + Map rgssToStore = new HashMap<>(registriesToProcess.size()); //вторые ноги у сделок - нужна ли оптимизация? + + List>> registriesByGroupSorted = registriesToProcess.stream() .collect(Collectors.groupingBy(Registry::getGroupId)) .entrySet() .stream() @@ -89,7 +93,7 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct Optional tmtInGroupO = group.stream().filter(registry -> equalByRgs(TM_T, registry)).findFirst(); if (omtInGroupO.isEmpty() || tmtInGroupO.isEmpty()) { log.error("groupId {} failed to find OM*T/TM*T registry", entry.getKey()); - group.forEach(rgs -> updateStatus(rgs, registryStatusFailed())); // FAIL or MNG + group.forEach(rgs -> updateRegistryStatus(rgs, registryStatusFailed(), rgssToStore)); // FAIL or MNG continue; } Registry omtRgs = omtInGroupO.get(); @@ -114,12 +118,12 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct dmxBalance, omtBalance ); if (dmxBalance.compareTo(omtBalance) >= 0) { - group.forEach(rgs -> updateStatus(rgs, RegistryStatus.OK)); + group.forEach(rgs -> updateRegistryStatus(rgs, RegistryStatus.OK, rgssToStore)); // updateStatus(dmx.get(), RegistryStatus.POOL); } else { //для OM*T uncovered остальным фейл - group.forEach(rgs -> updateStatus(rgs, registryStatusFailed(rgs))); - updateStatus(dmx.get(), RegistryStatus.UNCV); + group.forEach(rgs -> updateRegistryStatus(rgs, registryStatusFailed(rgs), rgssToStore)); + updateRegistryStatus(dmx.get(), RegistryStatus.UNCV, rgssToStore); } continue; } @@ -128,12 +132,12 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct Optional amfAssetReceiverO = searchAssetByOMT(tmtRgs); if (amfAssetO.isEmpty()) { log.error("OM*T register.id={} groupId={} failed to find AM*F asset", omtRgs.getId(), entry.getKey()); - group.forEach(rgs -> updateStatus(rgs, registryStatusFailed())); // FAIL or MNG + group.forEach(rgs -> updateRegistryStatus(rgs, registryStatusFailed(), rgssToStore)); // FAIL or MNG continue; } if (amfAssetReceiverO.isEmpty()) { log.error("TM*T register.id={} groupId={} failed to find AM*F asset", tmtRgs.getId(), entry.getKey()); - group.forEach(rgs -> updateStatus(rgs, registryStatusFailed())); // FAIL or MNG + group.forEach(rgs -> updateRegistryStatus(rgs, registryStatusFailed(), rgssToStore)); // FAIL or MNG continue; } @@ -141,10 +145,12 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct log.debug("groupId={}, AM*F.id={}", entry.getKey(), amfAsset.getId()); BigDecimal amfBalance = safeBD(amfAsset.getBalance()); BiConsumer processAssetsAndSetSessionId = (amf, amount) -> { - Optional asts = assets.processByAm_f(amf, amount); + Optional asts = assets.processByAm_f(amf, amount, false); if (asts.isPresent()) { asts.get().a__b().setSessionId(sessionId); - registryImdg.update(asts.get().a__b()); + rgssToStore.put(asts.get().a__b().getId(), asts.get().a__b()); + rgssToStore.put(asts.get().a__f().getId(), asts.get().a__f()); +// registryImdg.update(asts.get().a__b()); } }; Optional dmtInfo = rgsMng.searchDmtInfo(omtRgs); @@ -156,13 +162,13 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct dmtBalance, omtBalance, amfBalance ); if (dmtBalance.compareTo(omtBalance) >= 0 && amfBalance.compareTo(omtBalance) >= 0) { - group.forEach(rgs -> updateStatus(rgs, RegistryStatus.OK)); + group.forEach(rgs -> updateRegistryStatus(rgs, RegistryStatus.OK, rgssToStore)); processAssetsAndSetSessionId.accept(amfAsset, omtBalance.negate()); processAssetsAndSetSessionId.accept(amfAssetReceiverO.get(), omtBalance); // updateStatus(dmtInfo.get(), RegistryStatus.POOL); continue; } else if (SessionType.XDEP.equals(sessionType)) { - group.forEach(rgs -> updateStatus(rgs, registryStatusFailed(rgs))); // для финальной UNCV or FAIL ; другие MNG + group.forEach(rgs -> updateRegistryStatus(rgs, registryStatusFailed(rgs), rgssToStore)); // для финальной UNCV or FAIL ; другие MNG // updateStatus(dmtInfo.get(), RegistryStatus.UNCV); не меняет статус, статус определяется OM*T continue; } @@ -176,12 +182,12 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct dmtBalance, omtBalance, amfBalance ); if (dmtBalance.compareTo(omtBalance) >= 0 && amfBalance.compareTo(omtBalance) >= 0) { - group.forEach(rgs -> updateStatus(rgs, RegistryStatus.OK)); + group.forEach(rgs -> updateRegistryStatus(rgs, RegistryStatus.OK, rgssToStore)); processAssetsAndSetSessionId.accept(amfAsset, omtBalance.negate()); processAssetsAndSetSessionId.accept(amfAssetReceiverO.get(), omtBalance); continue; } else if (SessionType.XDEP.equals(sessionType)) { - group.forEach(rgs -> updateStatus(rgs, registryStatusFailed(rgs))); + group.forEach(rgs -> updateRegistryStatus(rgs, registryStatusFailed(rgs), rgssToStore)); // updateStatus(dmtClnr.get(), RegistryStatus.UNCV); не меняет статус, статус определяется OM*T continue; } @@ -193,15 +199,17 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct log.debug("OM*T.id={} -> no DM*X/DM*T(INFO/CLRN) registry found. " + "FINL, initiator.category='V' and am*f > om*t: setting OK status to group", omtRgs.getId()); - group.forEach(rgs -> updateStatus(rgs, RegistryStatus.OK)); + group.forEach(rgs -> updateRegistryStatus(rgs, RegistryStatus.OK, rgssToStore)); processAssetsAndSetSessionId.accept(amfAsset, omtBalance.negate()); processAssetsAndSetSessionId.accept(amfAssetReceiverO.get(), omtBalance); } else { log.info("OM*T.id={} -> no DM*X/DM*T(INFO/CLRN) registry found. setting {} status to group", omtRgs.getId(), registryStatusFailed()); - group.forEach(rgs -> updateStatus(rgs, registryStatusFailed(rgs))); + group.forEach(rgs -> updateRegistryStatus(rgs, registryStatusFailed(rgs), rgssToStore)); } } + registryImdg.putAll(rgssToStore, 200); + planBalanceCalc.stageRevision2(sessionId); } @@ -221,6 +229,14 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct registryImdg.update(registry); } + private void updateRegistryStatus(Registry registry, RegistryStatus registryStatus, Map rgss) { + log.trace("Update registry.id: {} to {}", registry.getId(), registryStatus.getKey()); + registry.setRegistryStatus(registryStatus.getKey()); + registry.setUpdated(Instant.now()); + rgss.put(registry.getId(), registry); +// registryImdg.update(registry); + } + private RegistryStatus registryStatusFailed() { if (SessionType.FINL.equals(sessionType) || SessionType.UNIT.equals(sessionType)) { return RegistryStatus.FAIL;