diff --git a/credit-tracker.properties b/credit-tracker.properties index ce9ee21..fc3adf5 100644 --- a/credit-tracker.properties +++ b/credit-tracker.properties @@ -33,4 +33,8 @@ ct.signals-token=gttcHxwcGojoAvZK ct.signals-user=0001ZZ000001 ct.load-dir=D:\\folder_name\\signals -ct.monitoring-interval=15 \ No newline at end of file +# min +ct.monitoring-interval=15 +# days +ct.update-flags-interval=1 +ct.days-to-update-flags=30 \ No newline at end of file diff --git a/src/main/java/ru/nbch/credit_tracker/CreditTrackerApplication.java b/src/main/java/ru/nbch/credit_tracker/CreditTrackerApplication.java index acc8cd1..eb2a0ac 100644 --- a/src/main/java/ru/nbch/credit_tracker/CreditTrackerApplication.java +++ b/src/main/java/ru/nbch/credit_tracker/CreditTrackerApplication.java @@ -3,14 +3,18 @@ package ru.nbch.credit_tracker; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; +import ru.nbch.credit_tracker.service.MonitoringService; +import ru.nbch.credit_tracker.service.UpdatingFlagsService; @SpringBootApplication public class CreditTrackerApplication { public static void main(String[] args) { ConfigurableApplicationContext ctx = SpringApplication.run(CreditTrackerApplication.class, args); -// MonitoringService monitoringService = ctx.getBean(MonitoringService.class); -// monitoringService.run(); // TODO uncomment + MonitoringService monitoringService = ctx.getBean(MonitoringService.class); + UpdatingFlagsService updatingFlagsService = ctx.getBean(UpdatingFlagsService.class); + monitoringService.run(); + updatingFlagsService.run(); } } diff --git a/src/main/java/ru/nbch/credit_tracker/config/settings/CreditTrackerSettings.java b/src/main/java/ru/nbch/credit_tracker/config/settings/CreditTrackerSettings.java index ddb7955..8320097 100644 --- a/src/main/java/ru/nbch/credit_tracker/config/settings/CreditTrackerSettings.java +++ b/src/main/java/ru/nbch/credit_tracker/config/settings/CreditTrackerSettings.java @@ -28,5 +28,7 @@ public class CreditTrackerSettings { private String loadDir; private Long monitoringInterval; + private Long updateFlagsInterval; + private Long daysToUpdateFlags; } 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 bdbe7d8..bb729ca 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java @@ -198,4 +198,18 @@ public class SignalService { mapper.setPackageLastDownloadedReport(id, fileName); } + public List updateFlags(List subjects) { + List fidsPhoneDataList = phoneService.findFidsPhoneData(subjects, true); + LocalDateTime calculatedAt = LocalDateTime.now(); + fidsPhoneDataList.forEach(phoneData -> { + if (phoneData.getFid() != null) { + FlagsService.FlagsFidData flagsData = flagsService.findFlags(phoneData.getFid()); + mapper.registerSubjectsFidAndDebts(phoneData.getId(), phoneData.getFid(), flagsData.getFlagDebt5000(), flagsData.getFlag90days(), calculatedAt); + } else { + mapper.registerSubjectsFidAndDebts(phoneData.getId(), null, null, null, calculatedAt); + } + }); + + return fidsPhoneDataList; + } } diff --git a/src/main/java/ru/nbch/credit_tracker/service/UpdatingFlagsService.java b/src/main/java/ru/nbch/credit_tracker/service/UpdatingFlagsService.java new file mode 100644 index 0000000..0688b78 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/service/UpdatingFlagsService.java @@ -0,0 +1,74 @@ +package ru.nbch.credit_tracker.service; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; +import ru.nbch.credit_tracker.entities.dto.PackageData; +import ru.nbch.credit_tracker.entities.dto.SubjectData; +import ru.nbch.credit_tracker.entities.signal_package.Signals; +import ru.nbch.credit_tracker.enums.Status; +import ru.nbch.credit_tracker.service.indic.PhoneService; +import ru.nbch.credit_tracker.service.signal.SignalRestService; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +@Slf4j +@Service +public class UpdatingFlagsService { + + private final SignalService signalService; + private final SignalRestService signalRestService; + private final Long daysToUpdateFlags; + private final Long updateFlagsInterval; + + public UpdatingFlagsService(SignalService signalService, + SignalRestService signalRestService, + CreditTrackerSettings config) { + this.signalService = signalService; + this.signalRestService = signalRestService; + this.daysToUpdateFlags = config.getDaysToUpdateFlags() != null ? config.getDaysToUpdateFlags() : 1; + this.updateFlagsInterval = config.getUpdateFlagsInterval() != null ? config.getUpdateFlagsInterval() : 1; + } + + public void run() { + ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); + scheduler.scheduleAtFixedRate(this::update, 0, updateFlagsInterval, TimeUnit.DAYS); + } + + private void update() { + List packages = signalService.findPackagesOnMonitoring(); + for (PackageData packageData : packages) { + List subjects = signalService.findFullSubjectsData(packageData.getId()) + .stream().filter(subject -> subject.getCalculatedAt() != null && hasDaysPassed(subject.getCalculatedAt())).toList(); + updateFlags(packageData.getId(), subjects); + } + } + + private void updateFlags(Integer packageId, List subjects) { + try { + signalService.setPackageStatus(packageId, Status.PROCESSING); + List phoneFidsData = signalService.updateFlags(subjects); + if (!phoneFidsData.isEmpty()) { + Signals signals = signalService.buildSignals(packageId, phoneFidsData); + if (signalRestService.update(signals)) { + signalService.setPackageStatus(packageId, Status.ON_MONITORING); + } else { + signalService.setPackageStatus(packageId, Status.ERROR); + } + } + } catch (Exception e) { + log.error("Ошибка при поиске фидов или перерасчете флагов просрочек. Package_id {}", packageId, e); + } + } + + private boolean hasDaysPassed(LocalDateTime pastDateTime) { + LocalDateTime now = LocalDateTime.now(); + long daysPassed = ChronoUnit.DAYS.between(pastDateTime, now); + return daysPassed >= daysToUpdateFlags; + } +} 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 f456f22..f653e17 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 @@ -20,12 +20,18 @@ public class PhoneService { } public List findFidsPhoneData(List subjects) { + return findFidsPhoneData(subjects, false); + } + + public List findFidsPhoneData(List subjects, boolean processNullFids) { List fidsPhoneDataList = new ArrayList<>(); subjects.forEach(subject -> { String phone = "9" + subject.getPhone(); Integer fid = mapper.findFidByNumber(phone); if (fid != null) { fidsPhoneDataList.add(new FidsPhoneData(subject.getId(), fid, phone, subject.getSubjectId())); + } else if (processNullFids) { + fidsPhoneDataList.add(new FidsPhoneData(subject.getId(), null, phone, subject.getSubjectId())); } }); return fidsPhoneDataList;