From 478b711dee018de23d6122c93cacd72edd473626 Mon Sep 17 00:00:00 2001 From: aalehin Date: Tue, 25 Jul 2023 14:42:29 +0300 Subject: [PATCH] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-280=20---?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20(=D0=BE=D0=B1?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BB?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5)=20registerExecution=20=D0=BF=D0=BE=20=D0=B8=D1=82=D0=BE?= =?UTF-8?q?=D0=B3=D0=B0=D0=BC=20=D1=81=D0=B4=D0=B5=D0=BB=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B2=D0=B2=D0=B5=D0=BB=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D1=83=20=D0=BD=D0=B0=20=D0=B4=D1=83=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=20=D0=BF=D1=80=D0=B8=20=D0=B3=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2=D1=81=D0=B5=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=80=D0=B5=D0=B5=D1=81=D1=82=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ExecutionRegisterService.java | 105 ++++- .../registry/service/ICheckDuplicate.java | 8 + .../platform/messaging/domain/Consts.java | 2 +- .../ExecutionRegisterOnSaveRequest.java | 390 ++++++++++++++++++ 4 files changed, 500 insertions(+), 5 deletions(-) create mode 100644 clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ICheckDuplicate.java create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/ExecutionRegisterOnSaveRequest.java diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java index 946d45e05..81081d5c3 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java @@ -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 { private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg 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 collectionFond = executionFondMap.getCollectionObjectsByFieldValues(Map.of("clearingDate", localDateNow)); Collection 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 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 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> map = Map.of("exchangeExecutionId", entity.getExchangeExecutionId(), + "tradingDate", LocalDate.now()); //clarify timezone + return !executionRegisterMap.getCollectionObjectsByFieldValues(map).isEmpty(); + } + + + public ExecutionRegister getDuplicate(ExecutionCommon entity) { + Map> map = Map.of("exchangeExecutionId", entity.getExchangeExecutionId(), + "tradingDate", LocalDate.now()); //clarify timezone + return executionRegisterMap.getSingleObjectByFieldValues(map); + } } \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ICheckDuplicate.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ICheckDuplicate.java new file mode 100644 index 000000000..b59ae53a9 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ICheckDuplicate.java @@ -0,0 +1,8 @@ +package ru.spcex.clearing.registry.service; + +public interface ICheckDuplicate { + /** + * @return true - если есть дубликат в реестре, false - если дубликатов нет + * */ + boolean isDuplicateInMap(T entity); +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index 3a524711c..06ef2b082 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -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? diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/ExecutionRegisterOnSaveRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/ExecutionRegisterOnSaveRequest.java new file mode 100644 index 000000000..cb7c80222 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/ExecutionRegisterOnSaveRequest.java @@ -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; + } +} +