LP: added subject registration

This commit is contained in:
Mikhail Trofimov 2026-06-30 14:06:52 +03:00
parent 6767a8c204
commit 3921087946
7 changed files with 166 additions and 23 deletions

View file

@ -0,0 +1,16 @@
package ru.nbch.credit_tracker.entities.app;
import lombok.*;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SignalLegalFidMap {
private Long id;
private Long packageId;
private String subjectId;
private Long inn;
private Long regNum;
}

View file

@ -151,11 +151,20 @@ public class SignalFacade {
Long packageId = userPackageService.registerPackage(userId, packageName, subjectType, signalTypes);
LogUtil.addMdcLogKey("%s %d".formatted(packageName, packageId));
log.info("Package registered. PackageId {}. Status: {}", packageId, Status.ACCEPTED.name());
Pipeline pipeline = pipelinePackageManager.build(new SetupParam(packageId, parsedFilePath, PipelineMode.DEFAULT));
pipelineOrchestrator.startOrDelay(() -> {
saver.readAndSave(packageId, parsedFilePath);
CtFileUtils.deleteQuietly(parsedFilePath);
}, pipeline, packageId);
if (subjectType == 1) {
Pipeline pipeline = pipelinePackageManager.build(new SetupParam(packageId, parsedFilePath, PipelineMode.DEFAULT));
pipelineOrchestrator.startOrDelay(() -> {
saver.readAndSaveNpPackage(packageId, parsedFilePath);
CtFileUtils.deleteQuietly(parsedFilePath);
}, pipeline, packageId);
} else {
Pipeline pipeline = pipelinePackageManager.build(new SetupParam(packageId, parsedFilePath, PipelineMode.DEFAULT));
pipelineOrchestrator.startOrDelay(() -> {
saver.readAndSaveLpPackage(packageId, parsedFilePath);
CtFileUtils.deleteQuietly(parsedFilePath);
}, pipeline, packageId);
}
} catch (Exception e) {
try {
Files.delete(parsedFilePath);

View file

@ -0,0 +1,13 @@
package ru.nbch.credit_tracker.mapper.signal;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface LegalsFidMapMapper {
List<Long> registerJson(@Param("json") String json);
}

View file

@ -0,0 +1,40 @@
package ru.nbch.credit_tracker.service.indic;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import ru.nbch.credit_tracker.entities.app.SignalLegalFidMap;
import ru.nbch.credit_tracker.mapper.signal.LegalsFidMapMapper;
import java.util.HashMap;
import java.util.List;
@Slf4j
@Service
public class LegalsMapService {
private final LegalsFidMapMapper legalsFidMapMapper;
private final ObjectMapper entityToJsonMapper;
public LegalsMapService(LegalsFidMapMapper legalsFidMapMapper,
ObjectMapper entityToJsonMapper) {
this.legalsFidMapMapper = legalsFidMapMapper;
this.entityToJsonMapper = entityToJsonMapper;
}
public List<Long> registerSubjects(List<SignalLegalFidMap> subjects) {
try {
String json = entityToJsonMapper.writeValueAsString(subjects.stream()
.map(phoneFidMap -> new HashMap<String, Object>() {{
put("subject_id", phoneFidMap.getSubjectId());
put("inn", phoneFidMap.getInn());
put("reg_num", phoneFidMap.getRegNum());
put("package_id", phoneFidMap.getPackageId());
}}).toList());
return legalsFidMapMapper.registerJson(json);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}

View file

@ -78,7 +78,7 @@ public class StartupRestoreService {
log.debug("Try to read and build pipeline for packageId {}; req xml path: {}", userPackage.getId(), xmlReqPath);
Pipeline pipeline = pipelinePackageManager.build(new SetupParam(userPackage.getId(), xmlReqPath, PipelineMode.DEFAULT));
pipelineOrchestrator.startOrDelay(
() -> saver.readAndSave(userPackage.getId(), xmlReqPath),
() -> saver.readAndSaveNpPackage(userPackage.getId(), xmlReqPath),
pipeline, userPackage.getId()
);
} catch (Exception e) {

View file

@ -5,9 +5,11 @@ import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.entities.app.PackagesRecordsMap;
import ru.nbch.credit_tracker.entities.app.SignalLegalFidMap;
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
import ru.nbch.credit_tracker.enums.Status;
import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper;
import ru.nbch.credit_tracker.service.indic.LegalsMapService;
import ru.nbch.credit_tracker.service.indic.PhoneService;
import ru.nbch.credit_tracker.service.xml.stax.StaxXmlProcessor;
import ru.nbch.credit_tracker.utils.error.ExceptionUtils;
@ -23,43 +25,74 @@ public class Saver {
private final Logger log = LoggerFactory.getLogger(getClass());
private final StaxXmlProcessor xmlProcessor;
private final PhoneService phoneService;
private final LegalsMapService legalsMapService;
private final UserPackageMapper userPackageMapper;
private final int BATCH_SIZE;
public Saver(StaxXmlProcessor xmlProcessor,
PhoneService phoneService,
LegalsMapService legalsMapService,
UserPackageMapper userPackageMapper,
CreditTrackerSettings creditTrackerSettings) {
this.xmlProcessor = xmlProcessor;
this.phoneService = phoneService;
this.legalsMapService = legalsMapService;
this.userPackageMapper = userPackageMapper;
this.BATCH_SIZE = creditTrackerSettings.getSaverSubjectBatchSize();
}
public void readAndSave(Long packageId, Path pkgPath) {
log.info("Start registering subjects. PackageId: {}; pkg path: {}", packageId, pkgPath);
public void readAndSaveNpPackage(Long packageId, Path pkgPath) {
log.info("Start registering np subjects. PackageId: {}; pkg path: {}", packageId, pkgPath);
try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(pkgPath), 8 * 1024 * 1024)) {
xmlProcessor.read(in, MonitoringRequest.class,
request -> {
if (!request.getSubjects().getSubject().isEmpty()) {
log.trace("Reading subject's {} batch. PackageId: {}", request.getSubjects().getSubject().size(), packageId);
List<PackagesRecordsMap> subjectForSave = request.getSubjects().getSubject().stream().map(subject -> PackagesRecordsMap.builder()
.subjectId(subject.getId())
.packageId(packageId)
.phone_l(Long.valueOf(subject.getClientId())) // validated ru.nbch.credit_tracker.service.ValidationService.validateMonitoringRequest
.build()).toList();
phoneService.registerSubjects(subjectForSave);
request.getSubjects().getSubject().clear();
}
},
request -> request.getSubjects().getSubject().isEmpty(),
BATCH_SIZE, "/MonitoringRequest/Subjects/Subject"
request -> {
if (!request.getSubjects().getSubject().isEmpty()) {
log.trace("Reading np subject's {} batch. PackageId: {}", request.getSubjects().getSubject().size(), packageId);
List<PackagesRecordsMap> subjectForSave = request.getSubjects().getSubject().stream().map(subject -> PackagesRecordsMap.builder()
.subjectId(subject.getId())
.packageId(packageId)
.phone_l(Long.valueOf(subject.getClientId())) // validated ru.nbch.credit_tracker.service.ValidationService.validateMonitoringRequest
.build()).toList();
phoneService.registerSubjects(subjectForSave);
request.getSubjects().getSubject().clear();
}
},
request -> request.getSubjects().getSubject().isEmpty(),
BATCH_SIZE, "/MonitoringRequest/Subjects/Subject"
);
} catch (IOException e) {
log.error("{}", ExceptionUtils.getStackTrace(e));
}
userPackageMapper.updatePackageStatus(packageId, Status.PROCESSING.name());
log.info("Complete registering subjects. PackageId: {}; pkg path: {}", packageId, pkgPath);
log.info("Complete registering np subjects. PackageId: {}; pkg path: {}", packageId, pkgPath);
}
public void readAndSaveLpPackage(Long packageId, Path pkgPath) {
log.info("Start registering lp subjects. PackageId: {}; pkg path: {}", packageId, pkgPath);
try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(pkgPath), 8 * 1024 * 1024)) {
xmlProcessor.read(in, MonitoringRequest.class,
request -> {
if (!request.getSubjects().getSubject().isEmpty()) {
log.trace("Reading lp subject's {} batch. PackageId: {}", request.getSubjects().getSubject().size(), packageId);
List<SignalLegalFidMap> subjectForSave = request.getSubjects().getSubject().stream().map(subject -> SignalLegalFidMap.builder()
.subjectId(subject.getId())
.packageId(packageId)
.inn(Long.valueOf(subject.getInn())) // validated ru.nbch.credit_tracker.service.ValidationService.validateMonitoringRequest
.regNum(Long.valueOf(subject.getRegNum())) // validated ru.nbch.credit_tracker.service.ValidationService.validateMonitoringRequest
.build()).toList();
legalsMapService.registerSubjects(subjectForSave);
request.getSubjects().getSubject().clear();
}
},
request -> request.getSubjects().getSubject().isEmpty(),
BATCH_SIZE, "/MonitoringRequest/Subjects/Subject"
);
} catch (IOException e) {
log.error("{}", ExceptionUtils.getStackTrace(e));
}
userPackageMapper.updatePackageStatus(packageId, Status.PROCESSING.name());
log.info("Complete registering lp subjects. PackageId: {}; pkg path: {}", packageId, pkgPath);
}
}

View file

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="ru.nbch.credit_tracker.mapper.signal.LegalsMapMapper">
<select id="registerJson" parameterType="string" resultType="long">
WITH src AS (SELECT row_number() OVER () AS rn,
subject_id,
inn,
reg_num,
package_id
FROM json_to_recordset(#{json}::json) AS t(
subject_id varchar(255),
inn bigint,
reg_num bigint,
package_id bigint
))
INSERT
INTO signals_legal_fid_map
(subject_id, inn, reg_num, package_id)
SELECT subject_id,
inn,
reg_num,
package_id
FROM src
ORDER BY rn
RETURNING id;
</select>
</mapper>