From 67a72761e6ad2c0adce6e58e414a8f2e5b544c4f Mon Sep 17 00:00:00 2001 From: Mikhail Trofimov Date: Thu, 11 Sep 2025 15:19:02 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/BKI-3199 Added MonitoringReportErrorsStaxtReader and updating error_text column --- .../credit_tracker/config/xml/XmlConfig.java | 1 + .../MonitoringReportErrors.java | 72 +++++++++++++++++++ .../credit_tracker/facade/SignalFacade.java | 10 ++- .../mapper/signal/PhoneFidMapMapper.java | 2 + .../credit_tracker/service/SignalService.java | 31 +++++++- .../service/signal/PhoneFidMapService.java | 4 ++ .../MonitoringReportErrorsStaxtReader.java | 68 ++++++++++++++++++ .../mapper/signal/PhoneFidMapMapper.xml | 9 +++ 8 files changed, 192 insertions(+), 5 deletions(-) create mode 100644 src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_error/MonitoringReportErrors.java create mode 100644 src/main/java/ru/nbch/credit_tracker/service/xml/stax/MonitoringReportErrorsStaxtReader.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 08d7499..f9fdca5 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 @@ -38,6 +38,7 @@ public class XmlConfig { staxReader.add(MonitoringRequestStaxReader::new); staxReader.add(OnlineDownloadReportPersonsStaxReader::new); staxReader.add(MonitoringSignalResponseStaxXmlReader::new); + staxReader.add(MonitoringReportErrorsStaxtReader::new); return new XmlProcessorStaxImpl(staxReader); } } diff --git a/src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_error/MonitoringReportErrors.java b/src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_error/MonitoringReportErrors.java new file mode 100644 index 0000000..690577c --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/external_response/monitoring_report_error/MonitoringReportErrors.java @@ -0,0 +1,72 @@ +package ru.nbch.credit_tracker.entities.external_response.monitoring_report_error; + +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 = { + "id", + "version", + "user", + "reportCreated" +}) +@XmlRootElement(name = "Errors") +public class MonitoringReportErrors { + + @XmlElement(name = "Id") + protected String id; + + @XmlElement(name = "Version") + protected String version; + + @XmlElement(name = "User") + protected String user; + + @XmlElement(name = "ReportCreated") + protected String reportCreated; + + @XmlElement(name = "p") + protected List

persons; + + public List

getPersons() { + if (persons == null) { + persons = new ArrayList<>(); + } + return this.persons; + } + + private P currentPerson; + + public void createCurrentPerson() { + currentPerson = new P(); + } + + public P getCurrentPerson() { + return currentPerson; + } + + public void finalizePerson() { + getPersons().add(currentPerson); + } + + @Getter + @Setter + @XmlAccessorType(XmlAccessType.FIELD) + @XmlType(name = "", propOrder = { + }) + public static class P { + + @XmlAttribute(name = "uid") + protected Integer uid; + + @XmlValue + protected String value; + + } +} 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 8213fa4..9c1ca2e 100644 --- a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java +++ b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java @@ -183,7 +183,7 @@ public class SignalFacade { } request.getSubjects().getSubject().clear(); }, - request-> request.getSubjects().getSubject().isEmpty() + request -> request.getSubjects().getSubject().isEmpty() , 40000, "/MonitoringRequest/Subjects/Subject"); } catch (IOException e) { @@ -248,7 +248,13 @@ public class SignalFacade { if (StringUtils.isNotBlank(fileName)) { String filePath = signalRestService.loadErrorFile(packageId, fileName); if (StringUtils.isNotBlank(filePath)) { - signalService.updateSubjectsErrors(filePath); + try { + signalService.updateSubjectsErrors(filePath, packageId); + CTUtil.removeFile(filePath); + } catch (Exception e) { + log.error("Ошибка при записи сообщений об ошибках в сформированных субъектах для мониторинга. Файл ошибок не будет удален. filePath = {}, Package_id = {}", + fileName, packageId, e); + } } } } diff --git a/src/main/java/ru/nbch/credit_tracker/mapper/signal/PhoneFidMapMapper.java b/src/main/java/ru/nbch/credit_tracker/mapper/signal/PhoneFidMapMapper.java index 9320e5e..0e42995 100644 --- a/src/main/java/ru/nbch/credit_tracker/mapper/signal/PhoneFidMapMapper.java +++ b/src/main/java/ru/nbch/credit_tracker/mapper/signal/PhoneFidMapMapper.java @@ -16,6 +16,8 @@ public interface PhoneFidMapMapper { void updatePhoneFidMaps(@Param("subjects") List subjects); + void updatePhoneFidMapsErrors(@Param("subjects") List subjects); + PhoneFidMap findPhoneFidMapById(@Param("id") Integer packageId); boolean hasNonNullFids(@Param("packageId") Integer packageId); 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 478c1a2..defd4f7 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java @@ -12,6 +12,7 @@ import ru.nbch.credit_tracker.entities.dto.UserPackage; import ru.nbch.credit_tracker.entities.external_request.signals.Auth; import ru.nbch.credit_tracker.entities.external_request.signals.Person; import ru.nbch.credit_tracker.entities.external_request.signals.Signals; +import ru.nbch.credit_tracker.entities.external_response.monitoring_report_error.MonitoringReportErrors; import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest; import ru.nbch.credit_tracker.enums.Status; import ru.nbch.credit_tracker.service.indic.FlagsService; @@ -174,7 +175,7 @@ public class SignalService { subjectToUpdate.add(subject); }); - int updateBatchSize = batchSize / 8; // 8 параметров на одну запись для обновления. Максимальное количество параметров ~65000 + int updateBatchSize = batchSize / 9; // 9 параметров на одну запись для обновления. Максимальное количество параметров ~65000 for (int j = 0; j < subjectToUpdate.size(); j += updateBatchSize) { int endIndex = Math.min(j + updateBatchSize, subjectToUpdate.size()); phoneFidMapService.updatePhoneFidMaps(subjectToUpdate.subList(j, endIndex)); @@ -202,6 +203,7 @@ public class SignalService { /** * Формирует файл запроса в официальный сервис сигналов, выгружая паспортные данные пачками и сразу записывая их в файл + * * @return Путь к файлу запроса к официальному сервису сигналов на постановку на мониторинг */ public String writeSignals(Integer packageId) { @@ -277,8 +279,31 @@ public class SignalService { return persons; } - public void updateSubjectsErrors(String filePath) { - + public void updateSubjectsErrors(String filePath, Integer packageId) { + log.info("Start updating subjects errors. PackageId: {}", packageId); + try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(Path.of(filePath)), 8 * 1024 * 1024)) { + staxXmlProcessor.read(in, MonitoringReportErrors.class, + request -> { + if (!request.getPersons().isEmpty()) { + List subjects = request.getPersons().stream().map(p -> { + log.error("Ошибка при формировании субъекта. package_id = {}, id = {}. Описание: {}", packageId, p.getUid(), p.getValue()); + return PhoneFidMap.builder() + .id(p.getUid()) + .errorText(p.getValue()) + .build(); + }).toList(); + phoneFidMapService.updatePhoneFidMapsErrors(subjects); + log.trace("Updated subject's batch. Total count: {}. PackageId: {}", request.getPersons().size(), packageId); + request.getPersons().clear(); + } + }, + request -> request.getPersons().isEmpty() + , + batchSize, "/Errors/p"); + } catch (IOException e) { + throw new RuntimeException("Error while parsing MonitoringReportErrors", e); + } + log.info("Subject's errors were updated. PackageId: {}", packageId); } public List findActivePackages(String userId) { diff --git a/src/main/java/ru/nbch/credit_tracker/service/signal/PhoneFidMapService.java b/src/main/java/ru/nbch/credit_tracker/service/signal/PhoneFidMapService.java index 8b6aa8d..fd39166 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/signal/PhoneFidMapService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/signal/PhoneFidMapService.java @@ -28,6 +28,10 @@ public class PhoneFidMapService { mapper.updatePhoneFidMaps(subjects); } + public void updatePhoneFidMapsErrors(List subjects) { + mapper.updatePhoneFidMapsErrors(subjects); + } + public PhoneFidMap findPhoneFidMapById(Integer id) { return mapper.findPhoneFidMapById(id); } diff --git a/src/main/java/ru/nbch/credit_tracker/service/xml/stax/MonitoringReportErrorsStaxtReader.java b/src/main/java/ru/nbch/credit_tracker/service/xml/stax/MonitoringReportErrorsStaxtReader.java new file mode 100644 index 0000000..eb5a703 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/service/xml/stax/MonitoringReportErrorsStaxtReader.java @@ -0,0 +1,68 @@ +package ru.nbch.credit_tracker.service.xml.stax; + + +import lombok.extern.slf4j.Slf4j; +import ru.nbch.credit_tracker.entities.external_response.monitoring_report_error.MonitoringReportErrors; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +@Slf4j +public class MonitoringReportErrorsStaxtReader extends BaseStaxReader { + + @Override + public Class type() { + return MonitoringReportErrors.class; + } + + @Override + protected MonitoringReportErrors createObject() { + return new MonitoringReportErrors(); + } + + @Override + protected boolean innerProcess(XMLStreamReader reader, MonitoringReportErrors obj) throws XMLStreamException { + String text = buffer.toString(); + String currPath = getPath(); + switch (currPath) { + case "/Errors/Id" -> + obj.setId(text); + case "/Errors/Version" -> + obj.setVersion(text); + case "/Errors/User" -> + obj.setUser(text); + case "/Errors/ReportCreated" -> + obj.setReportCreated(text); + case "/Errors/p" -> { + obj.getCurrentPerson().setValue(text); + obj.finalizePerson(); + } + } + return false; + } + + @Override + protected void innerProcessStartElement(XMLStreamReader reader, MonitoringReportErrors obj) throws XMLStreamException { + String currPath = getPath(); + + switch (currPath) { + case "/Errors/p" -> + obj.createCurrentPerson(); + } + + for (int i = 0; i < reader.getAttributeCount(); i++) { + String text = reader.getAttributeValue(i); + switch (reader.getAttributeLocalName(i)) { + case "uid" -> { + try { + int uid = Integer.parseInt(text); + obj.getCurrentPerson().setUid(uid); + } catch (NumberFormatException e) { + log.error("Couldn't parse uid: {}", text); + throw new RuntimeException(e); + } + } + } + } + } +} diff --git a/src/main/resources/mybatis/mapper/signal/PhoneFidMapMapper.xml b/src/main/resources/mybatis/mapper/signal/PhoneFidMapMapper.xml index 4217af3..9d668d9 100644 --- a/src/main/resources/mybatis/mapper/signal/PhoneFidMapMapper.xml +++ b/src/main/resources/mybatis/mapper/signal/PhoneFidMapMapper.xml @@ -42,6 +42,15 @@ + + + UPDATE signals_phone_fid_map + SET + error_text = #{subject.errorText} + WHERE id = #{subject.id} + + +