diff --git a/src/main/java/ru/nbch/credit_tracker/entities/response/online_download/Inquiry.java b/src/main/java/ru/nbch/credit_tracker/entities/response/online_download/Inquiry.java new file mode 100644 index 0000000..2de800b --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/response/online_download/Inquiry.java @@ -0,0 +1,45 @@ +package ru.nbch.credit_tracker.entities.response.online_download; + +import jakarta.xml.bind.annotation.*; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +@Setter +@Getter +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "signals" +}) +public class Inquiry { + + @XmlAttribute(name = "own", required = true) + protected String own; + @XmlAttribute(name = "inq_p", required = true) + protected String inqP; + @XmlAttribute(name = "currency", required = true) + protected String currency; + @XmlAttribute(name = "serial_num", required = true) + protected String serialNum; + @XmlAttribute(name = "date", required = true) + protected String date; + @XmlAttribute(name = "bus_category", required = true) + protected String busCategory; + @XmlAttribute(name = "inq_t", required = true) + protected String inqT; + @XmlAttribute(name = "channel", required = true) + protected String channel; + + @XmlElement(name = "Signal", required = true) + protected List signals; + + public List getSignals() { + if (signals == null) { + signals = new ArrayList<>(); + } + return this.signals; + } + +} diff --git a/src/main/java/ru/nbch/credit_tracker/entities/response/online_download/OnlineDownloadReport.java b/src/main/java/ru/nbch/credit_tracker/entities/response/online_download/OnlineDownloadReport.java new file mode 100644 index 0000000..d7c25fc --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/response/online_download/OnlineDownloadReport.java @@ -0,0 +1,30 @@ +package ru.nbch.credit_tracker.entities.response.online_download; + +import jakarta.xml.bind.annotation.*; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "id", + "version", + "user", + "reportCreated", + "persons" +}) +@XmlRootElement(name = "Report") +public class OnlineDownloadReport { + + @XmlElement(name = "Id", required = true) + protected String id; + @XmlElement(name = "Version", required = true) + protected String version; + @XmlElement(name = "User", required = true) + protected String user; + @XmlElement(name = "ReportCreated", required = true) + protected String reportCreated; + @XmlElement(name = "Persons", required = true) + protected Persons persons; +} diff --git a/src/main/java/ru/nbch/credit_tracker/entities/response/online_download/Person.java b/src/main/java/ru/nbch/credit_tracker/entities/response/online_download/Person.java new file mode 100644 index 0000000..9b5569f --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/response/online_download/Person.java @@ -0,0 +1,21 @@ +package ru.nbch.credit_tracker.entities.response.online_download; + +import jakarta.xml.bind.annotation.*; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "inquiry" +}) +public class Person { + + @XmlAttribute(name = "uid", required = true) + protected String uid; + + @XmlElement(name = "Inquiry", required = true) + protected Inquiry inquiry; + +} diff --git a/src/main/java/ru/nbch/credit_tracker/entities/response/online_download/Persons.java b/src/main/java/ru/nbch/credit_tracker/entities/response/online_download/Persons.java new file mode 100644 index 0000000..9ec4600 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/response/online_download/Persons.java @@ -0,0 +1,28 @@ +package ru.nbch.credit_tracker.entities.response.online_download; + +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 = { + "persons" +}) +public class Persons { + + @XmlElement(name = "Person", required = true) + protected List persons; + + public List getPersons() { + if (persons == null) { + persons = new ArrayList<>(); + } + return this.persons; + } + + +} diff --git a/src/main/java/ru/nbch/credit_tracker/entities/response/online_download/Signal.java b/src/main/java/ru/nbch/credit_tracker/entities/response/online_download/Signal.java new file mode 100644 index 0000000..cae1ced --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/response/online_download/Signal.java @@ -0,0 +1,18 @@ +package ru.nbch.credit_tracker.entities.response.online_download; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlType; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { +}) +public class Signal { + @XmlAttribute(name = "n", required = true) + protected Integer n; +} diff --git a/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java b/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java index 3a52140..d30e468 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java @@ -1,26 +1,39 @@ package ru.nbch.credit_tracker.service; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import ru.nbch.credit_tracker.entities.response.online_download.OnlineDownloadReport; +import ru.nbch.credit_tracker.entities.response.online_download.Person; 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.service.xml.jaxb.IXmlProcessor; +import ru.nbch.credit_tracker.service.xml.jaxb.XmlUtilService; import ru.nbch.credit_tracker.utils.CTUtil; +import java.io.ByteArrayInputStream; import java.time.LocalDateTime; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Optional; +import java.util.zip.GZIPInputStream; +@Slf4j @Service public class MonitoringService { private final SignalRestService signalRestService; private final SignalService signalService; + private final XmlUtilService xmlUtilService; - public MonitoringService(SignalRestService signalRestService, SignalService signalService) { + public MonitoringService(SignalRestService signalRestService, + SignalService signalService, + XmlUtilService xmlUtilService) { this.signalRestService = signalRestService; this.signalService = signalService; + this.xmlUtilService = xmlUtilService; + monitor(); } public void monitor() { @@ -37,18 +50,48 @@ public class MonitoringService { LocalDateTime lastDownloadedReportDate = CTUtil.parseDateFromReportFileName(packageData.getLastDownloadedReport()); + OnlineDownloadReport report = null; if (packageData.getLastDownloadedReport() == null && newReport.isPresent()) { - loadReport(newReport.get()); // по этому пакету еще не было загруженных отчетов, продолжаем работу с полученным + report = loadReport(newReport.get()); // по этому пакету еще не было загруженных отчетов, продолжаем работу с полученным } else if (lastDownloadedReportDate != null && newReport.isPresent()) { LocalDateTime newReportDate = CTUtil.parseDateFromReportFileName(newReport.get()); if (newReportDate.isAfter(lastDownloadedReportDate)) { - loadReport(newReport.get()); // полученный отчет новее записанного в базу + report = loadReport(newReport.get()); // полученный отчет новее записанного в базу } } + if (report == null) { + continue; + } + + // Отбирает только тех фл, у которых bus_category in (MFO, MKK, MFK) и есть сигналы с кодом 16 + List validPersons = report.getPersons().getPersons().stream().filter(person -> CTUtil.checkBusCategory(person.getInquiry().getBusCategory())) + .filter(person -> person.getInquiry().getSignals().stream().anyMatch(signal -> signal.getN().equals(16))).toList(); + + createRsponse(packageData, validPersons); } } - private void loadReport(String report) { + private void createRsponse(SignalService.PackageData packageData, List validPersons) { } + + private OnlineDownloadReport loadReport(String reportName) { + byte[] archive = signalRestService.downloadReport(reportName); + if (archive == null) { + return null; + } + OnlineDownloadReport report; + try (GZIPInputStream zipInputStream = new GZIPInputStream(new ByteArrayInputStream(archive))) { + + IXmlProcessor processor = xmlUtilService.createJaxbProcessor(); + report = processor.read(zipInputStream, OnlineDownloadReport.class); + + } catch (Exception e) { + log.error(e.getMessage(), e); + return null; + } + + return report; + } + } 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 6aa56ba..20378a4 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 @@ -32,6 +32,7 @@ public class SignalRestService { private static String UPDATE_URI = "update"; private static String DELETE_URI = "delete"; private static String GET_REPORTS_URI = "onlinereport"; + private static String DOWNLOAD_REPORT_URI = "onlinedownload"; private final RestTemplate restTemplate; private final XmlUtilService xmlUtilService; @@ -138,6 +139,24 @@ public class SignalRestService { return response.getBody(); } + public byte[] downloadReport(String reportName) { + String url = DOWNLOAD_REPORT_URI + "?fNameReport=" + reportName; + + HttpHeaders headers = new HttpHeaders(); + headers.setBasicAuth(authToken); + + HttpEntity> requestEntity = new HttpEntity<>(headers); + + ResponseEntity response = restTemplate.exchange( + url, + HttpMethod.GET, + requestEntity, + byte[].class + ); + + 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/service/xml/jaxb/XmlUtilService.java b/src/main/java/ru/nbch/credit_tracker/service/xml/jaxb/XmlUtilService.java index 52c83cf..376fb7e 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/xml/jaxb/XmlUtilService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/xml/jaxb/XmlUtilService.java @@ -5,6 +5,7 @@ import org.springframework.stereotype.Service; import org.xml.sax.SAXException; import ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequest; import ru.nbch.credit_tracker.entities.response.errors.MonitoringError; +import ru.nbch.credit_tracker.entities.response.online_download.OnlineDownloadReport; import ru.nbch.credit_tracker.entities.response.success.MonitoringResponse; import ru.nbch.credit_tracker.entities.signal_package.Signals; @@ -30,6 +31,7 @@ public class XmlUtilService { return new XmlProcessorImplAnyClasses(Charset.forName("windows-1251"), // unmarshalling classes MonitoringRequest.class, + OnlineDownloadReport.class, // marshalling classes Signals.class, MonitoringError.class, diff --git a/src/main/java/ru/nbch/credit_tracker/utils/CTUtil.java b/src/main/java/ru/nbch/credit_tracker/utils/CTUtil.java index 36f302c..c8c007a 100644 --- a/src/main/java/ru/nbch/credit_tracker/utils/CTUtil.java +++ b/src/main/java/ru/nbch/credit_tracker/utils/CTUtil.java @@ -23,5 +23,16 @@ public class CTUtil { return LocalDateTime.parse(dateTimeStr, onlineReportDateTimeFormatter); } return null; - }; + } + + public static boolean checkBusCategory(String busCategory) { + switch (busCategory) { + case "MFO", "MKK", "MFK", "BANK" -> { // TODO remove bank after testing + return true; + } + default -> { + return false; + } + } + } }