Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
ialbert 2026-04-22 13:50:58 +03:00
commit 434089c005
21 changed files with 292 additions and 270 deletions

View file

@ -4,10 +4,22 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.server.ResponseStatusException;
import ru.clearing.classes.statics.data.account.Account;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.account.AccountNewAction;
@ -20,30 +32,46 @@ import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
@Controller
@RequestMapping("/accounting/accounts")
public class AccountController extends AbstractQueueController {
private final IStateLoader stateLoader;
private final ImdgPredicateBuilder predicateBuilder;
@Autowired
public AccountController(IOperator operator, IStateLoader stateLoader) {
public AccountController(IOperator operator,
IStateLoader stateLoader,
ImdgProvider imdgProvider) {
super(operator);
this.stateLoader = stateLoader;
this.predicateBuilder = imdgProvider
.getImdg(IMDGDistributedNames.Map_Account, Account.class)
.predicateBuilder();
}
@ApiOperation(value = "get all accounts.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Account, Account.class);
public CommonGetAllResponse getAll(@RequestParam(name = "kind", required = false) String kind) {
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
if (StringUtils.isEmpty(kind)) {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Account, Account.class);
response.fromEntity(all);
} else if (kind.equals("BLKD")) {
ImdgPredicate predicate = predicateBuilder.in("status",
Arrays.asList(Status.Blocked.getKey(), Status.Close.getKey()).toArray(new String[0]));
Collection<Map<String, Object>> allByStatus = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_Account, Account.class, predicate);
response.fromEntity(allByStatus);
} else {
throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Kind is not supported: " + kind);
}
return response;
}

View file

@ -4,10 +4,21 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.server.ResponseStatusException;
import ru.clearing.classes.statics.data.company.Company;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
@ -19,21 +30,26 @@ import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
@Controller
@RequestMapping("/companies")
public class CompanyController extends AbstractQueueController {
private final IStateLoader stateLoader;
private final ImdgPredicateBuilder predicateBuilder;
@Autowired
public CompanyController(IOperator operator,
IStateLoader stateLoader) {
IStateLoader stateLoader,
ImdgProvider imdgProvider) {
super(operator);
this.stateLoader = stateLoader;
this.predicateBuilder = imdgProvider
.getImdg(IMDGDistributedNames.Map_Company, Company.class)
.predicateBuilder();
}
@ApiOperation(value = "delete company.")
@ -51,10 +67,19 @@ public class CompanyController extends AbstractQueueController {
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Company, Company.class);
public CommonGetAllResponse getAll(@RequestParam(name = "kind", required = false) String kind) {
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
if (StringUtils.isEmpty(kind)) {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Company, Company.class);
response.fromEntity(all);
} else if (kind.equals("BLKD")){
ImdgPredicate predicate = predicateBuilder.equals("workflowStatus", WorkflowStatus.Blocked.getKey());
Collection<Map<String, Object>> allByStatus = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_Company, Company.class, predicate);
response.fromEntity(allByStatus);
} else {
throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Kind is not supported: " + kind);
}
return response;
}

View file

@ -4,10 +4,23 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.server.ResponseStatusException;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
@ -21,21 +34,26 @@ import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
@Controller
@RequestMapping("/trading-clearing-registries")
public class TradingClearingRegistryController extends AbstractQueueController {
private final IStateLoader stateLoader;
private final ImdgPredicateBuilder predicateBuilder;
@Autowired
public TradingClearingRegistryController(IOperator operator, IStateLoader stateLoader) {
public TradingClearingRegistryController(IOperator operator,
IStateLoader stateLoader,
ImdgProvider imdgProvider) {
super(operator);
this.stateLoader = stateLoader;
this.predicateBuilder = imdgProvider
.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class)
.predicateBuilder();
}
@ApiOperation(value = "create TradingClearingRegistry.")
@ -88,10 +106,21 @@ public class TradingClearingRegistryController extends AbstractQueueController {
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
public CommonGetAllResponse getAll(@RequestParam(name = "kind", required = false) String kind) {
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
if (StringUtils.isEmpty(kind)) {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
response.fromEntity(all);
} else if (kind.equals("BLKD")) {
ImdgPredicate predicate = predicateBuilder.in("status",
Arrays.asList(Status.Blocked.getKey(), Status.Close.getKey()).toArray(new String[0]));
Collection<Map<String, Object>> allByStatus = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class, predicate);
response.fromEntity(allByStatus);
} else {
throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Kind is not supported: " + kind);
}
return response;
}
}

View file

@ -1,14 +1,20 @@
package ru.spcex.clearing.backendapi.controller.request.cud.securities;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.math.BigDecimal;
import java.time.LocalDate;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.SCrossRateNewRequest;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
public class SCrossRateNewAction implements IAction<SCrossRateNewRequest> {
@JsonProperty
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate date;
@JsonProperty
private String currency;

View file

@ -1,16 +1,22 @@
package ru.spcex.clearing.backendapi.controller.request.cud.securities;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.math.BigDecimal;
import java.time.LocalDate;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.SCrossRateUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
public class SCrossRateUpdateAction implements IAction<SCrossRateUpdateRequest> {
@JsonProperty
private Long id;
@JsonProperty
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate date;
@JsonProperty
private String currency;

View file

@ -1,6 +1,6 @@
{
"version": "3.23.295.156",
"version": "3.23.295.157",
"enums": {
@ -11036,7 +11036,7 @@
"name": "Добавление параметров риска",
"confirmation": "value,settlementType,currencyPairId,status",
"confirmation": "value,quoteValue,settlementType,currencyPairId,status",
"class": "ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterNewAction",
@ -11067,7 +11067,7 @@
"name": "Изменение параметров риска",
"confirmation": "value,status",
"confirmation": "value,quoteValue,status",
"class": "ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterUpdateAction",

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--?xml-stylesheet type="text/xsl" href="\..\corp-reports\src\data\meta\meta.server.xslt"?-->
<meta version="3.23.295.156">
<meta version="3.23.295.157">
<!-- _xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" _xsi:noNamespaceSchemaLocation="file:///E:/d/projects/meta/from/meta.xsd" -->
<!--Здесь словари-->
<enums>
@ -2557,14 +2557,14 @@
<quoteValue name="Ставка сопряженной валюты" shortname="Ставка сопряженной валюты" type="10"/>
<workflowStatus name="Статус" shortname="Статус" type="2" length="4" link="workflowStatus"/>
<actions>
<post name="Добавление параметров риска" confirmation="value,settlementType,currencyPairId,status" class="ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterNewAction">
<post name="Добавление параметров риска" confirmation="value,quoteValue,settlementType,currencyPairId,status" class="ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterNewAction">
<currencyPairId name="Идентификатор валютной пары" shortname="Валютная пара" type="1" link="currencyPair" linkCode="code" linkKeyCode="id"/>
<settlementType name="Код расчёта" shortname="Код расчёта" type="12" link="currencySettlementType" linkCode="code"/>
<value name="Ставка" shortname="Ставка" type="10"/>
<quoteValue name="Ставка сопряженной валюты" shortname="Ставка сопряженной валюты" type="10"/>
<status name="Статус" shortname="Статус" type="2" length="4" link="workflowStatus"/>
</post>
<put name="Изменение параметров риска" confirmation="value,status" class="ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterUpdateAction">
<put name="Изменение параметров риска" confirmation="value,quoteValue,status" class="ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterUpdateAction">
<id type="1" name="Идентификатор записи" shortname="ID" link="riskParameter" linkCode="id" required="true"/>
<value name="Ставка" shortname="Ставка" type="10"/>
<quoteValue name="Ставка сопряженной валюты" shortname="Ставка сопряженной валюты" type="10"/>

View file

@ -358,19 +358,24 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing
continue;
}
orderCurrency.setStatus(status.getKey());
orderCurrency.setUpdated(Instant.now());
orderCurrencyImdg.update(orderCurrency);
}
}
private void updateByFix(BaseRequest<OrderCurrencyStatusUpdateRequest> req) {
OrderCurrencyStatusUpdateRequest payload = req.getRequestPayload();
for (Long orderId : payload.getIds()) {
SOrders sOrder = sOrdersImdg.getSingleObjectByID(orderId);
SOrders sOrder = sOrdersImdg.getSingleObjectByPredicate(
sOrdersImdg.predicateBuilder().equals("orderNum", orderId)
);
OrderCurrency orderCurrency = orderCurrencyImdg.getSingleObjectByID(orderId);
OrderStatus status = resolveStatusByFixState(sOrder.getState());
if (status == null) {
continue;
}
orderCurrency.setStatus(status.getKey());
orderCurrency.setUpdated(Instant.now());
// orderCurrency.setUpdated(sOrder.getTradeDate());//todo
orderCurrencyImdg.update(orderCurrency);
}
}

View file

@ -114,7 +114,7 @@ public class TaskListener extends QueueConsumer implements InitializingBean {
}
private void exportToTriAndSendToFix(BaseRequest<LauncherCommandRequest> req) {
log.info("SDOR export and send command to fix, request={}", req);
try {
Collection<OrderCurrency> orders = imdgQueryService.getClccOrderCurrencyIds();
String content = orderCurrencyTriExportService.exportToTri(orders);

View file

@ -1,6 +1,5 @@
package ru.spcex.clearing.dflt.management.model;
import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.classes.statics.data.misc.Market;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.security.RiskParameter;
@ -9,7 +8,6 @@ public class SwapContext {
private final Registry registry;
private final String orderCategory;
private final Market market;
private final Listing listing;
private final RiskParameter riskParameter;
private final CounterpartyInfo categoryP;
private final CounterpartyInfo clcc;
@ -19,7 +17,6 @@ public class SwapContext {
this.registry = builder.registry;
this.orderCategory = builder.orderCategory;
this.market = builder.market;
this.listing = builder.listing;
this.riskParameter = builder.riskParameter;
this.categoryP = builder.categoryP;
this.clcc = builder.clcc;
@ -38,10 +35,6 @@ public class SwapContext {
return market;
}
public Listing getListing() {
return listing;
}
public RiskParameter getRiskParameter() {
return riskParameter;
}
@ -66,7 +59,6 @@ public class SwapContext {
private Registry registry;
private String orderCategory;
private Market market;
private Listing listing;
private RiskParameter riskParameter;
private CounterpartyInfo categoryP;
private CounterpartyInfo clcc;
@ -87,11 +79,6 @@ public class SwapContext {
return this;
}
public Builder listing(Listing listing) {
this.listing = listing;
return this;
}
public Builder riskParameter(RiskParameter riskParameter) {
this.riskParameter = riskParameter;
return this;

View file

@ -4,6 +4,7 @@ import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
@ -68,7 +69,8 @@ public class ImdgQueryService {
ImdgPredicateBuilder builder = registryImdg.predicateBuilder();
ImdgPredicate registryPredicate = builder.and(
builder.regex("registryCode", "^PM.*T"),
builder.not(builder.equals("registryStatus", RegistryStatus.OK.getKey()))
builder.not(builder.equals("registryStatus", RegistryStatus.OK.getKey())),
builder.equals("clearingDate", LocalDate.now())
);
return registryImdg.getCollectionIdsByPredicate(registryPredicate);
@ -159,8 +161,14 @@ public class ImdgQueryService {
public Listing findListing(Registry registry, String marketCode) {
return "RUB".equals(registry.getSecuritySymbol())
? findListingForRub(registry, marketCode)
: findListingForOtherCurrency(registry, marketCode);
? findListingForRub(registry, marketCode, null)
: findListingForOtherCurrency(registry, marketCode, null);
}
public Listing findListing(Registry registry, String marketCode, String settleCode) {
return "RUB".equals(registry.getSecuritySymbol())
? findListingForRub(registry, marketCode, settleCode)
: findListingForOtherCurrency(registry, marketCode, settleCode);
}
public RiskParameter findRiskParameter(Registry registry) {
@ -192,7 +200,8 @@ public class ImdgQueryService {
public BigDecimal defineTransferRate(Long currencyPairDictionaryId, String securitySymbol) {
ImdgPredicateBuilder pb = riskParameterImdg.predicateBuilder();
String baseCurrency = "RUB".equals(securitySymbol) ? "CNY" : securitySymbol;
boolean isRub = "RUB".equals(securitySymbol);
String baseCurrency = isRub ? "CNY" : securitySymbol;
RiskParameter riskParameter = riskParameterImdg.getSingleObjectByPredicate(
pb.and(
@ -200,7 +209,7 @@ public class ImdgQueryService {
pb.equals("currencyPairId", currencyPairDictionaryId)
)
);
return riskParameter.getQuoteValue();
return isRub ? riskParameter.getValue() : riskParameter.getQuoteValue();
}
public CurrencyPairDictionary getCurrencyPairDictionaryBySecurityId(Long securityId) {
@ -208,9 +217,8 @@ public class ImdgQueryService {
return currencyPairDictionaryImdg.getSingleObjectByID(security.getCurrencyPairId());
}
private Listing findListingForRub(Registry registry, String marketCode) {
private Listing findListingForRub(Registry registry, String marketCode, String settleCode) {
ImdgPredicateBuilder pb = currencyPairDictionaryImdg.predicateBuilder();
CurrencyPairDictionary pair = currencyPairDictionaryImdg.getFirstObjectByPredicate(
pb.and(
pb.equals("baseCurrency", "CNY"),
@ -218,8 +226,13 @@ public class ImdgQueryService {
)
);
ImdgPredicate settlementTypeCondition =
StringUtils.isNotEmpty(settleCode) ? pb.equals("settlementType", settleCode) : pb.alwaysTrue();
Collection<Long> securityIds = currencyPairSecurityImdg.getCollectionIdsByPredicate(
pb.equals("currencyPairId", pair.getId())
pb.and(
pb.equals("currencyPairId", pair.getId()),
settlementTypeCondition
)
);
return listingImdg.getSingleObjectByPredicate(
@ -230,7 +243,7 @@ public class ImdgQueryService {
);
}
private Listing findListingForOtherCurrency(Registry registry, String marketCode) {
private Listing findListingForOtherCurrency(Registry registry, String marketCode, String settleCode) {
ImdgPredicateBuilder pb = currencyPairDictionaryImdg.predicateBuilder();
CurrencyPairDictionary pair = currencyPairDictionaryImdg.getFirstObjectByPredicate(
@ -240,8 +253,13 @@ public class ImdgQueryService {
)
);
ImdgPredicate settlementTypeCondition =
StringUtils.isNotEmpty(settleCode) ? pb.equals("settlementType", settleCode) : pb.alwaysTrue();
Collection<Long> securityIds = currencyPairSecurityImdg.getCollectionIdsByPredicate(
pb.equals("currencyPairId", pair.getId())
pb.and(
pb.equals("currencyPairId", pair.getId()),
settlementTypeCondition
)
);
return listingImdg.getSingleObjectByPredicate(

View file

@ -31,7 +31,7 @@ public class OrderCalculationService {
public void calcAndEnrichSwap(OrderCurrency order,
SwapContext context) {
Registry registry = context.getRegistry();
Listing listing = context.getListing();
Listing listing = imdgQueryService.findListing(registry, context.getMarket().getCode(), order.getSettleCode());
CurrencyPairDictionary pair = imdgQueryService.getCurrencyPairDictionaryBySecurityId(listing.getSecurityId());
BigDecimal s = imdgQueryService.defineTransferRate(pair.getId(), registry.getSecuritySymbol());
@ -51,7 +51,7 @@ public class OrderCalculationService {
public void calcAndEnrichSpot(OrderCurrency order,
SwapContext context) {
Registry registry = context.getRegistry();
Listing listing = context.getListing();
Listing listing = imdgQueryService.findListing(registry, context.getMarket().getCode(), order.getSettleCode());
CurrencyPairDictionary pair = imdgQueryService.getCurrencyPairDictionaryBySecurityId(listing.getSecurityId());
BigDecimal s = imdgQueryService.defineTransferRate(pair.getId(), registry.getSecuritySymbol());
@ -75,6 +75,7 @@ public class OrderCalculationService {
order.setPrice(price);
order.setQuantityLot(quantityLot);
order.setRate(s);
}
private CalculationResult calculationSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) {
@ -88,7 +89,7 @@ public class OrderCalculationService {
BigDecimal rateValue = rates.getValue();
BigDecimal sum2 = planPositionRub.divide(rateValue, lotSize, RoundingMode.HALF_DOWN);
BigDecimal sum3 = sum1.setScale(0, RoundingMode.CEILING).min(sum2);
BigDecimal sum3 = sum1.setScale(lotSize, RoundingMode.CEILING);
BigDecimal sum4 = sum3.multiply(rateValue, MC).negate();
BigDecimal sum5 = sum3.negate();
@ -113,7 +114,7 @@ public class OrderCalculationService {
BigDecimal planPositionCny = cnyRegistry.getBalance();
BigDecimal sum2 = planPositionCny.divide(rateValue, lotSize, RoundingMode.HALF_DOWN);
BigDecimal sum3 = sum1.setScale(0, RoundingMode.CEILING).min(sum2).negate();
BigDecimal sum3 = sum1.setScale(lotSize, RoundingMode.CEILING).min(sum2).negate();
BigDecimal sum4 = sum3.multiply(rateValue, MC).negate();
BigDecimal sum5 = sum3.negate();

View file

@ -1,5 +1,6 @@
package ru.spcex.clearing.dflt.management.service;
import java.time.Instant;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.misc.Listing;
import ru.clearing.classes.statics.data.misc.Market;
@ -14,6 +15,11 @@ import ru.spcex.platform.enumeration.Side;
@Service
public class OrderTemplateBuilder {
private final ImdgQueryService imdgQueryService;
public OrderTemplateBuilder(ImdgQueryService imdgQueryService) {
this.imdgQueryService = imdgQueryService;
}
public OrderCurrency buildPrimaryTransfer(SwapContext context, SettleCode settleCode) {
OrderCurrency orderCurrency;
@ -192,9 +198,9 @@ public class OrderTemplateBuilder {
String comment,
SettleCode settleCode) {
Registry registry = context.getRegistry();
Listing listing = context.getListing();
Market market = context.getMarket();
RiskParameter riskParameter = context.getRiskParameter();
Listing listing = imdgQueryService.findListing(registry, market.getCode(), settleCode.getKey());
order.setOvernightType("SWAP");
order.setMarket(market.getCode());
@ -202,12 +208,12 @@ public class OrderTemplateBuilder {
order.setSecuritySymbol(listing.getSymbolCode());
order.setSecurityId(listing.getSecurityId());
order.setLotSize(listing.getLotSize());
order.setRate(riskParameter.getQuoteValue());
order.setSide(side.getKey());
order.setSettleCode(settleCode.getKey());
order.setStatus("CRET");
order.setComment(comment);
order.setRegistryId(registry.getId());
order.setCreated(Instant.now());
}
private Side resolvePrimaryTransferSide(Registry registry, SettleCode settleCode) {

View file

@ -3,7 +3,6 @@ package ru.spcex.clearing.dflt.management.service;
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;
@ -12,6 +11,7 @@ import ru.spcex.clearing.dflt.management.model.CounterpartyInfo;
import ru.spcex.clearing.dflt.management.model.SwapContext;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.CompanyRole;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.SettleCode;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -22,6 +22,7 @@ public class SpotOvernightOrderService {
private final ImdgQueryService imdgQueryService;
private final Imdg<OrderCurrency> orderCurrencyImdg;
private final Imdg<Registry> registryImdg;
private final OrderTemplateBuilder templateBuilder;
private final OrderCalculationService swapCalculationService;
@ -31,6 +32,7 @@ public class SpotOvernightOrderService {
OrderCalculationService swapCalculationService) {
this.imdgQueryService = imdgQueryService;
this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class);
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.templateBuilder = templateBuilder;
this.swapCalculationService = swapCalculationService;
}
@ -39,7 +41,6 @@ public class SpotOvernightOrderService {
String orderCategory = imdgQueryService.resolveOrderCategory(registry.getCompanyId());
Market market = imdgQueryService.getSpotMarket();
Listing listing = imdgQueryService.findListing(registry, market.getCode());
RiskParameter riskParameter = imdgQueryService.findRiskParameter(registry);
CounterpartyInfo categoryP = imdgQueryService.getCompanyByClearingCategory("P");
CounterpartyInfo clcc = imdgQueryService.getCompanyByRole(CompanyRole.CLCC);
@ -49,7 +50,6 @@ public class SpotOvernightOrderService {
.registry(registry)
.orderCategory(orderCategory)
.market(market)
.listing(listing)
.riskParameter(riskParameter)
.categoryP(categoryP)
.clcc(clcc)
@ -86,6 +86,8 @@ public class SpotOvernightOrderService {
orderCurrencyImdg.insert(primaryBalancingT1);
orderCurrencyImdg.insert(counterBalancingT1);
registry.setRegistryStatus(RegistryStatus.OK.getKey());
registryImdg.update(registry);
log.info("Spot orders created for registryId={}", registry.getId());
}

View file

@ -3,7 +3,6 @@ package ru.spcex.clearing.dflt.management.service;
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;
@ -12,6 +11,7 @@ import ru.spcex.clearing.dflt.management.model.CounterpartyInfo;
import ru.spcex.clearing.dflt.management.model.SwapContext;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.CompanyRole;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.SettleCode;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@ -22,6 +22,7 @@ public class SwapOvernightOrderService {
private final ImdgQueryService imdgQueryService;
private final Imdg<OrderCurrency> orderCurrencyImdg;
private final Imdg<Registry> registryImdg;
private final OrderTemplateBuilder templateBuilder;
private final OrderCalculationService swapCalculationService;
@ -31,6 +32,7 @@ public class SwapOvernightOrderService {
OrderCalculationService swapCalculationService) {
this.imdgQueryService = imdgQueryService;
this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class);
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.templateBuilder = templateBuilder;
this.swapCalculationService = swapCalculationService;
}
@ -39,7 +41,6 @@ public class SwapOvernightOrderService {
String orderCategory = imdgQueryService.resolveOrderCategory(registry.getCompanyId());
Market market = imdgQueryService.getSwapMarket();
Listing listing = imdgQueryService.findListing(registry, market.getCode());
RiskParameter riskParameter = imdgQueryService.findRiskParameter(registry);
CounterpartyInfo categoryP = imdgQueryService.getCompanyByClearingCategory("P");
CounterpartyInfo clcc = imdgQueryService.getCompanyByRole(CompanyRole.CLCC);
@ -49,7 +50,6 @@ public class SwapOvernightOrderService {
.registry(registry)
.orderCategory(orderCategory)
.market(market)
.listing(listing)
.riskParameter(riskParameter)
.categoryP(categoryP)
.clcc(clcc)
@ -71,6 +71,8 @@ public class SwapOvernightOrderService {
orderCurrencyImdg.insert(primaryBalancing);
orderCurrencyImdg.insert(counterBalancing);
registry.setRegistryStatus(RegistryStatus.OK.getKey());
registryImdg.update(registry);
log.info("Swap orders created for registryId={}", registry.getId());
}

View file

@ -9,10 +9,14 @@ import org.springframework.stereotype.Service;
import quickfix.*;
import quickfix.field.*;
import quickfix.fix44.ExecutionReport;
import quickfix.fix44.MessageCracker;
import quickfix.fix44.NewOrderSingle;
import ru.clearing.classes.statics.data.misc.OrderCurrency;
import ru.clearing.classes.statics.data.misc.SOrders;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.order.OrderCurrencyStatusUpdateRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.ImdgTransaction;
@ -29,13 +33,20 @@ public class Application extends MessageCracker implements quickfix.Application,
private final ImdgProvider imdgProvider;
private final SocketInitiator initiator;
private final KafkaSender kafkaSender;
private SessionID fixSessionID;
private SessionID fdcSessionID;
@Autowired
public Application(ImdgProvider imdgProvider, MessageStoreFactory storeFactory, SessionSettings settings, LogFactory logFactory, MessageFactory messageFactory) throws ConfigError {
public Application(ImdgProvider imdgProvider,
MessageStoreFactory storeFactory,
SessionSettings settings,
LogFactory logFactory,
MessageFactory messageFactory,
KafkaSender kafkaSender) throws ConfigError {
this.imdgProvider = imdgProvider;
this.kafkaSender = kafkaSender;
initiator = new SocketInitiator(this, storeFactory, settings, logFactory, messageFactory);
}
@ -95,9 +106,10 @@ public class Application extends MessageCracker implements quickfix.Application,
@Override
public void fromApp(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
log.trace("fromApp {}, [{}]: {}", sessionID, message.getClass(), message);
crack(message, sessionID);
}
public void onMessage(ExecutionReport executionReport) {
public void onMessage(ExecutionReport executionReport, SessionID sessionID) {
ImdgTransaction transaction = imdgProvider.newTransaction();
transaction.beginTransaction();
try {
@ -139,6 +151,7 @@ public class Application extends MessageCracker implements quickfix.Application,
sOrders.setAccount(account.getValue());
sOrders.setSettleCode(settlType.getValue());
sOrders.setPriceCurrency(currency.getValue());
sOrders.setState(String.valueOf(ordStatus.getValue()));
if (ordStatus.valueEquals(OrdStatus.NEW)) {
sOrders.setOrderDateTime(transactTime.getValue().toInstant(ZoneOffset.UTC));
@ -156,6 +169,11 @@ public class Application extends MessageCracker implements quickfix.Application,
sOrdersImdg.update(sOrders);
}
//send message to df for update orderCurrency status
OrderCurrencyStatusUpdateRequest updateRequest = new OrderCurrencyStatusUpdateRequest();
updateRequest.addId(orderNum);
kafkaSender.sendRequestToQueue(Consts.ORDER_CURRENCY_STATUS_UPDATE_FIX, updateRequest);
}
}
transaction.commitTransaction();

View file

@ -1,197 +0,0 @@
package ru.spcex.clearing.fix.service;
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.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanyNewRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.enumeration.UserRole;
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 ru.spcex.platform.utils.error.ValidationException;
import java.time.Instant;
import java.util.Objects;
@Service
public class FixService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final RequestHelper requestHelper;
private final ImdgProvider imdgProvider;
private final ImdgId idSequence;
private final Imdg<Company> companyIMap;
protected UserRoleVerification userRoleVerification;
// protected CompanySymbolService companySymbolService;
// protected AccountNotificationHelper accountNotification;
// protected RelationService relationService;
// private final ValidationHelper validationHelper;
// private final Function<CompanyNewRequest, IValidator> companyNewRequestValidator;
// private final Function<CompanyNewRequest, IValidator> companyUpdateRequestValidator;
// private final Function<CommonDeleteRequest, IValidator> companyDeleteRequestValidator;
@Autowired
public FixService(Consumer<String, Object> kafkaQueue, Producer<String, Object> kafkaProducer,
ImdgProvider imdgProvider,
RequestHelper requestHelper,
// ValidationHelper validationHelper,
UserRoleVerification userRoleVerification
// @Qualifier("companyNewRequestValidator")
// Function<CompanyNewRequest, IValidator> companyNewRequestValidator,
// @Qualifier("companyUpdateRequestValidator")
// Function<CompanyNewRequest, IValidator> companyUpdateRequestValidator,
// @Qualifier("CompanyDeleteRequestValidator")
// Function<CommonDeleteRequest, IValidator> companyDeleteRequestValidator,
// CompanySymbolService companySymbolService,
// AccountNotificationHelper accountNotification,
/*RelationService relationService*/) {
super(kafkaQueue, kafkaProducer);
this.imdgProvider = imdgProvider;
this.requestHelper = requestHelper.setLogger(log);
this.idSequence = imdgProvider.getImdgIdGenerator();
this.userRoleVerification = userRoleVerification;
this.userRoleVerification.setRoleForVerification(UserRole.Admin);
// this.validationHelper = validationHelper;
// this.companyNewRequestValidator = companyNewRequestValidator;
// this.companyUpdateRequestValidator = companyUpdateRequestValidator;
// this.companyDeleteRequestValidator = companyDeleteRequestValidator;
// this.companySymbolService = companySymbolService;
// this.companySymbolService.setCompanyService(this);
// this.accountNotification = accountNotification;
// this.relationService = relationService;
companyIMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
}
@Override
public void afterPropertiesSet() {
// callback(CommonDeleteRequest.class)
// .setFunction(request -> requestHelper.requestFunction(this::deleteCompany, request))
// .forDestination(Consts.DESTINATION_COMPANY_DELETE, callbacks::put);
// callback(CommonDeleteRequest.class)
// .setFunction(request -> requestHelper.requestFunction(this::blockCompanyAfterDocument, request))
// .forDestination(Consts.DESTINATION_COMPANY_BLOCK, callbacks::put);
// callback(CompanyNewRequest.class)
// .setFunction(request -> requestHelper.requestFunction(this::processBaseRequest, request))
// .forDestination(Consts.DESTINATION_COMPANY_NEW, callbacks::put);
// callback(CompanyNewRequest.class)
// .setFunction(request -> requestHelper.requestFunction(this::processBaseRequest, request))
// .forDestination(Consts.DESTINATION_COMPANY_UPDATE, callbacks::put);
// callback(AccountTerminationRequest.class)
// .setFunction(request -> requestHelper.requestFunction(this::finishCompanyTermination, request))
// .forDestination(Consts.ACCOUNT_TERMINATION_STEP2, callbacks::put);
init();
}
private RequestInfoUpdate processBaseRequest(BaseRequest<?> request) throws ValidationException {
// Валидация
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(request);
if (requestInfoUpdate != null) return requestInfoUpdate;
ActionType actionType = request.getActionType();
switch (actionType) {
case NEW -> {
CompanyNewRequest companyNewRequest = (CompanyNewRequest) request.getRequestPayload();
// IValidator validator = companyNewRequestValidator.apply(companyNewRequest);
// Optional<EnumMessage> error = validator.tillFirstError();
// if (error.isPresent()) {
// throw new ValidationException(error.get());
// }
// create(companyNewRequest);
}
case UPDATE -> update((CompanyNewRequest) request.getRequestPayload(), true);
}
return requestInfoUpdate;
}
public synchronized void update(CompanyNewRequest updateRequest, boolean validationIsEnable) throws ValidationException {
// if (validationIsEnable) {
// IValidator validator = companyUpdateRequestValidator.apply(updateRequest);
// Optional<EnumMessage> error = validator.tillFirstError();
// if (error.isPresent()) {
// throw new ValidationException(error.get());
// }
// }
ImdgTransaction transaction = imdgProvider.newTransaction();
transaction.beginTransaction();
boolean txOk = false;
try {
Imdg<Company> companyMap = transaction.getImdg(IMDGDistributedNames.Map_Company, Company.class);
Company company = companyMap.getSingleObjectByID(updateRequest.getId());
// if (company == null) {
// log.trace("Company {} not found", updateRequest.getId());
// throw new ValidationException(new EnumMessage(FixErrors.CompanyNotFound));
// }
// if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) {
// log.trace("Company {} not active: {}", company.getId(), company.getWorkflowStatus());
// return requestHelper.makeErrorResponse(companyUpdateRequestBaseRequest, CompanyErrors.CompanyDisabled, updateRequest.getId());
// }
company.setUpdated(Instant.now());
if (StringUtils.isNotEmpty(updateRequest.getShortName()))
company.setShortName(updateRequest.getShortName());
if (StringUtils.isNotEmpty(updateRequest.getFullName()))
company.setFullName(updateRequest.getFullName());
if (updateRequest.getCompanySymbol() != null || updateRequest.getCompanySymbolValue() != null) {
log.trace("Request field CompanySymbol, CompanySymbolValue ignore for update company request.");
}
String prevStatus = company.getWorkflowStatus();
if (updateRequest.getWorkflowStatus() != null) {
company.setWorkflowStatus(updateRequest.getWorkflowStatus());
if (!Objects.equals(prevStatus, company.getWorkflowStatus())) {
// relationService.onChangeWorkflowStatus(transaction, company, prevStatus, company.getWorkflowStatus());
} else {
log.trace("Status was not changed");
}
} else {
log.trace("Null new WorkflowStatus");
}
companyMap.update(company);
txOk = true;
} finally {
if (txOk)
transaction.commitTransaction();
else
transaction.rollbackTransaction();
}
}
protected void updateCompanyBySymbol(Company company, CompanySymbols companySymbol, boolean shouldBeDeleted) {
assert company.getId().equals(companySymbol.getCompanyId());
String companySymbolValue = companySymbol.getCompanySymbolValue();
String setUpValue = shouldBeDeletedOrSet(companySymbolValue, shouldBeDeleted);
if (CompanySymbol.TRDC.equalsByKey(companySymbol.getCompanySymbol())) {
company.setTradingCode(setUpValue);
}
if (CompanySymbol.CLRC.equalsByKey(companySymbol.getCompanySymbol())) {
company.setClearingCode(setUpValue);
}
if (CompanySymbol.RGRC.equalsByKey(companySymbol.getCompanySymbol())) {
company.setRegistrationCode(setUpValue);
}
if (CompanySymbol.TAXN.equalsByKey(companySymbol.getCompanySymbol())) {
company.getProfile().setTaxNumber(setUpValue);
}
}
private String shouldBeDeletedOrSet(String companySymbol, boolean shouldBeDeleted) {
return shouldBeDeleted ? "" : companySymbol;
}
}

View file

@ -0,0 +1,73 @@
package ru.spcex.clearing.fix.service;
import java.util.Collection;
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.company.CompanyRoleSet;
import ru.clearing.classes.statics.data.misc.OrderCurrency;
import ru.spcex.clearing.fix.quickfix.Application;
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.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.platform.enumeration.CompanyRole;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
@Service
public class FixTaskListener extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ImdgProvider imdgProvider;
private final Application fixApplication;
private final Imdg<CompanyRoleSet> companyRoleSetImdg;
private final Imdg<OrderCurrency> orderCurrencyImdg;
@Autowired
public FixTaskListener(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
ImdgProvider imdgProvider,
Application fixApplication) {
super(kafkaQueue, kafkaProducer);
this.imdgProvider = imdgProvider;
this.fixApplication = fixApplication;
this.companyRoleSetImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanyRoleSet, CompanyRoleSet.class);
this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class);
}
@Override
public void afterPropertiesSet() {
callback(LauncherCommandRequest.class)
.setConsumer(this::processSendOrders)
.forDestination(Consts.SDOR_FIX_TASK, callbacks::put);
init();
}
private void processSendOrders(BaseRequest<LauncherCommandRequest> request) {
log.info("SDOR[send order] started, request={}", request);
ImdgPredicateBuilder builder = orderCurrencyImdg.predicateBuilder();
CompanyRoleSet companyRoleSet = companyRoleSetImdg.getFirstObjectByPredicate(
builder.equals("companyRole", CompanyRole.CLCC.getKey())
);
ImdgPredicate clccOrderPredicate = builder.and(
builder.equals("status", "CRET"),
builder.or(
builder.equals("companyId", companyRoleSet.getCompanyId()),
builder.equals("counterPartyId", companyRoleSet.getCompanyId())
)
);
Collection<OrderCurrency> orderCurrencies = orderCurrencyImdg.getCollectionObjectsByPredicate(clccOrderPredicate);
orderCurrencies.forEach(fixApplication::sendOrder);
log.info("SDOR[send order] completed, count orders:{}", orderCurrencies.size());
}
}

View file

@ -5,6 +5,7 @@ import ru.spcex.platform.utils.enumeration.IEnumKey;
public enum Status implements IEnumKey {
Active("ACTV"),
Blocked("BLKD"),
Close("CLOS"),
Cancel("CNCL");
private final String key;

View file

@ -1,13 +1,19 @@
package ru.spcex.clearing.platform.messaging.domain.cud.securitites;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.math.BigDecimal;
import java.time.LocalDate;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
public class SCrossRateNewRequest {
@JsonProperty
private String type;
@JsonProperty
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate date;
@JsonProperty
private String currency;

View file

@ -1,13 +1,19 @@
package ru.spcex.clearing.platform.messaging.domain.cud.securitites;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.math.BigDecimal;
import java.time.LocalDate;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
public class SCrossRateUpdateRequest {
@JsonProperty
private Long id;
@JsonProperty
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate date;
@JsonProperty
private String currency;