diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings_mm/MMListingsRequestParam.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings_mm/MMListingsRequestParam.java new file mode 100644 index 000000000..62d90774a --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings_mm/MMListingsRequestParam.java @@ -0,0 +1,58 @@ +package ru.spcex.clearing.gatewayapi.logic.listings_mm; + +import ru.spcex.clearing.gatewayapi.request.MMListingsRequest; +import ru.spcex.clearing.gatewayapi.request.objects.DirAuctionBiddingType; +import ru.spcex.clearing.gatewayapi.request.objects.DirCurrencyCode; +import ru.spcex.clearing.gatewayapi.request.objects.DirTradingModeMkr; +import ru.spcex.clearing.gatewayapi.request.objects.ExchangeInstrument; + +import java.util.List; + +public class MMListingsRequestParam { + private final MMListingsRequest request; + private List exchangeInstrumentsList; + private List dirAuctionBiddingTypeList; + private List dirCurrencyCodeList; + private List dirTradingModeMkrList; + + public MMListingsRequestParam(MMListingsRequest request) { + this.request = request; + } + + + public MMListingsRequest getRequest() { + return request; + } + + public List getExchangeInstrumentsList() { + return exchangeInstrumentsList; + } + + public void setExchangeInstrumentsList(List exchangeInstrumentsList) { + this.exchangeInstrumentsList = exchangeInstrumentsList; + } + + public List getDirAuctionBiddingTypeList() { + return dirAuctionBiddingTypeList; + } + + public void setDirAuctionBiddingTypeList(List dirAuctionBiddingTypeList) { + this.dirAuctionBiddingTypeList = dirAuctionBiddingTypeList; + } + + public List getDirCurrencyCodeList() { + return dirCurrencyCodeList; + } + + public void setDirCurrencyCodeList(List dirCurrencyCodeList) { + this.dirCurrencyCodeList = dirCurrencyCodeList; + } + + public List getDirTradingModeMkrList() { + return dirTradingModeMkrList; + } + + public void setDirTradingModeMkrList(List dirTradingModeMkrList) { + this.dirTradingModeMkrList = dirTradingModeMkrList; + } +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings_mm/PrepareExchangeInstruments.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings_mm/PrepareExchangeInstruments.java new file mode 100644 index 000000000..d43ca1246 --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings_mm/PrepareExchangeInstruments.java @@ -0,0 +1,97 @@ +package ru.spcex.clearing.gatewayapi.logic.listings_mm; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.spcex.clearing.gatewayapi.logic.ProcessResult; +import ru.spcex.clearing.gatewayapi.logic.Stage; +import ru.spcex.clearing.gatewayapi.request.objects.DirAuctionBiddingType; +import ru.spcex.clearing.gatewayapi.request.objects.DirTradingModeMkr; +import ru.spcex.clearing.gatewayapi.request.objects.ExchangeInstrument; +import ru.spcex.clearing.gatewayapi.request.objects.TradingMode; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class PrepareExchangeInstruments extends Stage { + private final Logger log = LoggerFactory.getLogger(getClass()); + + @Override + public ProcessResult process(MMListingsRequestParam param) { + List exchangeInstrumentList = param.getExchangeInstrumentsList(); + + // Проверяем что в exchange_instrument нет объектов с одинаковым id + Map exchangeInstrumentMap = new HashMap<>(); + for (ExchangeInstrument exchangeInstrument : exchangeInstrumentList) { + if (exchangeInstrumentMap.containsKey(exchangeInstrument.getId())) { + log.warn("For exchange_instrument.UUID {} found > 1 element from request, use first", exchangeInstrument.getId()); + exchangeInstrument.setInvalidData(true); + continue; + } + exchangeInstrumentMap.put(exchangeInstrument.getId(), exchangeInstrument); + } + + // Находим для exchange_instrument соответствующий trading_mode по условию: + // exchange_instrument.id = trading_mode.exchange_instrument_id + List tradingModeList = param.getRequest().getTradingModeList(); + Map tradingModeMap = new HashMap<>(); + for (TradingMode tradingMode : tradingModeList) { + if (tradingModeMap.containsKey(tradingMode.getTradingModeId())) { + log.warn("For trading_mode.UUID {} found > 1 element from request, use first", tradingMode.getTradingModeId()); + continue; + } + tradingModeMap.put(tradingMode.getTradingModeId(), tradingMode); + UUID exchangeInstrumentId = tradingMode.getExchangeInstrumentId(); + ExchangeInstrument exchangeInstrument = exchangeInstrumentMap.get(exchangeInstrumentId); + if (exchangeInstrument != null) { + if (exchangeInstrument.getTradingMode() != null) { + log.warn("For exchange_instrument.id {} found > 1 trading_mode, use first", tradingMode.getExchangeInstrumentId()); + continue; + } + exchangeInstrument.setTradingMode(tradingMode); + } else { + log.warn("For trading_mode.exchange_instrument_id {} not found exchange_instrument, trading_mode skipped", exchangeInstrumentId); + } + } + + // Находим для exchange_instrument соответсвующий dir_auction_bidding_type по условию: + // exchange_instrument.auction_bidding_type_id = dir_auction_bidding_type.id + Map dirAuctionBiddingTypeMap = new HashMap<>(); + for (DirAuctionBiddingType dirAuctionBiddingType : param.getRequest().getDirAuctionBiddingTypeList()) { + if (dirAuctionBiddingTypeMap.containsKey(dirAuctionBiddingType.getId())) { + log.warn("For dir_auction_bidding_type.id {} found > 1 element from request, use first", dirAuctionBiddingType.getId()); + continue; + } + dirAuctionBiddingTypeMap.put(dirAuctionBiddingType.getId(), dirAuctionBiddingType); + } + for (ExchangeInstrument exchangeInstrument : exchangeInstrumentList) { + if (exchangeInstrument.isInvalidData()) continue; + DirAuctionBiddingType dirAuctionBiddingType = dirAuctionBiddingTypeMap.get(exchangeInstrument.getAuctionBiddingTypeId()); + if (dirAuctionBiddingType == null) { + log.warn("For exchange_instrument.id {} not found dir_auction_bidding_type", exchangeInstrument.getId()); + continue; + } + exchangeInstrument.setDirAuctionBiddingType(dirAuctionBiddingType); + } + + // Находим для trading_mode соответствующий dir_trading_mode_mkr по условию: + // trading_mode.trading_mode_id = dir_trading_mode_mkr.id + List dirTradingModeMkrList = param.getRequest().getDirTradingModeMkrList(); + for (DirTradingModeMkr dirTradingModeMkr : dirTradingModeMkrList) { + UUID tradingModeUUID = dirTradingModeMkr.getId(); + TradingMode tradingMode = tradingModeMap.get(tradingModeUUID); + if (tradingMode != null) { + if (tradingMode.getDirTradingModeMkr() != null) { + log.warn("For trading_mode.trading_more_id {} found > 1 dir_trading_mode_mkr, use first", tradingModeUUID); + continue; + } + tradingMode.setDirTradingModeMkr(dirTradingModeMkr); + } else { + log.warn("For dir_trading_mode_mkr.id {} not found trading_mode (for trading_mode_id), dir_trading_mode skipped", tradingModeUUID); + } + } + + return null; + } +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/FondListingsRequest.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/FondListingsRequest.java index 6cbfcb593..9dcbcd031 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/FondListingsRequest.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/FondListingsRequest.java @@ -8,7 +8,7 @@ import java.util.List; public class FondListingsRequest extends BaseRequest { @JsonProperty("security") - @ApiModelProperty(value = "Список security") + @ApiModelProperty(value = "Список инструментов") private List securities; @JsonProperty("coupon_schedule") diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/MMListingsRequest.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/MMListingsRequest.java new file mode 100644 index 000000000..5b5b53f99 --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/MMListingsRequest.java @@ -0,0 +1,69 @@ +package ru.spcex.clearing.gatewayapi.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModelProperty; +import ru.spcex.clearing.gatewayapi.request.objects.*; + +import java.util.List; + +public class MMListingsRequest extends BaseRequest { + @JsonProperty("exchange_instrument") + @ApiModelProperty(value = "Список инструментов") + private List exchangeInstrumentList; + + @JsonProperty("dir_auction_bidding_type") + @ApiModelProperty(value = "Справочник «Тип аукциона или торгов»") + private List dirAuctionBiddingTypeList; + + @JsonProperty("dir_currency_code") + @ApiModelProperty(value = "Справочник «Коды валют»") + private List dirCurrencyCodeList; + + @JsonProperty("trading_mode") + @ApiModelProperty(value = "Список режимов торгов Спецификации биржевого инструмента") + private List tradingModeList; + + @JsonProperty("dir_trading_mode_mkr") + @ApiModelProperty(value = "Справочник «Режимы торгов МКР»") + private List dirTradingModeMkrList; + + public List getExchangeInstrumentList() { + return exchangeInstrumentList; + } + + public void setExchangeInstrumentList(List exchangeInstrumentList) { + this.exchangeInstrumentList = exchangeInstrumentList; + } + + public List getDirAuctionBiddingTypeList() { + return dirAuctionBiddingTypeList; + } + + public void setDirAuctionBiddingTypeList(List dirAuctionBiddingTypeList) { + this.dirAuctionBiddingTypeList = dirAuctionBiddingTypeList; + } + + public List getDirCurrencyCodeList() { + return dirCurrencyCodeList; + } + + public void setDirCurrencyCodeList(List dirCurrencyCodeList) { + this.dirCurrencyCodeList = dirCurrencyCodeList; + } + + public List getTradingModeList() { + return tradingModeList; + } + + public void setTradingModeList(List tradingModeList) { + this.tradingModeList = tradingModeList; + } + + public List getDirTradingModeMkrList() { + return dirTradingModeMkrList; + } + + public void setDirTradingModeMkrList(List dirTradingModeMkrList) { + this.dirTradingModeMkrList = dirTradingModeMkrList; + } +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/ExchangeInstrument.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/ExchangeInstrument.java index 4f426ed18..86854b5e8 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/ExchangeInstrument.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/ExchangeInstrument.java @@ -1,5 +1,6 @@ package ru.spcex.clearing.gatewayapi.request.objects; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import io.swagger.annotations.ApiModelProperty; @@ -8,7 +9,7 @@ import ru.spcex.clearing.gatewayapi.config.deserializers.LocalDateDeserializer; import java.time.LocalDate; import java.util.UUID; -public class ExchangeInstrument { +public class ExchangeInstrument extends WithMapId { @JsonProperty("id") @ApiModelProperty( value = "id", @@ -155,6 +156,15 @@ public class ExchangeInstrument { ) private String workflowStatus; + @JsonIgnore + @ApiModelProperty(hidden = true) + private TradingMode tradingMode; + + @JsonIgnore + @ApiModelProperty(hidden = true) + private DirAuctionBiddingType dirAuctionBiddingType; + + public UUID getId() { return id; } @@ -282,4 +292,20 @@ public class ExchangeInstrument { public void setWorkflowStatus(String workflowStatus) { this.workflowStatus = workflowStatus; } + + public TradingMode getTradingMode() { + return tradingMode; + } + + public void setTradingMode(TradingMode tradingMode) { + this.tradingMode = tradingMode; + } + + public DirAuctionBiddingType getDirAuctionBiddingType() { + return dirAuctionBiddingType; + } + + public void setDirAuctionBiddingType(DirAuctionBiddingType dirAuctionBiddingType) { + this.dirAuctionBiddingType = dirAuctionBiddingType; + } } \ No newline at end of file diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/TradingMode.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/TradingMode.java index f34a78c78..b4c9325b1 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/TradingMode.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/TradingMode.java @@ -1,11 +1,12 @@ package ru.spcex.clearing.gatewayapi.request.objects; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModelProperty; import java.util.UUID; -public class TradingMode { +public class TradingMode extends WithMapId { @JsonProperty("exchange_instrument_id") @ApiModelProperty( value = "Ссылка на exchange_instrument", @@ -61,6 +62,11 @@ public class TradingMode { ) private Boolean isDeleted; + @JsonIgnore + @ApiModelProperty(hidden = true) + private DirTradingModeMkr dirTradingModeMkr; + + public UUID getExchangeInstrumentId() { return exchangeInstrumentId; } @@ -116,4 +122,12 @@ public class TradingMode { public void setDeleted(Boolean deleted) { isDeleted = deleted; } + + public DirTradingModeMkr getDirTradingModeMkr() { + return dirTradingModeMkr; + } + + public void setDirTradingModeMkr(DirTradingModeMkr dirTradingModeMkr) { + this.dirTradingModeMkr = dirTradingModeMkr; + } }