From fbda04082a33f0e276525dc06ff343af22c64caf Mon Sep 17 00:00:00 2001 From: AKurakin Date: Sat, 27 May 2023 19:55:59 +0300 Subject: [PATCH] =?UTF-8?q?securities-service=20http://jira.mfd.msk:8088/b?= =?UTF-8?q?rowse/CLS-325=20http://jira.mfd.msk:8088/browse/CLS-326=20?= =?UTF-8?q?=D0=9B=D0=B8=D1=81=D1=82=D0=B8=D0=BD=D0=B3.=20todo=20=D0=B2?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=86=D0=B8=D1=8E.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/cud/EquitySecurityService.java | 38 ++-- .../cud/FixedIncomeSecurityService.java | 38 ++-- .../service/cud/ListingService.java | 199 ++++++++++++++++++ .../cud/MoneyMarketSecurityService.java | 38 ++-- 4 files changed, 255 insertions(+), 58 deletions(-) create mode 100644 clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/ListingService.java diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/EquitySecurityService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/EquitySecurityService.java index e5ead4784..70a7e49af 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/EquitySecurityService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/EquitySecurityService.java @@ -100,12 +100,12 @@ public class EquitySecurityService extends QueueConsumer implements Initializing try { transaction.beginTransaction(); Imdg equityImdg = transaction.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); - Imdg listingMap = transaction.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); +// Imdg listingMap = transaction.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); //одним скопом выполняем реквест equityImdg.insert(equity); - Listing listing = ListingBuilder.builder() - .append(equity).append(req).build(); - listingMap.insert(listing); +// Listing listing = ListingBuilder.builder() +// .append(equity).append(req).build(); +// listingMap.insert(listing); //и сохраняем обновленный // reqInfoMap.insert(reqInfo); transaction.commitTransaction(); @@ -144,13 +144,13 @@ public class EquitySecurityService extends QueueConsumer implements Initializing equity.setInstrumentType(req.getInstrumentType()); equitySecurityImdg.update(equity); - Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", equity.getId())); - if (listing == null) { - log.error("MoneyMarketSecurityUpdateRequest id {} couldn't find listing with securityId {}", req.getId(), equity.getId()); - return null; - } - listing = updateListingByEquity(equity, listing); - listingImdg.update(listing); +// Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", equity.getId())); +// if (listing == null) { +// log.error("MoneyMarketSecurityUpdateRequest id {} couldn't find listing with securityId {}", req.getId(), equity.getId()); +// return null; +// } +// listing = updateListingByEquity(equity, listing); +// listingImdg.update(listing); return null; } @@ -170,14 +170,14 @@ public class EquitySecurityService extends QueueConsumer implements Initializing equity.setUpdated(updateTime); equitySecurityImdg.update(equity); - Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", equity.getId())); - if (listing == null) { - log.error("CommonDeleteRequest id {} couldn't find listing with securityId {}", req.getId(), equity.getId()); - return null; - } - listing.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey()); - listing.setUpdated(updateTime); - listingImdg.update(listing); +// Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", equity.getId())); +// if (listing == null) { +// log.error("CommonDeleteRequest id {} couldn't find listing with securityId {}", req.getId(), equity.getId()); +// return null; +// } +// listing.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey()); +// listing.setUpdated(updateTime); +// listingImdg.update(listing); return null; } diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/FixedIncomeSecurityService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/FixedIncomeSecurityService.java index 5b58b4d97..6cc5448fd 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/FixedIncomeSecurityService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/FixedIncomeSecurityService.java @@ -104,12 +104,12 @@ public class FixedIncomeSecurityService extends QueueConsumer implements Initial try { transaction.beginTransaction(); Imdg fixedIncomeImdg = transaction.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class); - Imdg listingMap = transaction.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); +// Imdg listingMap = transaction.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); //одним скопом выполняем реквест fixedIncomeImdg.insert(fixedIncome); - Listing listing = ListingBuilder.builder() - .append(fixedIncome).append(req).build(); - listingMap.insert(listing); +// Listing listing = ListingBuilder.builder() +// .append(fixedIncome).append(req).build(); +// listingMap.insert(listing); //и сохраняем обновленный // reqInfoMap.insert(reqInfo); transaction.commitTransaction(); @@ -154,13 +154,13 @@ public class FixedIncomeSecurityService extends QueueConsumer implements Initial fixedIncome.setSecurityId(fixedIncome.getId()); fixedIncomeSecurityImdg.update(fixedIncome); - Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", fixedIncome.getId())); - if (listing == null) { - log.error("updateFixedIncome id {} couldn't find listing with securityId {}", req.getId(), fixedIncome.getId()); - return null; - } - listing = updateListingByFixedIncome(fixedIncome, listing); - listingImdg.update(listing); +// Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", fixedIncome.getId())); +// if (listing == null) { +// log.error("updateFixedIncome id {} couldn't find listing with securityId {}", req.getId(), fixedIncome.getId()); +// return null; +// } +// listing = updateListingByFixedIncome(fixedIncome, listing); +// listingImdg.update(listing); return null; } @@ -180,14 +180,14 @@ public class FixedIncomeSecurityService extends QueueConsumer implements Initial equity.setUpdated(updateTime); fixedIncomeSecurityImdg.update(equity); - Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", equity.getId())); - if (listing == null) { - log.error("CommonDeleteRequest id {} couldn't find listing with securityId {}", req.getId(), equity.getId()); - return null; - } - listing.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey()); - listing.setUpdated(updateTime); - listingImdg.update(listing); +// Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", equity.getId())); +// if (listing == null) { +// log.error("CommonDeleteRequest id {} couldn't find listing with securityId {}", req.getId(), equity.getId()); +// return null; +// } +// listing.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey()); +// listing.setUpdated(updateTime); +// listingImdg.update(listing); return null; } diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/ListingService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/ListingService.java new file mode 100644 index 000000000..237da46f3 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/ListingService.java @@ -0,0 +1,199 @@ +package ru.spcex.clearing.securities.service.cud; + +import org.apache.commons.lang3.StringUtils; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity; +import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; +import ru.clearing.classes.statics.data.misc.Listing; +import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; +import ru.clearing.classes.statics.data.security.Security; +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.common.CommonDeleteRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.ListingNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.ListingUpdateRequest; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.securities.validation.ValidationProvider; +import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.clearing.validation.common.ValidationHelper; +import ru.spcex.platform.enumeration.UserRole; +import ru.spcex.platform.enumeration.WorkflowStatus; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgId; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.ImdgTransaction; + +import java.time.Instant; + +@Service +public class ListingService extends QueueConsumer implements InitializingBean { + private final Logger log = LoggerFactory.getLogger(getClass()); + + private final Imdg fixedIncomeSecurityImdg; + private final Imdg moneyMarketSecurityImdg; + private final Imdg equitySecurity; + + private final Imdg listingImdg; + private final ImdgProvider imdgProvider; + private final ImdgId idGenerator; + private final ValidationProvider validation; + private final UserRoleVerification userRoleVerification; + private final ValidationHelper validationHelper; + + @Autowired + public ListingService(Consumer kafkaQueue, + Producer kafkaProducer, + ImdgProvider imdgProvider, + ValidationProvider validation, + UserRoleVerification userRoleVerification, + ValidationHelper validationHelper) { + super(kafkaQueue, kafkaProducer); + this.validation = validation; + this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class); + this.moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); + this.equitySecurity = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); + this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); + this.imdgProvider = imdgProvider; + this.idGenerator = imdgProvider.getImdgIdGenerator(); + this.userRoleVerification = userRoleVerification.setRoleForVerification(UserRole.Admin); + this.validationHelper = validationHelper; + } + + @Override + public void afterPropertiesSet() { + callback(ListingNewRequest.class) + .setFunction(this::newListing) + .forDestination(Consts.LISTING_NEW, callbacks::put); + callback(ListingUpdateRequest.class) + .setFunction(this::updateListing) + .forDestination(Consts.LISTING_UPDATE, callbacks::put); + callback(CommonDeleteRequest.class) + .setFunction(this::deleteListing) + .forDestination(Consts.LISTING_DELETE, callbacks::put); + imdgProvider.waitAvailable(); + init(); + } + + protected Security selectSecurityById(Long securityId) { + Security security = fixedIncomeSecurityImdg.getSingleObjectByID(securityId); + if (security != null) return security; + security = moneyMarketSecurityImdg.getSingleObjectByID(securityId); + if (security != null) return security; + security = equitySecurity.getSingleObjectByID(securityId); + if (security != null) return security; + + return security; + } + + private RequestInfoUpdate newListing(BaseRequest userRequest) { + ImdgTransaction transaction = imdgProvider.newTransaction(); + ListingNewRequest req = userRequest.getRequestPayload(); + + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; +// RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, validation.listingNewValidator()); +// if (requestInfoUpdate != null) return requestInfoUpdate; + /* + todo +3. Проверяем значения полученных параметров: + 3.1. Необходимо выполнить ряд проверок, стандартных для всех методов (проверка на обязательность параметров исключена). + 3.2. Проверить, что в таблице security есть инструмент, для которого нужно добавить листинг по security.id = securityId из очереди. Если такой записи нет, вернуть ошибку (1011) «Инструмент %s не найден». + 3.3. Проверить, что в таблице security тип инструмента instrumentType ≠ RATE (см. справочник instrumentType). Если тип инструмента другой, вернуть ошибку (1021) «Информиция об инструментах Денежного рынка на режимах добавляется автоматически». + 3.4. Проверить, что в таблице market есть режим, с которым нужно добавить листинг по market.code = market из очереди. Если такой записи нет, вернуть ошибку (1020) «Режим %s не найден». + 3.5. Проверить, что еще нет такой же записи в таблице listing по ключу securityId И market И со статусом listing.workflowStatus=ACTV (см. справочник workflowStatus). Если запись существует, вернуть ошибку (1017) «Инструмент на режиме %s уже существует». + */ + + log.debug("newListing received"); + + Security security = selectSecurityById(req.getSecurityId()); + if (security == null) { + log.error("Security not found {}", req.getSecurityId()); + //return validationHelper.getMessageResolver() + //todo error! + } + + Listing listing = new Listing(); + listing.setId(idGenerator.nextId()); + listing.setCreated(Instant.now()); + listing.setUpdated(listing.getCreated()); + listing.setSecurityId(req.getSecurityId()); + listing.setMarket(req.getMarket()); + listing.setLotSize(req.getLotSize()); + listing.setSymbolCode(security.getSecuritySymbol()); // listing.setSymbolCode(req.getSymbolCode()); + listing.setSymbolName(security.getFullName()); // req.getSymbolName + listing.setTradingCurrency(req.getTradingCurrency()); + if (StringUtils.isEmpty(req.getWorkflowStatus())) { + listing.setWorkflowStatus(WorkflowStatus.Active.getKey()); + } else { + listing.setWorkflowStatus(req.getWorkflowStatus()); + } + + listingImdg.insert(listing); + log.debug("successfully processed, request id {}, new object id {}", userRequest.getId(), listing.getId()); + return null; // default success + } + + private RequestInfoUpdate updateListing(BaseRequest userRequest) { + ListingUpdateRequest req = userRequest.getRequestPayload(); + log.debug("updateListing received id = {}", req.getId()); + + + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; +// RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); +// if (requestInfoUpdate != null) return requestInfoUpdate; + + Listing listing = listingImdg.getSingleObjectByID(req.getId()); + + Security security = selectSecurityById(req.getSecurityId()); + if (security == null) { + log.error("Security not found {}", req.getSecurityId()); + //return validationHelper.getMessageResolver() + //todo error! + } + if (listing == null) { + log.error("listing not found {}", req.getId()); + //return validationHelper.getMessageResolver() + //todo error! + } + + listing.setUpdated(Instant.now()); + listing.setLotSize(req.getLotSize()); + //if (req.getSymbolCode()!=null) listing.setSymbolCode(req.getSymbolCode()); + //if (req.getSymbolName!=null) listing.setSymbolName(req.getSymbolName); + listing.setTradingCurrency(req.getTradingCurrency()); + if (StringUtils.isNotEmpty(req.getWorkflowStatus())) { + listing.setWorkflowStatus(req.getWorkflowStatus()); + } + + listingImdg.update(listing); + return null; + } + + private RequestInfoUpdate deleteListing(BaseRequest userRequest) { + CommonDeleteRequest req = userRequest.getRequestPayload(); + log.debug("CommonDeleteRequest received id = {}", req.getId()); + + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; +// requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, validation.listingDeleteValidator()); +// if (requestInfoUpdate != null) return requestInfoUpdate; + + Instant updateTime = Instant.now(); + Listing listing = listingImdg.getSingleObjectByID(req.getId()); + listing.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey()); + listing.setUpdated(updateTime); + + listingImdg.update(listing); + return null; + } + +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java index d9f5bd9e2..f6273c1c4 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java @@ -138,11 +138,9 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial Imdg listingMap = transaction.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); //одним скопом выполняем реквест moneyMarketSecurityMap.insert(mms); - Listing listing = ListingBuilder.builder() - .append(mms).append(req).build(); - listingMap.insert(listing); - //и сохраняем обновленный -// reqInfoMap.insert(reqInfo); +// Listing listing = ListingBuilder.builder() +// .append(mms).append(req).build(); +// listingMap.insert(listing); transaction.commitTransaction(); } catch (Throwable e) { transaction.rollbackTransaction(); @@ -193,13 +191,13 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial mms.setWorkflowStatus(req.getWorkflowStatus()); moneyMarketSecurityMap.update(mms); - Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", mms.getId())); - if (listing == null) { - log.error("MoneyMarketSecurityUpdateRequest id {} couldn't find listing with securityId {}", req.getId(), mms.getId()); - return null; - } - listing = updateListingByMms(mms, listing); - listingImdg.update(listing); +// Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", mms.getId())); +// if (listing == null) { +// log.error("MoneyMarketSecurityUpdateRequest id {} couldn't find listing with securityId {}", req.getId(), mms.getId()); +// return null; +// } +// listing = updateListingByMms(mms, listing); +// listingImdg.update(listing); return null; } @@ -227,14 +225,14 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial mms.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey()); mms.setUpdated(updateTime); moneyMarketSecurityMap.update(mms); - Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", mms.getId())); - if (listing == null) { - log.error("CommonDeleteRequest id {} couldn't find listing with securityId {}", req.getId(), mms.getId()); - return null; - } - listing.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey()); - listing.setUpdated(updateTime); - listingImdg.update(listing); +// Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", mms.getId())); +// if (listing == null) { +// log.error("CommonDeleteRequest id {} couldn't find listing with securityId {}", req.getId(), mms.getId()); +// return null; +// } +// listing.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey()); +// listing.setUpdated(updateTime); +// listingImdg.update(listing); return null; }