---
добавил (обновление или добавление) registerExecution по итогам сделки
ввел проверку на дубликат при генерации всего реестра
This commit is contained in:
aalehin 2023-07-25 14:42:29 +03:00
parent 26145a7587
commit 478b711dee
4 changed files with 500 additions and 5 deletions

View file

@ -14,6 +14,8 @@ import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.classes.statics.data.register.ExecutionRegister;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExecutionRegisterOnSaveRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.platform.enumeration.CompanySymbol;
@ -31,7 +33,7 @@ import static ru.spcex.clearing.imdg.IMDGDistributedNames.*;
import static ru.spcex.platform.enumeration.Task.createRegistry_ECNR;
@Service
public class ExecutionRegisterService extends QueueConsumer implements InitializingBean {
public class ExecutionRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate<ExecutionCommon> {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<ExecutionRegister> executionRegisterMap;
@ -58,6 +60,9 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
callback(LauncherCommandRequest.class)
.setConsumer(this::executionRegisterNew)
.forDestination(createRegistry_ECNR.topic(), callbacks::put);
callback(ExecutionRegisterOnSaveRequest.class)
.setConsumer(this::executionRegisterOnSavingOfTrade)
.forDestination(Consts.REGISTRY_EXECUTION_REGISTER_ON_SAVE, callbacks::put);
init();
}
@ -66,11 +71,41 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
log.debug("ExecutionRegisterNewRequest received");
Collection<ExecutionFond> collectionFond = executionFondMap.getCollectionObjectsByFieldValues(Map.of("clearingDate", localDateNow));
Collection<ExecutionDeposit> collectionDeposit = executionDepositMap.getCollectionObjectsByFieldValues(Map.of("clearingDate", localDateNow));
collectionFond.forEach(x -> insertExecutionRegister(true, x));
collectionDeposit.forEach(x -> insertExecutionRegister(false, x));
collectionFond.forEach(x -> {
if (!isDuplicateInMap(x)) {
insertExecutionRegister(true, x);
}
});
collectionDeposit.forEach(x -> {
if (!isDuplicateInMap(x)) {
insertExecutionRegister(false, x);
}
});
log.debug("successfully processed...");
}
public void executionRegisterOnSavingOfTrade(BaseRequest<ExecutionRegisterOnSaveRequest> userRequest) {
ExecutionRegisterOnSaveRequest request = userRequest.getRequestPayload();
ExecutionCommon common = setUpExecutionCommon(request);
boolean isFond = request.isExecutionFond();
if (!isDuplicateInMap(common)) {
insertExecutionRegister(isFond, common);
} else {
updateExecutionRegister(isFond, common);
}
}
private void updateExecutionRegister(boolean isFond, ExecutionCommon common) {
log.trace("Started updating ExecutionRegister entity...");
ExecutionRegister registerToUpdate = getDuplicate(common);
registerToUpdate.setSecurityId(common.getSecurityId());
registerToUpdate.setExchangeExecutionTime(common.getExchangeExecutionTime());
registerToUpdate.setAmount(isFond ? ((ExecutionFond) common).getSettlementAmount() : ((ExecutionDeposit) common).getFirstLegAmount());
registerToUpdate.setQuantity(isFond ? common.getQuantity() : null);
registerToUpdate.setUpdated(Instant.now());
executionRegisterMap.update(registerToUpdate);
log.debug("Updated successfully ExecutionRegister entity with id: {}", registerToUpdate.getId());
}
private void insertExecutionRegister(Boolean isFond, ExecutionCommon common) {
log.trace("Started generating ExecutionRegister entity...");
@ -164,7 +199,55 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
executionRegister.setClearingDate(common.getClearingDate());
executionRegister.setCreated(Instant.now());
executionRegisterMap.insert(executionRegister);
log.debug("inserted successfully LiabilitiesRegister entity with id: {}", executionRegister.getId());
log.debug("inserted successfully ExecutionRegister entity with id: {}", executionRegister.getId());
}
private ExecutionCommon setUpExecutionCommon(ExecutionRegisterOnSaveRequest request) {
ExecutionFond fond = null;
ExecutionDeposit deposit = null;
if (request.isExecutionFond()) {
fond = new ExecutionFond();
fond.setExchangeOrderId(request.getExchangeOrderId());
fond.setSettlementAmount(request.getSettlementAmount());
fond.setComment(request.getComment());
fond.setClientCodeId(request.getClientCodeId());
fond.setSettlementCode(request.getSettlementCode());
fond.setSettlementDate(request.getSettlementDate());
fond.setExchangeExecutionMicroseconds(request.getExchangeExecutionMicroseconds());
} else {
deposit = new ExecutionDeposit();
deposit.setFirstLegAmount(request.getFirstLegAmount());
deposit.setSecondLegAmount(request.getSecondLegAmount());
deposit.setFirstLegSettlementDate(request.getFirstLegSettlementDate());
deposit.setSecondLegSettlementDate(request.getSecondLegSettlementDate());
deposit.setFirstLegSettlementCode(request.getFirstLegSettlementCode());
deposit.setSecondLegSettlementCode(request.getSecondLegSettlementCode());
deposit.setContract(request.getContract());
deposit.setSecurityCode(request.getSecurityCode());
}
boolean isFond = fond != null;
ExecutionCommon common = isFond ? fond : deposit;
common.setExchangeExecutionId(request.getExchangeExecutionId());
common.setExchangeExecutionTime(request.getExchangeExecutionTime());
common.setTradingDate(request.getTradingDate());
common.setTradingClearingRegistryId(request.getTradingClearingRegistryId());
common.setMarket(request.getMarket());
common.setPrice(request.getPrice());
common.setLots(request.getLots());
common.setQuantity(request.getQuantity());
common.setInterestAmount(request.getInterestAmount());
common.setSide(request.getSide());
common.setSettlementCurrency(request.getSettlementCurrency());
common.setCompanyId(request.getCompanyId());
common.setDuration(request.getDuration());
common.setSecurityFullName(request.getSecurityFullName());
common.setSecuritySymbol(request.getSecuritySymbol());
common.setSecurityId(request.getSecurityId());
common.setCounterPartyId(request.getCounterPartyId());
common.setCoverageStatus(request.getCoverageStatus());
common.setSessionId(request.getSessionId());
common.setClearingDate(request.getClearingDate());
return common;
}
private Optional<CompanySymbols> getCompanySymbolsByCompanyIdAndCompanySymbol(String companySymbol, Long companyId) {
@ -190,4 +273,18 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryMap.getFirstObjectByFieldValues(fieldValues);
return Optional.ofNullable(tradingClearingRegistry);
}
@Override
public boolean isDuplicateInMap(ExecutionCommon entity) {
Map<String, ? extends Comparable<?>> map = Map.of("exchangeExecutionId", entity.getExchangeExecutionId(),
"tradingDate", LocalDate.now()); //clarify timezone
return !executionRegisterMap.getCollectionObjectsByFieldValues(map).isEmpty();
}
public ExecutionRegister getDuplicate(ExecutionCommon entity) {
Map<String, ? extends Comparable<?>> map = Map.of("exchangeExecutionId", entity.getExchangeExecutionId(),
"tradingDate", LocalDate.now()); //clarify timezone
return executionRegisterMap.getSingleObjectByFieldValues(map);
}
}

View file

@ -0,0 +1,8 @@
package ru.spcex.clearing.registry.service;
public interface ICheckDuplicate<T> {
/**
* @return true - если есть дубликат в реестре, false - если дубликатов нет
* */
boolean isDuplicateInMap(T entity);
}

View file

@ -171,7 +171,7 @@ public interface Consts {
String REGISTRY_DEPO_PAYMENT_INSTRUCTION_REGISTER_NEW = "registry-depo-payment-instruction-register-new";
String REGISTRY_EXCLUDE_LIABILITIES_REGISTER_NEW = "registry-exclude-liabilities-register-new";
String REGISTRY_LIABILITIES_REGISTER_NEW = "registry-liabilities-register-new";
String REGISTRY_EXECUTION_REGISTER_NEW = "registry-execution-register-new";
String REGISTRY_EXECUTION_REGISTER_ON_SAVE = "registry-execution-register-on-save";
String REGISTRY_EXECUTION_REGISTER_UPDATE = "registry-execution-register-update";
//TODO IS IT NEEDED RIGHT HERE?

View file

@ -0,0 +1,390 @@
package ru.spcex.clearing.platform.messaging.domain.cud.registry;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.InstantDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.InstantSerializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
public class ExecutionRegisterOnSaveRequest {
@JsonProperty
private Long exchangeExecutionId;
@JsonSerialize(using = InstantSerializer.class)
@JsonDeserialize(using = InstantDeserializer.class)
@JsonProperty
private Instant exchangeExecutionTime;
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
private LocalDate tradingDate;
@JsonProperty
private Long tradingClearingRegistryId;
@JsonProperty
private String market;
@JsonProperty
private BigDecimal price;
@JsonProperty
private BigDecimal lots;
@JsonProperty
private BigDecimal quantity;
@JsonProperty
private BigDecimal interestAmount;
@JsonProperty
private String side;
@JsonProperty
private String settlementCurrency;
@JsonProperty
private Long companyId;
@JsonProperty
private Long duration;
@JsonProperty
private String securityFullName;
@JsonProperty
private String securitySymbol;
@JsonProperty
private Long securityId;
@JsonProperty
private Long counterPartyId;
@JsonProperty
private String coverageStatus;
@JsonProperty
private Long sessionId;
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
private LocalDate clearingDate;
//execution fond
@JsonProperty
private BigDecimal firstLegAmount;
@JsonProperty
private BigDecimal secondLegAmount;
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
private LocalDate firstLegSettlementDate;
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
private LocalDate secondLegSettlementDate;
@JsonProperty
private String firstLegSettlementCode;
@JsonProperty
private String secondLegSettlementCode;
@JsonProperty
private String contract;
@JsonProperty
private String securityCode;
//execution deposit
@JsonProperty
private Long exchangeOrderId;
@JsonProperty
private BigDecimal settlementAmount;
@JsonProperty
private String comment;
@JsonProperty
private Long clientCodeId;
@JsonProperty
private String settlementCode;
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
private LocalDate settlementDate;
@JsonSerialize(using = InstantSerializer.class)
@JsonDeserialize(using = InstantDeserializer.class)
@JsonProperty
private Instant exchangeExecutionMicroseconds;
public boolean isExecutionFond() {
return exchangeOrderId != null || settlementAmount != null || comment != null || clientCodeId != null || settlementCode != null || settlementDate != null || exchangeExecutionMicroseconds != null;
}
public Long getExchangeExecutionId() {
return exchangeExecutionId;
}
public void setExchangeExecutionId(Long exchangeExecutionId) {
this.exchangeExecutionId = exchangeExecutionId;
}
public Instant getExchangeExecutionTime() {
return exchangeExecutionTime;
}
public void setExchangeExecutionTime(Instant exchangeExecutionTime) {
this.exchangeExecutionTime = exchangeExecutionTime;
}
public LocalDate getTradingDate() {
return tradingDate;
}
public void setTradingDate(LocalDate tradingDate) {
this.tradingDate = tradingDate;
}
public Long getTradingClearingRegistryId() {
return tradingClearingRegistryId;
}
public void setTradingClearingRegistryId(Long tradingClearingRegistryId) {
this.tradingClearingRegistryId = tradingClearingRegistryId;
}
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public BigDecimal getLots() {
return lots;
}
public void setLots(BigDecimal lots) {
this.lots = lots;
}
public BigDecimal getQuantity() {
return quantity;
}
public void setQuantity(BigDecimal quantity) {
this.quantity = quantity;
}
public BigDecimal getInterestAmount() {
return interestAmount;
}
public void setInterestAmount(BigDecimal interestAmount) {
this.interestAmount = interestAmount;
}
public String getSide() {
return side;
}
public void setSide(String side) {
this.side = side;
}
public String getSettlementCurrency() {
return settlementCurrency;
}
public void setSettlementCurrency(String settlementCurrency) {
this.settlementCurrency = settlementCurrency;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public Long getDuration() {
return duration;
}
public void setDuration(Long duration) {
this.duration = duration;
}
public String getSecurityFullName() {
return securityFullName;
}
public void setSecurityFullName(String securityFullName) {
this.securityFullName = securityFullName;
}
public String getSecuritySymbol() {
return securitySymbol;
}
public void setSecuritySymbol(String securitySymbol) {
this.securitySymbol = securitySymbol;
}
public Long getSecurityId() {
return securityId;
}
public void setSecurityId(Long securityId) {
this.securityId = securityId;
}
public Long getCounterPartyId() {
return counterPartyId;
}
public void setCounterPartyId(Long counterPartyId) {
this.counterPartyId = counterPartyId;
}
public String getCoverageStatus() {
return coverageStatus;
}
public void setCoverageStatus(String coverageStatus) {
this.coverageStatus = coverageStatus;
}
public Long getSessionId() {
return sessionId;
}
public void setSessionId(Long sessionId) {
this.sessionId = sessionId;
}
public LocalDate getClearingDate() {
return clearingDate;
}
public void setClearingDate(LocalDate clearingDate) {
this.clearingDate = clearingDate;
}
public BigDecimal getFirstLegAmount() {
return firstLegAmount;
}
public void setFirstLegAmount(BigDecimal firstLegAmount) {
this.firstLegAmount = firstLegAmount;
}
public BigDecimal getSecondLegAmount() {
return secondLegAmount;
}
public void setSecondLegAmount(BigDecimal secondLegAmount) {
this.secondLegAmount = secondLegAmount;
}
public LocalDate getFirstLegSettlementDate() {
return firstLegSettlementDate;
}
public void setFirstLegSettlementDate(LocalDate firstLegSettlementDate) {
this.firstLegSettlementDate = firstLegSettlementDate;
}
public LocalDate getSecondLegSettlementDate() {
return secondLegSettlementDate;
}
public void setSecondLegSettlementDate(LocalDate secondLegSettlementDate) {
this.secondLegSettlementDate = secondLegSettlementDate;
}
public String getFirstLegSettlementCode() {
return firstLegSettlementCode;
}
public void setFirstLegSettlementCode(String firstLegSettlementCode) {
this.firstLegSettlementCode = firstLegSettlementCode;
}
public String getSecondLegSettlementCode() {
return secondLegSettlementCode;
}
public void setSecondLegSettlementCode(String secondLegSettlementCode) {
this.secondLegSettlementCode = secondLegSettlementCode;
}
public String getContract() {
return contract;
}
public void setContract(String contract) {
this.contract = contract;
}
public String getSecurityCode() {
return securityCode;
}
public void setSecurityCode(String securityCode) {
this.securityCode = securityCode;
}
public Long getExchangeOrderId() {
return exchangeOrderId;
}
public void setExchangeOrderId(Long exchangeOrderId) {
this.exchangeOrderId = exchangeOrderId;
}
public BigDecimal getSettlementAmount() {
return settlementAmount;
}
public void setSettlementAmount(BigDecimal settlementAmount) {
this.settlementAmount = settlementAmount;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public Long getClientCodeId() {
return clientCodeId;
}
public void setClientCodeId(Long clientCodeId) {
this.clientCodeId = clientCodeId;
}
public String getSettlementCode() {
return settlementCode;
}
public void setSettlementCode(String settlementCode) {
this.settlementCode = settlementCode;
}
public LocalDate getSettlementDate() {
return settlementDate;
}
public void setSettlementDate(LocalDate settlementDate) {
this.settlementDate = settlementDate;
}
public Instant getExchangeExecutionMicroseconds() {
return exchangeExecutionMicroseconds;
}
public void setExchangeExecutionMicroseconds(Instant exchangeExecutionMicroseconds) {
this.exchangeExecutionMicroseconds = exchangeExecutionMicroseconds;
}
}