etreschenkov 2024-05-27 16:23:13 +03:00
parent b29d19cfaa
commit a35b19467a
7 changed files with 271 additions and 57 deletions

View file

@ -14,20 +14,29 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.account.InformationAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccountsCheckRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsg;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SendTkrRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.Tkr;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.NotificationRequest;
@ -38,6 +47,7 @@ import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.TradingClearingRegistryPurpose;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
@ -56,12 +66,15 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
private final ImdgProvider imdgProvider;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg;
private final Imdg<DepoAccount> depoAccountImdg;
private final Imdg<ClearingAccount> clearingAccountImdg;
private final Imdg<InformationAccount> informationAccountImdg;
private final Imdg<Account> accountImdg;
private final Imdg<Company> companyImdg;
private final Imdg<CompanySymbols> companySymbolsImdg;
private final Imdg<Relation> relationImdg;
private final Imdg<ClientCode> clientCodeImdg;
private final Function<TradingClearingRegistryUpdateRequest, IValidator> tradingClearingRegistryUpdateRequestValidator;
private final RequestHelper requestHelper;
@ -82,11 +95,11 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
IMessageResolver messageResolver,
RequestHelper requestHelper,
@Qualifier("tradingClearingRegistryNewRequest")
Function<TradingClearingRegistryNewRequest, IValidator> tradingClearingRegistryNewRequestValidator,
Function<TradingClearingRegistryNewRequest, IValidator> tradingClearingRegistryNewRequestValidator,
@Qualifier("tradingClearingRegistryUpdateRequest")
Function<TradingClearingRegistryUpdateRequest, IValidator> tradingClearingRegistryUpdateRequestValidator,
Function<TradingClearingRegistryUpdateRequest, IValidator> tradingClearingRegistryUpdateRequestValidator,
@Qualifier("tradingClearingRegistryBlockRequest")
Function<CommonIdRequest, IValidator> tradingClearingRegistryBlockRequestValidator) {
Function<CommonIdRequest, IValidator> tradingClearingRegistryBlockRequestValidator) {
super(kafkaQueue, kafkaProducer);
this.kafkaProducer = kafkaProducer;
this.kafkaSender = kafkaSender;
@ -95,12 +108,15 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
this.requestHelper = requestHelper;
this.imdgProvider = imdgProvider;
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.tradingClearingRegistryListImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
this.depoAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
this.informationAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class);
this.clientCodeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
this.tradingClearingRegistryNewRequestValidator = tradingClearingRegistryNewRequestValidator;
this.tradingClearingRegistryAutoNewRequestValidator = tradingClearingRegistryNewRequestValidator; // без relation.
this.tradingClearingRegistryUpdateRequestValidator = tradingClearingRegistryUpdateRequestValidator;
@ -112,17 +128,20 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
public void afterPropertiesSet() throws Exception {
imdgProvider.waitAvailable();
callback(TradingClearingRegistryNewRequest.class) // todo deprecated - unused.
.setFunction(this::tradingClearingRegistryAutoNew)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_AUTO_NEW, callbacks::put);
.setFunction(this::tradingClearingRegistryAutoNew)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_AUTO_NEW, callbacks::put);
callback(TradingClearingRegistryNewRequest.class)
.setFunction(this::tradingClearingRegistryNew)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_NEW, callbacks::put);
.setFunction(this::tradingClearingRegistryNew)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_NEW, callbacks::put);
callback(TradingClearingRegistryUpdateRequest.class)
.setFunction(this::tradingClearingRegistryUpdate)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_UPDATE, callbacks::put);
.setFunction(this::tradingClearingRegistryUpdate)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_UPDATE, callbacks::put);
callback(CommonIdRequest.class)
.setFunction(this::tradingClearingRegistryBlock)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_BLOCK, callbacks::put);
.setFunction(this::tradingClearingRegistryBlock)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_BLOCK, callbacks::put);
callback(TkrAccountsCheckRequest.class)
.setFunction(this::tradingClearingRegistryCheck)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_CHECK, callbacks::put);
init();
}
@ -162,10 +181,10 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
TradingClearingRegistry registryByCompany = tradingClearingRegistryImdg.getFirstObjectByFieldValues(Map.of("companyId", req.getCompanyId()));
if (registryByCompany == null) {
log.trace("Not found registry with companyId={}",
req.getCompanyId());
req.getCompanyId());
return requestHelper.makeErrorResponse(userRequest,
AccountError.TradingClearingRegistryNotFound,
req.getCompanyId());
AccountError.TradingClearingRegistryNotFound,
req.getCompanyId());
}
}
@ -210,6 +229,10 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
targetExistTradingClearingRegistry.setUpdated(Instant.now());
tradingClearingRegistryImdg.update(targetExistTradingClearingRegistry);
log.debug("successfully processed, id {}. Updated exist TradingClearingRegistry.id={}", id, targetExistTradingClearingRegistry.getId());
SendTkrRequest sendTkrRequest = createRequestToGateway(tradingClearingRegistry);
if (!sendTkrRequest.getTkrs().isEmpty()) {
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
}
return null;
}
}
@ -293,8 +316,8 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
TradingClearingRegistry registryByCompany = tradingClearingRegistryImdg.getFirstObjectByFieldValues(Map.of("companyId", req.getCompanyId()));
if (registryByCompany == null) {
return requestHelper.makeErrorResponse(userRequest,
AccountError.TradingClearingRegistryNotFound,
"companyId=" + req.getCompanyId());
AccountError.TradingClearingRegistryNotFound,
"companyId=" + req.getCompanyId());
}
}
@ -344,6 +367,10 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
tradingClearingRegistryImdg.insert(tradingClearingRegistry);
log.info("New TCR.id={} was created.", tradingClearingRegistry.getId());
SendTkrRequest sendTkrRequest = createRequestToGateway(tradingClearingRegistry);
if (!sendTkrRequest.getTkrs().isEmpty()) {
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
}
sendNotificationToReportSvc(tradingClearingRegistry);
sendNotificationToClearingSvc(tradingClearingRegistry);
@ -355,11 +382,11 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
protected Long companySequenceNextId(Long companyId, TradingClearingRegistryPurpose registryPurpose, String tradingRegistryType) {
ImdgPredicateBuilder pb = tradingClearingRegistryImdg.predicateBuilder();
Collection<TradingClearingRegistry> existTCR = tradingClearingRegistryImdg.getCollectionObjectsByPredicate(
pb.and(
pb.equals("companyId", companyId),
pb.equals("tradingClearingRegistryPurpose", registryPurpose.getKey()),
pb.equals("tradingClearingRegistryType", tradingRegistryType)
)
pb.and(
pb.equals("companyId", companyId),
pb.equals("tradingClearingRegistryPurpose", registryPurpose.getKey()),
pb.equals("tradingClearingRegistryType", tradingRegistryType)
)
);
if (existTCR.isEmpty()) {
log.trace("For company id={} not found exist TCR.", companyId);
@ -435,6 +462,10 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
tradingClearingRegistry.setUpdated(now);
tradingClearingRegistry.setStatus(req.getStatus());
tradingClearingRegistryImdg.update(tradingClearingRegistry);
SendTkrRequest sendTkrRequest = createRequestToGateway(tradingClearingRegistry);
if (!sendTkrRequest.getTkrs().isEmpty()) {
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
}
log.debug("Update TCR.id={}.", tradingClearingRegistry.getId());
} else {
log.debug("Nothing to update TCR.id={}.", tradingClearingRegistry.getId());
@ -464,6 +495,87 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
return null;
}
public RequestInfoUpdate tradingClearingRegistryCheck(BaseRequest<TkrAccountsCheckRequest> gatewayRequest) {
log.debug("TradingClearingRegistryCheckRequest received");
TkrAccountsCheckRequest req = gatewayRequest.getRequestPayload();
for (TkrAccount accountForCheck : req.getAccounts()) {
log.debug("Checking TKR with code: {}", accountForCheck.getTkrCode());
TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryImdg.getSingleObjectByFieldValues(
Map.of("code", accountForCheck.getTkrCode())
);
SendTkrRequest sendTkrRequest = createRequestToGateway(tradingClearingRegistry);
sendTkrRequest.setRequestId(req.getRequestId());
if (!sendTkrRequest.getTkrs().isEmpty()) {
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
}
}
return null;
}
private SendTkrRequest createRequestToGateway(TradingClearingRegistry tradingClearingRegistry){
SendTkrRequest sendTkrRequest = new SendTkrRequest();
if (tradingClearingRegistry != null) {
log.debug("Found TKR with id: {} and code: {}", tradingClearingRegistry.getId(), tradingClearingRegistry.getCode());
Company company = companyImdg.getSingleObjectByID(tradingClearingRegistry.getCompanyId());
CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(
Map.of(
"companySymbol", CompanySymbol.UUID.getKey(),
"companyId", company.getId()
)
);
ClientCode clientCode = clientCodeImdg.getFirstObjectByFieldValues(
Map.of("tradingClearingRegistryId", tradingClearingRegistry.getId())
);
Tkr tkr = new Tkr();
tkr.setCompanyId(companySymbols.getCompanySymbolValue());
tkr.setTradingCode(Long.valueOf(company.getTradingCode()));
tkr.setTkrCode(tradingClearingRegistry.getCode());
tkr.setTkrType(tradingClearingRegistry.getTradingClearingRegistryPurpose());
String accountType;
if (clientCode == null) {
if (TradingClearingRegistryType.Client_B.equalsByKey(
tradingClearingRegistry.getTradingClearingRegistryType())) {
accountType = "Клиентский общий";
} else {
accountType = "Общий";
}
} else {
tkr.setClientCode(clientCode.getCode());
accountType = "Клиентский обособленный";
}
tkr.setAccountTypeName(accountType);
DepoAccount depoAccount = depoAccountImdg.getSingleObjectByID(tradingClearingRegistry.getDepoAccountId());
Account account = null;
if (depoAccount != null) {
account = accountImdg.getSingleObjectByID(depoAccount.getAccountId());
tkr.setDepoAccount(account.getAccount());
}
{
Account moneyAccount = accountImdg.getSingleObjectByID(tradingClearingRegistry.getMoneyAccountId());
MoneyAccountMsg moneyAccountMsg = new MoneyAccountMsg();
moneyAccountMsg.setAccount(moneyAccount.getAccount());
moneyAccountMsg.setCurrCode(StringUtils.hasText(moneyAccount.getCurrency()) ? moneyAccount.getCurrency() : "RUB");
tkr.getMoneyAccounts().add(moneyAccountMsg);
}
{
Collection<TradingClearingRegistryList> tradingClearingRegistries = tradingClearingRegistryListImdg.getCollectionObjectsByFieldValues(
Map.of(
"tradingClearingRegistryId", tradingClearingRegistry.getId()
)
);
for (TradingClearingRegistryList tkrList : tradingClearingRegistries) {
Account additionalAcc = accountImdg.getSingleObjectByID(tkrList.getAccountId());
MoneyAccountMsg moneyAccountMsg = new MoneyAccountMsg();
moneyAccountMsg.setAccount(additionalAcc.getAccount());
moneyAccountMsg.setCurrCode(StringUtils.hasText(additionalAcc.getCurrency()) ? additionalAcc.getCurrency() : "RUB");
tkr.getMoneyAccounts().add(moneyAccountMsg);
}
}
sendTkrRequest.getTkrs().add(tkr);
}
return sendTkrRequest;
}
/**
* company-service сообщение об успешном добавлении ТКР клиента с параметром tradingClearingRegistry.code

View file

@ -207,6 +207,7 @@ public interface Consts {
String REGISTRY_CLEAR_MEMBER_REGISTER_CHANGE_NEW = "registry-clear-member-register-change-new";
String REPORTS_TO_GATEWAY = "reports-to-gateway";
String ACCOUNTS_TO_GATEWAY = "accounts-to-gateway";
String REGISTRY_NEW = "registry-new";

View file

@ -1,7 +1,8 @@
package ru.spcex.clearing.platform.messaging.domain.cud.gateway;
package ru.spcex.clearing.platform.messaging.domain.cud.account;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsg;
public class TkrAccount {
@JsonProperty

View file

@ -0,0 +1,28 @@
package ru.spcex.clearing.platform.messaging.domain.cud.account;
import java.util.List;
import java.util.UUID;
import com.fasterxml.jackson.annotation.JsonProperty;
public class TkrAccountsCheckRequest {
@JsonProperty
private UUID requestId;
@JsonProperty
private List<TkrAccount> accounts;
public UUID getRequestId() {
return requestId;
}
public void setRequestId(UUID requestId) {
this.requestId = requestId;
}
public List<TkrAccount> getAccounts() {
return accounts;
}
public void setAccounts(List<TkrAccount> accounts) {
this.accounts = accounts;
}
}

View file

@ -1,28 +1,29 @@
package ru.spcex.clearing.platform.messaging.domain.cud.gateway;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import com.fasterxml.jackson.annotation.JsonProperty;
public class SendTkrRequest {
@JsonProperty
private List<Tkr> tkrs;
private UUID requestId;
@JsonProperty
private List<Tkr> tkrs = new ArrayList<>();
public class Tkr {
@JsonProperty
private String companyId;
@JsonProperty
private Long tradingCode;
@JsonProperty
private String clientCode;
@JsonProperty
private String tkrCode;
@JsonProperty
private String tkrType;
@JsonProperty
private String accountTypeName;
@JsonProperty
private String depoAccount;
@JsonProperty
private List<MoneyAccountMsg> moneyAccounts;
public UUID getRequestId() {
return requestId;
}
public void setRequestId(UUID requestId) {
this.requestId = requestId;
}
public List<Tkr> getTkrs() {
return tkrs;
}
public void setTkrs(List<Tkr> tkrs) {
this.tkrs = tkrs;
}
}

View file

@ -0,0 +1,88 @@
package ru.spcex.clearing.platform.messaging.domain.cud.gateway;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;
public class Tkr {
@JsonProperty
private String companyId;
@JsonProperty
private Long tradingCode;
@JsonProperty
private String clientCode;
@JsonProperty
private String tkrCode;
@JsonProperty
private String tkrType;
@JsonProperty
private String accountTypeName;
@JsonProperty
private String depoAccount;
@JsonProperty
private List<MoneyAccountMsg> moneyAccounts = new ArrayList<>();
public String getCompanyId() {
return companyId;
}
public void setCompanyId(String companyId) {
this.companyId = companyId;
}
public Long getTradingCode() {
return tradingCode;
}
public void setTradingCode(Long tradingCode) {
this.tradingCode = tradingCode;
}
public String getClientCode() {
return clientCode;
}
public void setClientCode(String clientCode) {
this.clientCode = clientCode;
}
public String getTkrCode() {
return tkrCode;
}
public void setTkrCode(String tkrCode) {
this.tkrCode = tkrCode;
}
public String getTkrType() {
return tkrType;
}
public void setTkrType(String tkrType) {
this.tkrType = tkrType;
}
public String getAccountTypeName() {
return accountTypeName;
}
public void setAccountTypeName(String accountTypeName) {
this.accountTypeName = accountTypeName;
}
public String getDepoAccount() {
return depoAccount;
}
public void setDepoAccount(String depoAccount) {
this.depoAccount = depoAccount;
}
public List<MoneyAccountMsg> getMoneyAccounts() {
return moneyAccounts;
}
public void setMoneyAccounts(List<MoneyAccountMsg> moneyAccounts) {
this.moneyAccounts = moneyAccounts;
}
}

View file

@ -1,17 +0,0 @@
package ru.spcex.clearing.platform.messaging.domain.cud.gateway;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;
public class TkrAccountsResponse {
@JsonProperty
private List<TkrAccount> accounts;
public List<TkrAccount> getAccounts() {
return accounts;
}
public void setAccounts(List<TkrAccount> accounts) {
this.accounts = accounts;
}
}