etreschenkov 2026-04-28 18:06:48 +03:00
parent 0227e34269
commit 8a1497f952

View file

@ -3,32 +3,59 @@ package ru.spcex.clearing.dflt.management.service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.StringJoiner; import java.util.StringJoiner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.misc.OrderCurrency; import ru.clearing.classes.statics.data.misc.OrderCurrency;
import ru.clearing.classes.statics.data.security.Rates; import ru.clearing.classes.statics.data.security.Rates;
import ru.clearing.platform.dictionary.CurrencyPairDictionary; import ru.clearing.platform.dictionary.CurrencyPairDictionary;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.NotificationNewRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.enumeration.ObjectType;
import ru.spcex.platform.enumeration.OvernightType; import ru.spcex.platform.enumeration.OvernightType;
import ru.spcex.platform.enumeration.Priority;
import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.enumeration.Side;
@Service @Service
public class OrderCurrencyTriExportService { public class OrderCurrencyTriExportService {
private static final Logger log = LoggerFactory.getLogger(OrderCurrencyTriExportService.class);
private final ImdgQueryService imdgQueryService; private final ImdgQueryService imdgQueryService;
private final KafkaSender kafkaSender;
private static final String ACTION = "Ввод внебиржевой заявки"; private static final String ACTION = "Ввод внебиржевой заявки";
public OrderCurrencyTriExportService( public OrderCurrencyTriExportService(ImdgQueryService imdgQueryService,
ImdgQueryService imdgQueryService) { KafkaSender kafkaSender) {
this.imdgQueryService = imdgQueryService; this.imdgQueryService = imdgQueryService;
this.kafkaSender = kafkaSender;
} }
/** /**
* Возвращает содержимое tri-файла в виде строки. * Возвращает содержимое tri-файла в виде строки.
*/ */
public String exportToTri(Collection<OrderCurrency> orders) { public String exportToTri(Collection<OrderCurrency> orders) {
return orders.stream() boolean allSuccess = true;
.map(this::toTriLine) List<String> rows = new ArrayList<>();
for (OrderCurrency orderCurrency : orders) {
String baseCurrency = resolveBaseRate(orderCurrency);
if (OvernightType.SWAP.equalsByKey(orderCurrency.getOvernightType()) && baseCurrency == null) {
allSuccess = false;
}
rows.add(toTriLine(orderCurrency, baseCurrency));
}
if (!allSuccess) {
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);
}
return rows.stream()
.reduce((a, b) -> a + System.lineSeparator() + b) .reduce((a, b) -> a + System.lineSeparator() + b)
.orElse(""); .orElse("");
} }
@ -40,7 +67,7 @@ public class OrderCurrencyTriExportService {
return exportToTri(orders).getBytes(StandardCharsets.UTF_8); return exportToTri(orders).getBytes(StandardCharsets.UTF_8);
} }
private String toTriLine(OrderCurrency orderCurrency) { private String toTriLine(OrderCurrency orderCurrency, String baseCurrency) {
StringJoiner joiner = new StringJoiner(";", "", ";"); StringJoiner joiner = new StringJoiner(";", "", ";");
joiner.add("TRANS_ID=" + nullSafe(orderCurrency.getId())); joiner.add("TRANS_ID=" + nullSafe(orderCurrency.getId()));
joiner.add("CLASSCODE=" + nullSafe(orderCurrency.getMarket())); joiner.add("CLASSCODE=" + nullSafe(orderCurrency.getMarket()));
@ -56,7 +83,7 @@ public class OrderCurrencyTriExportService {
joiner.add("Ссылка="); joiner.add("Ссылка=");
joiner.add("Код расчетов=" + nullSafe(orderCurrency.getSettleCode())); joiner.add("Код расчетов=" + nullSafe(orderCurrency.getSettleCode()));
joiner.add("На заявку №="); joiner.add("На заявку №=");
joiner.add("Базовый курс=" + resolveBaseRate(orderCurrency)); joiner.add("Базовый курс=" + nullSafe(baseCurrency));
return joiner.toString(); return joiner.toString();
} }
@ -68,22 +95,23 @@ public class OrderCurrencyTriExportService {
if (Side.SELL.equalsByKey(side)) { if (Side.SELL.equalsByKey(side)) {
return "Продажа"; return "Продажа";
} }
throw new IllegalArgumentException("Неизвестное значение side: " + side); log.warn("Неизвестное значение side: {}", side);
return "";
} }
private String resolveBaseRate(OrderCurrency orderCurrency) { public String resolveBaseRate(OrderCurrency orderCurrency) {
if (OvernightType.SPOT.equalsByKey(orderCurrency.getOvernightType())) { if (OvernightType.SPOT.equalsByKey(orderCurrency.getOvernightType())) {
return ""; return "";
} }
CurrencyPairDictionary currencyPairDictionary = imdgQueryService.getCurrencyPairDictionaryBySecurityId(orderCurrency.getSecurityId()); CurrencyPairDictionary currencyPairDictionary = imdgQueryService.getCurrencyPairDictionaryBySecurityId(orderCurrency.getSecurityId());
String baseCurrency = currencyPairDictionary.getBaseCurrency(); String baseCurrency = currencyPairDictionary.getBaseCurrency();
Rates rates = imdgQueryService.getRate(currencyPairDictionary.getBaseCurrency(), LocalDate.now()); LocalDate now = LocalDate.now();
Rates rates = imdgQueryService.getRate(currencyPairDictionary.getBaseCurrency(), now);
if (rates == null || rates.getValue() == null) { if (rates == null || rates.getValue() == null) {
throw new IllegalStateException( log.warn("Не найден активный курс для валюты {} на дату {}", baseCurrency, now);
"Не найден активный курс для валюты " + baseCurrency + " на дату " + LocalDate.now() return null;
);
} }
return formatDecimal(rates.getValue()); return formatDecimal(rates.getValue());