обработка sdf04/sdf13 и изменения balance для регистров

This commit is contained in:
etreschenkov 2023-07-31 18:03:21 +03:00
parent e8232caf2b
commit 5343be3b58
3 changed files with 47 additions and 15 deletions

View file

@ -139,7 +139,7 @@ public class StatementService extends QueueConsumer implements InitializingBean
processSdf01And57(completePairKey.get(), null);
return;
}
} else if (List.of(SdfTable.SDF_08, SdfTable.SDF_04).contains(table)) {
} else if (List.of(SdfTable.SDF_08, SdfTable.SDF_04, SdfTable.SDF_13).contains(table)) {
if (table == SdfTable.SDF_08) {
{
Long key = completePairKey.get();
@ -156,6 +156,14 @@ public class StatementService extends QueueConsumer implements InitializingBean
pairOfSdfRequest.remove(key);
doSomeone = true;
}
} else if (table == SdfTable.SDF_13) {
{
Long key = completePairKey.get();
Pair<StatementRequest, StatementRequest> pair = pairOfSdfRequest.get(key);
processSdf13(pair.getFirst());
pairOfSdfRequest.remove(key);
doSomeone = true;
}
}
}
if (doSomeone) {
@ -253,7 +261,7 @@ public class StatementService extends QueueConsumer implements InitializingBean
private Optional<Long> saveRequest(StatementRequest statementRequest) {
SdfTable sdfTable = statementRequest.getTable();
//immediately process
if (List.of(SdfTable.SDF_08, SdfTable.SDF_04).contains(sdfTable)) {
if (List.of(SdfTable.SDF_08, SdfTable.SDF_04, SdfTable.SDF_13).contains(sdfTable)) {
Long id = imdgProvider.getImdgIdGenerator().nextId();
pairOfSdfRequest.put(id, new Pair<>(statementRequest, null));
return Optional.of(id);

View file

@ -11,6 +11,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.service.AnltSearcher;
import ru.spcex.clearing.service.RegistryManager;
import ru.spcex.clearing.service.model.Result;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
@ -25,6 +26,7 @@ import java.time.Instant;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.Optional;
@Service
public class Sdf04Executor extends AbstractExecutor<SDf04> {
@ -36,14 +38,16 @@ public class Sdf04Executor extends AbstractExecutor<SDf04> {
private final AnltSearcher anltSearcher;
private final IMessageResolver msgRslv;
protected final Imdg<Session> sessionImdg;
private RegistryManager registryManager;
public Sdf04Executor(ImdgProvider imdgProvider, AnltSearcher anltSearcher, IMessageResolver msgRslv) {
public Sdf04Executor(ImdgProvider imdgProvider, AnltSearcher anltSearcher, IMessageResolver msgRslv, RegistryManager registryManager) {
this.imdgProvider = imdgProvider;
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
this.anltSearcher = anltSearcher;
this.msgRslv = msgRslv;
this.registryManager = registryManager;
}
@Override
@ -96,12 +100,21 @@ public class Sdf04Executor extends AbstractExecutor<SDf04> {
}
//todo переписать логику поиска на аналогичную по счетам(TRAN)
Session activeSession = sessionImdg.getSingleObjectByFieldValues(Map.of("workflowStatus", Status.Active.getKey()));
Instant now = Instant.now();
if (activeSession != null) {
Collection<Registry> registriesByActiveSessionId = selectAMBRegistryBySessionId(activeSession.getId());
registriesByActiveSessionId.stream().filter(registry -> registry.getBalance().compareTo(BigDecimal.ZERO) < 0)
.forEach(registry -> {
registry.setBalance(BigDecimal.ZERO);
registry.setUpdated(Instant.now());
Optional<Registry> registryUnitF = registryManager.findRegByUnit(registry.getCompanyId(), registry.getAccountId(), registry.getContract(), registry, RegistryUnit.F);
Optional<Registry> registryUnitT = registryManager.findRegByUnit(registry.getCompanyId(), registry.getAccountId(), registry.getContract(), registry, RegistryUnit.T);
if (registryUnitF.isPresent() && registryUnitT.isPresent()) {
registryUnitF.get().setBalance(registryUnitT.get().getBalance().subtract(registry.getBalance()));
registryUnitF.get().setUpdated(now);
registryImdg.update(registryUnitF.get());
}
registry.setUpdated(now);
registryImdg.update(registry);
});
}

View file

@ -10,6 +10,7 @@ import ru.clearing.classes.statics.data.sdf.SDf13;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.service.RegistryManager;
import ru.spcex.clearing.service.model.Result;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryInstrumentType;
@ -24,6 +25,7 @@ import java.math.BigDecimal;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
@Service
public class Sdf13Executor extends AbstractExecutor<SDf13> {
@ -33,12 +35,13 @@ public class Sdf13Executor extends AbstractExecutor<SDf13> {
private final ImdgProvider imdgProvider;
private final Imdg<Registry> registryImdg;
protected final Imdg<Session> sessionImdg;
public Sdf13Executor(ImdgProvider imdgProvider) {
protected final RegistryManager registryManager;
public Sdf13Executor(ImdgProvider imdgProvider, RegistryManager registryManager) {
this.imdgProvider = imdgProvider;
this.sdf12Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf12, SDf12.class);
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
this.registryManager = registryManager;
}
@Override
@ -59,20 +62,28 @@ public class Sdf13Executor extends AbstractExecutor<SDf13> {
Result result = new Result();
Long generationIdForGroup = imdgProvider.getImdgIdGenerator().nextId();
result.setGenerationId(generationIdForGroup);
for (SDf13 sdf13 : sdf) {
//обычно мы ищем по группу sdf04, здесь как будто всегда только одна запись, todo нужно прочекать этот момент
SDf12 sDf12 = selectSdf12bySdf13(sdf13);
log.debug("Process sdf13 record; sdf13.id: {}", sdf13.getId());
Collection<Registry> registries = selectRegistryForSDF12(sDf12.getDepoCodeSender(), sDf12.getSecurityCode());
registries.forEach(registry -> unlockRegistry(registry, new BigDecimal(sDf12.getQuantity())));
}
// for (SDf13 sdf13 : sdf) {
// //обычно мы ищем по группу sdf04, здесь как будто всегда только одна запись, todo нужно прочекать этот момент
// SDf12 sDf12 = selectSdf12bySdf13(sdf13);
// log.debug("Process sdf13 record; sdf13.id: {}", sdf13.getId());
// Collection<Registry> registries = selectRegistryForSDF12(sDf12.getDepoCodeSender(), sDf12.getSecurityCode());
// registries.forEach(registry -> unlockRegistry(registry, new BigDecimal(sDf12.getQuantity())));
// }
Session activeSession = sessionImdg.getSingleObjectByFieldValues(Map.of("workflowStatus", Status.Active.getKey()));
Instant now = Instant.now();
if (activeSession != null) {
Collection<Registry> registriesByActiveSessionId = selectASBRegistryBySessionId(activeSession.getId());
registriesByActiveSessionId.stream().filter(registry -> registry.getBalance().compareTo(BigDecimal.ZERO) < 0)
registriesByActiveSessionId
.forEach(registry -> {
registry.setBalance(BigDecimal.ZERO);
registry.setUpdated(Instant.now());
Optional<Registry> registryUnitF = registryManager.findRegByUnit(registry.getCompanyId(), registry.getAccountId(), registry.getContract(), registry, RegistryUnit.F);
Optional<Registry> registryUnitT = registryManager.findRegByUnit(registry.getCompanyId(), registry.getAccountId(), registry.getContract(), registry, RegistryUnit.T);
if (registryUnitF.isPresent() && registryUnitT.isPresent()) {
registryUnitF.get().setBalance(registryUnitT.get().getBalance().subtract(registry.getBalance()));
registryUnitF.get().setUpdated(now);
registryImdg.update(registryUnitF.get());
}
registry.setUpdated(now);
registryImdg.update(registry);
});
}