Added updating fids and flags

This commit is contained in:
Mikhail Trofimov 2025-06-25 13:18:46 +03:00
parent 7f9d682ece
commit d85f97a025
6 changed files with 107 additions and 3 deletions

View file

@ -33,4 +33,8 @@ ct.signals-token=gttcHxwcGojoAvZK
ct.signals-user=0001ZZ000001 ct.signals-user=0001ZZ000001
ct.load-dir=D:\\folder_name\\signals ct.load-dir=D:\\folder_name\\signals
# min
ct.monitoring-interval=15 ct.monitoring-interval=15
# days
ct.update-flags-interval=1
ct.days-to-update-flags=30

View file

@ -3,14 +3,18 @@ package ru.nbch.credit_tracker;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import ru.nbch.credit_tracker.service.MonitoringService;
import ru.nbch.credit_tracker.service.UpdatingFlagsService;
@SpringBootApplication @SpringBootApplication
public class CreditTrackerApplication { public class CreditTrackerApplication {
public static void main(String[] args) { public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(CreditTrackerApplication.class, args); ConfigurableApplicationContext ctx = SpringApplication.run(CreditTrackerApplication.class, args);
// MonitoringService monitoringService = ctx.getBean(MonitoringService.class); MonitoringService monitoringService = ctx.getBean(MonitoringService.class);
// monitoringService.run(); // TODO uncomment UpdatingFlagsService updatingFlagsService = ctx.getBean(UpdatingFlagsService.class);
monitoringService.run();
updatingFlagsService.run();
} }
} }

View file

@ -28,5 +28,7 @@ public class CreditTrackerSettings {
private String loadDir; private String loadDir;
private Long monitoringInterval; private Long monitoringInterval;
private Long updateFlagsInterval;
private Long daysToUpdateFlags;
} }

View file

@ -198,4 +198,18 @@ public class SignalService {
mapper.setPackageLastDownloadedReport(id, fileName); mapper.setPackageLastDownloadedReport(id, fileName);
} }
public List<PhoneService.FidsPhoneData> updateFlags(List<SubjectData> subjects) {
List<PhoneService.FidsPhoneData> 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;
}
} }

View file

@ -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<PackageData> packages = signalService.findPackagesOnMonitoring();
for (PackageData packageData : packages) {
List<SubjectData> 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<SubjectData> subjects) {
try {
signalService.setPackageStatus(packageId, Status.PROCESSING);
List<PhoneService.FidsPhoneData> 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;
}
}

View file

@ -20,12 +20,18 @@ public class PhoneService {
} }
public List<FidsPhoneData> findFidsPhoneData(List<SubjectData> subjects) { public List<FidsPhoneData> findFidsPhoneData(List<SubjectData> subjects) {
return findFidsPhoneData(subjects, false);
}
public List<FidsPhoneData> findFidsPhoneData(List<SubjectData> subjects, boolean processNullFids) {
List<FidsPhoneData> fidsPhoneDataList = new ArrayList<>(); List<FidsPhoneData> fidsPhoneDataList = new ArrayList<>();
subjects.forEach(subject -> { subjects.forEach(subject -> {
String phone = "9" + subject.getPhone(); String phone = "9" + subject.getPhone();
Integer fid = mapper.findFidByNumber(phone); Integer fid = mapper.findFidByNumber(phone);
if (fid != null) { if (fid != null) {
fidsPhoneDataList.add(new FidsPhoneData(subject.getId(), fid, phone, subject.getSubjectId())); 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; return fidsPhoneDataList;