etreschenkov 2026-01-27 17:38:50 +03:00
parent 18c87beafe
commit cdaac1f22e
5 changed files with 59 additions and 24 deletions

View file

@ -10,6 +10,7 @@ import ru.nbch.credit_tracker.entities.indic.Name;
public interface PersonMapper {
List<Name> findNameData(@Param("phones") List<String> phones);
List<Name> findNameDataByFids(@Param("fids") List<Integer> fids);
List<Id> findPassportData(@Param("fids") List<Integer> fids);
}

View file

@ -84,6 +84,33 @@ public class PersonServiceV2 {
));
}
/**
* Поиск данных по таблицам PHONE_NORM и NAME по списку номеров телефонов
*
* @param subjects
* @return - отображение NAME к номеру телефону, отфильтрованному по логике
* FID с максимальным значением FILE_SINCE_DT. Если FILE_SINCE_DT оказался одинаковый, берется максимальный FID
*/
public Map<String, Name> findNameByFids(List<SubjectProfile> subjects) {
List<Integer> fids = subjects.stream()
.map(SubjectProfile::getFid)
.toList();
List<Name> 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;

View file

@ -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<SubjectPayload, SubjectP
List<SubjectProfile> subjects = taskPayload.getSubjects();
var ctx = obtainContext(PackageVariable.class, taskPayload);
log.debug("NameUpdaterStage handle, size of bucket for save: {}", subjects.size());
Map<String, Name> nameByPhone = personService.findNameByNumber(subjects);
Map<String, Name> nameByPhone = personService.findNameByFids(subjects);
List<SubjectProfile> changingFidPhones = new ArrayList<>();
List<Long> notFoundFidPhones = new ArrayList<>();
List<Long> 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) {
} else {
notFoundFidPhones.add(subjectProfile.getPhone());
return Stream.empty();
}
return Stream.of(subjectProfile.getPhone());
}).toList();
List<Long> 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);
}

View file

@ -46,6 +46,26 @@
WITH UR
</select>
<select id="findNameDataByFids" resultMap="nameDataResultMap">
SELECT
pn.number as number,
pn.fid as fid,
pn.FILE_SINCE_DT as file_since_dt_pn,
nf.first as first,
nf.middle as middle,
nf.name_1 as name_1,
nf.birth_dt as birth_dt,
nf.file_since_dt as file_since_dt_name
FROM PHONE_NORM pn
JOIN NAME nf
ON nf.fid = pn.fid
WHERE pn.fid in
<foreach item="fid" collection="fids" open="(" separator="," close=")">
#{fid}
</foreach>
WITH UR
</select>
<select id="findPassportData" resultMap="passportDataResultMap" resultType="java.util.List">
SELECT FID, SER_NUM, ID_NUM, ISS_DTE, FILE_SINCE_DT, ID_TYPE, ID_TYPE2
FROM ID

View file

@ -52,6 +52,6 @@ SELECT distinct on (phone_l) fid::int,
calculated_at,
'2025-01-01'
FROM signals_phone_fid_map where fid is not null
order by phone, calculated_at desc;
order by phone_l, calculated_at desc;
insert into app_version values ('2.0')