правки валидации sdf10

определение запрос для sdf06/sdf10 - Sdf10Executor и Sdf06Executor
правки запроса к gateway (поле section)
This commit is contained in:
ialbert 2023-08-16 15:54:08 +03:00
parent cef5460726
commit af70ae6392
6 changed files with 66 additions and 23 deletions

View file

@ -4,6 +4,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.AccountBalance; import ru.clearing.classes.statics.data.account.AccountBalance;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.company.relation.Relation; import ru.clearing.classes.statics.data.company.relation.Relation;
@ -46,6 +47,7 @@ public class ValidationConfig {
Imdg<CompanySymbols> imdgCompanySymbols; Imdg<CompanySymbols> imdgCompanySymbols;
Imdg<Registry> imdgRegistry; Imdg<Registry> imdgRegistry;
Imdg<Account> imdgAccount; Imdg<Account> imdgAccount;
Imdg<DepoAccount> imdgDepoAccount;
Imdg<AccountBalance> imdgAccountBalance; Imdg<AccountBalance> imdgAccountBalance;
Imdg<Security> imdgSecurity; Imdg<Security> imdgSecurity;
Imdg<MoneyMarketSecurity> imdgMoneyMarketSecurity; Imdg<MoneyMarketSecurity> imdgMoneyMarketSecurity;
@ -70,6 +72,7 @@ public class ValidationConfig {
this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class); this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class);
this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class);
this.imdgStatement = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class); this.imdgStatement = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
this.imdgDepoAccount = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
this.imdgProvider = imdgProvider; this.imdgProvider = imdgProvider;
} }
@ -272,6 +275,11 @@ public class ValidationConfig {
ImdgValidationContext<SDf10> context = new ImdgValidationContext<>(); ImdgValidationContext<SDf10> context = new ImdgValidationContext<>();
context.setValidatedObject(sDf10); context.setValidatedObject(sDf10);
context.addImdg(IMDGDistributedNames.Map_Account, imdgAccount); context.addImdg(IMDGDistributedNames.Map_Account, imdgAccount);
context.addImdg(IMDGDistributedNames.Map_DepoAccount, imdgDepoAccount);
context.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry);
context.addImdg(IMDGDistributedNames.Map_FixedIncomeSecurity , fixedIncomeSecurityImdg);
context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity , imdgMoneyMarketSecurity);
context.addImdg(IMDGDistributedNames.Map_EquitySecurity , equitySecurityImdg);
context.addImdg(IMDGDistributedNames.Map_CompanySymbols, imdgCompanySymbols); context.addImdg(IMDGDistributedNames.Map_CompanySymbols, imdgCompanySymbols);
context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany); context.addImdg(IMDGDistributedNames.Map_Company, imdgCompany);
context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry); context.addImdg(IMDGDistributedNames.Map_Registry, imdgRegistry);
@ -281,6 +289,7 @@ public class ValidationConfig {
Sdf10ValidationRule.DepoAccountPresent, Sdf10ValidationRule.DepoAccountPresent,
CompanyByTradingCodeValidationRule.instance(SDf10::getDepoCode), CompanyByTradingCodeValidationRule.instance(SDf10::getDepoCode),
Sdf10ValidationRule.CompanyStatus, Sdf10ValidationRule.CompanyStatus,
Sdf10ValidationRule.TcrPresent,
SecurityBySecurityCodeValidationRule.instance(SDf10::getSecurityCode), SecurityBySecurityCodeValidationRule.instance(SDf10::getSecurityCode),
Sdf10ValidationRule.Balance Sdf10ValidationRule.Balance
); );

View file

@ -19,6 +19,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandR
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.STradesImportedRequest; import ru.spcex.clearing.platform.messaging.domain.cud.utilities.STradesImportedRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.service.executors.Sdf06Executor; import ru.spcex.clearing.service.executors.Sdf06Executor;
import ru.spcex.clearing.service.executors.Sdf10Executor;
import ru.spcex.clearing.session.stage.*; import ru.spcex.clearing.session.stage.*;
import ru.spcex.clearing.session.stage.impl.BalanceRevise; import ru.spcex.clearing.session.stage.impl.BalanceRevise;
import ru.spcex.platform.enumeration.Task; import ru.spcex.platform.enumeration.Task;
@ -39,6 +40,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
private final ReturnDepositSession returnDepositSession; private final ReturnDepositSession returnDepositSession;
private final SessionManager sessionManager; private final SessionManager sessionManager;
private final Sdf06Executor sdf06Executor; private final Sdf06Executor sdf06Executor;
private final Sdf10Executor sdf10Executor;
private final BalanceRevise balanceRevise; private final BalanceRevise balanceRevise;
private final Sdf05Sender sdf05Sender; private final Sdf05Sender sdf05Sender;
@ -50,7 +52,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
SecondaryAuctionT0Session secondaryAuctionT0Session, SecondaryAuctionT0Session secondaryAuctionT0Session,
PrimaryAuctionB0Session primaryAuctionB0Session, PrimaryAuctionT0Session primaryAuctionT0Session, IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, ReturnDepositSession returnDepositSession, SessionManager sessionManager, PrimaryAuctionB0Session primaryAuctionB0Session, PrimaryAuctionT0Session primaryAuctionT0Session, IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, ReturnDepositSession returnDepositSession, SessionManager sessionManager,
Sdf06Executor sdf06Executor, Sdf06Executor sdf06Executor,
BalanceRevise balanceRevise, Sdf05Sender sdf05Sender) { Sdf10Executor sdf10Executor, BalanceRevise balanceRevise, Sdf05Sender sdf05Sender) {
super(kafkaQueue, kafkaResponseQueue); super(kafkaQueue, kafkaResponseQueue);
this.clearingService = clearingService; this.clearingService = clearingService;
this.registryService = registryService; this.registryService = registryService;
@ -63,6 +65,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
this.returnDepositSession = returnDepositSession; this.returnDepositSession = returnDepositSession;
this.sessionManager = sessionManager; this.sessionManager = sessionManager;
this.sdf06Executor = sdf06Executor; this.sdf06Executor = sdf06Executor;
this.sdf10Executor = sdf10Executor;
this.balanceRevise = balanceRevise; this.balanceRevise = balanceRevise;
this.sdf05Sender = sdf05Sender; this.sdf05Sender = sdf05Sender;
} }
@ -102,11 +105,14 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
.forDestination(Consts.CONTINUE_SESSION_BN_FIRST_PART, callbacks::put); .forDestination(Consts.CONTINUE_SESSION_BN_FIRST_PART, callbacks::put);
callback(StatementRequest.class) callback(StatementRequest.class)
.setConsumer(sdf06Executor::createStatementAndSendGatewayCommand) .setConsumer(sdf06Executor::execute)
.forDestination(Consts.STATEMENT_PROCESS_SDF06, callbacks::put); .forDestination(Consts.STATEMENT_PROCESS_SDF06, callbacks::put);
callback(AssetOperationApprovalRequest.class) callback(AssetOperationApprovalRequest.class)
.setConsumer(sdf06Executor::processGatewayResponse) .setConsumer(req -> {
sdf06Executor.processGatewayResponse(req);
sdf10Executor.processGatewayResponse(req);
})
.forDestination(Consts.ASSET_OPERATION_APPROVAL, callbacks::put); .forDestination(Consts.ASSET_OPERATION_APPROVAL, callbacks::put);
callback(STradesImportedRequest.class) callback(STradesImportedRequest.class)

View file

@ -31,6 +31,7 @@ import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider; 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.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.number.BigDecimalUtil; import ru.spcex.platform.utils.number.BigDecimalUtil;
@ -102,7 +103,7 @@ public class Sdf06Executor {
this.filenameObtainer = filenameObtainer; this.filenameObtainer = filenameObtainer;
} }
public void createStatementAndSendGatewayCommand(BaseRequest<StatementRequest> systemRequest) { public void execute(BaseRequest<StatementRequest> systemRequest) {
Imdg<SDf06> sdfImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf06, SDf06.class); Imdg<SDf06> sdfImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf06, SDf06.class);
Long groupId = systemRequest.getRequestPayload().getGroupId(); Long groupId = systemRequest.getRequestPayload().getGroupId();
Collection<SDf06> sdfs = sdfImdg.getCollectionObjectsByFieldValues(Map.of( Collection<SDf06> sdfs = sdfImdg.getCollectionObjectsByFieldValues(Map.of(
@ -209,15 +210,23 @@ public class Sdf06Executor {
//может прийти неограниченно позже 06го, после того как прошел клиринг например... //может прийти неограниченно позже 06го, после того как прошел клиринг например...
Instant now = Instant.now(); Instant now = Instant.now();
String fileName = null; String fileName = null;
boolean requestIsIntendedForSdf06 = false;
for (SingleAssetResponse gatewayMsg : req.getRequestPayload().getApprovals()) { for (SingleAssetResponse gatewayMsg : req.getRequestPayload().getApprovals()) {
//получаем запрос для текущей группы sdf06 //получаем запрос для текущей группы sdf06
//находим группу //находим группу
Long statementId = gatewayMsg.getStatementId(); Long statementId = gatewayMsg.getStatementId();
Statement stmt = statementImdg.getSingleObjectByID(statementId); ImdgPredicateBuilder pb = statementImdg.predicateBuilder();
Statement stmt = statementImdg.getFirstObjectByPredicate(
pb.and(
pb.equals("id", statementId),
pb.equals("inOutSDfType", InOutSDfType.type6.getKey())
)
);
if (stmt == null) { if (stmt == null) {
log.error("Statement.id {} not found", statementId); log.debug("Statement.id {} with type {} not found", statementId, InOutSDfType.type6.getKey());
return; return;
} }
requestIsIntendedForSdf06 = true;
Long sdf06Id = stmt.getInSDfId(); Long sdf06Id = stmt.getInSDfId();
SDf06 sdf06 = sdf06Imdg.getSingleObjectByID(sdf06Id); SDf06 sdf06 = sdf06Imdg.getSingleObjectByID(sdf06Id);
@ -256,9 +265,13 @@ public class Sdf06Executor {
statementImdg.update(stmt); statementImdg.update(stmt);
} }
} }
sendToExporter(sdf07GroupId, fileName); if (requestIsIntendedForSdf06) {
log.debug("All gateway responses received for SDF06 groupId {}. SDF07 groupId {}", sdf06GroupId, sdf07GroupId); sendToExporter(sdf07GroupId, fileName);
clearContext(); log.debug("All gateway responses received for SDF06 groupId {}. SDF07 groupId {}", sdf06GroupId, sdf07GroupId);
clearContext();
} else {
log.debug("gateway response was not for SDF06 executor");
}
} }
private void clearContext() { private void clearContext() {

View file

@ -31,6 +31,7 @@ import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider; 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.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.number.BigDecimalUtil; import ru.spcex.platform.utils.number.BigDecimalUtil;
@ -155,7 +156,7 @@ public class Sdf10Executor {
processedApproved(stmt, sDf10, now, sdf11GroupId); processedApproved(stmt, sDf10, now, sdf11GroupId);
sdf11WasCreated = true; sdf11WasCreated = true;
} else { } else {
requests.add(requestFromStatement(stmt, company.getTradingCode(), tcr.getCode())); requests.add(requestFromStatement(stmt, company.getTradingCode(), tcr.getCode(), sDf10.getSecurityCode()));
} }
} }
if (requests.size() > 0) { if (requests.size() > 0) {
@ -189,15 +190,23 @@ public class Sdf10Executor {
public void processGatewayResponse(BaseRequest<AssetOperationApprovalRequest> req) { public void processGatewayResponse(BaseRequest<AssetOperationApprovalRequest> req) {
Instant now = Instant.now(); Instant now = Instant.now();
boolean requestIsIntendedForSdf10 = false;
for (SingleAssetResponse gatewayMsg : req.getRequestPayload().getApprovals()) { for (SingleAssetResponse gatewayMsg : req.getRequestPayload().getApprovals()) {
//получаем запрос для текущей группы sdf10 //получаем запрос для текущей группы sdf10
//находим группу //находим группу
Long statementId = gatewayMsg.getStatementId(); Long statementId = gatewayMsg.getStatementId();
Statement stmt = statementImdg.getSingleObjectByID(statementId); ImdgPredicateBuilder pb = statementImdg.predicateBuilder();
Statement stmt = statementImdg.getFirstObjectByPredicate(
pb.and(
pb.equals("id", statementId),
pb.equals("inOutSDfType", InOutSDfType.type10.getKey())
)
);
if (stmt == null) { if (stmt == null) {
log.error("Statement.id {} not found", statementId); log.debug("Statement.id {} with type {} not found", statementId, InOutSDfType.type6.getKey());
return; return;
} }
requestIsIntendedForSdf10 = true;
Long sdf10Id = stmt.getInSDfId(); Long sdf10Id = stmt.getInSDfId();
SDf10 sdf10 = sdf10Imdg.getSingleObjectByID(sdf10Id); SDf10 sdf10 = sdf10Imdg.getSingleObjectByID(sdf10Id);
@ -233,9 +242,13 @@ public class Sdf10Executor {
statementImdg.update(stmt); statementImdg.update(stmt);
} }
} }
sendToExporter(sdf11GroupId); if (requestIsIntendedForSdf10) {
log.debug("All gateway responses received for SDF10 groupId {}. SDF11 groupId {}", sdf10GroupId, sdf11GroupId); sendToExporter(sdf11GroupId);
clearContext(); log.debug("All gateway responses received for SDF10 groupId {}. SDF11 groupId {}", sdf10GroupId, sdf11GroupId);
clearContext();
} else {
log.debug("gateway response was not for SDF10 executor");
}
} }
private void clearContext() { private void clearContext() {
@ -280,17 +293,18 @@ public class Sdf10Executor {
stmt.setAmount(amount.abs()); stmt.setAmount(amount.abs());
stmt.setOperationStatus(OperationStatus.Pending.getKey()); stmt.setOperationStatus(OperationStatus.Pending.getKey());
stmt.setInSDfId(sdf10.getId()); stmt.setInSDfId(sdf10.getId());
stmt.setInOutSDfType(InOutSDfType.type6.getKey()); stmt.setInOutSDfType(InOutSDfType.type10.getKey());
stmt.setClearingDate(LocalDate.now()); stmt.setClearingDate(LocalDate.now());
stmt.setCreated(Instant.now()); stmt.setCreated(Instant.now());
return stmt; return stmt;
} }
private AssetOperationRequest requestFromStatement(Statement stmt, String tradingCode, String tcrCode) { private AssetOperationRequest requestFromStatement(Statement stmt, String tradingCode, String tcrCode, String securityCode) {
AssetOperationRequest req = new AssetOperationRequest(); AssetOperationRequest req = new AssetOperationRequest();
req.setStatementId(stmt.getId()); req.setStatementId(stmt.getId());
req.setAmount(stmt.getAmount()); // req.setAmount(stmt.getAmount());
req.setSecuritySymbol(CurrencyCode.RUB.getKey()); //fixme retrieve security symbol from validator req.setQuantity(stmt.getAmount());
req.setSecuritySymbol(securityCode); //fixme retrieve security symbol from validator
req.setTradingCode(tradingCode); req.setTradingCode(tradingCode);
req.setCode(tcrCode); req.setCode(tcrCode);
req.setDirection(stmt.getInOutDirection()); req.setDirection(stmt.getInOutDirection());

View file

@ -36,7 +36,7 @@ public enum Sdf10ValidationRule implements IValidationRule<ImdgValidationContext
if (TextUtil.isEmpty(sdf10.getDepoCode())) { if (TextUtil.isEmpty(sdf10.getDepoCode())) {
return of(ClearingError.DepoAccNotFound, sdf10.getDepoCode()); return of(ClearingError.DepoAccNotFound, sdf10.getDepoCode());
} }
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_DepoAccount, Account.class); Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
Imdg<DepoAccount> depoAccountImdg = context.obtainMap(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class); Imdg<DepoAccount> depoAccountImdg = context.obtainMap(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
Collection<Account> accs = accountImdg.getCollectionObjectsBySQL("account = '%s'".formatted(sdf10.getDepoCode())); Collection<Account> accs = accountImdg.getCollectionObjectsBySQL("account = '%s'".formatted(sdf10.getDepoCode()));
if (accs.size() != 1) { if (accs.size() != 1) {
@ -68,7 +68,7 @@ public enum Sdf10ValidationRule implements IValidationRule<ImdgValidationContext
TcrPresent() { TcrPresent() {
@Override @Override
public Optional<EnumMessage> validate(ImdgValidationContext<SDf10> context) { public Optional<EnumMessage> validate(ImdgValidationContext<SDf10> context) {
DepoAccount account = context.getStoredObject(ValidationStored.Sdf10Account); Account account = context.getStoredObject(ValidationStored.Sdf10Account);
if (account == null) { if (account == null) {
return of(ClearingError.TCRegistryNotFound, "<no account to search for>"); return of(ClearingError.TCRegistryNotFound, "<no account to search for>");
} }
@ -92,7 +92,7 @@ public enum Sdf10ValidationRule implements IValidationRule<ImdgValidationContext
// } // }
// } // }
TradingClearingRegistry tcr = tcrImdg.getFirstObjectByFieldValues( TradingClearingRegistry tcr = tcrImdg.getFirstObjectByFieldValues(
Map.of("moneyAccountId", account.getId()) Map.of("depoAccountId", account.getId())
); );
if (tcr == null) { if (tcr == null) {
return of(ClearingError.TCRegistryNotFound, "<moneyAccountId = " + account.getId() + ">"); return of(ClearingError.TCRegistryNotFound, "<moneyAccountId = " + account.getId() + ">");
@ -114,6 +114,7 @@ public enum Sdf10ValidationRule implements IValidationRule<ImdgValidationContext
ImdgPredicateBuilder prdctBldr = registryImdg.predicateBuilder(); ImdgPredicateBuilder prdctBldr = registryImdg.predicateBuilder();
Function<RegistryTradingParams, ImdgPredicate> prdctByRegistryCode = code -> prdctBldr.and( Function<RegistryTradingParams, ImdgPredicate> prdctByRegistryCode = code -> prdctBldr.and(
prdctBldr.equals("account", account.getAccount()), prdctBldr.equals("account", account.getAccount()),
prdctBldr.equals("securitySymbol", sdf10.getSecurityCode()),
prdctBldr.equals("companyId", company.getId()), prdctBldr.equals("companyId", company.getId()),
prdctBldr.sql(RegistryCodeSqlBuilder.getInstance(code).build())); prdctBldr.sql(RegistryCodeSqlBuilder.getInstance(code).build()));
Registry rgsAsf = registryImdg.getSingleObjectByPredicate(prdctByRegistryCode.apply(RegistryTradingParams.AS_F)); Registry rgsAsf = registryImdg.getSingleObjectByPredicate(prdctByRegistryCode.apply(RegistryTradingParams.AS_F));

View file

@ -183,7 +183,7 @@ public class GatewayService extends QueueConsumer implements InitializingBean {
} }
OutboundRequest outboundRequest = OutboundRequestBuilder.builder() OutboundRequest outboundRequest = OutboundRequestBuilder.builder()
.section(Section.MKR.getKey()) .section(assetOperation.getAmount() != null ? Section.MKR.getKey() : Section.FOND.getKey())
.type(OutboundRequestType.ASSET_OPERATION.getKey()) .type(OutboundRequestType.ASSET_OPERATION.getKey())
.content(content).build(); .content(content).build();