From af824c7d07e9742b81a4c097009ef716c3f152c1 Mon Sep 17 00:00:00 2001 From: Mikhail Trofimov Date: Tue, 30 Sep 2025 10:59:26 +0300 Subject: [PATCH] Used jdbcTemplate for finding fids --- .../credit_tracker/service/SignalService.java | 6 +- .../service/indic/PhoneService2.java | 96 +++++++++++++++++++ .../service/PhoneService2Test.java | 63 ++++++++++++ 3 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService2.java create mode 100644 src/test/java/ru/nbch/credit_tracker/service/PhoneService2Test.java 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 61dc791..53c418f 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java @@ -18,7 +18,7 @@ import ru.nbch.credit_tracker.enums.Status; import ru.nbch.credit_tracker.service.indic.FlagsService; import ru.nbch.credit_tracker.service.indic.FlagsService2; import ru.nbch.credit_tracker.service.indic.PersonService; -import ru.nbch.credit_tracker.service.indic.PhoneService; +import ru.nbch.credit_tracker.service.indic.PhoneService2; import ru.nbch.credit_tracker.service.signal.HitsService; import ru.nbch.credit_tracker.service.signal.PhoneFidMapService; import ru.nbch.credit_tracker.service.signal.UserPackageService; @@ -44,7 +44,7 @@ public class SignalService { private final HitsService hitsService; private final UserPackageService userPackageService; private final PhoneFidMapService phoneFidMapService; - private final PhoneService phoneService; + private final PhoneService2 phoneService; private final FlagsService2 flagsService; private final PersonService personService; private final StaxXmlProcessor staxXmlProcessor; @@ -55,7 +55,7 @@ public class SignalService { HitsService hitsService, UserPackageService userPackageService, PhoneFidMapService phoneFidMapService, - PhoneService phoneService, + PhoneService2 phoneService, FlagsService2 flagsService, PersonService personService, StaxXmlProcessor staxXmlProcessor) { diff --git a/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService2.java b/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService2.java new file mode 100644 index 0000000..52f5a8c --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService2.java @@ -0,0 +1,96 @@ +package ru.nbch.credit_tracker.service.indic; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Service; +import ru.nbch.credit_tracker.entities.dto.PhoneFidMap; + +import java.time.LocalDate; +import java.util.*; + +@Slf4j +@Service +public class PhoneService2 { + + private static final String SELCT_FIDS = """ + SELECT + pn.number, + pn.fid, + pn.file_since_dt + FROM PHONE_NORM pn + JOIN (SELECT DISTINCT fid FROM NAME) nf + ON nf.fid = pn.fid + WHERE number in (:phones) + ORDER BY + pn.number ASC, + pn.file_since_dt DESC, + pn.fid DESC + WITH UR + """; + + private final NamedParameterJdbcTemplate jdbcTemplate; + + public PhoneService2(@Qualifier("jdbcTemplateIndic") NamedParameterJdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + /** + * Ищет фиды по номерам телефона + * + * @return Map: key - fid; value - {@link PhoneFidMap} + */ + public Map defineFidByPhone(List subjects) { + Map phoneFidMap = new HashMap<>(); + + List phones = subjects.stream(). + map(subject -> "9" + subject.getPhone()) + .toList(); + + subjects.sort( + Comparator.comparing( + PhoneFidMap::getPhone, + Comparator.naturalOrder() + ) + ); + + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("phones", phones); + + List phonesByFid = jdbcTemplate.query(SELCT_FIDS, params, (rs, rowNum) -> + new FidsData(rs.getInt("fid"), rs.getString("number"), rs.getObject("file_since_dt", LocalDate.class)) + ); + + log.debug("Start merging fids"); + for (PhoneFidMap phoneFid : subjects) { + Iterator iterator = phonesByFid.iterator(); + while (iterator.hasNext()) { + FidsData fidsData = iterator.next(); + if (fidsData.getPhone().equals(9 + phoneFid.getPhone())) { + //fixme доступ по ссылке, страшно, придумать что-то еще + phoneFidMap.put(fidsData.getFid(), phoneFid); + iterator.remove(); + break; + } + } + } + log.debug("End merging fids"); + + return phoneFidMap; + } + + @Getter + @Setter + @AllArgsConstructor + @NoArgsConstructor + public static class FidsData { + private Integer fid; + private String phone; + private LocalDate fileSinceDate; + } +} diff --git a/src/test/java/ru/nbch/credit_tracker/service/PhoneService2Test.java b/src/test/java/ru/nbch/credit_tracker/service/PhoneService2Test.java new file mode 100644 index 0000000..a8f14c0 --- /dev/null +++ b/src/test/java/ru/nbch/credit_tracker/service/PhoneService2Test.java @@ -0,0 +1,63 @@ +package ru.nbch.credit_tracker.service; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import ru.nbch.credit_tracker.entities.dto.PhoneFidMap; +import ru.nbch.credit_tracker.service.indic.PhoneService2; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +public class PhoneService2Test { + + @Mock + NamedParameterJdbcTemplate jdbcTemplate; + + @Test + public void defineFidByPhoneTest() { + PhoneService2 phoneService = new PhoneService2(jdbcTemplate); + + fidsDataWithEqualSinceDt.sort(byDbOrder); + when(jdbcTemplate.query(anyString(), any(MapSqlParameterSource.class), any(RowMapper.class))).thenReturn(fidsDataWithEqualSinceDt); + + List phoneFidMap = new ArrayList<>(); + phoneFidMap.add(PhoneFidMap.builder().phone("1111").build()); + phoneFidMap.add(PhoneFidMap.builder().phone("1112").build()); + phoneFidMap.add(PhoneFidMap.builder().phone("1113").build()); + phoneFidMap.add(PhoneFidMap.builder().phone("1114").build()); + + Map res = phoneService.defineFidByPhone(phoneFidMap); + Assertions.assertEquals(3, res.size()); + Assertions.assertEquals("1111", res.get(124).getPhone()); + Assertions.assertEquals("1112", res.get(125).getPhone()); + Assertions.assertEquals("1114", res.get(126).getPhone()); + } + + private final List fidsDataWithEqualSinceDt = new ArrayList<>( + List.of( + new PhoneService2.FidsData(123, "91111", LocalDate.of(2025, 9, 10)), + new PhoneService2.FidsData(124, "91111", LocalDate.of(2025, 9, 10)), + new PhoneService2.FidsData(125, "91112", LocalDate.of(2024, 10, 10)), + new PhoneService2.FidsData(126, "91114", LocalDate.of(2024, 10, 11)) + ) + ); + + Comparator byDbOrder = + Comparator.comparing(PhoneService2.FidsData::getPhone, Comparator.nullsFirst(Comparator.naturalOrder())) // pn.number ASC + .thenComparing(PhoneService2.FidsData::getFileSinceDate, Comparator.nullsLast(Comparator.reverseOrder())) // file_since_dt DESC + .thenComparing(PhoneService2.FidsData::getFid, Comparator.reverseOrder()); +}