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}
+
+
+