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} + + + + + + + + + +