обработка 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); processSdf01And57(completePairKey.get(), null);
return; 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) { if (table == SdfTable.SDF_08) {
{ {
Long key = completePairKey.get(); Long key = completePairKey.get();
@ -156,6 +156,14 @@ public class StatementService extends QueueConsumer implements InitializingBean
pairOfSdfRequest.remove(key); pairOfSdfRequest.remove(key);
doSomeone = true; 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) { if (doSomeone) {
@ -253,7 +261,7 @@ public class StatementService extends QueueConsumer implements InitializingBean
private Optional<Long> saveRequest(StatementRequest statementRequest) { private Optional<Long> saveRequest(StatementRequest statementRequest) {
SdfTable sdfTable = statementRequest.getTable(); SdfTable sdfTable = statementRequest.getTable();
//immediately process //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(); Long id = imdgProvider.getImdgIdGenerator().nextId();
pairOfSdfRequest.put(id, new Pair<>(statementRequest, null)); pairOfSdfRequest.put(id, new Pair<>(statementRequest, null));
return Optional.of(id); 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.domain.cud.balance.StatementRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.service.AnltSearcher; import ru.spcex.clearing.service.AnltSearcher;
import ru.spcex.clearing.service.RegistryManager;
import ru.spcex.clearing.service.model.Result; import ru.spcex.clearing.service.model.Result;
import ru.spcex.platform.enumeration.*; import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
@ -25,6 +26,7 @@ import java.time.Instant;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Map; import java.util.Map;
import java.util.Optional;
@Service @Service
public class Sdf04Executor extends AbstractExecutor<SDf04> { public class Sdf04Executor extends AbstractExecutor<SDf04> {
@ -36,14 +38,16 @@ public class Sdf04Executor extends AbstractExecutor<SDf04> {
private final AnltSearcher anltSearcher; private final AnltSearcher anltSearcher;
private final IMessageResolver msgRslv; private final IMessageResolver msgRslv;
protected final Imdg<Session> sessionImdg; 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.imdgProvider = imdgProvider;
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
this.anltSearcher = anltSearcher; this.anltSearcher = anltSearcher;
this.msgRslv = msgRslv; this.msgRslv = msgRslv;
this.registryManager = registryManager;
} }
@Override @Override
@ -96,12 +100,21 @@ public class Sdf04Executor extends AbstractExecutor<SDf04> {
} }
//todo переписать логику поиска на аналогичную по счетам(TRAN) //todo переписать логику поиска на аналогичную по счетам(TRAN)
Session activeSession = sessionImdg.getSingleObjectByFieldValues(Map.of("workflowStatus", Status.Active.getKey())); Session activeSession = sessionImdg.getSingleObjectByFieldValues(Map.of("workflowStatus", Status.Active.getKey()));
Instant now = Instant.now();
if (activeSession != null) { if (activeSession != null) {
Collection<Registry> registriesByActiveSessionId = selectAMBRegistryBySessionId(activeSession.getId()); Collection<Registry> registriesByActiveSessionId = selectAMBRegistryBySessionId(activeSession.getId());
registriesByActiveSessionId.stream().filter(registry -> registry.getBalance().compareTo(BigDecimal.ZERO) < 0) registriesByActiveSessionId.stream().filter(registry -> registry.getBalance().compareTo(BigDecimal.ZERO) < 0)
.forEach(registry -> { .forEach(registry -> {
registry.setBalance(BigDecimal.ZERO); 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); 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.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; 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.clearing.service.model.Result;
import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryInstrumentType;
@ -24,6 +25,7 @@ import java.math.BigDecimal;
import java.time.Instant; import java.time.Instant;
import java.util.Collection; import java.util.Collection;
import java.util.Map; import java.util.Map;
import java.util.Optional;
@Service @Service
public class Sdf13Executor extends AbstractExecutor<SDf13> { public class Sdf13Executor extends AbstractExecutor<SDf13> {
@ -33,12 +35,13 @@ public class Sdf13Executor extends AbstractExecutor<SDf13> {
private final ImdgProvider imdgProvider; private final ImdgProvider imdgProvider;
private final Imdg<Registry> registryImdg; private final Imdg<Registry> registryImdg;
protected final Imdg<Session> sessionImdg; protected final Imdg<Session> sessionImdg;
protected final RegistryManager registryManager;
public Sdf13Executor(ImdgProvider imdgProvider) { public Sdf13Executor(ImdgProvider imdgProvider, RegistryManager registryManager) {
this.imdgProvider = imdgProvider; this.imdgProvider = imdgProvider;
this.sdf12Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf12, SDf12.class); this.sdf12Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf12, SDf12.class);
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
this.registryManager = registryManager;
} }
@Override @Override
@ -59,20 +62,28 @@ public class Sdf13Executor extends AbstractExecutor<SDf13> {
Result result = new Result(); Result result = new Result();
Long generationIdForGroup = imdgProvider.getImdgIdGenerator().nextId(); Long generationIdForGroup = imdgProvider.getImdgIdGenerator().nextId();
result.setGenerationId(generationIdForGroup); result.setGenerationId(generationIdForGroup);
for (SDf13 sdf13 : sdf) { // for (SDf13 sdf13 : sdf) {
//обычно мы ищем по группу sdf04, здесь как будто всегда только одна запись, todo нужно прочекать этот момент // //обычно мы ищем по группу sdf04, здесь как будто всегда только одна запись, todo нужно прочекать этот момент
SDf12 sDf12 = selectSdf12bySdf13(sdf13); // SDf12 sDf12 = selectSdf12bySdf13(sdf13);
log.debug("Process sdf13 record; sdf13.id: {}", sdf13.getId()); // log.debug("Process sdf13 record; sdf13.id: {}", sdf13.getId());
Collection<Registry> registries = selectRegistryForSDF12(sDf12.getDepoCodeSender(), sDf12.getSecurityCode()); // Collection<Registry> registries = selectRegistryForSDF12(sDf12.getDepoCodeSender(), sDf12.getSecurityCode());
registries.forEach(registry -> unlockRegistry(registry, new BigDecimal(sDf12.getQuantity()))); // registries.forEach(registry -> unlockRegistry(registry, new BigDecimal(sDf12.getQuantity())));
} // }
Session activeSession = sessionImdg.getSingleObjectByFieldValues(Map.of("workflowStatus", Status.Active.getKey())); Session activeSession = sessionImdg.getSingleObjectByFieldValues(Map.of("workflowStatus", Status.Active.getKey()));
Instant now = Instant.now();
if (activeSession != null) { if (activeSession != null) {
Collection<Registry> registriesByActiveSessionId = selectASBRegistryBySessionId(activeSession.getId()); Collection<Registry> registriesByActiveSessionId = selectASBRegistryBySessionId(activeSession.getId());
registriesByActiveSessionId.stream().filter(registry -> registry.getBalance().compareTo(BigDecimal.ZERO) < 0) registriesByActiveSessionId
.forEach(registry -> { .forEach(registry -> {
registry.setBalance(BigDecimal.ZERO); 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); registryImdg.update(registry);
}); });
} }