From bde38d9666a8e291d909ee25023ce443c2f69cad Mon Sep 17 00:00:00 2001 From: Ivan Nikolaev-Axenov Date: Fri, 11 Jul 2025 11:01:17 +0300 Subject: [PATCH 1/4] .gitkeep remove in .gitlab-ci.yml added --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ecd30edd6..a9057dd5f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -18,6 +18,7 @@ preflight: script: - pwd - git clone "http://gitlab-ci-token:$ACCESS_TOKEN@git.mfd.msk/mfd/clearing_test.git" + - find /builds/mfd/clearing/clearing_test -name ".gitkeep" -type f -delete artifacts: name: "$CI_COMMIT_REF_NAME" expire_in: 1 day From cccb4017b35684ebae3641a0bde37ad658047f02 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 11 Jul 2025 11:47:34 +0300 Subject: [PATCH 2/4] http://jira.mfd.msk:8088/browse/CLS-862 --- .../execution/ExecutionCurrencyComponent.java | 50 ++++++++++++++++--- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java index d9b417646..0a3dbbcd9 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java @@ -1,5 +1,6 @@ package ru.spcex.clearing.service.execution; +import static java.lang.String.format; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.Instant; @@ -13,6 +14,7 @@ import java.util.Optional; import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.slf4j.event.Level; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.annotation.EnableScheduling; @@ -31,6 +33,7 @@ import ru.clearing.classes.statics.data.security.Security; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingException; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.notification.NotificationSender; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.registry.DealRegisterNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExecutionType; @@ -39,6 +42,8 @@ import ru.spcex.clearing.service.validation.ValidationStored; import ru.spcex.clearing.service.validation.strades.CompanyByTradingCodeCashingValidationRule; import ru.spcex.clearing.service.validation.strades.STradesSecurityPresentValidationRule; import ru.spcex.clearing.service.validation.strades.TcrByCodeAndCmpIsActiveCashingValidationRule; +import ru.spcex.platform.enumeration.ObjectType; +import ru.spcex.platform.enumeration.Priority; import ru.spcex.platform.enumeration.Section; import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.imdg.api.Imdg; @@ -88,13 +93,14 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { private final KafkaSender kafkaSender; private static final DateTimeFormatter contractFormatter = DateTimeFormatter.ofPattern("ddMMyy"); private final Map cash = new HashMap<>(); - + private final NotificationSender notifications; @Autowired public ExecutionCurrencyComponent(ImdgProvider imdgProvider, Producer kafka, @Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender, - IMessageResolver msgResolver) { + IMessageResolver msgResolver, + NotificationSender notifications) { this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class); this.executionCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionCurrency, ExecutionCurrency.class); this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); @@ -110,6 +116,7 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { // resetTradingDay(); this.idGen = imdgProvider.getImdgIdGenerator(); + this.notifications = notifications; } @Override @@ -170,7 +177,11 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { sTrades.removeIf(sTrd -> { Side sTrdSide = IEnumKey.getEnumByKey(Side.class, sTrd.getOperation()); if (sTrdSide == null || !(sTrdSide.equals(Side.BUY) || sTrdSide.equals(Side.SELL))) { - log.warn("cannot parse strade.tradeNum={} strade.operation {}", sTrd.getTradeNum(), sTrd.getOperation()); + logNotifyW(format( + "cannot parse strade.tradeNum=%d strade.operation %s", + sTrd.getTradeNum(), + sTrd.getOperation()) + ); return true; } // MoneyFlowSide excDepSide = sTrdSide == Side.BUY ? MoneyFlowSide.BUY : MoneyFlowSide.SELL; @@ -217,7 +228,10 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { } catch (ClearingException ce) { auditMessage(ce); } catch (Exception e) { - log.error("When create new ExecutionCurrency by STrade[{}] error: {}", sTrd.getId(), ExceptionUtils.getStackTrace(e)); + String err = String.format("When create new ExecutionCurrency by STrade[%d] error: %s", + sTrd.getId(), + ExceptionUtils.getStackTrace(e)); + logNotifyE(err); } } log.info("batch putAll {} ExecutionCurrency", execsToInsert.size()); @@ -230,7 +244,8 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { protected void auditMessage(ClearingException ce) { - log.error("AUDIT error code {}: {}", ce.getEnumMsg(), ce.getMessage()); + String err = String.format("AUDIT error code %s: %s", ce.getEnumMsg(), ce.getMessage()); + logNotifyE(err); } protected void sendNotification(ExecutionCurrency forED) throws ClearingException { @@ -348,11 +363,32 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { } private void logError(IEnumId subject, Object... args) { - log.info("{}", msgResolver.resolve(new EnumMessage(subject, args))); + String err = msgResolver.resolve(new EnumMessage(subject, args)); + log.info("{}", err); + notifications.sendNotification(ObjectType.vfrs, err, Priority.HIGH); } private void logError(Long sTradeId, EnumMessage msg) { - log.warn("sTrade id={} {}", sTradeId, msgResolver.resolve(msg)); + String err = format("sTrade id=%d %s", sTradeId, msgResolver.resolve(msg)); + log.warn(err); + notifications.sendNotification(ObjectType.vfrs, err, Priority.HIGH); + } + + private void logNotifyW(String msg) { + logNotify(msg, Level.WARN); + } + + private void logNotifyE(String msg) { + logNotify(msg, Level.ERROR); + } + + private void logNotify(String msg, Level lvl) { + switch (lvl) { + case WARN -> log.warn(msg); + case ERROR -> log.error(msg); + default -> log.error("lvl not supported {}. {}", lvl, msg); + } + notifications.sendNotification(ObjectType.vfrs, msg, Priority.HIGH); } private Optional searchTcrByStrades(STrades sTrades) { From f72590da623705c467c5460ee5cb07160b7f8878 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 11 Jul 2025 12:46:38 +0300 Subject: [PATCH 3/4] http://jira.mfd.msk:8088/browse/CLS-862 --- .../execution/ExecutionCurrencyComponent.java | 6 +++--- .../service/execution/ExecutionDepositComponent.java | 10 ++++++---- .../service/execution/ExecutionFondComponent.java | 12 +++++++----- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java index 0a3dbbcd9..d1fb6cb50 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java @@ -202,7 +202,7 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { IValidator validator = valFor(sTrd); Optional error = validator.tillFirstError(); if (error.isPresent()) { - logError(sTrd.getId(), error.get()); + logError(sTrd.getTradeNum(), error.get()); continue; } ExecutionCurrency newEC; @@ -368,8 +368,8 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { notifications.sendNotification(ObjectType.vfrs, err, Priority.HIGH); } - private void logError(Long sTradeId, EnumMessage msg) { - String err = format("sTrade id=%d %s", sTradeId, msgResolver.resolve(msg)); + private void logError(Long sTradeNum, EnumMessage msg) { + String err = format("Сделка № %d не смогла быть обработана. %s", sTradeNum, msgResolver.resolve(msg)); log.warn(err); notifications.sendNotification(ObjectType.vfrs, err, Priority.HIGH); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java index bcd55df81..a75a24cd5 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java @@ -92,7 +92,9 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent { @Autowired - public ExecutionDepositComponent(ImdgProvider imdgProvider, Producer kafka, NotificationSender notifications, + public ExecutionDepositComponent(ImdgProvider imdgProvider, + Producer kafka, + NotificationSender notifications, @Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender, IMessageResolver msgResolver) { this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class); @@ -186,7 +188,7 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent { IValidator validator = valFor(sTrd); Optional error = validator.tillFirstError(); if (error.isPresent()) { - logError(sTrd.getId(), error.get()); + logError(sTrd.getTradeNum(), error.get()); continue; } ExecutionDeposit newED; @@ -355,8 +357,8 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent { } - private void logError(Long sTradeId, EnumMessage msg) { - String err = format("sTrade id=%d %s", sTradeId, msgResolver.resolve(msg)); + private void logError(Long sTradeNum, EnumMessage msg) { + String err = format("Сделка № %d не смогла быть обработана. %s", sTradeNum, msgResolver.resolve(msg)); log.warn(err); notifications.sendNotification(ObjectType.vfrs, err, Priority.HIGH); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java index 6babe6fe1..3ed703744 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java @@ -1,5 +1,6 @@ package ru.spcex.clearing.service.execution; +import static java.lang.String.format; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.Instant; @@ -9,7 +10,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Optional; -import static java.lang.String.format; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.event.Level; @@ -66,7 +66,6 @@ import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IEnumId; import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IMessageResolver; -import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; import ru.spcex.platform.utils.log.ExceptionUtils; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; import ru.spcex.platform.utils.text.TextUtil; @@ -98,7 +97,7 @@ public class ExecutionFondComponent implements IExecutionUploadComponent { //fixme ждать ТЗ Long tradeNum; Instant tradingDay; - private final IMessageResolver msgResolver = new SimpleMessageResolver(); + private final IMessageResolver msgResolver; private final KafkaSender kafkaSender; private final NotificationSender notifications; private final boolean valuation; @@ -109,7 +108,9 @@ public class ExecutionFondComponent implements IExecutionUploadComponent { @Autowired public ExecutionFondComponent(ImdgProvider imdgProvider, ClearingServiceSettings settings, - @Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender, NotificationSender notifications) { + @Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender, + NotificationSender notifications, + IMessageResolver msgResolver) { this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class); this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class); this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); @@ -129,6 +130,7 @@ public class ExecutionFondComponent implements IExecutionUploadComponent { this.valuation = settings.getTrade().getValuation(); //fixme this.kafkaSender = kafkaSender; this.notifications = notifications; + this.msgResolver = msgResolver; resetTradingDay(); } @@ -409,7 +411,7 @@ public class ExecutionFondComponent implements IExecutionUploadComponent { } private void logError(Long sTradeId, EnumMessage msg) { - String err = format("sTrade id=%d %s", sTradeId, msgResolver.resolve(msg)); + String err = format("Сделка № %d не смогла быть обработана. %s", sTradeId, msgResolver.resolve(msg)); log.warn(err); notifications.sendNotification(ObjectType.vfrs, err, Priority.HIGH); } From dd7595256c014893c25df5ec2ded75f4ba82b253 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 11 Jul 2025 13:24:44 +0300 Subject: [PATCH 4/4] http://jira.mfd.msk:8088/browse/CLS-862 --- .../execution/ExecutionCurrencyComponent.java | 12 ++++++------ .../service/execution/ExecutionDepositComponent.java | 9 +++++---- .../service/execution/ExecutionFondComponent.java | 9 +++++---- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java index d1fb6cb50..c493b6ac4 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java @@ -177,11 +177,10 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { sTrades.removeIf(sTrd -> { Side sTrdSide = IEnumKey.getEnumByKey(Side.class, sTrd.getOperation()); if (sTrdSide == null || !(sTrdSide.equals(Side.BUY) || sTrdSide.equals(Side.SELL))) { - logNotifyW(format( + log.warn(format( "cannot parse strade.tradeNum=%d strade.operation %s", sTrd.getTradeNum(), - sTrd.getOperation()) - ); + sTrd.getOperation())); return true; } // MoneyFlowSide excDepSide = sTrdSide == Side.BUY ? MoneyFlowSide.BUY : MoneyFlowSide.SELL; @@ -202,7 +201,8 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { IValidator validator = valFor(sTrd); Optional error = validator.tillFirstError(); if (error.isPresent()) { - logError(sTrd.getTradeNum(), error.get()); + String err = format("Сделка № %d не смогла быть обработана. %s", sTrd.getTradeNum(), msgResolver.resolve(error.get())); + logNotifyE(err); continue; } ExecutionCurrency newEC; @@ -231,7 +231,7 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { String err = String.format("When create new ExecutionCurrency by STrade[%d] error: %s", sTrd.getId(), ExceptionUtils.getStackTrace(e)); - logNotifyE(err); + log.error(err); } } log.info("batch putAll {} ExecutionCurrency", execsToInsert.size()); @@ -365,7 +365,7 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent { private void logError(IEnumId subject, Object... args) { String err = msgResolver.resolve(new EnumMessage(subject, args)); log.info("{}", err); - notifications.sendNotification(ObjectType.vfrs, err, Priority.HIGH); +// notifications.sendNotification(ObjectType.vfrs, err, Priority.HIGH); } private void logError(Long sTradeNum, EnumMessage msg) { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java index a75a24cd5..4b6f5c1da 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java @@ -163,7 +163,7 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent { sTrades.removeIf(sTrd -> { Side sTrdSide = IEnumKey.getEnumByKey(Side.class, sTrd.getOperation()); if (sTrdSide == null || !(sTrdSide.equals(Side.BUY) || sTrdSide.equals(Side.SELL))) { - logNotifyW(format( + log.warn(format( "cannot parse strade.tradeNum=%d strade.operation %s", sTrd.getTradeNum(), sTrd.getOperation()) @@ -188,7 +188,8 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent { IValidator validator = valFor(sTrd); Optional error = validator.tillFirstError(); if (error.isPresent()) { - logError(sTrd.getTradeNum(), error.get()); + String err = format("Сделка № %d не смогла быть обработана. %s", sTrd.getTradeNum(), msgResolver.resolve(error.get())); + logNotifyE(err); continue; } ExecutionDeposit newED; @@ -217,7 +218,7 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent { String err = String.format("When create new ExecutionDeposit by STrade[%d] error: %s", sTrd.getId(), ExceptionUtils.getStackTrace(e)); - logNotifyE(err); + log.error(err); } } log.info("batch putAll {} ExecutionDeposit", execsToInsert.size()); @@ -353,7 +354,7 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent { private void logError(IEnumId subject, Object... args) { String err = msgResolver.resolve(new EnumMessage(subject, args)); log.info("{}", err); - notifications.sendNotification(ObjectType.vfrs, err, Priority.HIGH); +// notifications.sendNotification(ObjectType.vfrs, err, Priority.HIGH); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java index 3ed703744..710bb425a 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java @@ -187,7 +187,7 @@ public class ExecutionFondComponent implements IExecutionUploadComponent { sTrades.removeIf(sTrd -> { Side sTrdSide = IEnumKey.getEnumByKey(Side.class, sTrd.getOperation()); if (sTrdSide == null || !(sTrdSide.equals(Side.BUY) || sTrdSide.equals(Side.SELL))) { - logNotifyW(format( + log.warn(format( "cannot parse strade.tradeNum=%d strade.operation %s", sTrd.getTradeNum(), sTrd.getOperation()) @@ -212,7 +212,8 @@ public class ExecutionFondComponent implements IExecutionUploadComponent { IValidator validator = valFor(sTrd); Optional error = validator.tillFirstError(); if (error.isPresent()) { - logError(sTrd.getId(), error.get()); + String err = format("Сделка № %d не смогла быть обработана. %s", sTrd.getTradeNum(), msgResolver.resolve(error.get())); + logNotifyE(err); continue; } ExecutionFond newED; @@ -241,7 +242,7 @@ public class ExecutionFondComponent implements IExecutionUploadComponent { String err = String.format("When create new ExecutionFond by STrade[%d] error: %s", sTrd.getId(), ExceptionUtils.getStackTrace(e)); - logNotifyE(err); + log.error(err); } } log.info("batch putAll {} ExecutionFond", execsToInsert.size()); @@ -407,7 +408,7 @@ public class ExecutionFondComponent implements IExecutionUploadComponent { private void logError(IEnumId subject, Object... args) { String err = msgResolver.resolve(new EnumMessage(subject, args)); log.info("{}", err); - notifications.sendNotification(ObjectType.vfrs, err, Priority.HIGH); +// notifications.sendNotification(ObjectType.vfrs, err, Priority.HIGH); } private void logError(Long sTradeId, EnumMessage msg) {