InspectionObligationsDepositReturn local store registries

This commit is contained in:
etreschenkov 2025-06-18 19:22:11 +03:00
parent 80c9870282
commit 1defffc0a1
2 changed files with 46 additions and 20 deletions

View file

@ -64,6 +64,9 @@ public class AssetTBFProcessing {
return a___; 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 * пересчитывает A**F = A**T - A**B + D**I - D**V
* учитываются только D**I с отрицательным balance. * учитываются только D**I с отрицательным balance.
@ -72,7 +75,7 @@ public class AssetTBFProcessing {
* @param am_f регистр свободных средств * @param am_f регистр свободных средств
* @param sum отнимается от блокировки. * @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; boolean am_bExists = am_b != null;
if (!am_bExists) { if (!am_bExists) {
am_b = new Registry(); 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)); am_f.setBalance(am_t.getBalance().subtract(am_b.getBalance()).add(d__iSum).subtract(d__vSum));
if (am_bExists) { if (am_bExists) {
am_b.setUpdated(now); am_b.setUpdated(now);
rgsImdg.update(am_b); if (isFireUpdate) {
rgsImdg.update(am_b);
}
} }
am_f.setUpdated(now); am_f.setUpdated(now);
rgsImdg.update(am_f); if (isFireUpdate) {
rgsImdg.update(am_f);
}
log.debug("assets processing [{}#id={}#balance={} | {}#id={}#balance={} | {}#id={}#balance={}] " + log.debug("assets processing [{}#id={}#balance={} | {}#id={}#balance={} | {}#id={}#balance={}] " +
"D**I.size={} D**V.size={}. {}.balance -> {}, {}.balance -> {}", "D**I.size={} D**V.size={}. {}.balance -> {}, {}.balance -> {}",
am_f.getRegistryCode(), am_f.getId(), am_fBalanceForLoging, am_f.getRegistryCode(), am_f.getId(), am_fBalanceForLoging,
@ -166,6 +173,9 @@ public class AssetTBFProcessing {
} }
public Optional<AssetTrio> processByAm_f(Registry am_f, BigDecimal sum) { public Optional<AssetTrio> processByAm_f(Registry am_f, BigDecimal sum) {
return processByAm_f(am_f, sum, true);
}
public Optional<AssetTrio> processByAm_f(Registry am_f, BigDecimal sum, boolean isFireUpdate) {
Optional<Registry> am_b = rgsMng.findRegByUnit(am_f.getCompanyId(), Optional<Registry> am_b = rgsMng.findRegByUnit(am_f.getCompanyId(),
am_f.getAccountId(), am_f.getAccountId(),
am_f.getContract(), am_f.getContract(),
@ -177,7 +187,7 @@ public class AssetTBFProcessing {
am_f, am_f,
RegistryUnit.T); RegistryUnit.T);
if (am_b.isPresent() && am_t.isPresent()) { 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())); return Optional.of(new AssetTrio(am_f, am_b.get(), am_t.get()));
} else { } else {
return Optional.empty(); return Optional.empty();

View file

@ -2,6 +2,8 @@ package ru.spcex.clearing.session.state.action;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.Instant; import java.time.Instant;
import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
@ -74,8 +76,10 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct
RegistryCodeSqlBuilder.getInstance(OS_T, OM_T, TS_T, TM_T).build(), RegistryCodeSqlBuilder.getInstance(OS_T, OM_T, TS_T, TM_T).build(),
RegistryStatus.POOL.getKey()); RegistryStatus.POOL.getKey());
List<Map.Entry<Long, List<Registry>>> registriesByGroupSorted = registryImdg.getCollectionObjectsBySQL(sqlCondition) Collection<Registry> registriesToProcess = registryImdg.getCollectionObjectsBySQL(sqlCondition);
.stream() Map<Long, Registry> rgssToStore = new HashMap<>(registriesToProcess.size()); //вторые ноги у сделок - нужна ли оптимизация?
List<Map.Entry<Long, List<Registry>>> registriesByGroupSorted = registriesToProcess.stream()
.collect(Collectors.groupingBy(Registry::getGroupId)) .collect(Collectors.groupingBy(Registry::getGroupId))
.entrySet() .entrySet()
.stream() .stream()
@ -89,7 +93,7 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct
Optional<Registry> tmtInGroupO = group.stream().filter(registry -> equalByRgs(TM_T, registry)).findFirst(); Optional<Registry> tmtInGroupO = group.stream().filter(registry -> equalByRgs(TM_T, registry)).findFirst();
if (omtInGroupO.isEmpty() || tmtInGroupO.isEmpty()) { if (omtInGroupO.isEmpty() || tmtInGroupO.isEmpty()) {
log.error("groupId {} failed to find OM*T/TM*T registry", entry.getKey()); 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; continue;
} }
Registry omtRgs = omtInGroupO.get(); Registry omtRgs = omtInGroupO.get();
@ -114,12 +118,12 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct
dmxBalance, omtBalance dmxBalance, omtBalance
); );
if (dmxBalance.compareTo(omtBalance) >= 0) { 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); // updateStatus(dmx.get(), RegistryStatus.POOL);
} else { } else {
//для OM*T uncovered остальным фейл //для OM*T uncovered остальным фейл
group.forEach(rgs -> updateStatus(rgs, registryStatusFailed(rgs))); group.forEach(rgs -> updateRegistryStatus(rgs, registryStatusFailed(rgs), rgssToStore));
updateStatus(dmx.get(), RegistryStatus.UNCV); updateRegistryStatus(dmx.get(), RegistryStatus.UNCV, rgssToStore);
} }
continue; continue;
} }
@ -128,12 +132,12 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct
Optional<Registry> amfAssetReceiverO = searchAssetByOMT(tmtRgs); Optional<Registry> amfAssetReceiverO = searchAssetByOMT(tmtRgs);
if (amfAssetO.isEmpty()) { if (amfAssetO.isEmpty()) {
log.error("OM*T register.id={} groupId={} failed to find AM*F asset", omtRgs.getId(), entry.getKey()); 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; continue;
} }
if (amfAssetReceiverO.isEmpty()) { if (amfAssetReceiverO.isEmpty()) {
log.error("TM*T register.id={} groupId={} failed to find AM*F asset", tmtRgs.getId(), entry.getKey()); 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; continue;
} }
@ -141,10 +145,12 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct
log.debug("groupId={}, AM*F.id={}", entry.getKey(), amfAsset.getId()); log.debug("groupId={}, AM*F.id={}", entry.getKey(), amfAsset.getId());
BigDecimal amfBalance = safeBD(amfAsset.getBalance()); BigDecimal amfBalance = safeBD(amfAsset.getBalance());
BiConsumer<Registry, BigDecimal> processAssetsAndSetSessionId = (amf, amount) -> { BiConsumer<Registry, BigDecimal> processAssetsAndSetSessionId = (amf, amount) -> {
Optional<AssetTrio> asts = assets.processByAm_f(amf, amount); Optional<AssetTrio> asts = assets.processByAm_f(amf, amount, false);
if (asts.isPresent()) { if (asts.isPresent()) {
asts.get().a__b().setSessionId(sessionId); 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<Registry> dmtInfo = rgsMng.searchDmtInfo(omtRgs); Optional<Registry> dmtInfo = rgsMng.searchDmtInfo(omtRgs);
@ -156,13 +162,13 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct
dmtBalance, omtBalance, amfBalance dmtBalance, omtBalance, amfBalance
); );
if (dmtBalance.compareTo(omtBalance) >= 0 && amfBalance.compareTo(omtBalance) >= 0) { 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(amfAsset, omtBalance.negate());
processAssetsAndSetSessionId.accept(amfAssetReceiverO.get(), omtBalance); processAssetsAndSetSessionId.accept(amfAssetReceiverO.get(), omtBalance);
// updateStatus(dmtInfo.get(), RegistryStatus.POOL); // updateStatus(dmtInfo.get(), RegistryStatus.POOL);
continue; continue;
} else if (SessionType.XDEP.equals(sessionType)) { } 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 // updateStatus(dmtInfo.get(), RegistryStatus.UNCV); не меняет статус, статус определяется OM*T
continue; continue;
} }
@ -176,12 +182,12 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct
dmtBalance, omtBalance, amfBalance dmtBalance, omtBalance, amfBalance
); );
if (dmtBalance.compareTo(omtBalance) >= 0 && amfBalance.compareTo(omtBalance) >= 0) { 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(amfAsset, omtBalance.negate());
processAssetsAndSetSessionId.accept(amfAssetReceiverO.get(), omtBalance); processAssetsAndSetSessionId.accept(amfAssetReceiverO.get(), omtBalance);
continue; continue;
} else if (SessionType.XDEP.equals(sessionType)) { } 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 // updateStatus(dmtClnr.get(), RegistryStatus.UNCV); не меняет статус, статус определяется OM*T
continue; continue;
} }
@ -193,15 +199,17 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct
log.debug("OM*T.id={} -> no DM*X/DM*T(INFO/CLRN) registry found. " + 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", "FINL, initiator.category='V' and am*f > om*t: setting OK status to group",
omtRgs.getId()); omtRgs.getId());
group.forEach(rgs -> updateStatus(rgs, RegistryStatus.OK)); group.forEach(rgs -> updateRegistryStatus(rgs, RegistryStatus.OK, rgssToStore));
processAssetsAndSetSessionId.accept(amfAsset, omtBalance.negate()); processAssetsAndSetSessionId.accept(amfAsset, omtBalance.negate());
processAssetsAndSetSessionId.accept(amfAssetReceiverO.get(), omtBalance); processAssetsAndSetSessionId.accept(amfAssetReceiverO.get(), omtBalance);
} else { } else {
log.info("OM*T.id={} -> no DM*X/DM*T(INFO/CLRN) registry found. setting {} status to group", log.info("OM*T.id={} -> no DM*X/DM*T(INFO/CLRN) registry found. setting {} status to group",
omtRgs.getId(), registryStatusFailed()); 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); planBalanceCalc.stageRevision2(sessionId);
} }
@ -221,6 +229,14 @@ public class InspectionObligationsDepositReturnAction extends AbstractSessionAct
registryImdg.update(registry); registryImdg.update(registry);
} }
private void updateRegistryStatus(Registry registry, RegistryStatus registryStatus, Map<Long, Registry> 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() { private RegistryStatus registryStatusFailed() {
if (SessionType.FINL.equals(sessionType) || SessionType.UNIT.equals(sessionType)) { if (SessionType.FINL.equals(sessionType) || SessionType.UNIT.equals(sessionType)) {
return RegistryStatus.FAIL; return RegistryStatus.FAIL;