From cdaac1f22eaed4eba8ea0bbea393d6819ad98455 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Tue, 27 Jan 2026 17:38:50 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/BKI-3272 --- .../mapper/indic/PersonMapper.java | 1 + .../service/indic/PersonServiceV2.java | 27 +++++++++++++++ .../task/impl/FidNameUpdaterMigration.java | 33 ++++++------------- .../mybatis/mapper/indic/PersonMapper.xml | 20 +++++++++++ src/main/resources/sql/v2.21.ddl | 2 +- 5 files changed, 59 insertions(+), 24 deletions(-) diff --git a/src/main/java/ru/nbch/credit_tracker/mapper/indic/PersonMapper.java b/src/main/java/ru/nbch/credit_tracker/mapper/indic/PersonMapper.java index 5ccdc6a..77a888d 100644 --- a/src/main/java/ru/nbch/credit_tracker/mapper/indic/PersonMapper.java +++ b/src/main/java/ru/nbch/credit_tracker/mapper/indic/PersonMapper.java @@ -10,6 +10,7 @@ import ru.nbch.credit_tracker.entities.indic.Name; public interface PersonMapper { List findNameData(@Param("phones") List phones); + List findNameDataByFids(@Param("fids") List fids); List findPassportData(@Param("fids") List fids); } diff --git a/src/main/java/ru/nbch/credit_tracker/service/indic/PersonServiceV2.java b/src/main/java/ru/nbch/credit_tracker/service/indic/PersonServiceV2.java index c048ffc..1b53195 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/indic/PersonServiceV2.java +++ b/src/main/java/ru/nbch/credit_tracker/service/indic/PersonServiceV2.java @@ -84,6 +84,33 @@ public class PersonServiceV2 { )); } + /** + * Поиск данных по таблицам PHONE_NORM и NAME по списку номеров телефонов + * + * @param subjects + * @return - отображение NAME к номеру телефону, отфильтрованному по логике + * FID с максимальным значением FILE_SINCE_DT. Если FILE_SINCE_DT оказался одинаковый, берется максимальный FID + */ + public Map findNameByFids(List subjects) { + List fids = subjects.stream() + .map(SubjectProfile::getFid) + .toList(); + + List names = mapper.findNameDataByFids(fids); + + return names.stream() + .filter(name -> + StringUtils.isNotEmpty(name.getFirst()) && + StringUtils.isNotEmpty(name.getLast()) && + name.getBirthDate() != null && !LocalDate.of(1, 1, 1).equals(name.getBirthDate()) + ) + .collect(Collectors.toMap( + Name::getNumber, + Function.identity(), + BinaryOperator.maxBy(byDateThenIdNullSafe) + )); + } + private boolean isDUL(Id p) { Integer idType; Double idType2; diff --git a/src/main/java/ru/nbch/credit_tracker/service/task/impl/FidNameUpdaterMigration.java b/src/main/java/ru/nbch/credit_tracker/service/task/impl/FidNameUpdaterMigration.java index 4a51923..233afab 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/task/impl/FidNameUpdaterMigration.java +++ b/src/main/java/ru/nbch/credit_tracker/service/task/impl/FidNameUpdaterMigration.java @@ -3,7 +3,6 @@ package ru.nbch.credit_tracker.service.task.impl; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.stream.Stream; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; @@ -36,41 +35,29 @@ public class FidNameUpdaterMigration implements Handler subjects = taskPayload.getSubjects(); var ctx = obtainContext(PackageVariable.class, taskPayload); log.debug("NameUpdaterStage handle, size of bucket for save: {}", subjects.size()); - Map nameByPhone = personService.findNameByNumber(subjects); + Map nameByPhone = personService.findNameByFids(subjects); List changingFidPhones = new ArrayList<>(); List notFoundFidPhones = new ArrayList<>(); - List notChangedPhones = subjects.stream().flatMap(subjectProfile -> { + subjects.forEach(subjectProfile -> { Name name = nameByPhone.get(CTUtil.normalizePhoneNumber(subjectProfile.getPhone())); if (name != null) { - if (subjectProfile.getFid() == null || !subjectProfile.getFid().equals(name.getFid())) { - subjectProfile.setFid(name.getFid()); - subjectProfile.getNameData().setFirstName(name.getFirst()); - subjectProfile.getNameData().setLastName(name.getLast()); - subjectProfile.getNameData().setMiddleName(name.getMiddle()); - subjectProfile.getNameData().setBirthDate(name.getBirthDate()); - changingFidPhones.add(subjectProfile); - return Stream.empty(); - } - } else if (subjectProfile.getFid() != null) { + subjectProfile.getNameData().setFirstName(name.getFirst()); + subjectProfile.getNameData().setLastName(name.getLast()); + subjectProfile.getNameData().setMiddleName(name.getMiddle()); + subjectProfile.getNameData().setBirthDate(name.getBirthDate()); + changingFidPhones.add(subjectProfile); + } else { notFoundFidPhones.add(subjectProfile.getPhone()); - return Stream.empty(); } - return Stream.of(subjectProfile.getPhone()); - }).toList(); - List changingFids = new ArrayList<>(); + }); + if (!notFoundFidPhones.isEmpty()) { phonesMapService.resetFidAndPDByPhones(notFoundFidPhones); - changingFids.addAll(notFoundFidPhones); } if (!changingFidPhones.isEmpty()) { phonesMapService.updateNameCachedData(changingFidPhones); - changingFids.addAll(changingFidPhones.stream().map(SubjectProfile::getPhone).toList()); - } - - if (!notChangedPhones.isEmpty()) { - phonesMapService.updateSearchedAt(notChangedPhones); } return new SubjectPayload(null, null, null, changingFidPhones); } diff --git a/src/main/resources/mybatis/mapper/indic/PersonMapper.xml b/src/main/resources/mybatis/mapper/indic/PersonMapper.xml index abb42f6..56f615d 100644 --- a/src/main/resources/mybatis/mapper/indic/PersonMapper.xml +++ b/src/main/resources/mybatis/mapper/indic/PersonMapper.xml @@ -46,6 +46,26 @@ WITH UR + +