attempt to remove unused classes
This commit is contained in:
parent
9813fe4053
commit
74084f93c8
39 changed files with 560 additions and 1273 deletions
|
|
@ -6,7 +6,7 @@ import org.aspectj.lang.ProceedingJoinPoint;
|
|||
import org.aspectj.lang.annotation.Around;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.slf4j.MDC;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.app.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
||||
|
||||
@Slf4j
|
||||
|
|
|
|||
|
|
@ -1,58 +0,0 @@
|
|||
package ru.nbch.credit_tracker.controller;
|
||||
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_request.all_packages.MonitoringAllPackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_response.active_packages.MonitoringActivePackagesResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.all_packages.MonitoringAllPackagesResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringPackageDeleteResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringReportListResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringSetupResponse;
|
||||
import ru.nbch.credit_tracker.facade.SignalFacade;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/signal")
|
||||
public class SignalController {
|
||||
|
||||
private final SignalFacade signalFacade;
|
||||
|
||||
public SignalController(SignalFacade signalFacade) {
|
||||
this.signalFacade = signalFacade;
|
||||
}
|
||||
|
||||
@PostMapping(value = "/set", produces = MediaType.APPLICATION_XML_VALUE)
|
||||
public ResponseEntity<MonitoringSetupResponse> setupMonitoring(@RequestParam("file") MultipartFile file) {
|
||||
return signalFacade.setupMonitoring(file);
|
||||
}
|
||||
|
||||
@PostMapping(value = "/active_packages", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
|
||||
public ResponseEntity<MonitoringActivePackagesResponse> findActivePackages(@RequestBody MonitoringActivePackagesRequest activePackagesRequest) {
|
||||
return signalFacade.findActivePackages(activePackagesRequest);
|
||||
}
|
||||
|
||||
@PostMapping(value = "/all_packages", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
|
||||
public ResponseEntity<MonitoringAllPackagesResponse> findAllPackages(@RequestBody MonitoringAllPackagesRequest allPackagesRequest) {
|
||||
return signalFacade.findAllPackages(allPackagesRequest);
|
||||
}
|
||||
|
||||
@PostMapping(value = "/delete", params = {"username", "packageName"}, produces = MediaType.APPLICATION_XML_VALUE)
|
||||
public ResponseEntity<MonitoringPackageDeleteResponse> deletePackage(@RequestParam("username") String username, @RequestParam("packageName") String packageName) {
|
||||
return signalFacade.deletePackage(username, packageName);
|
||||
}
|
||||
|
||||
@GetMapping(value = "/report_list", params = {"username", "packageName"}, produces = MediaType.APPLICATION_XML_VALUE)
|
||||
public ResponseEntity<MonitoringReportListResponse> getReportList(@RequestParam("username") String username, @RequestParam("packageName") String packageName) {
|
||||
return signalFacade.getReportList(username, packageName);
|
||||
}
|
||||
|
||||
@GetMapping(value = "/download", params = "file", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
|
||||
public ResponseEntity<Resource> downloadFile(@RequestParam("file") String file) {
|
||||
return signalFacade.downloadFile(file);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
package ru.nbch.credit_tracker.controller;
|
||||
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_request.all_packages.MonitoringAllPackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_response.active_packages.MonitoringActivePackagesResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.all_packages.MonitoringAllPackagesResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringSetupResponse;
|
||||
import ru.nbch.credit_tracker.enums.SignalError;
|
||||
import ru.nbch.credit_tracker.enums.XmlErrorFormat;
|
||||
import ru.nbch.credit_tracker.exceptions.SignalException;
|
||||
import ru.nbch.credit_tracker.facade.SignalFacadeV2;
|
||||
import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.serverExcp;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v2/signal")
|
||||
public class SignalControllerV2 {
|
||||
|
||||
private final SignalFacadeV2 signalFacadeV2;
|
||||
|
||||
public SignalControllerV2(SignalFacadeV2 signalFacadeV2) {
|
||||
this.signalFacadeV2 = signalFacadeV2;
|
||||
}
|
||||
|
||||
@PostMapping(value = "/set", produces = MediaType.APPLICATION_XML_VALUE)
|
||||
public ResponseEntity<MonitoringSetupResponse> setupMonitoring(@RequestParam("file") MultipartFile file) {
|
||||
signalFacadeV2.setupMonitoringRequest(file);
|
||||
return ResponseEntity.ok().body(new MonitoringSetupResponse());
|
||||
}
|
||||
|
||||
@PostMapping(value = "/active_packages", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
|
||||
public ResponseEntity<MonitoringActivePackagesResponse> findActivePackages(@RequestBody MonitoringActivePackagesRequest activePackagesRequest) {
|
||||
try {
|
||||
return signalFacadeV2.findActivePackages(activePackagesRequest);
|
||||
} catch (Exception e) {
|
||||
throwOrWrap(SignalError.ERROR_013, XmlErrorFormat.MonitoringActivePackagesError, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@PostMapping(value = "/all_packages", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
|
||||
public ResponseEntity<MonitoringAllPackagesResponse> findAllPackages(@RequestBody MonitoringAllPackagesRequest allPackagesRequest) {
|
||||
try {
|
||||
return signalFacadeV2.findAllPackages(allPackagesRequest);
|
||||
} catch (Exception e) {
|
||||
throwOrWrap(SignalError.ERROR_013, XmlErrorFormat.MonitoringAllPackagesError, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static void throwOrWrap(SignalError error, XmlErrorFormat specific, Exception ex) {
|
||||
if (ex instanceof SignalException) {
|
||||
throw (SignalException) ex;
|
||||
}
|
||||
throw serverExcp(error, specific, ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1,7 +1,9 @@
|
|||
package ru.nbch.credit_tracker.controller;
|
||||
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
|
|
@ -12,6 +14,8 @@ import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringAc
|
|||
import ru.nbch.credit_tracker.entities.user_request.all_packages.MonitoringAllPackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_response.active_packages.MonitoringActivePackagesResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.all_packages.MonitoringAllPackagesResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringPackageDeleteResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringReportListResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringSetupResponse;
|
||||
import ru.nbch.credit_tracker.enums.SignalError;
|
||||
import ru.nbch.credit_tracker.enums.XmlErrorFormat;
|
||||
|
|
@ -20,7 +24,7 @@ import ru.nbch.credit_tracker.facade.SignalFacadeV3;
|
|||
import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.serverExcp;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v3/signal")
|
||||
@RequestMapping("/api/v1/signal")
|
||||
public class SignalControllerV3 {
|
||||
|
||||
private final SignalFacadeV3 signalFacadeV3;
|
||||
|
|
@ -55,6 +59,22 @@ public class SignalControllerV3 {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
@PostMapping(value = "/delete", params = {"username", "packageName"}, produces = MediaType.APPLICATION_XML_VALUE)
|
||||
public ResponseEntity<MonitoringPackageDeleteResponse> deletePackage(@RequestParam("username") String username, @RequestParam("packageName") String packageName) {
|
||||
return signalFacadeV3.deletePackage(username, packageName);
|
||||
}
|
||||
|
||||
@GetMapping(value = "/report_list", params = {"username", "packageName"}, produces = MediaType.APPLICATION_XML_VALUE)
|
||||
public ResponseEntity<MonitoringReportListResponse> getReportList(@RequestParam("username") String username, @RequestParam("packageName") String packageName) {
|
||||
return signalFacadeV3.getReportList(username, packageName);
|
||||
}
|
||||
|
||||
@GetMapping(value = "/download", params = "file", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
|
||||
public ResponseEntity<Resource> downloadFile(@RequestParam("file") String file) {
|
||||
return signalFacadeV3.downloadFile(file);
|
||||
}
|
||||
|
||||
private static void throwOrWrap(SignalError error, XmlErrorFormat specific, Exception ex) {
|
||||
if (ex instanceof SignalException) {
|
||||
throw (SignalException) ex;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
package ru.nbch.credit_tracker.entities.dto;
|
||||
package ru.nbch.credit_tracker.entities.app;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package ru.nbch.credit_tracker.entities.dto;
|
||||
package ru.nbch.credit_tracker.entities.app;
|
||||
|
||||
import java.util.UUID;
|
||||
import lombok.*;
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package ru.nbch.credit_tracker.entities.dto;
|
||||
package ru.nbch.credit_tracker.entities.app;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
package ru.nbch.credit_tracker.entities.dto;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import ru.nbch.credit_tracker.model.IdData;
|
||||
import ru.nbch.credit_tracker.model.NameData;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Deprecated
|
||||
public class SubjectProfileForSignal {
|
||||
private Long id;
|
||||
private Integer fid;
|
||||
private IdData idProfile;
|
||||
private NameData nameProfile;
|
||||
private boolean isFilled = false;
|
||||
}
|
||||
|
|
@ -1,436 +0,0 @@
|
|||
package ru.nbch.credit_tracker.facade;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.slf4j.MDC;
|
||||
import org.springframework.aop.framework.AopContext;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.context.annotation.EnableAspectJAutoProxy;
|
||||
import org.springframework.core.io.FileUrlResource;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_request.all_packages.MonitoringAllPackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_response.active_packages.MonitoringActivePackagesResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.active_packages.Package;
|
||||
import ru.nbch.credit_tracker.entities.user_response.active_packages.Packages;
|
||||
import ru.nbch.credit_tracker.entities.user_response.all_packages.MonitoringAllPackagesResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.all_packages.PackageAll;
|
||||
import ru.nbch.credit_tracker.entities.user_response.all_packages.PackagesAll;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringPackageDeleteResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringReportListResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringSetupResponse;
|
||||
import ru.nbch.credit_tracker.enums.SignalError;
|
||||
import ru.nbch.credit_tracker.enums.Status;
|
||||
import ru.nbch.credit_tracker.enums.XmlErrorFormat;
|
||||
import ru.nbch.credit_tracker.exceptions.SignalClientException;
|
||||
import ru.nbch.credit_tracker.service.MonitoringErrorProcesingService;
|
||||
import ru.nbch.credit_tracker.service.SignalService;
|
||||
import ru.nbch.credit_tracker.service.scoring.AuthorizationService;
|
||||
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
||||
import ru.nbch.credit_tracker.service.xml.stax.StaxXmlProcessor;
|
||||
import ru.nbch.credit_tracker.utils.CTUtil;
|
||||
import ru.nbch.credit_tracker.utils.ValidationService;
|
||||
import ru.nbch.credit_tracker.utils.ZipUtils;
|
||||
|
||||
import javax.xml.stream.XMLStreamException;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipInputStream;
|
||||
|
||||
import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.clientExcp;
|
||||
import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.serverExcp;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@EnableAspectJAutoProxy(exposeProxy = true)
|
||||
public class SignalFacade {
|
||||
|
||||
private SignalFacade self;
|
||||
|
||||
private final CreditTrackerSettings config;
|
||||
private final AuthorizationService authorizationService;
|
||||
private final SignalService signalService;
|
||||
private final SignalRestService signalRestService;
|
||||
private final MonitoringErrorProcesingService monitoringErrorProcesingService;
|
||||
private final ValidationService validationService;
|
||||
private final StaxXmlProcessor staxXmlProcessor;
|
||||
|
||||
private final ExecutorService executor;
|
||||
private final long maxXmlFileSize;
|
||||
|
||||
|
||||
public SignalFacade(CreditTrackerSettings config,
|
||||
AuthorizationService authorizationService,
|
||||
SignalService signalService,
|
||||
SignalRestService signalRestService,
|
||||
MonitoringErrorProcesingService monitoringErrorProcesingService,
|
||||
ValidationService validationService,
|
||||
StaxXmlProcessor staxXmlProcessor,
|
||||
@Qualifier("executorService") ExecutorService executor) {
|
||||
this.config = config;
|
||||
this.authorizationService = authorizationService;
|
||||
this.signalService = signalService;
|
||||
this.signalRestService = signalRestService;
|
||||
this.monitoringErrorProcesingService = monitoringErrorProcesingService;
|
||||
this.validationService = validationService;
|
||||
this.staxXmlProcessor = staxXmlProcessor;
|
||||
this.executor = executor;
|
||||
this.maxXmlFileSize = config.getMaxXmlFileSize() * 1024 * 1024;
|
||||
}
|
||||
|
||||
public ResponseEntity<MonitoringSetupResponse> setupMonitoring(MultipartFile file) {
|
||||
// первичные валидации
|
||||
if (file.isEmpty() || !isZipFile(file)) {
|
||||
throw clientExcp(SignalError.ERROR_001, XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
|
||||
// Валидация Архива на количетсво файлов, размер и расширение
|
||||
MonitoringRequest monitoringRequest;
|
||||
Long packageId;
|
||||
ZipInputStream zipInputStream = null;
|
||||
String filePath;
|
||||
try {
|
||||
zipInputStream = new ZipInputStream(file.getInputStream());
|
||||
Optional<ZipEntry> xmlFileEntry = ZipUtils.extractValidEntry(zipInputStream);
|
||||
if (xmlFileEntry.isEmpty()) {
|
||||
throw clientExcp(SignalError.ERROR_001, XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
if (xmlFileEntry.get().getSize() > maxXmlFileSize) {
|
||||
throw clientExcp(SignalError.ERROR_009, XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
|
||||
zipInputStream.close();
|
||||
zipInputStream = new ZipInputStream(file.getInputStream());
|
||||
zipInputStream.getNextEntry();
|
||||
|
||||
filePath = writeTmpFile(zipInputStream);
|
||||
} catch (Exception e) {
|
||||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e);
|
||||
} finally {
|
||||
if (zipInputStream != null) {
|
||||
try {
|
||||
zipInputStream.close();
|
||||
} catch (IOException e) {
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// валидация xml
|
||||
try {
|
||||
monitoringRequest = readAndValidateMonitoringRequest(filePath);
|
||||
} catch (Exception e) {
|
||||
CTUtil.removeFile(filePath);
|
||||
if (e.getCause() instanceof XMLStreamException) {
|
||||
throw clientExcp(SignalError.ERROR_011, XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e);
|
||||
}
|
||||
|
||||
try {
|
||||
// проверка авторизации
|
||||
AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(monitoringRequest.getUserId(), monitoringRequest.getPassword());
|
||||
if (!authResult.isSuccess()) {
|
||||
signalService.rejectPackage(monitoringRequest);
|
||||
throw clientExcp(authResult.getError(), monitoringRequest.getPackageName(), XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
|
||||
// проверка на уникальность пакета
|
||||
if (signalService.isPackageNotUnique(monitoringRequest)) {
|
||||
signalService.rejectPackage(monitoringRequest);
|
||||
throw clientExcp(SignalError.ERROR_007, monitoringRequest.getPackageName(), XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
|
||||
packageId = signalService.registerPackage(monitoringRequest);
|
||||
log.info("Package registered. PackageId {}. Status: {}", packageId, Status.PROCESSING.name());
|
||||
} catch (Exception e) {
|
||||
CTUtil.removeFile(filePath);
|
||||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e);
|
||||
}
|
||||
|
||||
// в отдельном потоке запускаем регистрацию субъектов, поиск фидов и расчет флагов просрочек
|
||||
getCurrentProxy().registerFidsAndDebts(packageId, monitoringRequest.getPackageName(), filePath);
|
||||
|
||||
return ResponseEntity.ok().body(new MonitoringSetupResponse());
|
||||
}
|
||||
|
||||
private MonitoringRequest readAndValidateMonitoringRequest(String filePath) {
|
||||
MonitoringRequest monitoringRequest;
|
||||
try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(Path.of(filePath)), 8 * 1024 * 1024)) {
|
||||
monitoringRequest = staxXmlProcessor.read(in, MonitoringRequest.class,
|
||||
request -> {
|
||||
try {
|
||||
validationService.validateMonitoringRequest(request);
|
||||
} catch (SignalClientException e) {
|
||||
if (request != null) {
|
||||
signalService.rejectPackage(request);
|
||||
}
|
||||
request = null;
|
||||
throw e;
|
||||
}
|
||||
request.getSubjects().getSubject().clear();
|
||||
},
|
||||
request -> request.getSubjects().getSubject().isEmpty()
|
||||
,
|
||||
40000, "/MonitoringRequest/Subjects/Subject");
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Error while parsing and validating monitoring request", e);
|
||||
}
|
||||
return monitoringRequest;
|
||||
}
|
||||
|
||||
private String writeTmpFile(ZipInputStream zipInputStream) throws IOException {
|
||||
String folderPath = config.getLoadDir() + File.separator + "tmp_folder" + File.separator;
|
||||
String filePath = folderPath + UUID.randomUUID() + "monitoring_request.xml";
|
||||
CTUtil.createFolder(folderPath);
|
||||
|
||||
try (OutputStream out = Files.newOutputStream(Path.of(filePath))) {
|
||||
|
||||
byte[] buffer = new byte[8 * 1024 * 1024];
|
||||
int bytesRead;
|
||||
while ((bytesRead = zipInputStream.read(buffer)) > 0) {
|
||||
out.write(buffer, 0, bytesRead);
|
||||
}
|
||||
|
||||
return filePath;
|
||||
}
|
||||
}
|
||||
|
||||
@SetAndClearMdc(argIndex = 1)
|
||||
public void registerFidsAndDebts(Long packageId, String packageName, String filePath) {
|
||||
Map<String, String> context = MDC.getCopyOfContextMap();
|
||||
executor.execute(() -> {
|
||||
if (context != null) {
|
||||
MDC.setContextMap(context);
|
||||
}
|
||||
try {
|
||||
signalService.registerSubjects(filePath, packageId);
|
||||
CTUtil.removeFile(filePath);
|
||||
SignalService.UpdateResult updateResult = signalService.updateSubjects(packageId, null);
|
||||
if (updateResult.isNoFidsFound()) {
|
||||
log.info("No fids found for PackageId: {} PackageName: {}. Package status ON_MONITORING. No registration in signal service.", packageId, packageName);
|
||||
signalService.updatePackageStatus(packageId, Status.ON_MONITORING);
|
||||
return;
|
||||
}
|
||||
if (signalRestService.setupMonitoring(packageId)) {
|
||||
LocalDateTime monitoringAt = LocalDateTime.now();
|
||||
log.info("Package was successfully registered in signal service. PackageId: {} PackageName: {}, MonitoringAt: {}", packageId, packageName, monitoringAt);
|
||||
signalService.updatePackageOnMonitoringSuccess(packageId, monitoringAt);
|
||||
monitoringErrorProcesingService.findErrors(packageId);
|
||||
} else {
|
||||
log.info("Package registration was rejected by signal service. PackageId: {} PackageName: {}", packageId, packageName);
|
||||
signalService.updatePackageStatus(packageId, Status.ERROR);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
CTUtil.removeFile(filePath);
|
||||
signalService.updatePackageStatus(packageId, Status.ERROR);
|
||||
log.error("Ошибка при поиске фидов или расчете флагов просрочек. Package_id {}", packageId, e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private boolean isZipFile(MultipartFile file) {
|
||||
return file.getContentType() != null &&
|
||||
(file.getContentType().equals("application/zip") || file.getContentType().equals("application/x-zip-compressed")) ||
|
||||
file.getOriginalFilename() != null && file.getOriginalFilename().toLowerCase().endsWith(".zip");
|
||||
}
|
||||
|
||||
public ResponseEntity<MonitoringActivePackagesResponse> findActivePackages(MonitoringActivePackagesRequest activePackagesRequest) {
|
||||
try {
|
||||
AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(activePackagesRequest.getUserId(), activePackagesRequest.getPassword());
|
||||
if (!authResult.isSuccess()) {
|
||||
throw clientExcp(authResult.getError(), XmlErrorFormat.MonitoringActivePackagesError);
|
||||
}
|
||||
List<UserPackage> activePackages = signalService.findActivePackages(activePackagesRequest.getUserId());
|
||||
|
||||
if (!activePackages.isEmpty()) {
|
||||
MonitoringActivePackagesResponse response = new MonitoringActivePackagesResponse();
|
||||
response.setStatus("OK");
|
||||
response.setMembercode(activePackagesRequest.getUserId().substring(0, 6));
|
||||
Packages packages = new Packages();
|
||||
activePackages.forEach(data -> {
|
||||
Package pack = new Package();
|
||||
pack.setPackageName(data.getPackageName());
|
||||
pack.setCreatedAt(data.getCreatedAt() != null ? data.getCreatedAt().toString() : null);
|
||||
packages.getPackages().add(pack);
|
||||
});
|
||||
response.setPackages(packages);
|
||||
return ResponseEntity.ok(response);
|
||||
} else {
|
||||
throw clientExcp(SignalError.ERROR_015, XmlErrorFormat.MonitoringActivePackagesError);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringActivePackagesError, e);
|
||||
}
|
||||
}
|
||||
|
||||
public ResponseEntity<MonitoringAllPackagesResponse> findAllPackages(MonitoringAllPackagesRequest allPackagesRequest) {
|
||||
try {
|
||||
AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(allPackagesRequest.getUserId(), allPackagesRequest.getPassword());
|
||||
if (!authResult.isSuccess()) {
|
||||
throw clientExcp(authResult.getError(), XmlErrorFormat.MonitoringAllPackagesError);
|
||||
}
|
||||
List<UserPackage> activePackages = signalService.findAllPackages(allPackagesRequest.getUserId());
|
||||
|
||||
if (!activePackages.isEmpty()) {
|
||||
MonitoringAllPackagesResponse response = new MonitoringAllPackagesResponse();
|
||||
response.setStatus("OK");
|
||||
response.setMembercode(allPackagesRequest.getUserId().substring(0, 6));
|
||||
PackagesAll packages = new PackagesAll();
|
||||
activePackages.forEach(data -> {
|
||||
PackageAll pack = new PackageAll();
|
||||
pack.setPackageName(data.getPackageName());
|
||||
pack.setCreatedAt(data.getCreatedAt() != null ? data.getCreatedAt().toString() : null);
|
||||
pack.setStatus(data.getStatus());
|
||||
if (data.getStatus().equals(Status.DELETED.name())) {
|
||||
pack.setDeactivatedAt(data.getDeactivatedAt() != null ? data.getDeactivatedAt().toString() : null);
|
||||
}
|
||||
packages.getPackages().add(pack);
|
||||
});
|
||||
response.setPackages(packages);
|
||||
return ResponseEntity.ok(response);
|
||||
} else {
|
||||
throw clientExcp(SignalError.ERROR_019, XmlErrorFormat.MonitoringAllPackagesError);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringAllPackagesError, e);
|
||||
}
|
||||
}
|
||||
|
||||
public ResponseEntity<MonitoringPackageDeleteResponse> deletePackage(String username, String packageName) {
|
||||
try {
|
||||
if (!signalService.isPackageExists(username, packageName)) {
|
||||
throw clientExcp(SignalError.ERROR_016, XmlErrorFormat.MonitoringPackageDeleteError, packageName);
|
||||
}
|
||||
|
||||
LocalDateTime deactivatedAt = LocalDateTime.now();
|
||||
signalService.deletePackage(username, packageName, deactivatedAt);
|
||||
|
||||
MonitoringPackageDeleteResponse response = new MonitoringPackageDeleteResponse();
|
||||
response.setStatus("Deleted");
|
||||
response.setPackageName(packageName);
|
||||
response.setDeactivatedAt(deactivatedAt.toString());
|
||||
|
||||
signalRestService.deletePackage(username, packageName);
|
||||
log.info("Package {} deleted", packageName);
|
||||
return ResponseEntity.ok(response);
|
||||
} catch (Exception e) {
|
||||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_017, XmlErrorFormat.MonitoringPackageDeleteError, e);
|
||||
}
|
||||
}
|
||||
|
||||
public ResponseEntity<MonitoringReportListResponse> getReportList(String username, String packageName) {
|
||||
try {
|
||||
if (signalService.isPackagesByStatusExist(username, packageName, Status.PROCESSING)) {
|
||||
throw clientExcp(SignalError.ERROR_018, XmlErrorFormat.MonitoringReportListError, packageName);
|
||||
}
|
||||
if (signalService.isPackagesByStatusExist(username, packageName, Status.REJECTED)) {
|
||||
throw clientExcp(SignalError.ERROR_020, XmlErrorFormat.MonitoringReportListError, packageName);
|
||||
}
|
||||
if (signalService.isPackagesByStatusExist(username, packageName, Status.ERROR)) {
|
||||
throw clientExcp(SignalError.ERROR_021, XmlErrorFormat.MonitoringReportListError, packageName);
|
||||
}
|
||||
if (signalService.isPackagesByStatusExist(username, packageName, Status.DELETED)) {
|
||||
throw clientExcp(SignalError.ERROR_022, XmlErrorFormat.MonitoringReportListError, packageName);
|
||||
}
|
||||
if (!signalService.isPackagesByStatusExist(username, packageName, Status.ON_MONITORING)) {
|
||||
throw clientExcp(SignalError.ERROR_012, XmlErrorFormat.MonitoringReportListError, packageName);
|
||||
}
|
||||
|
||||
String memberCode = username.substring(0, 6);
|
||||
String filePrefix = (memberCode + "_" + packageName).toUpperCase();
|
||||
String dirPath = config.getLoadDir() + File.separator + memberCode;
|
||||
File folder = new File(dirPath);
|
||||
|
||||
MonitoringReportListResponse.Reports reports = new MonitoringReportListResponse.Reports();
|
||||
if (folder.exists() && folder.isDirectory()) {
|
||||
File[] files = folder.listFiles();
|
||||
if (files != null) {
|
||||
for (File file : files) {
|
||||
if (file.isFile() && file.getName().startsWith(filePrefix)) {
|
||||
reports.getReports().add(file.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
MonitoringReportListResponse response = new MonitoringReportListResponse();
|
||||
response.setPackageName(packageName);
|
||||
response.setReports(reports);
|
||||
return ResponseEntity.ok(response);
|
||||
} catch (Exception e) {
|
||||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringReportListError, e);
|
||||
}
|
||||
}
|
||||
|
||||
public ResponseEntity<Resource> downloadFile(String fileName) {
|
||||
try {
|
||||
String memberCode = CTUtil.getMemberCodeFromFileName(fileName);
|
||||
if (memberCode == null) {
|
||||
throw clientExcp(SignalError.ERROR_014, XmlErrorFormat.MonitoringDownloadError, fileName);
|
||||
}
|
||||
String dirPath = config.getLoadDir() + File.separator + memberCode;
|
||||
File folder = new File(dirPath);
|
||||
|
||||
if (folder.exists() && folder.isDirectory()) {
|
||||
File file = new File(dirPath + File.separator + fileName);
|
||||
if (file.exists() && file.isFile()) {
|
||||
return ResponseEntity.ok().body(new FileUrlResource(file.getPath()));
|
||||
}
|
||||
} else {
|
||||
throw clientExcp(SignalError.ERROR_014, XmlErrorFormat.MonitoringDownloadError, fileName);
|
||||
}
|
||||
throw clientExcp(SignalError.ERROR_014, XmlErrorFormat.MonitoringDownloadError, fileName);
|
||||
} catch (Exception e) {
|
||||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringDownloadError, e);
|
||||
}
|
||||
}
|
||||
|
||||
private SignalFacade getCurrentProxy() {
|
||||
if (self == null) {
|
||||
self = (SignalFacade) AopContext.currentProxy();
|
||||
}
|
||||
return self;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,168 +0,0 @@
|
|||
package ru.nbch.credit_tracker.facade;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import javax.xml.stream.XMLStreamException;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import ru.nbch.credit_tracker.component.MonitoringRequestValidator;
|
||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_request.all_packages.MonitoringAllPackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_response.active_packages.MonitoringActivePackagesResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.active_packages.Package;
|
||||
import ru.nbch.credit_tracker.entities.user_response.active_packages.Packages;
|
||||
import ru.nbch.credit_tracker.entities.user_response.all_packages.MonitoringAllPackagesResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.all_packages.PackageAll;
|
||||
import ru.nbch.credit_tracker.entities.user_response.all_packages.PackagesAll;
|
||||
import ru.nbch.credit_tracker.enums.SignalError;
|
||||
import ru.nbch.credit_tracker.enums.Status;
|
||||
import ru.nbch.credit_tracker.enums.XmlErrorFormat;
|
||||
import ru.nbch.credit_tracker.exceptions.SignalClientException;
|
||||
import ru.nbch.credit_tracker.model.MonitoringValidationError;
|
||||
import ru.nbch.credit_tracker.model.ValidationResult;
|
||||
import ru.nbch.credit_tracker.service.SignalService;
|
||||
import ru.nbch.credit_tracker.service.scoring.AuthorizationService;
|
||||
import ru.nbch.credit_tracker.utils.CTUtil;
|
||||
import ru.nbch.credit_tracker.utils.ZipUtils;
|
||||
import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.clientExcp;
|
||||
import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.serverExcp;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class SignalFacadeV2 {
|
||||
|
||||
private final MonitoringRequestValidator monitoringRequestValidator;
|
||||
private final CreditTrackerSettings config;
|
||||
private final SignalService signalService;
|
||||
private final AuthorizationService authorizationService;
|
||||
public SignalFacadeV2(MonitoringRequestValidator monitoringRequestValidator,
|
||||
CreditTrackerSettings config,
|
||||
SignalService signalService,
|
||||
AuthorizationService authorizationService) {
|
||||
this.monitoringRequestValidator = monitoringRequestValidator;
|
||||
this.config = config;
|
||||
this.signalService = signalService;
|
||||
this.authorizationService = authorizationService;
|
||||
}
|
||||
|
||||
public void setupMonitoringRequest(MultipartFile file) {
|
||||
log.debug("Start processing monitoring request");
|
||||
monitoringRequestValidator.validateZipContent(file);
|
||||
|
||||
log.trace("Saving monitoring request to tmp file...");
|
||||
String filePath;
|
||||
try {
|
||||
String folderPath = config.getLoadDir() + File.separator + "tmp_folder" + File.separator;
|
||||
filePath = ZipUtils.writeTmpFile(folderPath, file);
|
||||
} catch (IOException e) {
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e);
|
||||
}
|
||||
|
||||
log.debug("File saved to {}", filePath);
|
||||
ValidationResult validationResult = null;
|
||||
try {
|
||||
validationResult = monitoringRequestValidator.readAndValidateMonitoringRequest(filePath);
|
||||
if (!validationResult.getValidationErrors().isEmpty()) {
|
||||
MonitoringValidationError firstError = validationResult.getValidationErrors().get(0);
|
||||
signalService.rejectPackage(validationResult.getUserId(), validationResult.getPackageName());
|
||||
FileUtils.delete(new File(filePath));
|
||||
throw firstError.getSignalException();
|
||||
}
|
||||
} catch (RuntimeException e) {
|
||||
if (e.getCause() instanceof XMLStreamException) {
|
||||
throw clientExcp(SignalError.ERROR_011, XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e);
|
||||
} catch (IOException e) {
|
||||
log.warn("Error deleting tmp file", e);
|
||||
}
|
||||
|
||||
String packageName = validationResult.getPackageName();
|
||||
String userId = validationResult.getUserId();
|
||||
String password = validationResult.getPassword();
|
||||
try {
|
||||
// проверка авторизации
|
||||
AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(userId, password);
|
||||
if (!authResult.isSuccess()) {
|
||||
signalService.rejectPackage(userId, packageName);
|
||||
throw clientExcp(authResult.getError(), XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
|
||||
// проверка на уникальность пакета
|
||||
// if (signalService.isPackageNotUnique(userId, packageName)) {
|
||||
// signalService.rejectPackage(userId, packageName);
|
||||
// throw clientExcp(SignalError.ERROR_007, XmlErrorFormat.MonitoringError);
|
||||
// }
|
||||
|
||||
Long packageId = signalService.registerPackage(userId, packageName);
|
||||
log.info("Package registered. PackageId {}. Status: {}", packageId, Status.PROCESSING.name());
|
||||
//create and start pipilene
|
||||
} catch (Exception e) {
|
||||
CTUtil.removeFile(filePath);
|
||||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e);
|
||||
}
|
||||
}
|
||||
|
||||
public ResponseEntity<MonitoringActivePackagesResponse> findActivePackages(MonitoringActivePackagesRequest activePackagesRequest) throws Exception {
|
||||
AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(activePackagesRequest.getUserId(), activePackagesRequest.getPassword());
|
||||
if (!authResult.isSuccess()) {
|
||||
throw clientExcp(authResult.getError(), XmlErrorFormat.MonitoringActivePackagesError);
|
||||
}
|
||||
|
||||
List<UserPackage> activePackages = signalService.findActivePackages(activePackagesRequest.getUserId());
|
||||
if (activePackages.isEmpty()) {
|
||||
throw clientExcp(SignalError.ERROR_015, XmlErrorFormat.MonitoringActivePackagesError);
|
||||
}
|
||||
|
||||
MonitoringActivePackagesResponse response = new MonitoringActivePackagesResponse();
|
||||
response.setStatus("OK");
|
||||
response.setMembercode(activePackagesRequest.getUserId().substring(0, 6));
|
||||
Packages packages = new Packages();
|
||||
activePackages.forEach(data -> {
|
||||
Package pack = new Package();
|
||||
pack.setPackageName(data.getPackageName());
|
||||
pack.setCreatedAt(data.getCreatedAt() != null ? data.getCreatedAt().toString() : null);
|
||||
packages.getPackages().add(pack);
|
||||
});
|
||||
response.setPackages(packages);
|
||||
return ResponseEntity.ok(response);
|
||||
}
|
||||
|
||||
public ResponseEntity<MonitoringAllPackagesResponse> findAllPackages(MonitoringAllPackagesRequest allPackagesRequest) throws Exception {
|
||||
AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(allPackagesRequest.getUserId(), allPackagesRequest.getPassword());
|
||||
if (!authResult.isSuccess()) {
|
||||
throw clientExcp(authResult.getError(), XmlErrorFormat.MonitoringAllPackagesError);
|
||||
}
|
||||
|
||||
List<UserPackage> activePackages = signalService.findAllPackages(allPackagesRequest.getUserId());
|
||||
if (activePackages.isEmpty()) {
|
||||
throw clientExcp(SignalError.ERROR_019, XmlErrorFormat.MonitoringAllPackagesError);
|
||||
}
|
||||
|
||||
MonitoringAllPackagesResponse response = new MonitoringAllPackagesResponse();
|
||||
response.setStatus("OK");
|
||||
response.setMembercode(allPackagesRequest.getUserId().substring(0, 6));
|
||||
PackagesAll packages = new PackagesAll();
|
||||
activePackages.forEach(data -> {
|
||||
PackageAll pack = new PackageAll();
|
||||
pack.setPackageName(data.getPackageName());
|
||||
pack.setCreatedAt(data.getCreatedAt() != null ? data.getCreatedAt().toString() : null);
|
||||
pack.setStatus(data.getStatus());
|
||||
if (data.getStatus().equals(Status.DELETED.name())) {
|
||||
pack.setDeactivatedAt(data.getDeactivatedAt() != null ? data.getDeactivatedAt().toString() : null);
|
||||
}
|
||||
packages.getPackages().add(pack);
|
||||
});
|
||||
response.setPackages(packages);
|
||||
return ResponseEntity.ok(response);
|
||||
}
|
||||
}
|
||||
|
|
@ -2,16 +2,19 @@ package ru.nbch.credit_tracker.facade;
|
|||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import javax.xml.stream.XMLStreamException;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.springframework.core.io.FileUrlResource;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import ru.nbch.credit_tracker.component.MonitoringRequestValidator;
|
||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.app.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_request.all_packages.MonitoringAllPackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_response.active_packages.MonitoringActivePackagesResponse;
|
||||
|
|
@ -20,14 +23,17 @@ import ru.nbch.credit_tracker.entities.user_response.active_packages.Packages;
|
|||
import ru.nbch.credit_tracker.entities.user_response.all_packages.MonitoringAllPackagesResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.all_packages.PackageAll;
|
||||
import ru.nbch.credit_tracker.entities.user_response.all_packages.PackagesAll;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringPackageDeleteResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringReportListResponse;
|
||||
import ru.nbch.credit_tracker.enums.SignalError;
|
||||
import ru.nbch.credit_tracker.enums.Status;
|
||||
import ru.nbch.credit_tracker.enums.XmlErrorFormat;
|
||||
import ru.nbch.credit_tracker.exceptions.SignalClientException;
|
||||
import ru.nbch.credit_tracker.model.MonitoringValidationError;
|
||||
import ru.nbch.credit_tracker.model.ValidationResult;
|
||||
import ru.nbch.credit_tracker.service.SignalService;
|
||||
import ru.nbch.credit_tracker.service.SignalServiceV2;
|
||||
import ru.nbch.credit_tracker.service.scoring.AuthorizationService;
|
||||
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
||||
import ru.nbch.credit_tracker.service.task.PipelinePackageManager;
|
||||
import ru.nbch.credit_tracker.utils.CTUtil;
|
||||
import ru.nbch.credit_tracker.utils.ZipUtils;
|
||||
|
|
@ -40,19 +46,22 @@ public class SignalFacadeV3 {
|
|||
|
||||
private final MonitoringRequestValidator monitoringRequestValidator;
|
||||
private final CreditTrackerSettings config;
|
||||
private final SignalService signalService;
|
||||
private final SignalServiceV2 signalService;
|
||||
private final AuthorizationService authorizationService;
|
||||
private final PipelinePackageManager pipelinePackageManager;
|
||||
private final SignalRestService signalRestService;
|
||||
public SignalFacadeV3(MonitoringRequestValidator monitoringRequestValidator,
|
||||
CreditTrackerSettings config,
|
||||
SignalService signalService,
|
||||
SignalServiceV2 signalService,
|
||||
AuthorizationService authorizationService,
|
||||
PipelinePackageManager pipelinePackageManager) {
|
||||
PipelinePackageManager pipelinePackageManager,
|
||||
SignalRestService signalRestService) {
|
||||
this.monitoringRequestValidator = monitoringRequestValidator;
|
||||
this.config = config;
|
||||
this.signalService = signalService;
|
||||
this.authorizationService = authorizationService;
|
||||
this.pipelinePackageManager = pipelinePackageManager;
|
||||
this.signalRestService = signalRestService;
|
||||
}
|
||||
|
||||
public void setupMonitoringRequest(MultipartFile file) {
|
||||
|
|
@ -106,7 +115,7 @@ public class SignalFacadeV3 {
|
|||
|
||||
Long packageId = signalService.registerPackage(userId, packageName);
|
||||
log.info("Package registered. PackageId {}. Status: {}", packageId, Status.PROCESSING.name());
|
||||
pipelinePackageManager.buildAndRun2(packageId, filePath);
|
||||
pipelinePackageManager.buildAndRun(packageId, filePath);
|
||||
} catch (Exception e) {
|
||||
CTUtil.removeFile(filePath);
|
||||
if (e instanceof SignalClientException) {
|
||||
|
|
@ -169,4 +178,101 @@ public class SignalFacadeV3 {
|
|||
response.setPackages(packages);
|
||||
return ResponseEntity.ok(response);
|
||||
}
|
||||
|
||||
public ResponseEntity<MonitoringPackageDeleteResponse> deletePackage(String username, String packageName) {
|
||||
try {
|
||||
if (!signalService.isPackageExists(username, packageName)) {
|
||||
throw clientExcp(SignalError.ERROR_016, XmlErrorFormat.MonitoringPackageDeleteError, packageName);
|
||||
}
|
||||
|
||||
LocalDateTime deactivatedAt = LocalDateTime.now();
|
||||
signalService.deletePackage(username, packageName, deactivatedAt);
|
||||
|
||||
MonitoringPackageDeleteResponse response = new MonitoringPackageDeleteResponse();
|
||||
response.setStatus("Deleted");
|
||||
response.setPackageName(packageName);
|
||||
response.setDeactivatedAt(deactivatedAt.toString());
|
||||
|
||||
signalRestService.deletePackage(username, packageName);
|
||||
log.info("Package {} deleted", packageName);
|
||||
return ResponseEntity.ok(response);
|
||||
} catch (Exception e) {
|
||||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_017, XmlErrorFormat.MonitoringPackageDeleteError, e);
|
||||
}
|
||||
}
|
||||
|
||||
public ResponseEntity<MonitoringReportListResponse> getReportList(String username, String packageName) {
|
||||
try {
|
||||
if (signalService.isPackagesByStatusExist(username, packageName, Status.PROCESSING)) {
|
||||
throw clientExcp(SignalError.ERROR_018, XmlErrorFormat.MonitoringReportListError, packageName);
|
||||
}
|
||||
if (signalService.isPackagesByStatusExist(username, packageName, Status.REJECTED)) {
|
||||
throw clientExcp(SignalError.ERROR_020, XmlErrorFormat.MonitoringReportListError, packageName);
|
||||
}
|
||||
if (signalService.isPackagesByStatusExist(username, packageName, Status.ERROR)) {
|
||||
throw clientExcp(SignalError.ERROR_021, XmlErrorFormat.MonitoringReportListError, packageName);
|
||||
}
|
||||
if (signalService.isPackagesByStatusExist(username, packageName, Status.DELETED)) {
|
||||
throw clientExcp(SignalError.ERROR_022, XmlErrorFormat.MonitoringReportListError, packageName);
|
||||
}
|
||||
if (!signalService.isPackagesByStatusExist(username, packageName, Status.ON_MONITORING)) {
|
||||
throw clientExcp(SignalError.ERROR_012, XmlErrorFormat.MonitoringReportListError, packageName);
|
||||
}
|
||||
|
||||
String memberCode = username.substring(0, 6);
|
||||
String filePrefix = (memberCode + "_" + packageName).toUpperCase();
|
||||
String dirPath = config.getLoadDir() + File.separator + memberCode;
|
||||
File folder = new File(dirPath);
|
||||
|
||||
MonitoringReportListResponse.Reports reports = new MonitoringReportListResponse.Reports();
|
||||
if (folder.exists() && folder.isDirectory()) {
|
||||
File[] files = folder.listFiles();
|
||||
if (files != null) {
|
||||
for (File file : files) {
|
||||
if (file.isFile() && file.getName().startsWith(filePrefix)) {
|
||||
reports.getReports().add(file.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
MonitoringReportListResponse response = new MonitoringReportListResponse();
|
||||
response.setPackageName(packageName);
|
||||
response.setReports(reports);
|
||||
return ResponseEntity.ok(response);
|
||||
} catch (Exception e) {
|
||||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringReportListError, e);
|
||||
}
|
||||
}
|
||||
|
||||
public ResponseEntity<Resource> downloadFile(String fileName) {
|
||||
try {
|
||||
String memberCode = CTUtil.getMemberCodeFromFileName(fileName);
|
||||
if (memberCode == null) {
|
||||
throw clientExcp(SignalError.ERROR_014, XmlErrorFormat.MonitoringDownloadError, fileName);
|
||||
}
|
||||
String dirPath = config.getLoadDir() + File.separator + memberCode;
|
||||
File folder = new File(dirPath);
|
||||
|
||||
if (folder.exists() && folder.isDirectory()) {
|
||||
File file = new File(dirPath + File.separator + fileName);
|
||||
if (file.exists() && file.isFile()) {
|
||||
return ResponseEntity.ok().body(new FileUrlResource(file.getPath()));
|
||||
}
|
||||
} else {
|
||||
throw clientExcp(SignalError.ERROR_014, XmlErrorFormat.MonitoringDownloadError, fileName);
|
||||
}
|
||||
throw clientExcp(SignalError.ERROR_014, XmlErrorFormat.MonitoringDownloadError, fileName);
|
||||
} catch (Exception e) {
|
||||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringDownloadError, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ package ru.nbch.credit_tracker.mapper.signal;
|
|||
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import ru.nbch.credit_tracker.entities.dto.Hit;
|
||||
import ru.nbch.credit_tracker.entities.app.Hit;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ package ru.nbch.credit_tracker.mapper.signal;
|
|||
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.app.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.Subject;
|
||||
|
||||
import java.util.Collection;
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ package ru.nbch.credit_tracker.mapper.signal;
|
|||
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.app.UserPackage;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
package ru.nbch.credit_tracker.model;
|
||||
|
||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.app.PhoneFidMap;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,36 +0,0 @@
|
|||
package ru.nbch.credit_tracker.model;
|
||||
|
||||
import ru.nbch.credit_tracker.entities.dto.SubjectProfileForSignal;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class SubjectsProfilePayloadV2 implements StagePayload {
|
||||
private final Long packageId;
|
||||
private final List<SubjectProfileForSignal> subjectProfiles;
|
||||
private final boolean poison;
|
||||
|
||||
public SubjectsProfilePayloadV2(boolean poison) {
|
||||
this.packageId = null;
|
||||
this.subjectProfiles = null;
|
||||
this.poison = poison;
|
||||
}
|
||||
|
||||
public SubjectsProfilePayloadV2(Long packageId, List<SubjectProfileForSignal> subjectProfiles) {
|
||||
this.packageId = packageId;
|
||||
this.subjectProfiles = subjectProfiles;
|
||||
this.poison = false;
|
||||
}
|
||||
|
||||
public Long getPackageId() {
|
||||
return packageId;
|
||||
}
|
||||
|
||||
public List<SubjectProfileForSignal> getSubjectProfiles() {
|
||||
return subjectProfiles;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPoison() {
|
||||
return poison;
|
||||
}
|
||||
}
|
||||
|
|
@ -6,7 +6,7 @@ import org.springframework.aop.framework.AopContext;
|
|||
import org.springframework.context.annotation.EnableAspectJAutoProxy;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.app.UserPackage;
|
||||
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
||||
import ru.nbch.credit_tracker.utils.CTUtil;
|
||||
|
||||
|
|
|
|||
|
|
@ -6,9 +6,9 @@ import org.slf4j.MDC;
|
|||
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||
import ru.nbch.credit_tracker.entities.dto.Hit;
|
||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.app.Hit;
|
||||
import ru.nbch.credit_tracker.entities.app.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.app.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.external_response.online_download.Inquiry;
|
||||
import ru.nbch.credit_tracker.entities.external_response.online_download.Person;
|
||||
import ru.nbch.credit_tracker.entities.external_response.online_download.Persons;
|
||||
|
|
|
|||
|
|
@ -6,9 +6,9 @@ import lombok.extern.slf4j.Slf4j;
|
|||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.builder.PersonFactoryBuilder;
|
||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||
import ru.nbch.credit_tracker.entities.dto.Hit;
|
||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.app.Hit;
|
||||
import ru.nbch.credit_tracker.entities.app.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.app.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;
|
||||
|
|
@ -35,6 +35,8 @@ import java.util.function.Predicate;
|
|||
|
||||
@Slf4j
|
||||
@Service
|
||||
@Deprecated
|
||||
//todo оставил для временного подсмотреть на старую логику
|
||||
public class SignalService {
|
||||
|
||||
private final CreditTrackerSettings config;
|
||||
|
|
@ -128,7 +130,7 @@ public class SignalService {
|
|||
do {
|
||||
batch = phoneFidMapService.findFullPhoneFidMap(packageId, offset, batchSize);
|
||||
if (!batch.isEmpty()) {
|
||||
Map<Integer, PhoneFidMap> fidsMapByBatch = phoneService2.defineFidsAndNameByPhone(batch);
|
||||
Map<Integer, PhoneFidMap> fidsMapByBatch = phoneService.defineFidsAndNameByPhone(batch);
|
||||
// TODO process fidsMapByBatch here
|
||||
}
|
||||
offset += batchSize;
|
||||
|
|
@ -160,7 +162,7 @@ public class SignalService {
|
|||
}
|
||||
|
||||
if (!filteredItems.isEmpty()) {
|
||||
Map<Integer, PhoneFidMap> fidsMapByBatch = phoneService2.defineFidByPhone(filteredItems);
|
||||
Map<Integer, PhoneFidMap> fidsMapByBatch = phoneService.defineFidByPhone(filteredItems);
|
||||
phoneService.defineFidByPhone(filteredItems);
|
||||
log.debug("Actual fids size by phone's batch: {}", fidsMapByBatch.size());
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,70 @@
|
|||
package ru.nbch.credit_tracker.service;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.entities.app.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
||||
import ru.nbch.credit_tracker.enums.Status;
|
||||
import ru.nbch.credit_tracker.service.signal.UserPackageService;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class SignalServiceV2 {
|
||||
private final UserPackageService userPackageService;
|
||||
|
||||
public SignalServiceV2(UserPackageService userPackageService) {
|
||||
this.userPackageService = userPackageService;
|
||||
}
|
||||
|
||||
public boolean isPackageNotUnique(MonitoringRequest request) {
|
||||
return userPackageService.isPackageNotUnique(request.getUserId(), request.getPackageName());
|
||||
}
|
||||
|
||||
public boolean isPackageNotUnique(String userId, String packageName) {
|
||||
return userPackageService.isPackageNotUnique(userId, packageName);
|
||||
}
|
||||
|
||||
|
||||
public Long registerPackage(String userId, String packageName) {
|
||||
UserPackage userPackage = UserPackage.builder()
|
||||
.userId(userId)
|
||||
.packageName(packageName)
|
||||
.createdAt(LocalDateTime.now())
|
||||
.status(Status.PROCESSING.name())
|
||||
.build();
|
||||
return userPackageService.insertPackage(userPackage);
|
||||
}
|
||||
|
||||
public void rejectPackage(String userId, String packageName) {
|
||||
UserPackage userPackage = UserPackage.builder()
|
||||
.userId(userId)
|
||||
.packageName(packageName)
|
||||
.createdAt(LocalDateTime.now())
|
||||
.status(Status.REJECTED.name())
|
||||
.build();
|
||||
userPackageService.insertPackage(userPackage);
|
||||
}
|
||||
|
||||
|
||||
public List<UserPackage> findActivePackages(String userId) {
|
||||
return userPackageService.findUserPackages(userId, Status.ON_MONITORING);
|
||||
}
|
||||
|
||||
public List<UserPackage> findAllPackages(String userId) {
|
||||
return userPackageService.findAllPackagesByUserId(userId);
|
||||
}
|
||||
|
||||
public boolean isPackageExists(String username, String packageName) {
|
||||
return userPackageService.isPackageExists(username, packageName, Status.ON_MONITORING);
|
||||
}
|
||||
|
||||
public boolean isPackagesByStatusExist(String username, String packageName, Status status) {
|
||||
return userPackageService.hasActivePackages(username, packageName, status);
|
||||
}
|
||||
|
||||
public void deletePackage(String username, String packageName, LocalDateTime deactivatedAt) {
|
||||
userPackageService.deletePackage(username, packageName, Status.DELETED, Status.ON_MONITORING, deactivatedAt);
|
||||
}
|
||||
}
|
||||
|
|
@ -5,7 +5,7 @@ import org.springframework.aop.framework.AopContext;
|
|||
import org.springframework.context.annotation.EnableAspectJAutoProxy;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.app.UserPackage;
|
||||
import ru.nbch.credit_tracker.enums.Status;
|
||||
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
||||
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@ import org.slf4j.MDC;
|
|||
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.app.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.app.UserPackage;
|
||||
import ru.nbch.credit_tracker.enums.Status;
|
||||
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import org.springframework.beans.factory.annotation.Qualifier;
|
|||
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
|
||||
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.app.PhoneFidMap;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
|
|
|
|||
|
|
@ -110,7 +110,6 @@ public class PersonService {
|
|||
.fileSinceDate(passport.getFileSinceDate())
|
||||
.build();
|
||||
subjectProfile.setIdData(idProfile);
|
||||
// subjectProfile.setFilled(isRequiredPassportDataPresent(passport));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,110 @@
|
|||
package ru.nbch.credit_tracker.service.indic;
|
||||
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.mapper.indic.PersonMapper;
|
||||
import ru.nbch.credit_tracker.model.IdData;
|
||||
import ru.nbch.credit_tracker.model.SubjectProfile;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class PersonServiceV2 {
|
||||
|
||||
private final PersonMapper mapper;
|
||||
|
||||
public PersonServiceV2(PersonMapper mapper) {
|
||||
this.mapper = mapper;
|
||||
}
|
||||
|
||||
public void filledPassportsData(List<SubjectProfile> subjectProfiles) {
|
||||
List<Integer> fids = subjectProfiles.stream().map(SubjectProfile::getFid).collect(Collectors.toList());
|
||||
if (fids.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
List<PersonService.PassportData> passports = mapper.findPassportData(fids);
|
||||
|
||||
Map<Integer, List<PersonService.PassportData>> passportsMap = passports.stream()
|
||||
.collect(Collectors.groupingBy(PersonService.PassportData::getFid));
|
||||
|
||||
subjectProfiles.forEach(subjectProfile -> {
|
||||
PersonService.PassportData passport = findPassport(passportsMap.get(subjectProfile.getFid()));
|
||||
if (passport != null) {
|
||||
IdData idProfile = IdData.builder()
|
||||
.serNum(passport.getSerNum())
|
||||
.idNum(passport.getIdNum())
|
||||
.issDate(passport.getIssDate())
|
||||
.idType(passport.getIdType())
|
||||
.idType2(passport.getIdType2())
|
||||
.fileSinceDate(passport.getFileSinceDate())
|
||||
.build();
|
||||
subjectProfile.setIdData(idProfile);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//todo подлежит рефакторингу
|
||||
private PersonService.PassportData findPassport(List<PersonService.PassportData> passports) {
|
||||
if (passports == null || passports.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
List<PersonService.PassportData> documents = passports.stream()
|
||||
.filter(this::isDUL)
|
||||
.toList(); // берем только ДУЛ
|
||||
|
||||
if (documents.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Отдаем приоритет паспортам РФ
|
||||
PersonService.PassportData passport = documents.stream()
|
||||
.filter(p -> "21".equals(p.getIdType2()) || "21".equals(p.getIdType()))
|
||||
.sorted(
|
||||
Comparator.comparing(
|
||||
PersonService.PassportData::getIssDate,
|
||||
Comparator.nullsLast(Comparator.reverseOrder())
|
||||
).thenComparing(
|
||||
PersonService.PassportData::getFileSinceDate,
|
||||
Comparator.nullsLast(Comparator.reverseOrder())
|
||||
)
|
||||
).findFirst().orElse(null);
|
||||
|
||||
if (passport != null) {
|
||||
return passport;
|
||||
}
|
||||
|
||||
// Если паспорт РФ не найден, смотри остальные ДУЛ'ы и берем первый
|
||||
passport = documents.stream()
|
||||
.sorted(
|
||||
Comparator.comparing(
|
||||
PersonService.PassportData::getIssDate,
|
||||
Comparator.nullsLast(Comparator.reverseOrder())
|
||||
).thenComparing(
|
||||
PersonService.PassportData::getFileSinceDate,
|
||||
Comparator.nullsLast(Comparator.reverseOrder())
|
||||
)
|
||||
).findFirst().orElse(null);
|
||||
return passport;
|
||||
}
|
||||
|
||||
//todo подлежит рефакторингу;
|
||||
private boolean isDUL(PersonService.PassportData p) {
|
||||
Integer idType;
|
||||
Double idType2;
|
||||
try {
|
||||
idType = p.getIdType() != null ? Integer.parseInt(p.getIdType()) : null;
|
||||
} catch (NumberFormatException e) {
|
||||
idType = null;
|
||||
}
|
||||
try {
|
||||
idType2 = p.getIdType2() != null ? Double.valueOf(p.getIdType2()) : null;
|
||||
} catch (NumberFormatException e) {
|
||||
idType2 = null;
|
||||
}
|
||||
return (idType != null && idType <= 30 && idType != 12) || (idType2 != null && (idType2 >= 1 || idType2 <= 999));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,17 +1,23 @@
|
|||
package ru.nbch.credit_tracker.service.indic;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.repository.PhoneRepository;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.entities.app.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.indic.Name;
|
||||
import ru.nbch.credit_tracker.repository.PhoneRepository;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@Deprecated
|
||||
//todo оставил для временного подсмотреть на старую логику
|
||||
public class PhoneService {
|
||||
|
||||
private final PhoneRepository phoneRepository;
|
||||
|
|
@ -81,4 +87,183 @@ public class PhoneService {
|
|||
return phoneFidMap;
|
||||
}
|
||||
|
||||
public void defineFidsAndNameByPhone2(List<PhoneFidMap> subjects) {
|
||||
List<String> phones = subjects.stream().
|
||||
map(subject -> "9" + subject.getPhone())
|
||||
.toList();
|
||||
|
||||
subjects.sort(
|
||||
Comparator.comparing(
|
||||
PhoneFidMap::getPhone,
|
||||
Comparator.naturalOrder()
|
||||
)
|
||||
);
|
||||
|
||||
List<PhoneRepository.FidsDataWithName> phonesByFid = phoneRepository.findFidsWithName(phones);
|
||||
|
||||
log.debug("Start merging fids and names");
|
||||
Map<Integer, List<PhoneRepository.FidsDataWithName>> fidFidsDataMap = phonesByFid.stream()
|
||||
.collect(Collectors.groupingBy(PhoneRepository.FidsDataWithName::getFid));
|
||||
|
||||
Map<String, Integer> phoneToFidsMap = new HashMap<>();
|
||||
for (PhoneRepository.FidsDataWithName fidsData : phonesByFid) {
|
||||
if (!phoneToFidsMap.containsKey(fidsData.getPhone())) {
|
||||
phoneToFidsMap.put(fidsData.getPhone(), fidsData.getFid());
|
||||
}
|
||||
}
|
||||
|
||||
for (PhoneFidMap phoneFid : subjects) {
|
||||
String phone = "9" + phoneFid.getPhone();
|
||||
Integer fid = phoneToFidsMap.get(phone);
|
||||
if (fid != null) {
|
||||
phoneFid.setFid(fid);
|
||||
|
||||
List<PhoneRepository.FidsDataWithName> fidsDataWithNames = fidFidsDataMap.get(fid);
|
||||
if (fidsDataWithNames != null) {
|
||||
PhoneRepository.FidsDataWithName nameData = defineNameData(fidsDataWithNames);
|
||||
|
||||
if (nameData != null) {
|
||||
phoneFid.setFirstName(nameData.getFirstName());
|
||||
phoneFid.setMiddleName(nameData.getMiddleName());
|
||||
phoneFid.setLastName(nameData.getLastName());
|
||||
phoneFid.setBirthDate(nameData.getBirthDate());
|
||||
phoneFid.setFileSinceDate(nameData.getFileSinceDateName());
|
||||
}
|
||||
}
|
||||
phoneToFidsMap.remove(phone);
|
||||
}
|
||||
}
|
||||
log.debug("End merging fids and names");
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
private PhoneRepository.FidsDataWithName defineNameData(List<PhoneRepository.FidsDataWithName> dataList) {
|
||||
PhoneRepository.FidsDataWithName currentData = null;
|
||||
for (PhoneRepository.FidsDataWithName fidsData : dataList) {
|
||||
if (currentData == null) {
|
||||
currentData = fidsData;
|
||||
continue;
|
||||
}
|
||||
LocalDate currentDate = currentData.getFileSinceDateName();
|
||||
LocalDate newDate = fidsData.getFileSinceDateName();
|
||||
if (currentDate != null && newDate != null) {
|
||||
if (currentDate.isBefore(newDate)) {
|
||||
currentData = fidsData;
|
||||
}
|
||||
} else if (currentDate == null) {
|
||||
currentData = fidsData;
|
||||
}
|
||||
}
|
||||
return currentData;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private Name defineNameDataV2(List<Name> dataList) {
|
||||
Name currentData = null;
|
||||
for (Name fidsData : dataList) {
|
||||
if (currentData == null) {
|
||||
currentData = fidsData;
|
||||
continue;
|
||||
}
|
||||
LocalDate currentDate = currentData.getFileSinceDate();
|
||||
LocalDate newDate = fidsData.getFileSinceDate();
|
||||
if (currentDate != null && newDate != null) {
|
||||
if (currentDate.isBefore(newDate)) {
|
||||
currentData = fidsData;
|
||||
}
|
||||
} else if (currentDate == null) {
|
||||
currentData = fidsData;
|
||||
}
|
||||
}
|
||||
return currentData;
|
||||
}
|
||||
|
||||
private Map<Integer, PhoneFidMap> merger2(List<PhoneFidMap> subjects, List<PhoneRepository.FidsData> phonesByFid) {
|
||||
Map<Integer, PhoneFidMap> phoneFidMap = new HashMap<>();
|
||||
Iterator<PhoneRepository.FidsData> iterator = phonesByFid.iterator();
|
||||
String lastUniquePhone = null;
|
||||
PhoneRepository.FidsData fidsData = null;
|
||||
for (PhoneFidMap phoneFid : subjects) {
|
||||
String normalizedPhone = 9 + phoneFid.getPhone();
|
||||
while (iterator.hasNext()) {
|
||||
fidsData = iterator.next();
|
||||
if (StringUtils.isNotEmpty(lastUniquePhone) && lastUniquePhone.equals(fidsData.getPhone())) {
|
||||
iterator.remove();
|
||||
continue;
|
||||
}
|
||||
if (fidsData.getPhone().equals(normalizedPhone) || normalizedPhone.equals(lastUniquePhone)) {
|
||||
lastUniquePhone = fidsData.getPhone();
|
||||
iterator.remove();
|
||||
break;
|
||||
}
|
||||
lastUniquePhone = fidsData.getPhone();
|
||||
break;
|
||||
}
|
||||
if (fidsData != null && normalizedPhone.equals(lastUniquePhone)) {
|
||||
phoneFidMap.put(fidsData.getFid(), phoneFid);
|
||||
}
|
||||
}
|
||||
return phoneFidMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ищет фиды по номерам телефона. Обогащает {@link PhoneFidMap} для найденных фидов данными из Name и фидом.
|
||||
* @return Map: key - FID, value - {@link PhoneFidMap}
|
||||
*/
|
||||
public Map<Integer, PhoneFidMap> defineFidsAndNameByPhone(List<PhoneFidMap> subjects) {
|
||||
Map<Integer, PhoneFidMap> phoneFidMap = new HashMap<>();
|
||||
|
||||
List<String> phones = subjects.stream().
|
||||
map(subject -> "9" + subject.getPhone())
|
||||
.toList();
|
||||
|
||||
subjects.sort(
|
||||
Comparator.comparing(
|
||||
PhoneFidMap::getPhone,
|
||||
Comparator.naturalOrder()
|
||||
)
|
||||
);
|
||||
|
||||
List<PhoneRepository.FidsDataWithName> phonesByFid = phoneRepository.findFidsWithName(phones);
|
||||
|
||||
log.debug("Start merging fids and names");
|
||||
Map<Integer, List<PhoneRepository.FidsDataWithName>> fidFidsDataMap = phonesByFid.stream()
|
||||
.collect(Collectors.groupingBy(PhoneRepository.FidsDataWithName::getFid));
|
||||
|
||||
Map<String, Integer> phoneToFidsMap = new HashMap<>();
|
||||
for (PhoneRepository.FidsDataWithName fidsData : phonesByFid) {
|
||||
if (!phoneToFidsMap.containsKey(fidsData.getPhone())) {
|
||||
phoneToFidsMap.put(fidsData.getPhone(), fidsData.getFid());
|
||||
}
|
||||
}
|
||||
|
||||
for (PhoneFidMap phoneFid : subjects) {
|
||||
String phone = "9" + phoneFid.getPhone();
|
||||
Integer fid = phoneToFidsMap.get(phone);
|
||||
if (fid != null) {
|
||||
phoneFid.setFid(fid);
|
||||
|
||||
List<PhoneRepository.FidsDataWithName> fidsDataWithNames = fidFidsDataMap.get(fid);
|
||||
if (fidsDataWithNames != null) {
|
||||
PhoneRepository.FidsDataWithName nameData = defineNameData(fidsDataWithNames);
|
||||
|
||||
if (nameData != null) {
|
||||
phoneFid.setFirstName(nameData.getFirstName());
|
||||
phoneFid.setMiddleName(nameData.getMiddleName());
|
||||
phoneFid.setLastName(nameData.getLastName());
|
||||
phoneFid.setBirthDate(nameData.getBirthDate());
|
||||
phoneFid.setFileSinceDate(nameData.getFileSinceDateName());
|
||||
}
|
||||
|
||||
fidFidsDataMap.remove(fid);
|
||||
}
|
||||
phoneFidMap.put(fid, phoneFid); // TODO можно перезатереть запись если у разных phone нашлись одинаковые фиды
|
||||
phoneToFidsMap.remove(phone);
|
||||
}
|
||||
}
|
||||
log.debug("End merging fids and names");
|
||||
|
||||
return phoneFidMap;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,18 +1,13 @@
|
|||
package ru.nbch.credit_tracker.service.indic;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.BinaryOperator;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.indic.Name;
|
||||
import ru.nbch.credit_tracker.model.SubjectProfile;
|
||||
import ru.nbch.credit_tracker.repository.PhoneRepository;
|
||||
|
|
@ -23,106 +18,14 @@ import ru.nbch.credit_tracker.utils.CTUtil;
|
|||
public class PhoneService2 {
|
||||
|
||||
private final PhoneRepository phoneRepository;
|
||||
private final Comparator<Name> byDateThenIdNullSafe =
|
||||
Comparator.comparing(Name::getFileSinceDate, Comparator.nullsFirst(Comparator.naturalOrder()))
|
||||
.thenComparing(Name::getFid);
|
||||
|
||||
public PhoneService2(PhoneRepository phoneRepository) {
|
||||
this.phoneRepository = phoneRepository;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ищет фиды по номерам телефона
|
||||
*
|
||||
* @return Map: key - fid; value - {@link PhoneFidMap}
|
||||
*/
|
||||
public Map<Integer, PhoneFidMap> defineFidByPhone(List<PhoneFidMap> subjects) {
|
||||
Map<Integer, PhoneFidMap> phoneFidMap = new HashMap<>();
|
||||
|
||||
List<String> phones = subjects.stream().
|
||||
map(subject -> "9" + subject.getPhone())
|
||||
.toList();
|
||||
|
||||
subjects.sort(
|
||||
Comparator.comparing(
|
||||
PhoneFidMap::getPhone,
|
||||
Comparator.naturalOrder()
|
||||
)
|
||||
);
|
||||
|
||||
List<PhoneRepository.FidsData> phonesByFid = phoneRepository.findFids(phones);
|
||||
|
||||
log.debug("Start merging fids 2");
|
||||
Map<String, Integer> phoneToFidsMap = new HashMap<>();
|
||||
for (PhoneRepository.FidsData fidsData : phonesByFid) {
|
||||
if (!phoneToFidsMap.containsKey(fidsData.getPhone())) {
|
||||
phoneToFidsMap.put(fidsData.getPhone(), fidsData.getFid());
|
||||
}
|
||||
}
|
||||
|
||||
for (PhoneFidMap phoneFid : subjects) {
|
||||
String phone = "9" + phoneFid.getPhone();
|
||||
Integer fid = phoneToFidsMap.get(phone);
|
||||
if (fid != null) {
|
||||
phoneFidMap.put(fid, phoneFid);
|
||||
phoneToFidsMap.remove(phone);
|
||||
}
|
||||
}
|
||||
log.debug("End merging fids 2");
|
||||
|
||||
return phoneFidMap;
|
||||
}
|
||||
|
||||
public void defineFidsAndNameByPhone2(List<PhoneFidMap> subjects) {
|
||||
List<String> phones = subjects.stream().
|
||||
map(subject -> "9" + subject.getPhone())
|
||||
.toList();
|
||||
|
||||
subjects.sort(
|
||||
Comparator.comparing(
|
||||
PhoneFidMap::getPhone,
|
||||
Comparator.naturalOrder()
|
||||
)
|
||||
);
|
||||
|
||||
List<PhoneRepository.FidsDataWithName> phonesByFid = phoneRepository.findFidsWithName(phones);
|
||||
|
||||
log.debug("Start merging fids and names");
|
||||
Map<Integer, List<PhoneRepository.FidsDataWithName>> fidFidsDataMap = phonesByFid.stream()
|
||||
.collect(Collectors.groupingBy(PhoneRepository.FidsDataWithName::getFid));
|
||||
|
||||
Map<String, Integer> phoneToFidsMap = new HashMap<>();
|
||||
for (PhoneRepository.FidsDataWithName fidsData : phonesByFid) {
|
||||
if (!phoneToFidsMap.containsKey(fidsData.getPhone())) {
|
||||
phoneToFidsMap.put(fidsData.getPhone(), fidsData.getFid());
|
||||
}
|
||||
}
|
||||
|
||||
for (PhoneFidMap phoneFid : subjects) {
|
||||
String phone = "9" + phoneFid.getPhone();
|
||||
Integer fid = phoneToFidsMap.get(phone);
|
||||
if (fid != null) {
|
||||
phoneFid.setFid(fid);
|
||||
|
||||
List<PhoneRepository.FidsDataWithName> fidsDataWithNames = fidFidsDataMap.get(fid);
|
||||
if (fidsDataWithNames != null) {
|
||||
PhoneRepository.FidsDataWithName nameData = defineNameData(fidsDataWithNames);
|
||||
|
||||
if (nameData != null) {
|
||||
phoneFid.setFirstName(nameData.getFirstName());
|
||||
phoneFid.setMiddleName(nameData.getMiddleName());
|
||||
phoneFid.setLastName(nameData.getLastName());
|
||||
phoneFid.setBirthDate(nameData.getBirthDate());
|
||||
phoneFid.setFileSinceDate(nameData.getFileSinceDateName());
|
||||
}
|
||||
}
|
||||
phoneToFidsMap.remove(phone);
|
||||
}
|
||||
}
|
||||
log.debug("End merging fids and names");
|
||||
}
|
||||
|
||||
Comparator<Name> byDateThenIdNullSafe =
|
||||
Comparator.comparing(Name::getFileSinceDate, Comparator.nullsFirst(Comparator.naturalOrder()))
|
||||
.thenComparing(Name::getFid);
|
||||
|
||||
/**
|
||||
* Поиск данных по таблицам PHONE_NORM и NAME по списку номеров телефонов
|
||||
* @param subjects
|
||||
|
|
@ -143,133 +46,4 @@ public class PhoneService2 {
|
|||
BinaryOperator.maxBy(byDateThenIdNullSafe)
|
||||
));
|
||||
}
|
||||
/**
|
||||
* Ищет фиды по номерам телефона. Обогащает {@link PhoneFidMap} для найденных фидов данными из Name и фидом.
|
||||
* @return Map: key - FID, value - {@link PhoneFidMap}
|
||||
*/
|
||||
public Map<Integer, PhoneFidMap> defineFidsAndNameByPhone(List<PhoneFidMap> subjects) {
|
||||
Map<Integer, PhoneFidMap> phoneFidMap = new HashMap<>();
|
||||
|
||||
List<String> phones = subjects.stream().
|
||||
map(subject -> "9" + subject.getPhone())
|
||||
.toList();
|
||||
|
||||
subjects.sort(
|
||||
Comparator.comparing(
|
||||
PhoneFidMap::getPhone,
|
||||
Comparator.naturalOrder()
|
||||
)
|
||||
);
|
||||
|
||||
List<PhoneRepository.FidsDataWithName> phonesByFid = phoneRepository.findFidsWithName(phones);
|
||||
|
||||
log.debug("Start merging fids and names");
|
||||
Map<Integer, List<PhoneRepository.FidsDataWithName>> fidFidsDataMap = phonesByFid.stream()
|
||||
.collect(Collectors.groupingBy(PhoneRepository.FidsDataWithName::getFid));
|
||||
|
||||
Map<String, Integer> phoneToFidsMap = new HashMap<>();
|
||||
for (PhoneRepository.FidsDataWithName fidsData : phonesByFid) {
|
||||
if (!phoneToFidsMap.containsKey(fidsData.getPhone())) {
|
||||
phoneToFidsMap.put(fidsData.getPhone(), fidsData.getFid());
|
||||
}
|
||||
}
|
||||
|
||||
for (PhoneFidMap phoneFid : subjects) {
|
||||
String phone = "9" + phoneFid.getPhone();
|
||||
Integer fid = phoneToFidsMap.get(phone);
|
||||
if (fid != null) {
|
||||
phoneFid.setFid(fid);
|
||||
|
||||
List<PhoneRepository.FidsDataWithName> fidsDataWithNames = fidFidsDataMap.get(fid);
|
||||
if (fidsDataWithNames != null) {
|
||||
PhoneRepository.FidsDataWithName nameData = defineNameData(fidsDataWithNames);
|
||||
|
||||
if (nameData != null) {
|
||||
phoneFid.setFirstName(nameData.getFirstName());
|
||||
phoneFid.setMiddleName(nameData.getMiddleName());
|
||||
phoneFid.setLastName(nameData.getLastName());
|
||||
phoneFid.setBirthDate(nameData.getBirthDate());
|
||||
phoneFid.setFileSinceDate(nameData.getFileSinceDateName());
|
||||
}
|
||||
|
||||
fidFidsDataMap.remove(fid);
|
||||
}
|
||||
phoneFidMap.put(fid, phoneFid); // TODO можно перезатереть запись если у разных phone нашлись одинаковые фиды
|
||||
phoneToFidsMap.remove(phone);
|
||||
}
|
||||
}
|
||||
log.debug("End merging fids and names");
|
||||
|
||||
return phoneFidMap;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
private PhoneRepository.FidsDataWithName defineNameData(List<PhoneRepository.FidsDataWithName> dataList) {
|
||||
PhoneRepository.FidsDataWithName currentData = null;
|
||||
for (PhoneRepository.FidsDataWithName fidsData : dataList) {
|
||||
if (currentData == null) {
|
||||
currentData = fidsData;
|
||||
continue;
|
||||
}
|
||||
LocalDate currentDate = currentData.getFileSinceDateName();
|
||||
LocalDate newDate = fidsData.getFileSinceDateName();
|
||||
if (currentDate != null && newDate != null) {
|
||||
if (currentDate.isBefore(newDate)) {
|
||||
currentData = fidsData;
|
||||
}
|
||||
} else if (currentDate == null) {
|
||||
currentData = fidsData;
|
||||
}
|
||||
}
|
||||
return currentData;
|
||||
}
|
||||
|
||||
private Name defineNameDataV2(List<Name> dataList) {
|
||||
Name currentData = null;
|
||||
for (Name fidsData : dataList) {
|
||||
if (currentData == null) {
|
||||
currentData = fidsData;
|
||||
continue;
|
||||
}
|
||||
LocalDate currentDate = currentData.getFileSinceDate();
|
||||
LocalDate newDate = fidsData.getFileSinceDate();
|
||||
if (currentDate != null && newDate != null) {
|
||||
if (currentDate.isBefore(newDate)) {
|
||||
currentData = fidsData;
|
||||
}
|
||||
} else if (currentDate == null) {
|
||||
currentData = fidsData;
|
||||
}
|
||||
}
|
||||
return currentData;
|
||||
}
|
||||
|
||||
private Map<Integer, PhoneFidMap> merger(List<PhoneFidMap> subjects, List<PhoneRepository.FidsData> phonesByFid) {
|
||||
Map<Integer, PhoneFidMap> phoneFidMap = new HashMap<>();
|
||||
Iterator<PhoneRepository.FidsData> iterator = phonesByFid.iterator();
|
||||
String lastUniquePhone = null;
|
||||
PhoneRepository.FidsData fidsData = null;
|
||||
for (PhoneFidMap phoneFid : subjects) {
|
||||
String normalizedPhone = 9 + phoneFid.getPhone();
|
||||
while (iterator.hasNext()) {
|
||||
fidsData = iterator.next();
|
||||
if (StringUtils.isNotEmpty(lastUniquePhone) && lastUniquePhone.equals(fidsData.getPhone())) {
|
||||
iterator.remove();
|
||||
continue;
|
||||
}
|
||||
if (fidsData.getPhone().equals(normalizedPhone) || normalizedPhone.equals(lastUniquePhone)) {
|
||||
lastUniquePhone = fidsData.getPhone();
|
||||
iterator.remove();
|
||||
break;
|
||||
}
|
||||
lastUniquePhone = fidsData.getPhone();
|
||||
break;
|
||||
}
|
||||
if (fidsData != null && normalizedPhone.equals(lastUniquePhone)) {
|
||||
phoneFidMap.put(fidsData.getFid(), phoneFid);
|
||||
}
|
||||
}
|
||||
return phoneFidMap;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
package ru.nbch.credit_tracker.service.signal;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.entities.dto.Hit;
|
||||
import ru.nbch.credit_tracker.entities.app.Hit;
|
||||
import ru.nbch.credit_tracker.mapper.signal.HitsMapper;
|
||||
|
||||
import java.util.List;
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ import org.apache.ibatis.session.SqlSession;
|
|||
import org.apache.ibatis.session.SqlSessionFactory;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.app.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.indic.Name;
|
||||
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.Subject;
|
||||
import ru.nbch.credit_tracker.mapper.signal.PhoneFidMapMapper;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
package ru.nbch.credit_tracker.service.signal;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.app.UserPackage;
|
||||
import ru.nbch.credit_tracker.enums.Status;
|
||||
import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,26 +1,16 @@
|
|||
package ru.nbch.credit_tracker.service.task;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.Semaphore;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.stream.Collectors;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.stereotype.Component;
|
||||
import ru.nbch.credit_tracker.config.task.StageQueueFactory;
|
||||
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
||||
import ru.nbch.credit_tracker.model.SendSignalsPayload;
|
||||
import ru.nbch.credit_tracker.model.SubjectProfile;
|
||||
import ru.nbch.credit_tracker.model.impl.SubjectPayload;
|
||||
import ru.nbch.credit_tracker.service.task.impl.SaveSubjectHandler;
|
||||
import ru.nbch.credit_tracker.service.task.impl.dprctd.FidIdEnricher;
|
||||
|
|
@ -64,48 +54,6 @@ public class PipelinePackageManager {
|
|||
}
|
||||
|
||||
public void buildAndRun(Long packageId, String pkgPath) throws Exception {
|
||||
BlockingQueue<SubjectPayload> saveSubjectQueue = saveSubjectQueueFactory.getObject();
|
||||
BlockingQueue<SubjectPayload> idEnricherQueue = idEnricherQueueFactory.getObject();
|
||||
|
||||
Stage<SubjectPayload, SubjectPayload> saveSubjectStage = new Stage<>(saveSubjectHandler,
|
||||
saveSubjectQueue,
|
||||
idEnricherQueue,
|
||||
SubjectPayload.POISON
|
||||
);
|
||||
Future<?> future = executorService.submit(saveSubjectStage);
|
||||
|
||||
executorService.submit(() -> {
|
||||
log.info("Start registering subjects. PackageId: {}", packageId);
|
||||
try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(Path.of(pkgPath)), 8 * 1024 * 1024)) {
|
||||
xmlProcessor.read(in, MonitoringRequest.class,
|
||||
request -> {
|
||||
if (!request.getSubjects().getSubject().isEmpty()) {
|
||||
List<SubjectProfile> subjectProfileBatch = request.getSubjects().getSubject().stream().map(subject ->
|
||||
SubjectProfile.builder()
|
||||
.identifier(subject.getId())
|
||||
.phone(subject.getClientId())
|
||||
.build()
|
||||
|
||||
).collect(Collectors.toList());
|
||||
log.trace("Reading subject's batch. Total count: {}. PackageId: {}", request.getSubjects().getSubject().size(), packageId);
|
||||
saveSubjectQueue.add(new SubjectPayload(packageId, subjectProfileBatch));
|
||||
request.getSubjects().getSubject().clear();
|
||||
}
|
||||
},
|
||||
request -> request.getSubjects().getSubject().isEmpty()
|
||||
,
|
||||
BATCH_SIZE, "/MonitoringRequest/Subjects/Subject");
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Error while parsing monitoring request", e);
|
||||
} finally {
|
||||
saveSubjectQueue.add(new SubjectPayload(true));
|
||||
}
|
||||
});
|
||||
// future.get(10_000, TimeUnit.SECONDS);
|
||||
log.info("Subjects were registered. PackageId: {}", packageId);
|
||||
}
|
||||
|
||||
public void buildAndRun2(Long packageId, String pkgPath) throws Exception {
|
||||
if (!semaphore.tryAcquire()) {
|
||||
throw new RuntimeException("Too many concurrent requests");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,26 +17,19 @@ import ru.nbch.credit_tracker.entities.external_request.signals.Person;
|
|||
import ru.nbch.credit_tracker.model.SendSignalsPayload;
|
||||
import ru.nbch.credit_tracker.model.SubjectProfile;
|
||||
import ru.nbch.credit_tracker.model.impl.SubjectPayload;
|
||||
import ru.nbch.credit_tracker.service.SignalService;
|
||||
import ru.nbch.credit_tracker.service.indic.PersonService;
|
||||
import ru.nbch.credit_tracker.service.indic.PersonServiceV2;
|
||||
import ru.nbch.credit_tracker.service.task.Handler;
|
||||
import ru.nbch.credit_tracker.service.xml.stax.SignalsStaxXmlWriterV2;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class FidIdEnricher implements Handler<SubjectPayload, SendSignalsPayload> {
|
||||
private final PersonService personService;
|
||||
private final SignalService signalService;
|
||||
private final PersonServiceV2 personService;
|
||||
private final CreditTrackerSettings config;
|
||||
// private final BlockingQueue<PartFilePayload> mergerQueue;
|
||||
public FidIdEnricher(PersonService personService,
|
||||
SignalService signalService,
|
||||
CreditTrackerSettings config//,
|
||||
/*BlockingQueue<PartFilePayload> mergerQueue*/) {
|
||||
public FidIdEnricher(PersonServiceV2 personService,
|
||||
CreditTrackerSettings config) {
|
||||
this.personService = personService;
|
||||
this.signalService = signalService;
|
||||
this.config = config;
|
||||
// this.mergerQueue = mergerQueue;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -66,8 +59,6 @@ public class FidIdEnricher implements Handler<SubjectPayload, SendSignalsPayload
|
|||
Path tmp = dir.resolve(base + ".part");
|
||||
Path done = dir.resolve(base);
|
||||
|
||||
// Signals signals = signalService.buildSignals(packageId);
|
||||
|
||||
try (OutputStream os = Files.newOutputStream(tmp, StandardOpenOption.CREATE_NEW)) {
|
||||
SignalsStaxXmlWriterV2 writer = new SignalsStaxXmlWriterV2(persons, null, config.getEncoding());
|
||||
writer.writeWithStax(os); // перегрузи на OutputStream, если нужно
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ package ru.nbch.credit_tracker.service.task.impl.dprctd;
|
|||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.app.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.mapper.signal.PhoneFidMapMapper;
|
||||
import ru.nbch.credit_tracker.model.DummyPayload;
|
||||
import ru.nbch.credit_tracker.model.FlagsPayload;
|
||||
|
|
|
|||
|
|
@ -1,136 +0,0 @@
|
|||
package ru.nbch.credit_tracker.service.task.impl.dprctd;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||
import ru.nbch.credit_tracker.model.StagePayload;
|
||||
import ru.nbch.credit_tracker.service.task.Handler;
|
||||
|
||||
@Slf4j
|
||||
public class StageForDeletion<X extends StagePayload, Z extends StagePayload>
|
||||
{
|
||||
private final Handler<X, Z> dispatcher;
|
||||
private final BlockingQueue<X> in;
|
||||
private final BlockingQueue<Z> out;
|
||||
private final Z POISON;
|
||||
private final ExecutorService ioPool;
|
||||
|
||||
public StageForDeletion(Handler<X, Z> dispatcher,
|
||||
BlockingQueue<X> in,
|
||||
BlockingQueue<Z> out,
|
||||
Z POISON) {
|
||||
this.dispatcher = dispatcher;
|
||||
this.in = in;
|
||||
this.out = out;
|
||||
this.ioPool = Executors.newFixedThreadPool(10);
|
||||
this.POISON = POISON;
|
||||
}
|
||||
|
||||
public void start() {
|
||||
List<Future<Z>> inflight = new ArrayList<>();
|
||||
AtomicInteger inFlightCount = new AtomicInteger();
|
||||
try {
|
||||
while (true) {
|
||||
X b = takeQuiet(in, Duration.ofSeconds(5));
|
||||
if (b == null) continue;
|
||||
if (b.isPoison()) {
|
||||
// дождаться всех in-flight задач
|
||||
for (Future<Z> f : inflight) {
|
||||
putQuiet(out, f.get());
|
||||
}
|
||||
putQuiet(out, POISON);
|
||||
return;
|
||||
}
|
||||
|
||||
Future<Z> f = ioPool.submit(() -> {
|
||||
Z p = dispatcher.handle(b);
|
||||
putQuiet(out, p);
|
||||
return p;
|
||||
}
|
||||
);
|
||||
inflight.add(f);
|
||||
|
||||
// чтобы не накапливать слишком много future в памяти, периодически сливаем
|
||||
if (inFlightCount.incrementAndGet() % 8 == 0) {
|
||||
drainDone(inflight, out);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("Error: {}", ExceptionUtils.getStackTrace(e));
|
||||
putQuiet(out, POISON);
|
||||
} finally {
|
||||
drainAll(inflight, out);
|
||||
}
|
||||
}
|
||||
|
||||
void drainDone(List<Future<Z>> fs, BlockingQueue<Z> out) throws Exception {
|
||||
Iterator<Future<Z>> it = fs.iterator();
|
||||
while (it.hasNext()) {
|
||||
Future<Z> f = it.next();
|
||||
if (f.isDone()) {
|
||||
putQuiet(out, f.get());
|
||||
it.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void drainAll(List<Future<Z>> fs, BlockingQueue<Z> out) {
|
||||
for (Future<Z> f : fs) {
|
||||
try {
|
||||
putQuiet(out, f.get());
|
||||
} catch (Exception e) {
|
||||
log.error("Error: {}", ExceptionUtils.getStackTrace(e));
|
||||
}
|
||||
}
|
||||
fs.clear();
|
||||
}
|
||||
|
||||
private ExecutorService newIoExecutor() {
|
||||
// один carrier на ядро, задачи — виртуальные
|
||||
return Executors.newThreadPerTaskExecutor(Thread.ofVirtual().name("vt-io-", 0).factory());
|
||||
}
|
||||
|
||||
void putQuiet(BlockingQueue<Z> q, Z b) {
|
||||
try {
|
||||
q.put(b);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
}
|
||||
|
||||
X takeQuiet(BlockingQueue<X> q, Duration timeout) {
|
||||
try {
|
||||
return q.poll(timeout.toMillis(), TimeUnit.MILLISECONDS);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
static void sleep(long ms) {
|
||||
try {
|
||||
Thread.sleep(ms);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
}
|
||||
|
||||
// @Override
|
||||
public void stop() {
|
||||
|
||||
}
|
||||
|
||||
// @Override
|
||||
public boolean isRunning() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
<mapper namespace="ru.nbch.credit_tracker.mapper.signal.PhoneFidMapMapper">
|
||||
|
||||
<resultMap id="PhoneFidMapResultMap" type="ru.nbch.credit_tracker.entities.dto.PhoneFidMap">
|
||||
<resultMap id="PhoneFidMapResultMap" type="ru.nbch.credit_tracker.entities.app.PhoneFidMap">
|
||||
<result property="id" column="id"/>
|
||||
<result property="packageId" column="package_id"/>
|
||||
<result property="subjectId" column="subject_id"/>
|
||||
|
|
@ -58,7 +58,7 @@
|
|||
</foreach>
|
||||
</update>
|
||||
|
||||
<update id="updateOne" parameterType="ru.nbch.credit_tracker.entities.dto.PhoneFidMap">
|
||||
<update id="updateOne" parameterType="ru.nbch.credit_tracker.entities.app.PhoneFidMap">
|
||||
UPDATE signals_phone_fid_map
|
||||
SET
|
||||
package_id = #{subject.packageId},
|
||||
|
|
@ -106,7 +106,7 @@
|
|||
LIMIT #{limit} OFFSET #{offset}
|
||||
</select>
|
||||
|
||||
<select id="findPhoneFidMapById" resultMap="PhoneFidMapResultMap" resultType="ru.nbch.credit_tracker.entities.dto.PhoneFidMap">
|
||||
<select id="findPhoneFidMapById" resultMap="PhoneFidMapResultMap" resultType="ru.nbch.credit_tracker.entities.app.PhoneFidMap">
|
||||
SELECT id,
|
||||
package_id,
|
||||
subject_id,
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
<mapper namespace="ru.nbch.credit_tracker.mapper.signal.UserPackageMapper">
|
||||
|
||||
<resultMap id="packageDataResultMap" type="ru.nbch.credit_tracker.entities.dto.UserPackage">
|
||||
<resultMap id="packageDataResultMap" type="ru.nbch.credit_tracker.entities.app.UserPackage">
|
||||
<result property="id" column="id"/>
|
||||
<result property="userId" column="membercode"/>
|
||||
<result property="packageName" column="package_name"/>
|
||||
|
|
@ -53,7 +53,7 @@
|
|||
</update>
|
||||
|
||||
<select id="insertPackage" resultType="java.lang.Long"
|
||||
parameterType="ru.nbch.credit_tracker.entities.dto.UserPackage">
|
||||
parameterType="ru.nbch.credit_tracker.entities.app.UserPackage">
|
||||
INSERT INTO signals_user_packages (membercode, package_name, created_at, status)
|
||||
values (#{userPackage.userId}, #{userPackage.packageName}, #{userPackage.createdAt}, #{userPackage.status}) RETURNING id
|
||||
</select>
|
||||
|
|
@ -77,7 +77,7 @@
|
|||
</update>
|
||||
|
||||
<select id="findPackage" resultMap="packageDataResultMap"
|
||||
resultType="ru.nbch.credit_tracker.entities.dto.UserPackage">
|
||||
resultType="ru.nbch.credit_tracker.entities.app.UserPackage">
|
||||
SELECT id, membercode, package_name, created_at, status, deactivated_at, last_downloaded_report, monitoring_at
|
||||
FROM signals_user_packages
|
||||
WHERE id = #{id}
|
||||
|
|
@ -85,7 +85,7 @@
|
|||
</select>
|
||||
|
||||
<select id="findUserPackages" resultMap="packageDataResultMap"
|
||||
resultType="ru.nbch.credit_tracker.entities.dto.UserPackage">
|
||||
resultType="ru.nbch.credit_tracker.entities.app.UserPackage">
|
||||
SELECT id, membercode, package_name, created_at, status, deactivated_at, last_downloaded_report, monitoring_at
|
||||
FROM signals_user_packages
|
||||
WHERE membercode IS NOT NULL
|
||||
|
|
@ -97,7 +97,7 @@
|
|||
</select>
|
||||
|
||||
<select id="findAllPackagesByUserId" resultMap="packageDataResultMap"
|
||||
resultType="ru.nbch.credit_tracker.entities.dto.UserPackage">
|
||||
resultType="ru.nbch.credit_tracker.entities.app.UserPackage">
|
||||
SELECT id, membercode, package_name, created_at, status, deactivated_at, last_downloaded_report, monitoring_at
|
||||
FROM signals_user_packages
|
||||
WHERE membercode IS NOT NULL
|
||||
|
|
@ -105,7 +105,7 @@
|
|||
</select>
|
||||
|
||||
<select id="findAllPackagesByStatus" resultMap="packageDataResultMap"
|
||||
resultType="ru.nbch.credit_tracker.entities.dto.UserPackage">
|
||||
resultType="ru.nbch.credit_tracker.entities.app.UserPackage">
|
||||
SELECT id, membercode, package_name, created_at, status, deactivated_at, last_downloaded_report, monitoring_at
|
||||
FROM signals_user_packages
|
||||
WHERE status = #{status}
|
||||
|
|
|
|||
|
|
@ -1,22 +1,20 @@
|
|||
package ru.nbch.credit_tracker.service;
|
||||
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.repository.PhoneRepository;
|
||||
import ru.nbch.credit_tracker.service.indic.PhoneService2;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import org.mockito.Mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import ru.nbch.credit_tracker.entities.app.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.repository.PhoneRepository;
|
||||
import ru.nbch.credit_tracker.service.indic.PhoneService;
|
||||
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
public class PhoneService2Test {
|
||||
|
|
@ -26,7 +24,7 @@ public class PhoneService2Test {
|
|||
|
||||
@Test
|
||||
public void defineFidByPhoneTest() {
|
||||
PhoneService2 phoneService = new PhoneService2(phoneRepository);
|
||||
PhoneService phoneService = new PhoneService(phoneRepository);
|
||||
|
||||
fidsDataWithEqualSinceDt.sort(byDbOrder);
|
||||
when(phoneRepository.findFids(any())).thenReturn(fidsDataWithEqualSinceDt);
|
||||
|
|
@ -48,7 +46,7 @@ public class PhoneService2Test {
|
|||
|
||||
@Test
|
||||
public void defineFidByPhoneTest2() {
|
||||
PhoneService2 phoneService = new PhoneService2(phoneRepository);
|
||||
PhoneService phoneService = new PhoneService(phoneRepository);
|
||||
|
||||
fidsDataWithEqualSinceDt.sort(byDbOrder);
|
||||
when(phoneRepository.findFids(any())).thenReturn(fidsDataWithEqualSinceDt2);
|
||||
|
|
@ -69,7 +67,7 @@ public class PhoneService2Test {
|
|||
|
||||
@Test
|
||||
public void defineFidByPhoneTest3() {
|
||||
PhoneService2 phoneService = new PhoneService2(phoneRepository);
|
||||
PhoneService phoneService = new PhoneService(phoneRepository);
|
||||
|
||||
fidsDataWithEqualSinceDt.sort(byDbOrder);
|
||||
when(phoneRepository.findFids(any())).thenReturn(fidsDataWithEqualSinceDt3);
|
||||
|
|
@ -122,7 +120,7 @@ public class PhoneService2Test {
|
|||
|
||||
@Test
|
||||
void defineFidsAndNameByPhoneTest() {
|
||||
PhoneService2 phoneService = new PhoneService2(phoneRepository);
|
||||
PhoneService phoneService = new PhoneService(phoneRepository);
|
||||
|
||||
// fidsDataWithNameEqualSinceDt.sort(byDbOrderWithName);
|
||||
when(phoneRepository.findFidsWithName(any())).thenReturn(fidsDataWithNameEqualSinceDt);
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import org.junit.jupiter.api.Test;
|
|||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.app.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.repository.PhoneRepository;
|
||||
import ru.nbch.credit_tracker.service.indic.PhoneService;
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.app.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.external_response.monitoring_report_error.MonitoringReportErrors;
|
||||
import ru.nbch.credit_tracker.entities.external_response.online_download.Person;
|
||||
import ru.nbch.credit_tracker.entities.external_response.online_download.Persons;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue