ialbert 2024-02-09 18:23:27 +03:00
parent 960e4ffab0
commit 4d7a2ebbf7
2 changed files with 53 additions and 32 deletions

View file

@ -1,5 +1,12 @@
package ru.spcex.clearing.service.executors;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Optional;
import java.util.function.Function;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -10,6 +17,7 @@ import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.sdf.SDf20;
import ru.clearing.classes.statics.data.sdf.SDf21;
import ru.clearing.classes.statics.data.security.Security;
import ru.clearing.classes.statics.data.statement.Statement;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -24,28 +32,29 @@ import ru.spcex.clearing.service.registry.AssetTBFProcessing;
import ru.spcex.clearing.service.registry.RegistryManager;
import ru.spcex.clearing.service.validation.ValidationStored;
import ru.spcex.clearing.session.stage.util.RegistryUtil;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.enumeration.InOutDirection;
import ru.spcex.platform.enumeration.InOutSDfType;
import ru.spcex.platform.enumeration.OperationCode;
import ru.spcex.platform.enumeration.OperationStatus;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.RegistryUnit;
import ru.spcex.platform.enumeration.Sender;
import ru.spcex.platform.enumeration.StatementType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.number.BigDecimalUtil;
import ru.spcex.platform.utils.validation.IValidator;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Optional;
import java.util.function.Function;
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
@Service
public class Sdf20Executor {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<SDf20> sDf20Imdg;
private final Imdg<SDf21> sDf21Imdg;
private final Imdg<Registry> rgsImdg;
private final Imdg<Statement> stmtImdg;
private final Function<SDf20, IValidator> validation;
@ -62,6 +71,7 @@ public class Sdf20Executor {
this.sDf20Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf20, SDf20.class);
this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.stmtImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
this.sDf21Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf21, SDf21.class);
this.validation = validation;
this.msgRslv = msgRslv;
this.kafka = kafka;
@ -134,27 +144,39 @@ public class Sdf20Executor {
ds_i.setContract(sDf20.getInDocument());
ds_i.setRegistryStatus(RegistryStatus.OK.getKey());
ds_i.setUpdated(now);
as_t.setBalance(safeBD(as_t.getBalance()).add(quantity));
if (direction.equals(InOutDirection.in)) {
as_t.setCredit(safeBD(as_t.getCredit()).add(quantity.abs()));
} else {
as_t.setDebit(safeBD(as_t.getDebit()).add(quantity.abs()));
}
as_t.setCheckBalance(BigDecimalUtil.parseLeadingZeroes(sDf20.getCloseBalance()));
as_t.setUpdated(now);
rgsImdg.update(as_t);
rgsImdg.update(ds_i);
assetsMng.process(assets.a__b(), assets.a__t(), assets.a__f(), BigDecimal.ZERO);
ImdgPredicateBuilder pb = sDf21Imdg.predicateBuilder();
SDf21 sdf21 = sDf21Imdg.getFirstObjectByPredicate(
pb.equals("transactionNumber", sDf20.getTransactionNumber())
);
if (sdf21 == null) {
as_t.setBalance(safeBD(as_t.getBalance()).add(quantity));
if (direction.equals(InOutDirection.in)) {
as_t.setCredit(safeBD(as_t.getCredit()).add(quantity.abs()));
} else {
as_t.setDebit(safeBD(as_t.getDebit()).add(quantity.abs()));
}
as_t.setCheckBalance(BigDecimalUtil.parseLeadingZeroes(sDf20.getCloseBalance()));
as_t.setUpdated(now);
rgsImdg.update(as_t);
assetsMng.process(assets.a__b(), assets.a__t(), assets.a__f(), BigDecimal.ZERO);
//statement recfree in
//statement delfree out
Statement statement = createStatement(cmp.getId(), acc, quantity, sDf20.getId(), sDf20.getTransactionNumber(), security.getId());
stmtImdg.insert(statement);
log.debug("sdf20.id={}, processing as_t.id={}, as_f.id={}, as_b.id={}, ds_t.id={}. statement.id={}",
//statement recfree in
//statement delfree out
Statement statement = createStatement(cmp.getId(), acc, quantity, sDf20.getId(), sDf20.getTransactionNumber(), security.getId());
stmtImdg.insert(statement);
log.debug("sdf20.id={}, processing as_t.id={}, as_f.id={}, as_b.id={}, ds_t.id={}. statement.id={}",
sDf20.getId(),
assets.a__t().getId(), assets.a__f().getId(), assets.a__b().getId(),
ds_i.getId(),
statement.getId());
} else {
log.debug("sdf20.id={}, found sdf21.id={} by transactionNumber={}. skipping to gateway request",
sDf20.getId(),
sdf21.getId(),
sDf20.getTransactionNumber());
assetsMng.process(assets.a__b(), assets.a__t(), assets.a__f(), BigDecimal.ZERO);
}
//только при зачислении на 20 и 21 идет запрос в gateway в Торговую систему
if (InOutDirection.in.equals(direction)) {
Collection<AssetOperationRequest> requests = new ArrayList<>();

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.service.validation;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.clearing.classes.statics.data.account.Account;
@ -19,10 +22,6 @@ import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.text.TextUtil;
import ru.spcex.platform.utils.validation.IValidationRule;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Optional;
public enum Sdf21ValidationRule implements IValidationRule<ImdgValidationContext<SDf21>> {
AccountPresent() {
@ -58,9 +57,9 @@ public enum Sdf21ValidationRule implements IValidationRule<ImdgValidationContext
} else if (OperationCode.RECFREE.equalsByKey(sdf21.getOperationCode())) {
prdct = pb.and(prdct, pb.greatEqual("balance", BigDecimal.ZERO));
}
Registry ds_t = rgsImdg.getFirstObjectByPredicate(prdct);
if (ds_t != null) {
log.debug("sdf21.id={} found DS*T.id={}", sdf21.getId(), ds_t.getId());
Registry ds_i = rgsImdg.getFirstObjectByPredicate(prdct);
if (ds_i != null) {
log.debug("sdf21.id={} found DS*I.id={}", sdf21.getId(), ds_i.getId());
return of(ClearingError.SuchRecordAlreadyExists);
}
return empty();