From 7f6e56a83562955657e688ea59289d71034634b7 Mon Sep 17 00:00:00 2001 From: Mikhail Trofimov Date: Mon, 23 Jun 2025 11:04:31 +0300 Subject: [PATCH] Added getting list of reports by package from monitoring; Filter lastReport --- .../response/online_report/InputParams.java | 24 +++++++++ .../online_report/OperationReport.java | 20 +++++++ .../response/online_report/Report.java | 26 +++++++++ .../response/online_report/Reports.java | 27 ++++++++++ .../online_report/SgnlOnlineReport.java | 22 ++++++++ .../mapper/signal/SignalMapper.java | 2 + .../service/MonitoringService.java | 54 +++++++++++++++++++ .../credit_tracker/service/SignalService.java | 7 +++ .../service/signal/SignalRestService.java | 22 ++++++++ .../ru/nbch/credit_tracker/utils/CTUtil.java | 27 ++++++++++ .../mybatis/mapper/signal/SignalMapper.xml | 9 ++++ 11 files changed, 240 insertions(+) create mode 100644 src/main/java/ru/nbch/credit_tracker/entities/response/online_report/InputParams.java create mode 100644 src/main/java/ru/nbch/credit_tracker/entities/response/online_report/OperationReport.java create mode 100644 src/main/java/ru/nbch/credit_tracker/entities/response/online_report/Report.java create mode 100644 src/main/java/ru/nbch/credit_tracker/entities/response/online_report/Reports.java create mode 100644 src/main/java/ru/nbch/credit_tracker/entities/response/online_report/SgnlOnlineReport.java create mode 100644 src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java create mode 100644 src/main/java/ru/nbch/credit_tracker/utils/CTUtil.java diff --git a/src/main/java/ru/nbch/credit_tracker/entities/response/online_report/InputParams.java b/src/main/java/ru/nbch/credit_tracker/entities/response/online_report/InputParams.java new file mode 100644 index 0000000..24b02a1 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/response/online_report/InputParams.java @@ -0,0 +1,24 @@ +package ru.nbch.credit_tracker.entities.response.online_report; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "memberCode", + "packCode" +}) +public class InputParams { + + @XmlElement(name = "memberCode", required = true) + protected String memberCode; + + @XmlElement(name = "packCode", required = true) + protected String packCode; +} diff --git a/src/main/java/ru/nbch/credit_tracker/entities/response/online_report/OperationReport.java b/src/main/java/ru/nbch/credit_tracker/entities/response/online_report/OperationReport.java new file mode 100644 index 0000000..3acb2b8 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/response/online_report/OperationReport.java @@ -0,0 +1,20 @@ +package ru.nbch.credit_tracker.entities.response.online_report; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "reports" +}) +public class OperationReport { + + @XmlElement(name = "Reports", required = true) + protected Reports reports; +} diff --git a/src/main/java/ru/nbch/credit_tracker/entities/response/online_report/Report.java b/src/main/java/ru/nbch/credit_tracker/entities/response/online_report/Report.java new file mode 100644 index 0000000..67cf510 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/response/online_report/Report.java @@ -0,0 +1,26 @@ +package ru.nbch.credit_tracker.entities.response.online_report; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "datetime", + "length", + "filename" +}) +public class Report { + + @XmlElement(name = "datetime", required = true) + protected String datetime; + @XmlElement(name = "length", required = true) + protected Integer length; + @XmlElement(name = "filename", required = true) + protected String filename; +} diff --git a/src/main/java/ru/nbch/credit_tracker/entities/response/online_report/Reports.java b/src/main/java/ru/nbch/credit_tracker/entities/response/online_report/Reports.java new file mode 100644 index 0000000..df2d31b --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/response/online_report/Reports.java @@ -0,0 +1,27 @@ +package ru.nbch.credit_tracker.entities.response.online_report; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +import java.util.ArrayList; +import java.util.List; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "reports" +}) +public class Reports { + + @XmlElement(name = "Report", required = true) + protected List reports; + + public List getReports() { + if (reports == null) { + reports = new ArrayList<>(); + } + return this.reports; + } + +} diff --git a/src/main/java/ru/nbch/credit_tracker/entities/response/online_report/SgnlOnlineReport.java b/src/main/java/ru/nbch/credit_tracker/entities/response/online_report/SgnlOnlineReport.java new file mode 100644 index 0000000..2326d2c --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/response/online_report/SgnlOnlineReport.java @@ -0,0 +1,22 @@ +package ru.nbch.credit_tracker.entities.response.online_report; + +import jakarta.xml.bind.annotation.*; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "inputParams", + "operationReport" +}) +@XmlRootElement(name = "SgnlOnlineReport") +public class SgnlOnlineReport { + + @XmlElement(name = "InputParams", required = true) + protected InputParams inputParams; + + @XmlElement(name = "OperationReport", required = true) + protected OperationReport operationReport; +} diff --git a/src/main/java/ru/nbch/credit_tracker/mapper/signal/SignalMapper.java b/src/main/java/ru/nbch/credit_tracker/mapper/signal/SignalMapper.java index 7d3b987..9eb74c3 100644 --- a/src/main/java/ru/nbch/credit_tracker/mapper/signal/SignalMapper.java +++ b/src/main/java/ru/nbch/credit_tracker/mapper/signal/SignalMapper.java @@ -33,4 +33,6 @@ public interface SignalMapper { SignalService.PackageData findPackageData(@Param("id") Integer id); List findPackageDataList(@Param("userId") String userId); + + List findPackagesByStatus(@Param("status") String status); } diff --git a/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java b/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java new file mode 100644 index 0000000..3a52140 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java @@ -0,0 +1,54 @@ +package ru.nbch.credit_tracker.service; + +import org.springframework.stereotype.Service; +import ru.nbch.credit_tracker.entities.response.online_report.Report; +import ru.nbch.credit_tracker.entities.response.online_report.SgnlOnlineReport; +import ru.nbch.credit_tracker.service.signal.SignalRestService; +import ru.nbch.credit_tracker.utils.CTUtil; + +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; + +@Service +public class MonitoringService { + + private final SignalRestService signalRestService; + private final SignalService signalService; + + public MonitoringService(SignalRestService signalRestService, SignalService signalService) { + this.signalRestService = signalRestService; + this.signalService = signalService; + } + + public void monitor() { + List packages = signalService.findPackagesOnMonitoring(); + for (SignalService.PackageData packageData : packages) { + SgnlOnlineReport onlineReports = signalRestService.getReports(packageData.getUserId().substring(0, 6) + "_" + packageData.getPackageName()); + + List fileNames = onlineReports.getOperationReport().getReports().getReports().stream().map(Report::getFilename) + .filter(fileName -> CTUtil.parseDateFromReportFileName(fileName) != null).toList(); // TODO оптимизировать + + Optional newReport = Optional.of(fileNames) + .orElseGet(Collections::emptyList) + .stream().max(Comparator.comparing(CTUtil::parseDateFromReportFileName)); // отфильтровали только те имена, которые парсятся в дату, так что null тут не придет + + LocalDateTime lastDownloadedReportDate = CTUtil.parseDateFromReportFileName(packageData.getLastDownloadedReport()); + + if (packageData.getLastDownloadedReport() == null && newReport.isPresent()) { + loadReport(newReport.get()); // по этому пакету еще не было загруженных отчетов, продолжаем работу с полученным + } else if (lastDownloadedReportDate != null && newReport.isPresent()) { + LocalDateTime newReportDate = CTUtil.parseDateFromReportFileName(newReport.get()); + if (newReportDate.isAfter(lastDownloadedReportDate)) { + loadReport(newReport.get()); // полученный отчет новее записанного в базу + } + } + } + } + + private void loadReport(String report) { + + } +} diff --git a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java index 5bbc11f..182f4ff 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java @@ -196,12 +196,19 @@ public class SignalService { return deleteResponse; } + public List findPackagesOnMonitoring() { + return mapper.findPackagesByStatus(Status.ON_MONITORING.name()); + } + @Getter @Setter public static class PackageData { + private Integer id; private String userId; private String packageName; private LocalDateTime createdAt; + private String status; + private String lastDownloadedReport; } @Getter diff --git a/src/main/java/ru/nbch/credit_tracker/service/signal/SignalRestService.java b/src/main/java/ru/nbch/credit_tracker/service/signal/SignalRestService.java index c2fb164..6aa56ba 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/signal/SignalRestService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/signal/SignalRestService.java @@ -11,6 +11,7 @@ import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; +import ru.nbch.credit_tracker.entities.response.online_report.SgnlOnlineReport; import ru.nbch.credit_tracker.entities.signal_package.Signals; import ru.nbch.credit_tracker.service.xml.jaxb.IXmlProcessor; import ru.nbch.credit_tracker.service.xml.jaxb.XmlUtilService; @@ -30,6 +31,7 @@ public class SignalRestService { private static String UPDATE_URI = "update"; private static String DELETE_URI = "delete"; + private static String GET_REPORTS_URI = "onlinereport"; private final RestTemplate restTemplate; private final XmlUtilService xmlUtilService; @@ -116,6 +118,26 @@ public class SignalRestService { } } + public SgnlOnlineReport getReports(String packCode) { + String url = GET_REPORTS_URI + "?packCode=" + packCode; + + HttpHeaders headers = new HttpHeaders(); + headers.setBasicAuth(authToken); + + HttpEntity> requestEntity = new HttpEntity<>(headers); + + ResponseEntity response = restTemplate.exchange( + url, + HttpMethod.GET, + requestEntity, + SgnlOnlineReport.class + ); + + // TODO обработка ошибок + + return response.getBody(); + } + private String buildToken(String signalsToken, String signalsuser) throws Exception { try { MessageDigest md = MessageDigest.getInstance("MD5"); diff --git a/src/main/java/ru/nbch/credit_tracker/utils/CTUtil.java b/src/main/java/ru/nbch/credit_tracker/utils/CTUtil.java new file mode 100644 index 0000000..36f302c --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/utils/CTUtil.java @@ -0,0 +1,27 @@ +package ru.nbch.credit_tracker.utils; + +import org.apache.commons.lang3.StringUtils; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class CTUtil { + + private static DateTimeFormatter onlineReportDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH-mm-ss"); + + + public static LocalDateTime parseDateFromReportFileName(String reportFileName) { + if (StringUtils.isBlank(reportFileName)) { + return null; + } + Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}T\\d{2}-\\d{2}-\\d{2}"); + Matcher matcher = pattern.matcher(reportFileName); + if (matcher.find()) { + String dateTimeStr = matcher.group(); + return LocalDateTime.parse(dateTimeStr, onlineReportDateTimeFormatter); + } + return null; + }; +} diff --git a/src/main/resources/mybatis/mapper/signal/SignalMapper.xml b/src/main/resources/mybatis/mapper/signal/SignalMapper.xml index b74d0f6..38d129e 100644 --- a/src/main/resources/mybatis/mapper/signal/SignalMapper.xml +++ b/src/main/resources/mybatis/mapper/signal/SignalMapper.xml @@ -12,9 +12,12 @@ + + + + + \ No newline at end of file