diff --git a/src/main/java/ru/nbch/credit_tracker/config/mdc/MdcAspect.java b/src/main/java/ru/nbch/credit_tracker/config/mdc/MdcAspect.java index 798f398..756dc01 100644 --- a/src/main/java/ru/nbch/credit_tracker/config/mdc/MdcAspect.java +++ b/src/main/java/ru/nbch/credit_tracker/config/mdc/MdcAspect.java @@ -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 diff --git a/src/main/java/ru/nbch/credit_tracker/controller/SignalController.java b/src/main/java/ru/nbch/credit_tracker/controller/SignalController.java deleted file mode 100644 index cb7037b..0000000 --- a/src/main/java/ru/nbch/credit_tracker/controller/SignalController.java +++ /dev/null @@ -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 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 findActivePackages(@RequestBody MonitoringActivePackagesRequest activePackagesRequest) { - return signalFacade.findActivePackages(activePackagesRequest); - } - - @PostMapping(value = "/all_packages", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE) - public ResponseEntity findAllPackages(@RequestBody MonitoringAllPackagesRequest allPackagesRequest) { - return signalFacade.findAllPackages(allPackagesRequest); - } - - @PostMapping(value = "/delete", params = {"username", "packageName"}, produces = MediaType.APPLICATION_XML_VALUE) - public ResponseEntity 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 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 downloadFile(@RequestParam("file") String file) { - return signalFacade.downloadFile(file); - } - -} - diff --git a/src/main/java/ru/nbch/credit_tracker/controller/SignalControllerV2.java b/src/main/java/ru/nbch/credit_tracker/controller/SignalControllerV2.java deleted file mode 100644 index bc2a397..0000000 --- a/src/main/java/ru/nbch/credit_tracker/controller/SignalControllerV2.java +++ /dev/null @@ -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 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 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 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); - } -} - diff --git a/src/main/java/ru/nbch/credit_tracker/controller/SignalControllerV3.java b/src/main/java/ru/nbch/credit_tracker/controller/SignalControllerV3.java index 7a86f42..e26930b 100644 --- a/src/main/java/ru/nbch/credit_tracker/controller/SignalControllerV3.java +++ b/src/main/java/ru/nbch/credit_tracker/controller/SignalControllerV3.java @@ -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 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 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 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; diff --git a/src/main/java/ru/nbch/credit_tracker/entities/dto/Hit.java b/src/main/java/ru/nbch/credit_tracker/entities/app/Hit.java similarity index 87% rename from src/main/java/ru/nbch/credit_tracker/entities/dto/Hit.java rename to src/main/java/ru/nbch/credit_tracker/entities/app/Hit.java index e0ed9af..9dd566c 100644 --- a/src/main/java/ru/nbch/credit_tracker/entities/dto/Hit.java +++ b/src/main/java/ru/nbch/credit_tracker/entities/app/Hit.java @@ -1,4 +1,4 @@ -package ru.nbch.credit_tracker.entities.dto; +package ru.nbch.credit_tracker.entities.app; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/ru/nbch/credit_tracker/entities/dto/PhoneFidMap.java b/src/main/java/ru/nbch/credit_tracker/entities/app/PhoneFidMap.java similarity index 95% rename from src/main/java/ru/nbch/credit_tracker/entities/dto/PhoneFidMap.java rename to src/main/java/ru/nbch/credit_tracker/entities/app/PhoneFidMap.java index 0214be5..bc2a232 100644 --- a/src/main/java/ru/nbch/credit_tracker/entities/dto/PhoneFidMap.java +++ b/src/main/java/ru/nbch/credit_tracker/entities/app/PhoneFidMap.java @@ -1,4 +1,4 @@ -package ru.nbch.credit_tracker.entities.dto; +package ru.nbch.credit_tracker.entities.app; import java.util.UUID; import lombok.*; diff --git a/src/main/java/ru/nbch/credit_tracker/entities/dto/UserPackage.java b/src/main/java/ru/nbch/credit_tracker/entities/app/UserPackage.java similarity index 90% rename from src/main/java/ru/nbch/credit_tracker/entities/dto/UserPackage.java rename to src/main/java/ru/nbch/credit_tracker/entities/app/UserPackage.java index 9f7db86..2fbac8a 100644 --- a/src/main/java/ru/nbch/credit_tracker/entities/dto/UserPackage.java +++ b/src/main/java/ru/nbch/credit_tracker/entities/app/UserPackage.java @@ -1,4 +1,4 @@ -package ru.nbch.credit_tracker.entities.dto; +package ru.nbch.credit_tracker.entities.app; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/ru/nbch/credit_tracker/entities/dto/SubjectProfileForSignal.java b/src/main/java/ru/nbch/credit_tracker/entities/dto/SubjectProfileForSignal.java deleted file mode 100644 index a51f088..0000000 --- a/src/main/java/ru/nbch/credit_tracker/entities/dto/SubjectProfileForSignal.java +++ /dev/null @@ -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; -} diff --git a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java deleted file mode 100644 index b44a1c6..0000000 --- a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java +++ /dev/null @@ -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 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 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 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 findActivePackages(MonitoringActivePackagesRequest activePackagesRequest) { - try { - AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(activePackagesRequest.getUserId(), activePackagesRequest.getPassword()); - if (!authResult.isSuccess()) { - throw clientExcp(authResult.getError(), XmlErrorFormat.MonitoringActivePackagesError); - } - List 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 findAllPackages(MonitoringAllPackagesRequest allPackagesRequest) { - try { - AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(allPackagesRequest.getUserId(), allPackagesRequest.getPassword()); - if (!authResult.isSuccess()) { - throw clientExcp(authResult.getError(), XmlErrorFormat.MonitoringAllPackagesError); - } - List 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 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 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 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; - } -} diff --git a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacadeV2.java b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacadeV2.java deleted file mode 100644 index 264aca5..0000000 --- a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacadeV2.java +++ /dev/null @@ -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 findActivePackages(MonitoringActivePackagesRequest activePackagesRequest) throws Exception { - AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(activePackagesRequest.getUserId(), activePackagesRequest.getPassword()); - if (!authResult.isSuccess()) { - throw clientExcp(authResult.getError(), XmlErrorFormat.MonitoringActivePackagesError); - } - - List 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 findAllPackages(MonitoringAllPackagesRequest allPackagesRequest) throws Exception { - AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(allPackagesRequest.getUserId(), allPackagesRequest.getPassword()); - if (!authResult.isSuccess()) { - throw clientExcp(authResult.getError(), XmlErrorFormat.MonitoringAllPackagesError); - } - - List 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); - } -} diff --git a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacadeV3.java b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacadeV3.java index f16c935..9f85af3 100644 --- a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacadeV3.java +++ b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacadeV3.java @@ -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 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 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 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); + } + } } diff --git a/src/main/java/ru/nbch/credit_tracker/mapper/signal/HitsMapper.java b/src/main/java/ru/nbch/credit_tracker/mapper/signal/HitsMapper.java index 7333e25..6c3796b 100644 --- a/src/main/java/ru/nbch/credit_tracker/mapper/signal/HitsMapper.java +++ b/src/main/java/ru/nbch/credit_tracker/mapper/signal/HitsMapper.java @@ -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; diff --git a/src/main/java/ru/nbch/credit_tracker/mapper/signal/PhoneFidMapMapper.java b/src/main/java/ru/nbch/credit_tracker/mapper/signal/PhoneFidMapMapper.java index 6daadbd..3c2f8a9 100644 --- a/src/main/java/ru/nbch/credit_tracker/mapper/signal/PhoneFidMapMapper.java +++ b/src/main/java/ru/nbch/credit_tracker/mapper/signal/PhoneFidMapMapper.java @@ -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; diff --git a/src/main/java/ru/nbch/credit_tracker/mapper/signal/UserPackageMapper.java b/src/main/java/ru/nbch/credit_tracker/mapper/signal/UserPackageMapper.java index e2f8b46..fe66f6a 100644 --- a/src/main/java/ru/nbch/credit_tracker/mapper/signal/UserPackageMapper.java +++ b/src/main/java/ru/nbch/credit_tracker/mapper/signal/UserPackageMapper.java @@ -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; diff --git a/src/main/java/ru/nbch/credit_tracker/model/FlagsPayload.java b/src/main/java/ru/nbch/credit_tracker/model/FlagsPayload.java index ed4f160..89bb7c1 100644 --- a/src/main/java/ru/nbch/credit_tracker/model/FlagsPayload.java +++ b/src/main/java/ru/nbch/credit_tracker/model/FlagsPayload.java @@ -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; diff --git a/src/main/java/ru/nbch/credit_tracker/model/SubjectsProfilePayloadV2.java b/src/main/java/ru/nbch/credit_tracker/model/SubjectsProfilePayloadV2.java deleted file mode 100644 index bede3c9..0000000 --- a/src/main/java/ru/nbch/credit_tracker/model/SubjectsProfilePayloadV2.java +++ /dev/null @@ -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 subjectProfiles; - private final boolean poison; - - public SubjectsProfilePayloadV2(boolean poison) { - this.packageId = null; - this.subjectProfiles = null; - this.poison = poison; - } - - public SubjectsProfilePayloadV2(Long packageId, List subjectProfiles) { - this.packageId = packageId; - this.subjectProfiles = subjectProfiles; - this.poison = false; - } - - public Long getPackageId() { - return packageId; - } - - public List getSubjectProfiles() { - return subjectProfiles; - } - - @Override - public boolean isPoison() { - return poison; - } -} diff --git a/src/main/java/ru/nbch/credit_tracker/service/MonitoringErrorProcesingService.java b/src/main/java/ru/nbch/credit_tracker/service/MonitoringErrorProcesingService.java index edd41d4..a82a9c9 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/MonitoringErrorProcesingService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/MonitoringErrorProcesingService.java @@ -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; diff --git a/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java b/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java index 6d17ba4..263b96c 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java @@ -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; diff --git a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java index a60fe35..a3a93be 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java @@ -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 fidsMapByBatch = phoneService2.defineFidsAndNameByPhone(batch); + Map fidsMapByBatch = phoneService.defineFidsAndNameByPhone(batch); // TODO process fidsMapByBatch here } offset += batchSize; @@ -160,7 +162,7 @@ public class SignalService { } if (!filteredItems.isEmpty()) { - Map fidsMapByBatch = phoneService2.defineFidByPhone(filteredItems); + Map fidsMapByBatch = phoneService.defineFidByPhone(filteredItems); phoneService.defineFidByPhone(filteredItems); log.debug("Actual fids size by phone's batch: {}", fidsMapByBatch.size()); diff --git a/src/main/java/ru/nbch/credit_tracker/service/SignalServiceV2.java b/src/main/java/ru/nbch/credit_tracker/service/SignalServiceV2.java new file mode 100644 index 0000000..7436eac --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/service/SignalServiceV2.java @@ -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 findActivePackages(String userId) { + return userPackageService.findUserPackages(userId, Status.ON_MONITORING); + } + + public List 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); + } +} diff --git a/src/main/java/ru/nbch/credit_tracker/service/UpdateProcessingPackagesService.java b/src/main/java/ru/nbch/credit_tracker/service/UpdateProcessingPackagesService.java index 81506d5..25c38a3 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/UpdateProcessingPackagesService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/UpdateProcessingPackagesService.java @@ -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; diff --git a/src/main/java/ru/nbch/credit_tracker/service/UpdatingFlagsService.java b/src/main/java/ru/nbch/credit_tracker/service/UpdatingFlagsService.java index a62e62e..dace278 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/UpdatingFlagsService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/UpdatingFlagsService.java @@ -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; diff --git a/src/main/java/ru/nbch/credit_tracker/service/indic/FlagsService2.java b/src/main/java/ru/nbch/credit_tracker/service/indic/FlagsService2.java index d9ff5c2..7cdef61 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/indic/FlagsService2.java +++ b/src/main/java/ru/nbch/credit_tracker/service/indic/FlagsService2.java @@ -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; diff --git a/src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java b/src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java index 53fa4ca..b18f4bf 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java @@ -110,7 +110,6 @@ public class PersonService { .fileSinceDate(passport.getFileSinceDate()) .build(); subjectProfile.setIdData(idProfile); -// subjectProfile.setFilled(isRequiredPassportDataPresent(passport)); } }); } diff --git a/src/main/java/ru/nbch/credit_tracker/service/indic/PersonServiceV2.java b/src/main/java/ru/nbch/credit_tracker/service/indic/PersonServiceV2.java new file mode 100644 index 0000000..78f3538 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/service/indic/PersonServiceV2.java @@ -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 subjectProfiles) { + List fids = subjectProfiles.stream().map(SubjectProfile::getFid).collect(Collectors.toList()); + if (fids.isEmpty()) { + return; + } + List passports = mapper.findPassportData(fids); + + Map> 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 passports) { + if (passports == null || passports.isEmpty()) { + return null; + } + List 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)); + } + +} diff --git a/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService.java b/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService.java index 814af62..bcda9e4 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService.java @@ -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 subjects) { + List phones = subjects.stream(). + map(subject -> "9" + subject.getPhone()) + .toList(); + + subjects.sort( + Comparator.comparing( + PhoneFidMap::getPhone, + Comparator.naturalOrder() + ) + ); + + List phonesByFid = phoneRepository.findFidsWithName(phones); + + log.debug("Start merging fids and names"); + Map> fidFidsDataMap = phonesByFid.stream() + .collect(Collectors.groupingBy(PhoneRepository.FidsDataWithName::getFid)); + + Map 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 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 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 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 merger2(List subjects, List phonesByFid) { + Map phoneFidMap = new HashMap<>(); + Iterator 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 defineFidsAndNameByPhone(List subjects) { + Map phoneFidMap = new HashMap<>(); + + List phones = subjects.stream(). + map(subject -> "9" + subject.getPhone()) + .toList(); + + subjects.sort( + Comparator.comparing( + PhoneFidMap::getPhone, + Comparator.naturalOrder() + ) + ); + + List phonesByFid = phoneRepository.findFidsWithName(phones); + + log.debug("Start merging fids and names"); + Map> fidFidsDataMap = phonesByFid.stream() + .collect(Collectors.groupingBy(PhoneRepository.FidsDataWithName::getFid)); + + Map 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 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; + } } diff --git a/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService2.java b/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService2.java index efb33ec..43414d2 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService2.java +++ b/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService2.java @@ -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 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 defineFidByPhone(List subjects) { - Map phoneFidMap = new HashMap<>(); - - List phones = subjects.stream(). - map(subject -> "9" + subject.getPhone()) - .toList(); - - subjects.sort( - Comparator.comparing( - PhoneFidMap::getPhone, - Comparator.naturalOrder() - ) - ); - - List phonesByFid = phoneRepository.findFids(phones); - - log.debug("Start merging fids 2"); - Map 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 subjects) { - List phones = subjects.stream(). - map(subject -> "9" + subject.getPhone()) - .toList(); - - subjects.sort( - Comparator.comparing( - PhoneFidMap::getPhone, - Comparator.naturalOrder() - ) - ); - - List phonesByFid = phoneRepository.findFidsWithName(phones); - - log.debug("Start merging fids and names"); - Map> fidFidsDataMap = phonesByFid.stream() - .collect(Collectors.groupingBy(PhoneRepository.FidsDataWithName::getFid)); - - Map 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 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 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 defineFidsAndNameByPhone(List subjects) { - Map phoneFidMap = new HashMap<>(); - - List phones = subjects.stream(). - map(subject -> "9" + subject.getPhone()) - .toList(); - - subjects.sort( - Comparator.comparing( - PhoneFidMap::getPhone, - Comparator.naturalOrder() - ) - ); - - List phonesByFid = phoneRepository.findFidsWithName(phones); - - log.debug("Start merging fids and names"); - Map> fidFidsDataMap = phonesByFid.stream() - .collect(Collectors.groupingBy(PhoneRepository.FidsDataWithName::getFid)); - - Map 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 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 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 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 merger(List subjects, List phonesByFid) { - Map phoneFidMap = new HashMap<>(); - Iterator 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; - } - } diff --git a/src/main/java/ru/nbch/credit_tracker/service/signal/HitsService.java b/src/main/java/ru/nbch/credit_tracker/service/signal/HitsService.java index 5d319d3..bf9519d 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/signal/HitsService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/signal/HitsService.java @@ -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; diff --git a/src/main/java/ru/nbch/credit_tracker/service/signal/PhoneFidMapService.java b/src/main/java/ru/nbch/credit_tracker/service/signal/PhoneFidMapService.java index e3b8fe7..642c23c 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/signal/PhoneFidMapService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/signal/PhoneFidMapService.java @@ -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; diff --git a/src/main/java/ru/nbch/credit_tracker/service/signal/UserPackageService.java b/src/main/java/ru/nbch/credit_tracker/service/signal/UserPackageService.java index b38ec4c..3ab9be9 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/signal/UserPackageService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/signal/UserPackageService.java @@ -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; diff --git a/src/main/java/ru/nbch/credit_tracker/service/task/PipelinePackageManager.java b/src/main/java/ru/nbch/credit_tracker/service/task/PipelinePackageManager.java index 634478e..0471ea6 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/task/PipelinePackageManager.java +++ b/src/main/java/ru/nbch/credit_tracker/service/task/PipelinePackageManager.java @@ -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 saveSubjectQueue = saveSubjectQueueFactory.getObject(); - BlockingQueue idEnricherQueue = idEnricherQueueFactory.getObject(); - - Stage 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 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"); } diff --git a/src/main/java/ru/nbch/credit_tracker/service/task/impl/dprctd/FidIdEnricher.java b/src/main/java/ru/nbch/credit_tracker/service/task/impl/dprctd/FidIdEnricher.java index 463c4c1..5faabc6 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/task/impl/dprctd/FidIdEnricher.java +++ b/src/main/java/ru/nbch/credit_tracker/service/task/impl/dprctd/FidIdEnricher.java @@ -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 { - private final PersonService personService; - private final SignalService signalService; + private final PersonServiceV2 personService; private final CreditTrackerSettings config; -// private final BlockingQueue mergerQueue; - public FidIdEnricher(PersonService personService, - SignalService signalService, - CreditTrackerSettings config//, - /*BlockingQueue 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 -{ - private final Handler dispatcher; - private final BlockingQueue in; - private final BlockingQueue out; - private final Z POISON; - private final ExecutorService ioPool; - - public StageForDeletion(Handler dispatcher, - BlockingQueue in, - BlockingQueue out, - Z POISON) { - this.dispatcher = dispatcher; - this.in = in; - this.out = out; - this.ioPool = Executors.newFixedThreadPool(10); - this.POISON = POISON; - } - - public void start() { - List> 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 f : inflight) { - putQuiet(out, f.get()); - } - putQuiet(out, POISON); - return; - } - - Future 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> fs, BlockingQueue out) throws Exception { - Iterator> it = fs.iterator(); - while (it.hasNext()) { - Future f = it.next(); - if (f.isDone()) { - putQuiet(out, f.get()); - it.remove(); - } - } - } - - void drainAll(List> fs, BlockingQueue out) { - for (Future 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 q, Z b) { - try { - q.put(b); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } - - X takeQuiet(BlockingQueue 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; - } -} diff --git a/src/main/resources/mybatis/mapper/signal/PhoneFidMapMapper.xml b/src/main/resources/mybatis/mapper/signal/PhoneFidMapMapper.xml index 20b7462..4b7d386 100644 --- a/src/main/resources/mybatis/mapper/signal/PhoneFidMapMapper.xml +++ b/src/main/resources/mybatis/mapper/signal/PhoneFidMapMapper.xml @@ -5,7 +5,7 @@ - + @@ -58,7 +58,7 @@ - + UPDATE signals_phone_fid_map SET package_id = #{subject.packageId}, @@ -106,7 +106,7 @@ LIMIT #{limit} OFFSET #{offset} - SELECT id, package_id, subject_id, diff --git a/src/main/resources/mybatis/mapper/signal/UserPackageMapper.xml b/src/main/resources/mybatis/mapper/signal/UserPackageMapper.xml index 35de117..2df1710 100644 --- a/src/main/resources/mybatis/mapper/signal/UserPackageMapper.xml +++ b/src/main/resources/mybatis/mapper/signal/UserPackageMapper.xml @@ -5,7 +5,7 @@ - + @@ -53,7 +53,7 @@ @@ -77,7 +77,7 @@