Added loading Report by fileName and parsing it

This commit is contained in:
Mikhail Trofimov 2025-06-23 12:53:37 +03:00
parent 7f6e56a835
commit a9332dd71e
9 changed files with 222 additions and 5 deletions

View file

@ -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<Signal> signals;
public List<Signal> getSignals() {
if (signals == null) {
signals = new ArrayList<>();
}
return this.signals;
}
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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<Person> persons;
public List<Person> getPersons() {
if (persons == null) {
persons = new ArrayList<>();
}
return this.persons;
}
}

View file

@ -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;
}

View file

@ -1,26 +1,39 @@
package ru.nbch.credit_tracker.service; package ru.nbch.credit_tracker.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; 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.Report;
import ru.nbch.credit_tracker.entities.response.online_report.SgnlOnlineReport; import ru.nbch.credit_tracker.entities.response.online_report.SgnlOnlineReport;
import ru.nbch.credit_tracker.service.signal.SignalRestService; 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 ru.nbch.credit_tracker.utils.CTUtil;
import java.io.ByteArrayInputStream;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.zip.GZIPInputStream;
@Slf4j
@Service @Service
public class MonitoringService { public class MonitoringService {
private final SignalRestService signalRestService; private final SignalRestService signalRestService;
private final SignalService signalService; 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.signalRestService = signalRestService;
this.signalService = signalService; this.signalService = signalService;
this.xmlUtilService = xmlUtilService;
monitor();
} }
public void monitor() { public void monitor() {
@ -37,18 +50,48 @@ public class MonitoringService {
LocalDateTime lastDownloadedReportDate = CTUtil.parseDateFromReportFileName(packageData.getLastDownloadedReport()); LocalDateTime lastDownloadedReportDate = CTUtil.parseDateFromReportFileName(packageData.getLastDownloadedReport());
OnlineDownloadReport report = null;
if (packageData.getLastDownloadedReport() == null && newReport.isPresent()) { if (packageData.getLastDownloadedReport() == null && newReport.isPresent()) {
loadReport(newReport.get()); // по этому пакету еще не было загруженных отчетов, продолжаем работу с полученным report = loadReport(newReport.get()); // по этому пакету еще не было загруженных отчетов, продолжаем работу с полученным
} else if (lastDownloadedReportDate != null && newReport.isPresent()) { } else if (lastDownloadedReportDate != null && newReport.isPresent()) {
LocalDateTime newReportDate = CTUtil.parseDateFromReportFileName(newReport.get()); LocalDateTime newReportDate = CTUtil.parseDateFromReportFileName(newReport.get());
if (newReportDate.isAfter(lastDownloadedReportDate)) { if (newReportDate.isAfter(lastDownloadedReportDate)) {
loadReport(newReport.get()); // полученный отчет новее записанного в базу report = loadReport(newReport.get()); // полученный отчет новее записанного в базу
} }
} }
if (report == null) {
continue;
}
// Отбирает только тех фл, у которых bus_category in (MFO, MKK, MFK) и есть сигналы с кодом 16
List<Person> 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<Person> 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;
}
} }

View file

@ -32,6 +32,7 @@ public class SignalRestService {
private static String UPDATE_URI = "update"; private static String UPDATE_URI = "update";
private static String DELETE_URI = "delete"; private static String DELETE_URI = "delete";
private static String GET_REPORTS_URI = "onlinereport"; private static String GET_REPORTS_URI = "onlinereport";
private static String DOWNLOAD_REPORT_URI = "onlinedownload";
private final RestTemplate restTemplate; private final RestTemplate restTemplate;
private final XmlUtilService xmlUtilService; private final XmlUtilService xmlUtilService;
@ -138,6 +139,24 @@ public class SignalRestService {
return response.getBody(); return response.getBody();
} }
public byte[] downloadReport(String reportName) {
String url = DOWNLOAD_REPORT_URI + "?fNameReport=" + reportName;
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth(authToken);
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(headers);
ResponseEntity<byte[]> response = restTemplate.exchange(
url,
HttpMethod.GET,
requestEntity,
byte[].class
);
return response.getBody();
}
private String buildToken(String signalsToken, String signalsuser) throws Exception { private String buildToken(String signalsToken, String signalsuser) throws Exception {
try { try {
MessageDigest md = MessageDigest.getInstance("MD5"); MessageDigest md = MessageDigest.getInstance("MD5");

View file

@ -5,6 +5,7 @@ import org.springframework.stereotype.Service;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequest; 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.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.response.success.MonitoringResponse;
import ru.nbch.credit_tracker.entities.signal_package.Signals; import ru.nbch.credit_tracker.entities.signal_package.Signals;
@ -30,6 +31,7 @@ public class XmlUtilService {
return new XmlProcessorImplAnyClasses(Charset.forName("windows-1251"), return new XmlProcessorImplAnyClasses(Charset.forName("windows-1251"),
// unmarshalling classes // unmarshalling classes
MonitoringRequest.class, MonitoringRequest.class,
OnlineDownloadReport.class,
// marshalling classes // marshalling classes
Signals.class, Signals.class,
MonitoringError.class, MonitoringError.class,

View file

@ -23,5 +23,16 @@ public class CTUtil {
return LocalDateTime.parse(dateTimeStr, onlineReportDateTimeFormatter); return LocalDateTime.parse(dateTimeStr, onlineReportDateTimeFormatter);
} }
return null; 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;
}
}
}
} }