diff --git a/src/main/java/ru/nbch/credit_tracker/entities/nbch/Source.java b/src/main/java/ru/nbch/credit_tracker/entities/nbch/Source.java new file mode 100644 index 0000000..54568e1 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/nbch/Source.java @@ -0,0 +1,13 @@ +package ru.nbch.credit_tracker.entities.nbch; + +import lombok.*; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Source { + private String memberCode; + private String category; +} diff --git a/src/main/java/ru/nbch/credit_tracker/mapper/nbch/SourceMapper.java b/src/main/java/ru/nbch/credit_tracker/mapper/nbch/SourceMapper.java index 2c7e1d9..2b2b8cb 100644 --- a/src/main/java/ru/nbch/credit_tracker/mapper/nbch/SourceMapper.java +++ b/src/main/java/ru/nbch/credit_tracker/mapper/nbch/SourceMapper.java @@ -2,11 +2,15 @@ package ru.nbch.credit_tracker.mapper.nbch; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import ru.nbch.credit_tracker.entities.nbch.Source; import java.util.List; @Mapper public interface SourceMapper { - List findBusCategories(@Param("memberCodes") List memberCodes); + List findBusCategories(@Param("memberCodes") List memberCodes); + + String findBusCategory(@Param("memberCode") String memberCode); + } diff --git a/src/main/java/ru/nbch/credit_tracker/service/mode/monitoring/MonitoringService.java b/src/main/java/ru/nbch/credit_tracker/service/mode/monitoring/MonitoringService.java index b6c32cc..732d4ba 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/mode/monitoring/MonitoringService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/mode/monitoring/MonitoringService.java @@ -1,5 +1,7 @@ package ru.nbch.credit_tracker.service.mode.monitoring; +import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.slf4j.MDC; @@ -21,6 +23,7 @@ import ru.nbch.credit_tracker.entities.user_response.monitoring_signal_response. import ru.nbch.credit_tracker.enums.Status; import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper; import ru.nbch.credit_tracker.model.UserPackagePhoneData; +import ru.nbch.credit_tracker.service.nbch.SourceService; import ru.nbch.credit_tracker.service.signal.HitsService; import ru.nbch.credit_tracker.service.signal.PackageRecordsService; import ru.nbch.credit_tracker.service.signal.SignalRestService; @@ -39,7 +42,6 @@ import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Function; import java.util.stream.Collectors; /** @@ -54,42 +56,64 @@ public class MonitoringService { private final StaxXmlProcessor staxXmlProcessor; private final HitsService hitsService; private final PackageRecordsService packageRecordsService; + private final SourceService sourceService; private final CreditTrackerSettings config; public MonitoringService(SignalRestService signalRestService, UserPackageMapper userPackageMapper, StaxXmlProcessor staxXmlProcessor, HitsService hitsService, - PackageRecordsService packageRecordsService, + PackageRecordsService packageRecordsService, SourceService sourceService, CreditTrackerSettings config) { this.signalRestService = signalRestService; this.userPackageMapper = userPackageMapper; this.staxXmlProcessor = staxXmlProcessor; this.hitsService = hitsService; this.packageRecordsService = packageRecordsService; + this.sourceService = sourceService; this.config = config; } public void run() { - List fids = new ArrayList<>(); + List messages = new ArrayList<>(); for (int i = 1000; i < 2000; i++) { - fids.add(i); + MessageData messageData = new MessageData(); + messageData.setFid(i); + messageData.setMemberCode("ZX01LL"); + messages.add(messageData); } + MessageData messageData1 = new MessageData(); + messageData1.setFid(114885613); + messageData1.setMemberCode("ZX01LL"); + messages.add(messageData1); + + MessageData messageData2 = new MessageData(); + messageData2.setFid(16445000); + messageData2.setMemberCode("ZX01LL"); + messages.add(messageData2); + + MessageData messageData3 = new MessageData(); + messageData3.setFid(109837221); + messageData3.setMemberCode("ZX01LL"); + messages.add(messageData3); + + long start = System.currentTimeMillis(); log.info("Start selecting by one"); - monitorByOne(fids); + monitorByOne(messages); log.info("Finish selecting by one. Time: {} ms", System.currentTimeMillis() - start); start = System.currentTimeMillis(); log.info("Start selecting by batch"); - monitorbyBatch(fids); + monitorbyBatch(messages); log.info("Finish selecting by bacth. Time: {} ms", System.currentTimeMillis() - start); } - private void monitorByOne(List fids) { - for (Integer fid : fids) { + private void monitorByOne(List messages) { + for (MessageData message : messages) { + Integer fid = message.getFid(); List phonesMaps = packageRecordsService.findCachedByFid(fid); for (PhonesMap phonesMap : phonesMaps) { if (phonesMap != null) { @@ -104,6 +128,7 @@ public class MonitoringService { String status = userPackage.getStatus(); String signalTypes = userPackage.getSignalTypes(); + String busCategory = sourceService.findBusCategory(message.getMemberCode()); // проверить статус ON_MPNITORING + разрешенные signalTypes } } @@ -111,32 +136,71 @@ public class MonitoringService { } } - private void monitorbyBatch(List fids) { + private void monitorbyBatch(List messages) { + List fids = messages.stream().map(MessageData::getFid).collect(Collectors.toList()); + List memberCodes = messages.stream() + .map(message -> message.getMemberCode().substring(0,6)) + .toList(); + List phonesMaps = packageRecordsService.findCachedByFids(fids); - // key: phone; value: флаги просрочек - Map phonesDataMap = phonesMaps.stream() - .collect( - Collectors.toMap(PhonesMap::getPhone, Function.identity()) - ); + + // key: fid; value: список флагов просрочек (у одного фида может быть несколько номеров) + Map> phonesDataMap = phonesMaps.stream() + .collect(Collectors.groupingBy(PhonesMap::getFid)); + + Set uniquePhones = phonesMaps.stream().map(PhonesMap::getPhone).collect(Collectors.toSet()); + + // прелоад по memberCode категорий + Map busCategories = sourceService.findBusCategories(memberCodes); // subjectId, packageId, signalTypes, phone только для статуса ON_MONITORING - List userPackagePhoneDataList = packageRecordsService - .selectUserPackagePhoneData(phonesDataMap.keySet()); + List packagePhoneData = packageRecordsService + .selectUserPackagePhoneData(uniquePhones); - // остались только нужные номера, те что не вошли в userPackagePhoneDataList игнорируются - for (UserPackagePhoneData userPackagePhoneData : userPackagePhoneDataList) { - Long clientId = userPackagePhoneData.getPhone(); - String subjectId = userPackagePhoneData.getSubjectId(); - String signalTypes = userPackagePhoneData.getSignalTypes(); + // 1 номер может быть у нескольких пакетов + Map> userPackagePhoneDataMap = packagePhoneData.stream() + .collect(Collectors.groupingBy(UserPackagePhoneData::getPhone)); - PhonesMap phonesMap = phonesDataMap.get(clientId); - Integer flagDebt5000 = phonesMap.getFlagDebt5000(); - Integer flag90days = phonesMap.getFlag90days(); + for (MessageData message : messages) { + Integer fid = message.getFid(); + String memberCode = message.getMemberCode(); - // проверить разрешенные signalTypes + String busCategory = busCategories.get(memberCode.substring(0, 6)); + List phonesMapList = phonesDataMap.get(fid); + + if (phonesMapList == null) { + continue; + } + + for (PhonesMap phonesMap : phonesMapList) { + // флаги просрочек + Integer flagDebt5000 = phonesMap.getFlagDebt5000(); + Integer flag90days = phonesMap.getFlag90days(); + + // в userPackagePhoneDataMap только нужные номера, те что не вошли в userPackagePhoneDataList игнорируются + List userPackagePhoneDataList = userPackagePhoneDataMap.get(phonesMap.getPhone()); + + if (userPackagePhoneDataList == null) { + continue; + } + + for (UserPackagePhoneData userPackagePhoneData : userPackagePhoneDataList) { + String subjectId = userPackagePhoneData.getSubjectId(); + String signalTypes = userPackagePhoneData.getSignalTypes(); + + // проверить разрешенные signalTypes + } + } } } + @Getter + @Setter + public static class MessageData { + private Integer fid; + private String memberCode; + // other data + } private void monitor() { try { diff --git a/src/main/java/ru/nbch/credit_tracker/service/nbch/SourceService.java b/src/main/java/ru/nbch/credit_tracker/service/nbch/SourceService.java new file mode 100644 index 0000000..180af43 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/service/nbch/SourceService.java @@ -0,0 +1,35 @@ +package ru.nbch.credit_tracker.service.nbch; + +import org.springframework.stereotype.Service; +import ru.nbch.credit_tracker.entities.nbch.Source; +import ru.nbch.credit_tracker.mapper.nbch.SourceMapper; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +public class SourceService { + + private final SourceMapper sourceMapper; + + public SourceService(SourceMapper sourceMapper) { + this.sourceMapper = sourceMapper; + } + + public Map findBusCategories(List memberCodes){ + if (memberCodes.isEmpty()) { + return Collections.emptyMap(); + } + return sourceMapper.findBusCategories(memberCodes).stream() + .collect(Collectors.toMap( + Source::getMemberCode, + Source::getCategory + )); + } + + public String findBusCategory(String memberCode) { + return sourceMapper.findBusCategory(memberCode.substring(0, 6)); + } +} diff --git a/src/main/resources/mybatis/mapper/nbch/SourceMapper.xml b/src/main/resources/mybatis/mapper/nbch/SourceMapper.xml index 717edf6..40789ef 100644 --- a/src/main/resources/mybatis/mapper/nbch/SourceMapper.xml +++ b/src/main/resources/mybatis/mapper/nbch/SourceMapper.xml @@ -5,12 +5,22 @@ - + SELECT DISTINCT + MEMBER_CODE as memberCode, + CATEGORY as category FROM SOURCE WHERE MEMBER_CODE IN #{memberCode} + + + \ No newline at end of file