diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Clearing.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Clearing.java index c46e73787..3406f3383 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Clearing.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Clearing.java @@ -45,20 +45,19 @@ public class Clearing { //выгружаем ExecutionDeposit с пустым sessionId Collection execDeposits = executionDepositImdg.getCollectionObjectsBySQL("sessionId = null"); //делаем группировку ExecutionDeposit по категории и компании, делаем сортировку - LinkedHashMap>> executionDeposits = sorter.sortExecutionDeposit(execDeposits); + LinkedHashMap>> executionDeposits = sorter.sortExecutionDeposit(execDeposits); executionDeposits.forEach((category, companies) -> { - for (List companyExecDeposits : companies) { + for (List companyExecDeposits : companies) { processSingleCompany(category, companyExecDeposits); } }); } - private void processSingleCompany(ClearingCategory category, List executionDeposits) { + private void processSingleCompany(ClearingCategory category, List executionDeposits) { log.info("Start clearing for category: {}, company: {}", category, executionDeposits.get(0).getCompanyId()); boolean financialError = false; - for (ExecDepositWCategory execDepositWrapper : executionDeposits) { - ExecutionDeposit execDeposit = execDepositWrapper.getExecutionDeposit(); + for (ExecutionDeposit execDeposit : executionDeposits) { if (financialError) { updateDenied(execDeposit); continue; diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/order/ExecutionDepositSorter.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/order/ExecutionDepositSorter.java index 21178cd47..954df66c4 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/order/ExecutionDepositSorter.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/order/ExecutionDepositSorter.java @@ -3,9 +3,9 @@ package ru.spcex.clearing.service.order; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.execution.ExecutionDeposit; -import ru.spcex.clearing.service.ExecDepositWCategory; import ru.spcex.platform.enumeration.ClearingCategory; import ru.spcex.platform.enumeration.MoneyFlowSide; +import ru.spcex.platform.utils.collection.Pair; import ru.spcex.platform.utils.enumeration.IEnumKey; import java.util.*; @@ -23,7 +23,7 @@ public class ExecutionDepositSorter { this.clearingMemberCategoryProvider = clearingMemberCategoryProvider; } - public LinkedHashMap>> sortExecutionDeposit(CollectionexecDeposits) { + public LinkedHashMap>> sortExecutionDeposit(CollectionexecDeposits) { //отсортировали все записи по категориям // → внутри каждой подгруппы по категориям сортируем по компаниям // → обрабатываем почередно все записи первой компании @@ -32,18 +32,18 @@ public class ExecutionDepositSorter { // начинаем аналогично обработавать все записи второй категории и так далее). //сортируем по категориям - Map> categoryGrouping = execDeposits.stream().map(executionDeposit -> { + Map> categoryGrouping = execDeposits.stream().map(executionDeposit -> { ClearingCategory category = clearingMemberCategoryProvider.apply(executionDeposit.getCompanyId()); - return new ExecDepositWCategory(executionDeposit, category); - }).collect(Collectors.groupingBy(ExecDepositWCategory::getClearingMemberCategory)); + return new Pair<>(category, executionDeposit); + }).collect(Collectors.groupingBy(Pair::getFirst, Collectors.mapping(Pair::getSecond, Collectors.toList()))); //внутри категорий сортируем по компаниям - LinkedHashMap>> byCategoryByCompany = new LinkedHashMap<>(); - Consumer takeByClearingCategoryAnSortByCompaniId = clearingCategory -> { - List wrappers = categoryGrouping.remove(clearingCategory); + LinkedHashMap>> byCategoryByCompany = new LinkedHashMap<>(); + Consumer takeByClearingCategoryAndSortByCompanyId = clearingCategory -> { + List wrappers = categoryGrouping.remove(clearingCategory); if (wrappers != null) { - List> batches = wrappers.stream() - .collect(Collectors.groupingBy(ExecDepositWCategory::getCompanyId)) + List> batches = wrappers.stream() + .collect(Collectors.groupingBy(ExecutionDeposit::getCompanyId)) .entrySet() .stream() .sorted(Map.Entry.comparingByKey()) @@ -53,29 +53,29 @@ public class ExecutionDepositSorter { } }; //кладем в порядке I, V, B - takeByClearingCategoryAnSortByCompaniId.accept(ClearingCategory.I); - takeByClearingCategoryAnSortByCompaniId.accept(ClearingCategory.V); - takeByClearingCategoryAnSortByCompaniId.accept(ClearingCategory.B); + takeByClearingCategoryAndSortByCompanyId.accept(ClearingCategory.I); + takeByClearingCategoryAndSortByCompanyId.accept(ClearingCategory.V); + takeByClearingCategoryAndSortByCompanyId.accept(ClearingCategory.B); //для всех остальных порядок не важен, будут последними - categoryGrouping.keySet().forEach(takeByClearingCategoryAnSortByCompaniId); + categoryGrouping.keySet().forEach(takeByClearingCategoryAndSortByCompanyId); //метод для дополнительной сортировки внутри групп по категории и компании - BiConsumer> additionalSorting = + BiConsumer> additionalSorting = (clearingCategory, comparator) -> byCategoryByCompany .get(clearingCategory) .forEach(singleCompanyBatch -> singleCompanyBatch.sort(comparator)); //применяем дополнительные сортировки //для V сначала Sell, потом Buy, в первую очередь должны обрабатываться новые сделки с наименьшими объемами - additionalSorting.accept(ClearingCategory.V, firstSellThenBuy - .thenComparing(wrapper -> wrapper.getExecutionDeposit().getFirstLegAmount())); + additionalSorting.accept(ClearingCategory.V, + firstSellThenBuy.thenComparing(ExecutionDeposit::getFirstLegAmount)); //для V сначала Buy, потом Sell, exchangeExecutionId - возрастающий - additionalSorting.accept(ClearingCategory.B, firstBuyThenSell - .thenComparing(wrapper -> wrapper.getExecutionDeposit().getExchangeExecutionId())); + additionalSorting.accept(ClearingCategory.B, + firstBuyThenSell.thenComparing(ExecutionDeposit::getExchangeExecutionId)); return byCategoryByCompany; } - public static Comparator firstSellThenBuy = Comparator.comparing(wrapper -> { - MoneyFlowSide side = IEnumKey.getEnumByKey(MoneyFlowSide.class, wrapper.getExecutionDeposit().getSide()); + public static Comparator firstSellThenBuy = Comparator.comparing(wrapper -> { + MoneyFlowSide side = IEnumKey.getEnumByKey(MoneyFlowSide.class, wrapper.getSide()); if (side == null) return Integer.MAX_VALUE; switch (side) { case BUY -> { @@ -90,8 +90,8 @@ public class ExecutionDepositSorter { } }); - public static Comparator firstBuyThenSell = Comparator.comparing(wrapper -> { - MoneyFlowSide side = IEnumKey.getEnumByKey(MoneyFlowSide.class, wrapper.getExecutionDeposit().getSide()); + public static Comparator firstBuyThenSell = Comparator.comparing(wrapper -> { + MoneyFlowSide side = IEnumKey.getEnumByKey(MoneyFlowSide.class, wrapper.getSide()); if (side == null) return Integer.MAX_VALUE; switch (side) { case BUY -> { diff --git a/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/collection/Pair.java b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/collection/Pair.java new file mode 100644 index 000000000..3fb512341 --- /dev/null +++ b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/collection/Pair.java @@ -0,0 +1,27 @@ +package ru.spcex.platform.utils.collection; + +public class Pair { + private T1 first; + private T2 second; + + public Pair(T1 first, T2 second) { + this.first = first; + this.second = second; + } + + public T1 getFirst() { + return first; + } + + public void setFirst(T1 first) { + this.first = first; + } + + public T2 getSecond() { + return second; + } + + public void setSecond(T2 second) { + this.second = second; + } +}