diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/ExecutionDepositComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/ExecutionDepositComponent.java index a97c97046..80e8e1bcc 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/ExecutionDepositComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/ExecutionDepositComponent.java @@ -99,9 +99,12 @@ public class ExecutionDepositComponent { public void processNewTS() { log.debug("Start check new S_TRADE after {}", tradingDay); - ImdgPredicateBuilder pb = sTradeImdg.predicateBuilder(); - ImdgPredicate sql = pb.greatEqual("tradeDateTime", tradingDay); - Collection sTrades = sTradeImdg.getCollectionObjectsByPredicate(sql); + Collection sTrades; + { + ImdgPredicateBuilder pb = sTradeImdg.predicateBuilder(); + ImdgPredicate sql = pb.greatEqual("tradeDateTime", tradingDay); + sTrades = sTradeImdg.getCollectionObjectsByPredicate(sql); + } log.info("Found {} new s_trade with trade_num>{}", sTrades.size(), tradeNum); if (sTrades.isEmpty()) { @@ -130,15 +133,31 @@ public class ExecutionDepositComponent { } } + // Необходимо проверять отсутствие ExecutionDeposit с exchangeExecutionId и clearingDate. + // Но при этом, во время создания новых ExecutionDeposit по STrade, TradeNum могут повторяться. LocalDate today = LocalDate.now(); + HashSet existTradeNumsOfExecutionDeposit = new HashSet<>(); + { + Set tradeNums = sTrades.stream().map(STrade::getTradeNum).filter(Objects::nonNull).collect(Collectors.toSet()); + log.debug("Check {} s_trade tradeNum=[{}] on date {}", sTrades.size(), tradeNums, today); + ImdgPredicateBuilder pb = executionDepositImdg.predicateBuilder(); + Collection existsEDeposit = executionDepositImdg.getCollectionObjectsByPredicate( + pb.and( + pb.in("exchangeExecutionId", tradeNums.toArray(new Comparable[0])), + pb.equals("clearingDate", today) + ) +// Map.of("exchangeExecutionId", trade.getTradeNum(),"clearingDate", today) + ); + for (ExecutionDeposit ed : existsEDeposit) { + existTradeNumsOfExecutionDeposit.add(ed.getExchangeExecutionId()); + } + } + for (STrade trade : sTrades) { log.trace("Check s_trade[{}].tradeNum={} on date {}", trade.getId(), trade.getTradeNum(), today); - Collection existsEDeposit = executionDepositImdg.getCollectionObjectsByFieldValues(Map.of( - "exchangeExecutionId", trade.getTradeNum(), - "clearingDate", today - )); + boolean existsEDeposit = existTradeNumsOfExecutionDeposit.contains(trade.getTradeNum()); - if (existsEDeposit.isEmpty()) { + if (!existsEDeposit) { log.trace("S_TRADE[{}] new", trade.getId()); // Проверка secCode @@ -160,8 +179,7 @@ public class ExecutionDepositComponent { } } else { - long[] idToLong = existsEDeposit.stream().mapToLong(SpcexObjectBase::getId).toArray(); - log.trace("S_TRADE[{}] already has executionDeposit: {}", trade.getId(), Arrays.toString(idToLong)); + log.trace("S_TRADE[{}] already has executionDeposit: exchangeExecutionId={} on date {}", trade.getId(), trade.getTradeNum(), today); } }