diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/PairRegistryId.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/PairRegistryId.java new file mode 100644 index 000000000..59637f072 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/PairRegistryId.java @@ -0,0 +1,41 @@ +package ru.spcex.clearing.reports.reports; + +import ru.clearing.classes.statics.data.registry.Registry; + +import java.time.LocalDate; +import java.util.Objects; + +public class PairRegistryId { + private Long groupId; + private LocalDate settlementDate; + + public PairRegistryId() { + + } + + public PairRegistryId(Registry registry) { + this.groupId = registry.getGroupId(); + this.settlementDate = registry.getSettlementDate(); + } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public LocalDate getSettlementDate() { + return settlementDate; + } + + public void setSettlementDate(LocalDate settlementDate) { + this.settlementDate = settlementDate; + } + + @Override + public int hashCode() { + return Objects.hash(groupId, settlementDate); + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashNettoReportBuilder.java index eea7b085d..6179f58af 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashNettoReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepCashNettoReportBuilder.java @@ -1,23 +1,36 @@ package ru.spcex.clearing.reports.reports.ks; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.reports.reports.CSVReportBuilder; +import ru.spcex.clearing.reports.reports.PairRegistryId; import ru.spcex.clearing.reports.reports.SessionIdParam; import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.enumeration.ReportType; 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; +import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +@Component +@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) public class KSRepCashNettoReportBuilder extends CSVReportBuilder { private final Imdg registryImdg; private final Imdg sessionImdg; @@ -57,10 +70,11 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate); - Map registryAlreadySaved = new HashMap<>(); - Map omtRegistries = new HashMap<>(); - Map tmtRegistries = new HashMap<>(); - for (Registry registry : registries) { - if (registry.getSettlementDate() == null || registry.getGroupId() == null) continue; - registryAlreadySaved.put(registry.getGroupId() + registry.getSettlementDate().toString(), false); - if (registry.getRegistryCode().startsWith("O")) { - Registry existOMTRegistry = omtRegistries.get(registry.getGroupId() + registry.getSettlementDate().toString()); - if (existOMTRegistry != null && existOMTRegistry.getBalance() != null) { - log.warn("Duplicated registry OM*T (id = {} and id = {}). Use id = {}", - registry.getId(), - existOMTRegistry, - existOMTRegistry); - } else omtRegistries.put(registry.getGroupId() + registry.getSettlementDate().toString(), registry); - } - if (registry.getRegistryCode().startsWith("T")) { - Registry existTMTRegistry = tmtRegistries.get(registry.getGroupId() + registry.getSettlementDate().toString()); - if (existTMTRegistry != null && existTMTRegistry.getBalance() != null) { - log.warn("Duplicated registry TM*T (id = {} and id = {}). Use id = {}", - registry.getId(), - existTMTRegistry, - existTMTRegistry); - } else tmtRegistries.put(registry.getGroupId() + registry.getSettlementDate().toString(), registry); - } - } + // todo check filter (skip register without log) + Map> registryMap = registries.stream() + .filter(r -> r.getGroupId() != null && r.getSettlementDate() != null) + .collect(Collectors.groupingBy(PairRegistryId::new)); - Map createdAtForSessionId = new HashMap<>(); - lines = new ArrayList<>(registries.size()); - for (Registry registry : registries) { + lines = new ArrayList<>(registryMap.size()); + for (Map.Entry> entry : registryMap.entrySet()) { + PairRegistryId pairRegistryId = entry.getKey(); + List groupedRegistry = entry.getValue(); try { - if (registry.getSettlementDate() == null || registry.getGroupId() == null) { - log.warn("Registry without GroupId or SettlementDate, id = {}. Skipped", registry.getId()); - continue; - } - if (registryAlreadySaved.get(registry.getGroupId() + registry.getSettlementDate().toString())) continue; - - Registry tmtRegistry = tmtRegistries.get(registry.getGroupId() + registry.getSettlementDate().toString()); - Registry omtRegistry = omtRegistries.get(registry.getGroupId() + registry.getSettlementDate().toString()); - - if (!tmtRegistry.getTradingCode().equalsIgnoreCase(omtRegistry.getTradingCode()) || - !tmtRegistry.getSessionId().equals(omtRegistry.getSessionId()) || - !tmtRegistry.getAccount().equals(omtRegistry.getAccount())) { - log.warn("Invalid registry OM*T (id = {}) and TM*T (id = {}) registry pair: fields not equal. GroupId = {}, SettlementDate = {}. Skipped", - omtRegistry.getId(), - tmtRegistry.getId(), - registry.getSettlementDate().toString(), - registry.getGroupId()); + if (groupedRegistry.size() != 2) { + log.warn("Invalid OM_T and TM_T registries for GroupId = {} and SettlementDate = {}. Registries with id = [{}] was skipped", + pairRegistryId.getGroupId(), + pairRegistryId.getSettlementDate(), + groupedRegistry.stream().map(r -> String.valueOf(r.getId())).collect(Collectors.joining(", ")) + ); continue; } - String firmId = registry.getTradingCode() != null ? registry.getTradingCode() : ""; - String sessionId = String.valueOf(registry.getSessionId()); - - String sessionDate = createdAtForSessionId.get(registry.getSessionId()); - if (sessionDate == null) { - Session session = sessionImdg.getSingleObjectByID(registry.getSessionId()); - sessionDate = session != null && session.getCreated() != null ? dateTimeFormatter.format(LocalDateTime.ofInstant(session.getCreated(), ZoneId.systemDefault())) : ""; - createdAtForSessionId.put(registry.getSessionId(), sessionDate); + Registry tmtRegistry = null; + Registry omtRegistry = null; + for (Registry registry : groupedRegistry) { + if (RegistryDesignation.O.equalsByKey(registry.getRegistryDesignation())) omtRegistry = registry; + if (RegistryDesignation.T.equalsByKey(registry.getRegistryDesignation())) tmtRegistry = registry; } - String account = registry.getAccount(); + if (tmtRegistry == null || omtRegistry == null) { + log.warn("Invalid TM_T and OM_T registry pair, {} doubled. Registry pair was skipped", tmtRegistry == null ? "OM_T" : "TM_T"); + continue; + } + + if (!tmtRegistry.getAccount().equals(omtRegistry.getAccount()) || + !tmtRegistry.getTradingCode().equals(omtRegistry.getTradingCode())) { + log.warn("Invalid TM_T and OM_T registry pair, account or tradingCode not equals. Registry pair was skipped"); + continue; + } + + + String firmId = tmtRegistry.getTradingCode() != null ? tmtRegistry.getTradingCode() : ""; + String sessionId = String.valueOf(tmtRegistry.getSessionId()); + + Session session = sessionImdg.getSingleObjectByID(tmtRegistry.getSessionId()); + String sessionDate = ""; + if (session != null && session.getCreated() != null) + sessionDate = dateTimeFormatter.format(LocalDateTime.ofInstant(session.getCreated(), ZoneId.systemDefault())); + + String account = tmtRegistry.getAccount(); BigDecimal tmtBalance = tmtRegistry.getBalance() != null ? tmtRegistry.getBalance() : BigDecimal.ZERO; BigDecimal omtBalance = omtRegistry.getBalance() != null ? omtRegistry.getBalance() : BigDecimal.ZERO; @@ -146,9 +146,12 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder String.valueOf(r.getId())).collect(Collectors.joining(", ")) + ), e + ); } } }