diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/error/ListingNotFound.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/error/ListingNotFound.java new file mode 100644 index 000000000..edd50d708 --- /dev/null +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/error/ListingNotFound.java @@ -0,0 +1,24 @@ +package ru.spcex.clearing.dflt.management.error; + +import ru.spcex.platform.utils.enumeration.EnumMessage; + +public class ListingNotFound extends Exception { + final EnumMessage enumMsg; + + public ListingNotFound(EnumMessage enumMsg) { + this.enumMsg = enumMsg; + } + + public ListingNotFound(DefaultManagementErrors code) { + this.enumMsg = new EnumMessage(code); + } + + public ListingNotFound(String message, Throwable cause) { + super(message, cause); + this.enumMsg = new EnumMessage(DefaultManagementErrors.GeneralError); + } + + public EnumMessage getEnumMsg() { + return enumMsg; + } +} diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/TaskListener.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/TaskListener.java index 87646ab72..6230b0511 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/TaskListener.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/TaskListener.java @@ -27,6 +27,7 @@ import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.security.Rates; import ru.spcex.clearing.dflt.management.config.settings.DefaultManagementSettings; import ru.spcex.clearing.dflt.management.enums.SendOrdersTypes; +import ru.spcex.clearing.dflt.management.error.ListingNotFound; import ru.spcex.clearing.dflt.management.service.ImdgQueryService; import ru.spcex.clearing.dflt.management.service.OrderCurrencyTriExportService; import ru.spcex.clearing.dflt.management.service.SpotOvernightOrderService; @@ -141,7 +142,11 @@ public class TaskListener extends QueueConsumer implements InitializingBean { log.warn("Unsupported overnightType={} for registry id={}", overnightType, registry.getId()); } } catch (Exception e) { - log.error("Error while processing registryId={}, ex: {}", registryId, ExceptionUtils.getStackTrace(e)); + if (e instanceof ListingNotFound) { + sendNotification("Ошибка: не найден инструмент"); + } else { + log.error("Error while processing registryId={}, ex: {}", registryId, ExceptionUtils.getStackTrace(e)); + } } } log.info("CROR createOrder finished"); @@ -163,11 +168,7 @@ public class TaskListener extends QueueConsumer implements InitializingBean { if (!messages.isEmpty()) { String comment = "После проведения первой части сделок переноса будет получен отрицательный баланс по RUB:\n" + String.join("\n", messages); - NotificationNewRequest newReq = new NotificationNewRequest(); - newReq.setObjectType(ObjectType.rgst.getKey()); - newReq.setPriority(Priority.HIGH.getKey()); - newReq.setComment(comment); - kafkaSender.sendRequestToQueue(Consts.NOTIFICATION_NEW, newReq); + sendNotification(comment); } try { @@ -230,4 +231,12 @@ public class TaskListener extends QueueConsumer implements InitializingBean { orderCurrencyImdg.update(orderCurrency); } } + + private void sendNotification(String comment) { + NotificationNewRequest newReq = new NotificationNewRequest(); + newReq.setObjectType(ObjectType.rgst.getKey()); + newReq.setPriority(Priority.HIGH.getKey()); + newReq.setComment(comment); + kafkaSender.sendRequestToQueue(Consts.NOTIFICATION_NEW, newReq); + } } diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SpotOvernightOrderService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SpotOvernightOrderService.java index e1d27f8c7..4601d557a 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SpotOvernightOrderService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SpotOvernightOrderService.java @@ -4,10 +4,13 @@ import java.math.BigDecimal; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.misc.Listing; import ru.clearing.classes.statics.data.misc.Market; import ru.clearing.classes.statics.data.misc.OrderCurrency; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.security.RiskParameter; +import ru.spcex.clearing.dflt.management.error.DefaultManagementErrors; +import ru.spcex.clearing.dflt.management.error.ListingNotFound; import ru.spcex.clearing.dflt.management.model.CounterpartyInfo; import ru.spcex.clearing.dflt.management.model.FinalCalculationResult; import ru.spcex.clearing.dflt.management.model.OrderCurrencyContext; @@ -42,7 +45,7 @@ public class SpotOvernightOrderService { this.swapCalculationService = swapCalculationService; } - public void process(Registry registry) { + public void process(Registry registry) throws ListingNotFound { String orderCategory = imdgQueryService.resolveOrderCategory(registry.getCompanyId()); Market market = imdgQueryService.getSpotMarket(); @@ -52,6 +55,16 @@ public class SpotOvernightOrderService { CounterpartyInfo rgcm = imdgQueryService.getCompanyByRole(CompanyRole.RGCM); CurrencyCode currency = IEnumKey.getEnumByKey(CurrencyCode.class, registry.getSecuritySymbol()); + try { + Listing listingT0 = imdgQueryService.findListing(registry, market.getCode(), SettleCode.T0.getKey()); + Listing listingT1 = imdgQueryService.findListing(registry, market.getCode(), SettleCode.T1.getKey()); + if (listingT0 == null || listingT1 == null) { + throw new IllegalStateException(); + } + } catch (Exception e) { + throw new ListingNotFound(DefaultManagementErrors.OperationNotAllowed); + } + OrderCurrencyContext context = OrderCurrencyContext.builder() .registry(registry) .orderCategory(orderCategory) diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOvernightOrderService.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOvernightOrderService.java index 1f9ecb8a6..7397866bc 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOvernightOrderService.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/SwapOvernightOrderService.java @@ -4,10 +4,13 @@ import java.math.BigDecimal; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.misc.Listing; import ru.clearing.classes.statics.data.misc.Market; import ru.clearing.classes.statics.data.misc.OrderCurrency; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.security.RiskParameter; +import ru.spcex.clearing.dflt.management.error.DefaultManagementErrors; +import ru.spcex.clearing.dflt.management.error.ListingNotFound; import ru.spcex.clearing.dflt.management.model.CounterpartyInfo; import ru.spcex.clearing.dflt.management.model.FinalCalculationResult; import ru.spcex.clearing.dflt.management.model.OrderCurrencyContext; @@ -42,7 +45,7 @@ public class SwapOvernightOrderService { this.swapCalculationService = swapCalculationService; } - public void process(Registry registry) { + public void process(Registry registry) throws ListingNotFound { String orderCategory = imdgQueryService.resolveOrderCategory(registry.getCompanyId()); Market market = imdgQueryService.getSwapMarket(); @@ -51,6 +54,15 @@ public class SwapOvernightOrderService { CounterpartyInfo clcc = imdgQueryService.getCompanyByRole(CompanyRole.CLCC); CounterpartyInfo rgcm = imdgQueryService.getCompanyByRole(CompanyRole.RGCM); CurrencyCode currency = IEnumKey.getEnumByKey(CurrencyCode.class, registry.getSecuritySymbol()); + try { + Listing listing = imdgQueryService.findListing(registry, market.getCode(), SettleCode.T1.getKey()); + if (listing == null) { + throw new IllegalStateException(); + } + } catch (Exception e) { + throw new ListingNotFound(DefaultManagementErrors.OperationNotAllowed); + } + OrderCurrencyContext context = OrderCurrencyContext.builder() .registry(registry) .orderCategory(orderCategory)