diff --git a/pom.xml b/pom.xml
index dc2df27..276e164 100644
--- a/pom.xml
+++ b/pom.xml
@@ -300,6 +300,25 @@
+
+ build-monitoring-test
+ package
+
+ repackage
+
+
+ ru.nbch.credit_tracker.service.mode.test_monitoring.CTMonitoringTestApplication
+ monitoring-test
+ true
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
build-migration
package
diff --git a/src/main/java/ru/nbch/credit_tracker/mapper/signal/PackagesRecordsMapper.java b/src/main/java/ru/nbch/credit_tracker/mapper/signal/PackagesRecordsMapper.java
index cd518dd..8c52eed 100644
--- a/src/main/java/ru/nbch/credit_tracker/mapper/signal/PackagesRecordsMapper.java
+++ b/src/main/java/ru/nbch/credit_tracker/mapper/signal/PackagesRecordsMapper.java
@@ -3,6 +3,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.app.PackagesRecordsMap;
+import ru.nbch.credit_tracker.model.UserPackagePhoneData;
import java.util.List;
@@ -18,7 +19,13 @@ public interface PackagesRecordsMapper {
List uniquePackageIdByPhones(@Param("json") String json);
+ List selectUserPackagePhoneData(@Param("json") String json);
+
Long deleteByPackageId(@Param("packageId") Long id);
PackagesRecordsMap findById(Long id);
+
+ List findByPhone(@Param("phone") Long phone);
+
+ List findByPhones(@Param("phones") List phones);
}
diff --git a/src/main/java/ru/nbch/credit_tracker/mapper/signal/PhonesMapMapper.java b/src/main/java/ru/nbch/credit_tracker/mapper/signal/PhonesMapMapper.java
index 42e2ccf..29da604 100644
--- a/src/main/java/ru/nbch/credit_tracker/mapper/signal/PhonesMapMapper.java
+++ b/src/main/java/ru/nbch/credit_tracker/mapper/signal/PhonesMapMapper.java
@@ -37,4 +37,8 @@ public interface PhonesMapMapper {
void registerJson(@Param("json") String json);
void deleteUnusedPhones();
+
+ List findByFid(@Param("fid") Integer fid);
+
+ List findByFids(@Param("fids") List fids);
}
diff --git a/src/main/java/ru/nbch/credit_tracker/model/UserPackagePhoneData.java b/src/main/java/ru/nbch/credit_tracker/model/UserPackagePhoneData.java
new file mode 100644
index 0000000..3d62951
--- /dev/null
+++ b/src/main/java/ru/nbch/credit_tracker/model/UserPackagePhoneData.java
@@ -0,0 +1,15 @@
+package ru.nbch.credit_tracker.model;
+
+import lombok.*;
+
+@Getter
+@Setter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserPackagePhoneData {
+ private Long packageId;
+ private String signalTypes;
+ private Long phone;
+ private String subjectId;
+}
diff --git a/src/main/java/ru/nbch/credit_tracker/service/mode/test_monitoring/CTMonitoringTestApplication.java b/src/main/java/ru/nbch/credit_tracker/service/mode/test_monitoring/CTMonitoringTestApplication.java
new file mode 100644
index 0000000..8c554b5
--- /dev/null
+++ b/src/main/java/ru/nbch/credit_tracker/service/mode/test_monitoring/CTMonitoringTestApplication.java
@@ -0,0 +1,33 @@
+package ru.nbch.credit_tracker.service.mode.test_monitoring;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.WebApplicationType;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.FilterType;
+
+@SpringBootApplication
+@ComponentScan(
+ value = {"ru.nbch.credit_tracker"},
+ excludeFilters = {
+ @ComponentScan.Filter(
+ type = FilterType.REGEX,
+ pattern = {
+ "ru\\.nbch\\.credit_tracker\\.service\\.mode\\.common..*",
+ "ru\\.nbch\\.credit_tracker\\.service\\.mode\\.migration..*",
+ "ru\\.nbch\\.credit_tracker\\.service\\.mode\\.monitoring..*"
+ }
+ )
+ }
+)
+public class CTMonitoringTestApplication {
+ public static void main(String[] args) throws JsonProcessingException {
+ SpringApplication application = new SpringApplication(CTMonitoringTestApplication.class);
+ application.setWebApplicationType(WebApplicationType.NONE);
+ ConfigurableApplicationContext ctx = application.run(args);
+ MonitoringService monitoringService = ctx.getBean(MonitoringService.class);
+ monitoringService.run();
+ }
+}
diff --git a/src/main/java/ru/nbch/credit_tracker/service/mode/test_monitoring/MonitoringService.java b/src/main/java/ru/nbch/credit_tracker/service/mode/test_monitoring/MonitoringService.java
new file mode 100644
index 0000000..12b8f35
--- /dev/null
+++ b/src/main/java/ru/nbch/credit_tracker/service/mode/test_monitoring/MonitoringService.java
@@ -0,0 +1,110 @@
+package ru.nbch.credit_tracker.service.mode.test_monitoring;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import ru.nbch.credit_tracker.entities.app.PackagesRecordsMap;
+import ru.nbch.credit_tracker.entities.app.PhonesMap;
+import ru.nbch.credit_tracker.entities.app.UserPackage;
+import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper;
+import ru.nbch.credit_tracker.model.UserPackagePhoneData;
+import ru.nbch.credit_tracker.service.signal.PackageRecordsService;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * Сервис периодического опроса официального сервиса сигналов на наличие новых отчетов по пакетам находящимся в статусе ON_MONITORING
+ */
+@Slf4j
+@Service
+public class MonitoringService {
+
+ private final PackageRecordsService packageRecordsService;
+ private final UserPackageMapper userPackageMapper;
+
+ public MonitoringService(PackageRecordsService packageRecordsService,
+ UserPackageMapper userPackageMapper) {
+ this.packageRecordsService = packageRecordsService;
+ this.userPackageMapper = userPackageMapper;
+ }
+
+ public void run() {
+ List fids = new ArrayList<>();
+
+ for (int i = 1000; i < 2000; i++) {
+ fids.add(i);
+ }
+
+ fids.add(114885613);
+ fids.add(16445000);
+ fids.add(114829813);
+ fids.add(109837221);
+ fids.add(108550768);
+ fids.add(108546145);
+ fids.add(111098278);
+
+
+ long start = System.currentTimeMillis();
+ log.info("Start selecting by one");
+ monitorByOne(fids);
+ log.info("Finish selecting by one. Time: {} ms", System.currentTimeMillis() - start);
+
+ start = System.currentTimeMillis();
+ log.info("Start selecting by batch");
+ monitorbyBatch(fids);
+ log.info("Finish selecting by bacth. Time: {} ms", System.currentTimeMillis() - start);
+ }
+
+ private void monitorByOne(List fids) {
+ for (Integer fid : fids) {
+ List phonesMaps = packageRecordsService.findCachedByFid(fid);
+ for (PhonesMap phonesMap : phonesMaps) {
+ if (phonesMap != null) {
+ Long clientId = phonesMap.getPhone();
+ Integer flagDebt5000 = phonesMap.getFlagDebt5000();
+ Integer flag90days = phonesMap.getFlag90days();
+ List packageRecords = packageRecordsService.findByPhone(clientId);
+ for (PackagesRecordsMap packageRecord : packageRecords) {
+ Long packageId = packageRecord.getPackageId();
+ String subjectId = packageRecord.getSubjectId();
+ UserPackage userPackage = userPackageMapper.findPackage(packageId);
+ String status = userPackage.getStatus();
+ String signalTypes = userPackage.getSignalTypes();
+
+ // проверить статус ON_MPNITORING + разрешенные signalTypes
+ }
+ }
+ }
+ }
+ }
+
+ private void monitorbyBatch(List fids) {
+ List phonesMaps = packageRecordsService.findCachedByFids(fids);
+ // key: phone; value: флаги просрочек
+ Map phonesDataMap = phonesMaps.stream()
+ .collect(
+ Collectors.toMap(PhonesMap::getPhone, Function.identity())
+ );
+
+ // subjectId, packageId, signalTypes, phone только для статуса ON_MONITORING
+ List userPackagePhoneDataList = packageRecordsService
+ .selectUserPackagePhoneData(phonesDataMap.keySet());
+
+ // остались только нужные номера, те что не вошли в userPackagePhoneDataList игнорируются
+ for (UserPackagePhoneData userPackagePhoneData : userPackagePhoneDataList) {
+ Long clientId = userPackagePhoneData.getPhone();
+ String subjectId = userPackagePhoneData.getSubjectId();
+ String signalTypes = userPackagePhoneData.getSignalTypes();
+
+ PhonesMap phonesMap = phonesDataMap.get(clientId);
+ Integer flagDebt5000 = phonesMap.getFlagDebt5000();
+ Integer flag90days = phonesMap.getFlag90days();
+
+ // проверить разрешенные signalTypes
+ }
+ }
+
+}
diff --git a/src/main/java/ru/nbch/credit_tracker/service/signal/PackageRecordsService.java b/src/main/java/ru/nbch/credit_tracker/service/signal/PackageRecordsService.java
index 63949d5..a480c2d 100644
--- a/src/main/java/ru/nbch/credit_tracker/service/signal/PackageRecordsService.java
+++ b/src/main/java/ru/nbch/credit_tracker/service/signal/PackageRecordsService.java
@@ -11,11 +11,9 @@ import ru.nbch.credit_tracker.mapper.signal.PhonesMapMapper;
import ru.nbch.credit_tracker.model.FlagData;
import ru.nbch.credit_tracker.model.IdData;
import ru.nbch.credit_tracker.model.SubjectProfile;
+import ru.nbch.credit_tracker.model.UserPackagePhoneData;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -84,6 +82,19 @@ public class PackageRecordsService {
}
}
+ public List selectUserPackagePhoneData(Set phones) {
+ try {
+ String json = entityToJsonMapper.writeValueAsString(phones.stream()
+ .filter(Objects::nonNull)
+ .map(phone -> new HashMap() {{
+ put("phone", phone);
+ }}).toList());
+ return packagesRecordsMapper.selectUserPackagePhoneData(json);
+ } catch (JsonProcessingException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
public void updateIdCache(List idData) {
try {
String json = entityToJsonMapper.writeValueAsString(idData.stream()
@@ -121,4 +132,20 @@ public class PackageRecordsService {
public PackagesRecordsMap findPackageRecordsById(Long id) {
return packagesRecordsMapper.findById(id);
}
+
+ public List findCachedByFid(Integer fid) {
+ return phonesMapMapper.findByFid(fid);
+ }
+
+ public List findCachedByFids(List fids) {
+ return phonesMapMapper.findByFids(fids);
+ }
+
+ public List findByPhone(Long phone) {
+ return packagesRecordsMapper.findByPhone(phone);
+ }
+
+ public List findByPhones(List phones) {
+ return phones.isEmpty() ? Collections.emptyList() : packagesRecordsMapper.findByPhones(phones);
+ }
}
diff --git a/src/main/resources/mybatis/mapper/signal/PackageRecordsMapper.xml b/src/main/resources/mybatis/mapper/signal/PackageRecordsMapper.xml
index 4f3f22b..d4d5959 100644
--- a/src/main/resources/mybatis/mapper/signal/PackageRecordsMapper.xml
+++ b/src/main/resources/mybatis/mapper/signal/PackageRecordsMapper.xml
@@ -23,6 +23,29 @@
WHERE id = #{id}
+
+
+
+
+
+
+
+
+
+