From c2c1eab58b60d168b0e324b4c43498d3aea11946 Mon Sep 17 00:00:00 2001 From: Mikhail Trofimov Date: Thu, 11 Sep 2025 14:13:44 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/BKI-3199 Added loading error file for monitoring --- .../credit_tracker/config/xml/XmlConfig.java | 2 + .../ErrorsForNextReport.java | 21 ++++++ .../monitoring_report_file/InputParams.java | 24 ++++++ .../OperationReport.java | 20 +++++ .../SgnlReportMonitorigSetupError.java | 22 ++++++ .../credit_tracker/facade/SignalFacade.java | 17 +++++ .../credit_tracker/service/SignalService.java | 8 ++ .../service/signal/SignalRestService.java | 75 ++++++++++++++++++- 8 files changed, 187 insertions(+), 2 deletions(-) create mode 100644 src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_file/ErrorsForNextReport.java create mode 100644 src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_file/InputParams.java create mode 100644 src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_file/OperationReport.java create mode 100644 src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_file/SgnlReportMonitorigSetupError.java diff --git a/src/main/java/ru/nbch/credit_tracker/config/xml/XmlConfig.java b/src/main/java/ru/nbch/credit_tracker/config/xml/XmlConfig.java index db3a5f6..08d7499 100644 --- a/src/main/java/ru/nbch/credit_tracker/config/xml/XmlConfig.java +++ b/src/main/java/ru/nbch/credit_tracker/config/xml/XmlConfig.java @@ -4,6 +4,7 @@ import jakarta.xml.bind.JAXBException; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; +import ru.nbch.credit_tracker.entities.external_response.monitoring_report_file.SgnlReportMonitorigSetupError; import ru.nbch.credit_tracker.entities.external_response.online_report.SgnlOnlineReport; import ru.nbch.credit_tracker.entities.user_response.errors.MonitoringError; import ru.nbch.credit_tracker.entities.user_response.success.MonitoringSetupResponse; @@ -24,6 +25,7 @@ public class XmlConfig { return new XmlProcessorImplAnyClasses(Charset.forName(settings.getEncoding()), // unmarshalling classes SgnlOnlineReport.class, + SgnlReportMonitorigSetupError.class, // marshalling classes MonitoringError.class, MonitoringSetupResponse.class); diff --git a/src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_file/ErrorsForNextReport.java b/src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_file/ErrorsForNextReport.java new file mode 100644 index 0000000..bcd045c --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_file/ErrorsForNextReport.java @@ -0,0 +1,21 @@ +package ru.nbch.credit_tracker.entities.external_response.monitoring_report_file; + +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 = { + "filename" +}) +public class ErrorsForNextReport { + + @XmlElement(name = "filename", required = true) + protected String filename; + +} diff --git a/src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_file/InputParams.java b/src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_file/InputParams.java new file mode 100644 index 0000000..8ff952c --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_file/InputParams.java @@ -0,0 +1,24 @@ +package ru.nbch.credit_tracker.entities.external_response.monitoring_report_file; + +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/external_response/monitoring_report_file/OperationReport.java b/src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_file/OperationReport.java new file mode 100644 index 0000000..f518941 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_file/OperationReport.java @@ -0,0 +1,20 @@ +package ru.nbch.credit_tracker.entities.external_response.monitoring_report_file; + +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 = { + "errorsForNextReport" +}) +public class OperationReport { + + @XmlElement(name = "ErrorsForNextReport") + protected ErrorsForNextReport errorsForNextReport; +} diff --git a/src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_file/SgnlReportMonitorigSetupError.java b/src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_file/SgnlReportMonitorigSetupError.java new file mode 100644 index 0000000..e033b4f --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_file/SgnlReportMonitorigSetupError.java @@ -0,0 +1,22 @@ +package ru.nbch.credit_tracker.entities.external_response.monitoring_report_file; + +import jakarta.xml.bind.annotation.*; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "inputParams", + "operationReport" +}) +@XmlRootElement(name = "SgnlReport") +public class SgnlReportMonitorigSetupError { + + @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/facade/SignalFacade.java b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java index df80c2b..8213fa4 100644 --- a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java +++ b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java @@ -1,6 +1,7 @@ package ru.nbch.credit_tracker.facade; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.core.io.FileUrlResource; import org.springframework.core.io.Resource; @@ -225,6 +226,7 @@ public class SignalFacade { if (signalRestService.setupMonitoring(packageId)) { log.info("Package was successfully registered in signal service. PackageId: {} PackageName: {}", packageId, packageName); signalService.updatePackageStatus(packageId, Status.ON_MONITORING); + findErrors(packageId); } else { log.info("Package registration was rejected by signal service. PackageId: {} PackageName: {}", packageId, packageName); signalService.updatePackageStatus(packageId, Status.ERROR); @@ -237,6 +239,21 @@ public class SignalFacade { }); } + private void findErrors(Integer packageId) { + UserPackage userPackage = signalService.findPackage(packageId); + if (userPackage != null) { + String packCode = userPackage.getUserId().substring(0, 6) + "_" + userPackage.getPackageName(); + log.info("Проверка на ошибки при постановке на мониторинг. packCode={}, packageId={}", packCode, packageId); + String fileName = signalRestService.getErrorFileName(packageId, packCode); + if (StringUtils.isNotBlank(fileName)) { + String filePath = signalRestService.loadErrorFile(packageId, fileName); + if (StringUtils.isNotBlank(filePath)) { + signalService.updateSubjectsErrors(filePath); + } + } + } + } + private boolean isZipFile(MultipartFile file) { return file.getContentType() != null && (file.getContentType().equals("application/zip") || file.getContentType().equals("application/x-zip-compressed")) || 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 ebe29ec..478c1a2 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java @@ -277,6 +277,10 @@ public class SignalService { return persons; } + public void updateSubjectsErrors(String filePath) { + + } + public List findActivePackages(String userId) { return userPackageService.findUserPackages(userId, Status.ON_MONITORING, Status.PROCESSING); } @@ -317,6 +321,10 @@ public class SignalService { return phoneFidMapService.hasNonNullfids(packageId); } + public UserPackage findPackage(Integer packageId) { + return userPackageService.findPackage(packageId); + } + @Getter @AllArgsConstructor public static class UpdateResult { 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 6c633b0..b6bf98c 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 @@ -12,6 +12,7 @@ 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.external_response.errors.SgnlReport; +import ru.nbch.credit_tracker.entities.external_response.monitoring_report_file.SgnlReportMonitorigSetupError; import ru.nbch.credit_tracker.entities.external_response.online_report.SgnlOnlineReport; import ru.nbch.credit_tracker.service.SignalService; import ru.nbch.credit_tracker.service.xml.jaxb.IXmlProcessor; @@ -34,7 +35,9 @@ 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 static String GET_REPORT_URI = "report"; + private static String DOWNLOAD_REPORT_URI = "download"; + private static String DOWNLOAD_ONLINE_REPORT_URI = "onlinedownload"; private final RestTemplate restTemplate; private final IXmlProcessor xmlProcessor; @@ -98,6 +101,70 @@ public class SignalRestService { return false; } + /** + * @return имя файла с ошибками по поставленному на мониторинг отчету + */ + public String getErrorFileName(Integer packageId, String packCode) { + String url = GET_REPORT_URI + "?packCode=" + packCode; + + HttpHeaders headers = new HttpHeaders(); + headers.setBasicAuth(authToken); + + HttpEntity> requestEntity = new HttpEntity<>(headers); + + ResponseEntity response = restTemplate.exchange( + url, + HttpMethod.GET, + requestEntity, + String.class + ); + + String answer = response.getBody(); + + SgnlReport error = staxProcessor.read(answer, SgnlReport.class); + if (error.getError().getDescription() != null) { + log.error("Ошибка при получении имени файла ошибки из сервиса НБКИ. packCode={}. Описание: {}", packCode, error.getError().getDescription()); + return null; + } + try { + SgnlReportMonitorigSetupError report = xmlProcessor.read(answer, SgnlReportMonitorigSetupError.class); + if (report.getOperationReport().getErrorsForNextReport() != null) { + String fileName = report.getOperationReport().getErrorsForNextReport().getFilename(); + log.error("Найдены ошибки по пакету. packCode={}, packageId={}, fileName = {}", packCode, packageId, fileName); + return fileName; + } else { + log.info("Пакет был поставлен на мониторинг без ошибок. packCode={}, packageId={}", packCode, packageId); + } + } catch (Exception e) { + log.error("Ошибка при получении имени файла ошибки из сервиса НБКИ. Код ошибки: {} packCode={}", response.getStatusCode().value(), packCode); + } + + return null; + } + + /** + * Загружает .gz отчет ошибок из официального сервиса сигналов, разархивирует в tmp_folder + * + * @return путь к разархивированному файлу. Пример: /tmp_folder//0001XX_MY_BATCH_223112.1.errors.xml.gz + */ + public String loadErrorFile(Integer packageId, String fileName) { + String url = DOWNLOAD_REPORT_URI + "?fNameRequest=" + fileName; + + HttpHeaders headers = new HttpHeaders(); + headers.setBasicAuth(authToken); + + HttpEntity> requestEntity = new HttpEntity<>(headers); + + ResponseEntity response = restTemplate.exchange( + url, + HttpMethod.GET, + requestEntity, + byte[].class + ); + + return unzipReport(response, packageId, fileName); + } + /** * Удаляет пакет с мониторинга */ @@ -162,7 +229,7 @@ public class SignalRestService { * @return путь к разархивированному файлу. Пример: /tmp_folder//0001XX_MY_BATCH_204.1.online.2025-07-08T20-00-46.xml.gz.xml */ public String downloadReport(Integer packageId, String reportName) { - String url = DOWNLOAD_REPORT_URI + "?fNameReport=" + reportName; + String url = DOWNLOAD_ONLINE_REPORT_URI + "?fNameReport=" + reportName; HttpHeaders headers = new HttpHeaders(); headers.setBasicAuth(authToken); @@ -176,6 +243,10 @@ public class SignalRestService { byte[].class ); + return unzipReport(response,packageId, reportName); + } + + private String unzipReport(ResponseEntity response, Integer packageId, String reportName) { boolean isGzipped = response.getHeaders().getContentType() != null && response.getHeaders().getContentType().toString().equals("application/x-gzip");