mmarkelov 2026-05-25 14:51:13 +03:00
parent 29d62c68cb
commit 27f6382894

View file

@ -24,7 +24,6 @@ import ru.spcex.platform.imdg.api.ImdgTransaction;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.ZoneOffset;
import java.util.regex.Pattern;
@Service
public class Application extends MessageCracker implements quickfix.Application, InitializingBean, DisposableBean {
@ -114,7 +113,6 @@ public class Application extends MessageCracker implements quickfix.Application,
transaction.beginTransaction();
try {
if (executionReport.isSetField(ClOrdID.FIELD) && executionReport.isSetField(ExDestination.FIELD) && executionReport.isSetField(TransactTime.FIELD) && executionReport.isSetField(OrdStatus.FIELD)) {
OrderID orderId = executionReport.getOrderID();
ExDestination exDestination = (ExDestination) executionReport.getField(new ExDestination());
TransactTime transactTime = executionReport.getTransactTime();
OrdStatus ordStatus = executionReport.getOrdStatus();
@ -123,60 +121,64 @@ public class Application extends MessageCracker implements quickfix.Application,
Long orderNum = null;
try {
orderNum = Long.parseLong(clOrdID.getValue());
} catch (NumberFormatException ignore) {}
Imdg<SOrders> sOrdersImdg = transaction.getImdg(IMDGDistributedNames.Map_SOrders, SOrders.class);
SOrders sOrders = sOrdersImdg.getSingleObjectByPredicate(sOrdersImdg.predicateBuilder().and(
sOrdersImdg.predicateBuilder().equals("orderNum", orderNum),
sOrdersImdg.predicateBuilder().equals("classCode", exDestination.getValue()),
sOrdersImdg.predicateBuilder().equals("tradeDate", transactTime.getValue().toLocalDate())));
if (sOrders == null) {
sOrders = new SOrders();
sOrders.setId(imdgProvider.getImdgIdGenerator().nextId());
sOrders.setOrderNum(orderNum);
sOrders.setExchangeOrderNum(orderId.getValue());
sOrders.setClassCode(exDestination.getValue());
sOrders.setTradeDate(transactTime.getValue().toLocalDate());
if (executionReport.isSetSecurityID())
sOrders.setSecCode(executionReport.getSecurityID().getValue());
if (executionReport.isSetPrice())
sOrders.setPrice(BigDecimal.valueOf(executionReport.getPrice().getValue()));
if (executionReport.isSetOrderQty())
sOrders.setQty(BigDecimal.valueOf(executionReport.getOrderQty().getValue()));
if (executionReport.isSetAccount())
sOrders.setAccount(executionReport.getAccount().getValue());
if (executionReport.isSetSettlType())
sOrders.setSettleCode(executionReport.getSettlType().getValue());
if (executionReport.isSetCurrency())
sOrders.setPriceCurrency(executionReport.getCurrency().getValue());
sOrders.setState(String.valueOf(ordStatus.getValue()));
if (ordStatus.valueEquals(OrdStatus.NEW)) {
sOrders.setOrderDateTime(transactTime.getValue().toInstant(ZoneOffset.UTC));
} else if (ordStatus.valueEquals(OrdStatus.CANCELED)) {
sOrders.setWithdrawDateTime(transactTime.getValue().toInstant(ZoneOffset.UTC));
}
sOrders.setCreated(Instant.now());
sOrdersImdg.insert(sOrders);
} else {
sOrders.setState(String.valueOf(ordStatus.getValue()));
if (ordStatus.valueEquals(OrdStatus.NEW)) {
sOrders.setOrderDateTime(transactTime.getValue().toInstant(ZoneOffset.UTC));
} else if (ordStatus.valueEquals(OrdStatus.CANCELED)) {
sOrders.setWithdrawDateTime(transactTime.getValue().toInstant(ZoneOffset.UTC));
}
sOrders.setUpdated(Instant.now());
sOrdersImdg.update(sOrders);
} catch (NumberFormatException e) {
log.warn("failed to parse ClOrdID=" + clOrdID.getValue(), e);
}
if (orderNum != null) {
Imdg<SOrders> sOrdersImdg = transaction.getImdg(IMDGDistributedNames.Map_SOrders, SOrders.class);
SOrders sOrders = sOrdersImdg.getSingleObjectByPredicate(sOrdersImdg.predicateBuilder().and(
sOrdersImdg.predicateBuilder().equals("orderNum", orderNum),
sOrdersImdg.predicateBuilder().equals("classCode", exDestination.getValue()),
sOrdersImdg.predicateBuilder().equals("tradeDate", transactTime.getValue().toLocalDate())));
if (sOrders == null) {
sOrders = new SOrders();
sOrders.setId(imdgProvider.getImdgIdGenerator().nextId());
sOrders.setOrderNum(orderNum);
sOrders.setClassCode(exDestination.getValue());
sOrders.setTradeDate(transactTime.getValue().toLocalDate());
if (executionReport.isSetOrderID())
sOrders.setExchangeOrderNum(executionReport.getOrderID().getValue());
if (executionReport.isSetSecurityID())
sOrders.setSecCode(executionReport.getSecurityID().getValue());
if (executionReport.isSetPrice())
sOrders.setPrice(BigDecimal.valueOf(executionReport.getPrice().getValue()));
if (executionReport.isSetOrderQty())
sOrders.setQty(BigDecimal.valueOf(executionReport.getOrderQty().getValue()));
if (executionReport.isSetAccount())
sOrders.setAccount(executionReport.getAccount().getValue());
if (executionReport.isSetSettlType())
sOrders.setSettleCode(executionReport.getSettlType().getValue());
if (executionReport.isSetCurrency())
sOrders.setPriceCurrency(executionReport.getCurrency().getValue());
sOrders.setState(String.valueOf(ordStatus.getValue()));
if (ordStatus.valueEquals(OrdStatus.NEW)) {
sOrders.setOrderDateTime(transactTime.getValue().toInstant(ZoneOffset.UTC));
} else if (ordStatus.valueEquals(OrdStatus.CANCELED)) {
sOrders.setWithdrawDateTime(transactTime.getValue().toInstant(ZoneOffset.UTC));
}
sOrders.setCreated(Instant.now());
sOrdersImdg.insert(sOrders);
} else {
sOrders.setState(String.valueOf(ordStatus.getValue()));
if (ordStatus.valueEquals(OrdStatus.NEW)) {
sOrders.setOrderDateTime(transactTime.getValue().toInstant(ZoneOffset.UTC));
} else if (ordStatus.valueEquals(OrdStatus.CANCELED)) {
sOrders.setWithdrawDateTime(transactTime.getValue().toInstant(ZoneOffset.UTC));
}
sOrders.setUpdated(Instant.now());
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();
} catch (Exception e) {
log.error(executionReport.toString(), e);